diff --git a/AVR Code/.vs/USB_BULK_TEST/v14/.atsuo b/AVR Code/.vs/USB_BULK_TEST/v14/.atsuo new file mode 100644 index 00000000..0e7b45a7 Binary files /dev/null and b/AVR Code/.vs/USB_BULK_TEST/v14/.atsuo differ diff --git a/AVR Code/USB_BULK_TEST.atsln b/AVR Code/USB_BULK_TEST.atsln new file mode 100644 index 00000000..0b934536 --- /dev/null +++ b/AVR Code/USB_BULK_TEST.atsln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Atmel Studio Solution File, Format Version 11.00 +Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "USB_BULK_TEST", "USB_BULK_TEST\USB_BULK_TEST.cproj", "{BD2AA8D9-491B-4ECD-9255-825EAABC7BA4}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|AVR = Debug|AVR + Release|AVR = Release|AVR + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BD2AA8D9-491B-4ECD-9255-825EAABC7BA4}.Debug|AVR.ActiveCfg = Debug|AVR + {BD2AA8D9-491B-4ECD-9255-825EAABC7BA4}.Debug|AVR.Build.0 = Debug|AVR + {BD2AA8D9-491B-4ECD-9255-825EAABC7BA4}.Release|AVR.ActiveCfg = Debug|AVR + {BD2AA8D9-491B-4ECD-9255-825EAABC7BA4}.Release|AVR.Build.0 = Debug|AVR + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/AVR Code/USB_BULK_TEST.atsuo b/AVR Code/USB_BULK_TEST.atsuo new file mode 100644 index 00000000..d20afbd3 Binary files /dev/null and b/AVR Code/USB_BULK_TEST.atsuo differ diff --git a/AVR Code/USB_BULK_TEST/Debug/Makefile b/AVR Code/USB_BULK_TEST/Debug/Makefile new file mode 100644 index 00000000..91c86f36 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/Makefile @@ -0,0 +1,375 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +SHELL := cmd.exe +RM := rm -rf + +USER_OBJS := + +LIBS := +PROJ := + +O_SRCS := +C_SRCS := +S_SRCS := +S_UPPER_SRCS := +OBJ_SRCS := +ASM_SRCS := +PREPROCESSING_SRCS := +OBJS := +OBJS_AS_ARGS := +C_DEPS := +C_DEPS_AS_ARGS := +EXECUTABLES := +OUTPUT_FILE_PATH := +OUTPUT_FILE_PATH_AS_ARGS := +AVR_APP_PATH :=$$$AVR_APP_PATH$$$ +QUOTE := " +ADDITIONAL_DEPENDENCIES:= +OUTPUT_FILE_DEP:= +LIB_DEP:= +LINKER_SCRIPT_DEP:= + +# Every subdirectory with source files must be described here +SUBDIRS := \ +../src/ \ +../src/ASF/ \ +../src/ASF/common/ \ +../src/ASF/common/boards/ \ +../src/ASF/common/boards/user_board/ \ +../src/ASF/common/services/ \ +../src/ASF/common/services/clock/ \ +../src/ASF/common/services/clock/xmega/ \ +../src/ASF/common/services/ioport/ \ +../src/ASF/common/services/ioport/xmega/ \ +../src/ASF/common/services/sleepmgr/ \ +../src/ASF/common/services/sleepmgr/xmega/ \ +../src/ASF/common/services/usb/ \ +../src/ASF/common/services/usb/class/ \ +../src/ASF/common/services/usb/class/vendor/ \ +../src/ASF/common/services/usb/class/vendor/device/ \ +../src/ASF/common/services/usb/class/vendor/device/example/ \ +../src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ \ +../src/ASF/common/services/usb/udc/ \ +../src/ASF/common/utils/ \ +../src/ASF/common/utils/interrupt/ \ +../src/ASF/common/utils/make/ \ +../src/ASF/xmega/ \ +../src/ASF/xmega/drivers/ \ +../src/ASF/xmega/drivers/cpu/ \ +../src/ASF/xmega/drivers/nvm/ \ +../src/ASF/xmega/drivers/sleep/ \ +../src/ASF/xmega/drivers/usb/ \ +../src/ASF/xmega/utils/ \ +../src/ASF/xmega/utils/assembler/ \ +../src/ASF/xmega/utils/bit_handling/ \ +../src/ASF/xmega/utils/preprocessor/ \ +../src/config/ + + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../src/tiny_dig.c \ +../src/ASF/common/boards/user_board/init.c \ +../src/ASF/common/services/ioport/xmega/ioport_compat.c \ +../src/main.c \ +../src/tiny_adc.c \ +../src/tiny_dac.c \ +../src/tiny_dma.c \ +../src/tiny_timer.c \ +../src/tiny_uart.c \ +../src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.c \ +../src/ASF/common/services/clock/xmega/sysclk.c \ +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.c \ +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.c \ +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.c \ +../src/ASF/common/services/usb/udc/udc.c \ +../src/ASF/xmega/drivers/nvm/nvm.c \ +../src/ASF/xmega/drivers/usb/usb_device.c + + +PREPROCESSING_SRCS += \ +../src/ASF/xmega/drivers/cpu/ccp.s \ +../src/ASF/xmega/drivers/nvm/nvm_asm.s + + +ASM_SRCS += + + +OBJS += \ +src/tiny_dig.o \ +src/ASF/common/boards/user_board/init.o \ +src/ASF/common/services/ioport/xmega/ioport_compat.o \ +src/main.o \ +src/tiny_adc.o \ +src/tiny_dac.o \ +src/tiny_dma.o \ +src/tiny_timer.o \ +src/tiny_uart.o \ +src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o \ +src/ASF/common/services/clock/xmega/sysclk.o \ +src/ASF/common/services/sleepmgr/xmega/sleepmgr.o \ +src/ASF/common/services/usb/class/vendor/device/udi_vendor.o \ +src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o \ +src/ASF/common/services/usb/udc/udc.o \ +src/ASF/xmega/drivers/cpu/ccp.o \ +src/ASF/xmega/drivers/nvm/nvm.o \ +src/ASF/xmega/drivers/nvm/nvm_asm.o \ +src/ASF/xmega/drivers/usb/usb_device.o + +OBJS_AS_ARGS += \ +src/tiny_dig.o \ +src/ASF/common/boards/user_board/init.o \ +src/ASF/common/services/ioport/xmega/ioport_compat.o \ +src/main.o \ +src/tiny_adc.o \ +src/tiny_dac.o \ +src/tiny_dma.o \ +src/tiny_timer.o \ +src/tiny_uart.o \ +src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o \ +src/ASF/common/services/clock/xmega/sysclk.o \ +src/ASF/common/services/sleepmgr/xmega/sleepmgr.o \ +src/ASF/common/services/usb/class/vendor/device/udi_vendor.o \ +src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o \ +src/ASF/common/services/usb/udc/udc.o \ +src/ASF/xmega/drivers/cpu/ccp.o \ +src/ASF/xmega/drivers/nvm/nvm.o \ +src/ASF/xmega/drivers/nvm/nvm_asm.o \ +src/ASF/xmega/drivers/usb/usb_device.o + +C_DEPS += \ +src/tiny_dig.d \ +src/ASF/common/boards/user_board/init.d \ +src/ASF/common/services/ioport/xmega/ioport_compat.d \ +src/main.d \ +src/tiny_adc.d \ +src/tiny_dac.d \ +src/tiny_dma.d \ +src/tiny_timer.d \ +src/tiny_uart.d \ +src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.d \ +src/ASF/common/services/clock/xmega/sysclk.d \ +src/ASF/common/services/sleepmgr/xmega/sleepmgr.d \ +src/ASF/common/services/usb/class/vendor/device/udi_vendor.d \ +src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.d \ +src/ASF/common/services/usb/udc/udc.d \ +src/ASF/xmega/drivers/cpu/ccp.d \ +src/ASF/xmega/drivers/nvm/nvm.d \ +src/ASF/xmega/drivers/nvm/nvm_asm.d \ +src/ASF/xmega/drivers/usb/usb_device.d + +C_DEPS_AS_ARGS += \ +src/tiny_dig.d \ +src/ASF/common/boards/user_board/init.d \ +src/ASF/common/services/ioport/xmega/ioport_compat.d \ +src/main.d \ +src/tiny_adc.d \ +src/tiny_dac.d \ +src/tiny_dma.d \ +src/tiny_timer.d \ +src/tiny_uart.d \ +src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.d \ +src/ASF/common/services/clock/xmega/sysclk.d \ +src/ASF/common/services/sleepmgr/xmega/sleepmgr.d \ +src/ASF/common/services/usb/class/vendor/device/udi_vendor.d \ +src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.d \ +src/ASF/common/services/usb/udc/udc.d \ +src/ASF/xmega/drivers/cpu/ccp.d \ +src/ASF/xmega/drivers/nvm/nvm.d \ +src/ASF/xmega/drivers/nvm/nvm_asm.d \ +src/ASF/xmega/drivers/usb/usb_device.d + +OUTPUT_FILE_PATH +=USB_BULK_TEST.elf + +OUTPUT_FILE_PATH_AS_ARGS +=USB_BULK_TEST.elf + +ADDITIONAL_DEPENDENCIES:= + +OUTPUT_FILE_DEP:= ./makedep.mk + +LIB_DEP+= + +LINKER_SCRIPT_DEP+= + + +# AVR32/GNU C Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +src/%.o: ../src/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -O1 -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -g3 -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/common/boards/user_board/%.o: ../src/ASF/common/boards/user_board/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -O1 -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -g3 -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/common/services/ioport/xmega/%.o: ../src/ASF/common/services/ioport/xmega/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -O1 -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -g3 -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/%.o: ../src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -O1 -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -g3 -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/common/services/clock/xmega/%.o: ../src/ASF/common/services/clock/xmega/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -O1 -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -g3 -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/common/services/sleepmgr/xmega/%.o: ../src/ASF/common/services/sleepmgr/xmega/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -O1 -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -g3 -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/common/services/usb/class/vendor/device/%.o: ../src/ASF/common/services/usb/class/vendor/device/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -O1 -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -g3 -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/common/services/usb/udc/%.o: ../src/ASF/common/services/usb/udc/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -O1 -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -g3 -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/xmega/drivers/nvm/%.o: ../src/ASF/xmega/drivers/nvm/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -O1 -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -g3 -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/xmega/drivers/usb/%.o: ../src/ASF/xmega/drivers/usb/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -O1 -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -g3 -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + + + +# AVR32/GNU Preprocessing Assembler + + + +# AVR32/GNU Assembler +src/ASF/xmega/drivers/cpu/ccp.o: ../src/ASF/xmega/drivers/cpu/ccp.s + @echo Building file: $< + @echo Invoking: AVR32/GNU Assembler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -Wa,-gdwarf2 -x assembler-with-cpp -c -mmcu=atxmega32a4u -mrelax -DBOARD=USER_BOARD -I "../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I "../common/services/usb/class/vendor/device/example" -I "../src/ASF/common/services/usb/udc" -I "../src/ASF/xmega/drivers/nvm" -I "../src/ASF/common/services/sleepmgr" -I "../src/ASF/common/services/clock" -I "../src/ASF/xmega/drivers/sleep" -I "../src/ASF/xmega/drivers/usb" -I "../src/ASF/xmega/drivers/cpu" -I "../src/ASF/common/services/usb/class/vendor" -I "../src/ASF/common/services/usb/class/vendor/device" -I "../src/ASF/common/services/usb" -I "../common/applications/user_application/user_board/config" -I "../src/ASF/xmega/utils" -I "../src/config" -I "../src/ASF/common/boards" -I "../src/ASF/xmega/utils/preprocessor" -I "../src/ASF/common/utils" -I "../src" -I "../src/ASF/common/boards/user_board" -I "../src/ASF/common/services/ioport" -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -mrelax -Wa,-g -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/xmega/drivers/nvm/nvm_asm.o: ../src/ASF/xmega/drivers/nvm/nvm_asm.s + @echo Building file: $< + @echo Invoking: AVR32/GNU Assembler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -Wa,-gdwarf2 -x assembler-with-cpp -c -mmcu=atxmega32a4u -mrelax -DBOARD=USER_BOARD -I "../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I "../common/services/usb/class/vendor/device/example" -I "../src/ASF/common/services/usb/udc" -I "../src/ASF/xmega/drivers/nvm" -I "../src/ASF/common/services/sleepmgr" -I "../src/ASF/common/services/clock" -I "../src/ASF/xmega/drivers/sleep" -I "../src/ASF/xmega/drivers/usb" -I "../src/ASF/xmega/drivers/cpu" -I "../src/ASF/common/services/usb/class/vendor" -I "../src/ASF/common/services/usb/class/vendor/device" -I "../src/ASF/common/services/usb" -I "../common/applications/user_application/user_board/config" -I "../src/ASF/xmega/utils" -I "../src/config" -I "../src/ASF/common/boards" -I "../src/ASF/xmega/utils/preprocessor" -I "../src/ASF/common/utils" -I "../src" -I "../src/ASF/common/boards/user_board" -I "../src/ASF/common/services/ioport" -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -mrelax -Wa,-g -o "$@" "$<" + @echo Finished building: $< + + + +src/ASF/xmega/drivers/cpu/%.o: ../src/ASF/xmega/drivers/cpu/%.s + @echo Building file: $< + @echo Invoking: AVR32/GNU Assembler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -Wa,-gdwarf2 -x assembler-with-cpp -c -mmcu=atxmega32a4u -mrelax -DBOARD=USER_BOARD -I "../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I "../common/services/usb/class/vendor/device/example" -I "../src/ASF/common/services/usb/udc" -I "../src/ASF/xmega/drivers/nvm" -I "../src/ASF/common/services/sleepmgr" -I "../src/ASF/common/services/clock" -I "../src/ASF/xmega/drivers/sleep" -I "../src/ASF/xmega/drivers/usb" -I "../src/ASF/xmega/drivers/cpu" -I "../src/ASF/common/services/usb/class/vendor" -I "../src/ASF/common/services/usb/class/vendor/device" -I "../src/ASF/common/services/usb" -I "../common/applications/user_application/user_board/config" -I "../src/ASF/xmega/utils" -I "../src/config" -I "../src/ASF/common/boards" -I "../src/ASF/xmega/utils/preprocessor" -I "../src/ASF/common/utils" -I "../src" -I "../src/ASF/common/boards/user_board" -I "../src/ASF/common/services/ioport" -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -mrelax -Wa,-g -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/xmega/drivers/nvm/%.o: ../src/ASF/xmega/drivers/nvm/%.s + @echo Building file: $< + @echo Invoking: AVR32/GNU Assembler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -Wa,-gdwarf2 -x assembler-with-cpp -c -mmcu=atxmega32a4u -mrelax -DBOARD=USER_BOARD -I "../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I "../common/services/usb/class/vendor/device/example" -I "../src/ASF/common/services/usb/udc" -I "../src/ASF/xmega/drivers/nvm" -I "../src/ASF/common/services/sleepmgr" -I "../src/ASF/common/services/clock" -I "../src/ASF/xmega/drivers/sleep" -I "../src/ASF/xmega/drivers/usb" -I "../src/ASF/xmega/drivers/cpu" -I "../src/ASF/common/services/usb/class/vendor" -I "../src/ASF/common/services/usb/class/vendor/device" -I "../src/ASF/common/services/usb" -I "../common/applications/user_application/user_board/config" -I "../src/ASF/xmega/utils" -I "../src/config" -I "../src/ASF/common/boards" -I "../src/ASF/xmega/utils/preprocessor" -I "../src/ASF/common/utils" -I "../src" -I "../src/ASF/common/boards/user_board" -I "../src/ASF/common/services/ioport" -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -mrelax -Wa,-g -o "$@" "$<" + @echo Finished building: $< + + + + + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(strip $(C_DEPS)),) +-include $(C_DEPS) +endif +endif + +# Add inputs and outputs from these tool invocations to the build variables + +# All Target +all: $(OUTPUT_FILE_PATH) $(ADDITIONAL_DEPENDENCIES) + +$(OUTPUT_FILE_PATH): $(OBJS) $(USER_OBJS) $(OUTPUT_FILE_DEP) $(LIB_DEP) $(LINKER_SCRIPT_DEP) + @echo Building target: $@ + @echo Invoking: AVR/GNU Linker : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -o$(OUTPUT_FILE_PATH_AS_ARGS) $(OBJS_AS_ARGS) $(USER_OBJS) $(LIBS) -Wl,-Map="USB_BULK_TEST.map" -Wl,--start-group -Wl,-lm -Wl,--end-group -Wl,--gc-sections -mrelax -mmcu=atxmega32a4u -Wl,--relax + @echo Finished building target: $@ + "C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "USB_BULK_TEST.elf" "USB_BULK_TEST.hex" + "C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-objcopy.exe" -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex "USB_BULK_TEST.elf" "USB_BULK_TEST.eep" || exit 0 + "C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-objdump.exe" -h -S "USB_BULK_TEST.elf" > "USB_BULK_TEST.lss" + "C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O srec -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "USB_BULK_TEST.elf" "USB_BULK_TEST.srec" + "C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-size.exe" "USB_BULK_TEST.elf" + + + + + + + +# Other Targets +clean: + -$(RM) $(OBJS_AS_ARGS) $(EXECUTABLES) + -$(RM) $(C_DEPS_AS_ARGS) + rm -rf "USB_BULK_TEST.elf" "USB_BULK_TEST.a" "USB_BULK_TEST.hex" "USB_BULK_TEST.lss" "USB_BULK_TEST.eep" "USB_BULK_TEST.map" "USB_BULK_TEST.srec" "USB_BULK_TEST.usersignatures" + \ No newline at end of file diff --git a/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.eep b/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.eep new file mode 100644 index 00000000..7c166a13 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.eep @@ -0,0 +1 @@ +:00000001FF diff --git a/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.elf b/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.elf new file mode 100644 index 00000000..4362bb99 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.elf differ diff --git a/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.hex b/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.hex new file mode 100644 index 00000000..f7b85785 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.hex @@ -0,0 +1,662 @@ +:100000002CC1000046C1000044C1000042C10000F4 +:1000100040C100003EC100003CC100003AC10000E8 +:1000200038C1000036C1000034C1000032C10000F8 +:1000300030C100002EC100002CC100002AC1000008 +:1000400028C1000026C1000024C1000022C1000018 +:1000500020C100001EC100001CC100001AC1000028 +:1000600018C1000016C1000014C1000012C1000038 +:1000700010C100000EC100000CC100000AC1000048 +:1000800008C1000006C1000004C1000002C1000058 +:1000900000C10000FEC00000FCC00000FAC000006B +:1000A000F8C00000F6C00000F4C00000F2C000007C +:1000B000F0C00000EEC00000ECC00000EAC000008C +:1000C000E8C00000E6C00000E4C00000E2C000009C +:1000D000E0C00000DEC00000DCC00000DAC00000AC +:1000E000D8C00000D6C00000D4C00000D2C00000BC +:1000F000D0C00000CEC00000CCC00000CAC00000CC +:10010000C8C00000C6C00000C4C00000C2C00000DB +:10011000C0C00000BEC00000BCC00000BAC00000EB +:10012000B8C00000B6C00000B4C00000B2C00000FB +:10013000B0C00000AEC00000ACC00000AAC000000B +:10014000A8C00000A6C00000A4C0000039C600007E +:10015000A0C000009EC000009CC000009AC000002B +:1001600098C0000096C0000094C0000092C000003B +:1001700090C000008EC000008CC000008AC000004B +:1001800088C0000086C0000084C0000082C000005B +:1001900080C000007EC000007CC000007AC000006B +:1001A00078C0000076C0000074C0000072C000007B +:1001B00070C000006EC000006CC000006AC000008B +:1001C00068C0000066C0000064C0000062C000009B +:1001D00060C000005EC000005CC000005AC00000AB +:1001E00058C0000056C0000054C0000052C00000BB +:1001F00050C000000C9478120C94381393019501B0 +:10020000970199019B01A0019D019F01E009E2096D +:10021000200A620A6B0A710AC40ACA0A100A120A80 +:10022000140A160A180A1A0A1C0A1E0A520A540A42 +:10023000560A580A5A0A5C0A5E0A600A7E0A890A45 +:10024000930AA10AA30AA50AAF0AB90A8D0E7B0E6A +:100250007E0E810E840E870E8A0E11241FBECFEFF4 +:10026000CDBFDFE2DEBF10E2A0E0B0E2ECE8F8E2F2 +:1002700002C005900D92A23BB107D9F72CE2A2EB88 +:10028000B0E201C01D92A834B207E1F71CD00C9473 +:100290004414B6CEE0E8F6E08FE0808385E0848306 +:1002A000089508958091B420811103C08EEE92E0EC +:1002B00002C080E090E042E551E06EEE72E08A59C3 +:1002C000994DFFC6089587E0E0EAF0E082837894D4 +:1002D00010D6E7DFF0D7ACD0CFD060E080E077D0A9 +:1002E00063D08CE057D031D5DFD5F6D5D3DF000011 +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000F1CF08950895F3 +:100310008091002090E08830910590F4FC01E2503B +:10032000FF4F0C9435140BD10BC088D109C027D2D4 +:1003300007C0E3D205C078D303C060D401C0D6D4CF +:100340009091B42081E0911180E08093B4200895D1 +:1003500081E08093B52042E551E06EEE72E086E6E2 +:1003600096E2AFD681E008951092B520089581E01D +:10037000089581E00895E0E0F2E010A2982F9C71CA +:10038000936890A3881F8827881F880F81A312A2D3 +:1003900016A20895E0E0F2E010AA836880AB80E145 +:1003A00081AB12AA16AA0895E0E0F2E010A683E855 +:1003B00080A78FE281A712A616A6089592E09093D7 +:1003C000CA01E82FF0E084911092CA010895CF93FA +:1003D000DF93E0E7F0E091819D7F9183109200022E +:1003E000623011F49EE101C09CE1E0E0F2E0918313 +:1003F00090E49283882311F080EC01C080E4E0E077 +:10040000F2E08383613011F482E001C083E0C0E058 +:10041000D2E08C8380E2D2DF8C8781E2CFDF8D87D0 +:10042000188E198E81E08883BFDFDF91CF91089508 +:10043000CF93DF93E0E7F0E082818B7F8283C0E29D +:10044000D3E08DE0888380E4898389E08A8383E335 +:10045000B5DF888782E3B2DF898787E3AFDF8A87EA +:1004600086E3ACDF8B87E0E2F6E080818360808307 +:100470001482DF91CF910895E0E7F0E080818E7FD4 +:10048000808380E8809300010895E0E0F1E0108A25 +:1004900080E4808B10A280A310AA80ABE0E4F1E09E +:1004A000108280831092B4201092B320089510928D +:1004B0000020EBDFE0E0F1E016AA44E240AB11AA35 +:1004C00039E532AB82E083AB80910220909103202A +:1004D00084AB95AB86E694E280AF91AF12AE8BE32E +:1004E00084AF23E020933D0110923E0180A98068F3 +:1004F00080AB10924601E0E4F1E0408310924101AC +:100500003093420120934301809104209091052073 +:10051000809344019093450186E592E280934801DF +:100520009093490110924A0189E380934C012093F2 +:100530004D0110924E018081806880830895E0E033 +:10054000F1E0108A80E4808B84E0808B118A81E95D +:10055000828B80E1838B87E791E0848B958B84E2AB +:10056000808F82E0818F128E4091B4208EEE92E0D7 +:10057000489F9001499F300D11242A59394D248FED +:100580004091B420489F9001499F300D1124C9012A +:100590008A59994D958F168E80898068808B089531 +:1005A00081E08093002071DFE0E0F1E010AA80E4B8 +:1005B00080AB84E080AB11AA12AA8BE483AB14AAAF +:1005C00015AA16AA81E090E280AF91AF12AE80EA40 +:1005D00084AF88E080933D0110923E0180A9806A3B +:1005E00080AB85E58093A00810924601E0E4F1E03D +:1005F00084E280831092410189E58093420182E088 +:1006000080934301809102209091032080934401C4 +:100610009093450186E694E28093480190934901C6 +:1006200010924A018BE380934C0183E080934D014B +:1006300010924E018081806880830895E0E0F1E0AF +:10064000108AA0E4A08B74E0708B118A61E9628B40 +:1006500080E1838B27E731E0248B358B84E2808F28 +:1006600082E0818F128EB091B4208EEE92E0B89F1E +:10067000A001B99F500D11244A59594D448FB09192 +:10068000B420B89FA001B99F500D11244A59594D6B +:10069000558F168E40894068408B10A2A0A370A38E +:1006A00011A262A34BE443A324A335A320EA20A70D +:1006B00028E021A712A64091B420489F9001499FAD +:1006C000300D11242352384D24A74091B420489F67 +:1006D0009001499F300D1124C9018352984D95A76F +:1006E00016A680A1806880A30895CF93C2E0C0932E +:1006F0000020CBDEE0E0F1E016AA44E240AB11AA14 +:1007000039E532AB23E023AB8091042090910520A2 +:1007100084AB95AB86E592E280AF91AF12AE89E3F0 +:1007200084AF20933D0110923E0180A9806880AB88 +:1007300010924601E0E4F1E04083109241013093D1 +:100740004201C09343018091022090910320809345 +:1007500044019093450186E694E28093480190938A +:10076000490110924A018BE380934C0120934D0183 +:1007700010924E01808180688083CF910895CF933D +:10078000E0E0F1E0108AB0E4B08BA4E0A08B118A25 +:1007900071E9728B80E1838B27E731E0248B358B05 +:1007A00084E2808F62E0618F128EC091B4208EEE61 +:1007B00092E0C89FA001C99F500D11244A59594D7C +:1007C000448FC091B420C89FA001C99F500D11242F +:1007D0004A59594D558F168E40894068408B10A25A +:1007E000B0A3A0A311A272A342E143A324A335A303 +:1007F00024E320A761A712A64091B420489F90014E +:10080000499F300D11242352384D24A74091B42024 +:10081000489F9001499F300D1124C9018352984D82 +:1008200095A716A680A1806880A3CF910895CF9345 +:10083000C3E0C093002029DEE0E0F1E010A280E4F4 +:1008400080A384E080A311A212A28BE483A314A24C +:1008500015A216A281E090E280A791A712A680EAD5 +:1008600084A788E085A716A680A1806A80A385E575 +:100870008093A00816AA34E230AB11AA29E522AB76 +:1008800082E083AB809102209091032084AB95ABF2 +:1008900086E694E280AF91AF12AE8BE384AFC09353 +:1008A0003D0110923E0180A9806880AB1092460104 +:1008B000E0E4F1E030831092410120934201C093C3 +:1008C00043018091042090910520809344019093EE +:1008D000450186E592E28093480190934901109288 +:1008E0004A0189E380934C01C0934D0110924E015F +:1008F000808180688083CF910895E0E0F1E0108AE4 +:1009000080E4808B84E0808B118A81E9828B8BE488 +:10091000838B87E791E0848B958B80EA808F88E0DA +:10092000818F128E4091B4208EEE92E0489F90010C +:10093000499F300D11242A59394D248F4091B420FC +:10094000489F9001499F300D1124C9018A59994D42 +:10095000958F168E80898068808B0895CF93C4E030 +:10096000C093002092DDE0E0F1E010A280E480A3DB +:10097000C0A311A212A28BE483A314A215A216A2F3 +:1009800081E090E280A791A712A680EA84A788E080 +:1009900085A716A680A1806A80A385E58093A0081C +:1009A00016AA44E240AB11AA39E532AB23E023ABEF +:1009B000809104209091052084AB95AB86E592E26E +:1009C00080AF91AF12AE89E384AF20933D011092C6 +:1009D0003E0180A9806880AB10924601E0E4F1E01E +:1009E0004083109241013093420182E080934301A1 +:1009F00080910220909103208093440190934501BF +:100A000086E694E2809348019093490110924A014E +:100A10008BE380934C0120934D0110924E01808115 +:100A200080688083CF910895CF93E0E0F1E0108A51 +:100A3000B0E4B08BA4E0A08B118A71E9728B8BE4D7 +:100A4000838B27E731E0248B358B80EA808F68E049 +:100A5000618F128EC091B4208EEE92E0C89FA001EB +:100A6000C99F500D11244A59594D448FC091B4204B +:100A7000C89FA001C99F500D11244A59594D558F47 +:100A8000168E40894068408B10AAB0ABA0AB11AA6B +:100A900072AB4AE443AB24AB35AB23EC20AF61AF80 +:100AA00012AE4091B420489F9001499F300D11240F +:100AB0002352384D24AF4091B420489F9001499F64 +:100AC000300D1124C9018352984D90933D0110922D +:100AD0003E0180A9806880ABCF91089585E0809326 +:100AE0000020D3DCE0E0F1E016AA54E250AB11AAFA +:100AF00049E542AB23E023AB80910420909105208F +:100B000084AB95AB86E592E280AF91AF12AE39E34C +:100B100034AF20933D0110923E0180A9806880ABE4 +:100B200010924601E0E4F1E05083109241014093BD +:100B300042012093430180910420909105208093ED +:100B400044019093450186E696E280934801909394 +:100B5000490110924A0130934C0120934D011092AB +:100B60004E01808180688083089586E08093002014 +:100B70008CDCE0E0F1E016AA44E240AB11AA39E5D2 +:100B800032AB23E023AB809104209091052084AB0D +:100B900095AB86E592E280AF91AF12AE89E384AF68 +:100BA00020933D0110923E0180A9806880AB109295 +:100BB0004601E0E4F1E040831092410130934201AC +:100BC00082E08093430180910220909103208093E2 +:100BD00044019093450186E694E280934801909306 +:100BE000490110924A018BE380934C0120934D01FF +:100BF00010924E018081806880830895E0E0F1E0EA +:100C0000108A80E4808B84E0808B118A81E9828B5A +:100C100080E1838B8EEE92E0848B958B24E2208F93 +:100C200022E0218F128E4091B420489F9001499F6D +:100C3000300D11242A59394D248F4091B420489FFA +:100C40009001499F300D1124C9018A59994D958F02 +:100C5000168E80898068808B089587E080930020BD +:100C600014DCE0E0F1E016AA44E240AB11AA39E559 +:100C700032AB23E023AB809104209091052084AB1C +:100C800095AB86E592E280AF91AF12AE89E384AF77 +:100C900020933D0110923E0180A9806880AB1092A4 +:100CA0004601E0E4F1E040831092410130934201BB +:100CB00082E08093430180910220909103208093F1 +:100CC00044019093450186E694E280934801909315 +:100CD000490110924A018BE380934C0120934D010E +:100CE00010924E018081806880830895E0E0F1E0F9 +:100CF000108A80E4808B85E0808B118A81E9828B69 +:100D000080E1838B8EEE92E0848B958B24E2208FA2 +:100D100022E0218F128E4091B420489F9001499F7C +:100D2000300D11242A59394D248F4091B420489F09 +:100D30009001499F300D1124C9018A59994D958F11 +:100D4000168E80898068808B0895E0E7F0E08381CB +:100D50008C7F838384818C7F848380818D7F80835B +:100D6000E0E8F1E080EC8283128688EC81831186D2 +:100D7000E0E0F8E034E0308323E02183148285ED65 +:100D800091E086A397A31682E0E4F8E03083218304 +:100D9000148286A397A31682E0E6F6E08081806144 +:100DA0008083E0E4F9E083E18183148221E02683FB +:100DB00088EB9BE086A397A310A611A62083089535 +:100DC0001F920F920FB60F9211242F933F934F93C0 +:100DD0008F939F93EF93FF93CF93DF931F92CDB7A2 +:100DE000DEB780910020873031F4E0E0F2E084A5A6 +:100DF000898385A503C0E0E0F2E084A52091B220BC +:100E0000281BE0E4F9E080A591A531E022300CF444 +:100E100030E03323C9F031E0823B9B4008F030E002 +:100E2000332391F0E0E4F9E080A591A529301CF08E +:100E300026E030E002C021E030E0820F931FE0E4C2 +:100E4000F9E080AF91AF21C0E0E4F9E080A591A581 +:100E500031E02F3F0CF030E03323B9F031E0079759 +:100E600008F430E0332389F0E0E4F9E080A591A5AF +:100E7000283F1CF426E030E002C021E030E0821B75 +:100E8000930BE0E4F9E080AF91AF0F90DF91CF9149 +:100E9000FF91EF919F918F914F913F912F910F90E3 +:100EA0000FBE0F901F901895E0E7F0E083818F7ED2 +:100EB0008383E0E4F6E080818A6A80838FEF848315 +:100EC00088E5828BE0EAF8E084EC858383E0868322 +:100ED000178288E184830895E0E7F0E08381877FCB +:100EE000838380E48093C00888E5E0E4F6E0858BA6 +:100EF0000895CF93DF9300D000D0CDB7DEB78FEF4A +:100F000080937000809371008093720080937300CF +:100F100080937400809375008093760064E081E490 +:100F200090E0E4D56CE170E082E0E6D58A836DE183 +:100F300070E082E0E1D5898389819A81019621F46C +:100F400080E493E289839A8389819A818B839C834D +:100F5000E0E6F0E082838C8183838FB7F894E0E54C +:100F6000F0E09081926090838FBF818181FFFDCFFF +:100F70008FB7F894A0E5B0E016969C911697997FEC +:100F800016969C931697E0E6F0E090E895839BEB2D +:100F9000968316969C911697946016969C939081D2 +:100FA000916090838FBF61E080E490E09FD58FB720 +:100FB000F894E0E5F0E090819E7F90838FBF2496C7 +:100FC000CDBFDEBFDF91CF9108959FB7F894E82F92 +:100FD000F0E0E059FF4F60958081682360839FBFF8 +:100FE0000895863011F468E101C060E0E0E5F0E0CA +:100FF000818181FD24C08FB7F894908192609083A5 +:101000008FBF818181FFFDCF8FB7F894A0E5B0E05D +:1010100016969C911697997F16969C931697E0E6E4 +:10102000F0E090E895839BEB968316969C9116973B +:10103000946016969C939081916090838FBF6360BB +:1010400084E490E053D560E480E0BFCF08958091C0 +:10105000B62008952BD1FC0183818093B6208111A5 +:1010600002C076C9089581E008958091B62081304C +:1010700009F47AC908958091562488234CF4807627 +:101080008034A9F480915724811113C072C9089546 +:101090008076803481F48091572481110EC0809134 +:1010A0005C2490915D24892B51F061C9089580E002 +:1010B000089580E0089580E0089580E0089580E03C +:1010C00008950F931F939B018A01AC0160E083E8B0 +:1010D0000E947A111F910F910895E091BB20F09129 +:1010E000BC200190F081E02D228133812E0F3F1F23 +:1010F000FC014081E40FF11DE217F307A0F48181A8 +:101100008430A1F0861306C014C081818430A1F020 +:101110008617A9F08081E80FF11DE217F307A8F305 +:1011200080E090E0089580E090E0089580E090E015 +:1011300008958E2F9F2F089580E090E008958E2FC0 +:101140009F2F0895809158248F770C94D010089584 +:101150009091BE20992381F1E091BB20F091BC20B9 +:101160000190F081E02D9481891740F5E093B9203A +:10117000F093BA20228133812E0F3F1FE217F3072D +:10118000F8F49181943061F49281981309C09381AD +:10119000961306C0E093B920F093BA2081E0089539 +:1011A0009081E90FF11DE217F30758F3E093B9209E +:1011B000F093BA2080E0089580E0089580E00895DB +:1011C00080E00895FF920F931F93CF93DF93C82F72 +:1011D00060E0BEDFF82E882381F1A091BB20B091A2 +:1011E000BC20EC2FF0E0EE0FFF1F12962D913C91EA +:1011F0001397E20FF31F00811181D8011696ED912C +:10120000FC9117970995682F8C2FA2DFF82E882361 +:10121000A1F0C091B920D091BA2065E0CE015DDF88 +:10122000EC01009721F08A810E943A12F6CFD80192 +:101230001296ED91FC91139709958F2DDF91CF9127 +:101240001F910F91FF9008951F93CF93DF93182F55 +:101250007FDF882339F1C091B920D091BA2065E0B1 +:10126000CE013BDFEC01009741F04C815D816B8149 +:101270008A81A5D78111F3CF15C0A091BB20B09171 +:10128000BC20812F90E0880F991F1296ED91FC9160 +:101290001397E80FF91F0190F081E02D0190F08184 +:1012A000E02D0995DF91CF911F9108958091B9208C +:1012B0009091BA200895EFC60895CF938091BE20F3 +:1012C0008823C1F0E091BB20F091BC200190F08117 +:1012D000E02D8481882371F0C0E08C2F73DFCF5F15 +:1012E000E091BB20F091BC200190F081E02D848141 +:1012F000C81798F31092BE201092C2201092C320FB +:10130000CF910895CF938091BE20882341F1E09141 +:10131000BB20F091BC20A081B18114968C918823D0 +:10132000F1F0C0E08C2F90E0880F991F0280F381CC +:10133000E02DE80FF91F0190F081E02D0084F18588 +:10134000E02D309709F00995CF5FE091BB20F09137 +:10135000BC20A081B18114968C91C81718F3CF914D +:101360000895EF92FF920F931F93CF93DF93109204 +:1013700060241092612410926224109263241092CF +:101380006424109265242091562422233CF48091F9 +:101390005C2490915D24892B09F49BC32076203432 +:1013A00009F008C18091572490E0FC01E05AF1094E +:1013B000E830F10508F0F5C0EA5FFE4F0C943514F3 +:1013C00000008BC3E0E0F8E01082809158249091F7 +:1013D000592486AB97AB80915A248F708083CCE5DB +:1013E000D4E26881798186E592E2E0D688819981AC +:1013F00020910420309105208217930709F46DC3D2 +:1014000080930420909305208091002090E0883004 +:10141000910508F0C8C0FC01E25FFE4F0C94351442 +:1014200046D85BC3BDD859C360D957C300DA55C38A +:1014300095DA53C353DB51C398DB4FC30EDC4DC366 +:10144000E0E4F8E01082CCE5D4E268817981609331 +:10145000022070930320809158249091592486ABE8 +:1014600097AB80915A248F70808386E694E29ED653 +:10147000888199812091042030910520821793075B +:1014800009F42BC3809304209093052080910020C1 +:1014900090E08830910508F088C0FC01EA5EFE4FBC +:1014A0000C94351404D819C37BD817C31ED915C39F +:1014B000BED913C353DA11C311DB0FC356DB0DC3FF +:1014C000CCDB0BC3E0E4F9E010A611A68091582410 +:1014D0008093B22002C380915824E0E2F6E0848336 +:1014E000FCC280915824909159248830910508F0CD +:1014F0005EC0FC01E25EFE4F0C94351460E080E0BB +:101500000E94E70180915A240E94BB010E94570269 +:10151000E4C260E080E00E94E70180915A240E94CA +:10152000BB013ED8DAC261E081E00E94E701CAE572 +:10153000D4E288810E94BB0189810E94CA01D5D86A +:10154000CCC275D9CAC20ADAC8C260E080E00E9483 +:10155000E70180915A240E94BB01C0DABEC261E05B +:1015600080E00E94E70180915A240E94BB01FDDACD +:10157000B4C262E080E00E94E70180915A24806852 +:101580000E94BB016ADBA9C280915824E0E8F6E022 +:101590008483A3C2E9E7F0E091E088EDF89484BF8A +:1015A000908300E005C001E003C001E001C000E05D +:1015B000011194C220915624822F807609F00EC228 +:1015C00022230CF017C180915C2490915D24009738 +:1015D00009F404C22F7109F0B1C03091572436309C +:1015E00081F0383009F49FC03111A8C0029739F456 +:1015F00062E070E082EC90E2D9D501E0EDC100E05C +:10160000EBC12091582430915924832F992782309F +:10161000910599F01CF4019739F07BC08330910556 +:10162000D9F10F9759F175C0809110209091112038 +:10163000DC016C9170E0BAD55BC0E0911020F091B4 +:1016400011208189281708F066C0C9019927880FE1 +:10165000991F880F991FE0911220F0911320E80F35 +:10166000F91F80819181FC01628173819FD5E09196 +:101670005E24F0915F2482E081833AC0809114203F +:1016800090911520009709F448C0DC0112966D91E5 +:101690007C9113978BD52CC033272130310559F01D +:1016A00020F02230310559F03AC064E070E08EEA53 +:1016B00090E27CD51DC083EA90E229E003C08AE86D +:1016C00090E228E1382FAAE5B0E2E82FF92F8191C6 +:1016D00090E08D939D938E2F831B8217C0F3220F72 +:1016E00062E0620F6093582070E088E590E25ED57A +:1016F00080915C2490915D2420916024309161243C +:101700008217930770F4809360249093612401E022 +:1017100063C100E061C100E05FC100E05DC100E0C5 +:101720005BC101E059C1019739F461E070E08EEBD3 +:1017300090E23CD501E050C100E04EC1213009F0FB +:101740003FC0309157243A30D9F5019799F58091EF +:10175000BE20882389F1C0915A24D0915B24E09067 +:10176000BB20F090BC20D701ED91FC918481C8177B +:1017700028F560E08C2FECDC082F882309F42CC1BD +:10178000CE019927880F991FD7011296ED91FC91F0 +:101790001397E80FF91F0190F081E02D0680F78183 +:1017A000E02D09958093C02061E070E080EC90E22C +:1017B000FDD412C100E010C100E00EC100E00CC178 +:1017C000223009F00BC120915724211100C102974A +:1017D00079F480915A2449D590E08093B720909372 +:1017E000B82062E070E087EB90E2E0D401E0F4C062 +:1017F00000E0F2C02F7109F090C08091572483302F +:1018000009F4E7C018F48130B1F087C0853019F0D1 +:10181000893061F182C080915C2490915D24892B94 +:1018200041F482EA98E0809362249093632401E07B +:10183000D3C000E0D1C080915C2490915D24892BBD +:1018400089F48091582490915924019769F48091EA +:10185000C2209091C3208D7F8093C2209093C3209B +:1018600001E0BAC000E0B8C000E0B6C080915C24DE +:1018700090915D24892B09F046C095D4882309F402 +:1018800044C020915824309159243327E0911020EE +:10189000F0911120818990E082179307C0F10DDD4E +:1018A00080915824909159248093BE20882389F1F7 +:1018B00099278150904C880F991F880F991FE091AC +:1018C0001220F0911320E80FF91FE093BB20F09352 +:1018D000BC200190F081E02D84818823E1F0C0E0FC +:1018E00060E08C2FB1DC082F882309F475C0CF5F2E +:1018F000E091BB20F091BC200190F081E02D84812B +:10190000C81770F369C000E067C000E065C000E080 +:1019100063C001E061C001E05FC0213009F5809142 +:1019200057248B30E9F480915C2490915D24892BBD +:1019300099F48091BE20882389F0C0915A24D091D7 +:1019400058248C2F3FDC082F882309F445C06D2FC5 +:101950008C2F7ADC082F40C000E03EC000E03CC085 +:10196000223009F03BC080915724813019F0833038 +:10197000B1F031C080915C2490915D24892B59F4A1 +:101980008091582490915924892B39F480915A24BC +:1019900087D4082F21C000E01FC000E01DC0809147 +:1019A0005C2490915D24892B71F48091582490914E +:1019B0005924892B51F4CAE5D4E2888122D5888143 +:1019C00076D5082F09C000E007C000E005C000E0A0 +:1019D00003C000E001C000E0011180C080915624E6 +:1019E0008F718130C1F58091BE208823A1F1C09113 +:1019F0005A24D0915B240091BB201091BC20D801C7 +:101A0000ED91FC918481C81730F560E08C2FA0DB4C +:101A1000882309F1CE019927880F991FD8011296C2 +:101A2000ED91FC911397E80FF91F00811181D80106 +:101A30001696ED91FC9117970995682F8C2F88DBEE +:101A4000882349F0D8011496ED91FC9115970995DA +:101A5000082F811143C0809156248F718230D9F5AF +:101A60008091BE20882389F1E091BB20F091BC20B9 +:101A7000A081B18114968C91882349F110E0212F27 +:101A800030E0220F331F0280F381E02DE20FF31FBD +:101A9000C081D181EE81FF810995682F812F58DBAC +:101AA000082F8823D9F0EC81FD810995082F811139 +:101AB00015C01F5FE091BB20F091BC20A081B181D7 +:101AC00014968C911817D8F209C000E007C000E006 +:101AD00005C000E003C000E001C001E0802FDF91FD +:101AE000CF911F910F91FF90EF9008951BBEFC01C5 +:101AF00028ED24BF608308954091CA01E62FF72F97 +:101B00008093CA0184914093CA010895811122C033 +:101B1000909154229923D9F09091432C911101C0B6 +:101B2000FFCF9FB7F894E3E4FCE2208121502083AB +:101B30009FBF0DC09091432C9F3F09F4FFCF9FB7EB +:101B4000F894E3E4FCE220812F5F20839FBF809321 +:101B50005422089590915422992361F3F8CF0F9362 +:101B6000E8ECF4E080818F7D808380818F7D8083AD +:101B7000E8E1F2E202E0059310921A2210921B2291 +:101B800000E2069300E40693E0E1F2E200E206934D +:101B900000E406931092622410926324109264244D +:101BA0001092652410926024109261241092FF21FB +:101BB0000F9108950F9385E08093FF21E9E1F2E210 +:101BC00004E00593E1E1F2E204E005930F9108954A +:101BD0000F9383E08093FF2110921A2210921B2210 +:101BE000E8E1F2E202E006930F910895E0916224A9 +:101BF000F0916324309709F0099508950F93CF93DE +:101C0000DF938091FF21833019F4F0DFA8DF60C0FB +:101C10008091FB219091FC21C0916024D09161249E +:101C2000C81BD90B71F52091FD213091FE21820F47 +:101C3000931F8093FD219093FE2120915C2430918D +:101C40005D248217930721F08091C420882341F0FE +:101C500084E08093FF21E0E1F2E202E0069338C0E5 +:101C6000E0916424F0916524309799F009958823D8 +:101C700081F01092FB211092FC21C0916024D09140 +:101C80006124C034D10528F01092C420C0E4D0E013 +:101C900003C081E08093C420C0931A22D0931B22FA +:101CA0008091FB219091FC2120915E2430915F2452 +:101CB000280F391F20931C2230931D22C80FD91FD3 +:101CC000C093FB21D093FC21E8E1F2E202E006930D +:101CD000DF91CF910F910895FC018181877090E091 +:101CE000FC013197E730F10518F4EA5DFE4FBDC500 +:101CF00088E090E0089580E290E0089580E490E02C +:101D0000089580E890E0089580E091E0089580E0F3 +:101D100092E008958FEF93E0089580E190E00895B8 +:101D2000282F2F7030E0220F331F992787FD9095C1 +:101D30008827990F881F9927820F931F02979C016C +:101D4000220F331F220F331F220F331F820F931FC7 +:101D50008B579E4D08950F93CF938091CC0480FFB5 +:101D600062C081E08093CC04E0E1F2E200E80693F7 +:101D7000E8E1F2E200E806938093CA04E0E1F2E2CF +:101D800000E106938091FF21882329F0835082305F +:101D900008F42CDFE4DE8091122290911322089740 +:101DA00009F043C088E0EBEBF1E2A6E5B4E2019074 +:101DB0000D928A95E1F7E8ECF4E0808180628083FF +:101DC000808180628083CDDAC82F811103C0F2DE6A +:101DD000C1E02CC08091562488236CF41092FD2120 +:101DE0001092FE211092FB211092FC2182E0809340 +:101DF000FF2104DF1BC020915C2430915D24232B44 +:101E000011F4E6DE13C01092FD211092FE21109213 +:101E1000FB211092FC2181E08093FF21E0E1F2E2BE +:101E200002E0069303C0C0E001C0C1E08C2FCF9157 +:101E30000F910895BF92CF92DF92EF92FF920F938E +:101E40001F93CF93DF93B82E6BDFEC011B2D111F77 +:101E50001127111F8B2D8F70E82EF12CEE0CFF1C1B +:101E6000E10EF11CC701880F991F880F991F880F79 +:101E7000991F9C01205F3D4D7901C9012DDF6C0147 +:101E8000112309F459C0D70116962D913C9117974B +:101E90008D819E81280F391F2D833E838B819C81EC +:101EA00028173907B9F1FC01E21BF30B9F0121153B +:101EB000F4E03F0738F02FEF33E0C901B601C1D499 +:101EC000281B390B888181FF09C0C901B601B9D42B +:101ED00041E0892B09F040E0942F01C090E0888117 +:101EE00090FB81F98883D70116961D921C92179753 +:101EF00012962D933C93139729813A818D819E816F +:101F0000820F931F14968D939C931597F70102E00F +:101F1000069394C0888181FF83C08D7F8883D70119 +:101F200016961D921C92179712961D921C9213974B +:101F3000F70102E0069382C0D70112960D911C9121 +:101F40001397888182FF13C0E981FA812D813E8138 +:101F50008B819C81B60175D4B0E4BB9EB001112485 +:101F60006B577F4DAC01CF01820F931F84D42D811D +:101F70003E81200F311F2D833E83EB81FC81E217D0 +:101F8000F30710F4ED83FE83D70116968D919C9193 +:101F900017978017910709F043C08D819E81E8173C +:101FA000F90709F43DC0E81BF90BE115B4E0FB07A4 +:101FB00040F0EFEFF3E0CF01B60143D4E81BF90B9B +:101FC00005C0CF01B6013DD4E81BF90BD70112962D +:101FD0001D921C921397EC15FD0578F4888184609E +:101FE0008883B0E4BB9EC00111248B579F4DF7013D +:101FF00084839583C682D7820FC029813A818D81DF +:102000009E81820F931FD70114968D939C931597F1 +:102010001696ED93FC931797F70102E006930EC016 +:10202000888180FF0BC08E7F8883EF81F885309791 +:1020300029F06D817E814B2D80E00995DF91CF9154 +:102040001F910F91FF90EF90DF90CF90BF90089578 +:10205000CF93CFB7F89481E059DDEAECF4E080E467 +:10206000808380E28083E1ECF4E080818160808382 +:10207000A9ECB4E08C9182608C93E8ECF4E0808170 +:10208000806480838C9181608C9380818068808360 +:10209000CFBFCF910895CF93DF93C0E6D0E01882F1 +:1020A00080E30E94F107E0ECF4E0808180648083AB +:1020B00081E08883CFB7F89480E090E0FC01EE0FD8 +:1020C000FF1FEE0FFF1FEE0FFF1FEF5EFD4D108293 +:1020D00001968830910591F7E5E8F1E280818E7FE5 +:1020E0008083EEE8F1E280818E7F8083E7E9F1E290 +:1020F00080818E7F8083E0EAF1E280818E7F808321 +:10210000E9EAF1E280818E7F8083E2EBF1E2808177 +:102110008E7F80836AE170E082E0EEDC8F3F19F011 +:102120008093FA0403C08FE18093FA046BE170E0BE +:1021300082E0E2DC8F3F19F08093FB0403C08FE163 +:102140008093FB04E0ECF4E08081836080838081F5 +:102150008068808380818061808380E192E28683D1 +:1021600097838081806280838FEF8093C504E8EC41 +:10217000F4E0808182608083109254228091472C09 +:102180008F3F09F4FFCF8FB7F894E7E4FCE290812A +:102190009F5F90838FBF5CDFCFBFDF91CF910895AA +:1021A0008093C30408958091C304089580935E24AE +:1021B00090935F2460936024709361240895E82FC6 +:1021C000EF70F0E0EE0FFF1F992787FD90958827AD +:1021D000990F881F9927E80FF91FEE0FFF1FEE0FC9 +:1021E000FF1FEE0FFF1FE05FFD4D8181807CD9F561 +:1021F0006370613029F010F480E403C080E801C00E +:1022000080EC40385105E1F050F440325105A1F026 +:102210004034510599F04031510561F419C0411520 +:1022200092E0590789F04F3F93E0590779F0411543 +:10223000514041F020E00DC022E00BC023E009C076 +:1022400024E007C025E005C026E003C027E001C068 +:1022500021E0118296E09083822B818381818062CC +:10226000818381E0089580E00895E82FEF70F0E029 +:10227000EE0FFF1F992787FD90958827990F881FDC +:102280009927E80FF91FEE0FFF1FEE0FFF1FEE0F4C +:10229000FF1FE05FFD4D818182FB882780F9089553 +:1022A000E82FEF70F0E0EE0FFF1F282F332727FDF8 +:1022B00030952227330F221F3327E20FF31FEE0F33 +:1022C000FF1FEE0FFF1FEE0FFF1FE05FFD4D91811F +:1022D00092FF0EC091819B7F918322DDFC01808162 +:1022E00080FF06C08E7F80830780F085E02D0995F2 +:1022F00081E008957F928F929F92AF92BF92CF928A +:10230000DF92EF92FF920F931F93CF93DF93982E5C +:10231000862E5A01690104DD7C01792C771C772413 +:10232000771CC92DCF70D0E0CC0FDD1FC70DD11D9C +:10233000CC0FDD1FCC0FDD1FCC0FDD1FC05FDD4DCF +:102340008981807C09F44BC08981807C803C19F0B4 +:10235000898182FD46C08FB7F894F701908190FF84 +:1023600003C08FBF712C3EC0F701908191609083B4 +:102370008FBFF701A182B282C382D48215821682F6 +:1023800007831087811006C091E0C114D10419F0B1 +:1023900090E001C091E0F701808190FB81F98B7F93 +:1023A0008083772019F01E821F8214C08981807C6F +:1023B000803C61F4CE0190DCBC01C60142D2892B85 +:1023C00029F0F70180818E7F80830CC01A821B82E6 +:1023D0001E821F82892D2EDD7724739403C0712CF9 +:1023E00001C0712C872DDF91CF911F910F91FF902C +:1023F000EF90DF90CF90BF90AF909F908F907F90A5 +:102400000895FF920F931F93CF93DF93182FF82E09 +:10241000FF1CFF24FF1CC82FCF70D0E0CC0FDD1FA6 +:10242000CF0DD11DCC0FDD1FCC0FDD1FCC0FDD1F5D +:10243000C05FDD4D75DCDC01FE0102E005938C918F +:1024400080FF12C08E7F8C931796ED91FC911897A8 +:10245000309751F0FF2019F06E817F8102C06A81B0 +:102460007B81412F81E00995DF91CF911F910F91E1 +:10247000FF900895CF93C82FC4DFEC2FEF70F0E0EA +:10248000EE0FFF1F8C2F992787FD90958827990FB6 +:10249000881F9927E80FF91FEE0FFF1FEE0FFF1F90 +:1024A000EE0FFF1FE05FFD4D1182CF9108950F9356 +:1024B000E82FEF70F0E0EE0FFF1F282F332727FDE6 +:1024C00030952227330F221F3327E20FF31FEE0F21 +:1024D000FF1FEE0FFF1FEE0FFF1FE05FFD4D91810D +:1024E0009460918301E006938CDF81E00F91089561 +:1024F0001F920F920FB60F9211240F932F933F93B9 +:102500004F935F936F937F938F939F93AF93BF93FB +:10251000EF93FF938091CB04882344F480E8809369 +:10252000CA040E9482090E94880190C08091CB0455 +:1025300082FF20C084E08093CA048091182286FF25 +:1025400085C08091CC0481FD81C005DC81117EC0F5 +:102550008091FF21813011F43BDB78C0843009F099 +:1025600075C0E9E1F2E204E00593E1E1F2E204E0A2 +:1025700005936CC08091CB0481FF63C082E080939F +:10258000CA048091102286FF61C08091CC0481FD35 +:102590005DC0E1DB81115AC08091FF21823041F49E +:1025A00084E08093FF21E0E1F2E202E006934EC076 +:1025B000833009F04BC0E9E1F2E204E00593E1E188 +:1025C000F2E204E0059342C080E18093CA0481E016 +:1025D00018DF81E816DF82E014DF82E812DF0E9454 +:1025E0005D091092C304E1E1F2E2108296E090935B +:1025F000102283E48083E9E1F2E2108290931822B2 +:1026000080838BEB91E28093142290931522A7DABA +:102610001DC08091CB0486FF08C080E48093CA046B +:1026200080E074DA0E94860111C08091CB0485FF9E +:102630000DC080E28093CA0481E068DA0E948701BD +:1026400005C08091CB0484FDBFCFE3CFFF91EF9114 +:10265000BF91AF919F918F917F916F915F914F91BA +:102660003F912F910F910F900FBE0F901F901895D3 +:102670001F920F920FB60F9211240F931F932F9357 +:102680003F934F935F936F937F938F939F93AF93FA +:10269000BF93CF93DF93EF93FF938091CC0481FDA1 +:1026A00003C059DB8111B8C082E08093CC048091D3 +:1026B000C5048195880FE0E1F2E2E81BF109208171 +:1026C000318120513242369527953695279536959A +:1026D0002795822F869520FF02C090E801C090E0E8 +:1026E000890FE82FEF70F0E0EE0FFF1F282F332740 +:1026F00027FD30952227330F221F3327E20FF31FC8 +:10270000EE0FFF1FEE0FFF1FEE0FFF1FE05FFD4DEF +:10271000908195FF81C000E20693811178C080917D +:10272000FF21843019F462DA1ADA76C0C0911222DD +:10273000D091132280916024909161240091FB211B +:102740001091FC2198012C0F3D1F8217930718F45C +:10275000EC01C01BD10B80915E2490915F24AE01EF +:102760006BEB71E2800F911F86D00C0F1D1F009341 +:10277000FB211093FC21C034D10569F48091FD2127 +:102780009091FE21800F911F20915C2430915D2457 +:102790008217930788F00093602410936124E091DE +:1027A0006424F0916524309729F00995811102C0C5 +:1027B00001DA32C00DDA30C080916024909161243A +:1027C00008171907F9F4E0916424F0916524309713 +:1027D00011F4F0D921C00995811102C0EBD91CC0B8 +:1027E0002091FD213091FE218091FB219091FC21CF +:1027F000820F931F8093FD219093FE211092FB2165 +:102800001092FC21E0E1F2E202E0069305C080387C +:1028100011F4F4D901C00EDBFF91EF91DF91CF915C +:10282000BF91AF919F918F917F916F915F914F91E8 +:102830003F912F911F910F910F900FBE0F901F90FE +:102840001895AA1BBB1B51E107C0AA1FBB1FA617E7 +:10285000B70710F0A61BB70B881F991F5A95A9F749 +:1028600080959095BC01CD010895EE0FFF1F059056 +:10287000F491E02D0994FB01DC0102C001900D925E +:0C28800041505040D8F70895F894FFCF65 +:10288C00FF55800080002A0835083B082708000007 +:10289C004420162000001C201A20062009022700C4 +:1028AC0001010080FA0904000003FFFFFF00070587 +:1028BC008102400000070502024000000705830169 +:1028CC00FF0301001201000200000040EB0300A016 +:1028DC0000020102000100000003000000000000E3 +:1028EC0000000000000000000000000000000000DC +:1028FC0000000000000000000000000000000000CC +:10290C0000000000000000000000555342476F62B9 +:10291C00696E6461722044756D6D792044657669C9 +:10292C006365005461706972546563680000040348 +:02293C0009048C +:00000001FF diff --git a/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.lss b/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.lss new file mode 100644 index 00000000..7a6ce108 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.lss @@ -0,0 +1,6988 @@ + +USB_BULK_TEST.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .text 0000288c 00000000 00000000 00000094 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .data 000000b2 00802000 0000288c 00002920 2**2 + CONTENTS, ALLOC, LOAD, DATA + 2 .bss 00000b96 008020b2 008020b2 000029d2 2**2 + ALLOC + 3 .comment 00000030 00000000 00000000 000029d2 2**0 + CONTENTS, READONLY + 4 .debug_aranges 00000490 00000000 00000000 00002a08 2**3 + CONTENTS, READONLY, DEBUGGING + 5 .debug_info 0000a25e 00000000 00000000 00002e98 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_abbrev 00001b61 00000000 00000000 0000d0f6 2**0 + CONTENTS, READONLY, DEBUGGING + 7 .debug_line 000088a1 00000000 00000000 0000ec57 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_frame 000009a8 00000000 00000000 000174f8 2**2 + CONTENTS, READONLY, DEBUGGING + 9 .debug_str 0002ee03 00000000 00000000 00017ea0 2**0 + CONTENTS, READONLY, DEBUGGING + 10 .debug_loc 00001e3e 00000000 00000000 00046ca3 2**0 + CONTENTS, READONLY, DEBUGGING + 11 .debug_ranges 00000390 00000000 00000000 00048ae8 2**3 + CONTENTS, READONLY, DEBUGGING + 12 .debug_macro 0000b6b4 00000000 00000000 00048e78 2**0 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00000000 <__vectors>: + 0: 2c c1 rjmp .+600 ; 0x25a <__ctors_end> + 2: 00 00 nop + 4: 46 c1 rjmp .+652 ; 0x292 <__bad_interrupt> + 6: 00 00 nop + 8: 44 c1 rjmp .+648 ; 0x292 <__bad_interrupt> + a: 00 00 nop + c: 42 c1 rjmp .+644 ; 0x292 <__bad_interrupt> + e: 00 00 nop + 10: 40 c1 rjmp .+640 ; 0x292 <__bad_interrupt> + 12: 00 00 nop + 14: 3e c1 rjmp .+636 ; 0x292 <__bad_interrupt> + 16: 00 00 nop + 18: 3c c1 rjmp .+632 ; 0x292 <__bad_interrupt> + 1a: 00 00 nop + 1c: 3a c1 rjmp .+628 ; 0x292 <__bad_interrupt> + 1e: 00 00 nop + 20: 38 c1 rjmp .+624 ; 0x292 <__bad_interrupt> + 22: 00 00 nop + 24: 36 c1 rjmp .+620 ; 0x292 <__bad_interrupt> + 26: 00 00 nop + 28: 34 c1 rjmp .+616 ; 0x292 <__bad_interrupt> + 2a: 00 00 nop + 2c: 32 c1 rjmp .+612 ; 0x292 <__bad_interrupt> + 2e: 00 00 nop + 30: 30 c1 rjmp .+608 ; 0x292 <__bad_interrupt> + 32: 00 00 nop + 34: 2e c1 rjmp .+604 ; 0x292 <__bad_interrupt> + 36: 00 00 nop + 38: 2c c1 rjmp .+600 ; 0x292 <__bad_interrupt> + 3a: 00 00 nop + 3c: 2a c1 rjmp .+596 ; 0x292 <__bad_interrupt> + 3e: 00 00 nop + 40: 28 c1 rjmp .+592 ; 0x292 <__bad_interrupt> + 42: 00 00 nop + 44: 26 c1 rjmp .+588 ; 0x292 <__bad_interrupt> + 46: 00 00 nop + 48: 24 c1 rjmp .+584 ; 0x292 <__bad_interrupt> + 4a: 00 00 nop + 4c: 22 c1 rjmp .+580 ; 0x292 <__bad_interrupt> + 4e: 00 00 nop + 50: 20 c1 rjmp .+576 ; 0x292 <__bad_interrupt> + 52: 00 00 nop + 54: 1e c1 rjmp .+572 ; 0x292 <__bad_interrupt> + 56: 00 00 nop + 58: 1c c1 rjmp .+568 ; 0x292 <__bad_interrupt> + 5a: 00 00 nop + 5c: 1a c1 rjmp .+564 ; 0x292 <__bad_interrupt> + 5e: 00 00 nop + 60: 18 c1 rjmp .+560 ; 0x292 <__bad_interrupt> + 62: 00 00 nop + 64: 16 c1 rjmp .+556 ; 0x292 <__bad_interrupt> + 66: 00 00 nop + 68: 14 c1 rjmp .+552 ; 0x292 <__bad_interrupt> + 6a: 00 00 nop + 6c: 12 c1 rjmp .+548 ; 0x292 <__bad_interrupt> + 6e: 00 00 nop + 70: 10 c1 rjmp .+544 ; 0x292 <__bad_interrupt> + 72: 00 00 nop + 74: 0e c1 rjmp .+540 ; 0x292 <__bad_interrupt> + 76: 00 00 nop + 78: 0c c1 rjmp .+536 ; 0x292 <__bad_interrupt> + 7a: 00 00 nop + 7c: 0a c1 rjmp .+532 ; 0x292 <__bad_interrupt> + 7e: 00 00 nop + 80: 08 c1 rjmp .+528 ; 0x292 <__bad_interrupt> + 82: 00 00 nop + 84: 06 c1 rjmp .+524 ; 0x292 <__bad_interrupt> + 86: 00 00 nop + 88: 04 c1 rjmp .+520 ; 0x292 <__bad_interrupt> + 8a: 00 00 nop + 8c: 02 c1 rjmp .+516 ; 0x292 <__bad_interrupt> + 8e: 00 00 nop + 90: 00 c1 rjmp .+512 ; 0x292 <__bad_interrupt> + 92: 00 00 nop + 94: fe c0 rjmp .+508 ; 0x292 <__bad_interrupt> + 96: 00 00 nop + 98: fc c0 rjmp .+504 ; 0x292 <__bad_interrupt> + 9a: 00 00 nop + 9c: fa c0 rjmp .+500 ; 0x292 <__bad_interrupt> + 9e: 00 00 nop + a0: f8 c0 rjmp .+496 ; 0x292 <__bad_interrupt> + a2: 00 00 nop + a4: f6 c0 rjmp .+492 ; 0x292 <__bad_interrupt> + a6: 00 00 nop + a8: f4 c0 rjmp .+488 ; 0x292 <__bad_interrupt> + aa: 00 00 nop + ac: f2 c0 rjmp .+484 ; 0x292 <__bad_interrupt> + ae: 00 00 nop + b0: f0 c0 rjmp .+480 ; 0x292 <__bad_interrupt> + b2: 00 00 nop + b4: ee c0 rjmp .+476 ; 0x292 <__bad_interrupt> + b6: 00 00 nop + b8: ec c0 rjmp .+472 ; 0x292 <__bad_interrupt> + ba: 00 00 nop + bc: ea c0 rjmp .+468 ; 0x292 <__bad_interrupt> + be: 00 00 nop + c0: e8 c0 rjmp .+464 ; 0x292 <__bad_interrupt> + c2: 00 00 nop + c4: e6 c0 rjmp .+460 ; 0x292 <__bad_interrupt> + c6: 00 00 nop + c8: e4 c0 rjmp .+456 ; 0x292 <__bad_interrupt> + ca: 00 00 nop + cc: e2 c0 rjmp .+452 ; 0x292 <__bad_interrupt> + ce: 00 00 nop + d0: e0 c0 rjmp .+448 ; 0x292 <__bad_interrupt> + d2: 00 00 nop + d4: de c0 rjmp .+444 ; 0x292 <__bad_interrupt> + d6: 00 00 nop + d8: dc c0 rjmp .+440 ; 0x292 <__bad_interrupt> + da: 00 00 nop + dc: da c0 rjmp .+436 ; 0x292 <__bad_interrupt> + de: 00 00 nop + e0: d8 c0 rjmp .+432 ; 0x292 <__bad_interrupt> + e2: 00 00 nop + e4: d6 c0 rjmp .+428 ; 0x292 <__bad_interrupt> + e6: 00 00 nop + e8: d4 c0 rjmp .+424 ; 0x292 <__bad_interrupt> + ea: 00 00 nop + ec: d2 c0 rjmp .+420 ; 0x292 <__bad_interrupt> + ee: 00 00 nop + f0: d0 c0 rjmp .+416 ; 0x292 <__bad_interrupt> + f2: 00 00 nop + f4: ce c0 rjmp .+412 ; 0x292 <__bad_interrupt> + f6: 00 00 nop + f8: cc c0 rjmp .+408 ; 0x292 <__bad_interrupt> + fa: 00 00 nop + fc: ca c0 rjmp .+404 ; 0x292 <__bad_interrupt> + fe: 00 00 nop + 100: c8 c0 rjmp .+400 ; 0x292 <__bad_interrupt> + 102: 00 00 nop + 104: c6 c0 rjmp .+396 ; 0x292 <__bad_interrupt> + 106: 00 00 nop + 108: c4 c0 rjmp .+392 ; 0x292 <__bad_interrupt> + 10a: 00 00 nop + 10c: c2 c0 rjmp .+388 ; 0x292 <__bad_interrupt> + 10e: 00 00 nop + 110: c0 c0 rjmp .+384 ; 0x292 <__bad_interrupt> + 112: 00 00 nop + 114: be c0 rjmp .+380 ; 0x292 <__bad_interrupt> + 116: 00 00 nop + 118: bc c0 rjmp .+376 ; 0x292 <__bad_interrupt> + 11a: 00 00 nop + 11c: ba c0 rjmp .+372 ; 0x292 <__bad_interrupt> + 11e: 00 00 nop + 120: b8 c0 rjmp .+368 ; 0x292 <__bad_interrupt> + 122: 00 00 nop + 124: b6 c0 rjmp .+364 ; 0x292 <__bad_interrupt> + 126: 00 00 nop + 128: b4 c0 rjmp .+360 ; 0x292 <__bad_interrupt> + 12a: 00 00 nop + 12c: b2 c0 rjmp .+356 ; 0x292 <__bad_interrupt> + 12e: 00 00 nop + 130: b0 c0 rjmp .+352 ; 0x292 <__bad_interrupt> + 132: 00 00 nop + 134: ae c0 rjmp .+348 ; 0x292 <__bad_interrupt> + 136: 00 00 nop + 138: ac c0 rjmp .+344 ; 0x292 <__bad_interrupt> + 13a: 00 00 nop + 13c: aa c0 rjmp .+340 ; 0x292 <__bad_interrupt> + 13e: 00 00 nop + 140: a8 c0 rjmp .+336 ; 0x292 <__bad_interrupt> + 142: 00 00 nop + 144: a6 c0 rjmp .+332 ; 0x292 <__bad_interrupt> + 146: 00 00 nop + 148: a4 c0 rjmp .+328 ; 0x292 <__bad_interrupt> + 14a: 00 00 nop + 14c: 39 c6 rjmp .+3186 ; 0xdc0 <__vector_83> + 14e: 00 00 nop + 150: a0 c0 rjmp .+320 ; 0x292 <__bad_interrupt> + 152: 00 00 nop + 154: 9e c0 rjmp .+316 ; 0x292 <__bad_interrupt> + 156: 00 00 nop + 158: 9c c0 rjmp .+312 ; 0x292 <__bad_interrupt> + 15a: 00 00 nop + 15c: 9a c0 rjmp .+308 ; 0x292 <__bad_interrupt> + 15e: 00 00 nop + 160: 98 c0 rjmp .+304 ; 0x292 <__bad_interrupt> + 162: 00 00 nop + 164: 96 c0 rjmp .+300 ; 0x292 <__bad_interrupt> + 166: 00 00 nop + 168: 94 c0 rjmp .+296 ; 0x292 <__bad_interrupt> + 16a: 00 00 nop + 16c: 92 c0 rjmp .+292 ; 0x292 <__bad_interrupt> + 16e: 00 00 nop + 170: 90 c0 rjmp .+288 ; 0x292 <__bad_interrupt> + 172: 00 00 nop + 174: 8e c0 rjmp .+284 ; 0x292 <__bad_interrupt> + 176: 00 00 nop + 178: 8c c0 rjmp .+280 ; 0x292 <__bad_interrupt> + 17a: 00 00 nop + 17c: 8a c0 rjmp .+276 ; 0x292 <__bad_interrupt> + 17e: 00 00 nop + 180: 88 c0 rjmp .+272 ; 0x292 <__bad_interrupt> + 182: 00 00 nop + 184: 86 c0 rjmp .+268 ; 0x292 <__bad_interrupt> + 186: 00 00 nop + 188: 84 c0 rjmp .+264 ; 0x292 <__bad_interrupt> + 18a: 00 00 nop + 18c: 82 c0 rjmp .+260 ; 0x292 <__bad_interrupt> + 18e: 00 00 nop + 190: 80 c0 rjmp .+256 ; 0x292 <__bad_interrupt> + 192: 00 00 nop + 194: 7e c0 rjmp .+252 ; 0x292 <__bad_interrupt> + 196: 00 00 nop + 198: 7c c0 rjmp .+248 ; 0x292 <__bad_interrupt> + 19a: 00 00 nop + 19c: 7a c0 rjmp .+244 ; 0x292 <__bad_interrupt> + 19e: 00 00 nop + 1a0: 78 c0 rjmp .+240 ; 0x292 <__bad_interrupt> + 1a2: 00 00 nop + 1a4: 76 c0 rjmp .+236 ; 0x292 <__bad_interrupt> + 1a6: 00 00 nop + 1a8: 74 c0 rjmp .+232 ; 0x292 <__bad_interrupt> + 1aa: 00 00 nop + 1ac: 72 c0 rjmp .+228 ; 0x292 <__bad_interrupt> + 1ae: 00 00 nop + 1b0: 70 c0 rjmp .+224 ; 0x292 <__bad_interrupt> + 1b2: 00 00 nop + 1b4: 6e c0 rjmp .+220 ; 0x292 <__bad_interrupt> + 1b6: 00 00 nop + 1b8: 6c c0 rjmp .+216 ; 0x292 <__bad_interrupt> + 1ba: 00 00 nop + 1bc: 6a c0 rjmp .+212 ; 0x292 <__bad_interrupt> + 1be: 00 00 nop + 1c0: 68 c0 rjmp .+208 ; 0x292 <__bad_interrupt> + 1c2: 00 00 nop + 1c4: 66 c0 rjmp .+204 ; 0x292 <__bad_interrupt> + 1c6: 00 00 nop + 1c8: 64 c0 rjmp .+200 ; 0x292 <__bad_interrupt> + 1ca: 00 00 nop + 1cc: 62 c0 rjmp .+196 ; 0x292 <__bad_interrupt> + 1ce: 00 00 nop + 1d0: 60 c0 rjmp .+192 ; 0x292 <__bad_interrupt> + 1d2: 00 00 nop + 1d4: 5e c0 rjmp .+188 ; 0x292 <__bad_interrupt> + 1d6: 00 00 nop + 1d8: 5c c0 rjmp .+184 ; 0x292 <__bad_interrupt> + 1da: 00 00 nop + 1dc: 5a c0 rjmp .+180 ; 0x292 <__bad_interrupt> + 1de: 00 00 nop + 1e0: 58 c0 rjmp .+176 ; 0x292 <__bad_interrupt> + 1e2: 00 00 nop + 1e4: 56 c0 rjmp .+172 ; 0x292 <__bad_interrupt> + 1e6: 00 00 nop + 1e8: 54 c0 rjmp .+168 ; 0x292 <__bad_interrupt> + 1ea: 00 00 nop + 1ec: 52 c0 rjmp .+164 ; 0x292 <__bad_interrupt> + 1ee: 00 00 nop + 1f0: 50 c0 rjmp .+160 ; 0x292 <__bad_interrupt> + 1f2: 00 00 nop + 1f4: 0c 94 78 12 jmp 0x24f0 ; 0x24f0 <__vector_125> + 1f8: 0c 94 38 13 jmp 0x2670 ; 0x2670 <__vector_126> + 1fc: 93 01 movw r18, r6 + 1fe: 95 01 movw r18, r10 + 200: 97 01 movw r18, r14 + 202: 99 01 movw r18, r18 + 204: 9b 01 movw r18, r22 + 206: a0 01 movw r20, r0 + 208: 9d 01 movw r18, r26 + 20a: 9f 01 movw r18, r30 + 20c: e0 09 sbc r30, r0 + 20e: e2 09 sbc r30, r2 + 210: 20 0a sbc r2, r16 + 212: 62 0a sbc r6, r18 + 214: 6b 0a sbc r6, r27 + 216: 71 0a sbc r7, r17 + 218: c4 0a sbc r12, r20 + 21a: ca 0a sbc r12, r26 + 21c: 10 0a sbc r1, r16 + 21e: 12 0a sbc r1, r18 + 220: 14 0a sbc r1, r20 + 222: 16 0a sbc r1, r22 + 224: 18 0a sbc r1, r24 + 226: 1a 0a sbc r1, r26 + 228: 1c 0a sbc r1, r28 + 22a: 1e 0a sbc r1, r30 + 22c: 52 0a sbc r5, r18 + 22e: 54 0a sbc r5, r20 + 230: 56 0a sbc r5, r22 + 232: 58 0a sbc r5, r24 + 234: 5a 0a sbc r5, r26 + 236: 5c 0a sbc r5, r28 + 238: 5e 0a sbc r5, r30 + 23a: 60 0a sbc r6, r16 + 23c: 7e 0a sbc r7, r30 + 23e: 89 0a sbc r8, r25 + 240: 93 0a sbc r9, r19 + 242: a1 0a sbc r10, r17 + 244: a3 0a sbc r10, r19 + 246: a5 0a sbc r10, r21 + 248: af 0a sbc r10, r31 + 24a: b9 0a sbc r11, r25 + 24c: 8d 0e add r8, r29 + 24e: 7b 0e add r7, r27 + 250: 7e 0e add r7, r30 + 252: 81 0e add r8, r17 + 254: 84 0e add r8, r20 + 256: 87 0e add r8, r23 + 258: 8a 0e add r8, r26 + +0000025a <__ctors_end>: + 25a: 11 24 eor r1, r1 + 25c: 1f be out 0x3f, r1 ; 63 + 25e: cf ef ldi r28, 0xFF ; 255 + 260: cd bf out 0x3d, r28 ; 61 + 262: df e2 ldi r29, 0x2F ; 47 + 264: de bf out 0x3e, r29 ; 62 + +00000266 <__do_copy_data>: + 266: 10 e2 ldi r17, 0x20 ; 32 + 268: a0 e0 ldi r26, 0x00 ; 0 + 26a: b0 e2 ldi r27, 0x20 ; 32 + 26c: ec e8 ldi r30, 0x8C ; 140 + 26e: f8 e2 ldi r31, 0x28 ; 40 + 270: 02 c0 rjmp .+4 ; 0x276 <__do_copy_data+0x10> + 272: 05 90 lpm r0, Z+ + 274: 0d 92 st X+, r0 + 276: a2 3b cpi r26, 0xB2 ; 178 + 278: b1 07 cpc r27, r17 + 27a: d9 f7 brne .-10 ; 0x272 <__do_copy_data+0xc> + +0000027c <__do_clear_bss>: + 27c: 2c e2 ldi r18, 0x2C ; 44 + 27e: a2 eb ldi r26, 0xB2 ; 178 + 280: b0 e2 ldi r27, 0x20 ; 32 + 282: 01 c0 rjmp .+2 ; 0x286 <.do_clear_bss_start> + +00000284 <.do_clear_bss_loop>: + 284: 1d 92 st X+, r1 + +00000286 <.do_clear_bss_start>: + 286: a8 34 cpi r26, 0x48 ; 72 + 288: b2 07 cpc r27, r18 + 28a: e1 f7 brne .-8 ; 0x284 <.do_clear_bss_loop> + 28c: 1c d0 rcall .+56 ; 0x2c6
+ 28e: 0c 94 44 14 jmp 0x2888 ; 0x2888 <_exit> + +00000292 <__bad_interrupt>: + 292: b6 ce rjmp .-660 ; 0x0 <__vectors> + +00000294 : +#include "tiny_dig.h" +#include "globals.h" + + +void tiny_dig_setup(void){ + PORTE.DIR = 0x0f; + 294: e0 e8 ldi r30, 0x80 ; 128 + 296: f6 e0 ldi r31, 0x06 ; 6 + 298: 8f e0 ldi r24, 0x0F ; 15 + 29a: 80 83 st Z, r24 + PORTE.OUT = 0x05; + 29c: 85 e0 ldi r24, 0x05 ; 5 + 29e: 84 83 std Z+4, r24 ; 0x04 + 2a0: 08 95 ret + +000002a2 : + 2a2: 08 95 ret + +000002a4 : +{ + return true; +} + +void iso_callback(udd_ep_status_t status, iram_size_t nb_transfered, udd_ep_id_t ep){ + udi_vendor_iso_in_run((uint8_t *)&isoBuf[!b1_state * PACKET_SIZE], PACKET_SIZE, iso_callback); + 2a4: 80 91 b4 20 lds r24, 0x20B4 + 2a8: 81 11 cpse r24, r1 + 2aa: 03 c0 rjmp .+6 ; 0x2b2 + 2ac: 8e ee ldi r24, 0xEE ; 238 + 2ae: 92 e0 ldi r25, 0x02 ; 2 + 2b0: 02 c0 rjmp .+4 ; 0x2b6 + 2b2: 80 e0 ldi r24, 0x00 ; 0 + 2b4: 90 e0 ldi r25, 0x00 ; 0 + 2b6: 42 e5 ldi r20, 0x52 ; 82 + 2b8: 51 e0 ldi r21, 0x01 ; 1 + 2ba: 6e ee ldi r22, 0xEE ; 238 + 2bc: 72 e0 ldi r23, 0x02 ; 2 + 2be: 8a 59 subi r24, 0x9A ; 154 + 2c0: 99 4d sbci r25, 0xD9 ; 217 + 2c2: ff c6 rjmp .+3582 ; 0x10c2 + 2c4: 08 95 ret + +000002c6
: +volatile char PSU_target = 0; + +volatile unsigned char test_byte = 123; + +int main(void){ + irq_initialize_vectors(); + 2c6: 87 e0 ldi r24, 0x07 ; 7 + 2c8: e0 ea ldi r30, 0xA0 ; 160 + 2ca: f0 e0 ldi r31, 0x00 ; 0 + 2cc: 82 83 std Z+2, r24 ; 0x02 + cpu_irq_enable(); + 2ce: 78 94 sei + sysclk_init(); + 2d0: 10 d6 rcall .+3104 ; 0xef2 + board_init(); + 2d2: e7 df rcall .-50 ; 0x2a2 + udc_start(); + 2d4: f0 d7 rcall .+4064 ; 0x12b6 + tiny_dac_setup(); + 2d6: ac d0 rcall .+344 ; 0x430 + tiny_dma_setup(); + 2d8: cf d0 rcall .+414 ; 0x478 + tiny_adc_setup(0, 0); + 2da: 60 e0 ldi r22, 0x00 ; 0 + 2dc: 80 e0 ldi r24, 0x00 ; 0 + 2de: 77 d0 rcall .+238 ; 0x3ce + tiny_adc_pid_setup(); + 2e0: 63 d0 rcall .+198 ; 0x3a8 + tiny_adc_ch1setup(12); + 2e2: 8c e0 ldi r24, 0x0C ; 12 + 2e4: 57 d0 rcall .+174 ; 0x394 + tiny_timer_setup(); + 2e6: 31 d5 rcall .+2658 ; 0xd4a + tiny_uart_setup(); + 2e8: df d5 rcall .+3006 ; 0xea8 + tiny_spi_setup(); + 2ea: f6 d5 rcall .+3052 ; 0xed8 + tiny_dig_setup(); + 2ec: d3 df rcall .-90 ; 0x294 + ... + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + 30a: f1 cf rjmp .-30 ; 0x2ee + +0000030c : +//! Global variable to give and record information about setup request management +udd_ctrl_request_t udd_g_ctrlreq; + +//CALLBACKS: +void main_suspend_action(void) +{ + 30c: 08 95 ret + +0000030e : + return; +} + +void main_resume_action(void) +{ + 30e: 08 95 ret + +00000310 : + return; +} + +void main_sof_action(void) +{ + switch(global_mode){ + 310: 80 91 00 20 lds r24, 0x2000 + 314: 90 e0 ldi r25, 0x00 ; 0 + 316: 88 30 cpi r24, 0x08 ; 8 + 318: 91 05 cpc r25, r1 + 31a: 90 f4 brcc .+36 ; 0x340 + 31c: fc 01 movw r30, r24 + 31e: e2 50 subi r30, 0x02 ; 2 + 320: ff 4f sbci r31, 0xFF ; 255 + 322: 0c 94 35 14 jmp 0x286a ; 0x286a <__tablejump2__> + case 0: + tiny_dma_loop_mode_0(); + 326: 0b d1 rcall .+534 ; 0x53e + break; + 328: 0b c0 rjmp .+22 ; 0x340 + case 1: + tiny_dma_loop_mode_1(); + 32a: 88 d1 rcall .+784 ; 0x63c + break; + 32c: 09 c0 rjmp .+18 ; 0x340 + case 2: + tiny_dma_loop_mode_2(); + 32e: 27 d2 rcall .+1102 ; 0x77e + break; + 330: 07 c0 rjmp .+14 ; 0x340 + case 3: + tiny_dma_loop_mode_3(); + 332: e3 d2 rcall .+1478 ; 0x8fa + break; + 334: 05 c0 rjmp .+10 ; 0x340 + case 4: + tiny_dma_loop_mode_4(); + 336: 78 d3 rcall .+1776 ; 0xa28 + break; + 338: 03 c0 rjmp .+6 ; 0x340 + case 6: + tiny_dma_loop_mode_6(); + 33a: 60 d4 rcall .+2240 ; 0xbfc + break; + 33c: 01 c0 rjmp .+2 ; 0x340 + case 7: + tiny_dma_loop_mode_7(); + 33e: d6 d4 rcall .+2476 ; 0xcec + break; + default: + break; + } + b1_state = !b1_state; + 340: 90 91 b4 20 lds r25, 0x20B4 + 344: 81 e0 ldi r24, 0x01 ; 1 + 346: 91 11 cpse r25, r1 + 348: 80 e0 ldi r24, 0x00 ; 0 + 34a: 80 93 b4 20 sts 0x20B4, r24 + 34e: 08 95 ret + +00000350 : + return; +} + +bool main_vendor_enable(void) +{ + main_b_vendor_enable = true; + 350: 81 e0 ldi r24, 0x01 ; 1 + 352: 80 93 b5 20 sts 0x20B5, r24 + udi_vendor_iso_in_run((uint8_t *)&isoBuf[0], PACKET_SIZE, iso_callback); + 356: 42 e5 ldi r20, 0x52 ; 82 + 358: 51 e0 ldi r21, 0x01 ; 1 + 35a: 6e ee ldi r22, 0xEE ; 238 + 35c: 72 e0 ldi r23, 0x02 ; 2 + 35e: 86 e6 ldi r24, 0x66 ; 102 + 360: 96 e2 ldi r25, 0x26 ; 38 + 362: af d6 rcall .+3422 ; 0x10c2 + return true; +} + 364: 81 e0 ldi r24, 0x01 ; 1 + 366: 08 95 ret + +00000368 : + +void main_vendor_disable(void) +{ + main_b_vendor_enable = false; + 368: 10 92 b5 20 sts 0x20B5, r1 + 36c: 08 95 ret + +0000036e : +} + +bool main_setup_out_received(void) +{ + return 1; +} + 36e: 81 e0 ldi r24, 0x01 ; 1 + 370: 08 95 ret + +00000372 : + +bool main_setup_in_received(void) +{ + return true; +} + 372: 81 e0 ldi r24, 0x01 ; 1 + 374: 08 95 ret + +00000376 : + + return; +} + +void tiny_adc_ch0setup(unsigned char gain_mask){ + ADCA.CH0.CTRL = 0x00; //Reset + 376: e0 e0 ldi r30, 0x00 ; 0 + 378: f2 e0 ldi r31, 0x02 ; 2 + 37a: 10 a2 std Z+32, r1 ; 0x20 + ADCA.CH0.CTRL = ADC_CH_START_bm | (gain_mask&0x1c) | ADC_CH_INPUTMODE_DIFFWGAIN_gc; + 37c: 98 2f mov r25, r24 + 37e: 9c 71 andi r25, 0x1C ; 28 + 380: 93 68 ori r25, 0x83 ; 131 + 382: 90 a3 std Z+32, r25 ; 0x20 + #ifdef VERO + ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN0_gc | ((gain_mask&0x80) ? ADC_CH_MUXNEG_PIN6_gc : ADC_CH_MUXNEG_PIN4_gc); + 384: 88 1f adc r24, r24 + 386: 88 27 eor r24, r24 + 388: 88 1f adc r24, r24 + 38a: 88 0f add r24, r24 + 38c: 81 a3 std Z+33, r24 ; 0x21 + #else + ADCA.CH0.MUXCTRL = ((gain_mask&0x80) ? ADC_CH_MUXPOS_PIN2_gc : ADC_CH_MUXPOS_PIN0_gc) | ((gain_mask&0x80) ? ADC_CH_MUXNEG_PIN6_gc : ADC_CH_MUXNEG_PIN4_gc); + #endif + ADCA.CH0.INTCTRL = ADC_CH_INTLVL_OFF_gc; + 38e: 12 a2 std Z+34, r1 ; 0x22 + ADCA.CH0.SCAN = 0x00; //Disable scanning + 390: 16 a2 std Z+38, r1 ; 0x26 + 392: 08 95 ret + +00000394 : +} + +void tiny_adc_ch1setup(unsigned char gain_mask){ + ADCA.CH2.CTRL = 0x00; //Reset + 394: e0 e0 ldi r30, 0x00 ; 0 + 396: f2 e0 ldi r31, 0x02 ; 2 + 398: 10 aa std Z+48, r1 ; 0x30 + ADCA.CH2.CTRL = ADC_CH_START_bm | gain_mask | ADC_CH_INPUTMODE_DIFFWGAIN_gc; + 39a: 83 68 ori r24, 0x83 ; 131 + 39c: 80 ab std Z+48, r24 ; 0x30 + ADCA.CH2.MUXCTRL = ADC_CH_MUXPOS_PIN2_gc | ADC_CH_MUXNEG_PIN4_gc; + 39e: 80 e1 ldi r24, 0x10 ; 16 + 3a0: 81 ab std Z+49, r24 ; 0x31 + ADCA.CH2.INTCTRL = ADC_CH_INTLVL_OFF_gc; + 3a2: 12 aa std Z+50, r1 ; 0x32 + ADCA.CH2.SCAN = 0x00; //Disable scanning + 3a4: 16 aa std Z+54, r1 ; 0x36 + 3a6: 08 95 ret + +000003a8 : +} + +void tiny_adc_pid_setup(void){ + ADCA.CH1.CTRL = 0x00; //Reset + 3a8: e0 e0 ldi r30, 0x00 ; 0 + 3aa: f2 e0 ldi r31, 0x02 ; 2 + 3ac: 10 a6 std Z+40, r1 ; 0x28 + ADCA.CH1.CTRL = ADC_CH_START_bm | ADC_CH_GAIN_1X_gc | ADC_CH_INPUTMODE_DIFFWGAIN_gc; + 3ae: 83 e8 ldi r24, 0x83 ; 131 + 3b0: 80 a7 std Z+40, r24 ; 0x28 + ADCA.CH1.MUXCTRL = ADC_CH_MUXPOS_PIN5_gc | 0b00000111; + 3b2: 8f e2 ldi r24, 0x2F ; 47 + 3b4: 81 a7 std Z+41, r24 ; 0x29 + ADCA.CH1.INTCTRL = ADC_CH_INTLVL_OFF_gc; + 3b6: 12 a6 std Z+42, r1 ; 0x2a + ADCA.CH1.SCAN = 0x00; //Disable scanning + 3b8: 16 a6 std Z+46, r1 ; 0x2e + 3ba: 08 95 ret + +000003bc : +//FROM: http://www.avrfreaks.net/forum/xmega-production-signature-row +uint8_t ReadCalibrationByte(uint8_t index){ + uint8_t result; + + /* Load the NVM Command register to read the calibration row. */ + NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc; + 3bc: 92 e0 ldi r25, 0x02 ; 2 + 3be: 90 93 ca 01 sts 0x01CA, r25 + result = pgm_read_byte(index); + 3c2: e8 2f mov r30, r24 + 3c4: f0 e0 ldi r31, 0x00 ; 0 + 3c6: 84 91 lpm r24, Z + + /* Clean up NVM Command register. */ + NVM_CMD = NVM_CMD_NO_OPERATION_gc; + 3c8: 10 92 ca 01 sts 0x01CA, r1 + + return( result ); + 3cc: 08 95 ret + +000003ce : +// These 2 files need to be included in order to read +// the production calibration values from EEPROM +#include +#include + +void tiny_adc_setup(unsigned char ch2_enable, unsigned char seven_fiddy_ksps){ + 3ce: cf 93 push r28 + 3d0: df 93 push r29 + PR.PRPA &=0b11111101; + 3d2: e0 e7 ldi r30, 0x70 ; 112 + 3d4: f0 e0 ldi r31, 0x00 ; 0 + 3d6: 91 81 ldd r25, Z+1 ; 0x01 + 3d8: 9d 7f andi r25, 0xFD ; 253 + 3da: 91 83 std Z+1, r25 ; 0x01 + + ADCA.CTRLA = 0x00; //Turn off + 3dc: 10 92 00 02 sts 0x0200, r1 + ADCA.CTRLB = ADC_FREERUN_bm | (seven_fiddy_ksps == 2 ? ADC_RESOLUTION_LEFT12BIT_gc : ADC_RESOLUTION_8BIT_gc) | ADC_CONMODE_bm ; + 3e0: 62 30 cpi r22, 0x02 ; 2 + 3e2: 11 f4 brne .+4 ; 0x3e8 + 3e4: 9e e1 ldi r25, 0x1E ; 30 + 3e6: 01 c0 rjmp .+2 ; 0x3ea + 3e8: 9c e1 ldi r25, 0x1C ; 28 + 3ea: e0 e0 ldi r30, 0x00 ; 0 + 3ec: f2 e0 ldi r31, 0x02 ; 2 + 3ee: 91 83 std Z+1, r25 ; 0x01 + ADCA.REFCTRL = ADC_REFSEL_INTVCC2_gc; + 3f0: 90 e4 ldi r25, 0x40 ; 64 + 3f2: 92 83 std Z+2, r25 ; 0x02 + ADCA.EVCTRL = ch2_enable ? ADC_SWEEP_0123_gc : ADC_SWEEP_01_gc; //Non-zero causes issues with interrupts! ;.; + 3f4: 88 23 and r24, r24 + 3f6: 11 f0 breq .+4 ; 0x3fc + 3f8: 80 ec ldi r24, 0xC0 ; 192 + 3fa: 01 c0 rjmp .+2 ; 0x3fe + 3fc: 80 e4 ldi r24, 0x40 ; 64 + 3fe: e0 e0 ldi r30, 0x00 ; 0 + 400: f2 e0 ldi r31, 0x02 ; 2 + 402: 83 83 std Z+3, r24 ; 0x03 + + ADCA.PRESCALER = seven_fiddy_ksps == 1 ? ADC_PRESCALER_DIV16_gc : ADC_PRESCALER_DIV32_gc; //ADC Clock = Sysclock/128 + 404: 61 30 cpi r22, 0x01 ; 1 + 406: 11 f4 brne .+4 ; 0x40c + 408: 82 e0 ldi r24, 0x02 ; 2 + 40a: 01 c0 rjmp .+2 ; 0x40e + 40c: 83 e0 ldi r24, 0x03 ; 3 + 40e: c0 e0 ldi r28, 0x00 ; 0 + 410: d2 e0 ldi r29, 0x02 ; 2 + 412: 8c 83 std Y+4, r24 ; 0x04 + ADCA.CALL = ReadCalibrationByte(offsetof(NVM_PROD_SIGNATURES_t, ADCACAL0)); //Load calibration bytes from production row. + 414: 80 e2 ldi r24, 0x20 ; 32 + 416: d2 df rcall .-92 ; 0x3bc + 418: 8c 87 std Y+12, r24 ; 0x0c + ADCA.CALH = ReadCalibrationByte(offsetof(NVM_PROD_SIGNATURES_t, ADCACAL1)); //Load calibration bytes from production row. + 41a: 81 e2 ldi r24, 0x21 ; 33 + 41c: cf df rcall .-98 ; 0x3bc + 41e: 8d 87 std Y+13, r24 ; 0x0d + ADCA.CMP = 0x0000; //No compare used + 420: 18 8e std Y+24, r1 ; 0x18 + 422: 19 8e std Y+25, r1 ; 0x19 + + ADCA.CTRLA = ADC_ENABLE_bm; + 424: 81 e0 ldi r24, 0x01 ; 1 + 426: 88 83 st Y, r24 + + tiny_adc_pid_setup(); + 428: bf df rcall .-130 ; 0x3a8 + + return; +} + 42a: df 91 pop r29 + 42c: cf 91 pop r28 + 42e: 08 95 ret + +00000430 : +#include "tiny_adc.h" + +#include +#include + +void tiny_dac_setup(void){ + 430: cf 93 push r28 + 432: df 93 push r29 + + //Turn on in PR + PR.PRPB &=0b11111011; + 434: e0 e7 ldi r30, 0x70 ; 112 + 436: f0 e0 ldi r31, 0x00 ; 0 + 438: 82 81 ldd r24, Z+2 ; 0x02 + 43a: 8b 7f andi r24, 0xFB ; 251 + 43c: 82 83 std Z+2, r24 ; 0x02 + + DACB.CTRLA = DAC_CH1EN_bm | DAC_CH0EN_bm | DAC_ENABLE_bm; + 43e: c0 e2 ldi r28, 0x20 ; 32 + 440: d3 e0 ldi r29, 0x03 ; 3 + 442: 8d e0 ldi r24, 0x0D ; 13 + 444: 88 83 st Y, r24 + DACB.CTRLB = DAC_CHSEL_DUAL_gc; + 446: 80 e4 ldi r24, 0x40 ; 64 + 448: 89 83 std Y+1, r24 ; 0x01 + DACB.CTRLC = DAC_REFSEL_AVCC_gc | DAC_LEFTADJ_bm; + 44a: 89 e0 ldi r24, 0x09 ; 9 + 44c: 8a 83 std Y+2, r24 ; 0x02 + //EVCTRL unset + //DACB.CH0DATAH = 127;//contains (8-bit) sample, assuming left adjust! + + //TODO: Calibrate + DACB.CH0GAINCAL = ReadCalibrationByte(offsetof(NVM_PROD_SIGNATURES_t, DACB0GAINCAL)); //Load calibration bytes from production row. + 44e: 83 e3 ldi r24, 0x33 ; 51 + 450: b5 df rcall .-150 ; 0x3bc + 452: 88 87 std Y+8, r24 ; 0x08 + DACB.CH0OFFSETCAL = ReadCalibrationByte(offsetof(NVM_PROD_SIGNATURES_t, DACB0OFFCAL)); //Load calibration bytes from production row. + 454: 82 e3 ldi r24, 0x32 ; 50 + 456: b2 df rcall .-156 ; 0x3bc + 458: 89 87 std Y+9, r24 ; 0x09 + + DACB.CH1GAINCAL = ReadCalibrationByte(offsetof(NVM_PROD_SIGNATURES_t, DACB1GAINCAL)); //Load calibration bytes from production row. + 45a: 87 e3 ldi r24, 0x37 ; 55 + 45c: af df rcall .-162 ; 0x3bc + 45e: 8a 87 std Y+10, r24 ; 0x0a + DACB.CH1OFFSETCAL = ReadCalibrationByte(offsetof(NVM_PROD_SIGNATURES_t, DACB1OFFCAL)); //Load calibration bytes from production row. + 460: 86 e3 ldi r24, 0x36 ; 54 + 462: ac df rcall .-168 ; 0x3bc + 464: 8b 87 std Y+11, r24 ; 0x0b + + //Set up for triple mode! + PORTB.DIR |= 0x03; + 466: e0 e2 ldi r30, 0x20 ; 32 + 468: f6 e0 ldi r31, 0x06 ; 6 + 46a: 80 81 ld r24, Z + 46c: 83 60 ori r24, 0x03 ; 3 + 46e: 80 83 st Z, r24 + PORTB.OUT = 0x00; + 470: 14 82 std Z+4, r1 ; 0x04 + + + + 472: df 91 pop r29 + 474: cf 91 pop r28 + 476: 08 95 ret + +00000478 : +#include "globals.h" + + +void tiny_dma_setup(void){ + //Turn on DMA + PR.PRGEN &=0b111111110; //Turn on DMA clk + 478: e0 e7 ldi r30, 0x70 ; 112 + 47a: f0 e0 ldi r31, 0x00 ; 0 + 47c: 80 81 ld r24, Z + 47e: 8e 7f andi r24, 0xFE ; 254 + 480: 80 83 st Z, r24 + DMA.CTRL = DMA_ENABLE_bm | DMA_PRIMODE_RR0123_gc; + 482: 80 e8 ldi r24, 0x80 ; 128 + 484: 80 93 00 01 sts 0x0100, r24 + 488: 08 95 ret + +0000048a : +} +void tiny_dma_flush(void){ + DMA.CH0.CTRLA = 0x00; + 48a: e0 e0 ldi r30, 0x00 ; 0 + 48c: f1 e0 ldi r31, 0x01 ; 1 + 48e: 10 8a std Z+16, r1 ; 0x10 + DMA.CH0.CTRLA = DMA_CH_RESET_bm; + 490: 80 e4 ldi r24, 0x40 ; 64 + 492: 80 8b std Z+16, r24 ; 0x10 + + DMA.CH1.CTRLA = 0x00; + 494: 10 a2 std Z+32, r1 ; 0x20 + DMA.CH1.CTRLA = DMA_CH_RESET_bm; + 496: 80 a3 std Z+32, r24 ; 0x20 + + DMA.CH2.CTRLA = 0x00; + 498: 10 aa std Z+48, r1 ; 0x30 + DMA.CH2.CTRLA = DMA_CH_RESET_bm; + 49a: 80 ab std Z+48, r24 ; 0x30 + + DMA.CH3.CTRLA = 0x00; + 49c: e0 e4 ldi r30, 0x40 ; 64 + 49e: f1 e0 ldi r31, 0x01 ; 1 + 4a0: 10 82 st Z, r1 + DMA.CH3.CTRLA = DMA_CH_RESET_bm; + 4a2: 80 83 st Z, r24 + + b1_state = 0; + 4a4: 10 92 b4 20 sts 0x20B4, r1 + b2_state = 0; + 4a8: 10 92 b3 20 sts 0x20B3, r1 + 4ac: 08 95 ret + +000004ae : +} +void tiny_dma_set_mode_0(void){ + + global_mode = 0; + 4ae: 10 92 00 20 sts 0x2000, r1 + + tiny_dma_flush(); + 4b2: eb df rcall .-42 ; 0x48a + + DMA.CH2.REPCNT = 0; //Repeat forever! + 4b4: e0 e0 ldi r30, 0x00 ; 0 + 4b6: f1 e0 ldi r31, 0x01 ; 1 + 4b8: 16 aa std Z+54, r1 ; 0x36 + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + 4ba: 44 e2 ldi r20, 0x24 ; 36 + 4bc: 40 ab std Z+48, r20 ; 0x30 + DMA.CH2.CTRLB = 0x00; //No interrupt for DacBuf!! + 4be: 11 aa std Z+49, r1 ; 0x31 + DMA.CH2.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + 4c0: 39 e5 ldi r19, 0x59 ; 89 + 4c2: 32 ab std Z+50, r19 ; 0x32 + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH1_gc; //Triggered from TCC0 when it hits PER + 4c4: 82 e0 ldi r24, 0x02 ; 2 + 4c6: 83 ab std Z+51, r24 ; 0x33 + DMA.CH2.TRFCNT = auxDacBufLen; + 4c8: 80 91 02 20 lds r24, 0x2002 + 4cc: 90 91 03 20 lds r25, 0x2003 + 4d0: 84 ab std Z+52, r24 ; 0x34 + 4d2: 95 ab std Z+53, r25 ; 0x35 + + DMA.CH2.SRCADDR0 = (( (uint16_t) &dacBuf_CH2[0]) >> 0) & 0xFF; //Source address is dacbuf + 4d4: 86 e6 ldi r24, 0x66 ; 102 + 4d6: 94 e2 ldi r25, 0x24 ; 36 + 4d8: 80 af std Z+56, r24 ; 0x38 + DMA.CH2.SRCADDR1 = (( (uint16_t) &dacBuf_CH2[0]) >> 8) & 0xFF; + 4da: 91 af std Z+57, r25 ; 0x39 + DMA.CH2.SRCADDR2 = 0x00; + 4dc: 12 ae std Z+58, r1 ; 0x3a + + DMA.CH2.DESTADDR0 = (( (uint16_t) &DACB.CH1DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + 4de: 8b e3 ldi r24, 0x3B ; 59 + 4e0: 84 af std Z+60, r24 ; 0x3c + DMA.CH2.DESTADDR1 = (( (uint16_t) &DACB.CH1DATAH) >> 8) & 0xFF; + 4e2: 23 e0 ldi r18, 0x03 ; 3 + 4e4: 20 93 3d 01 sts 0x013D, r18 + DMA.CH2.DESTADDR2 = 0x00; + 4e8: 10 92 3e 01 sts 0x013E, r1 + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + 4ec: 80 a9 ldd r24, Z+48 ; 0x30 + 4ee: 80 68 ori r24, 0x80 ; 128 + 4f0: 80 ab std Z+48, r24 ; 0x30 + + DMA.CH3.REPCNT = 0; //Repeat forever! + 4f2: 10 92 46 01 sts 0x0146, r1 + DMA.CH3.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + 4f6: e0 e4 ldi r30, 0x40 ; 64 + 4f8: f1 e0 ldi r31, 0x01 ; 1 + 4fa: 40 83 st Z, r20 + DMA.CH3.CTRLB = 0x00; //Hi interrupt on block complete + 4fc: 10 92 41 01 sts 0x0141, r1 + DMA.CH3.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + 500: 30 93 42 01 sts 0x0142, r19 + DMA.CH3.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH2_gc; //Triggered from TCC0 when it hits PER + 504: 20 93 43 01 sts 0x0143, r18 + DMA.CH3.TRFCNT = dacBuf_len; + 508: 80 91 04 20 lds r24, 0x2004 + 50c: 90 91 05 20 lds r25, 0x2005 + 510: 80 93 44 01 sts 0x0144, r24 + 514: 90 93 45 01 sts 0x0145, r25 + + DMA.CH3.SRCADDR0 = (( (uint16_t) &dacBuf_CH1[0]) >> 0) & 0xFF; //Source address is dacbuf + 518: 86 e5 ldi r24, 0x56 ; 86 + 51a: 92 e2 ldi r25, 0x22 ; 34 + 51c: 80 93 48 01 sts 0x0148, r24 + DMA.CH3.SRCADDR1 = (( (uint16_t) &dacBuf_CH1[0]) >> 8) & 0xFF; + 520: 90 93 49 01 sts 0x0149, r25 + DMA.CH3.SRCADDR2 = 0x00; + 524: 10 92 4a 01 sts 0x014A, r1 + + DMA.CH3.DESTADDR0 = (( (uint16_t) &DACB.CH0DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + 528: 89 e3 ldi r24, 0x39 ; 57 + 52a: 80 93 4c 01 sts 0x014C, r24 + DMA.CH3.DESTADDR1 = (( (uint16_t) &DACB.CH0DATAH) >> 8) & 0xFF; + 52e: 20 93 4d 01 sts 0x014D, r18 + DMA.CH3.DESTADDR2 = 0x00; + 532: 10 92 4e 01 sts 0x014E, r1 + + //Must enable last for REPCNT won't work! + DMA.CH3.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + 536: 80 81 ld r24, Z + 538: 80 68 ori r24, 0x80 ; 128 + 53a: 80 83 st Z, r24 + 53c: 08 95 ret + +0000053e : +} + +void tiny_dma_loop_mode_0(void){ + DMA.CH0.CTRLA = 0x00; + 53e: e0 e0 ldi r30, 0x00 ; 0 + 540: f1 e0 ldi r31, 0x01 ; 1 + 542: 10 8a std Z+16, r1 ; 0x10 + DMA.CH0.CTRLA = DMA_CH_RESET_bm; + 544: 80 e4 ldi r24, 0x40 ; 64 + 546: 80 8b std Z+16, r24 ; 0x10 + + DMA.CH0.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + 548: 84 e0 ldi r24, 0x04 ; 4 + 54a: 80 8b std Z+16, r24 ; 0x10 + DMA.CH0.CTRLB = 0x00; //No interrupt! + 54c: 11 8a std Z+17, r1 ; 0x11 + DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + 54e: 81 e9 ldi r24, 0x91 ; 145 + 550: 82 8b std Z+18, r24 ; 0x12 + DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH0_gc; //Triggered from ADCA channel 0 + 552: 80 e1 ldi r24, 0x10 ; 16 + 554: 83 8b std Z+19, r24 ; 0x13 + DMA.CH0.TRFCNT = HALFPACKET_SIZE; + 556: 87 e7 ldi r24, 0x77 ; 119 + 558: 91 e0 ldi r25, 0x01 ; 1 + 55a: 84 8b std Z+20, r24 ; 0x14 + 55c: 95 8b std Z+21, r25 ; 0x15 + + DMA.CH0.SRCADDR0 = (( (uint16_t) &ADCA.CH0.RESL) >> 0) & 0xFF; //Source address is ADC + 55e: 84 e2 ldi r24, 0x24 ; 36 + 560: 80 8f std Z+24, r24 ; 0x18 + DMA.CH0.SRCADDR1 = (( (uint16_t) &ADCA.CH0.RESL) >> 8) & 0xFF; + 562: 82 e0 ldi r24, 0x02 ; 2 + 564: 81 8f std Z+25, r24 ; 0x19 + DMA.CH0.SRCADDR2 = 0x00; + 566: 12 8e std Z+26, r1 ; 0x1a + + DMA.CH0.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + 568: 40 91 b4 20 lds r20, 0x20B4 + 56c: 8e ee ldi r24, 0xEE ; 238 + 56e: 92 e0 ldi r25, 0x02 ; 2 + 570: 48 9f mul r20, r24 + 572: 90 01 movw r18, r0 + 574: 49 9f mul r20, r25 + 576: 30 0d add r19, r0 + 578: 11 24 eor r1, r1 + 57a: 2a 59 subi r18, 0x9A ; 154 + 57c: 39 4d sbci r19, 0xD9 ; 217 + 57e: 24 8f std Z+28, r18 ; 0x1c + DMA.CH0.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 8) & 0xFF; + 580: 40 91 b4 20 lds r20, 0x20B4 + 584: 48 9f mul r20, r24 + 586: 90 01 movw r18, r0 + 588: 49 9f mul r20, r25 + 58a: 30 0d add r19, r0 + 58c: 11 24 eor r1, r1 + 58e: c9 01 movw r24, r18 + 590: 8a 59 subi r24, 0x9A ; 154 + 592: 99 4d sbci r25, 0xD9 ; 217 + 594: 95 8f std Z+29, r25 ; 0x1d + DMA.CH0.DESTADDR2 = 0x00; + 596: 16 8e std Z+30, r1 ; 0x1e + + //Must enable last for REPCNT won't work! + DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + 598: 80 89 ldd r24, Z+16 ; 0x10 + 59a: 80 68 ori r24, 0x80 ; 128 + 59c: 80 8b std Z+16, r24 ; 0x10 + 59e: 08 95 ret + +000005a0 : +} + +void tiny_dma_set_mode_1(void){ + + global_mode = 1; + 5a0: 81 e0 ldi r24, 0x01 ; 1 + 5a2: 80 93 00 20 sts 0x2000, r24 + + tiny_dma_flush(); + 5a6: 71 df rcall .-286 ; 0x48a + + //AUX channel (to keep it tx, therefore always rx) + DMA.CH2.CTRLA = 0x00; + 5a8: e0 e0 ldi r30, 0x00 ; 0 + 5aa: f1 e0 ldi r31, 0x01 ; 1 + 5ac: 10 aa std Z+48, r1 ; 0x30 + DMA.CH2.CTRLA = DMA_CH_RESET_bm; + 5ae: 80 e4 ldi r24, 0x40 ; 64 + 5b0: 80 ab std Z+48, r24 ; 0x30 + + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + 5b2: 84 e0 ldi r24, 0x04 ; 4 + 5b4: 80 ab std Z+48, r24 ; 0x30 + DMA.CH2.CTRLB = 0x00; //No int + 5b6: 11 aa std Z+49, r1 ; 0x31 + DMA.CH2.ADDRCTRL = DMA_CH_SRCDIR_FIXED_gc | DMA_CH_DESTDIR_FIXED_gc; //Source and address fixed. + 5b8: 12 aa std Z+50, r1 ; 0x32 + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_USARTC0_RXC_gc; + 5ba: 8b e4 ldi r24, 0x4B ; 75 + 5bc: 83 ab std Z+51, r24 ; 0x33 + DMA.CH2.TRFCNT = 0; + 5be: 14 aa std Z+52, r1 ; 0x34 + 5c0: 15 aa std Z+53, r1 ; 0x35 + DMA.CH2.REPCNT = 0; + 5c2: 16 aa std Z+54, r1 ; 0x36 + + DMA.CH2.SRCADDR0 = (( (uint16_t) &dummy) >> 0) & 0xFF; + 5c4: 81 e0 ldi r24, 0x01 ; 1 + 5c6: 90 e2 ldi r25, 0x20 ; 32 + 5c8: 80 af std Z+56, r24 ; 0x38 + DMA.CH2.SRCADDR1 = (( (uint16_t) &dummy) >> 8) & 0xFF; + 5ca: 91 af std Z+57, r25 ; 0x39 + DMA.CH2.SRCADDR2 = 0x00; + 5cc: 12 ae std Z+58, r1 ; 0x3a + + DMA.CH2.DESTADDR0 = (( (uint16_t) &USARTC0.DATA) >> 0) & 0xFF; + 5ce: 80 ea ldi r24, 0xA0 ; 160 + 5d0: 84 af std Z+60, r24 ; 0x3c + DMA.CH2.DESTADDR1 = (( (uint16_t) &USARTC0.DATA) >> 8) & 0xFF; + 5d2: 88 e0 ldi r24, 0x08 ; 8 + 5d4: 80 93 3d 01 sts 0x013D, r24 + DMA.CH2.DESTADDR2 = 0x00; + 5d8: 10 92 3e 01 sts 0x013E, r1 + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_REPEAT_bm | DMA_CH_ENABLE_bm; //Enable! + 5dc: 80 a9 ldd r24, Z+48 ; 0x30 + 5de: 80 6a ori r24, 0xA0 ; 160 + 5e0: 80 ab std Z+48, r24 ; 0x30 + + USARTC0.DATA = 0x55; + 5e2: 85 e5 ldi r24, 0x55 ; 85 + 5e4: 80 93 a0 08 sts 0x08A0, r24 + + + DMA.CH3.REPCNT = 0; //Repeat forever! + 5e8: 10 92 46 01 sts 0x0146, r1 + DMA.CH3.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + 5ec: e0 e4 ldi r30, 0x40 ; 64 + 5ee: f1 e0 ldi r31, 0x01 ; 1 + 5f0: 84 e2 ldi r24, 0x24 ; 36 + 5f2: 80 83 st Z, r24 + DMA.CH3.CTRLB = 0x00; //No interrupt for DacBuf!! + 5f4: 10 92 41 01 sts 0x0141, r1 + DMA.CH3.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + 5f8: 89 e5 ldi r24, 0x59 ; 89 + 5fa: 80 93 42 01 sts 0x0142, r24 + DMA.CH3.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH1_gc; //Triggered from TCC0 when it hits PER + 5fe: 82 e0 ldi r24, 0x02 ; 2 + 600: 80 93 43 01 sts 0x0143, r24 + DMA.CH3.TRFCNT = auxDacBufLen; + 604: 80 91 02 20 lds r24, 0x2002 + 608: 90 91 03 20 lds r25, 0x2003 + 60c: 80 93 44 01 sts 0x0144, r24 + 610: 90 93 45 01 sts 0x0145, r25 + + DMA.CH3.SRCADDR0 = (( (uint16_t) &dacBuf_CH2[0]) >> 0) & 0xFF; //Source address is dacbuf + 614: 86 e6 ldi r24, 0x66 ; 102 + 616: 94 e2 ldi r25, 0x24 ; 36 + 618: 80 93 48 01 sts 0x0148, r24 + DMA.CH3.SRCADDR1 = (( (uint16_t) &dacBuf_CH2[0]) >> 8) & 0xFF; + 61c: 90 93 49 01 sts 0x0149, r25 + DMA.CH3.SRCADDR2 = 0x00; + 620: 10 92 4a 01 sts 0x014A, r1 + + DMA.CH3.DESTADDR0 = (( (uint16_t) &DACB.CH1DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + 624: 8b e3 ldi r24, 0x3B ; 59 + 626: 80 93 4c 01 sts 0x014C, r24 + DMA.CH3.DESTADDR1 = (( (uint16_t) &DACB.CH1DATAH) >> 8) & 0xFF; + 62a: 83 e0 ldi r24, 0x03 ; 3 + 62c: 80 93 4d 01 sts 0x014D, r24 + DMA.CH3.DESTADDR2 = 0x00; + 630: 10 92 4e 01 sts 0x014E, r1 + + //Must enable last for REPCNT won't work! + DMA.CH3.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + 634: 80 81 ld r24, Z + 636: 80 68 ori r24, 0x80 ; 128 + 638: 80 83 st Z, r24 + 63a: 08 95 ret + +0000063c : + +} + +void tiny_dma_loop_mode_1(void){ + DMA.CH0.CTRLA = 0x00; + 63c: e0 e0 ldi r30, 0x00 ; 0 + 63e: f1 e0 ldi r31, 0x01 ; 1 + 640: 10 8a std Z+16, r1 ; 0x10 + DMA.CH0.CTRLA = DMA_CH_RESET_bm; + 642: a0 e4 ldi r26, 0x40 ; 64 + 644: a0 8b std Z+16, r26 ; 0x10 + + DMA.CH0.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + 646: 74 e0 ldi r23, 0x04 ; 4 + 648: 70 8b std Z+16, r23 ; 0x10 + DMA.CH0.CTRLB = 0x00; //No interrupt! + 64a: 11 8a std Z+17, r1 ; 0x11 + DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + 64c: 61 e9 ldi r22, 0x91 ; 145 + 64e: 62 8b std Z+18, r22 ; 0x12 + DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH0_gc; //Triggered from ADCA channel 0 + 650: 80 e1 ldi r24, 0x10 ; 16 + 652: 83 8b std Z+19, r24 ; 0x13 + DMA.CH0.TRFCNT = HALFPACKET_SIZE; + 654: 27 e7 ldi r18, 0x77 ; 119 + 656: 31 e0 ldi r19, 0x01 ; 1 + 658: 24 8b std Z+20, r18 ; 0x14 + 65a: 35 8b std Z+21, r19 ; 0x15 + + DMA.CH0.SRCADDR0 = (( (uint16_t) &ADCA.CH0.RESL) >> 0) & 0xFF; //Source address is ADC + 65c: 84 e2 ldi r24, 0x24 ; 36 + 65e: 80 8f std Z+24, r24 ; 0x18 + DMA.CH0.SRCADDR1 = (( (uint16_t) &ADCA.CH0.RESL) >> 8) & 0xFF; + 660: 82 e0 ldi r24, 0x02 ; 2 + 662: 81 8f std Z+25, r24 ; 0x19 + DMA.CH0.SRCADDR2 = 0x00; + 664: 12 8e std Z+26, r1 ; 0x1a + + DMA.CH0.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + 666: b0 91 b4 20 lds r27, 0x20B4 + 66a: 8e ee ldi r24, 0xEE ; 238 + 66c: 92 e0 ldi r25, 0x02 ; 2 + 66e: b8 9f mul r27, r24 + 670: a0 01 movw r20, r0 + 672: b9 9f mul r27, r25 + 674: 50 0d add r21, r0 + 676: 11 24 eor r1, r1 + 678: 4a 59 subi r20, 0x9A ; 154 + 67a: 59 4d sbci r21, 0xD9 ; 217 + 67c: 44 8f std Z+28, r20 ; 0x1c + DMA.CH0.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 8) & 0xFF; + 67e: b0 91 b4 20 lds r27, 0x20B4 + 682: b8 9f mul r27, r24 + 684: a0 01 movw r20, r0 + 686: b9 9f mul r27, r25 + 688: 50 0d add r21, r0 + 68a: 11 24 eor r1, r1 + 68c: 4a 59 subi r20, 0x9A ; 154 + 68e: 59 4d sbci r21, 0xD9 ; 217 + 690: 55 8f std Z+29, r21 ; 0x1d + DMA.CH0.DESTADDR2 = 0x00; + 692: 16 8e std Z+30, r1 ; 0x1e + + //Must enable last for REPCNT won't work! + DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + 694: 40 89 ldd r20, Z+16 ; 0x10 + 696: 40 68 ori r20, 0x80 ; 128 + 698: 40 8b std Z+16, r20 ; 0x10 + + DMA.CH1.CTRLA = 0x00; + 69a: 10 a2 std Z+32, r1 ; 0x20 + DMA.CH1.CTRLA = DMA_CH_RESET_bm; + 69c: a0 a3 std Z+32, r26 ; 0x20 + + DMA.CH1.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + 69e: 70 a3 std Z+32, r23 ; 0x20 + DMA.CH1.CTRLB = 0x00; //No interrupt + 6a0: 11 a2 std Z+33, r1 ; 0x21 + DMA.CH1.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + 6a2: 62 a3 std Z+34, r22 ; 0x22 + DMA.CH1.TRIGSRC = DMA_CH_TRIGSRC_USARTC0_RXC_gc; + 6a4: 4b e4 ldi r20, 0x4B ; 75 + 6a6: 43 a3 std Z+35, r20 ; 0x23 + DMA.CH1.TRFCNT = HALFPACKET_SIZE; + 6a8: 24 a3 std Z+36, r18 ; 0x24 + 6aa: 35 a3 std Z+37, r19 ; 0x25 + + DMA.CH1.SRCADDR0 = (( (uint16_t) &USARTC0.DATA) >> 0) & 0xFF; //Source address is ADC + 6ac: 20 ea ldi r18, 0xA0 ; 160 + 6ae: 20 a7 std Z+40, r18 ; 0x28 + DMA.CH1.SRCADDR1 = (( (uint16_t) &USARTC0.DATA) >> 8) & 0xFF; + 6b0: 28 e0 ldi r18, 0x08 ; 8 + 6b2: 21 a7 std Z+41, r18 ; 0x29 + DMA.CH1.SRCADDR2 = 0x00; + 6b4: 12 a6 std Z+42, r1 ; 0x2a + + DMA.CH1.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE + HALFPACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + 6b6: 40 91 b4 20 lds r20, 0x20B4 + 6ba: 48 9f mul r20, r24 + 6bc: 90 01 movw r18, r0 + 6be: 49 9f mul r20, r25 + 6c0: 30 0d add r19, r0 + 6c2: 11 24 eor r1, r1 + 6c4: 23 52 subi r18, 0x23 ; 35 + 6c6: 38 4d sbci r19, 0xD8 ; 216 + 6c8: 24 a7 std Z+44, r18 ; 0x2c + DMA.CH1.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE + HALFPACKET_SIZE]) >> 8) & 0xFF; + 6ca: 40 91 b4 20 lds r20, 0x20B4 + 6ce: 48 9f mul r20, r24 + 6d0: 90 01 movw r18, r0 + 6d2: 49 9f mul r20, r25 + 6d4: 30 0d add r19, r0 + 6d6: 11 24 eor r1, r1 + 6d8: c9 01 movw r24, r18 + 6da: 83 52 subi r24, 0x23 ; 35 + 6dc: 98 4d sbci r25, 0xD8 ; 216 + 6de: 95 a7 std Z+45, r25 ; 0x2d + DMA.CH1.DESTADDR2 = 0x00; + 6e0: 16 a6 std Z+46, r1 ; 0x2e + + //Must enable last for REPCNT won't work! + DMA.CH1.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + 6e2: 80 a1 ldd r24, Z+32 ; 0x20 + 6e4: 80 68 ori r24, 0x80 ; 128 + 6e6: 80 a3 std Z+32, r24 ; 0x20 + 6e8: 08 95 ret + +000006ea : +} + +void tiny_dma_set_mode_2(void){ + 6ea: cf 93 push r28 + + global_mode = 2; + 6ec: c2 e0 ldi r28, 0x02 ; 2 + 6ee: c0 93 00 20 sts 0x2000, r28 + + tiny_dma_flush(); + 6f2: cb de rcall .-618 ; 0x48a + + DMA.CH2.REPCNT = 0; //Repeat forever! + 6f4: e0 e0 ldi r30, 0x00 ; 0 + 6f6: f1 e0 ldi r31, 0x01 ; 1 + 6f8: 16 aa std Z+54, r1 ; 0x36 + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + 6fa: 44 e2 ldi r20, 0x24 ; 36 + 6fc: 40 ab std Z+48, r20 ; 0x30 + DMA.CH2.CTRLB = 0x00; //Hi interrupt on block complete + 6fe: 11 aa std Z+49, r1 ; 0x31 + DMA.CH2.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + 700: 39 e5 ldi r19, 0x59 ; 89 + 702: 32 ab std Z+50, r19 ; 0x32 + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH2_gc; //Triggered from TCC0 when it hits PER + 704: 23 e0 ldi r18, 0x03 ; 3 + 706: 23 ab std Z+51, r18 ; 0x33 + DMA.CH2.TRFCNT = dacBuf_len; + 708: 80 91 04 20 lds r24, 0x2004 + 70c: 90 91 05 20 lds r25, 0x2005 + 710: 84 ab std Z+52, r24 ; 0x34 + 712: 95 ab std Z+53, r25 ; 0x35 + + DMA.CH2.SRCADDR0 = (( (uint16_t) &dacBuf_CH1[0]) >> 0) & 0xFF; //Source address is dacbuf + 714: 86 e5 ldi r24, 0x56 ; 86 + 716: 92 e2 ldi r25, 0x22 ; 34 + 718: 80 af std Z+56, r24 ; 0x38 + DMA.CH2.SRCADDR1 = (( (uint16_t) &dacBuf_CH1[0]) >> 8) & 0xFF; + 71a: 91 af std Z+57, r25 ; 0x39 + DMA.CH2.SRCADDR2 = 0x00; + 71c: 12 ae std Z+58, r1 ; 0x3a + + DMA.CH2.DESTADDR0 = (( (uint16_t) &DACB.CH0DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + 71e: 89 e3 ldi r24, 0x39 ; 57 + 720: 84 af std Z+60, r24 ; 0x3c + DMA.CH2.DESTADDR1 = (( (uint16_t) &DACB.CH0DATAH) >> 8) & 0xFF; + 722: 20 93 3d 01 sts 0x013D, r18 + DMA.CH2.DESTADDR2 = 0x00; + 726: 10 92 3e 01 sts 0x013E, r1 + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + 72a: 80 a9 ldd r24, Z+48 ; 0x30 + 72c: 80 68 ori r24, 0x80 ; 128 + 72e: 80 ab std Z+48, r24 ; 0x30 + + + DMA.CH3.REPCNT = 0; //Repeat forever! + 730: 10 92 46 01 sts 0x0146, r1 + DMA.CH3.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + 734: e0 e4 ldi r30, 0x40 ; 64 + 736: f1 e0 ldi r31, 0x01 ; 1 + 738: 40 83 st Z, r20 + DMA.CH3.CTRLB = 0x00; //No interrupt for DacBuf!! + 73a: 10 92 41 01 sts 0x0141, r1 + DMA.CH3.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + 73e: 30 93 42 01 sts 0x0142, r19 + DMA.CH3.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH1_gc; //Triggered from TCC0 when it hits PER + 742: c0 93 43 01 sts 0x0143, r28 + DMA.CH3.TRFCNT = auxDacBufLen; + 746: 80 91 02 20 lds r24, 0x2002 + 74a: 90 91 03 20 lds r25, 0x2003 + 74e: 80 93 44 01 sts 0x0144, r24 + 752: 90 93 45 01 sts 0x0145, r25 + + DMA.CH3.SRCADDR0 = (( (uint16_t) &dacBuf_CH2[0]) >> 0) & 0xFF; //Source address is dacbuf + 756: 86 e6 ldi r24, 0x66 ; 102 + 758: 94 e2 ldi r25, 0x24 ; 36 + 75a: 80 93 48 01 sts 0x0148, r24 + DMA.CH3.SRCADDR1 = (( (uint16_t) &dacBuf_CH2[0]) >> 8) & 0xFF; + 75e: 90 93 49 01 sts 0x0149, r25 + DMA.CH3.SRCADDR2 = 0x00; + 762: 10 92 4a 01 sts 0x014A, r1 + + DMA.CH3.DESTADDR0 = (( (uint16_t) &DACB.CH1DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + 766: 8b e3 ldi r24, 0x3B ; 59 + 768: 80 93 4c 01 sts 0x014C, r24 + DMA.CH3.DESTADDR1 = (( (uint16_t) &DACB.CH1DATAH) >> 8) & 0xFF; + 76c: 20 93 4d 01 sts 0x014D, r18 + DMA.CH3.DESTADDR2 = 0x00; + 770: 10 92 4e 01 sts 0x014E, r1 + + //Must enable last for REPCNT won't work! + DMA.CH3.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + 774: 80 81 ld r24, Z + 776: 80 68 ori r24, 0x80 ; 128 + 778: 80 83 st Z, r24 + +} + 77a: cf 91 pop r28 + 77c: 08 95 ret + +0000077e : + +void tiny_dma_loop_mode_2(void){ + 77e: cf 93 push r28 + DMA.CH0.CTRLA = 0x00; + 780: e0 e0 ldi r30, 0x00 ; 0 + 782: f1 e0 ldi r31, 0x01 ; 1 + 784: 10 8a std Z+16, r1 ; 0x10 + DMA.CH0.CTRLA = DMA_CH_RESET_bm; + 786: b0 e4 ldi r27, 0x40 ; 64 + 788: b0 8b std Z+16, r27 ; 0x10 + + DMA.CH0.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + 78a: a4 e0 ldi r26, 0x04 ; 4 + 78c: a0 8b std Z+16, r26 ; 0x10 + DMA.CH0.CTRLB = 0x00; //No interrupt! + 78e: 11 8a std Z+17, r1 ; 0x11 + DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + 790: 71 e9 ldi r23, 0x91 ; 145 + 792: 72 8b std Z+18, r23 ; 0x12 + DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH0_gc; //Triggered from ADCA channel 0 + 794: 80 e1 ldi r24, 0x10 ; 16 + 796: 83 8b std Z+19, r24 ; 0x13 + DMA.CH0.TRFCNT = HALFPACKET_SIZE; + 798: 27 e7 ldi r18, 0x77 ; 119 + 79a: 31 e0 ldi r19, 0x01 ; 1 + 79c: 24 8b std Z+20, r18 ; 0x14 + 79e: 35 8b std Z+21, r19 ; 0x15 + + DMA.CH0.SRCADDR0 = (( (uint16_t) &ADCA.CH0.RESL) >> 0) & 0xFF; //Source address is ADC + 7a0: 84 e2 ldi r24, 0x24 ; 36 + 7a2: 80 8f std Z+24, r24 ; 0x18 + DMA.CH0.SRCADDR1 = (( (uint16_t) &ADCA.CH0.RESL) >> 8) & 0xFF; + 7a4: 62 e0 ldi r22, 0x02 ; 2 + 7a6: 61 8f std Z+25, r22 ; 0x19 + DMA.CH0.SRCADDR2 = 0x00; + 7a8: 12 8e std Z+26, r1 ; 0x1a + + DMA.CH0.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + 7aa: c0 91 b4 20 lds r28, 0x20B4 + 7ae: 8e ee ldi r24, 0xEE ; 238 + 7b0: 92 e0 ldi r25, 0x02 ; 2 + 7b2: c8 9f mul r28, r24 + 7b4: a0 01 movw r20, r0 + 7b6: c9 9f mul r28, r25 + 7b8: 50 0d add r21, r0 + 7ba: 11 24 eor r1, r1 + 7bc: 4a 59 subi r20, 0x9A ; 154 + 7be: 59 4d sbci r21, 0xD9 ; 217 + 7c0: 44 8f std Z+28, r20 ; 0x1c + DMA.CH0.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 8) & 0xFF; + 7c2: c0 91 b4 20 lds r28, 0x20B4 + 7c6: c8 9f mul r28, r24 + 7c8: a0 01 movw r20, r0 + 7ca: c9 9f mul r28, r25 + 7cc: 50 0d add r21, r0 + 7ce: 11 24 eor r1, r1 + 7d0: 4a 59 subi r20, 0x9A ; 154 + 7d2: 59 4d sbci r21, 0xD9 ; 217 + 7d4: 55 8f std Z+29, r21 ; 0x1d + DMA.CH0.DESTADDR2 = 0x00; + 7d6: 16 8e std Z+30, r1 ; 0x1e + + //Must enable last for REPCNT won't work! + DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + 7d8: 40 89 ldd r20, Z+16 ; 0x10 + 7da: 40 68 ori r20, 0x80 ; 128 + 7dc: 40 8b std Z+16, r20 ; 0x10 + + DMA.CH1.CTRLA = 0x00; + 7de: 10 a2 std Z+32, r1 ; 0x20 + DMA.CH1.CTRLA = DMA_CH_RESET_bm; + 7e0: b0 a3 std Z+32, r27 ; 0x20 + + DMA.CH1.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + 7e2: a0 a3 std Z+32, r26 ; 0x20 + DMA.CH1.CTRLB = 0x00; //No interrupt! + 7e4: 11 a2 std Z+33, r1 ; 0x21 + DMA.CH1.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + 7e6: 72 a3 std Z+34, r23 ; 0x22 + DMA.CH1.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH2_gc; //Triggered from ADCA channel 0 + 7e8: 42 e1 ldi r20, 0x12 ; 18 + 7ea: 43 a3 std Z+35, r20 ; 0x23 + DMA.CH1.TRFCNT = HALFPACKET_SIZE; + 7ec: 24 a3 std Z+36, r18 ; 0x24 + 7ee: 35 a3 std Z+37, r19 ; 0x25 + + DMA.CH1.SRCADDR0 = (( (uint16_t) &ADCA.CH2.RESL) >> 0) & 0xFF; //Source address is ADC + 7f0: 24 e3 ldi r18, 0x34 ; 52 + 7f2: 20 a7 std Z+40, r18 ; 0x28 + DMA.CH1.SRCADDR1 = (( (uint16_t) &ADCA.CH2.RESL) >> 8) & 0xFF; + 7f4: 61 a7 std Z+41, r22 ; 0x29 + DMA.CH1.SRCADDR2 = 0x00; + 7f6: 12 a6 std Z+42, r1 ; 0x2a + + DMA.CH1.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE + HALFPACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + 7f8: 40 91 b4 20 lds r20, 0x20B4 + 7fc: 48 9f mul r20, r24 + 7fe: 90 01 movw r18, r0 + 800: 49 9f mul r20, r25 + 802: 30 0d add r19, r0 + 804: 11 24 eor r1, r1 + 806: 23 52 subi r18, 0x23 ; 35 + 808: 38 4d sbci r19, 0xD8 ; 216 + 80a: 24 a7 std Z+44, r18 ; 0x2c + DMA.CH1.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE + HALFPACKET_SIZE]) >> 8) & 0xFF; + 80c: 40 91 b4 20 lds r20, 0x20B4 + 810: 48 9f mul r20, r24 + 812: 90 01 movw r18, r0 + 814: 49 9f mul r20, r25 + 816: 30 0d add r19, r0 + 818: 11 24 eor r1, r1 + 81a: c9 01 movw r24, r18 + 81c: 83 52 subi r24, 0x23 ; 35 + 81e: 98 4d sbci r25, 0xD8 ; 216 + 820: 95 a7 std Z+45, r25 ; 0x2d + DMA.CH1.DESTADDR2 = 0x00; + 822: 16 a6 std Z+46, r1 ; 0x2e + + //Must enable last for REPCNT won't work! + DMA.CH1.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + 824: 80 a1 ldd r24, Z+32 ; 0x20 + 826: 80 68 ori r24, 0x80 ; 128 + 828: 80 a3 std Z+32, r24 ; 0x20 +} + 82a: cf 91 pop r28 + 82c: 08 95 ret + +0000082e : + + + +void tiny_dma_set_mode_3(void){ + 82e: cf 93 push r28 + + global_mode = 3; + 830: c3 e0 ldi r28, 0x03 ; 3 + 832: c0 93 00 20 sts 0x2000, r28 + + tiny_dma_flush(); + 836: 29 de rcall .-942 ; 0x48a + + //AUX channel (to keep it tx, therefore always rx) + DMA.CH1.CTRLA = 0x00; + 838: e0 e0 ldi r30, 0x00 ; 0 + 83a: f1 e0 ldi r31, 0x01 ; 1 + 83c: 10 a2 std Z+32, r1 ; 0x20 + DMA.CH1.CTRLA = DMA_CH_RESET_bm; + 83e: 80 e4 ldi r24, 0x40 ; 64 + 840: 80 a3 std Z+32, r24 ; 0x20 + + DMA.CH1.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + 842: 84 e0 ldi r24, 0x04 ; 4 + 844: 80 a3 std Z+32, r24 ; 0x20 + DMA.CH1.CTRLB = 0x00; //No int + 846: 11 a2 std Z+33, r1 ; 0x21 + DMA.CH1.ADDRCTRL = DMA_CH_SRCDIR_FIXED_gc | DMA_CH_DESTDIR_FIXED_gc; //Source and address fixed. + 848: 12 a2 std Z+34, r1 ; 0x22 + DMA.CH1.TRIGSRC = DMA_CH_TRIGSRC_USARTC0_RXC_gc; + 84a: 8b e4 ldi r24, 0x4B ; 75 + 84c: 83 a3 std Z+35, r24 ; 0x23 + DMA.CH1.TRFCNT = 0; + 84e: 14 a2 std Z+36, r1 ; 0x24 + 850: 15 a2 std Z+37, r1 ; 0x25 + DMA.CH1.REPCNT = 0; + 852: 16 a2 std Z+38, r1 ; 0x26 + + DMA.CH1.SRCADDR0 = (( (uint16_t) &dummy) >> 0) & 0xFF; + 854: 81 e0 ldi r24, 0x01 ; 1 + 856: 90 e2 ldi r25, 0x20 ; 32 + 858: 80 a7 std Z+40, r24 ; 0x28 + DMA.CH1.SRCADDR1 = (( (uint16_t) &dummy) >> 8) & 0xFF; + 85a: 91 a7 std Z+41, r25 ; 0x29 + DMA.CH1.SRCADDR2 = 0x00; + 85c: 12 a6 std Z+42, r1 ; 0x2a + + DMA.CH1.DESTADDR0 = (( (uint16_t) &USARTC0.DATA) >> 0) & 0xFF; + 85e: 80 ea ldi r24, 0xA0 ; 160 + 860: 84 a7 std Z+44, r24 ; 0x2c + DMA.CH1.DESTADDR1 = (( (uint16_t) &USARTC0.DATA) >> 8) & 0xFF; + 862: 88 e0 ldi r24, 0x08 ; 8 + 864: 85 a7 std Z+45, r24 ; 0x2d + DMA.CH1.DESTADDR2 = 0x00; + 866: 16 a6 std Z+46, r1 ; 0x2e + + //Must enable last for REPCNT won't work! + DMA.CH1.CTRLA |= DMA_CH_REPEAT_bm | DMA_CH_ENABLE_bm; //Enable! + 868: 80 a1 ldd r24, Z+32 ; 0x20 + 86a: 80 6a ori r24, 0xA0 ; 160 + 86c: 80 a3 std Z+32, r24 ; 0x20 + + USARTC0.DATA = 0x55; + 86e: 85 e5 ldi r24, 0x55 ; 85 + 870: 80 93 a0 08 sts 0x08A0, r24 + + DMA.CH2.REPCNT = 0; //Repeat forever! + 874: 16 aa std Z+54, r1 ; 0x36 + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + 876: 34 e2 ldi r19, 0x24 ; 36 + 878: 30 ab std Z+48, r19 ; 0x30 + DMA.CH2.CTRLB = 0x00; //No interrupt for DacBuf!! + 87a: 11 aa std Z+49, r1 ; 0x31 + DMA.CH2.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + 87c: 29 e5 ldi r18, 0x59 ; 89 + 87e: 22 ab std Z+50, r18 ; 0x32 + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH1_gc; //Triggered from TCC0 when it hits PER + 880: 82 e0 ldi r24, 0x02 ; 2 + 882: 83 ab std Z+51, r24 ; 0x33 + DMA.CH2.TRFCNT = auxDacBufLen; + 884: 80 91 02 20 lds r24, 0x2002 + 888: 90 91 03 20 lds r25, 0x2003 + 88c: 84 ab std Z+52, r24 ; 0x34 + 88e: 95 ab std Z+53, r25 ; 0x35 + + DMA.CH2.SRCADDR0 = (( (uint16_t) &dacBuf_CH2[0]) >> 0) & 0xFF; //Source address is dacbuf + 890: 86 e6 ldi r24, 0x66 ; 102 + 892: 94 e2 ldi r25, 0x24 ; 36 + 894: 80 af std Z+56, r24 ; 0x38 + DMA.CH2.SRCADDR1 = (( (uint16_t) &dacBuf_CH2[0]) >> 8) & 0xFF; + 896: 91 af std Z+57, r25 ; 0x39 + DMA.CH2.SRCADDR2 = 0x00; + 898: 12 ae std Z+58, r1 ; 0x3a + + DMA.CH2.DESTADDR0 = (( (uint16_t) &DACB.CH1DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + 89a: 8b e3 ldi r24, 0x3B ; 59 + 89c: 84 af std Z+60, r24 ; 0x3c + DMA.CH2.DESTADDR1 = (( (uint16_t) &DACB.CH1DATAH) >> 8) & 0xFF; + 89e: c0 93 3d 01 sts 0x013D, r28 + DMA.CH2.DESTADDR2 = 0x00; + 8a2: 10 92 3e 01 sts 0x013E, r1 + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + 8a6: 80 a9 ldd r24, Z+48 ; 0x30 + 8a8: 80 68 ori r24, 0x80 ; 128 + 8aa: 80 ab std Z+48, r24 ; 0x30 + + DMA.CH3.REPCNT = 0; //Repeat forever! + 8ac: 10 92 46 01 sts 0x0146, r1 + DMA.CH3.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + 8b0: e0 e4 ldi r30, 0x40 ; 64 + 8b2: f1 e0 ldi r31, 0x01 ; 1 + 8b4: 30 83 st Z, r19 + DMA.CH3.CTRLB = 0x00; //Hi interrupt on block complete + 8b6: 10 92 41 01 sts 0x0141, r1 + DMA.CH3.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + 8ba: 20 93 42 01 sts 0x0142, r18 + DMA.CH3.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH2_gc; //Triggered from TCC0 when it hits PER + 8be: c0 93 43 01 sts 0x0143, r28 + DMA.CH3.TRFCNT = dacBuf_len; + 8c2: 80 91 04 20 lds r24, 0x2004 + 8c6: 90 91 05 20 lds r25, 0x2005 + 8ca: 80 93 44 01 sts 0x0144, r24 + 8ce: 90 93 45 01 sts 0x0145, r25 + + DMA.CH3.SRCADDR0 = (( (uint16_t) &dacBuf_CH1[0]) >> 0) & 0xFF; //Source address is dacbuf + 8d2: 86 e5 ldi r24, 0x56 ; 86 + 8d4: 92 e2 ldi r25, 0x22 ; 34 + 8d6: 80 93 48 01 sts 0x0148, r24 + DMA.CH3.SRCADDR1 = (( (uint16_t) &dacBuf_CH1[0]) >> 8) & 0xFF; + 8da: 90 93 49 01 sts 0x0149, r25 + DMA.CH3.SRCADDR2 = 0x00; + 8de: 10 92 4a 01 sts 0x014A, r1 + + DMA.CH3.DESTADDR0 = (( (uint16_t) &DACB.CH0DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + 8e2: 89 e3 ldi r24, 0x39 ; 57 + 8e4: 80 93 4c 01 sts 0x014C, r24 + DMA.CH3.DESTADDR1 = (( (uint16_t) &DACB.CH0DATAH) >> 8) & 0xFF; + 8e8: c0 93 4d 01 sts 0x014D, r28 + DMA.CH3.DESTADDR2 = 0x00; + 8ec: 10 92 4e 01 sts 0x014E, r1 + + //Must enable last for REPCNT won't work! + DMA.CH3.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + 8f0: 80 81 ld r24, Z + 8f2: 80 68 ori r24, 0x80 ; 128 + 8f4: 80 83 st Z, r24 + +} + 8f6: cf 91 pop r28 + 8f8: 08 95 ret + +000008fa : + +void tiny_dma_loop_mode_3(void){ + //Actual data being transferred + DMA.CH0.CTRLA = 0x00; + 8fa: e0 e0 ldi r30, 0x00 ; 0 + 8fc: f1 e0 ldi r31, 0x01 ; 1 + 8fe: 10 8a std Z+16, r1 ; 0x10 + DMA.CH0.CTRLA = DMA_CH_RESET_bm; + 900: 80 e4 ldi r24, 0x40 ; 64 + 902: 80 8b std Z+16, r24 ; 0x10 + + DMA.CH0.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + 904: 84 e0 ldi r24, 0x04 ; 4 + 906: 80 8b std Z+16, r24 ; 0x10 + DMA.CH0.CTRLB = 0x00; //No interrupt + 908: 11 8a std Z+17, r1 ; 0x11 + DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + 90a: 81 e9 ldi r24, 0x91 ; 145 + 90c: 82 8b std Z+18, r24 ; 0x12 + DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_USARTC0_RXC_gc; + 90e: 8b e4 ldi r24, 0x4B ; 75 + 910: 83 8b std Z+19, r24 ; 0x13 + DMA.CH0.TRFCNT = HALFPACKET_SIZE; + 912: 87 e7 ldi r24, 0x77 ; 119 + 914: 91 e0 ldi r25, 0x01 ; 1 + 916: 84 8b std Z+20, r24 ; 0x14 + 918: 95 8b std Z+21, r25 ; 0x15 + + DMA.CH0.SRCADDR0 = (( (uint16_t) &USARTC0.DATA) >> 0) & 0xFF; //Source address is ADC + 91a: 80 ea ldi r24, 0xA0 ; 160 + 91c: 80 8f std Z+24, r24 ; 0x18 + DMA.CH0.SRCADDR1 = (( (uint16_t) &USARTC0.DATA) >> 8) & 0xFF; + 91e: 88 e0 ldi r24, 0x08 ; 8 + 920: 81 8f std Z+25, r24 ; 0x19 + DMA.CH0.SRCADDR2 = 0x00; + 922: 12 8e std Z+26, r1 ; 0x1a + + DMA.CH0.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state*PACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + 924: 40 91 b4 20 lds r20, 0x20B4 + 928: 8e ee ldi r24, 0xEE ; 238 + 92a: 92 e0 ldi r25, 0x02 ; 2 + 92c: 48 9f mul r20, r24 + 92e: 90 01 movw r18, r0 + 930: 49 9f mul r20, r25 + 932: 30 0d add r19, r0 + 934: 11 24 eor r1, r1 + 936: 2a 59 subi r18, 0x9A ; 154 + 938: 39 4d sbci r19, 0xD9 ; 217 + 93a: 24 8f std Z+28, r18 ; 0x1c + DMA.CH0.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state*PACKET_SIZE]) >> 8) & 0xFF; + 93c: 40 91 b4 20 lds r20, 0x20B4 + 940: 48 9f mul r20, r24 + 942: 90 01 movw r18, r0 + 944: 49 9f mul r20, r25 + 946: 30 0d add r19, r0 + 948: 11 24 eor r1, r1 + 94a: c9 01 movw r24, r18 + 94c: 8a 59 subi r24, 0x9A ; 154 + 94e: 99 4d sbci r25, 0xD9 ; 217 + 950: 95 8f std Z+29, r25 ; 0x1d + DMA.CH0.DESTADDR2 = 0x00; + 952: 16 8e std Z+30, r1 ; 0x1e + + //Must enable last for REPCNT won't work! + DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + 954: 80 89 ldd r24, Z+16 ; 0x10 + 956: 80 68 ori r24, 0x80 ; 128 + 958: 80 8b std Z+16, r24 ; 0x10 + 95a: 08 95 ret + +0000095c : +} + +void tiny_dma_set_mode_4(void){ + 95c: cf 93 push r28 + + global_mode = 4; + 95e: c4 e0 ldi r28, 0x04 ; 4 + 960: c0 93 00 20 sts 0x2000, r28 + + tiny_dma_flush(); + 964: 92 dd rcall .-1244 ; 0x48a + + //AUX channel (to keep it tx, therefore always rx) + DMA.CH1.CTRLA = 0x00; + 966: e0 e0 ldi r30, 0x00 ; 0 + 968: f1 e0 ldi r31, 0x01 ; 1 + 96a: 10 a2 std Z+32, r1 ; 0x20 + DMA.CH1.CTRLA = DMA_CH_RESET_bm; + 96c: 80 e4 ldi r24, 0x40 ; 64 + 96e: 80 a3 std Z+32, r24 ; 0x20 + + DMA.CH1.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + 970: c0 a3 std Z+32, r28 ; 0x20 + DMA.CH1.CTRLB = 0x00; //No int + 972: 11 a2 std Z+33, r1 ; 0x21 + DMA.CH1.ADDRCTRL = DMA_CH_SRCDIR_FIXED_gc | DMA_CH_DESTDIR_FIXED_gc; //Source and address fixed. + 974: 12 a2 std Z+34, r1 ; 0x22 + DMA.CH1.TRIGSRC = DMA_CH_TRIGSRC_USARTC0_RXC_gc; + 976: 8b e4 ldi r24, 0x4B ; 75 + 978: 83 a3 std Z+35, r24 ; 0x23 + DMA.CH1.TRFCNT = 0; + 97a: 14 a2 std Z+36, r1 ; 0x24 + 97c: 15 a2 std Z+37, r1 ; 0x25 + DMA.CH1.REPCNT = 0; + 97e: 16 a2 std Z+38, r1 ; 0x26 + + DMA.CH1.SRCADDR0 = (( (uint16_t) &dummy) >> 0) & 0xFF; + 980: 81 e0 ldi r24, 0x01 ; 1 + 982: 90 e2 ldi r25, 0x20 ; 32 + 984: 80 a7 std Z+40, r24 ; 0x28 + DMA.CH1.SRCADDR1 = (( (uint16_t) &dummy) >> 8) & 0xFF; + 986: 91 a7 std Z+41, r25 ; 0x29 + DMA.CH1.SRCADDR2 = 0x00; + 988: 12 a6 std Z+42, r1 ; 0x2a + + DMA.CH1.DESTADDR0 = (( (uint16_t) &USARTC0.DATA) >> 0) & 0xFF; + 98a: 80 ea ldi r24, 0xA0 ; 160 + 98c: 84 a7 std Z+44, r24 ; 0x2c + DMA.CH1.DESTADDR1 = (( (uint16_t) &USARTC0.DATA) >> 8) & 0xFF; + 98e: 88 e0 ldi r24, 0x08 ; 8 + 990: 85 a7 std Z+45, r24 ; 0x2d + DMA.CH1.DESTADDR2 = 0x00; + 992: 16 a6 std Z+46, r1 ; 0x2e + + //Must enable last for REPCNT won't work! + DMA.CH1.CTRLA |= DMA_CH_REPEAT_bm | DMA_CH_ENABLE_bm; //Enable! + 994: 80 a1 ldd r24, Z+32 ; 0x20 + 996: 80 6a ori r24, 0xA0 ; 160 + 998: 80 a3 std Z+32, r24 ; 0x20 + + USARTC0.DATA = 0x55; + 99a: 85 e5 ldi r24, 0x55 ; 85 + 99c: 80 93 a0 08 sts 0x08A0, r24 + + DMA.CH2.REPCNT = 0; //Repeat forever! + 9a0: 16 aa std Z+54, r1 ; 0x36 + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + 9a2: 44 e2 ldi r20, 0x24 ; 36 + 9a4: 40 ab std Z+48, r20 ; 0x30 + DMA.CH2.CTRLB = 0x00; //Hi interrupt on block complete + 9a6: 11 aa std Z+49, r1 ; 0x31 + DMA.CH2.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + 9a8: 39 e5 ldi r19, 0x59 ; 89 + 9aa: 32 ab std Z+50, r19 ; 0x32 + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH2_gc; //Triggered from TCC0 when it hits PER + 9ac: 23 e0 ldi r18, 0x03 ; 3 + 9ae: 23 ab std Z+51, r18 ; 0x33 + DMA.CH2.TRFCNT = dacBuf_len; + 9b0: 80 91 04 20 lds r24, 0x2004 + 9b4: 90 91 05 20 lds r25, 0x2005 + 9b8: 84 ab std Z+52, r24 ; 0x34 + 9ba: 95 ab std Z+53, r25 ; 0x35 + + DMA.CH2.SRCADDR0 = (( (uint16_t) &dacBuf_CH1[0]) >> 0) & 0xFF; //Source address is dacbuf + 9bc: 86 e5 ldi r24, 0x56 ; 86 + 9be: 92 e2 ldi r25, 0x22 ; 34 + 9c0: 80 af std Z+56, r24 ; 0x38 + DMA.CH2.SRCADDR1 = (( (uint16_t) &dacBuf_CH1[0]) >> 8) & 0xFF; + 9c2: 91 af std Z+57, r25 ; 0x39 + DMA.CH2.SRCADDR2 = 0x00; + 9c4: 12 ae std Z+58, r1 ; 0x3a + + DMA.CH2.DESTADDR0 = (( (uint16_t) &DACB.CH0DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + 9c6: 89 e3 ldi r24, 0x39 ; 57 + 9c8: 84 af std Z+60, r24 ; 0x3c + DMA.CH2.DESTADDR1 = (( (uint16_t) &DACB.CH0DATAH) >> 8) & 0xFF; + 9ca: 20 93 3d 01 sts 0x013D, r18 + DMA.CH2.DESTADDR2 = 0x00; + 9ce: 10 92 3e 01 sts 0x013E, r1 + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + 9d2: 80 a9 ldd r24, Z+48 ; 0x30 + 9d4: 80 68 ori r24, 0x80 ; 128 + 9d6: 80 ab std Z+48, r24 ; 0x30 + + + DMA.CH3.REPCNT = 0; //Repeat forever! + 9d8: 10 92 46 01 sts 0x0146, r1 + DMA.CH3.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + 9dc: e0 e4 ldi r30, 0x40 ; 64 + 9de: f1 e0 ldi r31, 0x01 ; 1 + 9e0: 40 83 st Z, r20 + DMA.CH3.CTRLB = 0x00; //No interrupt for DacBuf!! + 9e2: 10 92 41 01 sts 0x0141, r1 + DMA.CH3.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + 9e6: 30 93 42 01 sts 0x0142, r19 + DMA.CH3.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH1_gc; //Triggered from TCC0 when it hits PER + 9ea: 82 e0 ldi r24, 0x02 ; 2 + 9ec: 80 93 43 01 sts 0x0143, r24 + DMA.CH3.TRFCNT = auxDacBufLen; + 9f0: 80 91 02 20 lds r24, 0x2002 + 9f4: 90 91 03 20 lds r25, 0x2003 + 9f8: 80 93 44 01 sts 0x0144, r24 + 9fc: 90 93 45 01 sts 0x0145, r25 + + DMA.CH3.SRCADDR0 = (( (uint16_t) &dacBuf_CH2[0]) >> 0) & 0xFF; //Source address is dacbuf + a00: 86 e6 ldi r24, 0x66 ; 102 + a02: 94 e2 ldi r25, 0x24 ; 36 + a04: 80 93 48 01 sts 0x0148, r24 + DMA.CH3.SRCADDR1 = (( (uint16_t) &dacBuf_CH2[0]) >> 8) & 0xFF; + a08: 90 93 49 01 sts 0x0149, r25 + DMA.CH3.SRCADDR2 = 0x00; + a0c: 10 92 4a 01 sts 0x014A, r1 + + DMA.CH3.DESTADDR0 = (( (uint16_t) &DACB.CH1DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + a10: 8b e3 ldi r24, 0x3B ; 59 + a12: 80 93 4c 01 sts 0x014C, r24 + DMA.CH3.DESTADDR1 = (( (uint16_t) &DACB.CH1DATAH) >> 8) & 0xFF; + a16: 20 93 4d 01 sts 0x014D, r18 + DMA.CH3.DESTADDR2 = 0x00; + a1a: 10 92 4e 01 sts 0x014E, r1 + + //Must enable last for REPCNT won't work! + DMA.CH3.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + a1e: 80 81 ld r24, Z + a20: 80 68 ori r24, 0x80 ; 128 + a22: 80 83 st Z, r24 +} + a24: cf 91 pop r28 + a26: 08 95 ret + +00000a28 : + +void tiny_dma_loop_mode_4(void){ + a28: cf 93 push r28 + //Actual data being transferred + DMA.CH0.CTRLA = 0x00; + a2a: e0 e0 ldi r30, 0x00 ; 0 + a2c: f1 e0 ldi r31, 0x01 ; 1 + a2e: 10 8a std Z+16, r1 ; 0x10 + DMA.CH0.CTRLA = DMA_CH_RESET_bm; + a30: b0 e4 ldi r27, 0x40 ; 64 + a32: b0 8b std Z+16, r27 ; 0x10 + + DMA.CH0.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + a34: a4 e0 ldi r26, 0x04 ; 4 + a36: a0 8b std Z+16, r26 ; 0x10 + DMA.CH0.CTRLB = 0x00; //No interrupt + a38: 11 8a std Z+17, r1 ; 0x11 + DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + a3a: 71 e9 ldi r23, 0x91 ; 145 + a3c: 72 8b std Z+18, r23 ; 0x12 + DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_USARTC0_RXC_gc; + a3e: 8b e4 ldi r24, 0x4B ; 75 + a40: 83 8b std Z+19, r24 ; 0x13 + DMA.CH0.TRFCNT = HALFPACKET_SIZE; + a42: 27 e7 ldi r18, 0x77 ; 119 + a44: 31 e0 ldi r19, 0x01 ; 1 + a46: 24 8b std Z+20, r18 ; 0x14 + a48: 35 8b std Z+21, r19 ; 0x15 + + DMA.CH0.SRCADDR0 = (( (uint16_t) &USARTC0.DATA) >> 0) & 0xFF; //Source address is ADC + a4a: 80 ea ldi r24, 0xA0 ; 160 + a4c: 80 8f std Z+24, r24 ; 0x18 + DMA.CH0.SRCADDR1 = (( (uint16_t) &USARTC0.DATA) >> 8) & 0xFF; + a4e: 68 e0 ldi r22, 0x08 ; 8 + a50: 61 8f std Z+25, r22 ; 0x19 + DMA.CH0.SRCADDR2 = 0x00; + a52: 12 8e std Z+26, r1 ; 0x1a + + DMA.CH0.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state*PACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + a54: c0 91 b4 20 lds r28, 0x20B4 + a58: 8e ee ldi r24, 0xEE ; 238 + a5a: 92 e0 ldi r25, 0x02 ; 2 + a5c: c8 9f mul r28, r24 + a5e: a0 01 movw r20, r0 + a60: c9 9f mul r28, r25 + a62: 50 0d add r21, r0 + a64: 11 24 eor r1, r1 + a66: 4a 59 subi r20, 0x9A ; 154 + a68: 59 4d sbci r21, 0xD9 ; 217 + a6a: 44 8f std Z+28, r20 ; 0x1c + DMA.CH0.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state*PACKET_SIZE]) >> 8) & 0xFF; + a6c: c0 91 b4 20 lds r28, 0x20B4 + a70: c8 9f mul r28, r24 + a72: a0 01 movw r20, r0 + a74: c9 9f mul r28, r25 + a76: 50 0d add r21, r0 + a78: 11 24 eor r1, r1 + a7a: 4a 59 subi r20, 0x9A ; 154 + a7c: 59 4d sbci r21, 0xD9 ; 217 + a7e: 55 8f std Z+29, r21 ; 0x1d + DMA.CH0.DESTADDR2 = 0x00; + a80: 16 8e std Z+30, r1 ; 0x1e + + //Must enable last for REPCNT won't work! + DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + a82: 40 89 ldd r20, Z+16 ; 0x10 + a84: 40 68 ori r20, 0x80 ; 128 + a86: 40 8b std Z+16, r20 ; 0x10 + + DMA.CH2.CTRLA = 0x00; + a88: 10 aa std Z+48, r1 ; 0x30 + DMA.CH2.CTRLA = DMA_CH_RESET_bm; + a8a: b0 ab std Z+48, r27 ; 0x30 + + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + a8c: a0 ab std Z+48, r26 ; 0x30 + DMA.CH2.CTRLB = 0x00; //Hi interrupt on block complete + a8e: 11 aa std Z+49, r1 ; 0x31 + DMA.CH2.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + a90: 72 ab std Z+50, r23 ; 0x32 + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_SPIC_gc; + a92: 4a e4 ldi r20, 0x4A ; 74 + a94: 43 ab std Z+51, r20 ; 0x33 + DMA.CH2.TRFCNT = HALFPACKET_SIZE; + a96: 24 ab std Z+52, r18 ; 0x34 + a98: 35 ab std Z+53, r19 ; 0x35 + + DMA.CH2.SRCADDR0 = (( (uint16_t) &SPIC.DATA) >> 0) & 0xFF; //Source address is ADC + a9a: 23 ec ldi r18, 0xC3 ; 195 + a9c: 20 af std Z+56, r18 ; 0x38 + DMA.CH2.SRCADDR1 = (( (uint16_t) &SPIC.DATA) >> 8) & 0xFF; + a9e: 61 af std Z+57, r22 ; 0x39 + DMA.CH2.SRCADDR2 = 0x00; + aa0: 12 ae std Z+58, r1 ; 0x3a + + DMA.CH2.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE + HALFPACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + aa2: 40 91 b4 20 lds r20, 0x20B4 + aa6: 48 9f mul r20, r24 + aa8: 90 01 movw r18, r0 + aaa: 49 9f mul r20, r25 + aac: 30 0d add r19, r0 + aae: 11 24 eor r1, r1 + ab0: 23 52 subi r18, 0x23 ; 35 + ab2: 38 4d sbci r19, 0xD8 ; 216 + ab4: 24 af std Z+60, r18 ; 0x3c + DMA.CH2.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE + HALFPACKET_SIZE]) >> 8) & 0xFF; + ab6: 40 91 b4 20 lds r20, 0x20B4 + aba: 48 9f mul r20, r24 + abc: 90 01 movw r18, r0 + abe: 49 9f mul r20, r25 + ac0: 30 0d add r19, r0 + ac2: 11 24 eor r1, r1 + ac4: c9 01 movw r24, r18 + ac6: 83 52 subi r24, 0x23 ; 35 + ac8: 98 4d sbci r25, 0xD8 ; 216 + aca: 90 93 3d 01 sts 0x013D, r25 + DMA.CH2.DESTADDR2 = 0x00; + ace: 10 92 3e 01 sts 0x013E, r1 + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + ad2: 80 a9 ldd r24, Z+48 ; 0x30 + ad4: 80 68 ori r24, 0x80 ; 128 + ad6: 80 ab std Z+48, r24 ; 0x30 +} + ad8: cf 91 pop r28 + ada: 08 95 ret + +00000adc : + + +void tiny_dma_set_mode_5(void){ + global_mode = 5; + adc: 85 e0 ldi r24, 0x05 ; 5 + ade: 80 93 00 20 sts 0x2000, r24 + + tiny_dma_flush(); + ae2: d3 dc rcall .-1626 ; 0x48a + + DMA.CH2.REPCNT = 0; //Repeat forever! + ae4: e0 e0 ldi r30, 0x00 ; 0 + ae6: f1 e0 ldi r31, 0x01 ; 1 + ae8: 16 aa std Z+54, r1 ; 0x36 + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + aea: 54 e2 ldi r21, 0x24 ; 36 + aec: 50 ab std Z+48, r21 ; 0x30 + DMA.CH2.CTRLB = 0x00; //Hi interrupt on block complete + aee: 11 aa std Z+49, r1 ; 0x31 + DMA.CH2.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + af0: 49 e5 ldi r20, 0x59 ; 89 + af2: 42 ab std Z+50, r20 ; 0x32 + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH2_gc; //Triggered from TCC0 when it hits PER + af4: 23 e0 ldi r18, 0x03 ; 3 + af6: 23 ab std Z+51, r18 ; 0x33 + DMA.CH2.TRFCNT = dacBuf_len; + af8: 80 91 04 20 lds r24, 0x2004 + afc: 90 91 05 20 lds r25, 0x2005 + b00: 84 ab std Z+52, r24 ; 0x34 + b02: 95 ab std Z+53, r25 ; 0x35 + + DMA.CH2.SRCADDR0 = (( (uint16_t) &dacBuf_CH1[0]) >> 0) & 0xFF; //Source address is dacbuf + b04: 86 e5 ldi r24, 0x56 ; 86 + b06: 92 e2 ldi r25, 0x22 ; 34 + b08: 80 af std Z+56, r24 ; 0x38 + DMA.CH2.SRCADDR1 = (( (uint16_t) &dacBuf_CH1[0]) >> 8) & 0xFF; + b0a: 91 af std Z+57, r25 ; 0x39 + DMA.CH2.SRCADDR2 = 0x00; + b0c: 12 ae std Z+58, r1 ; 0x3a + + DMA.CH2.DESTADDR0 = (( (uint16_t) &DACB.CH0DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + b0e: 39 e3 ldi r19, 0x39 ; 57 + b10: 34 af std Z+60, r19 ; 0x3c + DMA.CH2.DESTADDR1 = (( (uint16_t) &DACB.CH0DATAH) >> 8) & 0xFF; + b12: 20 93 3d 01 sts 0x013D, r18 + DMA.CH2.DESTADDR2 = 0x00; + b16: 10 92 3e 01 sts 0x013E, r1 + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + b1a: 80 a9 ldd r24, Z+48 ; 0x30 + b1c: 80 68 ori r24, 0x80 ; 128 + b1e: 80 ab std Z+48, r24 ; 0x30 + + DMA.CH3.REPCNT = 0; //Repeat forever! + b20: 10 92 46 01 sts 0x0146, r1 + DMA.CH3.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + b24: e0 e4 ldi r30, 0x40 ; 64 + b26: f1 e0 ldi r31, 0x01 ; 1 + b28: 50 83 st Z, r21 + DMA.CH3.CTRLB = 0x00; //No interrupt for DacBuf!! + b2a: 10 92 41 01 sts 0x0141, r1 + DMA.CH3.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + b2e: 40 93 42 01 sts 0x0142, r20 + DMA.CH3.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH2_gc; //Triggered from TCC0 when it hits PER + b32: 20 93 43 01 sts 0x0143, r18 + DMA.CH3.TRFCNT = dacBuf_len; + b36: 80 91 04 20 lds r24, 0x2004 + b3a: 90 91 05 20 lds r25, 0x2005 + b3e: 80 93 44 01 sts 0x0144, r24 + b42: 90 93 45 01 sts 0x0145, r25 + + DMA.CH3.SRCADDR0 = (( (uint16_t) &isoBuf[0]) >> 0) & 0xFF; //Source address is dacbuf + b46: 86 e6 ldi r24, 0x66 ; 102 + b48: 96 e2 ldi r25, 0x26 ; 38 + b4a: 80 93 48 01 sts 0x0148, r24 + DMA.CH3.SRCADDR1 = (( (uint16_t) &isoBuf[0]) >> 8) & 0xFF; + b4e: 90 93 49 01 sts 0x0149, r25 + DMA.CH3.SRCADDR2 = 0x00; + b52: 10 92 4a 01 sts 0x014A, r1 + + DMA.CH3.DESTADDR0 = (( (uint16_t) &DACB.CH0DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + b56: 30 93 4c 01 sts 0x014C, r19 + DMA.CH3.DESTADDR1 = (( (uint16_t) &DACB.CH0DATAH) >> 8) & 0xFF; + b5a: 20 93 4d 01 sts 0x014D, r18 + DMA.CH3.DESTADDR2 = 0x00; + b5e: 10 92 4e 01 sts 0x014E, r1 + + //Must enable last for REPCNT won't work! + DMA.CH3.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + b62: 80 81 ld r24, Z + b64: 80 68 ori r24, 0x80 ; 128 + b66: 80 83 st Z, r24 + b68: 08 95 ret + +00000b6a : +} + +void tiny_dma_set_mode_6(void){ + + global_mode = 6; + b6a: 86 e0 ldi r24, 0x06 ; 6 + b6c: 80 93 00 20 sts 0x2000, r24 + + tiny_dma_flush(); + b70: 8c dc rcall .-1768 ; 0x48a + + DMA.CH2.REPCNT = 0; //Repeat forever! + b72: e0 e0 ldi r30, 0x00 ; 0 + b74: f1 e0 ldi r31, 0x01 ; 1 + b76: 16 aa std Z+54, r1 ; 0x36 + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + b78: 44 e2 ldi r20, 0x24 ; 36 + b7a: 40 ab std Z+48, r20 ; 0x30 + DMA.CH2.CTRLB = 0x00; //Hi interrupt on block complete + b7c: 11 aa std Z+49, r1 ; 0x31 + DMA.CH2.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + b7e: 39 e5 ldi r19, 0x59 ; 89 + b80: 32 ab std Z+50, r19 ; 0x32 + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH2_gc; //Triggered from TCC0 when it hits PER + b82: 23 e0 ldi r18, 0x03 ; 3 + b84: 23 ab std Z+51, r18 ; 0x33 + DMA.CH2.TRFCNT = dacBuf_len; + b86: 80 91 04 20 lds r24, 0x2004 + b8a: 90 91 05 20 lds r25, 0x2005 + b8e: 84 ab std Z+52, r24 ; 0x34 + b90: 95 ab std Z+53, r25 ; 0x35 + + DMA.CH2.SRCADDR0 = (( (uint16_t) &dacBuf_CH1[0]) >> 0) & 0xFF; //Source address is dacbuf + b92: 86 e5 ldi r24, 0x56 ; 86 + b94: 92 e2 ldi r25, 0x22 ; 34 + b96: 80 af std Z+56, r24 ; 0x38 + DMA.CH2.SRCADDR1 = (( (uint16_t) &dacBuf_CH1[0]) >> 8) & 0xFF; + b98: 91 af std Z+57, r25 ; 0x39 + DMA.CH2.SRCADDR2 = 0x00; + b9a: 12 ae std Z+58, r1 ; 0x3a + + DMA.CH2.DESTADDR0 = (( (uint16_t) &DACB.CH0DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + b9c: 89 e3 ldi r24, 0x39 ; 57 + b9e: 84 af std Z+60, r24 ; 0x3c + DMA.CH2.DESTADDR1 = (( (uint16_t) &DACB.CH0DATAH) >> 8) & 0xFF; + ba0: 20 93 3d 01 sts 0x013D, r18 + DMA.CH2.DESTADDR2 = 0x00; + ba4: 10 92 3e 01 sts 0x013E, r1 + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + ba8: 80 a9 ldd r24, Z+48 ; 0x30 + baa: 80 68 ori r24, 0x80 ; 128 + bac: 80 ab std Z+48, r24 ; 0x30 + + DMA.CH3.REPCNT = 0; //Repeat forever! + bae: 10 92 46 01 sts 0x0146, r1 + DMA.CH3.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + bb2: e0 e4 ldi r30, 0x40 ; 64 + bb4: f1 e0 ldi r31, 0x01 ; 1 + bb6: 40 83 st Z, r20 + DMA.CH3.CTRLB = 0x00; //No interrupt for DacBuf!! + bb8: 10 92 41 01 sts 0x0141, r1 + DMA.CH3.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + bbc: 30 93 42 01 sts 0x0142, r19 + DMA.CH3.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH1_gc; //Triggered from TCC0 when it hits PER + bc0: 82 e0 ldi r24, 0x02 ; 2 + bc2: 80 93 43 01 sts 0x0143, r24 + DMA.CH3.TRFCNT = auxDacBufLen; + bc6: 80 91 02 20 lds r24, 0x2002 + bca: 90 91 03 20 lds r25, 0x2003 + bce: 80 93 44 01 sts 0x0144, r24 + bd2: 90 93 45 01 sts 0x0145, r25 + + DMA.CH3.SRCADDR0 = (( (uint16_t) &dacBuf_CH2[0]) >> 0) & 0xFF; //Source address is dacbuf + bd6: 86 e6 ldi r24, 0x66 ; 102 + bd8: 94 e2 ldi r25, 0x24 ; 36 + bda: 80 93 48 01 sts 0x0148, r24 + DMA.CH3.SRCADDR1 = (( (uint16_t) &dacBuf_CH2[0]) >> 8) & 0xFF; + bde: 90 93 49 01 sts 0x0149, r25 + DMA.CH3.SRCADDR2 = 0x00; + be2: 10 92 4a 01 sts 0x014A, r1 + + DMA.CH3.DESTADDR0 = (( (uint16_t) &DACB.CH1DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + be6: 8b e3 ldi r24, 0x3B ; 59 + be8: 80 93 4c 01 sts 0x014C, r24 + DMA.CH3.DESTADDR1 = (( (uint16_t) &DACB.CH1DATAH) >> 8) & 0xFF; + bec: 20 93 4d 01 sts 0x014D, r18 + DMA.CH3.DESTADDR2 = 0x00; + bf0: 10 92 4e 01 sts 0x014E, r1 + + //Must enable last for REPCNT won't work! + DMA.CH3.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + bf4: 80 81 ld r24, Z + bf6: 80 68 ori r24, 0x80 ; 128 + bf8: 80 83 st Z, r24 + bfa: 08 95 ret + +00000bfc : + +} + +void tiny_dma_loop_mode_6(void){ + DMA.CH0.CTRLA = 0x00; + bfc: e0 e0 ldi r30, 0x00 ; 0 + bfe: f1 e0 ldi r31, 0x01 ; 1 + c00: 10 8a std Z+16, r1 ; 0x10 + DMA.CH0.CTRLA = DMA_CH_RESET_bm; + c02: 80 e4 ldi r24, 0x40 ; 64 + c04: 80 8b std Z+16, r24 ; 0x10 + + DMA.CH0.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + c06: 84 e0 ldi r24, 0x04 ; 4 + c08: 80 8b std Z+16, r24 ; 0x10 + DMA.CH0.CTRLB = 0x00; //No interrupt! + c0a: 11 8a std Z+17, r1 ; 0x11 + DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + c0c: 81 e9 ldi r24, 0x91 ; 145 + c0e: 82 8b std Z+18, r24 ; 0x12 + DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH0_gc; //Triggered from ADCA channel 0 + c10: 80 e1 ldi r24, 0x10 ; 16 + c12: 83 8b std Z+19, r24 ; 0x13 + DMA.CH0.TRFCNT = PACKET_SIZE; + c14: 8e ee ldi r24, 0xEE ; 238 + c16: 92 e0 ldi r25, 0x02 ; 2 + c18: 84 8b std Z+20, r24 ; 0x14 + c1a: 95 8b std Z+21, r25 ; 0x15 + + DMA.CH0.SRCADDR0 = (( (uint16_t) &ADCA.CH0.RESL) >> 0) & 0xFF; //Source address is ADC + c1c: 24 e2 ldi r18, 0x24 ; 36 + c1e: 20 8f std Z+24, r18 ; 0x18 + DMA.CH0.SRCADDR1 = (( (uint16_t) &ADCA.CH0.RESL) >> 8) & 0xFF; + c20: 22 e0 ldi r18, 0x02 ; 2 + c22: 21 8f std Z+25, r18 ; 0x19 + DMA.CH0.SRCADDR2 = 0x00; + c24: 12 8e std Z+26, r1 ; 0x1a + + DMA.CH0.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + c26: 40 91 b4 20 lds r20, 0x20B4 + c2a: 48 9f mul r20, r24 + c2c: 90 01 movw r18, r0 + c2e: 49 9f mul r20, r25 + c30: 30 0d add r19, r0 + c32: 11 24 eor r1, r1 + c34: 2a 59 subi r18, 0x9A ; 154 + c36: 39 4d sbci r19, 0xD9 ; 217 + c38: 24 8f std Z+28, r18 ; 0x1c + DMA.CH0.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 8) & 0xFF; + c3a: 40 91 b4 20 lds r20, 0x20B4 + c3e: 48 9f mul r20, r24 + c40: 90 01 movw r18, r0 + c42: 49 9f mul r20, r25 + c44: 30 0d add r19, r0 + c46: 11 24 eor r1, r1 + c48: c9 01 movw r24, r18 + c4a: 8a 59 subi r24, 0x9A ; 154 + c4c: 99 4d sbci r25, 0xD9 ; 217 + c4e: 95 8f std Z+29, r25 ; 0x1d + DMA.CH0.DESTADDR2 = 0x00; + c50: 16 8e std Z+30, r1 ; 0x1e + + //Must enable last for REPCNT won't work! + DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + c52: 80 89 ldd r24, Z+16 ; 0x10 + c54: 80 68 ori r24, 0x80 ; 128 + c56: 80 8b std Z+16, r24 ; 0x10 + c58: 08 95 ret + +00000c5a : +} + +void tiny_dma_set_mode_7(void){ + + global_mode = 7; + c5a: 87 e0 ldi r24, 0x07 ; 7 + c5c: 80 93 00 20 sts 0x2000, r24 + + tiny_dma_flush(); + c60: 14 dc rcall .-2008 ; 0x48a + + DMA.CH2.REPCNT = 0; //Repeat forever! + c62: e0 e0 ldi r30, 0x00 ; 0 + c64: f1 e0 ldi r31, 0x01 ; 1 + c66: 16 aa std Z+54, r1 ; 0x36 + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + c68: 44 e2 ldi r20, 0x24 ; 36 + c6a: 40 ab std Z+48, r20 ; 0x30 + DMA.CH2.CTRLB = 0x00; //Hi interrupt on block complete + c6c: 11 aa std Z+49, r1 ; 0x31 + DMA.CH2.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + c6e: 39 e5 ldi r19, 0x59 ; 89 + c70: 32 ab std Z+50, r19 ; 0x32 + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH2_gc; //Triggered from TCC0 when it hits PER + c72: 23 e0 ldi r18, 0x03 ; 3 + c74: 23 ab std Z+51, r18 ; 0x33 + DMA.CH2.TRFCNT = dacBuf_len; + c76: 80 91 04 20 lds r24, 0x2004 + c7a: 90 91 05 20 lds r25, 0x2005 + c7e: 84 ab std Z+52, r24 ; 0x34 + c80: 95 ab std Z+53, r25 ; 0x35 + + DMA.CH2.SRCADDR0 = (( (uint16_t) &dacBuf_CH1[0]) >> 0) & 0xFF; //Source address is dacbuf + c82: 86 e5 ldi r24, 0x56 ; 86 + c84: 92 e2 ldi r25, 0x22 ; 34 + c86: 80 af std Z+56, r24 ; 0x38 + DMA.CH2.SRCADDR1 = (( (uint16_t) &dacBuf_CH1[0]) >> 8) & 0xFF; + c88: 91 af std Z+57, r25 ; 0x39 + DMA.CH2.SRCADDR2 = 0x00; + c8a: 12 ae std Z+58, r1 ; 0x3a + + DMA.CH2.DESTADDR0 = (( (uint16_t) &DACB.CH0DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + c8c: 89 e3 ldi r24, 0x39 ; 57 + c8e: 84 af std Z+60, r24 ; 0x3c + DMA.CH2.DESTADDR1 = (( (uint16_t) &DACB.CH0DATAH) >> 8) & 0xFF; + c90: 20 93 3d 01 sts 0x013D, r18 + DMA.CH2.DESTADDR2 = 0x00; + c94: 10 92 3e 01 sts 0x013E, r1 + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + c98: 80 a9 ldd r24, Z+48 ; 0x30 + c9a: 80 68 ori r24, 0x80 ; 128 + c9c: 80 ab std Z+48, r24 ; 0x30 + + DMA.CH3.REPCNT = 0; //Repeat forever! + c9e: 10 92 46 01 sts 0x0146, r1 + DMA.CH3.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + ca2: e0 e4 ldi r30, 0x40 ; 64 + ca4: f1 e0 ldi r31, 0x01 ; 1 + ca6: 40 83 st Z, r20 + DMA.CH3.CTRLB = 0x00; //No interrupt for DacBuf!! + ca8: 10 92 41 01 sts 0x0141, r1 + DMA.CH3.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + cac: 30 93 42 01 sts 0x0142, r19 + DMA.CH3.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH1_gc; //Triggered from TCC0 when it hits PER + cb0: 82 e0 ldi r24, 0x02 ; 2 + cb2: 80 93 43 01 sts 0x0143, r24 + DMA.CH3.TRFCNT = auxDacBufLen; + cb6: 80 91 02 20 lds r24, 0x2002 + cba: 90 91 03 20 lds r25, 0x2003 + cbe: 80 93 44 01 sts 0x0144, r24 + cc2: 90 93 45 01 sts 0x0145, r25 + + DMA.CH3.SRCADDR0 = (( (uint16_t) &dacBuf_CH2[0]) >> 0) & 0xFF; //Source address is dacbuf + cc6: 86 e6 ldi r24, 0x66 ; 102 + cc8: 94 e2 ldi r25, 0x24 ; 36 + cca: 80 93 48 01 sts 0x0148, r24 + DMA.CH3.SRCADDR1 = (( (uint16_t) &dacBuf_CH2[0]) >> 8) & 0xFF; + cce: 90 93 49 01 sts 0x0149, r25 + DMA.CH3.SRCADDR2 = 0x00; + cd2: 10 92 4a 01 sts 0x014A, r1 + + DMA.CH3.DESTADDR0 = (( (uint16_t) &DACB.CH1DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + cd6: 8b e3 ldi r24, 0x3B ; 59 + cd8: 80 93 4c 01 sts 0x014C, r24 + DMA.CH3.DESTADDR1 = (( (uint16_t) &DACB.CH1DATAH) >> 8) & 0xFF; + cdc: 20 93 4d 01 sts 0x014D, r18 + DMA.CH3.DESTADDR2 = 0x00; + ce0: 10 92 4e 01 sts 0x014E, r1 + + //Must enable last for REPCNT won't work! + DMA.CH3.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + ce4: 80 81 ld r24, Z + ce6: 80 68 ori r24, 0x80 ; 128 + ce8: 80 83 st Z, r24 + cea: 08 95 ret + +00000cec : +} + +void tiny_dma_loop_mode_7(void){ + + DMA.CH0.CTRLA = 0x00; + cec: e0 e0 ldi r30, 0x00 ; 0 + cee: f1 e0 ldi r31, 0x01 ; 1 + cf0: 10 8a std Z+16, r1 ; 0x10 + DMA.CH0.CTRLA = DMA_CH_RESET_bm; + cf2: 80 e4 ldi r24, 0x40 ; 64 + cf4: 80 8b std Z+16, r24 ; 0x10 + + DMA.CH0.CTRLA = DMA_CH_BURSTLEN_2BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + cf6: 85 e0 ldi r24, 0x05 ; 5 + cf8: 80 8b std Z+16, r24 ; 0x10 + DMA.CH0.CTRLB = 0x00; //No interrupt! + cfa: 11 8a std Z+17, r1 ; 0x11 + DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + cfc: 81 e9 ldi r24, 0x91 ; 145 + cfe: 82 8b std Z+18, r24 ; 0x12 + DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH0_gc; //Triggered from ADCA channel 0 + d00: 80 e1 ldi r24, 0x10 ; 16 + d02: 83 8b std Z+19, r24 ; 0x13 + DMA.CH0.TRFCNT = PACKET_SIZE; + d04: 8e ee ldi r24, 0xEE ; 238 + d06: 92 e0 ldi r25, 0x02 ; 2 + d08: 84 8b std Z+20, r24 ; 0x14 + d0a: 95 8b std Z+21, r25 ; 0x15 + + DMA.CH0.SRCADDR0 = (( (uint16_t) &ADCA.CH0.RESL) >> 0) & 0xFF; //Source address is ADC + d0c: 24 e2 ldi r18, 0x24 ; 36 + d0e: 20 8f std Z+24, r18 ; 0x18 + DMA.CH0.SRCADDR1 = (( (uint16_t) &ADCA.CH0.RESL) >> 8) & 0xFF; + d10: 22 e0 ldi r18, 0x02 ; 2 + d12: 21 8f std Z+25, r18 ; 0x19 + DMA.CH0.SRCADDR2 = 0x00; + d14: 12 8e std Z+26, r1 ; 0x1a + + DMA.CH0.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + d16: 40 91 b4 20 lds r20, 0x20B4 + d1a: 48 9f mul r20, r24 + d1c: 90 01 movw r18, r0 + d1e: 49 9f mul r20, r25 + d20: 30 0d add r19, r0 + d22: 11 24 eor r1, r1 + d24: 2a 59 subi r18, 0x9A ; 154 + d26: 39 4d sbci r19, 0xD9 ; 217 + d28: 24 8f std Z+28, r18 ; 0x1c + DMA.CH0.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 8) & 0xFF; + d2a: 40 91 b4 20 lds r20, 0x20B4 + d2e: 48 9f mul r20, r24 + d30: 90 01 movw r18, r0 + d32: 49 9f mul r20, r25 + d34: 30 0d add r19, r0 + d36: 11 24 eor r1, r1 + d38: c9 01 movw r24, r18 + d3a: 8a 59 subi r24, 0x9A ; 154 + d3c: 99 4d sbci r25, 0xD9 ; 217 + d3e: 95 8f std Z+29, r25 ; 0x1d + DMA.CH0.DESTADDR2 = 0x00; + d40: 16 8e std Z+30, r1 ; 0x1e + + //Must enable last for REPCNT won't work! + DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + d42: 80 89 ldd r24, Z+16 ; 0x10 + d44: 80 68 ori r24, 0x80 ; 128 + d46: 80 8b std Z+16, r24 ; 0x10 + d48: 08 95 ret + +00000d4a : +#define PSU_PER 3000 +#define jump 6 + +void tiny_timer_setup(void){ + //Turn everything on! + PR.PRPC &= 0b11111100; //Enable TCC0, TCC1 + d4a: e0 e7 ldi r30, 0x70 ; 112 + d4c: f0 e0 ldi r31, 0x00 ; 0 + d4e: 83 81 ldd r24, Z+3 ; 0x03 + d50: 8c 7f andi r24, 0xFC ; 252 + d52: 83 83 std Z+3, r24 ; 0x03 + PR.PRPD &= 0b11111100; //Enable TCD0, TCD1 + d54: 84 81 ldd r24, Z+4 ; 0x04 + d56: 8c 7f andi r24, 0xFC ; 252 + d58: 84 83 std Z+4, r24 ; 0x04 + PR.PRGEN &= 0b11111101; //Enable EVSYS + d5a: 80 81 ld r24, Z + d5c: 8d 7f andi r24, 0xFD ; 253 + d5e: 80 83 st Z, r24 + + //Set up EVSYS + EVSYS.CH2MUX = TCDAC_OVF; + d60: e0 e8 ldi r30, 0x80 ; 128 + d62: f1 e0 ldi r31, 0x01 ; 1 + d64: 80 ec ldi r24, 0xC0 ; 192 + d66: 82 83 std Z+2, r24 ; 0x02 + EVSYS.CH2CTRL = 0x00; //No filtering or Quadrature stuff + d68: 12 86 std Z+10, r1 ; 0x0a + + EVSYS.CH1MUX = TCDAC_AUX_OVF; + d6a: 88 ec ldi r24, 0xC8 ; 200 + d6c: 81 83 std Z+1, r24 ; 0x01 + EVSYS.CH1CTRL = 0x00; //No filtering or Quadrature stuff + d6e: 11 86 std Z+9, r1 ; 0x09 + + //Waveform (50Hz sin wave) + TC_DAC.CTRLA = 0x04; //Some clk setting - not 100% sure since it was SW generated + d70: e0 e0 ldi r30, 0x00 ; 0 + d72: f8 e0 ldi r31, 0x08 ; 8 + d74: 34 e0 ldi r19, 0x04 ; 4 + d76: 30 83 st Z, r19 + TC_DAC.CTRLB = TC_WGMODE_SINGLESLOPE_gc; //No enable is set + d78: 23 e0 ldi r18, 0x03 ; 3 + d7a: 21 83 std Z+1, r18 ; 0x01 + TC_DAC.CTRLE = TC_BYTEM_NORMAL_gc; + d7c: 14 82 std Z+4, r1 ; 0x04 + TC_DAC.PER = 469; + d7e: 85 ed ldi r24, 0xD5 ; 213 + d80: 91 e0 ldi r25, 0x01 ; 1 + d82: 86 a3 std Z+38, r24 ; 0x26 + d84: 97 a3 std Z+39, r25 ; 0x27 + TC_DAC.INTCTRLA = 0x00; + d86: 16 82 std Z+6, r1 ; 0x06 + //Aux channel (blank 50Hz) + TC_AUXDAC.CTRLA = 0x04; //Some clk setting - not 100% sure since it was SW generated + d88: e0 e4 ldi r30, 0x40 ; 64 + d8a: f8 e0 ldi r31, 0x08 ; 8 + d8c: 30 83 st Z, r19 + TC_AUXDAC.CTRLB = TC_WGMODE_SINGLESLOPE_gc; //No enable is set + d8e: 21 83 std Z+1, r18 ; 0x01 + TC_AUXDAC.CTRLE = TC_BYTEM_NORMAL_gc; + d90: 14 82 std Z+4, r1 ; 0x04 + TC_AUXDAC.PER = 469; + d92: 86 a3 std Z+38, r24 ; 0x26 + d94: 97 a3 std Z+39, r25 ; 0x27 + TC_AUXDAC.INTCTRLA = 0x00; + d96: 16 82 std Z+6, r1 ; 0x06 + + //PSU + PORTD.DIR |= 0b00010000; + d98: e0 e6 ldi r30, 0x60 ; 96 + d9a: f6 e0 ldi r31, 0x06 ; 6 + d9c: 80 81 ld r24, Z + d9e: 80 61 ori r24, 0x10 ; 16 + da0: 80 83 st Z, r24 + TC_PSU.CTRLB = 0x10 | TC_WGMODE_SINGLESLOPE_gc; //CCAEN is set + da2: e0 e4 ldi r30, 0x40 ; 64 + da4: f9 e0 ldi r31, 0x09 ; 9 + da6: 83 e1 ldi r24, 0x13 ; 19 + da8: 81 83 std Z+1, r24 ; 0x01 + TC_PSU.CTRLE = TC_BYTEM_NORMAL_gc; + daa: 14 82 std Z+4, r1 ; 0x04 + TC_PSU.INTCTRLA = TC_OVFINTLVL_LO_gc; + dac: 21 e0 ldi r18, 0x01 ; 1 + dae: 26 83 std Z+6, r18 ; 0x06 + TC_PSU.PER = PSU_PER; // Max value of CNT + db0: 88 eb ldi r24, 0xB8 ; 184 + db2: 9b e0 ldi r25, 0x0B ; 11 + db4: 86 a3 std Z+38, r24 ; 0x26 + db6: 97 a3 std Z+39, r25 ; 0x27 + TC_PSU.CCA = 0; //Initial Duty cycle of 0% + db8: 10 a6 std Z+40, r1 ; 0x28 + dba: 11 a6 std Z+41, r1 ; 0x29 + TC_PSU.CTRLA = TC_CLKSEL_DIV1_gc; + dbc: 20 83 st Z, r18 + dbe: 08 95 ret + +00000dc0 <__vector_83>: + TCC1.PER = 1800; // Max value of CNT + TCC1.CTRLA = TC_CLKSEL_DIV1_gc; + */ +} + +ISR(TC_PSU_OVF){ + dc0: 1f 92 push r1 + dc2: 0f 92 push r0 + dc4: 0f b6 in r0, 0x3f ; 63 + dc6: 0f 92 push r0 + dc8: 11 24 eor r1, r1 + dca: 2f 93 push r18 + dcc: 3f 93 push r19 + dce: 4f 93 push r20 + dd0: 8f 93 push r24 + dd2: 9f 93 push r25 + dd4: ef 93 push r30 + dd6: ff 93 push r31 + dd8: cf 93 push r28 + dda: df 93 push r29 + ddc: 1f 92 push r1 + dde: cd b7 in r28, 0x3d ; 61 + de0: de b7 in r29, 0x3e ; 62 + char tempvar; + char err; + volatile char nothing; + if (global_mode == 7){ + de2: 80 91 00 20 lds r24, 0x2000 + de6: 87 30 cpi r24, 0x07 ; 7 + de8: 31 f4 brne .+12 ; 0xdf6 <__vector_83+0x36> + nothing = ADCA.CH1.RESL; + dea: e0 e0 ldi r30, 0x00 ; 0 + dec: f2 e0 ldi r31, 0x02 ; 2 + dee: 84 a5 ldd r24, Z+44 ; 0x2c + df0: 89 83 std Y+1, r24 ; 0x01 + tempvar = ADCA.CH1.RESH; + df2: 85 a5 ldd r24, Z+45 ; 0x2d + df4: 03 c0 rjmp .+6 ; 0xdfc <__vector_83+0x3c> + } + else{ + tempvar = ADCA.CH1.RESL; + df6: e0 e0 ldi r30, 0x00 ; 0 + df8: f2 e0 ldi r31, 0x02 ; 2 + dfa: 84 a5 ldd r24, Z+44 ; 0x2c + } + //tempvar = (global_mode == 7 ? (char) ADCA.CH1.RESH : (char) ADCA.CH1.RESL); + //test_byte = tempvar; + + err = (char) (PSU_target - tempvar); + dfc: 20 91 b2 20 lds r18, 0x20B2 + e00: 28 1b sub r18, r24 + if ((err > 1) & ((unsigned short) TC_PSU.CCA < PSU_PER - jump) ){ + e02: e0 e4 ldi r30, 0x40 ; 64 + e04: f9 e0 ldi r31, 0x09 ; 9 + e06: 80 a5 ldd r24, Z+40 ; 0x28 + e08: 91 a5 ldd r25, Z+41 ; 0x29 + e0a: 31 e0 ldi r19, 0x01 ; 1 + e0c: 22 30 cpi r18, 0x02 ; 2 + e0e: 0c f4 brge .+2 ; 0xe12 <__vector_83+0x52> + e10: 30 e0 ldi r19, 0x00 ; 0 + e12: 33 23 and r19, r19 + e14: c9 f0 breq .+50 ; 0xe48 <__vector_83+0x88> + e16: 31 e0 ldi r19, 0x01 ; 1 + e18: 82 3b cpi r24, 0xB2 ; 178 + e1a: 9b 40 sbci r25, 0x0B ; 11 + e1c: 08 f0 brcs .+2 ; 0xe20 <__vector_83+0x60> + e1e: 30 e0 ldi r19, 0x00 ; 0 + e20: 33 23 and r19, r19 + e22: 91 f0 breq .+36 ; 0xe48 <__vector_83+0x88> + TC_PSU.CCABUF = TC_PSU.CCA + ((err > 8) ? jump : 1); + e24: e0 e4 ldi r30, 0x40 ; 64 + e26: f9 e0 ldi r31, 0x09 ; 9 + e28: 80 a5 ldd r24, Z+40 ; 0x28 + e2a: 91 a5 ldd r25, Z+41 ; 0x29 + e2c: 29 30 cpi r18, 0x09 ; 9 + e2e: 1c f0 brlt .+6 ; 0xe36 <__vector_83+0x76> + e30: 26 e0 ldi r18, 0x06 ; 6 + e32: 30 e0 ldi r19, 0x00 ; 0 + e34: 02 c0 rjmp .+4 ; 0xe3a <__vector_83+0x7a> + e36: 21 e0 ldi r18, 0x01 ; 1 + e38: 30 e0 ldi r19, 0x00 ; 0 + e3a: 82 0f add r24, r18 + e3c: 93 1f adc r25, r19 + e3e: e0 e4 ldi r30, 0x40 ; 64 + e40: f9 e0 ldi r31, 0x09 ; 9 + e42: 80 af std Z+56, r24 ; 0x38 + e44: 91 af std Z+57, r25 ; 0x39 + e46: 21 c0 rjmp .+66 ; 0xe8a <__vector_83+0xca> + } + else if ((err < -1) & ((unsigned short) TC_PSU.CCA > jump)){ + e48: e0 e4 ldi r30, 0x40 ; 64 + e4a: f9 e0 ldi r31, 0x09 ; 9 + e4c: 80 a5 ldd r24, Z+40 ; 0x28 + e4e: 91 a5 ldd r25, Z+41 ; 0x29 + e50: 31 e0 ldi r19, 0x01 ; 1 + e52: 2f 3f cpi r18, 0xFF ; 255 + e54: 0c f0 brlt .+2 ; 0xe58 <__vector_83+0x98> + e56: 30 e0 ldi r19, 0x00 ; 0 + e58: 33 23 and r19, r19 + e5a: b9 f0 breq .+46 ; 0xe8a <__vector_83+0xca> + e5c: 31 e0 ldi r19, 0x01 ; 1 + e5e: 07 97 sbiw r24, 0x07 ; 7 + e60: 08 f4 brcc .+2 ; 0xe64 <__vector_83+0xa4> + e62: 30 e0 ldi r19, 0x00 ; 0 + e64: 33 23 and r19, r19 + e66: 89 f0 breq .+34 ; 0xe8a <__vector_83+0xca> + TC_PSU.CCABUF = TC_PSU.CCA - ((err < -8) ? jump : 1); + e68: e0 e4 ldi r30, 0x40 ; 64 + e6a: f9 e0 ldi r31, 0x09 ; 9 + e6c: 80 a5 ldd r24, Z+40 ; 0x28 + e6e: 91 a5 ldd r25, Z+41 ; 0x29 + e70: 28 3f cpi r18, 0xF8 ; 248 + e72: 1c f4 brge .+6 ; 0xe7a <__vector_83+0xba> + e74: 26 e0 ldi r18, 0x06 ; 6 + e76: 30 e0 ldi r19, 0x00 ; 0 + e78: 02 c0 rjmp .+4 ; 0xe7e <__vector_83+0xbe> + e7a: 21 e0 ldi r18, 0x01 ; 1 + e7c: 30 e0 ldi r19, 0x00 ; 0 + e7e: 82 1b sub r24, r18 + e80: 93 0b sbc r25, r19 + e82: e0 e4 ldi r30, 0x40 ; 64 + e84: f9 e0 ldi r31, 0x09 ; 9 + e86: 80 af std Z+56, r24 ; 0x38 + e88: 91 af std Z+57, r25 ; 0x39 + } + e8a: 0f 90 pop r0 + e8c: df 91 pop r29 + e8e: cf 91 pop r28 + e90: ff 91 pop r31 + e92: ef 91 pop r30 + e94: 9f 91 pop r25 + e96: 8f 91 pop r24 + e98: 4f 91 pop r20 + e9a: 3f 91 pop r19 + e9c: 2f 91 pop r18 + e9e: 0f 90 pop r0 + ea0: 0f be out 0x3f, r0 ; 63 + ea2: 0f 90 pop r0 + ea4: 1f 90 pop r1 + ea6: 18 95 reti + +00000ea8 : +#include "tiny_uart.h" +#include "globals.h" + + +void tiny_uart_setup(void){ + PR.PRPC &= 0b11101111; + ea8: e0 e7 ldi r30, 0x70 ; 112 + eaa: f0 e0 ldi r31, 0x00 ; 0 + eac: 83 81 ldd r24, Z+3 ; 0x03 + eae: 8f 7e andi r24, 0xEF ; 239 + eb0: 83 83 std Z+3, r24 ; 0x03 + //PR.PRPE &= 0b11111110; ??? + + PORTC.DIR |= 0b10101010; + eb2: e0 e4 ldi r30, 0x40 ; 64 + eb4: f6 e0 ldi r31, 0x06 ; 6 + eb6: 80 81 ld r24, Z + eb8: 8a 6a ori r24, 0xAA ; 170 + eba: 80 83 st Z, r24 + PORTC.OUT = 0xff; + ebc: 8f ef ldi r24, 0xFF ; 255 + ebe: 84 83 std Z+4, r24 ; 0x04 + PORTC.PIN2CTRL = PORT_INVEN_bm | PORT_OPC_PULLUP_gc; + ec0: 88 e5 ldi r24, 0x58 ; 88 + ec2: 82 8b std Z+18, r24 ; 0x12 + //PORTC.REMAP = 0x10; //Remap USART to [7:4] + #ifndef VERO + PORTC.REMAP = 0x20; //Swap MOSI and SCK - for small boards only!!! + #endif + + USARTC0.CTRLC = USART_CMODE_MSPI_gc | 0b00000100; //LSB received first, UPCHA disabled + ec4: e0 ea ldi r30, 0xA0 ; 160 + ec6: f8 e0 ldi r31, 0x08 ; 8 + ec8: 84 ec ldi r24, 0xC4 ; 196 + eca: 85 83 std Z+5, r24 ; 0x05 + USARTC0.BAUDCTRLA = 3; //BSEL = fper/(2fbaud) -1; 24/(2*3) - 1 = 3 + ecc: 83 e0 ldi r24, 0x03 ; 3 + ece: 86 83 std Z+6, r24 ; 0x06 + USARTC0.BAUDCTRLB = 0x00;//USART_BSCALE0_bm; + ed0: 17 82 std Z+7, r1 ; 0x07 + USARTC0.CTRLB = USART_RXEN_bm | USART_TXEN_bm; + ed2: 88 e1 ldi r24, 0x18 ; 24 + ed4: 84 83 std Z+4, r24 ; 0x04 + ed6: 08 95 ret + +00000ed8 : +} + + +void tiny_spi_setup(void){ + //Power Reduction disable + PR.PRPC &= 0b11110111; + ed8: e0 e7 ldi r30, 0x70 ; 112 + eda: f0 e0 ldi r31, 0x00 ; 0 + edc: 83 81 ldd r24, Z+3 ; 0x03 + ede: 87 7f andi r24, 0xF7 ; 247 + ee0: 83 83 std Z+3, r24 ; 0x03 + + //SPI enable + SPIC.CTRL = SPI_ENABLE_bm; //Slave mode + ee2: 80 e4 ldi r24, 0x40 ; 64 + ee4: 80 93 c0 08 sts 0x08C0, r24 + #ifdef VERO + PORTC.PIN5CTRL = PORT_INVEN_bm | PORT_OPC_PULLUP_gc; //Pin5 if not swapped + ee8: 88 e5 ldi r24, 0x58 ; 88 + eea: e0 e4 ldi r30, 0x40 ; 64 + eec: f6 e0 ldi r31, 0x06 ; 6 + eee: 85 8b std Z+21, r24 ; 0x15 + ef0: 08 95 ret + +00000ef2 : + ef2: cf 93 push r28 + ef4: df 93 push r29 + ef6: 00 d0 rcall .+0 ; 0xef8 + ef8: 00 d0 rcall .+0 ; 0xefa + efa: cd b7 in r28, 0x3d ; 61 + efc: de b7 in r29, 0x3e ; 62 + efe: 8f ef ldi r24, 0xFF ; 255 + f00: 80 93 70 00 sts 0x0070, r24 + f04: 80 93 71 00 sts 0x0071, r24 + f08: 80 93 72 00 sts 0x0072, r24 + f0c: 80 93 73 00 sts 0x0073, r24 + f10: 80 93 74 00 sts 0x0074, r24 + f14: 80 93 75 00 sts 0x0075, r24 + f18: 80 93 76 00 sts 0x0076, r24 + f1c: 64 e0 ldi r22, 0x04 ; 4 + f1e: 81 e4 ldi r24, 0x41 ; 65 + f20: 90 e0 ldi r25, 0x00 ; 0 + f22: e4 d5 rcall .+3016 ; 0x1aec + f24: 6c e1 ldi r22, 0x1C ; 28 + f26: 70 e0 ldi r23, 0x00 ; 0 + f28: 82 e0 ldi r24, 0x02 ; 2 + f2a: e6 d5 rcall .+3020 ; 0x1af8 + f2c: 8a 83 std Y+2, r24 ; 0x02 + f2e: 6d e1 ldi r22, 0x1D ; 29 + f30: 70 e0 ldi r23, 0x00 ; 0 + f32: 82 e0 ldi r24, 0x02 ; 2 + f34: e1 d5 rcall .+3010 ; 0x1af8 + f36: 89 83 std Y+1, r24 ; 0x01 + f38: 89 81 ldd r24, Y+1 ; 0x01 + f3a: 9a 81 ldd r25, Y+2 ; 0x02 + f3c: 01 96 adiw r24, 0x01 ; 1 + f3e: 21 f4 brne .+8 ; 0xf48 + f40: 80 e4 ldi r24, 0x40 ; 64 + f42: 93 e2 ldi r25, 0x23 ; 35 + f44: 89 83 std Y+1, r24 ; 0x01 + f46: 9a 83 std Y+2, r25 ; 0x02 + f48: 89 81 ldd r24, Y+1 ; 0x01 + f4a: 9a 81 ldd r25, Y+2 ; 0x02 + f4c: 8b 83 std Y+3, r24 ; 0x03 + f4e: 9c 83 std Y+4, r25 ; 0x04 + f50: e0 e6 ldi r30, 0x60 ; 96 + f52: f0 e0 ldi r31, 0x00 ; 0 + f54: 82 83 std Z+2, r24 ; 0x02 + f56: 8c 81 ldd r24, Y+4 ; 0x04 + f58: 83 83 std Z+3, r24 ; 0x03 + f5a: 8f b7 in r24, 0x3f ; 63 + f5c: f8 94 cli + f5e: e0 e5 ldi r30, 0x50 ; 80 + f60: f0 e0 ldi r31, 0x00 ; 0 + f62: 90 81 ld r25, Z + f64: 92 60 ori r25, 0x02 ; 2 + f66: 90 83 st Z, r25 + f68: 8f bf out 0x3f, r24 ; 63 + f6a: 81 81 ldd r24, Z+1 ; 0x01 + f6c: 81 ff sbrs r24, 1 + f6e: fd cf rjmp .-6 ; 0xf6a + f70: 8f b7 in r24, 0x3f ; 63 + f72: f8 94 cli + f74: a0 e5 ldi r26, 0x50 ; 80 + f76: b0 e0 ldi r27, 0x00 ; 0 + f78: 16 96 adiw r26, 0x06 ; 6 + f7a: 9c 91 ld r25, X + f7c: 16 97 sbiw r26, 0x06 ; 6 + f7e: 99 7f andi r25, 0xF9 ; 249 + f80: 16 96 adiw r26, 0x06 ; 6 + f82: 9c 93 st X, r25 + f84: 16 97 sbiw r26, 0x06 ; 6 + f86: e0 e6 ldi r30, 0x60 ; 96 + f88: f0 e0 ldi r31, 0x00 ; 0 + f8a: 90 e8 ldi r25, 0x80 ; 128 + f8c: 95 83 std Z+5, r25 ; 0x05 + f8e: 9b eb ldi r25, 0xBB ; 187 + f90: 96 83 std Z+6, r25 ; 0x06 + f92: 16 96 adiw r26, 0x06 ; 6 + f94: 9c 91 ld r25, X + f96: 16 97 sbiw r26, 0x06 ; 6 + f98: 94 60 ori r25, 0x04 ; 4 + f9a: 16 96 adiw r26, 0x06 ; 6 + f9c: 9c 93 st X, r25 + f9e: 90 81 ld r25, Z + fa0: 91 60 ori r25, 0x01 ; 1 + fa2: 90 83 st Z, r25 + fa4: 8f bf out 0x3f, r24 ; 63 + fa6: 61 e0 ldi r22, 0x01 ; 1 + fa8: 80 e4 ldi r24, 0x40 ; 64 + faa: 90 e0 ldi r25, 0x00 ; 0 + fac: 9f d5 rcall .+2878 ; 0x1aec + fae: 8f b7 in r24, 0x3f ; 63 + fb0: f8 94 cli + fb2: e0 e5 ldi r30, 0x50 ; 80 + fb4: f0 e0 ldi r31, 0x00 ; 0 + fb6: 90 81 ld r25, Z + fb8: 9e 7f andi r25, 0xFE ; 254 + fba: 90 83 st Z, r25 + fbc: 8f bf out 0x3f, r24 ; 63 + fbe: 24 96 adiw r28, 0x04 ; 4 + fc0: cd bf out 0x3d, r28 ; 61 + fc2: de bf out 0x3e, r29 ; 62 + fc4: df 91 pop r29 + fc6: cf 91 pop r28 + fc8: 08 95 ret + +00000fca : + fca: 9f b7 in r25, 0x3f ; 63 + fcc: f8 94 cli + fce: e8 2f mov r30, r24 + fd0: f0 e0 ldi r31, 0x00 ; 0 + fd2: e0 59 subi r30, 0x90 ; 144 + fd4: ff 4f sbci r31, 0xFF ; 255 + fd6: 60 95 com r22 + fd8: 80 81 ld r24, Z + fda: 68 23 and r22, r24 + fdc: 60 83 st Z, r22 + fde: 9f bf out 0x3f, r25 ; 63 + fe0: 08 95 ret + +00000fe2 : + fe2: 86 30 cpi r24, 0x06 ; 6 + fe4: 11 f4 brne .+4 ; 0xfea + fe6: 68 e1 ldi r22, 0x18 ; 24 + fe8: 01 c0 rjmp .+2 ; 0xfec + fea: 60 e0 ldi r22, 0x00 ; 0 + fec: e0 e5 ldi r30, 0x50 ; 80 + fee: f0 e0 ldi r31, 0x00 ; 0 + ff0: 81 81 ldd r24, Z+1 ; 0x01 + ff2: 81 fd sbrc r24, 1 + ff4: 24 c0 rjmp .+72 ; 0x103e + ff6: 8f b7 in r24, 0x3f ; 63 + ff8: f8 94 cli + ffa: 90 81 ld r25, Z + ffc: 92 60 ori r25, 0x02 ; 2 + ffe: 90 83 st Z, r25 + 1000: 8f bf out 0x3f, r24 ; 63 + 1002: 81 81 ldd r24, Z+1 ; 0x01 + 1004: 81 ff sbrs r24, 1 + 1006: fd cf rjmp .-6 ; 0x1002 + 1008: 8f b7 in r24, 0x3f ; 63 + 100a: f8 94 cli + 100c: a0 e5 ldi r26, 0x50 ; 80 + 100e: b0 e0 ldi r27, 0x00 ; 0 + 1010: 16 96 adiw r26, 0x06 ; 6 + 1012: 9c 91 ld r25, X + 1014: 16 97 sbiw r26, 0x06 ; 6 + 1016: 99 7f andi r25, 0xF9 ; 249 + 1018: 16 96 adiw r26, 0x06 ; 6 + 101a: 9c 93 st X, r25 + 101c: 16 97 sbiw r26, 0x06 ; 6 + 101e: e0 e6 ldi r30, 0x60 ; 96 + 1020: f0 e0 ldi r31, 0x00 ; 0 + 1022: 90 e8 ldi r25, 0x80 ; 128 + 1024: 95 83 std Z+5, r25 ; 0x05 + 1026: 9b eb ldi r25, 0xBB ; 187 + 1028: 96 83 std Z+6, r25 ; 0x06 + 102a: 16 96 adiw r26, 0x06 ; 6 + 102c: 9c 91 ld r25, X + 102e: 16 97 sbiw r26, 0x06 ; 6 + 1030: 94 60 ori r25, 0x04 ; 4 + 1032: 16 96 adiw r26, 0x06 ; 6 + 1034: 9c 93 st X, r25 + 1036: 90 81 ld r25, Z + 1038: 91 60 ori r25, 0x01 ; 1 + 103a: 90 83 st Z, r25 + 103c: 8f bf out 0x3f, r24 ; 63 + 103e: 63 60 ori r22, 0x03 ; 3 + 1040: 84 e4 ldi r24, 0x44 ; 68 + 1042: 90 e0 ldi r25, 0x00 ; 0 + 1044: 53 d5 rcall .+2726 ; 0x1aec + 1046: 60 e4 ldi r22, 0x40 ; 64 + 1048: 80 e0 ldi r24, 0x00 ; 0 + 104a: bf cf rjmp .-130 ; 0xfca + 104c: 08 95 ret + +0000104e : + 104e: 80 91 b6 20 lds r24, 0x20B6 + 1052: 08 95 ret + +00001054 : + 1054: 2b d1 rcall .+598 ; 0x12ac + 1056: fc 01 movw r30, r24 + 1058: 83 81 ldd r24, Z+3 ; 0x03 + 105a: 80 93 b6 20 sts 0x20B6, r24 + 105e: 81 11 cpse r24, r1 + 1060: 02 c0 rjmp .+4 ; 0x1066 + 1062: 76 c9 rjmp .-3348 ; 0x350 + 1064: 08 95 ret + 1066: 81 e0 ldi r24, 0x01 ; 1 + 1068: 08 95 ret + +0000106a : + 106a: 80 91 b6 20 lds r24, 0x20B6 + 106e: 81 30 cpi r24, 0x01 ; 1 + 1070: 09 f4 brne .+2 ; 0x1074 + 1072: 7a c9 rjmp .-3340 ; 0x368 + 1074: 08 95 ret + +00001076 : + 1076: 80 91 56 24 lds r24, 0x2456 + 107a: 88 23 and r24, r24 + 107c: 4c f4 brge .+18 ; 0x1090 + 107e: 80 76 andi r24, 0x60 ; 96 + 1080: 80 34 cpi r24, 0x40 ; 64 + 1082: a9 f4 brne .+42 ; 0x10ae + 1084: 80 91 57 24 lds r24, 0x2457 + 1088: 81 11 cpse r24, r1 + 108a: 13 c0 rjmp .+38 ; 0x10b2 + 108c: 72 c9 rjmp .-3356 ; 0x372 + 108e: 08 95 ret + 1090: 80 76 andi r24, 0x60 ; 96 + 1092: 80 34 cpi r24, 0x40 ; 64 + 1094: 81 f4 brne .+32 ; 0x10b6 + 1096: 80 91 57 24 lds r24, 0x2457 + 109a: 81 11 cpse r24, r1 + 109c: 0e c0 rjmp .+28 ; 0x10ba + 109e: 80 91 5c 24 lds r24, 0x245C + 10a2: 90 91 5d 24 lds r25, 0x245D + 10a6: 89 2b or r24, r25 + 10a8: 51 f0 breq .+20 ; 0x10be + 10aa: 61 c9 rjmp .-3390 ; 0x36e + 10ac: 08 95 ret + 10ae: 80 e0 ldi r24, 0x00 ; 0 + 10b0: 08 95 ret + 10b2: 80 e0 ldi r24, 0x00 ; 0 + 10b4: 08 95 ret + 10b6: 80 e0 ldi r24, 0x00 ; 0 + 10b8: 08 95 ret + 10ba: 80 e0 ldi r24, 0x00 ; 0 + 10bc: 08 95 ret + 10be: 80 e0 ldi r24, 0x00 ; 0 + 10c0: 08 95 ret + +000010c2 : + 10c2: 0f 93 push r16 + 10c4: 1f 93 push r17 + 10c6: 9b 01 movw r18, r22 + 10c8: 8a 01 movw r16, r20 + 10ca: ac 01 movw r20, r24 + 10cc: 60 e0 ldi r22, 0x00 ; 0 + 10ce: 83 e8 ldi r24, 0x83 ; 131 + 10d0: 0e 94 7a 11 call 0x22f4 ; 0x22f4 + 10d4: 1f 91 pop r17 + 10d6: 0f 91 pop r16 + 10d8: 08 95 ret + +000010da : +/*! \brief Stop the USB Device stack + */ +void udc_stop(void) +{ + udd_disable(); + udc_reset(); + 10da: e0 91 bb 20 lds r30, 0x20BB + 10de: f0 91 bc 20 lds r31, 0x20BC + 10e2: 01 90 ld r0, Z+ + 10e4: f0 81 ld r31, Z + 10e6: e0 2d mov r30, r0 + 10e8: 22 81 ldd r18, Z+2 ; 0x02 + 10ea: 33 81 ldd r19, Z+3 ; 0x03 + 10ec: 2e 0f add r18, r30 + 10ee: 3f 1f adc r19, r31 + 10f0: fc 01 movw r30, r24 + 10f2: 40 81 ld r20, Z + 10f4: e4 0f add r30, r20 + 10f6: f1 1d adc r31, r1 + 10f8: e2 17 cp r30, r18 + 10fa: f3 07 cpc r31, r19 + 10fc: a0 f4 brcc .+40 ; 0x1126 + 10fe: 81 81 ldd r24, Z+1 ; 0x01 + 1100: 84 30 cpi r24, 0x04 ; 4 + 1102: a1 f0 breq .+40 ; 0x112c + 1104: 86 13 cpse r24, r22 + 1106: 06 c0 rjmp .+12 ; 0x1114 + 1108: 14 c0 rjmp .+40 ; 0x1132 + 110a: 81 81 ldd r24, Z+1 ; 0x01 + 110c: 84 30 cpi r24, 0x04 ; 4 + 110e: a1 f0 breq .+40 ; 0x1138 + 1110: 86 17 cp r24, r22 + 1112: a9 f0 breq .+42 ; 0x113e + 1114: 80 81 ld r24, Z + 1116: e8 0f add r30, r24 + 1118: f1 1d adc r31, r1 + 111a: e2 17 cp r30, r18 + 111c: f3 07 cpc r31, r19 + 111e: a8 f3 brcs .-22 ; 0x110a + 1120: 80 e0 ldi r24, 0x00 ; 0 + 1122: 90 e0 ldi r25, 0x00 ; 0 + 1124: 08 95 ret + 1126: 80 e0 ldi r24, 0x00 ; 0 + 1128: 90 e0 ldi r25, 0x00 ; 0 + 112a: 08 95 ret + 112c: 80 e0 ldi r24, 0x00 ; 0 + 112e: 90 e0 ldi r25, 0x00 ; 0 + 1130: 08 95 ret + 1132: 8e 2f mov r24, r30 + 1134: 9f 2f mov r25, r31 + 1136: 08 95 ret + 1138: 80 e0 ldi r24, 0x00 ; 0 + 113a: 90 e0 ldi r25, 0x00 ; 0 + 113c: 08 95 ret + 113e: 8e 2f mov r24, r30 + 1140: 9f 2f mov r25, r31 + 1142: 08 95 ret + +00001144 : + 1144: 80 91 58 24 lds r24, 0x2458 + 1148: 8f 77 andi r24, 0x7F ; 127 + 114a: 0c 94 d0 10 jmp 0x21a0 ; 0x21a0 + 114e: 08 95 ret + +00001150 : + 1150: 90 91 be 20 lds r25, 0x20BE + 1154: 99 23 and r25, r25 + 1156: 81 f1 breq .+96 ; 0x11b8 + 1158: e0 91 bb 20 lds r30, 0x20BB + 115c: f0 91 bc 20 lds r31, 0x20BC + 1160: 01 90 ld r0, Z+ + 1162: f0 81 ld r31, Z + 1164: e0 2d mov r30, r0 + 1166: 94 81 ldd r25, Z+4 ; 0x04 + 1168: 89 17 cp r24, r25 + 116a: 40 f5 brcc .+80 ; 0x11bc + 116c: e0 93 b9 20 sts 0x20B9, r30 + 1170: f0 93 ba 20 sts 0x20BA, r31 + 1174: 22 81 ldd r18, Z+2 ; 0x02 + 1176: 33 81 ldd r19, Z+3 ; 0x03 + 1178: 2e 0f add r18, r30 + 117a: 3f 1f adc r19, r31 + 117c: e2 17 cp r30, r18 + 117e: f3 07 cpc r31, r19 + 1180: f8 f4 brcc .+62 ; 0x11c0 + 1182: 91 81 ldd r25, Z+1 ; 0x01 + 1184: 94 30 cpi r25, 0x04 ; 4 + 1186: 61 f4 brne .+24 ; 0x11a0 + 1188: 92 81 ldd r25, Z+2 ; 0x02 + 118a: 98 13 cpse r25, r24 + 118c: 09 c0 rjmp .+18 ; 0x11a0 + 118e: 93 81 ldd r25, Z+3 ; 0x03 + 1190: 96 13 cpse r25, r22 + 1192: 06 c0 rjmp .+12 ; 0x11a0 + 1194: e0 93 b9 20 sts 0x20B9, r30 + 1198: f0 93 ba 20 sts 0x20BA, r31 + 119c: 81 e0 ldi r24, 0x01 ; 1 + 119e: 08 95 ret + 11a0: 90 81 ld r25, Z + 11a2: e9 0f add r30, r25 + 11a4: f1 1d adc r31, r1 + 11a6: e2 17 cp r30, r18 + 11a8: f3 07 cpc r31, r19 + 11aa: 58 f3 brcs .-42 ; 0x1182 + 11ac: e0 93 b9 20 sts 0x20B9, r30 + 11b0: f0 93 ba 20 sts 0x20BA, r31 + 11b4: 80 e0 ldi r24, 0x00 ; 0 + 11b6: 08 95 ret + 11b8: 80 e0 ldi r24, 0x00 ; 0 + 11ba: 08 95 ret + 11bc: 80 e0 ldi r24, 0x00 ; 0 + 11be: 08 95 ret + 11c0: 80 e0 ldi r24, 0x00 ; 0 + 11c2: 08 95 ret + +000011c4 : + 11c4: ff 92 push r15 + 11c6: 0f 93 push r16 + 11c8: 1f 93 push r17 + 11ca: cf 93 push r28 + 11cc: df 93 push r29 + 11ce: c8 2f mov r28, r24 + 11d0: 60 e0 ldi r22, 0x00 ; 0 + 11d2: be df rcall .-132 ; 0x1150 + 11d4: f8 2e mov r15, r24 + 11d6: 88 23 and r24, r24 + 11d8: 81 f1 breq .+96 ; 0x123a + 11da: a0 91 bb 20 lds r26, 0x20BB + 11de: b0 91 bc 20 lds r27, 0x20BC + 11e2: ec 2f mov r30, r28 + 11e4: f0 e0 ldi r31, 0x00 ; 0 + 11e6: ee 0f add r30, r30 + 11e8: ff 1f adc r31, r31 + 11ea: 12 96 adiw r26, 0x02 ; 2 + 11ec: 2d 91 ld r18, X+ + 11ee: 3c 91 ld r19, X + 11f0: 13 97 sbiw r26, 0x03 ; 3 + 11f2: e2 0f add r30, r18 + 11f4: f3 1f adc r31, r19 + 11f6: 00 81 ld r16, Z + 11f8: 11 81 ldd r17, Z+1 ; 0x01 + 11fa: d8 01 movw r26, r16 + 11fc: 16 96 adiw r26, 0x06 ; 6 + 11fe: ed 91 ld r30, X+ + 1200: fc 91 ld r31, X + 1202: 17 97 sbiw r26, 0x07 ; 7 + 1204: 09 95 icall + 1206: 68 2f mov r22, r24 + 1208: 8c 2f mov r24, r28 + 120a: a2 df rcall .-188 ; 0x1150 + 120c: f8 2e mov r15, r24 + 120e: 88 23 and r24, r24 + 1210: a1 f0 breq .+40 ; 0x123a + 1212: c0 91 b9 20 lds r28, 0x20B9 + 1216: d0 91 ba 20 lds r29, 0x20BA + 121a: 65 e0 ldi r22, 0x05 ; 5 + 121c: ce 01 movw r24, r28 + 121e: 5d df rcall .-326 ; 0x10da + 1220: ec 01 movw r28, r24 + 1222: 00 97 sbiw r24, 0x00 ; 0 + 1224: 21 f0 breq .+8 ; 0x122e + 1226: 8a 81 ldd r24, Y+2 ; 0x02 + 1228: 0e 94 3a 12 call 0x2474 ; 0x2474 + 122c: f6 cf rjmp .-20 ; 0x121a + 122e: d8 01 movw r26, r16 + 1230: 12 96 adiw r26, 0x02 ; 2 + 1232: ed 91 ld r30, X+ + 1234: fc 91 ld r31, X + 1236: 13 97 sbiw r26, 0x03 ; 3 + 1238: 09 95 icall + 123a: 8f 2d mov r24, r15 + 123c: df 91 pop r29 + 123e: cf 91 pop r28 + 1240: 1f 91 pop r17 + 1242: 0f 91 pop r16 + 1244: ff 90 pop r15 + 1246: 08 95 ret + +00001248 : + 1248: 1f 93 push r17 + 124a: cf 93 push r28 + 124c: df 93 push r29 + 124e: 18 2f mov r17, r24 + 1250: 7f df rcall .-258 ; 0x1150 + 1252: 88 23 and r24, r24 + 1254: 39 f1 breq .+78 ; 0x12a4 + 1256: c0 91 b9 20 lds r28, 0x20B9 + 125a: d0 91 ba 20 lds r29, 0x20BA + 125e: 65 e0 ldi r22, 0x05 ; 5 + 1260: ce 01 movw r24, r28 + 1262: 3b df rcall .-394 ; 0x10da + 1264: ec 01 movw r28, r24 + 1266: 00 97 sbiw r24, 0x00 ; 0 + 1268: 41 f0 breq .+16 ; 0x127a + 126a: 4c 81 ldd r20, Y+4 ; 0x04 + 126c: 5d 81 ldd r21, Y+5 ; 0x05 + 126e: 6b 81 ldd r22, Y+3 ; 0x03 + 1270: 8a 81 ldd r24, Y+2 ; 0x02 + 1272: a5 d7 rcall .+3914 ; 0x21be + 1274: 81 11 cpse r24, r1 + 1276: f3 cf rjmp .-26 ; 0x125e + 1278: 15 c0 rjmp .+42 ; 0x12a4 + 127a: a0 91 bb 20 lds r26, 0x20BB + 127e: b0 91 bc 20 lds r27, 0x20BC + 1282: 81 2f mov r24, r17 + 1284: 90 e0 ldi r25, 0x00 ; 0 + 1286: 88 0f add r24, r24 + 1288: 99 1f adc r25, r25 + 128a: 12 96 adiw r26, 0x02 ; 2 + 128c: ed 91 ld r30, X+ + 128e: fc 91 ld r31, X + 1290: 13 97 sbiw r26, 0x03 ; 3 + 1292: e8 0f add r30, r24 + 1294: f9 1f adc r31, r25 + 1296: 01 90 ld r0, Z+ + 1298: f0 81 ld r31, Z + 129a: e0 2d mov r30, r0 + 129c: 01 90 ld r0, Z+ + 129e: f0 81 ld r31, Z + 12a0: e0 2d mov r30, r0 + 12a2: 09 95 icall + 12a4: df 91 pop r29 + 12a6: cf 91 pop r28 + 12a8: 1f 91 pop r17 + 12aa: 08 95 ret + +000012ac : + 12ac: 80 91 b9 20 lds r24, 0x20B9 + 12b0: 90 91 ba 20 lds r25, 0x20BA + 12b4: 08 95 ret + +000012b6 : + 12b6: ef c6 rjmp .+3550 ; 0x2096 + 12b8: 08 95 ret + +000012ba : + 12ba: cf 93 push r28 + 12bc: 80 91 be 20 lds r24, 0x20BE + 12c0: 88 23 and r24, r24 + 12c2: c1 f0 breq .+48 ; 0x12f4 + 12c4: e0 91 bb 20 lds r30, 0x20BB + 12c8: f0 91 bc 20 lds r31, 0x20BC + 12cc: 01 90 ld r0, Z+ + 12ce: f0 81 ld r31, Z + 12d0: e0 2d mov r30, r0 + 12d2: 84 81 ldd r24, Z+4 ; 0x04 + 12d4: 88 23 and r24, r24 + 12d6: 71 f0 breq .+28 ; 0x12f4 + 12d8: c0 e0 ldi r28, 0x00 ; 0 + 12da: 8c 2f mov r24, r28 + 12dc: 73 df rcall .-282 ; 0x11c4 + 12de: cf 5f subi r28, 0xFF ; 255 + 12e0: e0 91 bb 20 lds r30, 0x20BB + 12e4: f0 91 bc 20 lds r31, 0x20BC + 12e8: 01 90 ld r0, Z+ + 12ea: f0 81 ld r31, Z + 12ec: e0 2d mov r30, r0 + 12ee: 84 81 ldd r24, Z+4 ; 0x04 + 12f0: c8 17 cp r28, r24 + 12f2: 98 f3 brcs .-26 ; 0x12da + 12f4: 10 92 be 20 sts 0x20BE, r1 + 12f8: 10 92 c2 20 sts 0x20C2, r1 + 12fc: 10 92 c3 20 sts 0x20C3, r1 + 1300: cf 91 pop r28 + 1302: 08 95 ret + +00001304 : + CPU_TO_LE16(USB_DEV_STATUS_BUS_POWERED); +#endif +} + +void udc_sof_notify(void) +{ + 1304: cf 93 push r28 + uint8_t iface_num; + + if (udc_num_configuration) { + 1306: 80 91 be 20 lds r24, 0x20BE + 130a: 88 23 and r24, r24 + 130c: 41 f1 breq .+80 ; 0x135e + for (iface_num = 0; + iface_num < udc_ptr_conf->desc->bNumInterfaces; + 130e: e0 91 bb 20 lds r30, 0x20BB + 1312: f0 91 bc 20 lds r31, 0x20BC + 1316: a0 81 ld r26, Z + 1318: b1 81 ldd r27, Z+1 ; 0x01 +void udc_sof_notify(void) +{ + uint8_t iface_num; + + if (udc_num_configuration) { + for (iface_num = 0; + 131a: 14 96 adiw r26, 0x04 ; 4 + 131c: 8c 91 ld r24, X + 131e: 88 23 and r24, r24 + 1320: f1 f0 breq .+60 ; 0x135e + 1322: c0 e0 ldi r28, 0x00 ; 0 + iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + if (udc_ptr_conf->udi_apis[iface_num]->sof_notify != NULL) { + 1324: 8c 2f mov r24, r28 + 1326: 90 e0 ldi r25, 0x00 ; 0 + 1328: 88 0f add r24, r24 + 132a: 99 1f adc r25, r25 + 132c: 02 80 ldd r0, Z+2 ; 0x02 + 132e: f3 81 ldd r31, Z+3 ; 0x03 + 1330: e0 2d mov r30, r0 + 1332: e8 0f add r30, r24 + 1334: f9 1f adc r31, r25 + 1336: 01 90 ld r0, Z+ + 1338: f0 81 ld r31, Z + 133a: e0 2d mov r30, r0 + 133c: 00 84 ldd r0, Z+8 ; 0x08 + 133e: f1 85 ldd r31, Z+9 ; 0x09 + 1340: e0 2d mov r30, r0 + 1342: 30 97 sbiw r30, 0x00 ; 0 + 1344: 09 f0 breq .+2 ; 0x1348 + udc_ptr_conf->udi_apis[iface_num]->sof_notify(); + 1346: 09 95 icall + uint8_t iface_num; + + if (udc_num_configuration) { + for (iface_num = 0; + iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + 1348: cf 5f subi r28, 0xFF ; 255 +{ + uint8_t iface_num; + + if (udc_num_configuration) { + for (iface_num = 0; + iface_num < udc_ptr_conf->desc->bNumInterfaces; + 134a: e0 91 bb 20 lds r30, 0x20BB + 134e: f0 91 bc 20 lds r31, 0x20BC + 1352: a0 81 ld r26, Z + 1354: b1 81 ldd r27, Z+1 ; 0x01 +void udc_sof_notify(void) +{ + uint8_t iface_num; + + if (udc_num_configuration) { + for (iface_num = 0; + 1356: 14 96 adiw r26, 0x04 ; 4 + 1358: 8c 91 ld r24, X + 135a: c8 17 cp r28, r24 + 135c: 18 f3 brcs .-58 ; 0x1324 + if (udc_ptr_conf->udi_apis[iface_num]->sof_notify != NULL) { + udc_ptr_conf->udi_apis[iface_num]->sof_notify(); + } + } + } +} + 135e: cf 91 pop r28 + 1360: 08 95 ret + +00001362 : + * sent to a specific application callback. + * + * \return true if the request is supported, else the request is stalled by UDD + */ +bool udc_process_setup(void) +{ + 1362: ef 92 push r14 + 1364: ff 92 push r15 + 1366: 0f 93 push r16 + 1368: 1f 93 push r17 + 136a: cf 93 push r28 + 136c: df 93 push r29 + // By default no data (receive/send) and no callbacks registered + udd_g_ctrlreq.payload_size = 0; + 136e: 10 92 60 24 sts 0x2460, r1 + 1372: 10 92 61 24 sts 0x2461, r1 + udd_g_ctrlreq.callback = NULL; + 1376: 10 92 62 24 sts 0x2462, r1 + 137a: 10 92 63 24 sts 0x2463, r1 + udd_g_ctrlreq.over_under_run = NULL; + 137e: 10 92 64 24 sts 0x2464, r1 + 1382: 10 92 65 24 sts 0x2465, r1 + + if (Udd_setup_is_in()) { + 1386: 20 91 56 24 lds r18, 0x2456 + 138a: 22 23 and r18, r18 + 138c: 3c f4 brge .+14 ; 0x139c + if (udd_g_ctrlreq.req.wLength == 0) { + 138e: 80 91 5c 24 lds r24, 0x245C + 1392: 90 91 5d 24 lds r25, 0x245D + 1396: 89 2b or r24, r25 + 1398: 09 f4 brne .+2 ; 0x139c + 139a: 9b c3 rjmp .+1846 ; 0x1ad2 + return false; // Error from USB host + } + } + + if (Udd_setup_type() == USB_REQ_TYPE_VENDOR){ + 139c: 20 76 andi r18, 0x60 ; 96 + 139e: 20 34 cpi r18, 0x40 ; 64 + 13a0: 09 f0 breq .+2 ; 0x13a4 + 13a2: 08 c1 rjmp .+528 ; 0x15b4 + } + return false; +} + +static bool udc_reqvend(void){ + switch (udd_g_ctrlreq.req.bRequest){ + 13a4: 80 91 57 24 lds r24, 0x2457 + 13a8: 90 e0 ldi r25, 0x00 ; 0 + 13aa: fc 01 movw r30, r24 + 13ac: e0 5a subi r30, 0xA0 ; 160 + 13ae: f1 09 sbc r31, r1 + 13b0: e8 30 cpi r30, 0x08 ; 8 + 13b2: f1 05 cpc r31, r1 + 13b4: 08 f0 brcs .+2 ; 0x13b8 + 13b6: f5 c0 rjmp .+490 ; 0x15a2 + 13b8: ea 5f subi r30, 0xFA ; 250 + 13ba: fe 4f sbci r31, 0xFE ; 254 + 13bc: 0c 94 35 14 jmp 0x286a ; 0x286a <__tablejump2__> + case 0xa0: //Break! (Debug command) + asm("nop"); + 13c0: 00 00 nop + 13c2: 8b c3 rjmp .+1814 ; 0x1ada + return 1; + case 0xa1: //Receive waveform for signal gen + TC_DAC.CTRLA = 0x00; + 13c4: e0 e0 ldi r30, 0x00 ; 0 + 13c6: f8 e0 ldi r31, 0x08 ; 8 + 13c8: 10 82 st Z, r1 + TC_DAC.PERBUF = udd_g_ctrlreq.req.wValue; + 13ca: 80 91 58 24 lds r24, 0x2458 + 13ce: 90 91 59 24 lds r25, 0x2459 + 13d2: 86 ab std Z+54, r24 ; 0x36 + 13d4: 97 ab std Z+55, r25 ; 0x37 + TC_DAC.CTRLA = (unsigned char) udd_g_ctrlreq.req.wIndex & 0x0F; + 13d6: 80 91 5a 24 lds r24, 0x245A + 13da: 8f 70 andi r24, 0x0F ; 15 + 13dc: 80 83 st Z, r24 + udd_set_setup_payload(dacBuf_CH1, udd_g_ctrlreq.req.wLength); + 13de: cc e5 ldi r28, 0x5C ; 92 + 13e0: d4 e2 ldi r29, 0x24 ; 36 + 13e2: 68 81 ld r22, Y + 13e4: 79 81 ldd r23, Y+1 ; 0x01 + 13e6: 86 e5 ldi r24, 0x56 ; 86 + 13e8: 92 e2 ldi r25, 0x22 ; 34 + 13ea: e0 d6 rcall .+3520 ; 0x21ac + if(dacBuf_len != udd_g_ctrlreq.req.wLength){ + 13ec: 88 81 ld r24, Y + 13ee: 99 81 ldd r25, Y+1 ; 0x01 + 13f0: 20 91 04 20 lds r18, 0x2004 + 13f4: 30 91 05 20 lds r19, 0x2005 + 13f8: 82 17 cp r24, r18 + 13fa: 93 07 cpc r25, r19 + 13fc: 09 f4 brne .+2 ; 0x1400 + 13fe: 6d c3 rjmp .+1754 ; 0x1ada + dacBuf_len = udd_g_ctrlreq.req.wLength; + 1400: 80 93 04 20 sts 0x2004, r24 + 1404: 90 93 05 20 sts 0x2005, r25 + switch(global_mode){ + 1408: 80 91 00 20 lds r24, 0x2000 + 140c: 90 e0 ldi r25, 0x00 ; 0 + 140e: 88 30 cpi r24, 0x08 ; 8 + 1410: 91 05 cpc r25, r1 + 1412: 08 f0 brcs .+2 ; 0x1416 + 1414: c8 c0 rjmp .+400 ; 0x15a6 + 1416: fc 01 movw r30, r24 + 1418: e2 5f subi r30, 0xF2 ; 242 + 141a: fe 4f sbci r31, 0xFE ; 254 + 141c: 0c 94 35 14 jmp 0x286a ; 0x286a <__tablejump2__> + case 0: + tiny_dma_set_mode_0(); + 1420: 46 d8 rcall .-3956 ; 0x4ae + 1422: 5b c3 rjmp .+1718 ; 0x1ada + break; + case 1: + tiny_dma_set_mode_1(); + 1424: bd d8 rcall .-3718 ; 0x5a0 + 1426: 59 c3 rjmp .+1714 ; 0x1ada + break; + case 2: + tiny_dma_set_mode_2(); + 1428: 60 d9 rcall .-3392 ; 0x6ea + 142a: 57 c3 rjmp .+1710 ; 0x1ada + break; + case 3: + tiny_dma_set_mode_3(); + 142c: 00 da rcall .-3072 ; 0x82e + 142e: 55 c3 rjmp .+1706 ; 0x1ada + break; + case 4: + tiny_dma_set_mode_4(); + 1430: 95 da rcall .-2774 ; 0x95c + 1432: 53 c3 rjmp .+1702 ; 0x1ada + break; + case 5: + tiny_dma_set_mode_5(); + 1434: 53 db rcall .-2394 ; 0xadc + 1436: 51 c3 rjmp .+1698 ; 0x1ada + break; + case 6: + tiny_dma_set_mode_6(); + 1438: 98 db rcall .-2256 ; 0xb6a + 143a: 4f c3 rjmp .+1694 ; 0x1ada + break; + case 7: + tiny_dma_set_mode_7(); + 143c: 0e dc rcall .-2020 ; 0xc5a + 143e: 4d c3 rjmp .+1690 ; 0x1ada + break; + } + } + return 1; + case 0xa2: //CH2 waveform + TC_AUXDAC.CTRLA = 0x00; + 1440: e0 e4 ldi r30, 0x40 ; 64 + 1442: f8 e0 ldi r31, 0x08 ; 8 + 1444: 10 82 st Z, r1 + auxDacBufLen = udd_g_ctrlreq.req.wLength; + 1446: cc e5 ldi r28, 0x5C ; 92 + 1448: d4 e2 ldi r29, 0x24 ; 36 + 144a: 68 81 ld r22, Y + 144c: 79 81 ldd r23, Y+1 ; 0x01 + 144e: 60 93 02 20 sts 0x2002, r22 + 1452: 70 93 03 20 sts 0x2003, r23 + TC_AUXDAC.PERBUF = udd_g_ctrlreq.req.wValue; + 1456: 80 91 58 24 lds r24, 0x2458 + 145a: 90 91 59 24 lds r25, 0x2459 + 145e: 86 ab std Z+54, r24 ; 0x36 + 1460: 97 ab std Z+55, r25 ; 0x37 + TC_AUXDAC.CTRLA = (unsigned char) udd_g_ctrlreq.req.wIndex & 0x0F; + 1462: 80 91 5a 24 lds r24, 0x245A + 1466: 8f 70 andi r24, 0x0F ; 15 + 1468: 80 83 st Z, r24 + udd_set_setup_payload(dacBuf_CH2, udd_g_ctrlreq.req.wLength); + 146a: 86 e6 ldi r24, 0x66 ; 102 + 146c: 94 e2 ldi r25, 0x24 ; 36 + 146e: 9e d6 rcall .+3388 ; 0x21ac + if(dacBuf_len != udd_g_ctrlreq.req.wLength){ + 1470: 88 81 ld r24, Y + 1472: 99 81 ldd r25, Y+1 ; 0x01 + 1474: 20 91 04 20 lds r18, 0x2004 + 1478: 30 91 05 20 lds r19, 0x2005 + 147c: 82 17 cp r24, r18 + 147e: 93 07 cpc r25, r19 + 1480: 09 f4 brne .+2 ; 0x1484 + 1482: 2b c3 rjmp .+1622 ; 0x1ada + dacBuf_len = udd_g_ctrlreq.req.wLength; + 1484: 80 93 04 20 sts 0x2004, r24 + 1488: 90 93 05 20 sts 0x2005, r25 + switch(global_mode){ + 148c: 80 91 00 20 lds r24, 0x2000 + 1490: 90 e0 ldi r25, 0x00 ; 0 + 1492: 88 30 cpi r24, 0x08 ; 8 + 1494: 91 05 cpc r25, r1 + 1496: 08 f0 brcs .+2 ; 0x149a + 1498: 88 c0 rjmp .+272 ; 0x15aa + 149a: fc 01 movw r30, r24 + 149c: ea 5e subi r30, 0xEA ; 234 + 149e: fe 4f sbci r31, 0xFE ; 254 + 14a0: 0c 94 35 14 jmp 0x286a ; 0x286a <__tablejump2__> + case 0: + tiny_dma_set_mode_0(); + 14a4: 04 d8 rcall .-4088 ; 0x4ae + 14a6: 19 c3 rjmp .+1586 ; 0x1ada + break; + case 1: + tiny_dma_set_mode_1(); + 14a8: 7b d8 rcall .-3850 ; 0x5a0 + 14aa: 17 c3 rjmp .+1582 ; 0x1ada + break; + case 2: + tiny_dma_set_mode_2(); + 14ac: 1e d9 rcall .-3524 ; 0x6ea + 14ae: 15 c3 rjmp .+1578 ; 0x1ada + break; + case 3: + tiny_dma_set_mode_3(); + 14b0: be d9 rcall .-3204 ; 0x82e + 14b2: 13 c3 rjmp .+1574 ; 0x1ada + break; + case 4: + tiny_dma_set_mode_4(); + 14b4: 53 da rcall .-2906 ; 0x95c + 14b6: 11 c3 rjmp .+1570 ; 0x1ada + break; + case 5: + tiny_dma_set_mode_5(); + 14b8: 11 db rcall .-2526 ; 0xadc + 14ba: 0f c3 rjmp .+1566 ; 0x1ada + break; + case 6: + tiny_dma_set_mode_6(); + 14bc: 56 db rcall .-2388 ; 0xb6a + 14be: 0d c3 rjmp .+1562 ; 0x1ada + break; + case 7: + tiny_dma_set_mode_7(); + 14c0: cc db rcall .-2152 ; 0xc5a + 14c2: 0b c3 rjmp .+1558 ; 0x1ada + break; + } + } + return 1; + case 0xa3: //PSU voltage control + TC_PSU.CCA = 0; + 14c4: e0 e4 ldi r30, 0x40 ; 64 + 14c6: f9 e0 ldi r31, 0x09 ; 9 + 14c8: 10 a6 std Z+40, r1 ; 0x28 + 14ca: 11 a6 std Z+41, r1 ; 0x29 + PSU_target = udd_g_ctrlreq.req.wValue; + 14cc: 80 91 58 24 lds r24, 0x2458 + 14d0: 80 93 b2 20 sts 0x20B2, r24 + 14d4: 02 c3 rjmp .+1540 ; 0x1ada + return 1; + case 0xa4: //Triple mode + PORTB.OUT = udd_g_ctrlreq.req.wValue; + 14d6: 80 91 58 24 lds r24, 0x2458 + 14da: e0 e2 ldi r30, 0x20 ; 32 + 14dc: f6 e0 ldi r31, 0x06 ; 6 + 14de: 84 83 std Z+4, r24 ; 0x04 + 14e0: fc c2 rjmp .+1528 ; 0x1ada + return 1; + case 0xa5: //Control Gain and Scope modes + switch(udd_g_ctrlreq.req.wValue){ + 14e2: 80 91 58 24 lds r24, 0x2458 + 14e6: 90 91 59 24 lds r25, 0x2459 + 14ea: 88 30 cpi r24, 0x08 ; 8 + 14ec: 91 05 cpc r25, r1 + 14ee: 08 f0 brcs .+2 ; 0x14f2 + 14f0: 5e c0 rjmp .+188 ; 0x15ae + 14f2: fc 01 movw r30, r24 + 14f4: e2 5e subi r30, 0xE2 ; 226 + 14f6: fe 4f sbci r31, 0xFE ; 254 + 14f8: 0c 94 35 14 jmp 0x286a ; 0x286a <__tablejump2__> + case 0: //Mode 0 + tiny_adc_setup(0, 0); + 14fc: 60 e0 ldi r22, 0x00 ; 0 + 14fe: 80 e0 ldi r24, 0x00 ; 0 + 1500: 0e 94 e7 01 call 0x3ce ; 0x3ce + tiny_adc_ch0setup(udd_g_ctrlreq.req.wIndex); + 1504: 80 91 5a 24 lds r24, 0x245A + 1508: 0e 94 bb 01 call 0x376 ; 0x376 + tiny_dma_set_mode_0(); + 150c: 0e 94 57 02 call 0x4ae ; 0x4ae + 1510: e4 c2 rjmp .+1480 ; 0x1ada + break; + case 1: //Mode 1 + tiny_adc_setup(0, 0); + 1512: 60 e0 ldi r22, 0x00 ; 0 + 1514: 80 e0 ldi r24, 0x00 ; 0 + 1516: 0e 94 e7 01 call 0x3ce ; 0x3ce + tiny_adc_ch0setup(udd_g_ctrlreq.req.wIndex); + 151a: 80 91 5a 24 lds r24, 0x245A + 151e: 0e 94 bb 01 call 0x376 ; 0x376 + tiny_dma_set_mode_1(); + 1522: 3e d8 rcall .-3972 ; 0x5a0 + 1524: da c2 rjmp .+1460 ; 0x1ada + break; + case 2: //Mode 2 + tiny_adc_setup(1, 1); + 1526: 61 e0 ldi r22, 0x01 ; 1 + 1528: 81 e0 ldi r24, 0x01 ; 1 + 152a: 0e 94 e7 01 call 0x3ce ; 0x3ce + tiny_adc_ch0setup(udd_g_ctrlreq.req.wIndex); + 152e: ca e5 ldi r28, 0x5A ; 90 + 1530: d4 e2 ldi r29, 0x24 ; 36 + 1532: 88 81 ld r24, Y + 1534: 0e 94 bb 01 call 0x376 ; 0x376 + tiny_adc_ch1setup(udd_g_ctrlreq.req.wIndex>>8); + 1538: 89 81 ldd r24, Y+1 ; 0x01 + 153a: 0e 94 ca 01 call 0x394 ; 0x394 + tiny_dma_set_mode_2(); + 153e: d5 d8 rcall .-3670 ; 0x6ea + 1540: cc c2 rjmp .+1432 ; 0x1ada + break; + case 3: //Mode 3 + tiny_dma_set_mode_3(); + 1542: 75 d9 rcall .-3350 ; 0x82e + 1544: ca c2 rjmp .+1428 ; 0x1ada + break; + case 4: //Mode 4 + tiny_dma_set_mode_4(); + 1546: 0a da rcall .-3052 ; 0x95c + 1548: c8 c2 rjmp .+1424 ; 0x1ada + break; + case 5: //Mode 5 + tiny_adc_setup(0, 0); + 154a: 60 e0 ldi r22, 0x00 ; 0 + 154c: 80 e0 ldi r24, 0x00 ; 0 + 154e: 0e 94 e7 01 call 0x3ce ; 0x3ce + tiny_adc_ch0setup(udd_g_ctrlreq.req.wIndex); + 1552: 80 91 5a 24 lds r24, 0x245A + 1556: 0e 94 bb 01 call 0x376 ; 0x376 + tiny_dma_set_mode_5(); + 155a: c0 da rcall .-2688 ; 0xadc + 155c: be c2 rjmp .+1404 ; 0x1ada + break; + case 6: //Mode 6 + tiny_adc_setup(0, 1); + 155e: 61 e0 ldi r22, 0x01 ; 1 + 1560: 80 e0 ldi r24, 0x00 ; 0 + 1562: 0e 94 e7 01 call 0x3ce ; 0x3ce + tiny_adc_ch0setup(udd_g_ctrlreq.req.wIndex); + 1566: 80 91 5a 24 lds r24, 0x245A + 156a: 0e 94 bb 01 call 0x376 ; 0x376 + tiny_dma_set_mode_6(); + 156e: fd da rcall .-2566 ; 0xb6a + 1570: b4 c2 rjmp .+1384 ; 0x1ada + break; + case 7: //Mode 7 + tiny_adc_setup(0, 2); + 1572: 62 e0 ldi r22, 0x02 ; 2 + 1574: 80 e0 ldi r24, 0x00 ; 0 + 1576: 0e 94 e7 01 call 0x3ce ; 0x3ce + tiny_adc_ch0setup(udd_g_ctrlreq.req.wIndex | 0x80); + 157a: 80 91 5a 24 lds r24, 0x245A + 157e: 80 68 ori r24, 0x80 ; 128 + 1580: 0e 94 bb 01 call 0x376 ; 0x376 + tiny_dma_set_mode_7(); + 1584: 6a db rcall .-2348 ; 0xc5a + 1586: a9 c2 rjmp .+1362 ; 0x1ada + default: + return 0; + } + return 1; + case 0xa6: //Digital out??? + PORTE.OUT = udd_g_ctrlreq.req.wValue; + 1588: 80 91 58 24 lds r24, 0x2458 + 158c: e0 e8 ldi r30, 0x80 ; 128 + 158e: f6 e0 ldi r31, 0x06 ; 6 + 1590: 84 83 std Z+4, r24 ; 0x04 + 1592: a3 c2 rjmp .+1350 ; 0x1ada + case 0xa7: //Soft Reset + + //Code here from SprinterSB + //http://www.avrfreaks.net/comment/872674 + //I don't understand it, but it seems to do the job + __asm volatile ("cli" "\n\t" + 1594: e9 e7 ldi r30, 0x79 ; 121 + 1596: f0 e0 ldi r31, 0x00 ; 0 + 1598: 91 e0 ldi r25, 0x01 ; 1 + 159a: 88 ed ldi r24, 0xD8 ; 216 + 159c: f8 94 cli + 159e: 84 bf out 0x34, r24 ; 52 + 15a0: 90 83 st Z, r25 + [swrst] "r" ((uint8_t) RST_SWRST_bm), + [rst] "e" (&RST.CTRL) + : "memory"); + __builtin_unreachable(); + default: + return 0; + 15a2: 00 e0 ldi r16, 0x00 ; 0 + 15a4: 05 c0 rjmp .+10 ; 0x15b0 + case 7: + tiny_dma_set_mode_7(); + break; + } + } + return 1; + 15a6: 01 e0 ldi r16, 0x01 ; 1 + 15a8: 03 c0 rjmp .+6 ; 0x15b0 + case 7: + tiny_dma_set_mode_7(); + break; + } + } + return 1; + 15aa: 01 e0 ldi r16, 0x01 ; 1 + 15ac: 01 c0 rjmp .+2 ; 0x15b0 + tiny_adc_setup(0, 2); + tiny_adc_ch0setup(udd_g_ctrlreq.req.wIndex | 0x80); + tiny_dma_set_mode_7(); + break; + default: + return 0; + 15ae: 00 e0 ldi r16, 0x00 ; 0 + return false; // Error from USB host + } + } + + if (Udd_setup_type() == USB_REQ_TYPE_VENDOR){ + if (udc_reqvend()) { + 15b0: 01 11 cpse r16, r1 + 15b2: 94 c2 rjmp .+1320 ; 0x1adc + return true; + } + } + + // If standard request then try to decode it in UDC + if (Udd_setup_type() == USB_REQ_TYPE_STANDARD) { + 15b4: 20 91 56 24 lds r18, 0x2456 + 15b8: 82 2f mov r24, r18 + 15ba: 80 76 andi r24, 0x60 ; 96 + 15bc: 09 f0 breq .+2 ; 0x15c0 + 15be: 0e c2 rjmp .+1052 ; 0x19dc + * + * \return true if the request is supported + */ +static bool udc_reqstd(void) +{ + if (Udd_setup_is_in()) { + 15c0: 22 23 and r18, r18 + 15c2: 0c f0 brlt .+2 ; 0x15c6 + 15c4: 17 c1 rjmp .+558 ; 0x17f4 + // GET Standard Requests + if (udd_g_ctrlreq.req.wLength == 0) { + 15c6: 80 91 5c 24 lds r24, 0x245C + 15ca: 90 91 5d 24 lds r25, 0x245D + 15ce: 00 97 sbiw r24, 0x00 ; 0 + 15d0: 09 f4 brne .+2 ; 0x15d4 + 15d2: 04 c2 rjmp .+1032 ; 0x19dc + return false; // Error for USB host + } + + if (USB_REQ_RECIP_DEVICE == Udd_setup_recipient()) { + 15d4: 2f 71 andi r18, 0x1F ; 31 + 15d6: 09 f0 breq .+2 ; 0x15da + 15d8: b1 c0 rjmp .+354 ; 0x173c + // Standard Get Device request + switch (udd_g_ctrlreq.req.bRequest) { + 15da: 30 91 57 24 lds r19, 0x2457 + 15de: 36 30 cpi r19, 0x06 ; 6 + 15e0: 81 f0 breq .+32 ; 0x1602 + 15e2: 38 30 cpi r19, 0x08 ; 8 + 15e4: 09 f4 brne .+2 ; 0x15e8 + 15e6: 9f c0 rjmp .+318 ; 0x1726 + 15e8: 31 11 cpse r19, r1 + 15ea: a8 c0 rjmp .+336 ; 0x173c + * + * \return true if success + */ +static bool udc_req_std_dev_get_status(void) +{ + if (udd_g_ctrlreq.req.wLength != sizeof(udc_device_status)) { + 15ec: 02 97 sbiw r24, 0x02 ; 2 + 15ee: 39 f4 brne .+14 ; 0x15fe + return false; + } + + udd_set_setup_payload( (uint8_t *) & udc_device_status, + 15f0: 62 e0 ldi r22, 0x02 ; 2 + 15f2: 70 e0 ldi r23, 0x00 ; 0 + 15f4: 82 ec ldi r24, 0xC2 ; 194 + 15f6: 90 e2 ldi r25, 0x20 ; 32 + 15f8: d9 d5 rcall .+2994 ; 0x21ac + sizeof(udc_device_status)); + return true; + 15fa: 01 e0 ldi r16, 0x01 ; 1 + 15fc: ed c1 rjmp .+986 ; 0x19d8 + * \return true if success + */ +static bool udc_req_std_dev_get_status(void) +{ + if (udd_g_ctrlreq.req.wLength != sizeof(udc_device_status)) { + return false; + 15fe: 00 e0 ldi r16, 0x00 ; 0 + 1600: eb c1 rjmp .+982 ; 0x19d8 + */ +static bool udc_req_std_dev_get_descriptor(void) +{ + uint8_t conf_num; + + conf_num = udd_g_ctrlreq.req.wValue & 0xff; + 1602: 20 91 58 24 lds r18, 0x2458 + 1606: 30 91 59 24 lds r19, 0x2459 + + // Check descriptor ID + switch ((uint8_t) (udd_g_ctrlreq.req.wValue >> 8)) { + 160a: 83 2f mov r24, r19 + 160c: 99 27 eor r25, r25 + 160e: 82 30 cpi r24, 0x02 ; 2 + 1610: 91 05 cpc r25, r1 + 1612: 99 f0 breq .+38 ; 0x163a + 1614: 1c f4 brge .+6 ; 0x161c + 1616: 01 97 sbiw r24, 0x01 ; 1 + 1618: 39 f0 breq .+14 ; 0x1628 + 161a: 7b c0 rjmp .+246 ; 0x1712 + 161c: 83 30 cpi r24, 0x03 ; 3 + 161e: 91 05 cpc r25, r1 + 1620: d9 f1 breq .+118 ; 0x1698 + 1622: 0f 97 sbiw r24, 0x0f ; 15 + 1624: 59 f1 breq .+86 ; 0x167c + 1626: 75 c0 rjmp .+234 ; 0x1712 + } else +#endif + { + udd_set_setup_payload( + (uint8_t *) udc_config.confdev_lsfs, + udc_config.confdev_lsfs->bLength); + 1628: 80 91 10 20 lds r24, 0x2010 + 162c: 90 91 11 20 lds r25, 0x2011 + (uint8_t *) udc_config.confdev_hs, + udc_config.confdev_hs->bLength); + } else +#endif + { + udd_set_setup_payload( + 1630: dc 01 movw r26, r24 + 1632: 6c 91 ld r22, X + 1634: 70 e0 ldi r23, 0x00 ; 0 + 1636: ba d5 rcall .+2932 ; 0x21ac + 1638: 5b c0 rjmp .+182 ; 0x16f0 + le16_to_cpu(udc_config.conf_hs[conf_num].desc->wTotalLength)); + } else +#endif + { + // FS descriptor + if (conf_num >= udc_config.confdev_lsfs-> + 163a: e0 91 10 20 lds r30, 0x2010 + 163e: f0 91 11 20 lds r31, 0x2011 + 1642: 81 89 ldd r24, Z+17 ; 0x11 + 1644: 28 17 cp r18, r24 + 1646: 08 f0 brcs .+2 ; 0x164a + 1648: 66 c0 rjmp .+204 ; 0x1716 + bNumConfigurations) { + return false; + } + udd_set_setup_payload( + (uint8_t *)udc_config.conf_lsfs[conf_num].desc, + le16_to_cpu(udc_config.conf_lsfs[conf_num].desc->wTotalLength)); + 164a: c9 01 movw r24, r18 + 164c: 99 27 eor r25, r25 + 164e: 88 0f add r24, r24 + 1650: 99 1f adc r25, r25 + 1652: 88 0f add r24, r24 + 1654: 99 1f adc r25, r25 + 1656: e0 91 12 20 lds r30, 0x2012 + 165a: f0 91 13 20 lds r31, 0x2013 + 165e: e8 0f add r30, r24 + 1660: f9 1f adc r31, r25 + 1662: 80 81 ld r24, Z + 1664: 91 81 ldd r25, Z+1 ; 0x01 + // FS descriptor + if (conf_num >= udc_config.confdev_lsfs-> + bNumConfigurations) { + return false; + } + udd_set_setup_payload( + 1666: fc 01 movw r30, r24 + 1668: 62 81 ldd r22, Z+2 ; 0x02 + 166a: 73 81 ldd r23, Z+3 ; 0x03 + 166c: 9f d5 rcall .+2878 ; 0x21ac + (uint8_t *)udc_config.conf_lsfs[conf_num].desc, + le16_to_cpu(udc_config.conf_lsfs[conf_num].desc->wTotalLength)); + } + ((usb_conf_desc_t *) udd_g_ctrlreq.payload)->bDescriptorType = + 166e: e0 91 5e 24 lds r30, 0x245E + 1672: f0 91 5f 24 lds r31, 0x245F + 1676: 82 e0 ldi r24, 0x02 ; 2 + 1678: 81 83 std Z+1, r24 ; 0x01 + 167a: 3a c0 rjmp .+116 ; 0x16f0 + break; +#endif + + case USB_DT_BOS: + // Device BOS descriptor requested + if (udc_config.conf_bos == NULL) { + 167c: 80 91 14 20 lds r24, 0x2014 + 1680: 90 91 15 20 lds r25, 0x2015 + 1684: 00 97 sbiw r24, 0x00 ; 0 + 1686: 09 f4 brne .+2 ; 0x168a + 1688: 48 c0 rjmp .+144 ; 0x171a + return false; + } + udd_set_setup_payload( (uint8_t *) udc_config.conf_bos, + 168a: dc 01 movw r26, r24 + 168c: 12 96 adiw r26, 0x02 ; 2 + 168e: 6d 91 ld r22, X+ + 1690: 7c 91 ld r23, X + 1692: 13 97 sbiw r26, 0x03 ; 3 + 1694: 8b d5 rcall .+2838 ; 0x21ac + 1696: 2c c0 rjmp .+88 ; 0x16f0 + uint8_t i; + const uint8_t *str; + uint8_t str_length = 0; + + // Link payload pointer to the string corresponding at request + switch (udd_g_ctrlreq.req.wValue & 0xff) { + 1698: 33 27 eor r19, r19 + 169a: 21 30 cpi r18, 0x01 ; 1 + 169c: 31 05 cpc r19, r1 + 169e: 59 f0 breq .+22 ; 0x16b6 + 16a0: 20 f0 brcs .+8 ; 0x16aa + 16a2: 22 30 cpi r18, 0x02 ; 2 + 16a4: 31 05 cpc r19, r1 + 16a6: 59 f0 breq .+22 ; 0x16be + 16a8: 3a c0 rjmp .+116 ; 0x171e + case 0: + udd_set_setup_payload((uint8_t *) &udc_string_desc_languageid, + 16aa: 64 e0 ldi r22, 0x04 ; 4 + 16ac: 70 e0 ldi r23, 0x00 ; 0 + 16ae: 8e ea ldi r24, 0xAE ; 174 + 16b0: 90 e2 ldi r25, 0x20 ; 32 + 16b2: 7c d5 rcall .+2808 ; 0x21ac + 16b4: 1d c0 rjmp .+58 ; 0x16f0 + break; + +#ifdef USB_DEVICE_MANUFACTURE_NAME + case 1: + str_length = USB_DEVICE_MANUFACTURE_NAME_SIZE; + str = udc_string_manufacturer_name; + 16b6: 83 ea ldi r24, 0xA3 ; 163 + 16b8: 90 e2 ldi r25, 0x20 ; 32 + sizeof(udc_string_desc_languageid)); + break; + +#ifdef USB_DEVICE_MANUFACTURE_NAME + case 1: + str_length = USB_DEVICE_MANUFACTURE_NAME_SIZE; + 16ba: 29 e0 ldi r18, 0x09 ; 9 + 16bc: 03 c0 rjmp .+6 ; 0x16c4 + break; +#endif +#ifdef USB_DEVICE_PRODUCT_NAME + case 2: + str_length = USB_DEVICE_PRODUCT_NAME_SIZE; + str = udc_string_product_name; + 16be: 8a e8 ldi r24, 0x8A ; 138 + 16c0: 90 e2 ldi r25, 0x20 ; 32 + str = udc_string_manufacturer_name; + break; +#endif +#ifdef USB_DEVICE_PRODUCT_NAME + case 2: + str_length = USB_DEVICE_PRODUCT_NAME_SIZE; + 16c2: 28 e1 ldi r18, 0x18 ; 24 + 16c4: 38 2f mov r19, r24 + 16c6: aa e5 ldi r26, 0x5A ; 90 + 16c8: b0 e2 ldi r27, 0x20 ; 32 + 16ca: e8 2f mov r30, r24 + 16cc: f9 2f mov r31, r25 + return false; + } + + if (str_length) { + for(i = 0; i < str_length; i++) { + udc_string_desc.string[i] = cpu_to_le16((le16_t)str[i]); + 16ce: 81 91 ld r24, Z+ + 16d0: 90 e0 ldi r25, 0x00 ; 0 + 16d2: 8d 93 st X+, r24 + 16d4: 9d 93 st X+, r25 + 16d6: 8e 2f mov r24, r30 + 16d8: 83 1b sub r24, r19 +#endif + return false; + } + + if (str_length) { + for(i = 0; i < str_length; i++) { + 16da: 82 17 cp r24, r18 + 16dc: c0 f3 brcs .-16 ; 0x16ce + udc_string_desc.string[i] = cpu_to_le16((le16_t)str[i]); + } + + udc_string_desc.header.bLength = 2 + (str_length) * 2; + 16de: 22 0f add r18, r18 + 16e0: 62 e0 ldi r22, 0x02 ; 2 + 16e2: 62 0f add r22, r18 + 16e4: 60 93 58 20 sts 0x2058, r22 + udd_set_setup_payload( + 16e8: 70 e0 ldi r23, 0x00 ; 0 + 16ea: 88 e5 ldi r24, 0x58 ; 88 + 16ec: 90 e2 ldi r25, 0x20 ; 32 + 16ee: 5e d5 rcall .+2748 ; 0x21ac + default: + // Unknown descriptor requested + return false; + } + // if the descriptor is larger than length requested, then reduce it + if (udd_g_ctrlreq.req.wLength < udd_g_ctrlreq.payload_size) { + 16f0: 80 91 5c 24 lds r24, 0x245C + 16f4: 90 91 5d 24 lds r25, 0x245D + 16f8: 20 91 60 24 lds r18, 0x2460 + 16fc: 30 91 61 24 lds r19, 0x2461 + 1700: 82 17 cp r24, r18 + 1702: 93 07 cpc r25, r19 + 1704: 70 f4 brcc .+28 ; 0x1722 + udd_g_ctrlreq.payload_size = udd_g_ctrlreq.req.wLength; + 1706: 80 93 60 24 sts 0x2460, r24 + 170a: 90 93 61 24 sts 0x2461, r25 + } + return true; + 170e: 01 e0 ldi r16, 0x01 ; 1 + 1710: 63 c1 rjmp .+710 ; 0x19d8 + } + break; + + default: + // Unknown descriptor requested + return false; + 1712: 00 e0 ldi r16, 0x00 ; 0 + 1714: 61 c1 rjmp .+706 ; 0x19d8 +#endif + { + // FS descriptor + if (conf_num >= udc_config.confdev_lsfs-> + bNumConfigurations) { + return false; + 1716: 00 e0 ldi r16, 0x00 ; 0 + 1718: 5f c1 rjmp .+702 ; 0x19d8 +#endif + + case USB_DT_BOS: + // Device BOS descriptor requested + if (udc_config.conf_bos == NULL) { + return false; + 171a: 00 e0 ldi r16, 0x00 ; 0 + 171c: 5d c1 rjmp .+698 ; 0x19d8 + break; + + case USB_DT_STRING: + // String descriptor requested + if (!udc_req_std_dev_get_str_desc()) { + return false; + 171e: 00 e0 ldi r16, 0x00 ; 0 + 1720: 5b c1 rjmp .+694 ; 0x19d8 + } + // if the descriptor is larger than length requested, then reduce it + if (udd_g_ctrlreq.req.wLength < udd_g_ctrlreq.payload_size) { + udd_g_ctrlreq.payload_size = udd_g_ctrlreq.req.wLength; + } + return true; + 1722: 01 e0 ldi r16, 0x01 ; 1 + 1724: 59 c1 rjmp .+690 ; 0x19d8 + * + * \return true if success + */ +static bool udc_req_std_dev_get_configuration(void) +{ + if (udd_g_ctrlreq.req.wLength != 1) { + 1726: 01 97 sbiw r24, 0x01 ; 1 + 1728: 39 f4 brne .+14 ; 0x1738 + return false; + } + + udd_set_setup_payload(&udc_num_configuration,1); + 172a: 61 e0 ldi r22, 0x01 ; 1 + 172c: 70 e0 ldi r23, 0x00 ; 0 + 172e: 8e eb ldi r24, 0xBE ; 190 + 1730: 90 e2 ldi r25, 0x20 ; 32 + 1732: 3c d5 rcall .+2680 ; 0x21ac + return true; + 1734: 01 e0 ldi r16, 0x01 ; 1 + 1736: 50 c1 rjmp .+672 ; 0x19d8 + * \return true if success + */ +static bool udc_req_std_dev_get_configuration(void) +{ + if (udd_g_ctrlreq.req.wLength != 1) { + return false; + 1738: 00 e0 ldi r16, 0x00 ; 0 + 173a: 4e c1 rjmp .+668 ; 0x19d8 + default: + break; + } + } + + if (USB_REQ_RECIP_INTERFACE == Udd_setup_recipient()) { + 173c: 21 30 cpi r18, 0x01 ; 1 + 173e: 09 f0 breq .+2 ; 0x1742 + 1740: 3f c0 rjmp .+126 ; 0x17c0 + // Standard Get Interface request + switch (udd_g_ctrlreq.req.bRequest) { + 1742: 30 91 57 24 lds r19, 0x2457 + 1746: 3a 30 cpi r19, 0x0A ; 10 + 1748: d9 f5 brne .+118 ; 0x17c0 +static bool udc_req_std_iface_get_setting(void) +{ + uint8_t iface_num; + udi_api_t UDC_DESC_STORAGE *udi_api; + + if (udd_g_ctrlreq.req.wLength != 1) { + 174a: 01 97 sbiw r24, 0x01 ; 1 + 174c: 99 f5 brne .+102 ; 0x17b4 + return false; // Error in request + } + if (!udc_num_configuration) { + 174e: 80 91 be 20 lds r24, 0x20BE + 1752: 88 23 and r24, r24 + 1754: 89 f1 breq .+98 ; 0x17b8 + return false; // The device is not is configured state yet + } + + // Check the interface number included in the request + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + 1756: c0 91 5a 24 lds r28, 0x245A + 175a: d0 91 5b 24 lds r29, 0x245B + if (iface_num >= udc_ptr_conf->desc->bNumInterfaces) { + 175e: e0 90 bb 20 lds r14, 0x20BB + 1762: f0 90 bc 20 lds r15, 0x20BC + 1766: d7 01 movw r26, r14 + 1768: ed 91 ld r30, X+ + 176a: fc 91 ld r31, X + 176c: 84 81 ldd r24, Z+4 ; 0x04 + 176e: c8 17 cp r28, r24 + 1770: 28 f5 brcc .+74 ; 0x17bc + return false; + } + + // Select first alternate setting of the interface to update udc_ptr_iface + // before call iface->getsetting() + if (!udc_update_iface_desc(iface_num, 0)) { + 1772: 60 e0 ldi r22, 0x00 ; 0 + 1774: 8c 2f mov r24, r28 + 1776: ec dc rcall .-1576 ; 0x1150 + 1778: 08 2f mov r16, r24 + 177a: 88 23 and r24, r24 + 177c: 09 f4 brne .+2 ; 0x1780 + 177e: 2c c1 rjmp .+600 ; 0x19d8 + return false; + } + // Get alternate setting from UDI + udi_api = udc_ptr_conf->udi_apis[iface_num]; + 1780: ce 01 movw r24, r28 + 1782: 99 27 eor r25, r25 + 1784: 88 0f add r24, r24 + 1786: 99 1f adc r25, r25 + 1788: d7 01 movw r26, r14 + 178a: 12 96 adiw r26, 0x02 ; 2 + 178c: ed 91 ld r30, X+ + 178e: fc 91 ld r31, X + 1790: 13 97 sbiw r26, 0x03 ; 3 + 1792: e8 0f add r30, r24 + 1794: f9 1f adc r31, r25 + udc_iface_setting = udi_api->getsetting(); + 1796: 01 90 ld r0, Z+ + 1798: f0 81 ld r31, Z + 179a: e0 2d mov r30, r0 + 179c: 06 80 ldd r0, Z+6 ; 0x06 + 179e: f7 81 ldd r31, Z+7 ; 0x07 + 17a0: e0 2d mov r30, r0 + 17a2: 09 95 icall + 17a4: 80 93 c0 20 sts 0x20C0, r24 + + // Link value to payload pointer of request + udd_set_setup_payload(&udc_iface_setting,1); + 17a8: 61 e0 ldi r22, 0x01 ; 1 + 17aa: 70 e0 ldi r23, 0x00 ; 0 + 17ac: 80 ec ldi r24, 0xC0 ; 192 + 17ae: 90 e2 ldi r25, 0x20 ; 32 + 17b0: fd d4 rcall .+2554 ; 0x21ac + 17b2: 12 c1 rjmp .+548 ; 0x19d8 +{ + uint8_t iface_num; + udi_api_t UDC_DESC_STORAGE *udi_api; + + if (udd_g_ctrlreq.req.wLength != 1) { + return false; // Error in request + 17b4: 00 e0 ldi r16, 0x00 ; 0 + 17b6: 10 c1 rjmp .+544 ; 0x19d8 + } + if (!udc_num_configuration) { + return false; // The device is not is configured state yet + 17b8: 00 e0 ldi r16, 0x00 ; 0 + 17ba: 0e c1 rjmp .+540 ; 0x19d8 + } + + // Check the interface number included in the request + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + if (iface_num >= udc_ptr_conf->desc->bNumInterfaces) { + return false; + 17bc: 00 e0 ldi r16, 0x00 ; 0 + 17be: 0c c1 rjmp .+536 ; 0x19d8 + default: + break; + } + } +#if (0!=USB_DEVICE_MAX_EP) + if (USB_REQ_RECIP_ENDPOINT == Udd_setup_recipient()) { + 17c0: 22 30 cpi r18, 0x02 ; 2 + 17c2: 09 f0 breq .+2 ; 0x17c6 + 17c4: 0b c1 rjmp .+534 ; 0x19dc + // Standard Get Endpoint request + switch (udd_g_ctrlreq.req.bRequest) { + 17c6: 20 91 57 24 lds r18, 0x2457 + 17ca: 21 11 cpse r18, r1 + 17cc: 00 c1 rjmp .+512 ; 0x19ce + */ +static bool udc_req_std_ep_get_status(void) +{ + static le16_t udc_ep_status; + + if (udd_g_ctrlreq.req.wLength != sizeof(udc_ep_status)) { + 17ce: 02 97 sbiw r24, 0x02 ; 2 + 17d0: 79 f4 brne .+30 ; 0x17f0 + return false; + } + + udc_ep_status = udd_ep_is_halted(udd_g_ctrlreq.req. + 17d2: 80 91 5a 24 lds r24, 0x245A + 17d6: 49 d5 rcall .+2706 ; 0x226a + 17d8: 90 e0 ldi r25, 0x00 ; 0 + 17da: 80 93 b7 20 sts 0x20B7, r24 + 17de: 90 93 b8 20 sts 0x20B8, r25 + wIndex & 0xFF) ? CPU_TO_LE16(USB_EP_STATUS_HALTED) : 0; + + udd_set_setup_payload( (uint8_t *) & udc_ep_status, + 17e2: 62 e0 ldi r22, 0x02 ; 2 + 17e4: 70 e0 ldi r23, 0x00 ; 0 + 17e6: 87 eb ldi r24, 0xB7 ; 183 + 17e8: 90 e2 ldi r25, 0x20 ; 32 + 17ea: e0 d4 rcall .+2496 ; 0x21ac + sizeof(udc_ep_status)); + return true; + 17ec: 01 e0 ldi r16, 0x01 ; 1 + 17ee: f4 c0 rjmp .+488 ; 0x19d8 +static bool udc_req_std_ep_get_status(void) +{ + static le16_t udc_ep_status; + + if (udd_g_ctrlreq.req.wLength != sizeof(udc_ep_status)) { + return false; + 17f0: 00 e0 ldi r16, 0x00 ; 0 + 17f2: f2 c0 rjmp .+484 ; 0x19d8 + } + } +#endif + } else { + // SET Standard Requests + if (USB_REQ_RECIP_DEVICE == Udd_setup_recipient()) { + 17f4: 2f 71 andi r18, 0x1F ; 31 + 17f6: 09 f0 breq .+2 ; 0x17fa + 17f8: 90 c0 rjmp .+288 ; 0x191a + // Standard Set Device request + switch (udd_g_ctrlreq.req.bRequest) { + 17fa: 80 91 57 24 lds r24, 0x2457 + 17fe: 83 30 cpi r24, 0x03 ; 3 + 1800: 09 f4 brne .+2 ; 0x1804 + 1802: e7 c0 rjmp .+462 ; 0x19d2 + 1804: 18 f4 brcc .+6 ; 0x180c + 1806: 81 30 cpi r24, 0x01 ; 1 + 1808: b1 f0 breq .+44 ; 0x1836 + 180a: 87 c0 rjmp .+270 ; 0x191a + 180c: 85 30 cpi r24, 0x05 ; 5 + 180e: 19 f0 breq .+6 ; 0x1816 + 1810: 89 30 cpi r24, 0x09 ; 9 + 1812: 61 f1 breq .+88 ; 0x186c + 1814: 82 c0 rjmp .+260 ; 0x191a + * + * \return true if success + */ +static bool udc_req_std_dev_set_address(void) +{ + if (udd_g_ctrlreq.req.wLength) { + 1816: 80 91 5c 24 lds r24, 0x245C + 181a: 90 91 5d 24 lds r25, 0x245D + 181e: 89 2b or r24, r25 + 1820: 41 f4 brne .+16 ; 0x1832 + return false; + } + + // The address must be changed at the end of setup request after the handshake + // then we use a callback to change address + udd_g_ctrlreq.callback = udc_valid_address; + 1822: 82 ea ldi r24, 0xA2 ; 162 + 1824: 98 e0 ldi r25, 0x08 ; 8 + 1826: 80 93 62 24 sts 0x2462, r24 + 182a: 90 93 63 24 sts 0x2463, r25 + return true; + 182e: 01 e0 ldi r16, 0x01 ; 1 + 1830: d3 c0 rjmp .+422 ; 0x19d8 + * \return true if success + */ +static bool udc_req_std_dev_set_address(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + 1832: 00 e0 ldi r16, 0x00 ; 0 + 1834: d1 c0 rjmp .+418 ; 0x19d8 + * + * \return true if success + */ +static bool udc_req_std_dev_clear_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + 1836: 80 91 5c 24 lds r24, 0x245C + 183a: 90 91 5d 24 lds r25, 0x245D + 183e: 89 2b or r24, r25 + 1840: 89 f4 brne .+34 ; 0x1864 + return false; + } + + if (udd_g_ctrlreq.req.wValue == USB_DEV_FEATURE_REMOTE_WAKEUP) { + 1842: 80 91 58 24 lds r24, 0x2458 + 1846: 90 91 59 24 lds r25, 0x2459 + 184a: 01 97 sbiw r24, 0x01 ; 1 + 184c: 69 f4 brne .+26 ; 0x1868 + udc_device_status &= CPU_TO_LE16(~(uint32_t)USB_DEV_STATUS_REMOTEWAKEUP); + 184e: 80 91 c2 20 lds r24, 0x20C2 + 1852: 90 91 c3 20 lds r25, 0x20C3 + 1856: 8d 7f andi r24, 0xFD ; 253 + 1858: 80 93 c2 20 sts 0x20C2, r24 + 185c: 90 93 c3 20 sts 0x20C3, r25 +#if (USB_CONFIG_ATTR_REMOTE_WAKEUP \ + == (USB_DEVICE_ATTR & USB_CONFIG_ATTR_REMOTE_WAKEUP)) + UDC_REMOTEWAKEUP_DISABLE(); +#endif + return true; + 1860: 01 e0 ldi r16, 0x01 ; 1 + 1862: ba c0 rjmp .+372 ; 0x19d8 + * \return true if success + */ +static bool udc_req_std_dev_clear_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + 1864: 00 e0 ldi r16, 0x00 ; 0 + 1866: b8 c0 rjmp .+368 ; 0x19d8 + == (USB_DEVICE_ATTR & USB_CONFIG_ATTR_REMOTE_WAKEUP)) + UDC_REMOTEWAKEUP_DISABLE(); +#endif + return true; + } + return false; + 1868: 00 e0 ldi r16, 0x00 ; 0 + 186a: b6 c0 rjmp .+364 ; 0x19d8 +static bool udc_req_std_dev_set_configuration(void) +{ + uint8_t iface_num; + + // Check request length + if (udd_g_ctrlreq.req.wLength) { + 186c: 80 91 5c 24 lds r24, 0x245C + 1870: 90 91 5d 24 lds r25, 0x245D + 1874: 89 2b or r24, r25 + 1876: 09 f0 breq .+2 ; 0x187a + 1878: 46 c0 rjmp .+140 ; 0x1906 + return false; + } + // Authorize configuration only if the address is valid + if (!udd_getaddress()) { + 187a: 95 d4 rcall .+2346 ; 0x21a6 + 187c: 88 23 and r24, r24 + 187e: 09 f4 brne .+2 ; 0x1882 + 1880: 44 c0 rjmp .+136 ; 0x190a + } + } else +#endif + { + // FS descriptor + if ((udd_g_ctrlreq.req.wValue & 0xFF) > + 1882: 20 91 58 24 lds r18, 0x2458 + 1886: 30 91 59 24 lds r19, 0x2459 + 188a: 33 27 eor r19, r19 + udc_config.confdev_lsfs->bNumConfigurations) { + 188c: e0 91 10 20 lds r30, 0x2010 + 1890: f0 91 11 20 lds r31, 0x2011 + } + } else +#endif + { + // FS descriptor + if ((udd_g_ctrlreq.req.wValue & 0xFF) > + 1894: 81 89 ldd r24, Z+17 ; 0x11 + 1896: 90 e0 ldi r25, 0x00 ; 0 + 1898: 82 17 cp r24, r18 + 189a: 93 07 cpc r25, r19 + 189c: c0 f1 brcs .+112 ; 0x190e + return false; + } + } + + // Reset current configuration + udc_reset(); + 189e: 0d dd rcall .-1510 ; 0x12ba + + // Enable new configuration + udc_num_configuration = udd_g_ctrlreq.req.wValue & 0xFF; + 18a0: 80 91 58 24 lds r24, 0x2458 + 18a4: 90 91 59 24 lds r25, 0x2459 + 18a8: 80 93 be 20 sts 0x20BE, r24 + if (udc_num_configuration == 0) { + 18ac: 88 23 and r24, r24 + 18ae: 89 f1 breq .+98 ; 0x1912 + udc_ptr_conf = &udc_config.conf_hs[udc_num_configuration - 1]; + } else +#endif + { + // FS descriptor + udc_ptr_conf = &udc_config.conf_lsfs[udc_num_configuration - 1]; + 18b0: 99 27 eor r25, r25 + 18b2: 81 50 subi r24, 0x01 ; 1 + 18b4: 90 4c sbci r25, 0xC0 ; 192 + 18b6: 88 0f add r24, r24 + 18b8: 99 1f adc r25, r25 + 18ba: 88 0f add r24, r24 + 18bc: 99 1f adc r25, r25 + 18be: e0 91 12 20 lds r30, 0x2012 + 18c2: f0 91 13 20 lds r31, 0x2013 + 18c6: e8 0f add r30, r24 + 18c8: f9 1f adc r31, r25 + 18ca: e0 93 bb 20 sts 0x20BB, r30 + 18ce: f0 93 bc 20 sts 0x20BC, r31 + } + // Enable all interfaces of the selected configuration + for (iface_num = 0; iface_num < udc_ptr_conf->desc->bNumInterfaces; + 18d2: 01 90 ld r0, Z+ + 18d4: f0 81 ld r31, Z + 18d6: e0 2d mov r30, r0 + 18d8: 84 81 ldd r24, Z+4 ; 0x04 + 18da: 88 23 and r24, r24 + 18dc: e1 f0 breq .+56 ; 0x1916 + 18de: c0 e0 ldi r28, 0x00 ; 0 + iface_num++) { + if (!udc_iface_enable(iface_num, 0)) { + 18e0: 60 e0 ldi r22, 0x00 ; 0 + 18e2: 8c 2f mov r24, r28 + 18e4: b1 dc rcall .-1694 ; 0x1248 + 18e6: 08 2f mov r16, r24 + 18e8: 88 23 and r24, r24 + 18ea: 09 f4 brne .+2 ; 0x18ee + 18ec: 75 c0 rjmp .+234 ; 0x19d8 + // FS descriptor + udc_ptr_conf = &udc_config.conf_lsfs[udc_num_configuration - 1]; + } + // Enable all interfaces of the selected configuration + for (iface_num = 0; iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + 18ee: cf 5f subi r28, 0xFF ; 255 + { + // FS descriptor + udc_ptr_conf = &udc_config.conf_lsfs[udc_num_configuration - 1]; + } + // Enable all interfaces of the selected configuration + for (iface_num = 0; iface_num < udc_ptr_conf->desc->bNumInterfaces; + 18f0: e0 91 bb 20 lds r30, 0x20BB + 18f4: f0 91 bc 20 lds r31, 0x20BC + 18f8: 01 90 ld r0, Z+ + 18fa: f0 81 ld r31, Z + 18fc: e0 2d mov r30, r0 + 18fe: 84 81 ldd r24, Z+4 ; 0x04 + 1900: c8 17 cp r28, r24 + 1902: 70 f3 brcs .-36 ; 0x18e0 + 1904: 69 c0 rjmp .+210 ; 0x19d8 +{ + uint8_t iface_num; + + // Check request length + if (udd_g_ctrlreq.req.wLength) { + return false; + 1906: 00 e0 ldi r16, 0x00 ; 0 + 1908: 67 c0 rjmp .+206 ; 0x19d8 + } + // Authorize configuration only if the address is valid + if (!udd_getaddress()) { + return false; + 190a: 00 e0 ldi r16, 0x00 ; 0 + 190c: 65 c0 rjmp .+202 ; 0x19d8 +#endif + { + // FS descriptor + if ((udd_g_ctrlreq.req.wValue & 0xFF) > + udc_config.confdev_lsfs->bNumConfigurations) { + return false; + 190e: 00 e0 ldi r16, 0x00 ; 0 + 1910: 63 c0 rjmp .+198 ; 0x19d8 + udc_reset(); + + // Enable new configuration + udc_num_configuration = udd_g_ctrlreq.req.wValue & 0xFF; + if (udc_num_configuration == 0) { + return true; // Default empty configuration requested + 1912: 01 e0 ldi r16, 0x01 ; 1 + 1914: 61 c0 rjmp .+194 ; 0x19d8 + iface_num++) { + if (!udc_iface_enable(iface_num, 0)) { + return false; + } + } + return true; + 1916: 01 e0 ldi r16, 0x01 ; 1 + 1918: 5f c0 rjmp .+190 ; 0x19d8 + default: + break; + } + } + + if (USB_REQ_RECIP_INTERFACE == Udd_setup_recipient()) { + 191a: 21 30 cpi r18, 0x01 ; 1 + 191c: 09 f5 brne .+66 ; 0x1960 + // Standard Set Interface request + switch (udd_g_ctrlreq.req.bRequest) { + 191e: 80 91 57 24 lds r24, 0x2457 + 1922: 8b 30 cpi r24, 0x0B ; 11 + 1924: e9 f4 brne .+58 ; 0x1960 + */ +static bool udc_req_std_iface_set_setting(void) +{ + uint8_t iface_num, setting_num; + + if (udd_g_ctrlreq.req.wLength) { + 1926: 80 91 5c 24 lds r24, 0x245C + 192a: 90 91 5d 24 lds r25, 0x245D + 192e: 89 2b or r24, r25 + 1930: 99 f4 brne .+38 ; 0x1958 + return false; // Error in request + } + if (!udc_num_configuration) { + 1932: 80 91 be 20 lds r24, 0x20BE + 1936: 88 23 and r24, r24 + 1938: 89 f0 breq .+34 ; 0x195c + return false; // The device is not is configured state yet + } + + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + 193a: c0 91 5a 24 lds r28, 0x245A + setting_num = udd_g_ctrlreq.req.wValue & 0xFF; + 193e: d0 91 58 24 lds r29, 0x2458 + + // Disable current setting + if (!udc_iface_disable(iface_num)) { + 1942: 8c 2f mov r24, r28 + 1944: 3f dc rcall .-1922 ; 0x11c4 + 1946: 08 2f mov r16, r24 + 1948: 88 23 and r24, r24 + 194a: 09 f4 brne .+2 ; 0x194e + 194c: 45 c0 rjmp .+138 ; 0x19d8 + return false; + } + + // Enable new setting + return udc_iface_enable(iface_num, setting_num); + 194e: 6d 2f mov r22, r29 + 1950: 8c 2f mov r24, r28 + 1952: 7a dc rcall .-1804 ; 0x1248 + 1954: 08 2f mov r16, r24 + 1956: 40 c0 rjmp .+128 ; 0x19d8 +static bool udc_req_std_iface_set_setting(void) +{ + uint8_t iface_num, setting_num; + + if (udd_g_ctrlreq.req.wLength) { + return false; // Error in request + 1958: 00 e0 ldi r16, 0x00 ; 0 + 195a: 3e c0 rjmp .+124 ; 0x19d8 + } + if (!udc_num_configuration) { + return false; // The device is not is configured state yet + 195c: 00 e0 ldi r16, 0x00 ; 0 + 195e: 3c c0 rjmp .+120 ; 0x19d8 + default: + break; + } + } +#if (0!=USB_DEVICE_MAX_EP) + if (USB_REQ_RECIP_ENDPOINT == Udd_setup_recipient()) { + 1960: 22 30 cpi r18, 0x02 ; 2 + 1962: 09 f0 breq .+2 ; 0x1966 + 1964: 3b c0 rjmp .+118 ; 0x19dc + // Standard Set Endpoint request + switch (udd_g_ctrlreq.req.bRequest) { + 1966: 80 91 57 24 lds r24, 0x2457 + 196a: 81 30 cpi r24, 0x01 ; 1 + 196c: 19 f0 breq .+6 ; 0x1974 + 196e: 83 30 cpi r24, 0x03 ; 3 + 1970: b1 f0 breq .+44 ; 0x199e + 1972: 31 c0 rjmp .+98 ; 0x19d6 + * + * \return true if success + */ +static bool udc_req_std_ep_clear_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + 1974: 80 91 5c 24 lds r24, 0x245C + 1978: 90 91 5d 24 lds r25, 0x245D + 197c: 89 2b or r24, r25 + 197e: 59 f4 brne .+22 ; 0x1996 + return false; + } + + if (udd_g_ctrlreq.req.wValue == USB_EP_FEATURE_HALT) { + 1980: 80 91 58 24 lds r24, 0x2458 + 1984: 90 91 59 24 lds r25, 0x2459 + 1988: 89 2b or r24, r25 + 198a: 39 f4 brne .+14 ; 0x199a + return udd_ep_clear_halt(udd_g_ctrlreq.req.wIndex & 0xFF); + 198c: 80 91 5a 24 lds r24, 0x245A + 1990: 87 d4 rcall .+2318 ; 0x22a0 + 1992: 08 2f mov r16, r24 + 1994: 21 c0 rjmp .+66 ; 0x19d8 + * \return true if success + */ +static bool udc_req_std_ep_clear_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + 1996: 00 e0 ldi r16, 0x00 ; 0 + 1998: 1f c0 rjmp .+62 ; 0x19d8 + } + + if (udd_g_ctrlreq.req.wValue == USB_EP_FEATURE_HALT) { + return udd_ep_clear_halt(udd_g_ctrlreq.req.wIndex & 0xFF); + } + return false; + 199a: 00 e0 ldi r16, 0x00 ; 0 + 199c: 1d c0 rjmp .+58 ; 0x19d8 + * \return true if success + */ +#if (0!=USB_DEVICE_MAX_EP) +static bool udc_req_std_ep_set_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + 199e: 80 91 5c 24 lds r24, 0x245C + 19a2: 90 91 5d 24 lds r25, 0x245D + 19a6: 89 2b or r24, r25 + 19a8: 71 f4 brne .+28 ; 0x19c6 + return false; + } + if (udd_g_ctrlreq.req.wValue == USB_EP_FEATURE_HALT) { + 19aa: 80 91 58 24 lds r24, 0x2458 + 19ae: 90 91 59 24 lds r25, 0x2459 + 19b2: 89 2b or r24, r25 + 19b4: 51 f4 brne .+20 ; 0x19ca + udd_ep_abort(udd_g_ctrlreq.req.wIndex & 0xFF); + 19b6: ca e5 ldi r28, 0x5A ; 90 + 19b8: d4 e2 ldi r29, 0x24 ; 36 + 19ba: 88 81 ld r24, Y + 19bc: 22 d5 rcall .+2628 ; 0x2402 + return udd_ep_set_halt(udd_g_ctrlreq.req.wIndex & 0xFF); + 19be: 88 81 ld r24, Y + 19c0: 76 d5 rcall .+2796 ; 0x24ae + 19c2: 08 2f mov r16, r24 + 19c4: 09 c0 rjmp .+18 ; 0x19d8 + */ +#if (0!=USB_DEVICE_MAX_EP) +static bool udc_req_std_ep_set_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + 19c6: 00 e0 ldi r16, 0x00 ; 0 + 19c8: 07 c0 rjmp .+14 ; 0x19d8 + } + if (udd_g_ctrlreq.req.wValue == USB_EP_FEATURE_HALT) { + udd_ep_abort(udd_g_ctrlreq.req.wIndex & 0xFF); + return udd_ep_set_halt(udd_g_ctrlreq.req.wIndex & 0xFF); + } + return false; + 19ca: 00 e0 ldi r16, 0x00 ; 0 + 19cc: 05 c0 rjmp .+10 ; 0x19d8 + break; + } + } +#endif + } + return false; + 19ce: 00 e0 ldi r16, 0x00 ; 0 + 19d0: 03 c0 rjmp .+6 ; 0x19d8 + case USB_REQ_SET_ADDRESS: + return udc_req_std_dev_set_address(); + case USB_REQ_CLEAR_FEATURE: + return udc_req_std_dev_clear_feature(); + case USB_REQ_SET_FEATURE: + return udc_req_std_dev_set_feature(); + 19d2: 00 e0 ldi r16, 0x00 ; 0 + 19d4: 01 c0 rjmp .+2 ; 0x19d8 + break; + } + } +#endif + } + return false; + 19d6: 00 e0 ldi r16, 0x00 ; 0 + } + } + + // If standard request then try to decode it in UDC + if (Udd_setup_type() == USB_REQ_TYPE_STANDARD) { + if (udc_reqstd()) { + 19d8: 01 11 cpse r16, r1 + 19da: 80 c0 rjmp .+256 ; 0x1adc + return true; + } + } + + // If interface request then try to decode it in UDI + if (Udd_setup_recipient() == USB_REQ_RECIP_INTERFACE) { + 19dc: 80 91 56 24 lds r24, 0x2456 + 19e0: 8f 71 andi r24, 0x1F ; 31 + 19e2: 81 30 cpi r24, 0x01 ; 1 + 19e4: c1 f5 brne .+112 ; 0x1a56 +static bool udc_req_iface(void) +{ + uint8_t iface_num; + udi_api_t UDC_DESC_STORAGE *udi_api; + + if (0 == udc_num_configuration) { + 19e6: 80 91 be 20 lds r24, 0x20BE + 19ea: 88 23 and r24, r24 + 19ec: a1 f1 breq .+104 ; 0x1a56 + return false; // The device is not is configured state yet + } + // Check interface number + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + 19ee: c0 91 5a 24 lds r28, 0x245A + 19f2: d0 91 5b 24 lds r29, 0x245B + if (iface_num >= udc_ptr_conf->desc->bNumInterfaces) { + 19f6: 00 91 bb 20 lds r16, 0x20BB + 19fa: 10 91 bc 20 lds r17, 0x20BC + 19fe: d8 01 movw r26, r16 + 1a00: ed 91 ld r30, X+ + 1a02: fc 91 ld r31, X + 1a04: 84 81 ldd r24, Z+4 ; 0x04 + 1a06: c8 17 cp r28, r24 + 1a08: 30 f5 brcc .+76 ; 0x1a56 + } + + //* To update udc_ptr_iface with the selected interface in request + // Select first alternate setting of interface to update udc_ptr_iface + // before calling udi_api->getsetting() + if (!udc_update_iface_desc(iface_num, 0)) { + 1a0a: 60 e0 ldi r22, 0x00 ; 0 + 1a0c: 8c 2f mov r24, r28 + 1a0e: a0 db rcall .-2240 ; 0x1150 + 1a10: 88 23 and r24, r24 + 1a12: 09 f1 breq .+66 ; 0x1a56 + return false; + } + // Select the interface with the current alternate setting + udi_api = udc_ptr_conf->udi_apis[iface_num]; + 1a14: ce 01 movw r24, r28 + 1a16: 99 27 eor r25, r25 + 1a18: 88 0f add r24, r24 + 1a1a: 99 1f adc r25, r25 + 1a1c: d8 01 movw r26, r16 + 1a1e: 12 96 adiw r26, 0x02 ; 2 + 1a20: ed 91 ld r30, X+ + 1a22: fc 91 ld r31, X + 1a24: 13 97 sbiw r26, 0x03 ; 3 + 1a26: e8 0f add r30, r24 + 1a28: f9 1f adc r31, r25 + 1a2a: 00 81 ld r16, Z + 1a2c: 11 81 ldd r17, Z+1 ; 0x01 + if (!udc_update_iface_desc(iface_num, udi_api->getsetting())) { + 1a2e: d8 01 movw r26, r16 + 1a30: 16 96 adiw r26, 0x06 ; 6 + 1a32: ed 91 ld r30, X+ + 1a34: fc 91 ld r31, X + 1a36: 17 97 sbiw r26, 0x07 ; 7 + 1a38: 09 95 icall + 1a3a: 68 2f mov r22, r24 + 1a3c: 8c 2f mov r24, r28 + 1a3e: 88 db rcall .-2288 ; 0x1150 + 1a40: 88 23 and r24, r24 + 1a42: 49 f0 breq .+18 ; 0x1a56 + return false; + } + + // Send the SETUP request to the UDI corresponding to the interface number + return udi_api->setup(); + 1a44: d8 01 movw r26, r16 + 1a46: 14 96 adiw r26, 0x04 ; 4 + 1a48: ed 91 ld r30, X+ + 1a4a: fc 91 ld r31, X + 1a4c: 15 97 sbiw r26, 0x05 ; 5 + 1a4e: 09 95 icall + 1a50: 08 2f mov r16, r24 + } + } + + // If interface request then try to decode it in UDI + if (Udd_setup_recipient() == USB_REQ_RECIP_INTERFACE) { + if (udc_req_iface()) { + 1a52: 81 11 cpse r24, r1 + 1a54: 43 c0 rjmp .+134 ; 0x1adc + return true; + } + } + + // If endpoint request then try to decode it in UDI + if (Udd_setup_recipient() == USB_REQ_RECIP_ENDPOINT) { + 1a56: 80 91 56 24 lds r24, 0x2456 + 1a5a: 8f 71 andi r24, 0x1F ; 31 + 1a5c: 82 30 cpi r24, 0x02 ; 2 + 1a5e: d9 f5 brne .+118 ; 0x1ad6 +static bool udc_req_ep(void) +{ + uint8_t iface_num; + udi_api_t UDC_DESC_STORAGE *udi_api; + + if (0 == udc_num_configuration) { + 1a60: 80 91 be 20 lds r24, 0x20BE + 1a64: 88 23 and r24, r24 + 1a66: 89 f1 breq .+98 ; 0x1aca + return false; // The device is not is configured state yet + } + // Send this request on all enabled interfaces + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + for (iface_num = 0; iface_num < udc_ptr_conf->desc->bNumInterfaces; + 1a68: e0 91 bb 20 lds r30, 0x20BB + 1a6c: f0 91 bc 20 lds r31, 0x20BC + 1a70: a0 81 ld r26, Z + 1a72: b1 81 ldd r27, Z+1 ; 0x01 + 1a74: 14 96 adiw r26, 0x04 ; 4 + 1a76: 8c 91 ld r24, X + 1a78: 88 23 and r24, r24 + 1a7a: 49 f1 breq .+82 ; 0x1ace + 1a7c: 10 e0 ldi r17, 0x00 ; 0 + iface_num++) { + // Select the interface with the current alternate setting + udi_api = udc_ptr_conf->udi_apis[iface_num]; + 1a7e: 21 2f mov r18, r17 + 1a80: 30 e0 ldi r19, 0x00 ; 0 + 1a82: 22 0f add r18, r18 + 1a84: 33 1f adc r19, r19 + 1a86: 02 80 ldd r0, Z+2 ; 0x02 + 1a88: f3 81 ldd r31, Z+3 ; 0x03 + 1a8a: e0 2d mov r30, r0 + 1a8c: e2 0f add r30, r18 + 1a8e: f3 1f adc r31, r19 + 1a90: c0 81 ld r28, Z + 1a92: d1 81 ldd r29, Z+1 ; 0x01 + if (!udc_update_iface_desc(iface_num, udi_api->getsetting())) { + 1a94: ee 81 ldd r30, Y+6 ; 0x06 + 1a96: ff 81 ldd r31, Y+7 ; 0x07 + 1a98: 09 95 icall + 1a9a: 68 2f mov r22, r24 + 1a9c: 81 2f mov r24, r17 + 1a9e: 58 db rcall .-2384 ; 0x1150 + 1aa0: 08 2f mov r16, r24 + 1aa2: 88 23 and r24, r24 + 1aa4: d9 f0 breq .+54 ; 0x1adc + return false; + } + + // Send the SETUP request to the UDI + if (udi_api->setup()) { + 1aa6: ec 81 ldd r30, Y+4 ; 0x04 + 1aa8: fd 81 ldd r31, Y+5 ; 0x05 + 1aaa: 09 95 icall + 1aac: 08 2f mov r16, r24 + 1aae: 81 11 cpse r24, r1 + 1ab0: 15 c0 rjmp .+42 ; 0x1adc + return false; // The device is not is configured state yet + } + // Send this request on all enabled interfaces + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + for (iface_num = 0; iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + 1ab2: 1f 5f subi r17, 0xFF ; 255 + if (0 == udc_num_configuration) { + return false; // The device is not is configured state yet + } + // Send this request on all enabled interfaces + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + for (iface_num = 0; iface_num < udc_ptr_conf->desc->bNumInterfaces; + 1ab4: e0 91 bb 20 lds r30, 0x20BB + 1ab8: f0 91 bc 20 lds r31, 0x20BC + 1abc: a0 81 ld r26, Z + 1abe: b1 81 ldd r27, Z+1 ; 0x01 + 1ac0: 14 96 adiw r26, 0x04 ; 4 + 1ac2: 8c 91 ld r24, X + 1ac4: 18 17 cp r17, r24 + 1ac6: d8 f2 brcs .-74 ; 0x1a7e + 1ac8: 09 c0 rjmp .+18 ; 0x1adc +{ + uint8_t iface_num; + udi_api_t UDC_DESC_STORAGE *udi_api; + + if (0 == udc_num_configuration) { + return false; // The device is not is configured state yet + 1aca: 00 e0 ldi r16, 0x00 ; 0 + 1acc: 07 c0 rjmp .+14 ; 0x1adc + // Send the SETUP request to the UDI + if (udi_api->setup()) { + return true; + } + } + return false; + 1ace: 00 e0 ldi r16, 0x00 ; 0 + 1ad0: 05 c0 rjmp .+10 ; 0x1adc + udd_g_ctrlreq.callback = NULL; + udd_g_ctrlreq.over_under_run = NULL; + + if (Udd_setup_is_in()) { + if (udd_g_ctrlreq.req.wLength == 0) { + return false; // Error from USB host + 1ad2: 00 e0 ldi r16, 0x00 ; 0 + 1ad4: 03 c0 rjmp .+6 ; 0x1adc + // Here SETUP request unknown by UDC and UDIs +#ifdef USB_DEVICE_SPECIFIC_REQUEST + // Try to decode it in specific callback + return USB_DEVICE_SPECIFIC_REQUEST(); // Ex: Vendor request,... +#else + return false; + 1ad6: 00 e0 ldi r16, 0x00 ; 0 + 1ad8: 01 c0 rjmp .+2 ; 0x1adc + } + } + + if (Udd_setup_type() == USB_REQ_TYPE_VENDOR){ + if (udc_reqvend()) { + return true; + 1ada: 01 e0 ldi r16, 0x01 ; 1 + // Try to decode it in specific callback + return USB_DEVICE_SPECIFIC_REQUEST(); // Ex: Vendor request,... +#else + return false; +#endif +} + 1adc: 80 2f mov r24, r16 + 1ade: df 91 pop r29 + 1ae0: cf 91 pop r28 + 1ae2: 1f 91 pop r17 + 1ae4: 0f 91 pop r16 + 1ae6: ff 90 pop r15 + 1ae8: ef 90 pop r14 + 1aea: 08 95 ret + +00001aec : + 1aec: 1b be out 0x3b, r1 ; 59 + 1aee: fc 01 movw r30, r24 + 1af0: 28 ed ldi r18, 0xD8 ; 216 + 1af2: 24 bf out 0x34, r18 ; 52 + 1af4: 60 83 st Z, r22 + 1af6: 08 95 ret + +00001af8 : + 1af8: 40 91 ca 01 lds r20, 0x01CA + 1afc: e6 2f mov r30, r22 + 1afe: f7 2f mov r31, r23 + 1b00: 80 93 ca 01 sts 0x01CA, r24 + 1b04: 84 91 lpm r24, Z + 1b06: 40 93 ca 01 sts 0x01CA, r20 + 1b0a: 08 95 ret + +00001b0c : + } else { + // endpoint not halted then call directly callback + callback(); + } + return true; +} + 1b0c: 81 11 cpse r24, r1 + 1b0e: 22 c0 rjmp .+68 ; 0x1b54 + 1b10: 90 91 54 22 lds r25, 0x2254 + 1b14: 99 23 and r25, r25 + 1b16: d9 f0 breq .+54 ; 0x1b4e + 1b18: 90 91 43 2c lds r25, 0x2C43 + 1b1c: 91 11 cpse r25, r1 + 1b1e: 01 c0 rjmp .+2 ; 0x1b22 + 1b20: ff cf rjmp .-2 ; 0x1b20 + 1b22: 9f b7 in r25, 0x3f ; 63 + 1b24: f8 94 cli + 1b26: e3 e4 ldi r30, 0x43 ; 67 + 1b28: fc e2 ldi r31, 0x2C ; 44 + 1b2a: 20 81 ld r18, Z + 1b2c: 21 50 subi r18, 0x01 ; 1 + 1b2e: 20 83 st Z, r18 + 1b30: 9f bf out 0x3f, r25 ; 63 + 1b32: 0d c0 rjmp .+26 ; 0x1b4e + 1b34: 90 91 43 2c lds r25, 0x2C43 + 1b38: 9f 3f cpi r25, 0xFF ; 255 + 1b3a: 09 f4 brne .+2 ; 0x1b3e + 1b3c: ff cf rjmp .-2 ; 0x1b3c + 1b3e: 9f b7 in r25, 0x3f ; 63 + 1b40: f8 94 cli + 1b42: e3 e4 ldi r30, 0x43 ; 67 + 1b44: fc e2 ldi r31, 0x2C ; 44 + 1b46: 20 81 ld r18, Z + 1b48: 2f 5f subi r18, 0xFF ; 255 + 1b4a: 20 83 st Z, r18 + 1b4c: 9f bf out 0x3f, r25 ; 63 + 1b4e: 80 93 54 22 sts 0x2254, r24 + 1b52: 08 95 ret + 1b54: 90 91 54 22 lds r25, 0x2254 + 1b58: 99 23 and r25, r25 + 1b5a: 61 f3 breq .-40 ; 0x1b34 + 1b5c: f8 cf rjmp .-16 ; 0x1b4e + +00001b5e : + 1b5e: 0f 93 push r16 + 1b60: e8 ec ldi r30, 0xC8 ; 200 + 1b62: f4 e0 ldi r31, 0x04 ; 4 + 1b64: 80 81 ld r24, Z + 1b66: 8f 7d andi r24, 0xDF ; 223 + 1b68: 80 83 st Z, r24 + 1b6a: 80 81 ld r24, Z + 1b6c: 8f 7d andi r24, 0xDF ; 223 + 1b6e: 80 83 st Z, r24 + 1b70: e8 e1 ldi r30, 0x18 ; 24 + 1b72: f2 e2 ldi r31, 0x22 ; 34 + 1b74: 02 e0 ldi r16, 0x02 ; 2 + 1b76: 05 93 las Z, r16 + 1b78: 10 92 1a 22 sts 0x221A, r1 + 1b7c: 10 92 1b 22 sts 0x221B, r1 + 1b80: 00 e2 ldi r16, 0x20 ; 32 + 1b82: 06 93 lac Z, r16 + 1b84: 00 e4 ldi r16, 0x40 ; 64 + 1b86: 06 93 lac Z, r16 + 1b88: e0 e1 ldi r30, 0x10 ; 16 + 1b8a: f2 e2 ldi r31, 0x22 ; 34 + 1b8c: 00 e2 ldi r16, 0x20 ; 32 + 1b8e: 06 93 lac Z, r16 + 1b90: 00 e4 ldi r16, 0x40 ; 64 + 1b92: 06 93 lac Z, r16 + 1b94: 10 92 62 24 sts 0x2462, r1 + 1b98: 10 92 63 24 sts 0x2463, r1 + 1b9c: 10 92 64 24 sts 0x2464, r1 + 1ba0: 10 92 65 24 sts 0x2465, r1 + 1ba4: 10 92 60 24 sts 0x2460, r1 + 1ba8: 10 92 61 24 sts 0x2461, r1 + 1bac: 10 92 ff 21 sts 0x21FF, r1 + 1bb0: 0f 91 pop r16 + 1bb2: 08 95 ret + +00001bb4 : + 1bb4: 0f 93 push r16 + 1bb6: 85 e0 ldi r24, 0x05 ; 5 + 1bb8: 80 93 ff 21 sts 0x21FF, r24 + 1bbc: e9 e1 ldi r30, 0x19 ; 25 + 1bbe: f2 e2 ldi r31, 0x22 ; 34 + 1bc0: 04 e0 ldi r16, 0x04 ; 4 + 1bc2: 05 93 las Z, r16 + 1bc4: e1 e1 ldi r30, 0x11 ; 17 + 1bc6: f2 e2 ldi r31, 0x22 ; 34 + 1bc8: 04 e0 ldi r16, 0x04 ; 4 + 1bca: 05 93 las Z, r16 + 1bcc: 0f 91 pop r16 + 1bce: 08 95 ret + +00001bd0 : + 1bd0: 0f 93 push r16 + 1bd2: 83 e0 ldi r24, 0x03 ; 3 + 1bd4: 80 93 ff 21 sts 0x21FF, r24 + 1bd8: 10 92 1a 22 sts 0x221A, r1 + 1bdc: 10 92 1b 22 sts 0x221B, r1 + 1be0: e8 e1 ldi r30, 0x18 ; 24 + 1be2: f2 e2 ldi r31, 0x22 ; 34 + 1be4: 02 e0 ldi r16, 0x02 ; 2 + 1be6: 06 93 lac Z, r16 + 1be8: 0f 91 pop r16 + 1bea: 08 95 ret + +00001bec : + 1bec: e0 91 62 24 lds r30, 0x2462 + 1bf0: f0 91 63 24 lds r31, 0x2463 + 1bf4: 30 97 sbiw r30, 0x00 ; 0 + 1bf6: 09 f0 breq .+2 ; 0x1bfa + 1bf8: 09 95 icall + 1bfa: 08 95 ret + +00001bfc : + 1bfc: 0f 93 push r16 + 1bfe: cf 93 push r28 + 1c00: df 93 push r29 + 1c02: 80 91 ff 21 lds r24, 0x21FF + 1c06: 83 30 cpi r24, 0x03 ; 3 + 1c08: 19 f4 brne .+6 ; 0x1c10 + 1c0a: f0 df rcall .-32 ; 0x1bec + 1c0c: a8 df rcall .-176 ; 0x1b5e + 1c0e: 60 c0 rjmp .+192 ; 0x1cd0 + 1c10: 80 91 fb 21 lds r24, 0x21FB + 1c14: 90 91 fc 21 lds r25, 0x21FC + 1c18: c0 91 60 24 lds r28, 0x2460 + 1c1c: d0 91 61 24 lds r29, 0x2461 + 1c20: c8 1b sub r28, r24 + 1c22: d9 0b sbc r29, r25 + 1c24: 71 f5 brne .+92 ; 0x1c82 + 1c26: 20 91 fd 21 lds r18, 0x21FD + 1c2a: 30 91 fe 21 lds r19, 0x21FE + 1c2e: 82 0f add r24, r18 + 1c30: 93 1f adc r25, r19 + 1c32: 80 93 fd 21 sts 0x21FD, r24 + 1c36: 90 93 fe 21 sts 0x21FE, r25 + 1c3a: 20 91 5c 24 lds r18, 0x245C + 1c3e: 30 91 5d 24 lds r19, 0x245D + 1c42: 82 17 cp r24, r18 + 1c44: 93 07 cpc r25, r19 + 1c46: 21 f0 breq .+8 ; 0x1c50 + 1c48: 80 91 c4 20 lds r24, 0x20C4 + 1c4c: 88 23 and r24, r24 + 1c4e: 41 f0 breq .+16 ; 0x1c60 + 1c50: 84 e0 ldi r24, 0x04 ; 4 + 1c52: 80 93 ff 21 sts 0x21FF, r24 + 1c56: e0 e1 ldi r30, 0x10 ; 16 + 1c58: f2 e2 ldi r31, 0x22 ; 34 + 1c5a: 02 e0 ldi r16, 0x02 ; 2 + 1c5c: 06 93 lac Z, r16 + 1c5e: 38 c0 rjmp .+112 ; 0x1cd0 + 1c60: e0 91 64 24 lds r30, 0x2464 + 1c64: f0 91 65 24 lds r31, 0x2465 + 1c68: 30 97 sbiw r30, 0x00 ; 0 + 1c6a: 99 f0 breq .+38 ; 0x1c92 + 1c6c: 09 95 icall + 1c6e: 88 23 and r24, r24 + 1c70: 81 f0 breq .+32 ; 0x1c92 + 1c72: 10 92 fb 21 sts 0x21FB, r1 + 1c76: 10 92 fc 21 sts 0x21FC, r1 + 1c7a: c0 91 60 24 lds r28, 0x2460 + 1c7e: d0 91 61 24 lds r29, 0x2461 + 1c82: c0 34 cpi r28, 0x40 ; 64 + 1c84: d1 05 cpc r29, r1 + 1c86: 28 f0 brcs .+10 ; 0x1c92 + 1c88: 10 92 c4 20 sts 0x20C4, r1 + 1c8c: c0 e4 ldi r28, 0x40 ; 64 + 1c8e: d0 e0 ldi r29, 0x00 ; 0 + 1c90: 03 c0 rjmp .+6 ; 0x1c98 + 1c92: 81 e0 ldi r24, 0x01 ; 1 + 1c94: 80 93 c4 20 sts 0x20C4, r24 + 1c98: c0 93 1a 22 sts 0x221A, r28 + 1c9c: d0 93 1b 22 sts 0x221B, r29 + 1ca0: 80 91 fb 21 lds r24, 0x21FB + 1ca4: 90 91 fc 21 lds r25, 0x21FC + 1ca8: 20 91 5e 24 lds r18, 0x245E + 1cac: 30 91 5f 24 lds r19, 0x245F + 1cb0: 28 0f add r18, r24 + 1cb2: 39 1f adc r19, r25 + 1cb4: 20 93 1c 22 sts 0x221C, r18 + 1cb8: 30 93 1d 22 sts 0x221D, r19 + 1cbc: c8 0f add r28, r24 + 1cbe: d9 1f adc r29, r25 + 1cc0: c0 93 fb 21 sts 0x21FB, r28 + 1cc4: d0 93 fc 21 sts 0x21FC, r29 + 1cc8: e8 e1 ldi r30, 0x18 ; 24 + 1cca: f2 e2 ldi r31, 0x22 ; 34 + 1ccc: 02 e0 ldi r16, 0x02 ; 2 + 1cce: 06 93 lac Z, r16 + 1cd0: df 91 pop r29 + 1cd2: cf 91 pop r28 + 1cd4: 0f 91 pop r16 + 1cd6: 08 95 ret + +00001cd8 : + 1cd8: fc 01 movw r30, r24 + 1cda: 81 81 ldd r24, Z+1 ; 0x01 + 1cdc: 87 70 andi r24, 0x07 ; 7 + 1cde: 90 e0 ldi r25, 0x00 ; 0 + 1ce0: fc 01 movw r30, r24 + 1ce2: 31 97 sbiw r30, 0x01 ; 1 + 1ce4: e7 30 cpi r30, 0x07 ; 7 + 1ce6: f1 05 cpc r31, r1 + 1ce8: 18 f4 brcc .+6 ; 0x1cf0 + 1cea: ea 5d subi r30, 0xDA ; 218 + 1cec: fe 4f sbci r31, 0xFE ; 254 + 1cee: bd c5 rjmp .+2938 ; 0x286a <__tablejump2__> + 1cf0: 88 e0 ldi r24, 0x08 ; 8 + 1cf2: 90 e0 ldi r25, 0x00 ; 0 + 1cf4: 08 95 ret + 1cf6: 80 e2 ldi r24, 0x20 ; 32 + 1cf8: 90 e0 ldi r25, 0x00 ; 0 + 1cfa: 08 95 ret + 1cfc: 80 e4 ldi r24, 0x40 ; 64 + 1cfe: 90 e0 ldi r25, 0x00 ; 0 + 1d00: 08 95 ret + 1d02: 80 e8 ldi r24, 0x80 ; 128 + 1d04: 90 e0 ldi r25, 0x00 ; 0 + 1d06: 08 95 ret + 1d08: 80 e0 ldi r24, 0x00 ; 0 + 1d0a: 91 e0 ldi r25, 0x01 ; 1 + 1d0c: 08 95 ret + 1d0e: 80 e0 ldi r24, 0x00 ; 0 + 1d10: 92 e0 ldi r25, 0x02 ; 2 + 1d12: 08 95 ret + 1d14: 8f ef ldi r24, 0xFF ; 255 + 1d16: 93 e0 ldi r25, 0x03 ; 3 + 1d18: 08 95 ret + 1d1a: 80 e1 ldi r24, 0x10 ; 16 + 1d1c: 90 e0 ldi r25, 0x00 ; 0 + 1d1e: 08 95 ret + +00001d20 : + 1d20: 28 2f mov r18, r24 + 1d22: 2f 70 andi r18, 0x0F ; 15 + 1d24: 30 e0 ldi r19, 0x00 ; 0 + 1d26: 22 0f add r18, r18 + 1d28: 33 1f adc r19, r19 + 1d2a: 99 27 eor r25, r25 + 1d2c: 87 fd sbrc r24, 7 + 1d2e: 90 95 com r25 + 1d30: 88 27 eor r24, r24 + 1d32: 99 0f add r25, r25 + 1d34: 88 1f adc r24, r24 + 1d36: 99 27 eor r25, r25 + 1d38: 82 0f add r24, r18 + 1d3a: 93 1f adc r25, r19 + 1d3c: 02 97 sbiw r24, 0x02 ; 2 + 1d3e: 9c 01 movw r18, r24 + 1d40: 22 0f add r18, r18 + 1d42: 33 1f adc r19, r19 + 1d44: 22 0f add r18, r18 + 1d46: 33 1f adc r19, r19 + 1d48: 22 0f add r18, r18 + 1d4a: 33 1f adc r19, r19 + 1d4c: 82 0f add r24, r18 + 1d4e: 93 1f adc r25, r19 + 1d50: 8b 57 subi r24, 0x7B ; 123 + 1d52: 9e 4d sbci r25, 0xDE ; 222 + 1d54: 08 95 ret + +00001d56 : + 1d56: 0f 93 push r16 + 1d58: cf 93 push r28 + 1d5a: 80 91 cc 04 lds r24, 0x04CC + 1d5e: 80 ff sbrs r24, 0 + 1d60: 62 c0 rjmp .+196 ; 0x1e26 + 1d62: 81 e0 ldi r24, 0x01 ; 1 + 1d64: 80 93 cc 04 sts 0x04CC, r24 + 1d68: e0 e1 ldi r30, 0x10 ; 16 + 1d6a: f2 e2 ldi r31, 0x22 ; 34 + 1d6c: 00 e8 ldi r16, 0x80 ; 128 + 1d6e: 06 93 lac Z, r16 + 1d70: e8 e1 ldi r30, 0x18 ; 24 + 1d72: f2 e2 ldi r31, 0x22 ; 34 + 1d74: 00 e8 ldi r16, 0x80 ; 128 + 1d76: 06 93 lac Z, r16 + 1d78: 80 93 ca 04 sts 0x04CA, r24 + 1d7c: e0 e1 ldi r30, 0x10 ; 16 + 1d7e: f2 e2 ldi r31, 0x22 ; 34 + 1d80: 00 e1 ldi r16, 0x10 ; 16 + 1d82: 06 93 lac Z, r16 + 1d84: 80 91 ff 21 lds r24, 0x21FF + 1d88: 88 23 and r24, r24 + 1d8a: 29 f0 breq .+10 ; 0x1d96 + 1d8c: 83 50 subi r24, 0x03 ; 3 + 1d8e: 82 30 cpi r24, 0x02 ; 2 + 1d90: 08 f4 brcc .+2 ; 0x1d94 + 1d92: 2c df rcall .-424 ; 0x1bec + 1d94: e4 de rcall .-568 ; 0x1b5e + 1d96: 80 91 12 22 lds r24, 0x2212 + 1d9a: 90 91 13 22 lds r25, 0x2213 + 1d9e: 08 97 sbiw r24, 0x08 ; 8 + 1da0: 09 f0 breq .+2 ; 0x1da4 + 1da2: 43 c0 rjmp .+134 ; 0x1e2a + 1da4: 88 e0 ldi r24, 0x08 ; 8 + 1da6: eb eb ldi r30, 0xBB ; 187 + 1da8: f1 e2 ldi r31, 0x21 ; 33 + 1daa: a6 e5 ldi r26, 0x56 ; 86 + 1dac: b4 e2 ldi r27, 0x24 ; 36 + 1dae: 01 90 ld r0, Z+ + 1db0: 0d 92 st X+, r0 + 1db2: 8a 95 dec r24 + 1db4: e1 f7 brne .-8 ; 0x1dae + 1db6: e8 ec ldi r30, 0xC8 ; 200 + 1db8: f4 e0 ldi r31, 0x04 ; 4 + 1dba: 80 81 ld r24, Z + 1dbc: 80 62 ori r24, 0x20 ; 32 + 1dbe: 80 83 st Z, r24 + 1dc0: 80 81 ld r24, Z + 1dc2: 80 62 ori r24, 0x20 ; 32 + 1dc4: 80 83 st Z, r24 + 1dc6: cd da rcall .-2662 ; 0x1362 + 1dc8: c8 2f mov r28, r24 + 1dca: 81 11 cpse r24, r1 + 1dcc: 03 c0 rjmp .+6 ; 0x1dd4 + 1dce: f2 de rcall .-540 ; 0x1bb4 + 1dd0: c1 e0 ldi r28, 0x01 ; 1 + 1dd2: 2c c0 rjmp .+88 ; 0x1e2c + 1dd4: 80 91 56 24 lds r24, 0x2456 + 1dd8: 88 23 and r24, r24 + 1dda: 6c f4 brge .+26 ; 0x1df6 + 1ddc: 10 92 fd 21 sts 0x21FD, r1 + 1de0: 10 92 fe 21 sts 0x21FE, r1 + 1de4: 10 92 fb 21 sts 0x21FB, r1 + 1de8: 10 92 fc 21 sts 0x21FC, r1 + 1dec: 82 e0 ldi r24, 0x02 ; 2 + 1dee: 80 93 ff 21 sts 0x21FF, r24 + 1df2: 04 df rcall .-504 ; 0x1bfc + 1df4: 1b c0 rjmp .+54 ; 0x1e2c + 1df6: 20 91 5c 24 lds r18, 0x245C + 1dfa: 30 91 5d 24 lds r19, 0x245D + 1dfe: 23 2b or r18, r19 + 1e00: 11 f4 brne .+4 ; 0x1e06 + 1e02: e6 de rcall .-564 ; 0x1bd0 + 1e04: 13 c0 rjmp .+38 ; 0x1e2c + 1e06: 10 92 fd 21 sts 0x21FD, r1 + 1e0a: 10 92 fe 21 sts 0x21FE, r1 + 1e0e: 10 92 fb 21 sts 0x21FB, r1 + 1e12: 10 92 fc 21 sts 0x21FC, r1 + 1e16: 81 e0 ldi r24, 0x01 ; 1 + 1e18: 80 93 ff 21 sts 0x21FF, r24 + 1e1c: e0 e1 ldi r30, 0x10 ; 16 + 1e1e: f2 e2 ldi r31, 0x22 ; 34 + 1e20: 02 e0 ldi r16, 0x02 ; 2 + 1e22: 06 93 lac Z, r16 + 1e24: 03 c0 rjmp .+6 ; 0x1e2c + 1e26: c0 e0 ldi r28, 0x00 ; 0 + 1e28: 01 c0 rjmp .+2 ; 0x1e2c + 1e2a: c1 e0 ldi r28, 0x01 ; 1 + 1e2c: 8c 2f mov r24, r28 + 1e2e: cf 91 pop r28 + 1e30: 0f 91 pop r16 + 1e32: 08 95 ret + +00001e34 : + 1e34: bf 92 push r11 + 1e36: cf 92 push r12 + 1e38: df 92 push r13 + 1e3a: ef 92 push r14 + 1e3c: ff 92 push r15 + 1e3e: 0f 93 push r16 + 1e40: 1f 93 push r17 + 1e42: cf 93 push r28 + 1e44: df 93 push r29 + 1e46: b8 2e mov r11, r24 + 1e48: 6b df rcall .-298 ; 0x1d20 + 1e4a: ec 01 movw r28, r24 + 1e4c: 1b 2d mov r17, r11 + 1e4e: 11 1f adc r17, r17 + 1e50: 11 27 eor r17, r17 + 1e52: 11 1f adc r17, r17 + 1e54: 8b 2d mov r24, r11 + 1e56: 8f 70 andi r24, 0x0F ; 15 + 1e58: e8 2e mov r14, r24 + 1e5a: f1 2c mov r15, r1 + 1e5c: ee 0c add r14, r14 + 1e5e: ff 1c adc r15, r15 + 1e60: e1 0e add r14, r17 + 1e62: f1 1c adc r15, r1 + 1e64: c7 01 movw r24, r14 + 1e66: 88 0f add r24, r24 + 1e68: 99 1f adc r25, r25 + 1e6a: 88 0f add r24, r24 + 1e6c: 99 1f adc r25, r25 + 1e6e: 88 0f add r24, r24 + 1e70: 99 1f adc r25, r25 + 1e72: 9c 01 movw r18, r24 + 1e74: 20 5f subi r18, 0xF0 ; 240 + 1e76: 3d 4d sbci r19, 0xDD ; 221 + 1e78: 79 01 movw r14, r18 + 1e7a: c9 01 movw r24, r18 + 1e7c: 2d df rcall .-422 ; 0x1cd8 + 1e7e: 6c 01 movw r12, r24 + 1e80: 11 23 and r17, r17 + 1e82: 09 f4 brne .+2 ; 0x1e86 + 1e84: 59 c0 rjmp .+178 ; 0x1f38 + 1e86: d7 01 movw r26, r14 + 1e88: 16 96 adiw r26, 0x06 ; 6 + 1e8a: 2d 91 ld r18, X+ + 1e8c: 3c 91 ld r19, X + 1e8e: 17 97 sbiw r26, 0x07 ; 7 + 1e90: 8d 81 ldd r24, Y+5 ; 0x05 + 1e92: 9e 81 ldd r25, Y+6 ; 0x06 + 1e94: 28 0f add r18, r24 + 1e96: 39 1f adc r19, r25 + 1e98: 2d 83 std Y+5, r18 ; 0x05 + 1e9a: 3e 83 std Y+6, r19 ; 0x06 + 1e9c: 8b 81 ldd r24, Y+3 ; 0x03 + 1e9e: 9c 81 ldd r25, Y+4 ; 0x04 + 1ea0: 28 17 cp r18, r24 + 1ea2: 39 07 cpc r19, r25 + 1ea4: b9 f1 breq .+110 ; 0x1f14 + 1ea6: fc 01 movw r30, r24 + 1ea8: e2 1b sub r30, r18 + 1eaa: f3 0b sbc r31, r19 + 1eac: 9f 01 movw r18, r30 + 1eae: 21 15 cp r18, r1 + 1eb0: f4 e0 ldi r31, 0x04 ; 4 + 1eb2: 3f 07 cpc r19, r31 + 1eb4: 38 f0 brcs .+14 ; 0x1ec4 + 1eb6: 2f ef ldi r18, 0xFF ; 255 + 1eb8: 33 e0 ldi r19, 0x03 ; 3 + 1eba: c9 01 movw r24, r18 + 1ebc: b6 01 movw r22, r12 + 1ebe: c1 d4 rcall .+2434 ; 0x2842 <__udivmodhi4> + 1ec0: 28 1b sub r18, r24 + 1ec2: 39 0b sbc r19, r25 + 1ec4: 88 81 ld r24, Y + 1ec6: 81 ff sbrs r24, 1 + 1ec8: 09 c0 rjmp .+18 ; 0x1edc + 1eca: c9 01 movw r24, r18 + 1ecc: b6 01 movw r22, r12 + 1ece: b9 d4 rcall .+2418 ; 0x2842 <__udivmodhi4> + 1ed0: 41 e0 ldi r20, 0x01 ; 1 + 1ed2: 89 2b or r24, r25 + 1ed4: 09 f0 breq .+2 ; 0x1ed8 + 1ed6: 40 e0 ldi r20, 0x00 ; 0 + 1ed8: 94 2f mov r25, r20 + 1eda: 01 c0 rjmp .+2 ; 0x1ede + 1edc: 90 e0 ldi r25, 0x00 ; 0 + 1ede: 88 81 ld r24, Y + 1ee0: 90 fb bst r25, 0 + 1ee2: 81 f9 bld r24, 1 + 1ee4: 88 83 st Y, r24 + 1ee6: d7 01 movw r26, r14 + 1ee8: 16 96 adiw r26, 0x06 ; 6 + 1eea: 1d 92 st X+, r1 + 1eec: 1c 92 st X, r1 + 1eee: 17 97 sbiw r26, 0x07 ; 7 + 1ef0: 12 96 adiw r26, 0x02 ; 2 + 1ef2: 2d 93 st X+, r18 + 1ef4: 3c 93 st X, r19 + 1ef6: 13 97 sbiw r26, 0x03 ; 3 + 1ef8: 29 81 ldd r18, Y+1 ; 0x01 + 1efa: 3a 81 ldd r19, Y+2 ; 0x02 + 1efc: 8d 81 ldd r24, Y+5 ; 0x05 + 1efe: 9e 81 ldd r25, Y+6 ; 0x06 + 1f00: 82 0f add r24, r18 + 1f02: 93 1f adc r25, r19 + 1f04: 14 96 adiw r26, 0x04 ; 4 + 1f06: 8d 93 st X+, r24 + 1f08: 9c 93 st X, r25 + 1f0a: 15 97 sbiw r26, 0x05 ; 5 + 1f0c: f7 01 movw r30, r14 + 1f0e: 02 e0 ldi r16, 0x02 ; 2 + 1f10: 06 93 lac Z, r16 + 1f12: 94 c0 rjmp .+296 ; 0x203c + 1f14: 88 81 ld r24, Y + 1f16: 81 ff sbrs r24, 1 + 1f18: 83 c0 rjmp .+262 ; 0x2020 + 1f1a: 8d 7f andi r24, 0xFD ; 253 + 1f1c: 88 83 st Y, r24 + 1f1e: d7 01 movw r26, r14 + 1f20: 16 96 adiw r26, 0x06 ; 6 + 1f22: 1d 92 st X+, r1 + 1f24: 1c 92 st X, r1 + 1f26: 17 97 sbiw r26, 0x07 ; 7 + 1f28: 12 96 adiw r26, 0x02 ; 2 + 1f2a: 1d 92 st X+, r1 + 1f2c: 1c 92 st X, r1 + 1f2e: 13 97 sbiw r26, 0x03 ; 3 + 1f30: f7 01 movw r30, r14 + 1f32: 02 e0 ldi r16, 0x02 ; 2 + 1f34: 06 93 lac Z, r16 + 1f36: 82 c0 rjmp .+260 ; 0x203c + 1f38: d7 01 movw r26, r14 + 1f3a: 12 96 adiw r26, 0x02 ; 2 + 1f3c: 0d 91 ld r16, X+ + 1f3e: 1c 91 ld r17, X + 1f40: 13 97 sbiw r26, 0x03 ; 3 + 1f42: 88 81 ld r24, Y + 1f44: 82 ff sbrs r24, 2 + 1f46: 13 c0 rjmp .+38 ; 0x1f6e + 1f48: e9 81 ldd r30, Y+1 ; 0x01 + 1f4a: fa 81 ldd r31, Y+2 ; 0x02 + 1f4c: 2d 81 ldd r18, Y+5 ; 0x05 + 1f4e: 3e 81 ldd r19, Y+6 ; 0x06 + 1f50: 8b 81 ldd r24, Y+3 ; 0x03 + 1f52: 9c 81 ldd r25, Y+4 ; 0x04 + 1f54: b6 01 movw r22, r12 + 1f56: 75 d4 rcall .+2282 ; 0x2842 <__udivmodhi4> + 1f58: b0 e4 ldi r27, 0x40 ; 64 + 1f5a: bb 9e mul r11, r27 + 1f5c: b0 01 movw r22, r0 + 1f5e: 11 24 eor r1, r1 + 1f60: 6b 57 subi r22, 0x7B ; 123 + 1f62: 7f 4d sbci r23, 0xDF ; 223 + 1f64: ac 01 movw r20, r24 + 1f66: cf 01 movw r24, r30 + 1f68: 82 0f add r24, r18 + 1f6a: 93 1f adc r25, r19 + 1f6c: 84 d4 rcall .+2312 ; 0x2876 + 1f6e: 2d 81 ldd r18, Y+5 ; 0x05 + 1f70: 3e 81 ldd r19, Y+6 ; 0x06 + 1f72: 20 0f add r18, r16 + 1f74: 31 1f adc r19, r17 + 1f76: 2d 83 std Y+5, r18 ; 0x05 + 1f78: 3e 83 std Y+6, r19 ; 0x06 + 1f7a: eb 81 ldd r30, Y+3 ; 0x03 + 1f7c: fc 81 ldd r31, Y+4 ; 0x04 + 1f7e: e2 17 cp r30, r18 + 1f80: f3 07 cpc r31, r19 + 1f82: 10 f4 brcc .+4 ; 0x1f88 + 1f84: ed 83 std Y+5, r30 ; 0x05 + 1f86: fe 83 std Y+6, r31 ; 0x06 + 1f88: d7 01 movw r26, r14 + 1f8a: 16 96 adiw r26, 0x06 ; 6 + 1f8c: 8d 91 ld r24, X+ + 1f8e: 9c 91 ld r25, X + 1f90: 17 97 sbiw r26, 0x07 ; 7 + 1f92: 80 17 cp r24, r16 + 1f94: 91 07 cpc r25, r17 + 1f96: 09 f0 breq .+2 ; 0x1f9a + 1f98: 43 c0 rjmp .+134 ; 0x2020 + 1f9a: 8d 81 ldd r24, Y+5 ; 0x05 + 1f9c: 9e 81 ldd r25, Y+6 ; 0x06 + 1f9e: e8 17 cp r30, r24 + 1fa0: f9 07 cpc r31, r25 + 1fa2: 09 f4 brne .+2 ; 0x1fa6 + 1fa4: 3d c0 rjmp .+122 ; 0x2020 + 1fa6: e8 1b sub r30, r24 + 1fa8: f9 0b sbc r31, r25 + 1faa: e1 15 cp r30, r1 + 1fac: b4 e0 ldi r27, 0x04 ; 4 + 1fae: fb 07 cpc r31, r27 + 1fb0: 40 f0 brcs .+16 ; 0x1fc2 + 1fb2: ef ef ldi r30, 0xFF ; 255 + 1fb4: f3 e0 ldi r31, 0x03 ; 3 + 1fb6: cf 01 movw r24, r30 + 1fb8: b6 01 movw r22, r12 + 1fba: 43 d4 rcall .+2182 ; 0x2842 <__udivmodhi4> + 1fbc: e8 1b sub r30, r24 + 1fbe: f9 0b sbc r31, r25 + 1fc0: 05 c0 rjmp .+10 ; 0x1fcc + 1fc2: cf 01 movw r24, r30 + 1fc4: b6 01 movw r22, r12 + 1fc6: 3d d4 rcall .+2170 ; 0x2842 <__udivmodhi4> + 1fc8: e8 1b sub r30, r24 + 1fca: f9 0b sbc r31, r25 + 1fcc: d7 01 movw r26, r14 + 1fce: 12 96 adiw r26, 0x02 ; 2 + 1fd0: 1d 92 st X+, r1 + 1fd2: 1c 92 st X, r1 + 1fd4: 13 97 sbiw r26, 0x03 ; 3 + 1fd6: ec 15 cp r30, r12 + 1fd8: fd 05 cpc r31, r13 + 1fda: 78 f4 brcc .+30 ; 0x1ffa + 1fdc: 88 81 ld r24, Y + 1fde: 84 60 ori r24, 0x04 ; 4 + 1fe0: 88 83 st Y, r24 + 1fe2: b0 e4 ldi r27, 0x40 ; 64 + 1fe4: bb 9e mul r11, r27 + 1fe6: c0 01 movw r24, r0 + 1fe8: 11 24 eor r1, r1 + 1fea: 8b 57 subi r24, 0x7B ; 123 + 1fec: 9f 4d sbci r25, 0xDF ; 223 + 1fee: f7 01 movw r30, r14 + 1ff0: 84 83 std Z+4, r24 ; 0x04 + 1ff2: 95 83 std Z+5, r25 ; 0x05 + 1ff4: c6 82 std Z+6, r12 ; 0x06 + 1ff6: d7 82 std Z+7, r13 ; 0x07 + 1ff8: 0f c0 rjmp .+30 ; 0x2018 + 1ffa: 29 81 ldd r18, Y+1 ; 0x01 + 1ffc: 3a 81 ldd r19, Y+2 ; 0x02 + 1ffe: 8d 81 ldd r24, Y+5 ; 0x05 + 2000: 9e 81 ldd r25, Y+6 ; 0x06 + 2002: 82 0f add r24, r18 + 2004: 93 1f adc r25, r19 + 2006: d7 01 movw r26, r14 + 2008: 14 96 adiw r26, 0x04 ; 4 + 200a: 8d 93 st X+, r24 + 200c: 9c 93 st X, r25 + 200e: 15 97 sbiw r26, 0x05 ; 5 + 2010: 16 96 adiw r26, 0x06 ; 6 + 2012: ed 93 st X+, r30 + 2014: fc 93 st X, r31 + 2016: 17 97 sbiw r26, 0x07 ; 7 + 2018: f7 01 movw r30, r14 + 201a: 02 e0 ldi r16, 0x02 ; 2 + 201c: 06 93 lac Z, r16 + 201e: 0e c0 rjmp .+28 ; 0x203c + 2020: 88 81 ld r24, Y + 2022: 80 ff sbrs r24, 0 + 2024: 0b c0 rjmp .+22 ; 0x203c + 2026: 8e 7f andi r24, 0xFE ; 254 + 2028: 88 83 st Y, r24 + 202a: ef 81 ldd r30, Y+7 ; 0x07 + 202c: f8 85 ldd r31, Y+8 ; 0x08 + 202e: 30 97 sbiw r30, 0x00 ; 0 + 2030: 29 f0 breq .+10 ; 0x203c + 2032: 6d 81 ldd r22, Y+5 ; 0x05 + 2034: 7e 81 ldd r23, Y+6 ; 0x06 + 2036: 4b 2d mov r20, r11 + 2038: 80 e0 ldi r24, 0x00 ; 0 + 203a: 09 95 icall + 203c: df 91 pop r29 + 203e: cf 91 pop r28 + 2040: 1f 91 pop r17 + 2042: 0f 91 pop r16 + 2044: ff 90 pop r15 + 2046: ef 90 pop r14 + 2048: df 90 pop r13 + 204a: cf 90 pop r12 + 204c: bf 90 pop r11 + 204e: 08 95 ret + +00002050 : + 2050: cf 93 push r28 + 2052: cf b7 in r28, 0x3f ; 63 + 2054: f8 94 cli + 2056: 81 e0 ldi r24, 0x01 ; 1 + 2058: 59 dd rcall .-1358 ; 0x1b0c + 205a: ea ec ldi r30, 0xCA ; 202 + 205c: f4 e0 ldi r31, 0x04 ; 4 + 205e: 80 e4 ldi r24, 0x40 ; 64 + 2060: 80 83 st Z, r24 + 2062: 80 e2 ldi r24, 0x20 ; 32 + 2064: 80 83 st Z, r24 + 2066: e1 ec ldi r30, 0xC1 ; 193 + 2068: f4 e0 ldi r31, 0x04 ; 4 + 206a: 80 81 ld r24, Z + 206c: 81 60 ori r24, 0x01 ; 1 + 206e: 80 83 st Z, r24 + 2070: a9 ec ldi r26, 0xC9 ; 201 + 2072: b4 e0 ldi r27, 0x04 ; 4 + 2074: 8c 91 ld r24, X + 2076: 82 60 ori r24, 0x02 ; 2 + 2078: 8c 93 st X, r24 + 207a: e8 ec ldi r30, 0xC8 ; 200 + 207c: f4 e0 ldi r31, 0x04 ; 4 + 207e: 80 81 ld r24, Z + 2080: 80 64 ori r24, 0x40 ; 64 + 2082: 80 83 st Z, r24 + 2084: 8c 91 ld r24, X + 2086: 81 60 ori r24, 0x01 ; 1 + 2088: 8c 93 st X, r24 + 208a: 80 81 ld r24, Z + 208c: 80 68 ori r24, 0x80 ; 128 + 208e: 80 83 st Z, r24 + 2090: cf bf out 0x3f, r28 ; 63 + 2092: cf 91 pop r28 + 2094: 08 95 ret + +00002096 : + 2096: cf 93 push r28 + 2098: df 93 push r29 + 209a: c0 e6 ldi r28, 0x60 ; 96 + 209c: d0 e0 ldi r29, 0x00 ; 0 + 209e: 18 82 st Y, r1 + 20a0: 80 e3 ldi r24, 0x30 ; 48 + 20a2: 0e 94 f1 07 call 0xfe2 ; 0xfe2 + 20a6: e0 ec ldi r30, 0xC0 ; 192 + 20a8: f4 e0 ldi r31, 0x04 ; 4 + 20aa: 80 81 ld r24, Z + 20ac: 80 64 ori r24, 0x40 ; 64 + 20ae: 80 83 st Z, r24 + 20b0: 81 e0 ldi r24, 0x01 ; 1 + 20b2: 88 83 st Y, r24 + 20b4: cf b7 in r28, 0x3f ; 63 + 20b6: f8 94 cli + 20b8: 80 e0 ldi r24, 0x00 ; 0 + 20ba: 90 e0 ldi r25, 0x00 ; 0 + 20bc: fc 01 movw r30, r24 + 20be: ee 0f add r30, r30 + 20c0: ff 1f adc r31, r31 + 20c2: ee 0f add r30, r30 + 20c4: ff 1f adc r31, r31 + 20c6: ee 0f add r30, r30 + 20c8: ff 1f adc r31, r31 + 20ca: ef 5e subi r30, 0xEF ; 239 + 20cc: fd 4d sbci r31, 0xDD ; 221 + 20ce: 10 82 st Z, r1 + 20d0: 01 96 adiw r24, 0x01 ; 1 + 20d2: 88 30 cpi r24, 0x08 ; 8 + 20d4: 91 05 cpc r25, r1 + 20d6: 91 f7 brne .-28 ; 0x20bc + 20d8: e5 e8 ldi r30, 0x85 ; 133 + 20da: f1 e2 ldi r31, 0x21 ; 33 + 20dc: 80 81 ld r24, Z + 20de: 8e 7f andi r24, 0xFE ; 254 + 20e0: 80 83 st Z, r24 + 20e2: ee e8 ldi r30, 0x8E ; 142 + 20e4: f1 e2 ldi r31, 0x21 ; 33 + 20e6: 80 81 ld r24, Z + 20e8: 8e 7f andi r24, 0xFE ; 254 + 20ea: 80 83 st Z, r24 + 20ec: e7 e9 ldi r30, 0x97 ; 151 + 20ee: f1 e2 ldi r31, 0x21 ; 33 + 20f0: 80 81 ld r24, Z + 20f2: 8e 7f andi r24, 0xFE ; 254 + 20f4: 80 83 st Z, r24 + 20f6: e0 ea ldi r30, 0xA0 ; 160 + 20f8: f1 e2 ldi r31, 0x21 ; 33 + 20fa: 80 81 ld r24, Z + 20fc: 8e 7f andi r24, 0xFE ; 254 + 20fe: 80 83 st Z, r24 + 2100: e9 ea ldi r30, 0xA9 ; 169 + 2102: f1 e2 ldi r31, 0x21 ; 33 + 2104: 80 81 ld r24, Z + 2106: 8e 7f andi r24, 0xFE ; 254 + 2108: 80 83 st Z, r24 + 210a: e2 eb ldi r30, 0xB2 ; 178 + 210c: f1 e2 ldi r31, 0x21 ; 33 + 210e: 80 81 ld r24, Z + 2110: 8e 7f andi r24, 0xFE ; 254 + 2112: 80 83 st Z, r24 + 2114: 6a e1 ldi r22, 0x1A ; 26 + 2116: 70 e0 ldi r23, 0x00 ; 0 + 2118: 82 e0 ldi r24, 0x02 ; 2 + 211a: ee dc rcall .-1572 ; 0x1af8 + 211c: 8f 3f cpi r24, 0xFF ; 255 + 211e: 19 f0 breq .+6 ; 0x2126 + 2120: 80 93 fa 04 sts 0x04FA, r24 + 2124: 03 c0 rjmp .+6 ; 0x212c + 2126: 8f e1 ldi r24, 0x1F ; 31 + 2128: 80 93 fa 04 sts 0x04FA, r24 + 212c: 6b e1 ldi r22, 0x1B ; 27 + 212e: 70 e0 ldi r23, 0x00 ; 0 + 2130: 82 e0 ldi r24, 0x02 ; 2 + 2132: e2 dc rcall .-1596 ; 0x1af8 + 2134: 8f 3f cpi r24, 0xFF ; 255 + 2136: 19 f0 breq .+6 ; 0x213e + 2138: 80 93 fb 04 sts 0x04FB, r24 + 213c: 03 c0 rjmp .+6 ; 0x2144 + 213e: 8f e1 ldi r24, 0x1F ; 31 + 2140: 80 93 fb 04 sts 0x04FB, r24 + 2144: e0 ec ldi r30, 0xC0 ; 192 + 2146: f4 e0 ldi r31, 0x04 ; 4 + 2148: 80 81 ld r24, Z + 214a: 83 60 ori r24, 0x03 ; 3 + 214c: 80 83 st Z, r24 + 214e: 80 81 ld r24, Z + 2150: 80 68 ori r24, 0x80 ; 128 + 2152: 80 83 st Z, r24 + 2154: 80 81 ld r24, Z + 2156: 80 61 ori r24, 0x10 ; 16 + 2158: 80 83 st Z, r24 + 215a: 80 e1 ldi r24, 0x10 ; 16 + 215c: 92 e2 ldi r25, 0x22 ; 34 + 215e: 86 83 std Z+6, r24 ; 0x06 + 2160: 97 83 std Z+7, r25 ; 0x07 + 2162: 80 81 ld r24, Z + 2164: 80 62 ori r24, 0x20 ; 32 + 2166: 80 83 st Z, r24 + 2168: 8f ef ldi r24, 0xFF ; 255 + 216a: 80 93 c5 04 sts 0x04C5, r24 + 216e: e8 ec ldi r30, 0xC8 ; 200 + 2170: f4 e0 ldi r31, 0x04 ; 4 + 2172: 80 81 ld r24, Z + 2174: 82 60 ori r24, 0x02 ; 2 + 2176: 80 83 st Z, r24 + 2178: 10 92 54 22 sts 0x2254, r1 + 217c: 80 91 47 2c lds r24, 0x2C47 + 2180: 8f 3f cpi r24, 0xFF ; 255 + 2182: 09 f4 brne .+2 ; 0x2186 + 2184: ff cf rjmp .-2 ; 0x2184 + 2186: 8f b7 in r24, 0x3f ; 63 + 2188: f8 94 cli + 218a: e7 e4 ldi r30, 0x47 ; 71 + 218c: fc e2 ldi r31, 0x2C ; 44 + 218e: 90 81 ld r25, Z + 2190: 9f 5f subi r25, 0xFF ; 255 + 2192: 90 83 st Z, r25 + 2194: 8f bf out 0x3f, r24 ; 63 + 2196: 5c df rcall .-328 ; 0x2050 + 2198: cf bf out 0x3f, r28 ; 63 + 219a: df 91 pop r29 + 219c: cf 91 pop r28 + 219e: 08 95 ret + +000021a0 : + 21a0: 80 93 c3 04 sts 0x04C3, r24 + 21a4: 08 95 ret + +000021a6 : + 21a6: 80 91 c3 04 lds r24, 0x04C3 + 21aa: 08 95 ret + +000021ac : + 21ac: 80 93 5e 24 sts 0x245E, r24 + 21b0: 90 93 5f 24 sts 0x245F, r25 + 21b4: 60 93 60 24 sts 0x2460, r22 + 21b8: 70 93 61 24 sts 0x2461, r23 + 21bc: 08 95 ret + +000021be : + 21be: e8 2f mov r30, r24 + 21c0: ef 70 andi r30, 0x0F ; 15 + 21c2: f0 e0 ldi r31, 0x00 ; 0 + 21c4: ee 0f add r30, r30 + 21c6: ff 1f adc r31, r31 + 21c8: 99 27 eor r25, r25 + 21ca: 87 fd sbrc r24, 7 + 21cc: 90 95 com r25 + 21ce: 88 27 eor r24, r24 + 21d0: 99 0f add r25, r25 + 21d2: 88 1f adc r24, r24 + 21d4: 99 27 eor r25, r25 + 21d6: e8 0f add r30, r24 + 21d8: f9 1f adc r31, r25 + 21da: ee 0f add r30, r30 + 21dc: ff 1f adc r31, r31 + 21de: ee 0f add r30, r30 + 21e0: ff 1f adc r31, r31 + 21e2: ee 0f add r30, r30 + 21e4: ff 1f adc r31, r31 + 21e6: e0 5f subi r30, 0xF0 ; 240 + 21e8: fd 4d sbci r31, 0xDD ; 221 + 21ea: 81 81 ldd r24, Z+1 ; 0x01 + 21ec: 80 7c andi r24, 0xC0 ; 192 + 21ee: d9 f5 brne .+118 ; 0x2266 + 21f0: 63 70 andi r22, 0x03 ; 3 + 21f2: 61 30 cpi r22, 0x01 ; 1 + 21f4: 29 f0 breq .+10 ; 0x2200 + 21f6: 10 f4 brcc .+4 ; 0x21fc + 21f8: 80 e4 ldi r24, 0x40 ; 64 + 21fa: 03 c0 rjmp .+6 ; 0x2202 + 21fc: 80 e8 ldi r24, 0x80 ; 128 + 21fe: 01 c0 rjmp .+2 ; 0x2202 + 2200: 80 ec ldi r24, 0xC0 ; 192 + 2202: 40 38 cpi r20, 0x80 ; 128 + 2204: 51 05 cpc r21, r1 + 2206: e1 f0 breq .+56 ; 0x2240 + 2208: 50 f4 brcc .+20 ; 0x221e + 220a: 40 32 cpi r20, 0x20 ; 32 + 220c: 51 05 cpc r21, r1 + 220e: a1 f0 breq .+40 ; 0x2238 + 2210: 40 34 cpi r20, 0x40 ; 64 + 2212: 51 05 cpc r21, r1 + 2214: 99 f0 breq .+38 ; 0x223c + 2216: 40 31 cpi r20, 0x10 ; 16 + 2218: 51 05 cpc r21, r1 + 221a: 61 f4 brne .+24 ; 0x2234 + 221c: 19 c0 rjmp .+50 ; 0x2250 + 221e: 41 15 cp r20, r1 + 2220: 92 e0 ldi r25, 0x02 ; 2 + 2222: 59 07 cpc r21, r25 + 2224: 89 f0 breq .+34 ; 0x2248 + 2226: 4f 3f cpi r20, 0xFF ; 255 + 2228: 93 e0 ldi r25, 0x03 ; 3 + 222a: 59 07 cpc r21, r25 + 222c: 79 f0 breq .+30 ; 0x224c + 222e: 41 15 cp r20, r1 + 2230: 51 40 sbci r21, 0x01 ; 1 + 2232: 41 f0 breq .+16 ; 0x2244 + 2234: 20 e0 ldi r18, 0x00 ; 0 + 2236: 0d c0 rjmp .+26 ; 0x2252 + 2238: 22 e0 ldi r18, 0x02 ; 2 + 223a: 0b c0 rjmp .+22 ; 0x2252 + 223c: 23 e0 ldi r18, 0x03 ; 3 + 223e: 09 c0 rjmp .+18 ; 0x2252 + 2240: 24 e0 ldi r18, 0x04 ; 4 + 2242: 07 c0 rjmp .+14 ; 0x2252 + 2244: 25 e0 ldi r18, 0x05 ; 5 + 2246: 05 c0 rjmp .+10 ; 0x2252 + 2248: 26 e0 ldi r18, 0x06 ; 6 + 224a: 03 c0 rjmp .+6 ; 0x2252 + 224c: 27 e0 ldi r18, 0x07 ; 7 + 224e: 01 c0 rjmp .+2 ; 0x2252 + 2250: 21 e0 ldi r18, 0x01 ; 1 + 2252: 11 82 std Z+1, r1 ; 0x01 + 2254: 96 e0 ldi r25, 0x06 ; 6 + 2256: 90 83 st Z, r25 + 2258: 82 2b or r24, r18 + 225a: 81 83 std Z+1, r24 ; 0x01 + 225c: 81 81 ldd r24, Z+1 ; 0x01 + 225e: 80 62 ori r24, 0x20 ; 32 + 2260: 81 83 std Z+1, r24 ; 0x01 + 2262: 81 e0 ldi r24, 0x01 ; 1 + 2264: 08 95 ret + 2266: 80 e0 ldi r24, 0x00 ; 0 + 2268: 08 95 ret + +0000226a : + 226a: e8 2f mov r30, r24 + 226c: ef 70 andi r30, 0x0F ; 15 + 226e: f0 e0 ldi r31, 0x00 ; 0 + 2270: ee 0f add r30, r30 + 2272: ff 1f adc r31, r31 + 2274: 99 27 eor r25, r25 + 2276: 87 fd sbrc r24, 7 + 2278: 90 95 com r25 + 227a: 88 27 eor r24, r24 + 227c: 99 0f add r25, r25 + 227e: 88 1f adc r24, r24 + 2280: 99 27 eor r25, r25 + 2282: e8 0f add r30, r24 + 2284: f9 1f adc r31, r25 + 2286: ee 0f add r30, r30 + 2288: ff 1f adc r31, r31 + 228a: ee 0f add r30, r30 + 228c: ff 1f adc r31, r31 + 228e: ee 0f add r30, r30 + 2290: ff 1f adc r31, r31 + 2292: e0 5f subi r30, 0xF0 ; 240 + 2294: fd 4d sbci r31, 0xDD ; 221 + 2296: 81 81 ldd r24, Z+1 ; 0x01 + 2298: 82 fb bst r24, 2 + 229a: 88 27 eor r24, r24 + 229c: 80 f9 bld r24, 0 + 229e: 08 95 ret + +000022a0 : + 22a0: e8 2f mov r30, r24 + 22a2: ef 70 andi r30, 0x0F ; 15 + 22a4: f0 e0 ldi r31, 0x00 ; 0 + 22a6: ee 0f add r30, r30 + 22a8: ff 1f adc r31, r31 + 22aa: 28 2f mov r18, r24 + 22ac: 33 27 eor r19, r19 + 22ae: 27 fd sbrc r18, 7 + 22b0: 30 95 com r19 + 22b2: 22 27 eor r18, r18 + 22b4: 33 0f add r19, r19 + 22b6: 22 1f adc r18, r18 + 22b8: 33 27 eor r19, r19 + 22ba: e2 0f add r30, r18 + 22bc: f3 1f adc r31, r19 + 22be: ee 0f add r30, r30 + 22c0: ff 1f adc r31, r31 + 22c2: ee 0f add r30, r30 + 22c4: ff 1f adc r31, r31 + 22c6: ee 0f add r30, r30 + 22c8: ff 1f adc r31, r31 + 22ca: e0 5f subi r30, 0xF0 ; 240 + 22cc: fd 4d sbci r31, 0xDD ; 221 + 22ce: 91 81 ldd r25, Z+1 ; 0x01 + 22d0: 92 ff sbrs r25, 2 + 22d2: 0e c0 rjmp .+28 ; 0x22f0 + 22d4: 91 81 ldd r25, Z+1 ; 0x01 + 22d6: 9b 7f andi r25, 0xFB ; 251 + 22d8: 91 83 std Z+1, r25 ; 0x01 + 22da: 22 dd rcall .-1468 ; 0x1d20 + 22dc: fc 01 movw r30, r24 + 22de: 80 81 ld r24, Z + 22e0: 80 ff sbrs r24, 0 + 22e2: 06 c0 rjmp .+12 ; 0x22f0 + 22e4: 8e 7f andi r24, 0xFE ; 254 + 22e6: 80 83 st Z, r24 + 22e8: 07 80 ldd r0, Z+7 ; 0x07 + 22ea: f0 85 ldd r31, Z+8 ; 0x08 + 22ec: e0 2d mov r30, r0 + 22ee: 09 95 icall + 22f0: 81 e0 ldi r24, 0x01 ; 1 + 22f2: 08 95 ret + +000022f4 : + 22f4: 7f 92 push r7 + 22f6: 8f 92 push r8 + 22f8: 9f 92 push r9 + 22fa: af 92 push r10 + 22fc: bf 92 push r11 + 22fe: cf 92 push r12 + 2300: df 92 push r13 + 2302: ef 92 push r14 + 2304: ff 92 push r15 + 2306: 0f 93 push r16 + 2308: 1f 93 push r17 + 230a: cf 93 push r28 + 230c: df 93 push r29 + 230e: 98 2e mov r9, r24 + 2310: 86 2e mov r8, r22 + 2312: 5a 01 movw r10, r20 + 2314: 69 01 movw r12, r18 + 2316: 04 dd rcall .-1528 ; 0x1d20 + 2318: 7c 01 movw r14, r24 + 231a: 79 2c mov r7, r9 + 231c: 77 1c adc r7, r7 + 231e: 77 24 eor r7, r7 + 2320: 77 1c adc r7, r7 + 2322: c9 2d mov r28, r9 + 2324: cf 70 andi r28, 0x0F ; 15 + 2326: d0 e0 ldi r29, 0x00 ; 0 + 2328: cc 0f add r28, r28 + 232a: dd 1f adc r29, r29 + 232c: c7 0d add r28, r7 + 232e: d1 1d adc r29, r1 + 2330: cc 0f add r28, r28 + 2332: dd 1f adc r29, r29 + 2334: cc 0f add r28, r28 + 2336: dd 1f adc r29, r29 + 2338: cc 0f add r28, r28 + 233a: dd 1f adc r29, r29 + 233c: c0 5f subi r28, 0xF0 ; 240 + 233e: dd 4d sbci r29, 0xDD ; 221 + 2340: 89 81 ldd r24, Y+1 ; 0x01 + 2342: 80 7c andi r24, 0xC0 ; 192 + 2344: 09 f4 brne .+2 ; 0x2348 + 2346: 4b c0 rjmp .+150 ; 0x23de + 2348: 89 81 ldd r24, Y+1 ; 0x01 + 234a: 80 7c andi r24, 0xC0 ; 192 + 234c: 80 3c cpi r24, 0xC0 ; 192 + 234e: 19 f0 breq .+6 ; 0x2356 + 2350: 89 81 ldd r24, Y+1 ; 0x01 + 2352: 82 fd sbrc r24, 2 + 2354: 46 c0 rjmp .+140 ; 0x23e2 + 2356: 8f b7 in r24, 0x3f ; 63 + 2358: f8 94 cli + 235a: f7 01 movw r30, r14 + 235c: 90 81 ld r25, Z + 235e: 90 ff sbrs r25, 0 + 2360: 03 c0 rjmp .+6 ; 0x2368 + 2362: 8f bf out 0x3f, r24 ; 63 + 2364: 71 2c mov r7, r1 + 2366: 3e c0 rjmp .+124 ; 0x23e4 + 2368: f7 01 movw r30, r14 + 236a: 90 81 ld r25, Z + 236c: 91 60 ori r25, 0x01 ; 1 + 236e: 90 83 st Z, r25 + 2370: 8f bf out 0x3f, r24 ; 63 + 2372: f7 01 movw r30, r14 + 2374: a1 82 std Z+1, r10 ; 0x01 + 2376: b2 82 std Z+2, r11 ; 0x02 + 2378: c3 82 std Z+3, r12 ; 0x03 + 237a: d4 82 std Z+4, r13 ; 0x04 + 237c: 15 82 std Z+5, r1 ; 0x05 + 237e: 16 82 std Z+6, r1 ; 0x06 + 2380: 07 83 std Z+7, r16 ; 0x07 + 2382: 10 87 std Z+8, r17 ; 0x08 + 2384: 81 10 cpse r8, r1 + 2386: 06 c0 rjmp .+12 ; 0x2394 + 2388: 91 e0 ldi r25, 0x01 ; 1 + 238a: c1 14 cp r12, r1 + 238c: d1 04 cpc r13, r1 + 238e: 19 f0 breq .+6 ; 0x2396 + 2390: 90 e0 ldi r25, 0x00 ; 0 + 2392: 01 c0 rjmp .+2 ; 0x2396 + 2394: 91 e0 ldi r25, 0x01 ; 1 + 2396: f7 01 movw r30, r14 + 2398: 80 81 ld r24, Z + 239a: 90 fb bst r25, 0 + 239c: 81 f9 bld r24, 1 + 239e: 8b 7f andi r24, 0xFB ; 251 + 23a0: 80 83 st Z, r24 + 23a2: 77 20 and r7, r7 + 23a4: 19 f0 breq .+6 ; 0x23ac + 23a6: 1e 82 std Y+6, r1 ; 0x06 + 23a8: 1f 82 std Y+7, r1 ; 0x07 + 23aa: 14 c0 rjmp .+40 ; 0x23d4 + 23ac: 89 81 ldd r24, Y+1 ; 0x01 + 23ae: 80 7c andi r24, 0xC0 ; 192 + 23b0: 80 3c cpi r24, 0xC0 ; 192 + 23b2: 61 f4 brne .+24 ; 0x23cc + 23b4: ce 01 movw r24, r28 + 23b6: 90 dc rcall .-1760 ; 0x1cd8 + 23b8: bc 01 movw r22, r24 + 23ba: c6 01 movw r24, r12 + 23bc: 42 d2 rcall .+1156 ; 0x2842 <__udivmodhi4> + 23be: 89 2b or r24, r25 + 23c0: 29 f0 breq .+10 ; 0x23cc + 23c2: f7 01 movw r30, r14 + 23c4: 80 81 ld r24, Z + 23c6: 8e 7f andi r24, 0xFE ; 254 + 23c8: 80 83 st Z, r24 + 23ca: 0c c0 rjmp .+24 ; 0x23e4 + 23cc: 1a 82 std Y+2, r1 ; 0x02 + 23ce: 1b 82 std Y+3, r1 ; 0x03 + 23d0: 1e 82 std Y+6, r1 ; 0x06 + 23d2: 1f 82 std Y+7, r1 ; 0x07 + 23d4: 89 2d mov r24, r9 + 23d6: 2e dd rcall .-1444 ; 0x1e34 + 23d8: 77 24 eor r7, r7 + 23da: 73 94 inc r7 + 23dc: 03 c0 rjmp .+6 ; 0x23e4 + 23de: 71 2c mov r7, r1 + 23e0: 01 c0 rjmp .+2 ; 0x23e4 + 23e2: 71 2c mov r7, r1 + 23e4: 87 2d mov r24, r7 + 23e6: df 91 pop r29 + 23e8: cf 91 pop r28 + 23ea: 1f 91 pop r17 + 23ec: 0f 91 pop r16 + 23ee: ff 90 pop r15 + 23f0: ef 90 pop r14 + 23f2: df 90 pop r13 + 23f4: cf 90 pop r12 + 23f6: bf 90 pop r11 + 23f8: af 90 pop r10 + 23fa: 9f 90 pop r9 + 23fc: 8f 90 pop r8 + 23fe: 7f 90 pop r7 + 2400: 08 95 ret + +00002402 : + 2402: ff 92 push r15 + 2404: 0f 93 push r16 + 2406: 1f 93 push r17 + 2408: cf 93 push r28 + 240a: df 93 push r29 + 240c: 18 2f mov r17, r24 + 240e: f8 2e mov r15, r24 + 2410: ff 1c adc r15, r15 + 2412: ff 24 eor r15, r15 + 2414: ff 1c adc r15, r15 + 2416: c8 2f mov r28, r24 + 2418: cf 70 andi r28, 0x0F ; 15 + 241a: d0 e0 ldi r29, 0x00 ; 0 + 241c: cc 0f add r28, r28 + 241e: dd 1f adc r29, r29 + 2420: cf 0d add r28, r15 + 2422: d1 1d adc r29, r1 + 2424: cc 0f add r28, r28 + 2426: dd 1f adc r29, r29 + 2428: cc 0f add r28, r28 + 242a: dd 1f adc r29, r29 + 242c: cc 0f add r28, r28 + 242e: dd 1f adc r29, r29 + 2430: c0 5f subi r28, 0xF0 ; 240 + 2432: dd 4d sbci r29, 0xDD ; 221 + 2434: 75 dc rcall .-1814 ; 0x1d20 + 2436: dc 01 movw r26, r24 + 2438: fe 01 movw r30, r28 + 243a: 02 e0 ldi r16, 0x02 ; 2 + 243c: 05 93 las Z, r16 + 243e: 8c 91 ld r24, X + 2440: 80 ff sbrs r24, 0 + 2442: 12 c0 rjmp .+36 ; 0x2468 + 2444: 8e 7f andi r24, 0xFE ; 254 + 2446: 8c 93 st X, r24 + 2448: 17 96 adiw r26, 0x07 ; 7 + 244a: ed 91 ld r30, X+ + 244c: fc 91 ld r31, X + 244e: 18 97 sbiw r26, 0x08 ; 8 + 2450: 30 97 sbiw r30, 0x00 ; 0 + 2452: 51 f0 breq .+20 ; 0x2468 + 2454: ff 20 and r15, r15 + 2456: 19 f0 breq .+6 ; 0x245e + 2458: 6e 81 ldd r22, Y+6 ; 0x06 + 245a: 7f 81 ldd r23, Y+7 ; 0x07 + 245c: 02 c0 rjmp .+4 ; 0x2462 + 245e: 6a 81 ldd r22, Y+2 ; 0x02 + 2460: 7b 81 ldd r23, Y+3 ; 0x03 + 2462: 41 2f mov r20, r17 + 2464: 81 e0 ldi r24, 0x01 ; 1 + 2466: 09 95 icall + 2468: df 91 pop r29 + 246a: cf 91 pop r28 + 246c: 1f 91 pop r17 + 246e: 0f 91 pop r16 + 2470: ff 90 pop r15 + 2472: 08 95 ret + +00002474 : + 2474: cf 93 push r28 + 2476: c8 2f mov r28, r24 + 2478: c4 df rcall .-120 ; 0x2402 + 247a: ec 2f mov r30, r28 + 247c: ef 70 andi r30, 0x0F ; 15 + 247e: f0 e0 ldi r31, 0x00 ; 0 + 2480: ee 0f add r30, r30 + 2482: ff 1f adc r31, r31 + 2484: 8c 2f mov r24, r28 + 2486: 99 27 eor r25, r25 + 2488: 87 fd sbrc r24, 7 + 248a: 90 95 com r25 + 248c: 88 27 eor r24, r24 + 248e: 99 0f add r25, r25 + 2490: 88 1f adc r24, r24 + 2492: 99 27 eor r25, r25 + 2494: e8 0f add r30, r24 + 2496: f9 1f adc r31, r25 + 2498: ee 0f add r30, r30 + 249a: ff 1f adc r31, r31 + 249c: ee 0f add r30, r30 + 249e: ff 1f adc r31, r31 + 24a0: ee 0f add r30, r30 + 24a2: ff 1f adc r31, r31 + 24a4: e0 5f subi r30, 0xF0 ; 240 + 24a6: fd 4d sbci r31, 0xDD ; 221 + 24a8: 11 82 std Z+1, r1 ; 0x01 + 24aa: cf 91 pop r28 + 24ac: 08 95 ret + +000024ae : + 24ae: 0f 93 push r16 + 24b0: e8 2f mov r30, r24 + 24b2: ef 70 andi r30, 0x0F ; 15 + 24b4: f0 e0 ldi r31, 0x00 ; 0 + 24b6: ee 0f add r30, r30 + 24b8: ff 1f adc r31, r31 + 24ba: 28 2f mov r18, r24 + 24bc: 33 27 eor r19, r19 + 24be: 27 fd sbrc r18, 7 + 24c0: 30 95 com r19 + 24c2: 22 27 eor r18, r18 + 24c4: 33 0f add r19, r19 + 24c6: 22 1f adc r18, r18 + 24c8: 33 27 eor r19, r19 + 24ca: e2 0f add r30, r18 + 24cc: f3 1f adc r31, r19 + 24ce: ee 0f add r30, r30 + 24d0: ff 1f adc r31, r31 + 24d2: ee 0f add r30, r30 + 24d4: ff 1f adc r31, r31 + 24d6: ee 0f add r30, r30 + 24d8: ff 1f adc r31, r31 + 24da: e0 5f subi r30, 0xF0 ; 240 + 24dc: fd 4d sbci r31, 0xDD ; 221 + 24de: 91 81 ldd r25, Z+1 ; 0x01 + 24e0: 94 60 ori r25, 0x04 ; 4 + 24e2: 91 83 std Z+1, r25 ; 0x01 + 24e4: 01 e0 ldi r16, 0x01 ; 1 + 24e6: 06 93 lac Z, r16 + 24e8: 8c df rcall .-232 ; 0x2402 + 24ea: 81 e0 ldi r24, 0x01 ; 1 + 24ec: 0f 91 pop r16 + 24ee: 08 95 ret + +000024f0 <__vector_125>: + * USB bus event interrupt includes : + * - USB line events SOF, reset, suspend, resume, wakeup + * - endpoint control errors underflow, overflow, stall + */ +ISR(USB_BUSEVENT_vect) +{ + 24f0: 1f 92 push r1 + 24f2: 0f 92 push r0 + 24f4: 0f b6 in r0, 0x3f ; 63 + 24f6: 0f 92 push r0 + 24f8: 11 24 eor r1, r1 + 24fa: 0f 93 push r16 + 24fc: 2f 93 push r18 + 24fe: 3f 93 push r19 + 2500: 4f 93 push r20 + 2502: 5f 93 push r21 + 2504: 6f 93 push r22 + 2506: 7f 93 push r23 + 2508: 8f 93 push r24 + 250a: 9f 93 push r25 + 250c: af 93 push r26 + 250e: bf 93 push r27 + 2510: ef 93 push r30 + 2512: ff 93 push r31 + if (udd_is_start_of_frame_event()) { + 2514: 80 91 cb 04 lds r24, 0x04CB + 2518: 88 23 and r24, r24 + 251a: 44 f4 brge .+16 ; 0x252c <__vector_125+0x3c> + udd_ack_start_of_frame_event(); + 251c: 80 e8 ldi r24, 0x80 ; 128 + 251e: 80 93 ca 04 sts 0x04CA, r24 + udc_sof_notify(); + 2522: 0e 94 82 09 call 0x1304 ; 0x1304 +#ifdef UDC_SOF_EVENT + UDC_SOF_EVENT(); + 2526: 0e 94 88 01 call 0x310 ; 0x310 +#endif + goto udd_interrupt_bus_event_end; + 252a: 90 c0 rjmp .+288 ; 0x264c <__vector_125+0x15c> +} + +static bool udd_ctrl_interrupt_error(void) +{ + // Underflow only managed for control endpoint + if (udd_is_underflow_event()) { + 252c: 80 91 cb 04 lds r24, 0x04CB + 2530: 82 ff sbrs r24, 2 + 2532: 20 c0 rjmp .+64 ; 0x2574 <__vector_125+0x84> + udd_ack_underflow_event(); + 2534: 84 e0 ldi r24, 0x04 ; 4 + 2536: 80 93 ca 04 sts 0x04CA, r24 + if (udd_control_in_underflow()) { + 253a: 80 91 18 22 lds r24, 0x2218 + 253e: 86 ff sbrs r24, 6 + 2540: 85 c0 rjmp .+266 ; 0x264c <__vector_125+0x15c> + udd_control_out_clear_NACK0(); +} + +static void udd_ctrl_underflow(void) +{ + if (udd_is_tc_event() || udd_ctrl_interrupt_tc_setup()) { + 2542: 80 91 cc 04 lds r24, 0x04CC + 2546: 81 fd sbrc r24, 1 + 2548: 81 c0 rjmp .+258 ; 0x264c <__vector_125+0x15c> + 254a: 05 dc rcall .-2038 ; 0x1d56 + 254c: 81 11 cpse r24, r1 + 254e: 7e c0 rjmp .+252 ; 0x264c <__vector_125+0x15c> + return; // underflow ignored if a transfer complete has been no processed + } + if (UDD_EPCTRL_DATA_OUT == udd_ep_control_state) { + 2550: 80 91 ff 21 lds r24, 0x21FF + 2554: 81 30 cpi r24, 0x01 ; 1 + 2556: 11 f4 brne .+4 ; 0x255c <__vector_125+0x6c> + // Host want to stop OUT transaction + // then stop to wait OUT data phase and wait IN ZLP handshake + udd_ctrl_send_zlp_in(); + 2558: 3b db rcall .-2442 ; 0x1bd0 + 255a: 78 c0 rjmp .+240 ; 0x264c <__vector_125+0x15c> + } else if (UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP == udd_ep_control_state) { + 255c: 84 30 cpi r24, 0x04 ; 4 + 255e: 09 f0 breq .+2 ; 0x2562 <__vector_125+0x72> + 2560: 75 c0 rjmp .+234 ; 0x264c <__vector_125+0x15c> + // A OUT handshake is waiting by device, + // but host want extra IN data then stall extra IN data and following status stage + udd_control_in_enable_stall(); + 2562: e9 e1 ldi r30, 0x19 ; 25 + 2564: f2 e2 ldi r31, 0x22 ; 34 + 2566: 04 e0 ldi r16, 0x04 ; 4 + 2568: 05 93 las Z, r16 + udd_control_out_enable_stall(); + 256a: e1 e1 ldi r30, 0x11 ; 17 + 256c: f2 e2 ldi r31, 0x22 ; 34 + 256e: 04 e0 ldi r16, 0x04 ; 4 + 2570: 05 93 las Z, r16 + 2572: 6c c0 rjmp .+216 ; 0x264c <__vector_125+0x15c> + udd_ctrl_underflow(); + } + return true; + } + // Overflow only managed for control endpoint + if (udd_is_overflow_event()) { + 2574: 80 91 cb 04 lds r24, 0x04CB + 2578: 81 ff sbrs r24, 1 + 257a: 63 c0 rjmp .+198 ; 0x2642 <__vector_125+0x152> + udd_ack_overflow_event(); + 257c: 82 e0 ldi r24, 0x02 ; 2 + 257e: 80 93 ca 04 sts 0x04CA, r24 + if (udd_control_out_overflow()) { + 2582: 80 91 10 22 lds r24, 0x2210 + 2586: 86 ff sbrs r24, 6 + 2588: 61 c0 rjmp .+194 ; 0x264c <__vector_125+0x15c> + } +} + +static void udd_ctrl_overflow(void) +{ + if (udd_is_tc_event() || udd_ctrl_interrupt_tc_setup()) { + 258a: 80 91 cc 04 lds r24, 0x04CC + 258e: 81 fd sbrc r24, 1 + 2590: 5d c0 rjmp .+186 ; 0x264c <__vector_125+0x15c> + 2592: e1 db rcall .-2110 ; 0x1d56 + 2594: 81 11 cpse r24, r1 + 2596: 5a c0 rjmp .+180 ; 0x264c <__vector_125+0x15c> + return; // overflow ignored if a transfer complete has been no processed + } + if (UDD_EPCTRL_DATA_IN == udd_ep_control_state) { + 2598: 80 91 ff 21 lds r24, 0x21FF + 259c: 82 30 cpi r24, 0x02 ; 2 + 259e: 41 f4 brne .+16 ; 0x25b0 <__vector_125+0xc0> + udd_control_in_clear_NACK0(); +} + +static void udd_ctrl_send_zlp_out(void) +{ + udd_ep_control_state = UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP; + 25a0: 84 e0 ldi r24, 0x04 ; 4 + 25a2: 80 93 ff 21 sts 0x21FF, r24 + // Valid reception of OUT packet on control endpoint + udd_control_out_clear_NACK0(); + 25a6: e0 e1 ldi r30, 0x10 ; 16 + 25a8: f2 e2 ldi r31, 0x22 ; 34 + 25aa: 02 e0 ldi r16, 0x02 ; 2 + 25ac: 06 93 lac Z, r16 + 25ae: 4e c0 rjmp .+156 ; 0x264c <__vector_125+0x15c> + } + if (UDD_EPCTRL_DATA_IN == udd_ep_control_state) { + // Host want to stop IN transaction + // then stop to wait IN data phase and wait OUT ZLP handshake + udd_ctrl_send_zlp_out(); + } else if (UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP == udd_ep_control_state) { + 25b0: 83 30 cpi r24, 0x03 ; 3 + 25b2: 09 f0 breq .+2 ; 0x25b6 <__vector_125+0xc6> + 25b4: 4b c0 rjmp .+150 ; 0x264c <__vector_125+0x15c> + // A IN handshake is waiting by device, + // but host want extra OUT data then stall extra OUT data and following status stage + udd_control_in_enable_stall(); + 25b6: e9 e1 ldi r30, 0x19 ; 25 + 25b8: f2 e2 ldi r31, 0x22 ; 34 + 25ba: 04 e0 ldi r16, 0x04 ; 4 + 25bc: 05 93 las Z, r16 + udd_control_out_enable_stall(); + 25be: e1 e1 ldi r30, 0x11 ; 17 + 25c0: f2 e2 ldi r31, 0x22 ; 34 + 25c2: 04 e0 ldi r16, 0x04 ; 4 + 25c4: 05 93 las Z, r16 + 25c6: 42 c0 rjmp .+132 ; 0x264c <__vector_125+0x15c> + + if (udd_ctrl_interrupt_error()) { + goto udd_interrupt_bus_event_end; + } + if (udd_is_reset_event()) { + udd_ack_reset_event(); + 25c8: 80 e1 ldi r24, 0x10 ; 16 + 25ca: 80 93 ca 04 sts 0x04CA, r24 +#if (0!=USB_DEVICE_MAX_EP) + // Abort all endpoint jobs on going + uint8_t i; + for (i = 1; i < USB_DEVICE_MAX_EP; i++) { + udd_ep_abort(i); + 25ce: 81 e0 ldi r24, 0x01 ; 1 + 25d0: 18 df rcall .-464 ; 0x2402 + udd_ep_abort(i | USB_EP_DIR_IN); + 25d2: 81 e8 ldi r24, 0x81 ; 129 + 25d4: 16 df rcall .-468 ; 0x2402 + udd_ack_reset_event(); +#if (0!=USB_DEVICE_MAX_EP) + // Abort all endpoint jobs on going + uint8_t i; + for (i = 1; i < USB_DEVICE_MAX_EP; i++) { + udd_ep_abort(i); + 25d6: 82 e0 ldi r24, 0x02 ; 2 + 25d8: 14 df rcall .-472 ; 0x2402 + udd_ep_abort(i | USB_EP_DIR_IN); + 25da: 82 e8 ldi r24, 0x82 ; 130 + 25dc: 12 df rcall .-476 ; 0x2402 + } +#endif + udc_reset(); + 25de: 0e 94 5d 09 call 0x12ba ; 0x12ba + + // Reset USB address to 0 + udd_set_device_address(0); + 25e2: 10 92 c3 04 sts 0x04C3, r1 +#endif + } + + // Enable endpoint + ep_ctrl = udd_ep_get_ctrl(ep); + udd_endpoint_disable(ep_ctrl); + 25e6: e1 e1 ldi r30, 0x11 ; 17 + 25e8: f2 e2 ldi r31, 0x22 ; 34 + 25ea: 10 82 st Z, r1 + udd_endpoint_clear_status(ep_ctrl); + 25ec: 96 e0 ldi r25, 0x06 ; 6 + 25ee: 90 93 10 22 sts 0x2210, r25 + udd_endpoint_set_control(ep_ctrl, (uint8_t) type | (uint8_t) size); + 25f2: 83 e4 ldi r24, 0x43 ; 67 + 25f4: 80 83 st Z, r24 +#endif + } + + // Enable endpoint + ep_ctrl = udd_ep_get_ctrl(ep); + udd_endpoint_disable(ep_ctrl); + 25f6: e9 e1 ldi r30, 0x19 ; 25 + 25f8: f2 e2 ldi r31, 0x22 ; 34 + 25fa: 10 82 st Z, r1 + udd_endpoint_clear_status(ep_ctrl); + 25fc: 90 93 18 22 sts 0x2218, r25 + udd_endpoint_set_control(ep_ctrl, (uint8_t) type | (uint8_t) size); + 2600: 80 83 st Z, r24 + udd_set_device_address(0); + // Alloc and configure control endpoint + udd_ep_init(0, USB_EP_TYPE_CONTROL, USB_DEVICE_EP_CTRL_SIZE); + udd_ep_init(0 | USB_EP_DIR_IN, USB_EP_TYPE_CONTROL, + USB_DEVICE_EP_CTRL_SIZE); + udd_control_out_set_buf(&udd_ctrl_buffer); + 2602: 8b eb ldi r24, 0xBB ; 187 + 2604: 91 e2 ldi r25, 0x21 ; 33 + 2606: 80 93 14 22 sts 0x2214, r24 + 260a: 90 93 15 22 sts 0x2215, r25 + // Reset endpoint control management + udd_ctrl_init(); + 260e: a7 da rcall .-2738 ; 0x1b5e + goto udd_interrupt_bus_event_end; + 2610: 1d c0 rjmp .+58 ; 0x264c <__vector_125+0x15c> + } + + if (udd_is_suspend_event()) { + 2612: 80 91 cb 04 lds r24, 0x04CB + 2616: 86 ff sbrs r24, 6 + 2618: 08 c0 rjmp .+16 ; 0x262a <__vector_125+0x13a> + udd_ack_suspend_event(); + 261a: 80 e4 ldi r24, 0x40 ; 64 + 261c: 80 93 ca 04 sts 0x04CA, r24 + udd_sleep_mode(false); // Enter in SUSPEND mode + 2620: 80 e0 ldi r24, 0x00 ; 0 + 2622: 74 da rcall .-2840 ; 0x1b0c +#ifdef UDC_SUSPEND_EVENT + UDC_SUSPEND_EVENT(); + 2624: 0e 94 86 01 call 0x30c ; 0x30c +#endif + goto udd_interrupt_bus_event_end; + 2628: 11 c0 rjmp .+34 ; 0x264c <__vector_125+0x15c> + } + + if (udd_is_resume_event()) { + 262a: 80 91 cb 04 lds r24, 0x04CB + 262e: 85 ff sbrs r24, 5 + 2630: 0d c0 rjmp .+26 ; 0x264c <__vector_125+0x15c> + udd_ack_resume_event(); + 2632: 80 e2 ldi r24, 0x20 ; 32 + 2634: 80 93 ca 04 sts 0x04CA, r24 + udd_sleep_mode(true); // Enter in power reduction mode + 2638: 81 e0 ldi r24, 0x01 ; 1 + 263a: 68 da rcall .-2864 ; 0x1b0c +#ifdef UDC_RESUME_EVENT + UDC_RESUME_EVENT(); + 263c: 0e 94 87 01 call 0x30e ; 0x30e +#endif + goto udd_interrupt_bus_event_end; + 2640: 05 c0 rjmp .+10 ; 0x264c <__vector_125+0x15c> + } + + if (udd_ctrl_interrupt_error()) { + goto udd_interrupt_bus_event_end; + } + if (udd_is_reset_event()) { + 2642: 80 91 cb 04 lds r24, 0x04CB + 2646: 84 fd sbrc r24, 4 + 2648: bf cf rjmp .-130 ; 0x25c8 <__vector_125+0xd8> + 264a: e3 cf rjmp .-58 ; 0x2612 <__vector_125+0x122> + goto udd_interrupt_bus_event_end; + } + +udd_interrupt_bus_event_end: + return; +} + 264c: ff 91 pop r31 + 264e: ef 91 pop r30 + 2650: bf 91 pop r27 + 2652: af 91 pop r26 + 2654: 9f 91 pop r25 + 2656: 8f 91 pop r24 + 2658: 7f 91 pop r23 + 265a: 6f 91 pop r22 + 265c: 5f 91 pop r21 + 265e: 4f 91 pop r20 + 2660: 3f 91 pop r19 + 2662: 2f 91 pop r18 + 2664: 0f 91 pop r16 + 2666: 0f 90 pop r0 + 2668: 0f be out 0x3f, r0 ; 63 + 266a: 0f 90 pop r0 + 266c: 1f 90 pop r1 + 266e: 18 95 reti + +00002670 <__vector_126>: + * \brief Function called by USB transfer complete interrupt + * + * USB transfer complete interrupt includes events about endpoint transfer on all endpoints. + */ +ISR(USB_TRNCOMPL_vect) +{ + 2670: 1f 92 push r1 + 2672: 0f 92 push r0 + 2674: 0f b6 in r0, 0x3f ; 63 + 2676: 0f 92 push r0 + 2678: 11 24 eor r1, r1 + 267a: 0f 93 push r16 + 267c: 1f 93 push r17 + 267e: 2f 93 push r18 + 2680: 3f 93 push r19 + 2682: 4f 93 push r20 + 2684: 5f 93 push r21 + 2686: 6f 93 push r22 + 2688: 7f 93 push r23 + 268a: 8f 93 push r24 + 268c: 9f 93 push r25 + 268e: af 93 push r26 + 2690: bf 93 push r27 + 2692: cf 93 push r28 + 2694: df 93 push r29 + 2696: ef 93 push r30 + 2698: ff 93 push r31 + int8_t rp; + UDD_EP_t *ep_ctrl; + udd_ep_id_t ep; +#endif + + if (!udd_is_tc_event()) { + 269a: 80 91 cc 04 lds r24, 0x04CC + 269e: 81 fd sbrc r24, 1 + 26a0: 03 c0 rjmp .+6 ; 0x26a8 <__vector_126+0x38> + // If no other transfer complete + // then check reception of SETUP packet on control endpoint + if (udd_ctrl_interrupt_tc_setup()) { + 26a2: 59 db rcall .-2382 ; 0x1d56 + 26a4: 81 11 cpse r24, r1 + 26a6: b8 c0 rjmp .+368 ; 0x2818 <__vector_126+0x1a8> + goto udd_interrupt_tc_end; + } + Assert(false); + } + // Check IN/OUT transfer complete on all endpoints + udd_ack_tc_event(); + 26a8: 82 e0 ldi r24, 0x02 ; 2 + 26aa: 80 93 cc 04 sts 0x04CC, r24 + +#if (0!=USB_DEVICE_MAX_EP) + //** Decode TC FIFO + // Compute ep addr + rp = udd_get_fifo_rp(); + 26ae: 80 91 c5 04 lds r24, 0x04C5 + i_fifo = 2 * (1 + ~rp); + 26b2: 81 95 neg r24 + 26b4: 88 0f add r24, r24 + ad = ((uint16_t) udd_sram.ep_ctrl) - i_fifo; + 26b6: e0 e1 ldi r30, 0x10 ; 16 + 26b8: f2 e2 ldi r31, 0x22 ; 34 + 26ba: e8 1b sub r30, r24 + 26bc: f1 09 sbc r31, r1 + p_ad = (uint16_t *) ad; + // Compute ep + ep_index = (((uint16_t) * p_ad - ((uint16_t) udd_sram.ep_ctrl)) >> 3); + 26be: 20 81 ld r18, Z + 26c0: 31 81 ldd r19, Z+1 ; 0x01 + 26c2: 20 51 subi r18, 0x10 ; 16 + 26c4: 32 42 sbci r19, 0x22 ; 34 + 26c6: 36 95 lsr r19 + 26c8: 27 95 ror r18 + 26ca: 36 95 lsr r19 + 26cc: 27 95 ror r18 + 26ce: 36 95 lsr r19 + 26d0: 27 95 ror r18 + ep = (ep_index / 2) + ((ep_index & 1) ? USB_EP_DIR_IN : 0); + 26d2: 82 2f mov r24, r18 + 26d4: 86 95 lsr r24 + 26d6: 20 ff sbrs r18, 0 + 26d8: 02 c0 rjmp .+4 ; 0x26de <__vector_126+0x6e> + 26da: 90 e8 ldi r25, 0x80 ; 128 + 26dc: 01 c0 rjmp .+2 ; 0x26e0 <__vector_126+0x70> + 26de: 90 e0 ldi r25, 0x00 ; 0 + 26e0: 89 0f add r24, r25 + udd_endpoint_set_control(ep_ctrl, (uint8_t) type | (uint8_t) size); +} + +static UDD_EP_t *udd_ep_get_ctrl(udd_ep_id_t ep) +{ + return &udd_sram.ep_ctrl[(2 * (ep & USB_EP_ADDR_MASK) + + 26e2: e8 2f mov r30, r24 + 26e4: ef 70 andi r30, 0x0F ; 15 + 26e6: f0 e0 ldi r31, 0x00 ; 0 + 26e8: ee 0f add r30, r30 + 26ea: ff 1f adc r31, r31 + ((ep & USB_EP_DIR_IN) ? 1 : 0))]; + 26ec: 28 2f mov r18, r24 + 26ee: 33 27 eor r19, r19 + 26f0: 27 fd sbrc r18, 7 + 26f2: 30 95 com r19 + 26f4: 22 27 eor r18, r18 + 26f6: 33 0f add r19, r19 + 26f8: 22 1f adc r18, r18 + 26fa: 33 27 eor r19, r19 + udd_endpoint_set_control(ep_ctrl, (uint8_t) type | (uint8_t) size); +} + +static UDD_EP_t *udd_ep_get_ctrl(udd_ep_id_t ep) +{ + return &udd_sram.ep_ctrl[(2 * (ep & USB_EP_ADDR_MASK) + + 26fc: e2 0f add r30, r18 + 26fe: f3 1f adc r31, r19 + ep_index = (((uint16_t) * p_ad - ((uint16_t) udd_sram.ep_ctrl)) >> 3); + ep = (ep_index / 2) + ((ep_index & 1) ? USB_EP_DIR_IN : 0); + Assert(USB_DEVICE_MAX_EP >= (ep & USB_EP_ADDR_MASK)); + + // Ack IT TC of endpoint + ep_ctrl = udd_ep_get_ctrl(ep); + 2700: ee 0f add r30, r30 + 2702: ff 1f adc r31, r31 + 2704: ee 0f add r30, r30 + 2706: ff 1f adc r31, r31 + 2708: ee 0f add r30, r30 + 270a: ff 1f adc r31, r31 + 270c: e0 5f subi r30, 0xF0 ; 240 + 270e: fd 4d sbci r31, 0xDD ; 221 + if (!udd_endpoint_transfer_complete(ep_ctrl)) { + 2710: 90 81 ld r25, Z + 2712: 95 ff sbrs r25, 5 + 2714: 81 c0 rjmp .+258 ; 0x2818 <__vector_126+0x1a8> + return; // Error, TC is generated by Multipacket transfer + } + udd_endpoint_ack_transfer_complete(ep_ctrl); + 2716: 00 e2 ldi r16, 0x20 ; 32 + 2718: 06 93 lac Z, r16 + + // Check status on control endpoint + if (ep == 0) { + 271a: 81 11 cpse r24, r1 + 271c: 78 c0 rjmp .+240 ; 0x280e <__vector_126+0x19e> + +static void udd_ctrl_out_received(void) +{ + uint16_t nb_data; + + if (UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP == udd_ep_control_state) { + 271e: 80 91 ff 21 lds r24, 0x21FF + 2722: 84 30 cpi r24, 0x04 ; 4 + 2724: 19 f4 brne .+6 ; 0x272c <__vector_126+0xbc> + // Valid end of setup request + udd_ctrl_endofrequest(); + 2726: 62 da rcall .-2876 ; 0x1bec + // Reinitializes control endpoint management + udd_ctrl_init(); + 2728: 1a da rcall .-3020 ; 0x1b5e + 272a: 76 c0 rjmp .+236 ; 0x2818 <__vector_126+0x1a8> + return; + } + Assert(udd_ep_control_state == UDD_EPCTRL_DATA_OUT); + + // Read data received during OUT phase + nb_data = udd_control_out_get_bytecnt(); + 272c: c0 91 12 22 lds r28, 0x2212 + 2730: d0 91 13 22 lds r29, 0x2213 + + if (udd_g_ctrlreq.payload_size < (udd_ctrl_payload_nb_trans + nb_data)) { + 2734: 80 91 60 24 lds r24, 0x2460 + 2738: 90 91 61 24 lds r25, 0x2461 + 273c: 00 91 fb 21 lds r16, 0x21FB + 2740: 10 91 fc 21 lds r17, 0x21FC + 2744: 98 01 movw r18, r16 + 2746: 2c 0f add r18, r28 + 2748: 3d 1f adc r19, r29 + 274a: 82 17 cp r24, r18 + 274c: 93 07 cpc r25, r19 + 274e: 18 f4 brcc .+6 ; 0x2756 <__vector_126+0xe6> + // Payload buffer too small, ignore data remaining + nb_data = udd_g_ctrlreq.payload_size - udd_ctrl_payload_nb_trans; + 2750: ec 01 movw r28, r24 + 2752: c0 1b sub r28, r16 + 2754: d1 0b sbc r29, r17 + } + + memcpy((uint8_t *) (udd_g_ctrlreq.payload + udd_ctrl_payload_nb_trans), + 2756: 80 91 5e 24 lds r24, 0x245E + 275a: 90 91 5f 24 lds r25, 0x245F + 275e: ae 01 movw r20, r28 + 2760: 6b eb ldi r22, 0xBB ; 187 + 2762: 71 e2 ldi r23, 0x21 ; 33 + 2764: 80 0f add r24, r16 + 2766: 91 1f adc r25, r17 + 2768: 86 d0 rcall .+268 ; 0x2876 + udd_ctrl_buffer, nb_data); + udd_ctrl_payload_nb_trans += nb_data; + 276a: 0c 0f add r16, r28 + 276c: 1d 1f adc r17, r29 + 276e: 00 93 fb 21 sts 0x21FB, r16 + 2772: 10 93 fc 21 sts 0x21FC, r17 + + if ((USB_DEVICE_EP_CTRL_SIZE != nb_data) || (udd_g_ctrlreq.req.wLength + 2776: c0 34 cpi r28, 0x40 ; 64 + 2778: d1 05 cpc r29, r1 + 277a: 69 f4 brne .+26 ; 0x2796 <__vector_126+0x126> + <= (udd_ctrl_prev_payload_nb_trans + + udd_ctrl_payload_nb_trans))) { + 277c: 80 91 fd 21 lds r24, 0x21FD + 2780: 90 91 fe 21 lds r25, 0x21FE + 2784: 80 0f add r24, r16 + 2786: 91 1f adc r25, r17 + + memcpy((uint8_t *) (udd_g_ctrlreq.payload + udd_ctrl_payload_nb_trans), + udd_ctrl_buffer, nb_data); + udd_ctrl_payload_nb_trans += nb_data; + + if ((USB_DEVICE_EP_CTRL_SIZE != nb_data) || (udd_g_ctrlreq.req.wLength + 2788: 20 91 5c 24 lds r18, 0x245C + 278c: 30 91 5d 24 lds r19, 0x245D + 2790: 82 17 cp r24, r18 + 2792: 93 07 cpc r25, r19 + 2794: 88 f0 brcs .+34 ; 0x27b8 <__vector_126+0x148> + // End of reception because it is a short packet + // or all data are transfered + + // Before send ZLP, call intermediate callback + // in case of data receive generate a stall + udd_g_ctrlreq.payload_size = udd_ctrl_payload_nb_trans; + 2796: 00 93 60 24 sts 0x2460, r16 + 279a: 10 93 61 24 sts 0x2461, r17 + if (NULL != udd_g_ctrlreq.over_under_run) { + 279e: e0 91 64 24 lds r30, 0x2464 + 27a2: f0 91 65 24 lds r31, 0x2465 + 27a6: 30 97 sbiw r30, 0x00 ; 0 + 27a8: 29 f0 breq .+10 ; 0x27b4 <__vector_126+0x144> + if (!udd_g_ctrlreq.over_under_run()) { + 27aa: 09 95 icall + 27ac: 81 11 cpse r24, r1 + 27ae: 02 c0 rjmp .+4 ; 0x27b4 <__vector_126+0x144> + // Stall ZLP + udd_ctrl_stall_data(); + 27b0: 01 da rcall .-3070 ; 0x1bb4 + 27b2: 32 c0 rjmp .+100 ; 0x2818 <__vector_126+0x1a8> + return; + } + } + // Send IN ZLP to ACK setup request + udd_ctrl_send_zlp_in(); + 27b4: 0d da rcall .-3046 ; 0x1bd0 + 27b6: 30 c0 rjmp .+96 ; 0x2818 <__vector_126+0x1a8> + return; + } + + if (udd_g_ctrlreq.payload_size == udd_ctrl_payload_nb_trans) { + 27b8: 80 91 60 24 lds r24, 0x2460 + 27bc: 90 91 61 24 lds r25, 0x2461 + 27c0: 08 17 cp r16, r24 + 27c2: 19 07 cpc r17, r25 + 27c4: f9 f4 brne .+62 ; 0x2804 <__vector_126+0x194> + // Overrun then request a new payload buffer + if (!udd_g_ctrlreq.over_under_run) { + 27c6: e0 91 64 24 lds r30, 0x2464 + 27ca: f0 91 65 24 lds r31, 0x2465 + 27ce: 30 97 sbiw r30, 0x00 ; 0 + 27d0: 11 f4 brne .+4 ; 0x27d6 <__vector_126+0x166> + // No callback available to request a new payload buffer + udd_ctrl_stall_data(); + 27d2: f0 d9 rcall .-3104 ; 0x1bb4 + 27d4: 21 c0 rjmp .+66 ; 0x2818 <__vector_126+0x1a8> + return; + } + if (!udd_g_ctrlreq.over_under_run()) { + 27d6: 09 95 icall + 27d8: 81 11 cpse r24, r1 + 27da: 02 c0 rjmp .+4 ; 0x27e0 <__vector_126+0x170> + // No new payload buffer delivered + udd_ctrl_stall_data(); + 27dc: eb d9 rcall .-3114 ; 0x1bb4 + 27de: 1c c0 rjmp .+56 ; 0x2818 <__vector_126+0x1a8> + return; + } + // New payload buffer available + // Update number of total data received + udd_ctrl_prev_payload_nb_trans += udd_ctrl_payload_nb_trans; + 27e0: 20 91 fd 21 lds r18, 0x21FD + 27e4: 30 91 fe 21 lds r19, 0x21FE + 27e8: 80 91 fb 21 lds r24, 0x21FB + 27ec: 90 91 fc 21 lds r25, 0x21FC + 27f0: 82 0f add r24, r18 + 27f2: 93 1f adc r25, r19 + 27f4: 80 93 fd 21 sts 0x21FD, r24 + 27f8: 90 93 fe 21 sts 0x21FE, r25 + // Reinit reception on payload buffer + udd_ctrl_payload_nb_trans = 0; + 27fc: 10 92 fb 21 sts 0x21FB, r1 + 2800: 10 92 fc 21 sts 0x21FC, r1 + } + // Free buffer of OUT control endpoint to authorize next reception + udd_control_out_clear_NACK0(); + 2804: e0 e1 ldi r30, 0x10 ; 16 + 2806: f2 e2 ldi r31, 0x22 ; 34 + 2808: 02 e0 ldi r16, 0x02 ; 2 + 280a: 06 93 lac Z, r16 + 280c: 05 c0 rjmp .+10 ; 0x2818 <__vector_126+0x1a8> + // Check status on control endpoint + if (ep == 0) { + udd_ctrl_out_received(); + goto udd_interrupt_tc_end; // Interrupt acked by control endpoint managed + } + if (ep == (0 | USB_EP_DIR_IN)) { + 280e: 80 38 cpi r24, 0x80 ; 128 + 2810: 11 f4 brne .+4 ; 0x2816 <__vector_126+0x1a6> + udd_ctrl_in_sent(); + 2812: f4 d9 rcall .-3096 ; 0x1bfc + goto udd_interrupt_tc_end; // Interrupt acked by control endpoint managed + 2814: 01 c0 rjmp .+2 ; 0x2818 <__vector_126+0x1a8> + } + Assert(udd_ep_is_valid(ep)); + // Manage end of transfer on endpoint bulk/interrupt/isochronous + udd_ep_trans_complet(ep); + 2816: 0e db rcall .-2532 ; 0x1e34 + } +#endif + +udd_interrupt_tc_end: + return; +} + 2818: ff 91 pop r31 + 281a: ef 91 pop r30 + 281c: df 91 pop r29 + 281e: cf 91 pop r28 + 2820: bf 91 pop r27 + 2822: af 91 pop r26 + 2824: 9f 91 pop r25 + 2826: 8f 91 pop r24 + 2828: 7f 91 pop r23 + 282a: 6f 91 pop r22 + 282c: 5f 91 pop r21 + 282e: 4f 91 pop r20 + 2830: 3f 91 pop r19 + 2832: 2f 91 pop r18 + 2834: 1f 91 pop r17 + 2836: 0f 91 pop r16 + 2838: 0f 90 pop r0 + 283a: 0f be out 0x3f, r0 ; 63 + 283c: 0f 90 pop r0 + 283e: 1f 90 pop r1 + 2840: 18 95 reti + +00002842 <__udivmodhi4>: + 2842: aa 1b sub r26, r26 + 2844: bb 1b sub r27, r27 + 2846: 51 e1 ldi r21, 0x11 ; 17 + 2848: 07 c0 rjmp .+14 ; 0x2858 <__udivmodhi4_ep> + +0000284a <__udivmodhi4_loop>: + 284a: aa 1f adc r26, r26 + 284c: bb 1f adc r27, r27 + 284e: a6 17 cp r26, r22 + 2850: b7 07 cpc r27, r23 + 2852: 10 f0 brcs .+4 ; 0x2858 <__udivmodhi4_ep> + 2854: a6 1b sub r26, r22 + 2856: b7 0b sbc r27, r23 + +00002858 <__udivmodhi4_ep>: + 2858: 88 1f adc r24, r24 + 285a: 99 1f adc r25, r25 + 285c: 5a 95 dec r21 + 285e: a9 f7 brne .-22 ; 0x284a <__udivmodhi4_loop> + 2860: 80 95 com r24 + 2862: 90 95 com r25 + 2864: bc 01 movw r22, r24 + 2866: cd 01 movw r24, r26 + 2868: 08 95 ret + +0000286a <__tablejump2__>: + 286a: ee 0f add r30, r30 + 286c: ff 1f adc r31, r31 + +0000286e <__tablejump__>: + 286e: 05 90 lpm r0, Z+ + 2870: f4 91 lpm r31, Z + 2872: e0 2d mov r30, r0 + 2874: 09 94 ijmp + +00002876 : + 2876: fb 01 movw r30, r22 + 2878: dc 01 movw r26, r24 + 287a: 02 c0 rjmp .+4 ; 0x2880 + 287c: 01 90 ld r0, Z+ + 287e: 0d 92 st X+, r0 + 2880: 41 50 subi r20, 0x01 ; 1 + 2882: 50 40 sbci r21, 0x00 ; 0 + 2884: d8 f7 brcc .-10 ; 0x287c + 2886: 08 95 ret + +00002888 <_exit>: + 2888: f8 94 cli + +0000288a <__stop_program>: + 288a: ff cf rjmp .-2 ; 0x288a <__stop_program> diff --git a/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.map b/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.map new file mode 100644 index 00000000..de13dd0f --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.map @@ -0,0 +1,2825 @@ +Archive member included because of file (symbol) + +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + src/ASF/xmega/drivers/usb/usb_device.o (__udivmodhi4) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o (exit) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + src/main.o (__tablejump2__) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + src/main.o (__do_copy_data) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + src/main.o (__do_clear_bss) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + src/ASF/xmega/drivers/nvm/nvm.o (memcpy) + +Allocating common symbols +Common symbol size file + +dacBuf_CH1 0x200 src/main.o +udd_g_ctrlreq 0x10 src/main.o +sleepmgr_locks 0x6 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o +dacBuf_CH2 0x200 src/main.o +isoBuf 0x5dc src/main.o + +Discarded input sections + + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .group 0x00000000 0x8 src/tiny_dig.o + .text 0x00000000 0x0 src/tiny_dig.o + .data 0x00000000 0x0 src/tiny_dig.o + .bss 0x00000000 0x0 src/tiny_dig.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/boards/user_board/init.o + .text 0x00000000 0x0 src/ASF/common/boards/user_board/init.o + .data 0x00000000 0x0 src/ASF/common/boards/user_board/init.o + .bss 0x00000000 0x0 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0xa3c src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x10 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x1ad src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x293 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x9e src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x5486 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x9a src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0xf1 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x34 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x10 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x18 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x5e src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x10 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x22 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x166 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x1c src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x35 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x66 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x4d1 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x97 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x17 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x250 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x76 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x16 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x6e3 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x10 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x175 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x40 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x69 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x32 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0xe4 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x34 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x256 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x7c src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x26 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x5e src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x10 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x2e src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x68 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x2f src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x154 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x9a src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x4c src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x244 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x17e src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x1c src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x16 src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x1c src/ASF/common/boards/user_board/init.o + .debug_macro 0x00000000 0x7b src/ASF/common/boards/user_board/init.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/ASF/common/services/ioport/xmega/ioport_compat.o + .text 0x00000000 0x0 src/ASF/common/services/ioport/xmega/ioport_compat.o + .data 0x00000000 0x0 src/ASF/common/services/ioport/xmega/ioport_compat.o + .bss 0x00000000 0x0 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_info 0x00000000 0x6f src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_abbrev 0x00000000 0x29 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_aranges + 0x00000000 0x18 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x18f src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0xa3c src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x4d1 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x1ad src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x293 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x9e src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x5486 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x9a src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0xf1 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x34 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x18 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x5e src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x22 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x166 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x1c src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x35 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x66 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x97 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x17 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x250 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x76 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x16 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x6e3 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x175 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x40 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x69 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x32 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0xe4 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x7c src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_macro 0x00000000 0x109 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_line 0x00000000 0x424 src/ASF/common/services/ioport/xmega/ioport_compat.o + .debug_str 0x00000000 0x23bac src/ASF/common/services/ioport/xmega/ioport_compat.o + .comment 0x00000000 0x31 src/ASF/common/services/ioport/xmega/ioport_compat.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .group 0x00000000 0x8 src/main.o + .text 0x00000000 0x0 src/main.o + .data 0x00000000 0x0 src/main.o + .bss 0x00000000 0x0 src/main.o + .data.test_byte + 0x00000000 0x1 src/main.o + .debug_macro 0x00000000 0xa3c src/main.o + .debug_macro 0x00000000 0x1ad src/main.o + .debug_macro 0x00000000 0x293 src/main.o + .debug_macro 0x00000000 0x5486 src/main.o + .debug_macro 0x00000000 0x9a src/main.o + .debug_macro 0x00000000 0xf1 src/main.o + .debug_macro 0x00000000 0x34 src/main.o + .debug_macro 0x00000000 0x10 src/main.o + .debug_macro 0x00000000 0x18 src/main.o + .debug_macro 0x00000000 0x5e src/main.o + .debug_macro 0x00000000 0x10 src/main.o + .debug_macro 0x00000000 0x22 src/main.o + .debug_macro 0x00000000 0x1c src/main.o + .debug_macro 0x00000000 0x35 src/main.o + .debug_macro 0x00000000 0x66 src/main.o + .debug_macro 0x00000000 0x4d1 src/main.o + .debug_macro 0x00000000 0x97 src/main.o + .debug_macro 0x00000000 0x17 src/main.o + .debug_macro 0x00000000 0x250 src/main.o + .debug_macro 0x00000000 0x76 src/main.o + .debug_macro 0x00000000 0x16 src/main.o + .debug_macro 0x00000000 0x6e3 src/main.o + .debug_macro 0x00000000 0x10 src/main.o + .debug_macro 0x00000000 0x175 src/main.o + .debug_macro 0x00000000 0x40 src/main.o + .debug_macro 0x00000000 0x69 src/main.o + .debug_macro 0x00000000 0x32 src/main.o + .debug_macro 0x00000000 0xe4 src/main.o + .debug_macro 0x00000000 0x34 src/main.o + .debug_macro 0x00000000 0x256 src/main.o + .debug_macro 0x00000000 0x7c src/main.o + .debug_macro 0x00000000 0x26 src/main.o + .debug_macro 0x00000000 0x5e src/main.o + .debug_macro 0x00000000 0x10 src/main.o + .debug_macro 0x00000000 0x2e src/main.o + .debug_macro 0x00000000 0x68 src/main.o + .debug_macro 0x00000000 0x2f src/main.o + .debug_macro 0x00000000 0x154 src/main.o + .debug_macro 0x00000000 0x9a src/main.o + .debug_macro 0x00000000 0x4c src/main.o + .debug_macro 0x00000000 0x244 src/main.o + .debug_macro 0x00000000 0x17e src/main.o + .debug_macro 0x00000000 0x1c src/main.o + .debug_macro 0x00000000 0x16 src/main.o + .debug_macro 0x00000000 0x1c src/main.o + .debug_macro 0x00000000 0x7b src/main.o + .debug_macro 0x00000000 0x58 src/main.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_adc.o + .text 0x00000000 0x0 src/tiny_adc.o + .data 0x00000000 0x0 src/tiny_adc.o + .bss 0x00000000 0x0 src/tiny_adc.o + .debug_macro 0x00000000 0xa3c src/tiny_adc.o + .debug_macro 0x00000000 0x1ad src/tiny_adc.o + .debug_macro 0x00000000 0x293 src/tiny_adc.o + .debug_macro 0x00000000 0x58 src/tiny_adc.o + .debug_macro 0x00000000 0x10 src/tiny_adc.o + .debug_macro 0x00000000 0x97 src/tiny_adc.o + .debug_macro 0x00000000 0xeb src/tiny_adc.o + .debug_macro 0x00000000 0xaa src/tiny_adc.o + .debug_macro 0x00000000 0x5486 src/tiny_adc.o + .debug_macro 0x00000000 0x9a src/tiny_adc.o + .debug_macro 0x00000000 0xf1 src/tiny_adc.o + .debug_macro 0x00000000 0x34 src/tiny_adc.o + .debug_macro 0x00000000 0x10 src/tiny_adc.o + .debug_macro 0x00000000 0x18 src/tiny_adc.o + .debug_macro 0x00000000 0x5e src/tiny_adc.o + .debug_macro 0x00000000 0x10 src/tiny_adc.o + .debug_macro 0x00000000 0x22 src/tiny_adc.o + .debug_macro 0x00000000 0xef src/tiny_adc.o + .debug_macro 0x00000000 0x1c src/tiny_adc.o + .debug_macro 0x00000000 0x35 src/tiny_adc.o + .debug_macro 0x00000000 0x66 src/tiny_adc.o + .debug_macro 0x00000000 0x4d1 src/tiny_adc.o + .debug_macro 0x00000000 0x97 src/tiny_adc.o + .debug_macro 0x00000000 0x17 src/tiny_adc.o + .debug_macro 0x00000000 0x250 src/tiny_adc.o + .debug_macro 0x00000000 0x76 src/tiny_adc.o + .debug_macro 0x00000000 0x16 src/tiny_adc.o + .debug_macro 0x00000000 0x6e3 src/tiny_adc.o + .debug_macro 0x00000000 0x10 src/tiny_adc.o + .debug_macro 0x00000000 0x175 src/tiny_adc.o + .debug_macro 0x00000000 0x40 src/tiny_adc.o + .debug_macro 0x00000000 0x69 src/tiny_adc.o + .debug_macro 0x00000000 0x32 src/tiny_adc.o + .debug_macro 0x00000000 0xe4 src/tiny_adc.o + .debug_macro 0x00000000 0x34 src/tiny_adc.o + .debug_macro 0x00000000 0x256 src/tiny_adc.o + .debug_macro 0x00000000 0x7c src/tiny_adc.o + .debug_macro 0x00000000 0x26 src/tiny_adc.o + .debug_macro 0x00000000 0x5e src/tiny_adc.o + .debug_macro 0x00000000 0x10 src/tiny_adc.o + .debug_macro 0x00000000 0x2e src/tiny_adc.o + .debug_macro 0x00000000 0x68 src/tiny_adc.o + .debug_macro 0x00000000 0x2f src/tiny_adc.o + .debug_macro 0x00000000 0x154 src/tiny_adc.o + .debug_macro 0x00000000 0x9a src/tiny_adc.o + .debug_macro 0x00000000 0x4c src/tiny_adc.o + .debug_macro 0x00000000 0x244 src/tiny_adc.o + .debug_macro 0x00000000 0x17e src/tiny_adc.o + .debug_macro 0x00000000 0x1c src/tiny_adc.o + .debug_macro 0x00000000 0x16 src/tiny_adc.o + .debug_macro 0x00000000 0x1c src/tiny_adc.o + .debug_macro 0x00000000 0x7b src/tiny_adc.o + .debug_macro 0x00000000 0x58 src/tiny_adc.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dac.o + .text 0x00000000 0x0 src/tiny_dac.o + .data 0x00000000 0x0 src/tiny_dac.o + .bss 0x00000000 0x0 src/tiny_dac.o + .debug_macro 0x00000000 0xa3c src/tiny_dac.o + .debug_macro 0x00000000 0x10 src/tiny_dac.o + .debug_macro 0x00000000 0x1ad src/tiny_dac.o + .debug_macro 0x00000000 0x293 src/tiny_dac.o + .debug_macro 0x00000000 0x9e src/tiny_dac.o + .debug_macro 0x00000000 0x5486 src/tiny_dac.o + .debug_macro 0x00000000 0x9a src/tiny_dac.o + .debug_macro 0x00000000 0xf1 src/tiny_dac.o + .debug_macro 0x00000000 0x34 src/tiny_dac.o + .debug_macro 0x00000000 0x10 src/tiny_dac.o + .debug_macro 0x00000000 0x18 src/tiny_dac.o + .debug_macro 0x00000000 0x5e src/tiny_dac.o + .debug_macro 0x00000000 0x10 src/tiny_dac.o + .debug_macro 0x00000000 0x22 src/tiny_dac.o + .debug_macro 0x00000000 0x166 src/tiny_dac.o + .debug_macro 0x00000000 0x1c src/tiny_dac.o + .debug_macro 0x00000000 0x35 src/tiny_dac.o + .debug_macro 0x00000000 0x66 src/tiny_dac.o + .debug_macro 0x00000000 0x4d1 src/tiny_dac.o + .debug_macro 0x00000000 0x97 src/tiny_dac.o + .debug_macro 0x00000000 0x17 src/tiny_dac.o + .debug_macro 0x00000000 0x250 src/tiny_dac.o + .debug_macro 0x00000000 0x76 src/tiny_dac.o + .debug_macro 0x00000000 0x16 src/tiny_dac.o + .debug_macro 0x00000000 0x6e3 src/tiny_dac.o + .debug_macro 0x00000000 0x10 src/tiny_dac.o + .debug_macro 0x00000000 0x175 src/tiny_dac.o + .debug_macro 0x00000000 0x40 src/tiny_dac.o + .debug_macro 0x00000000 0x69 src/tiny_dac.o + .debug_macro 0x00000000 0x32 src/tiny_dac.o + .debug_macro 0x00000000 0xe4 src/tiny_dac.o + .debug_macro 0x00000000 0x34 src/tiny_dac.o + .debug_macro 0x00000000 0x256 src/tiny_dac.o + .debug_macro 0x00000000 0x7c src/tiny_dac.o + .debug_macro 0x00000000 0x26 src/tiny_dac.o + .debug_macro 0x00000000 0x5e src/tiny_dac.o + .debug_macro 0x00000000 0x10 src/tiny_dac.o + .debug_macro 0x00000000 0x2e src/tiny_dac.o + .debug_macro 0x00000000 0x68 src/tiny_dac.o + .debug_macro 0x00000000 0x2f src/tiny_dac.o + .debug_macro 0x00000000 0x154 src/tiny_dac.o + .debug_macro 0x00000000 0x9a src/tiny_dac.o + .debug_macro 0x00000000 0x4c src/tiny_dac.o + .debug_macro 0x00000000 0x244 src/tiny_dac.o + .debug_macro 0x00000000 0x17e src/tiny_dac.o + .debug_macro 0x00000000 0x1c src/tiny_dac.o + .debug_macro 0x00000000 0x16 src/tiny_dac.o + .debug_macro 0x00000000 0x1c src/tiny_dac.o + .debug_macro 0x00000000 0x7b src/tiny_dac.o + .debug_macro 0x00000000 0x58 src/tiny_dac.o + .debug_macro 0x00000000 0x10 src/tiny_dac.o + .debug_macro 0x00000000 0xeb src/tiny_dac.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_dma.o + .text 0x00000000 0x0 src/tiny_dma.o + .data 0x00000000 0x0 src/tiny_dma.o + .bss 0x00000000 0x0 src/tiny_dma.o + .debug_macro 0x00000000 0xa3c src/tiny_dma.o + .debug_macro 0x00000000 0x1ad src/tiny_dma.o + .debug_macro 0x00000000 0x293 src/tiny_dma.o + .debug_macro 0x00000000 0x58 src/tiny_dma.o + .debug_macro 0x00000000 0x10 src/tiny_dma.o + .debug_macro 0x00000000 0x97 src/tiny_dma.o + .debug_macro 0x00000000 0xeb src/tiny_dma.o + .debug_macro 0x00000000 0xaa src/tiny_dma.o + .debug_macro 0x00000000 0x5486 src/tiny_dma.o + .debug_macro 0x00000000 0x9a src/tiny_dma.o + .debug_macro 0x00000000 0xf1 src/tiny_dma.o + .debug_macro 0x00000000 0x34 src/tiny_dma.o + .debug_macro 0x00000000 0x10 src/tiny_dma.o + .debug_macro 0x00000000 0x18 src/tiny_dma.o + .debug_macro 0x00000000 0x5e src/tiny_dma.o + .debug_macro 0x00000000 0x10 src/tiny_dma.o + .debug_macro 0x00000000 0x22 src/tiny_dma.o + .debug_macro 0x00000000 0xef src/tiny_dma.o + .debug_macro 0x00000000 0x1c src/tiny_dma.o + .debug_macro 0x00000000 0x35 src/tiny_dma.o + .debug_macro 0x00000000 0x66 src/tiny_dma.o + .debug_macro 0x00000000 0x4d1 src/tiny_dma.o + .debug_macro 0x00000000 0x97 src/tiny_dma.o + .debug_macro 0x00000000 0x17 src/tiny_dma.o + .debug_macro 0x00000000 0x250 src/tiny_dma.o + .debug_macro 0x00000000 0x76 src/tiny_dma.o + .debug_macro 0x00000000 0x16 src/tiny_dma.o + .debug_macro 0x00000000 0x6e3 src/tiny_dma.o + .debug_macro 0x00000000 0x10 src/tiny_dma.o + .debug_macro 0x00000000 0x175 src/tiny_dma.o + .debug_macro 0x00000000 0x40 src/tiny_dma.o + .debug_macro 0x00000000 0x69 src/tiny_dma.o + .debug_macro 0x00000000 0x32 src/tiny_dma.o + .debug_macro 0x00000000 0xe4 src/tiny_dma.o + .debug_macro 0x00000000 0x34 src/tiny_dma.o + .debug_macro 0x00000000 0x256 src/tiny_dma.o + .debug_macro 0x00000000 0x7c src/tiny_dma.o + .debug_macro 0x00000000 0x26 src/tiny_dma.o + .debug_macro 0x00000000 0x5e src/tiny_dma.o + .debug_macro 0x00000000 0x10 src/tiny_dma.o + .debug_macro 0x00000000 0x2e src/tiny_dma.o + .debug_macro 0x00000000 0x68 src/tiny_dma.o + .debug_macro 0x00000000 0x2f src/tiny_dma.o + .debug_macro 0x00000000 0x154 src/tiny_dma.o + .debug_macro 0x00000000 0x9a src/tiny_dma.o + .debug_macro 0x00000000 0x4c src/tiny_dma.o + .debug_macro 0x00000000 0x244 src/tiny_dma.o + .debug_macro 0x00000000 0x17e src/tiny_dma.o + .debug_macro 0x00000000 0x1c src/tiny_dma.o + .debug_macro 0x00000000 0x16 src/tiny_dma.o + .debug_macro 0x00000000 0x1c src/tiny_dma.o + .debug_macro 0x00000000 0x7b src/tiny_dma.o + .debug_macro 0x00000000 0x58 src/tiny_dma.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_timer.o + .text 0x00000000 0x0 src/tiny_timer.o + .data 0x00000000 0x0 src/tiny_timer.o + .bss 0x00000000 0x0 src/tiny_timer.o + .debug_macro 0x00000000 0xa3c src/tiny_timer.o + .debug_macro 0x00000000 0x10 src/tiny_timer.o + .debug_macro 0x00000000 0x1ad src/tiny_timer.o + .debug_macro 0x00000000 0x293 src/tiny_timer.o + .debug_macro 0x00000000 0x9e src/tiny_timer.o + .debug_macro 0x00000000 0x5486 src/tiny_timer.o + .debug_macro 0x00000000 0x9a src/tiny_timer.o + .debug_macro 0x00000000 0xf1 src/tiny_timer.o + .debug_macro 0x00000000 0x34 src/tiny_timer.o + .debug_macro 0x00000000 0x10 src/tiny_timer.o + .debug_macro 0x00000000 0x18 src/tiny_timer.o + .debug_macro 0x00000000 0x5e src/tiny_timer.o + .debug_macro 0x00000000 0x10 src/tiny_timer.o + .debug_macro 0x00000000 0x22 src/tiny_timer.o + .debug_macro 0x00000000 0x166 src/tiny_timer.o + .debug_macro 0x00000000 0x1c src/tiny_timer.o + .debug_macro 0x00000000 0x35 src/tiny_timer.o + .debug_macro 0x00000000 0x66 src/tiny_timer.o + .debug_macro 0x00000000 0x4d1 src/tiny_timer.o + .debug_macro 0x00000000 0x97 src/tiny_timer.o + .debug_macro 0x00000000 0x17 src/tiny_timer.o + .debug_macro 0x00000000 0x250 src/tiny_timer.o + .debug_macro 0x00000000 0x76 src/tiny_timer.o + .debug_macro 0x00000000 0x16 src/tiny_timer.o + .debug_macro 0x00000000 0x6e3 src/tiny_timer.o + .debug_macro 0x00000000 0x10 src/tiny_timer.o + .debug_macro 0x00000000 0x175 src/tiny_timer.o + .debug_macro 0x00000000 0x40 src/tiny_timer.o + .debug_macro 0x00000000 0x69 src/tiny_timer.o + .debug_macro 0x00000000 0x32 src/tiny_timer.o + .debug_macro 0x00000000 0xe4 src/tiny_timer.o + .debug_macro 0x00000000 0x34 src/tiny_timer.o + .debug_macro 0x00000000 0x256 src/tiny_timer.o + .debug_macro 0x00000000 0x7c src/tiny_timer.o + .debug_macro 0x00000000 0x26 src/tiny_timer.o + .debug_macro 0x00000000 0x5e src/tiny_timer.o + .debug_macro 0x00000000 0x10 src/tiny_timer.o + .debug_macro 0x00000000 0x2e src/tiny_timer.o + .debug_macro 0x00000000 0x68 src/tiny_timer.o + .debug_macro 0x00000000 0x2f src/tiny_timer.o + .debug_macro 0x00000000 0x154 src/tiny_timer.o + .debug_macro 0x00000000 0x9a src/tiny_timer.o + .debug_macro 0x00000000 0x4c src/tiny_timer.o + .debug_macro 0x00000000 0x244 src/tiny_timer.o + .debug_macro 0x00000000 0x17e src/tiny_timer.o + .debug_macro 0x00000000 0x1c src/tiny_timer.o + .debug_macro 0x00000000 0x16 src/tiny_timer.o + .debug_macro 0x00000000 0x1c src/tiny_timer.o + .debug_macro 0x00000000 0x7b src/tiny_timer.o + .debug_macro 0x00000000 0x58 src/tiny_timer.o + .debug_macro 0x00000000 0x10 src/tiny_timer.o + .debug_macro 0x00000000 0xeb src/tiny_timer.o + .debug_macro 0x00000000 0x58 src/tiny_timer.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .group 0x00000000 0x8 src/tiny_uart.o + .text 0x00000000 0x0 src/tiny_uart.o + .data 0x00000000 0x0 src/tiny_uart.o + .bss 0x00000000 0x0 src/tiny_uart.o + .debug_macro 0x00000000 0xa3c src/tiny_uart.o + .debug_macro 0x00000000 0x10 src/tiny_uart.o + .debug_macro 0x00000000 0x1ad src/tiny_uart.o + .debug_macro 0x00000000 0x293 src/tiny_uart.o + .debug_macro 0x00000000 0x9e src/tiny_uart.o + .debug_macro 0x00000000 0x5486 src/tiny_uart.o + .debug_macro 0x00000000 0x9a src/tiny_uart.o + .debug_macro 0x00000000 0xf1 src/tiny_uart.o + .debug_macro 0x00000000 0x34 src/tiny_uart.o + .debug_macro 0x00000000 0x10 src/tiny_uart.o + .debug_macro 0x00000000 0x18 src/tiny_uart.o + .debug_macro 0x00000000 0x5e src/tiny_uart.o + .debug_macro 0x00000000 0x10 src/tiny_uart.o + .debug_macro 0x00000000 0x22 src/tiny_uart.o + .debug_macro 0x00000000 0x166 src/tiny_uart.o + .debug_macro 0x00000000 0x1c src/tiny_uart.o + .debug_macro 0x00000000 0x35 src/tiny_uart.o + .debug_macro 0x00000000 0x66 src/tiny_uart.o + .debug_macro 0x00000000 0x4d1 src/tiny_uart.o + .debug_macro 0x00000000 0x97 src/tiny_uart.o + .debug_macro 0x00000000 0x17 src/tiny_uart.o + .debug_macro 0x00000000 0x250 src/tiny_uart.o + .debug_macro 0x00000000 0x76 src/tiny_uart.o + .debug_macro 0x00000000 0x16 src/tiny_uart.o + .debug_macro 0x00000000 0x6e3 src/tiny_uart.o + .debug_macro 0x00000000 0x10 src/tiny_uart.o + .debug_macro 0x00000000 0x175 src/tiny_uart.o + .debug_macro 0x00000000 0x40 src/tiny_uart.o + .debug_macro 0x00000000 0x69 src/tiny_uart.o + .debug_macro 0x00000000 0x32 src/tiny_uart.o + .debug_macro 0x00000000 0xe4 src/tiny_uart.o + .debug_macro 0x00000000 0x34 src/tiny_uart.o + .debug_macro 0x00000000 0x256 src/tiny_uart.o + .debug_macro 0x00000000 0x7c src/tiny_uart.o + .debug_macro 0x00000000 0x26 src/tiny_uart.o + .debug_macro 0x00000000 0x5e src/tiny_uart.o + .debug_macro 0x00000000 0x10 src/tiny_uart.o + .debug_macro 0x00000000 0x2e src/tiny_uart.o + .debug_macro 0x00000000 0x68 src/tiny_uart.o + .debug_macro 0x00000000 0x2f src/tiny_uart.o + .debug_macro 0x00000000 0x154 src/tiny_uart.o + .debug_macro 0x00000000 0x9a src/tiny_uart.o + .debug_macro 0x00000000 0x4c src/tiny_uart.o + .debug_macro 0x00000000 0x244 src/tiny_uart.o + .debug_macro 0x00000000 0x17e src/tiny_uart.o + .debug_macro 0x00000000 0x1c src/tiny_uart.o + .debug_macro 0x00000000 0x16 src/tiny_uart.o + .debug_macro 0x00000000 0x1c src/tiny_uart.o + .debug_macro 0x00000000 0x7b src/tiny_uart.o + .debug_macro 0x00000000 0x58 src/tiny_uart.o + .debug_macro 0x00000000 0x10 src/tiny_uart.o + .debug_macro 0x00000000 0xeb src/tiny_uart.o + .debug_macro 0x00000000 0x58 src/tiny_uart.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .text 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .data 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .bss 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .text.ui_init 0x00000000 0x2 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .text.ui_powerdown + 0x00000000 0x2 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .text.ui_wakeup + 0x00000000 0x2 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .text.ui_loop_back_state + 0x00000000 0x2 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .text.ui_process + 0x00000000 0x2 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_info 0x00000000 0x18b src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_abbrev 0x00000000 0xb4 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_aranges + 0x00000000 0x40 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_ranges 0x00000000 0x30 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x2fe src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0xa3c src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x1ad src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x293 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x9e src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x5486 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x9a src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0xf1 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x34 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x18 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x5e src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x22 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x166 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x1c src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x35 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x66 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x4d1 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x97 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x17 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x250 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x76 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x16 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x6e3 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x175 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x40 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x69 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x32 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0xe4 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x34 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x256 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x7c src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x26 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x5e src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x2e src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x68 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x2f src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x154 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x9a src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x4c src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x244 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x17e src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x1c src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x16 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x1c src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_macro 0x00000000 0x7b src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_line 0x00000000 0x806 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_str 0x00000000 0x27393 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .comment 0x00000000 0x31 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .debug_frame 0x00000000 0x64 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/clock/xmega/sysclk.o + .text 0x00000000 0x0 src/ASF/common/services/clock/xmega/sysclk.o + .data 0x00000000 0x0 src/ASF/common/services/clock/xmega/sysclk.o + .bss 0x00000000 0x0 src/ASF/common/services/clock/xmega/sysclk.o + .text.sysclk_disable_module + 0x00000000 0x16 src/ASF/common/services/clock/xmega/sysclk.o + .text.sysclk_disable_usb + 0x00000000 0x14 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0xa3c src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x1ad src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x293 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x9e src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x5486 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x9a src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0xf1 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x34 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x18 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x5e src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x22 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x166 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x1c src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x35 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x66 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x4d1 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x97 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x17 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x250 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x76 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x16 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x6e3 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x175 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x40 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x69 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x32 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0xe4 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x2e src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x256 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x68 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x2f src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x154 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x00000000 0x26 src/ASF/common/services/clock/xmega/sysclk.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .text 0x00000000 0x0 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .data 0x00000000 0x0 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .bss 0x00000000 0x0 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .data.sleepmgr_configs + 0x00000000 0x6 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0xa3c src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x1ad src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x293 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x9e src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x5486 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x9a src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0xf1 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x34 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x18 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x5e src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x22 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x166 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x1c src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x35 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x66 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x4d1 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x97 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x17 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x250 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x76 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x16 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x6e3 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x175 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x40 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x69 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x32 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0xe4 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x00000000 0x5e src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .text 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .data 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .bss 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .text.udi_vendor_bulk_in_run + 0x00000000 0x18 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .text.udi_vendor_bulk_out_run + 0x00000000 0x18 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .text.udi_vendor_iso_out_run + 0x00000000 0x18 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0xa3c src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x1ad src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x293 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x9e src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x5486 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x9a src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0xf1 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x34 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x18 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x5e src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x22 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x166 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x1c src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x35 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x66 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x4d1 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x97 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x17 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x250 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x76 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x16 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x6e3 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x175 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x40 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x69 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x32 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0xe4 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x4c src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x244 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x17e src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x1c src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x16 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x1c src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x7b src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x00000000 0x16 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .text 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .data 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .bss 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0xa3c src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x1ad src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x293 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x9e src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x5486 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x9a src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0xf1 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x34 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x18 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x5e src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x22 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x166 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x1c src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x35 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x66 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x4d1 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x97 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x17 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x250 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x76 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x16 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x6e3 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x175 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x40 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x69 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x32 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0xe4 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x94 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x4c src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x244 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x17e src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x1c src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x16 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x1c src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x00000000 0x7b src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .group 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .text 0x00000000 0x0 src/ASF/common/services/usb/udc/udc.o + .data 0x00000000 0x0 src/ASF/common/services/usb/udc/udc.o + .bss 0x00000000 0x0 src/ASF/common/services/usb/udc/udc.o + .text.udc_stop + 0x00000000 0xa src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0xa3c src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x1ad src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x293 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x9e src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x5486 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x9a src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0xf1 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x34 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x18 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x5e src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x22 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x166 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x1c src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x35 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x66 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x4d1 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x97 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x17 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x250 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x76 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x16 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x6e3 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x175 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x40 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x69 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x32 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0xe4 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x94 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x4c src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x244 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x17e src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x1c src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x16 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x1c src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x7b src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x58 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x58 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0xeb src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x34 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x256 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x7c src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x26 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x5e src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x10 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x2e src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x68 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x2f src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x00000000 0x154 src/ASF/common/services/usb/udc/udc.o + .text 0x00000000 0x0 src/ASF/xmega/drivers/cpu/ccp.o + .data 0x00000000 0x0 src/ASF/xmega/drivers/cpu/ccp.o + .bss 0x00000000 0x0 src/ASF/xmega/drivers/cpu/ccp.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/nvm/nvm.o + .text 0x00000000 0x0 src/ASF/xmega/drivers/nvm/nvm.o + .data 0x00000000 0x0 src/ASF/xmega/drivers/nvm/nvm.o + .bss 0x00000000 0x0 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_read_device_serial + 0x00000000 0x90 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_read_byte + 0x00000000 0x22 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_read_buffer + 0x00000000 0x30 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_flush_buffer + 0x00000000 0x24 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_load_byte_to_buffer + 0x00000000 0x24 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_write_byte + 0x00000000 0x52 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_load_page_to_buffer + 0x00000000 0x40 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_atomic_write_page + 0x00000000 0x3c src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_erase_and_write_buffer + 0x00000000 0x88 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_split_write_page + 0x00000000 0x3c src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_fill_buffer_with_value + 0x00000000 0x2a src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_erase_bytes_in_page + 0x00000000 0x3c src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_erase_page + 0x00000000 0x14 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_erase_bytes_in_all_pages + 0x00000000 0x2e src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_erase_all + 0x00000000 0xc src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_issue_flash_range_crc + 0x00000000 0x2c src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_flash_read_buffer + 0x00000000 0x36 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_user_sig_read_buffer + 0x00000000 0x3e src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_user_sig_write_buffer + 0x00000000 0x14a src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_flash_erase_and_write_buffer + 0x00000000 0x15a src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_fuses_read + 0x00000000 0x32 src/ASF/xmega/drivers/nvm/nvm.o + .debug_info 0x00000000 0x13ae src/ASF/xmega/drivers/nvm/nvm.o + .debug_abbrev 0x00000000 0x3ed src/ASF/xmega/drivers/nvm/nvm.o + .debug_loc 0x00000000 0x113c src/ASF/xmega/drivers/nvm/nvm.o + .debug_aranges + 0x00000000 0xc0 src/ASF/xmega/drivers/nvm/nvm.o + .debug_ranges 0x00000000 0xc8 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x198 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0xa3c src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x10 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x1ad src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x293 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x9e src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x5486 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x9a src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0xf1 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x34 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x10 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x18 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x5e src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x10 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x22 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x166 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x1c src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x35 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x66 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x4d1 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x97 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x17 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x250 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x76 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x16 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x6e3 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x10 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x175 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x40 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x69 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x32 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0xe4 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x26 src/ASF/xmega/drivers/nvm/nvm.o + .debug_macro 0x00000000 0x16 src/ASF/xmega/drivers/nvm/nvm.o + .debug_line 0x00000000 0xb37 src/ASF/xmega/drivers/nvm/nvm.o + .debug_str 0x00000000 0x241a8 src/ASF/xmega/drivers/nvm/nvm.o + .comment 0x00000000 0x31 src/ASF/xmega/drivers/nvm/nvm.o + .debug_frame 0x00000000 0x340 src/ASF/xmega/drivers/nvm/nvm.o + .text 0x00000000 0x0 src/ASF/xmega/drivers/nvm/nvm_asm.o + .data 0x00000000 0x0 src/ASF/xmega/drivers/nvm/nvm_asm.o + .bss 0x00000000 0x0 src/ASF/xmega/drivers/nvm/nvm_asm.o + .BOOT 0x00000000 0x44 src/ASF/xmega/drivers/nvm/nvm_asm.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .group 0x00000000 0x8 src/ASF/xmega/drivers/usb/usb_device.o + .text 0x00000000 0x0 src/ASF/xmega/drivers/usb/usb_device.o + .data 0x00000000 0x0 src/ASF/xmega/drivers/usb/usb_device.o + .bss 0x00000000 0x0 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_disable + 0x00000000 0x40 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_include_vbus_monitoring + 0x00000000 0x4 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_detach + 0x00000000 0xc src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_is_high_speed + 0x00000000 0x4 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_get_frame_number + 0x00000000 0xa src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_get_micro_frame_number + 0x00000000 0x6 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_send_remotewakeup + 0x00000000 0x20 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ep_wait_stall_clear + 0x00000000 0x6a src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ep_is_valid + 0x00000000 0x14 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0xa3c src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x10 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x1ad src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x293 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x9e src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x5486 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x9a src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0xf1 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x34 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x10 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x18 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x5e src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x10 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x22 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x166 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x1c src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x35 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x66 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x4d1 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x97 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x17 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x250 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x76 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x16 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x6e3 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x10 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x175 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x40 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x69 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x32 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0xe4 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x94 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x4c src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x244 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x17e src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x1c src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x16 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x1c src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x7b src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x2e src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x256 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x68 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x2f src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x154 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x26 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x16 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x10 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x00000000 0x5e src/ASF/xmega/drivers/usb/usb_device.o + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .text.libgcc.mul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.mul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.div + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.mul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.div + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.mul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.div + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.mul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.div + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + +Memory Configuration + +Name Origin Length Attributes +text 0x00000000 0x00100000 xr +data 0x00802000 0x0000ffa0 rw !x +eeprom 0x00810000 0x00010000 rw !x +fuse 0x00820000 0x00000400 rw !x +lock 0x00830000 0x00000400 rw !x +signature 0x00840000 0x00000400 rw !x +user_signatures 0x00850000 0x00000400 rw !x +*default* 0x00000000 0xffffffff + +Linker script and memory map + +LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +LOAD src/tiny_dig.o +LOAD src/ASF/common/boards/user_board/init.o +LOAD src/ASF/common/services/ioport/xmega/ioport_compat.o +LOAD src/main.o +LOAD src/tiny_adc.o +LOAD src/tiny_dac.o +LOAD src/tiny_dma.o +LOAD src/tiny_timer.o +LOAD src/tiny_uart.o +LOAD src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o +LOAD src/ASF/common/services/clock/xmega/sysclk.o +LOAD src/ASF/common/services/sleepmgr/xmega/sleepmgr.o +LOAD src/ASF/common/services/usb/class/vendor/device/udi_vendor.o +LOAD src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o +LOAD src/ASF/common/services/usb/udc/udc.o +LOAD src/ASF/xmega/drivers/cpu/ccp.o +LOAD src/ASF/xmega/drivers/nvm/nvm.o +LOAD src/ASF/xmega/drivers/nvm/nvm_asm.o +LOAD src/ASF/xmega/drivers/usb/usb_device.o +START GROUP +LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libm.a +END GROUP +START GROUP +LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a +LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libm.a +LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a +END GROUP + +.hash + *(.hash) + +.dynsym + *(.dynsym) + +.dynstr + *(.dynstr) + +.gnu.version + *(.gnu.version) + +.gnu.version_d + *(.gnu.version_d) + +.gnu.version_r + *(.gnu.version_r) + +.rel.init + *(.rel.init) + +.rela.init + *(.rela.init) + +.rel.text + *(.rel.text) + *(.rel.text.*) + *(.rel.gnu.linkonce.t*) + +.rela.text + *(.rela.text) + *(.rela.text.*) + *(.rela.gnu.linkonce.t*) + +.rel.fini + *(.rel.fini) + +.rela.fini + *(.rela.fini) + +.rel.rodata + *(.rel.rodata) + *(.rel.rodata.*) + *(.rel.gnu.linkonce.r*) + +.rela.rodata + *(.rela.rodata) + *(.rela.rodata.*) + *(.rela.gnu.linkonce.r*) + +.rel.data + *(.rel.data) + *(.rel.data.*) + *(.rel.gnu.linkonce.d*) + +.rela.data + *(.rela.data) + *(.rela.data.*) + *(.rela.gnu.linkonce.d*) + +.rel.ctors + *(.rel.ctors) + +.rela.ctors + *(.rela.ctors) + +.rel.dtors + *(.rel.dtors) + +.rela.dtors + *(.rela.dtors) + +.rel.got + *(.rel.got) + +.rela.got + *(.rela.got) + +.rel.bss + *(.rel.bss) + +.rela.bss + *(.rela.bss) + +.rel.plt + *(.rel.plt) + +.rela.plt + *(.rela.plt) + +.text 0x00000000 0x288c + *(.vectors) + .vectors 0x00000000 0x1fc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + 0x00000000 __vector_default + 0x00000000 __vectors + *(.vectors) + *(.progmem.gcc*) + .progmem.gcc_sw_table.main_sof_action + 0x000001fc 0x10 src/main.o + .progmem.gcc_sw_table.udc_process_setup + 0x0000020c 0x40 src/ASF/common/services/usb/udc/udc.o + .progmem.gcc_sw_table.udd_ep_get_size + 0x0000024c 0xe src/ASF/xmega/drivers/usb/usb_device.o + 0x0000025a . = ALIGN (0x2) + 0x0000025a __trampolines_start = . + *(.trampolines) + .trampolines 0x0000025a 0x0 linker stubs + *(.trampolines*) + 0x0000025a __trampolines_end = . + *(.progmem*) + 0x0000025a . = ALIGN (0x2) + *(.jumptables) + *(.jumptables*) + *(.lowtext) + *(.lowtext*) + 0x0000025a __ctors_start = . + *(.ctors) + 0x0000025a __ctors_end = . + 0x0000025a __dtors_start = . + *(.dtors) + 0x0000025a __dtors_end = . + SORT(*)(.ctors) + SORT(*)(.dtors) + *(.init0) + .init0 0x0000025a 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + 0x0000025a __init + *(.init0) + *(.init1) + *(.init1) + *(.init2) + .init2 0x0000025a 0xc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + *(.init2) + *(.init3) + *(.init3) + *(.init4) + .init4 0x00000266 0x16 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + 0x00000266 __do_copy_data + .init4 0x0000027c 0x10 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + 0x0000027c __do_clear_bss + *(.init4) + *(.init5) + *(.init5) + *(.init6) + *(.init6) + *(.init7) + *(.init7) + *(.init8) + *(.init8) + *(.init9) + .init9 0x0000028c 0x6 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + *(.init9) + *(.text) + .text 0x00000292 0x2 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + 0x00000292 __vector_38 + 0x00000292 __vector_104 + 0x00000292 __vector_22 + 0x00000292 __vector_63 + 0x00000292 __vector_28 + 0x00000292 __vector_67 + 0x00000292 __vector_1 + 0x00000292 __vector_119 + 0x00000292 __vector_32 + 0x00000292 __vector_75 + 0x00000292 __vector_71 + 0x00000292 __vector_91 + 0x00000292 __vector_34 + 0x00000292 __vector_62 + 0x00000292 __vector_77 + 0x00000292 __vector_102 + 0x00000292 __vector_24 + 0x00000292 __vector_12 + 0x00000292 __vector_55 + 0x00000292 __vector_69 + 0x00000292 __vector_81 + 0x00000292 __vector_90 + 0x00000292 __vector_46 + 0x00000292 __bad_interrupt + 0x00000292 __vector_122 + 0x00000292 __vector_72 + 0x00000292 __vector_114 + 0x00000292 __vector_6 + 0x00000292 __vector_110 + 0x00000292 __vector_31 + 0x00000292 __vector_92 + 0x00000292 __vector_35 + 0x00000292 __vector_78 + 0x00000292 __vector_74 + 0x00000292 __vector_117 + 0x00000292 __vector_39 + 0x00000292 __vector_107 + 0x00000292 __vector_3 + 0x00000292 __vector_105 + 0x00000292 __vector_98 + 0x00000292 __vector_23 + 0x00000292 __vector_68 + 0x00000292 __vector_30 + 0x00000292 __vector_73 + 0x00000292 __vector_45 + 0x00000292 __vector_25 + 0x00000292 __vector_93 + 0x00000292 __vector_61 + 0x00000292 __vector_11 + 0x00000292 __vector_54 + 0x00000292 __vector_99 + 0x00000292 __vector_13 + 0x00000292 __vector_17 + 0x00000292 __vector_19 + 0x00000292 __vector_56 + 0x00000292 __vector_7 + 0x00000292 __vector_49 + 0x00000292 __vector_123 + 0x00000292 __vector_41 + 0x00000292 __vector_86 + 0x00000292 __vector_100 + 0x00000292 __vector_101 + 0x00000292 __vector_64 + 0x00000292 __vector_88 + 0x00000292 __vector_109 + 0x00000292 __vector_43 + 0x00000292 __vector_27 + 0x00000292 __vector_5 + 0x00000292 __vector_113 + 0x00000292 __vector_33 + 0x00000292 __vector_76 + 0x00000292 __vector_115 + 0x00000292 __vector_47 + 0x00000292 __vector_52 + 0x00000292 __vector_37 + 0x00000292 __vector_95 + 0x00000292 __vector_103 + 0x00000292 __vector_96 + 0x00000292 __vector_89 + 0x00000292 __vector_108 + 0x00000292 __vector_4 + 0x00000292 __vector_44 + 0x00000292 __vector_82 + 0x00000292 __vector_106 + 0x00000292 __vector_118 + 0x00000292 __vector_51 + 0x00000292 __vector_9 + 0x00000292 __vector_2 + 0x00000292 __vector_21 + 0x00000292 __vector_15 + 0x00000292 __vector_66 + 0x00000292 __vector_36 + 0x00000292 __vector_79 + 0x00000292 __vector_58 + 0x00000292 __vector_70 + 0x00000292 __vector_29 + 0x00000292 __vector_60 + 0x00000292 __vector_121 + 0x00000292 __vector_40 + 0x00000292 __vector_85 + 0x00000292 __vector_94 + 0x00000292 __vector_8 + 0x00000292 __vector_26 + 0x00000292 __vector_48 + 0x00000292 __vector_124 + 0x00000292 __vector_116 + 0x00000292 __vector_112 + 0x00000292 __vector_111 + 0x00000292 __vector_80 + 0x00000292 __vector_14 + 0x00000292 __vector_84 + 0x00000292 __vector_57 + 0x00000292 __vector_53 + 0x00000292 __vector_10 + 0x00000292 __vector_50 + 0x00000292 __vector_16 + 0x00000292 __vector_59 + 0x00000292 __vector_18 + 0x00000292 __vector_97 + 0x00000292 __vector_20 + 0x00000292 __vector_42 + 0x00000292 __vector_87 + 0x00000292 __vector_65 + 0x00000292 __vector_120 + 0x00000294 . = ALIGN (0x2) + *(.text.*) + .text.tiny_dig_setup + 0x00000294 0xe src/tiny_dig.o + 0x00000294 tiny_dig_setup + .text.board_init + 0x000002a2 0x2 src/ASF/common/boards/user_board/init.o + 0x000002a2 board_init + .text.iso_callback + 0x000002a4 0x22 src/main.o + 0x000002a4 iso_callback + .text.main 0x000002c6 0x46 src/main.o + 0x000002c6 main + .text.main_suspend_action + 0x0000030c 0x2 src/main.o + 0x0000030c main_suspend_action + .text.main_resume_action + 0x0000030e 0x2 src/main.o + 0x0000030e main_resume_action + .text.main_sof_action + 0x00000310 0x40 src/main.o + 0x00000310 main_sof_action + .text.main_vendor_enable + 0x00000350 0x18 src/main.o + 0x00000350 main_vendor_enable + .text.main_vendor_disable + 0x00000368 0x6 src/main.o + 0x00000368 main_vendor_disable + .text.main_setup_out_received + 0x0000036e 0x4 src/main.o + 0x0000036e main_setup_out_received + .text.main_setup_in_received + 0x00000372 0x4 src/main.o + 0x00000372 main_setup_in_received + .text.tiny_adc_ch0setup + 0x00000376 0x1e src/tiny_adc.o + 0x00000376 tiny_adc_ch0setup + .text.tiny_adc_ch1setup + 0x00000394 0x14 src/tiny_adc.o + 0x00000394 tiny_adc_ch1setup + .text.tiny_adc_pid_setup + 0x000003a8 0x14 src/tiny_adc.o + 0x000003a8 tiny_adc_pid_setup + .text.ReadCalibrationByte + 0x000003bc 0x12 src/tiny_adc.o + 0x000003bc ReadCalibrationByte + .text.tiny_adc_setup + 0x000003ce 0x62 src/tiny_adc.o + 0x000003ce tiny_adc_setup + .text.tiny_dac_setup + 0x00000430 0x48 src/tiny_dac.o + 0x00000430 tiny_dac_setup + .text.tiny_dma_setup + 0x00000478 0x12 src/tiny_dma.o + 0x00000478 tiny_dma_setup + .text.tiny_dma_flush + 0x0000048a 0x24 src/tiny_dma.o + 0x0000048a tiny_dma_flush + .text.tiny_dma_set_mode_0 + 0x000004ae 0x90 src/tiny_dma.o + 0x000004ae tiny_dma_set_mode_0 + .text.tiny_dma_loop_mode_0 + 0x0000053e 0x62 src/tiny_dma.o + 0x0000053e tiny_dma_loop_mode_0 + .text.tiny_dma_set_mode_1 + 0x000005a0 0x9c src/tiny_dma.o + 0x000005a0 tiny_dma_set_mode_1 + .text.tiny_dma_loop_mode_1 + 0x0000063c 0xae src/tiny_dma.o + 0x0000063c tiny_dma_loop_mode_1 + .text.tiny_dma_set_mode_2 + 0x000006ea 0x94 src/tiny_dma.o + 0x000006ea tiny_dma_set_mode_2 + .text.tiny_dma_loop_mode_2 + 0x0000077e 0xb0 src/tiny_dma.o + 0x0000077e tiny_dma_loop_mode_2 + .text.tiny_dma_set_mode_3 + 0x0000082e 0xcc src/tiny_dma.o + 0x0000082e tiny_dma_set_mode_3 + .text.tiny_dma_loop_mode_3 + 0x000008fa 0x62 src/tiny_dma.o + 0x000008fa tiny_dma_loop_mode_3 + .text.tiny_dma_set_mode_4 + 0x0000095c 0xcc src/tiny_dma.o + 0x0000095c tiny_dma_set_mode_4 + .text.tiny_dma_loop_mode_4 + 0x00000a28 0xb4 src/tiny_dma.o + 0x00000a28 tiny_dma_loop_mode_4 + .text.tiny_dma_set_mode_5 + 0x00000adc 0x8e src/tiny_dma.o + 0x00000adc tiny_dma_set_mode_5 + .text.tiny_dma_set_mode_6 + 0x00000b6a 0x92 src/tiny_dma.o + 0x00000b6a tiny_dma_set_mode_6 + .text.tiny_dma_loop_mode_6 + 0x00000bfc 0x5e src/tiny_dma.o + 0x00000bfc tiny_dma_loop_mode_6 + .text.tiny_dma_set_mode_7 + 0x00000c5a 0x92 src/tiny_dma.o + 0x00000c5a tiny_dma_set_mode_7 + .text.tiny_dma_loop_mode_7 + 0x00000cec 0x5e src/tiny_dma.o + 0x00000cec tiny_dma_loop_mode_7 + .text.tiny_timer_setup + 0x00000d4a 0x76 src/tiny_timer.o + 0x00000d4a tiny_timer_setup + .text.__vector_83 + 0x00000dc0 0xe8 src/tiny_timer.o + 0x00000dc0 __vector_83 + .text.tiny_uart_setup + 0x00000ea8 0x30 src/tiny_uart.o + 0x00000ea8 tiny_uart_setup + .text.tiny_spi_setup + 0x00000ed8 0x1a src/tiny_uart.o + 0x00000ed8 tiny_spi_setup + .text.sysclk_init + 0x00000ef2 0xd8 src/ASF/common/services/clock/xmega/sysclk.o + 0x00000ef2 sysclk_init + .text.sysclk_enable_module + 0x00000fca 0x18 src/ASF/common/services/clock/xmega/sysclk.o + 0x00000fca sysclk_enable_module + .text.sysclk_enable_usb + 0x00000fe2 0x6c src/ASF/common/services/clock/xmega/sysclk.o + 0x00000fe2 sysclk_enable_usb + .text.udi_vendor_getsetting + 0x0000104e 0x6 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + 0x0000104e udi_vendor_getsetting + .text.udi_vendor_enable + 0x00001054 0x16 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + 0x00001054 udi_vendor_enable + .text.udi_vendor_disable + 0x0000106a 0xc src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + 0x0000106a udi_vendor_disable + .text.udi_vendor_setup + 0x00001076 0x4c src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + 0x00001076 udi_vendor_setup + .text.udi_vendor_iso_in_run + 0x000010c2 0x18 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + 0x000010c2 udi_vendor_iso_in_run + .text.udc_next_desc_in_iface + 0x000010da 0x6a src/ASF/common/services/usb/udc/udc.o + .text.udc_valid_address + 0x00001144 0xc src/ASF/common/services/usb/udc/udc.o + .text.udc_update_iface_desc + 0x00001150 0x74 src/ASF/common/services/usb/udc/udc.o + .text.udc_iface_disable + 0x000011c4 0x84 src/ASF/common/services/usb/udc/udc.o + .text.udc_iface_enable + 0x00001248 0x64 src/ASF/common/services/usb/udc/udc.o + .text.udc_get_interface_desc + 0x000012ac 0xa src/ASF/common/services/usb/udc/udc.o + 0x000012ac udc_get_interface_desc + .text.udc_start + 0x000012b6 0x4 src/ASF/common/services/usb/udc/udc.o + 0x000012b6 udc_start + .text.udc_reset + 0x000012ba 0x4a src/ASF/common/services/usb/udc/udc.o + 0x000012ba udc_reset + .text.udc_sof_notify + 0x00001304 0x5e src/ASF/common/services/usb/udc/udc.o + 0x00001304 udc_sof_notify + .text.udc_process_setup + 0x00001362 0x78a src/ASF/common/services/usb/udc/udc.o + 0x00001362 udc_process_setup + .text.ccp_write_io + 0x00001aec 0xc src/ASF/xmega/drivers/cpu/ccp.o + 0x00001aec ccp_write_io + .text.nvm_read_byte + 0x00001af8 0x14 src/ASF/xmega/drivers/nvm/nvm_asm.o + 0x00001af8 nvm_read_byte + .text.udd_sleep_mode + 0x00001b0c 0x52 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ctrl_init + 0x00001b5e 0x56 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ctrl_stall_data + 0x00001bb4 0x1c src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ctrl_send_zlp_in + 0x00001bd0 0x1c src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ctrl_endofrequest + 0x00001bec 0x10 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ctrl_in_sent + 0x00001bfc 0xdc src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ep_get_size + 0x00001cd8 0x48 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ep_get_job + 0x00001d20 0x36 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ctrl_interrupt_tc_setup + 0x00001d56 0xde src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ep_trans_complet + 0x00001e34 0x21c src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_attach + 0x00002050 0x46 src/ASF/xmega/drivers/usb/usb_device.o + 0x00002050 udd_attach + .text.udd_enable + 0x00002096 0x10a src/ASF/xmega/drivers/usb/usb_device.o + 0x00002096 udd_enable + .text.udd_set_address + 0x000021a0 0x6 src/ASF/xmega/drivers/usb/usb_device.o + 0x000021a0 udd_set_address + .text.udd_getaddress + 0x000021a6 0x6 src/ASF/xmega/drivers/usb/usb_device.o + 0x000021a6 udd_getaddress + .text.udd_set_setup_payload + 0x000021ac 0x12 src/ASF/xmega/drivers/usb/usb_device.o + 0x000021ac udd_set_setup_payload + .text.udd_ep_alloc + 0x000021be 0xac src/ASF/xmega/drivers/usb/usb_device.o + 0x000021be udd_ep_alloc + .text.udd_ep_is_halted + 0x0000226a 0x36 src/ASF/xmega/drivers/usb/usb_device.o + 0x0000226a udd_ep_is_halted + .text.udd_ep_clear_halt + 0x000022a0 0x54 src/ASF/xmega/drivers/usb/usb_device.o + 0x000022a0 udd_ep_clear_halt + .text.udd_ep_run + 0x000022f4 0x10e src/ASF/xmega/drivers/usb/usb_device.o + 0x000022f4 udd_ep_run + .text.udd_ep_abort + 0x00002402 0x72 src/ASF/xmega/drivers/usb/usb_device.o + 0x00002402 udd_ep_abort + .text.udd_ep_free + 0x00002474 0x3a src/ASF/xmega/drivers/usb/usb_device.o + 0x00002474 udd_ep_free + .text.udd_ep_set_halt + 0x000024ae 0x42 src/ASF/xmega/drivers/usb/usb_device.o + 0x000024ae udd_ep_set_halt + .text.__vector_125 + 0x000024f0 0x180 src/ASF/xmega/drivers/usb/usb_device.o + 0x000024f0 __vector_125 + .text.__vector_126 + 0x00002670 0x1d2 src/ASF/xmega/drivers/usb/usb_device.o + 0x00002670 __vector_126 + .text.libgcc.div + 0x00002842 0x28 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + 0x00002842 __udivmodhi4 + .text.libgcc 0x0000286a 0xc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + 0x0000286a __tablejump2__ + 0x0000286e __tablejump__ + .text.avr-libc + 0x00002876 0x12 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + 0x00002876 memcpy + 0x00002888 . = ALIGN (0x2) + *(.fini9) + .fini9 0x00002888 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + 0x00002888 _exit + 0x00002888 exit + *(.fini9) + *(.fini8) + *(.fini8) + *(.fini7) + *(.fini7) + *(.fini6) + *(.fini6) + *(.fini5) + *(.fini5) + *(.fini4) + *(.fini4) + *(.fini3) + *(.fini3) + *(.fini2) + *(.fini2) + *(.fini1) + *(.fini1) + *(.fini0) + .fini0 0x00002888 0x4 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + *(.fini0) + 0x0000288c _etext = . + +.data 0x00802000 0xb2 load address 0x0000288c + 0x00802000 PROVIDE (__data_start, .) + *(.data) + *(.data*) + .data.global_mode + 0x00802000 0x1 src/main.o + 0x00802000 global_mode + .data.dummy 0x00802001 0x1 src/main.o + 0x00802001 dummy + .data.auxDacBufLen + 0x00802002 0x2 src/main.o + 0x00802002 auxDacBufLen + .data.dacBuf_len + 0x00802004 0x2 src/main.o + 0x00802004 dacBuf_len + .data.udi_api_vendor + 0x00802006 0xa src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + 0x00802006 udi_api_vendor + .data.udc_config + 0x00802010 0x6 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + 0x00802010 udc_config + .data.udc_config_lsfs + 0x00802016 0x4 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + 0x00802016 udc_config_lsfs + .data.udi_apis + 0x0080201a 0x2 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + 0x0080201a udi_apis + .data.udc_desc_fs + 0x0080201c 0x28 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + 0x0080201c udc_desc_fs + .data.udc_device_desc + 0x00802044 0x14 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + 0x00802044 udc_device_desc + .data.udc_string_desc + 0x00802058 0x32 src/ASF/common/services/usb/udc/udc.o + .data.udc_string_product_name + 0x0080208a 0x19 src/ASF/common/services/usb/udc/udc.o + .data.udc_string_manufacturer_name + 0x008020a3 0xa src/ASF/common/services/usb/udc/udc.o + *fill* 0x008020ad 0x1 + .data.udc_string_desc_languageid + 0x008020ae 0x4 src/ASF/common/services/usb/udc/udc.o + *(.rodata) + *(.rodata*) + *(.gnu.linkonce.d*) + 0x008020b2 . = ALIGN (0x2) + 0x008020b2 _edata = . + 0x008020b2 PROVIDE (__data_end, .) + +.bss 0x008020b2 0xb96 + 0x008020b2 PROVIDE (__bss_start, .) + *(.bss) + *(.bss*) + .bss.PSU_target + 0x008020b2 0x1 src/main.o + 0x008020b2 PSU_target + .bss.b2_state 0x008020b3 0x1 src/main.o + 0x008020b3 b2_state + .bss.b1_state 0x008020b4 0x1 src/main.o + 0x008020b4 b1_state + .bss.main_b_vendor_enable + 0x008020b5 0x1 src/main.o + 0x008020b5 main_b_vendor_enable + .bss.udi_vendor_alternate_setting + 0x008020b6 0x1 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .bss.udc_ep_status.5441 + 0x008020b7 0x2 src/ASF/common/services/usb/udc/udc.o + .bss.udc_ptr_iface + 0x008020b9 0x2 src/ASF/common/services/usb/udc/udc.o + .bss.udc_ptr_conf + 0x008020bb 0x2 src/ASF/common/services/usb/udc/udc.o + *fill* 0x008020bd 0x1 + .bss.udc_num_configuration + 0x008020be 0x2 src/ASF/common/services/usb/udc/udc.o + .bss.udc_iface_setting + 0x008020c0 0x2 src/ASF/common/services/usb/udc/udc.o + .bss.udc_device_status + 0x008020c2 0x2 src/ASF/common/services/usb/udc/udc.o + .bss.b_shortpacket.5230 + 0x008020c4 0x1 src/ASF/xmega/drivers/usb/usb_device.o + .bss.udd_ep_out_cache_buffer + 0x008020c5 0xc0 src/ASF/xmega/drivers/usb/usb_device.o + .bss.udd_ep_job + 0x00802185 0x36 src/ASF/xmega/drivers/usb/usb_device.o + .bss.udd_ctrl_buffer + 0x008021bb 0x40 src/ASF/xmega/drivers/usb/usb_device.o + .bss.udd_ctrl_payload_nb_trans + 0x008021fb 0x2 src/ASF/xmega/drivers/usb/usb_device.o + .bss.udd_ctrl_prev_payload_nb_trans + 0x008021fd 0x2 src/ASF/xmega/drivers/usb/usb_device.o + .bss.udd_ep_control_state + 0x008021ff 0x1 src/ASF/xmega/drivers/usb/usb_device.o + .bss.udd_sram 0x00802200 0x54 src/ASF/xmega/drivers/usb/usb_device.o + .bss.udd_b_idle + 0x00802254 0x1 src/ASF/xmega/drivers/usb/usb_device.o + *(COMMON) + *fill* 0x00802255 0x1 + COMMON 0x00802256 0x9ec src/main.o + 0x00802256 dacBuf_CH1 + 0x00802456 udd_g_ctrlreq + 0x00802466 dacBuf_CH2 + 0x00802666 isoBuf + COMMON 0x00802c42 0x6 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + 0x00802c42 sleepmgr_locks + 0x00802c48 PROVIDE (__bss_end, .) + 0x0000288c __data_load_start = LOADADDR (.data) + 0x0000293e __data_load_end = (__data_load_start + SIZEOF (.data)) + +.noinit 0x00802c48 0x0 + 0x00802c48 PROVIDE (__noinit_start, .) + *(.noinit*) + 0x00802c48 PROVIDE (__noinit_end, .) + 0x00802c48 _end = . + 0x00802c48 PROVIDE (__heap_start, .) + +.eeprom 0x00810000 0x0 + *(.eeprom*) + 0x00810000 __eeprom_end = . + +.fuse + *(.fuse) + *(.lfuse) + *(.hfuse) + *(.efuse) + +.lock + *(.lock*) + +.signature + *(.signature*) + +.user_signatures + *(.user_signatures*) + +.stab + *(.stab) + +.stabstr + *(.stabstr) + +.stab.excl + *(.stab.excl) + +.stab.exclstr + *(.stab.exclstr) + +.stab.index + *(.stab.index) + +.stab.indexstr + *(.stab.indexstr) + +.comment 0x00000000 0x30 + *(.comment) + .comment 0x00000000 0x30 src/tiny_dig.o + 0x31 (size before relaxing) + .comment 0x00000000 0x31 src/ASF/common/boards/user_board/init.o + .comment 0x00000000 0x31 src/main.o + .comment 0x00000000 0x31 src/tiny_adc.o + .comment 0x00000000 0x31 src/tiny_dac.o + .comment 0x00000000 0x31 src/tiny_dma.o + .comment 0x00000000 0x31 src/tiny_timer.o + .comment 0x00000000 0x31 src/tiny_uart.o + .comment 0x00000000 0x31 src/ASF/common/services/clock/xmega/sysclk.o + .comment 0x00000000 0x31 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .comment 0x00000000 0x31 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .comment 0x00000000 0x31 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .comment 0x00000000 0x31 src/ASF/common/services/usb/udc/udc.o + .comment 0x00000000 0x31 src/ASF/xmega/drivers/usb/usb_device.o + +.note.gnu.build-id + *(.note.gnu.build-id) + +.debug + *(.debug) + +.line + *(.line) + +.debug_srcinfo + *(.debug_srcinfo) + +.debug_sfnames + *(.debug_sfnames) + +.debug_aranges 0x00000000 0x490 + *(.debug_aranges) + .debug_aranges + 0x00000000 0x20 src/tiny_dig.o + .debug_aranges + 0x00000020 0x20 src/ASF/common/boards/user_board/init.o + .debug_aranges + 0x00000040 0x60 src/main.o + .debug_aranges + 0x000000a0 0x40 src/tiny_adc.o + .debug_aranges + 0x000000e0 0x20 src/tiny_dac.o + .debug_aranges + 0x00000100 0xa0 src/tiny_dma.o + .debug_aranges + 0x000001a0 0x28 src/tiny_timer.o + .debug_aranges + 0x000001c8 0x28 src/tiny_uart.o + .debug_aranges + 0x000001f0 0x40 src/ASF/common/services/clock/xmega/sysclk.o + .debug_aranges + 0x00000230 0x18 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_aranges + 0x00000248 0x58 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_aranges + 0x000002a0 0x18 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_aranges + 0x000002b8 0x70 src/ASF/common/services/usb/udc/udc.o + .debug_aranges + 0x00000328 0x20 src/ASF/xmega/drivers/cpu/ccp.o + .debug_aranges + 0x00000348 0x28 src/ASF/xmega/drivers/nvm/nvm_asm.o + .debug_aranges + 0x00000370 0x120 src/ASF/xmega/drivers/usb/usb_device.o + +.debug_pubnames + *(.debug_pubnames) + +.debug_info 0x00000000 0xa25e + *(.debug_info .gnu.linkonce.wi.*) + .debug_info 0x00000000 0x290 src/tiny_dig.o + .debug_info 0x00000290 0xff src/ASF/common/boards/user_board/init.o + .debug_info 0x0000038f 0x7cf src/main.o + .debug_info 0x00000b5e 0x9b6 src/tiny_adc.o + .debug_info 0x00001514 0x5f0 src/tiny_dac.o + .debug_info 0x00001b04 0x10d5 src/tiny_dma.o + .debug_info 0x00002bd9 0x17b4 src/tiny_timer.o + .debug_info 0x0000438d 0x476 src/tiny_uart.o + .debug_info 0x00004803 0xc3d src/ASF/common/services/clock/xmega/sysclk.o + .debug_info 0x00005440 0x121 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_info 0x00005561 0x62f src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_info 0x00005b90 0x5fc src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_info 0x0000618c 0x2152 src/ASF/common/services/usb/udc/udc.o + .debug_info 0x000082de 0x80 src/ASF/xmega/drivers/cpu/ccp.o + .debug_info 0x0000835e 0x80 src/ASF/xmega/drivers/nvm/nvm_asm.o + .debug_info 0x000083de 0x1e80 src/ASF/xmega/drivers/usb/usb_device.o + +.debug_abbrev 0x00000000 0x1b61 + *(.debug_abbrev) + .debug_abbrev 0x00000000 0xcc src/tiny_dig.o + .debug_abbrev 0x000000cc 0x8b src/ASF/common/boards/user_board/init.o + .debug_abbrev 0x00000157 0x22c src/main.o + .debug_abbrev 0x00000383 0x1d8 src/tiny_adc.o + .debug_abbrev 0x0000055b 0x161 src/tiny_dac.o + .debug_abbrev 0x000006bc 0x1f2 src/tiny_dma.o + .debug_abbrev 0x000008ae 0x175 src/tiny_timer.o + .debug_abbrev 0x00000a23 0xea src/tiny_uart.o + .debug_abbrev 0x00000b0d 0x2cd src/ASF/common/services/clock/xmega/sysclk.o + .debug_abbrev 0x00000dda 0x80 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_abbrev 0x00000e5a 0x21d src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_abbrev 0x00001077 0xef src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_abbrev 0x00001166 0x412 src/ASF/common/services/usb/udc/udc.o + .debug_abbrev 0x00001578 0x14 src/ASF/xmega/drivers/cpu/ccp.o + .debug_abbrev 0x0000158c 0x12 src/ASF/xmega/drivers/nvm/nvm_asm.o + .debug_abbrev 0x0000159e 0x5c3 src/ASF/xmega/drivers/usb/usb_device.o + +.debug_line 0x00000000 0x88a1 + *(.debug_line .debug_line.* .debug_line_end) + .debug_line 0x00000000 0x793 src/tiny_dig.o + .debug_line 0x00000793 0x768 src/ASF/common/boards/user_board/init.o + .debug_line 0x00000efb 0x9da src/main.o + .debug_line 0x000018d5 0x8f9 src/tiny_adc.o + .debug_line 0x000021ce 0x7e1 src/tiny_dac.o + .debug_line 0x000029af 0x1289 src/tiny_dma.o + .debug_line 0x00003c38 0x896 src/tiny_timer.o + .debug_line 0x000044ce 0x7f2 src/tiny_uart.o + .debug_line 0x00004cc0 0x713 src/ASF/common/services/clock/xmega/sysclk.o + .debug_line 0x000053d3 0x430 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_line 0x00005803 0x600 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_line 0x00005e03 0x4cc src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_line 0x000062cf 0xf3c src/ASF/common/services/usb/udc/udc.o + .debug_line 0x0000720b 0x6e src/ASF/xmega/drivers/cpu/ccp.o + .debug_line 0x00007279 0x11f src/ASF/xmega/drivers/nvm/nvm_asm.o + .debug_line 0x00007398 0x1509 src/ASF/xmega/drivers/usb/usb_device.o + +.debug_frame 0x00000000 0x9a8 + *(.debug_frame) + .debug_frame 0x00000000 0x24 src/tiny_dig.o + .debug_frame 0x00000024 0x24 src/ASF/common/boards/user_board/init.o + .debug_frame 0x00000048 0xa4 src/main.o + .debug_frame 0x000000ec 0x70 src/tiny_adc.o + .debug_frame 0x0000015c 0x30 src/tiny_dac.o + .debug_frame 0x0000018c 0x14c src/tiny_dma.o + .debug_frame 0x000002d8 0x74 src/tiny_timer.o + .debug_frame 0x0000034c 0x34 src/tiny_uart.o + .debug_frame 0x00000380 0x74 src/ASF/common/services/clock/xmega/sysclk.o + .debug_frame 0x000003f4 0xc4 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_frame 0x000004b8 0x120 src/ASF/common/services/usb/udc/udc.o + .debug_frame 0x000005d8 0x3d0 src/ASF/xmega/drivers/usb/usb_device.o + +.debug_str 0x00000000 0x2ee03 + *(.debug_str) + .debug_str 0x00000000 0x26e7b src/tiny_dig.o + 0x274ee (size before relaxing) + .debug_str 0x00026e7b 0x6d src/ASF/common/boards/user_board/init.o + 0x2730a (size before relaxing) + .debug_str 0x00026ee8 0x948 src/main.o + 0x27ddd (size before relaxing) + .debug_str 0x00027830 0xd0f src/tiny_adc.o + 0x286c3 (size before relaxing) + .debug_str 0x0002853f 0x1a6 src/tiny_dac.o + 0x27b10 (size before relaxing) + .debug_str 0x000286e5 0xcbc src/tiny_dma.o + 0x289cb (size before relaxing) + .debug_str 0x000293a1 0x1166 src/tiny_timer.o + 0x28dba (size before relaxing) + .debug_str 0x0002a507 0x13b src/tiny_uart.o + 0x27b91 (size before relaxing) + .debug_str 0x0002a642 0x41c src/ASF/common/services/clock/xmega/sysclk.o + 0x250dc (size before relaxing) + .debug_str 0x0002aa5e 0x96 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + 0x23a7e (size before relaxing) + .debug_str 0x0002aaf4 0x1ce src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + 0x25e7c (size before relaxing) + .debug_str 0x0002acc2 0x3f7 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + 0x25e7f (size before relaxing) + .debug_str 0x0002b0b9 0x7ee src/ASF/common/services/usb/udc/udc.o + 0x28a41 (size before relaxing) + .debug_str 0x0002b8a7 0x355c src/ASF/xmega/drivers/usb/usb_device.o + 0x2b053 (size before relaxing) + +.debug_loc 0x00000000 0x1e3e + *(.debug_loc) + .debug_loc 0x00000000 0x68 src/main.o + .debug_loc 0x00000068 0x112 src/tiny_adc.o + .debug_loc 0x0000017a 0x2f src/tiny_dac.o + .debug_loc 0x000001a9 0xaa src/tiny_dma.o + .debug_loc 0x00000253 0x10f src/tiny_timer.o + .debug_loc 0x00000362 0x31e src/ASF/common/services/clock/xmega/sysclk.o + .debug_loc 0x00000680 0x344 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_loc 0x000009c4 0x510 src/ASF/common/services/usb/udc/udc.o + .debug_loc 0x00000ed4 0xf6a src/ASF/xmega/drivers/usb/usb_device.o + +.debug_macinfo + *(.debug_macinfo) + +.debug_weaknames + *(.debug_weaknames) + +.debug_funcnames + *(.debug_funcnames) + +.debug_typenames + *(.debug_typenames) + +.debug_varnames + *(.debug_varnames) + +.debug_pubtypes + *(.debug_pubtypes) + +.debug_ranges 0x00000000 0x390 + *(.debug_ranges) + .debug_ranges 0x00000000 0x10 src/tiny_dig.o + .debug_ranges 0x00000010 0x10 src/ASF/common/boards/user_board/init.o + .debug_ranges 0x00000020 0x50 src/main.o + .debug_ranges 0x00000070 0x30 src/tiny_adc.o + .debug_ranges 0x000000a0 0x10 src/tiny_dac.o + .debug_ranges 0x000000b0 0x90 src/tiny_dma.o + .debug_ranges 0x00000140 0x18 src/tiny_timer.o + .debug_ranges 0x00000158 0x18 src/tiny_uart.o + .debug_ranges 0x00000170 0x30 src/ASF/common/services/clock/xmega/sysclk.o + .debug_ranges 0x000001a0 0x48 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_ranges 0x000001e8 0x60 src/ASF/common/services/usb/udc/udc.o + .debug_ranges 0x00000248 0x20 src/ASF/xmega/drivers/nvm/nvm_asm.o + .debug_ranges 0x00000268 0x128 src/ASF/xmega/drivers/usb/usb_device.o + +.debug_macro 0x00000000 0xb6b4 + *(.debug_macro) + .debug_macro 0x00000000 0x311 src/tiny_dig.o + .debug_macro 0x00000311 0xa3c src/tiny_dig.o + .debug_macro 0x00000d4d 0x10 src/tiny_dig.o + .debug_macro 0x00000d5d 0x1ad src/tiny_dig.o + .debug_macro 0x00000f0a 0x293 src/tiny_dig.o + .debug_macro 0x0000119d 0x9e src/tiny_dig.o + .debug_macro 0x0000123b 0x5486 src/tiny_dig.o + .debug_macro 0x000066c1 0x9a src/tiny_dig.o + .debug_macro 0x0000675b 0xf1 src/tiny_dig.o + .debug_macro 0x0000684c 0x34 src/tiny_dig.o + .debug_macro 0x00006880 0x10 src/tiny_dig.o + .debug_macro 0x00006890 0x18 src/tiny_dig.o + .debug_macro 0x000068a8 0x5e src/tiny_dig.o + .debug_macro 0x00006906 0x10 src/tiny_dig.o + .debug_macro 0x00006916 0x22 src/tiny_dig.o + .debug_macro 0x00006938 0x166 src/tiny_dig.o + .debug_macro 0x00006a9e 0x1c src/tiny_dig.o + .debug_macro 0x00006aba 0x35 src/tiny_dig.o + .debug_macro 0x00006aef 0x66 src/tiny_dig.o + .debug_macro 0x00006b55 0x4d1 src/tiny_dig.o + .debug_macro 0x00007026 0x97 src/tiny_dig.o + .debug_macro 0x000070bd 0x17 src/tiny_dig.o + .debug_macro 0x000070d4 0x250 src/tiny_dig.o + .debug_macro 0x00007324 0x76 src/tiny_dig.o + .debug_macro 0x0000739a 0x16 src/tiny_dig.o + .debug_macro 0x000073b0 0x6e3 src/tiny_dig.o + .debug_macro 0x00007a93 0x10 src/tiny_dig.o + .debug_macro 0x00007aa3 0x175 src/tiny_dig.o + .debug_macro 0x00007c18 0x40 src/tiny_dig.o + .debug_macro 0x00007c58 0x69 src/tiny_dig.o + .debug_macro 0x00007cc1 0x32 src/tiny_dig.o + .debug_macro 0x00007cf3 0xe4 src/tiny_dig.o + .debug_macro 0x00007dd7 0x34 src/tiny_dig.o + .debug_macro 0x00007e0b 0x256 src/tiny_dig.o + .debug_macro 0x00008061 0x7c src/tiny_dig.o + .debug_macro 0x000080dd 0x26 src/tiny_dig.o + .debug_macro 0x00008103 0x5e src/tiny_dig.o + .debug_macro 0x00008161 0x10 src/tiny_dig.o + .debug_macro 0x00008171 0x2e src/tiny_dig.o + .debug_macro 0x0000819f 0x68 src/tiny_dig.o + .debug_macro 0x00008207 0x2f src/tiny_dig.o + .debug_macro 0x00008236 0x154 src/tiny_dig.o + .debug_macro 0x0000838a 0x9a src/tiny_dig.o + .debug_macro 0x00008424 0x4c src/tiny_dig.o + .debug_macro 0x00008470 0x244 src/tiny_dig.o + .debug_macro 0x000086b4 0x17e src/tiny_dig.o + .debug_macro 0x00008832 0x1c src/tiny_dig.o + .debug_macro 0x0000884e 0x16 src/tiny_dig.o + .debug_macro 0x00008864 0x1c src/tiny_dig.o + .debug_macro 0x00008880 0x7b src/tiny_dig.o + .debug_macro 0x000088fb 0x58 src/tiny_dig.o + .debug_macro 0x00008953 0x2fe src/ASF/common/boards/user_board/init.o + .debug_macro 0x00008c51 0x368 src/main.o + .debug_macro 0x00008fb9 0x58 src/main.o + .debug_macro 0x00009011 0x10 src/main.o + .debug_macro 0x00009021 0x97 src/main.o + .debug_macro 0x000090b8 0xeb src/main.o + .debug_macro 0x000091a3 0xaa src/main.o + .debug_macro 0x0000924d 0xef src/main.o + .debug_macro 0x0000933c 0x34e src/tiny_adc.o + .debug_macro 0x0000968a 0x16 src/tiny_adc.o + .debug_macro 0x000096a0 0x33c src/tiny_dac.o + .debug_macro 0x000099dc 0x346 src/tiny_dma.o + .debug_macro 0x00009d22 0x343 src/tiny_timer.o + .debug_macro 0x0000a065 0x337 src/tiny_uart.o + .debug_macro 0x0000a39c 0x1e6 src/ASF/common/services/clock/xmega/sysclk.o + .debug_macro 0x0000a582 0x1a3 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .debug_macro 0x0000a725 0x22c src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x0000a951 0x94 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .debug_macro 0x0000a9e5 0x20c src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .debug_macro 0x0000abf1 0x362 src/ASF/common/services/usb/udc/udc.o + .debug_macro 0x0000af53 0x2f7 src/ASF/xmega/drivers/usb/usb_device.o + .debug_macro 0x0000b24a 0x46a src/ASF/xmega/drivers/usb/usb_device.o +OUTPUT(USB_BULK_TEST.elf elf32-avr) +LOAD linker stubs diff --git a/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.srec b/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.srec new file mode 100644 index 00000000..30161171 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/USB_BULK_TEST.srec @@ -0,0 +1,663 @@ +S01500005553425F42554C4B5F544553542E73726563F9 +S11300002CC1000046C1000044C1000042C10000F0 +S113001040C100003EC100003CC100003AC10000E4 +S113002038C1000036C1000034C1000032C10000F4 +S113003030C100002EC100002CC100002AC1000004 +S113004028C1000026C1000024C1000022C1000014 +S113005020C100001EC100001CC100001AC1000024 +S113006018C1000016C1000014C1000012C1000034 +S113007010C100000EC100000CC100000AC1000044 +S113008008C1000006C1000004C1000002C1000054 +S113009000C10000FEC00000FCC00000FAC0000067 +S11300A0F8C00000F6C00000F4C00000F2C0000078 +S11300B0F0C00000EEC00000ECC00000EAC0000088 +S11300C0E8C00000E6C00000E4C00000E2C0000098 +S11300D0E0C00000DEC00000DCC00000DAC00000A8 +S11300E0D8C00000D6C00000D4C00000D2C00000B8 +S11300F0D0C00000CEC00000CCC00000CAC00000C8 +S1130100C8C00000C6C00000C4C00000C2C00000D7 +S1130110C0C00000BEC00000BCC00000BAC00000E7 +S1130120B8C00000B6C00000B4C00000B2C00000F7 +S1130130B0C00000AEC00000ACC00000AAC0000007 +S1130140A8C00000A6C00000A4C0000039C600007A +S1130150A0C000009EC000009CC000009AC0000027 +S113016098C0000096C0000094C0000092C0000037 +S113017090C000008EC000008CC000008AC0000047 +S113018088C0000086C0000084C0000082C0000057 +S113019080C000007EC000007CC000007AC0000067 +S11301A078C0000076C0000074C0000072C0000077 +S11301B070C000006EC000006CC000006AC0000087 +S11301C068C0000066C0000064C0000062C0000097 +S11301D060C000005EC000005CC000005AC00000A7 +S11301E058C0000056C0000054C0000052C00000B7 +S11301F050C000000C9478120C94381393019501AC +S1130200970199019B01A0019D019F01E009E20969 +S1130210200A620A6B0A710AC40ACA0A100A120A7C +S1130220140A160A180A1A0A1C0A1E0A520A540A3E +S1130230560A580A5A0A5C0A5E0A600A7E0A890A41 +S1130240930AA10AA30AA50AAF0AB90A8D0E7B0E66 +S11302507E0E810E840E870E8A0E11241FBECFEFF0 +S1130260CDBFDFE2DEBF10E2A0E0B0E2ECE8F8E2EE +S113027002C005900D92A23BB107D9F72CE2A2EB84 +S1130280B0E201C01D92A834B207E1F71CD00C946F +S11302904414B6CEE0E8F6E08FE0808385E0848302 +S11302A0089508958091B420811103C08EEE92E0E8 +S11302B002C080E090E042E551E06EEE72E08A59BF +S11302C0994DFFC6089587E0E0EAF0E082837894D0 +S11302D010D6E7DFF0D7ACD0CFD060E080E077D0A5 +S11302E063D08CE057D031D5DFD5F6D5D3DF00000D +S11302F000000000000000000000000000000000FA +S113030000000000000000000000F1CF08950895EF +S11303108091002090E08830910590F4FC01E25037 +S1130320FF4F0C9435140BD10BC088D109C027D2D0 +S113033007C0E3D205C078D303C060D401C0D6D4CB +S11303409091B42081E0911180E08093B4200895CD +S113035081E08093B52042E551E06EEE72E086E6DE +S113036096E2AFD681E008951092B520089581E019 +S1130370089581E00895E0E0F2E010A2982F9C71C6 +S1130380936890A3881F8827881F880F81A312A2CF +S113039016A20895E0E0F2E010AA836880AB80E141 +S11303A081AB12AA16AA0895E0E0F2E010A683E851 +S11303B080A78FE281A712A616A6089592E09093D3 +S11303C0CA01E82FF0E084911092CA010895CF93F6 +S11303D0DF93E0E7F0E091819D7F9183109200022A +S11303E0623011F49EE101C09CE1E0E0F2E091830F +S11303F090E49283882311F080EC01C080E4E0E073 +S1130400F2E08383613011F482E001C083E0C0E054 +S1130410D2E08C8380E2D2DF8C8781E2CFDF8D87CC +S1130420188E198E81E08883BFDFDF91CF91089504 +S1130430CF93DF93E0E7F0E082818B7F8283C0E299 +S1130440D3E08DE0888380E4898389E08A8383E331 +S1130450B5DF888782E3B2DF898787E3AFDF8A87E6 +S113046086E3ACDF8B87E0E2F6E080818360808303 +S11304701482DF91CF910895E0E7F0E080818E7FD0 +S1130480808380E8809300010895E0E0F1E0108A21 +S113049080E4808B10A280A310AA80ABE0E4F1E09A +S11304A0108280831092B4201092B3200895109289 +S11304B00020EBDFE0E0F1E016AA44E240AB11AA31 +S11304C039E532AB82E083AB809102209091032026 +S11304D084AB95AB86E694E280AF91AF12AE8BE32A +S11304E084AF23E020933D0110923E0180A98068EF +S11304F080AB10924601E0E4F1E0408310924101A8 +S1130500309342012093430180910420909105206F +S1130510809344019093450186E592E280934801DB +S11305209093490110924A0189E380934C012093EE +S11305304D0110924E018081806880830895E0E02F +S1130540F1E0108A80E4808B84E0808B118A81E959 +S1130550828B80E1838B87E791E0848B958B84E2A7 +S1130560808F82E0818F128E4091B4208EEE92E0D3 +S1130570489F9001499F300D11242A59394D248FE9 +S11305804091B420489F9001499F300D1124C90126 +S11305908A59994D958F168E80898068808B08952D +S11305A081E08093002071DFE0E0F1E010AA80E4B4 +S11305B080AB84E080AB11AA12AA8BE483AB14AAAB +S11305C015AA16AA81E090E280AF91AF12AE80EA3C +S11305D084AF88E080933D0110923E0180A9806A37 +S11305E080AB85E58093A00810924601E0E4F1E039 +S11305F084E280831092410189E58093420182E084 +S113060080934301809102209091032080934401C0 +S11306109093450186E694E28093480190934901C2 +S113062010924A018BE380934C0183E080934D0147 +S113063010924E018081806880830895E0E0F1E0AB +S1130640108AA0E4A08B74E0708B118A61E9628B3C +S113065080E1838B27E731E0248B358B84E2808F24 +S113066082E0818F128EB091B4208EEE92E0B89F1A +S1130670A001B99F500D11244A59594D448FB0918E +S1130680B420B89FA001B99F500D11244A59594D67 +S1130690558F168E40894068408B10A2A0A370A38A +S11306A011A262A34BE443A324A335A320EA20A709 +S11306B028E021A712A64091B420489F9001499FA9 +S11306C0300D11242352384D24A74091B420489F63 +S11306D09001499F300D1124C9018352984D95A76B +S11306E016A680A1806880A30895CF93C2E0C0932A +S11306F00020CBDEE0E0F1E016AA44E240AB11AA10 +S113070039E532AB23E023AB80910420909105209E +S113071084AB95AB86E592E280AF91AF12AE89E3EC +S113072084AF20933D0110923E0180A9806880AB84 +S113073010924601E0E4F1E04083109241013093CD +S11307404201C09343018091022090910320809341 +S113075044019093450186E694E280934801909386 +S1130760490110924A018BE380934C0120934D017F +S113077010924E01808180688083CF910895CF9339 +S1130780E0E0F1E0108AB0E4B08BA4E0A08B118A21 +S113079071E9728B80E1838B27E731E0248B358B01 +S11307A084E2808F62E0618F128EC091B4208EEE5D +S11307B092E0C89FA001C99F500D11244A59594D78 +S11307C0448FC091B420C89FA001C99F500D11242B +S11307D04A59594D558F168E40894068408B10A256 +S11307E0B0A3A0A311A272A342E143A324A335A3FF +S11307F024E320A761A712A64091B420489F90014A +S1130800499F300D11242352384D24A74091B42020 +S1130810489F9001499F300D1124C9018352984D7E +S113082095A716A680A1806880A3CF910895CF9341 +S1130830C3E0C093002029DEE0E0F1E010A280E4F0 +S113084080A384E080A311A212A28BE483A314A248 +S113085015A216A281E090E280A791A712A680EAD1 +S113086084A788E085A716A680A1806A80A385E571 +S11308708093A00816AA34E230AB11AA29E522AB72 +S113088082E083AB809102209091032084AB95ABEE +S113089086E694E280AF91AF12AE8BE384AFC0934F +S11308A03D0110923E0180A9806880AB1092460100 +S11308B0E0E4F1E030831092410120934201C093BF +S11308C043018091042090910520809344019093EA +S11308D0450186E592E28093480190934901109284 +S11308E04A0189E380934C01C0934D0110924E015B +S11308F0808180688083CF910895E0E0F1E0108AE0 +S113090080E4808B84E0808B118A81E9828B8BE484 +S1130910838B87E791E0848B958B80EA808F88E0D6 +S1130920818F128E4091B4208EEE92E0489F900108 +S1130930499F300D11242A59394D248F4091B420F8 +S1130940489F9001499F300D1124C9018A59994D3E +S1130950958F168E80898068808B0895CF93C4E02C +S1130960C093002092DDE0E0F1E010A280E480A3D7 +S1130970C0A311A212A28BE483A314A215A216A2EF +S113098081E090E280A791A712A680EA84A788E07C +S113099085A716A680A1806A80A385E58093A00818 +S11309A016AA44E240AB11AA39E532AB23E023ABEB +S11309B0809104209091052084AB95AB86E592E26A +S11309C080AF91AF12AE89E384AF20933D011092C2 +S11309D03E0180A9806880AB10924601E0E4F1E01A +S11309E04083109241013093420182E0809343019D +S11309F080910220909103208093440190934501BB +S1130A0086E694E2809348019093490110924A014A +S1130A108BE380934C0120934D0110924E01808111 +S1130A2080688083CF910895CF93E0E0F1E0108A4D +S1130A30B0E4B08BA4E0A08B118A71E9728B8BE4D3 +S1130A40838B27E731E0248B358B80EA808F68E045 +S1130A50618F128EC091B4208EEE92E0C89FA001E7 +S1130A60C99F500D11244A59594D448FC091B42047 +S1130A70C89FA001C99F500D11244A59594D558F43 +S1130A80168E40894068408B10AAB0ABA0AB11AA67 +S1130A9072AB4AE443AB24AB35AB23EC20AF61AF7C +S1130AA012AE4091B420489F9001499F300D11240B +S1130AB02352384D24AF4091B420489F9001499F60 +S1130AC0300D1124C9018352984D90933D01109229 +S1130AD03E0180A9806880ABCF91089585E0809322 +S1130AE00020D3DCE0E0F1E016AA54E250AB11AAF6 +S1130AF049E542AB23E023AB80910420909105208B +S1130B0084AB95AB86E592E280AF91AF12AE39E348 +S1130B1034AF20933D0110923E0180A9806880ABE0 +S1130B2010924601E0E4F1E05083109241014093B9 +S1130B3042012093430180910420909105208093E9 +S1130B4044019093450186E696E280934801909390 +S1130B50490110924A0130934C0120934D011092A7 +S1130B604E01808180688083089586E08093002010 +S1130B708CDCE0E0F1E016AA44E240AB11AA39E5CE +S1130B8032AB23E023AB809104209091052084AB09 +S1130B9095AB86E592E280AF91AF12AE89E384AF64 +S1130BA020933D0110923E0180A9806880AB109291 +S1130BB04601E0E4F1E040831092410130934201A8 +S1130BC082E08093430180910220909103208093DE +S1130BD044019093450186E694E280934801909302 +S1130BE0490110924A018BE380934C0120934D01FB +S1130BF010924E018081806880830895E0E0F1E0E6 +S1130C00108A80E4808B84E0808B118A81E9828B56 +S1130C1080E1838B8EEE92E0848B958B24E2208F8F +S1130C2022E0218F128E4091B420489F9001499F69 +S1130C30300D11242A59394D248F4091B420489FF6 +S1130C409001499F300D1124C9018A59994D958FFE +S1130C50168E80898068808B089587E080930020B9 +S1130C6014DCE0E0F1E016AA44E240AB11AA39E555 +S1130C7032AB23E023AB809104209091052084AB18 +S1130C8095AB86E592E280AF91AF12AE89E384AF73 +S1130C9020933D0110923E0180A9806880AB1092A0 +S1130CA04601E0E4F1E040831092410130934201B7 +S1130CB082E08093430180910220909103208093ED +S1130CC044019093450186E694E280934801909311 +S1130CD0490110924A018BE380934C0120934D010A +S1130CE010924E018081806880830895E0E0F1E0F5 +S1130CF0108A80E4808B85E0808B118A81E9828B65 +S1130D0080E1838B8EEE92E0848B958B24E2208F9E +S1130D1022E0218F128E4091B420489F9001499F78 +S1130D20300D11242A59394D248F4091B420489F05 +S1130D309001499F300D1124C9018A59994D958F0D +S1130D40168E80898068808B0895E0E7F0E08381C7 +S1130D508C7F838384818C7F848380818D7F808357 +S1130D60E0E8F1E080EC8283128688EC81831186CE +S1130D70E0E0F8E034E0308323E02183148285ED61 +S1130D8091E086A397A31682E0E4F8E03083218300 +S1130D90148286A397A31682E0E6F6E08081806140 +S1130DA08083E0E4F9E083E18183148221E02683F7 +S1130DB088EB9BE086A397A310A611A62083089531 +S1130DC01F920F920FB60F9211242F933F934F93BC +S1130DD08F939F93EF93FF93CF93DF931F92CDB79E +S1130DE0DEB780910020873031F4E0E0F2E084A5A2 +S1130DF0898385A503C0E0E0F2E084A52091B220B8 +S1130E00281BE0E4F9E080A591A531E022300CF440 +S1130E1030E03323C9F031E0823B9B4008F030E0FE +S1130E20332391F0E0E4F9E080A591A529301CF08A +S1130E3026E030E002C021E030E0820F931FE0E4BE +S1130E40F9E080AF91AF21C0E0E4F9E080A591A57D +S1130E5031E02F3F0CF030E03323B9F031E0079755 +S1130E6008F430E0332389F0E0E4F9E080A591A5AB +S1130E70283F1CF426E030E002C021E030E0821B71 +S1130E80930BE0E4F9E080AF91AF0F90DF91CF9145 +S1130E90FF91EF919F918F914F913F912F910F90DF +S1130EA00FBE0F901F901895E0E7F0E083818F7ECE +S1130EB08383E0E4F6E080818A6A80838FEF848311 +S1130EC088E5828BE0EAF8E084EC858383E086831E +S1130ED0178288E184830895E0E7F0E08381877FC7 +S1130EE0838380E48093C00888E5E0E4F6E0858BA2 +S1130EF00895CF93DF9300D000D0CDB7DEB78FEF46 +S1130F0080937000809371008093720080937300CB +S1130F1080937400809375008093760064E081E48C +S1130F2090E0E4D56CE170E082E0E6D58A836DE17F +S1130F3070E082E0E1D5898389819A81019621F468 +S1130F4080E493E289839A8389819A818B839C8349 +S1130F50E0E6F0E082838C8183838FB7F894E0E548 +S1130F60F0E09081926090838FBF818181FFFDCFFB +S1130F708FB7F894A0E5B0E016969C911697997FE8 +S1130F8016969C931697E0E6F0E090E895839BEB29 +S1130F90968316969C911697946016969C939081CE +S1130FA0916090838FBF61E080E490E09FD58FB71C +S1130FB0F894E0E5F0E090819E7F90838FBF2496C3 +S1130FC0CDBFDEBFDF91CF9108959FB7F894E82F8E +S1130FD0F0E0E059FF4F60958081682360839FBFF4 +S1130FE00895863011F468E101C060E0E0E5F0E0C6 +S1130FF0818181FD24C08FB7F894908192609083A1 +S11310008FBF818181FFFDCF8FB7F894A0E5B0E059 +S113101016969C911697997F16969C931697E0E6E0 +S1131020F0E090E895839BEB968316969C91169737 +S1131030946016969C939081916090838FBF6360B7 +S113104084E490E053D560E480E0BFCF08958091BC +S1131050B62008952BD1FC0183818093B6208111A1 +S113106002C076C9089581E008958091B620813048 +S113107009F47AC908958091562488234CF4807623 +S11310808034A9F480915724811113C072C9089542 +S11310908076803481F48091572481110EC0809130 +S11310A05C2490915D24892B51F061C9089580E0FE +S11310B0089580E0089580E0089580E0089580E038 +S11310C008950F931F939B018A01AC0160E083E8AC +S11310D00E947A111F910F910895E091BB20F09125 +S11310E0BC200190F081E02D228133812E0F3F1F1F +S11310F0FC014081E40FF11DE217F307A0F48181A4 +S11311008430A1F0861306C014C081818430A1F01C +S11311108617A9F08081E80FF11DE217F307A8F301 +S113112080E090E0089580E090E0089580E090E011 +S113113008958E2F9F2F089580E090E008958E2FBC +S11311409F2F0895809158248F770C94D010089580 +S11311509091BE20992381F1E091BB20F091BC20B5 +S11311600190F081E02D9481891740F5E093B92036 +S1131170F093BA20228133812E0F3F1FE217F30729 +S1131180F8F49181943061F49281981309C09381A9 +S1131190961306C0E093B920F093BA2081E0089535 +S11311A09081E90FF11DE217F30758F3E093B9209A +S11311B0F093BA2080E0089580E0089580E00895D7 +S11311C080E00895FF920F931F93CF93DF93C82F6E +S11311D060E0BEDFF82E882381F1A091BB20B0919E +S11311E0BC20EC2FF0E0EE0FFF1F12962D913C91E6 +S11311F01397E20FF31F00811181D8011696ED9128 +S1131200FC9117970995682F8C2FA2DFF82E88235D +S1131210A1F0C091B920D091BA2065E0CE015DDF84 +S1131220EC01009721F08A810E943A12F6CFD8018E +S11312301296ED91FC91139709958F2DDF91CF9123 +S11312401F910F91FF9008951F93CF93DF93182F51 +S11312507FDF882339F1C091B920D091BA2065E0AD +S1131260CE013BDFEC01009741F04C815D816B8145 +S11312708A81A5D78111F3CF15C0A091BB20B0916D +S1131280BC20812F90E0880F991F1296ED91FC915C +S11312901397E80FF91F0190F081E02D0190F08180 +S11312A0E02D0995DF91CF911F9108958091B92088 +S11312B09091BA200895EFC60895CF938091BE20EF +S11312C08823C1F0E091BB20F091BC200190F08113 +S11312D0E02D8481882371F0C0E08C2F73DFCF5F11 +S11312E0E091BB20F091BC200190F081E02D84813D +S11312F0C81798F31092BE201092C2201092C320F7 +S1131300CF910895CF938091BE20882341F1E0913D +S1131310BB20F091BC20A081B18114968C918823CC +S1131320F1F0C0E08C2F90E0880F991F0280F381C8 +S1131330E02DE80FF91F0190F081E02D0084F18584 +S1131340E02D309709F00995CF5FE091BB20F09133 +S1131350BC20A081B18114968C91C81718F3CF9149 +S11313600895EF92FF920F931F93CF93DF93109200 +S113137060241092612410926224109263241092CB +S11313806424109265242091562422233CF48091F5 +S11313905C2490915D24892B09F49BC3207620342E +S11313A009F008C18091572490E0FC01E05AF1094A +S11313B0E830F10508F0F5C0EA5FFE4F0C943514EF +S11313C000008BC3E0E0F8E01082809158249091F3 +S11313D0592486AB97AB80915A248F708083CCE5D7 +S11313E0D4E26881798186E592E2E0D688819981A8 +S11313F020910420309105208217930709F46DC3CE +S113140080930420909305208091002090E0883000 +S1131410910508F0C8C0FC01E25FFE4F0C9435143E +S113142046D85BC3BDD859C360D957C300DA55C386 +S113143095DA53C353DB51C398DB4FC30EDC4DC362 +S1131440E0E4F8E01082CCE5D4E26881798160932D +S1131450022070930320809158249091592486ABE4 +S113146097AB80915A248F70808386E694E29ED64F +S11314708881998120910420309105208217930757 +S113148009F42BC3809304209093052080910020BD +S113149090E08830910508F088C0FC01EA5EFE4FB8 +S11314A00C94351404D819C37BD817C31ED915C39B +S11314B0BED913C353DA11C311DB0FC356DB0DC3FB +S11314C0CCDB0BC3E0E4F9E010A611A6809158240C +S11314D08093B22002C380915824E0E2F6E0848332 +S11314E0FCC280915824909159248830910508F0C9 +S11314F05EC0FC01E25EFE4F0C94351460E080E0B7 +S11315000E94E70180915A240E94BB010E94570265 +S1131510E4C260E080E00E94E70180915A240E94C6 +S1131520BB013ED8DAC261E081E00E94E701CAE56E +S1131530D4E288810E94BB0189810E94CA01D5D866 +S1131540CCC275D9CAC20ADAC8C260E080E00E947F +S1131550E70180915A240E94BB01C0DABEC261E057 +S113156080E00E94E70180915A240E94BB01FDDAC9 +S1131570B4C262E080E00E94E70180915A2480684E +S11315800E94BB016ADBA9C280915824E0E8F6E01E +S11315908483A3C2E9E7F0E091E088EDF89484BF86 +S11315A0908300E005C001E003C001E001C000E059 +S11315B0011194C220915624822F807609F00EC224 +S11315C022230CF017C180915C2490915D24009734 +S11315D009F404C22F7109F0B1C030915724363098 +S11315E081F0383009F49FC03111A8C0029739F452 +S11315F062E070E082EC90E2D9D501E0EDC100E058 +S1131600EBC12091582430915924832F992782309B +S1131610910599F01CF4019739F07BC08330910552 +S1131620D9F10F9759F175C0809110209091112034 +S1131630DC016C9170E0BAD55BC0E0911020F091B0 +S113164011208189281708F066C0C9019927880FDD +S1131650991F880F991FE0911220F0911320E80F31 +S1131660F91F80819181FC01628173819FD5E09192 +S11316705E24F0915F2482E081833AC0809114203B +S113168090911520009709F448C0DC0112966D91E1 +S11316907C9113978BD52CC033272130310559F019 +S11316A020F02230310559F03AC064E070E08EEA4F +S11316B090E27CD51DC083EA90E229E003C08AE869 +S11316C090E228E1382FAAE5B0E2E82FF92F8191C2 +S11316D090E08D939D938E2F831B8217C0F3220F6E +S11316E062E0620F6093582070E088E590E25ED576 +S11316F080915C2490915D24209160243091612438 +S11317008217930770F4809360249093612401E01E +S113171063C100E061C100E05FC100E05DC100E0C1 +S11317205BC101E059C1019739F461E070E08EEBCF +S113173090E23CD501E050C100E04EC1213009F0F7 +S11317403FC0309157243A30D9F5019799F58091EB +S1131750BE20882389F1C0915A24D0915B24E09063 +S1131760BB20F090BC20D701ED91FC918481C81777 +S113177028F560E08C2FECDC082F882309F42CC1B9 +S1131780CE019927880F991FD7011296ED91FC91EC +S11317901397E80FF91F0190F081E02D0680F7817F +S11317A0E02D09958093C02061E070E080EC90E228 +S11317B0FDD412C100E010C100E00EC100E00CC174 +S11317C0223009F00BC120915724211100C1029746 +S11317D079F480915A2449D590E08093B72090936E +S11317E0B82062E070E087EB90E2E0D401E0F4C05E +S11317F000E0F2C02F7109F090C08091572483302B +S113180009F4E7C018F48130B1F087C0853019F0CD +S1131810893061F182C080915C2490915D24892B90 +S113182041F482EA98E0809362249093632401E077 +S1131830D3C000E0D1C080915C2490915D24892BB9 +S113184089F48091582490915924019769F48091E6 +S1131850C2209091C3208D7F8093C2209093C32097 +S113186001E0BAC000E0B8C000E0B6C080915C24DA +S113187090915D24892B09F046C095D4882309F4FE +S113188044C020915824309159243327E0911020EA +S1131890F0911120818990E082179307C0F10DDD4A +S11318A080915824909159248093BE20882389F1F3 +S11318B099278150904C880F991F880F991FE091A8 +S11318C01220F0911320E80FF91FE093BB20F0934E +S11318D0BC200190F081E02D84818823E1F0C0E0F8 +S11318E060E08C2FB1DC082F882309F475C0CF5F2A +S11318F0E091BB20F091BC200190F081E02D848127 +S1131900C81770F369C000E067C000E065C000E07C +S113191063C001E061C001E05FC0213009F580913E +S113192057248B30E9F480915C2490915D24892BB9 +S113193099F48091BE20882389F0C0915A24D091D3 +S113194058248C2F3FDC082F882309F445C06D2FC1 +S11319508C2F7ADC082F40C000E03EC000E03CC081 +S1131960223009F03BC080915724813019F0833034 +S1131970B1F031C080915C2490915D24892B59F49D +S11319808091582490915924892B39F480915A24B8 +S113199087D4082F21C000E01FC000E01DC0809143 +S11319A05C2490915D24892B71F48091582490914A +S11319B05924892B51F4CAE5D4E2888122D588813F +S11319C076D5082F09C000E007C000E005C000E09C +S11319D003C000E001C000E0011180C080915624E2 +S11319E08F718130C1F58091BE208823A1F1C0910F +S11319F05A24D0915B240091BB201091BC20D801C3 +S1131A00ED91FC918481C81730F560E08C2FA0DB48 +S1131A10882309F1CE019927880F991FD8011296BE +S1131A20ED91FC911397E80FF91F00811181D80102 +S1131A301696ED91FC9117970995682F8C2F88DBEA +S1131A40882349F0D8011496ED91FC9115970995D6 +S1131A50082F811143C0809156248F718230D9F5AB +S1131A608091BE20882389F1E091BB20F091BC20B5 +S1131A70A081B18114968C91882349F110E0212F23 +S1131A8030E0220F331F0280F381E02DE20FF31FB9 +S1131A90C081D181EE81FF810995682F812F58DBA8 +S1131AA0082F8823D9F0EC81FD810995082F811135 +S1131AB015C01F5FE091BB20F091BC20A081B181D3 +S1131AC014968C911817D8F209C000E007C000E002 +S1131AD005C000E003C000E001C001E0802FDF91F9 +S1131AE0CF911F910F91FF90EF9008951BBEFC01C1 +S1131AF028ED24BF608308954091CA01E62FF72F93 +S1131B008093CA0184914093CA010895811122C02F +S1131B10909154229923D9F09091432C911101C0B2 +S1131B20FFCF9FB7F894E3E4FCE2208121502083A7 +S1131B309FBF0DC09091432C9F3F09F4FFCF9FB7E7 +S1131B40F894E3E4FCE220812F5F20839FBF80931D +S1131B505422089590915422992361F3F8CF0F935E +S1131B60E8ECF4E080818F7D808380818F7D8083A9 +S1131B70E8E1F2E202E0059310921A2210921B228D +S1131B8000E2069300E40693E0E1F2E200E2069349 +S1131B9000E4069310926224109263241092642449 +S1131BA01092652410926024109261241092FF21F7 +S1131BB00F9108950F9385E08093FF21E9E1F2E20C +S1131BC004E00593E1E1F2E204E005930F91089546 +S1131BD00F9383E08093FF2110921A2210921B220C +S1131BE0E8E1F2E202E006930F910895E0916224A5 +S1131BF0F0916324309709F0099508950F93CF93DA +S1131C00DF938091FF21833019F4F0DFA8DF60C0F7 +S1131C108091FB219091FC21C0916024D09161249A +S1131C20C81BD90B71F52091FD213091FE21820F43 +S1131C30931F8093FD219093FE2120915C24309189 +S1131C405D248217930721F08091C420882341F0FA +S1131C5084E08093FF21E0E1F2E202E0069338C0E1 +S1131C60E0916424F0916524309799F009958823D4 +S1131C7081F01092FB211092FC21C0916024D0913C +S1131C806124C034D10528F01092C420C0E4D0E00F +S1131C9003C081E08093C420C0931A22D0931B22F6 +S1131CA08091FB219091FC2120915E2430915F244E +S1131CB0280F391F20931C2230931D22C80FD91FCF +S1131CC0C093FB21D093FC21E8E1F2E202E0069309 +S1131CD0DF91CF910F910895FC018181877090E08D +S1131CE0FC013197E730F10518F4EA5DFE4FBDC5FC +S1131CF088E090E0089580E290E0089580E490E028 +S1131D00089580E890E0089580E091E0089580E0EF +S1131D1092E008958FEF93E0089580E190E00895B4 +S1131D20282F2F7030E0220F331F992787FD9095BD +S1131D308827990F881F9927820F931F02979C0168 +S1131D40220F331F220F331F220F331F820F931FC3 +S1131D508B579E4D08950F93CF938091CC0480FFB1 +S1131D6062C081E08093CC04E0E1F2E200E80693F3 +S1131D70E8E1F2E200E806938093CA04E0E1F2E2CB +S1131D8000E106938091FF21882329F0835082305B +S1131D9008F42CDFE4DE809112229091132208973C +S1131DA009F043C088E0EBEBF1E2A6E5B4E2019070 +S1131DB00D928A95E1F7E8ECF4E0808180628083FB +S1131DC0808180628083CDDAC82F811103C0F2DE66 +S1131DD0C1E02CC08091562488236CF41092FD211C +S1131DE01092FE211092FB211092FC2182E080933C +S1131DF0FF2104DF1BC020915C2430915D24232B40 +S1131E0011F4E6DE13C01092FD211092FE2110920F +S1131E10FB211092FC2181E08093FF21E0E1F2E2BA +S1131E2002E0069303C0C0E001C0C1E08C2FCF9153 +S1131E300F910895BF92CF92DF92EF92FF920F938A +S1131E401F93CF93DF93B82E6BDFEC011B2D111F73 +S1131E501127111F8B2D8F70E82EF12CEE0CFF1C17 +S1131E60E10EF11CC701880F991F880F991F880F75 +S1131E70991F9C01205F3D4D7901C9012DDF6C0143 +S1131E80112309F459C0D70116962D913C91179747 +S1131E908D819E81280F391F2D833E838B819C81E8 +S1131EA028173907B9F1FC01E21BF30B9F01211537 +S1131EB0F4E03F0738F02FEF33E0C901B601C1D495 +S1131EC0281B390B888181FF09C0C901B601B9D427 +S1131ED041E0892B09F040E0942F01C090E0888113 +S1131EE090FB81F98883D70116961D921C9217974F +S1131EF012962D933C93139729813A818D819E816B +S1131F00820F931F14968D939C931597F70102E00B +S1131F10069394C0888181FF83C08D7F8883D70115 +S1131F2016961D921C92179712961D921C92139747 +S1131F30F70102E0069382C0D70112960D911C911D +S1131F401397888182FF13C0E981FA812D813E8134 +S1131F508B819C81B60175D4B0E4BB9EB001112481 +S1131F606B577F4DAC01CF01820F931F84D42D8119 +S1131F703E81200F311F2D833E83EB81FC81E217CC +S1131F80F30710F4ED83FE83D70116968D919C918F +S1131F9017978017910709F043C08D819E81E81738 +S1131FA0F90709F43DC0E81BF90BE115B4E0FB07A0 +S1131FB040F0EFEFF3E0CF01B60143D4E81BF90B97 +S1131FC005C0CF01B6013DD4E81BF90BD701129629 +S1131FD01D921C921397EC15FD0578F4888184609A +S1131FE08883B0E4BB9EC00111248B579F4DF70139 +S1131FF084839583C682D7820FC029813A818D81DB +S11320009E81820F931FD70114968D939C931597ED +S11320101696ED93FC931797F70102E006930EC012 +S1132020888180FF0BC08E7F8883EF81F88530978D +S113203029F06D817E814B2D80E00995DF91CF9150 +S11320401F910F91FF90EF90DF90CF90BF90089574 +S1132050CF93CFB7F89481E059DDEAECF4E080E463 +S1132060808380E28083E1ECF4E08081816080837E +S1132070A9ECB4E08C9182608C93E8ECF4E080816C +S1132080806480838C9181608C938081806880835C +S1132090CFBFCF910895CF93DF93C0E6D0E01882ED +S11320A080E30E94F107E0ECF4E0808180648083A7 +S11320B081E08883CFB7F89480E090E0FC01EE0FD4 +S11320C0FF1FEE0FFF1FEE0FFF1FEF5EFD4D10828F +S11320D001968830910591F7E5E8F1E280818E7FE1 +S11320E08083EEE8F1E280818E7F8083E7E9F1E28C +S11320F080818E7F8083E0EAF1E280818E7F80831D +S1132100E9EAF1E280818E7F8083E2EBF1E2808173 +S11321108E7F80836AE170E082E0EEDC8F3F19F00D +S11321208093FA0403C08FE18093FA046BE170E0BA +S113213082E0E2DC8F3F19F08093FB0403C08FE15F +S11321408093FB04E0ECF4E08081836080838081F1 +S11321508068808380818061808380E192E28683CD +S113216097838081806280838FEF8093C504E8EC3D +S1132170F4E0808182608083109254228091472C05 +S11321808F3F09F4FFCF8FB7F894E7E4FCE2908126 +S11321909F5F90838FBF5CDFCFBFDF91CF910895A6 +S11321A08093C30408958091C304089580935E24AA +S11321B090935F2460936024709361240895E82FC2 +S11321C0EF70F0E0EE0FFF1F992787FD90958827A9 +S11321D0990F881F9927E80FF91FEE0FFF1FEE0FC5 +S11321E0FF1FEE0FFF1FE05FFD4D8181807CD9F55D +S11321F06370613029F010F480E403C080E801C00A +S113220080EC40385105E1F050F440325105A1F022 +S11322104034510599F04031510561F419C041151C +S113222092E0590789F04F3F93E0590779F041153F +S1132230514041F020E00DC022E00BC023E009C072 +S113224024E007C025E005C026E003C027E001C064 +S113225021E0118296E09083822B818381818062C8 +S1132260818381E0089580E00895E82FEF70F0E025 +S1132270EE0FFF1F992787FD90958827990F881FD8 +S11322809927E80FF91FEE0FFF1FEE0FFF1FEE0F48 +S1132290FF1FE05FFD4D818182FB882780F908954F +S11322A0E82FEF70F0E0EE0FFF1F282F332727FDF4 +S11322B030952227330F221F3327E20FF31FEE0F2F +S11322C0FF1FEE0FFF1FEE0FFF1FE05FFD4D91811B +S11322D092FF0EC091819B7F918322DDFC0180815E +S11322E080FF06C08E7F80830780F085E02D0995EE +S11322F081E008957F928F929F92AF92BF92CF9286 +S1132300DF92EF92FF920F931F93CF93DF93982E58 +S1132310862E5A01690104DD7C01792C771C77240F +S1132320771CC92DCF70D0E0CC0FDD1FC70DD11D98 +S1132330CC0FDD1FCC0FDD1FCC0FDD1FC05FDD4DCB +S11323408981807C09F44BC08981807C803C19F0B0 +S1132350898182FD46C08FB7F894F701908190FF80 +S113236003C08FBF712C3EC0F701908191609083B0 +S11323708FBFF701A182B282C382D48215821682F2 +S113238007831087811006C091E0C114D10419F0AD +S113239090E001C091E0F701808190FB81F98B7F8F +S11323A08083772019F01E821F8214C08981807C6B +S11323B0803C61F4CE0190DCBC01C60142D2892B81 +S11323C029F0F70180818E7F80830CC01A821B82E2 +S11323D01E821F82892D2EDD7724739403C0712CF5 +S11323E001C0712C872DDF91CF911F910F91FF9028 +S11323F0EF90DF90CF90BF90AF909F908F907F90A1 +S11324000895FF920F931F93CF93DF93182FF82E05 +S1132410FF1CFF24FF1CC82FCF70D0E0CC0FDD1FA2 +S1132420CF0DD11DCC0FDD1FCC0FDD1FCC0FDD1F59 +S1132430C05FDD4D75DCDC01FE0102E005938C918B +S113244080FF12C08E7F8C931796ED91FC911897A4 +S1132450309751F0FF2019F06E817F8102C06A81AC +S11324607B81412F81E00995DF91CF911F910F91DD +S1132470FF900895CF93C82FC4DFEC2FEF70F0E0E6 +S1132480EE0FFF1F8C2F992787FD90958827990FB2 +S1132490881F9927E80FF91FEE0FFF1FEE0FFF1F8C +S11324A0EE0FFF1FE05FFD4D1182CF9108950F9352 +S11324B0E82FEF70F0E0EE0FFF1F282F332727FDE2 +S11324C030952227330F221F3327E20FF31FEE0F1D +S11324D0FF1FEE0FFF1FEE0FFF1FE05FFD4D918109 +S11324E09460918301E006938CDF81E00F9108955D +S11324F01F920F920FB60F9211240F932F933F93B5 +S11325004F935F936F937F938F939F93AF93BF93F7 +S1132510EF93FF938091CB04882344F480E8809365 +S1132520CA040E9482090E94880190C08091CB0451 +S113253082FF20C084E08093CA048091182286FF21 +S113254085C08091CC0481FD81C005DC81117EC0F1 +S11325508091FF21813011F43BDB78C0843009F095 +S113256075C0E9E1F2E204E00593E1E1F2E204E09E +S113257005936CC08091CB0481FF63C082E080939B +S1132580CA048091102286FF61C08091CC0481FD31 +S11325905DC0E1DB81115AC08091FF21823041F49A +S11325A084E08093FF21E0E1F2E202E006934EC072 +S11325B0833009F04BC0E9E1F2E204E00593E1E184 +S11325C0F2E204E0059342C080E18093CA0481E012 +S11325D018DF81E816DF82E014DF82E812DF0E9450 +S11325E05D091092C304E1E1F2E2108296E0909357 +S11325F0102283E48083E9E1F2E2108290931822AE +S113260080838BEB91E28093142290931522A7DAB6 +S11326101DC08091CB0486FF08C080E48093CA0467 +S113262080E074DA0E94860111C08091CB0485FF9A +S11326300DC080E28093CA0481E068DA0E948701B9 +S113264005C08091CB0484FDBFCFE3CFFF91EF9110 +S1132650BF91AF919F918F917F916F915F914F91B6 +S11326603F912F910F910F900FBE0F901F901895CF +S11326701F920F920FB60F9211240F931F932F9353 +S11326803F934F935F936F937F938F939F93AF93F6 +S1132690BF93CF93DF93EF93FF938091CC0481FD9D +S11326A003C059DB8111B8C082E08093CC048091CF +S11326B0C5048195880FE0E1F2E2E81BF10920816D +S11326C03181205132423695279536952795369596 +S11326D02795822F869520FF02C090E801C090E0E4 +S11326E0890FE82FEF70F0E0EE0FFF1F282F33273C +S11326F027FD30952227330F221F3327E20FF31FC4 +S1132700EE0FFF1FEE0FFF1FEE0FFF1FE05FFD4DEB +S1132710908195FF81C000E20693811178C0809179 +S1132720FF21843019F462DA1ADA76C0C0911222D9 +S1132730D091132280916024909161240091FB2117 +S11327401091FC2198012C0F3D1F8217930718F458 +S1132750EC01C01BD10B80915E2490915F24AE01EB +S11327606BEB71E2800F911F86D00C0F1D1F00933D +S1132770FB211093FC21C034D10569F48091FD2123 +S11327809091FE21800F911F20915C2430915D2453 +S11327908217930788F00093602410936124E091DA +S11327A06424F0916524309729F00995811102C0C1 +S11327B001DA32C00DDA30C0809160249091612436 +S11327C008171907F9F4E0916424F091652430970F +S11327D011F4F0D921C00995811102C0EBD91CC0B4 +S11327E02091FD213091FE218091FB219091FC21CB +S11327F0820F931F8093FD219093FE211092FB2161 +S11328001092FC21E0E1F2E202E0069305C0803878 +S113281011F4F4D901C00EDBFF91EF91DF91CF9158 +S1132820BF91AF919F918F917F916F915F914F91E4 +S11328303F912F911F910F910F900FBE0F901F90FA +S11328401895AA1BBB1B51E107C0AA1FBB1FA617E3 +S1132850B70710F0A61BB70B881F991F5A95A9F745 +S113286080959095BC01CD010895EE0FFF1F059052 +S1132870F491E02D0994FB01DC0102C001900D925A +S10F288041505040D8F70895F894FFCF61 +S113288CFF55800080002A0835083B082708000003 +S113289C4420162000001C201A20062009022700C0 +S11328AC01010080FA0904000003FFFFFF00070583 +S11328BC8102400000070502024000000705830165 +S11328CCFF0301001201000200000040EB0300A012 +S11328DC00020102000100000003000000000000DF +S11328EC00000000000000000000000000000000D8 +S11328FC00000000000000000000000000000000C8 +S113290C00000000000000000000555342476F62B5 +S113291C696E6461722044756D6D792044657669C5 +S113292C6365005461706972546563680000040344 +S105293C090488 +S9030000FC diff --git a/AVR Code/USB_BULK_TEST/Debug/makedep.mk b/AVR Code/USB_BULK_TEST/Debug/makedep.mk new file mode 100644 index 00000000..4097a0ef --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/makedep.mk @@ -0,0 +1,42 @@ +################################################################################ +# Automatically-generated file. Do not edit or delete the file +################################################################################ + +src\tiny_dig.c + +src\ASF\common\boards\user_board\init.c + +src\ASF\common\services\ioport\xmega\ioport_compat.c + +src\main.c + +src\tiny_adc.c + +src\tiny_dac.c + +src\tiny_dma.c + +src\tiny_timer.c + +src\tiny_uart.c + +src\ASF\common\services\usb\class\vendor\device\example\atxmega256a3bu_xmega_a3bu_xplained\ui.c + +src\ASF\common\services\clock\xmega\sysclk.c + +src\ASF\common\services\sleepmgr\xmega\sleepmgr.c + +src\ASF\common\services\usb\class\vendor\device\udi_vendor.c + +src\ASF\common\services\usb\class\vendor\device\udi_vendor_desc.c + +src\ASF\common\services\usb\udc\udc.c + +src\ASF\xmega\drivers\cpu\ccp.s + +src\ASF\xmega\drivers\nvm\nvm.c + +src\ASF\xmega\drivers\nvm\nvm_asm.s + +src\ASF\xmega\drivers\usb\usb_device.c + diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/boards/user_board/init.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/boards/user_board/init.d new file mode 100644 index 00000000..b7fc4d06 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/boards/user_board/init.d @@ -0,0 +1,203 @@ +src/ASF/common/boards/user_board/init.d \ + src/ASF/common/boards/user_board/init.o: \ + ../src/ASF/common/boards/user_board/init.c ../src/asf.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/boards/user_board/init.o b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/boards/user_board/init.o new file mode 100644 index 00000000..f66659ba Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/boards/user_board/init.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/components/display/st7565r/st7565r.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/components/display/st7565r/st7565r.d new file mode 100644 index 00000000..6c08986e --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/components/display/st7565r/st7565r.d @@ -0,0 +1,159 @@ +src/ASF/common/components/display/st7565r/st7565r.d \ + src/ASF/common/components/display/st7565r/st7565r.o: \ + ../src/ASF/common/components/display/st7565r/st7565r.c \ + ../src/ASF/common/components/display/st7565r/st7565r.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/boards/board.h \ + ../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport_compat.h \ + ../src/ASF/common/services/ioport/xmega/../ioport.h \ + ../src/ASF/xmega/utils/status_codes.h \ + ../src/ASF/common/services/delay/delay.h \ + ../src/ASF/common/services/delay/xmega/cycle_counter.h \ + ../src/config/conf_st7565r.h ../src/ASF/common/services/spi/usart_spi.h \ + ../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h \ + ../src/ASF/xmega/drivers/usart/usart.h \ + ../src/ASF/xmega/drivers/pmic/pmic.h ../src/config/conf_usart_spi.h + +../src/ASF/common/components/display/st7565r/st7565r.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport_compat.h: + +../src/ASF/common/services/ioport/xmega/../ioport.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/ASF/common/services/delay/delay.h: + +../src/ASF/common/services/delay/xmega/cycle_counter.h: + +../src/config/conf_st7565r.h: + +../src/ASF/common/services/spi/usart_spi.h: + +../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h: + +../src/ASF/xmega/drivers/usart/usart.h: + +../src/ASF/xmega/drivers/pmic/pmic.h: + +../src/config/conf_usart_spi.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/clock/xmega/sysclk.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/clock/xmega/sysclk.d new file mode 100644 index 00000000..411bc0ab --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/clock/xmega/sysclk.d @@ -0,0 +1,124 @@ +src/ASF/common/services/clock/xmega/sysclk.d \ + src/ASF/common/services/clock/xmega/sysclk.o: \ + ../src/ASF/common/services/clock/xmega/sysclk.c \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/boards/board.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/clock/xmega/sysclk.o b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/clock/xmega/sysclk.o new file mode 100644 index 00000000..54738508 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/clock/xmega/sysclk.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.d new file mode 100644 index 00000000..a4919514 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.d @@ -0,0 +1,174 @@ +src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.d \ + src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.o: \ + ../src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.c \ + ../src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/common/components/display/st7565r/st7565r.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/boards/board.h \ + ../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport_compat.h \ + ../src/ASF/common/services/ioport/xmega/../ioport.h \ + ../src/ASF/xmega/utils/status_codes.h \ + ../src/ASF/common/services/delay/delay.h \ + ../src/ASF/common/services/delay/xmega/cycle_counter.h \ + ../src/config/conf_st7565r.h ../src/ASF/common/services/spi/usart_spi.h \ + ../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h \ + ../src/ASF/xmega/drivers/usart/usart.h \ + ../src/ASF/xmega/drivers/pmic/pmic.h ../src/config/conf_usart_spi.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono.h \ + ../src/ASF/xmega/utils/progmem.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_generic.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.h + +../src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/common/components/display/st7565r/st7565r.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport_compat.h: + +../src/ASF/common/services/ioport/xmega/../ioport.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/ASF/common/services/delay/delay.h: + +../src/ASF/common/services/delay/xmega/cycle_counter.h: + +../src/config/conf_st7565r.h: + +../src/ASF/common/services/spi/usart_spi.h: + +../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h: + +../src/ASF/xmega/drivers/usart/usart.h: + +../src/ASF/xmega/drivers/pmic/pmic.h: + +../src/config/conf_usart_spi.h: + +../src/ASF/common/services/gfx_mono/gfx_mono.h: + +../src/ASF/xmega/utils/progmem.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_generic.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.d new file mode 100644 index 00000000..718dde38 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.d @@ -0,0 +1,174 @@ +src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.d \ + src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.o: \ + ../src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.c \ + ../src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/utils/progmem.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.h \ + ../src/ASF/common/components/display/st7565r/st7565r.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/boards/board.h \ + ../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport_compat.h \ + ../src/ASF/common/services/ioport/xmega/../ioport.h \ + ../src/ASF/xmega/utils/status_codes.h \ + ../src/ASF/common/services/delay/delay.h \ + ../src/ASF/common/services/delay/xmega/cycle_counter.h \ + ../src/config/conf_st7565r.h ../src/ASF/common/services/spi/usart_spi.h \ + ../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h \ + ../src/ASF/xmega/drivers/usart/usart.h \ + ../src/ASF/xmega/drivers/pmic/pmic.h ../src/config/conf_usart_spi.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_generic.h + +../src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.h: + +../src/ASF/common/services/gfx_mono/gfx_mono.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/utils/progmem.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.h: + +../src/ASF/common/components/display/st7565r/st7565r.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport_compat.h: + +../src/ASF/common/services/ioport/xmega/../ioport.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/ASF/common/services/delay/delay.h: + +../src/ASF/common/services/delay/xmega/cycle_counter.h: + +../src/config/conf_st7565r.h: + +../src/ASF/common/services/spi/usart_spi.h: + +../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h: + +../src/ASF/xmega/drivers/usart/usart.h: + +../src/ASF/xmega/drivers/pmic/pmic.h: + +../src/config/conf_usart_spi.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_generic.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_generic.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_generic.d new file mode 100644 index 00000000..f3072e4b --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_generic.d @@ -0,0 +1,174 @@ +src/ASF/common/services/gfx_mono/gfx_mono_generic.d \ + src/ASF/common/services/gfx_mono/gfx_mono_generic.o: \ + ../src/ASF/common/services/gfx_mono/gfx_mono_generic.c \ + ../src/ASF/common/services/gfx_mono/gfx_mono_generic.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/utils/progmem.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.h \ + ../src/ASF/common/components/display/st7565r/st7565r.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/boards/board.h \ + ../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport_compat.h \ + ../src/ASF/common/services/ioport/xmega/../ioport.h \ + ../src/ASF/xmega/utils/status_codes.h \ + ../src/ASF/common/services/delay/delay.h \ + ../src/ASF/common/services/delay/xmega/cycle_counter.h \ + ../src/config/conf_st7565r.h ../src/ASF/common/services/spi/usart_spi.h \ + ../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h \ + ../src/ASF/xmega/drivers/usart/usart.h \ + ../src/ASF/xmega/drivers/pmic/pmic.h ../src/config/conf_usart_spi.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.h + +../src/ASF/common/services/gfx_mono/gfx_mono_generic.h: + +../src/ASF/common/services/gfx_mono/gfx_mono.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/utils/progmem.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.h: + +../src/ASF/common/components/display/st7565r/st7565r.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport_compat.h: + +../src/ASF/common/services/ioport/xmega/../ioport.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/ASF/common/services/delay/delay.h: + +../src/ASF/common/services/delay/xmega/cycle_counter.h: + +../src/config/conf_st7565r.h: + +../src/ASF/common/services/spi/usart_spi.h: + +../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h: + +../src/ASF/xmega/drivers/usart/usart.h: + +../src/ASF/xmega/drivers/pmic/pmic.h: + +../src/config/conf_usart_spi.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_menu.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_menu.d new file mode 100644 index 00000000..1cf9de41 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_menu.d @@ -0,0 +1,189 @@ +src/ASF/common/services/gfx_mono/gfx_mono_menu.d \ + src/ASF/common/services/gfx_mono/gfx_mono_menu.o: \ + ../src/ASF/common/services/gfx_mono/gfx_mono_menu.c \ + ../src/ASF/common/services/gfx_mono/sysfont.h \ + ../src/config/conf_sysfont.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/utils/progmem.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.h \ + ../src/ASF/common/components/display/st7565r/st7565r.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/boards/board.h \ + ../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport_compat.h \ + ../src/ASF/common/services/ioport/xmega/../ioport.h \ + ../src/ASF/xmega/utils/status_codes.h \ + ../src/ASF/common/services/delay/delay.h \ + ../src/ASF/common/services/delay/xmega/cycle_counter.h \ + ../src/config/conf_st7565r.h ../src/ASF/common/services/spi/usart_spi.h \ + ../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h \ + ../src/ASF/xmega/drivers/usart/usart.h \ + ../src/ASF/xmega/drivers/pmic/pmic.h ../src/config/conf_usart_spi.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_generic.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_text.h \ + ../src/config/conf_menu.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_menu.h + +../src/ASF/common/services/gfx_mono/sysfont.h: + +../src/config/conf_sysfont.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +../src/ASF/common/services/gfx_mono/gfx_mono.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/utils/progmem.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.h: + +../src/ASF/common/components/display/st7565r/st7565r.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport_compat.h: + +../src/ASF/common/services/ioport/xmega/../ioport.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/ASF/common/services/delay/delay.h: + +../src/ASF/common/services/delay/xmega/cycle_counter.h: + +../src/config/conf_st7565r.h: + +../src/ASF/common/services/spi/usart_spi.h: + +../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h: + +../src/ASF/xmega/drivers/usart/usart.h: + +../src/ASF/xmega/drivers/pmic/pmic.h: + +../src/config/conf_usart_spi.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_generic.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_text.h: + +../src/config/conf_menu.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_menu.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_spinctrl.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_spinctrl.d new file mode 100644 index 00000000..bb841d0e --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_spinctrl.d @@ -0,0 +1,195 @@ +src/ASF/common/services/gfx_mono/gfx_mono_spinctrl.d \ + src/ASF/common/services/gfx_mono/gfx_mono_spinctrl.o: \ + ../src/ASF/common/services/gfx_mono/gfx_mono_spinctrl.c \ + ../src/ASF/common/services/gfx_mono/sysfont.h \ + ../src/config/conf_sysfont.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/utils/progmem.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.h \ + ../src/ASF/common/components/display/st7565r/st7565r.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/boards/board.h \ + ../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport_compat.h \ + ../src/ASF/common/services/ioport/xmega/../ioport.h \ + ../src/ASF/xmega/utils/status_codes.h \ + ../src/ASF/common/services/delay/delay.h \ + ../src/ASF/common/services/delay/xmega/cycle_counter.h \ + ../src/config/conf_st7565r.h ../src/ASF/common/services/spi/usart_spi.h \ + ../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h \ + ../src/ASF/xmega/drivers/usart/usart.h \ + ../src/ASF/xmega/drivers/pmic/pmic.h ../src/config/conf_usart_spi.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_generic.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_text.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_spinctrl.h \ + ../src/config/conf_spinctrl.h + +../src/ASF/common/services/gfx_mono/sysfont.h: + +../src/config/conf_sysfont.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +../src/ASF/common/services/gfx_mono/gfx_mono.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/utils/progmem.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.h: + +../src/ASF/common/components/display/st7565r/st7565r.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport_compat.h: + +../src/ASF/common/services/ioport/xmega/../ioport.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/ASF/common/services/delay/delay.h: + +../src/ASF/common/services/delay/xmega/cycle_counter.h: + +../src/config/conf_st7565r.h: + +../src/ASF/common/services/spi/usart_spi.h: + +../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h: + +../src/ASF/xmega/drivers/usart/usart.h: + +../src/ASF/xmega/drivers/pmic/pmic.h: + +../src/config/conf_usart_spi.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_generic.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_text.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_spinctrl.h: + +../src/config/conf_spinctrl.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_text.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_text.d new file mode 100644 index 00000000..19766e9a --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/gfx_mono_text.d @@ -0,0 +1,179 @@ +src/ASF/common/services/gfx_mono/gfx_mono_text.d \ + src/ASF/common/services/gfx_mono/gfx_mono_text.o: \ + ../src/ASF/common/services/gfx_mono/gfx_mono_text.c \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\assert.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.h \ + ../src/ASF/common/components/display/st7565r/st7565r.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/boards/board.h \ + ../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport_compat.h \ + ../src/ASF/common/services/ioport/xmega/../ioport.h \ + ../src/ASF/xmega/utils/status_codes.h \ + ../src/ASF/common/services/delay/delay.h \ + ../src/ASF/common/services/delay/xmega/cycle_counter.h \ + ../src/config/conf_st7565r.h ../src/ASF/common/services/spi/usart_spi.h \ + ../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h \ + ../src/ASF/xmega/drivers/usart/usart.h \ + ../src/ASF/xmega/drivers/pmic/pmic.h ../src/config/conf_usart_spi.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_generic.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_text.h + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\assert.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +../src/ASF/common/services/gfx_mono/gfx_mono.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.h: + +../src/ASF/common/components/display/st7565r/st7565r.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport_compat.h: + +../src/ASF/common/services/ioport/xmega/../ioport.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/ASF/common/services/delay/delay.h: + +../src/ASF/common/services/delay/xmega/cycle_counter.h: + +../src/config/conf_st7565r.h: + +../src/ASF/common/services/spi/usart_spi.h: + +../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h: + +../src/ASF/xmega/drivers/usart/usart.h: + +../src/ASF/xmega/drivers/pmic/pmic.h: + +../src/config/conf_usart_spi.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_generic.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_text.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/sysfont.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/sysfont.d new file mode 100644 index 00000000..98d3eff6 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/gfx_mono/sysfont.d @@ -0,0 +1,186 @@ +src/ASF/common/services/gfx_mono/sysfont.d \ + src/ASF/common/services/gfx_mono/sysfont.o: \ + ../src/ASF/common/services/gfx_mono/sysfont.c \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\assert.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/config/conf_sysfont.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/utils/progmem.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.h \ + ../src/ASF/common/components/display/st7565r/st7565r.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/boards/board.h \ + ../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport_compat.h \ + ../src/ASF/common/services/ioport/xmega/../ioport.h \ + ../src/ASF/xmega/utils/status_codes.h \ + ../src/ASF/common/services/delay/delay.h \ + ../src/ASF/common/services/delay/xmega/cycle_counter.h \ + ../src/config/conf_st7565r.h ../src/ASF/common/services/spi/usart_spi.h \ + ../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h \ + ../src/ASF/xmega/drivers/usart/usart.h \ + ../src/ASF/xmega/drivers/pmic/pmic.h ../src/config/conf_usart_spi.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_generic.h \ + ../src/ASF/common/services/gfx_mono/sysfont.h \ + ../src/ASF/common/services/gfx_mono/gfx_mono_text.h + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\assert.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/config/conf_sysfont.h: + +../src/ASF/common/services/gfx_mono/gfx_mono.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/utils/progmem.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.h: + +../src/ASF/common/components/display/st7565r/st7565r.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport_compat.h: + +../src/ASF/common/services/ioport/xmega/../ioport.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/ASF/common/services/delay/delay.h: + +../src/ASF/common/services/delay/xmega/cycle_counter.h: + +../src/config/conf_st7565r.h: + +../src/ASF/common/services/spi/usart_spi.h: + +../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h: + +../src/ASF/xmega/drivers/usart/usart.h: + +../src/ASF/xmega/drivers/pmic/pmic.h: + +../src/config/conf_usart_spi.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_generic.h: + +../src/ASF/common/services/gfx_mono/sysfont.h: + +../src/ASF/common/services/gfx_mono/gfx_mono_text.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/ioport/xmega/ioport_compat.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/ioport/xmega/ioport_compat.d new file mode 100644 index 00000000..1e965942 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/ioport/xmega/ioport_compat.d @@ -0,0 +1,98 @@ +src/ASF/common/services/ioport/xmega/ioport_compat.d \ + src/ASF/common/services/ioport/xmega/ioport_compat.o: \ + ../src/ASF/common/services/ioport/xmega/ioport_compat.c \ + ../src/ASF/common/services/ioport/xmega/ioport_compat.h \ + ../src/ASF/common/services/ioport/xmega/../ioport.h \ + ../src/ASF/common/utils/parts.h ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/common/services/ioport/xmega/../xmega/ioport.h + +../src/ASF/common/services/ioport/xmega/ioport_compat.h: + +../src/ASF/common/services/ioport/xmega/../ioport.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/common/services/ioport/xmega/../xmega/ioport.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/ioport/xmega/ioport_compat.o b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/ioport/xmega/ioport_compat.o new file mode 100644 index 00000000..43e17fa8 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/ioport/xmega/ioport_compat.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/sleepmgr/xmega/sleepmgr.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/sleepmgr/xmega/sleepmgr.d new file mode 100644 index 00000000..b57fa33b --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/sleepmgr/xmega/sleepmgr.d @@ -0,0 +1,104 @@ +src/ASF/common/services/sleepmgr/xmega/sleepmgr.d \ + src/ASF/common/services/sleepmgr/xmega/sleepmgr.o: \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.c \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/sleepmgr/xmega/sleepmgr.o b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/sleepmgr/xmega/sleepmgr.o new file mode 100644 index 00000000..319182cf Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/sleepmgr/xmega/sleepmgr.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/spi/xmega_spi/spi_master.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/spi/xmega_spi/spi_master.d new file mode 100644 index 00000000..4bfc2ab4 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/spi/xmega_spi/spi_master.d @@ -0,0 +1,142 @@ +src/ASF/common/services/spi/xmega_spi/spi_master.d \ + src/ASF/common/services/spi/xmega_spi/spi_master.o: \ + ../src/ASF/common/services/spi/xmega_spi/spi_master.c \ + ../src/ASF/common/services/spi/xmega_spi/spi_master.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/utils/status_codes.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport_compat.h \ + ../src/ASF/common/services/ioport/xmega/../ioport.h \ + ../src/ASF/xmega/drivers/spi/spi.h ../src/config/conf_spi_master.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/boards/board.h \ + ../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h + +../src/ASF/common/services/spi/xmega_spi/spi_master.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport_compat.h: + +../src/ASF/common/services/ioport/xmega/../ioport.h: + +../src/ASF/xmega/drivers/spi/spi.h: + +../src/config/conf_spi_master.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/spi/xmega_usart_spi/usart_spi.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/spi/xmega_usart_spi/usart_spi.d new file mode 100644 index 00000000..d9f6c9a5 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/spi/xmega_usart_spi/usart_spi.d @@ -0,0 +1,145 @@ +src/ASF/common/services/spi/xmega_usart_spi/usart_spi.d \ + src/ASF/common/services/spi/xmega_usart_spi/usart_spi.o: \ + ../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.c \ + ../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/utils/status_codes.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport_compat.h \ + ../src/ASF/common/services/ioport/xmega/../ioport.h \ + ../src/ASF/xmega/drivers/usart/usart.h \ + ../src/ASF/xmega/drivers/pmic/pmic.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/config/conf_usart_spi.h ../src/ASF/common/services/clock/sysclk.h \ + ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/boards/board.h \ + ../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h + +../src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport_compat.h: + +../src/ASF/common/services/ioport/xmega/../ioport.h: + +../src/ASF/xmega/drivers/usart/usart.h: + +../src/ASF/xmega/drivers/pmic/pmic.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/config/conf_usart_spi.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.d new file mode 100644 index 00000000..c9897ad0 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.d @@ -0,0 +1,204 @@ +src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.d \ + src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o: \ + ../src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.c \ + ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o new file mode 100644 index 00000000..4a1003a3 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/udi_vendor.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/udi_vendor.d new file mode 100644 index 00000000..4f8552c4 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/udi_vendor.d @@ -0,0 +1,135 @@ +src/ASF/common/services/usb/class/vendor/device/udi_vendor.d \ + src/ASF/common/services/usb/class/vendor/device/udi_vendor.o: \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.c \ + ../src/config/conf_usb.h ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udc.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\string.h + +../src/config/conf_usb.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/ASF/common/services/usb/udc/udd.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\string.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/udi_vendor.o b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/udi_vendor.o new file mode 100644 index 00000000..77704980 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/udi_vendor.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.d new file mode 100644 index 00000000..70b9a853 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.d @@ -0,0 +1,126 @@ +src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.d \ + src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o: \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.c \ + ../src/config/conf_usb.h ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h + +../src/config/conf_usb.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o new file mode 100644 index 00000000..a02fcc90 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/udc/udc.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/udc/udc.d new file mode 100644 index 00000000..43b66ba8 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/udc/udc.d @@ -0,0 +1,222 @@ +src/ASF/common/services/usb/udc/udc.d \ + src/ASF/common/services/usb/udc/udc.o: \ + ../src/ASF/common/services/usb/udc/udc.c ../src/config/conf_usb.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/globals.h \ + ../src/tiny_dma.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h \ + ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h ../src/globals.h ../src/tiny_adc.h + +../src/config/conf_usb.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/globals.h: + +../src/tiny_dma.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h: + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/globals.h: + +../src/tiny_adc.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/udc/udc.o b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/udc/udc.o new file mode 100644 index 00000000..6363c226 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/ASF/common/services/usb/udc/udc.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/boards/xmega_a3bu_xplained/init.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/boards/xmega_a3bu_xplained/init.d new file mode 100644 index 00000000..f257f042 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/boards/xmega_a3bu_xplained/init.d @@ -0,0 +1,110 @@ +src/ASF/xmega/boards/xmega_a3bu_xplained/init.d \ + src/ASF/xmega/boards/xmega_a3bu_xplained/init.o: \ + ../src/ASF/xmega/boards/xmega_a3bu_xplained/init.c \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport_compat.h \ + ../src/ASF/common/services/ioport/xmega/../ioport.h + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport_compat.h: + +../src/ASF/common/services/ioport/xmega/../ioport.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/cpu/ccp.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/cpu/ccp.d new file mode 100644 index 00000000..dd28a749 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/cpu/ccp.d @@ -0,0 +1,34 @@ +src/ASF/xmega/drivers/cpu/ccp.d src/ASF/xmega/drivers/cpu/ccp.o: \ + ../src/ASF/xmega/drivers/cpu/ccp.s ../src/ASF/xmega/utils/assembler.h \ + ../src/ASF/xmega/utils/assembler/gas.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h + +../src/ASF/xmega/utils/assembler.h: + +../src/ASF/xmega/utils/assembler/gas.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/cpu/ccp.o b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/cpu/ccp.o new file mode 100644 index 00000000..65a80455 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/cpu/ccp.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/nvm/nvm.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/nvm/nvm.d new file mode 100644 index 00000000..a3266c33 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/nvm/nvm.d @@ -0,0 +1,96 @@ +src/ASF/xmega/drivers/nvm/nvm.d src/ASF/xmega/drivers/nvm/nvm.o: \ + ../src/ASF/xmega/drivers/nvm/nvm.c ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h ../src/ASF/xmega/drivers/nvm/nvm.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\string.h + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\string.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/nvm/nvm.o b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/nvm/nvm.o new file mode 100644 index 00000000..6dc2facb Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/nvm/nvm.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/nvm/nvm_asm.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/nvm/nvm_asm.d new file mode 100644 index 00000000..5ccf6387 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/nvm/nvm_asm.d @@ -0,0 +1,35 @@ +src/ASF/xmega/drivers/nvm/nvm_asm.d src/ASF/xmega/drivers/nvm/nvm_asm.o: \ + ../src/ASF/xmega/drivers/nvm/nvm_asm.s \ + ../src/ASF/xmega/utils/assembler.h \ + ../src/ASF/xmega/utils/assembler/gas.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h + +../src/ASF/xmega/utils/assembler.h: + +../src/ASF/xmega/utils/assembler/gas.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/nvm/nvm_asm.o b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/nvm/nvm_asm.o new file mode 100644 index 00000000..5e75db38 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/nvm/nvm_asm.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/spi/spi.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/spi/spi.d new file mode 100644 index 00000000..23888189 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/spi/spi.d @@ -0,0 +1,106 @@ +src/ASF/xmega/drivers/spi/spi.d src/ASF/xmega/drivers/spi/spi.o: \ + ../src/ASF/xmega/drivers/spi/spi.c ../src/ASF/xmega/drivers/spi/spi.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/utils/status_codes.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport_compat.h \ + ../src/ASF/common/services/ioport/xmega/../ioport.h + +../src/ASF/xmega/drivers/spi/spi.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport_compat.h: + +../src/ASF/common/services/ioport/xmega/../ioport.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/usart/usart.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/usart/usart.d new file mode 100644 index 00000000..1cad2cab --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/usart/usart.d @@ -0,0 +1,138 @@ +src/ASF/xmega/drivers/usart/usart.d src/ASF/xmega/drivers/usart/usart.o: \ + ../src/ASF/xmega/drivers/usart/usart.c \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/usart/usart.h \ + ../src/ASF/xmega/drivers/pmic/pmic.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/boards/board.h \ + ../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport_compat.h \ + ../src/ASF/common/services/ioport/xmega/../ioport.h \ + ../src/ASF/xmega/utils/status_codes.h + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox256a3bu.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/usart/usart.h: + +../src/ASF/xmega/drivers/pmic/pmic.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport_compat.h: + +../src/ASF/common/services/ioport/xmega/../ioport.h: + +../src/ASF/xmega/utils/status_codes.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/usb/usb_device.d b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/usb/usb_device.d new file mode 100644 index 00000000..d57ee774 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/usb/usb_device.d @@ -0,0 +1,180 @@ +src/ASF/xmega/drivers/usb/usb_device.d \ + src/ASF/xmega/drivers/usb/usb_device.o: \ + ../src/ASF/xmega/drivers/usb/usb_device.c ../src/config/conf_usb.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/boards/board.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/xmega/drivers/usb/usb_device.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\string.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h + +../src/config/conf_usb.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/xmega/drivers/usb/usb_device.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\string.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/usb/usb_device.o b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/usb/usb_device.o new file mode 100644 index 00000000..1c3584d0 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/ASF/xmega/drivers/usb/usb_device.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/main.d b/AVR Code/USB_BULK_TEST/Debug/src/main.d new file mode 100644 index 00000000..206791d6 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/main.d @@ -0,0 +1,226 @@ +src/main.d src/main.o: ../src/main.c \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h ../src/ui.h ../src/globals.h \ + ../src/tiny_adc.h ../src/tiny_dma.h ../src/tiny_timer.h \ + ../src/tiny_dac.h ../src/tiny_uart.h ../src/tiny_dig.h + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/ui.h: + +../src/globals.h: + +../src/tiny_adc.h: + +../src/tiny_dma.h: + +../src/tiny_timer.h: + +../src/tiny_dac.h: + +../src/tiny_uart.h: + +../src/tiny_dig.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/main.o b/AVR Code/USB_BULK_TEST/Debug/src/main.o new file mode 100644 index 00000000..81f3fe57 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/main.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/tiny_adc.d b/AVR Code/USB_BULK_TEST/Debug/src/tiny_adc.d new file mode 100644 index 00000000..16dc2e58 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/tiny_adc.d @@ -0,0 +1,215 @@ +src/tiny_adc.d src/tiny_adc.o: ../src/tiny_adc.c ../src/tiny_adc.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h ../src/globals.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\string.h + +../src/tiny_adc.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/globals.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\string.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/tiny_adc.o b/AVR Code/USB_BULK_TEST/Debug/src/tiny_adc.o new file mode 100644 index 00000000..c994b4d3 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/tiny_adc.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/tiny_dac.d b/AVR Code/USB_BULK_TEST/Debug/src/tiny_dac.d new file mode 100644 index 00000000..6b58ae02 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/tiny_dac.d @@ -0,0 +1,213 @@ +src/tiny_dac.d src/tiny_dac.o: ../src/tiny_dac.c ../src/tiny_dac.h \ + ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h \ + ../src/tiny_adc.h + +../src/tiny_dac.h: + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h: + +../src/tiny_adc.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/tiny_dac.o b/AVR Code/USB_BULK_TEST/Debug/src/tiny_dac.o new file mode 100644 index 00000000..50f57ee4 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/tiny_dac.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/tiny_dig.d b/AVR Code/USB_BULK_TEST/Debug/src/tiny_dig.d new file mode 100644 index 00000000..07144266 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/tiny_dig.d @@ -0,0 +1,206 @@ +src/tiny_dig.d src/tiny_dig.o: ../src/tiny_dig.c ../src/tiny_dig.h \ + ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h ../src/globals.h + +../src/tiny_dig.h: + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/globals.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/tiny_dig.o b/AVR Code/USB_BULK_TEST/Debug/src/tiny_dig.o new file mode 100644 index 00000000..36009b40 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/tiny_dig.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/tiny_dma.d b/AVR Code/USB_BULK_TEST/Debug/src/tiny_dma.d new file mode 100644 index 00000000..da0ed9e3 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/tiny_dma.d @@ -0,0 +1,217 @@ +src/tiny_dma.d src/tiny_dma.o: ../src/tiny_dma.c ../src/tiny_dma.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h ../src/globals.h ../src/tiny_adc.h \ + ../src/tiny_uart.h + +../src/tiny_dma.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/globals.h: + +../src/tiny_adc.h: + +../src/tiny_uart.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/tiny_dma.o b/AVR Code/USB_BULK_TEST/Debug/src/tiny_dma.o new file mode 100644 index 00000000..e572eb4e Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/tiny_dma.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/tiny_timer.d b/AVR Code/USB_BULK_TEST/Debug/src/tiny_timer.d new file mode 100644 index 00000000..ddd9d913 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/tiny_timer.d @@ -0,0 +1,213 @@ +src/tiny_timer.d src/tiny_timer.o: ../src/tiny_timer.c \ + ../src/tiny_timer.h ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h \ + ../src/globals.h + +../src/tiny_timer.h: + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h: + +../src/globals.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/tiny_timer.o b/AVR Code/USB_BULK_TEST/Debug/src/tiny_timer.o new file mode 100644 index 00000000..62571d36 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/tiny_timer.o differ diff --git a/AVR Code/USB_BULK_TEST/Debug/src/tiny_timercounter.d b/AVR Code/USB_BULK_TEST/Debug/src/tiny_timercounter.d new file mode 100644 index 00000000..a91e5c93 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/tiny_timercounter.d @@ -0,0 +1,2 @@ +src/tiny_timercounter.d src/tiny_timercounter.o: \ + ../src/tiny_timercounter.c diff --git a/AVR Code/USB_BULK_TEST/Debug/src/tiny_uart.d b/AVR Code/USB_BULK_TEST/Debug/src/tiny_uart.d new file mode 100644 index 00000000..b4c4f273 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Debug/src/tiny_uart.d @@ -0,0 +1,213 @@ +src/tiny_uart.d src/tiny_uart.o: ../src/tiny_uart.c ../src/tiny_uart.h \ + ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h \ + ../src/globals.h + +../src/tiny_uart.h: + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h: + +../src/globals.h: diff --git a/AVR Code/USB_BULK_TEST/Debug/src/tiny_uart.o b/AVR Code/USB_BULK_TEST/Debug/src/tiny_uart.o new file mode 100644 index 00000000..ff188672 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Debug/src/tiny_uart.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/Makefile b/AVR Code/USB_BULK_TEST/Release/Makefile new file mode 100644 index 00000000..fc53567b --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/Makefile @@ -0,0 +1,375 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +SHELL := cmd.exe +RM := rm -rf + +USER_OBJS := + +LIBS := +PROJ := + +O_SRCS := +C_SRCS := +S_SRCS := +S_UPPER_SRCS := +OBJ_SRCS := +ASM_SRCS := +PREPROCESSING_SRCS := +OBJS := +OBJS_AS_ARGS := +C_DEPS := +C_DEPS_AS_ARGS := +EXECUTABLES := +OUTPUT_FILE_PATH := +OUTPUT_FILE_PATH_AS_ARGS := +AVR_APP_PATH :=$$$AVR_APP_PATH$$$ +QUOTE := " +ADDITIONAL_DEPENDENCIES:= +OUTPUT_FILE_DEP:= +LIB_DEP:= +LINKER_SCRIPT_DEP:= + +# Every subdirectory with source files must be described here +SUBDIRS := \ +../src/ \ +../src/ASF/ \ +../src/ASF/common/ \ +../src/ASF/common/boards/ \ +../src/ASF/common/boards/user_board/ \ +../src/ASF/common/services/ \ +../src/ASF/common/services/clock/ \ +../src/ASF/common/services/clock/xmega/ \ +../src/ASF/common/services/ioport/ \ +../src/ASF/common/services/ioport/xmega/ \ +../src/ASF/common/services/sleepmgr/ \ +../src/ASF/common/services/sleepmgr/xmega/ \ +../src/ASF/common/services/usb/ \ +../src/ASF/common/services/usb/class/ \ +../src/ASF/common/services/usb/class/vendor/ \ +../src/ASF/common/services/usb/class/vendor/device/ \ +../src/ASF/common/services/usb/class/vendor/device/example/ \ +../src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ \ +../src/ASF/common/services/usb/udc/ \ +../src/ASF/common/utils/ \ +../src/ASF/common/utils/interrupt/ \ +../src/ASF/common/utils/make/ \ +../src/ASF/xmega/ \ +../src/ASF/xmega/drivers/ \ +../src/ASF/xmega/drivers/cpu/ \ +../src/ASF/xmega/drivers/nvm/ \ +../src/ASF/xmega/drivers/sleep/ \ +../src/ASF/xmega/drivers/usb/ \ +../src/ASF/xmega/utils/ \ +../src/ASF/xmega/utils/assembler/ \ +../src/ASF/xmega/utils/bit_handling/ \ +../src/ASF/xmega/utils/preprocessor/ \ +../src/config/ + + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +../src/tiny_dig.c \ +../src/ASF/common/boards/user_board/init.c \ +../src/ASF/common/services/ioport/xmega/ioport_compat.c \ +../src/main.c \ +../src/tiny_adc.c \ +../src/tiny_dac.c \ +../src/tiny_dma.c \ +../src/tiny_timer.c \ +../src/tiny_uart.c \ +../src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.c \ +../src/ASF/common/services/clock/xmega/sysclk.c \ +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.c \ +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.c \ +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.c \ +../src/ASF/common/services/usb/udc/udc.c \ +../src/ASF/xmega/drivers/nvm/nvm.c \ +../src/ASF/xmega/drivers/usb/usb_device.c + + +PREPROCESSING_SRCS += \ +../src/ASF/xmega/drivers/cpu/ccp.s \ +../src/ASF/xmega/drivers/nvm/nvm_asm.s + + +ASM_SRCS += + + +OBJS += \ +src/tiny_dig.o \ +src/ASF/common/boards/user_board/init.o \ +src/ASF/common/services/ioport/xmega/ioport_compat.o \ +src/main.o \ +src/tiny_adc.o \ +src/tiny_dac.o \ +src/tiny_dma.o \ +src/tiny_timer.o \ +src/tiny_uart.o \ +src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o \ +src/ASF/common/services/clock/xmega/sysclk.o \ +src/ASF/common/services/sleepmgr/xmega/sleepmgr.o \ +src/ASF/common/services/usb/class/vendor/device/udi_vendor.o \ +src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o \ +src/ASF/common/services/usb/udc/udc.o \ +src/ASF/xmega/drivers/cpu/ccp.o \ +src/ASF/xmega/drivers/nvm/nvm.o \ +src/ASF/xmega/drivers/nvm/nvm_asm.o \ +src/ASF/xmega/drivers/usb/usb_device.o + +OBJS_AS_ARGS += \ +src/tiny_dig.o \ +src/ASF/common/boards/user_board/init.o \ +src/ASF/common/services/ioport/xmega/ioport_compat.o \ +src/main.o \ +src/tiny_adc.o \ +src/tiny_dac.o \ +src/tiny_dma.o \ +src/tiny_timer.o \ +src/tiny_uart.o \ +src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o \ +src/ASF/common/services/clock/xmega/sysclk.o \ +src/ASF/common/services/sleepmgr/xmega/sleepmgr.o \ +src/ASF/common/services/usb/class/vendor/device/udi_vendor.o \ +src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o \ +src/ASF/common/services/usb/udc/udc.o \ +src/ASF/xmega/drivers/cpu/ccp.o \ +src/ASF/xmega/drivers/nvm/nvm.o \ +src/ASF/xmega/drivers/nvm/nvm_asm.o \ +src/ASF/xmega/drivers/usb/usb_device.o + +C_DEPS += \ +src/tiny_dig.d \ +src/ASF/common/boards/user_board/init.d \ +src/ASF/common/services/ioport/xmega/ioport_compat.d \ +src/main.d \ +src/tiny_adc.d \ +src/tiny_dac.d \ +src/tiny_dma.d \ +src/tiny_timer.d \ +src/tiny_uart.d \ +src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.d \ +src/ASF/common/services/clock/xmega/sysclk.d \ +src/ASF/common/services/sleepmgr/xmega/sleepmgr.d \ +src/ASF/common/services/usb/class/vendor/device/udi_vendor.d \ +src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.d \ +src/ASF/common/services/usb/udc/udc.d \ +src/ASF/xmega/drivers/cpu/ccp.d \ +src/ASF/xmega/drivers/nvm/nvm.d \ +src/ASF/xmega/drivers/nvm/nvm_asm.d \ +src/ASF/xmega/drivers/usb/usb_device.d + +C_DEPS_AS_ARGS += \ +src/tiny_dig.d \ +src/ASF/common/boards/user_board/init.d \ +src/ASF/common/services/ioport/xmega/ioport_compat.d \ +src/main.d \ +src/tiny_adc.d \ +src/tiny_dac.d \ +src/tiny_dma.d \ +src/tiny_timer.d \ +src/tiny_uart.d \ +src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.d \ +src/ASF/common/services/clock/xmega/sysclk.d \ +src/ASF/common/services/sleepmgr/xmega/sleepmgr.d \ +src/ASF/common/services/usb/class/vendor/device/udi_vendor.d \ +src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.d \ +src/ASF/common/services/usb/udc/udc.d \ +src/ASF/xmega/drivers/cpu/ccp.d \ +src/ASF/xmega/drivers/nvm/nvm.d \ +src/ASF/xmega/drivers/nvm/nvm_asm.d \ +src/ASF/xmega/drivers/usb/usb_device.d + +OUTPUT_FILE_PATH +=USB_BULK_TEST.elf + +OUTPUT_FILE_PATH_AS_ARGS +=USB_BULK_TEST.elf + +ADDITIONAL_DEPENDENCIES:= + +OUTPUT_FILE_DEP:= ./makedep.mk + +LIB_DEP+= + +LINKER_SCRIPT_DEP+= + + +# AVR32/GNU C Compiler + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +src/%.o: ../src/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DNDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -Os -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/common/boards/user_board/%.o: ../src/ASF/common/boards/user_board/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DNDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -Os -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/common/services/ioport/xmega/%.o: ../src/ASF/common/services/ioport/xmega/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DNDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -Os -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/%.o: ../src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DNDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -Os -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/common/services/clock/xmega/%.o: ../src/ASF/common/services/clock/xmega/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DNDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -Os -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/common/services/sleepmgr/xmega/%.o: ../src/ASF/common/services/sleepmgr/xmega/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DNDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -Os -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/common/services/usb/class/vendor/device/%.o: ../src/ASF/common/services/usb/class/vendor/device/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DNDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -Os -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/common/services/usb/udc/%.o: ../src/ASF/common/services/usb/udc/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DNDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -Os -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/xmega/drivers/nvm/%.o: ../src/ASF/xmega/drivers/nvm/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DNDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -Os -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/xmega/drivers/usb/%.o: ../src/ASF/xmega/drivers/usb/%.c + @echo Building file: $< + @echo Invoking: AVR/GNU C Compiler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -DNDEBUG -DBOARD=USER_BOARD -I"../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I"../common/services/usb/class/vendor/device/example" -I"../src/ASF/common/services/usb/udc" -I"../src/ASF/xmega/drivers/nvm" -I"../src/ASF/common/services/sleepmgr" -I"../src/ASF/common/services/clock" -I"../src/ASF/xmega/drivers/sleep" -I"../src/ASF/xmega/drivers/usb" -I"../src/ASF/xmega/drivers/cpu" -I"../src/ASF/common/services/usb/class/vendor" -I"../src/ASF/common/services/usb/class/vendor/device" -I"../src/ASF/common/services/usb" -I"../common/applications/user_application/user_board/config" -I"../src/ASF/xmega/utils" -I"../src/config" -I"../src/ASF/common/boards" -I"../src/ASF/xmega/utils/preprocessor" -I"../src/ASF/common/utils" -I"../src" -I"../src/ASF/common/boards/user_board" -I"../src/ASF/common/services/ioport" -Os -fdata-sections -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mrelax -Wall -mmcu=atxmega32a4u -c -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" + @echo Finished building: $< + + + + +# AVR32/GNU Preprocessing Assembler + + + +# AVR32/GNU Assembler +src/ASF/xmega/drivers/cpu/ccp.o: ../src/ASF/xmega/drivers/cpu/ccp.s + @echo Building file: $< + @echo Invoking: AVR32/GNU Assembler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -Wa,-gdwarf2 -x assembler-with-cpp -c -mmcu=atxmega32a4u -mrelax -DBOARD=USER_BOARD -I "../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I "../common/services/usb/class/vendor/device/example" -I "../src/ASF/common/services/usb/udc" -I "../src/ASF/xmega/drivers/nvm" -I "../src/ASF/common/services/sleepmgr" -I "../src/ASF/common/services/clock" -I "../src/ASF/xmega/drivers/sleep" -I "../src/ASF/xmega/drivers/usb" -I "../src/ASF/xmega/drivers/cpu" -I "../src/ASF/common/services/usb/class/vendor" -I "../src/ASF/common/services/usb/class/vendor/device" -I "../src/ASF/common/services/usb" -I "../common/applications/user_application/user_board/config" -I "../src/ASF/xmega/utils" -I "../src/config" -I "../src/ASF/common/boards" -I "../src/ASF/xmega/utils/preprocessor" -I "../src/ASF/common/utils" -I "../src" -I "../src/ASF/common/boards/user_board" -I "../src/ASF/common/services/ioport" -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -mrelax -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/xmega/drivers/nvm/nvm_asm.o: ../src/ASF/xmega/drivers/nvm/nvm_asm.s + @echo Building file: $< + @echo Invoking: AVR32/GNU Assembler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -Wa,-gdwarf2 -x assembler-with-cpp -c -mmcu=atxmega32a4u -mrelax -DBOARD=USER_BOARD -I "../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I "../common/services/usb/class/vendor/device/example" -I "../src/ASF/common/services/usb/udc" -I "../src/ASF/xmega/drivers/nvm" -I "../src/ASF/common/services/sleepmgr" -I "../src/ASF/common/services/clock" -I "../src/ASF/xmega/drivers/sleep" -I "../src/ASF/xmega/drivers/usb" -I "../src/ASF/xmega/drivers/cpu" -I "../src/ASF/common/services/usb/class/vendor" -I "../src/ASF/common/services/usb/class/vendor/device" -I "../src/ASF/common/services/usb" -I "../common/applications/user_application/user_board/config" -I "../src/ASF/xmega/utils" -I "../src/config" -I "../src/ASF/common/boards" -I "../src/ASF/xmega/utils/preprocessor" -I "../src/ASF/common/utils" -I "../src" -I "../src/ASF/common/boards/user_board" -I "../src/ASF/common/services/ioport" -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -mrelax -o "$@" "$<" + @echo Finished building: $< + + + +src/ASF/xmega/drivers/cpu/%.o: ../src/ASF/xmega/drivers/cpu/%.s + @echo Building file: $< + @echo Invoking: AVR32/GNU Assembler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -Wa,-gdwarf2 -x assembler-with-cpp -c -mmcu=atxmega32a4u -mrelax -DBOARD=USER_BOARD -I "../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I "../common/services/usb/class/vendor/device/example" -I "../src/ASF/common/services/usb/udc" -I "../src/ASF/xmega/drivers/nvm" -I "../src/ASF/common/services/sleepmgr" -I "../src/ASF/common/services/clock" -I "../src/ASF/xmega/drivers/sleep" -I "../src/ASF/xmega/drivers/usb" -I "../src/ASF/xmega/drivers/cpu" -I "../src/ASF/common/services/usb/class/vendor" -I "../src/ASF/common/services/usb/class/vendor/device" -I "../src/ASF/common/services/usb" -I "../common/applications/user_application/user_board/config" -I "../src/ASF/xmega/utils" -I "../src/config" -I "../src/ASF/common/boards" -I "../src/ASF/xmega/utils/preprocessor" -I "../src/ASF/common/utils" -I "../src" -I "../src/ASF/common/boards/user_board" -I "../src/ASF/common/services/ioport" -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -mrelax -o "$@" "$<" + @echo Finished building: $< + + +src/ASF/xmega/drivers/nvm/%.o: ../src/ASF/xmega/drivers/nvm/%.s + @echo Building file: $< + @echo Invoking: AVR32/GNU Assembler : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -Wa,-gdwarf2 -x assembler-with-cpp -c -mmcu=atxmega32a4u -mrelax -DBOARD=USER_BOARD -I "../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained" -I "../common/services/usb/class/vendor/device/example" -I "../src/ASF/common/services/usb/udc" -I "../src/ASF/xmega/drivers/nvm" -I "../src/ASF/common/services/sleepmgr" -I "../src/ASF/common/services/clock" -I "../src/ASF/xmega/drivers/sleep" -I "../src/ASF/xmega/drivers/usb" -I "../src/ASF/xmega/drivers/cpu" -I "../src/ASF/common/services/usb/class/vendor" -I "../src/ASF/common/services/usb/class/vendor/device" -I "../src/ASF/common/services/usb" -I "../common/applications/user_application/user_board/config" -I "../src/ASF/xmega/utils" -I "../src/config" -I "../src/ASF/common/boards" -I "../src/ASF/xmega/utils/preprocessor" -I "../src/ASF/common/utils" -I "../src" -I "../src/ASF/common/boards/user_board" -I "../src/ASF/common/services/ioport" -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -mrelax -o "$@" "$<" + @echo Finished building: $< + + + + + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(strip $(C_DEPS)),) +-include $(C_DEPS) +endif +endif + +# Add inputs and outputs from these tool invocations to the build variables + +# All Target +all: $(OUTPUT_FILE_PATH) $(ADDITIONAL_DEPENDENCIES) + +$(OUTPUT_FILE_PATH): $(OBJS) $(USER_OBJS) $(OUTPUT_FILE_DEP) $(LIB_DEP) $(LINKER_SCRIPT_DEP) + @echo Building target: $@ + @echo Invoking: AVR/GNU Linker : 4.8.1 + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -o$(OUTPUT_FILE_PATH_AS_ARGS) $(OBJS_AS_ARGS) $(USER_OBJS) $(LIBS) -Wl,-Map="USB_BULK_TEST.map" -Wl,--start-group -Wl,-lm -Wl,--end-group -Wl,--gc-sections -mrelax -mmcu=atxmega32a4u -Wl,--relax + @echo Finished building target: $@ + "C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "USB_BULK_TEST.elf" "USB_BULK_TEST.hex" + "C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-objcopy.exe" -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex "USB_BULK_TEST.elf" "USB_BULK_TEST.eep" || exit 0 + "C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-objdump.exe" -h -S "USB_BULK_TEST.elf" > "USB_BULK_TEST.lss" + "C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O srec -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "USB_BULK_TEST.elf" "USB_BULK_TEST.srec" + "C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-size.exe" "USB_BULK_TEST.elf" + + + + + + + +# Other Targets +clean: + -$(RM) $(OBJS_AS_ARGS) $(EXECUTABLES) + -$(RM) $(C_DEPS_AS_ARGS) + rm -rf "USB_BULK_TEST.elf" "USB_BULK_TEST.a" "USB_BULK_TEST.hex" "USB_BULK_TEST.lss" "USB_BULK_TEST.eep" "USB_BULK_TEST.map" "USB_BULK_TEST.srec" "USB_BULK_TEST.usersignatures" + \ No newline at end of file diff --git a/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.eep b/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.eep new file mode 100644 index 00000000..7c166a13 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.eep @@ -0,0 +1 @@ +:00000001FF diff --git a/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.elf b/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.elf new file mode 100644 index 00000000..651efbe0 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.elf differ diff --git a/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.hex b/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.hex new file mode 100644 index 00000000..ab9c40a3 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.hex @@ -0,0 +1,608 @@ +:100000001DC1000037C1000035C1000033C1000030 +:1000100031C100002FC100002DC100002BC1000024 +:1000200029C1000027C1000025C1000023C1000034 +:1000300021C100001FC100001DC100001BC1000044 +:1000400019C1000017C1000015C1000013C1000054 +:1000500011C100000FC100000DC100000BC1000064 +:1000600009C1000007C1000005C1000003C1000074 +:1000700001C10000FFC00000FDC00000FBC0000087 +:10008000F9C00000F7C00000F5C00000F3C0000098 +:10009000F1C00000EFC00000EDC00000EBC00000A8 +:1000A000E9C00000E7C00000E5C00000E3C00000B8 +:1000B000E1C00000DFC00000DDC00000DBC00000C8 +:1000C000D9C00000D7C00000D5C00000D3C00000D8 +:1000D000D1C00000CFC00000CDC00000CBC00000E8 +:1000E000C9C00000C7C00000C5C00000C3C00000F8 +:1000F000C1C00000BFC00000BDC00000BBC0000008 +:10010000B9C00000B7C00000B5C00000B3C0000017 +:10011000B1C00000AFC00000ADC00000ABC0000027 +:10012000A9C00000A7C00000A5C00000A3C0000037 +:10013000A1C000009FC000009DC000009BC0000047 +:1001400099C0000097C0000095C0000026C60000BE +:1001500091C000008FC000008DC000008BC0000067 +:1001600089C0000087C0000085C0000083C0000077 +:1001700081C000007FC000007DC000007BC0000087 +:1001800079C0000077C0000075C0000073C0000097 +:1001900071C000006FC000006DC000006BC00000A7 +:1001A00069C0000067C0000065C0000063C00000B7 +:1001B00061C000005FC000005DC000005BC00000C7 +:1001C00059C0000057C0000055C0000053C00000D7 +:1001D00051C000004FC000004DC000004BC00000E7 +:1001E00049C0000047C0000045C0000043C00000F7 +:1001F00041C000000C94EB100C94A011820184010A +:10020000860188018A018F018C018E0168096A09C3 +:100210008009B609BF09C409130A180AD709E009F9 +:10022000EE09F009F209FC09060A110AD009D909F8 +:10023000E209F009F209F409FE09080A11241FBEB7 +:10024000CFEFCDBFDFE2DEBF10E2A0E0B0E2EEE232 +:10025000F5E202C005900D92A03CB107D9F72CE25F +:10026000A0ECB0E201C01D92A835B207E1F71BD0A7 +:100270000C949512C5CEE0E8F6E08FE0808385E02F +:100280008483089508958091C220811103C08EEE69 +:1002900092E002C080E090E043E451E06EEE72E054 +:1002A0008A58994DC7C687E08093A200789420D6DB +:1002B000E9DF98D7B1D0D4D060E080E07ED06AD0BA +:1002C0008CE05ED02FD5C8D5E1D5D5DF0000000089 +:1002D000000000000000000000000000000000001E +:1002E0000000000000000000F1CF08950895809103 +:1002F000002090E08830910590F4FC01E250FF4F1F +:100300000C94861210D10BC08CD109C02AD207C020 +:10031000E5D205C079D303C060D401C0D5D4909193 +:10032000C22081E0911180E08093C220089581E095 +:100330008093C32043E451E06EEE72E086E796E2DC +:1003400079D681E008951092C320089581E0089540 +:1003500081E0089510922002982F9C7193689093E9 +:10036000200287FD03C090E080E002C090E182E0BF +:10037000892B809321021092220210922602089566 +:10038000E0E0F2E010AA836880AB80E181AB12AAC2 +:1003900016AA0895E0E0F2E010A683E880A78FE2B5 +:1003A00081A712A616A6089592E09093CA01E82F9D +:1003B000F0E084911092CA010895909171009D7FA0 +:1003C0009093710010920002623011F49EE101C01E +:1003D0009CE19093010290E490930202882311F033 +:1003E00080EC01C080E480930302613011F482E06C +:1003F00001C083E08093040280E2D6DF80930C0288 +:1004000081E2D2DF80930D0210921802109219023D +:1004100081E080930002BECFCF93DF93E0E7F0E06E +:1004200082818B7F8283C0E2D3E08DE0888380E489 +:10043000898389E08A8383E3B7DF888782E3B4DF37 +:10044000898787E3B1DF8A8786E3AEDF8B87E0E2C7 +:10045000F6E08081836080831482DF91CF910895DC +:10046000E0E7F0E080818E7F808380E88093000168 +:100470000895E0E0F1E0108A80E4808B10A280A370 +:1004800010AA80ABE0E4F1E0108280831092C220D9 +:100490001092C120089510920020EBDFE0E0F1E01F +:1004A00016AA44E240AB11AA39E532AB82E083AB35 +:1004B000809102209091032084AB95AB86E794E273 +:1004C00080AF91AF12AE8BE384AF23E020933D0168 +:1004D00010923E0180A9806880AB10924601E0E452 +:1004E000F1E0408310924101309342012093430197 +:1004F00080910420909105208093440190934501C0 +:1005000086E692E2809348019093490110924A0155 +:1005100089E380934C0120934D0110924E0180811C +:10052000806880830895E0E0F1E0108A80E4808BA9 +:1005300084E0808B118A81E9828B80E1838B87E75D +:1005400091E0848B958B84E2808F82E0818F128E84 +:100550004091C2202EEE32E0429FC001439F900D99 +:1005600011248A58994D848F4091C220429FC00126 +:10057000439F900D11248A58994D958F168E80892E +:100580008068808B089581E08093002072DFE0E036 +:10059000F1E010AA80E480AB84E080AB11AA12AA3B +:1005A0008BE483AB14AA15AA16AA81E090E280AF6F +:1005B00091AF12AE80EA84AF88E080933D01109243 +:1005C0003E0180A9806A80AB85E58093A0081092E7 +:1005D0004601E0E4F1E084E280831092410189E584 +:1005E0008093420182E080934301809102209091A8 +:1005F0000320809344019093450186E692E2809324 +:1006000048019093490110924A018BE380934C0179 +:1006100083E080934D0110924E0180818068808339 +:100620000895E0E0F1E0108AA0E4A08B74E0708B04 +:10063000118A61E9628B80E1838B47E751E0448B4B +:10064000558B84E2808F82E0818F128EB091C22020 +:100650008EEE92E0B89F9001B99F300D11242A5878 +:10066000394D248FB091C220B89F9001B99F300DB1 +:1006700011242A58394D358F168E20892068208BF9 +:1006800010A2A0A370A311A262A32BE423A344A3EE +:1006900055A320EA20A728E021A712A64091C22056 +:1006A000489F9001499F300D11242351384D24A7B4 +:1006B0004091C220489F9001499F300D1124235141 +:1006C000384D35A716A680A1806880A30895CF93E2 +:1006D000C2E0C0930020CDDEE0E0F1E016AA44E2E3 +:1006E00040AB11AA39E532AB23E023AB8091042063 +:1006F0009091052084AB95AB86E692E280AF91AFF6 +:1007000012AE89E384AF20933D0110923E0180A98F +:10071000806880AB10924601E0E4F1E040831092E3 +:10072000410130934201C093430180910220909196 +:100730000320809344019093450186E794E28093DF +:1007400048019093490110924A018BE380934C0138 +:1007500020934D0110924E01808180688083CF915B +:100760000895CF93E0E0F1E0108AB0E4B08BA4E00C +:10077000A08B118A71E9728B80E1838B47E751E08E +:10078000448B558B84E2808F62E0618F128EC09122 +:10079000C2208EEE92E0C89F9001C99F300D1124B7 +:1007A0002A58394D248FC091C220C89F9001C99FFB +:1007B000300D11242A58394D358F168E2089206826 +:1007C000208B10A2B0A3A0A311A272A322E123A3A5 +:1007D00044A355A324E320A761A712A64091C220F9 +:1007E000489F9001499F300D11242351384D24A773 +:1007F0004091C220489F9001499F300D1124235100 +:10080000384D35A716A680A1806880A3CF910895A2 +:10081000CF93C3E0C09300202CDEE0E0F1E010A213 +:1008200080E480A384E080A311A212A28BE483A3BE +:1008300014A215A216A281E090E280A791A712A6A9 +:1008400080EA84A788E085A716A680A1806A80A395 +:1008500085E58093A00816AA34E230AB11AA29E5F9 +:1008600022AB82E083AB809102209091032084AB85 +:1008700095AB86E794E280AF91AF12AE8BE384AF85 +:10088000C0933D0110923E0180A9806880AB109218 +:100890004601E0E4F1E030831092410120934201EF +:1008A000C0934301809104209091052080934401DE +:1008B0009093450186E692E2809348019093490126 +:1008C00010924A0189E380934C01C0934D0110922C +:1008D0004E01808180688083CF910895E0E0F1E04F +:1008E000108A80E4808B84E0808B118A81E9828B7E +:1008F0008BE4838B87E791E0848B958B80EA808FF4 +:1009000088E0818F128E4091C2202EEE32E0429F0D +:10091000C001439F900D11248A58994D848F4091B6 +:10092000C220429FC001439F900D11248A58994DC7 +:10093000958F168E80898068808B0895CF93C4E050 +:10094000C093002096DDE0E0F1E010A280E480A3F7 +:10095000C0A311A212A28BE483A314A215A216A213 +:1009600081E090E280A791A712A680EA84A788E0A0 +:1009700085A716A680A1806A80A385E58093A0083C +:1009800016AA44E240AB11AA39E532AB23E023AB0F +:10099000809104209091052084AB95AB86E692E28D +:1009A00080AF91AF12AE89E384AF20933D011092E6 +:1009B0003E0180A9806880AB10924601E0E4F1E03E +:1009C0004083109241013093420182E080934301C1 +:1009D00080910220909103208093440190934501DF +:1009E00086E794E2809348019093490110924A016E +:1009F0008BE380934C0120934D0110924E01808136 +:100A000080688083CF910895CF93E0E0F1E0108A71 +:100A1000B0E4B08BA4E0A08B118A71E9728B8BE4F7 +:100A2000838B47E751E0448B558B80EA808F68E0E9 +:100A3000618F128EC091C2208EEE92E0C89F90010D +:100A4000C99F300D11242A58394D248FC091C220DE +:100A5000C89F9001C99F300D11242A58394D358FF8 +:100A6000168E20892068208B10AAB0ABA0AB11AAEB +:100A700072AB2AE423AB44AB55AB23EC20AF61AFA0 +:100A800012AE4091C220489F9001499F300D112421 +:100A90002351384D24AF4091C220489F9001499F77 +:100AA000300D11242351384D30933D0110923E01F9 +:100AB00080A9806880ABCF91089585E08093002065 +:100AC000D8DCE0E0F1E016AA54E250AB11AA49E507 +:100AD00042AB23E023AB809104209091052084ABAE +:100AE00095AB86E692E280AF91AF12AE39E334AFB8 +:100AF00020933D0110923E0180A9806880AB109246 +:100B00004601E0E4F1E0508310924101409342013C +:100B1000209343018091042090910520809344010B +:100B20009093450186E796E28093480190934901AE +:100B300010924A0130934C0120934D0110924E01C6 +:100B4000808180688083089586E08093002091DC16 +:100B5000E0E0F1E016AA44E240AB11AA39E532AB7D +:100B600023E023AB809104209091052084AB95ABCA +:100B700086E692E280AF91AF12AE89E384AF209314 +:100B80003D0110923E0180A9806880AB1092460121 +:100B9000E0E4F1E04083109241013093420182E0B1 +:100BA000809343018091022090910320809344011F +:100BB0009093450186E794E2809348019093490120 +:100BC00010924A018BE380934C0120934D011092C7 +:100BD0004E018081806880830895E0E0F1E0108A12 +:100BE00080E4808B84E0808B118A81E9828B80E1B4 +:100BF000838B2EEE32E0248B358B84E2808F82E073 +:100C0000818F128E4091C220429FC001439F900D60 +:100C100011248A58994D848F4091C220429FC0016F +:100C2000439F900D11248A58994D958F168E808977 +:100C30008068808B089587E0809300201ADCE0E0D4 +:100C4000F1E016AA44E240AB11AA39E532AB23E049 +:100C500023AB809104209091052084AB95AB86E670 +:100C600092E280AF91AF12AE89E384AF20933D0151 +:100C700010923E0180A9806880AB10924601E0E4AA +:100C8000F1E04083109241013093420182E0809371 +:100C9000430180910220909103208093440190931E +:100CA000450186E794E280934801909349011092B0 +:100CB0004A018BE380934C0120934D0110924E0129 +:100CC0008081806880830895E0E0F1E0108A80E40C +:100CD000808B85E0808B118A81E9828B80E1838B18 +:100CE0002EEE32E0248B358B84E2808F82E0818F80 +:100CF000128E4091C220429FC001439F900D11244B +:100D00008A58994D848F4091C220429FC001439FD1 +:100D1000900D11248A58994D958F168E8089806880 +:100D2000808B0895E0E7F0E083818C7F838384816A +:100D30008C7F848380818D7F8083E0E8F1E080EC8C +:100D40008283128688EC81831186E0E0F8E024E05B +:100D5000208333E03183148285ED91E086A397A34D +:100D60001682E0E4F8E020833183148286A397A3FF +:100D70001682E0E6F6E0808180618083E0E4F9E0BD +:100D800083E18183148281E0868380E090E186A301 +:100D900097A310A611A6208308951F920F920FB655 +:100DA0000F9211242F933F934F935F938F939F93B1 +:100DB000CF93DF931F92CDB7DEB7809100208730AD +:100DC00031F480912C02898380912D0202C08091A0 +:100DD0002C024091C020481B8091680990916909BC +:100DE00042308CF0843F9F4070F42091680930912C +:100DF000690949301CF08CE090E002C081E090E08D +:100E0000820F931F17C080916809909169094F3F25 +:100E1000ACF40D9798F02091680930916909483F2A +:100E20001CF48CE090E002C081E090E0A901481B36 +:100E3000590BCA0180937809909379090F90DF913B +:100E4000CF919F918F915F914F913F912F910F90F3 +:100E50000FBE0F901F901895E0E7F0E083818F7E22 +:100E60008383E0E4F6E080818A6A80838FEF848365 +:100E700088E5828B80E28687E0EAF8E084EC85836F +:100E800083E08683178288E184830895E0E7F0E0B9 +:100E90008381877F838380E48093C00888E5E0E4D2 +:100EA000F6E0878B08959FB7F894E0E5F0E02081A5 +:100EB000822B80839FBF08959FB7F894A0E5B0E090 +:100EC00016968C911697897F16968C931697E0E666 +:100ED000F0E080E885838BEB868316968C911697DD +:100EE000846016968C938081816080839FBF089573 +:100EF000CF93DF9300D000D0CDB7DEB78FEF8093D4 +:100F000070008093710080937200809373008093CF +:100F10007400809375008093760064E081E490E033 +:100F2000D6D46CE170E082E0D8D48C836DE170E0BF +:100F300082E0D3D48B838B819C81019621F480E461 +:100F400093E28B839C838B819C8189839A8380939A +:100F500062008A818093630082E0A5DF8091510066 +:100F600081FFFCCFA9DF61E080E490E0B0D49FB7BF +:100F7000F894809150008E7F809350009FBF2496FC +:100F8000CDBFDEBFDF91CF9108959FB7F894E82FD2 +:100F9000F0E0E059FF4F60958081862380839FBFFA +:100FA0000895CF93863011F4C8E101C0C0E080916C +:100FB000510081FD07C082E076DF8091510081FF02 +:100FC000FCCF7ADF6C2F636084E490E080D460E42F +:100FD00080E0CF91DACF8091C42008958091C42021 +:100FE000813009F4B0C90895F8D0FC018381809361 +:100FF000C420811101C09BC981E0089590916624AD +:10100000892F807697FF07C0803491F48091672400 +:1010100081110EC09DC9803459F4809167248111DB +:1010200007C080916C2490916D24892B09F08EC9A2 +:1010300080E008950F931F939B018A01AC0160E04B +:1010400083E80E9425101F910F91089580916824D4 +:101050008F777AC79091CC20992361F1E091C920D4 +:10106000F091CA200190F081E02D9481891710F54C +:10107000E093C720F093C820228133812E0F3F1FB9 +:10108000E217F30798F49181943061F49281891307 +:1010900009C09381691306C0E093C720F093C8206C +:1010A00081E008959081E90FF11DEACFE093C72018 +:1010B000F093C82080E00895E091C920F091CA2003 +:1010C0000190F081E02D228133812E0F3F1FFC0122 +:1010D0004081E40FF11DE217F30748F48181843069 +:1010E00031F0853039F08081E80FF11DF4CF80E0D8 +:1010F00090E00895CF0108951F93CF93DF93182FA9 +:10110000A9DF882339F1C091C720D091C820CE0132 +:10111000D3DFEC01009741F04C815D816B818A81C6 +:1011200022D78111F4CF16C0E091C920F091CA20D6 +:1011300092818381E92FF82FE10FF11DE10FF11D5D +:101140000190F081E02D0190F081E02DDF91CF91B1 +:101150001F91099480E0DF91CF911F910895FF9234 +:101160000F931F93CF93DF93C82F60E073DFF82EA8 +:10117000882361F1E091C920F091CA209281838196 +:10118000E92FF82FEC0FF11DEC0FF11D00811181FB +:10119000D8011696ED91FC9117970995682F8C2F21 +:1011A00059DFF82E882391F0C091C720D091C82034 +:1011B000CE0182DFEC01009719F08A81F3D7F8CFD6 +:1011C000D8011296ED91FC91139709958F2DDF911F +:1011D000CF911F910F91FF9008958091C72090911A +:1011E000C820089539C6CF938091CC20811108C0C2 +:1011F0001092CC201092D0201092D120CF9108953F +:10120000C0E0E091C920F091CA200190F081E02D6A +:101210008481C81768F78C2FA2DFCF5FF2CFCF93FE +:101220008091CC208823F1F0C0E0E091C920F091BA +:10123000CA20A081B18114968C91C81798F492812C +:101240008381E92FF82FEC0FF11DEC0FF11D0190B8 +:10125000F081E02D0084F185E02D309709F00995AB +:10126000CF5FE3CFCF910895CF92DF92FF920F939C +:101270001F93CF93DF931F92CDB7DEB710927024E8 +:10128000109271241092722410927324109274247C +:10129000109275242091662427FF07C080916C244A +:1012A00090916D24892B09F408C3822F80768034B5 +:1012B00009F0C5C08091672490E0FC01E05AF10973 +:1012C000E830F10508F088C2EA5FFE4F0C94861200 +:1012D0000000F1C210920008809168249091692466 +:1012E000809336089093370880916A248F7080939A +:1012F000000860916C2470916D2486E692E219C01A +:101300001092400860916C2470916D2460930220CB +:1013100070930320809168249091692480937608CB +:101320009093770880916A248F708093400886E7B5 +:1013300094E210D6209104203091052080916C24F5 +:1013400090916D242817390709F4B5C280930420C1 +:10135000909305208091002090E08830910508F05E +:10136000AAC2FC01E25FFE4F0C948612109268093B +:1013700010926909809168248093C0209CC280915A +:1013800068248093240697C2E0916824F091692430 +:10139000E830F10508F020C2EA5EFE4F0C94861298 +:1013A00060E080E00AD880916A240E94AA0173D884 +:1013B00082C260E080E001D880916A240E94AA0184 +:1013C000E2D879C261E081E00E94DD0180916A2467 +:1013D0000E94AA0180916B240E94C00178D96BC23F +:1013E00017DA69C2ABDA67C260E080E00E94DD0113 +:1013F00080916A240E94AA0160DB5DC261E080E006 +:101400000E94DD0180916A240E94AA019DDB53C2E3 +:1014100062E080E00E94DD0180916A2480680E9481 +:10142000AA0109DC48C2809168248093840643C2E3 +:10143000E9E7F0E091E088EDF89484BF90838111B2 +:10144000CBC127FFFBC080916C2490916D24009745 +:1014500009F4C2C12F7109F09BC020916724263086 +:1014600069F0283009F48CC02111B6C1029709F047 +:10147000B3C162E070E080ED90E2DEC020916824AC +:1014800030916924832F99278230910591F05CF483 +:10149000019709F0A1C18091102090911120DC01E9 +:1014A0006C9170E05BC08330910581F10F9709F179 +:1014B00093C1E0911020F09111208189281708F044 +:1014C0008BC13327220F331F220F331FE0911220CD +:1014D000F0911320E20FF31F80819181FC01628162 +:1014E000738138D5E0916E24F0916F2482E081837E +:1014F00036C08091142090911520009709F46CC19A +:10150000DC0112966D917C91139728C0332721300E +:10151000310529F040F02230310551F05DC169E01C +:1015200083EA90E208C064E070E08EEA90E216C0C0 +:1015300068E18AE890E2282FAAE5B0E2FC018191F7 +:1015400090E08D939D938E2F821B8617C0F3660FBC +:101550006E5F6093582070E088E590E2FBD4809144 +:101560006C2490916D242091702430917124821705 +:10157000930708F0A0C180937024909371249BC1BD +:10158000019709F029C161E070E08CEC90E254C051 +:101590002130E1F5209167242A3009F01DC101971F +:1015A00009F01AC18091CC20882309F415C1C0909C +:1015B0006A24D0906B240091C9201091CA20D801D0 +:1015C000ED91FC918481C81608F006C160E08C2D75 +:1015D00041DDF82E882309F4FFC0DD24CC0CDD1C8E +:1015E000D8011296ED91FC911397EC0DFD1D019021 +:1015F000F081E02D0680F781E02D09958093CE20C3 +:1016000061E070E08EEC90E2A5D4E4C0223009F0F5 +:10161000E3C0209167242111DFC0029709F0DCC0EC +:1016200080916A24F2D490E08093C5209093C620E4 +:1016300062E070E085EC90E28DD43DC12F7109F03D +:101640007DC080916724833009F4C6C018F48130CE +:10165000A1F0C2C0853019F0893039F1BDC0809148 +:101660006C2490916D24892B09F0B6C086E298E035 +:1016700080937224909373241EC180916C24909166 +:101680006D24892B09F0A8C0809168249091692469 +:10169000019709F0A1C08091D0209091D1208D7F39 +:1016A0008093D0209093D12006C180916C2490919A +:1016B0006D24892B09F090C04AD4882309F48CC08A +:1016C00080916824909169249927E0911020F091ED +:1016D0001120218930E02817390708F47DC083DD07 +:1016E00020916824309169242093CC20222309F48E +:1016F000E2C033272150304C220F331F220F331FFB +:101700008091122090911320820F931F8093C92003 +:101710009093CA2010E0E091C920F091CA20019076 +:10172000F081E02D8481181708F0C5C060E0812F9A +:10173000E3DC882309F450C01F5FEDCF2130F1F4C2 +:10174000809167248B3009F047C080916C24909180 +:101750006D24892B09F040C08091CC20882309F4A6 +:101760003BC010916A2460916824812F6983F7DC63 +:101770006981882389F1812FBFDC2BC0223061F57C +:1017800080916724813019F0833089F025C08091E1 +:101790006C2490916D24892BF9F4809168249091A8 +:1017A0006924892BC9F480916A2436D412C08091AF +:1017B0006C2490916D24892B79F480916824909108 +:1017C0006924892B49F480916A24C1D480916A24C8 +:1017D000F2D4F82EF1106FC0809166248F718130A1 +:1017E000B9F58091CC20882399F1C0906A24D090DB +:1017F0006B240091C9201091CA20D801ED91FC9171 +:101800008481C81628F560E08C2D24DC882301F142 +:10181000C6019927880F991FD8011296ED91FC9166 +:101820001397E80FF91F00811181D8011696ED91E9 +:10183000FC9117970995682F8C2D0CDC882341F0BB +:10184000D8011496ED91FC9115970995811133C03B +:10185000809166248F71823081F58091CC2088231D +:1018600061F110E0E091C920F091CA20A081B1811E +:1018700014968C91181708F592818381E92FF82F1F +:10188000E10FF11DE10FF11DC080D180D601169648 +:10189000ED91FC9117970995682F812FDBDB882349 +:1018A00061F0D6011496ED91FC911597099581117F +:1018B00002C01F5FD7CF81E001C080E00F90DF91B1 +:1018C000CF911F910F91FF90DF90CF9008951BBE95 +:1018D000FC0128ED24BF608308954091CA01E62FE2 +:1018E000F72F8093CA0184914093CA010895E82F8D +:1018F000F0E0EE5AF34D80818F3F09F4FFCF9FB7A0 +:10190000F89480818F5F80839FBF0895E82FF0E077 +:10191000EE5AF34D8081811101C0FFCF9FB7F8943B +:101920008081815080839FBF0895CF93C82F80917D +:101930006422C11105C0882339F081E0E7DF04C0CB +:10194000811102C081E0D3DFC0936422CF9108955A +:10195000282F2F70992787FD90958827990F881F2A +:101960009927820F911D820F911D43E0880F991FC7 +:101970004A95E1F7805E9D4D08950F93E8ECF4E001 +:1019800080818F7D808380818F7D8083E8E2F2E299 +:1019900002E0059310922A2210922B2200E2069375 +:1019A00000E40693E0E2F2E200E2069300E406932C +:1019B0001092722410927324109274241092752441 +:1019C000109270241092712410920D220F9108959C +:1019D0000F9385E080930D22E9E2F2E204E00593A3 +:1019E000E1E2F2E204E005930F9108950F9383E0A2 +:1019F00080930D2210922A2210922B22E8E2F2E22A +:101A000002E006930F910895E0917224F0917324FF +:101A1000309709F009940895982F9F70282F332745 +:101A200027FD30952227330F221F3327290F311D21 +:101A3000290F311D2250310949E0429FC001439FC7 +:101A4000900D11248D569E4D08958F929F92BF92B6 +:101A5000CF92DF92EF92FF920F931F93CF93DF937A +:101A6000B82EDADFEC018B2D73DF7C01DC011196DF +:101A7000EC91E770E150E73040F4F0E0EE0FFF1F2B +:101A8000EE54FF4D0081118102C008E010E0ED81AD +:101A9000FE818B819C814881D701B7FE4FC016968D +:101AA0002D913C9117972E0F3F1F2D833E832817B2 +:101AB000390799F1FC01E21BF30B9F012115F4E0BA +:101AC0003F0738F02FEF33E0C901B8010BD5281BD1 +:101AD000390B41FF09C0C901B80104D541E0892B88 +:101AE00009F040E0942F01C090E0888190FB81F9DB +:101AF0008883D70116961D921C92179712962D93E4 +:101B00003C93139789819A812D813E81820F931F87 +:101B100014968D939C9315970DC041FF70C04D7F17 +:101B20004883D70116961D921C92179712961D9204 +:101B30001C921397F70102E006937AC01296CD909B +:101B4000DC90139742FF0FC089809A80B801CAD4F5 +:101B5000B0E4BB9EB00111246D567F4DAC01C401B1 +:101B60008E0F9F1FD9D46D817E816C0D7D1D6D837D +:101B70007E832B813C812617370710F42D833E830B +:101B8000F70186819781C816D906C9F58D819E8196 +:101B900082179307A1F1281B390B2115F4E03F07A9 +:101BA00010F02FEF33E0C901B8019CD4281B390B8A +:101BB000D70112961D921C9213972017310778F4C3 +:101BC000888184608883B0E4BB9EC00111248D5657 +:101BD0009F4DF7018483958306831783ABCF89815B +:101BE0009A814D815E81840F951FD70114968D9344 +:101BF0009C93159716962D933C9317979BCF8881AE +:101C000080FF16C08E7F8883EF81F885309781F042 +:101C10006D817E814B2D80E0DF91CF911F910F91DF +:101C2000FF90EF90DF90CF90BF909F908F9009949E +:101C3000DF91CF911F910F91FF90EF90DF90CF90A8 +:101C4000BF909F908F9008950F93CF93DF938091D3 +:101C50000D22833029F4D8DEDF91CF910F918DCE04 +:101C60002091092230910A22C0917024D0917124D0 +:101C7000C21BD30B61F580910B2290910C22820F35 +:101C8000931F80930B2290930C2220916C2430910F +:101C90006D242817390721F08091D220882331F054 +:101CA00084E080930D22E0E2F2E236C0E0917424F9 +:101CB000F0917524309799F00995882381F010925E +:101CC000092210920A22C0917024D0917124C0344C +:101CD000D10528F01092D220C0E4D0E003C081E00A +:101CE0008093D220C0932A22D0932B2220910922C4 +:101CF00030910A2280916E2490916F24820F931F5D +:101D000080932C2290932D22C20FD31FC0930922BF +:101D1000D0930A22E8E2F2E202E00693DF91CF914B +:101D20000F9108950F93CF93DF931F92CDB7DEB736 +:101D30008091CC0480FF65C081E08093CC04E0E218 +:101D4000F2E200E80693E8E2F2E200E8069380930C +:101D5000CA04E0E2F2E200E1069380910D228823BA +:101D600029F08350823008F44FDE07DE8091222272 +:101D700090912322089709F046C088E0E9ECF1E24F +:101D8000A6E6B4E201900D928A95E1F78091C8042D +:101D900080628093C8048091C80480628093C804E4 +:101DA00063DA811102C014DE2EC09091662497FF81 +:101DB0000EC010920B2210920C2210920922109247 +:101DC0000A2292E090930D2289833EDF08C0209181 +:101DD0006C2430916D24232B21F4898307DE8981C3 +:101DE00013C010920B2210920C2210920922109212 +:101DF0000A2291E090930D22E0E2F2E202E00693E3 +:101E000003C080E001C081E00F90DF91CF910F917E +:101E10000895CF93CFB7F89481E087DDEAECF4E042 +:101E200080E4808380E28083E1ECF4E08081816063 +:101E30008083A9ECB4E08C9182608C93E8ECF4E0B0 +:101E40008081806480838C9181608C9380818068A4 +:101E50008083CFBFCF910895CF931092600080E32D +:101E6000A0D88091C00480648093C00481E08093F6 +:101E70006000CFB7F89480E090E0FC0173E0EE0FD3 +:101E8000FF1F7A95E1F7EF5DFD4D108201968830D6 +:101E9000910599F7809193218E7F80939321809172 +:101EA0009C218E7F80939C218091A5218E7F8093A1 +:101EB000A5218091AE218E7F8093AE218091B721A4 +:101EC0008E7F8093B7218091C0218E7F8093C02127 +:101ED0006AE170E082E001DD8F3F09F48FE18093D9 +:101EE000FA046BE170E082E0F8DC8F3F09F48FE1E7 +:101EF0008093FB048091C00483608093C004809130 +:101F0000C00480688093C0048091C0048061809385 +:101F1000C00480E292E28093C6049093C70480914B +:101F2000C00480628093C0048FEF8093C5048091C9 +:101F3000C80482608093C8041092642285E0D7DCD4 +:101F400068DFCFBFCF9108958093C3040895809137 +:101F5000C304089580936E2490936F24609370243B +:101F60007093712408950F931F93CF93DF931F9263 +:101F7000CDB7DEB78A016983EBDCFC018181807C0F +:101F8000698181113BC06370613029F010F490E4E5 +:101F900003C090E801C090EC00381105E1F050F466 +:101FA00000321105A1F00034110599F0003111053E +:101FB00061F419C0011582E0180789F00F3FA3E012 +:101FC0001A0779F00115114041F080E00DC082E060 +:101FD0000BC083E009C084E007C085E005C086E04F +:101FE00003C087E001C081E0118226E02083892BB5 +:101FF000818381818062818381E001C080E00F90D4 +:10200000DF91CF911F910F910895A2DCFC01818196 +:1020100082FB882780F90895CF93C82F99DCFC01B3 +:10202000818182FF0FC091819B7F91838C2FF4DC93 +:10203000FC01808180FF06C08E7F80830780F08551 +:10204000E02D099581E0CF9108958F929F92BF92E4 +:10205000CF92DF92EF92FF920F931F93CF93DF9374 +:102060001F92CDB7DEB7B82E6A0179016983D4DC3F +:102070004C018B2D6DDCFC018181807C6981882382 +:1020800009F457C08181807C803C19F0818182FDF8 +:1020900050C08FB7F894D4019C9190FF02C08FBFBD +:1020A00048C09160D4019C938FBFD4011196CD920A +:1020B000DC9212971396ED92FC92149715961D924E +:1020C0001C92169717960D931C93189791E0611127 +:1020D00004C0E114F10409F090E0D4018C9190FB6C +:1020E00081F98B7F8C93B7FC1EC08181807C803C02 +:1020F000C1F4A181A770A150A73040F4B0E0AA0FAD +:10210000BB1FAE54BF4D6D917C9102C068E070E082 +:10211000C701E8D1892B29F0F40180818E7F80836B +:1021200008C012821382168217828B2D8EDC81E00A +:1021300001C080E00F90DF91CF911F910F91FF9030 +:10214000EF90DF90CF90BF909F908F9008950F9366 +:102150001F93CF93DF93182FFBDBEC01812F5CDC07 +:10216000DC01FE0102E005938C9180FF16C08E7F9A +:102170008C931796ED91FC911897309771F017FF9B +:1021800003C06E817F8102C06A817B81412F81E023 +:10219000DF91CF911F910F910994DF91CF911F9102 +:1021A0000F910895CF93C82FD2DF8C2FD1DBFC0184 +:1021B0001182CF9108950F93CF93C82FC9DBFC01F3 +:1021C00091819460918301E006938C2FC0DF81E0C0 +:1021D000CF910F9108951F920F920FB60F92112475 +:1021E0000F932F933F934F935F936F937F938F93AF +:1021F0009F93AF93BF93EF93FF938091CB0487FF9F +:1022000007C080E88093CA040AD80E94770186C07C +:102210008091CB0482FF18C084E08093CA0480912F +:10222000282286FF7BC08091CC0481FD77C07ADDB7 +:10223000811174C080910D22813011F4D7DB6EC002 +:10224000843009F06BC021C08091CB0481FF26C08F +:1022500082E08093CA048091202286FF5FC0809133 +:10226000CC0481FD5BC05EDD811158C080910D22E0 +:10227000823041F484E080930D22E0E2F2E202E059 +:1022800006934CC0833009F049C0E9E2F2E204E071 +:102290000593E1E2F2E204E0059340C08091CB04B3 +:1022A00084FF25C080E18093CA0481E050DF81E88B +:1022B0004EDF82E04CDF82E84ADF0E94F308109292 +:1022C000C3041092212296E09093202283E480930D +:1022D000212210922922909328228093292289EC8E +:1022E00091E2809324229093252247DB17C08091AE +:1022F000CB0486FF08C080E48093CA0480E015DB2D +:102300000E9475010BC08091CB0485FF07C080E25D +:102310008093CA0481E009DB0E947601FF91EF916E +:10232000BF91AF919F918F917F916F915F914F91ED +:102330003F912F910F910F900FBE0F901F90189506 +:102340001F920F920FB60F9211240F931F932F938A +:102350003F934F935F936F937F938F939F93AF932D +:10236000BF93CF93DF93EF93FF938091CC0481FFD2 +:102370001AC082E08093CC048091C504E0E2F2E2CE +:102380008195880FE81BF10920813181205232426A +:1023900003E0369527950A95E1F7C22FC69520FFF1 +:1023A00006C080E805C0BEDC882319F386C080E043 +:1023B000C80F8C2FCDDAFC01808185FF7EC000E242 +:1023C0000693C11174C080910D22843019F41CDB76 +:1023D000D4DA73C0C0912222D0912322809170243C +:1023E000909171240091092210910A2298012C0FDA +:1023F0003D1F8217930718F4EC01C01BD10B80918D +:102400006E2490916F24AE0169EC71E2800F911FF0 +:1024100083D00C0F1D1F0093092210930A22C03491 +:10242000D10569F480910B2290910C22800F911FAD +:1024300020916C2430916D248217930788F00093CB +:10244000702410937124E0917424F09175243097D6 +:1024500029F00995811102C0BBDA2FC0C7DA2DC05F +:10246000809170249091712480179107D9F4E091A4 +:102470007424F0917524309779F30995882361F3DA +:1024800080910B2290910C222091092230910A22F6 +:10249000820F931F80930B2290930C22109209229B +:1024A00010920A22E0E2F2E202E0069306C0C0388F +:1024B00011F4CADB02C08C2FC8DAFF91EF91DF91D3 +:1024C000CF91BF91AF919F918F917F916F915F91CC +:1024D0004F913F912F911F910F910F900FBE0F9031 +:1024E0001F901895AA1BBB1B51E107C0AA1FBB1F59 +:1024F000A617B70710F0A61BB70B881F991F5A9590 +:10250000A9F780959095BC01CD010895EE0FFF1FAE +:102510000590F491E02D0994FB01DC0102C00190CB +:0E2520000D9241505040D8F70895F894FFCF27 +:10252E00FF5580008000F407EE07FE07EB07000062 +:10253E004420162000001C201A2006200902270025 +:10254E0001010080FA0904000003FFFFFF000705E8 +:10255E0081024000000705020240000007058301CA +:10256E00FF0301001201000200000040EB0300A077 +:10257E000002010200010000000300000000000044 +:10258E00000000000000000000000000000000003D +:10259E00000000000000000000000000000000002D +:1025AE0000000000000000000000555342476F621B +:1025BE00696E6461722044756D6D7920446576692B +:1025CE0063650054617069725465636800000403AA +:1025DE000904100020004000800000010002FF03EB +:00000001FF diff --git a/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.lss b/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.lss new file mode 100644 index 00000000..00927a7c --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.lss @@ -0,0 +1,4388 @@ + +USB_BULK_TEST.elf: file format elf32-avr + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .text 0000252e 00000000 00000000 00000094 2**1 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .data 000000c0 00802000 0000252e 000025c4 2**2 + CONTENTS, ALLOC, LOAD, DATA + 2 .bss 00000b98 008020c0 008020c0 00002684 2**2 + ALLOC + 3 .comment 00000030 00000000 00000000 00002684 2**0 + CONTENTS, READONLY + 4 .debug_aranges 00000048 00000000 00000000 000026b8 2**3 + CONTENTS, READONLY, DEBUGGING + 5 .debug_info 0000011a 00000000 00000000 00002700 2**0 + CONTENTS, READONLY, DEBUGGING + 6 .debug_abbrev 00000026 00000000 00000000 0000281a 2**0 + CONTENTS, READONLY, DEBUGGING + 7 .debug_line 0000018d 00000000 00000000 00002840 2**0 + CONTENTS, READONLY, DEBUGGING + 8 .debug_ranges 00000020 00000000 00000000 000029d0 2**3 + CONTENTS, READONLY, DEBUGGING + +Disassembly of section .text: + +00000000 <__vectors>: + 0: 1d c1 rjmp .+570 ; 0x23c <__ctors_end> + 2: 00 00 nop + 4: 37 c1 rjmp .+622 ; 0x274 <__bad_interrupt> + 6: 00 00 nop + 8: 35 c1 rjmp .+618 ; 0x274 <__bad_interrupt> + a: 00 00 nop + c: 33 c1 rjmp .+614 ; 0x274 <__bad_interrupt> + e: 00 00 nop + 10: 31 c1 rjmp .+610 ; 0x274 <__bad_interrupt> + 12: 00 00 nop + 14: 2f c1 rjmp .+606 ; 0x274 <__bad_interrupt> + 16: 00 00 nop + 18: 2d c1 rjmp .+602 ; 0x274 <__bad_interrupt> + 1a: 00 00 nop + 1c: 2b c1 rjmp .+598 ; 0x274 <__bad_interrupt> + 1e: 00 00 nop + 20: 29 c1 rjmp .+594 ; 0x274 <__bad_interrupt> + 22: 00 00 nop + 24: 27 c1 rjmp .+590 ; 0x274 <__bad_interrupt> + 26: 00 00 nop + 28: 25 c1 rjmp .+586 ; 0x274 <__bad_interrupt> + 2a: 00 00 nop + 2c: 23 c1 rjmp .+582 ; 0x274 <__bad_interrupt> + 2e: 00 00 nop + 30: 21 c1 rjmp .+578 ; 0x274 <__bad_interrupt> + 32: 00 00 nop + 34: 1f c1 rjmp .+574 ; 0x274 <__bad_interrupt> + 36: 00 00 nop + 38: 1d c1 rjmp .+570 ; 0x274 <__bad_interrupt> + 3a: 00 00 nop + 3c: 1b c1 rjmp .+566 ; 0x274 <__bad_interrupt> + 3e: 00 00 nop + 40: 19 c1 rjmp .+562 ; 0x274 <__bad_interrupt> + 42: 00 00 nop + 44: 17 c1 rjmp .+558 ; 0x274 <__bad_interrupt> + 46: 00 00 nop + 48: 15 c1 rjmp .+554 ; 0x274 <__bad_interrupt> + 4a: 00 00 nop + 4c: 13 c1 rjmp .+550 ; 0x274 <__bad_interrupt> + 4e: 00 00 nop + 50: 11 c1 rjmp .+546 ; 0x274 <__bad_interrupt> + 52: 00 00 nop + 54: 0f c1 rjmp .+542 ; 0x274 <__bad_interrupt> + 56: 00 00 nop + 58: 0d c1 rjmp .+538 ; 0x274 <__bad_interrupt> + 5a: 00 00 nop + 5c: 0b c1 rjmp .+534 ; 0x274 <__bad_interrupt> + 5e: 00 00 nop + 60: 09 c1 rjmp .+530 ; 0x274 <__bad_interrupt> + 62: 00 00 nop + 64: 07 c1 rjmp .+526 ; 0x274 <__bad_interrupt> + 66: 00 00 nop + 68: 05 c1 rjmp .+522 ; 0x274 <__bad_interrupt> + 6a: 00 00 nop + 6c: 03 c1 rjmp .+518 ; 0x274 <__bad_interrupt> + 6e: 00 00 nop + 70: 01 c1 rjmp .+514 ; 0x274 <__bad_interrupt> + 72: 00 00 nop + 74: ff c0 rjmp .+510 ; 0x274 <__bad_interrupt> + 76: 00 00 nop + 78: fd c0 rjmp .+506 ; 0x274 <__bad_interrupt> + 7a: 00 00 nop + 7c: fb c0 rjmp .+502 ; 0x274 <__bad_interrupt> + 7e: 00 00 nop + 80: f9 c0 rjmp .+498 ; 0x274 <__bad_interrupt> + 82: 00 00 nop + 84: f7 c0 rjmp .+494 ; 0x274 <__bad_interrupt> + 86: 00 00 nop + 88: f5 c0 rjmp .+490 ; 0x274 <__bad_interrupt> + 8a: 00 00 nop + 8c: f3 c0 rjmp .+486 ; 0x274 <__bad_interrupt> + 8e: 00 00 nop + 90: f1 c0 rjmp .+482 ; 0x274 <__bad_interrupt> + 92: 00 00 nop + 94: ef c0 rjmp .+478 ; 0x274 <__bad_interrupt> + 96: 00 00 nop + 98: ed c0 rjmp .+474 ; 0x274 <__bad_interrupt> + 9a: 00 00 nop + 9c: eb c0 rjmp .+470 ; 0x274 <__bad_interrupt> + 9e: 00 00 nop + a0: e9 c0 rjmp .+466 ; 0x274 <__bad_interrupt> + a2: 00 00 nop + a4: e7 c0 rjmp .+462 ; 0x274 <__bad_interrupt> + a6: 00 00 nop + a8: e5 c0 rjmp .+458 ; 0x274 <__bad_interrupt> + aa: 00 00 nop + ac: e3 c0 rjmp .+454 ; 0x274 <__bad_interrupt> + ae: 00 00 nop + b0: e1 c0 rjmp .+450 ; 0x274 <__bad_interrupt> + b2: 00 00 nop + b4: df c0 rjmp .+446 ; 0x274 <__bad_interrupt> + b6: 00 00 nop + b8: dd c0 rjmp .+442 ; 0x274 <__bad_interrupt> + ba: 00 00 nop + bc: db c0 rjmp .+438 ; 0x274 <__bad_interrupt> + be: 00 00 nop + c0: d9 c0 rjmp .+434 ; 0x274 <__bad_interrupt> + c2: 00 00 nop + c4: d7 c0 rjmp .+430 ; 0x274 <__bad_interrupt> + c6: 00 00 nop + c8: d5 c0 rjmp .+426 ; 0x274 <__bad_interrupt> + ca: 00 00 nop + cc: d3 c0 rjmp .+422 ; 0x274 <__bad_interrupt> + ce: 00 00 nop + d0: d1 c0 rjmp .+418 ; 0x274 <__bad_interrupt> + d2: 00 00 nop + d4: cf c0 rjmp .+414 ; 0x274 <__bad_interrupt> + d6: 00 00 nop + d8: cd c0 rjmp .+410 ; 0x274 <__bad_interrupt> + da: 00 00 nop + dc: cb c0 rjmp .+406 ; 0x274 <__bad_interrupt> + de: 00 00 nop + e0: c9 c0 rjmp .+402 ; 0x274 <__bad_interrupt> + e2: 00 00 nop + e4: c7 c0 rjmp .+398 ; 0x274 <__bad_interrupt> + e6: 00 00 nop + e8: c5 c0 rjmp .+394 ; 0x274 <__bad_interrupt> + ea: 00 00 nop + ec: c3 c0 rjmp .+390 ; 0x274 <__bad_interrupt> + ee: 00 00 nop + f0: c1 c0 rjmp .+386 ; 0x274 <__bad_interrupt> + f2: 00 00 nop + f4: bf c0 rjmp .+382 ; 0x274 <__bad_interrupt> + f6: 00 00 nop + f8: bd c0 rjmp .+378 ; 0x274 <__bad_interrupt> + fa: 00 00 nop + fc: bb c0 rjmp .+374 ; 0x274 <__bad_interrupt> + fe: 00 00 nop + 100: b9 c0 rjmp .+370 ; 0x274 <__bad_interrupt> + 102: 00 00 nop + 104: b7 c0 rjmp .+366 ; 0x274 <__bad_interrupt> + 106: 00 00 nop + 108: b5 c0 rjmp .+362 ; 0x274 <__bad_interrupt> + 10a: 00 00 nop + 10c: b3 c0 rjmp .+358 ; 0x274 <__bad_interrupt> + 10e: 00 00 nop + 110: b1 c0 rjmp .+354 ; 0x274 <__bad_interrupt> + 112: 00 00 nop + 114: af c0 rjmp .+350 ; 0x274 <__bad_interrupt> + 116: 00 00 nop + 118: ad c0 rjmp .+346 ; 0x274 <__bad_interrupt> + 11a: 00 00 nop + 11c: ab c0 rjmp .+342 ; 0x274 <__bad_interrupt> + 11e: 00 00 nop + 120: a9 c0 rjmp .+338 ; 0x274 <__bad_interrupt> + 122: 00 00 nop + 124: a7 c0 rjmp .+334 ; 0x274 <__bad_interrupt> + 126: 00 00 nop + 128: a5 c0 rjmp .+330 ; 0x274 <__bad_interrupt> + 12a: 00 00 nop + 12c: a3 c0 rjmp .+326 ; 0x274 <__bad_interrupt> + 12e: 00 00 nop + 130: a1 c0 rjmp .+322 ; 0x274 <__bad_interrupt> + 132: 00 00 nop + 134: 9f c0 rjmp .+318 ; 0x274 <__bad_interrupt> + 136: 00 00 nop + 138: 9d c0 rjmp .+314 ; 0x274 <__bad_interrupt> + 13a: 00 00 nop + 13c: 9b c0 rjmp .+310 ; 0x274 <__bad_interrupt> + 13e: 00 00 nop + 140: 99 c0 rjmp .+306 ; 0x274 <__bad_interrupt> + 142: 00 00 nop + 144: 97 c0 rjmp .+302 ; 0x274 <__bad_interrupt> + 146: 00 00 nop + 148: 95 c0 rjmp .+298 ; 0x274 <__bad_interrupt> + 14a: 00 00 nop + 14c: 26 c6 rjmp .+3148 ; 0xd9a <__vector_83> + 14e: 00 00 nop + 150: 91 c0 rjmp .+290 ; 0x274 <__bad_interrupt> + 152: 00 00 nop + 154: 8f c0 rjmp .+286 ; 0x274 <__bad_interrupt> + 156: 00 00 nop + 158: 8d c0 rjmp .+282 ; 0x274 <__bad_interrupt> + 15a: 00 00 nop + 15c: 8b c0 rjmp .+278 ; 0x274 <__bad_interrupt> + 15e: 00 00 nop + 160: 89 c0 rjmp .+274 ; 0x274 <__bad_interrupt> + 162: 00 00 nop + 164: 87 c0 rjmp .+270 ; 0x274 <__bad_interrupt> + 166: 00 00 nop + 168: 85 c0 rjmp .+266 ; 0x274 <__bad_interrupt> + 16a: 00 00 nop + 16c: 83 c0 rjmp .+262 ; 0x274 <__bad_interrupt> + 16e: 00 00 nop + 170: 81 c0 rjmp .+258 ; 0x274 <__bad_interrupt> + 172: 00 00 nop + 174: 7f c0 rjmp .+254 ; 0x274 <__bad_interrupt> + 176: 00 00 nop + 178: 7d c0 rjmp .+250 ; 0x274 <__bad_interrupt> + 17a: 00 00 nop + 17c: 7b c0 rjmp .+246 ; 0x274 <__bad_interrupt> + 17e: 00 00 nop + 180: 79 c0 rjmp .+242 ; 0x274 <__bad_interrupt> + 182: 00 00 nop + 184: 77 c0 rjmp .+238 ; 0x274 <__bad_interrupt> + 186: 00 00 nop + 188: 75 c0 rjmp .+234 ; 0x274 <__bad_interrupt> + 18a: 00 00 nop + 18c: 73 c0 rjmp .+230 ; 0x274 <__bad_interrupt> + 18e: 00 00 nop + 190: 71 c0 rjmp .+226 ; 0x274 <__bad_interrupt> + 192: 00 00 nop + 194: 6f c0 rjmp .+222 ; 0x274 <__bad_interrupt> + 196: 00 00 nop + 198: 6d c0 rjmp .+218 ; 0x274 <__bad_interrupt> + 19a: 00 00 nop + 19c: 6b c0 rjmp .+214 ; 0x274 <__bad_interrupt> + 19e: 00 00 nop + 1a0: 69 c0 rjmp .+210 ; 0x274 <__bad_interrupt> + 1a2: 00 00 nop + 1a4: 67 c0 rjmp .+206 ; 0x274 <__bad_interrupt> + 1a6: 00 00 nop + 1a8: 65 c0 rjmp .+202 ; 0x274 <__bad_interrupt> + 1aa: 00 00 nop + 1ac: 63 c0 rjmp .+198 ; 0x274 <__bad_interrupt> + 1ae: 00 00 nop + 1b0: 61 c0 rjmp .+194 ; 0x274 <__bad_interrupt> + 1b2: 00 00 nop + 1b4: 5f c0 rjmp .+190 ; 0x274 <__bad_interrupt> + 1b6: 00 00 nop + 1b8: 5d c0 rjmp .+186 ; 0x274 <__bad_interrupt> + 1ba: 00 00 nop + 1bc: 5b c0 rjmp .+182 ; 0x274 <__bad_interrupt> + 1be: 00 00 nop + 1c0: 59 c0 rjmp .+178 ; 0x274 <__bad_interrupt> + 1c2: 00 00 nop + 1c4: 57 c0 rjmp .+174 ; 0x274 <__bad_interrupt> + 1c6: 00 00 nop + 1c8: 55 c0 rjmp .+170 ; 0x274 <__bad_interrupt> + 1ca: 00 00 nop + 1cc: 53 c0 rjmp .+166 ; 0x274 <__bad_interrupt> + 1ce: 00 00 nop + 1d0: 51 c0 rjmp .+162 ; 0x274 <__bad_interrupt> + 1d2: 00 00 nop + 1d4: 4f c0 rjmp .+158 ; 0x274 <__bad_interrupt> + 1d6: 00 00 nop + 1d8: 4d c0 rjmp .+154 ; 0x274 <__bad_interrupt> + 1da: 00 00 nop + 1dc: 4b c0 rjmp .+150 ; 0x274 <__bad_interrupt> + 1de: 00 00 nop + 1e0: 49 c0 rjmp .+146 ; 0x274 <__bad_interrupt> + 1e2: 00 00 nop + 1e4: 47 c0 rjmp .+142 ; 0x274 <__bad_interrupt> + 1e6: 00 00 nop + 1e8: 45 c0 rjmp .+138 ; 0x274 <__bad_interrupt> + 1ea: 00 00 nop + 1ec: 43 c0 rjmp .+134 ; 0x274 <__bad_interrupt> + 1ee: 00 00 nop + 1f0: 41 c0 rjmp .+130 ; 0x274 <__bad_interrupt> + 1f2: 00 00 nop + 1f4: 0c 94 eb 10 jmp 0x21d6 ; 0x21d6 <__vector_125> + 1f8: 0c 94 a0 11 jmp 0x2340 ; 0x2340 <__vector_126> + 1fc: 82 01 movw r16, r4 + 1fe: 84 01 movw r16, r8 + 200: 86 01 movw r16, r12 + 202: 88 01 movw r16, r16 + 204: 8a 01 movw r16, r20 + 206: 8f 01 movw r16, r30 + 208: 8c 01 movw r16, r24 + 20a: 8e 01 movw r16, r28 + 20c: 68 09 sbc r22, r8 + 20e: 6a 09 sbc r22, r10 + 210: 80 09 sbc r24, r0 + 212: b6 09 sbc r27, r6 + 214: bf 09 sbc r27, r15 + 216: c4 09 sbc r28, r4 + 218: 13 0a sbc r1, r19 + 21a: 18 0a sbc r1, r24 + 21c: d7 09 sbc r29, r7 + 21e: e0 09 sbc r30, r0 + 220: ee 09 sbc r30, r14 + 222: f0 09 sbc r31, r0 + 224: f2 09 sbc r31, r2 + 226: fc 09 sbc r31, r12 + 228: 06 0a sbc r0, r22 + 22a: 11 0a sbc r1, r17 + 22c: d0 09 sbc r29, r0 + 22e: d9 09 sbc r29, r9 + 230: e2 09 sbc r30, r2 + 232: f0 09 sbc r31, r0 + 234: f2 09 sbc r31, r2 + 236: f4 09 sbc r31, r4 + 238: fe 09 sbc r31, r14 + 23a: 08 0a sbc r0, r24 + +0000023c <__ctors_end>: + 23c: 11 24 eor r1, r1 + 23e: 1f be out 0x3f, r1 ; 63 + 240: cf ef ldi r28, 0xFF ; 255 + 242: cd bf out 0x3d, r28 ; 61 + 244: df e2 ldi r29, 0x2F ; 47 + 246: de bf out 0x3e, r29 ; 62 + +00000248 <__do_copy_data>: + 248: 10 e2 ldi r17, 0x20 ; 32 + 24a: a0 e0 ldi r26, 0x00 ; 0 + 24c: b0 e2 ldi r27, 0x20 ; 32 + 24e: ee e2 ldi r30, 0x2E ; 46 + 250: f5 e2 ldi r31, 0x25 ; 37 + 252: 02 c0 rjmp .+4 ; 0x258 <__do_copy_data+0x10> + 254: 05 90 lpm r0, Z+ + 256: 0d 92 st X+, r0 + 258: a0 3c cpi r26, 0xC0 ; 192 + 25a: b1 07 cpc r27, r17 + 25c: d9 f7 brne .-10 ; 0x254 <__do_copy_data+0xc> + +0000025e <__do_clear_bss>: + 25e: 2c e2 ldi r18, 0x2C ; 44 + 260: a0 ec ldi r26, 0xC0 ; 192 + 262: b0 e2 ldi r27, 0x20 ; 32 + 264: 01 c0 rjmp .+2 ; 0x268 <.do_clear_bss_start> + +00000266 <.do_clear_bss_loop>: + 266: 1d 92 st X+, r1 + +00000268 <.do_clear_bss_start>: + 268: a8 35 cpi r26, 0x58 ; 88 + 26a: b2 07 cpc r27, r18 + 26c: e1 f7 brne .-8 ; 0x266 <.do_clear_bss_loop> + 26e: 1b d0 rcall .+54 ; 0x2a6
+ 270: 0c 94 95 12 jmp 0x252a ; 0x252a <_exit> + +00000274 <__bad_interrupt>: + 274: c5 ce rjmp .-630 ; 0x0 <__vectors> + +00000276 : + 276: e0 e8 ldi r30, 0x80 ; 128 + 278: f6 e0 ldi r31, 0x06 ; 6 + 27a: 8f e0 ldi r24, 0x0F ; 15 + 27c: 80 83 st Z, r24 + 27e: 85 e0 ldi r24, 0x05 ; 5 + 280: 84 83 std Z+4, r24 ; 0x04 + 282: 08 95 ret + +00000284 : + 284: 08 95 ret + +00000286 : + 286: 80 91 c2 20 lds r24, 0x20C2 + 28a: 81 11 cpse r24, r1 + 28c: 03 c0 rjmp .+6 ; 0x294 + 28e: 8e ee ldi r24, 0xEE ; 238 + 290: 92 e0 ldi r25, 0x02 ; 2 + 292: 02 c0 rjmp .+4 ; 0x298 + 294: 80 e0 ldi r24, 0x00 ; 0 + 296: 90 e0 ldi r25, 0x00 ; 0 + 298: 43 e4 ldi r20, 0x43 ; 67 + 29a: 51 e0 ldi r21, 0x01 ; 1 + 29c: 6e ee ldi r22, 0xEE ; 238 + 29e: 72 e0 ldi r23, 0x02 ; 2 + 2a0: 8a 58 subi r24, 0x8A ; 138 + 2a2: 99 4d sbci r25, 0xD9 ; 217 + 2a4: c7 c6 rjmp .+3470 ; 0x1034 + +000002a6
: + 2a6: 87 e0 ldi r24, 0x07 ; 7 + 2a8: 80 93 a2 00 sts 0x00A2, r24 + 2ac: 78 94 sei + 2ae: 20 d6 rcall .+3136 ; 0xef0 + 2b0: e9 df rcall .-46 ; 0x284 + 2b2: 98 d7 rcall .+3888 ; 0x11e4 + 2b4: b1 d0 rcall .+354 ; 0x418 + 2b6: d4 d0 rcall .+424 ; 0x460 + 2b8: 60 e0 ldi r22, 0x00 ; 0 + 2ba: 80 e0 ldi r24, 0x00 ; 0 + 2bc: 7e d0 rcall .+252 ; 0x3ba + 2be: 6a d0 rcall .+212 ; 0x394 + 2c0: 8c e0 ldi r24, 0x0C ; 12 + 2c2: 5e d0 rcall .+188 ; 0x380 + 2c4: 2f d5 rcall .+2654 ; 0xd24 + 2c6: c8 d5 rcall .+2960 ; 0xe58 + 2c8: e1 d5 rcall .+3010 ; 0xe8c + 2ca: d5 df rcall .-86 ; 0x276 + ... + 2e8: f1 cf rjmp .-30 ; 0x2cc + +000002ea : + 2ea: 08 95 ret + +000002ec : + 2ec: 08 95 ret + +000002ee : + 2ee: 80 91 00 20 lds r24, 0x2000 + 2f2: 90 e0 ldi r25, 0x00 ; 0 + 2f4: 88 30 cpi r24, 0x08 ; 8 + 2f6: 91 05 cpc r25, r1 + 2f8: 90 f4 brcc .+36 ; 0x31e + 2fa: fc 01 movw r30, r24 + 2fc: e2 50 subi r30, 0x02 ; 2 + 2fe: ff 4f sbci r31, 0xFF ; 255 + 300: 0c 94 86 12 jmp 0x250c ; 0x250c <__tablejump2__> + 304: 10 d1 rcall .+544 ; 0x526 + 306: 0b c0 rjmp .+22 ; 0x31e + 308: 8c d1 rcall .+792 ; 0x622 + 30a: 09 c0 rjmp .+18 ; 0x31e + 30c: 2a d2 rcall .+1108 ; 0x762 + 30e: 07 c0 rjmp .+14 ; 0x31e + 310: e5 d2 rcall .+1482 ; 0x8dc + 312: 05 c0 rjmp .+10 ; 0x31e + 314: 79 d3 rcall .+1778 ; 0xa08 + 316: 03 c0 rjmp .+6 ; 0x31e + 318: 60 d4 rcall .+2240 ; 0xbda + 31a: 01 c0 rjmp .+2 ; 0x31e + 31c: d5 d4 rcall .+2474 ; 0xcc8 + 31e: 90 91 c2 20 lds r25, 0x20C2 + 322: 81 e0 ldi r24, 0x01 ; 1 + 324: 91 11 cpse r25, r1 + 326: 80 e0 ldi r24, 0x00 ; 0 + 328: 80 93 c2 20 sts 0x20C2, r24 + 32c: 08 95 ret + +0000032e : + 32e: 81 e0 ldi r24, 0x01 ; 1 + 330: 80 93 c3 20 sts 0x20C3, r24 + 334: 43 e4 ldi r20, 0x43 ; 67 + 336: 51 e0 ldi r21, 0x01 ; 1 + 338: 6e ee ldi r22, 0xEE ; 238 + 33a: 72 e0 ldi r23, 0x02 ; 2 + 33c: 86 e7 ldi r24, 0x76 ; 118 + 33e: 96 e2 ldi r25, 0x26 ; 38 + 340: 79 d6 rcall .+3314 ; 0x1034 + 342: 81 e0 ldi r24, 0x01 ; 1 + 344: 08 95 ret + +00000346 : + 346: 10 92 c3 20 sts 0x20C3, r1 + 34a: 08 95 ret + +0000034c : + 34c: 81 e0 ldi r24, 0x01 ; 1 + 34e: 08 95 ret + +00000350 : + 350: 81 e0 ldi r24, 0x01 ; 1 + 352: 08 95 ret + +00000354 : + 354: 10 92 20 02 sts 0x0220, r1 + 358: 98 2f mov r25, r24 + 35a: 9c 71 andi r25, 0x1C ; 28 + 35c: 93 68 ori r25, 0x83 ; 131 + 35e: 90 93 20 02 sts 0x0220, r25 + 362: 87 fd sbrc r24, 7 + 364: 03 c0 rjmp .+6 ; 0x36c + 366: 90 e0 ldi r25, 0x00 ; 0 + 368: 80 e0 ldi r24, 0x00 ; 0 + 36a: 02 c0 rjmp .+4 ; 0x370 + 36c: 90 e1 ldi r25, 0x10 ; 16 + 36e: 82 e0 ldi r24, 0x02 ; 2 + 370: 89 2b or r24, r25 + 372: 80 93 21 02 sts 0x0221, r24 + 376: 10 92 22 02 sts 0x0222, r1 + 37a: 10 92 26 02 sts 0x0226, r1 + 37e: 08 95 ret + +00000380 : + 380: e0 e0 ldi r30, 0x00 ; 0 + 382: f2 e0 ldi r31, 0x02 ; 2 + 384: 10 aa std Z+48, r1 ; 0x30 + 386: 83 68 ori r24, 0x83 ; 131 + 388: 80 ab std Z+48, r24 ; 0x30 + 38a: 80 e1 ldi r24, 0x10 ; 16 + 38c: 81 ab std Z+49, r24 ; 0x31 + 38e: 12 aa std Z+50, r1 ; 0x32 + 390: 16 aa std Z+54, r1 ; 0x36 + 392: 08 95 ret + +00000394 : + 394: e0 e0 ldi r30, 0x00 ; 0 + 396: f2 e0 ldi r31, 0x02 ; 2 + 398: 10 a6 std Z+40, r1 ; 0x28 + 39a: 83 e8 ldi r24, 0x83 ; 131 + 39c: 80 a7 std Z+40, r24 ; 0x28 + 39e: 8f e2 ldi r24, 0x2F ; 47 + 3a0: 81 a7 std Z+41, r24 ; 0x29 + 3a2: 12 a6 std Z+42, r1 ; 0x2a + 3a4: 16 a6 std Z+46, r1 ; 0x2e + 3a6: 08 95 ret + +000003a8 : + 3a8: 92 e0 ldi r25, 0x02 ; 2 + 3aa: 90 93 ca 01 sts 0x01CA, r25 + 3ae: e8 2f mov r30, r24 + 3b0: f0 e0 ldi r31, 0x00 ; 0 + 3b2: 84 91 lpm r24, Z + 3b4: 10 92 ca 01 sts 0x01CA, r1 + 3b8: 08 95 ret + +000003ba : + 3ba: 90 91 71 00 lds r25, 0x0071 + 3be: 9d 7f andi r25, 0xFD ; 253 + 3c0: 90 93 71 00 sts 0x0071, r25 + 3c4: 10 92 00 02 sts 0x0200, r1 + 3c8: 62 30 cpi r22, 0x02 ; 2 + 3ca: 11 f4 brne .+4 ; 0x3d0 + 3cc: 9e e1 ldi r25, 0x1E ; 30 + 3ce: 01 c0 rjmp .+2 ; 0x3d2 + 3d0: 9c e1 ldi r25, 0x1C ; 28 + 3d2: 90 93 01 02 sts 0x0201, r25 + 3d6: 90 e4 ldi r25, 0x40 ; 64 + 3d8: 90 93 02 02 sts 0x0202, r25 + 3dc: 88 23 and r24, r24 + 3de: 11 f0 breq .+4 ; 0x3e4 + 3e0: 80 ec ldi r24, 0xC0 ; 192 + 3e2: 01 c0 rjmp .+2 ; 0x3e6 + 3e4: 80 e4 ldi r24, 0x40 ; 64 + 3e6: 80 93 03 02 sts 0x0203, r24 + 3ea: 61 30 cpi r22, 0x01 ; 1 + 3ec: 11 f4 brne .+4 ; 0x3f2 + 3ee: 82 e0 ldi r24, 0x02 ; 2 + 3f0: 01 c0 rjmp .+2 ; 0x3f4 + 3f2: 83 e0 ldi r24, 0x03 ; 3 + 3f4: 80 93 04 02 sts 0x0204, r24 + 3f8: 80 e2 ldi r24, 0x20 ; 32 + 3fa: d6 df rcall .-84 ; 0x3a8 + 3fc: 80 93 0c 02 sts 0x020C, r24 + 400: 81 e2 ldi r24, 0x21 ; 33 + 402: d2 df rcall .-92 ; 0x3a8 + 404: 80 93 0d 02 sts 0x020D, r24 + 408: 10 92 18 02 sts 0x0218, r1 + 40c: 10 92 19 02 sts 0x0219, r1 + 410: 81 e0 ldi r24, 0x01 ; 1 + 412: 80 93 00 02 sts 0x0200, r24 + 416: be cf rjmp .-132 ; 0x394 + +00000418 : + 418: cf 93 push r28 + 41a: df 93 push r29 + 41c: e0 e7 ldi r30, 0x70 ; 112 + 41e: f0 e0 ldi r31, 0x00 ; 0 + 420: 82 81 ldd r24, Z+2 ; 0x02 + 422: 8b 7f andi r24, 0xFB ; 251 + 424: 82 83 std Z+2, r24 ; 0x02 + 426: c0 e2 ldi r28, 0x20 ; 32 + 428: d3 e0 ldi r29, 0x03 ; 3 + 42a: 8d e0 ldi r24, 0x0D ; 13 + 42c: 88 83 st Y, r24 + 42e: 80 e4 ldi r24, 0x40 ; 64 + 430: 89 83 std Y+1, r24 ; 0x01 + 432: 89 e0 ldi r24, 0x09 ; 9 + 434: 8a 83 std Y+2, r24 ; 0x02 + 436: 83 e3 ldi r24, 0x33 ; 51 + 438: b7 df rcall .-146 ; 0x3a8 + 43a: 88 87 std Y+8, r24 ; 0x08 + 43c: 82 e3 ldi r24, 0x32 ; 50 + 43e: b4 df rcall .-152 ; 0x3a8 + 440: 89 87 std Y+9, r24 ; 0x09 + 442: 87 e3 ldi r24, 0x37 ; 55 + 444: b1 df rcall .-158 ; 0x3a8 + 446: 8a 87 std Y+10, r24 ; 0x0a + 448: 86 e3 ldi r24, 0x36 ; 54 + 44a: ae df rcall .-164 ; 0x3a8 + 44c: 8b 87 std Y+11, r24 ; 0x0b + 44e: e0 e2 ldi r30, 0x20 ; 32 + 450: f6 e0 ldi r31, 0x06 ; 6 + 452: 80 81 ld r24, Z + 454: 83 60 ori r24, 0x03 ; 3 + 456: 80 83 st Z, r24 + 458: 14 82 std Z+4, r1 ; 0x04 + 45a: df 91 pop r29 + 45c: cf 91 pop r28 + 45e: 08 95 ret + +00000460 : + 460: e0 e7 ldi r30, 0x70 ; 112 + 462: f0 e0 ldi r31, 0x00 ; 0 + 464: 80 81 ld r24, Z + 466: 8e 7f andi r24, 0xFE ; 254 + 468: 80 83 st Z, r24 + 46a: 80 e8 ldi r24, 0x80 ; 128 + 46c: 80 93 00 01 sts 0x0100, r24 + 470: 08 95 ret + +00000472 : + 472: e0 e0 ldi r30, 0x00 ; 0 + 474: f1 e0 ldi r31, 0x01 ; 1 + 476: 10 8a std Z+16, r1 ; 0x10 + 478: 80 e4 ldi r24, 0x40 ; 64 + 47a: 80 8b std Z+16, r24 ; 0x10 + 47c: 10 a2 std Z+32, r1 ; 0x20 + 47e: 80 a3 std Z+32, r24 ; 0x20 + 480: 10 aa std Z+48, r1 ; 0x30 + 482: 80 ab std Z+48, r24 ; 0x30 + 484: e0 e4 ldi r30, 0x40 ; 64 + 486: f1 e0 ldi r31, 0x01 ; 1 + 488: 10 82 st Z, r1 + 48a: 80 83 st Z, r24 + 48c: 10 92 c2 20 sts 0x20C2, r1 + 490: 10 92 c1 20 sts 0x20C1, r1 + 494: 08 95 ret + +00000496 : + 496: 10 92 00 20 sts 0x2000, r1 + 49a: eb df rcall .-42 ; 0x472 + 49c: e0 e0 ldi r30, 0x00 ; 0 + 49e: f1 e0 ldi r31, 0x01 ; 1 + 4a0: 16 aa std Z+54, r1 ; 0x36 + 4a2: 44 e2 ldi r20, 0x24 ; 36 + 4a4: 40 ab std Z+48, r20 ; 0x30 + 4a6: 11 aa std Z+49, r1 ; 0x31 + 4a8: 39 e5 ldi r19, 0x59 ; 89 + 4aa: 32 ab std Z+50, r19 ; 0x32 + 4ac: 82 e0 ldi r24, 0x02 ; 2 + 4ae: 83 ab std Z+51, r24 ; 0x33 + 4b0: 80 91 02 20 lds r24, 0x2002 + 4b4: 90 91 03 20 lds r25, 0x2003 + 4b8: 84 ab std Z+52, r24 ; 0x34 + 4ba: 95 ab std Z+53, r25 ; 0x35 + 4bc: 86 e7 ldi r24, 0x76 ; 118 + 4be: 94 e2 ldi r25, 0x24 ; 36 + 4c0: 80 af std Z+56, r24 ; 0x38 + 4c2: 91 af std Z+57, r25 ; 0x39 + 4c4: 12 ae std Z+58, r1 ; 0x3a + 4c6: 8b e3 ldi r24, 0x3B ; 59 + 4c8: 84 af std Z+60, r24 ; 0x3c + 4ca: 23 e0 ldi r18, 0x03 ; 3 + 4cc: 20 93 3d 01 sts 0x013D, r18 + 4d0: 10 92 3e 01 sts 0x013E, r1 + 4d4: 80 a9 ldd r24, Z+48 ; 0x30 + 4d6: 80 68 ori r24, 0x80 ; 128 + 4d8: 80 ab std Z+48, r24 ; 0x30 + 4da: 10 92 46 01 sts 0x0146, r1 + 4de: e0 e4 ldi r30, 0x40 ; 64 + 4e0: f1 e0 ldi r31, 0x01 ; 1 + 4e2: 40 83 st Z, r20 + 4e4: 10 92 41 01 sts 0x0141, r1 + 4e8: 30 93 42 01 sts 0x0142, r19 + 4ec: 20 93 43 01 sts 0x0143, r18 + 4f0: 80 91 04 20 lds r24, 0x2004 + 4f4: 90 91 05 20 lds r25, 0x2005 + 4f8: 80 93 44 01 sts 0x0144, r24 + 4fc: 90 93 45 01 sts 0x0145, r25 + 500: 86 e6 ldi r24, 0x66 ; 102 + 502: 92 e2 ldi r25, 0x22 ; 34 + 504: 80 93 48 01 sts 0x0148, r24 + 508: 90 93 49 01 sts 0x0149, r25 + 50c: 10 92 4a 01 sts 0x014A, r1 + 510: 89 e3 ldi r24, 0x39 ; 57 + 512: 80 93 4c 01 sts 0x014C, r24 + 516: 20 93 4d 01 sts 0x014D, r18 + 51a: 10 92 4e 01 sts 0x014E, r1 + 51e: 80 81 ld r24, Z + 520: 80 68 ori r24, 0x80 ; 128 + 522: 80 83 st Z, r24 + 524: 08 95 ret + +00000526 : + 526: e0 e0 ldi r30, 0x00 ; 0 + 528: f1 e0 ldi r31, 0x01 ; 1 + 52a: 10 8a std Z+16, r1 ; 0x10 + 52c: 80 e4 ldi r24, 0x40 ; 64 + 52e: 80 8b std Z+16, r24 ; 0x10 + 530: 84 e0 ldi r24, 0x04 ; 4 + 532: 80 8b std Z+16, r24 ; 0x10 + 534: 11 8a std Z+17, r1 ; 0x11 + 536: 81 e9 ldi r24, 0x91 ; 145 + 538: 82 8b std Z+18, r24 ; 0x12 + 53a: 80 e1 ldi r24, 0x10 ; 16 + 53c: 83 8b std Z+19, r24 ; 0x13 + 53e: 87 e7 ldi r24, 0x77 ; 119 + 540: 91 e0 ldi r25, 0x01 ; 1 + 542: 84 8b std Z+20, r24 ; 0x14 + 544: 95 8b std Z+21, r25 ; 0x15 + 546: 84 e2 ldi r24, 0x24 ; 36 + 548: 80 8f std Z+24, r24 ; 0x18 + 54a: 82 e0 ldi r24, 0x02 ; 2 + 54c: 81 8f std Z+25, r24 ; 0x19 + 54e: 12 8e std Z+26, r1 ; 0x1a + 550: 40 91 c2 20 lds r20, 0x20C2 + 554: 2e ee ldi r18, 0xEE ; 238 + 556: 32 e0 ldi r19, 0x02 ; 2 + 558: 42 9f mul r20, r18 + 55a: c0 01 movw r24, r0 + 55c: 43 9f mul r20, r19 + 55e: 90 0d add r25, r0 + 560: 11 24 eor r1, r1 + 562: 8a 58 subi r24, 0x8A ; 138 + 564: 99 4d sbci r25, 0xD9 ; 217 + 566: 84 8f std Z+28, r24 ; 0x1c + 568: 40 91 c2 20 lds r20, 0x20C2 + 56c: 42 9f mul r20, r18 + 56e: c0 01 movw r24, r0 + 570: 43 9f mul r20, r19 + 572: 90 0d add r25, r0 + 574: 11 24 eor r1, r1 + 576: 8a 58 subi r24, 0x8A ; 138 + 578: 99 4d sbci r25, 0xD9 ; 217 + 57a: 95 8f std Z+29, r25 ; 0x1d + 57c: 16 8e std Z+30, r1 ; 0x1e + 57e: 80 89 ldd r24, Z+16 ; 0x10 + 580: 80 68 ori r24, 0x80 ; 128 + 582: 80 8b std Z+16, r24 ; 0x10 + 584: 08 95 ret + +00000586 : + 586: 81 e0 ldi r24, 0x01 ; 1 + 588: 80 93 00 20 sts 0x2000, r24 + 58c: 72 df rcall .-284 ; 0x472 + 58e: e0 e0 ldi r30, 0x00 ; 0 + 590: f1 e0 ldi r31, 0x01 ; 1 + 592: 10 aa std Z+48, r1 ; 0x30 + 594: 80 e4 ldi r24, 0x40 ; 64 + 596: 80 ab std Z+48, r24 ; 0x30 + 598: 84 e0 ldi r24, 0x04 ; 4 + 59a: 80 ab std Z+48, r24 ; 0x30 + 59c: 11 aa std Z+49, r1 ; 0x31 + 59e: 12 aa std Z+50, r1 ; 0x32 + 5a0: 8b e4 ldi r24, 0x4B ; 75 + 5a2: 83 ab std Z+51, r24 ; 0x33 + 5a4: 14 aa std Z+52, r1 ; 0x34 + 5a6: 15 aa std Z+53, r1 ; 0x35 + 5a8: 16 aa std Z+54, r1 ; 0x36 + 5aa: 81 e0 ldi r24, 0x01 ; 1 + 5ac: 90 e2 ldi r25, 0x20 ; 32 + 5ae: 80 af std Z+56, r24 ; 0x38 + 5b0: 91 af std Z+57, r25 ; 0x39 + 5b2: 12 ae std Z+58, r1 ; 0x3a + 5b4: 80 ea ldi r24, 0xA0 ; 160 + 5b6: 84 af std Z+60, r24 ; 0x3c + 5b8: 88 e0 ldi r24, 0x08 ; 8 + 5ba: 80 93 3d 01 sts 0x013D, r24 + 5be: 10 92 3e 01 sts 0x013E, r1 + 5c2: 80 a9 ldd r24, Z+48 ; 0x30 + 5c4: 80 6a ori r24, 0xA0 ; 160 + 5c6: 80 ab std Z+48, r24 ; 0x30 + 5c8: 85 e5 ldi r24, 0x55 ; 85 + 5ca: 80 93 a0 08 sts 0x08A0, r24 + 5ce: 10 92 46 01 sts 0x0146, r1 + 5d2: e0 e4 ldi r30, 0x40 ; 64 + 5d4: f1 e0 ldi r31, 0x01 ; 1 + 5d6: 84 e2 ldi r24, 0x24 ; 36 + 5d8: 80 83 st Z, r24 + 5da: 10 92 41 01 sts 0x0141, r1 + 5de: 89 e5 ldi r24, 0x59 ; 89 + 5e0: 80 93 42 01 sts 0x0142, r24 + 5e4: 82 e0 ldi r24, 0x02 ; 2 + 5e6: 80 93 43 01 sts 0x0143, r24 + 5ea: 80 91 02 20 lds r24, 0x2002 + 5ee: 90 91 03 20 lds r25, 0x2003 + 5f2: 80 93 44 01 sts 0x0144, r24 + 5f6: 90 93 45 01 sts 0x0145, r25 + 5fa: 86 e6 ldi r24, 0x66 ; 102 + 5fc: 92 e2 ldi r25, 0x22 ; 34 + 5fe: 80 93 48 01 sts 0x0148, r24 + 602: 90 93 49 01 sts 0x0149, r25 + 606: 10 92 4a 01 sts 0x014A, r1 + 60a: 8b e3 ldi r24, 0x3B ; 59 + 60c: 80 93 4c 01 sts 0x014C, r24 + 610: 83 e0 ldi r24, 0x03 ; 3 + 612: 80 93 4d 01 sts 0x014D, r24 + 616: 10 92 4e 01 sts 0x014E, r1 + 61a: 80 81 ld r24, Z + 61c: 80 68 ori r24, 0x80 ; 128 + 61e: 80 83 st Z, r24 + 620: 08 95 ret + +00000622 : + 622: e0 e0 ldi r30, 0x00 ; 0 + 624: f1 e0 ldi r31, 0x01 ; 1 + 626: 10 8a std Z+16, r1 ; 0x10 + 628: a0 e4 ldi r26, 0x40 ; 64 + 62a: a0 8b std Z+16, r26 ; 0x10 + 62c: 74 e0 ldi r23, 0x04 ; 4 + 62e: 70 8b std Z+16, r23 ; 0x10 + 630: 11 8a std Z+17, r1 ; 0x11 + 632: 61 e9 ldi r22, 0x91 ; 145 + 634: 62 8b std Z+18, r22 ; 0x12 + 636: 80 e1 ldi r24, 0x10 ; 16 + 638: 83 8b std Z+19, r24 ; 0x13 + 63a: 47 e7 ldi r20, 0x77 ; 119 + 63c: 51 e0 ldi r21, 0x01 ; 1 + 63e: 44 8b std Z+20, r20 ; 0x14 + 640: 55 8b std Z+21, r21 ; 0x15 + 642: 84 e2 ldi r24, 0x24 ; 36 + 644: 80 8f std Z+24, r24 ; 0x18 + 646: 82 e0 ldi r24, 0x02 ; 2 + 648: 81 8f std Z+25, r24 ; 0x19 + 64a: 12 8e std Z+26, r1 ; 0x1a + 64c: b0 91 c2 20 lds r27, 0x20C2 + 650: 8e ee ldi r24, 0xEE ; 238 + 652: 92 e0 ldi r25, 0x02 ; 2 + 654: b8 9f mul r27, r24 + 656: 90 01 movw r18, r0 + 658: b9 9f mul r27, r25 + 65a: 30 0d add r19, r0 + 65c: 11 24 eor r1, r1 + 65e: 2a 58 subi r18, 0x8A ; 138 + 660: 39 4d sbci r19, 0xD9 ; 217 + 662: 24 8f std Z+28, r18 ; 0x1c + 664: b0 91 c2 20 lds r27, 0x20C2 + 668: b8 9f mul r27, r24 + 66a: 90 01 movw r18, r0 + 66c: b9 9f mul r27, r25 + 66e: 30 0d add r19, r0 + 670: 11 24 eor r1, r1 + 672: 2a 58 subi r18, 0x8A ; 138 + 674: 39 4d sbci r19, 0xD9 ; 217 + 676: 35 8f std Z+29, r19 ; 0x1d + 678: 16 8e std Z+30, r1 ; 0x1e + 67a: 20 89 ldd r18, Z+16 ; 0x10 + 67c: 20 68 ori r18, 0x80 ; 128 + 67e: 20 8b std Z+16, r18 ; 0x10 + 680: 10 a2 std Z+32, r1 ; 0x20 + 682: a0 a3 std Z+32, r26 ; 0x20 + 684: 70 a3 std Z+32, r23 ; 0x20 + 686: 11 a2 std Z+33, r1 ; 0x21 + 688: 62 a3 std Z+34, r22 ; 0x22 + 68a: 2b e4 ldi r18, 0x4B ; 75 + 68c: 23 a3 std Z+35, r18 ; 0x23 + 68e: 44 a3 std Z+36, r20 ; 0x24 + 690: 55 a3 std Z+37, r21 ; 0x25 + 692: 20 ea ldi r18, 0xA0 ; 160 + 694: 20 a7 std Z+40, r18 ; 0x28 + 696: 28 e0 ldi r18, 0x08 ; 8 + 698: 21 a7 std Z+41, r18 ; 0x29 + 69a: 12 a6 std Z+42, r1 ; 0x2a + 69c: 40 91 c2 20 lds r20, 0x20C2 + 6a0: 48 9f mul r20, r24 + 6a2: 90 01 movw r18, r0 + 6a4: 49 9f mul r20, r25 + 6a6: 30 0d add r19, r0 + 6a8: 11 24 eor r1, r1 + 6aa: 23 51 subi r18, 0x13 ; 19 + 6ac: 38 4d sbci r19, 0xD8 ; 216 + 6ae: 24 a7 std Z+44, r18 ; 0x2c + 6b0: 40 91 c2 20 lds r20, 0x20C2 + 6b4: 48 9f mul r20, r24 + 6b6: 90 01 movw r18, r0 + 6b8: 49 9f mul r20, r25 + 6ba: 30 0d add r19, r0 + 6bc: 11 24 eor r1, r1 + 6be: 23 51 subi r18, 0x13 ; 19 + 6c0: 38 4d sbci r19, 0xD8 ; 216 + 6c2: 35 a7 std Z+45, r19 ; 0x2d + 6c4: 16 a6 std Z+46, r1 ; 0x2e + 6c6: 80 a1 ldd r24, Z+32 ; 0x20 + 6c8: 80 68 ori r24, 0x80 ; 128 + 6ca: 80 a3 std Z+32, r24 ; 0x20 + 6cc: 08 95 ret + +000006ce : + 6ce: cf 93 push r28 + 6d0: c2 e0 ldi r28, 0x02 ; 2 + 6d2: c0 93 00 20 sts 0x2000, r28 + 6d6: cd de rcall .-614 ; 0x472 + 6d8: e0 e0 ldi r30, 0x00 ; 0 + 6da: f1 e0 ldi r31, 0x01 ; 1 + 6dc: 16 aa std Z+54, r1 ; 0x36 + 6de: 44 e2 ldi r20, 0x24 ; 36 + 6e0: 40 ab std Z+48, r20 ; 0x30 + 6e2: 11 aa std Z+49, r1 ; 0x31 + 6e4: 39 e5 ldi r19, 0x59 ; 89 + 6e6: 32 ab std Z+50, r19 ; 0x32 + 6e8: 23 e0 ldi r18, 0x03 ; 3 + 6ea: 23 ab std Z+51, r18 ; 0x33 + 6ec: 80 91 04 20 lds r24, 0x2004 + 6f0: 90 91 05 20 lds r25, 0x2005 + 6f4: 84 ab std Z+52, r24 ; 0x34 + 6f6: 95 ab std Z+53, r25 ; 0x35 + 6f8: 86 e6 ldi r24, 0x66 ; 102 + 6fa: 92 e2 ldi r25, 0x22 ; 34 + 6fc: 80 af std Z+56, r24 ; 0x38 + 6fe: 91 af std Z+57, r25 ; 0x39 + 700: 12 ae std Z+58, r1 ; 0x3a + 702: 89 e3 ldi r24, 0x39 ; 57 + 704: 84 af std Z+60, r24 ; 0x3c + 706: 20 93 3d 01 sts 0x013D, r18 + 70a: 10 92 3e 01 sts 0x013E, r1 + 70e: 80 a9 ldd r24, Z+48 ; 0x30 + 710: 80 68 ori r24, 0x80 ; 128 + 712: 80 ab std Z+48, r24 ; 0x30 + 714: 10 92 46 01 sts 0x0146, r1 + 718: e0 e4 ldi r30, 0x40 ; 64 + 71a: f1 e0 ldi r31, 0x01 ; 1 + 71c: 40 83 st Z, r20 + 71e: 10 92 41 01 sts 0x0141, r1 + 722: 30 93 42 01 sts 0x0142, r19 + 726: c0 93 43 01 sts 0x0143, r28 + 72a: 80 91 02 20 lds r24, 0x2002 + 72e: 90 91 03 20 lds r25, 0x2003 + 732: 80 93 44 01 sts 0x0144, r24 + 736: 90 93 45 01 sts 0x0145, r25 + 73a: 86 e7 ldi r24, 0x76 ; 118 + 73c: 94 e2 ldi r25, 0x24 ; 36 + 73e: 80 93 48 01 sts 0x0148, r24 + 742: 90 93 49 01 sts 0x0149, r25 + 746: 10 92 4a 01 sts 0x014A, r1 + 74a: 8b e3 ldi r24, 0x3B ; 59 + 74c: 80 93 4c 01 sts 0x014C, r24 + 750: 20 93 4d 01 sts 0x014D, r18 + 754: 10 92 4e 01 sts 0x014E, r1 + 758: 80 81 ld r24, Z + 75a: 80 68 ori r24, 0x80 ; 128 + 75c: 80 83 st Z, r24 + 75e: cf 91 pop r28 + 760: 08 95 ret + +00000762 : + 762: cf 93 push r28 + 764: e0 e0 ldi r30, 0x00 ; 0 + 766: f1 e0 ldi r31, 0x01 ; 1 + 768: 10 8a std Z+16, r1 ; 0x10 + 76a: b0 e4 ldi r27, 0x40 ; 64 + 76c: b0 8b std Z+16, r27 ; 0x10 + 76e: a4 e0 ldi r26, 0x04 ; 4 + 770: a0 8b std Z+16, r26 ; 0x10 + 772: 11 8a std Z+17, r1 ; 0x11 + 774: 71 e9 ldi r23, 0x91 ; 145 + 776: 72 8b std Z+18, r23 ; 0x12 + 778: 80 e1 ldi r24, 0x10 ; 16 + 77a: 83 8b std Z+19, r24 ; 0x13 + 77c: 47 e7 ldi r20, 0x77 ; 119 + 77e: 51 e0 ldi r21, 0x01 ; 1 + 780: 44 8b std Z+20, r20 ; 0x14 + 782: 55 8b std Z+21, r21 ; 0x15 + 784: 84 e2 ldi r24, 0x24 ; 36 + 786: 80 8f std Z+24, r24 ; 0x18 + 788: 62 e0 ldi r22, 0x02 ; 2 + 78a: 61 8f std Z+25, r22 ; 0x19 + 78c: 12 8e std Z+26, r1 ; 0x1a + 78e: c0 91 c2 20 lds r28, 0x20C2 + 792: 8e ee ldi r24, 0xEE ; 238 + 794: 92 e0 ldi r25, 0x02 ; 2 + 796: c8 9f mul r28, r24 + 798: 90 01 movw r18, r0 + 79a: c9 9f mul r28, r25 + 79c: 30 0d add r19, r0 + 79e: 11 24 eor r1, r1 + 7a0: 2a 58 subi r18, 0x8A ; 138 + 7a2: 39 4d sbci r19, 0xD9 ; 217 + 7a4: 24 8f std Z+28, r18 ; 0x1c + 7a6: c0 91 c2 20 lds r28, 0x20C2 + 7aa: c8 9f mul r28, r24 + 7ac: 90 01 movw r18, r0 + 7ae: c9 9f mul r28, r25 + 7b0: 30 0d add r19, r0 + 7b2: 11 24 eor r1, r1 + 7b4: 2a 58 subi r18, 0x8A ; 138 + 7b6: 39 4d sbci r19, 0xD9 ; 217 + 7b8: 35 8f std Z+29, r19 ; 0x1d + 7ba: 16 8e std Z+30, r1 ; 0x1e + 7bc: 20 89 ldd r18, Z+16 ; 0x10 + 7be: 20 68 ori r18, 0x80 ; 128 + 7c0: 20 8b std Z+16, r18 ; 0x10 + 7c2: 10 a2 std Z+32, r1 ; 0x20 + 7c4: b0 a3 std Z+32, r27 ; 0x20 + 7c6: a0 a3 std Z+32, r26 ; 0x20 + 7c8: 11 a2 std Z+33, r1 ; 0x21 + 7ca: 72 a3 std Z+34, r23 ; 0x22 + 7cc: 22 e1 ldi r18, 0x12 ; 18 + 7ce: 23 a3 std Z+35, r18 ; 0x23 + 7d0: 44 a3 std Z+36, r20 ; 0x24 + 7d2: 55 a3 std Z+37, r21 ; 0x25 + 7d4: 24 e3 ldi r18, 0x34 ; 52 + 7d6: 20 a7 std Z+40, r18 ; 0x28 + 7d8: 61 a7 std Z+41, r22 ; 0x29 + 7da: 12 a6 std Z+42, r1 ; 0x2a + 7dc: 40 91 c2 20 lds r20, 0x20C2 + 7e0: 48 9f mul r20, r24 + 7e2: 90 01 movw r18, r0 + 7e4: 49 9f mul r20, r25 + 7e6: 30 0d add r19, r0 + 7e8: 11 24 eor r1, r1 + 7ea: 23 51 subi r18, 0x13 ; 19 + 7ec: 38 4d sbci r19, 0xD8 ; 216 + 7ee: 24 a7 std Z+44, r18 ; 0x2c + 7f0: 40 91 c2 20 lds r20, 0x20C2 + 7f4: 48 9f mul r20, r24 + 7f6: 90 01 movw r18, r0 + 7f8: 49 9f mul r20, r25 + 7fa: 30 0d add r19, r0 + 7fc: 11 24 eor r1, r1 + 7fe: 23 51 subi r18, 0x13 ; 19 + 800: 38 4d sbci r19, 0xD8 ; 216 + 802: 35 a7 std Z+45, r19 ; 0x2d + 804: 16 a6 std Z+46, r1 ; 0x2e + 806: 80 a1 ldd r24, Z+32 ; 0x20 + 808: 80 68 ori r24, 0x80 ; 128 + 80a: 80 a3 std Z+32, r24 ; 0x20 + 80c: cf 91 pop r28 + 80e: 08 95 ret + +00000810 : + 810: cf 93 push r28 + 812: c3 e0 ldi r28, 0x03 ; 3 + 814: c0 93 00 20 sts 0x2000, r28 + 818: 2c de rcall .-936 ; 0x472 + 81a: e0 e0 ldi r30, 0x00 ; 0 + 81c: f1 e0 ldi r31, 0x01 ; 1 + 81e: 10 a2 std Z+32, r1 ; 0x20 + 820: 80 e4 ldi r24, 0x40 ; 64 + 822: 80 a3 std Z+32, r24 ; 0x20 + 824: 84 e0 ldi r24, 0x04 ; 4 + 826: 80 a3 std Z+32, r24 ; 0x20 + 828: 11 a2 std Z+33, r1 ; 0x21 + 82a: 12 a2 std Z+34, r1 ; 0x22 + 82c: 8b e4 ldi r24, 0x4B ; 75 + 82e: 83 a3 std Z+35, r24 ; 0x23 + 830: 14 a2 std Z+36, r1 ; 0x24 + 832: 15 a2 std Z+37, r1 ; 0x25 + 834: 16 a2 std Z+38, r1 ; 0x26 + 836: 81 e0 ldi r24, 0x01 ; 1 + 838: 90 e2 ldi r25, 0x20 ; 32 + 83a: 80 a7 std Z+40, r24 ; 0x28 + 83c: 91 a7 std Z+41, r25 ; 0x29 + 83e: 12 a6 std Z+42, r1 ; 0x2a + 840: 80 ea ldi r24, 0xA0 ; 160 + 842: 84 a7 std Z+44, r24 ; 0x2c + 844: 88 e0 ldi r24, 0x08 ; 8 + 846: 85 a7 std Z+45, r24 ; 0x2d + 848: 16 a6 std Z+46, r1 ; 0x2e + 84a: 80 a1 ldd r24, Z+32 ; 0x20 + 84c: 80 6a ori r24, 0xA0 ; 160 + 84e: 80 a3 std Z+32, r24 ; 0x20 + 850: 85 e5 ldi r24, 0x55 ; 85 + 852: 80 93 a0 08 sts 0x08A0, r24 + 856: 16 aa std Z+54, r1 ; 0x36 + 858: 34 e2 ldi r19, 0x24 ; 36 + 85a: 30 ab std Z+48, r19 ; 0x30 + 85c: 11 aa std Z+49, r1 ; 0x31 + 85e: 29 e5 ldi r18, 0x59 ; 89 + 860: 22 ab std Z+50, r18 ; 0x32 + 862: 82 e0 ldi r24, 0x02 ; 2 + 864: 83 ab std Z+51, r24 ; 0x33 + 866: 80 91 02 20 lds r24, 0x2002 + 86a: 90 91 03 20 lds r25, 0x2003 + 86e: 84 ab std Z+52, r24 ; 0x34 + 870: 95 ab std Z+53, r25 ; 0x35 + 872: 86 e7 ldi r24, 0x76 ; 118 + 874: 94 e2 ldi r25, 0x24 ; 36 + 876: 80 af std Z+56, r24 ; 0x38 + 878: 91 af std Z+57, r25 ; 0x39 + 87a: 12 ae std Z+58, r1 ; 0x3a + 87c: 8b e3 ldi r24, 0x3B ; 59 + 87e: 84 af std Z+60, r24 ; 0x3c + 880: c0 93 3d 01 sts 0x013D, r28 + 884: 10 92 3e 01 sts 0x013E, r1 + 888: 80 a9 ldd r24, Z+48 ; 0x30 + 88a: 80 68 ori r24, 0x80 ; 128 + 88c: 80 ab std Z+48, r24 ; 0x30 + 88e: 10 92 46 01 sts 0x0146, r1 + 892: e0 e4 ldi r30, 0x40 ; 64 + 894: f1 e0 ldi r31, 0x01 ; 1 + 896: 30 83 st Z, r19 + 898: 10 92 41 01 sts 0x0141, r1 + 89c: 20 93 42 01 sts 0x0142, r18 + 8a0: c0 93 43 01 sts 0x0143, r28 + 8a4: 80 91 04 20 lds r24, 0x2004 + 8a8: 90 91 05 20 lds r25, 0x2005 + 8ac: 80 93 44 01 sts 0x0144, r24 + 8b0: 90 93 45 01 sts 0x0145, r25 + 8b4: 86 e6 ldi r24, 0x66 ; 102 + 8b6: 92 e2 ldi r25, 0x22 ; 34 + 8b8: 80 93 48 01 sts 0x0148, r24 + 8bc: 90 93 49 01 sts 0x0149, r25 + 8c0: 10 92 4a 01 sts 0x014A, r1 + 8c4: 89 e3 ldi r24, 0x39 ; 57 + 8c6: 80 93 4c 01 sts 0x014C, r24 + 8ca: c0 93 4d 01 sts 0x014D, r28 + 8ce: 10 92 4e 01 sts 0x014E, r1 + 8d2: 80 81 ld r24, Z + 8d4: 80 68 ori r24, 0x80 ; 128 + 8d6: 80 83 st Z, r24 + 8d8: cf 91 pop r28 + 8da: 08 95 ret + +000008dc : + 8dc: e0 e0 ldi r30, 0x00 ; 0 + 8de: f1 e0 ldi r31, 0x01 ; 1 + 8e0: 10 8a std Z+16, r1 ; 0x10 + 8e2: 80 e4 ldi r24, 0x40 ; 64 + 8e4: 80 8b std Z+16, r24 ; 0x10 + 8e6: 84 e0 ldi r24, 0x04 ; 4 + 8e8: 80 8b std Z+16, r24 ; 0x10 + 8ea: 11 8a std Z+17, r1 ; 0x11 + 8ec: 81 e9 ldi r24, 0x91 ; 145 + 8ee: 82 8b std Z+18, r24 ; 0x12 + 8f0: 8b e4 ldi r24, 0x4B ; 75 + 8f2: 83 8b std Z+19, r24 ; 0x13 + 8f4: 87 e7 ldi r24, 0x77 ; 119 + 8f6: 91 e0 ldi r25, 0x01 ; 1 + 8f8: 84 8b std Z+20, r24 ; 0x14 + 8fa: 95 8b std Z+21, r25 ; 0x15 + 8fc: 80 ea ldi r24, 0xA0 ; 160 + 8fe: 80 8f std Z+24, r24 ; 0x18 + 900: 88 e0 ldi r24, 0x08 ; 8 + 902: 81 8f std Z+25, r24 ; 0x19 + 904: 12 8e std Z+26, r1 ; 0x1a + 906: 40 91 c2 20 lds r20, 0x20C2 + 90a: 2e ee ldi r18, 0xEE ; 238 + 90c: 32 e0 ldi r19, 0x02 ; 2 + 90e: 42 9f mul r20, r18 + 910: c0 01 movw r24, r0 + 912: 43 9f mul r20, r19 + 914: 90 0d add r25, r0 + 916: 11 24 eor r1, r1 + 918: 8a 58 subi r24, 0x8A ; 138 + 91a: 99 4d sbci r25, 0xD9 ; 217 + 91c: 84 8f std Z+28, r24 ; 0x1c + 91e: 40 91 c2 20 lds r20, 0x20C2 + 922: 42 9f mul r20, r18 + 924: c0 01 movw r24, r0 + 926: 43 9f mul r20, r19 + 928: 90 0d add r25, r0 + 92a: 11 24 eor r1, r1 + 92c: 8a 58 subi r24, 0x8A ; 138 + 92e: 99 4d sbci r25, 0xD9 ; 217 + 930: 95 8f std Z+29, r25 ; 0x1d + 932: 16 8e std Z+30, r1 ; 0x1e + 934: 80 89 ldd r24, Z+16 ; 0x10 + 936: 80 68 ori r24, 0x80 ; 128 + 938: 80 8b std Z+16, r24 ; 0x10 + 93a: 08 95 ret + +0000093c : + 93c: cf 93 push r28 + 93e: c4 e0 ldi r28, 0x04 ; 4 + 940: c0 93 00 20 sts 0x2000, r28 + 944: 96 dd rcall .-1236 ; 0x472 + 946: e0 e0 ldi r30, 0x00 ; 0 + 948: f1 e0 ldi r31, 0x01 ; 1 + 94a: 10 a2 std Z+32, r1 ; 0x20 + 94c: 80 e4 ldi r24, 0x40 ; 64 + 94e: 80 a3 std Z+32, r24 ; 0x20 + 950: c0 a3 std Z+32, r28 ; 0x20 + 952: 11 a2 std Z+33, r1 ; 0x21 + 954: 12 a2 std Z+34, r1 ; 0x22 + 956: 8b e4 ldi r24, 0x4B ; 75 + 958: 83 a3 std Z+35, r24 ; 0x23 + 95a: 14 a2 std Z+36, r1 ; 0x24 + 95c: 15 a2 std Z+37, r1 ; 0x25 + 95e: 16 a2 std Z+38, r1 ; 0x26 + 960: 81 e0 ldi r24, 0x01 ; 1 + 962: 90 e2 ldi r25, 0x20 ; 32 + 964: 80 a7 std Z+40, r24 ; 0x28 + 966: 91 a7 std Z+41, r25 ; 0x29 + 968: 12 a6 std Z+42, r1 ; 0x2a + 96a: 80 ea ldi r24, 0xA0 ; 160 + 96c: 84 a7 std Z+44, r24 ; 0x2c + 96e: 88 e0 ldi r24, 0x08 ; 8 + 970: 85 a7 std Z+45, r24 ; 0x2d + 972: 16 a6 std Z+46, r1 ; 0x2e + 974: 80 a1 ldd r24, Z+32 ; 0x20 + 976: 80 6a ori r24, 0xA0 ; 160 + 978: 80 a3 std Z+32, r24 ; 0x20 + 97a: 85 e5 ldi r24, 0x55 ; 85 + 97c: 80 93 a0 08 sts 0x08A0, r24 + 980: 16 aa std Z+54, r1 ; 0x36 + 982: 44 e2 ldi r20, 0x24 ; 36 + 984: 40 ab std Z+48, r20 ; 0x30 + 986: 11 aa std Z+49, r1 ; 0x31 + 988: 39 e5 ldi r19, 0x59 ; 89 + 98a: 32 ab std Z+50, r19 ; 0x32 + 98c: 23 e0 ldi r18, 0x03 ; 3 + 98e: 23 ab std Z+51, r18 ; 0x33 + 990: 80 91 04 20 lds r24, 0x2004 + 994: 90 91 05 20 lds r25, 0x2005 + 998: 84 ab std Z+52, r24 ; 0x34 + 99a: 95 ab std Z+53, r25 ; 0x35 + 99c: 86 e6 ldi r24, 0x66 ; 102 + 99e: 92 e2 ldi r25, 0x22 ; 34 + 9a0: 80 af std Z+56, r24 ; 0x38 + 9a2: 91 af std Z+57, r25 ; 0x39 + 9a4: 12 ae std Z+58, r1 ; 0x3a + 9a6: 89 e3 ldi r24, 0x39 ; 57 + 9a8: 84 af std Z+60, r24 ; 0x3c + 9aa: 20 93 3d 01 sts 0x013D, r18 + 9ae: 10 92 3e 01 sts 0x013E, r1 + 9b2: 80 a9 ldd r24, Z+48 ; 0x30 + 9b4: 80 68 ori r24, 0x80 ; 128 + 9b6: 80 ab std Z+48, r24 ; 0x30 + 9b8: 10 92 46 01 sts 0x0146, r1 + 9bc: e0 e4 ldi r30, 0x40 ; 64 + 9be: f1 e0 ldi r31, 0x01 ; 1 + 9c0: 40 83 st Z, r20 + 9c2: 10 92 41 01 sts 0x0141, r1 + 9c6: 30 93 42 01 sts 0x0142, r19 + 9ca: 82 e0 ldi r24, 0x02 ; 2 + 9cc: 80 93 43 01 sts 0x0143, r24 + 9d0: 80 91 02 20 lds r24, 0x2002 + 9d4: 90 91 03 20 lds r25, 0x2003 + 9d8: 80 93 44 01 sts 0x0144, r24 + 9dc: 90 93 45 01 sts 0x0145, r25 + 9e0: 86 e7 ldi r24, 0x76 ; 118 + 9e2: 94 e2 ldi r25, 0x24 ; 36 + 9e4: 80 93 48 01 sts 0x0148, r24 + 9e8: 90 93 49 01 sts 0x0149, r25 + 9ec: 10 92 4a 01 sts 0x014A, r1 + 9f0: 8b e3 ldi r24, 0x3B ; 59 + 9f2: 80 93 4c 01 sts 0x014C, r24 + 9f6: 20 93 4d 01 sts 0x014D, r18 + 9fa: 10 92 4e 01 sts 0x014E, r1 + 9fe: 80 81 ld r24, Z + a00: 80 68 ori r24, 0x80 ; 128 + a02: 80 83 st Z, r24 + a04: cf 91 pop r28 + a06: 08 95 ret + +00000a08 : + a08: cf 93 push r28 + a0a: e0 e0 ldi r30, 0x00 ; 0 + a0c: f1 e0 ldi r31, 0x01 ; 1 + a0e: 10 8a std Z+16, r1 ; 0x10 + a10: b0 e4 ldi r27, 0x40 ; 64 + a12: b0 8b std Z+16, r27 ; 0x10 + a14: a4 e0 ldi r26, 0x04 ; 4 + a16: a0 8b std Z+16, r26 ; 0x10 + a18: 11 8a std Z+17, r1 ; 0x11 + a1a: 71 e9 ldi r23, 0x91 ; 145 + a1c: 72 8b std Z+18, r23 ; 0x12 + a1e: 8b e4 ldi r24, 0x4B ; 75 + a20: 83 8b std Z+19, r24 ; 0x13 + a22: 47 e7 ldi r20, 0x77 ; 119 + a24: 51 e0 ldi r21, 0x01 ; 1 + a26: 44 8b std Z+20, r20 ; 0x14 + a28: 55 8b std Z+21, r21 ; 0x15 + a2a: 80 ea ldi r24, 0xA0 ; 160 + a2c: 80 8f std Z+24, r24 ; 0x18 + a2e: 68 e0 ldi r22, 0x08 ; 8 + a30: 61 8f std Z+25, r22 ; 0x19 + a32: 12 8e std Z+26, r1 ; 0x1a + a34: c0 91 c2 20 lds r28, 0x20C2 + a38: 8e ee ldi r24, 0xEE ; 238 + a3a: 92 e0 ldi r25, 0x02 ; 2 + a3c: c8 9f mul r28, r24 + a3e: 90 01 movw r18, r0 + a40: c9 9f mul r28, r25 + a42: 30 0d add r19, r0 + a44: 11 24 eor r1, r1 + a46: 2a 58 subi r18, 0x8A ; 138 + a48: 39 4d sbci r19, 0xD9 ; 217 + a4a: 24 8f std Z+28, r18 ; 0x1c + a4c: c0 91 c2 20 lds r28, 0x20C2 + a50: c8 9f mul r28, r24 + a52: 90 01 movw r18, r0 + a54: c9 9f mul r28, r25 + a56: 30 0d add r19, r0 + a58: 11 24 eor r1, r1 + a5a: 2a 58 subi r18, 0x8A ; 138 + a5c: 39 4d sbci r19, 0xD9 ; 217 + a5e: 35 8f std Z+29, r19 ; 0x1d + a60: 16 8e std Z+30, r1 ; 0x1e + a62: 20 89 ldd r18, Z+16 ; 0x10 + a64: 20 68 ori r18, 0x80 ; 128 + a66: 20 8b std Z+16, r18 ; 0x10 + a68: 10 aa std Z+48, r1 ; 0x30 + a6a: b0 ab std Z+48, r27 ; 0x30 + a6c: a0 ab std Z+48, r26 ; 0x30 + a6e: 11 aa std Z+49, r1 ; 0x31 + a70: 72 ab std Z+50, r23 ; 0x32 + a72: 2a e4 ldi r18, 0x4A ; 74 + a74: 23 ab std Z+51, r18 ; 0x33 + a76: 44 ab std Z+52, r20 ; 0x34 + a78: 55 ab std Z+53, r21 ; 0x35 + a7a: 23 ec ldi r18, 0xC3 ; 195 + a7c: 20 af std Z+56, r18 ; 0x38 + a7e: 61 af std Z+57, r22 ; 0x39 + a80: 12 ae std Z+58, r1 ; 0x3a + a82: 40 91 c2 20 lds r20, 0x20C2 + a86: 48 9f mul r20, r24 + a88: 90 01 movw r18, r0 + a8a: 49 9f mul r20, r25 + a8c: 30 0d add r19, r0 + a8e: 11 24 eor r1, r1 + a90: 23 51 subi r18, 0x13 ; 19 + a92: 38 4d sbci r19, 0xD8 ; 216 + a94: 24 af std Z+60, r18 ; 0x3c + a96: 40 91 c2 20 lds r20, 0x20C2 + a9a: 48 9f mul r20, r24 + a9c: 90 01 movw r18, r0 + a9e: 49 9f mul r20, r25 + aa0: 30 0d add r19, r0 + aa2: 11 24 eor r1, r1 + aa4: 23 51 subi r18, 0x13 ; 19 + aa6: 38 4d sbci r19, 0xD8 ; 216 + aa8: 30 93 3d 01 sts 0x013D, r19 + aac: 10 92 3e 01 sts 0x013E, r1 + ab0: 80 a9 ldd r24, Z+48 ; 0x30 + ab2: 80 68 ori r24, 0x80 ; 128 + ab4: 80 ab std Z+48, r24 ; 0x30 + ab6: cf 91 pop r28 + ab8: 08 95 ret + +00000aba : + aba: 85 e0 ldi r24, 0x05 ; 5 + abc: 80 93 00 20 sts 0x2000, r24 + ac0: d8 dc rcall .-1616 ; 0x472 + ac2: e0 e0 ldi r30, 0x00 ; 0 + ac4: f1 e0 ldi r31, 0x01 ; 1 + ac6: 16 aa std Z+54, r1 ; 0x36 + ac8: 54 e2 ldi r21, 0x24 ; 36 + aca: 50 ab std Z+48, r21 ; 0x30 + acc: 11 aa std Z+49, r1 ; 0x31 + ace: 49 e5 ldi r20, 0x59 ; 89 + ad0: 42 ab std Z+50, r20 ; 0x32 + ad2: 23 e0 ldi r18, 0x03 ; 3 + ad4: 23 ab std Z+51, r18 ; 0x33 + ad6: 80 91 04 20 lds r24, 0x2004 + ada: 90 91 05 20 lds r25, 0x2005 + ade: 84 ab std Z+52, r24 ; 0x34 + ae0: 95 ab std Z+53, r25 ; 0x35 + ae2: 86 e6 ldi r24, 0x66 ; 102 + ae4: 92 e2 ldi r25, 0x22 ; 34 + ae6: 80 af std Z+56, r24 ; 0x38 + ae8: 91 af std Z+57, r25 ; 0x39 + aea: 12 ae std Z+58, r1 ; 0x3a + aec: 39 e3 ldi r19, 0x39 ; 57 + aee: 34 af std Z+60, r19 ; 0x3c + af0: 20 93 3d 01 sts 0x013D, r18 + af4: 10 92 3e 01 sts 0x013E, r1 + af8: 80 a9 ldd r24, Z+48 ; 0x30 + afa: 80 68 ori r24, 0x80 ; 128 + afc: 80 ab std Z+48, r24 ; 0x30 + afe: 10 92 46 01 sts 0x0146, r1 + b02: e0 e4 ldi r30, 0x40 ; 64 + b04: f1 e0 ldi r31, 0x01 ; 1 + b06: 50 83 st Z, r21 + b08: 10 92 41 01 sts 0x0141, r1 + b0c: 40 93 42 01 sts 0x0142, r20 + b10: 20 93 43 01 sts 0x0143, r18 + b14: 80 91 04 20 lds r24, 0x2004 + b18: 90 91 05 20 lds r25, 0x2005 + b1c: 80 93 44 01 sts 0x0144, r24 + b20: 90 93 45 01 sts 0x0145, r25 + b24: 86 e7 ldi r24, 0x76 ; 118 + b26: 96 e2 ldi r25, 0x26 ; 38 + b28: 80 93 48 01 sts 0x0148, r24 + b2c: 90 93 49 01 sts 0x0149, r25 + b30: 10 92 4a 01 sts 0x014A, r1 + b34: 30 93 4c 01 sts 0x014C, r19 + b38: 20 93 4d 01 sts 0x014D, r18 + b3c: 10 92 4e 01 sts 0x014E, r1 + b40: 80 81 ld r24, Z + b42: 80 68 ori r24, 0x80 ; 128 + b44: 80 83 st Z, r24 + b46: 08 95 ret + +00000b48 : + b48: 86 e0 ldi r24, 0x06 ; 6 + b4a: 80 93 00 20 sts 0x2000, r24 + b4e: 91 dc rcall .-1758 ; 0x472 + b50: e0 e0 ldi r30, 0x00 ; 0 + b52: f1 e0 ldi r31, 0x01 ; 1 + b54: 16 aa std Z+54, r1 ; 0x36 + b56: 44 e2 ldi r20, 0x24 ; 36 + b58: 40 ab std Z+48, r20 ; 0x30 + b5a: 11 aa std Z+49, r1 ; 0x31 + b5c: 39 e5 ldi r19, 0x59 ; 89 + b5e: 32 ab std Z+50, r19 ; 0x32 + b60: 23 e0 ldi r18, 0x03 ; 3 + b62: 23 ab std Z+51, r18 ; 0x33 + b64: 80 91 04 20 lds r24, 0x2004 + b68: 90 91 05 20 lds r25, 0x2005 + b6c: 84 ab std Z+52, r24 ; 0x34 + b6e: 95 ab std Z+53, r25 ; 0x35 + b70: 86 e6 ldi r24, 0x66 ; 102 + b72: 92 e2 ldi r25, 0x22 ; 34 + b74: 80 af std Z+56, r24 ; 0x38 + b76: 91 af std Z+57, r25 ; 0x39 + b78: 12 ae std Z+58, r1 ; 0x3a + b7a: 89 e3 ldi r24, 0x39 ; 57 + b7c: 84 af std Z+60, r24 ; 0x3c + b7e: 20 93 3d 01 sts 0x013D, r18 + b82: 10 92 3e 01 sts 0x013E, r1 + b86: 80 a9 ldd r24, Z+48 ; 0x30 + b88: 80 68 ori r24, 0x80 ; 128 + b8a: 80 ab std Z+48, r24 ; 0x30 + b8c: 10 92 46 01 sts 0x0146, r1 + b90: e0 e4 ldi r30, 0x40 ; 64 + b92: f1 e0 ldi r31, 0x01 ; 1 + b94: 40 83 st Z, r20 + b96: 10 92 41 01 sts 0x0141, r1 + b9a: 30 93 42 01 sts 0x0142, r19 + b9e: 82 e0 ldi r24, 0x02 ; 2 + ba0: 80 93 43 01 sts 0x0143, r24 + ba4: 80 91 02 20 lds r24, 0x2002 + ba8: 90 91 03 20 lds r25, 0x2003 + bac: 80 93 44 01 sts 0x0144, r24 + bb0: 90 93 45 01 sts 0x0145, r25 + bb4: 86 e7 ldi r24, 0x76 ; 118 + bb6: 94 e2 ldi r25, 0x24 ; 36 + bb8: 80 93 48 01 sts 0x0148, r24 + bbc: 90 93 49 01 sts 0x0149, r25 + bc0: 10 92 4a 01 sts 0x014A, r1 + bc4: 8b e3 ldi r24, 0x3B ; 59 + bc6: 80 93 4c 01 sts 0x014C, r24 + bca: 20 93 4d 01 sts 0x014D, r18 + bce: 10 92 4e 01 sts 0x014E, r1 + bd2: 80 81 ld r24, Z + bd4: 80 68 ori r24, 0x80 ; 128 + bd6: 80 83 st Z, r24 + bd8: 08 95 ret + +00000bda : + bda: e0 e0 ldi r30, 0x00 ; 0 + bdc: f1 e0 ldi r31, 0x01 ; 1 + bde: 10 8a std Z+16, r1 ; 0x10 + be0: 80 e4 ldi r24, 0x40 ; 64 + be2: 80 8b std Z+16, r24 ; 0x10 + be4: 84 e0 ldi r24, 0x04 ; 4 + be6: 80 8b std Z+16, r24 ; 0x10 + be8: 11 8a std Z+17, r1 ; 0x11 + bea: 81 e9 ldi r24, 0x91 ; 145 + bec: 82 8b std Z+18, r24 ; 0x12 + bee: 80 e1 ldi r24, 0x10 ; 16 + bf0: 83 8b std Z+19, r24 ; 0x13 + bf2: 2e ee ldi r18, 0xEE ; 238 + bf4: 32 e0 ldi r19, 0x02 ; 2 + bf6: 24 8b std Z+20, r18 ; 0x14 + bf8: 35 8b std Z+21, r19 ; 0x15 + bfa: 84 e2 ldi r24, 0x24 ; 36 + bfc: 80 8f std Z+24, r24 ; 0x18 + bfe: 82 e0 ldi r24, 0x02 ; 2 + c00: 81 8f std Z+25, r24 ; 0x19 + c02: 12 8e std Z+26, r1 ; 0x1a + c04: 40 91 c2 20 lds r20, 0x20C2 + c08: 42 9f mul r20, r18 + c0a: c0 01 movw r24, r0 + c0c: 43 9f mul r20, r19 + c0e: 90 0d add r25, r0 + c10: 11 24 eor r1, r1 + c12: 8a 58 subi r24, 0x8A ; 138 + c14: 99 4d sbci r25, 0xD9 ; 217 + c16: 84 8f std Z+28, r24 ; 0x1c + c18: 40 91 c2 20 lds r20, 0x20C2 + c1c: 42 9f mul r20, r18 + c1e: c0 01 movw r24, r0 + c20: 43 9f mul r20, r19 + c22: 90 0d add r25, r0 + c24: 11 24 eor r1, r1 + c26: 8a 58 subi r24, 0x8A ; 138 + c28: 99 4d sbci r25, 0xD9 ; 217 + c2a: 95 8f std Z+29, r25 ; 0x1d + c2c: 16 8e std Z+30, r1 ; 0x1e + c2e: 80 89 ldd r24, Z+16 ; 0x10 + c30: 80 68 ori r24, 0x80 ; 128 + c32: 80 8b std Z+16, r24 ; 0x10 + c34: 08 95 ret + +00000c36 : + c36: 87 e0 ldi r24, 0x07 ; 7 + c38: 80 93 00 20 sts 0x2000, r24 + c3c: 1a dc rcall .-1996 ; 0x472 + c3e: e0 e0 ldi r30, 0x00 ; 0 + c40: f1 e0 ldi r31, 0x01 ; 1 + c42: 16 aa std Z+54, r1 ; 0x36 + c44: 44 e2 ldi r20, 0x24 ; 36 + c46: 40 ab std Z+48, r20 ; 0x30 + c48: 11 aa std Z+49, r1 ; 0x31 + c4a: 39 e5 ldi r19, 0x59 ; 89 + c4c: 32 ab std Z+50, r19 ; 0x32 + c4e: 23 e0 ldi r18, 0x03 ; 3 + c50: 23 ab std Z+51, r18 ; 0x33 + c52: 80 91 04 20 lds r24, 0x2004 + c56: 90 91 05 20 lds r25, 0x2005 + c5a: 84 ab std Z+52, r24 ; 0x34 + c5c: 95 ab std Z+53, r25 ; 0x35 + c5e: 86 e6 ldi r24, 0x66 ; 102 + c60: 92 e2 ldi r25, 0x22 ; 34 + c62: 80 af std Z+56, r24 ; 0x38 + c64: 91 af std Z+57, r25 ; 0x39 + c66: 12 ae std Z+58, r1 ; 0x3a + c68: 89 e3 ldi r24, 0x39 ; 57 + c6a: 84 af std Z+60, r24 ; 0x3c + c6c: 20 93 3d 01 sts 0x013D, r18 + c70: 10 92 3e 01 sts 0x013E, r1 + c74: 80 a9 ldd r24, Z+48 ; 0x30 + c76: 80 68 ori r24, 0x80 ; 128 + c78: 80 ab std Z+48, r24 ; 0x30 + c7a: 10 92 46 01 sts 0x0146, r1 + c7e: e0 e4 ldi r30, 0x40 ; 64 + c80: f1 e0 ldi r31, 0x01 ; 1 + c82: 40 83 st Z, r20 + c84: 10 92 41 01 sts 0x0141, r1 + c88: 30 93 42 01 sts 0x0142, r19 + c8c: 82 e0 ldi r24, 0x02 ; 2 + c8e: 80 93 43 01 sts 0x0143, r24 + c92: 80 91 02 20 lds r24, 0x2002 + c96: 90 91 03 20 lds r25, 0x2003 + c9a: 80 93 44 01 sts 0x0144, r24 + c9e: 90 93 45 01 sts 0x0145, r25 + ca2: 86 e7 ldi r24, 0x76 ; 118 + ca4: 94 e2 ldi r25, 0x24 ; 36 + ca6: 80 93 48 01 sts 0x0148, r24 + caa: 90 93 49 01 sts 0x0149, r25 + cae: 10 92 4a 01 sts 0x014A, r1 + cb2: 8b e3 ldi r24, 0x3B ; 59 + cb4: 80 93 4c 01 sts 0x014C, r24 + cb8: 20 93 4d 01 sts 0x014D, r18 + cbc: 10 92 4e 01 sts 0x014E, r1 + cc0: 80 81 ld r24, Z + cc2: 80 68 ori r24, 0x80 ; 128 + cc4: 80 83 st Z, r24 + cc6: 08 95 ret + +00000cc8 : + cc8: e0 e0 ldi r30, 0x00 ; 0 + cca: f1 e0 ldi r31, 0x01 ; 1 + ccc: 10 8a std Z+16, r1 ; 0x10 + cce: 80 e4 ldi r24, 0x40 ; 64 + cd0: 80 8b std Z+16, r24 ; 0x10 + cd2: 85 e0 ldi r24, 0x05 ; 5 + cd4: 80 8b std Z+16, r24 ; 0x10 + cd6: 11 8a std Z+17, r1 ; 0x11 + cd8: 81 e9 ldi r24, 0x91 ; 145 + cda: 82 8b std Z+18, r24 ; 0x12 + cdc: 80 e1 ldi r24, 0x10 ; 16 + cde: 83 8b std Z+19, r24 ; 0x13 + ce0: 2e ee ldi r18, 0xEE ; 238 + ce2: 32 e0 ldi r19, 0x02 ; 2 + ce4: 24 8b std Z+20, r18 ; 0x14 + ce6: 35 8b std Z+21, r19 ; 0x15 + ce8: 84 e2 ldi r24, 0x24 ; 36 + cea: 80 8f std Z+24, r24 ; 0x18 + cec: 82 e0 ldi r24, 0x02 ; 2 + cee: 81 8f std Z+25, r24 ; 0x19 + cf0: 12 8e std Z+26, r1 ; 0x1a + cf2: 40 91 c2 20 lds r20, 0x20C2 + cf6: 42 9f mul r20, r18 + cf8: c0 01 movw r24, r0 + cfa: 43 9f mul r20, r19 + cfc: 90 0d add r25, r0 + cfe: 11 24 eor r1, r1 + d00: 8a 58 subi r24, 0x8A ; 138 + d02: 99 4d sbci r25, 0xD9 ; 217 + d04: 84 8f std Z+28, r24 ; 0x1c + d06: 40 91 c2 20 lds r20, 0x20C2 + d0a: 42 9f mul r20, r18 + d0c: c0 01 movw r24, r0 + d0e: 43 9f mul r20, r19 + d10: 90 0d add r25, r0 + d12: 11 24 eor r1, r1 + d14: 8a 58 subi r24, 0x8A ; 138 + d16: 99 4d sbci r25, 0xD9 ; 217 + d18: 95 8f std Z+29, r25 ; 0x1d + d1a: 16 8e std Z+30, r1 ; 0x1e + d1c: 80 89 ldd r24, Z+16 ; 0x10 + d1e: 80 68 ori r24, 0x80 ; 128 + d20: 80 8b std Z+16, r24 ; 0x10 + d22: 08 95 ret + +00000d24 : + d24: e0 e7 ldi r30, 0x70 ; 112 + d26: f0 e0 ldi r31, 0x00 ; 0 + d28: 83 81 ldd r24, Z+3 ; 0x03 + d2a: 8c 7f andi r24, 0xFC ; 252 + d2c: 83 83 std Z+3, r24 ; 0x03 + d2e: 84 81 ldd r24, Z+4 ; 0x04 + d30: 8c 7f andi r24, 0xFC ; 252 + d32: 84 83 std Z+4, r24 ; 0x04 + d34: 80 81 ld r24, Z + d36: 8d 7f andi r24, 0xFD ; 253 + d38: 80 83 st Z, r24 + d3a: e0 e8 ldi r30, 0x80 ; 128 + d3c: f1 e0 ldi r31, 0x01 ; 1 + d3e: 80 ec ldi r24, 0xC0 ; 192 + d40: 82 83 std Z+2, r24 ; 0x02 + d42: 12 86 std Z+10, r1 ; 0x0a + d44: 88 ec ldi r24, 0xC8 ; 200 + d46: 81 83 std Z+1, r24 ; 0x01 + d48: 11 86 std Z+9, r1 ; 0x09 + d4a: e0 e0 ldi r30, 0x00 ; 0 + d4c: f8 e0 ldi r31, 0x08 ; 8 + d4e: 24 e0 ldi r18, 0x04 ; 4 + d50: 20 83 st Z, r18 + d52: 33 e0 ldi r19, 0x03 ; 3 + d54: 31 83 std Z+1, r19 ; 0x01 + d56: 14 82 std Z+4, r1 ; 0x04 + d58: 85 ed ldi r24, 0xD5 ; 213 + d5a: 91 e0 ldi r25, 0x01 ; 1 + d5c: 86 a3 std Z+38, r24 ; 0x26 + d5e: 97 a3 std Z+39, r25 ; 0x27 + d60: 16 82 std Z+6, r1 ; 0x06 + d62: e0 e4 ldi r30, 0x40 ; 64 + d64: f8 e0 ldi r31, 0x08 ; 8 + d66: 20 83 st Z, r18 + d68: 31 83 std Z+1, r19 ; 0x01 + d6a: 14 82 std Z+4, r1 ; 0x04 + d6c: 86 a3 std Z+38, r24 ; 0x26 + d6e: 97 a3 std Z+39, r25 ; 0x27 + d70: 16 82 std Z+6, r1 ; 0x06 + d72: e0 e6 ldi r30, 0x60 ; 96 + d74: f6 e0 ldi r31, 0x06 ; 6 + d76: 80 81 ld r24, Z + d78: 80 61 ori r24, 0x10 ; 16 + d7a: 80 83 st Z, r24 + d7c: e0 e4 ldi r30, 0x40 ; 64 + d7e: f9 e0 ldi r31, 0x09 ; 9 + d80: 83 e1 ldi r24, 0x13 ; 19 + d82: 81 83 std Z+1, r24 ; 0x01 + d84: 14 82 std Z+4, r1 ; 0x04 + d86: 81 e0 ldi r24, 0x01 ; 1 + d88: 86 83 std Z+6, r24 ; 0x06 + d8a: 80 e0 ldi r24, 0x00 ; 0 + d8c: 90 e1 ldi r25, 0x10 ; 16 + d8e: 86 a3 std Z+38, r24 ; 0x26 + d90: 97 a3 std Z+39, r25 ; 0x27 + d92: 10 a6 std Z+40, r1 ; 0x28 + d94: 11 a6 std Z+41, r1 ; 0x29 + d96: 20 83 st Z, r18 + d98: 08 95 ret + +00000d9a <__vector_83>: + d9a: 1f 92 push r1 + d9c: 0f 92 push r0 + d9e: 0f b6 in r0, 0x3f ; 63 + da0: 0f 92 push r0 + da2: 11 24 eor r1, r1 + da4: 2f 93 push r18 + da6: 3f 93 push r19 + da8: 4f 93 push r20 + daa: 5f 93 push r21 + dac: 8f 93 push r24 + dae: 9f 93 push r25 + db0: cf 93 push r28 + db2: df 93 push r29 + db4: 1f 92 push r1 + db6: cd b7 in r28, 0x3d ; 61 + db8: de b7 in r29, 0x3e ; 62 + dba: 80 91 00 20 lds r24, 0x2000 + dbe: 87 30 cpi r24, 0x07 ; 7 + dc0: 31 f4 brne .+12 ; 0xdce <__vector_83+0x34> + dc2: 80 91 2c 02 lds r24, 0x022C + dc6: 89 83 std Y+1, r24 ; 0x01 + dc8: 80 91 2d 02 lds r24, 0x022D + dcc: 02 c0 rjmp .+4 ; 0xdd2 <__vector_83+0x38> + dce: 80 91 2c 02 lds r24, 0x022C + dd2: 40 91 c0 20 lds r20, 0x20C0 + dd6: 48 1b sub r20, r24 + dd8: 80 91 68 09 lds r24, 0x0968 + ddc: 90 91 69 09 lds r25, 0x0969 + de0: 42 30 cpi r20, 0x02 ; 2 + de2: 8c f0 brlt .+34 ; 0xe06 <__vector_83+0x6c> + de4: 84 3f cpi r24, 0xF4 ; 244 + de6: 9f 40 sbci r25, 0x0F ; 15 + de8: 70 f4 brcc .+28 ; 0xe06 <__vector_83+0x6c> + dea: 20 91 68 09 lds r18, 0x0968 + dee: 30 91 69 09 lds r19, 0x0969 + df2: 49 30 cpi r20, 0x09 ; 9 + df4: 1c f0 brlt .+6 ; 0xdfc <__vector_83+0x62> + df6: 8c e0 ldi r24, 0x0C ; 12 + df8: 90 e0 ldi r25, 0x00 ; 0 + dfa: 02 c0 rjmp .+4 ; 0xe00 <__vector_83+0x66> + dfc: 81 e0 ldi r24, 0x01 ; 1 + dfe: 90 e0 ldi r25, 0x00 ; 0 + e00: 82 0f add r24, r18 + e02: 93 1f adc r25, r19 + e04: 17 c0 rjmp .+46 ; 0xe34 <__vector_83+0x9a> + e06: 80 91 68 09 lds r24, 0x0968 + e0a: 90 91 69 09 lds r25, 0x0969 + e0e: 4f 3f cpi r20, 0xFF ; 255 + e10: ac f4 brge .+42 ; 0xe3c <__vector_83+0xa2> + e12: 0d 97 sbiw r24, 0x0d ; 13 + e14: 98 f0 brcs .+38 ; 0xe3c <__vector_83+0xa2> + e16: 20 91 68 09 lds r18, 0x0968 + e1a: 30 91 69 09 lds r19, 0x0969 + e1e: 48 3f cpi r20, 0xF8 ; 248 + e20: 1c f4 brge .+6 ; 0xe28 <__vector_83+0x8e> + e22: 8c e0 ldi r24, 0x0C ; 12 + e24: 90 e0 ldi r25, 0x00 ; 0 + e26: 02 c0 rjmp .+4 ; 0xe2c <__vector_83+0x92> + e28: 81 e0 ldi r24, 0x01 ; 1 + e2a: 90 e0 ldi r25, 0x00 ; 0 + e2c: a9 01 movw r20, r18 + e2e: 48 1b sub r20, r24 + e30: 59 0b sbc r21, r25 + e32: ca 01 movw r24, r20 + e34: 80 93 78 09 sts 0x0978, r24 + e38: 90 93 79 09 sts 0x0979, r25 + e3c: 0f 90 pop r0 + e3e: df 91 pop r29 + e40: cf 91 pop r28 + e42: 9f 91 pop r25 + e44: 8f 91 pop r24 + e46: 5f 91 pop r21 + e48: 4f 91 pop r20 + e4a: 3f 91 pop r19 + e4c: 2f 91 pop r18 + e4e: 0f 90 pop r0 + e50: 0f be out 0x3f, r0 ; 63 + e52: 0f 90 pop r0 + e54: 1f 90 pop r1 + e56: 18 95 reti + +00000e58 : + e58: e0 e7 ldi r30, 0x70 ; 112 + e5a: f0 e0 ldi r31, 0x00 ; 0 + e5c: 83 81 ldd r24, Z+3 ; 0x03 + e5e: 8f 7e andi r24, 0xEF ; 239 + e60: 83 83 std Z+3, r24 ; 0x03 + e62: e0 e4 ldi r30, 0x40 ; 64 + e64: f6 e0 ldi r31, 0x06 ; 6 + e66: 80 81 ld r24, Z + e68: 8a 6a ori r24, 0xAA ; 170 + e6a: 80 83 st Z, r24 + e6c: 8f ef ldi r24, 0xFF ; 255 + e6e: 84 83 std Z+4, r24 ; 0x04 + e70: 88 e5 ldi r24, 0x58 ; 88 + e72: 82 8b std Z+18, r24 ; 0x12 + e74: 80 e2 ldi r24, 0x20 ; 32 + e76: 86 87 std Z+14, r24 ; 0x0e + e78: e0 ea ldi r30, 0xA0 ; 160 + e7a: f8 e0 ldi r31, 0x08 ; 8 + e7c: 84 ec ldi r24, 0xC4 ; 196 + e7e: 85 83 std Z+5, r24 ; 0x05 + e80: 83 e0 ldi r24, 0x03 ; 3 + e82: 86 83 std Z+6, r24 ; 0x06 + e84: 17 82 std Z+7, r1 ; 0x07 + e86: 88 e1 ldi r24, 0x18 ; 24 + e88: 84 83 std Z+4, r24 ; 0x04 + e8a: 08 95 ret + +00000e8c : + e8c: e0 e7 ldi r30, 0x70 ; 112 + e8e: f0 e0 ldi r31, 0x00 ; 0 + e90: 83 81 ldd r24, Z+3 ; 0x03 + e92: 87 7f andi r24, 0xF7 ; 247 + e94: 83 83 std Z+3, r24 ; 0x03 + e96: 80 e4 ldi r24, 0x40 ; 64 + e98: 80 93 c0 08 sts 0x08C0, r24 + e9c: 88 e5 ldi r24, 0x58 ; 88 + e9e: e0 e4 ldi r30, 0x40 ; 64 + ea0: f6 e0 ldi r31, 0x06 ; 6 + ea2: 87 8b std Z+23, r24 ; 0x17 + ea4: 08 95 ret + +00000ea6 : + ea6: 9f b7 in r25, 0x3f ; 63 + ea8: f8 94 cli + eaa: e0 e5 ldi r30, 0x50 ; 80 + eac: f0 e0 ldi r31, 0x00 ; 0 + eae: 20 81 ld r18, Z + eb0: 82 2b or r24, r18 + eb2: 80 83 st Z, r24 + eb4: 9f bf out 0x3f, r25 ; 63 + eb6: 08 95 ret + +00000eb8 : + eb8: 9f b7 in r25, 0x3f ; 63 + eba: f8 94 cli + ebc: a0 e5 ldi r26, 0x50 ; 80 + ebe: b0 e0 ldi r27, 0x00 ; 0 + ec0: 16 96 adiw r26, 0x06 ; 6 + ec2: 8c 91 ld r24, X + ec4: 16 97 sbiw r26, 0x06 ; 6 + ec6: 89 7f andi r24, 0xF9 ; 249 + ec8: 16 96 adiw r26, 0x06 ; 6 + eca: 8c 93 st X, r24 + ecc: 16 97 sbiw r26, 0x06 ; 6 + ece: e0 e6 ldi r30, 0x60 ; 96 + ed0: f0 e0 ldi r31, 0x00 ; 0 + ed2: 80 e8 ldi r24, 0x80 ; 128 + ed4: 85 83 std Z+5, r24 ; 0x05 + ed6: 8b eb ldi r24, 0xBB ; 187 + ed8: 86 83 std Z+6, r24 ; 0x06 + eda: 16 96 adiw r26, 0x06 ; 6 + edc: 8c 91 ld r24, X + ede: 16 97 sbiw r26, 0x06 ; 6 + ee0: 84 60 ori r24, 0x04 ; 4 + ee2: 16 96 adiw r26, 0x06 ; 6 + ee4: 8c 93 st X, r24 + ee6: 80 81 ld r24, Z + ee8: 81 60 ori r24, 0x01 ; 1 + eea: 80 83 st Z, r24 + eec: 9f bf out 0x3f, r25 ; 63 + eee: 08 95 ret + +00000ef0 : + ef0: cf 93 push r28 + ef2: df 93 push r29 + ef4: 00 d0 rcall .+0 ; 0xef6 + ef6: 00 d0 rcall .+0 ; 0xef8 + ef8: cd b7 in r28, 0x3d ; 61 + efa: de b7 in r29, 0x3e ; 62 + efc: 8f ef ldi r24, 0xFF ; 255 + efe: 80 93 70 00 sts 0x0070, r24 + f02: 80 93 71 00 sts 0x0071, r24 + f06: 80 93 72 00 sts 0x0072, r24 + f0a: 80 93 73 00 sts 0x0073, r24 + f0e: 80 93 74 00 sts 0x0074, r24 + f12: 80 93 75 00 sts 0x0075, r24 + f16: 80 93 76 00 sts 0x0076, r24 + f1a: 64 e0 ldi r22, 0x04 ; 4 + f1c: 81 e4 ldi r24, 0x41 ; 65 + f1e: 90 e0 ldi r25, 0x00 ; 0 + f20: d6 d4 rcall .+2476 ; 0x18ce + f22: 6c e1 ldi r22, 0x1C ; 28 + f24: 70 e0 ldi r23, 0x00 ; 0 + f26: 82 e0 ldi r24, 0x02 ; 2 + f28: d8 d4 rcall .+2480 ; 0x18da + f2a: 8c 83 std Y+4, r24 ; 0x04 + f2c: 6d e1 ldi r22, 0x1D ; 29 + f2e: 70 e0 ldi r23, 0x00 ; 0 + f30: 82 e0 ldi r24, 0x02 ; 2 + f32: d3 d4 rcall .+2470 ; 0x18da + f34: 8b 83 std Y+3, r24 ; 0x03 + f36: 8b 81 ldd r24, Y+3 ; 0x03 + f38: 9c 81 ldd r25, Y+4 ; 0x04 + f3a: 01 96 adiw r24, 0x01 ; 1 + f3c: 21 f4 brne .+8 ; 0xf46 + f3e: 80 e4 ldi r24, 0x40 ; 64 + f40: 93 e2 ldi r25, 0x23 ; 35 + f42: 8b 83 std Y+3, r24 ; 0x03 + f44: 9c 83 std Y+4, r25 ; 0x04 + f46: 8b 81 ldd r24, Y+3 ; 0x03 + f48: 9c 81 ldd r25, Y+4 ; 0x04 + f4a: 89 83 std Y+1, r24 ; 0x01 + f4c: 9a 83 std Y+2, r25 ; 0x02 + f4e: 80 93 62 00 sts 0x0062, r24 + f52: 8a 81 ldd r24, Y+2 ; 0x02 + f54: 80 93 63 00 sts 0x0063, r24 + f58: 82 e0 ldi r24, 0x02 ; 2 + f5a: a5 df rcall .-182 ; 0xea6 + f5c: 80 91 51 00 lds r24, 0x0051 + f60: 81 ff sbrs r24, 1 + f62: fc cf rjmp .-8 ; 0xf5c + f64: a9 df rcall .-174 ; 0xeb8 + f66: 61 e0 ldi r22, 0x01 ; 1 + f68: 80 e4 ldi r24, 0x40 ; 64 + f6a: 90 e0 ldi r25, 0x00 ; 0 + f6c: b0 d4 rcall .+2400 ; 0x18ce + f6e: 9f b7 in r25, 0x3f ; 63 + f70: f8 94 cli + f72: 80 91 50 00 lds r24, 0x0050 + f76: 8e 7f andi r24, 0xFE ; 254 + f78: 80 93 50 00 sts 0x0050, r24 + f7c: 9f bf out 0x3f, r25 ; 63 + f7e: 24 96 adiw r28, 0x04 ; 4 + f80: cd bf out 0x3d, r28 ; 61 + f82: de bf out 0x3e, r29 ; 62 + f84: df 91 pop r29 + f86: cf 91 pop r28 + f88: 08 95 ret + +00000f8a : + f8a: 9f b7 in r25, 0x3f ; 63 + f8c: f8 94 cli + f8e: e8 2f mov r30, r24 + f90: f0 e0 ldi r31, 0x00 ; 0 + f92: e0 59 subi r30, 0x90 ; 144 + f94: ff 4f sbci r31, 0xFF ; 255 + f96: 60 95 com r22 + f98: 80 81 ld r24, Z + f9a: 86 23 and r24, r22 + f9c: 80 83 st Z, r24 + f9e: 9f bf out 0x3f, r25 ; 63 + fa0: 08 95 ret + +00000fa2 : + fa2: cf 93 push r28 + fa4: 86 30 cpi r24, 0x06 ; 6 + fa6: 11 f4 brne .+4 ; 0xfac + fa8: c8 e1 ldi r28, 0x18 ; 24 + faa: 01 c0 rjmp .+2 ; 0xfae + fac: c0 e0 ldi r28, 0x00 ; 0 + fae: 80 91 51 00 lds r24, 0x0051 + fb2: 81 fd sbrc r24, 1 + fb4: 07 c0 rjmp .+14 ; 0xfc4 + fb6: 82 e0 ldi r24, 0x02 ; 2 + fb8: 76 df rcall .-276 ; 0xea6 + fba: 80 91 51 00 lds r24, 0x0051 + fbe: 81 ff sbrs r24, 1 + fc0: fc cf rjmp .-8 ; 0xfba + fc2: 7a df rcall .-268 ; 0xeb8 + fc4: 6c 2f mov r22, r28 + fc6: 63 60 ori r22, 0x03 ; 3 + fc8: 84 e4 ldi r24, 0x44 ; 68 + fca: 90 e0 ldi r25, 0x00 ; 0 + fcc: 80 d4 rcall .+2304 ; 0x18ce + fce: 60 e4 ldi r22, 0x40 ; 64 + fd0: 80 e0 ldi r24, 0x00 ; 0 + fd2: cf 91 pop r28 + fd4: da cf rjmp .-76 ; 0xf8a + +00000fd6 : + fd6: 80 91 c4 20 lds r24, 0x20C4 + fda: 08 95 ret + +00000fdc : + fdc: 80 91 c4 20 lds r24, 0x20C4 + fe0: 81 30 cpi r24, 0x01 ; 1 + fe2: 09 f4 brne .+2 ; 0xfe6 + fe4: b0 c9 rjmp .-3232 ; 0x346 + fe6: 08 95 ret + +00000fe8 : + fe8: f8 d0 rcall .+496 ; 0x11da + fea: fc 01 movw r30, r24 + fec: 83 81 ldd r24, Z+3 ; 0x03 + fee: 80 93 c4 20 sts 0x20C4, r24 + ff2: 81 11 cpse r24, r1 + ff4: 01 c0 rjmp .+2 ; 0xff8 + ff6: 9b c9 rjmp .-3274 ; 0x32e + ff8: 81 e0 ldi r24, 0x01 ; 1 + ffa: 08 95 ret + +00000ffc : + ffc: 90 91 66 24 lds r25, 0x2466 + 1000: 89 2f mov r24, r25 + 1002: 80 76 andi r24, 0x60 ; 96 + 1004: 97 ff sbrs r25, 7 + 1006: 07 c0 rjmp .+14 ; 0x1016 + 1008: 80 34 cpi r24, 0x40 ; 64 + 100a: 91 f4 brne .+36 ; 0x1030 + 100c: 80 91 67 24 lds r24, 0x2467 + 1010: 81 11 cpse r24, r1 + 1012: 0e c0 rjmp .+28 ; 0x1030 + 1014: 9d c9 rjmp .-3270 ; 0x350 + 1016: 80 34 cpi r24, 0x40 ; 64 + 1018: 59 f4 brne .+22 ; 0x1030 + 101a: 80 91 67 24 lds r24, 0x2467 + 101e: 81 11 cpse r24, r1 + 1020: 07 c0 rjmp .+14 ; 0x1030 + 1022: 80 91 6c 24 lds r24, 0x246C + 1026: 90 91 6d 24 lds r25, 0x246D + 102a: 89 2b or r24, r25 + 102c: 09 f0 breq .+2 ; 0x1030 + 102e: 8e c9 rjmp .-3300 ; 0x34c + 1030: 80 e0 ldi r24, 0x00 ; 0 + 1032: 08 95 ret + +00001034 : + 1034: 0f 93 push r16 + 1036: 1f 93 push r17 + 1038: 9b 01 movw r18, r22 + 103a: 8a 01 movw r16, r20 + 103c: ac 01 movw r20, r24 + 103e: 60 e0 ldi r22, 0x00 ; 0 + 1040: 83 e8 ldi r24, 0x83 ; 131 + 1042: 0e 94 25 10 call 0x204a ; 0x204a + 1046: 1f 91 pop r17 + 1048: 0f 91 pop r16 + 104a: 08 95 ret + +0000104c : + 104c: 80 91 68 24 lds r24, 0x2468 + 1050: 8f 77 andi r24, 0x7F ; 127 + 1052: 7a c7 rjmp .+3828 ; 0x1f48 + +00001054 : + 1054: 90 91 cc 20 lds r25, 0x20CC + 1058: 99 23 and r25, r25 + 105a: 61 f1 breq .+88 ; 0x10b4 + 105c: e0 91 c9 20 lds r30, 0x20C9 + 1060: f0 91 ca 20 lds r31, 0x20CA + 1064: 01 90 ld r0, Z+ + 1066: f0 81 ld r31, Z + 1068: e0 2d mov r30, r0 + 106a: 94 81 ldd r25, Z+4 ; 0x04 + 106c: 89 17 cp r24, r25 + 106e: 10 f5 brcc .+68 ; 0x10b4 + 1070: e0 93 c7 20 sts 0x20C7, r30 + 1074: f0 93 c8 20 sts 0x20C8, r31 + 1078: 22 81 ldd r18, Z+2 ; 0x02 + 107a: 33 81 ldd r19, Z+3 ; 0x03 + 107c: 2e 0f add r18, r30 + 107e: 3f 1f adc r19, r31 + 1080: e2 17 cp r30, r18 + 1082: f3 07 cpc r31, r19 + 1084: 98 f4 brcc .+38 ; 0x10ac + 1086: 91 81 ldd r25, Z+1 ; 0x01 + 1088: 94 30 cpi r25, 0x04 ; 4 + 108a: 61 f4 brne .+24 ; 0x10a4 + 108c: 92 81 ldd r25, Z+2 ; 0x02 + 108e: 89 13 cpse r24, r25 + 1090: 09 c0 rjmp .+18 ; 0x10a4 + 1092: 93 81 ldd r25, Z+3 ; 0x03 + 1094: 69 13 cpse r22, r25 + 1096: 06 c0 rjmp .+12 ; 0x10a4 + 1098: e0 93 c7 20 sts 0x20C7, r30 + 109c: f0 93 c8 20 sts 0x20C8, r31 + 10a0: 81 e0 ldi r24, 0x01 ; 1 + 10a2: 08 95 ret + 10a4: 90 81 ld r25, Z + 10a6: e9 0f add r30, r25 + 10a8: f1 1d adc r31, r1 + 10aa: ea cf rjmp .-44 ; 0x1080 + 10ac: e0 93 c7 20 sts 0x20C7, r30 + 10b0: f0 93 c8 20 sts 0x20C8, r31 + 10b4: 80 e0 ldi r24, 0x00 ; 0 + 10b6: 08 95 ret + +000010b8 : + 10b8: e0 91 c9 20 lds r30, 0x20C9 + 10bc: f0 91 ca 20 lds r31, 0x20CA + 10c0: 01 90 ld r0, Z+ + 10c2: f0 81 ld r31, Z + 10c4: e0 2d mov r30, r0 + 10c6: 22 81 ldd r18, Z+2 ; 0x02 + 10c8: 33 81 ldd r19, Z+3 ; 0x03 + 10ca: 2e 0f add r18, r30 + 10cc: 3f 1f adc r19, r31 + 10ce: fc 01 movw r30, r24 + 10d0: 40 81 ld r20, Z + 10d2: e4 0f add r30, r20 + 10d4: f1 1d adc r31, r1 + 10d6: e2 17 cp r30, r18 + 10d8: f3 07 cpc r31, r19 + 10da: 48 f4 brcc .+18 ; 0x10ee + 10dc: 81 81 ldd r24, Z+1 ; 0x01 + 10de: 84 30 cpi r24, 0x04 ; 4 + 10e0: 31 f0 breq .+12 ; 0x10ee + 10e2: 85 30 cpi r24, 0x05 ; 5 + 10e4: 39 f0 breq .+14 ; 0x10f4 + 10e6: 80 81 ld r24, Z + 10e8: e8 0f add r30, r24 + 10ea: f1 1d adc r31, r1 + 10ec: f4 cf rjmp .-24 ; 0x10d6 + 10ee: 80 e0 ldi r24, 0x00 ; 0 + 10f0: 90 e0 ldi r25, 0x00 ; 0 + 10f2: 08 95 ret + 10f4: cf 01 movw r24, r30 + 10f6: 08 95 ret + +000010f8 : + 10f8: 1f 93 push r17 + 10fa: cf 93 push r28 + 10fc: df 93 push r29 + 10fe: 18 2f mov r17, r24 + 1100: a9 df rcall .-174 ; 0x1054 + 1102: 88 23 and r24, r24 + 1104: 39 f1 breq .+78 ; 0x1154 + 1106: c0 91 c7 20 lds r28, 0x20C7 + 110a: d0 91 c8 20 lds r29, 0x20C8 + 110e: ce 01 movw r24, r28 + 1110: d3 df rcall .-90 ; 0x10b8 + 1112: ec 01 movw r28, r24 + 1114: 00 97 sbiw r24, 0x00 ; 0 + 1116: 41 f0 breq .+16 ; 0x1128 + 1118: 4c 81 ldd r20, Y+4 ; 0x04 + 111a: 5d 81 ldd r21, Y+5 ; 0x05 + 111c: 6b 81 ldd r22, Y+3 ; 0x03 + 111e: 8a 81 ldd r24, Y+2 ; 0x02 + 1120: 22 d7 rcall .+3652 ; 0x1f66 + 1122: 81 11 cpse r24, r1 + 1124: f4 cf rjmp .-24 ; 0x110e + 1126: 16 c0 rjmp .+44 ; 0x1154 + 1128: e0 91 c9 20 lds r30, 0x20C9 + 112c: f0 91 ca 20 lds r31, 0x20CA + 1130: 92 81 ldd r25, Z+2 ; 0x02 + 1132: 83 81 ldd r24, Z+3 ; 0x03 + 1134: e9 2f mov r30, r25 + 1136: f8 2f mov r31, r24 + 1138: e1 0f add r30, r17 + 113a: f1 1d adc r31, r1 + 113c: e1 0f add r30, r17 + 113e: f1 1d adc r31, r1 + 1140: 01 90 ld r0, Z+ + 1142: f0 81 ld r31, Z + 1144: e0 2d mov r30, r0 + 1146: 01 90 ld r0, Z+ + 1148: f0 81 ld r31, Z + 114a: e0 2d mov r30, r0 + 114c: df 91 pop r29 + 114e: cf 91 pop r28 + 1150: 1f 91 pop r17 + 1152: 09 94 ijmp + 1154: 80 e0 ldi r24, 0x00 ; 0 + 1156: df 91 pop r29 + 1158: cf 91 pop r28 + 115a: 1f 91 pop r17 + 115c: 08 95 ret + +0000115e : + 115e: ff 92 push r15 + 1160: 0f 93 push r16 + 1162: 1f 93 push r17 + 1164: cf 93 push r28 + 1166: df 93 push r29 + 1168: c8 2f mov r28, r24 + 116a: 60 e0 ldi r22, 0x00 ; 0 + 116c: 73 df rcall .-282 ; 0x1054 + 116e: f8 2e mov r15, r24 + 1170: 88 23 and r24, r24 + 1172: 61 f1 breq .+88 ; 0x11cc + 1174: e0 91 c9 20 lds r30, 0x20C9 + 1178: f0 91 ca 20 lds r31, 0x20CA + 117c: 92 81 ldd r25, Z+2 ; 0x02 + 117e: 83 81 ldd r24, Z+3 ; 0x03 + 1180: e9 2f mov r30, r25 + 1182: f8 2f mov r31, r24 + 1184: ec 0f add r30, r28 + 1186: f1 1d adc r31, r1 + 1188: ec 0f add r30, r28 + 118a: f1 1d adc r31, r1 + 118c: 00 81 ld r16, Z + 118e: 11 81 ldd r17, Z+1 ; 0x01 + 1190: d8 01 movw r26, r16 + 1192: 16 96 adiw r26, 0x06 ; 6 + 1194: ed 91 ld r30, X+ + 1196: fc 91 ld r31, X + 1198: 17 97 sbiw r26, 0x07 ; 7 + 119a: 09 95 icall + 119c: 68 2f mov r22, r24 + 119e: 8c 2f mov r24, r28 + 11a0: 59 df rcall .-334 ; 0x1054 + 11a2: f8 2e mov r15, r24 + 11a4: 88 23 and r24, r24 + 11a6: 91 f0 breq .+36 ; 0x11cc + 11a8: c0 91 c7 20 lds r28, 0x20C7 + 11ac: d0 91 c8 20 lds r29, 0x20C8 + 11b0: ce 01 movw r24, r28 + 11b2: 82 df rcall .-252 ; 0x10b8 + 11b4: ec 01 movw r28, r24 + 11b6: 00 97 sbiw r24, 0x00 ; 0 + 11b8: 19 f0 breq .+6 ; 0x11c0 + 11ba: 8a 81 ldd r24, Y+2 ; 0x02 + 11bc: f3 d7 rcall .+4070 ; 0x21a4 + 11be: f8 cf rjmp .-16 ; 0x11b0 + 11c0: d8 01 movw r26, r16 + 11c2: 12 96 adiw r26, 0x02 ; 2 + 11c4: ed 91 ld r30, X+ + 11c6: fc 91 ld r31, X + 11c8: 13 97 sbiw r26, 0x03 ; 3 + 11ca: 09 95 icall + 11cc: 8f 2d mov r24, r15 + 11ce: df 91 pop r29 + 11d0: cf 91 pop r28 + 11d2: 1f 91 pop r17 + 11d4: 0f 91 pop r16 + 11d6: ff 90 pop r15 + 11d8: 08 95 ret + +000011da : + 11da: 80 91 c7 20 lds r24, 0x20C7 + 11de: 90 91 c8 20 lds r25, 0x20C8 + 11e2: 08 95 ret + +000011e4 : + 11e4: 39 c6 rjmp .+3186 ; 0x1e58 + +000011e6 : + 11e6: cf 93 push r28 + 11e8: 80 91 cc 20 lds r24, 0x20CC + 11ec: 81 11 cpse r24, r1 + 11ee: 08 c0 rjmp .+16 ; 0x1200 + 11f0: 10 92 cc 20 sts 0x20CC, r1 + 11f4: 10 92 d0 20 sts 0x20D0, r1 + 11f8: 10 92 d1 20 sts 0x20D1, r1 + 11fc: cf 91 pop r28 + 11fe: 08 95 ret + 1200: c0 e0 ldi r28, 0x00 ; 0 + 1202: e0 91 c9 20 lds r30, 0x20C9 + 1206: f0 91 ca 20 lds r31, 0x20CA + 120a: 01 90 ld r0, Z+ + 120c: f0 81 ld r31, Z + 120e: e0 2d mov r30, r0 + 1210: 84 81 ldd r24, Z+4 ; 0x04 + 1212: c8 17 cp r28, r24 + 1214: 68 f7 brcc .-38 ; 0x11f0 + 1216: 8c 2f mov r24, r28 + 1218: a2 df rcall .-188 ; 0x115e + 121a: cf 5f subi r28, 0xFF ; 255 + 121c: f2 cf rjmp .-28 ; 0x1202 + +0000121e : + 121e: cf 93 push r28 + 1220: 80 91 cc 20 lds r24, 0x20CC + 1224: 88 23 and r24, r24 + 1226: f1 f0 breq .+60 ; 0x1264 + 1228: c0 e0 ldi r28, 0x00 ; 0 + 122a: e0 91 c9 20 lds r30, 0x20C9 + 122e: f0 91 ca 20 lds r31, 0x20CA + 1232: a0 81 ld r26, Z + 1234: b1 81 ldd r27, Z+1 ; 0x01 + 1236: 14 96 adiw r26, 0x04 ; 4 + 1238: 8c 91 ld r24, X + 123a: c8 17 cp r28, r24 + 123c: 98 f4 brcc .+38 ; 0x1264 + 123e: 92 81 ldd r25, Z+2 ; 0x02 + 1240: 83 81 ldd r24, Z+3 ; 0x03 + 1242: e9 2f mov r30, r25 + 1244: f8 2f mov r31, r24 + 1246: ec 0f add r30, r28 + 1248: f1 1d adc r31, r1 + 124a: ec 0f add r30, r28 + 124c: f1 1d adc r31, r1 + 124e: 01 90 ld r0, Z+ + 1250: f0 81 ld r31, Z + 1252: e0 2d mov r30, r0 + 1254: 00 84 ldd r0, Z+8 ; 0x08 + 1256: f1 85 ldd r31, Z+9 ; 0x09 + 1258: e0 2d mov r30, r0 + 125a: 30 97 sbiw r30, 0x00 ; 0 + 125c: 09 f0 breq .+2 ; 0x1260 + 125e: 09 95 icall + 1260: cf 5f subi r28, 0xFF ; 255 + 1262: e3 cf rjmp .-58 ; 0x122a + 1264: cf 91 pop r28 + 1266: 08 95 ret + +00001268 : + 1268: cf 92 push r12 + 126a: df 92 push r13 + 126c: ff 92 push r15 + 126e: 0f 93 push r16 + 1270: 1f 93 push r17 + 1272: cf 93 push r28 + 1274: df 93 push r29 + 1276: 1f 92 push r1 + 1278: cd b7 in r28, 0x3d ; 61 + 127a: de b7 in r29, 0x3e ; 62 + 127c: 10 92 70 24 sts 0x2470, r1 + 1280: 10 92 71 24 sts 0x2471, r1 + 1284: 10 92 72 24 sts 0x2472, r1 + 1288: 10 92 73 24 sts 0x2473, r1 + 128c: 10 92 74 24 sts 0x2474, r1 + 1290: 10 92 75 24 sts 0x2475, r1 + 1294: 20 91 66 24 lds r18, 0x2466 + 1298: 27 ff sbrs r18, 7 + 129a: 07 c0 rjmp .+14 ; 0x12aa + 129c: 80 91 6c 24 lds r24, 0x246C + 12a0: 90 91 6d 24 lds r25, 0x246D + 12a4: 89 2b or r24, r25 + 12a6: 09 f4 brne .+2 ; 0x12aa + 12a8: 08 c3 rjmp .+1552 ; 0x18ba + 12aa: 82 2f mov r24, r18 + 12ac: 80 76 andi r24, 0x60 ; 96 + 12ae: 80 34 cpi r24, 0x40 ; 64 + 12b0: 09 f0 breq .+2 ; 0x12b4 + 12b2: c5 c0 rjmp .+394 ; 0x143e + 12b4: 80 91 67 24 lds r24, 0x2467 + 12b8: 90 e0 ldi r25, 0x00 ; 0 + 12ba: fc 01 movw r30, r24 + 12bc: e0 5a subi r30, 0xA0 ; 160 + 12be: f1 09 sbc r31, r1 + 12c0: e8 30 cpi r30, 0x08 ; 8 + 12c2: f1 05 cpc r31, r1 + 12c4: 08 f0 brcs .+2 ; 0x12c8 + 12c6: 88 c2 rjmp .+1296 ; 0x17d8 + 12c8: ea 5f subi r30, 0xFA ; 250 + 12ca: fe 4f sbci r31, 0xFE ; 254 + 12cc: 0c 94 86 12 jmp 0x250c ; 0x250c <__tablejump2__> + 12d0: 00 00 nop + 12d2: f1 c2 rjmp .+1506 ; 0x18b6 + 12d4: 10 92 00 08 sts 0x0800, r1 + 12d8: 80 91 68 24 lds r24, 0x2468 + 12dc: 90 91 69 24 lds r25, 0x2469 + 12e0: 80 93 36 08 sts 0x0836, r24 + 12e4: 90 93 37 08 sts 0x0837, r25 + 12e8: 80 91 6a 24 lds r24, 0x246A + 12ec: 8f 70 andi r24, 0x0F ; 15 + 12ee: 80 93 00 08 sts 0x0800, r24 + 12f2: 60 91 6c 24 lds r22, 0x246C + 12f6: 70 91 6d 24 lds r23, 0x246D + 12fa: 86 e6 ldi r24, 0x66 ; 102 + 12fc: 92 e2 ldi r25, 0x22 ; 34 + 12fe: 19 c0 rjmp .+50 ; 0x1332 + 1300: 10 92 40 08 sts 0x0840, r1 + 1304: 60 91 6c 24 lds r22, 0x246C + 1308: 70 91 6d 24 lds r23, 0x246D + 130c: 60 93 02 20 sts 0x2002, r22 + 1310: 70 93 03 20 sts 0x2003, r23 + 1314: 80 91 68 24 lds r24, 0x2468 + 1318: 90 91 69 24 lds r25, 0x2469 + 131c: 80 93 76 08 sts 0x0876, r24 + 1320: 90 93 77 08 sts 0x0877, r25 + 1324: 80 91 6a 24 lds r24, 0x246A + 1328: 8f 70 andi r24, 0x0F ; 15 + 132a: 80 93 40 08 sts 0x0840, r24 + 132e: 86 e7 ldi r24, 0x76 ; 118 + 1330: 94 e2 ldi r25, 0x24 ; 36 + 1332: 10 d6 rcall .+3104 ; 0x1f54 + 1334: 20 91 04 20 lds r18, 0x2004 + 1338: 30 91 05 20 lds r19, 0x2005 + 133c: 80 91 6c 24 lds r24, 0x246C + 1340: 90 91 6d 24 lds r25, 0x246D + 1344: 28 17 cp r18, r24 + 1346: 39 07 cpc r19, r25 + 1348: 09 f4 brne .+2 ; 0x134c + 134a: b5 c2 rjmp .+1386 ; 0x18b6 + 134c: 80 93 04 20 sts 0x2004, r24 + 1350: 90 93 05 20 sts 0x2005, r25 + 1354: 80 91 00 20 lds r24, 0x2000 + 1358: 90 e0 ldi r25, 0x00 ; 0 + 135a: 88 30 cpi r24, 0x08 ; 8 + 135c: 91 05 cpc r25, r1 + 135e: 08 f0 brcs .+2 ; 0x1362 + 1360: aa c2 rjmp .+1364 ; 0x18b6 + 1362: fc 01 movw r30, r24 + 1364: e2 5f subi r30, 0xF2 ; 242 + 1366: fe 4f sbci r31, 0xFE ; 254 + 1368: 0c 94 86 12 jmp 0x250c ; 0x250c <__tablejump2__> + 136c: 10 92 68 09 sts 0x0968, r1 + 1370: 10 92 69 09 sts 0x0969, r1 + 1374: 80 91 68 24 lds r24, 0x2468 + 1378: 80 93 c0 20 sts 0x20C0, r24 + 137c: 9c c2 rjmp .+1336 ; 0x18b6 + 137e: 80 91 68 24 lds r24, 0x2468 + 1382: 80 93 24 06 sts 0x0624, r24 + 1386: 97 c2 rjmp .+1326 ; 0x18b6 + 1388: e0 91 68 24 lds r30, 0x2468 + 138c: f0 91 69 24 lds r31, 0x2469 + 1390: e8 30 cpi r30, 0x08 ; 8 + 1392: f1 05 cpc r31, r1 + 1394: 08 f0 brcs .+2 ; 0x1398 + 1396: 20 c2 rjmp .+1088 ; 0x17d8 + 1398: ea 5e subi r30, 0xEA ; 234 + 139a: fe 4f sbci r31, 0xFE ; 254 + 139c: 0c 94 86 12 jmp 0x250c ; 0x250c <__tablejump2__> + 13a0: 60 e0 ldi r22, 0x00 ; 0 + 13a2: 80 e0 ldi r24, 0x00 ; 0 + 13a4: 0a d8 rcall .-4076 ; 0x3ba + 13a6: 80 91 6a 24 lds r24, 0x246A + 13aa: 0e 94 aa 01 call 0x354 ; 0x354 + 13ae: 73 d8 rcall .-3866 ; 0x496 + 13b0: 82 c2 rjmp .+1284 ; 0x18b6 + 13b2: 60 e0 ldi r22, 0x00 ; 0 + 13b4: 80 e0 ldi r24, 0x00 ; 0 + 13b6: 01 d8 rcall .-4094 ; 0x3ba + 13b8: 80 91 6a 24 lds r24, 0x246A + 13bc: 0e 94 aa 01 call 0x354 ; 0x354 + 13c0: e2 d8 rcall .-3644 ; 0x586 + 13c2: 79 c2 rjmp .+1266 ; 0x18b6 + 13c4: 61 e0 ldi r22, 0x01 ; 1 + 13c6: 81 e0 ldi r24, 0x01 ; 1 + 13c8: 0e 94 dd 01 call 0x3ba ; 0x3ba + 13cc: 80 91 6a 24 lds r24, 0x246A + 13d0: 0e 94 aa 01 call 0x354 ; 0x354 + 13d4: 80 91 6b 24 lds r24, 0x246B + 13d8: 0e 94 c0 01 call 0x380 ; 0x380 + 13dc: 78 d9 rcall .-3344 ; 0x6ce + 13de: 6b c2 rjmp .+1238 ; 0x18b6 + 13e0: 17 da rcall .-3026 ; 0x810 + 13e2: 69 c2 rjmp .+1234 ; 0x18b6 + 13e4: ab da rcall .-2730 ; 0x93c + 13e6: 67 c2 rjmp .+1230 ; 0x18b6 + 13e8: 60 e0 ldi r22, 0x00 ; 0 + 13ea: 80 e0 ldi r24, 0x00 ; 0 + 13ec: 0e 94 dd 01 call 0x3ba ; 0x3ba + 13f0: 80 91 6a 24 lds r24, 0x246A + 13f4: 0e 94 aa 01 call 0x354 ; 0x354 + 13f8: 60 db rcall .-2368 ; 0xaba + 13fa: 5d c2 rjmp .+1210 ; 0x18b6 + 13fc: 61 e0 ldi r22, 0x01 ; 1 + 13fe: 80 e0 ldi r24, 0x00 ; 0 + 1400: 0e 94 dd 01 call 0x3ba ; 0x3ba + 1404: 80 91 6a 24 lds r24, 0x246A + 1408: 0e 94 aa 01 call 0x354 ; 0x354 + 140c: 9d db rcall .-2246 ; 0xb48 + 140e: 53 c2 rjmp .+1190 ; 0x18b6 + 1410: 62 e0 ldi r22, 0x02 ; 2 + 1412: 80 e0 ldi r24, 0x00 ; 0 + 1414: 0e 94 dd 01 call 0x3ba ; 0x3ba + 1418: 80 91 6a 24 lds r24, 0x246A + 141c: 80 68 ori r24, 0x80 ; 128 + 141e: 0e 94 aa 01 call 0x354 ; 0x354 + 1422: 09 dc rcall .-2030 ; 0xc36 + 1424: 48 c2 rjmp .+1168 ; 0x18b6 + 1426: 80 91 68 24 lds r24, 0x2468 + 142a: 80 93 84 06 sts 0x0684, r24 + 142e: 43 c2 rjmp .+1158 ; 0x18b6 + 1430: e9 e7 ldi r30, 0x79 ; 121 + 1432: f0 e0 ldi r31, 0x00 ; 0 + 1434: 91 e0 ldi r25, 0x01 ; 1 + 1436: 88 ed ldi r24, 0xD8 ; 216 + 1438: f8 94 cli + 143a: 84 bf out 0x34, r24 ; 52 + 143c: 90 83 st Z, r25 + 143e: 81 11 cpse r24, r1 + 1440: cb c1 rjmp .+918 ; 0x17d8 + 1442: 27 ff sbrs r18, 7 + 1444: fb c0 rjmp .+502 ; 0x163c + 1446: 80 91 6c 24 lds r24, 0x246C + 144a: 90 91 6d 24 lds r25, 0x246D + 144e: 00 97 sbiw r24, 0x00 ; 0 + 1450: 09 f4 brne .+2 ; 0x1454 + 1452: c2 c1 rjmp .+900 ; 0x17d8 + 1454: 2f 71 andi r18, 0x1F ; 31 + 1456: 09 f0 breq .+2 ; 0x145a + 1458: 9b c0 rjmp .+310 ; 0x1590 + 145a: 20 91 67 24 lds r18, 0x2467 + 145e: 26 30 cpi r18, 0x06 ; 6 + 1460: 69 f0 breq .+26 ; 0x147c + 1462: 28 30 cpi r18, 0x08 ; 8 + 1464: 09 f4 brne .+2 ; 0x1468 + 1466: 8c c0 rjmp .+280 ; 0x1580 + 1468: 21 11 cpse r18, r1 + 146a: b6 c1 rjmp .+876 ; 0x17d8 + 146c: 02 97 sbiw r24, 0x02 ; 2 + 146e: 09 f0 breq .+2 ; 0x1472 + 1470: b3 c1 rjmp .+870 ; 0x17d8 + 1472: 62 e0 ldi r22, 0x02 ; 2 + 1474: 70 e0 ldi r23, 0x00 ; 0 + 1476: 80 ed ldi r24, 0xD0 ; 208 + 1478: 90 e2 ldi r25, 0x20 ; 32 + 147a: de c0 rjmp .+444 ; 0x1638 + 147c: 20 91 68 24 lds r18, 0x2468 + 1480: 30 91 69 24 lds r19, 0x2469 + 1484: 83 2f mov r24, r19 + 1486: 99 27 eor r25, r25 + 1488: 82 30 cpi r24, 0x02 ; 2 + 148a: 91 05 cpc r25, r1 + 148c: 91 f0 breq .+36 ; 0x14b2 + 148e: 5c f4 brge .+22 ; 0x14a6 + 1490: 01 97 sbiw r24, 0x01 ; 1 + 1492: 09 f0 breq .+2 ; 0x1496 + 1494: a1 c1 rjmp .+834 ; 0x17d8 + 1496: 80 91 10 20 lds r24, 0x2010 + 149a: 90 91 11 20 lds r25, 0x2011 + 149e: dc 01 movw r26, r24 + 14a0: 6c 91 ld r22, X + 14a2: 70 e0 ldi r23, 0x00 ; 0 + 14a4: 5b c0 rjmp .+182 ; 0x155c + 14a6: 83 30 cpi r24, 0x03 ; 3 + 14a8: 91 05 cpc r25, r1 + 14aa: 81 f1 breq .+96 ; 0x150c + 14ac: 0f 97 sbiw r24, 0x0f ; 15 + 14ae: 09 f1 breq .+66 ; 0x14f2 + 14b0: 93 c1 rjmp .+806 ; 0x17d8 + 14b2: e0 91 10 20 lds r30, 0x2010 + 14b6: f0 91 11 20 lds r31, 0x2011 + 14ba: 81 89 ldd r24, Z+17 ; 0x11 + 14bc: 28 17 cp r18, r24 + 14be: 08 f0 brcs .+2 ; 0x14c2 + 14c0: 8b c1 rjmp .+790 ; 0x17d8 + 14c2: 33 27 eor r19, r19 + 14c4: 22 0f add r18, r18 + 14c6: 33 1f adc r19, r19 + 14c8: 22 0f add r18, r18 + 14ca: 33 1f adc r19, r19 + 14cc: e0 91 12 20 lds r30, 0x2012 + 14d0: f0 91 13 20 lds r31, 0x2013 + 14d4: e2 0f add r30, r18 + 14d6: f3 1f adc r31, r19 + 14d8: 80 81 ld r24, Z + 14da: 91 81 ldd r25, Z+1 ; 0x01 + 14dc: fc 01 movw r30, r24 + 14de: 62 81 ldd r22, Z+2 ; 0x02 + 14e0: 73 81 ldd r23, Z+3 ; 0x03 + 14e2: 38 d5 rcall .+2672 ; 0x1f54 + 14e4: e0 91 6e 24 lds r30, 0x246E + 14e8: f0 91 6f 24 lds r31, 0x246F + 14ec: 82 e0 ldi r24, 0x02 ; 2 + 14ee: 81 83 std Z+1, r24 ; 0x01 + 14f0: 36 c0 rjmp .+108 ; 0x155e + 14f2: 80 91 14 20 lds r24, 0x2014 + 14f6: 90 91 15 20 lds r25, 0x2015 + 14fa: 00 97 sbiw r24, 0x00 ; 0 + 14fc: 09 f4 brne .+2 ; 0x1500 + 14fe: 6c c1 rjmp .+728 ; 0x17d8 + 1500: dc 01 movw r26, r24 + 1502: 12 96 adiw r26, 0x02 ; 2 + 1504: 6d 91 ld r22, X+ + 1506: 7c 91 ld r23, X + 1508: 13 97 sbiw r26, 0x03 ; 3 + 150a: 28 c0 rjmp .+80 ; 0x155c + 150c: 33 27 eor r19, r19 + 150e: 21 30 cpi r18, 0x01 ; 1 + 1510: 31 05 cpc r19, r1 + 1512: 29 f0 breq .+10 ; 0x151e + 1514: 40 f0 brcs .+16 ; 0x1526 + 1516: 22 30 cpi r18, 0x02 ; 2 + 1518: 31 05 cpc r19, r1 + 151a: 51 f0 breq .+20 ; 0x1530 + 151c: 5d c1 rjmp .+698 ; 0x17d8 + 151e: 69 e0 ldi r22, 0x09 ; 9 + 1520: 83 ea ldi r24, 0xA3 ; 163 + 1522: 90 e2 ldi r25, 0x20 ; 32 + 1524: 08 c0 rjmp .+16 ; 0x1536 + 1526: 64 e0 ldi r22, 0x04 ; 4 + 1528: 70 e0 ldi r23, 0x00 ; 0 + 152a: 8e ea ldi r24, 0xAE ; 174 + 152c: 90 e2 ldi r25, 0x20 ; 32 + 152e: 16 c0 rjmp .+44 ; 0x155c + 1530: 68 e1 ldi r22, 0x18 ; 24 + 1532: 8a e8 ldi r24, 0x8A ; 138 + 1534: 90 e2 ldi r25, 0x20 ; 32 + 1536: 28 2f mov r18, r24 + 1538: aa e5 ldi r26, 0x5A ; 90 + 153a: b0 e2 ldi r27, 0x20 ; 32 + 153c: fc 01 movw r30, r24 + 153e: 81 91 ld r24, Z+ + 1540: 90 e0 ldi r25, 0x00 ; 0 + 1542: 8d 93 st X+, r24 + 1544: 9d 93 st X+, r25 + 1546: 8e 2f mov r24, r30 + 1548: 82 1b sub r24, r18 + 154a: 86 17 cp r24, r22 + 154c: c0 f3 brcs .-16 ; 0x153e + 154e: 66 0f add r22, r22 + 1550: 6e 5f subi r22, 0xFE ; 254 + 1552: 60 93 58 20 sts 0x2058, r22 + 1556: 70 e0 ldi r23, 0x00 ; 0 + 1558: 88 e5 ldi r24, 0x58 ; 88 + 155a: 90 e2 ldi r25, 0x20 ; 32 + 155c: fb d4 rcall .+2550 ; 0x1f54 + 155e: 80 91 6c 24 lds r24, 0x246C + 1562: 90 91 6d 24 lds r25, 0x246D + 1566: 20 91 70 24 lds r18, 0x2470 + 156a: 30 91 71 24 lds r19, 0x2471 + 156e: 82 17 cp r24, r18 + 1570: 93 07 cpc r25, r19 + 1572: 08 f0 brcs .+2 ; 0x1576 + 1574: a0 c1 rjmp .+832 ; 0x18b6 + 1576: 80 93 70 24 sts 0x2470, r24 + 157a: 90 93 71 24 sts 0x2471, r25 + 157e: 9b c1 rjmp .+822 ; 0x18b6 + 1580: 01 97 sbiw r24, 0x01 ; 1 + 1582: 09 f0 breq .+2 ; 0x1586 + 1584: 29 c1 rjmp .+594 ; 0x17d8 + 1586: 61 e0 ldi r22, 0x01 ; 1 + 1588: 70 e0 ldi r23, 0x00 ; 0 + 158a: 8c ec ldi r24, 0xCC ; 204 + 158c: 90 e2 ldi r25, 0x20 ; 32 + 158e: 54 c0 rjmp .+168 ; 0x1638 + 1590: 21 30 cpi r18, 0x01 ; 1 + 1592: e1 f5 brne .+120 ; 0x160c + 1594: 20 91 67 24 lds r18, 0x2467 + 1598: 2a 30 cpi r18, 0x0A ; 10 + 159a: 09 f0 breq .+2 ; 0x159e + 159c: 1d c1 rjmp .+570 ; 0x17d8 + 159e: 01 97 sbiw r24, 0x01 ; 1 + 15a0: 09 f0 breq .+2 ; 0x15a4 + 15a2: 1a c1 rjmp .+564 ; 0x17d8 + 15a4: 80 91 cc 20 lds r24, 0x20CC + 15a8: 88 23 and r24, r24 + 15aa: 09 f4 brne .+2 ; 0x15ae + 15ac: 15 c1 rjmp .+554 ; 0x17d8 + 15ae: c0 90 6a 24 lds r12, 0x246A + 15b2: d0 90 6b 24 lds r13, 0x246B + 15b6: 00 91 c9 20 lds r16, 0x20C9 + 15ba: 10 91 ca 20 lds r17, 0x20CA + 15be: d8 01 movw r26, r16 + 15c0: ed 91 ld r30, X+ + 15c2: fc 91 ld r31, X + 15c4: 84 81 ldd r24, Z+4 ; 0x04 + 15c6: c8 16 cp r12, r24 + 15c8: 08 f0 brcs .+2 ; 0x15cc + 15ca: 06 c1 rjmp .+524 ; 0x17d8 + 15cc: 60 e0 ldi r22, 0x00 ; 0 + 15ce: 8c 2d mov r24, r12 + 15d0: 41 dd rcall .-1406 ; 0x1054 + 15d2: f8 2e mov r15, r24 + 15d4: 88 23 and r24, r24 + 15d6: 09 f4 brne .+2 ; 0x15da + 15d8: ff c0 rjmp .+510 ; 0x17d8 + 15da: dd 24 eor r13, r13 + 15dc: cc 0c add r12, r12 + 15de: dd 1c adc r13, r13 + 15e0: d8 01 movw r26, r16 + 15e2: 12 96 adiw r26, 0x02 ; 2 + 15e4: ed 91 ld r30, X+ + 15e6: fc 91 ld r31, X + 15e8: 13 97 sbiw r26, 0x03 ; 3 + 15ea: ec 0d add r30, r12 + 15ec: fd 1d adc r31, r13 + 15ee: 01 90 ld r0, Z+ + 15f0: f0 81 ld r31, Z + 15f2: e0 2d mov r30, r0 + 15f4: 06 80 ldd r0, Z+6 ; 0x06 + 15f6: f7 81 ldd r31, Z+7 ; 0x07 + 15f8: e0 2d mov r30, r0 + 15fa: 09 95 icall + 15fc: 80 93 ce 20 sts 0x20CE, r24 + 1600: 61 e0 ldi r22, 0x01 ; 1 + 1602: 70 e0 ldi r23, 0x00 ; 0 + 1604: 8e ec ldi r24, 0xCE ; 206 + 1606: 90 e2 ldi r25, 0x20 ; 32 + 1608: a5 d4 rcall .+2378 ; 0x1f54 + 160a: e4 c0 rjmp .+456 ; 0x17d4 + 160c: 22 30 cpi r18, 0x02 ; 2 + 160e: 09 f0 breq .+2 ; 0x1612 + 1610: e3 c0 rjmp .+454 ; 0x17d8 + 1612: 20 91 67 24 lds r18, 0x2467 + 1616: 21 11 cpse r18, r1 + 1618: df c0 rjmp .+446 ; 0x17d8 + 161a: 02 97 sbiw r24, 0x02 ; 2 + 161c: 09 f0 breq .+2 ; 0x1620 + 161e: dc c0 rjmp .+440 ; 0x17d8 + 1620: 80 91 6a 24 lds r24, 0x246A + 1624: f2 d4 rcall .+2532 ; 0x200a + 1626: 90 e0 ldi r25, 0x00 ; 0 + 1628: 80 93 c5 20 sts 0x20C5, r24 + 162c: 90 93 c6 20 sts 0x20C6, r25 + 1630: 62 e0 ldi r22, 0x02 ; 2 + 1632: 70 e0 ldi r23, 0x00 ; 0 + 1634: 85 ec ldi r24, 0xC5 ; 197 + 1636: 90 e2 ldi r25, 0x20 ; 32 + 1638: 8d d4 rcall .+2330 ; 0x1f54 + 163a: 3d c1 rjmp .+634 ; 0x18b6 + 163c: 2f 71 andi r18, 0x1F ; 31 + 163e: 09 f0 breq .+2 ; 0x1642 + 1640: 7d c0 rjmp .+250 ; 0x173c + 1642: 80 91 67 24 lds r24, 0x2467 + 1646: 83 30 cpi r24, 0x03 ; 3 + 1648: 09 f4 brne .+2 ; 0x164c + 164a: c6 c0 rjmp .+396 ; 0x17d8 + 164c: 18 f4 brcc .+6 ; 0x1654 + 164e: 81 30 cpi r24, 0x01 ; 1 + 1650: a1 f0 breq .+40 ; 0x167a + 1652: c2 c0 rjmp .+388 ; 0x17d8 + 1654: 85 30 cpi r24, 0x05 ; 5 + 1656: 19 f0 breq .+6 ; 0x165e + 1658: 89 30 cpi r24, 0x09 ; 9 + 165a: 39 f1 breq .+78 ; 0x16aa + 165c: bd c0 rjmp .+378 ; 0x17d8 + 165e: 80 91 6c 24 lds r24, 0x246C + 1662: 90 91 6d 24 lds r25, 0x246D + 1666: 89 2b or r24, r25 + 1668: 09 f0 breq .+2 ; 0x166c + 166a: b6 c0 rjmp .+364 ; 0x17d8 + 166c: 86 e2 ldi r24, 0x26 ; 38 + 166e: 98 e0 ldi r25, 0x08 ; 8 + 1670: 80 93 72 24 sts 0x2472, r24 + 1674: 90 93 73 24 sts 0x2473, r25 + 1678: 1e c1 rjmp .+572 ; 0x18b6 + 167a: 80 91 6c 24 lds r24, 0x246C + 167e: 90 91 6d 24 lds r25, 0x246D + 1682: 89 2b or r24, r25 + 1684: 09 f0 breq .+2 ; 0x1688 + 1686: a8 c0 rjmp .+336 ; 0x17d8 + 1688: 80 91 68 24 lds r24, 0x2468 + 168c: 90 91 69 24 lds r25, 0x2469 + 1690: 01 97 sbiw r24, 0x01 ; 1 + 1692: 09 f0 breq .+2 ; 0x1696 + 1694: a1 c0 rjmp .+322 ; 0x17d8 + 1696: 80 91 d0 20 lds r24, 0x20D0 + 169a: 90 91 d1 20 lds r25, 0x20D1 + 169e: 8d 7f andi r24, 0xFD ; 253 + 16a0: 80 93 d0 20 sts 0x20D0, r24 + 16a4: 90 93 d1 20 sts 0x20D1, r25 + 16a8: 06 c1 rjmp .+524 ; 0x18b6 + 16aa: 80 91 6c 24 lds r24, 0x246C + 16ae: 90 91 6d 24 lds r25, 0x246D + 16b2: 89 2b or r24, r25 + 16b4: 09 f0 breq .+2 ; 0x16b8 + 16b6: 90 c0 rjmp .+288 ; 0x17d8 + 16b8: 4a d4 rcall .+2196 ; 0x1f4e + 16ba: 88 23 and r24, r24 + 16bc: 09 f4 brne .+2 ; 0x16c0 + 16be: 8c c0 rjmp .+280 ; 0x17d8 + 16c0: 80 91 68 24 lds r24, 0x2468 + 16c4: 90 91 69 24 lds r25, 0x2469 + 16c8: 99 27 eor r25, r25 + 16ca: e0 91 10 20 lds r30, 0x2010 + 16ce: f0 91 11 20 lds r31, 0x2011 + 16d2: 21 89 ldd r18, Z+17 ; 0x11 + 16d4: 30 e0 ldi r19, 0x00 ; 0 + 16d6: 28 17 cp r18, r24 + 16d8: 39 07 cpc r19, r25 + 16da: 08 f4 brcc .+2 ; 0x16de + 16dc: 7d c0 rjmp .+250 ; 0x17d8 + 16de: 83 dd rcall .-1274 ; 0x11e6 + 16e0: 20 91 68 24 lds r18, 0x2468 + 16e4: 30 91 69 24 lds r19, 0x2469 + 16e8: 20 93 cc 20 sts 0x20CC, r18 + 16ec: 22 23 and r18, r18 + 16ee: 09 f4 brne .+2 ; 0x16f2 + 16f0: e2 c0 rjmp .+452 ; 0x18b6 + 16f2: 33 27 eor r19, r19 + 16f4: 21 50 subi r18, 0x01 ; 1 + 16f6: 30 4c sbci r19, 0xC0 ; 192 + 16f8: 22 0f add r18, r18 + 16fa: 33 1f adc r19, r19 + 16fc: 22 0f add r18, r18 + 16fe: 33 1f adc r19, r19 + 1700: 80 91 12 20 lds r24, 0x2012 + 1704: 90 91 13 20 lds r25, 0x2013 + 1708: 82 0f add r24, r18 + 170a: 93 1f adc r25, r19 + 170c: 80 93 c9 20 sts 0x20C9, r24 + 1710: 90 93 ca 20 sts 0x20CA, r25 + 1714: 10 e0 ldi r17, 0x00 ; 0 + 1716: e0 91 c9 20 lds r30, 0x20C9 + 171a: f0 91 ca 20 lds r31, 0x20CA + 171e: 01 90 ld r0, Z+ + 1720: f0 81 ld r31, Z + 1722: e0 2d mov r30, r0 + 1724: 84 81 ldd r24, Z+4 ; 0x04 + 1726: 18 17 cp r17, r24 + 1728: 08 f0 brcs .+2 ; 0x172c + 172a: c5 c0 rjmp .+394 ; 0x18b6 + 172c: 60 e0 ldi r22, 0x00 ; 0 + 172e: 81 2f mov r24, r17 + 1730: e3 dc rcall .-1594 ; 0x10f8 + 1732: 88 23 and r24, r24 + 1734: 09 f4 brne .+2 ; 0x1738 + 1736: 50 c0 rjmp .+160 ; 0x17d8 + 1738: 1f 5f subi r17, 0xFF ; 255 + 173a: ed cf rjmp .-38 ; 0x1716 + 173c: 21 30 cpi r18, 0x01 ; 1 + 173e: f1 f4 brne .+60 ; 0x177c + 1740: 80 91 67 24 lds r24, 0x2467 + 1744: 8b 30 cpi r24, 0x0B ; 11 + 1746: 09 f0 breq .+2 ; 0x174a + 1748: 47 c0 rjmp .+142 ; 0x17d8 + 174a: 80 91 6c 24 lds r24, 0x246C + 174e: 90 91 6d 24 lds r25, 0x246D + 1752: 89 2b or r24, r25 + 1754: 09 f0 breq .+2 ; 0x1758 + 1756: 40 c0 rjmp .+128 ; 0x17d8 + 1758: 80 91 cc 20 lds r24, 0x20CC + 175c: 88 23 and r24, r24 + 175e: 09 f4 brne .+2 ; 0x1762 + 1760: 3b c0 rjmp .+118 ; 0x17d8 + 1762: 10 91 6a 24 lds r17, 0x246A + 1766: 60 91 68 24 lds r22, 0x2468 + 176a: 81 2f mov r24, r17 + 176c: 69 83 std Y+1, r22 ; 0x01 + 176e: f7 dc rcall .-1554 ; 0x115e + 1770: 69 81 ldd r22, Y+1 ; 0x01 + 1772: 88 23 and r24, r24 + 1774: 89 f1 breq .+98 ; 0x17d8 + 1776: 81 2f mov r24, r17 + 1778: bf dc rcall .-1666 ; 0x10f8 + 177a: 2b c0 rjmp .+86 ; 0x17d2 + 177c: 22 30 cpi r18, 0x02 ; 2 + 177e: 61 f5 brne .+88 ; 0x17d8 + 1780: 80 91 67 24 lds r24, 0x2467 + 1784: 81 30 cpi r24, 0x01 ; 1 + 1786: 19 f0 breq .+6 ; 0x178e + 1788: 83 30 cpi r24, 0x03 ; 3 + 178a: 89 f0 breq .+34 ; 0x17ae + 178c: 25 c0 rjmp .+74 ; 0x17d8 + 178e: 80 91 6c 24 lds r24, 0x246C + 1792: 90 91 6d 24 lds r25, 0x246D + 1796: 89 2b or r24, r25 + 1798: f9 f4 brne .+62 ; 0x17d8 + 179a: 80 91 68 24 lds r24, 0x2468 + 179e: 90 91 69 24 lds r25, 0x2469 + 17a2: 89 2b or r24, r25 + 17a4: c9 f4 brne .+50 ; 0x17d8 + 17a6: 80 91 6a 24 lds r24, 0x246A + 17aa: 36 d4 rcall .+2156 ; 0x2018 + 17ac: 12 c0 rjmp .+36 ; 0x17d2 + 17ae: 80 91 6c 24 lds r24, 0x246C + 17b2: 90 91 6d 24 lds r25, 0x246D + 17b6: 89 2b or r24, r25 + 17b8: 79 f4 brne .+30 ; 0x17d8 + 17ba: 80 91 68 24 lds r24, 0x2468 + 17be: 90 91 69 24 lds r25, 0x2469 + 17c2: 89 2b or r24, r25 + 17c4: 49 f4 brne .+18 ; 0x17d8 + 17c6: 80 91 6a 24 lds r24, 0x246A + 17ca: c1 d4 rcall .+2434 ; 0x214e + 17cc: 80 91 6a 24 lds r24, 0x246A + 17d0: f2 d4 rcall .+2532 ; 0x21b6 + 17d2: f8 2e mov r15, r24 + 17d4: f1 10 cpse r15, r1 + 17d6: 6f c0 rjmp .+222 ; 0x18b6 + 17d8: 80 91 66 24 lds r24, 0x2466 + 17dc: 8f 71 andi r24, 0x1F ; 31 + 17de: 81 30 cpi r24, 0x01 ; 1 + 17e0: b9 f5 brne .+110 ; 0x1850 + 17e2: 80 91 cc 20 lds r24, 0x20CC + 17e6: 88 23 and r24, r24 + 17e8: 99 f1 breq .+102 ; 0x1850 + 17ea: c0 90 6a 24 lds r12, 0x246A + 17ee: d0 90 6b 24 lds r13, 0x246B + 17f2: 00 91 c9 20 lds r16, 0x20C9 + 17f6: 10 91 ca 20 lds r17, 0x20CA + 17fa: d8 01 movw r26, r16 + 17fc: ed 91 ld r30, X+ + 17fe: fc 91 ld r31, X + 1800: 84 81 ldd r24, Z+4 ; 0x04 + 1802: c8 16 cp r12, r24 + 1804: 28 f5 brcc .+74 ; 0x1850 + 1806: 60 e0 ldi r22, 0x00 ; 0 + 1808: 8c 2d mov r24, r12 + 180a: 24 dc rcall .-1976 ; 0x1054 + 180c: 88 23 and r24, r24 + 180e: 01 f1 breq .+64 ; 0x1850 + 1810: c6 01 movw r24, r12 + 1812: 99 27 eor r25, r25 + 1814: 88 0f add r24, r24 + 1816: 99 1f adc r25, r25 + 1818: d8 01 movw r26, r16 + 181a: 12 96 adiw r26, 0x02 ; 2 + 181c: ed 91 ld r30, X+ + 181e: fc 91 ld r31, X + 1820: 13 97 sbiw r26, 0x03 ; 3 + 1822: e8 0f add r30, r24 + 1824: f9 1f adc r31, r25 + 1826: 00 81 ld r16, Z + 1828: 11 81 ldd r17, Z+1 ; 0x01 + 182a: d8 01 movw r26, r16 + 182c: 16 96 adiw r26, 0x06 ; 6 + 182e: ed 91 ld r30, X+ + 1830: fc 91 ld r31, X + 1832: 17 97 sbiw r26, 0x07 ; 7 + 1834: 09 95 icall + 1836: 68 2f mov r22, r24 + 1838: 8c 2d mov r24, r12 + 183a: 0c dc rcall .-2024 ; 0x1054 + 183c: 88 23 and r24, r24 + 183e: 41 f0 breq .+16 ; 0x1850 + 1840: d8 01 movw r26, r16 + 1842: 14 96 adiw r26, 0x04 ; 4 + 1844: ed 91 ld r30, X+ + 1846: fc 91 ld r31, X + 1848: 15 97 sbiw r26, 0x05 ; 5 + 184a: 09 95 icall + 184c: 81 11 cpse r24, r1 + 184e: 33 c0 rjmp .+102 ; 0x18b6 + 1850: 80 91 66 24 lds r24, 0x2466 + 1854: 8f 71 andi r24, 0x1F ; 31 + 1856: 82 30 cpi r24, 0x02 ; 2 + 1858: 81 f5 brne .+96 ; 0x18ba + 185a: 80 91 cc 20 lds r24, 0x20CC + 185e: 88 23 and r24, r24 + 1860: 61 f1 breq .+88 ; 0x18ba + 1862: 10 e0 ldi r17, 0x00 ; 0 + 1864: e0 91 c9 20 lds r30, 0x20C9 + 1868: f0 91 ca 20 lds r31, 0x20CA + 186c: a0 81 ld r26, Z + 186e: b1 81 ldd r27, Z+1 ; 0x01 + 1870: 14 96 adiw r26, 0x04 ; 4 + 1872: 8c 91 ld r24, X + 1874: 18 17 cp r17, r24 + 1876: 08 f5 brcc .+66 ; 0x18ba + 1878: 92 81 ldd r25, Z+2 ; 0x02 + 187a: 83 81 ldd r24, Z+3 ; 0x03 + 187c: e9 2f mov r30, r25 + 187e: f8 2f mov r31, r24 + 1880: e1 0f add r30, r17 + 1882: f1 1d adc r31, r1 + 1884: e1 0f add r30, r17 + 1886: f1 1d adc r31, r1 + 1888: c0 80 ld r12, Z + 188a: d1 80 ldd r13, Z+1 ; 0x01 + 188c: d6 01 movw r26, r12 + 188e: 16 96 adiw r26, 0x06 ; 6 + 1890: ed 91 ld r30, X+ + 1892: fc 91 ld r31, X + 1894: 17 97 sbiw r26, 0x07 ; 7 + 1896: 09 95 icall + 1898: 68 2f mov r22, r24 + 189a: 81 2f mov r24, r17 + 189c: db db rcall .-2122 ; 0x1054 + 189e: 88 23 and r24, r24 + 18a0: 61 f0 breq .+24 ; 0x18ba + 18a2: d6 01 movw r26, r12 + 18a4: 14 96 adiw r26, 0x04 ; 4 + 18a6: ed 91 ld r30, X+ + 18a8: fc 91 ld r31, X + 18aa: 15 97 sbiw r26, 0x05 ; 5 + 18ac: 09 95 icall + 18ae: 81 11 cpse r24, r1 + 18b0: 02 c0 rjmp .+4 ; 0x18b6 + 18b2: 1f 5f subi r17, 0xFF ; 255 + 18b4: d7 cf rjmp .-82 ; 0x1864 + 18b6: 81 e0 ldi r24, 0x01 ; 1 + 18b8: 01 c0 rjmp .+2 ; 0x18bc + 18ba: 80 e0 ldi r24, 0x00 ; 0 + 18bc: 0f 90 pop r0 + 18be: df 91 pop r29 + 18c0: cf 91 pop r28 + 18c2: 1f 91 pop r17 + 18c4: 0f 91 pop r16 + 18c6: ff 90 pop r15 + 18c8: df 90 pop r13 + 18ca: cf 90 pop r12 + 18cc: 08 95 ret + +000018ce : + + PUBLIC_FUNCTION(ccp_write_io) + +#if defined(__GNUC__) + + out RAMPZ, r1 // Reset bits 23:16 of Z + 18ce: 1b be out 0x3b, r1 ; 59 + movw r30, r24 // Load addr into Z + 18d0: fc 01 movw r30, r24 + ldi r18, CCP_IOREG // Load magic CCP value + 18d2: 28 ed ldi r18, 0xD8 ; 216 + out CCP, r18 // Start CCP handshake + 18d4: 24 bf out 0x34, r18 ; 52 + st Z, r22 // Write value to I/O register + 18d6: 60 83 st Z, r22 + ret // Return to caller + 18d8: 08 95 ret + +000018da : +#endif + +#ifndef __DOXYGEN__ + PUBLIC_FUNCTION(nvm_read_byte) +#if defined(__GNUC__) + lds r20, NVM_CMD ; Store NVM command register + 18da: 40 91 ca 01 lds r20, 0x01CA + mov ZL, r22 ; Load byte index into low byte of Z. + 18de: e6 2f mov r30, r22 + mov ZH, r23 ; Load high byte into Z. + 18e0: f7 2f mov r31, r23 + sts NVM_CMD, r24 ; Load prepared command into NVM Command register. + 18e2: 80 93 ca 01 sts 0x01CA, r24 + lpm r24, Z ; Perform an LPM to read out byte + 18e6: 84 91 lpm r24, Z + sts NVM_CMD, r20 ; Restore NVM command register + 18e8: 40 93 ca 01 sts 0x01CA, r20 + sts NVM_CMD, r16 ; Load prepared command into NVM Command register. + lpm r16, Z ; Perform an LPM to read out byte + sts NVM_CMD, r20 ; Restore NVM command register +#endif + + ret + 18ec: 08 95 ret + +000018ee : + 18ee: e8 2f mov r30, r24 + 18f0: f0 e0 ldi r31, 0x00 ; 0 + 18f2: ee 5a subi r30, 0xAE ; 174 + 18f4: f3 4d sbci r31, 0xD3 ; 211 + 18f6: 80 81 ld r24, Z + 18f8: 8f 3f cpi r24, 0xFF ; 255 + 18fa: 09 f4 brne .+2 ; 0x18fe + 18fc: ff cf rjmp .-2 ; 0x18fc + 18fe: 9f b7 in r25, 0x3f ; 63 + 1900: f8 94 cli + 1902: 80 81 ld r24, Z + 1904: 8f 5f subi r24, 0xFF ; 255 + 1906: 80 83 st Z, r24 + 1908: 9f bf out 0x3f, r25 ; 63 + 190a: 08 95 ret + +0000190c : + 190c: e8 2f mov r30, r24 + 190e: f0 e0 ldi r31, 0x00 ; 0 + 1910: ee 5a subi r30, 0xAE ; 174 + 1912: f3 4d sbci r31, 0xD3 ; 211 + 1914: 80 81 ld r24, Z + 1916: 81 11 cpse r24, r1 + 1918: 01 c0 rjmp .+2 ; 0x191c + 191a: ff cf rjmp .-2 ; 0x191a + 191c: 9f b7 in r25, 0x3f ; 63 + 191e: f8 94 cli + 1920: 80 81 ld r24, Z + 1922: 81 50 subi r24, 0x01 ; 1 + 1924: 80 83 st Z, r24 + 1926: 9f bf out 0x3f, r25 ; 63 + 1928: 08 95 ret + +0000192a : + 192a: cf 93 push r28 + 192c: c8 2f mov r28, r24 + 192e: 80 91 64 22 lds r24, 0x2264 + 1932: c1 11 cpse r28, r1 + 1934: 05 c0 rjmp .+10 ; 0x1940 + 1936: 88 23 and r24, r24 + 1938: 39 f0 breq .+14 ; 0x1948 + 193a: 81 e0 ldi r24, 0x01 ; 1 + 193c: e7 df rcall .-50 ; 0x190c + 193e: 04 c0 rjmp .+8 ; 0x1948 + 1940: 81 11 cpse r24, r1 + 1942: 02 c0 rjmp .+4 ; 0x1948 + 1944: 81 e0 ldi r24, 0x01 ; 1 + 1946: d3 df rcall .-90 ; 0x18ee + 1948: c0 93 64 22 sts 0x2264, r28 + 194c: cf 91 pop r28 + 194e: 08 95 ret + +00001950 : + 1950: 28 2f mov r18, r24 + 1952: 2f 70 andi r18, 0x0F ; 15 + 1954: 99 27 eor r25, r25 + 1956: 87 fd sbrc r24, 7 + 1958: 90 95 com r25 + 195a: 88 27 eor r24, r24 + 195c: 99 0f add r25, r25 + 195e: 88 1f adc r24, r24 + 1960: 99 27 eor r25, r25 + 1962: 82 0f add r24, r18 + 1964: 91 1d adc r25, r1 + 1966: 82 0f add r24, r18 + 1968: 91 1d adc r25, r1 + 196a: 43 e0 ldi r20, 0x03 ; 3 + 196c: 88 0f add r24, r24 + 196e: 99 1f adc r25, r25 + 1970: 4a 95 dec r20 + 1972: e1 f7 brne .-8 ; 0x196c + 1974: 80 5e subi r24, 0xE0 ; 224 + 1976: 9d 4d sbci r25, 0xDD ; 221 + 1978: 08 95 ret + +0000197a : + 197a: 0f 93 push r16 + 197c: e8 ec ldi r30, 0xC8 ; 200 + 197e: f4 e0 ldi r31, 0x04 ; 4 + 1980: 80 81 ld r24, Z + 1982: 8f 7d andi r24, 0xDF ; 223 + 1984: 80 83 st Z, r24 + 1986: 80 81 ld r24, Z + 1988: 8f 7d andi r24, 0xDF ; 223 + 198a: 80 83 st Z, r24 + 198c: e8 e2 ldi r30, 0x28 ; 40 + 198e: f2 e2 ldi r31, 0x22 ; 34 + 1990: 02 e0 ldi r16, 0x02 ; 2 + 1992: 05 93 las Z, r16 + 1994: 10 92 2a 22 sts 0x222A, r1 + 1998: 10 92 2b 22 sts 0x222B, r1 + 199c: 00 e2 ldi r16, 0x20 ; 32 + 199e: 06 93 lac Z, r16 + 19a0: 00 e4 ldi r16, 0x40 ; 64 + 19a2: 06 93 lac Z, r16 + 19a4: e0 e2 ldi r30, 0x20 ; 32 + 19a6: f2 e2 ldi r31, 0x22 ; 34 + 19a8: 00 e2 ldi r16, 0x20 ; 32 + 19aa: 06 93 lac Z, r16 + 19ac: 00 e4 ldi r16, 0x40 ; 64 + 19ae: 06 93 lac Z, r16 + 19b0: 10 92 72 24 sts 0x2472, r1 + 19b4: 10 92 73 24 sts 0x2473, r1 + 19b8: 10 92 74 24 sts 0x2474, r1 + 19bc: 10 92 75 24 sts 0x2475, r1 + 19c0: 10 92 70 24 sts 0x2470, r1 + 19c4: 10 92 71 24 sts 0x2471, r1 + 19c8: 10 92 0d 22 sts 0x220D, r1 + 19cc: 0f 91 pop r16 + 19ce: 08 95 ret + +000019d0 : + 19d0: 0f 93 push r16 + 19d2: 85 e0 ldi r24, 0x05 ; 5 + 19d4: 80 93 0d 22 sts 0x220D, r24 + 19d8: e9 e2 ldi r30, 0x29 ; 41 + 19da: f2 e2 ldi r31, 0x22 ; 34 + 19dc: 04 e0 ldi r16, 0x04 ; 4 + 19de: 05 93 las Z, r16 + 19e0: e1 e2 ldi r30, 0x21 ; 33 + 19e2: f2 e2 ldi r31, 0x22 ; 34 + 19e4: 04 e0 ldi r16, 0x04 ; 4 + 19e6: 05 93 las Z, r16 + 19e8: 0f 91 pop r16 + 19ea: 08 95 ret + +000019ec : + 19ec: 0f 93 push r16 + 19ee: 83 e0 ldi r24, 0x03 ; 3 + 19f0: 80 93 0d 22 sts 0x220D, r24 + 19f4: 10 92 2a 22 sts 0x222A, r1 + 19f8: 10 92 2b 22 sts 0x222B, r1 + 19fc: e8 e2 ldi r30, 0x28 ; 40 + 19fe: f2 e2 ldi r31, 0x22 ; 34 + 1a00: 02 e0 ldi r16, 0x02 ; 2 + 1a02: 06 93 lac Z, r16 + 1a04: 0f 91 pop r16 + 1a06: 08 95 ret + +00001a08 : + 1a08: e0 91 72 24 lds r30, 0x2472 + 1a0c: f0 91 73 24 lds r31, 0x2473 + 1a10: 30 97 sbiw r30, 0x00 ; 0 + 1a12: 09 f0 breq .+2 ; 0x1a16 + 1a14: 09 94 ijmp + 1a16: 08 95 ret + +00001a18 : + 1a18: 98 2f mov r25, r24 + 1a1a: 9f 70 andi r25, 0x0F ; 15 + 1a1c: 28 2f mov r18, r24 + 1a1e: 33 27 eor r19, r19 + 1a20: 27 fd sbrc r18, 7 + 1a22: 30 95 com r19 + 1a24: 22 27 eor r18, r18 + 1a26: 33 0f add r19, r19 + 1a28: 22 1f adc r18, r18 + 1a2a: 33 27 eor r19, r19 + 1a2c: 29 0f add r18, r25 + 1a2e: 31 1d adc r19, r1 + 1a30: 29 0f add r18, r25 + 1a32: 31 1d adc r19, r1 + 1a34: 22 50 subi r18, 0x02 ; 2 + 1a36: 31 09 sbc r19, r1 + 1a38: 49 e0 ldi r20, 0x09 ; 9 + 1a3a: 42 9f mul r20, r18 + 1a3c: c0 01 movw r24, r0 + 1a3e: 43 9f mul r20, r19 + 1a40: 90 0d add r25, r0 + 1a42: 11 24 eor r1, r1 + 1a44: 8d 56 subi r24, 0x6D ; 109 + 1a46: 9e 4d sbci r25, 0xDE ; 222 + 1a48: 08 95 ret + +00001a4a : + 1a4a: 8f 92 push r8 + 1a4c: 9f 92 push r9 + 1a4e: bf 92 push r11 + 1a50: cf 92 push r12 + 1a52: df 92 push r13 + 1a54: ef 92 push r14 + 1a56: ff 92 push r15 + 1a58: 0f 93 push r16 + 1a5a: 1f 93 push r17 + 1a5c: cf 93 push r28 + 1a5e: df 93 push r29 + 1a60: b8 2e mov r11, r24 + 1a62: da df rcall .-76 ; 0x1a18 + 1a64: ec 01 movw r28, r24 + 1a66: 8b 2d mov r24, r11 + 1a68: 73 df rcall .-282 ; 0x1950 + 1a6a: 7c 01 movw r14, r24 + 1a6c: dc 01 movw r26, r24 + 1a6e: 11 96 adiw r26, 0x01 ; 1 + 1a70: ec 91 ld r30, X + 1a72: e7 70 andi r30, 0x07 ; 7 + 1a74: e1 50 subi r30, 0x01 ; 1 + 1a76: e7 30 cpi r30, 0x07 ; 7 + 1a78: 40 f4 brcc .+16 ; 0x1a8a + 1a7a: f0 e0 ldi r31, 0x00 ; 0 + 1a7c: ee 0f add r30, r30 + 1a7e: ff 1f adc r31, r31 + 1a80: ee 54 subi r30, 0x4E ; 78 + 1a82: ff 4d sbci r31, 0xDF ; 223 + 1a84: 00 81 ld r16, Z + 1a86: 11 81 ldd r17, Z+1 ; 0x01 + 1a88: 02 c0 rjmp .+4 ; 0x1a8e + 1a8a: 08 e0 ldi r16, 0x08 ; 8 + 1a8c: 10 e0 ldi r17, 0x00 ; 0 + 1a8e: ed 81 ldd r30, Y+5 ; 0x05 + 1a90: fe 81 ldd r31, Y+6 ; 0x06 + 1a92: 8b 81 ldd r24, Y+3 ; 0x03 + 1a94: 9c 81 ldd r25, Y+4 ; 0x04 + 1a96: 48 81 ld r20, Y + 1a98: d7 01 movw r26, r14 + 1a9a: b7 fe sbrs r11, 7 + 1a9c: 4f c0 rjmp .+158 ; 0x1b3c + 1a9e: 16 96 adiw r26, 0x06 ; 6 + 1aa0: 2d 91 ld r18, X+ + 1aa2: 3c 91 ld r19, X + 1aa4: 17 97 sbiw r26, 0x07 ; 7 + 1aa6: 2e 0f add r18, r30 + 1aa8: 3f 1f adc r19, r31 + 1aaa: 2d 83 std Y+5, r18 ; 0x05 + 1aac: 3e 83 std Y+6, r19 ; 0x06 + 1aae: 28 17 cp r18, r24 + 1ab0: 39 07 cpc r19, r25 + 1ab2: 99 f1 breq .+102 ; 0x1b1a + 1ab4: fc 01 movw r30, r24 + 1ab6: e2 1b sub r30, r18 + 1ab8: f3 0b sbc r31, r19 + 1aba: 9f 01 movw r18, r30 + 1abc: 21 15 cp r18, r1 + 1abe: f4 e0 ldi r31, 0x04 ; 4 + 1ac0: 3f 07 cpc r19, r31 + 1ac2: 38 f0 brcs .+14 ; 0x1ad2 + 1ac4: 2f ef ldi r18, 0xFF ; 255 + 1ac6: 33 e0 ldi r19, 0x03 ; 3 + 1ac8: c9 01 movw r24, r18 + 1aca: b8 01 movw r22, r16 + 1acc: 0b d5 rcall .+2582 ; 0x24e4 <__udivmodhi4> + 1ace: 28 1b sub r18, r24 + 1ad0: 39 0b sbc r19, r25 + 1ad2: 41 ff sbrs r20, 1 + 1ad4: 09 c0 rjmp .+18 ; 0x1ae8 + 1ad6: c9 01 movw r24, r18 + 1ad8: b8 01 movw r22, r16 + 1ada: 04 d5 rcall .+2568 ; 0x24e4 <__udivmodhi4> + 1adc: 41 e0 ldi r20, 0x01 ; 1 + 1ade: 89 2b or r24, r25 + 1ae0: 09 f0 breq .+2 ; 0x1ae4 + 1ae2: 40 e0 ldi r20, 0x00 ; 0 + 1ae4: 94 2f mov r25, r20 + 1ae6: 01 c0 rjmp .+2 ; 0x1aea + 1ae8: 90 e0 ldi r25, 0x00 ; 0 + 1aea: 88 81 ld r24, Y + 1aec: 90 fb bst r25, 0 + 1aee: 81 f9 bld r24, 1 + 1af0: 88 83 st Y, r24 + 1af2: d7 01 movw r26, r14 + 1af4: 16 96 adiw r26, 0x06 ; 6 + 1af6: 1d 92 st X+, r1 + 1af8: 1c 92 st X, r1 + 1afa: 17 97 sbiw r26, 0x07 ; 7 + 1afc: 12 96 adiw r26, 0x02 ; 2 + 1afe: 2d 93 st X+, r18 + 1b00: 3c 93 st X, r19 + 1b02: 13 97 sbiw r26, 0x03 ; 3 + 1b04: 89 81 ldd r24, Y+1 ; 0x01 + 1b06: 9a 81 ldd r25, Y+2 ; 0x02 + 1b08: 2d 81 ldd r18, Y+5 ; 0x05 + 1b0a: 3e 81 ldd r19, Y+6 ; 0x06 + 1b0c: 82 0f add r24, r18 + 1b0e: 93 1f adc r25, r19 + 1b10: 14 96 adiw r26, 0x04 ; 4 + 1b12: 8d 93 st X+, r24 + 1b14: 9c 93 st X, r25 + 1b16: 15 97 sbiw r26, 0x05 ; 5 + 1b18: 0d c0 rjmp .+26 ; 0x1b34 + 1b1a: 41 ff sbrs r20, 1 + 1b1c: 70 c0 rjmp .+224 ; 0x1bfe + 1b1e: 4d 7f andi r20, 0xFD ; 253 + 1b20: 48 83 st Y, r20 + 1b22: d7 01 movw r26, r14 + 1b24: 16 96 adiw r26, 0x06 ; 6 + 1b26: 1d 92 st X+, r1 + 1b28: 1c 92 st X, r1 + 1b2a: 17 97 sbiw r26, 0x07 ; 7 + 1b2c: 12 96 adiw r26, 0x02 ; 2 + 1b2e: 1d 92 st X+, r1 + 1b30: 1c 92 st X, r1 + 1b32: 13 97 sbiw r26, 0x03 ; 3 + 1b34: f7 01 movw r30, r14 + 1b36: 02 e0 ldi r16, 0x02 ; 2 + 1b38: 06 93 lac Z, r16 + 1b3a: 7a c0 rjmp .+244 ; 0x1c30 + 1b3c: 12 96 adiw r26, 0x02 ; 2 + 1b3e: cd 90 ld r12, X+ + 1b40: dc 90 ld r13, X + 1b42: 13 97 sbiw r26, 0x03 ; 3 + 1b44: 42 ff sbrs r20, 2 + 1b46: 0f c0 rjmp .+30 ; 0x1b66 + 1b48: 89 80 ldd r8, Y+1 ; 0x01 + 1b4a: 9a 80 ldd r9, Y+2 ; 0x02 + 1b4c: b8 01 movw r22, r16 + 1b4e: ca d4 rcall .+2452 ; 0x24e4 <__udivmodhi4> + 1b50: b0 e4 ldi r27, 0x40 ; 64 + 1b52: bb 9e mul r11, r27 + 1b54: b0 01 movw r22, r0 + 1b56: 11 24 eor r1, r1 + 1b58: 6d 56 subi r22, 0x6D ; 109 + 1b5a: 7f 4d sbci r23, 0xDF ; 223 + 1b5c: ac 01 movw r20, r24 + 1b5e: c4 01 movw r24, r8 + 1b60: 8e 0f add r24, r30 + 1b62: 9f 1f adc r25, r31 + 1b64: d9 d4 rcall .+2482 ; 0x2518 + 1b66: 6d 81 ldd r22, Y+5 ; 0x05 + 1b68: 7e 81 ldd r23, Y+6 ; 0x06 + 1b6a: 6c 0d add r22, r12 + 1b6c: 7d 1d adc r23, r13 + 1b6e: 6d 83 std Y+5, r22 ; 0x05 + 1b70: 7e 83 std Y+6, r23 ; 0x06 + 1b72: 2b 81 ldd r18, Y+3 ; 0x03 + 1b74: 3c 81 ldd r19, Y+4 ; 0x04 + 1b76: 26 17 cp r18, r22 + 1b78: 37 07 cpc r19, r23 + 1b7a: 10 f4 brcc .+4 ; 0x1b80 + 1b7c: 2d 83 std Y+5, r18 ; 0x05 + 1b7e: 3e 83 std Y+6, r19 ; 0x06 + 1b80: f7 01 movw r30, r14 + 1b82: 86 81 ldd r24, Z+6 ; 0x06 + 1b84: 97 81 ldd r25, Z+7 ; 0x07 + 1b86: c8 16 cp r12, r24 + 1b88: d9 06 cpc r13, r25 + 1b8a: c9 f5 brne .+114 ; 0x1bfe + 1b8c: 8d 81 ldd r24, Y+5 ; 0x05 + 1b8e: 9e 81 ldd r25, Y+6 ; 0x06 + 1b90: 82 17 cp r24, r18 + 1b92: 93 07 cpc r25, r19 + 1b94: a1 f1 breq .+104 ; 0x1bfe + 1b96: 28 1b sub r18, r24 + 1b98: 39 0b sbc r19, r25 + 1b9a: 21 15 cp r18, r1 + 1b9c: f4 e0 ldi r31, 0x04 ; 4 + 1b9e: 3f 07 cpc r19, r31 + 1ba0: 10 f0 brcs .+4 ; 0x1ba6 + 1ba2: 2f ef ldi r18, 0xFF ; 255 + 1ba4: 33 e0 ldi r19, 0x03 ; 3 + 1ba6: c9 01 movw r24, r18 + 1ba8: b8 01 movw r22, r16 + 1baa: 9c d4 rcall .+2360 ; 0x24e4 <__udivmodhi4> + 1bac: 28 1b sub r18, r24 + 1bae: 39 0b sbc r19, r25 + 1bb0: d7 01 movw r26, r14 + 1bb2: 12 96 adiw r26, 0x02 ; 2 + 1bb4: 1d 92 st X+, r1 + 1bb6: 1c 92 st X, r1 + 1bb8: 13 97 sbiw r26, 0x03 ; 3 + 1bba: 20 17 cp r18, r16 + 1bbc: 31 07 cpc r19, r17 + 1bbe: 78 f4 brcc .+30 ; 0x1bde + 1bc0: 88 81 ld r24, Y + 1bc2: 84 60 ori r24, 0x04 ; 4 + 1bc4: 88 83 st Y, r24 + 1bc6: b0 e4 ldi r27, 0x40 ; 64 + 1bc8: bb 9e mul r11, r27 + 1bca: c0 01 movw r24, r0 + 1bcc: 11 24 eor r1, r1 + 1bce: 8d 56 subi r24, 0x6D ; 109 + 1bd0: 9f 4d sbci r25, 0xDF ; 223 + 1bd2: f7 01 movw r30, r14 + 1bd4: 84 83 std Z+4, r24 ; 0x04 + 1bd6: 95 83 std Z+5, r25 ; 0x05 + 1bd8: 06 83 std Z+6, r16 ; 0x06 + 1bda: 17 83 std Z+7, r17 ; 0x07 + 1bdc: ab cf rjmp .-170 ; 0x1b34 + 1bde: 89 81 ldd r24, Y+1 ; 0x01 + 1be0: 9a 81 ldd r25, Y+2 ; 0x02 + 1be2: 4d 81 ldd r20, Y+5 ; 0x05 + 1be4: 5e 81 ldd r21, Y+6 ; 0x06 + 1be6: 84 0f add r24, r20 + 1be8: 95 1f adc r25, r21 + 1bea: d7 01 movw r26, r14 + 1bec: 14 96 adiw r26, 0x04 ; 4 + 1bee: 8d 93 st X+, r24 + 1bf0: 9c 93 st X, r25 + 1bf2: 15 97 sbiw r26, 0x05 ; 5 + 1bf4: 16 96 adiw r26, 0x06 ; 6 + 1bf6: 2d 93 st X+, r18 + 1bf8: 3c 93 st X, r19 + 1bfa: 17 97 sbiw r26, 0x07 ; 7 + 1bfc: 9b cf rjmp .-202 ; 0x1b34 + 1bfe: 88 81 ld r24, Y + 1c00: 80 ff sbrs r24, 0 + 1c02: 16 c0 rjmp .+44 ; 0x1c30 + 1c04: 8e 7f andi r24, 0xFE ; 254 + 1c06: 88 83 st Y, r24 + 1c08: ef 81 ldd r30, Y+7 ; 0x07 + 1c0a: f8 85 ldd r31, Y+8 ; 0x08 + 1c0c: 30 97 sbiw r30, 0x00 ; 0 + 1c0e: 81 f0 breq .+32 ; 0x1c30 + 1c10: 6d 81 ldd r22, Y+5 ; 0x05 + 1c12: 7e 81 ldd r23, Y+6 ; 0x06 + 1c14: 4b 2d mov r20, r11 + 1c16: 80 e0 ldi r24, 0x00 ; 0 + 1c18: df 91 pop r29 + 1c1a: cf 91 pop r28 + 1c1c: 1f 91 pop r17 + 1c1e: 0f 91 pop r16 + 1c20: ff 90 pop r15 + 1c22: ef 90 pop r14 + 1c24: df 90 pop r13 + 1c26: cf 90 pop r12 + 1c28: bf 90 pop r11 + 1c2a: 9f 90 pop r9 + 1c2c: 8f 90 pop r8 + 1c2e: 09 94 ijmp + 1c30: df 91 pop r29 + 1c32: cf 91 pop r28 + 1c34: 1f 91 pop r17 + 1c36: 0f 91 pop r16 + 1c38: ff 90 pop r15 + 1c3a: ef 90 pop r14 + 1c3c: df 90 pop r13 + 1c3e: cf 90 pop r12 + 1c40: bf 90 pop r11 + 1c42: 9f 90 pop r9 + 1c44: 8f 90 pop r8 + 1c46: 08 95 ret + +00001c48 : + 1c48: 0f 93 push r16 + 1c4a: cf 93 push r28 + 1c4c: df 93 push r29 + 1c4e: 80 91 0d 22 lds r24, 0x220D + 1c52: 83 30 cpi r24, 0x03 ; 3 + 1c54: 29 f4 brne .+10 ; 0x1c60 + 1c56: d8 de rcall .-592 ; 0x1a08 + 1c58: df 91 pop r29 + 1c5a: cf 91 pop r28 + 1c5c: 0f 91 pop r16 + 1c5e: 8d ce rjmp .-742 ; 0x197a + 1c60: 20 91 09 22 lds r18, 0x2209 + 1c64: 30 91 0a 22 lds r19, 0x220A + 1c68: c0 91 70 24 lds r28, 0x2470 + 1c6c: d0 91 71 24 lds r29, 0x2471 + 1c70: c2 1b sub r28, r18 + 1c72: d3 0b sbc r29, r19 + 1c74: 61 f5 brne .+88 ; 0x1cce + 1c76: 80 91 0b 22 lds r24, 0x220B + 1c7a: 90 91 0c 22 lds r25, 0x220C + 1c7e: 82 0f add r24, r18 + 1c80: 93 1f adc r25, r19 + 1c82: 80 93 0b 22 sts 0x220B, r24 + 1c86: 90 93 0c 22 sts 0x220C, r25 + 1c8a: 20 91 6c 24 lds r18, 0x246C + 1c8e: 30 91 6d 24 lds r19, 0x246D + 1c92: 28 17 cp r18, r24 + 1c94: 39 07 cpc r19, r25 + 1c96: 21 f0 breq .+8 ; 0x1ca0 + 1c98: 80 91 d2 20 lds r24, 0x20D2 + 1c9c: 88 23 and r24, r24 + 1c9e: 31 f0 breq .+12 ; 0x1cac + 1ca0: 84 e0 ldi r24, 0x04 ; 4 + 1ca2: 80 93 0d 22 sts 0x220D, r24 + 1ca6: e0 e2 ldi r30, 0x20 ; 32 + 1ca8: f2 e2 ldi r31, 0x22 ; 34 + 1caa: 36 c0 rjmp .+108 ; 0x1d18 + 1cac: e0 91 74 24 lds r30, 0x2474 + 1cb0: f0 91 75 24 lds r31, 0x2475 + 1cb4: 30 97 sbiw r30, 0x00 ; 0 + 1cb6: 99 f0 breq .+38 ; 0x1cde + 1cb8: 09 95 icall + 1cba: 88 23 and r24, r24 + 1cbc: 81 f0 breq .+32 ; 0x1cde + 1cbe: 10 92 09 22 sts 0x2209, r1 + 1cc2: 10 92 0a 22 sts 0x220A, r1 + 1cc6: c0 91 70 24 lds r28, 0x2470 + 1cca: d0 91 71 24 lds r29, 0x2471 + 1cce: c0 34 cpi r28, 0x40 ; 64 + 1cd0: d1 05 cpc r29, r1 + 1cd2: 28 f0 brcs .+10 ; 0x1cde + 1cd4: 10 92 d2 20 sts 0x20D2, r1 + 1cd8: c0 e4 ldi r28, 0x40 ; 64 + 1cda: d0 e0 ldi r29, 0x00 ; 0 + 1cdc: 03 c0 rjmp .+6 ; 0x1ce4 + 1cde: 81 e0 ldi r24, 0x01 ; 1 + 1ce0: 80 93 d2 20 sts 0x20D2, r24 + 1ce4: c0 93 2a 22 sts 0x222A, r28 + 1ce8: d0 93 2b 22 sts 0x222B, r29 + 1cec: 20 91 09 22 lds r18, 0x2209 + 1cf0: 30 91 0a 22 lds r19, 0x220A + 1cf4: 80 91 6e 24 lds r24, 0x246E + 1cf8: 90 91 6f 24 lds r25, 0x246F + 1cfc: 82 0f add r24, r18 + 1cfe: 93 1f adc r25, r19 + 1d00: 80 93 2c 22 sts 0x222C, r24 + 1d04: 90 93 2d 22 sts 0x222D, r25 + 1d08: c2 0f add r28, r18 + 1d0a: d3 1f adc r29, r19 + 1d0c: c0 93 09 22 sts 0x2209, r28 + 1d10: d0 93 0a 22 sts 0x220A, r29 + 1d14: e8 e2 ldi r30, 0x28 ; 40 + 1d16: f2 e2 ldi r31, 0x22 ; 34 + 1d18: 02 e0 ldi r16, 0x02 ; 2 + 1d1a: 06 93 lac Z, r16 + 1d1c: df 91 pop r29 + 1d1e: cf 91 pop r28 + 1d20: 0f 91 pop r16 + 1d22: 08 95 ret + +00001d24 : + 1d24: 0f 93 push r16 + 1d26: cf 93 push r28 + 1d28: df 93 push r29 + 1d2a: 1f 92 push r1 + 1d2c: cd b7 in r28, 0x3d ; 61 + 1d2e: de b7 in r29, 0x3e ; 62 + 1d30: 80 91 cc 04 lds r24, 0x04CC + 1d34: 80 ff sbrs r24, 0 + 1d36: 65 c0 rjmp .+202 ; 0x1e02 + 1d38: 81 e0 ldi r24, 0x01 ; 1 + 1d3a: 80 93 cc 04 sts 0x04CC, r24 + 1d3e: e0 e2 ldi r30, 0x20 ; 32 + 1d40: f2 e2 ldi r31, 0x22 ; 34 + 1d42: 00 e8 ldi r16, 0x80 ; 128 + 1d44: 06 93 lac Z, r16 + 1d46: e8 e2 ldi r30, 0x28 ; 40 + 1d48: f2 e2 ldi r31, 0x22 ; 34 + 1d4a: 00 e8 ldi r16, 0x80 ; 128 + 1d4c: 06 93 lac Z, r16 + 1d4e: 80 93 ca 04 sts 0x04CA, r24 + 1d52: e0 e2 ldi r30, 0x20 ; 32 + 1d54: f2 e2 ldi r31, 0x22 ; 34 + 1d56: 00 e1 ldi r16, 0x10 ; 16 + 1d58: 06 93 lac Z, r16 + 1d5a: 80 91 0d 22 lds r24, 0x220D + 1d5e: 88 23 and r24, r24 + 1d60: 29 f0 breq .+10 ; 0x1d6c + 1d62: 83 50 subi r24, 0x03 ; 3 + 1d64: 82 30 cpi r24, 0x02 ; 2 + 1d66: 08 f4 brcc .+2 ; 0x1d6a + 1d68: 4f de rcall .-866 ; 0x1a08 + 1d6a: 07 de rcall .-1010 ; 0x197a + 1d6c: 80 91 22 22 lds r24, 0x2222 + 1d70: 90 91 23 22 lds r25, 0x2223 + 1d74: 08 97 sbiw r24, 0x08 ; 8 + 1d76: 09 f0 breq .+2 ; 0x1d7a + 1d78: 46 c0 rjmp .+140 ; 0x1e06 + 1d7a: 88 e0 ldi r24, 0x08 ; 8 + 1d7c: e9 ec ldi r30, 0xC9 ; 201 + 1d7e: f1 e2 ldi r31, 0x21 ; 33 + 1d80: a6 e6 ldi r26, 0x66 ; 102 + 1d82: b4 e2 ldi r27, 0x24 ; 36 + 1d84: 01 90 ld r0, Z+ + 1d86: 0d 92 st X+, r0 + 1d88: 8a 95 dec r24 + 1d8a: e1 f7 brne .-8 ; 0x1d84 + 1d8c: 80 91 c8 04 lds r24, 0x04C8 + 1d90: 80 62 ori r24, 0x20 ; 32 + 1d92: 80 93 c8 04 sts 0x04C8, r24 + 1d96: 80 91 c8 04 lds r24, 0x04C8 + 1d9a: 80 62 ori r24, 0x20 ; 32 + 1d9c: 80 93 c8 04 sts 0x04C8, r24 + 1da0: 63 da rcall .-2874 ; 0x1268 + 1da2: 81 11 cpse r24, r1 + 1da4: 02 c0 rjmp .+4 ; 0x1daa + 1da6: 14 de rcall .-984 ; 0x19d0 + 1da8: 2e c0 rjmp .+92 ; 0x1e06 + 1daa: 90 91 66 24 lds r25, 0x2466 + 1dae: 97 ff sbrs r25, 7 + 1db0: 0e c0 rjmp .+28 ; 0x1dce + 1db2: 10 92 0b 22 sts 0x220B, r1 + 1db6: 10 92 0c 22 sts 0x220C, r1 + 1dba: 10 92 09 22 sts 0x2209, r1 + 1dbe: 10 92 0a 22 sts 0x220A, r1 + 1dc2: 92 e0 ldi r25, 0x02 ; 2 + 1dc4: 90 93 0d 22 sts 0x220D, r25 + 1dc8: 89 83 std Y+1, r24 ; 0x01 + 1dca: 3e df rcall .-388 ; 0x1c48 + 1dcc: 08 c0 rjmp .+16 ; 0x1dde + 1dce: 20 91 6c 24 lds r18, 0x246C + 1dd2: 30 91 6d 24 lds r19, 0x246D + 1dd6: 23 2b or r18, r19 + 1dd8: 21 f4 brne .+8 ; 0x1de2 + 1dda: 89 83 std Y+1, r24 ; 0x01 + 1ddc: 07 de rcall .-1010 ; 0x19ec + 1dde: 89 81 ldd r24, Y+1 ; 0x01 + 1de0: 13 c0 rjmp .+38 ; 0x1e08 + 1de2: 10 92 0b 22 sts 0x220B, r1 + 1de6: 10 92 0c 22 sts 0x220C, r1 + 1dea: 10 92 09 22 sts 0x2209, r1 + 1dee: 10 92 0a 22 sts 0x220A, r1 + 1df2: 91 e0 ldi r25, 0x01 ; 1 + 1df4: 90 93 0d 22 sts 0x220D, r25 + 1df8: e0 e2 ldi r30, 0x20 ; 32 + 1dfa: f2 e2 ldi r31, 0x22 ; 34 + 1dfc: 02 e0 ldi r16, 0x02 ; 2 + 1dfe: 06 93 lac Z, r16 + 1e00: 03 c0 rjmp .+6 ; 0x1e08 + 1e02: 80 e0 ldi r24, 0x00 ; 0 + 1e04: 01 c0 rjmp .+2 ; 0x1e08 + 1e06: 81 e0 ldi r24, 0x01 ; 1 + 1e08: 0f 90 pop r0 + 1e0a: df 91 pop r29 + 1e0c: cf 91 pop r28 + 1e0e: 0f 91 pop r16 + 1e10: 08 95 ret + +00001e12 : + 1e12: cf 93 push r28 + 1e14: cf b7 in r28, 0x3f ; 63 + 1e16: f8 94 cli + 1e18: 81 e0 ldi r24, 0x01 ; 1 + 1e1a: 87 dd rcall .-1266 ; 0x192a + 1e1c: ea ec ldi r30, 0xCA ; 202 + 1e1e: f4 e0 ldi r31, 0x04 ; 4 + 1e20: 80 e4 ldi r24, 0x40 ; 64 + 1e22: 80 83 st Z, r24 + 1e24: 80 e2 ldi r24, 0x20 ; 32 + 1e26: 80 83 st Z, r24 + 1e28: e1 ec ldi r30, 0xC1 ; 193 + 1e2a: f4 e0 ldi r31, 0x04 ; 4 + 1e2c: 80 81 ld r24, Z + 1e2e: 81 60 ori r24, 0x01 ; 1 + 1e30: 80 83 st Z, r24 + 1e32: a9 ec ldi r26, 0xC9 ; 201 + 1e34: b4 e0 ldi r27, 0x04 ; 4 + 1e36: 8c 91 ld r24, X + 1e38: 82 60 ori r24, 0x02 ; 2 + 1e3a: 8c 93 st X, r24 + 1e3c: e8 ec ldi r30, 0xC8 ; 200 + 1e3e: f4 e0 ldi r31, 0x04 ; 4 + 1e40: 80 81 ld r24, Z + 1e42: 80 64 ori r24, 0x40 ; 64 + 1e44: 80 83 st Z, r24 + 1e46: 8c 91 ld r24, X + 1e48: 81 60 ori r24, 0x01 ; 1 + 1e4a: 8c 93 st X, r24 + 1e4c: 80 81 ld r24, Z + 1e4e: 80 68 ori r24, 0x80 ; 128 + 1e50: 80 83 st Z, r24 + 1e52: cf bf out 0x3f, r28 ; 63 + 1e54: cf 91 pop r28 + 1e56: 08 95 ret + +00001e58 : + 1e58: cf 93 push r28 + 1e5a: 10 92 60 00 sts 0x0060, r1 + 1e5e: 80 e3 ldi r24, 0x30 ; 48 + 1e60: a0 d8 rcall .-3776 ; 0xfa2 + 1e62: 80 91 c0 04 lds r24, 0x04C0 + 1e66: 80 64 ori r24, 0x40 ; 64 + 1e68: 80 93 c0 04 sts 0x04C0, r24 + 1e6c: 81 e0 ldi r24, 0x01 ; 1 + 1e6e: 80 93 60 00 sts 0x0060, r24 + 1e72: cf b7 in r28, 0x3f ; 63 + 1e74: f8 94 cli + 1e76: 80 e0 ldi r24, 0x00 ; 0 + 1e78: 90 e0 ldi r25, 0x00 ; 0 + 1e7a: fc 01 movw r30, r24 + 1e7c: 73 e0 ldi r23, 0x03 ; 3 + 1e7e: ee 0f add r30, r30 + 1e80: ff 1f adc r31, r31 + 1e82: 7a 95 dec r23 + 1e84: e1 f7 brne .-8 ; 0x1e7e + 1e86: ef 5d subi r30, 0xDF ; 223 + 1e88: fd 4d sbci r31, 0xDD ; 221 + 1e8a: 10 82 st Z, r1 + 1e8c: 01 96 adiw r24, 0x01 ; 1 + 1e8e: 88 30 cpi r24, 0x08 ; 8 + 1e90: 91 05 cpc r25, r1 + 1e92: 99 f7 brne .-26 ; 0x1e7a + 1e94: 80 91 93 21 lds r24, 0x2193 + 1e98: 8e 7f andi r24, 0xFE ; 254 + 1e9a: 80 93 93 21 sts 0x2193, r24 + 1e9e: 80 91 9c 21 lds r24, 0x219C + 1ea2: 8e 7f andi r24, 0xFE ; 254 + 1ea4: 80 93 9c 21 sts 0x219C, r24 + 1ea8: 80 91 a5 21 lds r24, 0x21A5 + 1eac: 8e 7f andi r24, 0xFE ; 254 + 1eae: 80 93 a5 21 sts 0x21A5, r24 + 1eb2: 80 91 ae 21 lds r24, 0x21AE + 1eb6: 8e 7f andi r24, 0xFE ; 254 + 1eb8: 80 93 ae 21 sts 0x21AE, r24 + 1ebc: 80 91 b7 21 lds r24, 0x21B7 + 1ec0: 8e 7f andi r24, 0xFE ; 254 + 1ec2: 80 93 b7 21 sts 0x21B7, r24 + 1ec6: 80 91 c0 21 lds r24, 0x21C0 + 1eca: 8e 7f andi r24, 0xFE ; 254 + 1ecc: 80 93 c0 21 sts 0x21C0, r24 + 1ed0: 6a e1 ldi r22, 0x1A ; 26 + 1ed2: 70 e0 ldi r23, 0x00 ; 0 + 1ed4: 82 e0 ldi r24, 0x02 ; 2 + 1ed6: 01 dd rcall .-1534 ; 0x18da + 1ed8: 8f 3f cpi r24, 0xFF ; 255 + 1eda: 09 f4 brne .+2 ; 0x1ede + 1edc: 8f e1 ldi r24, 0x1F ; 31 + 1ede: 80 93 fa 04 sts 0x04FA, r24 + 1ee2: 6b e1 ldi r22, 0x1B ; 27 + 1ee4: 70 e0 ldi r23, 0x00 ; 0 + 1ee6: 82 e0 ldi r24, 0x02 ; 2 + 1ee8: f8 dc rcall .-1552 ; 0x18da + 1eea: 8f 3f cpi r24, 0xFF ; 255 + 1eec: 09 f4 brne .+2 ; 0x1ef0 + 1eee: 8f e1 ldi r24, 0x1F ; 31 + 1ef0: 80 93 fb 04 sts 0x04FB, r24 + 1ef4: 80 91 c0 04 lds r24, 0x04C0 + 1ef8: 83 60 ori r24, 0x03 ; 3 + 1efa: 80 93 c0 04 sts 0x04C0, r24 + 1efe: 80 91 c0 04 lds r24, 0x04C0 + 1f02: 80 68 ori r24, 0x80 ; 128 + 1f04: 80 93 c0 04 sts 0x04C0, r24 + 1f08: 80 91 c0 04 lds r24, 0x04C0 + 1f0c: 80 61 ori r24, 0x10 ; 16 + 1f0e: 80 93 c0 04 sts 0x04C0, r24 + 1f12: 80 e2 ldi r24, 0x20 ; 32 + 1f14: 92 e2 ldi r25, 0x22 ; 34 + 1f16: 80 93 c6 04 sts 0x04C6, r24 + 1f1a: 90 93 c7 04 sts 0x04C7, r25 + 1f1e: 80 91 c0 04 lds r24, 0x04C0 + 1f22: 80 62 ori r24, 0x20 ; 32 + 1f24: 80 93 c0 04 sts 0x04C0, r24 + 1f28: 8f ef ldi r24, 0xFF ; 255 + 1f2a: 80 93 c5 04 sts 0x04C5, r24 + 1f2e: 80 91 c8 04 lds r24, 0x04C8 + 1f32: 82 60 ori r24, 0x02 ; 2 + 1f34: 80 93 c8 04 sts 0x04C8, r24 + 1f38: 10 92 64 22 sts 0x2264, r1 + 1f3c: 85 e0 ldi r24, 0x05 ; 5 + 1f3e: d7 dc rcall .-1618 ; 0x18ee + 1f40: 68 df rcall .-304 ; 0x1e12 + 1f42: cf bf out 0x3f, r28 ; 63 + 1f44: cf 91 pop r28 + 1f46: 08 95 ret + +00001f48 : + 1f48: 80 93 c3 04 sts 0x04C3, r24 + 1f4c: 08 95 ret + +00001f4e : + 1f4e: 80 91 c3 04 lds r24, 0x04C3 + 1f52: 08 95 ret + +00001f54 : + 1f54: 80 93 6e 24 sts 0x246E, r24 + 1f58: 90 93 6f 24 sts 0x246F, r25 + 1f5c: 60 93 70 24 sts 0x2470, r22 + 1f60: 70 93 71 24 sts 0x2471, r23 + 1f64: 08 95 ret + +00001f66 : + 1f66: 0f 93 push r16 + 1f68: 1f 93 push r17 + 1f6a: cf 93 push r28 + 1f6c: df 93 push r29 + 1f6e: 1f 92 push r1 + 1f70: cd b7 in r28, 0x3d ; 61 + 1f72: de b7 in r29, 0x3e ; 62 + 1f74: 8a 01 movw r16, r20 + 1f76: 69 83 std Y+1, r22 ; 0x01 + 1f78: eb dc rcall .-1578 ; 0x1950 + 1f7a: fc 01 movw r30, r24 + 1f7c: 81 81 ldd r24, Z+1 ; 0x01 + 1f7e: 80 7c andi r24, 0xC0 ; 192 + 1f80: 69 81 ldd r22, Y+1 ; 0x01 + 1f82: 81 11 cpse r24, r1 + 1f84: 3b c0 rjmp .+118 ; 0x1ffc + 1f86: 63 70 andi r22, 0x03 ; 3 + 1f88: 61 30 cpi r22, 0x01 ; 1 + 1f8a: 29 f0 breq .+10 ; 0x1f96 + 1f8c: 10 f4 brcc .+4 ; 0x1f92 + 1f8e: 90 e4 ldi r25, 0x40 ; 64 + 1f90: 03 c0 rjmp .+6 ; 0x1f98 + 1f92: 90 e8 ldi r25, 0x80 ; 128 + 1f94: 01 c0 rjmp .+2 ; 0x1f98 + 1f96: 90 ec ldi r25, 0xC0 ; 192 + 1f98: 00 38 cpi r16, 0x80 ; 128 + 1f9a: 11 05 cpc r17, r1 + 1f9c: e1 f0 breq .+56 ; 0x1fd6 + 1f9e: 50 f4 brcc .+20 ; 0x1fb4 + 1fa0: 00 32 cpi r16, 0x20 ; 32 + 1fa2: 11 05 cpc r17, r1 + 1fa4: a1 f0 breq .+40 ; 0x1fce + 1fa6: 00 34 cpi r16, 0x40 ; 64 + 1fa8: 11 05 cpc r17, r1 + 1faa: 99 f0 breq .+38 ; 0x1fd2 + 1fac: 00 31 cpi r16, 0x10 ; 16 + 1fae: 11 05 cpc r17, r1 + 1fb0: 61 f4 brne .+24 ; 0x1fca + 1fb2: 19 c0 rjmp .+50 ; 0x1fe6 + 1fb4: 01 15 cp r16, r1 + 1fb6: 82 e0 ldi r24, 0x02 ; 2 + 1fb8: 18 07 cpc r17, r24 + 1fba: 89 f0 breq .+34 ; 0x1fde + 1fbc: 0f 3f cpi r16, 0xFF ; 255 + 1fbe: a3 e0 ldi r26, 0x03 ; 3 + 1fc0: 1a 07 cpc r17, r26 + 1fc2: 79 f0 breq .+30 ; 0x1fe2 + 1fc4: 01 15 cp r16, r1 + 1fc6: 11 40 sbci r17, 0x01 ; 1 + 1fc8: 41 f0 breq .+16 ; 0x1fda + 1fca: 80 e0 ldi r24, 0x00 ; 0 + 1fcc: 0d c0 rjmp .+26 ; 0x1fe8 + 1fce: 82 e0 ldi r24, 0x02 ; 2 + 1fd0: 0b c0 rjmp .+22 ; 0x1fe8 + 1fd2: 83 e0 ldi r24, 0x03 ; 3 + 1fd4: 09 c0 rjmp .+18 ; 0x1fe8 + 1fd6: 84 e0 ldi r24, 0x04 ; 4 + 1fd8: 07 c0 rjmp .+14 ; 0x1fe8 + 1fda: 85 e0 ldi r24, 0x05 ; 5 + 1fdc: 05 c0 rjmp .+10 ; 0x1fe8 + 1fde: 86 e0 ldi r24, 0x06 ; 6 + 1fe0: 03 c0 rjmp .+6 ; 0x1fe8 + 1fe2: 87 e0 ldi r24, 0x07 ; 7 + 1fe4: 01 c0 rjmp .+2 ; 0x1fe8 + 1fe6: 81 e0 ldi r24, 0x01 ; 1 + 1fe8: 11 82 std Z+1, r1 ; 0x01 + 1fea: 26 e0 ldi r18, 0x06 ; 6 + 1fec: 20 83 st Z, r18 + 1fee: 89 2b or r24, r25 + 1ff0: 81 83 std Z+1, r24 ; 0x01 + 1ff2: 81 81 ldd r24, Z+1 ; 0x01 + 1ff4: 80 62 ori r24, 0x20 ; 32 + 1ff6: 81 83 std Z+1, r24 ; 0x01 + 1ff8: 81 e0 ldi r24, 0x01 ; 1 + 1ffa: 01 c0 rjmp .+2 ; 0x1ffe + 1ffc: 80 e0 ldi r24, 0x00 ; 0 + 1ffe: 0f 90 pop r0 + 2000: df 91 pop r29 + 2002: cf 91 pop r28 + 2004: 1f 91 pop r17 + 2006: 0f 91 pop r16 + 2008: 08 95 ret + +0000200a : + 200a: a2 dc rcall .-1724 ; 0x1950 + 200c: fc 01 movw r30, r24 + 200e: 81 81 ldd r24, Z+1 ; 0x01 + 2010: 82 fb bst r24, 2 + 2012: 88 27 eor r24, r24 + 2014: 80 f9 bld r24, 0 + 2016: 08 95 ret + +00002018 : + 2018: cf 93 push r28 + 201a: c8 2f mov r28, r24 + 201c: 99 dc rcall .-1742 ; 0x1950 + 201e: fc 01 movw r30, r24 + 2020: 81 81 ldd r24, Z+1 ; 0x01 + 2022: 82 ff sbrs r24, 2 + 2024: 0f c0 rjmp .+30 ; 0x2044 + 2026: 91 81 ldd r25, Z+1 ; 0x01 + 2028: 9b 7f andi r25, 0xFB ; 251 + 202a: 91 83 std Z+1, r25 ; 0x01 + 202c: 8c 2f mov r24, r28 + 202e: f4 dc rcall .-1560 ; 0x1a18 + 2030: fc 01 movw r30, r24 + 2032: 80 81 ld r24, Z + 2034: 80 ff sbrs r24, 0 + 2036: 06 c0 rjmp .+12 ; 0x2044 + 2038: 8e 7f andi r24, 0xFE ; 254 + 203a: 80 83 st Z, r24 + 203c: 07 80 ldd r0, Z+7 ; 0x07 + 203e: f0 85 ldd r31, Z+8 ; 0x08 + 2040: e0 2d mov r30, r0 + 2042: 09 95 icall + 2044: 81 e0 ldi r24, 0x01 ; 1 + 2046: cf 91 pop r28 + 2048: 08 95 ret + +0000204a : + 204a: 8f 92 push r8 + 204c: 9f 92 push r9 + 204e: bf 92 push r11 + 2050: cf 92 push r12 + 2052: df 92 push r13 + 2054: ef 92 push r14 + 2056: ff 92 push r15 + 2058: 0f 93 push r16 + 205a: 1f 93 push r17 + 205c: cf 93 push r28 + 205e: df 93 push r29 + 2060: 1f 92 push r1 + 2062: cd b7 in r28, 0x3d ; 61 + 2064: de b7 in r29, 0x3e ; 62 + 2066: b8 2e mov r11, r24 + 2068: 6a 01 movw r12, r20 + 206a: 79 01 movw r14, r18 + 206c: 69 83 std Y+1, r22 ; 0x01 + 206e: d4 dc rcall .-1624 ; 0x1a18 + 2070: 4c 01 movw r8, r24 + 2072: 8b 2d mov r24, r11 + 2074: 6d dc rcall .-1830 ; 0x1950 + 2076: fc 01 movw r30, r24 + 2078: 81 81 ldd r24, Z+1 ; 0x01 + 207a: 80 7c andi r24, 0xC0 ; 192 + 207c: 69 81 ldd r22, Y+1 ; 0x01 + 207e: 88 23 and r24, r24 + 2080: 09 f4 brne .+2 ; 0x2084 + 2082: 57 c0 rjmp .+174 ; 0x2132 + 2084: 81 81 ldd r24, Z+1 ; 0x01 + 2086: 80 7c andi r24, 0xC0 ; 192 + 2088: 80 3c cpi r24, 0xC0 ; 192 + 208a: 19 f0 breq .+6 ; 0x2092 + 208c: 81 81 ldd r24, Z+1 ; 0x01 + 208e: 82 fd sbrc r24, 2 + 2090: 50 c0 rjmp .+160 ; 0x2132 + 2092: 8f b7 in r24, 0x3f ; 63 + 2094: f8 94 cli + 2096: d4 01 movw r26, r8 + 2098: 9c 91 ld r25, X + 209a: 90 ff sbrs r25, 0 + 209c: 02 c0 rjmp .+4 ; 0x20a2 + 209e: 8f bf out 0x3f, r24 ; 63 + 20a0: 48 c0 rjmp .+144 ; 0x2132 + 20a2: 91 60 ori r25, 0x01 ; 1 + 20a4: d4 01 movw r26, r8 + 20a6: 9c 93 st X, r25 + 20a8: 8f bf out 0x3f, r24 ; 63 + 20aa: d4 01 movw r26, r8 + 20ac: 11 96 adiw r26, 0x01 ; 1 + 20ae: cd 92 st X+, r12 + 20b0: dc 92 st X, r13 + 20b2: 12 97 sbiw r26, 0x02 ; 2 + 20b4: 13 96 adiw r26, 0x03 ; 3 + 20b6: ed 92 st X+, r14 + 20b8: fc 92 st X, r15 + 20ba: 14 97 sbiw r26, 0x04 ; 4 + 20bc: 15 96 adiw r26, 0x05 ; 5 + 20be: 1d 92 st X+, r1 + 20c0: 1c 92 st X, r1 + 20c2: 16 97 sbiw r26, 0x06 ; 6 + 20c4: 17 96 adiw r26, 0x07 ; 7 + 20c6: 0d 93 st X+, r16 + 20c8: 1c 93 st X, r17 + 20ca: 18 97 sbiw r26, 0x08 ; 8 + 20cc: 91 e0 ldi r25, 0x01 ; 1 + 20ce: 61 11 cpse r22, r1 + 20d0: 04 c0 rjmp .+8 ; 0x20da + 20d2: e1 14 cp r14, r1 + 20d4: f1 04 cpc r15, r1 + 20d6: 09 f0 breq .+2 ; 0x20da + 20d8: 90 e0 ldi r25, 0x00 ; 0 + 20da: d4 01 movw r26, r8 + 20dc: 8c 91 ld r24, X + 20de: 90 fb bst r25, 0 + 20e0: 81 f9 bld r24, 1 + 20e2: 8b 7f andi r24, 0xFB ; 251 + 20e4: 8c 93 st X, r24 + 20e6: b7 fc sbrc r11, 7 + 20e8: 1e c0 rjmp .+60 ; 0x2126 + 20ea: 81 81 ldd r24, Z+1 ; 0x01 + 20ec: 80 7c andi r24, 0xC0 ; 192 + 20ee: 80 3c cpi r24, 0xC0 ; 192 + 20f0: c1 f4 brne .+48 ; 0x2122 + 20f2: a1 81 ldd r26, Z+1 ; 0x01 + 20f4: a7 70 andi r26, 0x07 ; 7 + 20f6: a1 50 subi r26, 0x01 ; 1 + 20f8: a7 30 cpi r26, 0x07 ; 7 + 20fa: 40 f4 brcc .+16 ; 0x210c + 20fc: b0 e0 ldi r27, 0x00 ; 0 + 20fe: aa 0f add r26, r26 + 2100: bb 1f adc r27, r27 + 2102: ae 54 subi r26, 0x4E ; 78 + 2104: bf 4d sbci r27, 0xDF ; 223 + 2106: 6d 91 ld r22, X+ + 2108: 7c 91 ld r23, X + 210a: 02 c0 rjmp .+4 ; 0x2110 + 210c: 68 e0 ldi r22, 0x08 ; 8 + 210e: 70 e0 ldi r23, 0x00 ; 0 + 2110: c7 01 movw r24, r14 + 2112: e8 d1 rcall .+976 ; 0x24e4 <__udivmodhi4> + 2114: 89 2b or r24, r25 + 2116: 29 f0 breq .+10 ; 0x2122 + 2118: f4 01 movw r30, r8 + 211a: 80 81 ld r24, Z + 211c: 8e 7f andi r24, 0xFE ; 254 + 211e: 80 83 st Z, r24 + 2120: 08 c0 rjmp .+16 ; 0x2132 + 2122: 12 82 std Z+2, r1 ; 0x02 + 2124: 13 82 std Z+3, r1 ; 0x03 + 2126: 16 82 std Z+6, r1 ; 0x06 + 2128: 17 82 std Z+7, r1 ; 0x07 + 212a: 8b 2d mov r24, r11 + 212c: 8e dc rcall .-1764 ; 0x1a4a + 212e: 81 e0 ldi r24, 0x01 ; 1 + 2130: 01 c0 rjmp .+2 ; 0x2134 + 2132: 80 e0 ldi r24, 0x00 ; 0 + 2134: 0f 90 pop r0 + 2136: df 91 pop r29 + 2138: cf 91 pop r28 + 213a: 1f 91 pop r17 + 213c: 0f 91 pop r16 + 213e: ff 90 pop r15 + 2140: ef 90 pop r14 + 2142: df 90 pop r13 + 2144: cf 90 pop r12 + 2146: bf 90 pop r11 + 2148: 9f 90 pop r9 + 214a: 8f 90 pop r8 + 214c: 08 95 ret + +0000214e : + 214e: 0f 93 push r16 + 2150: 1f 93 push r17 + 2152: cf 93 push r28 + 2154: df 93 push r29 + 2156: 18 2f mov r17, r24 + 2158: fb db rcall .-2058 ; 0x1950 + 215a: ec 01 movw r28, r24 + 215c: 81 2f mov r24, r17 + 215e: 5c dc rcall .-1864 ; 0x1a18 + 2160: dc 01 movw r26, r24 + 2162: fe 01 movw r30, r28 + 2164: 02 e0 ldi r16, 0x02 ; 2 + 2166: 05 93 las Z, r16 + 2168: 8c 91 ld r24, X + 216a: 80 ff sbrs r24, 0 + 216c: 16 c0 rjmp .+44 ; 0x219a + 216e: 8e 7f andi r24, 0xFE ; 254 + 2170: 8c 93 st X, r24 + 2172: 17 96 adiw r26, 0x07 ; 7 + 2174: ed 91 ld r30, X+ + 2176: fc 91 ld r31, X + 2178: 18 97 sbiw r26, 0x08 ; 8 + 217a: 30 97 sbiw r30, 0x00 ; 0 + 217c: 71 f0 breq .+28 ; 0x219a + 217e: 17 ff sbrs r17, 7 + 2180: 03 c0 rjmp .+6 ; 0x2188 + 2182: 6e 81 ldd r22, Y+6 ; 0x06 + 2184: 7f 81 ldd r23, Y+7 ; 0x07 + 2186: 02 c0 rjmp .+4 ; 0x218c + 2188: 6a 81 ldd r22, Y+2 ; 0x02 + 218a: 7b 81 ldd r23, Y+3 ; 0x03 + 218c: 41 2f mov r20, r17 + 218e: 81 e0 ldi r24, 0x01 ; 1 + 2190: df 91 pop r29 + 2192: cf 91 pop r28 + 2194: 1f 91 pop r17 + 2196: 0f 91 pop r16 + 2198: 09 94 ijmp + 219a: df 91 pop r29 + 219c: cf 91 pop r28 + 219e: 1f 91 pop r17 + 21a0: 0f 91 pop r16 + 21a2: 08 95 ret + +000021a4 : + 21a4: cf 93 push r28 + 21a6: c8 2f mov r28, r24 + 21a8: d2 df rcall .-92 ; 0x214e + 21aa: 8c 2f mov r24, r28 + 21ac: d1 db rcall .-2142 ; 0x1950 + 21ae: fc 01 movw r30, r24 + 21b0: 11 82 std Z+1, r1 ; 0x01 + 21b2: cf 91 pop r28 + 21b4: 08 95 ret + +000021b6 : + 21b6: 0f 93 push r16 + 21b8: cf 93 push r28 + 21ba: c8 2f mov r28, r24 + 21bc: c9 db rcall .-2158 ; 0x1950 + 21be: fc 01 movw r30, r24 + 21c0: 91 81 ldd r25, Z+1 ; 0x01 + 21c2: 94 60 ori r25, 0x04 ; 4 + 21c4: 91 83 std Z+1, r25 ; 0x01 + 21c6: 01 e0 ldi r16, 0x01 ; 1 + 21c8: 06 93 lac Z, r16 + 21ca: 8c 2f mov r24, r28 + 21cc: c0 df rcall .-128 ; 0x214e + 21ce: 81 e0 ldi r24, 0x01 ; 1 + 21d0: cf 91 pop r28 + 21d2: 0f 91 pop r16 + 21d4: 08 95 ret + +000021d6 <__vector_125>: + 21d6: 1f 92 push r1 + 21d8: 0f 92 push r0 + 21da: 0f b6 in r0, 0x3f ; 63 + 21dc: 0f 92 push r0 + 21de: 11 24 eor r1, r1 + 21e0: 0f 93 push r16 + 21e2: 2f 93 push r18 + 21e4: 3f 93 push r19 + 21e6: 4f 93 push r20 + 21e8: 5f 93 push r21 + 21ea: 6f 93 push r22 + 21ec: 7f 93 push r23 + 21ee: 8f 93 push r24 + 21f0: 9f 93 push r25 + 21f2: af 93 push r26 + 21f4: bf 93 push r27 + 21f6: ef 93 push r30 + 21f8: ff 93 push r31 + 21fa: 80 91 cb 04 lds r24, 0x04CB + 21fe: 87 ff sbrs r24, 7 + 2200: 07 c0 rjmp .+14 ; 0x2210 <__vector_125+0x3a> + 2202: 80 e8 ldi r24, 0x80 ; 128 + 2204: 80 93 ca 04 sts 0x04CA, r24 + 2208: 0a d8 rcall .-4076 ; 0x121e + 220a: 0e 94 77 01 call 0x2ee ; 0x2ee + 220e: 86 c0 rjmp .+268 ; 0x231c <__vector_125+0x146> + 2210: 80 91 cb 04 lds r24, 0x04CB + 2214: 82 ff sbrs r24, 2 + 2216: 18 c0 rjmp .+48 ; 0x2248 <__vector_125+0x72> + 2218: 84 e0 ldi r24, 0x04 ; 4 + 221a: 80 93 ca 04 sts 0x04CA, r24 + 221e: 80 91 28 22 lds r24, 0x2228 + 2222: 86 ff sbrs r24, 6 + 2224: 7b c0 rjmp .+246 ; 0x231c <__vector_125+0x146> + 2226: 80 91 cc 04 lds r24, 0x04CC + 222a: 81 fd sbrc r24, 1 + 222c: 77 c0 rjmp .+238 ; 0x231c <__vector_125+0x146> + 222e: 7a dd rcall .-1292 ; 0x1d24 + 2230: 81 11 cpse r24, r1 + 2232: 74 c0 rjmp .+232 ; 0x231c <__vector_125+0x146> + 2234: 80 91 0d 22 lds r24, 0x220D + 2238: 81 30 cpi r24, 0x01 ; 1 + 223a: 11 f4 brne .+4 ; 0x2240 <__vector_125+0x6a> + 223c: d7 db rcall .-2130 ; 0x19ec + 223e: 6e c0 rjmp .+220 ; 0x231c <__vector_125+0x146> + 2240: 84 30 cpi r24, 0x04 ; 4 + 2242: 09 f0 breq .+2 ; 0x2246 <__vector_125+0x70> + 2244: 6b c0 rjmp .+214 ; 0x231c <__vector_125+0x146> + 2246: 21 c0 rjmp .+66 ; 0x228a <__vector_125+0xb4> + 2248: 80 91 cb 04 lds r24, 0x04CB + 224c: 81 ff sbrs r24, 1 + 224e: 26 c0 rjmp .+76 ; 0x229c <__vector_125+0xc6> + 2250: 82 e0 ldi r24, 0x02 ; 2 + 2252: 80 93 ca 04 sts 0x04CA, r24 + 2256: 80 91 20 22 lds r24, 0x2220 + 225a: 86 ff sbrs r24, 6 + 225c: 5f c0 rjmp .+190 ; 0x231c <__vector_125+0x146> + 225e: 80 91 cc 04 lds r24, 0x04CC + 2262: 81 fd sbrc r24, 1 + 2264: 5b c0 rjmp .+182 ; 0x231c <__vector_125+0x146> + 2266: 5e dd rcall .-1348 ; 0x1d24 + 2268: 81 11 cpse r24, r1 + 226a: 58 c0 rjmp .+176 ; 0x231c <__vector_125+0x146> + 226c: 80 91 0d 22 lds r24, 0x220D + 2270: 82 30 cpi r24, 0x02 ; 2 + 2272: 41 f4 brne .+16 ; 0x2284 <__vector_125+0xae> + 2274: 84 e0 ldi r24, 0x04 ; 4 + 2276: 80 93 0d 22 sts 0x220D, r24 + 227a: e0 e2 ldi r30, 0x20 ; 32 + 227c: f2 e2 ldi r31, 0x22 ; 34 + 227e: 02 e0 ldi r16, 0x02 ; 2 + 2280: 06 93 lac Z, r16 + 2282: 4c c0 rjmp .+152 ; 0x231c <__vector_125+0x146> + 2284: 83 30 cpi r24, 0x03 ; 3 + 2286: 09 f0 breq .+2 ; 0x228a <__vector_125+0xb4> + 2288: 49 c0 rjmp .+146 ; 0x231c <__vector_125+0x146> + 228a: e9 e2 ldi r30, 0x29 ; 41 + 228c: f2 e2 ldi r31, 0x22 ; 34 + 228e: 04 e0 ldi r16, 0x04 ; 4 + 2290: 05 93 las Z, r16 + 2292: e1 e2 ldi r30, 0x21 ; 33 + 2294: f2 e2 ldi r31, 0x22 ; 34 + 2296: 04 e0 ldi r16, 0x04 ; 4 + 2298: 05 93 las Z, r16 + 229a: 40 c0 rjmp .+128 ; 0x231c <__vector_125+0x146> + 229c: 80 91 cb 04 lds r24, 0x04CB + 22a0: 84 ff sbrs r24, 4 + 22a2: 25 c0 rjmp .+74 ; 0x22ee <__vector_125+0x118> + 22a4: 80 e1 ldi r24, 0x10 ; 16 + 22a6: 80 93 ca 04 sts 0x04CA, r24 + 22aa: 81 e0 ldi r24, 0x01 ; 1 + 22ac: 50 df rcall .-352 ; 0x214e + 22ae: 81 e8 ldi r24, 0x81 ; 129 + 22b0: 4e df rcall .-356 ; 0x214e + 22b2: 82 e0 ldi r24, 0x02 ; 2 + 22b4: 4c df rcall .-360 ; 0x214e + 22b6: 82 e8 ldi r24, 0x82 ; 130 + 22b8: 4a df rcall .-364 ; 0x214e + 22ba: 0e 94 f3 08 call 0x11e6 ; 0x11e6 + 22be: 10 92 c3 04 sts 0x04C3, r1 + 22c2: 10 92 21 22 sts 0x2221, r1 + 22c6: 96 e0 ldi r25, 0x06 ; 6 + 22c8: 90 93 20 22 sts 0x2220, r25 + 22cc: 83 e4 ldi r24, 0x43 ; 67 + 22ce: 80 93 21 22 sts 0x2221, r24 + 22d2: 10 92 29 22 sts 0x2229, r1 + 22d6: 90 93 28 22 sts 0x2228, r25 + 22da: 80 93 29 22 sts 0x2229, r24 + 22de: 89 ec ldi r24, 0xC9 ; 201 + 22e0: 91 e2 ldi r25, 0x21 ; 33 + 22e2: 80 93 24 22 sts 0x2224, r24 + 22e6: 90 93 25 22 sts 0x2225, r25 + 22ea: 47 db rcall .-2418 ; 0x197a + 22ec: 17 c0 rjmp .+46 ; 0x231c <__vector_125+0x146> + 22ee: 80 91 cb 04 lds r24, 0x04CB + 22f2: 86 ff sbrs r24, 6 + 22f4: 08 c0 rjmp .+16 ; 0x2306 <__vector_125+0x130> + 22f6: 80 e4 ldi r24, 0x40 ; 64 + 22f8: 80 93 ca 04 sts 0x04CA, r24 + 22fc: 80 e0 ldi r24, 0x00 ; 0 + 22fe: 15 db rcall .-2518 ; 0x192a + 2300: 0e 94 75 01 call 0x2ea ; 0x2ea + 2304: 0b c0 rjmp .+22 ; 0x231c <__vector_125+0x146> + 2306: 80 91 cb 04 lds r24, 0x04CB + 230a: 85 ff sbrs r24, 5 + 230c: 07 c0 rjmp .+14 ; 0x231c <__vector_125+0x146> + 230e: 80 e2 ldi r24, 0x20 ; 32 + 2310: 80 93 ca 04 sts 0x04CA, r24 + 2314: 81 e0 ldi r24, 0x01 ; 1 + 2316: 09 db rcall .-2542 ; 0x192a + 2318: 0e 94 76 01 call 0x2ec ; 0x2ec + 231c: ff 91 pop r31 + 231e: ef 91 pop r30 + 2320: bf 91 pop r27 + 2322: af 91 pop r26 + 2324: 9f 91 pop r25 + 2326: 8f 91 pop r24 + 2328: 7f 91 pop r23 + 232a: 6f 91 pop r22 + 232c: 5f 91 pop r21 + 232e: 4f 91 pop r20 + 2330: 3f 91 pop r19 + 2332: 2f 91 pop r18 + 2334: 0f 91 pop r16 + 2336: 0f 90 pop r0 + 2338: 0f be out 0x3f, r0 ; 63 + 233a: 0f 90 pop r0 + 233c: 1f 90 pop r1 + 233e: 18 95 reti + +00002340 <__vector_126>: + 2340: 1f 92 push r1 + 2342: 0f 92 push r0 + 2344: 0f b6 in r0, 0x3f ; 63 + 2346: 0f 92 push r0 + 2348: 11 24 eor r1, r1 + 234a: 0f 93 push r16 + 234c: 1f 93 push r17 + 234e: 2f 93 push r18 + 2350: 3f 93 push r19 + 2352: 4f 93 push r20 + 2354: 5f 93 push r21 + 2356: 6f 93 push r22 + 2358: 7f 93 push r23 + 235a: 8f 93 push r24 + 235c: 9f 93 push r25 + 235e: af 93 push r26 + 2360: bf 93 push r27 + 2362: cf 93 push r28 + 2364: df 93 push r29 + 2366: ef 93 push r30 + 2368: ff 93 push r31 + 236a: 80 91 cc 04 lds r24, 0x04CC + 236e: 81 ff sbrs r24, 1 + 2370: 1a c0 rjmp .+52 ; 0x23a6 <__vector_126+0x66> + 2372: 82 e0 ldi r24, 0x02 ; 2 + 2374: 80 93 cc 04 sts 0x04CC, r24 + 2378: 80 91 c5 04 lds r24, 0x04C5 + 237c: e0 e2 ldi r30, 0x20 ; 32 + 237e: f2 e2 ldi r31, 0x22 ; 34 + 2380: 81 95 neg r24 + 2382: 88 0f add r24, r24 + 2384: e8 1b sub r30, r24 + 2386: f1 09 sbc r31, r1 + 2388: 20 81 ld r18, Z + 238a: 31 81 ldd r19, Z+1 ; 0x01 + 238c: 20 52 subi r18, 0x20 ; 32 + 238e: 32 42 sbci r19, 0x22 ; 34 + 2390: 03 e0 ldi r16, 0x03 ; 3 + 2392: 36 95 lsr r19 + 2394: 27 95 ror r18 + 2396: 0a 95 dec r16 + 2398: e1 f7 brne .-8 ; 0x2392 <__vector_126+0x52> + 239a: c2 2f mov r28, r18 + 239c: c6 95 lsr r28 + 239e: 20 ff sbrs r18, 0 + 23a0: 06 c0 rjmp .+12 ; 0x23ae <__vector_126+0x6e> + 23a2: 80 e8 ldi r24, 0x80 ; 128 + 23a4: 05 c0 rjmp .+10 ; 0x23b0 <__vector_126+0x70> + 23a6: be dc rcall .-1668 ; 0x1d24 + 23a8: 88 23 and r24, r24 + 23aa: 19 f3 breq .-58 ; 0x2372 <__vector_126+0x32> + 23ac: 86 c0 rjmp .+268 ; 0x24ba <__vector_126+0x17a> + 23ae: 80 e0 ldi r24, 0x00 ; 0 + 23b0: c8 0f add r28, r24 + 23b2: 8c 2f mov r24, r28 + 23b4: cd da rcall .-2662 ; 0x1950 + 23b6: fc 01 movw r30, r24 + 23b8: 80 81 ld r24, Z + 23ba: 85 ff sbrs r24, 5 + 23bc: 7e c0 rjmp .+252 ; 0x24ba <__vector_126+0x17a> + 23be: 00 e2 ldi r16, 0x20 ; 32 + 23c0: 06 93 lac Z, r16 + 23c2: c1 11 cpse r28, r1 + 23c4: 74 c0 rjmp .+232 ; 0x24ae <__vector_126+0x16e> + 23c6: 80 91 0d 22 lds r24, 0x220D + 23ca: 84 30 cpi r24, 0x04 ; 4 + 23cc: 19 f4 brne .+6 ; 0x23d4 <__vector_126+0x94> + 23ce: 1c db rcall .-2504 ; 0x1a08 + 23d0: d4 da rcall .-2648 ; 0x197a + 23d2: 73 c0 rjmp .+230 ; 0x24ba <__vector_126+0x17a> + 23d4: c0 91 22 22 lds r28, 0x2222 + 23d8: d0 91 23 22 lds r29, 0x2223 + 23dc: 80 91 70 24 lds r24, 0x2470 + 23e0: 90 91 71 24 lds r25, 0x2471 + 23e4: 00 91 09 22 lds r16, 0x2209 + 23e8: 10 91 0a 22 lds r17, 0x220A + 23ec: 98 01 movw r18, r16 + 23ee: 2c 0f add r18, r28 + 23f0: 3d 1f adc r19, r29 + 23f2: 82 17 cp r24, r18 + 23f4: 93 07 cpc r25, r19 + 23f6: 18 f4 brcc .+6 ; 0x23fe <__vector_126+0xbe> + 23f8: ec 01 movw r28, r24 + 23fa: c0 1b sub r28, r16 + 23fc: d1 0b sbc r29, r17 + 23fe: 80 91 6e 24 lds r24, 0x246E + 2402: 90 91 6f 24 lds r25, 0x246F + 2406: ae 01 movw r20, r28 + 2408: 69 ec ldi r22, 0xC9 ; 201 + 240a: 71 e2 ldi r23, 0x21 ; 33 + 240c: 80 0f add r24, r16 + 240e: 91 1f adc r25, r17 + 2410: 83 d0 rcall .+262 ; 0x2518 + 2412: 0c 0f add r16, r28 + 2414: 1d 1f adc r17, r29 + 2416: 00 93 09 22 sts 0x2209, r16 + 241a: 10 93 0a 22 sts 0x220A, r17 + 241e: c0 34 cpi r28, 0x40 ; 64 + 2420: d1 05 cpc r29, r1 + 2422: 69 f4 brne .+26 ; 0x243e <__vector_126+0xfe> + 2424: 80 91 0b 22 lds r24, 0x220B + 2428: 90 91 0c 22 lds r25, 0x220C + 242c: 80 0f add r24, r16 + 242e: 91 1f adc r25, r17 + 2430: 20 91 6c 24 lds r18, 0x246C + 2434: 30 91 6d 24 lds r19, 0x246D + 2438: 82 17 cp r24, r18 + 243a: 93 07 cpc r25, r19 + 243c: 88 f0 brcs .+34 ; 0x2460 <__vector_126+0x120> + 243e: 00 93 70 24 sts 0x2470, r16 + 2442: 10 93 71 24 sts 0x2471, r17 + 2446: e0 91 74 24 lds r30, 0x2474 + 244a: f0 91 75 24 lds r31, 0x2475 + 244e: 30 97 sbiw r30, 0x00 ; 0 + 2450: 29 f0 breq .+10 ; 0x245c <__vector_126+0x11c> + 2452: 09 95 icall + 2454: 81 11 cpse r24, r1 + 2456: 02 c0 rjmp .+4 ; 0x245c <__vector_126+0x11c> + 2458: bb da rcall .-2698 ; 0x19d0 + 245a: 2f c0 rjmp .+94 ; 0x24ba <__vector_126+0x17a> + 245c: c7 da rcall .-2674 ; 0x19ec + 245e: 2d c0 rjmp .+90 ; 0x24ba <__vector_126+0x17a> + 2460: 80 91 70 24 lds r24, 0x2470 + 2464: 90 91 71 24 lds r25, 0x2471 + 2468: 80 17 cp r24, r16 + 246a: 91 07 cpc r25, r17 + 246c: d9 f4 brne .+54 ; 0x24a4 <__vector_126+0x164> + 246e: e0 91 74 24 lds r30, 0x2474 + 2472: f0 91 75 24 lds r31, 0x2475 + 2476: 30 97 sbiw r30, 0x00 ; 0 + 2478: 79 f3 breq .-34 ; 0x2458 <__vector_126+0x118> + 247a: 09 95 icall + 247c: 88 23 and r24, r24 + 247e: 61 f3 breq .-40 ; 0x2458 <__vector_126+0x118> + 2480: 80 91 0b 22 lds r24, 0x220B + 2484: 90 91 0c 22 lds r25, 0x220C + 2488: 20 91 09 22 lds r18, 0x2209 + 248c: 30 91 0a 22 lds r19, 0x220A + 2490: 82 0f add r24, r18 + 2492: 93 1f adc r25, r19 + 2494: 80 93 0b 22 sts 0x220B, r24 + 2498: 90 93 0c 22 sts 0x220C, r25 + 249c: 10 92 09 22 sts 0x2209, r1 + 24a0: 10 92 0a 22 sts 0x220A, r1 + 24a4: e0 e2 ldi r30, 0x20 ; 32 + 24a6: f2 e2 ldi r31, 0x22 ; 34 + 24a8: 02 e0 ldi r16, 0x02 ; 2 + 24aa: 06 93 lac Z, r16 + 24ac: 06 c0 rjmp .+12 ; 0x24ba <__vector_126+0x17a> + 24ae: c0 38 cpi r28, 0x80 ; 128 + 24b0: 11 f4 brne .+4 ; 0x24b6 <__vector_126+0x176> + 24b2: ca db rcall .-2156 ; 0x1c48 + 24b4: 02 c0 rjmp .+4 ; 0x24ba <__vector_126+0x17a> + 24b6: 8c 2f mov r24, r28 + 24b8: c8 da rcall .-2672 ; 0x1a4a + 24ba: ff 91 pop r31 + 24bc: ef 91 pop r30 + 24be: df 91 pop r29 + 24c0: cf 91 pop r28 + 24c2: bf 91 pop r27 + 24c4: af 91 pop r26 + 24c6: 9f 91 pop r25 + 24c8: 8f 91 pop r24 + 24ca: 7f 91 pop r23 + 24cc: 6f 91 pop r22 + 24ce: 5f 91 pop r21 + 24d0: 4f 91 pop r20 + 24d2: 3f 91 pop r19 + 24d4: 2f 91 pop r18 + 24d6: 1f 91 pop r17 + 24d8: 0f 91 pop r16 + 24da: 0f 90 pop r0 + 24dc: 0f be out 0x3f, r0 ; 63 + 24de: 0f 90 pop r0 + 24e0: 1f 90 pop r1 + 24e2: 18 95 reti + +000024e4 <__udivmodhi4>: + 24e4: aa 1b sub r26, r26 + 24e6: bb 1b sub r27, r27 + 24e8: 51 e1 ldi r21, 0x11 ; 17 + 24ea: 07 c0 rjmp .+14 ; 0x24fa <__udivmodhi4_ep> + +000024ec <__udivmodhi4_loop>: + 24ec: aa 1f adc r26, r26 + 24ee: bb 1f adc r27, r27 + 24f0: a6 17 cp r26, r22 + 24f2: b7 07 cpc r27, r23 + 24f4: 10 f0 brcs .+4 ; 0x24fa <__udivmodhi4_ep> + 24f6: a6 1b sub r26, r22 + 24f8: b7 0b sbc r27, r23 + +000024fa <__udivmodhi4_ep>: + 24fa: 88 1f adc r24, r24 + 24fc: 99 1f adc r25, r25 + 24fe: 5a 95 dec r21 + 2500: a9 f7 brne .-22 ; 0x24ec <__udivmodhi4_loop> + 2502: 80 95 com r24 + 2504: 90 95 com r25 + 2506: bc 01 movw r22, r24 + 2508: cd 01 movw r24, r26 + 250a: 08 95 ret + +0000250c <__tablejump2__>: + 250c: ee 0f add r30, r30 + 250e: ff 1f adc r31, r31 + +00002510 <__tablejump__>: + 2510: 05 90 lpm r0, Z+ + 2512: f4 91 lpm r31, Z + 2514: e0 2d mov r30, r0 + 2516: 09 94 ijmp + +00002518 : + 2518: fb 01 movw r30, r22 + 251a: dc 01 movw r26, r24 + 251c: 02 c0 rjmp .+4 ; 0x2522 + 251e: 01 90 ld r0, Z+ + 2520: 0d 92 st X+, r0 + 2522: 41 50 subi r20, 0x01 ; 1 + 2524: 50 40 sbci r21, 0x00 ; 0 + 2526: d8 f7 brcc .-10 ; 0x251e + 2528: 08 95 ret + +0000252a <_exit>: + 252a: f8 94 cli + +0000252c <__stop_program>: + 252c: ff cf rjmp .-2 ; 0x252c <__stop_program> diff --git a/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.map b/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.map new file mode 100644 index 00000000..dd7c119b --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.map @@ -0,0 +1,1104 @@ +Archive member included because of file (symbol) + +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + src/ASF/xmega/drivers/usb/usb_device.o (__udivmodhi4) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o (exit) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + src/main.o (__tablejump2__) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + src/main.o (__do_copy_data) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + src/main.o (__do_clear_bss) +c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + src/ASF/xmega/drivers/nvm/nvm.o (memcpy) + +Allocating common symbols +Common symbol size file + +dacBuf_CH1 0x200 src/main.o +udd_g_ctrlreq 0x10 src/main.o +sleepmgr_locks 0x6 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o +dacBuf_CH2 0x200 src/main.o +isoBuf 0x5dc src/main.o + +Discarded input sections + + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + .text 0x00000000 0x0 src/tiny_dig.o + .data 0x00000000 0x0 src/tiny_dig.o + .bss 0x00000000 0x0 src/tiny_dig.o + .text 0x00000000 0x0 src/ASF/common/boards/user_board/init.o + .data 0x00000000 0x0 src/ASF/common/boards/user_board/init.o + .bss 0x00000000 0x0 src/ASF/common/boards/user_board/init.o + .text 0x00000000 0x0 src/ASF/common/services/ioport/xmega/ioport_compat.o + .data 0x00000000 0x0 src/ASF/common/services/ioport/xmega/ioport_compat.o + .bss 0x00000000 0x0 src/ASF/common/services/ioport/xmega/ioport_compat.o + .comment 0x00000000 0x31 src/ASF/common/services/ioport/xmega/ioport_compat.o + .text 0x00000000 0x0 src/main.o + .data 0x00000000 0x0 src/main.o + .bss 0x00000000 0x0 src/main.o + .data.test_byte + 0x00000000 0x1 src/main.o + .text 0x00000000 0x0 src/tiny_adc.o + .data 0x00000000 0x0 src/tiny_adc.o + .bss 0x00000000 0x0 src/tiny_adc.o + .text 0x00000000 0x0 src/tiny_dac.o + .data 0x00000000 0x0 src/tiny_dac.o + .bss 0x00000000 0x0 src/tiny_dac.o + .text 0x00000000 0x0 src/tiny_dma.o + .data 0x00000000 0x0 src/tiny_dma.o + .bss 0x00000000 0x0 src/tiny_dma.o + .text 0x00000000 0x0 src/tiny_timer.o + .data 0x00000000 0x0 src/tiny_timer.o + .bss 0x00000000 0x0 src/tiny_timer.o + .text 0x00000000 0x0 src/tiny_uart.o + .data 0x00000000 0x0 src/tiny_uart.o + .bss 0x00000000 0x0 src/tiny_uart.o + .text 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .data 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .bss 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .text.ui_init 0x00000000 0x2 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .text.ui_powerdown + 0x00000000 0x2 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .text.ui_wakeup + 0x00000000 0x2 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .text.ui_loop_back_state + 0x00000000 0x2 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .text.ui_process + 0x00000000 0x2 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .comment 0x00000000 0x31 src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o + .text 0x00000000 0x0 src/ASF/common/services/clock/xmega/sysclk.o + .data 0x00000000 0x0 src/ASF/common/services/clock/xmega/sysclk.o + .bss 0x00000000 0x0 src/ASF/common/services/clock/xmega/sysclk.o + .text.sysclk_disable_module + 0x00000000 0x16 src/ASF/common/services/clock/xmega/sysclk.o + .text.sysclk_disable_usb + 0x00000000 0x12 src/ASF/common/services/clock/xmega/sysclk.o + .text 0x00000000 0x0 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .data 0x00000000 0x0 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .bss 0x00000000 0x0 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .data.sleepmgr_configs + 0x00000000 0x6 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .text 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .data 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .bss 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .text.udi_vendor_bulk_in_run + 0x00000000 0x18 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .text.udi_vendor_bulk_out_run + 0x00000000 0x18 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .text.udi_vendor_iso_out_run + 0x00000000 0x18 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .text 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .data 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .bss 0x00000000 0x0 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .text 0x00000000 0x0 src/ASF/common/services/usb/udc/udc.o + .data 0x00000000 0x0 src/ASF/common/services/usb/udc/udc.o + .bss 0x00000000 0x0 src/ASF/common/services/usb/udc/udc.o + .text.udc_stop + 0x00000000 0x8 src/ASF/common/services/usb/udc/udc.o + .text 0x00000000 0x0 src/ASF/xmega/drivers/cpu/ccp.o + .data 0x00000000 0x0 src/ASF/xmega/drivers/cpu/ccp.o + .bss 0x00000000 0x0 src/ASF/xmega/drivers/cpu/ccp.o + .text 0x00000000 0x0 src/ASF/xmega/drivers/nvm/nvm.o + .data 0x00000000 0x0 src/ASF/xmega/drivers/nvm/nvm.o + .bss 0x00000000 0x0 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_wait_until_ready + 0x00000000 0xa src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_read_production_signature_row + 0x00000000 0xa src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_issue_command + 0x00000000 0x22 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_read_device_serial + 0x00000000 0x64 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_read_byte + 0x00000000 0x24 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_read_buffer + 0x00000000 0x5e src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_flush_buffer + 0x00000000 0x1e src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_load_byte_to_buffer + 0x00000000 0x3c src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_write_byte + 0x00000000 0x62 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_load_page_to_buffer + 0x00000000 0x24 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_atomic_write_page + 0x00000000 0x30 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_erase_and_write_buffer + 0x00000000 0x7e src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_split_write_page + 0x00000000 0x30 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_fill_buffer_with_value + 0x00000000 0x24 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_erase_bytes_in_page + 0x00000000 0x30 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_erase_page + 0x00000000 0x12 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_erase_bytes_in_all_pages + 0x00000000 0xa src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_eeprom_erase_all + 0x00000000 0xa src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_issue_flash_range_crc + 0x00000000 0x2c src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_flash_read_buffer + 0x00000000 0x48 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_user_sig_read_buffer + 0x00000000 0x44 src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_user_sig_write_buffer + 0x00000000 0x12c src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_flash_erase_and_write_buffer + 0x00000000 0x12e src/ASF/xmega/drivers/nvm/nvm.o + .text.nvm_fuses_read + 0x00000000 0x34 src/ASF/xmega/drivers/nvm/nvm.o + .comment 0x00000000 0x31 src/ASF/xmega/drivers/nvm/nvm.o + .text 0x00000000 0x0 src/ASF/xmega/drivers/nvm/nvm_asm.o + .data 0x00000000 0x0 src/ASF/xmega/drivers/nvm/nvm_asm.o + .bss 0x00000000 0x0 src/ASF/xmega/drivers/nvm/nvm_asm.o + .BOOT 0x00000000 0x44 src/ASF/xmega/drivers/nvm/nvm_asm.o + .text 0x00000000 0x0 src/ASF/xmega/drivers/usb/usb_device.o + .data 0x00000000 0x0 src/ASF/xmega/drivers/usb/usb_device.o + .bss 0x00000000 0x0 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_disable + 0x00000000 0x2c src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_include_vbus_monitoring + 0x00000000 0x4 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_detach + 0x00000000 0xc src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_is_high_speed + 0x00000000 0x4 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_get_frame_number + 0x00000000 0xa src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_get_micro_frame_number + 0x00000000 0x6 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_send_remotewakeup + 0x00000000 0x24 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ep_wait_stall_clear + 0x00000000 0x4e src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ep_is_valid + 0x00000000 0x10 src/ASF/xmega/drivers/usb/usb_device.o + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .text.libgcc.mul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.mul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.div + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.mul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.div + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.mul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.div + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.mul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.div + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.prologue + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.builtins + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.fmul + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text.libgcc.fixed + 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + .text 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + .data 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + .bss 0x00000000 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + +Memory Configuration + +Name Origin Length Attributes +text 0x00000000 0x00100000 xr +data 0x00802000 0x0000ffa0 rw !x +eeprom 0x00810000 0x00010000 rw !x +fuse 0x00820000 0x00000400 rw !x +lock 0x00830000 0x00000400 rw !x +signature 0x00840000 0x00000400 rw !x +user_signatures 0x00850000 0x00000400 rw !x +*default* 0x00000000 0xffffffff + +Linker script and memory map + +LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o +LOAD src/tiny_dig.o +LOAD src/ASF/common/boards/user_board/init.o +LOAD src/ASF/common/services/ioport/xmega/ioport_compat.o +LOAD src/main.o +LOAD src/tiny_adc.o +LOAD src/tiny_dac.o +LOAD src/tiny_dma.o +LOAD src/tiny_timer.o +LOAD src/tiny_uart.o +LOAD src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o +LOAD src/ASF/common/services/clock/xmega/sysclk.o +LOAD src/ASF/common/services/sleepmgr/xmega/sleepmgr.o +LOAD src/ASF/common/services/usb/class/vendor/device/udi_vendor.o +LOAD src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o +LOAD src/ASF/common/services/usb/udc/udc.o +LOAD src/ASF/xmega/drivers/cpu/ccp.o +LOAD src/ASF/xmega/drivers/nvm/nvm.o +LOAD src/ASF/xmega/drivers/nvm/nvm_asm.o +LOAD src/ASF/xmega/drivers/usb/usb_device.o +START GROUP +LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libm.a +END GROUP +START GROUP +LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a +LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libm.a +LOAD c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a +END GROUP + +.hash + *(.hash) + +.dynsym + *(.dynsym) + +.dynstr + *(.dynstr) + +.gnu.version + *(.gnu.version) + +.gnu.version_d + *(.gnu.version_d) + +.gnu.version_r + *(.gnu.version_r) + +.rel.init + *(.rel.init) + +.rela.init + *(.rela.init) + +.rel.text + *(.rel.text) + *(.rel.text.*) + *(.rel.gnu.linkonce.t*) + +.rela.text + *(.rela.text) + *(.rela.text.*) + *(.rela.gnu.linkonce.t*) + +.rel.fini + *(.rel.fini) + +.rela.fini + *(.rela.fini) + +.rel.rodata + *(.rel.rodata) + *(.rel.rodata.*) + *(.rel.gnu.linkonce.r*) + +.rela.rodata + *(.rela.rodata) + *(.rela.rodata.*) + *(.rela.gnu.linkonce.r*) + +.rel.data + *(.rel.data) + *(.rel.data.*) + *(.rel.gnu.linkonce.d*) + +.rela.data + *(.rela.data) + *(.rela.data.*) + *(.rela.gnu.linkonce.d*) + +.rel.ctors + *(.rel.ctors) + +.rela.ctors + *(.rela.ctors) + +.rel.dtors + *(.rel.dtors) + +.rela.dtors + *(.rela.dtors) + +.rel.got + *(.rel.got) + +.rela.got + *(.rela.got) + +.rel.bss + *(.rel.bss) + +.rela.bss + *(.rela.bss) + +.rel.plt + *(.rel.plt) + +.rela.plt + *(.rela.plt) + +.text 0x00000000 0x252e + *(.vectors) + .vectors 0x00000000 0x1fc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + 0x00000000 __vector_default + 0x00000000 __vectors + *(.vectors) + *(.progmem.gcc*) + .progmem.gcc_sw_table.main_sof_action + 0x000001fc 0x10 src/main.o + .progmem.gcc_sw_table.udc_process_setup + 0x0000020c 0x30 src/ASF/common/services/usb/udc/udc.o + 0x0000023c . = ALIGN (0x2) + 0x0000023c __trampolines_start = . + *(.trampolines) + .trampolines 0x0000023c 0x0 linker stubs + *(.trampolines*) + 0x0000023c __trampolines_end = . + *(.progmem*) + 0x0000023c . = ALIGN (0x2) + *(.jumptables) + *(.jumptables*) + *(.lowtext) + *(.lowtext*) + 0x0000023c __ctors_start = . + *(.ctors) + 0x0000023c __ctors_end = . + 0x0000023c __dtors_start = . + *(.dtors) + 0x0000023c __dtors_end = . + SORT(*)(.ctors) + SORT(*)(.dtors) + *(.init0) + .init0 0x0000023c 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + 0x0000023c __init + *(.init0) + *(.init1) + *(.init1) + *(.init2) + .init2 0x0000023c 0xc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + *(.init2) + *(.init3) + *(.init3) + *(.init4) + .init4 0x00000248 0x16 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_copy_data.o) + 0x00000248 __do_copy_data + .init4 0x0000025e 0x10 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_clear_bss.o) + 0x0000025e __do_clear_bss + *(.init4) + *(.init5) + *(.init5) + *(.init6) + *(.init6) + *(.init7) + *(.init7) + *(.init8) + *(.init8) + *(.init9) + .init9 0x0000026e 0x6 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + *(.init9) + *(.text) + .text 0x00000274 0x2 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2/crtx32a4u.o + 0x00000274 __vector_38 + 0x00000274 __vector_104 + 0x00000274 __vector_22 + 0x00000274 __vector_63 + 0x00000274 __vector_28 + 0x00000274 __vector_67 + 0x00000274 __vector_1 + 0x00000274 __vector_119 + 0x00000274 __vector_32 + 0x00000274 __vector_75 + 0x00000274 __vector_71 + 0x00000274 __vector_91 + 0x00000274 __vector_34 + 0x00000274 __vector_62 + 0x00000274 __vector_77 + 0x00000274 __vector_102 + 0x00000274 __vector_24 + 0x00000274 __vector_12 + 0x00000274 __vector_55 + 0x00000274 __vector_69 + 0x00000274 __vector_81 + 0x00000274 __vector_90 + 0x00000274 __vector_46 + 0x00000274 __bad_interrupt + 0x00000274 __vector_122 + 0x00000274 __vector_72 + 0x00000274 __vector_114 + 0x00000274 __vector_6 + 0x00000274 __vector_110 + 0x00000274 __vector_31 + 0x00000274 __vector_92 + 0x00000274 __vector_35 + 0x00000274 __vector_78 + 0x00000274 __vector_74 + 0x00000274 __vector_117 + 0x00000274 __vector_39 + 0x00000274 __vector_107 + 0x00000274 __vector_3 + 0x00000274 __vector_105 + 0x00000274 __vector_98 + 0x00000274 __vector_23 + 0x00000274 __vector_68 + 0x00000274 __vector_30 + 0x00000274 __vector_73 + 0x00000274 __vector_45 + 0x00000274 __vector_25 + 0x00000274 __vector_93 + 0x00000274 __vector_61 + 0x00000274 __vector_11 + 0x00000274 __vector_54 + 0x00000274 __vector_99 + 0x00000274 __vector_13 + 0x00000274 __vector_17 + 0x00000274 __vector_19 + 0x00000274 __vector_56 + 0x00000274 __vector_7 + 0x00000274 __vector_49 + 0x00000274 __vector_123 + 0x00000274 __vector_41 + 0x00000274 __vector_86 + 0x00000274 __vector_100 + 0x00000274 __vector_101 + 0x00000274 __vector_64 + 0x00000274 __vector_88 + 0x00000274 __vector_109 + 0x00000274 __vector_43 + 0x00000274 __vector_27 + 0x00000274 __vector_5 + 0x00000274 __vector_113 + 0x00000274 __vector_33 + 0x00000274 __vector_76 + 0x00000274 __vector_115 + 0x00000274 __vector_47 + 0x00000274 __vector_52 + 0x00000274 __vector_37 + 0x00000274 __vector_95 + 0x00000274 __vector_103 + 0x00000274 __vector_96 + 0x00000274 __vector_89 + 0x00000274 __vector_108 + 0x00000274 __vector_4 + 0x00000274 __vector_44 + 0x00000274 __vector_82 + 0x00000274 __vector_106 + 0x00000274 __vector_118 + 0x00000274 __vector_51 + 0x00000274 __vector_9 + 0x00000274 __vector_2 + 0x00000274 __vector_21 + 0x00000274 __vector_15 + 0x00000274 __vector_66 + 0x00000274 __vector_36 + 0x00000274 __vector_79 + 0x00000274 __vector_58 + 0x00000274 __vector_70 + 0x00000274 __vector_29 + 0x00000274 __vector_60 + 0x00000274 __vector_121 + 0x00000274 __vector_40 + 0x00000274 __vector_85 + 0x00000274 __vector_94 + 0x00000274 __vector_8 + 0x00000274 __vector_26 + 0x00000274 __vector_48 + 0x00000274 __vector_124 + 0x00000274 __vector_116 + 0x00000274 __vector_112 + 0x00000274 __vector_111 + 0x00000274 __vector_80 + 0x00000274 __vector_14 + 0x00000274 __vector_84 + 0x00000274 __vector_57 + 0x00000274 __vector_53 + 0x00000274 __vector_10 + 0x00000274 __vector_50 + 0x00000274 __vector_16 + 0x00000274 __vector_59 + 0x00000274 __vector_18 + 0x00000274 __vector_97 + 0x00000274 __vector_20 + 0x00000274 __vector_42 + 0x00000274 __vector_87 + 0x00000274 __vector_65 + 0x00000274 __vector_120 + 0x00000276 . = ALIGN (0x2) + *(.text.*) + .text.tiny_dig_setup + 0x00000276 0xe src/tiny_dig.o + 0x00000276 tiny_dig_setup + .text.board_init + 0x00000284 0x2 src/ASF/common/boards/user_board/init.o + 0x00000284 board_init + .text.iso_callback + 0x00000286 0x20 src/main.o + 0x00000286 iso_callback + .text.startup.main + 0x000002a6 0x44 src/main.o + 0x000002a6 main + .text.main_suspend_action + 0x000002ea 0x2 src/main.o + 0x000002ea main_suspend_action + .text.main_resume_action + 0x000002ec 0x2 src/main.o + 0x000002ec main_resume_action + .text.main_sof_action + 0x000002ee 0x40 src/main.o + 0x000002ee main_sof_action + .text.main_vendor_enable + 0x0000032e 0x18 src/main.o + 0x0000032e main_vendor_enable + .text.main_vendor_disable + 0x00000346 0x6 src/main.o + 0x00000346 main_vendor_disable + .text.main_setup_out_received + 0x0000034c 0x4 src/main.o + 0x0000034c main_setup_out_received + .text.main_setup_in_received + 0x00000350 0x4 src/main.o + 0x00000350 main_setup_in_received + .text.tiny_adc_ch0setup + 0x00000354 0x2c src/tiny_adc.o + 0x00000354 tiny_adc_ch0setup + .text.tiny_adc_ch1setup + 0x00000380 0x14 src/tiny_adc.o + 0x00000380 tiny_adc_ch1setup + .text.tiny_adc_pid_setup + 0x00000394 0x14 src/tiny_adc.o + 0x00000394 tiny_adc_pid_setup + .text.ReadCalibrationByte + 0x000003a8 0x12 src/tiny_adc.o + 0x000003a8 ReadCalibrationByte + .text.tiny_adc_setup + 0x000003ba 0x5e src/tiny_adc.o + 0x000003ba tiny_adc_setup + .text.tiny_dac_setup + 0x00000418 0x48 src/tiny_dac.o + 0x00000418 tiny_dac_setup + .text.tiny_dma_setup + 0x00000460 0x12 src/tiny_dma.o + 0x00000460 tiny_dma_setup + .text.tiny_dma_flush + 0x00000472 0x24 src/tiny_dma.o + 0x00000472 tiny_dma_flush + .text.tiny_dma_set_mode_0 + 0x00000496 0x90 src/tiny_dma.o + 0x00000496 tiny_dma_set_mode_0 + .text.tiny_dma_loop_mode_0 + 0x00000526 0x60 src/tiny_dma.o + 0x00000526 tiny_dma_loop_mode_0 + .text.tiny_dma_set_mode_1 + 0x00000586 0x9c src/tiny_dma.o + 0x00000586 tiny_dma_set_mode_1 + .text.tiny_dma_loop_mode_1 + 0x00000622 0xac src/tiny_dma.o + 0x00000622 tiny_dma_loop_mode_1 + .text.tiny_dma_set_mode_2 + 0x000006ce 0x94 src/tiny_dma.o + 0x000006ce tiny_dma_set_mode_2 + .text.tiny_dma_loop_mode_2 + 0x00000762 0xae src/tiny_dma.o + 0x00000762 tiny_dma_loop_mode_2 + .text.tiny_dma_set_mode_3 + 0x00000810 0xcc src/tiny_dma.o + 0x00000810 tiny_dma_set_mode_3 + .text.tiny_dma_loop_mode_3 + 0x000008dc 0x60 src/tiny_dma.o + 0x000008dc tiny_dma_loop_mode_3 + .text.tiny_dma_set_mode_4 + 0x0000093c 0xcc src/tiny_dma.o + 0x0000093c tiny_dma_set_mode_4 + .text.tiny_dma_loop_mode_4 + 0x00000a08 0xb2 src/tiny_dma.o + 0x00000a08 tiny_dma_loop_mode_4 + .text.tiny_dma_set_mode_5 + 0x00000aba 0x8e src/tiny_dma.o + 0x00000aba tiny_dma_set_mode_5 + .text.tiny_dma_set_mode_6 + 0x00000b48 0x92 src/tiny_dma.o + 0x00000b48 tiny_dma_set_mode_6 + .text.tiny_dma_loop_mode_6 + 0x00000bda 0x5c src/tiny_dma.o + 0x00000bda tiny_dma_loop_mode_6 + .text.tiny_dma_set_mode_7 + 0x00000c36 0x92 src/tiny_dma.o + 0x00000c36 tiny_dma_set_mode_7 + .text.tiny_dma_loop_mode_7 + 0x00000cc8 0x5c src/tiny_dma.o + 0x00000cc8 tiny_dma_loop_mode_7 + .text.tiny_timer_setup + 0x00000d24 0x76 src/tiny_timer.o + 0x00000d24 tiny_timer_setup + .text.__vector_83 + 0x00000d9a 0xbe src/tiny_timer.o + 0x00000d9a __vector_83 + .text.tiny_uart_setup + 0x00000e58 0x34 src/tiny_uart.o + 0x00000e58 tiny_uart_setup + .text.tiny_spi_setup + 0x00000e8c 0x1a src/tiny_uart.o + 0x00000e8c tiny_spi_setup + .text.osc_enable_internal + 0x00000ea6 0x12 src/ASF/common/services/clock/xmega/sysclk.o + .text.osc_enable_autocalibration.constprop.4 + 0x00000eb8 0x38 src/ASF/common/services/clock/xmega/sysclk.o + .text.sysclk_init + 0x00000ef0 0x9a src/ASF/common/services/clock/xmega/sysclk.o + 0x00000ef0 sysclk_init + .text.sysclk_enable_module + 0x00000f8a 0x18 src/ASF/common/services/clock/xmega/sysclk.o + 0x00000f8a sysclk_enable_module + .text.sysclk_enable_usb + 0x00000fa2 0x34 src/ASF/common/services/clock/xmega/sysclk.o + 0x00000fa2 sysclk_enable_usb + .text.udi_vendor_getsetting + 0x00000fd6 0x6 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + 0x00000fd6 udi_vendor_getsetting + .text.udi_vendor_disable + 0x00000fdc 0xc src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + 0x00000fdc udi_vendor_disable + .text.udi_vendor_enable + 0x00000fe8 0x14 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + 0x00000fe8 udi_vendor_enable + .text.udi_vendor_setup + 0x00000ffc 0x38 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + 0x00000ffc udi_vendor_setup + .text.udi_vendor_iso_in_run + 0x00001034 0x18 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + 0x00001034 udi_vendor_iso_in_run + .text.udc_valid_address + 0x0000104c 0x8 src/ASF/common/services/usb/udc/udc.o + .text.udc_update_iface_desc + 0x00001054 0x64 src/ASF/common/services/usb/udc/udc.o + .text.udc_next_desc_in_iface.constprop.3 + 0x000010b8 0x40 src/ASF/common/services/usb/udc/udc.o + .text.udc_iface_enable + 0x000010f8 0x66 src/ASF/common/services/usb/udc/udc.o + .text.udc_iface_disable + 0x0000115e 0x7c src/ASF/common/services/usb/udc/udc.o + .text.udc_get_interface_desc + 0x000011da 0xa src/ASF/common/services/usb/udc/udc.o + 0x000011da udc_get_interface_desc + .text.udc_start + 0x000011e4 0x2 src/ASF/common/services/usb/udc/udc.o + 0x000011e4 udc_start + .text.udc_reset + 0x000011e6 0x38 src/ASF/common/services/usb/udc/udc.o + 0x000011e6 udc_reset + .text.udc_sof_notify + 0x0000121e 0x4a src/ASF/common/services/usb/udc/udc.o + 0x0000121e udc_sof_notify + .text.udc_process_setup + 0x00001268 0x666 src/ASF/common/services/usb/udc/udc.o + 0x00001268 udc_process_setup + .text.ccp_write_io + 0x000018ce 0xc src/ASF/xmega/drivers/cpu/ccp.o + 0x000018ce ccp_write_io + .text.nvm_read_byte + 0x000018da 0x14 src/ASF/xmega/drivers/nvm/nvm_asm.o + 0x000018da nvm_read_byte + .text.sleepmgr_lock_mode + 0x000018ee 0x1e src/ASF/xmega/drivers/usb/usb_device.o + .text.sleepmgr_unlock_mode + 0x0000190c 0x1e src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_sleep_mode + 0x0000192a 0x26 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ep_get_ctrl + 0x00001950 0x2a src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ctrl_init + 0x0000197a 0x56 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ctrl_stall_data + 0x000019d0 0x1c src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ctrl_send_zlp_in + 0x000019ec 0x1c src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ctrl_endofrequest + 0x00001a08 0x10 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ep_get_job + 0x00001a18 0x32 src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ep_trans_complet + 0x00001a4a 0x1fe src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ctrl_in_sent + 0x00001c48 0xdc src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_ctrl_interrupt_tc_setup + 0x00001d24 0xee src/ASF/xmega/drivers/usb/usb_device.o + .text.udd_attach + 0x00001e12 0x46 src/ASF/xmega/drivers/usb/usb_device.o + 0x00001e12 udd_attach + .text.udd_enable + 0x00001e58 0xf0 src/ASF/xmega/drivers/usb/usb_device.o + 0x00001e58 udd_enable + .text.udd_set_address + 0x00001f48 0x6 src/ASF/xmega/drivers/usb/usb_device.o + 0x00001f48 udd_set_address + .text.udd_getaddress + 0x00001f4e 0x6 src/ASF/xmega/drivers/usb/usb_device.o + 0x00001f4e udd_getaddress + .text.udd_set_setup_payload + 0x00001f54 0x12 src/ASF/xmega/drivers/usb/usb_device.o + 0x00001f54 udd_set_setup_payload + .text.udd_ep_alloc + 0x00001f66 0xa4 src/ASF/xmega/drivers/usb/usb_device.o + 0x00001f66 udd_ep_alloc + .text.udd_ep_is_halted + 0x0000200a 0xe src/ASF/xmega/drivers/usb/usb_device.o + 0x0000200a udd_ep_is_halted + .text.udd_ep_clear_halt + 0x00002018 0x32 src/ASF/xmega/drivers/usb/usb_device.o + 0x00002018 udd_ep_clear_halt + .text.udd_ep_run + 0x0000204a 0x104 src/ASF/xmega/drivers/usb/usb_device.o + 0x0000204a udd_ep_run + .text.udd_ep_abort + 0x0000214e 0x56 src/ASF/xmega/drivers/usb/usb_device.o + 0x0000214e udd_ep_abort + .text.udd_ep_free + 0x000021a4 0x12 src/ASF/xmega/drivers/usb/usb_device.o + 0x000021a4 udd_ep_free + .text.udd_ep_set_halt + 0x000021b6 0x20 src/ASF/xmega/drivers/usb/usb_device.o + 0x000021b6 udd_ep_set_halt + .text.__vector_125 + 0x000021d6 0x16a src/ASF/xmega/drivers/usb/usb_device.o + 0x000021d6 __vector_125 + .text.__vector_126 + 0x00002340 0x1a4 src/ASF/xmega/drivers/usb/usb_device.o + 0x00002340 __vector_126 + .text.libgcc.div + 0x000024e4 0x28 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_udivmodhi4.o) + 0x000024e4 __udivmodhi4 + .text.libgcc 0x0000250c 0xc c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_tablejump.o) + 0x0000250c __tablejump2__ + 0x00002510 __tablejump__ + .text.avr-libc + 0x00002518 0x12 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/../../../../avr/lib/avrxmega2\libc.a(memcpy.o) + 0x00002518 memcpy + 0x0000252a . = ALIGN (0x2) + *(.fini9) + .fini9 0x0000252a 0x0 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + 0x0000252a _exit + 0x0000252a exit + *(.fini9) + *(.fini8) + *(.fini8) + *(.fini7) + *(.fini7) + *(.fini6) + *(.fini6) + *(.fini5) + *(.fini5) + *(.fini4) + *(.fini4) + *(.fini3) + *(.fini3) + *(.fini2) + *(.fini2) + *(.fini1) + *(.fini1) + *(.fini0) + .fini0 0x0000252a 0x4 c:/program files (x86)/atmel/atmel toolchain/avr8 gcc/native/3.4.1061/avr8-gnu-toolchain/bin/../lib/gcc/avr/4.8.1/avrxmega2\libgcc.a(_exit.o) + *(.fini0) + 0x0000252e _etext = . + +.data 0x00802000 0xc0 load address 0x0000252e + 0x00802000 PROVIDE (__data_start, .) + *(.data) + *(.data*) + .data.global_mode + 0x00802000 0x1 src/main.o + 0x00802000 global_mode + .data.dummy 0x00802001 0x1 src/main.o + 0x00802001 dummy + .data.auxDacBufLen + 0x00802002 0x2 src/main.o + 0x00802002 auxDacBufLen + .data.dacBuf_len + 0x00802004 0x2 src/main.o + 0x00802004 dacBuf_len + .data.udi_api_vendor + 0x00802006 0xa src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + 0x00802006 udi_api_vendor + .data.udc_config + 0x00802010 0x6 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + 0x00802010 udc_config + .data.udc_config_lsfs + 0x00802016 0x4 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + 0x00802016 udc_config_lsfs + .data.udi_apis + 0x0080201a 0x2 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + 0x0080201a udi_apis + .data.udc_desc_fs + 0x0080201c 0x28 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + 0x0080201c udc_desc_fs + .data.udc_device_desc + 0x00802044 0x14 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + 0x00802044 udc_device_desc + .data.udc_string_desc + 0x00802058 0x32 src/ASF/common/services/usb/udc/udc.o + .data.udc_string_product_name + 0x0080208a 0x19 src/ASF/common/services/usb/udc/udc.o + .data.udc_string_manufacturer_name + 0x008020a3 0xa src/ASF/common/services/usb/udc/udc.o + *fill* 0x008020ad 0x1 + .data.udc_string_desc_languageid + 0x008020ae 0x4 src/ASF/common/services/usb/udc/udc.o + *(.rodata) + *(.rodata*) + .rodata.CSWTCH.44 + 0x008020b2 0xe src/ASF/xmega/drivers/usb/usb_device.o + *(.gnu.linkonce.d*) + 0x008020c0 . = ALIGN (0x2) + 0x008020c0 _edata = . + 0x008020c0 PROVIDE (__data_end, .) + +.bss 0x008020c0 0xb98 + 0x008020c0 PROVIDE (__bss_start, .) + *(.bss) + *(.bss*) + .bss.PSU_target + 0x008020c0 0x1 src/main.o + 0x008020c0 PSU_target + .bss.b2_state 0x008020c1 0x1 src/main.o + 0x008020c1 b2_state + .bss.b1_state 0x008020c2 0x1 src/main.o + 0x008020c2 b1_state + .bss.main_b_vendor_enable + 0x008020c3 0x1 src/main.o + 0x008020c3 main_b_vendor_enable + .bss.udi_vendor_alternate_setting + 0x008020c4 0x1 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .bss.udc_ep_status.5441 + 0x008020c5 0x2 src/ASF/common/services/usb/udc/udc.o + .bss.udc_ptr_iface + 0x008020c7 0x2 src/ASF/common/services/usb/udc/udc.o + .bss.udc_ptr_conf + 0x008020c9 0x2 src/ASF/common/services/usb/udc/udc.o + *fill* 0x008020cb 0x1 + .bss.udc_num_configuration + 0x008020cc 0x2 src/ASF/common/services/usb/udc/udc.o + .bss.udc_iface_setting + 0x008020ce 0x2 src/ASF/common/services/usb/udc/udc.o + .bss.udc_device_status + 0x008020d0 0x2 src/ASF/common/services/usb/udc/udc.o + .bss.b_shortpacket.5230 + 0x008020d2 0x1 src/ASF/xmega/drivers/usb/usb_device.o + .bss.udd_ep_out_cache_buffer + 0x008020d3 0xc0 src/ASF/xmega/drivers/usb/usb_device.o + .bss.udd_ep_job + 0x00802193 0x36 src/ASF/xmega/drivers/usb/usb_device.o + .bss.udd_ctrl_buffer + 0x008021c9 0x40 src/ASF/xmega/drivers/usb/usb_device.o + .bss.udd_ctrl_payload_nb_trans + 0x00802209 0x2 src/ASF/xmega/drivers/usb/usb_device.o + .bss.udd_ctrl_prev_payload_nb_trans + 0x0080220b 0x2 src/ASF/xmega/drivers/usb/usb_device.o + .bss.udd_ep_control_state + 0x0080220d 0x1 src/ASF/xmega/drivers/usb/usb_device.o + *fill* 0x0080220e 0x2 + .bss.udd_sram 0x00802210 0x54 src/ASF/xmega/drivers/usb/usb_device.o + .bss.udd_b_idle + 0x00802264 0x1 src/ASF/xmega/drivers/usb/usb_device.o + *(COMMON) + *fill* 0x00802265 0x1 + COMMON 0x00802266 0x9ec src/main.o + 0x00802266 dacBuf_CH1 + 0x00802466 udd_g_ctrlreq + 0x00802476 dacBuf_CH2 + 0x00802676 isoBuf + COMMON 0x00802c52 0x6 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + 0x00802c52 sleepmgr_locks + 0x00802c58 PROVIDE (__bss_end, .) + 0x0000252e __data_load_start = LOADADDR (.data) + 0x000025ee __data_load_end = (__data_load_start + SIZEOF (.data)) + +.noinit 0x00802c58 0x0 + 0x00802c58 PROVIDE (__noinit_start, .) + *(.noinit*) + 0x00802c58 PROVIDE (__noinit_end, .) + 0x00802c58 _end = . + 0x00802c58 PROVIDE (__heap_start, .) + +.eeprom 0x00810000 0x0 + *(.eeprom*) + 0x00810000 __eeprom_end = . + +.fuse + *(.fuse) + *(.lfuse) + *(.hfuse) + *(.efuse) + +.lock + *(.lock*) + +.signature + *(.signature*) + +.user_signatures + *(.user_signatures*) + +.stab + *(.stab) + +.stabstr + *(.stabstr) + +.stab.excl + *(.stab.excl) + +.stab.exclstr + *(.stab.exclstr) + +.stab.index + *(.stab.index) + +.stab.indexstr + *(.stab.indexstr) + +.comment 0x00000000 0x30 + *(.comment) + .comment 0x00000000 0x30 src/tiny_dig.o + 0x31 (size before relaxing) + .comment 0x00000000 0x31 src/ASF/common/boards/user_board/init.o + .comment 0x00000000 0x31 src/main.o + .comment 0x00000000 0x31 src/tiny_adc.o + .comment 0x00000000 0x31 src/tiny_dac.o + .comment 0x00000000 0x31 src/tiny_dma.o + .comment 0x00000000 0x31 src/tiny_timer.o + .comment 0x00000000 0x31 src/tiny_uart.o + .comment 0x00000000 0x31 src/ASF/common/services/clock/xmega/sysclk.o + .comment 0x00000000 0x31 src/ASF/common/services/sleepmgr/xmega/sleepmgr.o + .comment 0x00000000 0x31 src/ASF/common/services/usb/class/vendor/device/udi_vendor.o + .comment 0x00000000 0x31 src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o + .comment 0x00000000 0x31 src/ASF/common/services/usb/udc/udc.o + .comment 0x00000000 0x31 src/ASF/xmega/drivers/usb/usb_device.o + +.note.gnu.build-id + *(.note.gnu.build-id) + +.debug + *(.debug) + +.line + *(.line) + +.debug_srcinfo + *(.debug_srcinfo) + +.debug_sfnames + *(.debug_sfnames) + +.debug_aranges 0x00000000 0x48 + *(.debug_aranges) + .debug_aranges + 0x00000000 0x20 src/ASF/xmega/drivers/cpu/ccp.o + .debug_aranges + 0x00000020 0x28 src/ASF/xmega/drivers/nvm/nvm_asm.o + +.debug_pubnames + *(.debug_pubnames) + +.debug_info 0x00000000 0x11a + *(.debug_info .gnu.linkonce.wi.*) + .debug_info 0x00000000 0x8d src/ASF/xmega/drivers/cpu/ccp.o + .debug_info 0x0000008d 0x8d src/ASF/xmega/drivers/nvm/nvm_asm.o + +.debug_abbrev 0x00000000 0x26 + *(.debug_abbrev) + .debug_abbrev 0x00000000 0x14 src/ASF/xmega/drivers/cpu/ccp.o + .debug_abbrev 0x00000014 0x12 src/ASF/xmega/drivers/nvm/nvm_asm.o + +.debug_line 0x00000000 0x18d + *(.debug_line .debug_line.* .debug_line_end) + .debug_line 0x00000000 0x6e src/ASF/xmega/drivers/cpu/ccp.o + .debug_line 0x0000006e 0x11f src/ASF/xmega/drivers/nvm/nvm_asm.o + +.debug_frame + *(.debug_frame) + +.debug_str + *(.debug_str) + +.debug_loc + *(.debug_loc) + +.debug_macinfo + *(.debug_macinfo) + +.debug_weaknames + *(.debug_weaknames) + +.debug_funcnames + *(.debug_funcnames) + +.debug_typenames + *(.debug_typenames) + +.debug_varnames + *(.debug_varnames) + +.debug_pubtypes + *(.debug_pubtypes) + +.debug_ranges 0x00000000 0x20 + *(.debug_ranges) + .debug_ranges 0x00000000 0x20 src/ASF/xmega/drivers/nvm/nvm_asm.o + +.debug_macro + *(.debug_macro) +OUTPUT(USB_BULK_TEST.elf elf32-avr) +LOAD linker stubs diff --git a/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.srec b/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.srec new file mode 100644 index 00000000..42ab1b15 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/USB_BULK_TEST.srec @@ -0,0 +1,609 @@ +S01500005553425F42554C4B5F544553542E73726563F9 +S11300001DC1000037C1000035C1000033C100002C +S113001031C100002FC100002DC100002BC1000020 +S113002029C1000027C1000025C1000023C1000030 +S113003021C100001FC100001DC100001BC1000040 +S113004019C1000017C1000015C1000013C1000050 +S113005011C100000FC100000DC100000BC1000060 +S113006009C1000007C1000005C1000003C1000070 +S113007001C10000FFC00000FDC00000FBC0000083 +S1130080F9C00000F7C00000F5C00000F3C0000094 +S1130090F1C00000EFC00000EDC00000EBC00000A4 +S11300A0E9C00000E7C00000E5C00000E3C00000B4 +S11300B0E1C00000DFC00000DDC00000DBC00000C4 +S11300C0D9C00000D7C00000D5C00000D3C00000D4 +S11300D0D1C00000CFC00000CDC00000CBC00000E4 +S11300E0C9C00000C7C00000C5C00000C3C00000F4 +S11300F0C1C00000BFC00000BDC00000BBC0000004 +S1130100B9C00000B7C00000B5C00000B3C0000013 +S1130110B1C00000AFC00000ADC00000ABC0000023 +S1130120A9C00000A7C00000A5C00000A3C0000033 +S1130130A1C000009FC000009DC000009BC0000043 +S113014099C0000097C0000095C0000026C60000BA +S113015091C000008FC000008DC000008BC0000063 +S113016089C0000087C0000085C0000083C0000073 +S113017081C000007FC000007DC000007BC0000083 +S113018079C0000077C0000075C0000073C0000093 +S113019071C000006FC000006DC000006BC00000A3 +S11301A069C0000067C0000065C0000063C00000B3 +S11301B061C000005FC000005DC000005BC00000C3 +S11301C059C0000057C0000055C0000053C00000D3 +S11301D051C000004FC000004DC000004BC00000E3 +S11301E049C0000047C0000045C0000043C00000F3 +S11301F041C000000C94EB100C94A0118201840106 +S1130200860188018A018F018C018E0168096A09BF +S11302108009B609BF09C409130A180AD709E009F5 +S1130220EE09F009F209FC09060A110AD009D909F4 +S1130230E209F009F209F409FE09080A11241FBEB3 +S1130240CFEFCDBFDFE2DEBF10E2A0E0B0E2EEE22E +S1130250F5E202C005900D92A03CB107D9F72CE25B +S1130260A0ECB0E201C01D92A835B207E1F71BD0A3 +S11302700C949512C5CEE0E8F6E08FE0808385E02B +S11302808483089508958091C220811103C08EEE65 +S113029092E002C080E090E043E451E06EEE72E050 +S11302A08A58994DC7C687E08093A200789420D6D7 +S11302B0E9DF98D7B1D0D4D060E080E07ED06AD0B6 +S11302C08CE05ED02FD5C8D5E1D5D5DF0000000085 +S11302D0000000000000000000000000000000001A +S11302E00000000000000000F1CF089508958091FF +S11302F0002090E08830910590F4FC01E250FF4F1B +S11303000C94861210D10BC08CD109C02AD207C01C +S1130310E5D205C079D303C060D401C0D5D490918F +S1130320C22081E0911180E08093C220089581E091 +S11303308093C32043E451E06EEE72E086E796E2D8 +S113034079D681E008951092C320089581E008953C +S113035081E0089510922002982F9C7193689093E5 +S1130360200287FD03C090E080E002C090E182E0BB +S1130370892B809321021092220210922602089562 +S1130380E0E0F2E010AA836880AB80E181AB12AABE +S113039016AA0895E0E0F2E010A683E880A78FE2B1 +S11303A081A712A616A6089592E09093CA01E82F99 +S11303B0F0E084911092CA010895909171009D7F9C +S11303C09093710010920002623011F49EE101C01A +S11303D09CE19093010290E490930202882311F02F +S11303E080EC01C080E480930302613011F482E068 +S11303F001C083E08093040280E2D6DF80930C0284 +S113040081E2D2DF80930D02109218021092190239 +S113041081E080930002BECFCF93DF93E0E7F0E06A +S113042082818B7F8283C0E2D3E08DE0888380E485 +S1130430898389E08A8383E3B7DF888782E3B4DF33 +S1130440898787E3B1DF8A8786E3AEDF8B87E0E2C3 +S1130450F6E08081836080831482DF91CF910895D8 +S1130460E0E7F0E080818E7F808380E88093000164 +S11304700895E0E0F1E0108A80E4808B10A280A36C +S113048010AA80ABE0E4F1E0108280831092C220D5 +S11304901092C120089510920020EBDFE0E0F1E01B +S11304A016AA44E240AB11AA39E532AB82E083AB31 +S11304B0809102209091032084AB95AB86E794E26F +S11304C080AF91AF12AE8BE384AF23E020933D0164 +S11304D010923E0180A9806880AB10924601E0E44E +S11304E0F1E0408310924101309342012093430193 +S11304F080910420909105208093440190934501BC +S113050086E692E2809348019093490110924A0151 +S113051089E380934C0120934D0110924E01808118 +S1130520806880830895E0E0F1E0108A80E4808BA5 +S113053084E0808B118A81E9828B80E1838B87E759 +S113054091E0848B958B84E2808F82E0818F128E80 +S11305504091C2202EEE32E0429FC001439F900D95 +S113056011248A58994D848F4091C220429FC00122 +S1130570439F900D11248A58994D958F168E80892A +S11305808068808B089581E08093002072DFE0E032 +S1130590F1E010AA80E480AB84E080AB11AA12AA37 +S11305A08BE483AB14AA15AA16AA81E090E280AF6B +S11305B091AF12AE80EA84AF88E080933D0110923F +S11305C03E0180A9806A80AB85E58093A0081092E3 +S11305D04601E0E4F1E084E280831092410189E580 +S11305E08093420182E080934301809102209091A4 +S11305F00320809344019093450186E692E2809320 +S113060048019093490110924A018BE380934C0175 +S113061083E080934D0110924E0180818068808335 +S11306200895E0E0F1E0108AA0E4A08B74E0708B00 +S1130630118A61E9628B80E1838B47E751E0448B47 +S1130640558B84E2808F82E0818F128EB091C2201C +S11306508EEE92E0B89F9001B99F300D11242A5874 +S1130660394D248FB091C220B89F9001B99F300DAD +S113067011242A58394D358F168E20892068208BF5 +S113068010A2A0A370A311A262A32BE423A344A3EA +S113069055A320EA20A728E021A712A64091C22052 +S11306A0489F9001499F300D11242351384D24A7B0 +S11306B04091C220489F9001499F300D112423513D +S11306C0384D35A716A680A1806880A30895CF93DE +S11306D0C2E0C0930020CDDEE0E0F1E016AA44E2DF +S11306E040AB11AA39E532AB23E023AB809104205F +S11306F09091052084AB95AB86E692E280AF91AFF2 +S113070012AE89E384AF20933D0110923E0180A98B +S1130710806880AB10924601E0E4F1E040831092DF +S1130720410130934201C093430180910220909192 +S11307300320809344019093450186E794E28093DB +S113074048019093490110924A018BE380934C0134 +S113075020934D0110924E01808180688083CF9157 +S11307600895CF93E0E0F1E0108AB0E4B08BA4E008 +S1130770A08B118A71E9728B80E1838B47E751E08A +S1130780448B558B84E2808F62E0618F128EC0911E +S1130790C2208EEE92E0C89F9001C99F300D1124B3 +S11307A02A58394D248FC091C220C89F9001C99FF7 +S11307B0300D11242A58394D358F168E2089206822 +S11307C0208B10A2B0A3A0A311A272A322E123A3A1 +S11307D044A355A324E320A761A712A64091C220F5 +S11307E0489F9001499F300D11242351384D24A76F +S11307F04091C220489F9001499F300D11242351FC +S1130800384D35A716A680A1806880A3CF9108959E +S1130810CF93C3E0C09300202CDEE0E0F1E010A20F +S113082080E480A384E080A311A212A28BE483A3BA +S113083014A215A216A281E090E280A791A712A6A5 +S113084080EA84A788E085A716A680A1806A80A391 +S113085085E58093A00816AA34E230AB11AA29E5F5 +S113086022AB82E083AB809102209091032084AB81 +S113087095AB86E794E280AF91AF12AE8BE384AF81 +S1130880C0933D0110923E0180A9806880AB109214 +S11308904601E0E4F1E030831092410120934201EB +S11308A0C0934301809104209091052080934401DA +S11308B09093450186E692E2809348019093490122 +S11308C010924A0189E380934C01C0934D01109228 +S11308D04E01808180688083CF910895E0E0F1E04B +S11308E0108A80E4808B84E0808B118A81E9828B7A +S11308F08BE4838B87E791E0848B958B80EA808FF0 +S113090088E0818F128E4091C2202EEE32E0429F09 +S1130910C001439F900D11248A58994D848F4091B2 +S1130920C220429FC001439F900D11248A58994DC3 +S1130930958F168E80898068808B0895CF93C4E04C +S1130940C093002096DDE0E0F1E010A280E480A3F3 +S1130950C0A311A212A28BE483A314A215A216A20F +S113096081E090E280A791A712A680EA84A788E09C +S113097085A716A680A1806A80A385E58093A00838 +S113098016AA44E240AB11AA39E532AB23E023AB0B +S1130990809104209091052084AB95AB86E692E289 +S11309A080AF91AF12AE89E384AF20933D011092E2 +S11309B03E0180A9806880AB10924601E0E4F1E03A +S11309C04083109241013093420182E080934301BD +S11309D080910220909103208093440190934501DB +S11309E086E794E2809348019093490110924A016A +S11309F08BE380934C0120934D0110924E01808132 +S1130A0080688083CF910895CF93E0E0F1E0108A6D +S1130A10B0E4B08BA4E0A08B118A71E9728B8BE4F3 +S1130A20838B47E751E0448B558B80EA808F68E0E5 +S1130A30618F128EC091C2208EEE92E0C89F900109 +S1130A40C99F300D11242A58394D248FC091C220DA +S1130A50C89F9001C99F300D11242A58394D358FF4 +S1130A60168E20892068208B10AAB0ABA0AB11AAE7 +S1130A7072AB2AE423AB44AB55AB23EC20AF61AF9C +S1130A8012AE4091C220489F9001499F300D11241D +S1130A902351384D24AF4091C220489F9001499F73 +S1130AA0300D11242351384D30933D0110923E01F5 +S1130AB080A9806880ABCF91089585E08093002061 +S1130AC0D8DCE0E0F1E016AA54E250AB11AA49E503 +S1130AD042AB23E023AB809104209091052084ABAA +S1130AE095AB86E692E280AF91AF12AE39E334AFB4 +S1130AF020933D0110923E0180A9806880AB109242 +S1130B004601E0E4F1E05083109241014093420138 +S1130B102093430180910420909105208093440107 +S1130B209093450186E796E28093480190934901AA +S1130B3010924A0130934C0120934D0110924E01C2 +S1130B40808180688083089586E08093002091DC12 +S1130B50E0E0F1E016AA44E240AB11AA39E532AB79 +S1130B6023E023AB809104209091052084AB95ABC6 +S1130B7086E692E280AF91AF12AE89E384AF209310 +S1130B803D0110923E0180A9806880AB109246011D +S1130B90E0E4F1E04083109241013093420182E0AD +S1130BA0809343018091022090910320809344011B +S1130BB09093450186E794E280934801909349011C +S1130BC010924A018BE380934C0120934D011092C3 +S1130BD04E018081806880830895E0E0F1E0108A0E +S1130BE080E4808B84E0808B118A81E9828B80E1B0 +S1130BF0838B2EEE32E0248B358B84E2808F82E06F +S1130C00818F128E4091C220429FC001439F900D5C +S1130C1011248A58994D848F4091C220429FC0016B +S1130C20439F900D11248A58994D958F168E808973 +S1130C308068808B089587E0809300201ADCE0E0D0 +S1130C40F1E016AA44E240AB11AA39E532AB23E045 +S1130C5023AB809104209091052084AB95AB86E66C +S1130C6092E280AF91AF12AE89E384AF20933D014D +S1130C7010923E0180A9806880AB10924601E0E4A6 +S1130C80F1E04083109241013093420182E080936D +S1130C90430180910220909103208093440190931A +S1130CA0450186E794E280934801909349011092AC +S1130CB04A018BE380934C0120934D0110924E0125 +S1130CC08081806880830895E0E0F1E0108A80E408 +S1130CD0808B85E0808B118A81E9828B80E1838B14 +S1130CE02EEE32E0248B358B84E2808F82E0818F7C +S1130CF0128E4091C220429FC001439F900D112447 +S1130D008A58994D848F4091C220429FC001439FCD +S1130D10900D11248A58994D958F168E808980687C +S1130D20808B0895E0E7F0E083818C7F8383848166 +S1130D308C7F848380818D7F8083E0E8F1E080EC88 +S1130D408283128688EC81831186E0E0F8E024E057 +S1130D50208333E03183148285ED91E086A397A349 +S1130D601682E0E4F8E020833183148286A397A3FB +S1130D701682E0E6F6E0808180618083E0E4F9E0B9 +S1130D8083E18183148281E0868380E090E186A3FD +S1130D9097A310A611A6208308951F920F920FB651 +S1130DA00F9211242F933F934F935F938F939F93AD +S1130DB0CF93DF931F92CDB7DEB7809100208730A9 +S1130DC031F480912C02898380912D0202C080919C +S1130DD02C024091C020481B8091680990916909B8 +S1130DE042308CF0843F9F4070F420916809309128 +S1130DF0690949301CF08CE090E002C081E090E089 +S1130E00820F931F17C080916809909169094F3F21 +S1130E10ACF40D9798F02091680930916909483F26 +S1130E201CF48CE090E002C081E090E0A901481B32 +S1130E30590BCA0180937809909379090F90DF9137 +S1130E40CF919F918F915F914F913F912F910F90EF +S1130E500FBE0F901F901895E0E7F0E083818F7E1E +S1130E608383E0E4F6E080818A6A80838FEF848361 +S1130E7088E5828B80E28687E0EAF8E084EC85836B +S1130E8083E08683178288E184830895E0E7F0E0B5 +S1130E908381877F838380E48093C00888E5E0E4CE +S1130EA0F6E0878B08959FB7F894E0E5F0E02081A1 +S1130EB0822B80839FBF08959FB7F894A0E5B0E08C +S1130EC016968C911697897F16968C931697E0E662 +S1130ED0F0E080E885838BEB868316968C911697D9 +S1130EE0846016968C938081816080839FBF08956F +S1130EF0CF93DF9300D000D0CDB7DEB78FEF8093D0 +S1130F0070008093710080937200809373008093CB +S1130F107400809375008093760064E081E490E02F +S1130F20D6D46CE170E082E0D8D48C836DE170E0BB +S1130F3082E0D3D48B838B819C81019621F480E45D +S1130F4093E28B839C838B819C8189839A83809396 +S1130F5062008A818093630082E0A5DF8091510062 +S1130F6081FFFCCFA9DF61E080E490E0B0D49FB7BB +S1130F70F894809150008E7F809350009FBF2496F8 +S1130F80CDBFDEBFDF91CF9108959FB7F894E82FCE +S1130F90F0E0E059FF4F60958081862380839FBFF6 +S1130FA00895CF93863011F4C8E101C0C0E0809168 +S1130FB0510081FD07C082E076DF8091510081FFFE +S1130FC0FCCF7ADF6C2F636084E490E080D460E42B +S1130FD080E0CF91DACF8091C42008958091C4201D +S1130FE0813009F4B0C90895F8D0FC01838180935D +S1130FF0C420811101C09BC981E0089590916624A9 +S1131000892F807697FF07C0803491F480916724FC +S113101081110EC09DC9803459F4809167248111D7 +S113102007C080916C2490916D24892B09F08EC99E +S113103080E008950F931F939B018A01AC0160E047 +S113104083E80E9425101F910F91089580916824D0 +S11310508F777AC79091CC20992361F1E091C920D0 +S1131060F091CA200190F081E02D9481891710F548 +S1131070E093C720F093C820228133812E0F3F1FB5 +S1131080E217F30798F49181943061F49281891303 +S113109009C09381691306C0E093C720F093C82068 +S11310A081E008959081E90FF11DEACFE093C72014 +S11310B0F093C82080E00895E091C920F091CA20FF +S11310C00190F081E02D228133812E0F3F1FFC011E +S11310D04081E40FF11DE217F30748F48181843065 +S11310E031F0853039F08081E80FF11DF4CF80E0D4 +S11310F090E00895CF0108951F93CF93DF93182FA5 +S1131100A9DF882339F1C091C720D091C820CE012E +S1131110D3DFEC01009741F04C815D816B818A81C2 +S113112022D78111F4CF16C0E091C920F091CA20D2 +S113113092818381E92FF82FE10FF11DE10FF11D59 +S11311400190F081E02D0190F081E02DDF91CF91AD +S11311501F91099480E0DF91CF911F910895FF9230 +S11311600F931F93CF93DF93C82F60E073DFF82EA4 +S1131170882361F1E091C920F091CA209281838192 +S1131180E92FF82FEC0FF11DEC0FF11D00811181F7 +S1131190D8011696ED91FC9117970995682F8C2F1D +S11311A059DFF82E882391F0C091C720D091C82030 +S11311B0CE0182DFEC01009719F08A81F3D7F8CFD2 +S11311C0D8011296ED91FC91139709958F2DDF911B +S11311D0CF911F910F91FF9008958091C720909116 +S11311E0C820089539C6CF938091CC20811108C0BE +S11311F01092CC201092D0201092D120CF9108953B +S1131200C0E0E091C920F091CA200190F081E02D66 +S11312108481C81768F78C2FA2DFCF5FF2CFCF93FA +S11312208091CC208823F1F0C0E0E091C920F091B6 +S1131230CA20A081B18114968C91C81798F4928128 +S11312408381E92FF82FEC0FF11DEC0FF11D0190B4 +S1131250F081E02D0084F185E02D309709F00995A7 +S1131260CF5FE3CFCF910895CF92DF92FF920F9398 +S11312701F93CF93DF931F92CDB7DEB710927024E4 +S11312801092712410927224109273241092742478 +S1131290109275242091662427FF07C080916C2446 +S11312A090916D24892B09F408C3822F80768034B1 +S11312B009F0C5C08091672490E0FC01E05AF1096F +S11312C0E830F10508F088C2EA5FFE4F0C948612FC +S11312D00000F1C210920008809168249091692462 +S11312E0809336089093370880916A248F70809396 +S11312F0000860916C2470916D2486E692E219C016 +S11313001092400860916C2470916D2460930220C7 +S113131070930320809168249091692480937608C7 +S11313209093770880916A248F708093400886E7B1 +S113133094E210D6209104203091052080916C24F1 +S113134090916D242817390709F4B5C280930420BD +S1131350909305208091002090E08830910508F05A +S1131360AAC2FC01E25FFE4F0C9486121092680937 +S113137010926909809168248093C0209CC2809156 +S113138068248093240697C2E0916824F09169242C +S1131390E830F10508F020C2EA5EFE4F0C94861294 +S11313A060E080E00AD880916A240E94AA0173D880 +S11313B082C260E080E001D880916A240E94AA0180 +S11313C0E2D879C261E081E00E94DD0180916A2463 +S11313D00E94AA0180916B240E94C00178D96BC23B +S11313E017DA69C2ABDA67C260E080E00E94DD010F +S11313F080916A240E94AA0160DB5DC261E080E002 +S11314000E94DD0180916A240E94AA019DDB53C2DF +S113141062E080E00E94DD0180916A2480680E947D +S1131420AA0109DC48C2809168248093840643C2DF +S1131430E9E7F0E091E088EDF89484BF90838111AE +S1131440CBC127FFFBC080916C2490916D24009741 +S113145009F4C2C12F7109F09BC020916724263082 +S113146069F0283009F48CC02111B6C1029709F043 +S1131470B3C162E070E080ED90E2DEC020916824A8 +S113148030916924832F99278230910591F05CF47F +S1131490019709F0A1C18091102090911120DC01E5 +S11314A06C9170E05BC08330910581F10F9709F175 +S11314B093C1E0911020F09111208189281708F040 +S11314C08BC13327220F331F220F331FE0911220C9 +S11314D0F0911320E20FF31F80819181FC0162815E +S11314E0738138D5E0916E24F0916F2482E081837A +S11314F036C08091142090911520009709F46CC196 +S1131500DC0112966D917C91139728C0332721300A +S1131510310529F040F02230310551F05DC169E018 +S113152083EA90E208C064E070E08EEA90E216C0BC +S113153068E18AE890E2282FAAE5B0E2FC018191F3 +S113154090E08D939D938E2F821B8617C0F3660FB8 +S11315506E5F6093582070E088E590E2FBD4809140 +S11315606C2490916D242091702430917124821701 +S1131570930708F0A0C180937024909371249BC1B9 +S1131580019709F029C161E070E08CEC90E254C04D +S11315902130E1F5209167242A3009F01DC101971B +S11315A009F01AC18091CC20882309F415C1C09098 +S11315B06A24D0906B240091C9201091CA20D801CC +S11315C0ED91FC918481C81608F006C160E08C2D71 +S11315D041DDF82E882309F4FFC0DD24CC0CDD1C8A +S11315E0D8011296ED91FC911397EC0DFD1D01901D +S11315F0F081E02D0680F781E02D09958093CE20BF +S113160061E070E08EEC90E2A5D4E4C0223009F0F1 +S1131610E3C0209167242111DFC0029709F0DCC0E8 +S113162080916A24F2D490E08093C5209093C620E0 +S113163062E070E085EC90E28DD43DC12F7109F039 +S11316407DC080916724833009F4C6C018F48130CA +S1131650A1F0C2C0853019F0893039F1BDC0809144 +S11316606C2490916D24892B09F0B6C086E298E031 +S113167080937224909373241EC180916C24909162 +S11316806D24892B09F0A8C0809168249091692465 +S1131690019709F0A1C08091D0209091D1208D7F35 +S11316A08093D0209093D12006C180916C24909196 +S11316B06D24892B09F090C04AD4882309F48CC086 +S11316C080916824909169249927E0911020F091E9 +S11316D01120218930E02817390708F47DC083DD03 +S11316E020916824309169242093CC20222309F48A +S11316F0E2C033272150304C220F331F220F331FF7 +S11317008091122090911320820F931F8093C920FF +S11317109093CA2010E0E091C920F091CA20019072 +S1131720F081E02D8481181708F0C5C060E0812F96 +S1131730E3DC882309F450C01F5FEDCF2130F1F4BE +S1131740809167248B3009F047C080916C2490917C +S11317506D24892B09F040C08091CC20882309F4A2 +S11317603BC010916A2460916824812F6983F7DC5F +S11317706981882389F1812FBFDC2BC0223061F578 +S113178080916724813019F0833089F025C08091DD +S11317906C2490916D24892BF9F4809168249091A4 +S11317A06924892BC9F480916A2436D412C08091AB +S11317B06C2490916D24892B79F480916824909104 +S11317C06924892B49F480916A24C1D480916A24C4 +S11317D0F2D4F82EF1106FC0809166248F7181309D +S11317E0B9F58091CC20882399F1C0906A24D090D7 +S11317F06B240091C9201091CA20D801ED91FC916D +S11318008481C81628F560E08C2D24DC882301F13E +S1131810C6019927880F991FD8011296ED91FC9162 +S11318201397E80FF91F00811181D8011696ED91E5 +S1131830FC9117970995682F8C2D0CDC882341F0B7 +S1131840D8011496ED91FC9115970995811133C037 +S1131850809166248F71823081F58091CC20882319 +S113186061F110E0E091C920F091CA20A081B1811A +S113187014968C91181708F592818381E92FF82F1B +S1131880E10FF11DE10FF11DC080D180D601169644 +S1131890ED91FC9117970995682F812FDBDB882345 +S11318A061F0D6011496ED91FC911597099581117B +S11318B002C01F5FD7CF81E001C080E00F90DF91AD +S11318C0CF911F910F91FF90DF90CF9008951BBE91 +S11318D0FC0128ED24BF608308954091CA01E62FDE +S11318E0F72F8093CA0184914093CA010895E82F89 +S11318F0F0E0EE5AF34D80818F3F09F4FFCF9FB79C +S1131900F89480818F5F80839FBF0895E82FF0E073 +S1131910EE5AF34D8081811101C0FFCF9FB7F89437 +S11319208081815080839FBF0895CF93C82F809179 +S11319306422C11105C0882339F081E0E7DF04C0C7 +S1131940811102C081E0D3DFC0936422CF91089556 +S1131950282F2F70992787FD90958827990F881F26 +S11319609927820F911D820F911D43E0880F991FC3 +S11319704A95E1F7805E9D4D08950F93E8ECF4E0FD +S113198080818F7D808380818F7D8083E8E2F2E295 +S113199002E0059310922A2210922B2200E2069371 +S11319A000E40693E0E2F2E200E2069300E4069328 +S11319B0109272241092732410927424109275243D +S11319C0109270241092712410920D220F91089598 +S11319D00F9385E080930D22E9E2F2E204E005939F +S11319E0E1E2F2E204E005930F9108950F9383E09E +S11319F080930D2210922A2210922B22E8E2F2E226 +S1131A0002E006930F910895E0917224F0917324FB +S1131A10309709F009940895982F9F70282F332741 +S1131A2027FD30952227330F221F3327290F311D1D +S1131A30290F311D2250310949E0429FC001439FC3 +S1131A40900D11248D569E4D08958F929F92BF92B2 +S1131A50CF92DF92EF92FF920F931F93CF93DF9376 +S1131A60B82EDADFEC018B2D73DF7C01DC011196DB +S1131A70EC91E770E150E73040F4F0E0EE0FFF1F27 +S1131A80EE54FF4D0081118102C008E010E0ED81A9 +S1131A90FE818B819C814881D701B7FE4FC0169689 +S1131AA02D913C9117972E0F3F1F2D833E832817AE +S1131AB0390799F1FC01E21BF30B9F012115F4E0B6 +S1131AC03F0738F02FEF33E0C901B8010BD5281BCD +S1131AD0390B41FF09C0C901B80104D541E0892B84 +S1131AE009F040E0942F01C090E0888190FB81F9D7 +S1131AF08883D70116961D921C92179712962D93E0 +S1131B003C93139789819A812D813E81820F931F83 +S1131B1014968D939C9315970DC041FF70C04D7F13 +S1131B204883D70116961D921C92179712961D9200 +S1131B301C921397F70102E006937AC01296CD9097 +S1131B40DC90139742FF0FC089809A80B801CAD4F1 +S1131B50B0E4BB9EB00111246D567F4DAC01C401AD +S1131B608E0F9F1FD9D46D817E816C0D7D1D6D8379 +S1131B707E832B813C812617370710F42D833E8307 +S1131B80F70186819781C816D906C9F58D819E8192 +S1131B9082179307A1F1281B390B2115F4E03F07A5 +S1131BA010F02FEF33E0C901B8019CD4281B390B86 +S1131BB0D70112961D921C9213972017310778F4BF +S1131BC0888184608883B0E4BB9EC00111248D5653 +S1131BD09F4DF7018483958306831783ABCF898157 +S1131BE09A814D815E81840F951FD70114968D9340 +S1131BF09C93159716962D933C9317979BCF8881AA +S1131C0080FF16C08E7F8883EF81F885309781F03E +S1131C106D817E814B2D80E0DF91CF911F910F91DB +S1131C20FF90EF90DF90CF90BF909F908F9009949A +S1131C30DF91CF911F910F91FF90EF90DF90CF90A4 +S1131C40BF909F908F9008950F93CF93DF938091CF +S1131C500D22833029F4D8DEDF91CF910F918DCE00 +S1131C602091092230910A22C0917024D0917124CC +S1131C70C21BD30B61F580910B2290910C22820F31 +S1131C80931F80930B2290930C2220916C2430910B +S1131C906D242817390721F08091D220882331F050 +S1131CA084E080930D22E0E2F2E236C0E0917424F5 +S1131CB0F0917524309799F00995882381F010925A +S1131CC0092210920A22C0917024D0917124C03448 +S1131CD0D10528F01092D220C0E4D0E003C081E006 +S1131CE08093D220C0932A22D0932B2220910922C0 +S1131CF030910A2280916E2490916F24820F931F59 +S1131D0080932C2290932D22C20FD31FC0930922BB +S1131D10D0930A22E8E2F2E202E00693DF91CF9147 +S1131D200F9108950F93CF93DF931F92CDB7DEB732 +S1131D308091CC0480FF65C081E08093CC04E0E214 +S1131D40F2E200E80693E8E2F2E200E80693809308 +S1131D50CA04E0E2F2E200E1069380910D228823B6 +S1131D6029F08350823008F44FDE07DE809122226E +S1131D7090912322089709F046C088E0E9ECF1E24B +S1131D80A6E6B4E201900D928A95E1F78091C80429 +S1131D9080628093C8048091C80480628093C804E0 +S1131DA063DA811102C014DE2EC09091662497FF7D +S1131DB00EC010920B2210920C2210920922109243 +S1131DC00A2292E090930D2289833EDF08C020917D +S1131DD06C2430916D24232B21F4898307DE8981BF +S1131DE013C010920B2210920C221092092210920E +S1131DF00A2291E090930D22E0E2F2E202E00693DF +S1131E0003C080E001C081E00F90DF91CF910F917A +S1131E100895CF93CFB7F89481E087DDEAECF4E03E +S1131E2080E4808380E28083E1ECF4E0808181605F +S1131E308083A9ECB4E08C9182608C93E8ECF4E0AC +S1131E408081806480838C9181608C9380818068A0 +S1131E508083CFBFCF910895CF931092600080E329 +S1131E60A0D88091C00480648093C00481E08093F2 +S1131E706000CFB7F89480E090E0FC0173E0EE0FCF +S1131E80FF1F7A95E1F7EF5DFD4D108201968830D2 +S1131E90910599F7809193218E7F8093932180916E +S1131EA09C218E7F80939C218091A5218E7F80939D +S1131EB0A5218091AE218E7F8093AE218091B721A0 +S1131EC08E7F8093B7218091C0218E7F8093C02123 +S1131ED06AE170E082E001DD8F3F09F48FE18093D5 +S1131EE0FA046BE170E082E0F8DC8F3F09F48FE1E3 +S1131EF08093FB048091C00483608093C00480912C +S1131F00C00480688093C0048091C0048061809381 +S1131F10C00480E292E28093C6049093C704809147 +S1131F20C00480628093C0048FEF8093C5048091C5 +S1131F30C80482608093C8041092642285E0D7DCD0 +S1131F4068DFCFBFCF9108958093C3040895809133 +S1131F50C304089580936E2490936F246093702437 +S1131F607093712408950F931F93CF93DF931F925F +S1131F70CDB7DEB78A016983EBDCFC018181807C0B +S1131F80698181113BC06370613029F010F490E4E1 +S1131F9003C090E801C090EC00381105E1F050F462 +S1131FA000321105A1F00034110599F0003111053A +S1131FB061F419C0011582E0180789F00F3FA3E00E +S1131FC01A0779F00115114041F080E00DC082E05C +S1131FD00BC083E009C084E007C085E005C086E04B +S1131FE003C087E001C081E0118226E02083892BB1 +S1131FF0818381818062818381E001C080E00F90D0 +S1132000DF91CF911F910F910895A2DCFC01818192 +S113201082FB882780F90895CF93C82F99DCFC01AF +S1132020818182FF0FC091819B7F91838C2FF4DC8F +S1132030FC01808180FF06C08E7F80830780F0854D +S1132040E02D099581E0CF9108958F929F92BF92E0 +S1132050CF92DF92EF92FF920F931F93CF93DF9370 +S11320601F92CDB7DEB7B82E6A0179016983D4DC3B +S11320704C018B2D6DDCFC018181807C698188237E +S113208009F457C08181807C803C19F0818182FDF4 +S113209050C08FB7F894D4019C9190FF02C08FBFB9 +S11320A048C09160D4019C938FBFD4011196CD9206 +S11320B0DC9212971396ED92FC92149715961D924A +S11320C01C92169717960D931C93189791E0611123 +S11320D004C0E114F10409F090E0D4018C9190FB68 +S11320E081F98B7F8C93B7FC1EC08181807C803CFE +S11320F0C1F4A181A770A150A73040F4B0E0AA0FA9 +S1132100BB1FAE54BF4D6D917C9102C068E070E07E +S1132110C701E8D1892B29F0F40180818E7F808367 +S113212008C012821382168217828B2D8EDC81E006 +S113213001C080E00F90DF91CF911F910F91FF902C +S1132140EF90DF90CF90BF909F908F9008950F9362 +S11321501F93CF93DF93182FFBDBEC01812F5CDC03 +S1132160DC01FE0102E005938C9180FF16C08E7F96 +S11321708C931796ED91FC911897309771F017FF97 +S113218003C06E817F8102C06A817B81412F81E01F +S1132190DF91CF911F910F910994DF91CF911F91FE +S11321A00F910895CF93C82FD2DF8C2FD1DBFC0180 +S11321B01182CF9108950F93CF93C82FC9DBFC01EF +S11321C091819460918301E006938C2FC0DF81E0BC +S11321D0CF910F9108951F920F920FB60F92112471 +S11321E00F932F933F934F935F936F937F938F93AB +S11321F09F93AF93BF93EF93FF938091CB0487FF9B +S113220007C080E88093CA040AD80E94770186C078 +S11322108091CB0482FF18C084E08093CA0480912B +S1132220282286FF7BC08091CC0481FD77C07ADDB3 +S1132230811174C080910D22813011F4D7DB6EC0FE +S1132240843009F06BC021C08091CB0481FF26C08B +S113225082E08093CA048091202286FF5FC080912F +S1132260CC0481FD5BC05EDD811158C080910D22DC +S1132270823041F484E080930D22E0E2F2E202E055 +S113228006934CC0833009F049C0E9E2F2E204E06D +S11322900593E1E2F2E204E0059340C08091CB04AF +S11322A084FF25C080E18093CA0481E050DF81E887 +S11322B04EDF82E04CDF82E84ADF0E94F30810928E +S11322C0C3041092212296E09093202283E4809309 +S11322D0212210922922909328228093292289EC8A +S11322E091E2809324229093252247DB17C08091AA +S11322F0CB0486FF08C080E48093CA0480E015DB29 +S11323000E9475010BC08091CB0485FF07C080E259 +S11323108093CA0481E009DB0E947601FF91EF916A +S1132320BF91AF919F918F917F916F915F914F91E9 +S11323303F912F910F910F900FBE0F901F90189502 +S11323401F920F920FB60F9211240F931F932F9386 +S11323503F934F935F936F937F938F939F93AF9329 +S1132360BF93CF93DF93EF93FF938091CC0481FFCE +S11323701AC082E08093CC048091C504E0E2F2E2CA +S11323808195880FE81BF109208131812052324266 +S113239003E0369527950A95E1F7C22FC69520FFED +S11323A006C080E805C0BEDC882319F386C080E03F +S11323B0C80F8C2FCDDAFC01808185FF7EC000E23E +S11323C00693C11174C080910D22843019F41CDB72 +S11323D0D4DA73C0C0912222D09123228091702438 +S11323E0909171240091092210910A2298012C0FD6 +S11323F03D1F8217930718F4EC01C01BD10B809189 +S11324006E2490916F24AE0169EC71E2800F911FEC +S113241083D00C0F1D1F0093092210930A22C0348D +S1132420D10569F480910B2290910C22800F911FA9 +S113243020916C2430916D248217930788F00093C7 +S1132440702410937124E0917424F09175243097D2 +S113245029F00995811102C0BBDA2FC0C7DA2DC05B +S1132460809170249091712480179107D9F4E091A0 +S11324707424F0917524309779F30995882361F3D6 +S113248080910B2290910C222091092230910A22F2 +S1132490820F931F80930B2290930C221092092297 +S11324A010920A22E0E2F2E202E0069306C0C0388B +S11324B011F4CADB02C08C2FC8DAFF91EF91DF91CF +S11324C0CF91BF91AF919F918F917F916F915F91C8 +S11324D04F913F912F911F910F910F900FBE0F902D +S11324E01F901895AA1BBB1B51E107C0AA1FBB1F55 +S11324F0A617B70710F0A61BB70B881F991F5A958C +S1132500A9F780959095BC01CD010895EE0FFF1FAA +S11325100590F491E02D0994FB01DC0102C00190C7 +S11125200D9241505040D8F70895F894FFCF23 +S113252EFF5580008000F407EE07FE07EB0700005E +S113253E4420162000001C201A2006200902270021 +S113254E01010080FA0904000003FFFFFF000705E4 +S113255E81024000000705020240000007058301C6 +S113256EFF0301001201000200000040EB0300A073 +S113257E0002010200010000000300000000000040 +S113258E0000000000000000000000000000000039 +S113259E0000000000000000000000000000000029 +S11325AE00000000000000000000555342476F6217 +S11325BE696E6461722044756D6D79204465766927 +S11325CE63650054617069725465636800000403A6 +S11325DE0904100020004000800000010002FF03E7 +S9030000FC diff --git a/AVR Code/USB_BULK_TEST/Release/makedep.mk b/AVR Code/USB_BULK_TEST/Release/makedep.mk new file mode 100644 index 00000000..4097a0ef --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/makedep.mk @@ -0,0 +1,42 @@ +################################################################################ +# Automatically-generated file. Do not edit or delete the file +################################################################################ + +src\tiny_dig.c + +src\ASF\common\boards\user_board\init.c + +src\ASF\common\services\ioport\xmega\ioport_compat.c + +src\main.c + +src\tiny_adc.c + +src\tiny_dac.c + +src\tiny_dma.c + +src\tiny_timer.c + +src\tiny_uart.c + +src\ASF\common\services\usb\class\vendor\device\example\atxmega256a3bu_xmega_a3bu_xplained\ui.c + +src\ASF\common\services\clock\xmega\sysclk.c + +src\ASF\common\services\sleepmgr\xmega\sleepmgr.c + +src\ASF\common\services\usb\class\vendor\device\udi_vendor.c + +src\ASF\common\services\usb\class\vendor\device\udi_vendor_desc.c + +src\ASF\common\services\usb\udc\udc.c + +src\ASF\xmega\drivers\cpu\ccp.s + +src\ASF\xmega\drivers\nvm\nvm.c + +src\ASF\xmega\drivers\nvm\nvm_asm.s + +src\ASF\xmega\drivers\usb\usb_device.c + diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/common/boards/user_board/init.d b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/boards/user_board/init.d new file mode 100644 index 00000000..b7fc4d06 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/boards/user_board/init.d @@ -0,0 +1,203 @@ +src/ASF/common/boards/user_board/init.d \ + src/ASF/common/boards/user_board/init.o: \ + ../src/ASF/common/boards/user_board/init.c ../src/asf.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/common/boards/user_board/init.o b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/boards/user_board/init.o new file mode 100644 index 00000000..9c2d0431 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/boards/user_board/init.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/clock/xmega/sysclk.d b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/clock/xmega/sysclk.d new file mode 100644 index 00000000..411bc0ab --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/clock/xmega/sysclk.d @@ -0,0 +1,124 @@ +src/ASF/common/services/clock/xmega/sysclk.d \ + src/ASF/common/services/clock/xmega/sysclk.o: \ + ../src/ASF/common/services/clock/xmega/sysclk.c \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/boards/board.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/clock/xmega/sysclk.o b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/clock/xmega/sysclk.o new file mode 100644 index 00000000..ac20ffea Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/clock/xmega/sysclk.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/ioport/xmega/ioport_compat.d b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/ioport/xmega/ioport_compat.d new file mode 100644 index 00000000..1e965942 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/ioport/xmega/ioport_compat.d @@ -0,0 +1,98 @@ +src/ASF/common/services/ioport/xmega/ioport_compat.d \ + src/ASF/common/services/ioport/xmega/ioport_compat.o: \ + ../src/ASF/common/services/ioport/xmega/ioport_compat.c \ + ../src/ASF/common/services/ioport/xmega/ioport_compat.h \ + ../src/ASF/common/services/ioport/xmega/../ioport.h \ + ../src/ASF/common/utils/parts.h ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/common/services/ioport/xmega/../xmega/ioport.h + +../src/ASF/common/services/ioport/xmega/ioport_compat.h: + +../src/ASF/common/services/ioport/xmega/../ioport.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/common/services/ioport/xmega/../xmega/ioport.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/ioport/xmega/ioport_compat.o b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/ioport/xmega/ioport_compat.o new file mode 100644 index 00000000..47a31223 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/ioport/xmega/ioport_compat.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/sleepmgr/xmega/sleepmgr.d b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/sleepmgr/xmega/sleepmgr.d new file mode 100644 index 00000000..b57fa33b --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/sleepmgr/xmega/sleepmgr.d @@ -0,0 +1,104 @@ +src/ASF/common/services/sleepmgr/xmega/sleepmgr.d \ + src/ASF/common/services/sleepmgr/xmega/sleepmgr.o: \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.c \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/sleepmgr/xmega/sleepmgr.o b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/sleepmgr/xmega/sleepmgr.o new file mode 100644 index 00000000..92cfeffb Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/sleepmgr/xmega/sleepmgr.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.d b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.d new file mode 100644 index 00000000..c9897ad0 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.d @@ -0,0 +1,204 @@ +src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.d \ + src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o: \ + ../src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.c \ + ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o new file mode 100644 index 00000000..6ac95207 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/udi_vendor.d b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/udi_vendor.d new file mode 100644 index 00000000..4f8552c4 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/udi_vendor.d @@ -0,0 +1,135 @@ +src/ASF/common/services/usb/class/vendor/device/udi_vendor.d \ + src/ASF/common/services/usb/class/vendor/device/udi_vendor.o: \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.c \ + ../src/config/conf_usb.h ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udc.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\string.h + +../src/config/conf_usb.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/ASF/common/services/usb/udc/udd.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\string.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/udi_vendor.o b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/udi_vendor.o new file mode 100644 index 00000000..2220f45a Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/udi_vendor.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.d b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.d new file mode 100644 index 00000000..70b9a853 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.d @@ -0,0 +1,126 @@ +src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.d \ + src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o: \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.c \ + ../src/config/conf_usb.h ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h + +../src/config/conf_usb.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o new file mode 100644 index 00000000..a28a157e Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/udc/udc.d b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/udc/udc.d new file mode 100644 index 00000000..43b66ba8 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/udc/udc.d @@ -0,0 +1,222 @@ +src/ASF/common/services/usb/udc/udc.d \ + src/ASF/common/services/usb/udc/udc.o: \ + ../src/ASF/common/services/usb/udc/udc.c ../src/config/conf_usb.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/globals.h \ + ../src/tiny_dma.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h \ + ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h ../src/globals.h ../src/tiny_adc.h + +../src/config/conf_usb.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/globals.h: + +../src/tiny_dma.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h: + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/globals.h: + +../src/tiny_adc.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/udc/udc.o b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/udc/udc.o new file mode 100644 index 00000000..93e9ad8f Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/ASF/common/services/usb/udc/udc.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/cpu/ccp.d b/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/cpu/ccp.d new file mode 100644 index 00000000..dd28a749 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/cpu/ccp.d @@ -0,0 +1,34 @@ +src/ASF/xmega/drivers/cpu/ccp.d src/ASF/xmega/drivers/cpu/ccp.o: \ + ../src/ASF/xmega/drivers/cpu/ccp.s ../src/ASF/xmega/utils/assembler.h \ + ../src/ASF/xmega/utils/assembler/gas.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h + +../src/ASF/xmega/utils/assembler.h: + +../src/ASF/xmega/utils/assembler/gas.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/cpu/ccp.o b/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/cpu/ccp.o new file mode 100644 index 00000000..fd8d11d0 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/cpu/ccp.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/nvm/nvm.d b/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/nvm/nvm.d new file mode 100644 index 00000000..a3266c33 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/nvm/nvm.d @@ -0,0 +1,96 @@ +src/ASF/xmega/drivers/nvm/nvm.d src/ASF/xmega/drivers/nvm/nvm.o: \ + ../src/ASF/xmega/drivers/nvm/nvm.c ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h ../src/ASF/xmega/drivers/nvm/nvm.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\string.h + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\string.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/nvm/nvm.o b/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/nvm/nvm.o new file mode 100644 index 00000000..f212f2cd Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/nvm/nvm.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/nvm/nvm_asm.d b/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/nvm/nvm_asm.d new file mode 100644 index 00000000..5ccf6387 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/nvm/nvm_asm.d @@ -0,0 +1,35 @@ +src/ASF/xmega/drivers/nvm/nvm_asm.d src/ASF/xmega/drivers/nvm/nvm_asm.o: \ + ../src/ASF/xmega/drivers/nvm/nvm_asm.s \ + ../src/ASF/xmega/utils/assembler.h \ + ../src/ASF/xmega/utils/assembler/gas.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h + +../src/ASF/xmega/utils/assembler.h: + +../src/ASF/xmega/utils/assembler/gas.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/nvm/nvm_asm.o b/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/nvm/nvm_asm.o new file mode 100644 index 00000000..92018cac Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/nvm/nvm_asm.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/usb/usb_device.d b/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/usb/usb_device.d new file mode 100644 index 00000000..d57ee774 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/usb/usb_device.d @@ -0,0 +1,180 @@ +src/ASF/xmega/drivers/usb/usb_device.d \ + src/ASF/xmega/drivers/usb/usb_device.o: \ + ../src/ASF/xmega/drivers/usb/usb_device.c ../src/config/conf_usb.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/boards/board.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/xmega/drivers/usb/usb_device.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\string.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h + +../src/config/conf_usb.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/xmega/drivers/usb/usb_device.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\string.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/usb/usb_device.o b/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/usb/usb_device.o new file mode 100644 index 00000000..9848bbe5 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/ASF/xmega/drivers/usb/usb_device.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/main.d b/AVR Code/USB_BULK_TEST/Release/src/main.d new file mode 100644 index 00000000..206791d6 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/main.d @@ -0,0 +1,226 @@ +src/main.d src/main.o: ../src/main.c \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h ../src/ui.h ../src/globals.h \ + ../src/tiny_adc.h ../src/tiny_dma.h ../src/tiny_timer.h \ + ../src/tiny_dac.h ../src/tiny_uart.h ../src/tiny_dig.h + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/ui.h: + +../src/globals.h: + +../src/tiny_adc.h: + +../src/tiny_dma.h: + +../src/tiny_timer.h: + +../src/tiny_dac.h: + +../src/tiny_uart.h: + +../src/tiny_dig.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/main.o b/AVR Code/USB_BULK_TEST/Release/src/main.o new file mode 100644 index 00000000..202940ba Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/main.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/tiny_adc.d b/AVR Code/USB_BULK_TEST/Release/src/tiny_adc.d new file mode 100644 index 00000000..16dc2e58 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/tiny_adc.d @@ -0,0 +1,215 @@ +src/tiny_adc.d src/tiny_adc.o: ../src/tiny_adc.c ../src/tiny_adc.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h ../src/globals.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\string.h + +../src/tiny_adc.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/globals.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\string.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/tiny_adc.o b/AVR Code/USB_BULK_TEST/Release/src/tiny_adc.o new file mode 100644 index 00000000..172ef095 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/tiny_adc.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/tiny_dac.d b/AVR Code/USB_BULK_TEST/Release/src/tiny_dac.d new file mode 100644 index 00000000..6b58ae02 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/tiny_dac.d @@ -0,0 +1,213 @@ +src/tiny_dac.d src/tiny_dac.o: ../src/tiny_dac.c ../src/tiny_dac.h \ + ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h \ + ../src/tiny_adc.h + +../src/tiny_dac.h: + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h: + +../src/tiny_adc.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/tiny_dac.o b/AVR Code/USB_BULK_TEST/Release/src/tiny_dac.o new file mode 100644 index 00000000..598d724a Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/tiny_dac.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/tiny_dig.d b/AVR Code/USB_BULK_TEST/Release/src/tiny_dig.d new file mode 100644 index 00000000..07144266 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/tiny_dig.d @@ -0,0 +1,206 @@ +src/tiny_dig.d src/tiny_dig.o: ../src/tiny_dig.c ../src/tiny_dig.h \ + ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h ../src/globals.h + +../src/tiny_dig.h: + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/globals.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/tiny_dig.o b/AVR Code/USB_BULK_TEST/Release/src/tiny_dig.o new file mode 100644 index 00000000..7d1fbc64 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/tiny_dig.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/tiny_dma.d b/AVR Code/USB_BULK_TEST/Release/src/tiny_dma.d new file mode 100644 index 00000000..da0ed9e3 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/tiny_dma.d @@ -0,0 +1,217 @@ +src/tiny_dma.d src/tiny_dma.o: ../src/tiny_dma.c ../src/tiny_dma.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h ../src/globals.h ../src/tiny_adc.h \ + ../src/tiny_uart.h + +../src/tiny_dma.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: + +../src/globals.h: + +../src/tiny_adc.h: + +../src/tiny_uart.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/tiny_dma.o b/AVR Code/USB_BULK_TEST/Release/src/tiny_dma.o new file mode 100644 index 00000000..244e1b68 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/tiny_dma.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/tiny_timer.d b/AVR Code/USB_BULK_TEST/Release/src/tiny_timer.d new file mode 100644 index 00000000..ddd9d913 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/tiny_timer.d @@ -0,0 +1,213 @@ +src/tiny_timer.d src/tiny_timer.o: ../src/tiny_timer.c \ + ../src/tiny_timer.h ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h \ + ../src/globals.h + +../src/tiny_timer.h: + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h: + +../src/globals.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/tiny_timer.o b/AVR Code/USB_BULK_TEST/Release/src/tiny_timer.o new file mode 100644 index 00000000..a204be70 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/tiny_timer.o differ diff --git a/AVR Code/USB_BULK_TEST/Release/src/tiny_uart.d b/AVR Code/USB_BULK_TEST/Release/src/tiny_uart.d new file mode 100644 index 00000000..b4c4f273 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/Release/src/tiny_uart.d @@ -0,0 +1,213 @@ +src/tiny_uart.d src/tiny_uart.o: ../src/tiny_uart.c ../src/tiny_uart.h \ + ../src/asf.h ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/xmega/utils/compiler.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h \ + ../src/ASF/common/utils/parts.h \ + ../src/ASF/xmega/utils/bit_handling/clz_ctz.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/preprocessor/tpaste.h \ + ../src/ASF/xmega/utils/preprocessor/stringz.h \ + ../src/ASF/xmega/utils/preprocessor/mrepeat.h \ + ../src/ASF/xmega/utils/preprocessor/preprocessor.h \ + ../src/ASF/xmega/utils/progmem.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h \ + ../src/ASF/common/utils/interrupt.h \ + ../src/ASF/common/utils/interrupt/interrupt_avr8.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h \ + ../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h \ + ../src/ASF/xmega/drivers/cpu/ccp.h \ + ../src/ASF/common/boards/user_board/user_board.h \ + ../src/config/conf_board.h ../src/ASF/common/boards/board.h \ + ../src/ASF/common/services/ioport/ioport.h \ + ../src/ASF/common/services/ioport/xmega/ioport.h \ + ../src/ASF/xmega/drivers/nvm/nvm.h \ + ../src/ASF/xmega/drivers/sleep/sleep.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h \ + ../src/ASF/common/services/sleepmgr/sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/config/conf_sleepmgr.h \ + ../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h \ + ../src/ASF/common/services/clock/sysclk.h ../src/config/conf_clock.h \ + ../src/ASF/common/services/clock/xmega/sysclk.h \ + ../src/ASF/common/services/clock/osc.h \ + ../src/ASF/common/services/clock/xmega/osc.h \ + ../src/ASF/common/services/clock/pll.h \ + ../src/ASF/common/services/clock/xmega/pll.h \ + ../src/ASF/common/services/usb/udc/udc.h ../src/config/conf_usb.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/common/services/usb/usb_protocol.h \ + ../src/ASF/common/services/usb/usb_atmel.h \ + ../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h \ + ../src/ASF/common/services/usb/udc/udc_desc.h \ + ../src/ASF/common/services/usb/udc/udi.h ../src/ui.h ../src/main.h \ + ../src/ASF/common/services/usb/udc/udd.h \ + ../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h \ + ../src/ASF/xmega/utils/status_codes.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h \ + c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h \ + ../src/globals.h + +../src/tiny_uart.h: + +../src/asf.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/xmega/utils/compiler.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\io.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sfr_defs.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\inttypes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdint.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\iox32a4u.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\portpins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\common.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\version.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\xmega.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\fuse.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\lock.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\builtins.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdbool.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stddef.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdlib.h: + +../src/ASF/common/utils/parts.h: + +../src/ASF/xmega/utils/bit_handling/clz_ctz.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/preprocessor/tpaste.h: + +../src/ASF/xmega/utils/preprocessor/stringz.h: + +../src/ASF/xmega/utils/preprocessor/mrepeat.h: + +../src/ASF/xmega/utils/preprocessor/preprocessor.h: + +../src/ASF/xmega/utils/progmem.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\pgmspace.h: + +../src/ASF/common/utils/interrupt.h: + +../src/ASF/common/utils/interrupt/interrupt_avr8.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\interrupt.h: + +../src/ASF/xmega/drivers/cpu/xmega_reset_cause.h: + +../src/ASF/xmega/drivers/cpu/ccp.h: + +../src/ASF/common/boards/user_board/user_board.h: + +../src/config/conf_board.h: + +../src/ASF/common/boards/board.h: + +../src/ASF/common/services/ioport/ioport.h: + +../src/ASF/common/services/ioport/xmega/ioport.h: + +../src/ASF/xmega/drivers/nvm/nvm.h: + +../src/ASF/xmega/drivers/sleep/sleep.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\avr\sleep.h: + +../src/ASF/common/services/sleepmgr/sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/config/conf_sleepmgr.h: + +../src/ASF/common/services/sleepmgr/xmega/sleepmgr.h: + +../src/ASF/common/services/clock/sysclk.h: + +../src/config/conf_clock.h: + +../src/ASF/common/services/clock/xmega/sysclk.h: + +../src/ASF/common/services/clock/osc.h: + +../src/ASF/common/services/clock/xmega/osc.h: + +../src/ASF/common/services/clock/pll.h: + +../src/ASF/common/services/clock/xmega/pll.h: + +../src/ASF/common/services/usb/udc/udc.h: + +../src/config/conf_usb.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/common/services/usb/usb_protocol.h: + +../src/ASF/common/services/usb/usb_atmel.h: + +../src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ASF/common/services/usb/udc/udc_desc.h: + +../src/ASF/common/services/usb/udc/udi.h: + +../src/ui.h: + +../src/main.h: + +../src/ASF/common/services/usb/udc/udd.h: + +../src/ASF/common/services/usb/class/vendor/device/udi_vendor.h: + +../src/ASF/xmega/utils/status_codes.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\avr\include\stdio.h: + +c:\program\ files\ (x86)\atmel\atmel\ toolchain\avr8\ gcc\native\3.4.1061\avr8-gnu-toolchain\lib\gcc\avr\4.8.1\include\stdarg.h: + +../src/globals.h: diff --git a/AVR Code/USB_BULK_TEST/Release/src/tiny_uart.o b/AVR Code/USB_BULK_TEST/Release/src/tiny_uart.o new file mode 100644 index 00000000..db5f0c7c Binary files /dev/null and b/AVR Code/USB_BULK_TEST/Release/src/tiny_uart.o differ diff --git a/AVR Code/USB_BULK_TEST/USB_BULK_TEST.cproj b/AVR Code/USB_BULK_TEST/USB_BULK_TEST.cproj new file mode 100644 index 00000000..66ffcb4c --- /dev/null +++ b/AVR Code/USB_BULK_TEST/USB_BULK_TEST.cproj @@ -0,0 +1,569 @@ + + + + 2.0 + 6.2 + com.Atmel.AVRGCC8.C + {bd2aa8d9-491b-4ecd-9255-825eaabc7ba4} + atxmega32a4u + xmegaau + Executable + C + $(MSBuildProjectName) + .elf + $(MSBuildProjectDirectory)\$(Configuration) + USB_BULK_TEST + USB_BULK_TEST + USB_BULK_TEST + Native + true + false + true + true + 0x20000000 + + true + exception_table + 2 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + com.atmel.avrdbg.tool.atmelice + + + + 7500000 + 7500000 + + PDI + + com.atmel.avrdbg.tool.atmelice + J41800006314 + Atmel-ICE + + PDI + + + + + PDI + + com.atmel.avrdbg.tool.simulator + + + Simulator + + + + + + True + True + True + True + True + False + + + NDEBUG + BOARD=USER_BOARD + + + + + ../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained + ../common/services/usb/class/vendor/device/example + ../src/ASF/common/services/usb/udc + ../src/ASF/xmega/drivers/nvm + ../src/ASF/common/services/sleepmgr + ../src/ASF/common/services/clock + ../src/ASF/xmega/drivers/sleep + ../src/ASF/xmega/drivers/usb + ../src/ASF/xmega/drivers/cpu + ../src/ASF/common/services/usb/class/vendor + ../src/ASF/common/services/usb/class/vendor/device + ../src/ASF/common/services/usb + ../common/applications/user_application/user_board/config + ../src/ASF/xmega/utils + ../src/config + ../src/ASF/common/boards + ../src/ASF/xmega/utils/preprocessor + ../src/ASF/common/utils + ../src + ../src/ASF/common/boards/user_board + ../src/ASF/common/services/ioport + + + Optimize for size (-Os) + -fdata-sections + True + True + True + -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax + + + libm + + + -Wl,--relax + -mrelax -DBOARD=USER_BOARD + + + ../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained + ../common/services/usb/class/vendor/device/example + ../src/ASF/common/services/usb/udc + ../src/ASF/xmega/drivers/nvm + ../src/ASF/common/services/sleepmgr + ../src/ASF/common/services/clock + ../src/ASF/xmega/drivers/sleep + ../src/ASF/xmega/drivers/usb + ../src/ASF/xmega/drivers/cpu + ../src/ASF/common/services/usb/class/vendor + ../src/ASF/common/services/usb/class/vendor/device + ../src/ASF/common/services/usb + ../common/applications/user_application/user_board/config + ../src/ASF/xmega/utils + ../src/config + ../src/ASF/common/boards + ../src/ASF/xmega/utils/preprocessor + ../src/ASF/common/utils + ../src + ../src/ASF/common/boards/user_board + ../src/ASF/common/services/ioport + + + + + + + + + True + True + True + True + True + False + + + DEBUG + BOARD=USER_BOARD + + + + + ../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained + ../common/services/usb/class/vendor/device/example + ../src/ASF/common/services/usb/udc + ../src/ASF/xmega/drivers/nvm + ../src/ASF/common/services/sleepmgr + ../src/ASF/common/services/clock + ../src/ASF/xmega/drivers/sleep + ../src/ASF/xmega/drivers/usb + ../src/ASF/xmega/drivers/cpu + ../src/ASF/common/services/usb/class/vendor + ../src/ASF/common/services/usb/class/vendor/device + ../src/ASF/common/services/usb + ../common/applications/user_application/user_board/config + ../src/ASF/xmega/utils + ../src/config + ../src/ASF/common/boards + ../src/ASF/xmega/utils/preprocessor + ../src/ASF/common/utils + ../src + ../src/ASF/common/boards/user_board + ../src/ASF/common/services/ioport + + + Optimize (-O1) + -fdata-sections + True + True + Maximum (-g3) + True + -std=gnu99 -fno-strict-aliasing -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -mrelax + + + libm + + + -Wl,--relax + -mrelax -DBOARD=USER_BOARD + + + ../common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained + ../common/services/usb/class/vendor/device/example + ../src/ASF/common/services/usb/udc + ../src/ASF/xmega/drivers/nvm + ../src/ASF/common/services/sleepmgr + ../src/ASF/common/services/clock + ../src/ASF/xmega/drivers/sleep + ../src/ASF/xmega/drivers/usb + ../src/ASF/xmega/drivers/cpu + ../src/ASF/common/services/usb/class/vendor + ../src/ASF/common/services/usb/class/vendor/device + ../src/ASF/common/services/usb + ../common/applications/user_application/user_board/config + ../src/ASF/xmega/utils + ../src/config + ../src/ASF/common/boards + ../src/ASF/xmega/utils/preprocessor + ../src/ASF/common/utils + ../src + ../src/ASF/common/boards/user_board + ../src/ASF/common/services/ioport + + + Default (-Wa,-g) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + + \ No newline at end of file diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/boards/board.h b/AVR Code/USB_BULK_TEST/src/ASF/common/boards/board.h new file mode 100644 index 00000000..63d76ae9 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/boards/board.h @@ -0,0 +1,398 @@ +/** + * \file + * + * \brief Standard board header file. + * + * This file includes the appropriate board header file according to the + * defined board (parameter BOARD). + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +/** + * \defgroup group_common_boards Generic board support + * + * The generic board support module includes board-specific definitions + * and function prototypes, such as the board initialization function. + * + * \{ + */ + +#include "compiler.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/*! \name Base Boards + */ +//! @{ +#define EVK1100 1 //!< AT32UC3A EVK1100 board. +#define EVK1101 2 //!< AT32UC3B EVK1101 board. +#define UC3C_EK 3 //!< AT32UC3C UC3C-EK board. +#define EVK1104 4 //!< AT32UC3A3 EVK1104 board. +#define EVK1105 5 //!< AT32UC3A EVK1105 board. +#define STK600_RCUC3L0 6 //!< STK600 RCUC3L0 board. +#define UC3L_EK 7 //!< AT32UC3L-EK board. +#define XPLAIN 8 //!< ATxmega128A1 Xplain board. +#define STK600_RC064X 10 //!< ATxmega256A3 STK600 board. +#define STK600_RC100X 11 //!< ATxmega128A1 STK600 board. +#define UC3_A3_XPLAINED 13 //!< ATUC3A3 UC3-A3 Xplained board. +#define UC3_L0_XPLAINED 15 //!< ATUC3L0 UC3-L0 Xplained board. +#define STK600_RCUC3D 16 //!< STK600 RCUC3D board. +#define STK600_RCUC3C0 17 //!< STK600 RCUC3C board. +#define XMEGA_B1_XPLAINED 18 //!< ATxmega128B1 Xplained board. +#define XMEGA_A1_XPLAINED 19 //!< ATxmega128A1 Xplain-A1 board. +#define XMEGA_A1U_XPLAINED_PRO 20 //!< ATxmega128A1U XMEGA-A1U Xplained Pro board. +#define STK600_RCUC3L4 21 //!< ATUCL4 STK600 board. +#define UC3_L0_XPLAINED_BC 22 //!< ATUC3L0 UC3-L0 Xplained board controller board. +#define MEGA1284P_XPLAINED_BC 23 //!< ATmega1284P-Xplained board controller board. +#define STK600_RC044X 24 //!< STK600 with RC044X routing card board. +#define STK600_RCUC3B0 25 //!< STK600 RCUC3B0 board. +#define UC3_L0_QT600 26 //!< QT600 UC3L0 MCU board. +#define XMEGA_A3BU_XPLAINED 27 //!< ATxmega256A3BU Xplained board. +#define STK600_RC064X_LCDX 28 //!< XMEGAB3 STK600 RC064X LCDX board. +#define STK600_RC100X_LCDX 29 //!< XMEGAB1 STK600 RC100X LCDX board. +#define UC3B_BOARD_CONTROLLER 30 //!< AT32UC3B1 board controller for Atmel boards. +#define RZ600 31 //!< AT32UC3A RZ600 MCU board. +#define SAM3S_EK 32 //!< SAM3S-EK board. +#define SAM3U_EK 33 //!< SAM3U-EK board. +#define SAM3X_EK 34 //!< SAM3X-EK board. +#define SAM3N_EK 35 //!< SAM3N-EK board. +#define SAM3S_EK2 36 //!< SAM3S-EK2 board. +#define SAM4S_EK 37 //!< SAM4S-EK board. +#define STK600_RCUC3A0 38 //!< STK600 RCUC3A0 board. +#define STK600_MEGA 39 //!< STK600 MEGA board. +#define MEGA_1284P_XPLAINED 40 //!< ATmega1284P Xplained board. +#define SAM4S_XPLAINED 41 //!< SAM4S Xplained board. +#define ATXMEGA128A1_QT600 42 //!< QT600 ATXMEGA128A1 MCU board. +#define ARDUINO_DUE_X 43 //!< Arduino Due/X board. +#define STK600_RCUC3L3 44 //!< ATUCL3 STK600 board. +#define SAM4L_EK 45 //!< SAM4L-EK board. +#define STK600_MEGA_RF 46 //!< STK600 MEGA RF EVK board. +#define XMEGA_C3_XPLAINED 47 //!< ATxmega384C3 Xplained board. +#define STK600_RC032X 48 //!< STK600 with RC032X routing card board. +#define SAM4S_EK2 49 //!< SAM4S-EK2 board. +#define XMEGA_E5_XPLAINED 50 //!< ATxmega32E5 Xplained board. +#define SAM4E_EK 51 //!< SAM4E-EK board. +#define ATMEGA256RFR2_XPLAINED_PRO 52 //!< ATmega256RFR2 Xplained Pro board. +#define SAM4S_XPLAINED_PRO 53 //!< SAM4S Xplained Pro board. +#define SAM4L_XPLAINED_PRO 54 //!< SAM4L Xplained Pro board. +#define ATMEGA256RFR2_ZIGBIT 55 //!< ATmega256RFR2 zigbit. +#define XMEGA_RF233_ZIGBIT 56 //!< ATxmega256A3U with AT86RF233 Zigbit. +#define XMEGA_RF212B_ZIGBIT 57 //!< ATxmega256A3U with AT86RF212B Zigbit. +#define SAM4S_WPIR_RD 58 //!< SAM4S-WPIR-RD board. +#define SAMD20_XPLAINED_PRO 59 //!< SAM D20 Xplained Pro board. +#define SAM4L8_XPLAINED_PRO 60 //!< SAM4L8 Xplained Pro board. +#define SAM4N_XPLAINED_PRO 61 //!< SAM4N Xplained Pro board. +#define XMEGA_A3_REB_CBB 62 //!< XMEGA REB Controller Base board. +#define ATMEGARFX_RCB 63 //!< RFR2 & RFA1 RCB. +#define SAM4C_EK 64 //!< SAM4C-EK board. +#define RCB256RFR2_XPRO 65 //!< RFR2 RCB Xplained Pro board. +#define SAMG53_XPLAINED_PRO 66 //!< SAMG53 Xplained Pro board. +#define SAM4CP16BMB 67 //!< SAM4CP16BMB board. +#define SAM4E_XPLAINED_PRO 68 //!< SAM4E Xplained Pro board. +#define SAMD21_XPLAINED_PRO 69 //!< SAM D21 Xplained Pro board. +#define SAMR21_XPLAINED_PRO 70 //!< SAM R21 Xplained Pro board. +#define SAM4CMP_DB 71 //!< SAM4CMP demo board. +#define SAM4CMS_DB 72 //!< SAM4CMS demo board. +#define ATPL230AMB 73 //!< ATPL230AMB board. +#define SAMD11_XPLAINED_PRO 74 //!< SAM D11 Xplained Pro board. +#define SAMG55_XPLAINED_PRO 75 //!< SAMG55 Xplained Pro board. +#define SAML21_XPLAINED_PRO 76 //!< SAM L21 Xplained Pro board. +#define SAMD10_XPLAINED_MINI 77 //!< SAM D10 Xplained Mini board. +#define SAMW25_XPLAINED_PRO 79 //!< SAMW25 Xplained Pro board. +#define SIMULATOR_XMEGA_A1 97 //!< Simulator for XMEGA A1 devices. +#define AVR_SIMULATOR_UC3 98 //!< Simulator for the AVR UC3 device family. +#define USER_BOARD 99 //!< User-reserved board (if any). +#define DUMMY_BOARD 100 //!< Dummy board to support board-independent applications (e.g. bootloader). +//! @} + +/*! \name Extension Boards + */ +//! @{ +#define EXT1102 1 //!< AT32UC3B EXT1102 board +#define MC300 2 //!< AT32UC3 MC300 board +#define SENSORS_XPLAINED_INERTIAL_1 3 //!< Xplained inertial sensor board 1 +#define SENSORS_XPLAINED_INERTIAL_2 4 //!< Xplained inertial sensor board 2 +#define SENSORS_XPLAINED_PRESSURE_1 5 //!< Xplained pressure sensor board +#define SENSORS_XPLAINED_LIGHTPROX_1 6 //!< Xplained light & proximity sensor board +#define SENSORS_XPLAINED_INERTIAL_A1 7 //!< Xplained inertial sensor board "A" +#define RZ600_AT86RF231 8 //!< AT86RF231 RF board in RZ600 +#define RZ600_AT86RF230B 9 //!< AT86RF230B RF board in RZ600 +#define RZ600_AT86RF212 10 //!< AT86RF212 RF board in RZ600 +#define SENSORS_XPLAINED_BREADBOARD 11 //!< Xplained sensor development breadboard +#define SECURITY_XPLAINED 12 //!< Xplained ATSHA204 board +#define USER_EXT_BOARD 99 //!< User-reserved extension board (if any). +//! @} + +#if BOARD == EVK1100 +# include "evk1100/evk1100.h" +#elif BOARD == EVK1101 +# include "evk1101/evk1101.h" +#elif BOARD == UC3C_EK +# include "uc3c_ek/uc3c_ek.h" +#elif BOARD == EVK1104 +# include "evk1104/evk1104.h" +#elif BOARD == EVK1105 +# include "evk1105/evk1105.h" +#elif BOARD == STK600_RCUC3L0 +# include "stk600/rcuc3l0/stk600_rcuc3l0.h" +#elif BOARD == UC3L_EK +# include "uc3l_ek/uc3l_ek.h" +#elif BOARD == STK600_RCUC3L4 +# include "stk600/rcuc3l4/stk600_rcuc3l4.h" +#elif BOARD == XPLAIN +# include "xplain/xplain.h" +#elif BOARD == STK600_MEGA + /*No header-file to include*/ +#elif BOARD == STK600_MEGA_RF +# include "stk600.h" +#elif BOARD == ATMEGA256RFR2_XPLAINED_PRO +# include "atmega256rfr2_xplained_pro/atmega256rfr2_xplained_pro.h" +#elif BOARD == ATMEGA256RFR2_ZIGBIT +# include "atmega256rfr2_zigbit/atmega256rfr2_zigbit.h" +#elif BOARD == STK600_RC032X +# include "stk600/rc032x/stk600_rc032x.h" +#elif BOARD == STK600_RC044X +# include "stk600/rc044x/stk600_rc044x.h" +#elif BOARD == STK600_RC064X +# include "stk600/rc064x/stk600_rc064x.h" +#elif BOARD == STK600_RC100X +# include "stk600/rc100x/stk600_rc100x.h" +#elif BOARD == UC3_A3_XPLAINED +# include "uc3_a3_xplained/uc3_a3_xplained.h" +#elif BOARD == UC3_L0_XPLAINED +# include "uc3_l0_xplained/uc3_l0_xplained.h" +#elif BOARD == STK600_RCUC3B0 +# include "stk600/rcuc3b0/stk600_rcuc3b0.h" +#elif BOARD == STK600_RCUC3D +# include "stk600/rcuc3d/stk600_rcuc3d.h" +#elif BOARD == STK600_RCUC3C0 +# include "stk600/rcuc3c0/stk600_rcuc3c0.h" +#elif BOARD == SAMG53_XPLAINED_PRO +# include "samg53_xplained_pro/samg53_xplained_pro.h" +#elif BOARD == SAMG55_XPLAINED_PRO +# include "samg55_xplained_pro/samg55_xplained_pro.h" +#elif BOARD == XMEGA_B1_XPLAINED +# include "xmega_b1_xplained/xmega_b1_xplained.h" +#elif BOARD == STK600_RC064X_LCDX +# include "stk600/rc064x_lcdx/stk600_rc064x_lcdx.h" +#elif BOARD == STK600_RC100X_LCDX +# include "stk600/rc100x_lcdx/stk600_rc100x_lcdx.h" +#elif BOARD == XMEGA_A1_XPLAINED +# include "xmega_a1_xplained/xmega_a1_xplained.h" +#elif BOARD == XMEGA_A1U_XPLAINED_PRO +# include "xmega_a1u_xplained_pro/xmega_a1u_xplained_pro.h" +#elif BOARD == UC3_L0_XPLAINED_BC +# include "uc3_l0_xplained_bc/uc3_l0_xplained_bc.h" +#elif BOARD == SAM3S_EK +# include "sam3s_ek/sam3s_ek.h" +# include "system_sam3s.h" +#elif BOARD == SAM3S_EK2 +# include "sam3s_ek2/sam3s_ek2.h" +# include "system_sam3sd8.h" +#elif BOARD == SAM3U_EK +# include "sam3u_ek/sam3u_ek.h" +# include "system_sam3u.h" +#elif BOARD == SAM3X_EK +# include "sam3x_ek/sam3x_ek.h" +# include "system_sam3x.h" +#elif BOARD == SAM3N_EK +# include "sam3n_ek/sam3n_ek.h" +# include "system_sam3n.h" +#elif BOARD == SAM4S_EK +# include "sam4s_ek/sam4s_ek.h" +# include "system_sam4s.h" +#elif BOARD == SAM4S_WPIR_RD +# include "sam4s_wpir_rd/sam4s_wpir_rd.h" +# include "system_sam4s.h" +#elif BOARD == SAM4S_XPLAINED +# include "sam4s_xplained/sam4s_xplained.h" +# include "system_sam4s.h" +#elif BOARD == SAM4S_EK2 +# include "sam4s_ek2/sam4s_ek2.h" +# include "system_sam4s.h" +#elif BOARD == MEGA_1284P_XPLAINED + /*No header-file to include*/ +#elif BOARD == ARDUINO_DUE_X +# include "arduino_due_x/arduino_due_x.h" +# include "system_sam3x.h" +#elif BOARD == SAM4L_EK +# include "sam4l_ek/sam4l_ek.h" +#elif BOARD == SAM4E_EK +# include "sam4e_ek/sam4e_ek.h" +#elif BOARD == SAMD20_XPLAINED_PRO +# include "samd20_xplained_pro/samd20_xplained_pro.h" +#elif BOARD == SAMD21_XPLAINED_PRO +# include "samd21_xplained_pro/samd21_xplained_pro.h" +#elif BOARD == SAMR21_XPLAINED_PRO +# include "samr21_xplained_pro/samr21_xplained_pro.h" +#elif BOARD == SAMD11_XPLAINED_PRO +# include "samd11_xplained_pro/samd11_xplained_pro.h" +#elif BOARD == SAML21_XPLAINED_PRO +# include "saml21_xplained_pro/saml21_xplained_pro.h" +#elif BOARD == SAMD10_XPLAINED_MINI +# include "samd10_xplained_mini/samd10_xplained_mini.h" +#elif BOARD == SAM4N_XPLAINED_PRO +# include "sam4n_xplained_pro/sam4n_xplained_pro.h" +#elif BOARD == SAMW25_XPLAINED_PRO +# include "samw25_xplained_pro/samw25_xplained_pro.h" +#elif BOARD == MEGA1284P_XPLAINED_BC +# include "mega1284p_xplained_bc/mega1284p_xplained_bc.h" +#elif BOARD == UC3_L0_QT600 +# include "uc3_l0_qt600/uc3_l0_qt600.h" +#elif BOARD == XMEGA_A3BU_XPLAINED +# include "xmega_a3bu_xplained/xmega_a3bu_xplained.h" +#elif BOARD == XMEGA_E5_XPLAINED +# include "xmega_e5_xplained/xmega_e5_xplained.h" +#elif BOARD == UC3B_BOARD_CONTROLLER +# include "uc3b_board_controller/uc3b_board_controller.h" +#elif BOARD == RZ600 +# include "rz600/rz600.h" +#elif BOARD == STK600_RCUC3A0 +# include "stk600/rcuc3a0/stk600_rcuc3a0.h" +#elif BOARD == ATXMEGA128A1_QT600 +# include "atxmega128a1_qt600/atxmega128a1_qt600.h" +#elif BOARD == STK600_RCUC3L3 +# include "stk600/rcuc3l3/stk600_rcuc3l3.h" +#elif BOARD == SAM4S_XPLAINED_PRO +# include "sam4s_xplained_pro/sam4s_xplained_pro.h" +#elif BOARD == SAM4L_XPLAINED_PRO +# include "sam4l_xplained_pro/sam4l_xplained_pro.h" +#elif BOARD == SAM4L8_XPLAINED_PRO +# include "sam4l8_xplained_pro/sam4l8_xplained_pro.h" +#elif BOARD == SAM4C_EK +# include "sam4c_ek/sam4c_ek.h" +#elif BOARD == SAM4CMP_DB +# include "sam4cmp_db/sam4cmp_db.h" +#elif BOARD == SAM4CMS_DB +# include "sam4cms_db/sam4cms_db.h" +#elif BOARD == SAM4CP16BMB +# include "sam4cp16bmb/sam4cp16bmb.h" +#elif BOARD == ATPL230AMB +# include "atpl230amb/atpl230amb.h" +#elif BOARD == SIMULATOR_XMEGA_A1 +# include "simulator/xmega_a1/simulator_xmega_a1.h" +#elif BOARD == XMEGA_C3_XPLAINED +# include "xmega_c3_xplained/xmega_c3_xplained.h" +#elif BOARD == XMEGA_RF233_ZIGBIT +# include "xmega_rf233_zigbit/xmega_rf233_zigbit.h" +#elif BOARD == XMEGA_A3_REB_CBB +# include "xmega_a3_reb_cbb/xmega_a3_reb_cbb.h" +#elif BOARD == ATMEGARFX_RCB +# include "atmegarfx_rcb/atmegarfx_rcb.h" +#elif BOARD == RCB256RFR2_XPRO +# include "atmega256rfr2_rcb_xpro/atmega256rfr2_rcb_xpro.h" +#elif BOARD == XMEGA_RF212B_ZIGBIT +# include "xmega_rf212b_zigbit/xmega_rf212b_zigbit.h" +#elif BOARD == SAM4E_XPLAINED_PRO +# include "sam4e_xplained_pro/sam4e_xplained_pro.h" +#elif BOARD == AVR_SIMULATOR_UC3 +# include "avr_simulator_uc3/avr_simulator_uc3.h" +#elif BOARD == USER_BOARD + // User-reserved area: #include the header file of your board here (if any). +# include "user_board.h" +#elif BOARD == DUMMY_BOARD +# include "dummy/dummy_board.h" +#else +# error No known Atmel board defined +#endif + +#if (defined EXT_BOARD) +# if EXT_BOARD == MC300 +# include "mc300/mc300.h" +# elif (EXT_BOARD == SENSORS_XPLAINED_INERTIAL_1) || \ + (EXT_BOARD == SENSORS_XPLAINED_INERTIAL_2) || \ + (EXT_BOARD == SENSORS_XPLAINED_INERTIAL_A1) || \ + (EXT_BOARD == SENSORS_XPLAINED_PRESSURE_1) || \ + (EXT_BOARD == SENSORS_XPLAINED_LIGHTPROX_1) || \ + (EXT_BOARD == SENSORS_XPLAINED_BREADBOARD) +# include "sensors_xplained/sensors_xplained.h" +# elif EXT_BOARD == RZ600_AT86RF231 +# include "at86rf231/at86rf231.h" +# elif EXT_BOARD == RZ600_AT86RF230B +# include "at86rf230b/at86rf230b.h" +# elif EXT_BOARD == RZ600_AT86RF212 +# include "at86rf212/at86rf212.h" +# elif EXT_BOARD == SECURITY_XPLAINED +# include "security_xplained.h" +# elif EXT_BOARD == USER_EXT_BOARD + // User-reserved area: #include the header file of your extension board here + // (if any). +# endif +#endif + + +#if (defined(__GNUC__) && defined(__AVR32__)) || (defined(__ICCAVR32__) || defined(__AAVR32__)) +#ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. + +/*! \brief This function initializes the board target resources + * + * This function should be called to ensure proper initialization of the target + * board hardware connected to the part. + */ +extern void board_init(void); + +#endif // #ifdef __AVR32_ABI_COMPILER__ +#else +/*! \brief This function initializes the board target resources + * + * This function should be called to ensure proper initialization of the target + * board hardware connected to the part. + */ +extern void board_init(void); +#endif + + +#ifdef __cplusplus +} +#endif + +/** + * \} + */ + +#endif // _BOARD_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/boards/user_board/init.c b/AVR Code/USB_BULK_TEST/src/ASF/common/boards/user_board/init.c new file mode 100644 index 00000000..32fba369 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/boards/user_board/init.c @@ -0,0 +1,21 @@ +/** + * \file + * + * \brief User board initialization template + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#include +#include +#include + +void board_init(void) +{ + /* This function is meant to contain board-specific initialization code + * for, e.g., the I/O pins. The initialization can rely on application- + * specific board configuration, found in conf_board.h. + */ +} diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/boards/user_board/user_board.h b/AVR Code/USB_BULK_TEST/src/ASF/common/boards/user_board/user_board.h new file mode 100644 index 00000000..39980a7d --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/boards/user_board/user_board.h @@ -0,0 +1,40 @@ +/** + * \file + * + * \brief User board definition template + * + */ + + /* This file is intended to contain definitions and configuration details for + * features and devices that are available on the board, e.g., frequency and + * startup time for an external crystal, external memory devices, LED and USART + * pins. + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef USER_BOARD_H +#define USER_BOARD_H + +#include + +// External oscillator settings. +// Uncomment and set correct values if external oscillator is used. + +// External oscillator frequency +//#define BOARD_XOSC_HZ 8000000 + +// External oscillator type. +//!< External clock signal +//#define BOARD_XOSC_TYPE XOSC_TYPE_EXTERNAL +//!< 32.768 kHz resonator on TOSC +//#define BOARD_XOSC_TYPE XOSC_TYPE_32KHZ +//!< 0.4 to 16 MHz resonator on XTALS +//#define BOARD_XOSC_TYPE XOSC_TYPE_XTAL + +// External oscillator startup time +//#define BOARD_XOSC_STARTUP_US 500000 + + +#endif // USER_BOARD_H diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/components/display/st7565r/st7565r.c b/AVR Code/USB_BULK_TEST/src/ASF/common/components/display/st7565r/st7565r.c new file mode 100644 index 00000000..cb51cfb8 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/components/display/st7565r/st7565r.c @@ -0,0 +1,125 @@ +/** + * \file + * + * \brief ST7565R display controller driver. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#include "st7565r.h" + +/** + * \internal + * \brief Initialize the hardware interface + * + * Depending on what interface used for interfacing the LCD controller this + * function will initialize the necessary hardware. + */ +static void st7565r_interface_init(void) +{ +#ifdef ST7565R_SERIAL_INTERFACE + spi_flags_t spi_flags = SPI_MODE_3; + board_spi_select_id_t spi_select_id = 0; +#endif + +#if defined(ST7565R_USART_SPI_INTERFACE) + struct usart_spi_device device = { + .id = ST7565R_CS_PIN, + }; + usart_spi_init(ST7565R_USART_SPI); + usart_spi_setup_device(ST7565R_USART_SPI, &device, spi_flags, + ST7565R_CLOCK_SPEED, spi_select_id); +#elif defined(ST7565R_SPI_INTERFACE) + struct spi_device device = { + .id = ST7565R_CS_PIN, + }; + spi_master_init(ST7565R_SPI); + spi_master_setup_device(ST7565R_SPI, &device, spi_flags, + ST7565R_CLOCK_SPEED, spi_select_id); +#endif +} + +/** + * \brief Initialize the LCD controller + * + * Call this function to initialize the hardware interface and the LCD + * controller. When initialization is done the display is turned on and ready + * to receive data. + */ +void st7565r_init(void) +{ + // Do a hard reset of the LCD display controller + st7565r_hard_reset(); + + // Initialize the interface + st7565r_interface_init(); + + // Set the A0 pin to the default state (command) + ioport_set_pin_low(ST7565R_A0_PIN); + + // The column address is set to increasing + st7565r_write_command(ST7565R_CMD_ADC_NORMAL); + + // Non-inverted display + st7565r_display_invert_disable(); + + // The common mode scan direction is reversed COM31->COM0 + st7565r_write_command(ST7565R_CMD_REVERSE_SCAN_DIRECTION); + + // Set the voltage bias ratio to 1/6 + st7565r_write_command(ST7565R_CMD_LCD_BIAS_1_DIV_6_DUTY33); + + // Set booster circuit, voltage regulator and voltage follower all to on + st7565r_write_command(ST7565R_CMD_POWER_CTRL_ALL_ON); + + // Set the booster ratio to 2X,3X,4X + st7565r_write_command(ST7565R_CMD_BOOSTER_RATIO_SET); + st7565r_write_command(ST7565R_CMD_BOOSTER_RATIO_2X_3X_4X); + + // Set voltage resistor ratio to 1 + st7565r_write_command(ST7565R_CMD_VOLTAGE_RESISTOR_RATIO_1); + + /* Set contrast to min value, no need to check return value as the contrast + is set to the defined min*/ + st7565r_set_contrast(ST7565R_DISPLAY_CONTRAST_MIN); + + // Turn on the display + st7565r_display_on(); +} diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/components/display/st7565r/st7565r.h b/AVR Code/USB_BULK_TEST/src/ASF/common/components/display/st7565r/st7565r.h new file mode 100644 index 00000000..436d354a --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/components/display/st7565r/st7565r.h @@ -0,0 +1,463 @@ +/** + * \file + * + * \brief ST7565R display controller driver. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef ST7565R_H_INCLUDED +#define ST7565R_H_INCLUDED + +#include +#include +#include +#include +#include + +// controller and LCD configuration file +#include "conf_st7565r.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \defgroup st7565r_lcd_controller_group ST7565R LCD Controller Low-level\ + * driver + * + * This is a low level driver for the ST7565R LCD controller. It provides basic + * functions for initializing and writing to the LCD controller. In addition to + * hardware control and use of the LCD controller internal functions . + * + * Before writing data to the display call \ref st7565r_init() which will set up + * the physical interface and the LCD. A file named \ref conf_st7565r.h is needed + * to define which interface to use. For more information see the Interface + * selection section. In addition one also need to define the pins + * \ref ST7565R_A0_PIN, \ref ST7565R_CS_PIN and \ref ST7565R_RESET_PIN and the + * display \ref ST7565R_CLOCK_SPEED. + * + * \warning This driver is not reentrant and can not be used in interrupt\ + * service routines without extra care. + * + * As a safety feature one also need to set the max and min contrast levels that + * the \ref st7565r_set_contrast using the defines + * \ref ST7565R_DISPLAY_CONTRAST_MAX and \ref ST7565R_DISPLAY_CONTRAST_MIN to + * protect the display from too high voltage, please see the + * \ref st7565r_set_contrast function for more details. + * + * An example \ref conf_st7565r.h file could look like + * \code + // interface selection + #define ST7565R_USART_SPI_INTERFACE + #define ST7565R_USART_SPI &USARTD0 + + // minimum clock period is 50ns@3.3V -> max frequency is 20MHz + #define ST7565R_CLOCK_SPEED 1000000 + + #define ST7565R_DISPLAY_CONTRAST_MAX 40 + #define ST7565R_DISPLAY_CONTRAST_MIN 30 + + #define ST7565R_A0_PIN NHD_C12832A1Z_REGISTER_SELECT + #define ST7565R_CS_PIN NHD_C12832A1Z_CSN + #define ST7565R_RESET_PIN NHD_C12832A1Z_RESETN +\endcode + * + * \section dependencies Dependencies + * This driver depends on the following modules: + * - \ref ioport_group for IO port control. + * - \ref sysclk_group for getting system clock speeds for init functions. + * - \ref usart_spi_group or \ref spi_group for communication with the LCD + * controller + * @{ + */ + +//! \name Command defines +//@{ +#define ST7565R_CMD_DISPLAY_ON 0xAF +#define ST7565R_CMD_DISPLAY_OFF 0xAE +#define ST7565R_CMD_START_LINE_SET(line) (0x40 | (line)) +#define ST7565R_CMD_PAGE_ADDRESS_SET(page) (0xB0 | (page)) +#define ST7565R_CMD_COLUMN_ADDRESS_SET_MSB(column) (0x10 | (column)) +#define ST7565R_CMD_COLUMN_ADDRESS_SET_LSB(column) (0x00 | (column)) +#define ST7565R_CMD_ADC_NORMAL 0xA0 +#define ST7565R_CMD_ADC_REVERSE 0xA1 +#define ST7565R_CMD_DISPLAY_NORMAL 0xA6 +#define ST7565R_CMD_DISPLAY_REVERSE 0xA7 +#define ST7565R_CMD_DISPLAY_ALL_POINTS_OFF 0xA4 +#define ST7565R_CMD_DISPLAY_ALL_POINTS_ON 0xA5 +#define ST7565R_CMD_LCD_BIAS_1_DIV_5_DUTY33 0xA1 +#define ST7565R_CMD_LCD_BIAS_1_DIV_6_DUTY33 0xA2 +#define ST7565R_CMD_NORMAL_SCAN_DIRECTION 0xC0 +#define ST7565R_CMD_REVERSE_SCAN_DIRECTION 0xC8 +#define ST7565R_CMD_VOLTAGE_RESISTOR_RATIO_0 0x20 +#define ST7565R_CMD_VOLTAGE_RESISTOR_RATIO_1 0x21 +#define ST7565R_CMD_VOLTAGE_RESISTOR_RATIO_2 0x22 +#define ST7565R_CMD_VOLTAGE_RESISTOR_RATIO_3 0x23 +#define ST7565R_CMD_VOLTAGE_RESISTOR_RATIO_4 0x24 +#define ST7565R_CMD_VOLTAGE_RESISTOR_RATIO_5 0x25 +#define ST7565R_CMD_VOLTAGE_RESISTOR_RATIO_6 0x26 +#define ST7565R_CMD_VOLTAGE_RESISTOR_RATIO_7 0x27 +#define ST7565R_CMD_POWER_CTRL_ALL_ON 0x2F +#define ST7565R_CMD_SLEEP_MODE 0xAC +#define ST7565R_CMD_NORMAL_MODE 0xAD +#define ST7565R_CMD_RESET 0xE2 +#define ST7565R_CMD_NOP 0xE3 +#define ST7565R_CMD_ELECTRONIC_VOLUME_MODE_SET 0x81 +#define ST7565R_CMD_ELECTRONIC_VOLUME(volume) (0x3F & (~volume)) +#define ST7565R_CMD_BOOSTER_RATIO_SET 0xF8 +#define ST7565R_CMD_BOOSTER_RATIO_2X_3X_4X 0x00 +#define ST7565R_CMD_BOOSTER_RATIO_5X 0x01 +#define ST7565R_CMD_BOOSTER_RATIO_6X 0x03 +#define ST7565R_CMD_STATUS_READ 0x00 +#define ST7565R_CMD_END 0xEE +#define ST7565R_CMD_READ_MODIFY_WRITE 0xE0 +//@} + +/** + * \name Interface selection + * + * The LCD controller support both serial and parallel mode, that means there + * is a number of possible ways of interfacing the controller using different + * AVR peripherals. The different interfaces can be selected using different + * defines. This driver supports the serial communication mode using an + * USART in Master SPI mode by defining \ref ST7565R_USART_SPI_INTERFACE, and a + * normal SPI in Master Mode by defining \ref ST7565R_SPI_INTERFACE. + * + * \note The current driver only support serial mode. + */ +//@{ +#if defined(__DOXYGEN__) +//! \brief Select the a USART SPI interface. +# define ST7565R_USART_SPI_INTERFACE +//! \brief Select the normal SPI peripheral interface. +# define ST7565R_SPI_INTERFACE +#endif + +#if defined(ST7565R_USART_SPI_INTERFACE) +# include +#elif defined(ST7565R_SPI_INTERFACE) +# include +#else +#error "Interface not supported by the driver" +#endif +//@} + +#if defined(ST7565R_USART_SPI_INTERFACE) || defined(ST7565R_SPI_INTERFACE) +// +# define ST7565R_SERIAL_INTERFACE +#endif + +//! \name LCD controller write and read functions +//@{ +/** + * \brief Writes a command to the display controller + * + * This functions pull pin A0 low before writing to the controller. Different + * data write function is called based on the selected interface. + * + * \param command the command to write + */ +static inline void st7565r_write_command(uint8_t command) +{ +#if defined(ST7565R_USART_SPI_INTERFACE) + struct usart_spi_device device = {.id = ST7565R_CS_PIN}; + usart_spi_select_device(ST7565R_USART_SPI, &device); + ioport_set_pin_low(ST7565R_A0_PIN); + usart_spi_transmit(ST7565R_USART_SPI, command); + usart_spi_deselect_device(ST7565R_USART_SPI, &device); +#elif defined(ST7565R_SPI_INTERFACE) + struct spi_device device = {.id = ST7565R_CS_PIN}; + spi_select_device(ST7565R_SPI, &device); + ioport_set_pin_low(ST7565R_A0_PIN); + spi_write_single(ST7565R_SPI, command); + spi_deselect_device(ST7565R_SPI, &device); +#endif +} + +/** + * \brief Write data to the display controller + * + * This functions sets the pin A0 before writing to the controller. Different + * data write function is called based on the selected interface. + * + * \param data the data to write + */ +static inline void st7565r_write_data(uint8_t data) +{ +#if defined(ST7565R_USART_SPI_INTERFACE) + struct usart_spi_device device = {.id = ST7565R_CS_PIN}; + usart_spi_select_device(ST7565R_USART_SPI, &device); + ioport_set_pin_high(ST7565R_A0_PIN); + usart_spi_transmit(ST7565R_USART_SPI, data); + ioport_set_pin_low(ST7565R_A0_PIN); + usart_spi_deselect_device(ST7565R_USART_SPI, &device); +#elif defined(ST7565R_SPI_INTERFACE) + struct spi_device device = {.id = ST7565R_CS_PIN}; + spi_select_device(ST7565R_SPI, &device); + ioport_set_pin_high(ST7565R_A0_PIN); + spi_write_single(ST7565R_SPI, data); + ioport_set_pin_low(ST7565R_A0_PIN); + spi_deselect_device(ST7565R_SPI, &device); +#endif +} + +/** + * \brief Read data from the controller + * + * \note The controller does not support read in serial mode. + * + * \retval 8 bit data read from the controller + */ +static inline uint8_t st7565r_read_data(void) +{ + return 0; +} + +/** + * \brief Read status from the controller + * + * \note The controller does not support read in serial mode. + * + * \retval 8 bit status read from the controller + */ +static inline uint8_t st7565r_get_status(void) +{ + return 0; +} +//@} + +//! \name LCD Controller reset +//@{ +/** + * \brief Perform a soft reset of the LCD controller + * + * This functions will reset the LCD controller by sending the reset command. + * \note this functions should not be confused with the \ref st7565r_hard_reset() + * function, this command will not control the RST pin. + */ +static inline void st7565r_soft_reset(void) +{ + st7565r_write_command(ST7565R_CMD_RESET); +} + +/** + * \brief Perform a hard reset of the LCD controller + * + * This functions will reset the LCD controller by setting the reset pin low. + * \note this functions should not be confused with the \ref st7565r_soft_reset() + * function, this command will control the RST pin. + */ +static inline void st7565r_hard_reset(void) +{ + ioport_set_pin_low(ST7565R_RESET_PIN); + delay_us(10); + ioport_set_pin_high(ST7565R_RESET_PIN); + delay_us(10); +} +//@} + +//! \name Sleep control +//@{ +/** + * \brief Enable the LCD sleep mode + */ +static inline void st7565r_sleep_enable(void) +{ + st7565r_write_command(ST7565R_CMD_SLEEP_MODE); +} + +/** + * \brief Disable the LCD sleep mode + */ +static inline void st7565r_sleep_disable(void) +{ + st7565r_write_command(ST7565R_CMD_NORMAL_MODE); +} +//@} + +//! \name Address setup for the LCD +//@{ +/** + * \brief Set current page in display RAM + * + * This command is usually followed by the configuration of the column address + * because this scheme will provide access to all locations in the display + * RAM. + * + * \param address the page address + */ +static inline void st7565r_set_page_address(uint8_t address) +{ + // Make sure that the address is 4 bits (only 8 pages) + address &= 0x0F; + st7565r_write_command(ST7565R_CMD_PAGE_ADDRESS_SET(address)); +} + +/** + * \brief Set current column in display RAM + * + * \param address the column address + */ +static inline void st7565r_set_column_address(uint8_t address) +{ + // Make sure the address is 7 bits + address &= 0x7F; + st7565r_write_command(ST7565R_CMD_COLUMN_ADDRESS_SET_MSB(address >> 4)); + st7565r_write_command(ST7565R_CMD_COLUMN_ADDRESS_SET_LSB(address & 0x0F)); +} + +/** + * \brief Set the display start draw line address + * + * This function will set which line should be the start draw line for the LCD. + */ +static inline void st7565r_set_display_start_line_address(uint8_t address) +{ + // Make sure address is 6 bits + address &= 0x3F; + st7565r_write_command(ST7565R_CMD_START_LINE_SET(address)); +} +//@} + +//! \name Display hardware control +//@{ +/** + * \brief Turn the LCD display on + * + * This function will turn on the LCD. + */ +static inline void st7565r_display_on(void) +{ + st7565r_write_command(ST7565R_CMD_DISPLAY_ON); +} + +/** + * \brief Turn the LCD display off + * + * This function will turn off the LCD. + */ +static inline void st7565r_display_off(void) +{ + st7565r_write_command(ST7565R_CMD_DISPLAY_OFF); +} + +/** + * \brief Sets all LCD pixels on + * + * This function can be used to test the LCD by setting all pixels on, this will + * not affect the current LCD RAM. + * + * \param pixels_on if true all the LCD pixels are turned on, false the display + * is back in normal mode displaying what is in the display + * RAM. + */ +static inline void st7565r_set_all_pixels(bool pixels_on) +{ + if (pixels_on) { + st7565r_write_command(ST7565R_CMD_DISPLAY_ALL_POINTS_ON); + } else { + st7565r_write_command(ST7565R_CMD_DISPLAY_ALL_POINTS_OFF); + } +} + +/** + * \brief Set the LCD contrast level + * + * \warning This will set the voltage for the LCD, settings this value too high + * may result in damage to the LCD. Hence the limit for these settings must be + * defined in the \ref conf_st7565r.h file. + * + * Contrast values outside the max and min values will be clipped to the defined + * \ref ST7565R_DISPLAY_CONTRAST_MAX and \ref ST7565R_DISPLAY_CONTRAST_MIN. + * + * \param contrast a number between 0 and 63 where the max values is given by + * the LCD. + * + * \retval contrast the contrast value written to the LCD controller + */ +static inline uint8_t st7565r_set_contrast(uint8_t contrast) +{ + if (contrast < ST7565R_DISPLAY_CONTRAST_MIN) { + contrast = ST7565R_DISPLAY_CONTRAST_MIN; + } + if (contrast > ST7565R_DISPLAY_CONTRAST_MAX) { + contrast = ST7565R_DISPLAY_CONTRAST_MAX; + } + st7565r_write_command(ST7565R_CMD_ELECTRONIC_VOLUME_MODE_SET); + st7565r_write_command(ST7565R_CMD_ELECTRONIC_VOLUME(contrast)); + return contrast; +} + +/** + * \brief Invert all pixels on the device + * + * This function will invert all pixels on the LCD + * + */ +static inline void st7565r_display_invert_enable(void) +{ + st7565r_write_command(ST7565R_CMD_DISPLAY_REVERSE); +} + +/** + * \brief Disable invert of all pixels on the device + * + * This function will disable invert on all pixels on the LCD + * + */ +static inline void st7565r_display_invert_disable(void) +{ + st7565r_write_command(ST7565R_CMD_DISPLAY_NORMAL); +} +//@} + +//! \name Initialization +//@{ +void st7565r_init(void); +//@} + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ST7565R_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/genclk.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/genclk.h new file mode 100644 index 00000000..f910d8bb --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/genclk.h @@ -0,0 +1,191 @@ +/** + * \file + * + * \brief Generic clock management + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef CLK_GENCLK_H_INCLUDED +#define CLK_GENCLK_H_INCLUDED + +#include "parts.h" + +#if SAM3S +# include "sam3s/genclk.h" +#elif SAM3U +# include "sam3u/genclk.h" +#elif SAM3N +# include "sam3n/genclk.h" +#elif SAM3XA +# include "sam3x/genclk.h" +#elif SAM4S +# include "sam4s/genclk.h" +#elif SAM4L +# include "sam4l/genclk.h" +#elif SAM4E +# include "sam4e/genclk.h" +#elif SAM4N +# include "sam4n/genclk.h" +#elif SAM4C +# include "sam4c/genclk.h" +#elif SAM4CM +# include "sam4cm/genclk.h" +#elif SAM4CP +# include "sam4cp/genclk.h" +#elif SAMG +# include "samg/genclk.h" +#elif (UC3A0 || UC3A1) +# include "uc3a0_a1/genclk.h" +#elif UC3A3 +# include "uc3a3_a4/genclk.h" +#elif UC3B +# include "uc3b0_b1/genclk.h" +#elif UC3C +# include "uc3c/genclk.h" +#elif UC3D +# include "uc3d/genclk.h" +#elif UC3L +# include "uc3l/genclk.h" +#else +# error Unsupported chip type +#endif + +/** + * \ingroup clk_group + * \defgroup genclk_group Generic Clock Management + * + * Generic clocks are configurable clocks which run outside the system + * clock domain. They are often connected to peripherals which have an + * asynchronous component running independently of the bus clock, e.g. + * USB controllers, low-power timers and RTCs, etc. + * + * Note that not all platforms have support for generic clocks; on such + * platforms, this API will not be available. + * + * @{ + */ + +/** + * \def GENCLK_DIV_MAX + * \brief Maximum divider supported by the generic clock implementation + */ +/** + * \enum genclk_source + * \brief Generic clock source ID + * + * Each generic clock may be generated from a different clock source. + * These are the available alternatives provided by the chip. + */ + +//! \name Generic clock configuration +//@{ +/** + * \struct genclk_config + * \brief Hardware representation of a set of generic clock parameters + */ +/** + * \fn void genclk_config_defaults(struct genclk_config *cfg, + * unsigned int id) + * \brief Initialize \a cfg to the default configuration for the clock + * identified by \a id. + */ +/** + * \fn void genclk_config_read(struct genclk_config *cfg, unsigned int id) + * \brief Read the currently active configuration of the clock + * identified by \a id into \a cfg. + */ +/** + * \fn void genclk_config_write(const struct genclk_config *cfg, + * unsigned int id) + * \brief Activate the configuration \a cfg on the clock identified by + * \a id. + */ +/** + * \fn void genclk_config_set_source(struct genclk_config *cfg, + * enum genclk_source src) + * \brief Select a new source clock \a src in configuration \a cfg. + */ +/** + * \fn void genclk_config_set_divider(struct genclk_config *cfg, + * unsigned int divider) + * \brief Set a new \a divider in configuration \a cfg. + */ +/** + * \fn void genclk_enable_source(enum genclk_source src) + * \brief Enable the source clock \a src used by a generic clock. + */ + //@} + +//! \name Enabling and disabling Generic Clocks +//@{ +/** + * \fn void genclk_enable(const struct genclk_config *cfg, unsigned int id) + * \brief Activate the configuration \a cfg on the clock identified by + * \a id and enable it. + */ +/** + * \fn void genclk_disable(unsigned int id) + * \brief Disable the generic clock identified by \a id. + */ +//@} + +/** + * \brief Enable the configuration defined by \a src and \a divider + * for the generic clock identified by \a id. + * + * \param id The ID of the generic clock. + * \param src The source clock of the generic clock. + * \param divider The divider used to generate the generic clock. + */ +static inline void genclk_enable_config(unsigned int id, enum genclk_source src, unsigned int divider) +{ + struct genclk_config gcfg; + + genclk_config_defaults(&gcfg, id); + genclk_enable_source(src); + genclk_config_set_source(&gcfg, src); + genclk_config_set_divider(&gcfg, divider); + genclk_enable(&gcfg, id); +} + +//! @} + +#endif /* CLK_GENCLK_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/osc.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/osc.h new file mode 100644 index 00000000..678f4200 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/osc.h @@ -0,0 +1,177 @@ +/** + * \file + * + * \brief Oscillator management + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef OSC_H_INCLUDED +#define OSC_H_INCLUDED + +#include "parts.h" +#include "conf_clock.h" + +#if SAM3S +# include "sam3s/osc.h" +#elif SAM3XA +# include "sam3x/osc.h" +#elif SAM3U +# include "sam3u/osc.h" +#elif SAM3N +# include "sam3n/osc.h" +#elif SAM4S +# include "sam4s/osc.h" +#elif SAM4E +# include "sam4e/osc.h" +#elif SAM4C +# include "sam4c/osc.h" +#elif SAM4CM +# include "sam4cm/osc.h" +#elif SAM4CP +# include "sam4cp/osc.h" +#elif SAM4L +# include "sam4l/osc.h" +#elif SAM4N +# include "sam4n/osc.h" +#elif SAMG +# include "samg/osc.h" +#elif (UC3A0 || UC3A1) +# include "uc3a0_a1/osc.h" +#elif UC3A3 +# include "uc3a3_a4/osc.h" +#elif UC3B +# include "uc3b0_b1/osc.h" +#elif UC3C +# include "uc3c/osc.h" +#elif UC3D +# include "uc3d/osc.h" +#elif UC3L +# include "uc3l/osc.h" +#elif XMEGA +# include "xmega/osc.h" +#else +# error Unsupported chip type +#endif + +/** + * \ingroup clk_group + * \defgroup osc_group Oscillator Management + * + * This group contains functions and definitions related to configuring + * and enabling/disabling on-chip oscillators. Internal RC-oscillators, + * external crystal oscillators and external clock generators are + * supported by this module. What all of these have in common is that + * they swing at a fixed, nominal frequency which is normally not + * adjustable. + * + * \par Example: Enabling an oscillator + * + * The following example demonstrates how to enable the external + * oscillator on XMEGA A and wait for it to be ready to use. The + * oscillator identifiers are platform-specific, so while the same + * procedure is used on all platforms, the parameter to osc_enable() + * will be different from device to device. + * \code + osc_enable(OSC_ID_XOSC); + osc_wait_ready(OSC_ID_XOSC); \endcode + * + * \section osc_group_board Board-specific Definitions + * If external oscillators are used, the board code must provide the + * following definitions for each of those: + * - \b BOARD__HZ: The nominal frequency of the oscillator. + * - \b BOARD__STARTUP_US: The startup time of the + * oscillator in microseconds. + * - \b BOARD__TYPE: The type of oscillator connected, i.e. + * whether it's a crystal or external clock, and sometimes what kind + * of crystal it is. The meaning of this value is platform-specific. + * + * @{ + */ + +//! \name Oscillator Management +//@{ +/** + * \fn void osc_enable(uint8_t id) + * \brief Enable oscillator \a id + * + * The startup time and mode value is automatically determined based on + * definitions in the board code. + */ +/** + * \fn void osc_disable(uint8_t id) + * \brief Disable oscillator \a id + */ +/** + * \fn osc_is_ready(uint8_t id) + * \brief Determine whether oscillator \a id is ready. + * \retval true Oscillator \a id is running and ready to use as a clock + * source. + * \retval false Oscillator \a id is not running. + */ +/** + * \fn uint32_t osc_get_rate(uint8_t id) + * \brief Return the frequency of oscillator \a id in Hz + */ + +#ifndef __ASSEMBLY__ + +/** + * \brief Wait until the oscillator identified by \a id is ready + * + * This function will busy-wait for the oscillator identified by \a id + * to become stable and ready to use as a clock source. + * + * \param id A number identifying the oscillator to wait for. + */ +static inline void osc_wait_ready(uint8_t id) +{ + while (!osc_is_ready(id)) { + /* Do nothing */ + } +} + +#endif /* __ASSEMBLY__ */ + +//@} + +//! @} + +#endif /* OSC_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/pll.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/pll.h new file mode 100644 index 00000000..ce88b96b --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/pll.h @@ -0,0 +1,333 @@ +/** + * \file + * + * \brief PLL management + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef CLK_PLL_H_INCLUDED +#define CLK_PLL_H_INCLUDED + +#include "parts.h" +#include "conf_clock.h" + +#if SAM3S +# include "sam3s/pll.h" +#elif SAM3XA +# include "sam3x/pll.h" +#elif SAM3U +# include "sam3u/pll.h" +#elif SAM3N +# include "sam3n/pll.h" +#elif SAM4S +# include "sam4s/pll.h" +#elif SAM4E +# include "sam4e/pll.h" +#elif SAM4C +# include "sam4c/pll.h" +#elif SAM4CM +# include "sam4cm/pll.h" +#elif SAM4CP +# include "sam4cp/pll.h" +#elif SAM4L +# include "sam4l/pll.h" +#elif SAM4N +# include "sam4n/pll.h" +#elif SAMG +# include "samg/pll.h" +#elif (UC3A0 || UC3A1) +# include "uc3a0_a1/pll.h" +#elif UC3A3 +# include "uc3a3_a4/pll.h" +#elif UC3B +# include "uc3b0_b1/pll.h" +#elif UC3C +# include "uc3c/pll.h" +#elif UC3D +# include "uc3d/pll.h" +#elif (UC3L0128 || UC3L0256 || UC3L3_L4) +# include "uc3l/pll.h" +#elif XMEGA +# include "xmega/pll.h" +#else +# error Unsupported chip type +#endif + +/** + * \ingroup clk_group + * \defgroup pll_group PLL Management + * + * This group contains functions and definitions related to configuring + * and enabling/disabling on-chip PLLs. A PLL will take an input signal + * (the \em source), optionally divide the frequency by a configurable + * \em divider, and then multiply the frequency by a configurable \em + * multiplier. + * + * Some devices don't support input dividers; specifying any other + * divisor than 1 on these devices will result in an assertion failure. + * Other devices may have various restrictions to the frequency range of + * the input and output signals. + * + * \par Example: Setting up PLL0 with default parameters + * + * The following example shows how to configure and enable PLL0 using + * the default parameters specified using the configuration symbols + * listed above. + * \code + pll_enable_config_defaults(0); \endcode + * + * To configure, enable PLL0 using the default parameters and to disable + * a specific feature like Wide Bandwidth Mode (a UC3A3-specific + * PLL option.), you can use this initialization process. + * \code + struct pll_config pllcfg; + if (pll_is_locked(pll_id)) { + return; // Pll already running + } + pll_enable_source(CONFIG_PLL0_SOURCE); + pll_config_defaults(&pllcfg, 0); + pll_config_set_option(&pllcfg, PLL_OPT_WBM_DISABLE); + pll_enable(&pllcfg, 0); + pll_wait_for_lock(0); \endcode + * + * When the last function call returns, PLL0 is ready to be used as the + * main system clock source. + * + * \section pll_group_config Configuration Symbols + * + * Each PLL has a set of default parameters determined by the following + * configuration symbols in the application's configuration file: + * - \b CONFIG_PLLn_SOURCE: The default clock source connected to the + * input of PLL \a n. Must be one of the values defined by the + * #pll_source enum. + * - \b CONFIG_PLLn_MUL: The default multiplier (loop divider) of PLL + * \a n. + * - \b CONFIG_PLLn_DIV: The default input divider of PLL \a n. + * + * These configuration symbols determine the result of calling + * pll_config_defaults() and pll_get_default_rate(). + * + * @{ + */ + +//! \name Chip-specific PLL characteristics +//@{ +/** + * \def PLL_MAX_STARTUP_CYCLES + * \brief Maximum PLL startup time in number of slow clock cycles + */ +/** + * \def NR_PLLS + * \brief Number of on-chip PLLs + */ + +/** + * \def PLL_MIN_HZ + * \brief Minimum frequency that the PLL can generate + */ +/** + * \def PLL_MAX_HZ + * \brief Maximum frequency that the PLL can generate + */ +/** + * \def PLL_NR_OPTIONS + * \brief Number of PLL option bits + */ +//@} + +/** + * \enum pll_source + * \brief PLL clock source + */ + +//! \name PLL configuration +//@{ + +/** + * \struct pll_config + * \brief Hardware-specific representation of PLL configuration. + * + * This structure contains one or more device-specific values + * representing the current PLL configuration. The contents of this + * structure is typically different from platform to platform, and the + * user should not access any fields except through the PLL + * configuration API. + */ + +/** + * \fn void pll_config_init(struct pll_config *cfg, + * enum pll_source src, unsigned int div, unsigned int mul) + * \brief Initialize PLL configuration from standard parameters. + * + * \note This function may be defined inline because it is assumed to be + * called very few times, and usually with constant parameters. Inlining + * it will in such cases reduce the code size significantly. + * + * \param cfg The PLL configuration to be initialized. + * \param src The oscillator to be used as input to the PLL. + * \param div PLL input divider. + * \param mul PLL loop divider (i.e. multiplier). + * + * \return A configuration which will make the PLL run at + * (\a mul / \a div) times the frequency of \a src + */ +/** + * \def pll_config_defaults(cfg, pll_id) + * \brief Initialize PLL configuration using default parameters. + * + * After this function returns, \a cfg will contain a configuration + * which will make the PLL run at (CONFIG_PLLx_MUL / CONFIG_PLLx_DIV) + * times the frequency of CONFIG_PLLx_SOURCE. + * + * \param cfg The PLL configuration to be initialized. + * \param pll_id Use defaults for this PLL. + */ +/** + * \def pll_get_default_rate(pll_id) + * \brief Get the default rate in Hz of \a pll_id + */ +/** + * \fn void pll_config_set_option(struct pll_config *cfg, + * unsigned int option) + * \brief Set the PLL option bit \a option in the configuration \a cfg. + * + * \param cfg The PLL configuration to be changed. + * \param option The PLL option bit to be set. + */ +/** + * \fn void pll_config_clear_option(struct pll_config *cfg, + * unsigned int option) + * \brief Clear the PLL option bit \a option in the configuration \a cfg. + * + * \param cfg The PLL configuration to be changed. + * \param option The PLL option bit to be cleared. + */ +/** + * \fn void pll_config_read(struct pll_config *cfg, unsigned int pll_id) + * \brief Read the currently active configuration of \a pll_id. + * + * \param cfg The configuration object into which to store the currently + * active configuration. + * \param pll_id The ID of the PLL to be accessed. + */ +/** + * \fn void pll_config_write(const struct pll_config *cfg, + * unsigned int pll_id) + * \brief Activate the configuration \a cfg on \a pll_id + * + * \param cfg The configuration object representing the PLL + * configuration to be activated. + * \param pll_id The ID of the PLL to be updated. + */ + +//@} + +//! \name Interaction with the PLL hardware +//@{ +/** + * \fn void pll_enable(const struct pll_config *cfg, + * unsigned int pll_id) + * \brief Activate the configuration \a cfg and enable PLL \a pll_id. + * + * \param cfg The PLL configuration to be activated. + * \param pll_id The ID of the PLL to be enabled. + */ +/** + * \fn void pll_disable(unsigned int pll_id) + * \brief Disable the PLL identified by \a pll_id. + * + * After this function is called, the PLL identified by \a pll_id will + * be disabled. The PLL configuration stored in hardware may be affected + * by this, so if the caller needs to restore the same configuration + * later, it should either do a pll_config_read() before disabling the + * PLL, or remember the last configuration written to the PLL. + * + * \param pll_id The ID of the PLL to be disabled. + */ +/** + * \fn bool pll_is_locked(unsigned int pll_id) + * \brief Determine whether the PLL is locked or not. + * + * \param pll_id The ID of the PLL to check. + * + * \retval true The PLL is locked and ready to use as a clock source + * \retval false The PLL is not yet locked, or has not been enabled. + */ +/** + * \fn void pll_enable_source(enum pll_source src) + * \brief Enable the source of the pll. + * The source is enabled, if the source is not already running. + * + * \param src The ID of the PLL source to enable. + */ +/** + * \fn void pll_enable_config_defaults(unsigned int pll_id) + * \brief Enable the pll with the default configuration. + * PLL is enabled, if the PLL is not already locked. + * + * \param pll_id The ID of the PLL to enable. + */ + +/** + * \brief Wait for PLL \a pll_id to become locked + * + * \todo Use a timeout to avoid waiting forever and hanging the system + * + * \param pll_id The ID of the PLL to wait for. + * + * \retval STATUS_OK The PLL is now locked. + * \retval ERR_TIMEOUT Timed out waiting for PLL to become locked. + */ +static inline int pll_wait_for_lock(unsigned int pll_id) +{ + Assert(pll_id < NR_PLLS); + + while (!pll_is_locked(pll_id)) { + /* Do nothing */ + } + + return 0; +} + +//@} +//! @} + +#endif /* CLK_PLL_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/sysclk.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/sysclk.h new file mode 100644 index 00000000..cd9457b5 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/sysclk.h @@ -0,0 +1,186 @@ +/** + * \file + * + * \brief System clock management + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef SYSCLK_H_INCLUDED +#define SYSCLK_H_INCLUDED + +#include "parts.h" +#include "conf_clock.h" + +#if SAM3S +# include "sam3s/sysclk.h" +#elif SAM3U +# include "sam3u/sysclk.h" +#elif SAM3N +# include "sam3n/sysclk.h" +#elif SAM3XA +# include "sam3x/sysclk.h" +#elif SAM4S +# include "sam4s/sysclk.h" +#elif SAM4E +# include "sam4e/sysclk.h" +#elif SAM4C +# include "sam4c/sysclk.h" +#elif SAM4CM +# include "sam4cm/sysclk.h" +#elif SAM4CP +# include "sam4cp/sysclk.h" +#elif SAM4L +# include "sam4l/sysclk.h" +#elif SAM4N +# include "sam4n/sysclk.h" +#elif SAMG +# include "samg/sysclk.h" +#elif (UC3A0 || UC3A1) +# include "uc3a0_a1/sysclk.h" +#elif UC3A3 +# include "uc3a3_a4/sysclk.h" +#elif UC3B +# include "uc3b0_b1/sysclk.h" +#elif UC3C +# include "uc3c/sysclk.h" +#elif UC3D +# include "uc3d/sysclk.h" +#elif UC3L +# include "uc3l/sysclk.h" +#elif XMEGA +# include "xmega/sysclk.h" +#elif MEGA +# include "mega/sysclk.h" +#else +# error Unsupported chip type +#endif + +/** + * \defgroup clk_group Clock Management + */ + +/** + * \ingroup clk_group + * \defgroup sysclk_group System Clock Management + * + * See \ref sysclk_quickstart. + * + * The sysclk API covers the system clock and all + * clocks derived from it. The system clock is a chip-internal clock on + * which all synchronous clocks, i.e. CPU and bus/peripheral + * clocks, are based. The system clock is typically generated from one + * of a variety of sources, which may include crystal and RC oscillators + * as well as PLLs. The clocks derived from the system clock are + * sometimes also known as synchronous clocks, since they + * always run synchronously with respect to each other, as opposed to + * generic clocks which may run from different oscillators or + * PLLs. + * + * Most applications should simply call sysclk_init() to initialize + * everything related to the system clock and its source (oscillator, + * PLL or DFLL), and leave it at that. More advanced applications, and + * platform-specific drivers, may require additional services from the + * clock system, some of which may be platform-specific. + * + * \section sysclk_group_platform Platform Dependencies + * + * The sysclk API is partially chip- or platform-specific. While all + * platforms provide mostly the same functionality, there are some + * variations around how different bus types and clock tree structures + * are handled. + * + * The following functions are available on all platforms with the same + * parameters and functionality. These functions may be called freely by + * portable applications, drivers and services: + * - sysclk_init() + * - sysclk_set_source() + * - sysclk_get_main_hz() + * - sysclk_get_cpu_hz() + * - sysclk_get_peripheral_bus_hz() + * + * The following functions are available on all platforms, but there may + * be variations in the function signature (i.e. parameters) and + * behavior. These functions are typically called by platform-specific + * parts of drivers, and applications that aren't intended to be + * portable: + * - sysclk_enable_peripheral_clock() + * - sysclk_disable_peripheral_clock() + * - sysclk_enable_module() + * - sysclk_disable_module() + * - sysclk_module_is_enabled() + * - sysclk_set_prescalers() + * + * All other functions should be considered platform-specific. + * Enabling/disabling clocks to specific peripherals as well as + * determining the speed of these clocks should be done by calling + * functions provided by the driver for that peripheral. + * + * @{ + */ + +//! \name System Clock Initialization +//@{ +/** + * \fn void sysclk_init(void) + * \brief Initialize the synchronous clock system. + * + * This function will initialize the system clock and its source. This + * includes: + * - Mask all synchronous clocks except for any clocks which are + * essential for normal operation (for example internal memory + * clocks). + * - Set up the system clock prescalers as specified by the + * application's configuration file. + * - Enable the clock source specified by the application's + * configuration file (oscillator or PLL) and wait for it to become + * stable. + * - Set the main system clock source to the clock specified by the + * application's configuration file. + * + * Since all non-essential peripheral clocks are initially disabled, it + * is the responsibility of the peripheral driver to re-enable any + * clocks that are needed for normal operation. + */ +//@} + +//! @} + +#endif /* SYSCLK_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/xmega/osc.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/xmega/osc.h new file mode 100644 index 00000000..a37ad2cf --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/xmega/osc.h @@ -0,0 +1,507 @@ +/** + * \file + * + * \brief Chip-specific oscillator management functions + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef XMEGA_OSC_H_INCLUDED +#define XMEGA_OSC_H_INCLUDED + +#include +#include + +/** + * \weakgroup osc_group + * + * \section osc_group_errata Errata + * - Auto-calibration does not work on XMEGA A1 revision H and + * earlier. + * @{ + */ + +//! \name Oscillator identifiers +//@{ +//! 2 MHz Internal RC Oscillator +#define OSC_ID_RC2MHZ OSC_RC2MEN_bm +//! 32 MHz Internal RC Oscillator +#define OSC_ID_RC32MHZ OSC_RC32MEN_bm +//! 32 KHz Internal RC Oscillator +#define OSC_ID_RC32KHZ OSC_RC32KEN_bm +//! External Oscillator +#define OSC_ID_XOSC OSC_XOSCEN_bm +#if XMEGA_E +//! 8 MHz Internal RC Oscillator +# define OSC_ID_RC8MHZ OSC_RC8MEN_bm +#endif + +/** + * \brief Reference from USB Start Of Frame + * \note This cannot be enabled or disabled, but can be used as a reference for + * the autocalibration (DFLL). + */ +#define OSC_ID_USBSOF 0xff +//@} + +//! \name External oscillator types +//@{ +#define XOSC_TYPE_EXTERNAL 0 //!< External clock signal +#define XOSC_TYPE_32KHZ 2 //!< 32.768 kHz resonator on TOSC +#define XOSC_TYPE_XTAL 3 //!< 0.4 to 16 MHz resonator on XTAL +//@} + +/** + * \def CONFIG_XOSC_32KHZ_LPM + * \brief Define for enabling Low Power Mode for 32 kHz external oscillator. + */ +#ifdef __DOXYGEN__ +# define CONFIG_XOSC_32KHZ_LPM +#endif /* __DOXYGEN__ */ + +/** + * \def CONFIG_XOSC_STARTUP + * \brief Board-dependent value that determines the number of start-up cycles + * for external resonators, based on BOARD_XOSC_STARTUP_US. This is written to + * the two MSB of the XOSCSEL field of OSC.XOSCCTRL. + * + * \note This is automatically computed from BOARD_XOSC_HZ and + * BOARD_XOSC_STARTUP_US if it is not manually set. + */ + +//! \name XTAL resonator start-up cycles +//@{ +#define XOSC_STARTUP_256 0 //!< 256 cycle start-up time +#define XOSC_STARTUP_1024 1 //!< 1 k cycle start-up time +#define XOSC_STARTUP_16384 2 //!< 16 k cycle start-up time +//@} + +/** + * \def CONFIG_XOSC_RANGE + * \brief Board-dependent value that sets the frequency range of the external + * oscillator. This is written to the FRQRANGE field of OSC.XOSCCTRL. + * + * \note This is automatically computed from BOARD_XOSC_HZ if it is not manually + * set. + */ + +//! \name XTAL resonator frequency range +//@{ +//! 0.4 to 2 MHz frequency range +#define XOSC_RANGE_04TO2 OSC_FRQRANGE_04TO2_gc +//! 2 to 9 MHz frequency range +#define XOSC_RANGE_2TO9 OSC_FRQRANGE_2TO9_gc +//! 9 to 12 MHz frequency range +#define XOSC_RANGE_9TO12 OSC_FRQRANGE_9TO12_gc +//! 12 to 16 MHz frequency range +#define XOSC_RANGE_12TO16 OSC_FRQRANGE_12TO16_gc +//@} + +/** + * \def XOSC_STARTUP_TIMEOUT + * \brief Number of us to wait for XOSC to start + * + * This is the number of slow clock cycles corresponding to + * OSC0_STARTUP_VALUE with an additional 25% safety margin. If the + * oscillator isn't running when this timeout has expired, it is assumed + * to have failed to start. + */ + +// If application intends to use XOSC. +#ifdef BOARD_XOSC_HZ +// Get start-up config for XOSC, if not manually set. +# ifndef CONFIG_XOSC_STARTUP +# ifndef BOARD_XOSC_STARTUP_US +# error BOARD_XOSC_STARTUP_US must be configured. +# else +//! \internal Number of start-up cycles for the board's XOSC. +# define BOARD_XOSC_STARTUP_CYCLES \ + (BOARD_XOSC_HZ / 1000000 * BOARD_XOSC_STARTUP_US) + +# if (BOARD_XOSC_TYPE == XOSC_TYPE_XTAL) +# if (BOARD_XOSC_STARTUP_CYCLES > 16384) +# error BOARD_XOSC_STARTUP_US is too high for current BOARD_XOSC_HZ. + +# elif (BOARD_XOSC_STARTUP_CYCLES > 1024) +# define CONFIG_XOSC_STARTUP XOSC_STARTUP_16384 +# define XOSC_STARTUP_TIMEOUT (16384*(1000000/BOARD_XOSC_HZ)) + +# elif (BOARD_XOSC_STARTUP_CYCLES > 256) +# define CONFIG_XOSC_STARTUP XOSC_STARTUP_1024 +# define XOSC_STARTUP_TIMEOUT (1024*(1000000/BOARD_XOSC_HZ)) + +# else +# define CONFIG_XOSC_STARTUP XOSC_STARTUP_256 +# define XOSC_STARTUP_TIMEOUT (256*(1000000/BOARD_XOSC_HZ)) +# endif +# else /* BOARD_XOSC_TYPE == XOSC_TYPE_XTAL */ +# define CONFIG_XOSC_STARTUP 0 +# endif +# endif /* BOARD_XOSC_STARTUP_US */ +# endif /* CONFIG_XOSC_STARTUP */ + +// Get frequency range setting for XOSC, if not manually set. +# ifndef CONFIG_XOSC_RANGE +# if (BOARD_XOSC_TYPE == XOSC_TYPE_XTAL) +# if (BOARD_XOSC_HZ < 400000) +# error BOARD_XOSC_HZ is below minimum frequency of 400 kHz. + +# elif (BOARD_XOSC_HZ < 2000000) +# define CONFIG_XOSC_RANGE XOSC_RANGE_04TO2 + +# elif (BOARD_XOSC_HZ < 9000000) +# define CONFIG_XOSC_RANGE XOSC_RANGE_2TO9 + +# elif (BOARD_XOSC_HZ < 12000000) +# define CONFIG_XOSC_RANGE XOSC_RANGE_9TO12 + +# elif (BOARD_XOSC_HZ <= 16000000) +# define CONFIG_XOSC_RANGE XOSC_RANGE_12TO16 + +# else +# error BOARD_XOSC_HZ is above maximum frequency of 16 MHz. +# endif +# else /* BOARD_XOSC_TYPE == XOSC_TYPE_XTAL */ +# define CONFIG_XOSC_RANGE 0 +# endif +# endif /* CONFIG_XOSC_RANGE */ +#endif /* BOARD_XOSC_HZ */ + +#ifndef __ASSEMBLY__ + +/** + * \internal + * \brief Enable internal oscillator \a id + * + * Do not call this function directly. Use osc_enable() instead. + */ +static inline void osc_enable_internal(uint8_t id) +{ + irqflags_t flags; + + Assert(id != OSC_ID_USBSOF); + + flags = cpu_irq_save(); + OSC.CTRL |= id; +#if (XMEGA_E && CONFIG_SYSCLK_RC8MHZ_LPM) + if(id == OSC_ID_RC8MHZ) { + OSC.CTRL |= OSC_RC8MLPM_bm; + } +#endif + cpu_irq_restore(flags); +} + +#if defined(BOARD_XOSC_HZ) || defined(__DOXYGEN__) + +/** + * \internal + * \brief Enable external oscillator \a id + * + * Do not call this function directly. Use osc_enable() instead. Also + * note that this function is only available if the board actually has + * an external oscillator crystal. + */ +static inline void osc_enable_external(uint8_t id) +{ + irqflags_t flags; + + Assert(id == OSC_ID_XOSC); + +#ifndef CONFIG_XOSC_32KHZ_LPM +# if (XMEGA_E && (BOARD_XOSC_TYPE == XOSC_TYPE_EXTERNAL) && defined(CONFIG_XOSC_EXTERNAL_PC4)) + OSC.XOSCCTRL = OSC_XOSCSEL4_bm; +# else + OSC.XOSCCTRL = BOARD_XOSC_TYPE | (CONFIG_XOSC_STARTUP << 2) | + CONFIG_XOSC_RANGE; +# endif +#else + OSC.XOSCCTRL = BOARD_XOSC_TYPE | (CONFIG_XOSC_STARTUP << 2) | + CONFIG_XOSC_RANGE | OSC_X32KLPM_bm; +#endif /* CONFIG_XOSC_32KHZ_LPM */ + + flags = cpu_irq_save(); + OSC.CTRL |= id; + cpu_irq_restore(flags); +} +#else + +static inline void osc_enable_external(uint8_t id) +{ + Assert(false); // No external oscillator on the selected board +} +#endif + +static inline void osc_disable(uint8_t id) +{ + irqflags_t flags; + + Assert(id != OSC_ID_USBSOF); + + flags = cpu_irq_save(); + OSC.CTRL &= ~id; + cpu_irq_restore(flags); +} + +static inline void osc_enable(uint8_t id) +{ + if (id != OSC_ID_XOSC) { + osc_enable_internal(id); + } else { + osc_enable_external(id); + } +} + +static inline bool osc_is_ready(uint8_t id) +{ + Assert(id != OSC_ID_USBSOF); + + return OSC.STATUS & id; +} + +//! \name XMEGA-Specific Oscillator Features +//@{ + +/** + * \brief Enable DFLL-based automatic calibration of an internal + * oscillator. + * + * The XMEGA features two Digital Frequency Locked Loops (DFLLs) which + * can be used to improve the accuracy of the 2 MHz and 32 MHz internal + * RC oscillators. The DFLL compares the oscillator frequency with a + * more accurate reference clock to do automatic run-time calibration of + * the oscillator. + * + * This function enables auto-calibration for either the 2 MHz or 32 MHz + * internal oscillator using either the 32.768 kHz calibrated internal + * oscillator or an external crystal oscillator as a reference. If the + * latter option is used, the crystal must be connected to the TOSC pins + * and run at 32.768 kHz. + * + * \param id The ID of the oscillator for which to enable + * auto-calibration: + * \arg \c OSC_ID_RC2MHZ or \c OSC_ID_RC32MHZ. + * \param ref_id The ID of the oscillator to use as a reference: + * \arg \c OSC_ID_RC32KHZ or \c OSC_ID_XOSC for internal or external 32 kHz + * reference, respectively. + * \arg \c OSC_ID_USBSOF for 32 MHz only when USB is available and running. + */ +static inline void osc_enable_autocalibration(uint8_t id, uint8_t ref_id) +{ + irqflags_t flags; + + flags = cpu_irq_save(); + switch (id) { + case OSC_ID_RC2MHZ: +#if !XMEGA_E + Assert((ref_id == OSC_ID_RC32KHZ) || (ref_id == OSC_ID_XOSC)); + if (ref_id == OSC_ID_XOSC) { + osc_enable(OSC_ID_RC32KHZ); + OSC.DFLLCTRL |= OSC_RC2MCREF_bm; + } else { + OSC.DFLLCTRL &= ~(OSC_RC2MCREF_bm); + } + DFLLRC2M.CTRL |= DFLL_ENABLE_bm; +#endif + break; + + case OSC_ID_RC32MHZ: +#if XMEGA_AU || XMEGA_B || XMEGA_C || XMEGA_E + Assert((ref_id == OSC_ID_RC32KHZ) + || (ref_id == OSC_ID_XOSC) +# if !XMEGA_E + || (ref_id == OSC_ID_USBSOF) +#endif + ); + + OSC.DFLLCTRL &= ~(OSC_RC32MCREF_gm); + + if (ref_id == OSC_ID_XOSC) { + osc_enable(OSC_ID_RC32KHZ); + OSC.DFLLCTRL |= OSC_RC32MCREF_XOSC32K_gc; + } + else if (ref_id == OSC_ID_RC32KHZ) { + OSC.DFLLCTRL |= OSC_RC32MCREF_RC32K_gc; + } +# if !XMEGA_E + else if (ref_id == OSC_ID_USBSOF) { + /* + * Calibrate 32MRC at 48MHz using USB SOF + * 48MHz / 1kHz = 0xBB80 + */ + DFLLRC32M.COMP1 = 0x80; + DFLLRC32M.COMP2 = 0xBB; + OSC.DFLLCTRL |= OSC_RC32MCREF_USBSOF_gc; + } +# endif +#else + Assert((ref_id == OSC_ID_RC32KHZ) || + (ref_id == OSC_ID_XOSC)); + +# if defined(OSC_RC32MCREF_gm) + OSC.DFLLCTRL &= ~(OSC_RC32MCREF_gm); +# endif + + if (ref_id == OSC_ID_XOSC) { + osc_enable(OSC_ID_RC32KHZ); +# if defined(OSC_RC32MCREF_gm) + OSC.DFLLCTRL |= OSC_RC32MCREF_XOSC32K_gc; +# else + OSC.DFLLCTRL |= OSC_RC32MCREF_bm; +# endif + } + else if (ref_id == OSC_ID_RC32KHZ) { +# if defined(OSC_RC32MCREF_gm) + OSC.DFLLCTRL |= OSC_RC32MCREF_RC32K_gc; +# else + OSC.DFLLCTRL &= ~(OSC_RC32MCREF_bm); +# endif + } +#endif + + DFLLRC32M.CTRL |= DFLL_ENABLE_bm; + break; + + default: + Assert(false); + break; + } + cpu_irq_restore(flags); +} + +/** + * \brief Disable DFLL-based automatic calibration of an internal + * oscillator. + * + * \see osc_enable_autocalibration + * + * \param id The ID of the oscillator for which to disable + * auto-calibration: + * \arg \c OSC_ID_RC2MHZ or \c OSC_ID_RC32MHZ. + */ +static inline void osc_disable_autocalibration(uint8_t id) +{ + switch (id) { + case OSC_ID_RC2MHZ: +#if !XMEGA_E + DFLLRC2M.CTRL = 0; +#endif + break; + + case OSC_ID_RC32MHZ: + DFLLRC32M.CTRL = 0; + break; + + default: + Assert(false); + break; + } +} + +/** + * \brief Load a specific calibration value for the specified oscillator. + * + * \param id The ID of the oscillator for which to disable + * auto-calibration: + * \arg \c OSC_ID_RC2MHZ or \c OSC_ID_RC32MHZ. + * \param calib The specific calibration value required: + * + */ +static inline void osc_user_calibration(uint8_t id, uint16_t calib) +{ + switch (id) { + case OSC_ID_RC2MHZ: +#if !XMEGA_E + DFLLRC2M.CALA=LSB(calib); + DFLLRC2M.CALB=MSB(calib); +#endif + break; + + case OSC_ID_RC32MHZ: + DFLLRC32M.CALA=LSB(calib); + DFLLRC32M.CALB=MSB(calib); + break; + +#if XMEGA_E + case OSC_ID_RC8MHZ: + OSC.RC8MCAL=LSB(calib); + break; +#endif + + default: + Assert(false); + break; + } +} +//@} + +static inline uint32_t osc_get_rate(uint8_t id) +{ + Assert(id != OSC_ID_USBSOF); + + switch (id) { + case OSC_ID_RC2MHZ: + return 2000000UL; + + case OSC_ID_RC32MHZ: +#ifdef CONFIG_OSC_RC32_CAL + return CONFIG_OSC_RC32_CAL; +#else + return 32000000UL; +#endif + + case OSC_ID_RC32KHZ: + return 32768UL; + +#ifdef BOARD_XOSC_HZ + case OSC_ID_XOSC: + return BOARD_XOSC_HZ; +#endif + + default: + Assert(false); + return 0; + } +} + +#endif /* __ASSEMBLY__ */ + +//! @} + +#endif /* XMEGA_OSC_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/xmega/pll.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/xmega/pll.h new file mode 100644 index 00000000..b3254c77 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/xmega/pll.h @@ -0,0 +1,274 @@ +/** + * \file + * + * \brief Chip-specific PLL management functions + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef XMEGA_PLL_H_INCLUDED +#define XMEGA_PLL_H_INCLUDED + +#include + +/** + * \weakgroup pll_group + * @{ + */ + +#define NR_PLLS 1 +#define PLL_MIN_HZ 10000000UL +#define PLL_MAX_HZ 200000000UL +#define PLL_NR_OPTIONS 0 + +enum pll_source { + //! 2 MHz Internal RC Oscillator + PLL_SRC_RC2MHZ = OSC_PLLSRC_RC2M_gc, + //! 32 MHz Internal RC Oscillator + PLL_SRC_RC32MHZ = OSC_PLLSRC_RC32M_gc, + //! External Clock Source + PLL_SRC_XOSC = OSC_PLLSRC_XOSC_gc, +}; + +#define pll_get_default_rate(pll_id) \ + pll_get_default_rate_priv(CONFIG_PLL##pll_id##_SOURCE, \ + CONFIG_PLL##pll_id##_MUL, \ + CONFIG_PLL##pll_id##_DIV) + +/** + * \internal + * \brief Return clock rate for specified PLL settings. + * + * \note Due to the hardware implementation of the PLL, \a div must be 4 if the + * 32 MHz RC oscillator is used as reference and 1 otherwise. The reference must + * be above 440 kHz, and the output between 10 and 200 MHz. + * + * \param src ID of the PLL's reference source oscillator. + * \param mul Multiplier for the PLL. + * \param div Divisor for the PLL. + * + * \retval Output clock rate from PLL. + */ +static inline uint32_t pll_get_default_rate_priv(enum pll_source src, + unsigned int mul, unsigned int div) +{ + uint32_t rate; + + switch (src) { + case PLL_SRC_RC2MHZ: + rate = 2000000UL; + Assert(div == 1); + break; + + case PLL_SRC_RC32MHZ: +#ifdef CONFIG_OSC_RC32_CAL //32MHz oscillator is calibrated to another frequency + rate = CONFIG_OSC_RC32_CAL / 4; +#else + rate = 8000000UL; + #endif + Assert(div == 4); + break; + + case PLL_SRC_XOSC: + rate = osc_get_rate(OSC_ID_XOSC); + Assert(div == 1); + break; + + default: + break; + } + + Assert(rate >= 440000UL); + + rate *= mul; + + Assert(rate >= PLL_MIN_HZ); + Assert(rate <= PLL_MAX_HZ); + + return rate; +} + +struct pll_config { + uint8_t ctrl; +}; + +/** + * \note The XMEGA PLL hardware uses hard-wired input dividers, so the + * user must ensure that \a div is set as follows: + * - If \a src is PLL_SRC_32MHZ, \a div must be set to 4. + * - Otherwise, \a div must be set to 1. + */ +static inline void pll_config_init(struct pll_config *cfg, enum pll_source src, + unsigned int div, unsigned int mul) +{ + Assert(mul >= 1 && mul <= 31); + + if (src == PLL_SRC_RC32MHZ) { + Assert(div == 4); + } else { + Assert(div == 1); + } + + /* Initialize the configuration */ + cfg->ctrl = src | (mul << OSC_PLLFAC_gp); +} + +#define pll_config_defaults(cfg, pll_id) \ + pll_config_init(cfg, \ + CONFIG_PLL##pll_id##_SOURCE, \ + CONFIG_PLL##pll_id##_DIV, \ + CONFIG_PLL##pll_id##_MUL) + +static inline void pll_config_read(struct pll_config *cfg, unsigned int pll_id) +{ + Assert(pll_id < NR_PLLS); + + cfg->ctrl = OSC.PLLCTRL; +} + +static inline void pll_config_write(const struct pll_config *cfg, + unsigned int pll_id) +{ + Assert(pll_id < NR_PLLS); + + OSC.PLLCTRL = cfg->ctrl; +} + +/** + * \note If a different PLL reference oscillator than those enabled by + * \ref sysclk_init() is used, the user must ensure that the desired reference + * is enabled prior to calling this function. + */ +static inline void pll_enable(const struct pll_config *cfg, + unsigned int pll_id) +{ + irqflags_t flags; + + Assert(pll_id < NR_PLLS); + + flags = cpu_irq_save(); + pll_config_write(cfg, pll_id); + OSC.CTRL |= OSC_PLLEN_bm; + cpu_irq_restore(flags); +} + +/*! \note This will not automatically disable the reference oscillator that is + * configured for the PLL. + */ +static inline void pll_disable(unsigned int pll_id) +{ + irqflags_t flags; + + Assert(pll_id < NR_PLLS); + + flags = cpu_irq_save(); + OSC.CTRL &= ~OSC_PLLEN_bm; + cpu_irq_restore(flags); +} + +static inline bool pll_is_locked(unsigned int pll_id) +{ + Assert(pll_id < NR_PLLS); + + return OSC.STATUS & OSC_PLLRDY_bm; +} + +static inline void pll_enable_source(enum pll_source src) +{ + switch (src) { + case PLL_SRC_RC2MHZ: + break; + + case PLL_SRC_RC32MHZ: + if (!osc_is_ready(OSC_ID_RC32MHZ)) { + osc_enable(OSC_ID_RC32MHZ); + osc_wait_ready(OSC_ID_RC32MHZ); +#ifdef CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC + if (CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC + != OSC_ID_USBSOF) { + osc_enable(CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC); + osc_wait_ready(CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC); + } + osc_enable_autocalibration(OSC_ID_RC32MHZ, + CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC); +#endif + } + break; + + case PLL_SRC_XOSC: + if (!osc_is_ready(OSC_ID_XOSC)) { + osc_enable(OSC_ID_XOSC); + osc_wait_ready(OSC_ID_XOSC); + } + break; + default: + Assert(false); + break; + } +} + +static inline void pll_enable_config_defaults(unsigned int pll_id) +{ + struct pll_config pllcfg; + + if (pll_is_locked(pll_id)) { + return; // Pll already running + } + switch (pll_id) { +#ifdef CONFIG_PLL0_SOURCE + case 0: + pll_enable_source(CONFIG_PLL0_SOURCE); + pll_config_init(&pllcfg, + CONFIG_PLL0_SOURCE, + CONFIG_PLL0_DIV, + CONFIG_PLL0_MUL); + break; +#endif + default: + Assert(false); + break; + } + pll_enable(&pllcfg, pll_id); + while (!pll_is_locked(pll_id)); +} + +//! @} + +#endif /* XMEGA_PLL_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/xmega/sysclk.c b/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/xmega/sysclk.c new file mode 100644 index 00000000..103c131b --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/xmega/sysclk.c @@ -0,0 +1,260 @@ +/** + * \file + * + * \brief Chip-specific system clock management functions + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#include + +#include +#include +#include + +#if XMEGA_AU || XMEGA_B || XMEGA_C +# include +#endif + + +void sysclk_init(void) +{ + uint8_t *reg = (uint8_t *)&PR.PRGEN; + uint8_t i; +#ifdef CONFIG_OSC_RC32_CAL + uint16_t cal; + /* avoid Cppcheck Warning */ + UNUSED(cal); +#endif + bool need_rc2mhz = false; + + /* Turn off all peripheral clocks that can be turned off. */ + for (i = 0; i <= SYSCLK_PORT_F; i++) { + *(reg++) = 0xff; + } + + /* Set up system clock prescalers if different from defaults */ + if ((CONFIG_SYSCLK_PSADIV != SYSCLK_PSADIV_1) + || (CONFIG_SYSCLK_PSBCDIV != SYSCLK_PSBCDIV_1_1)) { + sysclk_set_prescalers(CONFIG_SYSCLK_PSADIV, + CONFIG_SYSCLK_PSBCDIV); + } +#if (CONFIG_OSC_RC32_CAL==48000000UL) + MSB(cal) = nvm_read_production_signature_row( + nvm_get_production_signature_row_offset(USBRCOSC)); + LSB(cal) = nvm_read_production_signature_row( + nvm_get_production_signature_row_offset(USBRCOSCA)); + /* + * If a device has an uncalibrated value in the + * production signature row (early sample part), load a + * sane default calibration value. + */ + if (cal == 0xFFFF) { + cal = 0x2340; + } + osc_user_calibration(OSC_ID_RC32MHZ,cal); +#endif + /* + * Switch to the selected initial system clock source, unless + * the default internal 2 MHz oscillator is selected. + */ + if (CONFIG_SYSCLK_SOURCE == SYSCLK_SRC_RC2MHZ) { + need_rc2mhz = true; + } else { + switch (CONFIG_SYSCLK_SOURCE) { + case SYSCLK_SRC_RC32MHZ: + osc_enable(OSC_ID_RC32MHZ); + osc_wait_ready(OSC_ID_RC32MHZ); +#ifdef CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC + if (CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC + != OSC_ID_USBSOF) { + osc_enable(CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC); + osc_wait_ready(CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC); + } + osc_enable_autocalibration(OSC_ID_RC32MHZ, + CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC); +#endif + break; + + case SYSCLK_SRC_RC32KHZ: + osc_enable(OSC_ID_RC32KHZ); + osc_wait_ready(OSC_ID_RC32KHZ); + break; + + case SYSCLK_SRC_XOSC: + osc_enable(OSC_ID_XOSC); + osc_wait_ready(OSC_ID_XOSC); + break; + +#ifdef CONFIG_PLL0_SOURCE + case SYSCLK_SRC_PLL: + if (CONFIG_PLL0_SOURCE == PLL_SRC_RC2MHZ) { + need_rc2mhz = true; + } + pll_enable_config_defaults(0); + break; +#endif +#if XMEGA_E + case SYSCLK_SRC_RC8MHZ: + osc_enable(OSC_ID_RC8MHZ); + osc_wait_ready(OSC_ID_RC8MHZ); + break; +#endif + default: + //unhandled_case(CONFIG_SYSCLK_SOURCE); + return; + } + + ccp_write_io((uint8_t *)&CLK.CTRL, CONFIG_SYSCLK_SOURCE); + Assert(CLK.CTRL == CONFIG_SYSCLK_SOURCE); + } + + if (need_rc2mhz) { +#ifdef CONFIG_OSC_AUTOCAL_RC2MHZ_REF_OSC + osc_enable(CONFIG_OSC_AUTOCAL_RC2MHZ_REF_OSC); + osc_wait_ready(CONFIG_OSC_AUTOCAL_RC2MHZ_REF_OSC); + osc_enable_autocalibration(OSC_ID_RC2MHZ, + CONFIG_OSC_AUTOCAL_RC2MHZ_REF_OSC); +#endif + } else { + osc_disable(OSC_ID_RC2MHZ); + } + +#ifdef CONFIG_RTC_SOURCE + sysclk_rtcsrc_enable(CONFIG_RTC_SOURCE); +#endif +} + +void sysclk_enable_module(enum sysclk_port_id port, uint8_t id) +{ + irqflags_t flags = cpu_irq_save(); + + *((uint8_t *)&PR.PRGEN + port) &= ~id; + + cpu_irq_restore(flags); +} + +void sysclk_disable_module(enum sysclk_port_id port, uint8_t id) +{ + irqflags_t flags = cpu_irq_save(); + + *((uint8_t *)&PR.PRGEN + port) |= id; + + cpu_irq_restore(flags); +} + +#if XMEGA_AU || XMEGA_B || XMEGA_C || defined(__DOXYGEN__) + +/** + * \brief Enable clock for the USB module + * + * \pre CONFIG_USBCLK_SOURCE must be defined. + * + * \param frequency The required USB clock frequency in MHz: + * \arg \c 6 for 6 MHz + * \arg \c 48 for 48 MHz + */ +void sysclk_enable_usb(uint8_t frequency) +{ + uint8_t prescaler; + + Assert((frequency == 6) || (frequency == 48)); + + /* + * Enable or disable prescaler depending on if the USB frequency is 6 + * MHz or 48 MHz. Only 6 MHz USB frequency requires prescaling. + */ + if (frequency == 6) { + prescaler = CLK_USBPSDIV_8_gc; + } + else { + prescaler = 0; + } + + /* + * Switch to the system clock selected by the user. + */ + switch (CONFIG_USBCLK_SOURCE) { + case USBCLK_SRC_RCOSC: + if (!osc_is_ready(OSC_ID_RC32MHZ)) { + osc_enable(OSC_ID_RC32MHZ); + osc_wait_ready(OSC_ID_RC32MHZ); +#ifdef CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC + if (CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC + != OSC_ID_USBSOF) { + osc_enable(CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC); + osc_wait_ready(CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC); + } + osc_enable_autocalibration(OSC_ID_RC32MHZ, + CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC); +#endif + } + ccp_write_io((uint8_t *)&CLK.USBCTRL, (prescaler) + | CLK_USBSRC_RC32M_gc + | CLK_USBSEN_bm); + break; + +#ifdef CONFIG_PLL0_SOURCE + case USBCLK_SRC_PLL: + pll_enable_config_defaults(0); + ccp_write_io((uint8_t *)&CLK.USBCTRL, (prescaler) + | CLK_USBSRC_PLL_gc + | CLK_USBSEN_bm); + break; +#endif + + default: + Assert(false); + break; + } + + sysclk_enable_module(SYSCLK_PORT_GEN, SYSCLK_USB); +} + +/** + * \brief Disable clock for the USB module + */ +void sysclk_disable_usb(void) +{ + sysclk_disable_module(SYSCLK_PORT_GEN, SYSCLK_USB); + ccp_write_io((uint8_t *)&CLK.USBCTRL, 0); +} +#endif // XMEGA_AU || XMEGA_B || XMEGA_C diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/xmega/sysclk.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/xmega/sysclk.h new file mode 100644 index 00000000..062a4462 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/clock/xmega/sysclk.h @@ -0,0 +1,1534 @@ +/** + * \file + * + * \brief Chip-specific system clock management functions + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef XMEGA_SYSCLK_H_INCLUDED +#define XMEGA_SYSCLK_H_INCLUDED + +#include +#include +#include +#include +#include +#include + +// Include clock configuration for the project. +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \page sysclk_quickstart Quick Start Guide for the System Clock Management service (XMEGA) + * + * This is the quick start guide for the \ref sysclk_group "System Clock Management" + * service, with step-by-step instructions on how to configure and use the service for + * specific use cases. + * + * \section sysclk_quickstart_usecases System Clock Management use cases + * - \ref sysclk_quickstart_basic + * - \ref sysclk_quickstart_use_case_2 + * - \ref sysclk_quickstart_use_case_3 + * + * \section sysclk_quickstart_basic Basic usage of the System Clock Management service + * This section will present a basic use case for the System Clock Management service. + * This use case will configure the main system clock to 32MHz, using an internal PLL + * module to multiply the frequency of a crystal attached to the microcontroller. The + * secondary peripheral bus clock and CPU clock are scaled down from the speed of the + * main system clock. + * + * \subsection sysclk_quickstart_use_case_1_prereq Prerequisites + * - None + * + * \subsection sysclk_quickstart_use_case_1_setup_steps Initialization code + * Add to the application initialization code: + * \code + sysclk_init(); +\endcode + * + * \subsection sysclk_quickstart_use_case_1_setup_steps_workflow Workflow + * -# Configure the system clocks according to the settings in conf_clock.h: + * \code sysclk_init(); \endcode + * + * \subsection sysclk_quickstart_use_case_1_example_code Example code + * Add or uncomment the following in your conf_clock.h header file, commenting out all other + * definitions of the same symbol(s): + * \code + #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL + + // Fpll0 = (Fclk * PLL_mul) / PLL_div + #define CONFIG_PLL0_SOURCE PLL_SRC_XOSC + #define CONFIG_PLL0_MUL (32000000UL / BOARD_XOSC_HZ) + #define CONFIG_PLL0_DIV 1 + + // Fbus = Fsys / (2 ^ BUS_div) + #define CONFIG_SYSCLK_PSADIV SYSCLK_PSADIV_1 + #define CONFIG_SYSCLK_PSBCDIV SYSCLK_PSBCDIV_1_2 +\endcode + * + * \subsection sysclk_quickstart_use_case_1_example_workflow Workflow + * -# Configure the main system clock to use the output of the PLL module as its source: + * \code #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL \endcode + * -# Configure the PLL0 module to use external crystal oscillator XOSC as its source: + * \code #define CONFIG_PLL0_SOURCE PLL_SRC_XOSC \endcode + * -# Configure the PLL0 module to multiply the external oscillator XOSC frequency up to 32MHz: + * \code + #define CONFIG_PLL0_MUL (32000000UL / BOARD_XOSC_HZ) + #define CONFIG_PLL0_DIV 1 +\endcode + * \note For user boards, \c BOARD_XOSC_HZ should be defined in the board \c conf_board.h configuration + * file as the frequency of the crystal attached to XOSC. + * -# Configure the main CPU clock and slow peripheral bus to run at 16MHz, run the fast peripheral bus + * at the full 32MHz speed: + * \code + #define CONFIG_SYSCLK_PSADIV SYSCLK_PSADIV_1 + #define CONFIG_SYSCLK_PSBCDIV SYSCLK_PSBCDIV_1_2 +\endcode + * \note Some dividers are powers of two, while others are integer division factors. Refer to the + * formulas in the conf_clock.h template commented above each division define. + */ + +/** + * \page sysclk_quickstart_use_case_2 Advanced use case - Peripheral Bus Clock Management (XMEGA) + * + * \section sysclk_quickstart_use_case_2 Advanced use case - Peripheral Bus Clock Management + * This section will present a more advanced use case for the System Clock Management service. + * This use case will configure the main system clock to 32MHz, using an internal PLL + * module to multiply the frequency of a crystal attached to the microcontroller. The peripheral bus + * clocks will run at the same speed as the CPU clock, and the USB clock will be configured to use + * the internal 32MHz (nominal) RC oscillator calibrated to 48MHz with the USB Start-of-Frame as the + * calibration reference. + * + * \subsection sysclk_quickstart_use_case_2_prereq Prerequisites + * - None + * + * \subsection sysclk_quickstart_use_case_2_setup_steps Initialization code + * Add to the application initialization code: + * \code + sysclk_init(); +\endcode + * + * \subsection sysclk_quickstart_use_case_2_setup_steps_workflow Workflow + * -# Configure the system clocks according to the settings in conf_clock.h: + * \code sysclk_init(); \endcode + * + * \subsection sysclk_quickstart_use_case_2_example_code Example code + * Add or uncomment the following in your conf_clock.h header file, commenting out all other + * definitions of the same symbol(s): + * \code + #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL + + // Fpll0 = (Fclk * PLL_mul) / PLL_div + #define CONFIG_PLL0_SOURCE PLL_SRC_XOSC + #define CONFIG_PLL0_MUL (32000000UL / BOARD_XOSC_HZ) + #define CONFIG_PLL0_DIV 1 + + // Fbus = Fsys / (2 ^ BUS_div) + #define CONFIG_SYSCLK_PSADIV SYSCLK_PSADIV_1 + #define CONFIG_SYSCLK_PSBCDIV SYSCLK_PSBCDIV_1_1 + + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_RCOSC + #define CONFIG_OSC_RC32_CAL 48000000UL + #define CONFIG_OSC_AUTOCAL OSC_ID_RC32MHZ + #define CONFIG_OSC_AUTOCAL_REF_OSC OSC_ID_USBSOF +\endcode + * + * \subsection sysclk_quickstart_use_case_2_example_workflow Workflow + * -# Configure the main system clock to use the output of the PLL module as its source: + * \code #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL \endcode + * -# Configure the PLL0 module to use external crystal oscillator XOSC as its source: + * \code #define CONFIG_PLL0_SOURCE PLL_SRC_XOSC \endcode + * -# Configure the PLL0 module to multiply the external oscillator XOSC frequency up to 32MHz: + * \code + #define CONFIG_PLL0_MUL (32000000UL / BOARD_XOSC_HZ) + #define CONFIG_PLL0_DIV 1 +\endcode + * \note For user boards, \c BOARD_XOSC_HZ should be defined in the board \c conf_board.h configuration + * file as the frequency of the crystal attached to XOSC. + * -# Configure the main CPU and peripheral bus clocks to run at 32MHz: + * \code + #define CONFIG_SYSCLK_PSADIV SYSCLK_PSADIV_1 + #define CONFIG_SYSCLK_PSBCDIV SYSCLK_PSBCDIV_1_2 +\endcode + * \note Some dividers are powers of two, while others are integer division factors. Refer to the + * formulas in the conf_clock.h template commented above each division define. + * -# Configure the USB module clock to use the internal fast (32MHz) RC oscillator: + * \code + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_RCOSC +\endcode + * \note When the internal RC oscillator is used for the USB module, it must be recalibrated to 48MHz for + * the USB peripheral to function. If this oscillator is then used as the main system clock source, + * the clock must be divided down via the peripheral and CPU bus clock division constants to ensure + * that the maximum allowable CPU frequency is not exceeded. + * -# Configure the internal fast (32MHz) RC oscillator to calibrate to 48MHz using the USB Start of Frame (SOF) + * as the calibration reference: + * \code + #define CONFIG_OSC_RC32_CAL 48000000UL + #define CONFIG_OSC_AUTOCAL OSC_ID_RC32MHZ + #define CONFIG_OSC_AUTOCAL_REF_OSC OSC_ID_USBSOF +\endcode + */ + +/** + * \page sysclk_quickstart_use_case_3 Advanced use case - DFLL auto-calibration (XMEGA) + * + * \section sysclk_quickstart_use_case_3 Advanced use case - DFLL auto-calibration + * This section will present a more advanced use case for the System Clock + * Management service. This use case will configure the main system clock to + * 2MHz, using the internal 2MHz RC oscillator calibrated against the internal + * 32KHz oscillator. The peripheral bus clocks will run at the same speed as + * the CPU clock, and the USB clock will be configured to use the internal + * 32MHz (nominal) RC oscillator calibrated to 48MHz with the USB + * Start-of-Frame as the calibration reference. + * + * \subsection sysclk_quickstart_use_case_3_prereq Prerequisites + * - None + * + * \subsection sysclk_quickstart_use_case_3_setup_steps Initialization code + * Add to the application initialization code: + * \code + sysclk_init(); +\endcode + * + * \subsection sysclk_quickstart_use_case_3_setup_steps_workflow Workflow + * -# Configure the system clocks according to the settings in conf_clock.h: + * \code sysclk_init(); \endcode + * + * \subsection sysclk_quickstart_use_case_3_example_code Example code + * Add or uncomment the following in your conf_clock.h header file, + * commenting out all other definitions of the same symbol(s): + * \code + #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RC2MHZ + + #define CONFIG_OSC_AUTOCAL_RC2MHZ_REF_OSC OSC_ID_RC32KHZ + + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_RCOSC + #define CONFIG_OSC_RC32_CAL 48000000UL + #define CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC OSC_ID_USBSOF +\endcode + * + * \subsection sysclk_quickstart_use_case_3_example_workflow Workflow + * -# Configure the main system clock to use the internal 2MHz RC oscillator + * as its source: + * \code + #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RC2MHZ +\endcode + * -# Configure the 2MHz DFLL auto-calibration to use the internal 32KHz RC + * oscillator: + * \code + #define CONFIG_OSC_AUTOCAL_RC2MHZ_REF_OSC OSC_ID_RC32KHZ +\endcode + * \note For auto-calibration it's typically more relevant to use an external + * 32KHz crystal. So if that's the case use OSC_ID_XOSC instead. + * -# Configure the USB module clock to use the internal fast (32MHz) RC oscillator: + * \code + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_RCOSC +\endcode + * -# Configure the internal fast (32MHz) RC oscillator to calibrate to 48MHz + * using the USB Start of Frame (SOF) as the calibration reference: + * \code + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_RCOSC + #define CONFIG_OSC_RC32_CAL 48000000UL + #define CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC OSC_ID_USBSOF +\endcode + */ + +/* Wrap old config into new one */ +#ifdef CONFIG_OSC_AUTOCAL +# if CONFIG_OSC_AUTOCAL == OSC_ID_RC2MHZ +# define CONFIG_OSC_AUTOCAL_RC2MHZ_REF_OSC CONFIG_OSC_AUTOCAL_REF_OSC +# elif CONFIG_OSC_AUTOCAL == OSC_ID_RC32MHZ +# define CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC CONFIG_OSC_AUTOCAL_REF_OSC +# else +# error Bad configuration of CONFIG_OSC_AUTOCAL and/or CONFIG_OSC_AUTOCAL_REF_OSC +# endif +#endif + +// Use 2 MHz with no prescaling if config was empty. +#ifndef CONFIG_SYSCLK_SOURCE +# define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RC2MHZ +#endif /* CONFIG_SYSCLK_SOURCE */ + +#ifndef CONFIG_SYSCLK_PSADIV +# define CONFIG_SYSCLK_PSADIV SYSCLK_PSADIV_1 +#endif /* CONFIG_SYSCLK_PSADIV */ + +#ifndef CONFIG_SYSCLK_PSBCDIV +# define CONFIG_SYSCLK_PSBCDIV SYSCLK_PSBCDIV_1_1 +#endif /* CONFIG_SYSCLK_PSBCDIV */ + +/** + * \weakgroup sysclk_group + * + * \section sysclk_group_config Configuration Symbols + * + * The following configuration symbols may be used to specify the + * initial system clock configuration. If any of the symbols are not + * set, reasonable defaults will be provided. + * - \b CONFIG_SYSCLK_SOURCE: The initial system clock source. + * - \b CONFIG_SYSCLK_PSADIV: The initial Prescaler A setting. + * - \b CONFIG_SYSCLK_PSBCDIV: The initial Prescaler B setting. + * - \b CONFIG_USBCLK_SOURCE: The initial USB clock source. + * + * @{ + */ + +//! \name System Clock Sources +//@{ +//! Internal 2 MHz RC oscillator +#define SYSCLK_SRC_RC2MHZ CLK_SCLKSEL_RC2M_gc +//! Internal 32 MHz RC oscillator +#define SYSCLK_SRC_RC32MHZ CLK_SCLKSEL_RC32M_gc +//! Internal 32 KHz RC oscillator +#define SYSCLK_SRC_RC32KHZ CLK_SCLKSEL_RC32K_gc +//! External oscillator +#define SYSCLK_SRC_XOSC CLK_SCLKSEL_XOSC_gc +//! Phase-Locked Loop +#define SYSCLK_SRC_PLL CLK_SCLKSEL_PLL_gc +#if XMEGA_E +//! Internal 8 MHz RC oscillator +# define SYSCLK_SRC_RC8MHZ CLK_SCLKSEL_RC8M_gc +#endif +//@} + +//! \name Prescaler A Setting (relative to CLKsys) +//@{ +#define SYSCLK_PSADIV_1 CLK_PSADIV_1_gc //!< Do not prescale +#define SYSCLK_PSADIV_2 CLK_PSADIV_2_gc //!< Prescale CLKper4 by 2 +#define SYSCLK_PSADIV_4 CLK_PSADIV_4_gc //!< Prescale CLKper4 by 4 +#define SYSCLK_PSADIV_8 CLK_PSADIV_8_gc //!< Prescale CLKper4 by 8 +#define SYSCLK_PSADIV_16 CLK_PSADIV_16_gc //!< Prescale CLKper4 by 16 +#define SYSCLK_PSADIV_32 CLK_PSADIV_32_gc //!< Prescale CLKper4 by 32 +#define SYSCLK_PSADIV_64 CLK_PSADIV_64_gc //!< Prescale CLKper4 by 64 +#define SYSCLK_PSADIV_128 CLK_PSADIV_128_gc //!< Prescale CLKper4 by 128 +#define SYSCLK_PSADIV_256 CLK_PSADIV_256_gc //!< Prescale CLKper4 by 256 +#define SYSCLK_PSADIV_512 CLK_PSADIV_512_gc //!< Prescale CLKper4 by 512 + +#if XMEGA_E +# define SYSCLK_PSADIV_6 CLK_PSADIV_6_gc //!< Prescale CLKper4 by 6 +# define SYSCLK_PSADIV_10 CLK_PSADIV_10_gc //!< Prescale CLKper4 by 10 +# define SYSCLK_PSADIV_12 CLK_PSADIV_12_gc //!< Prescale CLKper4 by 12 +# define SYSCLK_PSADIV_24 CLK_PSADIV_24_gc //!< Prescale CLKper4 by 24 +# define SYSCLK_PSADIV_48 CLK_PSADIV_48_gc //!< Prescale CLKper4 by 48 +#endif +//@} + +//! \name Prescaler B and C Setting (relative to CLKper4) +//@{ +//! Do not prescale +#define SYSCLK_PSBCDIV_1_1 CLK_PSBCDIV_1_1_gc +//! Prescale CLKper and CLKcpu by 2 +#define SYSCLK_PSBCDIV_1_2 CLK_PSBCDIV_1_2_gc +//! Prescale CLKper2, CLKper and CLKcpu by 4 +#define SYSCLK_PSBCDIV_4_1 CLK_PSBCDIV_4_1_gc +//! Prescale CLKper2 by 2, CLKper and CLKcpu by 4 +#define SYSCLK_PSBCDIV_2_2 CLK_PSBCDIV_2_2_gc +//@} + +//! \name System Clock Port Numbers +enum sysclk_port_id { + SYSCLK_PORT_GEN, //!< Devices not associated with a specific port. + SYSCLK_PORT_A, //!< Devices on PORTA + SYSCLK_PORT_B, //!< Devices on PORTB + SYSCLK_PORT_C, //!< Devices on PORTC + SYSCLK_PORT_D, //!< Devices on PORTD + SYSCLK_PORT_E, //!< Devices on PORTE + SYSCLK_PORT_F, //!< Devices on PORTF +}; + +/*! \name Clocks not associated with any port + * + * \note See the datasheet for available modules in the device. + */ +//@{ +#define SYSCLK_DMA PR_DMA_bm //!< DMA Controller +#define SYSCLK_EDMA PR_EDMA_bm //!< EDMA Controller +#define SYSCLK_EVSYS PR_EVSYS_bm //!< Event System +#define SYSCLK_RTC PR_RTC_bm //!< Real-Time Counter +#define SYSCLK_EBI PR_EBI_bm //!< Ext Bus Interface +#define SYSCLK_AES PR_AES_bm //!< AES Module +#define SYSCLK_USB PR_USB_bm //!< USB Module +#define SYSCLK_XCL PR_XCL_bm //!< USB Module +//@} + +/*! \name Clocks on PORTA and PORTB + * + * \note See the datasheet for available modules in the device. + */ +//@{ +#define SYSCLK_AC PR_AC_bm //!< Analog Comparator +#define SYSCLK_ADC PR_ADC_bm //!< A/D Converter +#define SYSCLK_DAC PR_DAC_bm //!< D/A Converter +//@} + +/*! \name Clocks on PORTC, PORTD, PORTE and PORTF + * + * \note See the datasheet for available modules in the device. + */ +//@{ +#define SYSCLK_TC0 PR_TC0_bm //!< Timer/Counter 0 +#define SYSCLK_TC1 PR_TC1_bm //!< Timer/Counter 1 +#define SYSCLK_TC4 PR_TC4_bm //!< Timer/Counter 0 +#define SYSCLK_TC5 PR_TC5_bm //!< Timer/Counter 1 +#define SYSCLK_HIRES PR_HIRES_bm //!< Hi-Res Extension +#define SYSCLK_SPI PR_SPI_bm //!< SPI controller +#define SYSCLK_USART0 PR_USART0_bm //!< USART 0 +#define SYSCLK_USART1 PR_USART1_bm //!< USART 1 +#define SYSCLK_TWI PR_TWI_bm //!< TWI controller +//@} + +/** + * \name RTC clock source identifiers + * + * @{ + */ + +/** 1kHz from internal ULP oscillator. Low precision */ +#define SYSCLK_RTCSRC_ULP CLK_RTCSRC_ULP_gc +/** 1.024kHz from 32.768kHz crystal oscillator TOSC */ +#define SYSCLK_RTCSRC_TOSC CLK_RTCSRC_TOSC_gc +/** 1.024kHz from 32.768kHz internal RC oscillator */ +#define SYSCLK_RTCSRC_RCOSC CLK_RTCSRC_RCOSC_gc +/** 32.768kHz from crystal oscillator TOSC */ +#define SYSCLK_RTCSRC_TOSC32 CLK_RTCSRC_TOSC32_gc +/** 32.768kHz from internal RC oscillator */ +#define SYSCLK_RTCSRC_RCOSC32 CLK_RTCSRC_RCOSC32_gc +/** External clock on TOSC1 */ +#define SYSCLK_RTCSRC_EXTCLK CLK_RTCSRC_EXTCLK_gc + +/** @} */ + +#if XMEGA_AU || XMEGA_B || XMEGA_C +//! \name USB Clock Sources +//@{ +//! Internal 32 MHz RC oscillator +#define USBCLK_SRC_RCOSC 0 +//! Phase-Locked Loop +#define USBCLK_SRC_PLL 1 +//@} + +/** + * \def CONFIG_USBCLK_SOURCE + * \brief Configuration symbol for the USB clock source + * + * If the device features an USB module, and this is intended to be used, this + * symbol must be defined with the clock source configuration. + * + * Define this as one of the \c USBCLK_SRC_xxx definitions. If the PLL is + * selected, it must be configured to run at 48 MHz. If the 32 MHz RC oscillator + * is selected, it must be tuned to 48 MHz by means of the DFLL. + */ +#ifdef __DOXYGEN__ +# define CONFIG_USBCLK_SOURCE +#endif + +#endif // XMEGA_AU || XMEGA_B || XMEGA_C + +#ifndef __ASSEMBLY__ + +/** + * \name Querying the system clock and its derived clocks + */ +//@{ + +/** + * \brief Return the current rate in Hz of the main system clock + * + * \todo This function assumes that the main clock source never changes + * once it's been set up, and that PLL0 always runs at the compile-time + * configured default rate. While this is probably the most common + * configuration, which we want to support as a special case for + * performance reasons, we will at some point need to support more + * dynamic setups as well. + * + * \return Frequency of the main system clock, in Hz. + */ +static inline uint32_t sysclk_get_main_hz(void) +{ + switch (CONFIG_SYSCLK_SOURCE) { + case SYSCLK_SRC_RC2MHZ: + return 2000000UL; +#if XMEGA_E + case SYSCLK_SRC_RC8MHZ: + return 8000000UL; +#endif + case SYSCLK_SRC_RC32MHZ: +#ifdef CONFIG_OSC_RC32_CAL + return CONFIG_OSC_RC32_CAL; +#else + return 32000000UL; +#endif + + case SYSCLK_SRC_RC32KHZ: + return 32768UL; + +#ifdef BOARD_XOSC_HZ + case SYSCLK_SRC_XOSC: + return BOARD_XOSC_HZ; +#endif + +#ifdef CONFIG_PLL0_SOURCE + case SYSCLK_SRC_PLL: + return pll_get_default_rate(0); +#endif + + default: + //unhandled_case(CONFIG_SYSCLK_SOURCE); + return 0; + } +} + +/** + * \brief Return the current rate in Hz of clk_PER4. + * + * This clock can run up to four times faster than the CPU clock. + * + * \return Frequency of the clk_PER4 clock, in Hz. + */ +static inline uint32_t sysclk_get_per4_hz(void) +{ + uint8_t shift = 0; + +#if XMEGA_E + if (CONFIG_SYSCLK_PSADIV > SYSCLK_PSADIV_512) { + switch (CONFIG_SYSCLK_PSADIV) { + case SYSCLK_PSADIV_6: + return sysclk_get_main_hz() / 6; + case SYSCLK_PSADIV_10: + return sysclk_get_main_hz() / 10; + case SYSCLK_PSADIV_12: + return sysclk_get_main_hz() / 12; + case SYSCLK_PSADIV_24: + return sysclk_get_main_hz() / 24; + case SYSCLK_PSADIV_48: + return sysclk_get_main_hz() / 48; + default: + //unhandled_case; + return 0; + } + } +#endif + if (CONFIG_SYSCLK_PSADIV & (1U << CLK_PSADIV_gp)) { + shift = (CONFIG_SYSCLK_PSADIV >> (1 + CLK_PSADIV_gp)) + 1; + } + + return sysclk_get_main_hz() >> shift; +} + +/** + * \brief Return the current rate in Hz of clk_PER2. + * + * This clock can run up to two times faster than the CPU clock. + * + * \return Frequency of the clk_PER2 clock, in Hz. + */ +static inline uint32_t sysclk_get_per2_hz(void) +{ + switch (CONFIG_SYSCLK_PSBCDIV) { + case SYSCLK_PSBCDIV_1_1: /* Fall through */ + case SYSCLK_PSBCDIV_1_2: + return sysclk_get_per4_hz(); + + case SYSCLK_PSBCDIV_4_1: + return sysclk_get_per4_hz() / 4; + + case SYSCLK_PSBCDIV_2_2: + return sysclk_get_per4_hz() / 2; + + default: + //unhandled_case(CONFIG_SYSCLK_PSBCDIV); + return 0; + } +} + +/** + * \brief Return the current rate in Hz of clk_PER. + * + * This clock always runs at the same rate as the CPU clock unless the divider + * is set. + * + * \return Frequency of the clk_PER clock, in Hz. + */ +static inline uint32_t sysclk_get_per_hz(void) +{ + if (CONFIG_SYSCLK_PSBCDIV & (1U << CLK_PSBCDIV_gp)) + return sysclk_get_per2_hz() / 2; + else + return sysclk_get_per2_hz(); +} + +/** + * \brief Return the current rate in Hz of the CPU clock. + * + * \return Frequency of the CPU clock, in Hz. + */ +static inline uint32_t sysclk_get_cpu_hz(void) +{ + return sysclk_get_per_hz(); +} + +/** + * \brief Retrieves the current rate in Hz of the Peripheral Bus clock attached + * to the specified peripheral. + * + * \param module Pointer to the module's base address. + * + * \return Frequency of the bus attached to the specified peripheral, in Hz. + */ +static inline uint32_t sysclk_get_peripheral_bus_hz(const volatile void *module) +{ + if (module == NULL) { + Assert(false); + return 0; + } +#ifdef AES + else if (module == &AES) { + return sysclk_get_per_hz(); + } +#endif +#ifdef EBI + else if (module == &EBI) { + return sysclk_get_per2_hz(); + } +#endif +#ifdef RTC + else if (module == &RTC) { + return sysclk_get_per_hz(); + } +#endif +#ifdef EVSYS + else if (module == &EVSYS) { + return sysclk_get_per_hz(); + } +#endif +#ifdef DMA + else if (module == &DMA) { + return sysclk_get_per_hz(); + } +#endif +#ifdef EDMA + else if (module == &EDMA) { + return sysclk_get_per_hz(); + } +#endif +#ifdef ACA + else if (module == &ACA) { + return sysclk_get_per_hz(); + } +#endif +#ifdef ACB + else if (module == &ACB) { + return sysclk_get_per_hz(); + } +#endif +#ifdef ADCA + else if (module == &ADCA) { + return sysclk_get_per_hz(); + } +#endif +#ifdef ADCB + else if (module == &ADCB) { + return sysclk_get_per_hz(); + } +#endif +#ifdef DACA + else if (module == &DACA) { + return sysclk_get_per_hz(); + } +#endif +// Workaround for bad XMEGA D header file +#if !XMEGA_D +#ifdef DACB + else if (module == &DACB) { + return sysclk_get_per_hz(); + } +#endif +#endif // Workaround end +#ifdef FAULTC0 + else if (module == &FAULTC0) { + return sysclk_get_per_hz(); + } +#endif +#ifdef FAULTC1 + else if (module == &FAULTC1) { + return sysclk_get_per_hz(); + } +#endif +#ifdef TCC0 + else if (module == &TCC0) { + return sysclk_get_per_hz(); + } +#endif +#ifdef TCD0 + else if (module == &TCD0) { + return sysclk_get_per_hz(); + } +#endif +#ifdef TCE0 + else if (module == &TCE0) { + return sysclk_get_per_hz(); + } +#endif +#ifdef TCF0 + else if (module == &TCF0) { + return sysclk_get_per_hz(); + } +#endif +#ifdef TCC1 + else if (module == &TCC1) { + return sysclk_get_per_hz(); + } +#endif +#ifdef TCD1 + else if (module == &TCD1) { + return sysclk_get_per_hz(); + } +#endif +#ifdef TCE1 + else if (module == &TCE1) { + return sysclk_get_per_hz(); + } +#endif +#ifdef TCF1 + else if (module == &TCF1) { + return sysclk_get_per_hz(); + } +#endif +#ifdef TCC4 + else if (module == &TCC4) { + return sysclk_get_per_hz(); + } +#endif +#ifdef TCC5 + else if (module == &TCC5) { + return sysclk_get_per_hz(); + } +#endif +#ifdef TCD4 + else if (module == &TCD4) { + return sysclk_get_per_hz(); + } +#endif +#ifdef TCD5 + else if (module == &TCD5) { + return sysclk_get_per_hz(); + } +#endif +#ifdef HIRESC + else if (module == &HIRESC) { + return sysclk_get_per4_hz(); + } +#endif +#ifdef HIRESD + else if (module == &HIRESD) { + return sysclk_get_per4_hz(); + } +#endif +#ifdef HIRESE + else if (module == &HIRESE) { + return sysclk_get_per4_hz(); + } +#endif +#ifdef HIRESF + else if (module == &HIRESF) { + return sysclk_get_per4_hz(); + } +#endif +#ifdef SPIC + else if (module == &SPIC) { + return sysclk_get_per_hz(); + } +#endif +#ifdef SPID + else if (module == &SPID) { + return sysclk_get_per_hz(); + } +#endif +#ifdef SPIE + else if (module == &SPIE) { + return sysclk_get_per_hz(); + } +#endif +#ifdef SPIF + else if (module == &SPIF) { + return sysclk_get_per_hz(); + } +#endif +#ifdef USARTC0 + else if (module == &USARTC0) { + return sysclk_get_per_hz(); + } +#endif +#ifdef USARTD0 + else if (module == &USARTD0) { + return sysclk_get_per_hz(); + } +#endif +#ifdef USARTE0 + else if (module == &USARTE0) { + return sysclk_get_per_hz(); + } +#endif +#ifdef USARTF0 + else if (module == &USARTF0) { + return sysclk_get_per_hz(); + } +#endif +#ifdef USARTC1 + else if (module == &USARTC1) { + return sysclk_get_per_hz(); + } +#endif +#ifdef USARTD1 + else if (module == &USARTD1) { + return sysclk_get_per_hz(); + } +#endif +#ifdef USARTE1 + else if (module == &USARTE1) { + return sysclk_get_per_hz(); + } +#endif +#ifdef USARTF1 + else if (module == &USARTF1) { + return sysclk_get_per_hz(); + } +#endif +#ifdef TWIC + else if (module == &TWIC) { + return sysclk_get_per_hz(); + } +#endif +#ifdef TWID + else if (module == &TWID) { + return sysclk_get_per_hz(); + } +#endif +#ifdef TWIE + else if (module == &TWIE) { + return sysclk_get_per_hz(); + } +#endif +#ifdef TWIF + else if (module == &TWIF) { + return sysclk_get_per_hz(); + } +#endif +#ifdef XCL + else if (module == &XCL) { + return sysclk_get_per_hz(); + } +#endif + else { + Assert(false); + return 0; + } +} + +//@} + +//! \name Enabling and disabling synchronous clocks +//@{ + +/** + * \brief Enable the clock to peripheral \a id on port \a port + * + * \param port ID of the port to which the module is connected (one of + * the \c SYSCLK_PORT_* definitions). + * \param id The ID (bitmask) of the peripheral module to be enabled. + */ +extern void sysclk_enable_module(enum sysclk_port_id port, uint8_t id); + +/** + * \brief Disable the clock to peripheral \a id on port \a port + * + * \param port ID of the port to which the module is connected (one of + * the \c SYSCLK_PORT_* definitions). + * \param id The ID (bitmask) of the peripheral module to be disabled. + */ +extern void sysclk_disable_module(enum sysclk_port_id port, uint8_t id); + +/** + * \brief Enable a peripheral's clock from its base address. + * + * Enables the clock to a peripheral, given its base address. If the peripheral + * has an associated clock on the HSB bus, this will be enabled also. + * + * \param module Pointer to the module's base address. + */ +static inline void sysclk_enable_peripheral_clock(const volatile void *module) +{ + if (module == NULL) { + Assert(false); + } +#ifdef AES + else if (module == &AES) { + sysclk_enable_module(SYSCLK_PORT_GEN, SYSCLK_AES); + } +#endif +#ifdef EBI + else if (module == &EBI) { + sysclk_enable_module(SYSCLK_PORT_GEN, SYSCLK_EBI); + } +#endif +#ifdef RTC + else if (module == &RTC) { + sysclk_enable_module(SYSCLK_PORT_GEN, SYSCLK_RTC); + } +#endif +#ifdef EVSYS + else if (module == &EVSYS) { + sysclk_enable_module(SYSCLK_PORT_GEN, SYSCLK_EVSYS); + } +#endif +#ifdef DMA + else if (module == &DMA) { + sysclk_enable_module(SYSCLK_PORT_GEN, SYSCLK_DMA); + } +#endif +#ifdef EDMA + else if (module == &EDMA) { + sysclk_enable_module(SYSCLK_PORT_GEN, SYSCLK_EDMA); + } +#endif +#ifdef ACA + else if (module == &ACA) { + sysclk_enable_module(SYSCLK_PORT_A, SYSCLK_AC); + } +#endif +#ifdef ACB + else if (module == &ACB) { + sysclk_enable_module(SYSCLK_PORT_B, SYSCLK_AC); + } +#endif +#ifdef ADCA + else if (module == &ADCA) { + sysclk_enable_module(SYSCLK_PORT_A, SYSCLK_ADC); + } +#endif +#ifdef ADCB + else if (module == &ADCB) { + sysclk_enable_module(SYSCLK_PORT_B, SYSCLK_ADC); + } +#endif +#ifdef DACA + else if (module == &DACA) { + sysclk_enable_module(SYSCLK_PORT_A, SYSCLK_DAC); + } +#endif +// Workaround for bad XMEGA D header file +#if !XMEGA_D +#ifdef DACB + else if (module == &DACB) { + sysclk_enable_module(SYSCLK_PORT_B, SYSCLK_DAC); + } +#endif +#endif // Workaround end +#ifdef TCC0 + else if (module == &TCC0) { + sysclk_enable_module(SYSCLK_PORT_C, SYSCLK_TC0); + } +#endif +#ifdef TCD0 + else if (module == &TCD0) { + sysclk_enable_module(SYSCLK_PORT_D, SYSCLK_TC0); + } +#endif +#ifdef TCE0 + else if (module == &TCE0) { + sysclk_enable_module(SYSCLK_PORT_E, SYSCLK_TC0); + } +#endif +#ifdef TCF0 + else if (module == &TCF0) { + sysclk_enable_module(SYSCLK_PORT_F, SYSCLK_TC0); + } +#endif +#ifdef TCC1 + else if (module == &TCC1) { + sysclk_enable_module(SYSCLK_PORT_C, SYSCLK_TC1); + } +#endif +#ifdef TCD1 + else if (module == &TCD1) { + sysclk_enable_module(SYSCLK_PORT_D, SYSCLK_TC1); + } +#endif +#ifdef TCE1 + else if (module == &TCE1) { + sysclk_enable_module(SYSCLK_PORT_E, SYSCLK_TC1); + } +#endif +#ifdef TCF1 + else if (module == &TCF1) { + sysclk_enable_module(SYSCLK_PORT_F, SYSCLK_TC1); + } +#endif +#ifdef TCC4 + else if (module == &TCC4) { + sysclk_enable_module(SYSCLK_PORT_C, SYSCLK_TC4); + } +#endif +#ifdef TCC5 + else if (module == &TCC5) { + sysclk_enable_module(SYSCLK_PORT_C, SYSCLK_TC5); + } +#endif +#ifdef TCD4 + else if (module == &TCD4) { + sysclk_enable_module(SYSCLK_PORT_D, SYSCLK_TC4); + } +#endif +#ifdef TCD5 + else if (module == &TCD5) { + sysclk_enable_module(SYSCLK_PORT_D, SYSCLK_TC5); + } +#endif +#ifdef HIRESC + else if (module == &HIRESC) { + sysclk_enable_module(SYSCLK_PORT_C, SYSCLK_HIRES); + } +#endif +#ifdef HIRESD + else if (module == &HIRESD) { + sysclk_enable_module(SYSCLK_PORT_D, SYSCLK_HIRES); + } +#endif +#ifdef HIRESE + else if (module == &HIRESE) { + sysclk_enable_module(SYSCLK_PORT_E, SYSCLK_HIRES); + } +#endif +#ifdef HIRESF + else if (module == &HIRESF) { + sysclk_enable_module(SYSCLK_PORT_F, SYSCLK_HIRES); + } +#endif +#ifdef SPIC + else if (module == &SPIC) { + sysclk_enable_module(SYSCLK_PORT_C, SYSCLK_SPI); + } +#endif +#ifdef SPID + else if (module == &SPID) { + sysclk_enable_module(SYSCLK_PORT_D, SYSCLK_SPI); + } +#endif +#ifdef SPIE + else if (module == &SPIE) { + sysclk_enable_module(SYSCLK_PORT_E, SYSCLK_SPI); + } +#endif +#ifdef SPIF + else if (module == &SPIF) { + sysclk_enable_module(SYSCLK_PORT_F, SYSCLK_SPI); + } +#endif +#ifdef USARTC0 + else if (module == &USARTC0) { + sysclk_enable_module(SYSCLK_PORT_C, SYSCLK_USART0); + } +#endif +#ifdef USARTD0 + else if (module == &USARTD0) { + sysclk_enable_module(SYSCLK_PORT_D, SYSCLK_USART0); + } +#endif +#ifdef USARTE0 + else if (module == &USARTE0) { + sysclk_enable_module(SYSCLK_PORT_E, SYSCLK_USART0); + } +#endif +#ifdef USARTF0 + else if (module == &USARTF0) { + sysclk_enable_module(SYSCLK_PORT_F, SYSCLK_USART0); + } +#endif +#ifdef USARTC1 + else if (module == &USARTC1) { + sysclk_enable_module(SYSCLK_PORT_C, SYSCLK_USART1); + } +#endif +#ifdef USARTD1 + else if (module == &USARTD1) { + sysclk_enable_module(SYSCLK_PORT_D, SYSCLK_USART1); + } +#endif +#ifdef USARTE1 + else if (module == &USARTE1) { + sysclk_enable_module(SYSCLK_PORT_E, SYSCLK_USART1); + } +#endif +#ifdef USARTF1 + else if (module == &USARTF1) { + sysclk_enable_module(SYSCLK_PORT_F, SYSCLK_USART1); + } +#endif +#ifdef TWIC + else if (module == &TWIC) { + sysclk_enable_module(SYSCLK_PORT_C, SYSCLK_TWI); + } +#endif +#ifdef TWID + else if (module == &TWID) { + sysclk_enable_module(SYSCLK_PORT_D, SYSCLK_TWI); + } +#endif +#ifdef TWIE + else if (module == &TWIE) { + sysclk_enable_module(SYSCLK_PORT_E, SYSCLK_TWI); + } +#endif +#ifdef TWIF + else if (module == &TWIF) { + sysclk_enable_module(SYSCLK_PORT_F, SYSCLK_TWI); + } +#endif +#ifdef XCL + else if (module == &XCL) { + sysclk_enable_module(SYSCLK_PORT_GEN, SYSCLK_XCL); + } +#endif + else { + Assert(false); + } +} + +/** + * \brief Disable a peripheral's clock from its base address. + * + * Disables the clock to a peripheral, given its base address. If the peripheral + * has an associated clock on the HSB bus, this will be disabled also. + * + * \param module Pointer to the module's base address. + */ +static inline void sysclk_disable_peripheral_clock(const volatile void *module) +{ + if (module == NULL) { + Assert(false); + } +#ifdef AES + else if (module == &AES) { + sysclk_disable_module(SYSCLK_PORT_GEN, SYSCLK_AES); + } +#endif +#ifdef EBI + else if (module == &EBI) { + sysclk_disable_module(SYSCLK_PORT_GEN, SYSCLK_EBI); + } +#endif +#ifdef RTC + else if (module == &RTC) { + sysclk_disable_module(SYSCLK_PORT_GEN, SYSCLK_RTC); + } +#endif +#ifdef EVSYS + else if (module == &EVSYS) { + sysclk_disable_module(SYSCLK_PORT_GEN, SYSCLK_EVSYS); + } +#endif +#ifdef DMA + else if (module == &DMA) { + sysclk_disable_module(SYSCLK_PORT_GEN, SYSCLK_DMA); + } +#endif +#ifdef EDMA + else if (module == &EDMA) { + sysclk_disable_module(SYSCLK_PORT_GEN, SYSCLK_EDMA); + } +#endif +#ifdef ACA + else if (module == &ACA) { + sysclk_disable_module(SYSCLK_PORT_A, SYSCLK_AC); + } +#endif +#ifdef ACB + else if (module == &ACB) { + sysclk_disable_module(SYSCLK_PORT_B, SYSCLK_AC); + } +#endif +#ifdef ADCA + else if (module == &ADCA) { + sysclk_disable_module(SYSCLK_PORT_A, SYSCLK_ADC); + } +#endif +#ifdef ADCB + else if (module == &ADCB) { + sysclk_disable_module(SYSCLK_PORT_B, SYSCLK_ADC); + } +#endif +#ifdef DACA + else if (module == &DACA) { + sysclk_disable_module(SYSCLK_PORT_A, SYSCLK_DAC); + } +#endif +// Workaround for bad XMEGA D header file +#if !XMEGA_D +#ifdef DACB + else if (module == &DACB) { + sysclk_disable_module(SYSCLK_PORT_B, SYSCLK_DAC); + } +#endif +#endif // Workaround end +#ifdef TCC0 + else if (module == &TCC0) { + sysclk_disable_module(SYSCLK_PORT_C, SYSCLK_TC0); + } +#endif +#ifdef TCD0 + else if (module == &TCD0) { + sysclk_disable_module(SYSCLK_PORT_D, SYSCLK_TC0); + } +#endif +#ifdef TCE0 + else if (module == &TCE0) { + sysclk_disable_module(SYSCLK_PORT_E, SYSCLK_TC0); + } +#endif +#ifdef TCF0 + else if (module == &TCF0) { + sysclk_disable_module(SYSCLK_PORT_F, SYSCLK_TC0); + } +#endif +#ifdef TCC1 + else if (module == &TCC1) { + sysclk_disable_module(SYSCLK_PORT_C, SYSCLK_TC1); + } +#endif +#ifdef TCD1 + else if (module == &TCD1) { + sysclk_disable_module(SYSCLK_PORT_D, SYSCLK_TC1); + } +#endif +#ifdef TCE1 + else if (module == &TCE1) { + sysclk_disable_module(SYSCLK_PORT_E, SYSCLK_TC1); + } +#endif +#ifdef TCF1 + else if (module == &TCF1) { + sysclk_disable_module(SYSCLK_PORT_F, SYSCLK_TC1); + } +#endif +#ifdef TCC4 + else if (module == &TCC4) { + sysclk_disable_module(SYSCLK_PORT_C, SYSCLK_TC4); + } +#endif +#ifdef TCC5 + else if (module == &TCC5) { + sysclk_disable_module(SYSCLK_PORT_C, SYSCLK_TC5); + } +#endif +#ifdef TCD4 + else if (module == &TCD4) { + sysclk_disable_module(SYSCLK_PORT_D, SYSCLK_TC4); + } +#endif +#ifdef TCD5 + else if (module == &TCD5) { + sysclk_disable_module(SYSCLK_PORT_D, SYSCLK_TC5); + } +#endif +#ifdef HIRESC + else if (module == &HIRESC) { + sysclk_disable_module(SYSCLK_PORT_C, SYSCLK_HIRES); + } +#endif +#ifdef HIRESD + else if (module == &HIRESD) { + sysclk_disable_module(SYSCLK_PORT_D, SYSCLK_HIRES); + } +#endif +#ifdef HIRESE + else if (module == &HIRESE) { + sysclk_disable_module(SYSCLK_PORT_E, SYSCLK_HIRES); + } +#endif +#ifdef HIRESF + else if (module == &HIRESF) { + sysclk_disable_module(SYSCLK_PORT_F, SYSCLK_HIRES); + } +#endif +#ifdef SPIC + else if (module == &SPIC) { + sysclk_disable_module(SYSCLK_PORT_C, SYSCLK_SPI); + } +#endif +#ifdef SPID + else if (module == &SPID) { + sysclk_disable_module(SYSCLK_PORT_D, SYSCLK_SPI); + } +#endif +#ifdef SPIE + else if (module == &SPIE) { + sysclk_disable_module(SYSCLK_PORT_E, SYSCLK_SPI); + } +#endif +#ifdef SPIF + else if (module == &SPIF) { + sysclk_disable_module(SYSCLK_PORT_F, SYSCLK_SPI); + } +#endif +#ifdef USARTC0 + else if (module == &USARTC0) { + sysclk_disable_module(SYSCLK_PORT_C, SYSCLK_USART0); + } +#endif +#ifdef USARTD0 + else if (module == &USARTD0) { + sysclk_disable_module(SYSCLK_PORT_D, SYSCLK_USART0); + } +#endif +#ifdef USARTE0 + else if (module == &USARTE0) { + sysclk_disable_module(SYSCLK_PORT_E, SYSCLK_USART0); + } +#endif +#ifdef USARTF0 + else if (module == &USARTF0) { + sysclk_disable_module(SYSCLK_PORT_F, SYSCLK_USART0); + } +#endif +#ifdef USARTC1 + else if (module == &USARTC1) { + sysclk_disable_module(SYSCLK_PORT_C, SYSCLK_USART1); + } +#endif +#ifdef USARTD1 + else if (module == &USARTD1) { + sysclk_disable_module(SYSCLK_PORT_D, SYSCLK_USART1); + } +#endif +#ifdef USARTE1 + else if (module == &USARTE1) { + sysclk_disable_module(SYSCLK_PORT_E, SYSCLK_USART1); + } +#endif +#ifdef USARTF1 + else if (module == &USARTF1) { + sysclk_disable_module(SYSCLK_PORT_F, SYSCLK_USART1); + } +#endif +#ifdef TWIC + else if (module == &TWIC) { + sysclk_disable_module(SYSCLK_PORT_C, SYSCLK_TWI); + } +#endif +#ifdef TWID + else if (module == &TWID) { + sysclk_disable_module(SYSCLK_PORT_D, SYSCLK_TWI); + } +#endif +#ifdef TWIE + else if (module == &TWIE) { + sysclk_disable_module(SYSCLK_PORT_E, SYSCLK_TWI); + } +#endif +#ifdef TWIF + else if (module == &TWIF) { + sysclk_disable_module(SYSCLK_PORT_F, SYSCLK_TWI); + } +#endif +#ifdef XCL + else if (module == &XCL) { + sysclk_disable_module(SYSCLK_PORT_GEN, SYSCLK_XCL); + } +#endif + else { + Assert(false); + } +} + +/** + * \brief Check if the synchronous clock is enabled for a module + * + * \param port ID of the port to which the module is connected (one of + * the \c SYSCLK_PORT_* definitions). + * \param id The ID (bitmask) of the peripheral module to check (one of + * the \c SYSCLK_* module definitions). + * + * \retval true If the clock for module \a id on \a port is enabled. + * \retval false If the clock for module \a id on \a port is disabled. + */ +static inline bool sysclk_module_is_enabled(enum sysclk_port_id port, + uint8_t id) +{ + uint8_t mask = *((uint8_t *)&PR.PRGEN + port); + return (mask & id) == 0; +} + +#if XMEGA_AU || XMEGA_B || XMEGA_C || defined(__DOXYGEN__) +# if defined(CONFIG_USBCLK_SOURCE) || defined(__DOXYGEN__) +# if (CONFIG_USBCLK_SOURCE == USBCLK_SRC_RCOSC) +# define USBCLK_STARTUP_TIMEOUT 1 +# elif (CONFIG_USBCLK_SOURCE == USBCLK_SRC_PLL) +# if (CONFIG_PLL0_SOURCE == PLL_SRC_XOSC) +# define USBCLK_STARTUP_TIMEOUT XOSC_STARTUP_TIMEOUT +# elif (CONFIG_PLL0_SOURCE == PLL_SRC_RC32MHZ) +# define USBCLK_STARTUP_TIMEOUT 1 +# elif (CONFIG_PLL0_SOURCE == PLL_SRC_RC2MHZ) +# define USBCLK_STARTUP_TIMEOUT 1 +# else +# error Unknow value for CONFIG_PLL0_SOURCE, see conf_clock.h. +# endif +# endif +# else /* CONFIG_USBCLK_SOURCE not defined */ +# define CONFIG_USBCLK_SOURCE USBCLK_SRC_RCOSC +# define USBCLK_STARTUP_TIMEOUT 1 +# endif /* CONFIG_USBCLK_SOURCE */ +void sysclk_enable_usb(uint8_t frequency); +void sysclk_disable_usb(void); +#endif /* XMEGA_AU || XMEGA_B || XMEGA_C */ +//@} + +//! \name System Clock Source and Prescaler configuration +//@{ + +/** + * \brief Set system clock prescaler configuration + * + * This function will change the system clock prescaler configuration to + * match the parameters. + * + * \note The parameters to this function are device-specific. + * + * \param psadiv The prescaler A setting (one of the \c SYSCLK_PSADIV_* + * definitions). This determines the clkPER4 frequency. + * \param psbcdiv The prescaler B and C settings (one of the \c SYSCLK_PSBCDIV_* + * definitions). These determine the clkPER2, clkPER and clkCPU frequencies. + */ +static inline void sysclk_set_prescalers(uint8_t psadiv, uint8_t psbcdiv) +{ + ccp_write_io((uint8_t *)&CLK.PSCTRL, psadiv | psbcdiv); +} + +/** + * \brief Change the source of the main system clock. + * + * \param src The new system clock source. Must be one of the constants + * from the System Clock Sources section. + */ +static inline void sysclk_set_source(uint8_t src) +{ + ccp_write_io((uint8_t *)&CLK.CTRL, src); +} + +/** + * \brief Lock the system clock configuration + * + * This function will lock the current system clock source and prescaler + * configuration, preventing any further changes. + */ +static inline void sysclk_lock(void) +{ + ccp_write_io((uint8_t *)&CLK.LOCK, CLK_LOCK_bm); +} + +//@} + +/** + * \name RTC clock source control + * @{ + */ + +/** + * \brief Enable RTC clock with specified clock source + * + * \param id RTC clock source ID. Select from SYSCLK_RTCSRC_ULP, + * SYSCLK_RTCSRC_RCOSC, SYSCLK_RTCSRC_TOSC, SYSCLK_RTCSRC_RCOSC32, + * SYSCLK_RTCSRC_TOSC32 or SYSCLK_RTCSRC_EXTCLK + */ +static inline void sysclk_rtcsrc_enable(uint8_t id) +{ + Assert((id & ~CLK_RTCSRC_gm) == 0); + + switch (id) { + case SYSCLK_RTCSRC_RCOSC: +#if !XMEGA_A && !XMEGA_D + case SYSCLK_RTCSRC_RCOSC32: +#endif + osc_enable(OSC_ID_RC32KHZ); + osc_wait_ready(OSC_ID_RC32KHZ); + break; + case SYSCLK_RTCSRC_TOSC: + case SYSCLK_RTCSRC_TOSC32: +#if !XMEGA_A && !XMEGA_D + case SYSCLK_RTCSRC_EXTCLK: +#endif + osc_enable(OSC_ID_XOSC); + osc_wait_ready(OSC_ID_XOSC); + break; + } + + CLK.RTCCTRL = id | CLK_RTCEN_bm; +} + +/** + * \brief Disable RTC clock + */ +static inline void sysclk_rtcsrc_disable(void) +{ + CLK.RTCCTRL = 0; +} + +/** @} */ + +//! \name System Clock Initialization +//@{ + +extern void sysclk_init(void); + +//@} + +#endif /* !__ASSEMBLY__ */ + +//! @} + +#ifdef __cplusplus +} +#endif + +#endif /* XMEGA_SYSCLK_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/delay/delay.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/delay/delay.h new file mode 100644 index 00000000..c845e44b --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/delay/delay.h @@ -0,0 +1,139 @@ +/** + * \file + * + * \brief Common Delay Service + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef _DELAY_H_ +#define _DELAY_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#if UC3 +# include +#elif XMEGA +# include "xmega/cycle_counter.h" +#elif MEGA +# include "mega/cycle_counter.h" +#elif SAM +# include "sam/cycle_counter.h" +#endif + +/** + * @defgroup group_common_services_delay Busy-Wait Delay Routines + * + * This module provides simple loop-based delay routines for those + * applications requiring a brief wait during execution. Common API + * for UC3, XMEGA, and AVR MEGA. + * + * @{ + */ + +/** + * @def F_CPU + * @brief MCU Clock Frequency (Hertz) + * + * @deprecated + * The \ref F_CPU configuration constant is used for compatibility with the + * \ref group_common_services_delay routines. The common loop-based delay + * routines are designed to use the \ref clk_group modules while anticipating + * support for legacy applications assuming a statically defined clock + * frequency. Applications using a statically configured MCU clock frequency + * can define \ref F_CPU (Hertz), in which case the common delay routines will + * use this value rather than calling sysclk_get_cpu_hz() to get the current + * MCU clock frequency. + */ +#ifndef F_CPU +# define F_CPU sysclk_get_cpu_hz() +#endif + +/** + * @def delay_init + * + * @brief Initialize the delay driver. + * @param fcpu_hz CPU frequency in Hz + * + * @deprecated + * This function is provided for compatibility with ASF applications that + * may not have been updated to configure the system clock via the common + * clock service; e.g. sysclk_init() and a configuration header file are + * used to configure clocks. + * + * The functions in this module call \ref sysclk_get_cpu_hz() function to + * obtain the system clock frequency. + */ +#define delay_init(fcpu_hz) + +/** + * @def delay_s + * @brief Delay in seconds. + * @param delay Delay in seconds + */ +#define delay_s(delay) cpu_delay_ms(1000 * delay, F_CPU) + +/** + * @def delay_ms + * @brief Delay in milliseconds. + * @param delay Delay in milliseconds + */ +#define delay_ms(delay) cpu_delay_ms(delay, F_CPU) + +/** + * @def delay_us + * @brief Delay in microseconds. + * @param delay Delay in microseconds + */ +#define delay_us(delay) cpu_delay_us(delay, F_CPU) + +#ifdef __cplusplus +} +#endif + +/** + * @} + */ + +#endif /* _DELAY_H_ */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/delay/xmega/cycle_counter.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/delay/xmega/cycle_counter.h new file mode 100644 index 00000000..e67e520a --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/delay/xmega/cycle_counter.h @@ -0,0 +1,116 @@ +/** + * \file + * + * \brief AVR functions for busy-wait delay loops + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef _CYCLE_COUNTER_H_ +#define _CYCLE_COUNTER_H_ + +#ifdef __cplusplus +extern "C" { +#endif + + +#include + +/** + * @name Convenience functions for busy-wait delay loops + * + * @def delay_cycles + * @brief Delay program execution for a specified number of CPU cycles. + * @param n number of CPU cycles to wait + * + * @def cpu_delay_ms + * @brief Delay program execution for a specified number of milliseconds. + * @param delay number of milliseconds to wait + * @param f_cpu CPU frequency in Hertz + * + * @def cpu_delay_us + * @brief Delay program execution for a specified number of microseconds. + * @param delay number of microseconds to wait + * @param f_cpu CPU frequency in Hertz + * + * @def cpu_ms_2_cy + * @brief Convert milli-seconds into CPU cycles. + * @param ms number of milliseconds + * @param f_cpu CPU frequency in Hertz + * @return the converted number of CPU cycles + * + * @def cpu_us_2_cy + * @brief Convert micro-seconds into CPU cycles. + * @param ms number of microseconds + * @param f_cpu CPU frequency in Hertz + * @return the converted number of CPU cycles + * + * @{ + */ +__always_optimize +static inline void __portable_avr_delay_cycles(unsigned long n) +{ + do { barrier(); } while (--n); +} + +#if !defined(__DELAY_CYCLE_INTRINSICS__) +# define delay_cycles __portable_avr_delay_cycles +# define cpu_ms_2_cy(ms, f_cpu) (((uint64_t)(ms) * (f_cpu) + 999) / 6e3) +# define cpu_us_2_cy(us, f_cpu) (((uint64_t)(us) * (f_cpu) + 999999ul) / 6e6) +#else +# if defined(__GNUC__) +# define delay_cycles __builtin_avr_delay_cycles +# elif defined(__ICCAVR__) +# define delay_cycles __delay_cycles +# endif +# define cpu_ms_2_cy(ms, f_cpu) (((uint64_t)(ms) * (f_cpu) + 999) / 1e3) +# define cpu_us_2_cy(us, f_cpu) (((uint64_t)(us) * (f_cpu) + 999999ul) / 1e6) +#endif + +#define cpu_delay_ms(delay, f_cpu) delay_cycles((uint64_t)cpu_ms_2_cy(delay, f_cpu)) +#define cpu_delay_us(delay, f_cpu) delay_cycles((uint64_t)cpu_us_2_cy(delay, f_cpu)) +//! @} + + +#ifdef __cplusplus +} +#endif + +#endif /* _CYCLE_COUNTER_H_ */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/docsrc/gfx_mono_overview.png b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/docsrc/gfx_mono_overview.png new file mode 100644 index 00000000..1e85b6b9 Binary files /dev/null and b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/docsrc/gfx_mono_overview.png differ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono.h new file mode 100644 index 00000000..c5488805 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono.h @@ -0,0 +1,306 @@ +/** + * \file + * + * \brief Monochrome graphic library API header file + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef GFX_MONO_H +#define GFX_MONO_H + +#include + +#include "compiler.h" +#include "progmem.h" +#ifdef CONFIG_HAVE_HUGEMEM +# include "hugemem.h" +#endif + +/** + * \defgroup gfx_mono Monochrome graphical display system + * + * See \ref gfx_mono_quickstart. + * + * This library provides an interface to drawing graphics on monochrome + * graphical displays + * + * The graphics drivers consists of the following: + * - Display driver interface (gfx_mono.h) + * - General graphics drawing primitives (gfx_mono_generic.h) + * - Display specific implementation (ex. gfx_mono_c12832_a1z.h) + * + * The generic drawing primitives is a library of functions for drawing + * graphics primitives such as lines, rectangles and circles. It uses other + * functions implemented by the display driver for drawing the primitives. The + * implementation of these functions can optionally be used by a display + * driver, but if the hardware of the display allows faster handling of any of + * the primitives, the display driver can implement it directly. + * + * The display specific drivers provides an interface to the graphical display. + * It implements the low level communication with the display hardware, putting + * pixels on the display and drawing primitives such as lines, circles and + * rectangles. Depending on the display driver implementation, drawing the + * graphics primitives might be handled by the generic graphics drawing + * primitives rather than the display driver itself. + * + * \note The functions in the library are not interrupt safe. + * @{ + */ + +typedef uint8_t gfx_mono_color_t; +typedef uint8_t gfx_coord_t; + +/** Pixel operations */ +enum gfx_mono_color { + /** Pixel is cleared */ + GFX_PIXEL_CLR = 0, + /** Pixel is set on screen (OR) */ + GFX_PIXEL_SET = 1, + /** Pixel is XORed */ + GFX_PIXEL_XOR = 2, +}; + +/** Bitmap types */ +enum gfx_mono_bitmap_type { + /** Bitmap stored in SRAM */ + GFX_MONO_BITMAP_RAM, + /** Bitmap stored in progmem */ + GFX_MONO_BITMAP_PROGMEM +}; + +/* Cannot be moved to top, as they use the bitmap and color enums. */ +#ifdef USE_SDL +# include "gfx_mono_sdl.h" +#elif defined(GFX_MONO_C12832_A1Z) +# include "gfx_mono_c12832_a1z.h" +#elif defined(GFX_MONO_UG_2832HSWEG04) +# include "gfx_mono_ug_2832hsweg04.h" +#else +/* NULL driver by default */ +# include "gfx_mono_null.h" +#endif +#include "gfx_mono_generic.h" + +/** \name Circle Sector Definitions */ +/** @{ */ + +/** Bitmask for drawing circle octant 0. */ +#define GFX_OCTANT0 (1 << 0) +/** Bitmask for drawing circle octant 1. */ +#define GFX_OCTANT1 (1 << 1) +/** Bitmask for drawing circle octant 2. */ +#define GFX_OCTANT2 (1 << 2) +/** Bitmask for drawing circle octant 3. */ +#define GFX_OCTANT3 (1 << 3) +/** Bitmask for drawing circle octant 4. */ +#define GFX_OCTANT4 (1 << 4) +/** Bitmask for drawing circle octant 5. */ +#define GFX_OCTANT5 (1 << 5) +/** Bitmask for drawing circle octant 6. */ +#define GFX_OCTANT6 (1 << 6) +/** Bitmask for drawing circle octant 7. */ +#define GFX_OCTANT7 (1 << 7) + +/** Bitmask for drawing circle quadrant 0. */ +#define GFX_QUADRANT0 (GFX_OCTANT0 | GFX_OCTANT1) +/** Bitmask for drawing circle quadrant 1. */ +#define GFX_QUADRANT1 (GFX_OCTANT2 | GFX_OCTANT3) +/** Bitmask for drawing circle quadrant 2. */ +#define GFX_QUADRANT2 (GFX_OCTANT4 | GFX_OCTANT5) +/** Bitmask for drawing circle quadrant 3. */ +#define GFX_QUADRANT3 (GFX_OCTANT6 | GFX_OCTANT7) + +/** Bitmask for drawing left half of circle. */ +#define GFX_LEFTHALF (GFX_QUADRANT3 | GFX_QUADRANT0) +/** Bitmask for drawing top half of circle. */ +#define GFX_TOPHALF (GFX_QUADRANT0 | GFX_QUADRANT1) +/** Bitmask for drawing right half of circle. */ +#define GFX_RIGHTHALF (GFX_QUADRANT1 | GFX_QUADRANT2) +/** Bitmask for drawing bottom half of circle. */ +#define GFX_BOTTOMHALF (GFX_QUADRANT2 | GFX_QUADRANT3) + +/** Bitmask for drawing whole circle. */ +#define GFX_WHOLE 0xFF + +/** @} */ + +/** \name Graphic Drawing Primitives */ +/** @{ */ + +/** + * \def gfx_mono_draw_horizontal_line(x, y, length, color) + * \brief Draw a horizontal line, one pixel wide. + * + * \param x X coordinate of leftmost pixel. + * \param y Y coordinate of the line. + * \param length Length of the line in pixels. + * \param color Pixel operation of the line. + */ + +/** + * \def gfx_mono_draw_vertical_line(x, y, length, color) + * \brief Draw a vertical line, one pixel wide. + * + * \param x X coordinate of the line. + * \param y Y coordinate of the topmost pixel. + * \param length Length of the line in pixels. + * \param color Pixel operation of the line. + */ + +/** + * \def gfx_mono_draw_line(x1, y1, x2, y2, color) + * \brief Draw a line between two arbitrary points. + * + * \param x1 Start X coordinate. + * \param y1 Start Y coordinate. + * \param x2 End X coordinate. + * \param y2 End Y coordinate. + * \param color Pixel operation of the line. + */ + +/** + * \def gfx_mono_draw_rect(x, y, width, height, color) + * \brief Draw an outline of a rectangle. + * + * \param x X coordinate of the left side. + * \param y Y coordinate of the top side. + * \param width Width of the rectangle. + * \param height Height of the rectangle. + * \param color Pixel operation of the line. + */ + +/** + * \def gfx_mono_draw_filled_rect(x, y, width, height, color) + * \brief Draw a filled rectangle. + * + * \param x X coordinate of the left side. + * \param y Y coordinate of the top side. + * \param width Width of the rectangle. + * \param height Height of the rectangle. + * \param color Pixel operation of the line + */ + +/** + * \def gfx_mono_draw_circle(x, y, radius, color, octant_mask) + * \brief Draw an outline of a circle or arc. + * + * The radius is the distance from the center to the circumference, + * which means that the total width or height of a circle will be + * (radius*2+1). + * + * The octant_mask parameter is a bitmask that decides which octants of + * the circle to draw. Use the GFX_OCTANTn, GFX_QUADRANTn, GFX_xHALF and + * GFX_WHOLE constants and OR them together if required. Radius equal to + * zero gives a single pixel. + * + * \param x X coordinate of center. + * \param y Y coordinate of center. + * \param radius Circle radius in pixels. + * \param color Pixel operation. + * \param octant_mask Bitmask indicating which octants to draw. + */ + +/** + * \def gfx_mono_draw_filled_circle(x, y, radius, color, quadrant_mask) + * \brief Draw a filled circle or sector. + * + * The radius is the distance from the center to the circumference, + * which means that the total width or height of a circle will be + * (radius*2+1). + * + * The quadrant_mask parameter is a bitmask that decides which quadrants + * of the circle to draw. Use the GFX_QUADRANTn, GFX_xHALF and + * GFX_WHOLE constants and OR them together if required. Radius equal to + * zero gives a single pixel. + * + * \note This function only supports quadrants while gfx_draw_circle() + * supports octants. This is to improve performance on drawing + * filled circles. + * + * \param x X coordinate of center. + * \param y Y coordinate of center. + * \param radius Circle radius in pixels. + * \param color Pixel operation. + * \param quadrant_mask Bitmask indicating which quadrants to draw. + */ + +/** @} */ + +/** @} */ + +/** + * \page gfx_mono_quickstart Quick Start Guide for the mono graphics service + * + * This is the quick start guide for the \ref gfx_mono "Monochrome Graphics service", + * with step-by-step instructions on how to configure and use it for a specific + * use case. + * + * \section gfx_mono_quickstart_basic Basic usage of the graphics service + * This use case will demonstrate initializing the mono graphics service and + * then draw a black line on the screen from coordinates X=10, Y=10 to X=20, + * Y=20. + * + * \section gfx_mono_basic_usage Usage steps + * \subsection gfx_mono_basic_usage_code Example code + * Add to, e.g., the main function in the application C-file: + * \code + board_init(); + sysclk_init(); + gfx_mono_init(); + gfx_mono_draw_line(10, 10, 20, 20, GFX_PIXEL_SET); +\endcode + * + * \subsection gfx_mono_basic_usage Workflow + * -# Initialize board IO: + * - \code board_init(); \endcode + * -# Initialize clocks: + * - \code sysclk_init(); \endcode + * -# Initialize monochrome graphics service + * - \code gfx_mono_init(); \endcode + * - \note This will call the init function for the low level display + * controller driver and intialize the screen to a cleared background. + * -# Draw a line from 10,10 to 20,20: + * - \code gfx_mono_draw_line(10, 10, 20, 20, GFX_PIXEL_SET); \endcode + * - \note This uses GFX_PIXEL_SET to set the display pixels on the line; + * other options can be found in \ref gfx_mono_color. + */ + +#endif /* GFX_MONO_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.c b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.c new file mode 100644 index 00000000..ba3758c5 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.c @@ -0,0 +1,369 @@ +/** + * \file + * + * \brief Haven Display C12832 A1Z display glue code for display controller + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#include "gfx_mono_c12832_a1z.h" + +/* If we are using a serial interface without readback, use framebuffer */ +#ifdef ST7565R_SERIAL_INTERFACE +# define CONFIG_ST7565R_FRAMEBUFFER +#endif + +#ifdef CONFIG_ST7565R_FRAMEBUFFER +static uint8_t framebuffer[GFX_MONO_LCD_FRAMEBUFFER_SIZE]; +#endif + +/** + * \brief Initialize ST7565R controller and LCD display. + * It will also write the graphic controller RAM to all zeroes. + * + * \note This function will clear the contents of the display. + */ +void gfx_mono_st7565r_init(void) +{ + uint8_t page; + uint8_t column; + +#ifdef CONFIG_ST7565R_FRAMEBUFFER + gfx_mono_set_framebuffer(framebuffer); +#endif + + /* Initialize the low-level display controller. */ + st7565r_init(); + + /* Set display to output data from line 0 */ + st7565r_set_display_start_line_address(0); + + /* Clear the contents of the display. + * If using a framebuffer (SPI interface) it will both clear the + * controller memory and the framebuffer. + */ + for (page = 0; page < GFX_MONO_LCD_PAGES; page++) { + for (column = 0; column < GFX_MONO_LCD_WIDTH; column++) { + gfx_mono_put_byte(page, column, 0x00); + } + } +} + +/** + * \brief Put framebuffer to LCD controller + * + * This function will output the complete framebuffer from RAM to the + * LCD controller. + * + * \note This is done automatically if using the graphic primitives. Only + * needed if you are manipulating the framebuffer directly in your code. + */ +void gfx_mono_st7565r_put_framebuffer(void) +{ + uint8_t page; + + for (page = 0; page < GFX_MONO_LCD_PAGES; page++) { + st7565r_set_page_address(page); + st7565r_set_column_address(0); + gfx_mono_st7565r_put_page(framebuffer + + (page * GFX_MONO_LCD_WIDTH), page, 0, + GFX_MONO_LCD_WIDTH); + } +} + +/** + * \brief Draw pixel to screen + * + * \param x X coordinate of the pixel + * \param y Y coordinate of the pixel + * \param color Pixel operation + * + * The following will set the pixel at x=10,y=10: + * \code + gfx_mono_st7565r_draw_pixel(10, 10, GFX_PIXEL_SET); +\endcode + * The following example will clear the pixel at x=10,y=10: + * \code + gfx_mono_st7565r_draw_pixel(10, 10, GFX_PIXEL_CLR); +\endcode + * And the following will toggle the pixel at x=10,y=10: + * \code + gfx_mono_st7565r_draw_pixel(10, 10, GFX_PIXEL_XOR); +\endcode + */ +void gfx_mono_st7565r_draw_pixel(gfx_coord_t x, gfx_coord_t y, + gfx_coord_t color) +{ + uint8_t page; + uint8_t pixel_mask; + uint8_t pixel_value; + + /* Discard pixels drawn outside the screen */ + if ((x > GFX_MONO_LCD_WIDTH - 1) || (y > GFX_MONO_LCD_HEIGHT - 1)) { + return; + } + + page = y / GFX_MONO_LCD_PIXELS_PER_BYTE; + pixel_mask = (1 << (y - (page * 8))); + + /* + * Read the page containing the pixel in interest, then perform the + * requested action on this pixel before writing the page back to the + * display. + */ + pixel_value = gfx_mono_get_byte(page, x); + + switch (color) { + case GFX_PIXEL_SET: + pixel_value |= pixel_mask; + break; + + case GFX_PIXEL_CLR: + pixel_value &= ~pixel_mask; + break; + + case GFX_PIXEL_XOR: + pixel_value ^= pixel_mask; + break; + + default: + break; + } + + gfx_mono_put_byte(page, x, pixel_value); +} + +/** + * \brief Get the pixel value at x,y + * + * \param x X coordinate of pixel + * \param y Y coordinate of pixel + * \return Non zero value if pixel is set. + * + * The following example will read the pixel value from x=10,y=10: + * \code + pixelval = gfx_mono_st7565r_get_pixel(10,10); +\endcode + */ +uint8_t gfx_mono_st7565r_get_pixel(gfx_coord_t x, gfx_coord_t y) +{ + uint8_t page; + uint8_t pixel_mask; + + if ((x > GFX_MONO_LCD_WIDTH - 1) || (y > GFX_MONO_LCD_HEIGHT - 1)) { + return 0; + } + + page = y / GFX_MONO_LCD_PIXELS_PER_BYTE; + pixel_mask = (1 << (y - (page * 8))); + + return gfx_mono_get_byte(page, x) & pixel_mask; +} + +/** + * \brief Put a page from RAM to display controller. + * + * If the controller is accessed by the SPI interface, we can not read + * back data from the LCD controller RAM. Because of this all data that is + * written to the LCD controller in this mode is also written to a framebuffer + * in MCU RAM. + * + * \param data Pointer to data to be written + * \param page Page address + * \param column Offset into page (x coordinate) + * \param width Number of bytes to be written. + * + * The following example will write 32 bytes from data_buf to the page 0, + * column 10. This will place data_buf in the rectangle x1=10,y1=0,x2=42,y2=8 + * (10 pixels from the upper left corner of the screen): + * \code + gfx_mono_st7565r_put_page(data_buf, 0, 10, 32); +\endcode + */ +void gfx_mono_st7565r_put_page(gfx_mono_color_t *data, gfx_coord_t page, + gfx_coord_t column, gfx_coord_t width) +{ +#ifdef CONFIG_ST7565R_FRAMEBUFFER + gfx_mono_framebuffer_put_page(data, page, column, width); +#endif + st7565r_set_page_address(page); + st7565r_set_column_address(column); + + do { + st7565r_write_data(*data++); + } while (--width); +} + +/** + * \brief Read a page from the LCD controller + * + * If the LCD controller is accessed by the SPI interface we cannot read + * data directly from the controller. In that case we will read the data from + * the local framebuffer instead. + * + * \param data Pointer where to store the read data + * \param page Page address + * \param column Offset into page (x coordinate) + * \param width Number of bytes to be read + * + * The following example will read back the first 128 bytes (first page) from + * the display memory: + * \code + gfx_mono_st7565r_get_page(read_buffer, 0, 0, 128); +\endcode + */ +void gfx_mono_st7565r_get_page(gfx_mono_color_t *data, gfx_coord_t page, + gfx_coord_t column, gfx_coord_t width) +{ +#ifdef CONFIG_ST7565R_FRAMEBUFFER + gfx_mono_framebuffer_get_page(data, page, column, width); +#else + st7565r_set_page_address(page); + st7565r_set_column_address(column); + + do { + *data++ = st7565r_read_data(); + } while (--width); +#endif +} + +/** + * \brief Put a byte to the display controller RAM + * + * If the LCD controller is accessed by the SPI interface we will also put the + * data to the local framebuffer. + * + * \param page Page address + * \param column Page offset (x coordinate) + * \param data Data to be written + * + * This example will put the value 0xFF to the first byte in the display memory + * setting a 8 pixel high column of pixels in the upper left corner of the + * display. + * \code + gfx_mono_st7565r_put_byte(0, 0, 0xFF); +\endcode + */ +void gfx_mono_st7565r_put_byte(gfx_coord_t page, gfx_coord_t column, + uint8_t data) +{ +#ifdef CONFIG_ST7565R_FRAMEBUFFER + gfx_mono_framebuffer_put_byte(page, column, data); +#endif + + st7565r_set_page_address(page); + st7565r_set_column_address(column); + + st7565r_write_data(data); +} + +/** + * \brief Get a byte from the display controller RAM + * + * If the LCD controller is accessed by the SPI interface we cannot read the + * data. In this case return the data from the local framebuffer instead. + * + * \param page Page address + * \param column Page offset (x coordinate) + * \return data from LCD controller or framebuffer. + * + * The following code will read the first byte from the display memory or the + * local framebuffer if direct read is not possible. The data represents the + * pixels from x = 0 and y = 0 to y = 7. + * \code + data = gfx_mono_st7565r_get_byte(0, 0); +\endcode + */ +uint8_t gfx_mono_st7565r_get_byte(gfx_coord_t page, gfx_coord_t column) +{ +#ifdef CONFIG_ST7565R_FRAMEBUFFER + return gfx_mono_framebuffer_get_byte(page, column); + +#else + st7565r_set_page_address(page); + st7565r_set_column_address(column); + + return st7565r_read_data(); + +#endif +} + +/** + * \brief Read/Modify/Write a byte on the display controller + * + * This function will read the byte from the display controller (or the + * framebuffer if we cannot read directly from the controller) and + * do a mask operation on the byte according to the pixel operation selected + * by the color argument and the pixel mask provided. + * + * \param page Page address + * \param column Page offset (x coordinate) + * \param pixel_mask Mask for pixel operation + * \param color Pixel operation + * + * A small example that will XOR the first byte of display memory with 0xAA + * \code + gfx_mono_st7565r_mask_byte(0,0,0xAA,GFX_PIXEL_XOR); +\endcode + */ +void gfx_mono_st7565r_mask_byte(gfx_coord_t page, gfx_coord_t column, + gfx_mono_color_t pixel_mask, gfx_mono_color_t color) +{ + gfx_mono_color_t temp = gfx_mono_get_byte(page, column); + + switch (color) { + case GFX_PIXEL_SET: + temp |= pixel_mask; + break; + + case GFX_PIXEL_CLR: + temp &= ~pixel_mask; + break; + + case GFX_PIXEL_XOR: + temp ^= pixel_mask; + break; + + default: + break; + } + + gfx_mono_put_byte(page, column, temp); +} diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.h new file mode 100644 index 00000000..1fe5acff --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_c12832_a1z.h @@ -0,0 +1,158 @@ +/** + * \file + * + * \brief Haven Display C12832 A1Z display glue code for display controller + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef GFX_MONO_C12832_A1Z_H +#define GFX_MONO_C12832_A1Z_H +#include "compiler.h" +#include "st7565r.h" + +#include "gfx_mono.h" +#include "gfx_mono_framebuffer.h" + +/** + * \ingroup gfx_mono + * \defgroup gfx_mono_C12832_A1Z_group C12832_A1Z graphic library abstraction + * + * This module is an abstraction layer between the graphic library and the + * C12832_A1Z monochrome LCD display connected to a ST7565R LCD controller. + * + * As the controller does not provide any hardware accelerated graphic, all the + * graphic primitives are provided by the \ref gfx_mono_generic_group service. + * + * \note Do not call the gfx_mono_st7565r_ functions directly. use the gfx_mono + * names that are defined in this header and documented in \ref gfx_mono . + * Ie. gfx_mono_draw_pixel() should be used, not gfx_mono_st7565r_draw_pixel() + * @{ + */ + +#define GFX_MONO_LCD_WIDTH 128 +#define GFX_MONO_LCD_HEIGHT 32 +#define GFX_MONO_LCD_PIXELS_PER_BYTE 8 +#define GFX_MONO_LCD_PAGES (GFX_MONO_LCD_HEIGHT / \ + GFX_MONO_LCD_PIXELS_PER_BYTE) +#define GFX_MONO_LCD_FRAMEBUFFER_SIZE ((GFX_MONO_LCD_WIDTH * \ + GFX_MONO_LCD_HEIGHT) / GFX_MONO_LCD_PIXELS_PER_BYTE) + +#define gfx_mono_draw_horizontal_line(x, y, length, color) \ + gfx_mono_generic_draw_horizontal_line(x, y, length, color) + +#define gfx_mono_draw_vertical_line(x, y, length, color) \ + gfx_mono_generic_draw_vertical_line(x, y, length, color) + +#define gfx_mono_draw_line(x1, y1, x2, y2, color) \ + gfx_mono_generic_draw_line(x1, y1, x2, y2, color) + +#define gfx_mono_draw_rect(x, y, width, height, color) \ + gfx_mono_generic_draw_rect(x, y, width, height, color) + +#define gfx_mono_draw_filled_rect(x, y, width, height, color) \ + gfx_mono_generic_draw_filled_rect(x, y, width, height, \ + color) + +#define gfx_mono_draw_circle(x, y, radius, color, octant_mask) \ + gfx_mono_generic_draw_circle(x, y, radius, color, \ + octant_mask) + +#define gfx_mono_draw_filled_circle(x, y, radius, color, quadrant_mask) \ + gfx_mono_generic_draw_filled_circle(x, y, radius, \ + color, quadrant_mask) + +#define gfx_mono_put_bitmap(bitmap, x, y) \ + gfx_mono_generic_put_bitmap(bitmap, x, y) + +#define gfx_mono_draw_pixel(x, y, color) \ + gfx_mono_st7565r_draw_pixel(x, y, color) + +#define gfx_mono_get_pixel(x, y) \ + gfx_mono_st7565r_get_pixel(x, y) + +#define gfx_mono_init() \ + gfx_mono_st7565r_init() + +#define gfx_mono_put_page(data, page, column, width) \ + gfx_mono_st7565r_put_page(data, page, column, width) + +#define gfx_mono_get_page(data, page, column, width) \ + gfx_mono_st7565r_get_page(data, page, column, width) + +#define gfx_mono_put_byte(page, column, data) \ + gfx_mono_st7565r_put_byte(page, column, data) + +#define gfx_mono_get_byte(page, column) \ + gfx_mono_st7565r_get_byte(page, column) + +#define gfx_mono_mask_byte(page, column, pixel_mask, color) \ + gfx_mono_st7565r_mask_byte(page, column, pixel_mask, color) + +#define gfx_mono_put_framebuffer() \ + gfx_mono_st7565r_put_framebuffer() + +void gfx_mono_st7565r_put_framebuffer(void); + +void gfx_mono_st7565r_put_page(gfx_mono_color_t *data, gfx_coord_t page, + gfx_coord_t page_offset, gfx_coord_t width); + +void gfx_mono_st7565r_get_page(gfx_mono_color_t *data, gfx_coord_t page, + gfx_coord_t page_offset, gfx_coord_t width); + +void gfx_mono_st7565r_init(void); + +void gfx_mono_st7565r_draw_pixel(gfx_coord_t x, gfx_coord_t y, + gfx_mono_color_t color); + +uint8_t gfx_mono_st7565r_get_pixel(gfx_coord_t x, gfx_coord_t y); + +void gfx_mono_st7565r_put_byte(gfx_coord_t page, gfx_coord_t column, + uint8_t data); + +uint8_t gfx_mono_st7565r_get_byte(gfx_coord_t page, gfx_coord_t column); + +void gfx_mono_st7565r_mask_byte(gfx_coord_t page, gfx_coord_t column, + gfx_mono_color_t pixel_mask, gfx_mono_color_t color); + +/** @} */ + +#endif /* GFX_MONO_C12832_A1Z_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.c b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.c new file mode 100644 index 00000000..4a1d2939 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.c @@ -0,0 +1,265 @@ +/** + * \file + * + * \brief Local framebuffer + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#include "gfx_mono_framebuffer.h" + +/* Pointer to the framebuffer; updated by the gfx_mono_set_framebuffer function */ +static uint8_t *fbpointer; + +/* \brief Set the LCD framebuffer. + * + * \param framebuffer A pointer to an allocated area of RAM that can hold the + * framebuffer. + * + * A small example: + * \code + uint8_t framebuffer[FRAMEBUFFER_SIZE]; + gfx_mono_set_framebuffer(framebuffer); +\endcode + */ +void gfx_mono_set_framebuffer(uint8_t *framebuffer) +{ + fbpointer = framebuffer; +} + +/** + * \brief Put a page from RAM to the framebuffer + * + * \param data Pointer to data to be written + * \param page Page address + * \param column Offset into page (x coordinate) + * \param width Number of bytes to be written. + * + * The following example will write 32 bytes from data_buf to the page 0, + * column 10 (byte 10 to 42 in the framebuffer). + * \code + gfx_mono_framebuffer_put_page(data_buf, 0, 10, 32); +\endcode + */ +void gfx_mono_framebuffer_put_page(gfx_mono_color_t *data, gfx_coord_t page, + gfx_coord_t column, gfx_coord_t width) +{ + gfx_mono_color_t *data_pt = data; + gfx_coord_t *framebuffer_pt = fbpointer + + ((page * GFX_MONO_LCD_WIDTH) + column); + + do { + *framebuffer_pt++ = *data_pt++; + } while (--width > 0); +} + +/** + * \brief Read a page from the framebuffer + * + * \param data Pointer where to store the read data + * \param page Page address + * \param column Offset into page (x coordinate) + * \param width Number of bytes to be read + * + * The following example will read back the first 128 bytes (first page) from + * the framebuffer: + * \code + gfx_mono_framebuffer_get_page(read_buffer, 0, 0, 128); +\endcode + */ +void gfx_mono_framebuffer_get_page(gfx_mono_color_t *data, gfx_coord_t page, \ + gfx_coord_t column, gfx_coord_t width) +{ + gfx_coord_t *framebuffer_pt = fbpointer + + ((page * GFX_MONO_LCD_WIDTH) + column); + do { + *data++ = *framebuffer_pt++; + } while (--width > 0); +} + +/** + * \brief Draw pixel to framebuffer + * + * \param x X coordinate of the pixel + * \param y Y coordinate of the pixel + * \param color Pixel operation + * + */ +void gfx_mono_framebuffer_draw_pixel(gfx_coord_t x, gfx_coord_t y, + gfx_mono_color_t color) +{ + uint8_t page; + uint8_t pixel_mask; + uint8_t pixel_value; + + /* Discard pixels drawn outside the screen */ + if ((x > GFX_MONO_LCD_WIDTH - 1) || (y > GFX_MONO_LCD_HEIGHT - 1)) { + return; + } + + page = y / GFX_MONO_LCD_PIXELS_PER_BYTE; + pixel_mask = (1 << (y - (page * 8))); + + /* + * Read the page containing the pixel in interest, then perform the + * requested action on this pixel before writing the page back to the + * display. + */ + pixel_value = gfx_mono_framebuffer_get_byte(page, x); + + switch (color) { + case GFX_PIXEL_SET: + pixel_value |= pixel_mask; + break; + + case GFX_PIXEL_CLR: + pixel_value &= ~pixel_mask; + break; + + case GFX_PIXEL_XOR: + pixel_value ^= pixel_mask; + break; + + default: + break; + } + + gfx_mono_framebuffer_put_byte(page, x, pixel_value); +} + +/** + * \brief Get the pixel value at x,y in framebuffer + * + * \param x X coordinate of pixel + * \param y Y coordinate of pixel + * \return Non zero value if pixel is set. + * + */ +uint8_t gfx_mono_framebuffer_get_pixel(gfx_coord_t x, gfx_coord_t y) +{ + uint8_t page; + uint8_t pixel_mask; + + if ((x > GFX_MONO_LCD_WIDTH - 1) || (y > GFX_MONO_LCD_HEIGHT - 1)) { + return 0; + } + + page = y / GFX_MONO_LCD_PIXELS_PER_BYTE; + pixel_mask = (1 << (y - (page * 8))); + + return gfx_mono_framebuffer_get_byte(page, x) & pixel_mask; +} + +/** + * \brief Put a byte to the framebuffer + * + * \param page Page address + * \param column Page offset (x coordinate) + * \param data Data to be written + * + * This example will put the value 0xFF to the first byte in the framebuffer + * \code + gfx_mono_framebuffer_put_byte(0, 0, 0xFF); +\endcode + */ +void gfx_mono_framebuffer_put_byte(gfx_coord_t page, gfx_coord_t column, + uint8_t data) +{ + *(fbpointer + (page * GFX_MONO_LCD_WIDTH) + column) = data; +} + +/** + * \brief Get a byte from the framebuffer + * + * \param page Page address + * \param column Page offset (x coordinate) + * \return data from LCD controller or framebuffer. + * + * The following code will read the first byte of the framebuffer + * \code + data = gfx_mono_framebuffer_get_byte(0, 0); +\endcode + */ +uint8_t gfx_mono_framebuffer_get_byte(gfx_coord_t page, gfx_coord_t column) +{ + return *(fbpointer + (page * GFX_MONO_LCD_WIDTH) + column); +} + +/** + * \brief Read/Modify/Write a byte in the framebuffer + * + * This function will read the byte from the framebuffer and + * do a mask operation on the byte according to the pixel operation selected + * by the color argument and the pixel mask provided. + * + * \param page Page address + * \param column Page offset (x coordinate) + * \param pixel_mask Mask for pixel operation + * \param color Pixel operation + * + * A small example that will XOR the first byte of the framebuffer with 0xAA + * \code + gfx_mono_framebuffer_mask_byte(0,0,0xAA,GFX_PIXEL_XOR); +\endcode + */ +void gfx_mono_framebuffer_mask_byte(gfx_coord_t page, gfx_coord_t column, + gfx_mono_color_t pixel_mask, gfx_mono_color_t color) +{ + gfx_mono_color_t temp; + + temp = gfx_mono_get_byte(page, column); + + switch (color) { + case GFX_PIXEL_SET: + temp |= pixel_mask; + break; + + case GFX_PIXEL_CLR: + temp &= ~pixel_mask; + break; + + case GFX_PIXEL_XOR: + temp ^= pixel_mask; + break; + } + + gfx_mono_put_byte(page, column, temp); +} diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.h new file mode 100644 index 00000000..a3118409 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_framebuffer.h @@ -0,0 +1,87 @@ +/** + * \file + * + * \brief Monochrome graphic library framebuffer device + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef GFX_MONO_FRAMEBUFFER +#define GFX_MONO_FRAMEBUFFER + +#include "gfx_mono.h" + +/** + * \ingroup gfx_mono + * \defgroup gfx_mono_framebuffer_group Framebuffer + * + * This module provides read/write from and to a framebuffer in RAM. This is + * needed when using a controller that does not provide a way to read back data + * from the LCD controller memory. In this case we need to buffer the data in + * a local framebuffer to allow manipulation on pixel level. It is generally + * not recommended to access the framebuffer directly; this is handled by the + * graphic driver when needed. + * + * @{ + */ + +void gfx_mono_set_framebuffer(uint8_t *framebuffer); + +void gfx_mono_framebuffer_put_page(gfx_mono_color_t *data, gfx_coord_t page, + gfx_coord_t page_offset, gfx_coord_t width); + +void gfx_mono_framebuffer_get_page(gfx_mono_color_t *data, gfx_coord_t page, + gfx_coord_t page_offset, gfx_coord_t width); + +void gfx_mono_framebuffer_draw_pixel(gfx_coord_t x, gfx_coord_t y, + gfx_mono_color_t color); + +uint8_t gfx_mono_framebuffer_get_pixel(gfx_coord_t x, gfx_coord_t y); + +void gfx_mono_framebuffer_put_byte(gfx_coord_t page, gfx_coord_t column, + uint8_t data); + +uint8_t gfx_mono_framebuffer_get_byte(gfx_coord_t page, gfx_coord_t column); + +void gfx_mono_framebuffer_mask_byte(gfx_coord_t page, gfx_coord_t column, + gfx_mono_color_t pixel_mask, gfx_mono_color_t color); + +/** @} */ +#endif /* GFX_MONO_FRAMEBUFFER */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_generic.c b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_generic.c new file mode 100644 index 00000000..38e98345 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_generic.c @@ -0,0 +1,506 @@ +/** + * \file + * + * \brief Generic monochrome LCD graphic primitives + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +/** + * \ingroup gfx_mono_generic_group + * @{ + */ +/* + * Support and FAQ: visit Atmel Support + */ +#include "gfx_mono_generic.h" + +/** + * \brief Draw a horizontal line, one pixel wide (generic implementation) + * + * \note This function does a very simple bounds checking that does not + * check if the line is placed outside the screen. If you supply an + * x- or y-coordinate outside the display the behaviour is undefined, + * and you risk overwriting portions of internal SRAM. + * + * \param x X coordinate of leftmost pixel. + * \param y Y coordinate of the line. + * \param length Length of the line in pixels. + * \param color Pixel operation of the line. + */ +void gfx_mono_generic_draw_horizontal_line(gfx_coord_t x, gfx_coord_t y, + gfx_coord_t length, enum gfx_mono_color color) +{ + uint8_t page; + uint8_t pixelmask; + uint8_t temp; + + /* Clip line length if too long */ + if (x + length > GFX_MONO_LCD_WIDTH) { + length = GFX_MONO_LCD_WIDTH - x; + } + + page = y / 8; + pixelmask = (1 << (y - (page * 8))); + + if (length == 0) { + /* Nothing to do. Move along. */ + return; + } + + switch (color) { + case GFX_PIXEL_SET: + while (length-- > 0) { + temp = gfx_mono_get_byte(page, x + length); + temp |= pixelmask; + gfx_mono_put_byte(page, x + length, temp); + } + break; + + case GFX_PIXEL_CLR: + while (length-- > 0) { + temp = gfx_mono_get_byte(page, x + length); + temp &= ~pixelmask; + gfx_mono_put_byte(page, x + length, temp); + } + break; + + case GFX_PIXEL_XOR: + while (length-- > 0) { + temp = gfx_mono_get_byte(page, x + length); + temp ^= pixelmask; + gfx_mono_put_byte(page, x + length, temp); + } + break; + + default: + break; + } +} + +/** + * \brief Draw a vertical line, one pixel wide (generic implementation) + * + * \note This function does a very simple bounds checking that does not + * check if the line is placed outside the screen. If you supply an + * x- or y-coordinate outside the display the behaviour is undefined, + * and you risk overwriting portions of internal SRAM. + * + * \param x X coordinate of the line. + * \param y Y coordinate of the topmost pixel. + * \param length Length of the line in pixels. + * \param color Pixel operation of the line. + */ +void gfx_mono_generic_draw_vertical_line(gfx_coord_t x, gfx_coord_t y, + gfx_coord_t length, enum gfx_mono_color color) +{ + if (length == 0) { + return; + } + + gfx_coord_t y2 = y + length - 1; + + if (y == y2) { + gfx_mono_draw_pixel(x, y, color); + return; + } + + if (y2 >= GFX_MONO_LCD_HEIGHT - 1) { + y2 = GFX_MONO_LCD_HEIGHT - 1; + } + + gfx_coord_t y1page = y / 8; + gfx_coord_t y2page = y2 / 8; + + uint8_t y1bitpos = y & 0x07; + uint8_t y2bitpos = y2 & 0x07; + + uint8_t y1pixelmask = 0xFF << y1bitpos; + uint8_t y2pixelmask = 0xFF >> (7 - y2bitpos); + + /* The pixels are on the same page; combine masks */ + if (y1page == y2page) { + uint8_t pixelmask = y1pixelmask & y2pixelmask; + gfx_mono_mask_byte(y1page, x, pixelmask, color); + } else { + gfx_mono_mask_byte(y1page, x, y1pixelmask, color); + + while (++y1page < y2page) { + gfx_mono_mask_byte(y1page, x, 0xFF, color); + } + + gfx_mono_mask_byte(y2page, x, y2pixelmask, color); + } +} + +/** + * \brief Draw a line between two arbitrary points (generic implementation). + * + * \param x1 Start X coordinate. + * \param y1 Start Y coordinate. + * \param x2 End X coordinate. + * \param y2 End Y coordinate. + * \param color Pixel operation of the line. + */ +void gfx_mono_generic_draw_line(gfx_coord_t x1, gfx_coord_t y1, + gfx_coord_t x2, gfx_coord_t y2, + enum gfx_mono_color color) +{ + uint8_t i; + uint8_t x; + uint8_t y; + int8_t xinc; + int8_t yinc; + int8_t dx; + int8_t dy; + int8_t e; + + /* swap x1,y1 with x2,y2 */ + if (x1 > x2) { + dx = x1; + x1 = x2; + x2 = dx; + dy = y1; + y1 = y2; + y2 = dy; + } + + dx = x2 - x1; + dy = y2 - y1; + + x = x1; + y = y1; + + if (dx < 0) { + xinc = -1; + dx = -dx; + } else { + xinc = 1; + } + + if (dy < 0) { + yinc = -1; + dy = -dy; + } else { + yinc = 1; + } + + if (dx > dy) { + e = dy - dx; + for (i = 0; i <= dx; i++) { + gfx_mono_draw_pixel(x, y, color); + if (e >= 0) { + e -= dx; + y += yinc; + } + + e += dy; + x += xinc; + } + } else { + e = dx - dy; + for (i = 0; i <= dy; i++) { + gfx_mono_draw_pixel(x, y, color); + if (e >= 0) { + e -= dy; + x += xinc; + } + + e += dx; + y += yinc; + } + } +} + +/** + * \brief Draw an outline of a rectangle (generic implementation). + * + * \param x X coordinate of the left side. + * \param y Y coordinate of the top side. + * \param width Width of the rectangle. + * \param height Height of the rectangle. + * \param color Pixel operation of the line. + */ +void gfx_mono_generic_draw_rect(gfx_coord_t x, gfx_coord_t y, + gfx_coord_t width, gfx_coord_t height, + enum gfx_mono_color color) +{ + gfx_mono_draw_horizontal_line(x, y, width, color); + gfx_mono_draw_horizontal_line(x, y + height - 1, width, color); + + gfx_mono_draw_vertical_line(x, y, height, color); + gfx_mono_draw_vertical_line(x + width - 1, y, height, color); +} + +/** + * \brief Draw a filled rectangle (generic implementation). + * + * \param x X coordinate of the left side. + * \param y Y coordinate of the top side. + * \param width Width of the rectangle. + * \param height Height of the rectangle. + * \param color Pixel operation of the line + */ +void gfx_mono_generic_draw_filled_rect(gfx_coord_t x, gfx_coord_t y, + gfx_coord_t width, gfx_coord_t height, + enum gfx_mono_color color) +{ + if (height == 0) { + /* Nothing to do. Move along. */ + return; + } + + while (height-- > 0) { + gfx_mono_draw_horizontal_line(x, y + height, width, color); + } +} + +/** + * \brief Draw an outline of a circle or arc (generic implementation). + * + * The radius is the distance from the center to the circumference, + * which means that the total width or height of a circle will be + * (radius*2+1). + * + * The octant_mask parameter is a bitmask that decides which octants of + * the circle to draw. Use the GFX_OCTANTn, GFX_QUADRANTn, GFX_xHALF and + * GFX_WHOLE constants and OR them together if required. Radius equal to + * zero gives a single pixel. + * + * \param x X coordinate of center. + * \param y Y coordinate of center. + * \param radius Circle radius in pixels. + * \param color Pixel operation. + * \param octant_mask Bitmask indicating which octants to draw. + */ +void gfx_mono_generic_draw_circle(gfx_coord_t x, gfx_coord_t y, + gfx_coord_t radius, enum gfx_mono_color color, + uint8_t octant_mask) +{ + gfx_coord_t offset_x; + gfx_coord_t offset_y; + int16_t error; + + /* Draw only a pixel if radius is zero. */ + if (radius == 0) { + gfx_mono_draw_pixel(x, y, color); + return; + } + + /* Set up start iterators. */ + offset_x = 0; + offset_y = radius; + error = 3 - 2 * radius; + + /* Iterate offsetX from 0 to radius. */ + while (offset_x <= offset_y) { + /* Draw one pixel for each octant enabled in octant_mask. */ + if (octant_mask & GFX_OCTANT0) { + gfx_mono_draw_pixel(x + offset_y, y - offset_x, color); + } + + if (octant_mask & GFX_OCTANT1) { + gfx_mono_draw_pixel(x + offset_x, y - offset_y, color); + } + + if (octant_mask & GFX_OCTANT2) { + gfx_mono_draw_pixel(x - offset_x, y - offset_y, color); + } + + if (octant_mask & GFX_OCTANT3) { + gfx_mono_draw_pixel(x - offset_y, y - offset_x, color); + } + + if (octant_mask & GFX_OCTANT4) { + gfx_mono_draw_pixel(x - offset_y, y + offset_x, color); + } + + if (octant_mask & GFX_OCTANT5) { + gfx_mono_draw_pixel(x - offset_x, y + offset_y, color); + } + + if (octant_mask & GFX_OCTANT6) { + gfx_mono_draw_pixel(x + offset_x, y + offset_y, color); + } + + if (octant_mask & GFX_OCTANT7) { + gfx_mono_draw_pixel(x + offset_y, y + offset_x, color); + } + + /* Update error value and step offset_y when required. */ + if (error < 0) { + error += ((offset_x << 2) + 6); + } else { + error += (((offset_x - offset_y) << 2) + 10); + --offset_y; + } + + /* Next X. */ + ++offset_x; + } +} + +/** + * \brief Draw a filled circle or sector (generic implementation). + * + * The radius is the distance from the center to the circumference, + * which means that the total width or height of a circle will be + * (radius*2+1). + * + * The quadrant_mask parameter is a bitmask that decides which quadrants + * of the circle to draw. Use the GFX_QUADRANTn, GFX_xHALF and + * GFX_WHOLE constants and OR them together if required. Radius equal to + * zero gives a single pixel. + * + * \note This function only supports quadrants while gfx_draw_circle() + * supports octants. This is to improve performance on drawing + * filled circles. + * + * \param x X coordinate of center. + * \param y Y coordinate of center. + * \param radius Circle radius in pixels. + * \param color Pixel operation. + * \param quadrant_mask Bitmask indicating which quadrants to draw. + */ +void gfx_mono_generic_draw_filled_circle(gfx_coord_t x, gfx_coord_t y, + gfx_coord_t radius, enum gfx_mono_color color, + uint8_t quadrant_mask) +{ + gfx_coord_t offset_x; + gfx_coord_t offset_y; + int16_t error; + + /* Draw only a pixel if radius is zero. */ + if (radius == 0) { + gfx_mono_draw_pixel(x, y, color); + return; + } + + /* Set up start iterators. */ + offset_x = 0; + offset_y = radius; + error = 3 - 2 * radius; + + /* Iterate offset_x from 0 to radius. */ + while (offset_x <= offset_y) { + /* Draw vertical lines tracking each quadrant. */ + if (quadrant_mask & GFX_QUADRANT0) { + gfx_mono_draw_vertical_line(x + offset_y, + y - offset_x, offset_x + 1, color); + gfx_mono_draw_vertical_line(x + offset_x, + y - offset_y, offset_y + 1, color); + } + + if (quadrant_mask & GFX_QUADRANT1) { + gfx_mono_draw_vertical_line(x - offset_y, + y - offset_x, offset_x + 1, color); + gfx_mono_draw_vertical_line(x - offset_x, + y - offset_y, offset_y + 1, color); + } + + if (quadrant_mask & GFX_QUADRANT2) { + gfx_mono_draw_vertical_line(x - offset_y, + y, offset_x + 1, color); + gfx_mono_draw_vertical_line(x - offset_x, + y, offset_y + 1, color); + } + + if (quadrant_mask & GFX_QUADRANT3) { + gfx_mono_draw_vertical_line(x + offset_y, + y, offset_x + 1, color); + gfx_mono_draw_vertical_line(x + offset_x, + y, offset_y + 1, color); + } + + /* Update error value and step offset_y when required. */ + if (error < 0) { + error += ((offset_x << 2) + 6); + } else { + error += (((offset_x - offset_y) << 2) + 10); + --offset_y; + } + + /* Next X. */ + ++offset_x; + } +} + +/** + * \brief Put bitmap from FLASH or RAM to display + * + * This function will output bitmap data from FLASH or RAM. + * The bitmap y-coordinate will be aligned with display pages, rounded down. + * Ie: placing a bitmap at x=10, y=5 will put the bitmap at x = 10,y = 0 and + * placing a bitmap at x = 10, y = 10 will put the bitmap at x = 10, y = 8 + * + */ +void gfx_mono_generic_put_bitmap(struct gfx_mono_bitmap *bitmap, gfx_coord_t x, + gfx_coord_t y) +{ + gfx_coord_t num_pages = bitmap->height / 8; + gfx_coord_t page = y / 8; + gfx_coord_t column; + gfx_coord_t i; + gfx_mono_color_t temp; + + switch (bitmap->type) { + case GFX_MONO_BITMAP_PROGMEM: + for (i = 0; i < num_pages; i++) { + for (column = 0; column < bitmap->width; column++) { + temp = PROGMEM_READ_BYTE(bitmap->data.progmem + + (i * bitmap->width) + + column); + gfx_mono_put_byte(i + page, column + x, temp); + } + } + break; + + case GFX_MONO_BITMAP_RAM: + for (i = 0; i < num_pages; i++) { + gfx_mono_put_page(bitmap->data.pixmap + + (i * bitmap->width), page + i, x, + bitmap->width); + } + break; + + default: + break; + } +} + +/** @} */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_generic.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_generic.h new file mode 100644 index 00000000..4701e943 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_generic.h @@ -0,0 +1,123 @@ +/** + * \file + * + * \brief Generic monochrome LCD graphic primitives + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef GFX_MONO_GENERIC +#define GFX_MONO_GENERIC +#include "gfx_mono.h" + +/** + * \ingroup gfx_mono + * \defgroup gfx_mono_generic_group Generic monochrome graphic primitives + * + * This is a service providing generic implementations of graphic primitives + * - Horizontal line + * - Vertical line + * - Line + * - Circle (filled/not filled) + * - Rectangle (filled/not filled) + * + * it also provides functionality to draw a bitmap to the graphic memory. + * + * These functions are made available if the graphic hardware being used do + * not implement the functionality in hardware. This is true in most cases. + * + * This service is included as a requirement for a + * hardware specific component that uses these functions, and provides a + * gfx_draw_pixel function. + * + * @{ + */ + +/** + * \brief Storage structure for bitmap pixel data and metadata + */ +struct gfx_mono_bitmap { + /** Width of bitmap */ + gfx_coord_t width; + /** Height of bitmap */ + gfx_coord_t height; + /** Bitmap type */ + enum gfx_mono_bitmap_type type; + union { + /** Pointer to pixels for bitmap stored in RAM */ + gfx_mono_color_t *pixmap; + /** Pointer to pixels for bitmap stored in progmem */ + gfx_mono_color_t PROGMEM_T *progmem; + } + data; +}; + +void gfx_mono_generic_draw_horizontal_line(gfx_coord_t x, gfx_coord_t y, + gfx_coord_t length, enum gfx_mono_color color); + +void gfx_mono_generic_draw_vertical_line(gfx_coord_t x, gfx_coord_t y, + gfx_coord_t length, enum gfx_mono_color color); + +void gfx_mono_generic_draw_line(gfx_coord_t x1, gfx_coord_t y1, + gfx_coord_t x2, gfx_coord_t y2, + enum gfx_mono_color color); + +void gfx_mono_generic_draw_rect(gfx_coord_t x, gfx_coord_t y, + gfx_coord_t width, gfx_coord_t height, + enum gfx_mono_color color); + +void gfx_mono_generic_draw_filled_rect(gfx_coord_t x, gfx_coord_t y, + gfx_coord_t width, gfx_coord_t height, + enum gfx_mono_color color); + +void gfx_mono_generic_draw_circle(gfx_coord_t x, gfx_coord_t y, + gfx_coord_t radius, enum gfx_mono_color color, + uint8_t octant_mask); + +void gfx_mono_generic_draw_filled_circle(gfx_coord_t x, gfx_coord_t y, + gfx_coord_t radius, enum gfx_mono_color color, + uint8_t quadrant_mask); + +void gfx_mono_generic_put_bitmap(struct gfx_mono_bitmap *bitmap, gfx_coord_t x, + gfx_coord_t y); + +/** @} */ + +#endif /* GFX_MONO_GENERIC */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_menu.c b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_menu.c new file mode 100644 index 00000000..f278a292 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_menu.c @@ -0,0 +1,188 @@ +/** + * \file + * + * \brief Simple menu system + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#include "sysfont.h" +#include "gfx_mono.h" +#include + +#include "gfx_mono_menu.h" + +/** + * \ingroup gfx_mono_menu + * @{ + */ + +PROGMEM_DECLARE(gfx_mono_color_t, arrow_right_data[]) = { + GFX_MONO_MENU_INDICATOR_BITMAP +}; + +struct gfx_mono_bitmap menu_bitmap_indicator = { + .height = GFX_MONO_MENU_INDICATOR_HEIGHT, + .width = GFX_MONO_MENU_INDICATOR_WIDTH, + .type = GFX_MONO_BITMAP_PROGMEM, + .data.progmem = arrow_right_data +}; + +/** + * \brief Draw menu strings and an icon by the current selection. + * + * \param menu a menu struct with menu settings + * \param redraw clear screen before drawing menu + */ +static void menu_draw(struct gfx_mono_menu *menu, bool redraw) +{ + static bool redraw_state; + uint8_t i; + uint8_t line = 1; + uint8_t menu_page = menu->current_selection / + GFX_MONO_MENU_ELEMENTS_PER_SCREEN; + + if (menu->current_page != menu_page || redraw == true) { + /* clear screen if we have changed the page or menu and prepare + * redraw */ + gfx_mono_draw_filled_rect(0, SYSFONT_LINESPACING, + GFX_MONO_LCD_WIDTH, + GFX_MONO_LCD_HEIGHT - SYSFONT_LINESPACING, + GFX_PIXEL_CLR); + redraw_state = true; + } + + menu->current_page = menu_page; + + /* Clear old indicator icon */ + gfx_mono_draw_filled_rect(0, SYSFONT_LINESPACING, + GFX_MONO_MENU_INDICATOR_WIDTH, GFX_MONO_LCD_HEIGHT - + SYSFONT_LINESPACING, GFX_PIXEL_CLR); + + /* Put indicator icon on current selection */ + gfx_mono_put_bitmap(&menu_bitmap_indicator, 0, + SYSFONT_LINESPACING * ((menu->current_selection % + GFX_MONO_MENU_ELEMENTS_PER_SCREEN) + 1)); + + /* Print visible options if page or menu has changed */ + if (redraw_state == true) { + for (i = menu_page * GFX_MONO_MENU_ELEMENTS_PER_SCREEN; + i < menu_page * + GFX_MONO_MENU_ELEMENTS_PER_SCREEN + + GFX_MONO_MENU_ELEMENTS_PER_SCREEN && + i < menu->num_elements; i++) { + gfx_mono_draw_progmem_string( + (char PROGMEM_PTR_T)menu->strings[i], + GFX_MONO_MENU_INDICATOR_WIDTH + 1, + line * SYSFONT_LINESPACING, &sysfont); + line++; + } + redraw_state = false; + } +} + +/** + * *\brief Initialize the menu handling. Clear screen and draw menu. + * + * \param menu menu struct with menu options + * + */ +void gfx_mono_menu_init(struct gfx_mono_menu *menu) +{ + /* Clear screen */ + gfx_mono_draw_filled_rect(0, 0, + GFX_MONO_LCD_WIDTH, GFX_MONO_LCD_HEIGHT, GFX_PIXEL_CLR); + + /* Draw the menu title on the top of the screen */ + gfx_mono_draw_progmem_string((char PROGMEM_PTR_T)menu->title, + 0, 0, &sysfont); + + /* Draw menu options below */ + menu_draw(menu, true); +} + +/** + * \brief Update menu depending on input. + * + * \param menu menu struct with menu options + * \param keycode keycode to process + * + * \retval selected menu option or status code + */ +uint8_t gfx_mono_menu_process_key(struct gfx_mono_menu *menu, uint8_t keycode) +{ + switch (keycode) { + case GFX_MONO_MENU_KEYCODE_DOWN: + if (menu->current_selection == menu->num_elements - 1) { + menu->current_selection = 0; + } else { + menu->current_selection++; + } + + /* Update menu on display */ + menu_draw(menu, false); + /* Nothing selected yet */ + return GFX_MONO_MENU_EVENT_IDLE; + + case GFX_MONO_MENU_KEYCODE_UP: + if (menu->current_selection) { + menu->current_selection--; + } else { + menu->current_selection = menu->num_elements - 1; + } + + /* Update menu on display */ + menu_draw(menu, false); + /* Nothing selected yet */ + return GFX_MONO_MENU_EVENT_IDLE; + + case GFX_MONO_MENU_KEYCODE_ENTER: + /* Got what we want. Return selection. */ + return menu->current_selection; + + case GFX_MONO_MENU_KEYCODE_BACK: + /* User pressed "back" key, inform user */ + return GFX_MONO_MENU_EVENT_EXIT; + + default: + /* Unknown key event */ + return GFX_MONO_MENU_EVENT_IDLE; + } +} diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_menu.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_menu.h new file mode 100644 index 00000000..1536a823 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_menu.h @@ -0,0 +1,127 @@ +/** + * \file + * + * \brief Simple menu system + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef GFX_MONO_MENU_H +#define GFX_MONO_MENU_H + +#include "compiler.h" +#include "conf_menu.h" + +/** + * \ingroup gfx_mono + * \defgroup gfx_mono_menu Menu system for monochrome graphical displays + * + * This module provides a simple menu system for monochrome graphical + * displays. + * + * Typical flow of an application using the menu system: + * + * 1) Define menu structure.\n + * 2) Call gfx_mono_menu_init.\n + * 3) Get user input.\n + * 4) Update menu with user input using function \ref + * gfx_mono_menu_process_key.\n + * 5) Interpret \ref gfx_mono_menu_process_key return value.\n + * 6) Go to 3.\n + * + * The menu is declared using the \ref gfx_mono_menu struct. + * + * To start the menu system, call the \ref gfx_mono_menu_init function. + * This function will clear the display and draw the menu. + * + * Before the menu can be updated, you need input from the user. Methods for + * getting input is not part of the menu module. + * + * As soon as input is received, inform the menu system using the + * \ref gfx_mono_menu_process_key function. + * This function will then return a status code and act depending on the given + * keycode: + * + * MENU_KEYCODE_DOWN : Change selection to next menu item (or first if at + * bottom). + * Returns MENU_EVENT_IDLE. + * + * MENU_KEYCODE_UP : Change selection to previous menu item (or last if at top). + * Returns MENU_EVENT_IDLE. + * + * MENU_KEYCODE_ENTER : Nothing changes in menu. Returns the line selected. + * + * MENU_KEYCODE_BACK : Nothing changes in menu. Returns MENU_EVENT_EXIT. + * + * The value of the keycodes used are defined in conf_menu.h. These value can + * be changed if needed. + * + * The graphical indicator used to indicate menu selection is defined in + * conf_menu.h. This indicator can be changed if needed. + * @{ + */ + +/** \name Menu events definitions */ +/** @{ */ +/** Idle. Nothing to report. */ +#define GFX_MONO_MENU_EVENT_IDLE 0xFF +/** Exit. User has pressed the back button. */ +#define GFX_MONO_MENU_EVENT_EXIT 0xFE +/** @} */ + +/** Maximum number of menu elements on display */ +#define GFX_MONO_MENU_ELEMENTS_PER_SCREEN ((GFX_MONO_LCD_HEIGHT / \ + SYSFONT_LINESPACING) - 1) + +/** Menu struct */ +struct gfx_mono_menu { + PROGMEM_STRING_T title; + PROGMEM_STRING_T *strings; + uint8_t num_elements; + uint8_t current_selection; + uint8_t current_page; +}; + +void gfx_mono_menu_init(struct gfx_mono_menu *menu); +uint8_t gfx_mono_menu_process_key(struct gfx_mono_menu *menu, uint8_t keycode); + +/** @} */ + +#endif /* GFX_MONO_MENU_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_spinctrl.c b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_spinctrl.c new file mode 100644 index 00000000..4c97c1ee --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_spinctrl.c @@ -0,0 +1,697 @@ +/** + * \file + * + * \brief Spin control widget + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#include "sysfont.h" +#include "stdio.h" +#include "gfx_mono.h" +#include "gfx_mono_spinctrl.h" + +PROGMEM_DECLARE(gfx_mono_color_t, spin_indicator_data[]) = { + GFX_MONO_SPINCTRL_SPIN_INDICATOR_BITMAP +}; + +PROGMEM_DECLARE(gfx_mono_color_t, indicator_data[]) = { + GFX_MONO_SPINCTRL_INDICATOR_BITMAP +}; + +struct gfx_mono_bitmap gfx_mono_spinctrl_bitmap_spin_indicator = { + .height = GFX_MONO_SPINCTRL_SPIN_INDICATOR_HEIGHT, + .width = GFX_MONO_SPINCTRL_SPIN_INDICATOR_WIDTH, + .type = GFX_MONO_BITMAP_PROGMEM, + .data.progmem = spin_indicator_data +}; + +struct gfx_mono_bitmap gfx_mono_spinctrl_bitmap_indicator = { + .height = GFX_MONO_SPINCTRL_INDICATOR_HEIGHT, + .width = GFX_MONO_SPINCTRL_INDICATOR_WIDTH, + .type = GFX_MONO_BITMAP_PROGMEM, + .data.progmem = indicator_data +}; + +/** + * \brief Draw or delete indicator arrow in front of spinner + * + * \param *spinner initialized gfx_mono_spinctrl struct + * \param draw true on draw, false on delete + */ +static void gfx_mono_spinctrl_draw_indicator(struct gfx_mono_spinctrl *spinner, + bool draw) +{ + if (draw) { + gfx_mono_put_bitmap(&gfx_mono_spinctrl_bitmap_indicator, 0, + spinner->y); + } else { + gfx_mono_draw_filled_rect(0, spinner->y, + GFX_MONO_SPINCTRL_INDICATOR_WIDTH, + GFX_MONO_SPINCTRL_INDICATOR_HEIGHT, + GFX_PIXEL_CLR); + } +} + +/** + * \brief Draw or delete indicator in front of spinner data + * + * \param spinner pointer to initialized gfx_mono_spinctrl struct + * \param draw true on draw, false on delete + */ +static void gfx_mono_spinctrl_draw_spin_indicator(struct gfx_mono_spinctrl + *spinner, bool draw) +{ + if (draw) { + gfx_mono_put_bitmap(&gfx_mono_spinctrl_bitmap_spin_indicator, + GFX_MONO_LCD_WIDTH - GFX_MONO_SPINCTRL_SPIN_INDICATOR_WIDTH, + spinner->y); + } else { + gfx_mono_draw_filled_rect(GFX_MONO_LCD_WIDTH - + GFX_MONO_SPINCTRL_SPIN_INDICATOR_WIDTH, + spinner->y, + GFX_MONO_SPINCTRL_SPIN_INDICATOR_WIDTH, + GFX_MONO_SPINCTRL_SPIN_INDICATOR_HEIGHT, + GFX_PIXEL_CLR); + } +} + +/** + * \brief Draw OK button at bottom of screen + * + * This function draws an OK button at the bottom of the screen. It will + * also draw an indicator arrow in front of the button if the indicator bool + * is true. If the draw bool is false, the OK button will be deleted, and if + * the indicator bool is false, the indicator will be deleted. + * + * \param draw true on draw, false on delete + * \param indicator true on draw indicator, false on delete + */ +static void gfx_mono_spinctrl_draw_button(bool draw, bool indicator) +{ + uint8_t width; + uint8_t height; + uint8_t offset; + char string_buf[22]; + + /* Clear bottom line */ + gfx_mono_draw_filled_rect(0, + (SYSFONT_HEIGHT + 1) * + GFX_MONO_SPINCTRL_MAX_ELEMENTS_IN_SPINCOLLECTION, + GFX_MONO_LCD_WIDTH, SYSFONT_HEIGHT, GFX_PIXEL_CLR); + + snprintf(string_buf, sizeof(string_buf), "OK"); + gfx_mono_get_string_bounding_box(string_buf, &sysfont, &width, &height); + offset = (GFX_MONO_LCD_WIDTH - width) / 2; + + if (draw) { + /* Draw OK button in the middle of the last line */ + gfx_mono_draw_string(string_buf, offset, + (SYSFONT_HEIGHT + 1) * + GFX_MONO_SPINCTRL_MAX_ELEMENTS_IN_SPINCOLLECTION, + &sysfont); + if (indicator) { + /* Draw indicator arrow in front of button */ + gfx_mono_put_bitmap(&gfx_mono_spinctrl_bitmap_indicator, + offset - GFX_MONO_SPINCTRL_INDICATOR_WIDTH, + (SYSFONT_HEIGHT + 1) * + GFX_MONO_SPINCTRL_MAX_ELEMENTS_IN_SPINCOLLECTION); + } else { + /* Delete indicator */ + gfx_mono_draw_filled_rect(offset - + GFX_MONO_SPINCTRL_INDICATOR_WIDTH, + (SYSFONT_HEIGHT + 1) * + GFX_MONO_SPINCTRL_MAX_ELEMENTS_IN_SPINCOLLECTION, + GFX_MONO_SPINCTRL_INDICATOR_WIDTH, + GFX_MONO_SPINCTRL_INDICATOR_HEIGHT, + GFX_PIXEL_CLR); + } + } else { + /* Delete OK button */ + gfx_mono_draw_filled_rect( + offset - GFX_MONO_SPINCTRL_INDICATOR_WIDTH, + (SYSFONT_HEIGHT + 1) * + GFX_MONO_SPINCTRL_MAX_ELEMENTS_IN_SPINCOLLECTION, 20, + SYSFONT_HEIGHT, GFX_PIXEL_CLR); + } +} + +/** + * \brief Draw spinner at its position. + * + * This function draws a spinner at its position. + * The title of the spinner is only drawn if the redraw option is set. + * If the spinner is in focus, arrows will be drawn next to the spinner value + * to indicate that it is spinnable. + * + * \param spinner pointer to initialized gfx_mono_spinctrl struct + * \param redraw true if title of spinner should be drawn + */ +void gfx_mono_spinctrl_draw(struct gfx_mono_spinctrl *spinner, bool redraw) +{ + char string_buf[GFX_MONO_SPINCTRL_INT_SPINNER_WIDTH]; + uint8_t index; + uint8_t offset; + + if (redraw) { + /* Clear line */ + gfx_mono_draw_filled_rect(0, spinner->y, GFX_MONO_LCD_WIDTH, + SYSFONT_HEIGHT, GFX_PIXEL_CLR); + /* Draw title */ + gfx_mono_draw_progmem_string((char PROGMEM_PTR_T)spinner->title, + GFX_MONO_SPINCTRL_INDICATOR_WIDTH + 1, + spinner->y, &sysfont); + } + + if (spinner->in_focus) { + gfx_mono_spinctrl_draw_spin_indicator(spinner, true); + } else { + gfx_mono_spinctrl_draw_spin_indicator(spinner, false); + } + + if (spinner->datatype == SPINTYPE_INTEGER) { + offset = GFX_MONO_LCD_WIDTH - + (SYSFONT_WIDTH * + GFX_MONO_SPINCTRL_INT_SPINNER_WIDTH); + snprintf(string_buf, sizeof(string_buf), "%d", + spinner->integer_data); + /* Delete previous spinner data */ + gfx_mono_draw_filled_rect(offset, spinner->y, + GFX_MONO_LCD_WIDTH - offset - + GFX_MONO_SPINCTRL_SPIN_INDICATOR_WIDTH, + SYSFONT_HEIGHT, + GFX_PIXEL_CLR); + /* Draw integer data */ + gfx_mono_draw_string(string_buf, offset, spinner->y, &sysfont); + } else if (spinner->datatype == SPINTYPE_STRING) { + index = spinner->strings.index; + offset = GFX_MONO_LCD_WIDTH - + (SYSFONT_WIDTH * + GFX_MONO_SPINCTRL_STRING_SPINNER_WIDTH); + + /* Delete previous spinner data */ + gfx_mono_draw_filled_rect(offset, spinner->y, + GFX_MONO_LCD_WIDTH - offset - + GFX_MONO_SPINCTRL_SPIN_INDICATOR_WIDTH, + SYSFONT_HEIGHT, + GFX_PIXEL_CLR); + + /* Draw string data */ + gfx_mono_draw_progmem_string( + (char PROGMEM_PTR_T)spinner->strings.data[index], offset, + spinner->y, &sysfont); + } +} + +/** + * \brief Initialize a spinner. + * + * This function initializes a spinner to either + * \ref gfx_mono_spinctrl_type_t "SPINTYPE_STRING" spinner that spins through + * the strings in a \ref PROGMEM_STRING_T or a + * \ref gfx_mono_spinctrl_type_t "SPINTYPE_INTEGER" spinner that spins through + * integers. + * If the spinner type is SPINTYPE_INTEGER, it will spin from lower_limit to + * upper_limit. + * If the spinner type is SPINTYPE_STRING, a pointer to a PROGMEM_STRING_T must + * be provided, and the spinner will spin through the strings starting at + * index lower_limit ending at index upper_limit. + * The y parameter specifies where to place the spinner on the screen, but is + * overwritten if the spinner is put in a spincollection. + * + * \param spinner pointer to initialized gfx_mono_spinctrl struct + * \param datatype typer of spinner, integer or string + * \param title title of spinner + * \param data pointer to progmem string array if datatype is string. + * NULL if datatype is integer. + * \param lower_limit lower limit and start value of spinner's data + * \param upper_limit upper limit of spinner's data + * \param y y position of spinner + */ +void gfx_mono_spinctrl_init(struct gfx_mono_spinctrl *spinner, + gfx_mono_spinctrl_type_t datatype, PROGMEM_STRING_T title, + PROGMEM_STRING_T *data, int16_t lower_limit, + int16_t upper_limit, + gfx_coord_t y) +{ + /* Initialization of spinner parameters */ + spinner->title = title; + spinner->datatype = datatype; + spinner->lower_limit = lower_limit; + spinner->upper_limit = upper_limit; + spinner->y = y; + spinner->in_focus = false; + spinner->last_saved_value = spinner->lower_limit; + + if (datatype == SPINTYPE_STRING) { + spinner->strings.data = data; + spinner->strings.index = lower_limit; + } else { + spinner->integer_data = lower_limit; + } +} + +/** + * \brief Initialize a spincollection. + * + * This function initializes a spincollection to which spinners can be added. + * + * \param collection pointer to gfx_mono_spinctrl_spincollection to Initialize + */ +void gfx_mono_spinctrl_spincollection_init(struct + gfx_mono_spinctrl_spincollection *collection) +{ + collection->active_spinner = false; + collection->current_selection = 0; + collection->number_of_spinners = 0; + collection->init = true; +} + +/** + * \brief Add spinner to spincollection + * + * This function adds an initialized spinner to a spincollection and positions + * it below any other spinners in the spincollection on the screen. The + * spinners in the spincollection are linked together and number of spinners is + * updated. + * It is not possible to add more spinners than + * \ref GFX_MONO_SPINCTRL_MAX_ELEMENTS_IN_SPINCOLLECTION "maximum number of + * spinners in a spincollection". + * + * \param spinner pointer to initialized gfx_mono_spinctrl struct to add + * to collection + * \param spinners pointer to initialized gfx_mono_spinctrl_spincollection + * struct + * + */ +void gfx_mono_spinctrl_spincollection_add_spinner(struct + gfx_mono_spinctrl *spinner, + struct gfx_mono_spinctrl_spincollection *spinners) +{ + uint8_t i; + struct gfx_mono_spinctrl *lastspinner; + + /* Do not add more spinner elements than maximum number of spinners */ + if (spinners->number_of_spinners >= + GFX_MONO_SPINCTRL_MAX_ELEMENTS_IN_SPINCOLLECTION) { + return; + } + + /* Place new spinner below previous spinners on screen */ + spinner->y = (SYSFONT_HEIGHT + 1) * spinners->number_of_spinners; + + /* Add pointer to the spinner in spincollection if empty */ + if (spinners->number_of_spinners == 0) { + spinners->collection = spinner; + } else { + lastspinner = spinners->collection; + for (i = 1; i < spinners->number_of_spinners; i++) { + lastspinner = lastspinner->next; + } + /* Link the new spinner to the current last spinner in the + * collection */ + lastspinner->next = spinner; + /* Link the current last spinner as previous spinner for new + * spinner */ + spinner->prev = lastspinner; + } + + /* Set added spinner as last spinner in collection */ + spinners->collection_last = spinner; + /* Update number of spinners in collection */ + spinners->number_of_spinners++; +} + +/** + * \brief Show spincollection + * + * This function draws all the spinners in a spincollection to the screen, + * together with an OK button at the bottom. It also draws an indicator arrow + * in front of the top spinner. + * + * \param spinners pointer to initialized spincollection to display + */ +void gfx_mono_spinctrl_spincollection_show(struct + gfx_mono_spinctrl_spincollection *spinners) +{ + uint8_t i; + struct gfx_mono_spinctrl *iterator; + + /* Clear screen */ + gfx_mono_draw_filled_rect(0, 0, GFX_MONO_LCD_WIDTH, GFX_MONO_LCD_HEIGHT, + GFX_PIXEL_CLR); + + /* Make sure there are spinners in the collection */ + if (spinners->number_of_spinners == 0) { + return; + } + + /* Draw spinners on screen */ + iterator = spinners->collection; + for (i = 0; i < spinners->number_of_spinners; i++) { + gfx_mono_spinctrl_draw(iterator, true); + iterator = iterator->next; + } + /* Draw OK button at bottom of screen */ + gfx_mono_spinctrl_draw_button(true, false); + /* Draw indicator arrow in front of first spinner */ + gfx_mono_spinctrl_draw_indicator(spinners->collection, true); +} + +/** + * \brief Step up spinner data + * + * This function steps up the data, making sure it does not go + * beyond the upper limit. Wraps around if it does. + * + * \param spinner pointer to initialized spinner. + */ +static void gfx_mono_spinctrl_step_up(struct gfx_mono_spinctrl *spinner) +{ + /* Check if spinner type is integer or string, increment integer data or + * move to next string index. + */ + if (spinner->datatype == SPINTYPE_INTEGER) { + if (spinner->integer_data < spinner->upper_limit) { + spinner->integer_data++; + } else { + spinner->integer_data = spinner->lower_limit; + } + } else if (spinner->datatype == SPINTYPE_STRING) { + if (spinner->strings.index < spinner->upper_limit) { + spinner->strings.index++; + } else { + (spinner->strings.index) = spinner->lower_limit; + } + } +} + +/** + * \brief Step down spinner data + * + * * This function steps down the data, making sure it does not go + * below the lower limit. Wraps around if it does. + * + * \param spinner pointer to initialized spinner. + */ +static void gfx_mono_spinctrl_step_down(struct gfx_mono_spinctrl *spinner) +{ + /* Check if spinner type is integer or string, increment integer data, + * move to next string index. + */ + if (spinner->datatype == SPINTYPE_INTEGER) { + if (spinner->integer_data > spinner->lower_limit) { + spinner->integer_data--; + } else { + spinner->integer_data = spinner->upper_limit; + } + } else if (spinner->datatype == SPINTYPE_STRING) { + if (spinner->strings.index > (spinner->lower_limit)) { + spinner->strings.index--; + } else { + spinner->strings.index = spinner->upper_limit; + } + } +} + +/** + * \brief Update single spinner depending on input. + * + * \param spinner pointer to initialized spinner. + * \param keycode keycode to process + * + * \retval selected selected spinner value + * \retval GFX_MONO_SPINCTRL_EVENT_IDLE spinner spinning + * \retval GFX_MONO_SPINCTRL_EVENT_BACK spinner deselected + */ +int16_t gfx_mono_spinctrl_process_key(struct gfx_mono_spinctrl *spinner, + uint8_t keycode) +{ + switch (keycode) { + case GFX_MONO_SPINCTRL_KEYCODE_DOWN: + if (spinner->in_focus) { + gfx_mono_spinctrl_step_down(spinner); + /* Update spinner on display */ + gfx_mono_spinctrl_draw(spinner, false); + } + + /* Nothing selected yet */ + return GFX_MONO_SPINCTRL_EVENT_IDLE; + + case GFX_MONO_SPINCTRL_KEYCODE_UP: + if (spinner->in_focus) { + gfx_mono_spinctrl_step_up(spinner); + /* Update spinner on display */ + gfx_mono_spinctrl_draw(spinner, false); + } + + /* Nothing selected yet */ + return GFX_MONO_SPINCTRL_EVENT_IDLE; + + case GFX_MONO_SPINCTRL_KEYCODE_ENTER: + if (spinner->in_focus) { + if (spinner->datatype == SPINTYPE_INTEGER) { + spinner->in_focus = false; + gfx_mono_spinctrl_draw(spinner, false); + /* Store saved value in case of aborting spinner + * later */ + spinner->last_saved_value + = spinner->integer_data; + /* Got what we want. Return selection. */ + return spinner->integer_data; + } else if (spinner->datatype == SPINTYPE_STRING) { + spinner->in_focus = false; + gfx_mono_spinctrl_draw(spinner, false); + /* Store saved value in case of aborting spinner + * later */ + spinner->last_saved_value + = spinner->strings.index; + /* Got what we want. Return selection. */ + return spinner->strings.index; + } + } else { + /* Spinner selected */ + spinner->in_focus = true; + gfx_mono_spinctrl_draw(spinner, false); + return GFX_MONO_SPINCTRL_EVENT_IDLE; + } + + case GFX_MONO_SPINCTRL_KEYCODE_BACK: + /* User pressed "back" key, */ + spinner->in_focus = false; + /* Spinner choice aborted, show last saved value instead */ + if (spinner->datatype == SPINTYPE_INTEGER) { + spinner->integer_data = spinner->last_saved_value; + } else if (spinner->datatype == SPINTYPE_STRING) { + spinner->strings.index = spinner->last_saved_value; + } + + gfx_mono_spinctrl_draw(spinner, false); + return GFX_MONO_SPINCTRL_EVENT_BACK; + + default: + /* Unknown key event */ + return GFX_MONO_SPINCTRL_EVENT_IDLE; + } +} + +/** + * \brief Update spincollection on screen depending on input + * + * This function returns \ref GFX_MONO_SPINCTRL_EVENT_FINISH if user has + * pressed the OK button. The spinner choices can then be extracted from the + * results array. If a spinner is of type SPINTYPE_STRING, the index of the + * progmem string will be stored in the results array, else the selected + * integer value will be stored. + * The choice from the first spinner added to the spincollection will be stored + * at index 0 in the results array, the second at index 1 and so on. + * If user has pressed the back button, \ref GFX_MONO_SPINCTRL_EVENT_BACK is + * returned, signalling that the application should be cancelled. + * + * \param spinners pointer to initialized + * gfx_mono_spinctrl_spincollection + * \param keycode keycode to process + * \param results array to store results from the spinners, must be of + * same length as number of spinners + * + * \retval GFX_MONO_SPINCTRL_EVENT_FINISH user pressed ok button + * \retval GFX_MONO_SPINCTRL_EVENT_BACK user cancelled + * \retval GFX_MONO_SPINCTRL_EVENT_IDLE user is navigating in spincollection + */ +int16_t gfx_mono_spinctrl_spincollection_process_key(struct + gfx_mono_spinctrl_spincollection *spinners, uint8_t keycode, + int16_t results[]) +{ + uint8_t i; + struct gfx_mono_spinctrl *iterator; + + /* Make sure there are spinners in the collection, if not, cancel */ + if (spinners->number_of_spinners == 0) { + return GFX_MONO_SPINCTRL_EVENT_BACK; + } + + /* Store initial values in results array first time function is run */ + if (spinners->init) { + iterator = spinners->collection; + for (i = 0; i < spinners->number_of_spinners; i++) { + if (iterator->datatype == SPINTYPE_INTEGER) { + results[i] = iterator->integer_data; + } else { + results[i] = iterator->strings.index; + } + + iterator = iterator->next; + } + spinners->init = false; + } + + /* Find current spinner selection */ + iterator = spinners->collection; + if (spinners->current_selection != GFX_MONO_SPINCTRL_BUTTON) { + for (i = 0; i < spinners->current_selection; i++) { + iterator = iterator->next; + } + } + + if (spinners->active_spinner) { + /* Process chosen spinner */ + spinners->selection = gfx_mono_spinctrl_process_key(iterator, + keycode); + if (spinners->selection == GFX_MONO_SPINCTRL_EVENT_BACK) { + /* User has exited spinner without saving the result */ + spinners->active_spinner = false; + } else if (spinners->selection != + GFX_MONO_SPINCTRL_EVENT_IDLE) { + /* Value selected, store in array */ + results[spinners->current_selection] + = spinners->selection; + /* Step out of spinner and into spincollection */ + spinners->active_spinner = false; + } + + return GFX_MONO_SPINCTRL_EVENT_IDLE; + } else { + switch (keycode) { + case GFX_MONO_SPINCTRL_KEYCODE_DOWN: + if (spinners->current_selection == + GFX_MONO_SPINCTRL_BUTTON) { + spinners->current_selection = 0; + /* Delete indicator arrow in front of button */ + gfx_mono_spinctrl_draw_button(true, false); + /* Draw indicator arrow in front of first + * spinner */ + gfx_mono_spinctrl_draw_indicator(iterator, + true); + } else if (spinners->current_selection < + spinners->number_of_spinners - 1) { + /* Delete indicator arrow */ + gfx_mono_spinctrl_draw_indicator(iterator, + false); + spinners->current_selection++; + /* Draw indicator arrow in front of new spinner */ + gfx_mono_spinctrl_draw_indicator(iterator->next, + true); + } else { + /* Delete indicator arrow */ + gfx_mono_spinctrl_draw_indicator(iterator, + false); + spinners->current_selection + = GFX_MONO_SPINCTRL_BUTTON; + /* Draw indicator arrow in front of button */ + gfx_mono_spinctrl_draw_button(true, true); + } + + return GFX_MONO_SPINCTRL_EVENT_IDLE; + + case GFX_MONO_SPINCTRL_KEYCODE_UP: + if (spinners->current_selection == + GFX_MONO_SPINCTRL_BUTTON) { + /* Delete indicator arrow in front of button */ + gfx_mono_spinctrl_draw_button(true, false); + spinners->current_selection + = spinners->number_of_spinners - 1; + /* Draw indicator arrow in front of new spinner */ + gfx_mono_spinctrl_draw_indicator( + spinners->collection_last, + true); + } else if (spinners->current_selection > 0) { + /* Delete indicator arrow */ + gfx_mono_spinctrl_draw_indicator(iterator, + false); + spinners->current_selection--; + /* Draw indicator arrow in front of new spinner */ + gfx_mono_spinctrl_draw_indicator(iterator->prev, + true); + } else { + /* Delete indicator arrow */ + gfx_mono_spinctrl_draw_indicator(iterator, + false); + spinners->current_selection + = GFX_MONO_SPINCTRL_BUTTON; + /* Draw indicator arrow in front of button */ + gfx_mono_spinctrl_draw_button(true, true); + } + + return GFX_MONO_SPINCTRL_EVENT_IDLE; + + case GFX_MONO_SPINCTRL_KEYCODE_ENTER: + if (spinners->current_selection == + GFX_MONO_SPINCTRL_BUTTON) { + /* Finished with all selections, return */ + return GFX_MONO_SPINCTRL_EVENT_FINISH; + } else { + /* Spinner selected, send next keycode directly + * to spinner */ + gfx_mono_spinctrl_process_key(iterator, + keycode); + spinners->active_spinner = true; + return GFX_MONO_SPINCTRL_EVENT_IDLE; + } + + case GFX_MONO_SPINCTRL_KEYCODE_BACK: + /* User pressed "back" key, */ + return GFX_MONO_SPINCTRL_EVENT_BACK; + + default: + /* Unknown key event */ + return GFX_MONO_SPINCTRL_EVENT_IDLE; + } + } +} diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_spinctrl.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_spinctrl.h new file mode 100644 index 00000000..98ec70ee --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_spinctrl.h @@ -0,0 +1,243 @@ +/** + * \file + * + * \brief Spin control widget + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef GFX_MONO_SPINCTRL_H +#define GFX_MONO_SPINCTRL_H + +#include "gfx_mono.h" +#include "conf_spinctrl.h" + +/** + * \ingroup gfx_mono + * \defgroup gfx_mono_spinctrl Spinner widget for monochrome graphical displays + * + * This module provides a spinner widget system for monochrome graphical + * displays. + * + * There is support for having one single spinner on the screen, or a + * collection of spinners. + * + * Typical flow of an application using the spincollection system: + * + * 1) Define spinners.\n + * 2) Initialize each spinners with \ref gfx_mono_spinctrl_init.\n + * 3) Define a spincollection struct and initialize it with + * \ref gfx_mono_spinctrl_spincollection_init.\n + * 4) Add spinners to spincollection with + * \ref gfx_mono_spinctrl_spincollection_add_spinner.\n + * 5) Draw spincollection to screen with + * \ref gfx_mono_spinctrl_spincollection_show.\n + * 6) Define a result array to store the spinner choices.\n + * 7) Update spinners and result array with user input using function + * \ref gfx_mono_spinctrl_spincollection_process_key.\n + * 8) Interpret \ref gfx_mono_spinctrl_spincollection_process_key return + * value.\n + * 9) Go to 7.\n + * + * Typical flow of an application using a single spinner: + * + * 1) Define spinner.\n + * 2) Initialize the spinners with \ref gfx_mono_spinctrl_init with preferred y + * position on screen.\n + * 3) Draw spinner to screen with \ref gfx_mono_spinctrl_draw.\n + * 4) Update spinner with user input using function + * \ref gfx_mono_spinctrl_process_key.\n + * 5) Interpret \ref gfx_mono_spinctrl_process_key return value.\n + * 6) Go to 4.\n + * + * Before the spinners can be updated, you need input from the user. Methods + * for getting input is not part of the spinner widget. + * + * \note The spinners will be linked together when added to a spincollection, + * and can therefore not be used in two spincollections at the same time. + * + * As soon as input is received, inform the spincollection system or the single + * spinner using the \ref gfx_mono_spinctrl_spincollection_process_key function + * or the \ref gfx_mono_spinctrl_process_key function. + * These functions will then return a status code and act depending on the + * given keycode: + * + * GFX_MONO_SPINCTRL_KEYCODE_DOWN : Change selection to next spinner value or + * to next spinner or OK button in a spincollection. + * + * GFX_MONO_SPINCTRL_KEYCODE_UP : Change selection to previous spinner value + * or to previous spinner or OK button in a spincollection. + * + * GFX_MONO_SPINCTRL_KEYCODE_ENTER : Select spinner value or select spinner or + * OK button in a spincollection. + * + * GFX_MONO_SPINCTRL_KEYCODE_BACK : Deselect spinner or cancel spincollection + * application. + * + * The value of the keycodes used are defined in conf_spinctrl.h. These values + * can be changed if needed. + * + * The graphical indicators used to indicate spinner selections are defined in + * conf_spinctrl.h. These indicators can be changed if needed. + * @{ + */ + +/** Spinner idle event */ +#define GFX_MONO_SPINCTRL_EVENT_IDLE 0xFF +/** Spinner back button pressed event */ +#define GFX_MONO_SPINCTRL_EVENT_BACK 0xFE +/** Spinner ok button pressed event */ +#define GFX_MONO_SPINCTRL_EVENT_FINISH 0xFD + +/** OK button */ +#define GFX_MONO_SPINCTRL_BUTTON 0xFF + +/** Maximum number of spinner elements on display */ +#define GFX_MONO_SPINCTRL_ELEMENTS_PER_SCREEN \ + ((GFX_MONO_LCD_HEIGHT / SYSFONT_LINESPACING) - 1) + +/** + * Maximum numbers of spinner elements in a spincollection - limited to + * one screen. + */ +#define GFX_MONO_SPINCTRL_MAX_ELEMENTS_IN_SPINCOLLECTION \ + GFX_MONO_SPINCTRL_ELEMENTS_PER_SCREEN + +/** Width of string spinner choices */ +#define GFX_MONO_SPINCTRL_STRING_SPINNER_WIDTH 9 +/** Width of integer spinner choices */ +#define GFX_MONO_SPINCTRL_INT_SPINNER_WIDTH 9 + +/** Enum to specify what kind of data spinner should spin */ +typedef enum gfx_mono_spinctrl_type_enum { + SPINTYPE_STRING, + SPINTYPE_INTEGER +} gfx_mono_spinctrl_type_t; + +/** String struct */ +struct gfx_mono_spinctrl_string { + /** Pointer to progmem strings to spin through + * \note Each string must be shorter than + * \ref GFX_MONO_SPINCTRL_STRING_SPINNER_WIDTH characters. + * If not, printing it to the screen will corrupt the spinner + * appearance. + */ + PROGMEM_STRING_T *data; + /** Index in string array */ + uint8_t index; +}; + +/** Spin control struct */ +struct gfx_mono_spinctrl { + /** Spinner title */ + PROGMEM_STRING_T title; + /** Type of data to spin */ + gfx_mono_spinctrl_type_t datatype; + /** Spinner data, depends on spinner datatype. */ + union { + /** Spinner strings and index */ + struct gfx_mono_spinctrl_string strings; + /** Spinner integer data */ + int16_t integer_data; + }; + /** Variable to store the last selected spinner value */ + uint16_t last_saved_value; + + /** + * Lower limit for spinning, must be positive and fit in uin8_t for + * spinner type SPINTYPE_STRING + */ + int16_t lower_limit; + + /** + * Upper limit for spinning, must be positive and fit in uin8_t for + * spinner type SPINTYPE_STRING + */ + int16_t upper_limit; + /** Y coordinate for placement of spinner on screen */ + gfx_coord_t y; + /** Boolean to tell if spinner is in focus or not */ + bool in_focus; + /** Pointer to next spinner in a spincollection */ + struct gfx_mono_spinctrl *next; + /** Pointer to previous spinner in a spincollection */ + struct gfx_mono_spinctrl *prev; +}; + +/** Collection of spinners struct */ +struct gfx_mono_spinctrl_spincollection { + /** Pointer to the first spinner in the collection */ + struct gfx_mono_spinctrl *collection; + /** Pointer to the last spinner in the collection */ + struct gfx_mono_spinctrl *collection_last; + /** Number of spinners in collection */ + uint8_t number_of_spinners; + /** Current spinner/button */ + uint8_t current_selection; + /** Return value from selected spinner */ + uint16_t selection; + /** Boolean to tell if input should be sent directly to a spinner */ + bool active_spinner; + /** Boolean to initialize results array when starting key processing */ + bool init; +}; + +void gfx_mono_spinctrl_init(struct gfx_mono_spinctrl *spinner, + gfx_mono_spinctrl_type_t datatype, PROGMEM_STRING_T title, + PROGMEM_STRING_T *data, int16_t lower_limit, + int16_t upper_limit, + gfx_coord_t y); +void gfx_mono_spinctrl_draw(struct gfx_mono_spinctrl *spinner, bool redraw); +void gfx_mono_spinctrl_spincollection_init(struct + gfx_mono_spinctrl_spincollection *collection); +void gfx_mono_spinctrl_spincollection_add_spinner(struct gfx_mono_spinctrl + *spinner, struct gfx_mono_spinctrl_spincollection *spinners); +void gfx_mono_spinctrl_spincollection_show(struct + gfx_mono_spinctrl_spincollection *spinners); +int16_t gfx_mono_spinctrl_process_key(struct gfx_mono_spinctrl *spinner, + uint8_t keycode); + +int16_t gfx_mono_spinctrl_spincollection_process_key(struct +gfx_mono_spinctrl_spincollection *spinners, uint8_t keycode, +int16_t results[]); + +/** @} */ + +#endif /* GFX_MONO_SPINCTRL_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_text.c b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_text.c new file mode 100644 index 00000000..1412c5ef --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_text.c @@ -0,0 +1,428 @@ +/** + * \file + * + * \brief Font and text drawing routines + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#include "stddef.h" +#include "assert.h" +#ifdef CONFIG_HUGEMEM +# include "hugemem.h" +#endif +#include "progmem.h" + +#include "gfx_mono.h" +#include "gfx_mono_text.h" + +#ifndef CONFIG_FONT_PIXELS_PER_BYTE +# define CONFIG_FONT_PIXELS_PER_BYTE 8 +#endif + +#define EXTMEM_BUF_SIZE 20 + +#if defined(CONFIG_HUGEMEM) || defined(__DOXYGEN__) + +/** + * \internal + * \brief Helper function that draws a character from a font in hugemem + * to the display + * + * This function will first calculate the start offset in the font character + * data before iterating over the specific character data. + * + * Only pixels in the character that should be enabled are done so, the caller + * is required to prepare the drawing area before printing a character to it. + * This is done by the gfx_mono_draw_string() and + * gfx_mono_draw_progmem_string() functions. + * + * \param ch Character to be drawn + * \param x X coordinate on screen. + * \param y Y coordinate on screen. + * \param font Font to draw character in + */ +static void gfx_mono_draw_char_hugemem(const char ch, const gfx_coord_t x, + const gfx_coord_t y, const struct font *font) +{ + uint8_t i; + uint8_t char_row_size; + uint8_t glyph_size; + uint16_t glyph_data_offset; + uint8_t char_buff[EXTMEM_BUF_SIZE]; + uint8_t buffer_pos; + uint8_t rows_left; + + /* Sanity check on parameters, assert if font is NULL. */ + Assert(font != NULL); + + gfx_coord_t inc_x = x; + gfx_coord_t inc_y = y; + + char_row_size = font->width / CONFIG_FONT_PIXELS_PER_BYTE; + if (font->width % CONFIG_FONT_PIXELS_PER_BYTE) { + char_row_size++; + } + + glyph_size = char_row_size * font->height; + glyph_data_offset = glyph_size * ((uint8_t)ch - font->first_char); + buffer_pos = EXTMEM_BUF_SIZE; + rows_left = font->height; + + do { + static uint8_t glyph_byte = 0; + uint8_t pixelsToDraw = font->width; + + for (i = 0; i < pixelsToDraw; i++) { + if (i % CONFIG_FONT_PIXELS_PER_BYTE == 0) { + /* Read another byte from hugemem */ + if (buffer_pos >= EXTMEM_BUF_SIZE) { + hugemem_ptr_t source + = font->data.hugemem; + source = (hugemem_ptr_t) + ((uint32_t)source + + glyph_data_offset); + + hugemem_read_block(char_buff, source, + EXTMEM_BUF_SIZE); + + glyph_data_offset += EXTMEM_BUF_SIZE; + buffer_pos = 0; + } + + glyph_byte = char_buff[buffer_pos]; + buffer_pos++; + } + + /* Draw bit of glyph to screen */ + if ((glyph_byte & 0x80)) { + gfx_mono_draw_pixel(inc_x, inc_y, + GFX_PIXEL_SET); + } + + inc_x += 1; + glyph_byte <<= 1; + } + + inc_y += 1; + inc_x = x; + } while (--rows_left > 0); +} + +#endif + +/** + * \internal + * \brief Helper function that draws a character from a font in progmem + * to the display + * + * This function will first calculate the start offset in the font character + * data before iterating over the specific character data. + * + * Only pixels in the character that should be enabled are done so, the caller + * is required to prepare the drawing area before printing a character to it. + * This is done by the gfx_mono_draw_string() and + * gfx_mono_draw_progmem_string() functions. + * + * \param ch Character to be drawn + * \param x X coordinate on screen. + * \param y Y coordinate on screen. + * \param font Font to draw character in + */ +static void gfx_mono_draw_char_progmem(const char ch, const gfx_coord_t x, + const gfx_coord_t y, const struct font *font) +{ + uint8_t PROGMEM_PTR_T glyph_data; + uint16_t glyph_data_offset; + uint8_t char_row_size; + uint8_t rows_left; + uint8_t i; + + /* Sanity check on parameters, assert if font is NULL. */ + Assert(font != NULL); + + gfx_coord_t inc_x = x; + gfx_coord_t inc_y = y; + + char_row_size = font->width / CONFIG_FONT_PIXELS_PER_BYTE; + if (font->width % CONFIG_FONT_PIXELS_PER_BYTE) { + char_row_size++; + } + + glyph_data_offset = char_row_size * font->height * + ((uint8_t)ch - font->first_char); + glyph_data = font->data.progmem + glyph_data_offset; + rows_left = font->height; + + do { + uint8_t glyph_byte = 0; + uint8_t pixelsToDraw = font->width; + + for (i = 0; i < pixelsToDraw; i++) { + if (i % CONFIG_FONT_PIXELS_PER_BYTE == 0) { + glyph_byte = PROGMEM_READ_BYTE(glyph_data); + glyph_data++; + } + + if ((glyph_byte & 0x80)) { + gfx_mono_draw_pixel(inc_x, inc_y, + GFX_PIXEL_SET); + } + + inc_x += 1; + glyph_byte <<= 1; + } + + inc_y += 1; + inc_x = x; + rows_left--; + } while (rows_left > 0); +} + +/** + * \brief Draws a character to the display + * + * \param c Character to be drawn + * \param x X coordinate on screen. + * \param y Y coordinate on screen. + * \param font Font to draw character in + */ +void gfx_mono_draw_char(const char c, const gfx_coord_t x, const gfx_coord_t y, + const struct font *font) +{ + gfx_mono_draw_filled_rect(x, y, font->width, font->height, + GFX_PIXEL_CLR); + + switch (font->type) { + case FONT_LOC_PROGMEM: + gfx_mono_draw_char_progmem(c, x, y, font); + break; + +#ifdef CONFIG_HUGEMEM + case FONT_LOC_HUGEMEM: + gfx_mono_draw_char_hugemem(c, x, y, font); + break; + +#endif + default: + /* Unsupported mode, call assert */ + Assert(false); + break; + } +} + +/** + * \brief Draws a string to the display + * + * This function will draw a string located in memory to the display. + * + * \param str Pointer to string + * \param x X coordinate on screen. + * \param y Y coordinate on screen. + * \param font Font to draw string in + */ +void gfx_mono_draw_string(const char *str, gfx_coord_t x, gfx_coord_t y, + const struct font *font) +{ + /* Save X in order to know where to return to on CR. */ + const gfx_coord_t start_of_string_position_x = x; + + /* Sanity check on parameters, assert if str or font is NULL. */ + Assert(str != NULL); + Assert(font != NULL); + + /* Draw characters until trailing null byte */ + do { + /* Handle '\n' as newline, draw normal characters. */ + if (*str == '\n') { + x = start_of_string_position_x; + y += font->height + 1; + } else if (*str == '\r') { + /* Skip '\r' characters. */ + } else { + gfx_mono_draw_char(*str, x, y, font); + x += font->width; + } + } while (*(++str)); +} + +/** + * \brief Draws a string located in program memory to the display + * + * This function will draw a string located in program memory to the display, + * this differs from gfx_mono_draw_string() by using constant string data from + * the program memory instead of string data in RAM. + * + * Using program memory for constant strings will reduce the applications need + * for RAM, and thus lower the overall size footprint. + * + * \param str Pointer to string located in program memory + * \param x X coordinate on screen. + * \param y Y coordinate on screen. + * \param font Font to draw string in + */ +void gfx_mono_draw_progmem_string(char PROGMEM_PTR_T str, gfx_coord_t x, + gfx_coord_t y, const struct font *font) +{ + char temp_char; + + /* Sanity check on parameters, assert if str or font is NULL. */ + Assert(str != NULL); + Assert(font != NULL); + + /* Save X in order to know where to return to on CR. */ + const gfx_coord_t start_of_string_position_x = x; + + /* Draw characters until trailing null byte */ + temp_char = PROGMEM_READ_BYTE((uint8_t PROGMEM_PTR_T)str); + + while (temp_char) { + /* Handle '\n' as newline, draw normal characters. */ + if (temp_char == '\n') { + x = start_of_string_position_x; + y += font->height + 1; + } else if (temp_char == '\r') { + /* Skip '\r' characters. */ + } else { + gfx_mono_draw_char(temp_char, x, y, font); + x += font->width; + } + + temp_char = PROGMEM_READ_BYTE((uint8_t PROGMEM_PTR_T)(++str)); + } +} + +/** + * \brief Computes the bounding box of a string + * + * \note If string is empty the returned width will be 1 pixel and the height + * equal to the font height. + * + * \param str String to calculate bounding box for + * \param font Font used + * \param width Pointer to width result + * \param height Pointer to height result + */ +void gfx_mono_get_string_bounding_box(const char *str, const struct font *font, + gfx_coord_t *width, gfx_coord_t *height) +{ + gfx_coord_t font_width = font->width; + gfx_coord_t font_height = font->height; + + gfx_coord_t max_width = 1; + gfx_coord_t max_height = font_height; + gfx_coord_t x = 0; + + /* Sanity check on parameters, assert if str or font is NULL. */ + Assert(str != NULL); + Assert(font != NULL); + + /* Handle each character until trailing null byte */ + do { + /* Handle '\n' as newline, draw normal characters. */ + if (*str == '\n') { + x = 0; + max_height += font_height; + } else if (*str == '\r') { + /* Skip '\r' characters. */ + } else { + x += font_width; + if (x > max_width) { + max_width = x; + } + } + } while (*(++str)); + + /* Return values through references */ + *width = max_width; + *height = max_height; +} + +/** + * \brief Computes the bounding box of a string located in program memory + * + * \note If string is empty the returned width will be 1 pixel and the height + * equal to the font height. + * + * \param str String in program memory to calculate bounding box for + * \param font Font used + * \param width Pointer to width result + * \param height Pointer to height result + */ +void gfx_mono_get_progmem_string_bounding_box(char PROGMEM_PTR_T str, + const struct font *font, gfx_coord_t *width, + gfx_coord_t *height) +{ + gfx_coord_t font_width = font->width; + gfx_coord_t font_height = font->height; + + char temp_char; + gfx_coord_t max_width = 1; + gfx_coord_t max_height = font_height; + gfx_coord_t x = 0; + + /* Sanity check on parameters, assert if str or font is NULL. */ + Assert(str != NULL); + Assert(font != NULL); + + /* Handle each character until trailing null byte */ + temp_char = PROGMEM_READ_BYTE((uint8_t PROGMEM_PTR_T)str); + + while (temp_char) { + /* Handle '\n' as newline, draw normal characters. */ + if (temp_char == '\n') { + x = 0; + max_height += font_height; + } else if (*str == '\r') { + /* Skip '\r' characters. */ + } else { + x += font_width; + if (x > max_width) { + max_width = x; + } + } + + temp_char = PROGMEM_READ_BYTE((uint8_t PROGMEM_PTR_T)(++str)); + } + + /* Return values through references */ + *width = max_width; + *height = max_height; +} diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_text.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_text.h new file mode 100644 index 00000000..ecbe790c --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/gfx_mono_text.h @@ -0,0 +1,131 @@ +/** + * \file + * + * \brief Monochrome graphic library API header file + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef GFX_MONO_TEXT_H_INCLUDED +#define GFX_MONO_TEXT_H_INCLUDED + +#include + +#include "compiler.h" +#include "progmem.h" +#ifdef CONFIG_HAVE_HUGEMEM +# include "hugemem.h" +#endif + +/** + * \ingroup gfx_mono + * \defgroup gfx_mono_font Font support + * This modules provides functionality for outputting a monochrome font + * to a display. + * + * @{ + */ + +/** + * \brief Valid storage locations for font data + * + * \todo Add support for fonts in regular ram + */ +enum font_data_type { + /** Font data stored in program/flash memory. */ + FONT_LOC_PROGMEM, +#ifdef CONFIG_HAVE_HUGEMEM + /** Font data stored in HUGEMEM. */ + FONT_LOC_HUGEMEM, +#endif +}; + +/** Storage structure for font meta data. */ +struct font { + /** Type of storage used for binary font data. See \ref font_data_type. */ + enum font_data_type type; + union { + /** + * Pointer to where the binary font data is stored. This + * variable is accessed either through hugemem or progmem + * depending on the value of \a type. + */ +#ifdef CONFIG_HAVE_HUGEMEM + hugemem_ptr_t hugemem; +#endif + uint8_t PROGMEM_PTR_T progmem; + } data; + /** Width of one font character, in pixels. */ + uint8_t width; + /** Height of one font character, in pixels. */ + uint8_t height; + /** ASCII value of first character in font set. */ + uint8_t first_char; + /** ASCII value of last character in the set. */ + uint8_t last_char; +}; + +/** \name Strings and characters located in RAM */ +/** @{ */ +void gfx_mono_draw_char(const char c, const gfx_coord_t x, const gfx_coord_t y, + const struct font *font); + +void gfx_mono_draw_string(const char *str, const gfx_coord_t x, + const gfx_coord_t y, const struct font *font); + +void gfx_mono_get_string_bounding_box(char const *str, const struct font *font, + gfx_coord_t *width, gfx_coord_t *height); + +/** @} */ + +/** \name Strings located in flash */ +/** @{ */ +void gfx_mono_draw_progmem_string(char PROGMEM_PTR_T str, gfx_coord_t x, + gfx_coord_t y, const struct font *font); + +void gfx_mono_get_progmem_string_bounding_box(char PROGMEM_PTR_T str, + const struct font *font, gfx_coord_t *width, + gfx_coord_t *height); + +/** @} */ + +/** @} */ + +#endif /* GFX_MONO_TEXT_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/sysfont.c b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/sysfont.c new file mode 100644 index 00000000..cd0d0275 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/sysfont.c @@ -0,0 +1,75 @@ +/** + * \file + * + * \brief Graphical font support + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#include +#include +#include +#include + +#include "conf_sysfont.h" + +#include "gfx_mono.h" +#include "sysfont.h" + +// Use macro from conf_sysfont.h to define font glyph data. +SYSFONT_DEFINE_GLYPHS; + +/** + * \brief Initialize a basic system font + * + * This initializes a basic system font globally usable by the application. + */ +struct font sysfont = { + .type = FONT_LOC_PROGMEM, + .width = SYSFONT_WIDTH, + .height = SYSFONT_HEIGHT, + .first_char = SYSFONT_FIRSTCHAR, + .last_char = SYSFONT_LASTCHAR, + .data = { + .progmem = sysfont_glyphs, + }, +}; + +/** @} */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/sysfont.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/sysfont.h new file mode 100644 index 00000000..8e57567b --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/sysfont.h @@ -0,0 +1,70 @@ +/** + * \file + * + * \brief Graphical System Font system + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef SYSFONT_H_INCLUDED +#define SYSFONT_H_INCLUDED + +#include "conf_sysfont.h" +#include "gfx_mono.h" +#include "gfx_mono_text.h" + +/** + * \ingroup gfx_mono_font + * \defgroup gfx_mono_sysfont System font + * + * The system font objects are globally available for a graphical application. + * System fonts are by design read only, hence there are not any functions to + * change them during runtime. If the application needs additional fonts it + * should add additional font objects. + * + * @{ + */ + +extern struct font sysfont; + +/** @} */ + +#endif /* SYSFONT_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/tools/bitmap.py b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/tools/bitmap.py new file mode 100644 index 00000000..fcddb9ca --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/tools/bitmap.py @@ -0,0 +1,58 @@ +## +# \file +# +# \brief Output a 2 color bitmap as an uint8_t array +# +# Copyright (C) 2011-2014 Atmel Corporation. All rights reserved. +# +# \page License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. The name of Atmel may not be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# 4. This software may only be redistributed and used in connection with an +# Atmel microcontroller product. +# +# THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +# EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +from PIL import Image +import sys + +im = Image.open(sys.argv[1]); +new_im = im.load() + +width, height = im.size + +for y in range(0, height) : + for x in range(0, width) : + if 0 < new_im[x, y]: + new_im[x, y] = 1 + sys.stdout.write(str(new_im[x, y])) + sys.stdout.write("\n") + +sys.stdout.write("\n uint8_t image_header[] = {\n") +for y in range(0, height, 8) : + for x in range(0, width) : + first_byte = str(new_im[x, y + 7]) + str(new_im[x, y+6]) + str(new_im[x, y+5]) + str(new_im[x, y+4]) + str(new_im[x, y+3]) + str(new_im[x, y+2]) + str(new_im[x, y+1]) + str(new_im[x, y+0]) + print "0x%x," % int(first_byte, 2), + +sys.stdout.write("};\n") diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/tools/dump_display_over_serial.py b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/tools/dump_display_over_serial.py new file mode 100644 index 00000000..5b532420 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/tools/dump_display_over_serial.py @@ -0,0 +1,133 @@ +## +# \file +# +# \brief Convert display data on a serial line to a graphical representation +# +# Copyright (C) 2011-2014 Atmel Corporation. All rights reserved. +# +# \page License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. The name of Atmel may not be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# 4. This software may only be redistributed and used in connection with an +# Atmel microcontroller product. +# +# THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +# EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import sys +import serial +import os.path +import argparse + +def scan_for_ports(): + available_ports = [] + + for index in range(64): + try: + serial_port = serial.Serial(index) + available_ports.append((index, serial_port.portstr)) + serial_port.close() + except serial.SerialException: + pass + except IndexError as Error: + pass + + for port_number, port_name in available_ports: + print "%02d - %s" % (port_number, port_name) + + return available_ports + +def dump_display_data(serial_port, baud_rate, output_file_name): + try: + output_file = open(output_file_name, 'w') + port = serial.Serial(port = serial_port, + baudrate = baud_rate, timeout = 1) + port.close() + port.open() + except ValueError as e: + print "error: invalid serial port parameters. %s" % (str(e)) + output_file.close() + return -1 + except serial.SerialException as e: + print "error: could not open serial port. %s" % (str(e)) + output_file.close() + return -1 + except IOError as e: + print "error: could not open output file. %s" % (str(e)) + return -1 + + print "Display on %s: %u,8,N,1" % (port.name, port.baudrate) + port.write("D") + line = port.readline() + display_data = "" + while(line[:2] != "};") : + display_data = display_data + line[:-1] + line = port.readline() + display_data = display_data + line + port.close() + + print "Writing data to file %s" % (output_file_name) + output_file.write(display_data) + + output_file.close() + +def main(): + parser = argparse.ArgumentParser(description="This script will try to " + "open the given serial port, send a string to " + "instruct the target device to dump the contents of " + "the display to a serial link in XPM format. The " + "received file is then written to 'display.xpm', " + "unless a file is specified by the -o option.") + parser.add_argument("-p", "--port", dest="serial_port", + help="which serial port to open") + parser.add_argument("-b", "--baud", dest="baudrate", type=int, + help="baud rate to use for serial communication", + default=19200) + parser.add_argument("-o", "--output", dest="output_file", + help="write XPM image to FILE. Default is display.xpm.", + metavar="FILE", default="display.xpm") + parser.add_argument("-s", "--scan", action="store_true", + dest="scan_ports", + help="scan for available serial ports and exit", + default=False) + + arguments = parser.parse_args() + + if arguments.scan_ports: + scan_for_ports() + sys.exit() + + if arguments.serial_port is None: + parser.print_usage() + sys.exit() + + if os.path.exists(arguments.output_file): + print "Warning: output file '%s' already exists" % (arguments.output_file) + print "Do you want to write over file '%s'?" % (arguments.output_file) + answer = raw_input("[yes/NO] ") + if answer not in ("yes", "Yes", "YES"): + sys.exit() + + dump_display_data(arguments.serial_port, arguments.baudrate, arguments.output_file) + +if __name__ == "__main__": + main() diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/tools/readme.txt b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/tools/readme.txt new file mode 100644 index 00000000..ebe2b166 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gfx_mono/tools/readme.txt @@ -0,0 +1,6 @@ + +dump_display_over_serial.py + Convert display data on a serial line to a .XPM file + +bitmap.py + Convert an indexed 2 color bitmap to an uint8_t array diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gpio/gpio.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gpio/gpio.h new file mode 100644 index 00000000..2b261aad --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gpio/gpio.h @@ -0,0 +1,86 @@ +/** + * \file + * + * \brief Common GPIO API. + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef _GPIO_H_ +#define _GPIO_H_ + +#include + +#if (SAM3S || SAM3U || SAM3N || SAM3XA || SAM4S || SAM4E || SAM4N || SAM4C || SAMG || SAM4CP || SAM4CM) +# include "sam_gpio/sam_gpio.h" +#elif XMEGA +# include "xmega_gpio/xmega_gpio.h" +#elif MEGA || MEGA_RF +# include "mega_gpio/mega_gpio.h" +#else +# error Unsupported chip type +#endif + +/** + * \defgroup gpio_group General Purpose Input/Output + * + * This is the common API for GPIO. Additional features are available + * in the documentation of the specific modules. + * + * \section io_group_platform Platform Dependencies + * + * The following functions are available on all platforms, but there may + * be variations in the function signature (i.e. parameters) and + * behaviour. These functions are typically called by platform-specific + * parts of drivers, and applications that aren't intended to be + * portable: + * - gpio_pin_is_low() + * - gpio_pin_is_high() + * - gpio_set_pin_high() + * - gpio_set_pin_group_high() + * - gpio_set_pin_low() + * - gpio_set_pin_group_low() + * - gpio_toggle_pin() + * - gpio_toggle_pin_group() + * - gpio_configure_pin() + * - gpio_configure_group() + */ + +#endif /* _GPIO_H_ */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/gpio/xmega_gpio/xmega_gpio.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gpio/xmega_gpio/xmega_gpio.h new file mode 100644 index 00000000..110d9c36 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/gpio/xmega_gpio/xmega_gpio.h @@ -0,0 +1,83 @@ +/** + * \file + * + * \brief Common gpio data/structure for all AVR XMEGA implementations. + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _XMEGA_GPIO_H_ +#define _XMEGA_GPIO_H_ + +#include "compiler.h" +#include "ioport.h" + +#define gpio_pin_is_low(io_id) \ + ioport_pin_is_low(io_id) + +#define gpio_pin_is_high(io_id) \ + ioport_pin_is_high(io_id) + +#define gpio_set_pin_high(io_id) \ + ioport_set_value(io_id,1) + +#define gpio_set_pin_low(io_id) \ + ioport_set_value(io_id,0) + +#define gpio_toggle_pin(io_id) \ + ioport_toggle_pin(io_id) + +#define gpio_configure_pin(io_id,io_flags) \ + ioport_configure_pin(io_id,io_flags) + +#define gpio_configure_group(port_id,port_mask,io_flags) \ + ioport_configure_group(port_id,port_mask,io_flags) + +#define gpio_set_pin_group_high(port_id,mask) \ + ioport_set_group_high(port_id,mask) + +#define gpio_set_pin_group_low(port_id,mask) \ + ioport_set_group_low(port_id,mask) + +#define gpio_toggle_pin_group(port_id,mask) \ + ioport_tgl_group(port_id,mask) + +#endif // _XMEGA_GPIO_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/ioport/ioport.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/ioport/ioport.h new file mode 100644 index 00000000..a0320956 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/ioport/ioport.h @@ -0,0 +1,541 @@ +/** + * \file + * + * \brief Common IOPORT service main header file for AVR, UC3 and ARM + * architectures. + * + * Copyright (c) 2012-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef IOPORT_H +#define IOPORT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/** + * \defgroup ioport_group Common IOPORT API + * + * See \ref ioport_quickstart. + * + * This is common IOPORT service for GPIO pin configuration and control in a + * standardized manner across the MEGA, MEGA_RF, XMEGA, UC3 and ARM devices. + * + * Port pin control code is optimized for each platform, and should produce + * both compact and fast execution times when used with constant values. + * + * \section dependencies Dependencies + * This driver depends on the following modules: + * - \ref sysclk_group for clock speed and functions. + * @{ + */ + +/** + * \def IOPORT_CREATE_PIN(port, pin) + * \brief Create IOPORT pin number + * + * Create a IOPORT pin number for use with the IOPORT functions. + * + * \param port IOPORT port (e.g. PORTA, PA or PIOA depending on chosen + * architecture) + * \param pin IOPORT zero-based index of the I/O pin + */ + +/** \brief IOPORT pin directions */ +enum ioport_direction { + IOPORT_DIR_INPUT, /*!< IOPORT input direction */ + IOPORT_DIR_OUTPUT, /*!< IOPORT output direction */ +}; + +/** \brief IOPORT levels */ +enum ioport_value { + IOPORT_PIN_LEVEL_LOW, /*!< IOPORT pin value low */ + IOPORT_PIN_LEVEL_HIGH, /*!< IOPORT pin value high */ +}; + +#if MEGA_RF +/** \brief IOPORT edge sense modes */ +enum ioport_sense { + IOPORT_SENSE_LEVEL, /*!< IOPORT sense low level */ + IOPORT_SENSE_BOTHEDGES, /*!< IOPORT sense both rising and falling edges */ + IOPORT_SENSE_FALLING, /*!< IOPORT sense falling edges */ + IOPORT_SENSE_RISING, /*!< IOPORT sense rising edges */ +}; +#elif SAM && !SAM4L +/** \brief IOPORT edge sense modes */ +enum ioport_sense { + IOPORT_SENSE_BOTHEDGES, /*!< IOPORT sense both rising and falling edges */ + IOPORT_SENSE_FALLING, /*!< IOPORT sense falling edges */ + IOPORT_SENSE_RISING, /*!< IOPORT sense rising edges */ + IOPORT_SENSE_LEVEL_LOW, /*!< IOPORT sense low level */ + IOPORT_SENSE_LEVEL_HIGH,/*!< IOPORT sense High level */ +}; +#else +enum ioport_sense { + IOPORT_SENSE_BOTHEDGES, /*!< IOPORT sense both rising and falling edges */ + IOPORT_SENSE_RISING, /*!< IOPORT sense rising edges */ + IOPORT_SENSE_FALLING, /*!< IOPORT sense falling edges */ +}; +#endif + + +#if XMEGA +# include "xmega/ioport.h" +# if defined(IOPORT_XMEGA_COMPAT) +# include "xmega/ioport_compat.h" +# endif +#elif MEGA +# include "mega/ioport.h" +#elif UC3 +# include "uc3/ioport.h" +#elif SAM +# if SAM4L +# include "sam/ioport_gpio.h" +# elif (SAMD20 | SAMD21) +# include "sam0/ioport.h" +# else +# include "sam/ioport_pio.h" +# endif +#endif + +/** + * \brief Initializes the IOPORT service, ready for use. + * + * This function must be called before using any other functions in the IOPORT + * service. + */ +static inline void ioport_init(void) +{ + arch_ioport_init(); +} + +/** + * \brief Enable an IOPORT pin, based on a pin created with \ref + * IOPORT_CREATE_PIN(). + * + * \param pin IOPORT pin to enable + */ +static inline void ioport_enable_pin(ioport_pin_t pin) +{ + arch_ioport_enable_pin(pin); +} + +/** + * \brief Enable multiple pins in a single IOPORT port. + * + * \param port IOPORT port to enable + * \param mask Mask of pins within the port to enable + */ +static inline void ioport_enable_port(ioport_port_t port, + ioport_port_mask_t mask) +{ + arch_ioport_enable_port(port, mask); +} + +/** + * \brief Disable IOPORT pin, based on a pin created with \ref + * IOPORT_CREATE_PIN(). + * + * \param pin IOPORT pin to disable + */ +static inline void ioport_disable_pin(ioport_pin_t pin) +{ + arch_ioport_disable_pin(pin); +} + +/** + * \brief Disable multiple pins in a single IOPORT port. + * + * \param port IOPORT port to disable + * \param mask Pin mask of pins to disable + */ +static inline void ioport_disable_port(ioport_port_t port, + ioport_port_mask_t mask) +{ + arch_ioport_disable_port(port, mask); +} + +/** + * \brief Set multiple pin modes in a single IOPORT port, such as pull-up, + * pull-down, etc. configuration. + * + * \param port IOPORT port to configure + * \param mask Pin mask of pins to configure + * \param mode Mode masks to configure for the specified pins (\ref + * ioport_modes) + */ +static inline void ioport_set_port_mode(ioport_port_t port, + ioport_port_mask_t mask, ioport_mode_t mode) +{ + arch_ioport_set_port_mode(port, mask, mode); +} + +/** + * \brief Set pin mode for one single IOPORT pin. + * + * \param pin IOPORT pin to configure + * \param mode Mode masks to configure for the specified pin (\ref ioport_modes) + */ +static inline void ioport_set_pin_mode(ioport_pin_t pin, ioport_mode_t mode) +{ + arch_ioport_set_pin_mode(pin, mode); +} + +/** + * \brief Reset multiple pin modes in a specified IOPORT port to defaults. + * + * \param port IOPORT port to configure + * \param mask Mask of pins whose mode configuration is to be reset + */ +static inline void ioport_reset_port_mode(ioport_port_t port, + ioport_port_mask_t mask) +{ + arch_ioport_set_port_mode(port, mask, 0); +} + +/** + * \brief Reset pin mode configuration for a single IOPORT pin + * + * \param pin IOPORT pin to configure + */ +static inline void ioport_reset_pin_mode(ioport_pin_t pin) +{ + arch_ioport_set_pin_mode(pin, 0); +} + +/** + * \brief Set I/O direction for a group of pins in a single IOPORT. + * + * \param port IOPORT port to configure + * \param mask Pin mask of pins to configure + * \param dir Direction to set for the specified pins (\ref ioport_direction) + */ +static inline void ioport_set_port_dir(ioport_port_t port, + ioport_port_mask_t mask, enum ioport_direction dir) +{ + arch_ioport_set_port_dir(port, mask, dir); +} + +/** + * \brief Set direction for a single IOPORT pin. + * + * \param pin IOPORT pin to configure + * \param dir Direction to set for the specified pin (\ref ioport_direction) + */ +static inline void ioport_set_pin_dir(ioport_pin_t pin, + enum ioport_direction dir) +{ + arch_ioport_set_pin_dir(pin, dir); +} + +/** + * \brief Set an IOPORT pin to a specified logical value. + * + * \param pin IOPORT pin to configure + * \param level Logical value of the pin + */ +static inline void ioport_set_pin_level(ioport_pin_t pin, bool level) +{ + arch_ioport_set_pin_level(pin, level); +} + +/** + * \brief Set a group of IOPORT pins in a single port to a specified logical + * value. + * + * \param port IOPORT port to write to + * \param mask Pin mask of pins to modify + * \param level Level of the pins to be modified + */ +static inline void ioport_set_port_level(ioport_port_t port, + ioport_port_mask_t mask, ioport_port_mask_t level) +{ + arch_ioport_set_port_level(port, mask, level); +} + +/** + * \brief Get current value of an IOPORT pin, which has been configured as an + * input. + * + * \param pin IOPORT pin to read + * \return Current logical value of the specified pin + */ +static inline bool ioport_get_pin_level(ioport_pin_t pin) +{ + return arch_ioport_get_pin_level(pin); +} + +/** + * \brief Get current value of several IOPORT pins in a single port, which have + * been configured as an inputs. + * + * \param port IOPORT port to read + * \param mask Pin mask of pins to read + * \return Logical levels of the specified pins from the read port, returned as + * a mask. + */ +static inline ioport_port_mask_t ioport_get_port_level(ioport_pin_t port, + ioport_port_mask_t mask) +{ + return arch_ioport_get_port_level(port, mask); +} + +/** + * \brief Toggle the value of an IOPORT pin, which has previously configured as + * an output. + * + * \param pin IOPORT pin to toggle + */ +static inline void ioport_toggle_pin_level(ioport_pin_t pin) +{ + arch_ioport_toggle_pin_level(pin); +} + +/** + * \brief Toggle the values of several IOPORT pins located in a single port. + * + * \param port IOPORT port to modify + * \param mask Pin mask of pins to toggle + */ +static inline void ioport_toggle_port_level(ioport_port_t port, + ioport_port_mask_t mask) +{ + arch_ioport_toggle_port_level(port, mask); +} + +/** + * \brief Set the pin sense mode of a single IOPORT pin. + * + * \param pin IOPORT pin to configure + * \param pin_sense Edge to sense for the pin (\ref ioport_sense) + */ +static inline void ioport_set_pin_sense_mode(ioport_pin_t pin, + enum ioport_sense pin_sense) +{ + arch_ioport_set_pin_sense_mode(pin, pin_sense); +} + +/** + * \brief Set the pin sense mode of a multiple IOPORT pins on a single port. + * + * \param port IOPORT port to configure + * \param mask Bitmask if pins whose edge sense is to be configured + * \param pin_sense Edge to sense for the pins (\ref ioport_sense) + */ +static inline void ioport_set_port_sense_mode(ioport_port_t port, + ioport_port_mask_t mask, + enum ioport_sense pin_sense) +{ + arch_ioport_set_port_sense_mode(port, mask, pin_sense); +} + +/** + * \brief Convert a pin ID into a its port ID. + * + * \param pin IOPORT pin ID to convert + * \retval Port ID for the given pin ID + */ +static inline ioport_port_t ioport_pin_to_port_id(ioport_pin_t pin) +{ + return arch_ioport_pin_to_port_id(pin); +} + +/** + * \brief Convert a pin ID into a bitmask mask for the given pin on its port. + * + * \param pin IOPORT pin ID to convert + * \retval Bitmask with a bit set that corresponds to the given pin ID in its port + */ +static inline ioport_port_mask_t ioport_pin_to_mask(ioport_pin_t pin) +{ + return arch_ioport_pin_to_mask(pin); +} + +/** @} */ + +/** + * \page ioport_quickstart Quick start guide for the common IOPORT service + * + * This is the quick start guide for the \ref ioport_group, with + * step-by-step instructions on how to configure and use the service in a + * selection of use cases. + * + * The use cases contain several code fragments. The code fragments in the + * steps for setup can be copied into a custom initialization function, while + * the steps for usage can be copied into, e.g., the main application function. + * + * \section ioport_quickstart_basic Basic use case + * In this use case we will configure one IO pin for button input and one for + * LED control. Then it will read the button state and output it on the LED. + * + * \section ioport_quickstart_basic_setup Setup steps + * + * \subsection ioport_quickstart_basic_setup_code Example code + * \code + #define MY_LED IOPORT_CREATE_PIN(PORTA, 5) + #define MY_BUTTON IOPORT_CREATE_PIN(PORTA, 6) + + ioport_init(); + + ioport_set_pin_dir(MY_LED, IOPORT_DIR_OUTPUT); + ioport_set_pin_dir(MY_BUTTON, IOPORT_DIR_INPUT); + ioport_set_pin_mode(MY_BUTTON, IOPORT_MODE_PULLUP); +\endcode + * + * \subsection ioport_quickstart_basic_setup_flow Workflow + * -# It's useful to give the GPIOs symbolic names and this can be done with + * the \ref IOPORT_CREATE_PIN macro. We define one for a LED and one for a + * button. + * - \code + #define MY_LED IOPORT_CREATE_PIN(PORTA, 5) + #define MY_BUTTON IOPORT_CREATE_PIN(PORTA, 6) +\endcode + * - \note The usefulness of the \ref IOPORT_CREATE_PIN macro and port names + * differ between architectures: + * - MEGA, MEGA_RF and XMEGA: Use \ref IOPORT_CREATE_PIN macro with port definitions + * PORTA, PORTB ... + * - UC3: Most convenient to pick up the device header file pin definition + * and us it directly. E.g.: AVR32_PIN_PB06 + * - SAM: Most convenient to pick up the device header file pin definition + * and us it directly. E.g.: PIO_PA5_IDX
+ * \ref IOPORT_CREATE_PIN can also be used with port definitions + * PIOA, PIOB ... + * -# Initialize the ioport service. This typically enables the IO module if + * needed. + * - \code ioport_init(); \endcode + * -# Set the LED GPIO as output: + * - \code ioport_set_pin_dir(MY_LED, IOPORT_DIR_OUTPUT); \endcode + * -# Set the button GPIO as input: + * - \code ioport_set_pin_dir(MY_BUTTON, IOPORT_DIR_INPUT); \endcode + * -# Enable pull-up for the button GPIO: + * - \code ioport_set_pin_mode(MY_BUTTON, IOPORT_MODE_PULLUP); \endcode + * + * \section ioport_quickstart_basic_usage Usage steps + * + * \subsection ioport_quickstart_basic_usage_code Example code + * \code + bool value; + + value = ioport_get_pin_level(MY_BUTTON); + ioport_set_pin_level(MY_LED, value); +\endcode + * + * \subsection ioport_quickstart_basic_usage_flow Workflow + * -# Define a boolean variable for state storage: + * - \code bool value; \endcode + * -# Read out the button level into variable value: + * - \code value = ioport_get_pin_level(MY_BUTTON); \endcode + * -# Set the LED to read out value from the button: + * - \code ioport_set_pin_level(MY_LED, value); \endcode + * + * \section ioport_quickstart_advanced Advanced use cases + * - \subpage ioport_quickstart_use_case_1 : Port access + */ + +/** + * \page ioport_quickstart_use_case_1 Advanced use case doing port access + * + * In this case we will read out the pins from one whole port and write the + * read value to another port. + * + * \section ioport_quickstart_use_case_1_setup Setup steps + * + * \subsection ioport_quickstart_use_case_1_setup_code Example code + * \code + #define IN_PORT IOPORT_PORTA + #define OUT_PORT IOPORT_PORTB + #define MASK 0x00000060 + + ioport_init(); + + ioport_set_port_dir(IN_PORT, MASK, IOPORT_DIR_INPUT); + ioport_set_port_dir(OUT_PORT, MASK, IOPORT_DIR_OUTPUT); +\endcode + * + * \subsection ioport_quickstart_basic_setup_flow Workflow + * -# It's useful to give the ports symbolic names: + * - \code + #define IN_PORT IOPORT_PORTA + #define OUT_PORT IOPORT_PORTB +\endcode + * - \note The port names differ between architectures: + * - MEGA_RF, MEGA and XMEGA: There are predefined names for ports: IOPORT_PORTA, + * IOPORT_PORTB ... + * - UC3: Use the index value of the different IO blocks: 0, 1 ... + * - SAM: There are predefined names for ports: IOPORT_PIOA, IOPORT_PIOB + * ... + * -# Also useful to define a mask for the bits to work with: + * - \code #define MASK 0x00000060 \endcode + * -# Initialize the ioport service. This typically enables the IO module if + * needed. + * - \code ioport_init(); \endcode + * -# Set one of the ports as input: + * - \code ioport_set_pin_dir(IN_PORT, MASK, IOPORT_DIR_INPUT); \endcode + * -# Set the other port as output: + * - \code ioport_set_pin_dir(OUT_PORT, MASK, IOPORT_DIR_OUTPUT); \endcode + * + * \section ioport_quickstart_basic_usage Usage steps + * + * \subsection ioport_quickstart_basic_usage_code Example code + * \code + ioport_port_mask_t value; + + value = ioport_get_port_level(IN_PORT, MASK); + ioport_set_port_level(OUT_PORT, MASK, value); +\endcode + * + * \subsection ioport_quickstart_basic_usage_flow Workflow + * -# Define a variable for port date storage: + * - \code ioport_port_mask_t value; \endcode + * -# Read out from one port: + * - \code value = ioport_get_port_level(IN_PORT, MASK); \endcode + * -# Put the read data out on the other port: + * - \code ioport_set_port_level(OUT_PORT, MASK, value); \endcode + */ + +#ifdef __cplusplus +} +#endif + +#endif /* IOPORT_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/ioport/xmega/ioport.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/ioport/xmega/ioport.h new file mode 100644 index 00000000..00b66e8b --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/ioport/xmega/ioport.h @@ -0,0 +1,364 @@ +/** + * \file + * + * \brief XMEGA architecture specific IOPORT service implementation header file. + * + * Copyright (c) 2012-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef IOPORT_XMEGA_H +#define IOPORT_XMEGA_H + +#define IOPORT_CREATE_PIN(port, pin) ((IOPORT_ ## port) * 8 + (pin)) +#define IOPORT_BASE_ADDRESS 0x600 +#define IOPORT_PORT_OFFSET 0x20 + +/** \name IOPORT port numbers */ +/** @{ */ +#if !XMEGA_B3 +# define IOPORT_PORTA 0 +#endif + +#define IOPORT_PORTB 1 +#define IOPORT_PORTC 2 +#define IOPORT_PORTD 3 + +#if !XMEGA_B3 +# define IOPORT_PORTE 4 +#endif + +#if XMEGA_A1 || XMEGA_A1U || XMEGA_A3 || XMEGA_A3U || XMEGA_A3B || XMEGA_A3BU || \ + XMEGA_C3 || XMEGA_D3 +# define IOPORT_PORTF 5 +#endif + +#if XMEGA_B1 || XMEGA_B3 +# define IOPORT_PORTG 6 +#endif + +#if XMEGA_A1 || XMEGA_A1U +# define IOPORT_PORTH 7 +# define IOPORT_PORTJ 8 +# define IOPORT_PORTK 9 +#endif + +#if XMEGA_B1 || XMEGA_B3 +# define IOPORT_PORTM 11 +#endif + +#if XMEGA_A1 || XMEGA_A1U +# define IOPORT_PORTQ 14 +#endif + +#define IOPORT_PORTR 15 +/** @} */ + +/** + * \weakgroup ioport_group + * \section ioport_modes IOPORT Modes + * + * For details on these please see the XMEGA Manual. + * + * @{ + */ + +/** \name IOPORT Mode bit definitions */ +/** @{ */ +#define IOPORT_MODE_TOTEM (0x00 << 3) /*!< Totem-pole */ +#define IOPORT_MODE_BUSKEEPER (0x01 << 3) /*!< Buskeeper */ +#define IOPORT_MODE_PULLDOWN (0x02 << 3) /*!< Pull-down */ +#define IOPORT_MODE_PULLUP (0x03 << 3) /*!< Pull-up */ +#define IOPORT_MODE_WIREDOR (0x04 << 3) /*!< Wired OR */ +#define IOPORT_MODE_WIREDAND (0x05 << 3) /*!< Wired AND */ +#define IOPORT_MODE_WIREDORPULL (0x06 << 3) /*!< Wired OR with pull-down */ +#define IOPORT_MODE_WIREDANDPULL (0x07 << 3) /*!< Wired AND with pull-up */ +#define IOPORT_MODE_INVERT_PIN (0x01 << 6) /*!< Invert output and input */ +#define IOPORT_MODE_SLEW_RATE_LIMIT (0x01 << 7) /*!< Slew rate limiting */ +/** @} */ + +/** @} */ + +typedef uint8_t ioport_mode_t; +typedef uint8_t ioport_pin_t; +typedef uint8_t ioport_port_t; +typedef uint8_t ioport_port_mask_t; + +__always_inline static ioport_port_t arch_ioport_pin_to_port_id(ioport_pin_t pin) +{ + return pin >> 3; +} + +__always_inline static PORT_t *arch_ioport_port_to_base(ioport_port_t port) +{ + return (PORT_t *)((uintptr_t)IOPORT_BASE_ADDRESS + + (port * IOPORT_PORT_OFFSET)); +} + +__always_inline static PORT_t *arch_ioport_pin_to_base(ioport_pin_t pin) +{ + return arch_ioport_port_to_base(arch_ioport_pin_to_port_id(pin)); +} + +__always_inline static ioport_port_mask_t arch_ioport_pin_to_mask( + ioport_pin_t pin) +{ + return 1U << (pin & 0x07); +} + +__always_inline static ioport_port_mask_t arch_ioport_pin_to_index( + ioport_pin_t pin) +{ + return (pin & 0x07); +} + +__always_inline static void arch_ioport_init(void) +{ +} + +__always_inline static void arch_ioport_enable_port(ioport_port_t port, + ioport_port_mask_t mask) +{ + PORT_t *base = arch_ioport_port_to_base(port); + volatile uint8_t *pin_ctrl = &base->PIN0CTRL; + + uint8_t flags = cpu_irq_save(); + + for (uint8_t i = 0; i < 8; i++) { + if (mask & arch_ioport_pin_to_mask(i)) { + pin_ctrl[i] &= ~PORT_ISC_gm; + } + } + + cpu_irq_restore(flags); +} + +__always_inline static void arch_ioport_enable_pin(ioport_pin_t pin) +{ + PORT_t *base = arch_ioport_pin_to_base(pin); + volatile uint8_t *pin_ctrl + = (&base->PIN0CTRL + arch_ioport_pin_to_index(pin)); + + uint8_t flags = cpu_irq_save(); + + *pin_ctrl &= ~PORT_ISC_gm; + + cpu_irq_restore(flags); +} + +__always_inline static void arch_ioport_disable_port(ioport_port_t port, + ioport_port_mask_t mask) +{ + PORT_t *base = arch_ioport_port_to_base(port); + volatile uint8_t *pin_ctrl = &base->PIN0CTRL; + + uint8_t flags = cpu_irq_save(); + + for (uint8_t i = 0; i < 8; i++) { + if (mask & arch_ioport_pin_to_mask(i)) { + pin_ctrl[i] |= PORT_ISC_INPUT_DISABLE_gc; + } + } + + cpu_irq_restore(flags); +} + +__always_inline static void arch_ioport_disable_pin(ioport_pin_t pin) +{ + PORT_t *base = arch_ioport_pin_to_base(pin); + volatile uint8_t *pin_ctrl + = (&base->PIN0CTRL + arch_ioport_pin_to_index(pin)); + + uint8_t flags = cpu_irq_save(); + + *pin_ctrl |= PORT_ISC_INPUT_DISABLE_gc; + + cpu_irq_restore(flags); +} + +__always_inline static void arch_ioport_set_port_mode(ioport_port_t port, + ioport_port_mask_t mask, ioport_mode_t mode) +{ + PORT_t *base = arch_ioport_port_to_base(port); + volatile uint8_t *pin_ctrl = &base->PIN0CTRL; + uint8_t new_mode_bits = (mode & ~PORT_ISC_gm); + + uint8_t flags = cpu_irq_save(); + + for (uint8_t i = 0; i < 8; i++) { + if (mask & arch_ioport_pin_to_mask(i)) { + pin_ctrl[i] + = (pin_ctrl[i] & + PORT_ISC_gm) | new_mode_bits; + } + } + + cpu_irq_restore(flags); +} + +__always_inline static void arch_ioport_set_pin_mode(ioport_pin_t pin, + ioport_mode_t mode) +{ + PORT_t *base = arch_ioport_pin_to_base(pin); + volatile uint8_t *pin_ctrl + = (&base->PIN0CTRL + arch_ioport_pin_to_index(pin)); + + uint8_t flags = cpu_irq_save(); + + *pin_ctrl &= PORT_ISC_gm; + *pin_ctrl |= mode; + + cpu_irq_restore(flags); +} + +__always_inline static void arch_ioport_set_port_dir(ioport_port_t port, + ioport_port_mask_t mask, enum ioport_direction dir) +{ + PORT_t *base = arch_ioport_port_to_base(port); + + if (dir == IOPORT_DIR_OUTPUT) { + base->DIRSET = mask; + } else if (dir == IOPORT_DIR_INPUT) { + base->DIRCLR = mask; + } +} + +__always_inline static void arch_ioport_set_pin_dir(ioport_pin_t pin, + enum ioport_direction dir) +{ + PORT_t *base = arch_ioport_pin_to_base(pin); + + if (dir == IOPORT_DIR_OUTPUT) { + base->DIRSET = arch_ioport_pin_to_mask(pin); + } else if (dir == IOPORT_DIR_INPUT) { + base->DIRCLR = arch_ioport_pin_to_mask(pin); + } +} + +__always_inline static void arch_ioport_set_pin_level(ioport_pin_t pin, + bool level) +{ + PORT_t *base = arch_ioport_pin_to_base(pin); + + if (level) { + base->OUTSET = arch_ioport_pin_to_mask(pin); + } else { + base->OUTCLR = arch_ioport_pin_to_mask(pin); + } +} + +__always_inline static void arch_ioport_set_port_level(ioport_port_t port, + ioport_port_mask_t mask, ioport_port_mask_t level) +{ + PORT_t *base = arch_ioport_port_to_base(port); + if (level) { + base->OUTSET |= mask; + base->OUTCLR &= ~mask; + } else { + base->OUTSET &= ~mask; + base->OUTCLR |= mask; + } +} + +__always_inline static bool arch_ioport_get_pin_level(ioport_pin_t pin) +{ + PORT_t *base = arch_ioport_pin_to_base(pin); + + return base->IN & arch_ioport_pin_to_mask(pin); +} + +__always_inline static ioport_port_mask_t arch_ioport_get_port_level( + ioport_port_t port, ioport_port_mask_t mask) +{ + PORT_t *base = arch_ioport_port_to_base(port); + + return base->IN & mask; +} + +__always_inline static void arch_ioport_toggle_pin_level(ioport_pin_t pin) +{ + PORT_t *base = arch_ioport_pin_to_base(pin); + + base->OUTTGL = arch_ioport_pin_to_mask(pin); +} + +__always_inline static void arch_ioport_toggle_port_level(ioport_port_t port, + ioport_port_mask_t mask) +{ + PORT_t *base = arch_ioport_port_to_base(port); + + base->OUTTGL = mask; +} + +__always_inline static void arch_ioport_set_pin_sense_mode(ioport_pin_t pin, + enum ioport_sense pin_sense) +{ + PORT_t *base = arch_ioport_pin_to_base(pin); + volatile uint8_t *pin_ctrl + = (&base->PIN0CTRL + arch_ioport_pin_to_index(pin)); + + uint8_t flags = cpu_irq_save(); + + *pin_ctrl &= ~PORT_ISC_gm; + *pin_ctrl |= (pin_sense & PORT_ISC_gm); + + cpu_irq_restore(flags); +} + +__always_inline static void arch_ioport_set_port_sense_mode(ioport_port_t port, + ioport_port_mask_t mask, enum ioport_sense pin_sense) +{ + PORT_t *base = arch_ioport_port_to_base(port); + volatile uint8_t *pin_ctrl = &base->PIN0CTRL; + uint8_t new_sense_bits = (pin_sense & PORT_ISC_gm); + + uint8_t flags = cpu_irq_save(); + + for (uint8_t i = 0; i < 8; i++) { + if (mask & arch_ioport_pin_to_mask(i)) { + pin_ctrl[i] + = (pin_ctrl[i] & + ~PORT_ISC_gm) | new_sense_bits; + } + } + + cpu_irq_restore(flags); +} + +#endif /* IOPORT_XMEGA_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/ioport/xmega/ioport_compat.c b/AVR Code/USB_BULK_TEST/src/ASF/common/services/ioport/xmega/ioport_compat.c new file mode 100644 index 00000000..ce47189a --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/ioport/xmega/ioport_compat.c @@ -0,0 +1,73 @@ +/** + * \file + * + * \brief XMEGA legacy IOPORT software compatibility driver interface. + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#include "ioport_compat.h" + +#if defined(IOPORT_XMEGA_COMPAT) +void ioport_configure_port_pin(void *port, pin_mask_t pin_mask, + port_pin_flags_t flags) +{ + uint8_t pin; + + for (pin = 0; pin < 8; pin++) { + if (pin_mask & (1 << pin)) { + *((uint8_t *)port + PORT_PIN0CTRL + pin) = flags >> 8; + } + } + /* Select direction and initial pin state */ + if (flags & IOPORT_DIR_OUTPUT) { + if (flags & IOPORT_INIT_HIGH) { + *((uint8_t *)port + PORT_OUTSET) = pin_mask; + } else { + *((uint8_t *)port + PORT_OUTCLR) = pin_mask; + } + + *((uint8_t *)port + PORT_DIRSET) = pin_mask; + } else { + *((uint8_t *)port + PORT_DIRCLR) = pin_mask; + } +} + +#endif diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/ioport/xmega/ioport_compat.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/ioport/xmega/ioport_compat.h new file mode 100644 index 00000000..aaba63f4 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/ioport/xmega/ioport_compat.h @@ -0,0 +1,321 @@ +/** + * \file + * + * \brief XMEGA legacy IOPORT software compatibility driver interface header + * file. + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef IOPORT_XMEGA_COMPAT_H_ +#define IOPORT_XMEGA_COMPAT_H_ + +#include "../ioport.h" + +/** + * \brief A pin mask + * + * This type is used to describe the port pin mask on the part. + */ +typedef uint8_t pin_mask_t; + +/** + * \brief A PORT pin + * + * This type is used to describe the PORT pins on the part. + */ +typedef uint8_t port_pin_t; + +/** + * \brief Pin configuration flags + * + * This is a bitmask containing configuration flags for the pins that shall be + * configured. + */ +typedef uint16_t port_pin_flags_t; + +/** + * \brief A port id + * + * This type is used to describe the port id on the part (0 is PORTA). + */ +typedef uint8_t port_id_t; + +/** \name Initial Output State Flags */ +/** @{ */ +#define IOPORT_INIT_LOW (0 << 1) /*!< Initial Output State Low */ +#define IOPORT_INIT_HIGH (1 << 1) /*!< Initial Output State High */ +/** @} */ + +/** \name Input/Sense Configuration Flags */ +/** @{ */ +#define IOPORT_BOTHEDGES (0 << 8) /*!< Sense Both Edges */ +#define IOPORT_RISING (1 << 8) /*!< Sense Rising Edge */ +#define IOPORT_FALLING (2 << 8) /*!< Sense Falling Edge */ +#define IOPORT_LEVEL (3 << 8) /*!< Sense Low Level */ +#if XMEGA_E +# define IOPORT_FORCE_ENABLE (6 << 8) /*!< Sense Force Input Enable Low Level */ +#endif +#define IOPORT_INPUT_DISABLE (7 << 8) /*!< Input Buffer Disabled */ +/** @} */ + +/** \name Output and Pull Configuration Flags */ +/** @{ */ +#define IOPORT_TOTEM (0 << 11) /*!< Normal push/pull output */ +#define IOPORT_BUSKEEPER (1 << 11) /*!< Bus Keeper */ +#define IOPORT_PULL_DOWN (2 << 11) /*!< Pull-Down (when input) */ +#define IOPORT_PULL_UP (3 << 11) /*!< Pull-Up (when input) */ +#define IOPORT_WIRED_OR (4 << 11) /*!< Wired OR */ +#define IOPORT_WIRED_AND (5 << 11) /*!< Wired AND */ +#define IOPORT_WIRED_OR_PULL_DOWN (6 << 11) /*!< Wired OR and Pull-Down */ +#define IOPORT_WIRED_AND_PULL_UP (7 << 11) /*!< Wired AND and Pull-Up */ +/** @} */ + +/** \name Inverted I/O Configuration Flags */ +/** @{ */ +#define IOPORT_INV_ENABLED (1 << 14) /*!< I/O is Inverted */ +#define IOPORT_INV_DISABLE (0 << 14) /*!< I/O is Not Inverted */ +/** @} */ + +/** \name Slew Rate Limit Configuration Flags */ +/** @{ */ +#define IOPORT_SRL_ENABLED (1 << 15) /*!< Slew Rate Limit Enabled */ +#define IOPORT_SRL_DISABLED (0 << 15) /*!< Slew Rate Limit Disabled */ +/** @} */ + +/** + * \internal + * \name PORT fields structure offset + * + * These macros are used to compute the field offset number with the PORT_t + * structure. + */ +/** @{ */ +#define PORT_DIR 0x00 /*!< Data Direction */ +#define PORT_DIRSET 0x01 /*!< Data Direction Set */ +#define PORT_DIRCLR 0x02 /*!< Data Direction Clear */ +#define PORT_DIRTGL 0x03 /*!< Data Direction Toggle */ +#define PORT_OUT 0x04 /*!< Data Output Value */ +#define PORT_OUTSET 0x05 /*!< Data Output Value Set */ +#define PORT_OUTCLR 0x06 /*!< Data Output Value Clear */ +#define PORT_OUTTGL 0x07 /*!< Data Output Value Toggle */ +#define PORT_IN 0x08 /*!< Data Input Value */ +#define PORT_INTCTRL 0x09 /*!< Interrupt Control */ +#define PORT_INT0MASK 0x0A /*!< Interrupt 0 Mask */ +#define PORT_INT1MASK 0x0B /*!< Interrupt 1 Mask */ +#define PORT_INTFLAGS 0x0C /*!< Interrupt Flags */ +#define PORT_PIN0CTRL 0x10 /*!< Pin 0 Configuration */ +#define PORT_PIN1CTRL 0x11 /*!< Pin 1 Configuration */ +#define PORT_PIN2CTRL 0x12 /*!< Pin 2 Configuration */ +#define PORT_PIN3CTRL 0x13 /*!< Pin 3 Configuration */ +#define PORT_PIN4CTRL 0x14 /*!< Pin 4 Configuration */ +#define PORT_PIN5CTRL 0x15 /*!< Pin 5 Configuration */ +#define PORT_PIN6CTRL 0x16 /*!< Pin 6 Configuration */ +#define PORT_PIN7CTRL 0x17 /*!< Pin 7 Configuration */ +/** @} */ + +static inline PORT_t *ioport_pin_to_port(port_pin_t pin) +{ + return arch_ioport_pin_to_base(pin); +} + +static inline PORT_t *ioport_id_pin_to_port(port_id_t port) +{ + return arch_ioport_port_to_base(port); +} + +/** + * \brief Configure the IO PORT pin function for a set of pins on a port + * + * \param port Pointer to the port + * \param pin_mask Mask containing the pins that should be configured + * \param flags Bitmask of flags specifying additional configuration + * parameters. + */ +void ioport_configure_port_pin(void *port, pin_mask_t pin_mask, + port_pin_flags_t flags); + +/** + * \brief Select the port function for a single pin + * + * \param pin The pin to configure + * \param flags Bitmask of flags specifying additional configuration + * parameters. + */ +static inline void ioport_configure_pin(port_pin_t pin, port_pin_flags_t flags) +{ + ioport_configure_port_pin(arch_ioport_pin_to_base(pin), + arch_ioport_pin_to_mask(pin), flags); +} + +/** + * \brief Configure a group of I/O pins on a specified port number + * + * \param port The port number + * \param pin_mask The pin mask to configure + * \param flags Bitmask of flags specifying additional configuration + * parameters. + */ +static inline void ioport_configure_group(port_id_t port, pin_mask_t pin_mask, + port_pin_flags_t flags) +{ + ioport_configure_port_pin(arch_ioport_port_to_base(port), pin_mask, flags); +} + +/** + * \brief Drive a PORT pin to a given state + * + * This function will only have an effect if \a pin is configured as + * an output. + * + * \param pin A number identifying the pin to act on. + * \param value The desired state of the pin. \a true means drive the + * pin high (towards Vdd), while \a false means drive the pin low + * (towards Vss). + */ +static inline void ioport_set_value(port_pin_t pin, bool value) +{ + arch_ioport_set_pin_level(pin, value); +} + +/** + * \brief Drive a PORT pin to a low level + * + * This function will only have an effect if \a pin is configured as + * an output. + * + * \param pin A number identifying the pin to act on. + */ +static inline void ioport_set_pin_low(port_pin_t pin) +{ + arch_ioport_set_pin_level(pin, false); +} + +/** + * \brief Drive a PORT pin to a high level + * + * This function will only have an effect if \a pin is configured as + * an output. + * + * \param pin A number identifying the pin to act on. + */ +static inline void ioport_set_pin_high(port_pin_t pin) +{ + arch_ioport_set_pin_level(pin, true); +} + +/** + * \brief Read the current state of a PORT pin + * + * \param pin A number identifying the pin to read. + * \retval true The pin is currently high (close to Vdd) + * \retval false The pin is currently low (close to Vss) + */ +static inline bool ioport_get_value(port_pin_t pin) +{ + return arch_ioport_get_pin_level(pin); +} + +/** + * \brief Read the current state of a PORT pin and test high level + * + * \param pin A number identifying the pin to read. + * \retval true The pin is currently high (close to Vdd) + * \retval false The pin is currently low (close to Vss) + */ +static inline bool ioport_pin_is_high(port_pin_t pin) +{ + return (arch_ioport_get_pin_level(pin) == true); +} + +/** + * \brief Read the current state of a PORT pin and test high level + * + * \param pin A number identifying the pin to read. + * \retval true The pin is currently high (close to Vdd) + * \retval false The pin is currently low (close to Vss) + */ +static inline bool ioport_pin_is_low(port_pin_t pin) +{ + return (arch_ioport_get_pin_level(pin) == false); +} + +/** + * \brief Toggle the current state of a PORT pin + * + * \param pin A number identifying the pin to act on. + */ +static inline void ioport_toggle_pin(port_pin_t pin) +{ + arch_ioport_toggle_pin_level(pin); +} + +/*! \brief Drives a group of I/O pin of a port to high level. + * + * \param port_id The port number. + * \param port_mask The mask. + */ +static inline void ioport_set_group_high(port_id_t port_id, + pin_mask_t port_mask) +{ + arch_ioport_set_port_level(port_id, port_mask, port_mask); +} + +/*! \brief Drives a group of I/O pin of a port to low level. + * + * \param port_id The port number. + * \param port_mask The mask. + */ +static inline void ioport_set_group_low(port_id_t port_id, pin_mask_t port_mask) +{ + arch_ioport_set_port_level(port_id, port_mask, 0); +} + +/*! \brief Toggles a group of I/O pin of a port. + * + * \param port_id The port number. + * \param port_mask The mask. + */ +static inline void ioport_tgl_group(port_id_t port_id, pin_mask_t port_mask) +{ + arch_ioport_toggle_port_level(port_id, port_mask); +} + +#endif /* IOPORT_COMPAT_H_ */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/sleepmgr/sleepmgr.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/sleepmgr/sleepmgr.h new file mode 100644 index 00000000..2435d44c --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/sleepmgr/sleepmgr.h @@ -0,0 +1,271 @@ +/** + * \file + * + * \brief Sleep manager + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef SLEEPMGR_H +#define SLEEPMGR_H + +#include +#include + +#if (SAM3S || SAM3U || SAM3N || SAM3XA || SAM4S || SAM4E || SAM4N || SAM4C || SAMG || SAM4CP || SAM4CM) +# include "sam/sleepmgr.h" +#elif XMEGA +# include "xmega/sleepmgr.h" +#elif UC3 +# include "uc3/sleepmgr.h" +#elif SAM4L +# include "sam4l/sleepmgr.h" +#elif MEGA +# include "mega/sleepmgr.h" +#elif (SAMD20 || SAMD21 || SAMR21 || SAMD11) +# include "samd/sleepmgr.h" +#elif (SAML21) +# include "saml/sleepmgr.h" +#else +# error Unsupported device. +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \defgroup sleepmgr_group Sleep manager + * + * The sleep manager is a service for ensuring that the device is not put to + * sleep in deeper sleep modes than the system (e.g., peripheral drivers, + * services or the application) allows at any given time. + * + * It is based on the use of lock counting for the individual sleep modes, and + * will put the device to sleep in the shallowest sleep mode that has a non-zero + * lock count. The drivers/services/application can change these counts by use + * of \ref sleepmgr_lock_mode and \ref sleepmgr_unlock_mode. + * Refer to \ref sleepmgr_mode for a list of the sleep modes available for + * locking, and the device datasheet for information on their effect. + * + * The application must supply the file \ref conf_sleepmgr.h. + * + * For the sleep manager to be enabled, the symbol \ref CONFIG_SLEEPMGR_ENABLE + * must be defined, e.g., in \ref conf_sleepmgr.h. If this symbol is not + * defined, the functions are replaced with dummy functions and no RAM is used. + * + * @{ + */ + +/** + * \def CONFIG_SLEEPMGR_ENABLE + * \brief Configuration symbol for enabling the sleep manager + * + * If this symbol is not defined, the functions of this service are replaced + * with dummy functions. This is useful for reducing code size and execution + * time if the sleep manager is not needed in the application. + * + * This symbol may be defined in \ref conf_sleepmgr.h. + */ +#if defined(__DOXYGEN__) && !defined(CONFIG_SLEEPMGR_ENABLE) +# define CONFIG_SLEEPMGR_ENABLE +#endif + +/** + * \enum sleepmgr_mode + * \brief Sleep mode locks + * + * Identifiers for the different sleep mode locks. + */ + +/** + * \brief Initialize the lock counts + * + * Sets all lock counts to 0, except the very last one, which is set to 1. This + * is done to simplify the algorithm for finding the deepest allowable sleep + * mode in \ref sleepmgr_enter_sleep. + */ +static inline void sleepmgr_init(void) +{ +#ifdef CONFIG_SLEEPMGR_ENABLE + uint8_t i; + + for (i = 0; i < SLEEPMGR_NR_OF_MODES - 1; i++) { + sleepmgr_locks[i] = 0; + } + sleepmgr_locks[SLEEPMGR_NR_OF_MODES - 1] = 1; +#endif /* CONFIG_SLEEPMGR_ENABLE */ +} + +/** + * \brief Increase lock count for a sleep mode + * + * Increases the lock count for \a mode to ensure that the sleep manager does + * not put the device to sleep in the deeper sleep modes. + * + * \param mode Sleep mode to lock. + */ +static inline void sleepmgr_lock_mode(enum sleepmgr_mode mode) +{ +#ifdef CONFIG_SLEEPMGR_ENABLE + irqflags_t flags; + + if(sleepmgr_locks[mode] >= 0xff) { + while (true) { + // Warning: maximum value of sleepmgr_locks buffer is no more than 255. + // Check APP or change the data type to uint16_t. + } + } + + // Enter a critical section + flags = cpu_irq_save(); + + ++sleepmgr_locks[mode]; + + // Leave the critical section + cpu_irq_restore(flags); +#else + UNUSED(mode); +#endif /* CONFIG_SLEEPMGR_ENABLE */ +} + +/** + * \brief Decrease lock count for a sleep mode + * + * Decreases the lock count for \a mode. If the lock count reaches 0, the sleep + * manager can put the device to sleep in the deeper sleep modes. + * + * \param mode Sleep mode to unlock. + */ +static inline void sleepmgr_unlock_mode(enum sleepmgr_mode mode) +{ +#ifdef CONFIG_SLEEPMGR_ENABLE + irqflags_t flags; + + if(sleepmgr_locks[mode] == 0) { + while (true) { + // Warning: minimum value of sleepmgr_locks buffer is no less than 0. + // Check APP. + } + } + + // Enter a critical section + flags = cpu_irq_save(); + + --sleepmgr_locks[mode]; + + // Leave the critical section + cpu_irq_restore(flags); +#else + UNUSED(mode); +#endif /* CONFIG_SLEEPMGR_ENABLE */ +} + + /** + * \brief Retrieves the deepest allowable sleep mode + * + * Searches through the sleep mode lock counts, starting at the shallowest sleep + * mode, until the first non-zero lock count is found. The deepest allowable + * sleep mode is then returned. + */ +static inline enum sleepmgr_mode sleepmgr_get_sleep_mode(void) +{ + enum sleepmgr_mode sleep_mode = SLEEPMGR_ACTIVE; + +#ifdef CONFIG_SLEEPMGR_ENABLE + uint8_t *lock_ptr = sleepmgr_locks; + + // Find first non-zero lock count, starting with the shallowest modes. + while (!(*lock_ptr)) { + lock_ptr++; + sleep_mode = (enum sleepmgr_mode)(sleep_mode + 1); + } + + // Catch the case where one too many sleepmgr_unlock_mode() call has been + // performed on the deepest sleep mode. + Assert((uintptr_t)(lock_ptr - sleepmgr_locks) < SLEEPMGR_NR_OF_MODES); + +#endif /* CONFIG_SLEEPMGR_ENABLE */ + + return sleep_mode; +} + +/** + * \fn sleepmgr_enter_sleep + * \brief Go to sleep in the deepest allowed mode + * + * Searches through the sleep mode lock counts, starting at the shallowest sleep + * mode, until the first non-zero lock count is found. The device is then put to + * sleep in the sleep mode that corresponds to the lock. + * + * \note This function enables interrupts before going to sleep, and will leave + * them enabled upon return. This also applies if sleep is skipped due to ACTIVE + * mode being locked. + */ + +static inline void sleepmgr_enter_sleep(void) +{ +#ifdef CONFIG_SLEEPMGR_ENABLE + enum sleepmgr_mode sleep_mode; + + cpu_irq_disable(); + + // Find the deepest allowable sleep mode + sleep_mode = sleepmgr_get_sleep_mode(); + // Return right away if first mode (ACTIVE) is locked. + if (sleep_mode==SLEEPMGR_ACTIVE) { + cpu_irq_enable(); + return; + } + // Enter the deepest allowable sleep mode with interrupts enabled + sleepmgr_sleep(sleep_mode); +#else + cpu_irq_enable(); +#endif /* CONFIG_SLEEPMGR_ENABLE */ +} + + +//! @} + +#ifdef __cplusplus +} +#endif + +#endif /* SLEEPMGR_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/sleepmgr/xmega/sleepmgr.c b/AVR Code/USB_BULK_TEST/src/ASF/common/services/sleepmgr/xmega/sleepmgr.c new file mode 100644 index 00000000..0877e284 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/sleepmgr/xmega/sleepmgr.c @@ -0,0 +1,61 @@ +/** + * \file + * + * \brief Sleep manager + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#include +#include + +#if defined(CONFIG_SLEEPMGR_ENABLE) || defined(__DOXYGEN__) + +uint8_t sleepmgr_locks[SLEEPMGR_NR_OF_MODES]; + +enum SLEEP_SMODE_enum sleepmgr_configs[SLEEPMGR_NR_OF_MODES] = { + SLEEP_SMODE_IDLE_gc, + SLEEP_SMODE_ESTDBY_gc, + SLEEP_SMODE_PSAVE_gc, + SLEEP_SMODE_STDBY_gc, + SLEEP_SMODE_PDOWN_gc, +}; + +#endif /* CONFIG_SLEEPMGR_ENABLE */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/sleepmgr/xmega/sleepmgr.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/sleepmgr/xmega/sleepmgr.h new file mode 100644 index 00000000..7ca32273 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/sleepmgr/xmega/sleepmgr.h @@ -0,0 +1,117 @@ +/** + * \file + * + * \brief AVR XMEGA Sleep manager implementation + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef XMEGA_SLEEPMGR_H +#define XMEGA_SLEEPMGR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +/** + * \weakgroup sleepmgr_group + * @{ + */ + +enum sleepmgr_mode { + //! Active mode. + SLEEPMGR_ACTIVE = 0, + //! Idle mode. + SLEEPMGR_IDLE, + //! Extended Standby mode. + SLEEPMGR_ESTDBY, + //! Power Save mode. + SLEEPMGR_PSAVE, + //! Standby mode. + SLEEPMGR_STDBY, + //! Power Down mode. + SLEEPMGR_PDOWN, + SLEEPMGR_NR_OF_MODES, +}; + +/** + * \internal + * \name Internal arrays + * @{ + */ +#if defined(CONFIG_SLEEPMGR_ENABLE) || defined(__DOXYGEN__) +//! Sleep mode lock counters +extern uint8_t sleepmgr_locks[]; +/** + * \brief Look-up table with sleep mode configurations + * \note This is located in program memory (Flash) as it is constant. + */ +extern enum SLEEP_SMODE_enum sleepmgr_configs[]; +#endif /* CONFIG_SLEEPMGR_ENABLE */ +//! @} + +static inline void sleepmgr_sleep(const enum sleepmgr_mode sleep_mode) +{ + Assert(sleep_mode != SLEEPMGR_ACTIVE); +#ifdef CONFIG_SLEEPMGR_ENABLE + sleep_set_mode(sleepmgr_configs[sleep_mode-1]); + sleep_enable(); + + cpu_irq_enable(); + sleep_enter(); + + sleep_disable(); +#else + cpu_irq_enable(); +#endif /* CONFIG_SLEEPMGR_ENABLE */ + +} + +//! @} + +#ifdef __cplusplus +} +#endif + +#endif /* XMEGA_SLEEPMGR_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/spi_master.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/spi_master.h new file mode 100644 index 00000000..e92f4ca5 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/spi_master.h @@ -0,0 +1,273 @@ +/** + * \file + * + * \brief SPI Master Mode management + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef SPI_MASTER_H_INCLUDED +#define SPI_MASTER_H_INCLUDED + +#include + +#if XMEGA +# include "xmega_spi/spi_master.h" +#elif MEGA_RF +# include "megarf_spi/spi_master.h" +#elif UC3 +# include "uc3_spi/spi_master.h" +#elif SAM +# include "sam_spi/spi_master.h" +#else +# error Unsupported chip type +#endif + +/** + * + * \defgroup spi_group Serial Peripheral Interface (SPI) + * + * This is the common API for SPI interface. Additional features are available + * in the documentation of the specific modules. + * + * \section spi_group_platform Platform Dependencies + * + * The SPI API is partially chip- or platform-specific. While all + * platforms provide mostly the same functionality, there are some + * variations around how different bus types and clock tree structures + * are handled. + * + * The following functions are available on all platforms, but there may + * be variations in the function signature (i.e. parameters) and + * behavior. These functions are typically called by platform-specific + * parts of drivers, and applications that aren't intended to be + * portable: + * - spi_master_init() + * - spi_master_setup_device() + * - spi_select_device() + * - spi_deselect_device() + * - spi_write_single() + * - spi_write_packet() + * - spi_read_single() + * - spi_read_packet() + * - spi_is_tx_empty() + * - spi_is_tx_ready() + * - spi_is_rx_full() + * - spi_is_rx_ready() + * - spi_enable() + * - spi_disable() + * - spi_is_enabled() + * + * \section spi_master_quickstart_section Quick Start Guide + * See \ref common_spi_master_quickstart + * @{ + */ + +//! @} + +/** + * \page common_spi_master_quickstart Quick Start Guide for the SPI Master Driver + * + * This is the quick start guide for the \ref spi_group "SPI Driver", with + * step-by-step instructions on how to configure and use the driver for a + * specific use case. + * + * The use case contain several code fragments. The code fragments in the + * steps for setup can be copied into a custom initialization function, while + * the steps for usage can be copied into, e.g., the main application function. + * + * The steps for setting up the SPI master for XMEGA and UC3 use exactly the + * same approach, but note that there are different names on the peripherals. So + * to use this Quick Start for UC3 please make sure that all the peripheral + * names are updated according to the UC3 datasheet. + * - \subpage spi_master_xmega + * + */ +/** + * \page spi_master_xmega Basic setup for SPI master on XMEGA devices + * + * \section spi_master_xmega_basic Basic setup for XMEGA devices + * The SPI module will be set up as master: + * - SPI on PORTD + * - 1MHz SPI clock speed + * - Slave Chip Select connected on PORTD pin 1 + * - SPI mode 0 (data on rising clock edge) + * + * \section spi_master_xmega_basic_setup Setup steps + * \subsection spi_master_xmega_basic_setup_code Example code + * Add to application C-file (e.g. main.c): + * \code + void spi_init_pins(void) + { + ioport_configure_port_pin(&PORTD, PIN1_bm, IOPORT_INIT_HIGH | IOPORT_DIR_OUTPUT); + + ioport_configure_port_pin(&PORTD, PIN4_bm, IOPORT_PULL_UP | IOPORT_DIR_INPUT); + ioport_configure_port_pin(&PORTD, PIN5_bm, IOPORT_INIT_HIGH | IOPORT_DIR_OUTPUT); + ioport_configure_port_pin(&PORTD, PIN6_bm, IOPORT_DIR_INPUT); + ioport_configure_port_pin(&PORTD, PIN7_bm, IOPORT_INIT_HIGH | IOPORT_DIR_OUTPUT); + } + + void spi_init_module(void) + { + struct spi_device spi_device_conf = { + .id = IOPORT_CREATE_PIN(PORTD, 1) + }; + + spi_master_init(&SPID); + spi_master_setup_device(&SPID, &spi_device_conf, SPI_MODE_0, 1000000, 0); + spi_enable(&SPID); + } +\endcode + * + * \subsection spi_master_xmega_basic_setup Workflow + * -# Ensure that \ref conf_spi_master.h is present for the driver. + * - \note This file is only for the driver and should not be included by the + * user. In this example the file can be left empty. + * -# Initialize the pins used by the SPI interface (this initialization is for + * the ATxmega32A4U device). + * -# Set the pin used for slave select as output high: + * \code + ioport_configure_port_pin(&PORTD, PIN1_bm, IOPORT_INIT_HIGH | IOPORT_DIR_OUTPUT); +\endcode + * -# Enable pull-up on own chip select (SS): + * \code + ioport_configure_port_pin(&PORTD, PIN4_bm, IOPORT_PULL_UP | IOPORT_DIR_INPUT); +\endcode + * \attention If this pin is pulled low the SPI module will go into slave mode. + * -# Set MOSI and SCL as output high, and set MISO as input: + * \code + ioport_configure_port_pin(&PORTD, PIN5_bm, IOPORT_INIT_HIGH | IOPORT_DIR_OUTPUT); + ioport_configure_port_pin(&PORTD, PIN6_bm, IOPORT_DIR_INPUT); + ioport_configure_port_pin(&PORTD, PIN7_bm, IOPORT_INIT_HIGH | IOPORT_DIR_OUTPUT); +\endcode + * -# Define the SPI device configuration struct to describe which pin the + * slave select (slave chip select) is connected to, in this case the slave + * select pin has been connected to PORTD pin 1 (PD1): + * - \code + struct spi_device spi_device_conf = { + .id = IOPORT_CREATE_PIN(PORTD, 1) + }; +\endcode + * -# Initialize the SPI module, in this case SPI on PORTD has been chosen: + * - \code + spi_master_init(&SPID); +\endcode + * -# Setup the SPI master module for a specific device: + * - \code + spi_master_setup_device(&SPID, &spi_device_conf, SPI_MODE_0, 1000000, 0); +\endcode + * - \note The last argument, which is zero in this case, can be ignored and is + * only included for compatibility purposes. + * -# Then enable the SPI: + * - \code + spi_enable(&SPID); +\endcode + * + * \section spi_master_xmega_basic_usage Usage steps + * \subsection spi_master_xmega_basic_usage_code Example code + * Add to, e.g., the main loop in the application C-file: + * \code + uint8_t data_buffer[1] = {0xAA}; + + struct spi_device spi_device_conf = { + .id = IOPORT_CREATE_PIN(PORTD, 1) + }; + + spi_select_device(&SPID, &spi_device_conf); + + spi_write_packet(&SPID, data_buffer, 1); + spi_read_packet(&SPID, data_buffer, 1); + + spi_deselect_device(&SPID, &spi_device_conf); +\endcode + * + * \subsection spi_master_xmega_basic_usage_flow Workflow + * -# Create a buffer for data to be sent/received on the SPI bus, in this case + * a single byte buffer is used. The buffer can be of arbitrary size as long as + * there is space left in SRAM: + * - \code + uint8_t data_buffer[1] = {0xAA}; +\endcode + * -# Define the SPI device configuration struct to describe which pin the + * slave select (slave chip select) is connected to, in this case the slave + * select pin has been connected to PORTD pin 1 (PD1): + * - \code + struct spi_device spi_device_conf = { + .id = IOPORT_CREATE_PIN(PORTD, 1) + }; +\endcode + * - \note As this struct is the same for both the initializing part and the usage + * part it could be a good idea to make the struct global, and hence accessible + * for both the initializing part and usage part. Another solution could be to + * create the struct in the main function and pass the address of the struct to + * the spi_init_module() function, e.g.: + * \code + void spi_init_module(struct spi_device *spi_device_conf) + { + ... + + spi_master_setup_device(&SPID, spi_device_conf, SPI_MODE_0, 1000000, 0); + + ... + } +\endcode + * -# Write data to the SPI slave device, in this case write one byte from the + * data_buffer: + * - \code + spi_write_packet(&SPID, data_buffer, 1); +\endcode + * -# Read data from the SPI slave device, in this case read one byte and put it + * into the data_buffer: + * - \code + spi_read_packet(&SPID, data_buffer, 1); +\endcode + * - \attention As the SPI works as a shift register so that data is shifted in at + * the same time as data is shifted out a read operation will mean that a dummy + * byte \ref CONFIG_SPI_MASTER_DUMMY is written to the SPI bus. \ref CONFIG_SPI_MASTER_DUMMY + * defaults to 0xFF, but can be changed by defining it inside the \ref conf_spi_master.h + * file. + * -# When read and write operations is done de-select the slave: + * - \code + spi_deselect_device(&SPID, &spi_device_conf); +\endcode + * + */ + +#endif /* SPI_MASTER_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/usart_spi.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/usart_spi.h new file mode 100644 index 00000000..92b407ff --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/usart_spi.h @@ -0,0 +1,104 @@ +/** + * \file + * + * \brief USART in SPI mode driver functions. + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef USART_SPI_H_INCLUDED +#define USART_SPI_H_INCLUDED + +#include + +#if XMEGA +# include "xmega_usart_spi/usart_spi.h" +#elif MEGA_RF +# include "megarf_usart_spi/usart_spi.h" +#elif UC3 +# include "uc3_usart_spi/usart_spi.h" +#elif SAM +# include "sam_usart_spi/usart_spi.h" +#else +# error Unsupported chip type +#endif + +/** + * + * \defgroup usart_spi_group USART in SPI (Serial Peripheral Interface) mode + * + * This is the common API for USART in SPI mode. Additional features are available + * in the documentation of the specific modules. + * + * \section spi_group_platform Platform Dependencies + * + * The spi API is partially chip- or platform-specific. While all + * platforms provide mostly the same functionality, there are some + * variations around how different bus types and clock tree structures + * are handled. + * + * The following functions are available on all platforms, but there may + * be variations in the function signature (i.e. parameters) and + * behaviour. These functions are typically called by platform-specific + * parts of drivers, and applications that aren't intended to be + * portable: + * - usart_spi_init() + * - usart_spi_setup_device() + * - usart_spi_select_device() + * - usart_spi_deselect_device() + * - usart_spi_write_single() + * - usart_spi_write_packet() + * - usart_spi_read_single() + * - usart_spi_read_packet() + * - usart_spi_is_tx_empty() + * - usart_spi_is_tx_ready() + * - usart_spi_is_rx_full() + * - usart_spi_is_rx_ready() + * - usart_spi_enable() + * - usart_spi_disable() + * - usart_spi_is_enabled() + * + * + * @{ + */ + +//! @} + +#endif /* USART_SPI_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/xmega_spi/spi_master.c b/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/xmega_spi/spi_master.c new file mode 100644 index 00000000..9feeebcf --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/xmega_spi/spi_master.c @@ -0,0 +1,195 @@ +/***************************************************************************** + * + * \file + * + * \brief SPI software driver functions. + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + *****************************************************************************/ +/* + * Support and FAQ: visit Atmel Support + */ + +#include "spi_master.h" +#include "sysclk.h" + +/*! \brief Initializes the SPI in master mode. + * + * \param spi Base address of the SPI instance. + * + */ +void spi_master_init(SPI_t *spi) +{ +#ifdef SPIA + if ((uint16_t)spi == (uint16_t)&SPIA) { + sysclk_enable_module(SYSCLK_PORT_A, PR_SPI_bm); + } +#endif +#ifdef SPIB + if ((uint16_t)spi == (uint16_t)&SPIB) { + sysclk_enable_module(SYSCLK_PORT_B, PR_SPI_bm); + } +#endif +#ifdef SPIC + if ((uint16_t)spi == (uint16_t)&SPIC) { + sysclk_enable_module(SYSCLK_PORT_C, PR_SPI_bm); + } +#endif +#ifdef SPID + if ((uint16_t)spi == (uint16_t)&SPID) { + sysclk_enable_module(SYSCLK_PORT_D, PR_SPI_bm); + } +#endif +#ifdef SPIE + if ((uint16_t)spi == (uint16_t)&SPIE) { + sysclk_enable_module(SYSCLK_PORT_E, PR_SPI_bm); + } +#endif +#ifdef SPIF + if ((uint16_t)spi == (uint16_t)&SPIF) { + sysclk_enable_module(SYSCLK_PORT_F, PR_SPI_bm); + } +#endif + spi_enable_master_mode(spi); +} + +/** + * \brief Setup a SPI device. + * + * The returned device descriptor structure must be passed to the driver + * whenever that device should be used as current slave device. + * + * \param spi Base address of the SPI instance. + * \param device Pointer to SPI device struct that should be initialized. + * \param flags SPI configuration flags. Common flags for all + * implementations are the SPI modes SPI_MODE_0 ... + * SPI_MODE_3. + * \param baud_rate Baud rate for communication with slave device in Hz. + * \param sel_id Board specific select id + */ +void spi_master_setup_device(SPI_t *spi, struct spi_device *device, + spi_flags_t flags, uint32_t baud_rate, + board_spi_select_id_t sel_id) +{ + if (spi_xmega_set_baud_div(spi, baud_rate, sysclk_get_cpu_hz()) < 0) { + Assert(false); + return; + } + + /* Clear any set SPI mode flags and set them to the user-specified mode */ + spi->CTRL = (spi->CTRL & ~SPI_MODE_gm) | + ((flags << SPI_MODE_gp) & SPI_MODE_gm); +} + +/** + * \brief Send a sequence of bytes to a SPI device + * + * Received bytes on the SPI bus are discarded. + * + * \param spi Base address of the SPI instance. + * \param data data buffer to write + * \param len Length of data + * + * \pre SPI device must be selected with spi_select_device() first + */ +status_code_t spi_write_packet(SPI_t *spi, const uint8_t *data, size_t len) +{ + while (len--) { + spi_write_single(spi, *data++); + + while (!spi_is_rx_full(spi)) { + } + } + + return STATUS_OK; +} + +/** + * \brief Receive a sequence of bytes from a SPI device + * + * All bytes sent out on SPI bus are sent as value 0. + * + * \param spi Base address of the SPI instance. + * \param data data buffer to read + * \param len Length of data + * + * \pre SPI device must be selected with spi_select_device() first + */ +status_code_t spi_read_packet(SPI_t *spi, uint8_t *data, size_t len) +{ + while (len--) { + spi_write_single(spi,CONFIG_SPI_MASTER_DUMMY); //Dummy write + + while (!spi_is_rx_full(spi)) { + } + + spi_read_single(spi, data); + data++; + } + + return STATUS_OK; +} + +/** + * \brief Select given device on the SPI bus + * + * Set device specific setting and calls board chip select. + * + * \param spi Base address of the SPI instance. + * \param device SPI device + * + */ +void spi_select_device(SPI_t *spi, struct spi_device *device) +{ + ioport_set_pin_low(device->id); +} + +/** + * \brief Deselect given device on the SPI bus + * + * Calls board chip deselect. + * + * \param spi Base address of the SPI instance. + * \param device SPI device + * + * \pre SPI device must be selected with spi_select_device() first + */ +void spi_deselect_device(SPI_t *spi, struct spi_device *device) +{ + ioport_set_pin_high(device->id); +} diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/xmega_spi/spi_master.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/xmega_spi/spi_master.h new file mode 100644 index 00000000..12fc7088 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/xmega_spi/spi_master.h @@ -0,0 +1,450 @@ +/***************************************************************************** + * + * \file + * + * \brief SPI Master driver for AVR. + * + * This file defines a useful set of functions for the SPI interface on AVR + * devices. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + ******************************************************************************/ +/* + * Support and FAQ: visit Atmel Support + */ + + +#ifndef _SPI_MASTER_H_ +#define _SPI_MASTER_H_ + +#include "compiler.h" +#include "status_codes.h" +#include "ioport.h" +#include "spi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \defgroup xmega_spi_master_group XMEGA SPI master service. + * + * This is the API for SPI master service on XMEGA. + * + * @{ + * + * \section xmega_spi_master_qucikstart_section Quick Start Guide + * See \ref common_spi_master_quickstart + */ + +/*! \name Spi Master Management Configuration + */ +//! @{ +#include "conf_spi_master.h" + +//! Default Config Spi Master Dummy Field +#ifndef CONFIG_SPI_MASTER_DUMMY +#define CONFIG_SPI_MASTER_DUMMY 0xFF +#endif +//! @} + +/** + * \brief Clock phase + */ +#define SPI_CPHA (1 << 0) + +/** + * \brief Clock polarity + */ +#define SPI_CPOL (1 << 1) + +/** + * \brief SPI mode 0 + */ +#define SPI_MODE_0 0 +/** + * \brief SPI mode 1 + */ +#define SPI_MODE_1 (SPI_CPHA) +/** + * \brief SPI mode 2 + */ +#define SPI_MODE_2 (SPI_CPOL) +/** + * \brief SPI mode 3 + */ +#define SPI_MODE_3 (SPI_CPOL | SPI_CPHA) + +typedef uint8_t spi_flags_t; +typedef uint32_t board_spi_select_id_t; + +//! \brief Polled SPI device definition +struct spi_device { + //! Board specific select id + port_pin_t id; +}; + +/*! \brief Initializes the SPI in master mode. + * + * \param spi Base address of the SPI instance. + * + */ +extern void spi_master_init(SPI_t *spi); + +/** + * \brief Setup a SPI device. + * + * The returned device descriptor structure must be passed to the driver + * whenever that device should be used as current slave device. + * + * \param spi Base address of the SPI instance. + * \param device Pointer to SPI device struct that should be initialized. + * \param flags SPI configuration flags. Common flags for all + * implementations are the SPI modes SPI_MODE_0 ... + * SPI_MODE_3. + * \param baud_rate Baud rate for communication with slave device in Hz. + * \param sel_id Board specific select id + */ +extern void spi_master_setup_device(SPI_t *spi, struct spi_device *device, + spi_flags_t flags, unsigned long baud_rate, + board_spi_select_id_t sel_id); + +/*! \brief Enables the SPI. + * + * \param spi Base address of the SPI instance. + */ +extern void spi_enable(SPI_t *spi); + +/*! \brief Disables the SPI. + * + * Ensures that nothing is transferred while setting up buffers. + * + * \param spi Base address of the SPI instance. + * + * \warning This may cause data loss if used on a slave SPI. + */ +extern void spi_disable(SPI_t *spi); + + +/*! \brief Tests if the SPI is enabled. + * + * \param spi Base address of the SPI instance. + * + * \return \c 1 if the SPI is enabled, otherwise \c 0. + */ +extern bool spi_is_enabled(SPI_t *spi); + +/** + * \brief Select given device on the SPI bus + * + * Set device specific setting and calls board chip select. + * + * \param spi Base address of the SPI instance. + * \param device SPI device + * + */ +extern void spi_select_device(SPI_t *spi, struct spi_device *device); + +/** + * \brief Deselect given device on the SPI bus + * + * Calls board chip deselect. + * + * \param spi Base address of the SPI instance. + * \param device SPI device + * + * \pre SPI device must be selected with spi_select_device() first + */ +extern void spi_deselect_device(SPI_t *spi, struct spi_device *device); + +/*! \brief Write one byte to a SPI device. + * + * \param spi Base address of the SPI instance. + * \param data The data byte to be loaded + * + */ +__always_inline static void spi_write_single(SPI_t *spi, uint8_t data) +{ + spi_put(spi,data); +} + +/** + * \brief Send a sequence of bytes to a SPI device + * + * Received bytes on the SPI bus are discarded. + * + * \param spi Base address of the SPI instance. + * \param data data buffer to write + * \param len Length of data + * + * \pre SPI device must be selected with spi_select_device() first + */ +extern status_code_t spi_write_packet(SPI_t *spi,const uint8_t *data, size_t len); + + +/*! \brief Receive one byte from a SPI device. + * + * \param spi Base address of the SPI instance. + * \param data Pointer to the data byte where to store the received data. + * + */ +inline static void spi_read_single(SPI_t *spi, uint8_t *data) +{ + *data=spi_get(spi); +} + +/** + * \brief Receive a sequence of bytes from a SPI device + * + * All bytes sent out on SPI bus are sent as value 0. + * + * \param spi Base address of the SPI instance. + * \param data data buffer to read + * \param len Length of data + * + * \pre SPI device must be selected with spi_select_device() first + */ +extern status_code_t spi_read_packet(SPI_t *spi, uint8_t *data, size_t len); + +/*! \brief Checks if all transmissions are complete. + * + * \param spi Base address of the SPI instance. + * + * \return Status. + * \retval 1 All transmissions complete. + * \retval 0 Transmissions not complete. + */ +inline static bool spi_is_tx_empty(SPI_t *spi) +{ + return spi_is_tx_ok(spi); +} + +/*! \brief Checks if all transmissions is ready. + * + * \param spi Base address of the SPI instance. + * + * \return Status. + * \retval 1 All transmissions complete. + * \retval 0 Transmissions not complete. + */ +inline static bool spi_is_tx_ready(SPI_t *spi) +{ + return spi_is_tx_ok(spi); +} + +/*! \brief Tests if the SPI contains a received character. + * + * \param spi Base address of the SPI instance. + * + * \return \c 1 if the SPI Receive Holding Register is full, otherwise \c 0. + */ +inline static bool spi_is_rx_full(SPI_t *spi) +{ + return spi_is_tx_ok(spi); +} + +/*! \brief Checks if all reception is ready. + * + * \param spi Base address of the SPI instance. + * + * \return \c 1 if the SPI Receiver is ready, otherwise \c 0. + */ +inline static bool spi_is_rx_ready(SPI_t *spi) +{ + return spi_is_tx_ok(spi); +} + +//! @} + + + +#ifdef __cplusplus +} +#endif + +/** + * \page spi_master_xmega Quick start guide for SPI master on XMEGA devices + * + * \section spi_master_xmega_basic Basic setup for XMEGA devices + * The SPI module will be set up as master: + * - SPI on PORTD + * - 1MHz SPI clock speed + * - Slave Chip Select connected on PORTD pin 1 + * - SPI mode 0 (data on rising clock edge) + * + * \section spi_master_xmega_basic_setup Setup steps + * \subsection spi_master_xmega_basic_setup_code Example code + * Add to application C-file (e.g. main.c): + * \code + void spi_init_pins(void) + { + ioport_configure_port_pin(&PORTD, PIN1_bm, IOPORT_INIT_HIGH | IOPORT_DIR_OUTPUT); + + ioport_configure_port_pin(&PORTD, PIN4_bm, IOPORT_PULL_UP | IOPORT_DIR_INPUT); + ioport_configure_port_pin(&PORTD, PIN5_bm, IOPORT_INIT_HIGH | IOPORT_DIR_OUTPUT); + ioport_configure_port_pin(&PORTD, PIN6_bm, IOPORT_DIR_INPUT); + ioport_configure_port_pin(&PORTD, PIN7_bm, IOPORT_INIT_HIGH | IOPORT_DIR_OUTPUT); + } + + void spi_init_module(void) + { + struct spi_device spi_device_conf = { + .id = IOPORT_CREATE_PIN(PORTD, 1) + }; + + spi_master_init(&SPID); + spi_master_setup_device(&SPID, &spi_device_conf, SPI_MODE_0, 1000000, 0); + spi_enable(&SPID); + } +\endcode + * + * \subsection spi_master_xmega_basic_setup Workflow + * -# Ensure that \ref conf_spi_master.h is present for the driver. + * - \note This file is only for the driver and should not be included by the + * user. In this example the file can be left empty. + * -# Initialize the pins used by the SPI interface (this initialization is for + * the ATxmega32A4U device). + * -# Set the pin used for slave select as output high: + * \code + ioport_configure_port_pin(&PORTD, PIN1_bm, IOPORT_INIT_HIGH | IOPORT_DIR_OUTPUT); +\endcode + * -# Enable pull-up on own chip select (SS): + * \code + ioport_configure_port_pin(&PORTD, PIN4_bm, IOPORT_PULL_UP | IOPORT_DIR_INPUT); +\endcode + * \attention If this pin is pulled low the SPI module will go into slave mode. + * -# Set MOSI and SCL as output high, and set MISO as input: + * \code + ioport_configure_port_pin(&PORTD, PIN5_bm, IOPORT_INIT_HIGH | IOPORT_DIR_OUTPUT); + ioport_configure_port_pin(&PORTD, PIN6_bm, IOPORT_DIR_INPUT); + ioport_configure_port_pin(&PORTD, PIN7_bm, IOPORT_INIT_HIGH | IOPORT_DIR_OUTPUT); +\endcode + * -# Define the SPI device configuration struct to describe which pin the + * slave select (slave chip select) is connected to, in this case the slave + * select pin has been connected to PORTD pin 1 (PD1): + * - \code + struct spi_device spi_device_conf = { + .id = IOPORT_CREATE_PIN(PORTD, 1) + }; +\endcode + * -# Initialize the SPI module, in this case SPI on PORTD has been chosen: + * - \code + spi_master_init(&SPID); +\endcode + * -# Setup the SPI master module for a specific device: + * - \code + spi_master_setup_device(&SPID, &spi_device_conf, SPI_MODE_0, 1000000, 0); +\endcode + * - \note The last argument, which is zero in this case, can be ignored and is + * only included for compatibility purposes. + * -# Then enable the SPI: + * - \code + spi_enable(&SPID); +\endcode + * + * \section spi_master_xmega_basic_usage Usage steps + * \subsection spi_master_xmega_basic_usage_code Example code + * Add to, e.g., the main loop in the application C-file: + * \code + uint8_t data_buffer[1] = {0xAA}; + + struct spi_device spi_device_conf = { + .id = IOPORT_CREATE_PIN(PORTD, 1) + }; + + spi_select_device(&SPID, &spi_device_conf); + + spi_write_packet(&SPID, data_buffer, 1); + spi_read_packet(&SPID, data_buffer, 1); + + spi_deselect_device(&SPID, &spi_device_conf); +\endcode + * + * \subsection spi_master_xmega_basic_usage_flow Workflow + * -# Create a buffer for data to be sent/received on the SPI bus, in this case + * a single byte buffer is used. The buffer can be of arbitrary size as long as + * there is space left in SRAM: + * - \code + uint8_t data_buffer[1] = {0xAA}; +\endcode + * -# Define the SPI device configuration struct to describe which pin the + * slave select (slave chip select) is connected to, in this case the slave + * select pin has been connected to PORTD pin 1 (PD1): + * - \code + struct spi_device spi_device_conf = { + .id = IOPORT_CREATE_PIN(PORTD, 1) + }; +\endcode + * - \note As this struct is the same for both the initializing part and the usage + * part it could be a good idea to make the struct global, and hence accessible + * for both the initializing part and usage part. Another solution could be to + * create the struct in the main function and pass the address of the struct to + * the spi_init_module() function, e.g.: + * \code + void spi_init_module(struct spi_device *spi_device_conf) + { + ... + + spi_master_setup_device(&SPID, spi_device_conf, SPI_MODE_0, 1000000, 0); + + ... + } +\endcode + * -# Write data to the SPI slave device, in this case write one byte from the + * data_buffer: + * - \code + spi_write_packet(&SPID, data_buffer, 1); +\endcode + * -# Read data from the SPI slave device, in this case read one byte and put it + * into the data_buffer: + * - \code + spi_read_packet(&SPID, data_buffer, 1); +\endcode + * - \attention As the SPI works as a shift register so that data is shifted in at + * the same time as data is shifted out a read operation will mean that a dummy + * byte \ref CONFIG_SPI_MASTER_DUMMY is written to the SPI bus. \ref CONFIG_SPI_MASTER_DUMMY + * defaults to 0xFF, but can be changed by defining it inside the \ref conf_spi_master.h + * file. + * -# When read and write operations is done de-select the slave: + * - \code + spi_deselect_device(&SPID, &spi_device_conf); +\endcode + * + */ + +#endif // _SPI_MASTER_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/xmega_usart_spi/usart_spi.c b/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/xmega_usart_spi/usart_spi.c new file mode 100644 index 00000000..7a406d70 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/xmega_usart_spi/usart_spi.c @@ -0,0 +1,140 @@ +/** + * \file + * + * \brief AVR XMEGA USART in SPI mode driver functions. + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#include "usart_spi.h" +#include "sysclk.h" + +void usart_spi_init(USART_t *usart) +{ +#ifdef USARTC0 + if((uint16_t)usart == (uint16_t)&USARTC0) { + sysclk_enable_module(SYSCLK_PORT_C,PR_USART0_bm); + } +#endif +#ifdef USARTC1 + else + if((uint16_t)usart == (uint16_t)&USARTC1) { + sysclk_enable_module(SYSCLK_PORT_C,PR_USART1_bm); + } +#endif +#ifdef USARTD0 + else + if((uint16_t)usart == (uint16_t)&USARTD0) { + sysclk_enable_module(SYSCLK_PORT_D,PR_USART0_bm); + } +#endif +#ifdef USARTD1 + else + if((uint16_t)usart == (uint16_t)&USARTD1) { + sysclk_enable_module(SYSCLK_PORT_D,PR_USART1_bm); + } +#endif +#ifdef USARTE0 + else + if((uint16_t)usart == (uint16_t)&USARTE0) { + sysclk_enable_module(SYSCLK_PORT_E,PR_USART0_bm); + } +#endif +#ifdef USARTE1 + else + if((uint16_t)usart == (uint16_t)&USARTE1) { + sysclk_enable_module(SYSCLK_PORT_E,PR_USART1_bm); + } +#endif +#ifdef USARTF0 + else + if((uint16_t)usart == (uint16_t)&USARTF0) { + sysclk_enable_module(SYSCLK_PORT_F,PR_USART0_bm); + } +#endif +#ifdef USARTF1 + else + if((uint16_t)usart == (uint16_t)&USARTF1) { + sysclk_enable_module(SYSCLK_PORT_F,PR_USART1_bm); + } +#endif +} + +void usart_spi_setup_device(USART_t *usart, struct usart_spi_device *device, + spi_flags_t flags, unsigned long baud_rate, + board_spi_select_id_t sel_id) +{ + usart_spi_options_t opt; + opt.baudrate=baud_rate; + opt.spimode=flags; + opt.data_order=false; + usart_init_spi(usart, &opt); +} + +status_code_t usart_spi_write_packet(USART_t *usart,const uint8_t *data, size_t len) +{ + size_t i=0; + while(len) { + usart_spi_transmit(usart,*(data+i)); + len--; + i++; + } + return STATUS_OK; +} + +status_code_t usart_spi_read_packet(USART_t *usart, uint8_t *data, size_t len) +{ + while(len) { + *data = usart_spi_transmit(usart, CONFIG_USART_SPI_DUMMY); + len--; + data++; + } + return STATUS_OK; +} + +void usart_spi_select_device(USART_t *usart, struct usart_spi_device *device) +{ + ioport_set_pin_low(device->id); +} + +void usart_spi_deselect_device(USART_t *usart, struct usart_spi_device *device) +{ + ioport_set_pin_high(device->id); +} diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h new file mode 100644 index 00000000..d5d5a95f --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/spi/xmega_usart_spi/usart_spi.h @@ -0,0 +1,279 @@ +/** + * \file + * + * \brief AVR XMEGA USART in SPI mode driver functions. + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _USART_SPI_H_ +#define _USART_SPI_H_ + +#include "compiler.h" +#include "status_codes.h" +#include "ioport.h" +#include "usart.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*! \name USART in SPI mode Management Configuration + */ +//! @{ +#include "conf_usart_spi.h" + +//! Default Config Spi Master Dummy Field +#ifndef CONFIG_USART_SPI_DUMMY + #define CONFIG_USART_SPI_DUMMY 0xFF +#endif +//! @} + +/** + * \brief Clock phase + */ +#define SPI_CPHA (1 << 0) + +/** + * \brief Clock polarity + */ +#define SPI_CPOL (1 << 1) + +/** + * \brief SPI mode 0 + */ +#define SPI_MODE_0 0 +/** + * \brief SPI mode 1 + */ +#define SPI_MODE_1 (SPI_CPHA) +/** + * \brief SPI mode 2 + */ +#define SPI_MODE_2 (SPI_CPOL) +/** + * \brief SPI mode 3 + */ +#define SPI_MODE_3 (SPI_CPOL | SPI_CPHA) + +typedef uint8_t spi_flags_t; +typedef uint32_t board_spi_select_id_t; + +//! \brief Polled SPI device definition +struct usart_spi_device { + //! Board specific select id + port_pin_t id; +}; + +/*! \brief Initializes the USART in SPI master mode. + * + * \param usart Base address of the USART instance. + * + */ +extern void usart_spi_init(USART_t *usart); + +/** + * \brief Setup a USART in SPI mode device. + * + * The returned device descriptor structure must be passed to the driver + * whenever that device should be used as current slave device. + * + * \param usart Base address of the USART instance. + * \param device Pointer to usart device struct that should be initialized. + * \param flags USART configuration flags. Common flags for all + * implementations are the usart modes SPI_MODE_0 ... + * SPI_MODE_3. + * \param baud_rate Baud rate for communication with slave device in Hz. + * \param sel_id Board specific select id + */ +extern void usart_spi_setup_device(USART_t *usart, struct usart_spi_device *device, + spi_flags_t flags, unsigned long baud_rate, + board_spi_select_id_t sel_id); + +/*! \brief Enables the USART for the specified USART in SPI mode. + * + * \param usart Base address of the USART instance. + */ +extern void usart_spi_enable(USART_t *usart); + +/*! \brief Disables the USART. + * + * Ensures that nothing is transferred while setting up buffers. + * + * \param usart Base address of the USART instance. + * + */ +extern void usart_spi_disable(USART_t *usart); + + +/*! \brief Tests if the USART in SPI mode is enabled. + * + * \param usart Base address of the usart instance. + * + * \return \c 1 if the usart is enabled, otherwise \c 0. + */ +extern bool usart_spi_is_enabled(USART_t *usart); + +/** + * \brief Select given device on the SPI bus + * + * Set device specific setting and calls board chip select. + * + * \param usart Base address of the USART instance. + * \param device SPI device + * + */ +extern void usart_spi_select_device(USART_t *usart, struct usart_spi_device *device); + +/** + * \brief Deselect given device on the SPI bus + * + * Calls board chip deselect. + * + * \param usart Base address of the USART instance. + * \param device SPI device + * + * \pre SPI device must be selected with usart_spi_select_device() first + */ +extern void usart_spi_deselect_device(USART_t *usart, struct usart_spi_device *device); + +/*! \brief Write one byte to a SPI device using USART in SPI mode + * + * \param usart Base address of the usart instance. + * \param data The data byte to be loaded + * + */ +__always_inline static void usart_spi_write_single(USART_t *usart, uint8_t data) +{ + usart_spi_transmit(usart, data); +} + +/** + * \brief Send a sequence of bytes to a SPI device using USART in SPI mode + * + * Received bytes on the USART in SPI mode are discarded. + * + * \param usart Base address of the USART instance. + * \param data Data buffer to write + * \param len Length of data + * + * \pre usart device must be selected with usart_spi_select_device() first + */ +extern status_code_t usart_spi_write_packet(USART_t *usart,const uint8_t *data, size_t len); + + +/*! \brief Receive one byte from a SPI device using USART in SPI mode + * + * \param usart Base address of the USART instance. + * \param data Pointer to the data byte where to store the received data. + * + */ +inline static void usart_spi_read_single(USART_t *usart, uint8_t *data) +{ + *data = usart_spi_transmit(usart, CONFIG_USART_SPI_DUMMY); +} + +/** + * \brief Receive a sequence of bytes from a USART in SPI mode device + * + * All bytes sent out on usart bus are sent as value 0. + * + * \param usart Base address of the usart instance. + * \param data data buffer to read + * \param len Length of data + * + * \pre usart device must be selected with usart_spi_select_device() first + */ +extern status_code_t usart_spi_read_packet(USART_t *usart, uint8_t *data, size_t len); + +/*! \brief Check whether there are data in Transmit Holding Register or + * Transmit Shift Register in SPI master mode. + * + * \param usart Base address of the USART instance. + * + * \retval 1 The two registers are empty. + * \retval 0 One of the two registers contains data. + */ +inline static bool usart_spi_is_tx_empty(USART_t *usart) +{ + return usart_data_register_is_empty(usart); +} + +/*! \brief Check whether the USART in SPI master mode contains a received character. + * + * \param usart Base address of the USART instance. + * + * \retval 1 Some data have been received. + * \retval 0 No data has been received. + */ +inline static bool usart_spi_is_rx_ready(USART_t *usart) +{ + return usart_rx_is_complete(usart); +} + +/*! \brief Check if the USART Transmit Register is empty. + * + * \param usart Base address of the USART instance. + * + * \retval 1 There is no data in the Transmit Holding Register. + * \retval 0 There are data in the Transmit Holding Register. + */ +inline static bool usart_spi_is_tx_ready(USART_t *usart) +{ + return usart_data_register_is_empty(usart); +} + +/*! \brief Tests if the USART in SPI mode contains a received character. + * + * \param usart Base address of the USART instance. + * + * \return \c 1 if the USART Receive Holding Register is full, otherwise \c 0. + */ +inline static bool usart_spi_is_rx_full(USART_t *usart) +{ + return usart_rx_is_complete(usart); +} + +#ifdef __cplusplus +} +#endif + +#endif // _USART_SPI_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.c b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.c new file mode 100644 index 00000000..fd035fe1 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/device/example/atxmega256a3bu_xmega_a3bu_xplained/ui.c @@ -0,0 +1,84 @@ +/** + * \file + * + * \brief User Interface + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#include +#include "ui.h" + +void ui_init(void) +{ + return; +} + +void ui_powerdown(void) +{ + return; +} + +void ui_wakeup(void) +{ + return; +} + +void ui_loop_back_state(bool b_started) +{ + return; +} + +void ui_process(uint16_t framenumber) +{ + return; +} + + +/** + * \defgroup UI User Interface + * + * Human interface on XMEGA-A3BU Xplained: + * - Led green (close to USB connector) is on at power on + * - Led 0 is on when USB line is in IDLE mode, and off in SUSPEND mode + * - Led 1 blinks when USB host has checked and enabled vendor interface + * - Red LED (Led 2) close to USB connector is on when loopback is running + */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/device/udi_vendor.c b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/device/udi_vendor.c new file mode 100644 index 00000000..a4986654 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/device/udi_vendor.c @@ -0,0 +1,296 @@ +/** + * \file + * + * \brief USB Vendor class interface. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "usb_protocol_vendor.h" +#include "udd.h" +#include "udc.h" +#include "udi_vendor.h" +#include + +// Configuration check +#ifndef UDI_VENDOR_ENABLE_EXT +# error UDI_VENDOR_ENABLE_EXT must be defined in conf_usb.h file. +#endif +#ifndef UDI_VENDOR_DISABLE_EXT +# error UDI_VENDOR_DISABLE_EXT must be defined in conf_usb.h file. +#endif + +/** + * \ingroup udi_vendor_group + * \defgroup udi_vendor_group_udc Interface with USB Device Core (UDC) + * + * Structures and functions required by UDC. + * + * @{ + */ +bool udi_vendor_enable(void); +void udi_vendor_disable(void); +bool udi_vendor_setup(void); +uint8_t udi_vendor_getsetting(void); + +//! Global structure which contains standard UDI API for UDC +UDC_DESC_STORAGE udi_api_t udi_api_vendor = { + .enable = udi_vendor_enable, + .disable = udi_vendor_disable, + .setup = udi_vendor_setup, + .getsetting = udi_vendor_getsetting, + .sof_notify = NULL, +}; +//@} + + +/** + * \ingroup udi_vendor_group + * \defgroup udi_vendor_group_internal Implementation of UDI Vendor Class + * + * Class internal implementation + * @{ + */ + +//! USB descriptor alternate setting used +static uint8_t udi_vendor_alternate_setting = 0; + +/** + * \name Internal routines + */ +//@{ +bool udi_vendor_enable(void) +{ + udi_vendor_alternate_setting = udc_get_interface_desc()->bAlternateSetting; + if (0 == udi_vendor_alternate_setting) { + // Call application callback + // to notify that interface is enabled + if (!UDI_VENDOR_ENABLE_EXT()) { + return false; + } + } + return true; +} + + +void udi_vendor_disable(void) +{ + if (1 == udi_vendor_alternate_setting) { + UDI_VENDOR_DISABLE_EXT(); + } +} + + +bool udi_vendor_setup(void) +{ + if (Udd_setup_is_in()) { + if ((Udd_setup_type() == USB_REQ_TYPE_VENDOR) + && (udd_g_ctrlreq.req.bRequest == 0)) { + return UDI_VENDOR_SETUP_IN_RECEIVED(); + } + } + if (Udd_setup_is_out()) { + if ((Udd_setup_type() == USB_REQ_TYPE_VENDOR) + && (udd_g_ctrlreq.req.bRequest == 0) + && (0 != udd_g_ctrlreq.req.wLength)) { + return UDI_VENDOR_SETUP_OUT_RECEIVED(); + } + } + return false; // Not supported request +} + +uint8_t udi_vendor_getsetting(void) +{ + return udi_vendor_alternate_setting; +} +//@} + +#if UDI_VENDOR_EPS_SIZE_INT_FS +/** + * \brief Start a transfer on interrupt IN + * + * When the transfer is finished or aborted (stall, reset, ...), the \a callback is called. + * The \a callback returns the transfer status and eventually the number of byte transfered. + * + * \param buf Buffer on Internal RAM to send or fill. + * It must be align, then use COMPILER_WORD_ALIGNED. + * \param buf_size Buffer size to send or fill + * \param callback NULL or function to call at the end of transfer + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udi_vendor_interrupt_in_run(uint8_t * buf, iram_size_t buf_size, + udd_callback_trans_t callback) +{ + return udd_ep_run(UDI_VENDOR_EP_INTERRUPT_IN, + false, + buf, + buf_size, + callback); +} + + +/** + * \brief Start a transfer on interrupt OUT + * + * When the transfer is finished or aborted (stall, reset, ...), the \a callback is called. + * The \a callback returns the transfer status and eventually the number of byte transfered. + * + * \param buf Buffer on Internal RAM to send or fill. + * It must be align, then use COMPILER_WORD_ALIGNED. + * \param buf_size Buffer size to send or fill + * \param callback NULL or function to call at the end of transfer + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udi_vendor_interrupt_out_run(uint8_t * buf, iram_size_t buf_size, + udd_callback_trans_t callback) +{ + return udd_ep_run(UDI_VENDOR_EP_INTERRUPT_OUT, + false, + buf, + buf_size, + callback); +} +#endif + +#if UDI_VENDOR_EPS_SIZE_BULK_FS +/** + * \brief Start a transfer on bulk IN + * + * When the transfer is finished or aborted (stall, reset, ...), the \a callback is called. + * The \a callback returns the transfer status and eventually the number of byte transfered. + * + * \param buf Buffer on Internal RAM to send or fill. + * It must be align, then use COMPILER_WORD_ALIGNED. + * \param buf_size Buffer size to send or fill + * \param callback NULL or function to call at the end of transfer + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udi_vendor_bulk_in_run(uint8_t * buf, iram_size_t buf_size, + udd_callback_trans_t callback) +{ + return udd_ep_run(UDI_VENDOR_EP_BULK_IN, + false, + buf, + buf_size, + callback); +} + + +/** + * \brief Start a transfer on bulk OUT + * + * When the transfer is finished or aborted (stall, reset, ...), the \a callback is called. + * The \a callback returns the transfer status and eventually the number of byte transfered. + * + * \param buf Buffer on Internal RAM to send or fill. + * It must be align, then use COMPILER_WORD_ALIGNED. + * \param buf_size Buffer size to send or fill + * \param callback NULL or function to call at the end of transfer + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udi_vendor_bulk_out_run(uint8_t * buf, iram_size_t buf_size, + udd_callback_trans_t callback) +{ + return udd_ep_run(UDI_VENDOR_EP_BULK_OUT, + false, + buf, + buf_size, + callback); +} +#endif + + +#if UDI_VENDOR_EPS_SIZE_ISO_FS +/** + * \brief Start a transfer on interrupt IN + * + * When the transfer is finished or aborted (stall, reset, ...), the \a callback is called. + * The \a callback returns the transfer status and eventually the number of byte transfered. + * + * \param buf Buffer on Internal RAM to send or fill. + * It must be align, then use COMPILER_WORD_ALIGNED. + * \param buf_size Buffer size to send or fill + * \param callback NULL or function to call at the end of transfer + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udi_vendor_iso_in_run(uint8_t * buf, iram_size_t buf_size, + udd_callback_trans_t callback) +{ + return udd_ep_run(UDI_VENDOR_EP_ISO_IN, + false, + buf, + buf_size, + callback); +} + + +/** + * \brief Start a transfer on interrupt OUT + * + * When the transfer is finished or aborted (stall, reset, ...), the \a callback is called. + * The \a callback returns the transfer status and eventually the number of byte transfered. + * + * \param buf Buffer on Internal RAM to send or fill. + * It must be align, then use COMPILER_WORD_ALIGNED. + * \param buf_size Buffer size to send or fill + * \param callback NULL or function to call at the end of transfer + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udi_vendor_iso_out_run(uint8_t * buf, iram_size_t buf_size, + udd_callback_trans_t callback) +{ + return udd_ep_run(UDI_VENDOR_EP_ISO_OUT, + false, + buf, + buf_size, + callback); +} +#endif + +//@} diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/device/udi_vendor.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/device/udi_vendor.h new file mode 100644 index 00000000..99b72969 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/device/udi_vendor.h @@ -0,0 +1,622 @@ +/** + * \file + * + * \brief USB Vendor class interface definitions. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDI_VENDOR_H_ +#define _UDI_VENDOR_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "usb_protocol_vendor.h" +#include "udd.h" +#include "udc_desc.h" +#include "udi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Configuration Full Speed check +#ifndef UDI_VENDOR_EPS_SIZE_INT_FS +# error UDI_VENDOR_EPS_SIZE_INT_FS must be defined in conf_usb.h file. +#endif +#ifndef UDI_VENDOR_EPS_SIZE_BULK_FS +# error UDI_VENDOR_EPS_SIZE_BULK_FS must be defined in conf_usb.h file. +#endif +#ifndef UDI_VENDOR_EPS_SIZE_ISO_FS +# error UDI_VENDOR_EPS_SIZE_ISO_FS must be defined in conf_usb.h file. +#endif + +// Configuration High Speed check +#ifdef USB_DEVICE_HS_SUPPORT +# ifndef UDI_VENDOR_EPS_SIZE_INT_HS +# error UDI_VENDOR_EPS_SIZE_INT_HS must be defined in conf_usb.h file. +# endif +# ifndef UDI_VENDOR_EPS_SIZE_BULK_HS +# error UDI_VENDOR_EPS_SIZE_BULK_HS must be defined in conf_usb.h file. +# endif +# ifndef UDI_VENDOR_EPS_SIZE_ISO_HS +# error UDI_VENDOR_EPS_SIZE_ISO_HS must be defined in conf_usb.h file. +# endif +#endif + +/** + * \addtogroup udi_vendor_group_udc + * @{ + */ +//! Global structure which contains standard UDI interface for UDC +extern UDC_DESC_STORAGE udi_api_t udi_api_vendor; +//@} + +/** + * \ingroup udi_vendor_group + * \defgroup udi_vendor_group_desc USB interface descriptors + * + * The following structures provide predefined USB interface descriptors. + * It must be used to define the final USB descriptors. + */ +//@{ + +/** + * \name Endpoint descriptors + * @{ + */ +#if UDI_VENDOR_EPS_SIZE_INT_FS +# define UDI_VENDOR_EPS_INT_DESC \ + .ep_interrupt_in.bLength = sizeof(usb_ep_desc_t),\ + .ep_interrupt_in.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_interrupt_in.bEndpointAddress = UDI_VENDOR_EP_INTERRUPT_IN,\ + .ep_interrupt_in.bmAttributes = USB_EP_TYPE_INTERRUPT,\ + .ep_interrupt_in.bInterval = 1,\ + .ep_interrupt_out.bLength = sizeof(usb_ep_desc_t),\ + .ep_interrupt_out.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_interrupt_out.bEndpointAddress = UDI_VENDOR_EP_INTERRUPT_OUT,\ + .ep_interrupt_out.bmAttributes = USB_EP_TYPE_INTERRUPT,\ + .ep_interrupt_out.bInterval = 1, + +# define UDI_VENDOR_EPS_INT_DESC_FS \ + .ep_interrupt_in.wMaxPacketSize = LE16(UDI_VENDOR_EPS_SIZE_INT_FS),\ + .ep_interrupt_out.wMaxPacketSize = LE16(UDI_VENDOR_EPS_SIZE_INT_FS), + +# define UDI_VENDOR_EPS_INT_DESC_HS \ + .ep_interrupt_in.wMaxPacketSize = LE16(UDI_VENDOR_EPS_SIZE_INT_HS),\ + .ep_interrupt_out.wMaxPacketSize = LE16(UDI_VENDOR_EPS_SIZE_INT_HS), + +#else +# define UDI_VENDOR_EPS_INT_DESC +# define UDI_VENDOR_EPS_INT_DESC_FS +# define UDI_VENDOR_EPS_INT_DESC_HS +#endif + +#if UDI_VENDOR_EPS_SIZE_BULK_FS +# define UDI_VENDOR_EPS_BULK_DESC \ + .ep_bulk_in.bLength = sizeof(usb_ep_desc_t),\ + .ep_bulk_in.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_bulk_in.bEndpointAddress = UDI_VENDOR_EP_BULK_IN,\ + .ep_bulk_in.bmAttributes = USB_EP_TYPE_BULK,\ + .ep_bulk_in.bInterval = 0,\ + .ep_bulk_out.bLength = sizeof(usb_ep_desc_t),\ + .ep_bulk_out.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_bulk_out.bEndpointAddress = UDI_VENDOR_EP_BULK_OUT,\ + .ep_bulk_out.bmAttributes = USB_EP_TYPE_BULK,\ + .ep_bulk_out.bInterval = 0, + +# define UDI_VENDOR_EPS_BULK_DESC_FS \ + .ep_bulk_in.wMaxPacketSize = LE16(UDI_VENDOR_EPS_SIZE_BULK_FS),\ + .ep_bulk_out.wMaxPacketSize = LE16(UDI_VENDOR_EPS_SIZE_BULK_FS), + +# define UDI_VENDOR_EPS_BULK_DESC_HS \ + .ep_bulk_in.wMaxPacketSize = LE16(UDI_VENDOR_EPS_SIZE_BULK_HS),\ + .ep_bulk_out.wMaxPacketSize = LE16(UDI_VENDOR_EPS_SIZE_BULK_HS), + +#else +# define UDI_VENDOR_EPS_BULK_DESC +# define UDI_VENDOR_EPS_BULK_DESC_FS +# define UDI_VENDOR_EPS_BULK_DESC_HS +#endif + +#if UDI_VENDOR_EPS_SIZE_ISO_FS +# define UDI_VENDOR_EPS_ISO_DESC \ + .ep_iso_in.bLength = sizeof(usb_ep_desc_t),\ + .ep_iso_in.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_iso_in.bEndpointAddress = UDI_VENDOR_EP_ISO_IN,\ + .ep_iso_in.bmAttributes = USB_EP_TYPE_ISOCHRONOUS,\ + .ep_iso_in.bInterval = 1, + //.ep_iso_out.bLength = sizeof(usb_ep_desc_t),\ + //.ep_iso_out.bDescriptorType = USB_DT_ENDPOINT,\ + //.ep_iso_out.bEndpointAddress = UDI_VENDOR_EP_ISO_OUT,\ + //.ep_iso_out.bmAttributes = USB_EP_TYPE_ISOCHRONOUS,\ + //.ep_iso_out.bInterval = 1, + +# define UDI_VENDOR_EPS_ISO_DESC_FS \ + .ep_iso_in.wMaxPacketSize = LE16(UDI_VENDOR_EPS_SIZE_ISO_FS), + //.ep_iso_out.wMaxPacketSize = LE16(UDI_VENDOR_EPS_SIZE_ISO_FS), + +# define UDI_VENDOR_EPS_ISO_DESC_HS \ + .ep_iso_in.wMaxPacketSize = LE16(UDI_VENDOR_EPS_SIZE_ISO_HS), + //.ep_iso_out.wMaxPacketSize = LE16(UDI_VENDOR_EPS_SIZE_ISO_HS), + +#else +# define UDI_VENDOR_EPS_ISO_DESC +# define UDI_VENDOR_EPS_ISO_DESC_FS +# define UDI_VENDOR_EPS_ISO_DESC_HS +#endif + +//@} + +//! Interface descriptor structure for vendor Class interface +typedef struct { + //usb_iface_desc_t iface0; + usb_iface_desc_t iface1; +#if UDI_VENDOR_EPS_SIZE_INT_FS + usb_ep_desc_t ep_interrupt_in; + usb_ep_desc_t ep_interrupt_out; +#endif +#if UDI_VENDOR_EPS_SIZE_BULK_FS + usb_ep_desc_t ep_bulk_in; + usb_ep_desc_t ep_bulk_out; +#endif +#if UDI_VENDOR_EPS_SIZE_ISO_FS + usb_ep_desc_t ep_iso_in; + //usb_ep_desc_t ep_iso_out; +#endif +} udi_vendor_desc_t; + +//! By default no string associated to this interface +#ifndef UDI_VENDOR_STRING_ID +#define UDI_VENDOR_STRING_ID 0 +#endif + +//! Maximum 6 endpoints used by vendor interface +#define UDI_VENDOR_EP_NB_INT ((UDI_VENDOR_EPS_SIZE_INT_FS)?2:0) +#define UDI_VENDOR_EP_NB_BULK ((UDI_VENDOR_EPS_SIZE_BULK_FS)?2:0) +#define UDI_VENDOR_EP_NB_ISO ((UDI_VENDOR_EPS_SIZE_ISO_FS)?1:0) //Used to be 2:0!! +#define UDI_VENDOR_EP_NB (UDI_VENDOR_EP_NB_INT+UDI_VENDOR_EP_NB_BULK+UDI_VENDOR_EP_NB_ISO) + + +//! Content of vendor interface descriptor for all speeds +#define UDI_VENDOR_DESC \ + /*.iface0.bLength = sizeof(usb_iface_desc_t),\ + .iface0.bDescriptorType = USB_DT_INTERFACE,\ + .iface0.bInterfaceNumber = UDI_VENDOR_IFACE_NUMBER,\ + .iface0.bAlternateSetting = 0,\ + .iface0.bNumEndpoints = 0,\ + .iface0.bInterfaceClass = VENDOR_CLASS,\ + .iface0.bInterfaceSubClass = VENDOR_SUBCLASS,\ + .iface0.bInterfaceProtocol = VENDOR_PROTOCOL,\ + .iface0.iInterface = UDI_VENDOR_STRING_ID,\ + */.iface1.bLength = sizeof(usb_iface_desc_t),\ + .iface1.bDescriptorType = USB_DT_INTERFACE,\ + .iface1.bInterfaceNumber = UDI_VENDOR_IFACE_NUMBER,\ + .iface1.bAlternateSetting = 0,\ + .iface1.bNumEndpoints = UDI_VENDOR_EP_NB,\ + .iface1.bInterfaceClass = VENDOR_CLASS,\ + .iface1.bInterfaceSubClass = VENDOR_SUBCLASS,\ + .iface1.bInterfaceProtocol = VENDOR_PROTOCOL,\ + .iface1.iInterface = UDI_VENDOR_STRING_ID,\ + UDI_VENDOR_EPS_INT_DESC \ + UDI_VENDOR_EPS_BULK_DESC \ + UDI_VENDOR_EPS_ISO_DESC \ + +//! Content of vendor interface descriptor for full speed only +#define UDI_VENDOR_DESC_FS {\ + UDI_VENDOR_DESC \ + UDI_VENDOR_EPS_INT_DESC_FS \ + UDI_VENDOR_EPS_BULK_DESC_FS \ + UDI_VENDOR_EPS_ISO_DESC_FS \ + } + +//! Content of vendor interface descriptor for high speed only +#define UDI_VENDOR_DESC_HS {\ + UDI_VENDOR_DESC \ + UDI_VENDOR_EPS_INT_DESC_HS \ + UDI_VENDOR_EPS_BULK_DESC_HS \ + UDI_VENDOR_EPS_ISO_DESC_HS \ + } +//@} + + +/** + * \ingroup udi_group + * \defgroup udi_vendor_group USB Device Interface (UDI) for Vendor Class + * + * Common APIs used by high level application to use this USB class. + * + * These routines are used to transfer data to/from USB VENDOR endpoints. + * + * See \ref udi_vendor_quickstart. + * @{ + */ + +#if UDI_VENDOR_EPS_SIZE_INT_FS || defined(__DOXYGEN__) +/** + * \brief Start a transfer on interrupt IN + * + * When the transfer is finished or aborted (stall, reset, ...), the \a callback is called. + * The \a callback returns the transfer status and eventually the number of byte transfered. + * + * \param buf Buffer on Internal RAM to send or fill. + * It must be align, then use COMPILER_WORD_ALIGNED. + * \param buf_size Buffer size to send or fill + * \param callback NULL or function to call at the end of transfer + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udi_vendor_interrupt_in_run(uint8_t * buf, iram_size_t buf_size, + udd_callback_trans_t callback); + +/** + * \brief Start a transfer on interrupt OUT + * + * When the transfer is finished or aborted (stall, reset, ...), the \a callback is called. + * The \a callback returns the transfer status and eventually the number of byte transfered. + * + * \param buf Buffer on Internal RAM to send or fill. + * It must be align, then use COMPILER_WORD_ALIGNED. + * \param buf_size Buffer size to send or fill + * \param callback NULL or function to call at the end of transfer + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udi_vendor_interrupt_out_run(uint8_t * buf, iram_size_t buf_size, + udd_callback_trans_t callback); +#endif + +#if UDI_VENDOR_EPS_SIZE_BULK_FS || defined(__DOXYGEN__) +/** + * \brief Start a transfer on bulk IN + * + * When the transfer is finished or aborted (stall, reset, ...), the \a callback is called. + * The \a callback returns the transfer status and eventually the number of byte transfered. + * + * \param buf Buffer on Internal RAM to send or fill. + * It must be align, then use COMPILER_WORD_ALIGNED. + * \param buf_size Buffer size to send or fill + * \param callback NULL or function to call at the end of transfer + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udi_vendor_bulk_in_run(uint8_t * buf, iram_size_t buf_size, + udd_callback_trans_t callback); + +/** + * \brief Start a transfer on bulk OUT + * + * When the transfer is finished or aborted (stall, reset, ...), the \a callback is called. + * The \a callback returns the transfer status and eventually the number of byte transfered. + * + * \param buf Buffer on Internal RAM to send or fill. + * It must be align, then use COMPILER_WORD_ALIGNED. + * \param buf_size Buffer size to send or fill + * \param callback NULL or function to call at the end of transfer + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udi_vendor_bulk_out_run(uint8_t * buf, iram_size_t buf_size, + udd_callback_trans_t callback); +#endif + + +#if UDI_VENDOR_EPS_SIZE_ISO_FS || defined(__DOXYGEN__) +/** + * \brief Start a transfer on isochronous IN + * + * When the transfer is finished or aborted (stall, reset, ...), the \a callback is called. + * The \a callback returns the transfer status and eventually the number of byte transfered. + * + * \param buf Buffer on Internal RAM to send or fill. + * It must be align, then use COMPILER_WORD_ALIGNED. + * \param buf_size Buffer size to send or fill + * \param callback NULL or function to call at the end of transfer + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udi_vendor_iso_in_run(uint8_t * buf, iram_size_t buf_size, + udd_callback_trans_t callback); + +/** + * \brief Start a transfer on isochronous OUT + * + * When the transfer is finished or aborted (stall, reset, ...), the \a callback is called. + * The \a callback returns the transfer status and eventually the number of byte transfered. + * + * \param buf Buffer on Internal RAM to send or fill. + * It must be align, then use COMPILER_WORD_ALIGNED. + * \param buf_size Buffer size to send or fill + * \param callback NULL or function to call at the end of transfer + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udi_vendor_iso_out_run(uint8_t * buf, iram_size_t buf_size, + udd_callback_trans_t callback); +#endif + +//@} + +/** + * \page udi_vendor_quickstart Quick start guide for USB Device Vendor module (UDI Vendor) + * + * This is the quick start guide for the \ref udi_vendor_group + * "USB device interface Vendor module (UDI Vendor)" with step-by-step instructions on + * how to configure and use the modules in a selection of use cases. + * + * The use cases contain several code fragments. The code fragments in the + * steps for setup can be copied into a custom initialization function, while + * the steps for usage can be copied into, e.g., the main application function. + * + * Also, you can refer to application note + * + * AVR4901: ASF - USB Device Vendor Class Application. + * + * \section udi_vendor_basic_use_case Basic use case + * In this basic use case, the "USB Vendor (Single Interface Device)" module is used. + * The "USB Vendor (Composite Device)" module usage is described in \ref udi_vendor_use_cases + * "Advanced use cases". + * + * \section udi_vendor_basic_use_case_setup Setup steps + * \subsection udi_vendor_basic_use_case_setup_prereq Prerequisites + * \copydetails udc_basic_use_case_setup_prereq + * \subsection udi_vendor_basic_use_case_setup_code Example code + * \copydetails udc_basic_use_case_setup_code + * \subsection udi_vendor_basic_use_case_setup_flow Workflow + * \copydetails udc_basic_use_case_setup_flow + * + * \section udi_vendor_basic_use_case_usage Usage steps + * + * \subsection udi_vendor_basic_use_case_usage_code Example code + * Content of conf_usb.h: + * \code + * #define UDI_VENDOR_ENABLE_EXT() my_callback_vendor_enable() + * extern bool my_callback_vendor_enable(void); + * #define UDI_VENDOR_DISABLE_EXT() my_callback_vendor_disable() + * extern void my_callback_vendor_disable(void); + * + * #define UDI_VENDOR_SETUP_OUT_RECEIVED() my_vendor_setup_out_received() + * extern bool my_vendor_setup_out_received(void); + * #define UDI_VENDOR_SETUP_IN_RECEIVED() my_vendor_setup_in_received() + * extern bool my_vendor_setup_in_received(void); + * + * #define UDI_VENDOR_EPS_SIZE_INT_FS 64 + * #define UDI_VENDOR_EPS_SIZE_BULK_FS 64 + * #define UDI_VENDOR_EPS_SIZE_ISO_FS 256 + * #define UDI_VENDOR_EPS_SIZE_INT_HS 64 + * #define UDI_VENDOR_EPS_SIZE_BULK_HS 512 + * #define UDI_VENDOR_EPS_SIZE_ISO_HS 64 + + * #include "udi_vendor_conf.h" // At the end of conf_usb.h file +\endcode + * + * Add to application C-file: + * \code + static bool my_flag_autorize_vendor_transfert = false; + bool my_callback_vendor_enable(void) + { + my_flag_autorize_vendor_transfert = true; + return true; + } + void my_callback_vendor_disable(void) + { + my_flag_autorize_vendor_transfert = false; + } + + uint8_t global_buffer[X]; + void task(void) + { + if (my_flag_autorize_vendor_transfert) { + // Enable a transfer on OUT interrupt endpoint + udi_vendor_interrupt_out_run( + global_buffer, + sizeof(global_buffer), + NULL); + // Enable a transfer on IN interrupt endpoint + udi_vendor_interrupt_in_run( + global_buffer, + sizeof(global_buffer), + NULL); + ... + } + } +\endcode + * + * \subsection udi_vendor_basic_use_case_setup_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following configuration + * which is the USB device Vendor configuration: + * - \code #define UDI_VENDOR_ENABLE_EXT() my_callback_vendor_enable() + extern bool my_callback_vendor_enable(void); \endcode + * \note After the device enumeration (detecting and identifying USB devices), + * the USB host starts the device configuration. When the USB Vendor interface + * from the device is accepted by the host, the USB host enables this interface and the + * UDI_VENDOR_ENABLE_EXT() callback function is called and return true. + * Thus, when this event is received, the Vendor transfers can start. + * - \code #define UDI_VENDOR_DISABLE_EXT() my_callback_vendor_disable() + extern void my_callback_vendor_disable(void); \endcode + * \note When the USB device is unplugged or is reset by the USB host, the USB + * interface is disabled and the UDI_VENDOR_DISABLE_EXT() callback function + * is called. Thus, it is recommended to disable the data Vendor transfer. + * - \code #define UDI_VENDOR_SETUP_OUT_RECEIVED() my_vendor_setup_out_received() + extern bool my_vendor_setup_out_received(void); + #define UDI_VENDOR_SETUP_IN_RECEIVED() my_vendor_setup_in_received() + extern bool my_vendor_setup_in_received(void); \endcode + * \note The control requests for the interface Vendor will be processed + * through these both callbacks. + * - \code #define UDI_VENDOR_EPS_SIZE_INT_FS 64 + #define UDI_VENDOR_EPS_SIZE_BULK_FS 64 + #define UDI_VENDOR_EPS_SIZE_ISO_FS 256 + #define UDI_VENDOR_EPS_SIZE_INT_HS 64 + #define UDI_VENDOR_EPS_SIZE_BULK_HS 512 + #define UDI_VENDOR_EPS_SIZE_ISO_HS 64 \endcode + * \note The endpoint size is defined by the final application, and can be + * disabled if the full speed size is zero. + * -# The Vendor transfers on interrupt, bulk and isochronous endpoints are + * done through these functions: + * - \code // Start a transfer on interrupt IN + udi_vendor_interrupt_in_run(); + // Start a transfer on interrupt OUT + udi_vendor_interrupt_out_run(); + // Start a transfer on bulk IN + udi_vendor_bulk_in_run(); + // Start a transfer on bulk OUT + udi_vendor_bulk_out_run(); + // Start a transfer on isochronous IN + udi_vendor_iso_in_run(); + // Start a transfer on isochronous OUT + udi_vendor_iso_out_run(); \endcode + * + * \section udi_vendor_use_cases Advanced use cases + * For more advanced use of the UDI Vendor module, see the following use cases: + * - \subpage udi_vendor_use_case_composite + * - \subpage udc_use_case_1 + * - \subpage udc_use_case_2 + * - \subpage udc_use_case_3 + * - \subpage udc_use_case_5 + * - \subpage udc_use_case_6 + */ + +/** + * \page udi_vendor_use_case_composite Vendor in a composite device + * + * A USB Composite Device is a USB Device which uses more than one USB class. + * In this use case, the "USB Vendor (Composite Device)" module is used to + * create a USB composite device. Thus, this USB module can be associated with + * another "Composite Device" module, like "USB HID Mouse (Composite Device)". + * + * Also, you can refer to application note + * + * AVR4902 ASF - USB Composite Device. + * + * \section udi_vendor_use_case_composite_setup Setup steps + * For the setup code of this use case to work, the + * \ref udi_vendor_basic_use_case "basic use case" must be followed. + * + * \section udi_vendor_use_case_composite_usage Usage steps + * + * \subsection udi_vendor_use_case_composite_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_EP_CTRL_SIZE 64 + #define USB_DEVICE_NB_INTERFACE (X+1) + #define USB_DEVICE_MAX_EP (X) to (X+6) + + #define UDI_VENDOR_EP_INTERRUPT_IN (1 | USB_EP_DIR_IN) + #define UDI_VENDOR_EP_INTERRUPT_OUT (2 | USB_EP_DIR_OUT) + #define UDI_VENDOR_EP_BULK_IN (3 | USB_EP_DIR_IN) + #define UDI_VENDOR_EP_BULK_OUT (4 | USB_EP_DIR_OUT) + #define UDI_VENDOR_EP_ISO_IN (5 | USB_EP_DIR_IN) + #define UDI_VENDOR_EP_ISO_OUT (6 | USB_EP_DIR_OUT) + + #define UDI_VENDOR_IFACE_NUMBER X + + #define UDI_COMPOSITE_DESC_T \ + udi_vendor_desc_t udi_vendor; \ + ... + #define UDI_COMPOSITE_DESC_FS \ + .udi_vendor = UDI_VENDOR_DESC, \ + ... + #define UDI_COMPOSITE_DESC_HS \ + .udi_vendor = UDI_VENDOR_DESC, \ + ... + #define UDI_COMPOSITE_API \ + &udi_api_vendor, \ + ... +\endcode + * + * \subsection udi_vendor_use_case_composite_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters + * required for a USB composite device configuration: + * - \code // Endpoint control size, This must be: + // - 8, 16, 32 or 64 for full speed device (8 is recommended to save RAM) + // - 64 for a high speed device + #define USB_DEVICE_EP_CTRL_SIZE 64 + // Total Number of interfaces on this USB device. + // Add 1 for Vendor. + #define USB_DEVICE_NB_INTERFACE (X+1) + // Total number of endpoints on this USB device. + // This must include each endpoint for each interface. + // Add 0 to 6 for Vendor interface. + // The number depends on UDI_VENDOR_EPS_SIZE_..._FS defines. + #define USB_DEVICE_MAX_EP (X) to (X+6) \endcode + * -# Ensure that conf_usb.h contains the description of + * composite device: + * - \code // The endpoint numbers chosen by you for the Vendor. + // The endpoint numbers starting from 1. + #define UDI_VENDOR_EP_INTERRUPT_IN (1 | USB_EP_DIR_IN) + #define UDI_VENDOR_EP_INTERRUPT_OUT (2 | USB_EP_DIR_OUT) + #define UDI_VENDOR_EP_BULK_IN (3 | USB_EP_DIR_IN) + #define UDI_VENDOR_EP_BULK_OUT (4 | USB_EP_DIR_OUT) + #define UDI_VENDOR_EP_ISO_IN (5 | USB_EP_DIR_IN) + #define UDI_VENDOR_EP_ISO_OUT (6 | USB_EP_DIR_OUT) + // The interface index of an interface starting from 0 + #define UDI_VENDOR_IFACE_NUMBER X \endcode + * -# Ensure that conf_usb.h contains the following parameters + * required for a USB composite device configuration: + * - \code // USB Interfaces descriptor structure + #define UDI_COMPOSITE_DESC_T \ + ... + udi_vendor_desc_t udi_vendor; \ + ... + // USB Interfaces descriptor value for Full Speed + #define UDI_COMPOSITE_DESC_FS \ + ... + .udi_vendor = UDI_VENDOR_DESC_FS, \ + ... + // USB Interfaces descriptor value for High Speed + #define UDI_COMPOSITE_DESC_HS \ + ... + .udi_vendor = UDI_VENDOR_DESC_HS, \ + ... + // USB Interface APIs + #define UDI_COMPOSITE_API \ + ... + &udi_api_vendor, \ + ... \endcode + * - \note The descriptors order given in the four lists above must be the + * same as the order defined by all interface indexes. The interface index + * orders are defined through UDI_X_IFACE_NUMBER defines. + */ + +#ifdef __cplusplus +} +#endif +#endif // _UDI_VENDOR_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h new file mode 100644 index 00000000..e2fef15a --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/device/udi_vendor_conf.h @@ -0,0 +1,123 @@ +/** + * \file + * + * \brief Default Vendor class configuration for a USB Device + * with a single interface + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDI_VENDOR_CONF_H_ +#define _UDI_VENDOR_CONF_H_ + +#include "conf_usb.h" + +/** + * \addtogroup udi_vendor_group_single_desc + * @{ + */ + +//! Control endpoint size +#define USB_DEVICE_EP_CTRL_SIZE 64 + +//! Endpoint numbers used by vendor interface. +//! Note: The order of endpoint can depend on USB hardware capability +//! when a specific mapping is used on USB DPRAM. +#if SAM3S || SAM4S || SAM4E +# define UDI_VENDOR_EP_INTERRUPT_IN (3 | USB_EP_DIR_IN) +# define UDI_VENDOR_EP_INTERRUPT_OUT (6 | USB_EP_DIR_OUT) +# define UDI_VENDOR_EP_BULK_IN (1 | USB_EP_DIR_IN) +# define UDI_VENDOR_EP_BULK_OUT (2 | USB_EP_DIR_OUT) +# define UDI_VENDOR_EP_ISO_IN (4 | USB_EP_DIR_IN) +# define UDI_VENDOR_EP_ISO_OUT (5 | USB_EP_DIR_OUT) +#elif SAM3U +# define UDI_VENDOR_EP_INTERRUPT_IN (3 | USB_EP_DIR_IN) +# define UDI_VENDOR_EP_INTERRUPT_OUT (4 | USB_EP_DIR_OUT) +# define UDI_VENDOR_EP_BULK_IN (1 | USB_EP_DIR_IN) +# define UDI_VENDOR_EP_BULK_OUT (2 | USB_EP_DIR_OUT) +# define UDI_VENDOR_EP_ISO_IN (5 | USB_EP_DIR_IN) +# define UDI_VENDOR_EP_ISO_OUT (6 | USB_EP_DIR_OUT) +#elif SAM3XA +# define UDI_VENDOR_EP_INTERRUPT_IN (3 | USB_EP_DIR_IN) +# define UDI_VENDOR_EP_INTERRUPT_OUT (4 | USB_EP_DIR_OUT) +# define UDI_VENDOR_EP_BULK_IN (5 | USB_EP_DIR_IN) +# define UDI_VENDOR_EP_BULK_OUT (6 | USB_EP_DIR_OUT) +# define UDI_VENDOR_EP_ISO_IN (1 | USB_EP_DIR_IN) +# define UDI_VENDOR_EP_ISO_OUT (2 | USB_EP_DIR_OUT) +#elif SAMG55 +#define UDI_VENDOR_EP_INTERRUPT_IN (1 | USB_EP_DIR_IN) +#define UDI_VENDOR_EP_INTERRUPT_OUT (2 | USB_EP_DIR_OUT) +#define UDI_VENDOR_EP_BULK_IN (3 | USB_EP_DIR_IN) +#define UDI_VENDOR_EP_BULK_OUT (4 | USB_EP_DIR_OUT) +#else +#define UDI_VENDOR_EP_INTERRUPT_IN (1 | USB_EP_DIR_IN) +#define UDI_VENDOR_EP_INTERRUPT_OUT (2 | USB_EP_DIR_OUT) +#define UDI_VENDOR_EP_BULK_IN ((((UDI_VENDOR_EPS_SIZE_INT_FS)?2:0)+1)\ + | USB_EP_DIR_IN) +#define UDI_VENDOR_EP_BULK_OUT ((((UDI_VENDOR_EPS_SIZE_INT_FS)?2:0)+2)\ + | USB_EP_DIR_OUT) +#define UDI_VENDOR_EP_ISO_IN ((((UDI_VENDOR_EPS_SIZE_INT_FS)?2:0)+ \ + ((UDI_VENDOR_EPS_SIZE_BULK_FS)?2:0)+1)\ + | USB_EP_DIR_IN) +#define UDI_VENDOR_EP_ISO_OUT ((((UDI_VENDOR_EPS_SIZE_INT_FS)?2:0)+ \ + ((UDI_VENDOR_EPS_SIZE_BULK_FS)?2:0)+2)\ + | USB_EP_DIR_OUT) +#endif + +//! Interface number is 0 because it is the unique interface +#define UDI_VENDOR_IFACE_NUMBER 0 + +/** + * \name UDD Configuration + */ +//@{ +//! Maximum 6 endpoints used by vendor interface +#define UDI_VENDOR_EP_NB_INT ((UDI_VENDOR_EPS_SIZE_INT_FS)?2:0) +#define UDI_VENDOR_EP_NB_BULK ((UDI_VENDOR_EPS_SIZE_BULK_FS)?2:0) +#define UDI_VENDOR_EP_NB_ISO ((UDI_VENDOR_EPS_SIZE_ISO_FS)?2:0) +#define USB_DEVICE_MAX_EP (UDI_VENDOR_EP_NB_INT+UDI_VENDOR_EP_NB_BULK+UDI_VENDOR_EP_NB_ISO) +//@} + +//@} + +#include "udi_vendor.h" + +#endif // _UDI_VENDOR_CONF_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.c b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.c new file mode 100644 index 00000000..ae0cc47d --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/device/udi_vendor_desc.c @@ -0,0 +1,190 @@ +/** + * \file + * + * \brief Default descriptors for a USB Device with a single vendor class + * interface + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#include "conf_usb.h" +#include "udd.h" +#include "udc_desc.h" +#include "udi_vendor.h" + + +/** + * \defgroup udi_vendor_group_single_desc USB device descriptors for a single interface + * + * The following structures provide the USB device descriptors required for + * USB Device with a single interface Vendor Class. + * + * It is ready to use and do not require more definition. + * @{ + */ + +//! Only one interface for this device +#define USB_DEVICE_NB_INTERFACE 1 + +//! USB Device Descriptor +UDC_DATA(4) +UDC_DESC_STORAGE usb_dev_desc_t udc_device_desc = { + .bLength = sizeof(usb_dev_desc_t), + .bDescriptorType = USB_DT_DEVICE, + .bcdUSB = LE16(USB_V2_0), + .bDeviceClass = 0, + .bDeviceSubClass = 0, + .bDeviceProtocol = 0, + .bMaxPacketSize0 = USB_DEVICE_EP_CTRL_SIZE, + .idVendor = LE16(USB_DEVICE_VENDOR_ID), + .idProduct = LE16(USB_DEVICE_PRODUCT_ID), + .bcdDevice = LE16((USB_DEVICE_MAJOR_VERSION << 8) + | USB_DEVICE_MINOR_VERSION), +#ifdef USB_DEVICE_MANUFACTURE_NAME + .iManufacturer = 1, +#else + .iManufacturer = 0, // No manufacture string +#endif +#ifdef USB_DEVICE_PRODUCT_NAME + .iProduct = 2, +#else + .iProduct = 0, // No product string +#endif +#ifdef USB_DEVICE_SERIAL_NAME + .iSerialNumber = 3, +#else + .iSerialNumber = 0, // No serial string +#endif + .bNumConfigurations = 1 +}; + + +#ifdef USB_DEVICE_HS_SUPPORT +//! USB Device Qualifier Descriptor for HS +UDC_DATA(4) +UDC_DESC_STORAGE usb_dev_qual_desc_t udc_device_qual = { + .bLength = sizeof(usb_dev_qual_desc_t), + .bDescriptorType = USB_DT_DEVICE_QUALIFIER, + .bcdUSB = LE16(USB_V2_0), + .bDeviceClass = 0, + .bDeviceSubClass = 0, + .bDeviceProtocol = 0, + .bMaxPacketSize0 = USB_DEVICE_EP_CTRL_SIZE, + .bNumConfigurations = 1 +}; +#endif + +//! Structure for USB Device Configuration Descriptor +COMPILER_PACK_SET(1) +typedef struct { + usb_conf_desc_t conf; + udi_vendor_desc_t udi_vendor; +} udc_desc_t; +COMPILER_PACK_RESET() + +//! USB Device Configuration Descriptor filled for FS +UDC_DATA(4) +UDC_DESC_STORAGE udc_desc_t udc_desc_fs = { + .conf.bLength = sizeof(usb_conf_desc_t), + .conf.bDescriptorType = USB_DT_CONFIGURATION, + .conf.wTotalLength = LE16(sizeof(udc_desc_t)), + .conf.bNumInterfaces = USB_DEVICE_NB_INTERFACE, + .conf.bConfigurationValue = 1, + .conf.iConfiguration = 0, + .conf.bmAttributes = USB_CONFIG_ATTR_MUST_SET | USB_DEVICE_ATTR, + .conf.bMaxPower = USB_CONFIG_MAX_POWER(USB_DEVICE_POWER), + .udi_vendor = UDI_VENDOR_DESC_FS, +}; + +#ifdef USB_DEVICE_HS_SUPPORT +//! USB Device Configuration Descriptor filled for HS +UDC_DATA(4) +UDC_DESC_STORAGE udc_desc_t udc_desc_hs = { + .conf.bLength = sizeof(usb_conf_desc_t), + .conf.bDescriptorType = USB_DT_CONFIGURATION, + .conf.wTotalLength = LE16(sizeof(udc_desc_t)), + .conf.bNumInterfaces = USB_DEVICE_NB_INTERFACE, + .conf.bConfigurationValue = 1, + .conf.iConfiguration = 0, + .conf.bmAttributes = USB_CONFIG_ATTR_MUST_SET | USB_DEVICE_ATTR, + .conf.bMaxPower = USB_CONFIG_MAX_POWER(USB_DEVICE_POWER), + .udi_vendor = UDI_VENDOR_DESC_HS, +}; +#endif + + +/** + * \name UDC structures which contains all USB Device definitions + */ +//@{ + +//! Associate an UDI for each USB interface +UDC_DESC_STORAGE udi_api_t *udi_apis[USB_DEVICE_NB_INTERFACE] = { + &udi_api_vendor, +}; + +//! Add UDI with USB Descriptors FS +UDC_DESC_STORAGE udc_config_speed_t udc_config_lsfs[1] = {{ + .desc = (usb_conf_desc_t UDC_DESC_STORAGE*)&udc_desc_fs, + .udi_apis = udi_apis, +}}; + +#ifdef USB_DEVICE_HS_SUPPORT +//! Add UDI with USB Descriptors HS +UDC_DESC_STORAGE udc_config_speed_t udc_config_hs[1] = {{ + .desc = (usb_conf_desc_t UDC_DESC_STORAGE*)&udc_desc_hs, + .udi_apis = udi_apis, +}}; +#endif + +//! Add all information about USB Device in global structure for UDC +UDC_DESC_STORAGE udc_config_t udc_config = { + .confdev_lsfs = &udc_device_desc, + .conf_lsfs = udc_config_lsfs, +#ifdef USB_DEVICE_HS_SUPPORT + .confdev_hs = &udc_device_desc, + .qualifier = &udc_device_qual, + .conf_hs = udc_config_hs, +#endif +}; + +//@} +//@} diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h new file mode 100644 index 00000000..5a2df8bc --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/class/vendor/usb_protocol_vendor.h @@ -0,0 +1,69 @@ +/** + * \file + * + * \brief USB Vendor class protocol definitions. + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _USB_PROTOCOL_VENDOR_H_ +#define _USB_PROTOCOL_VENDOR_H_ + +/** + * \ingroup usb_protocol_group + * \defgroup usb_vendor_protocol USB Vendor Class definitions + * + * @{ + */ + +/** + * \name Vendor class values + */ +//@{ +#define VENDOR_CLASS 0xFF +#define VENDOR_SUBCLASS 0xFF +#define VENDOR_PROTOCOL 0xFF +//@} + + +//@} + +#endif // _USB_PROTOCOL_VENDOR_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/udc/udc.c b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/udc/udc.c new file mode 100644 index 00000000..66eb7305 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/udc/udc.c @@ -0,0 +1,1301 @@ +/** + * \file + * + * \brief USB Device Controller (UDC) + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "udd.h" +#include "udc_desc.h" +#include "udi.h" +#include "udc.h" + +#include "globals.h" +#include "tiny_dma.h" +#include "tiny_adc.h" +/** + * \ingroup udc_group + * \defgroup udc_group_interne Implementation of UDC + * + * Internal implementation + * @{ + */ + +//! \name Internal variables to manage the USB device +//! @{ + +//! Device status state (see enum usb_device_status in usb_protocol.h) +static le16_t udc_device_status; + +COMPILER_WORD_ALIGNED +//! Device interface setting value +static uint8_t udc_iface_setting = 0; + +//! Device Configuration number selected by the USB host +COMPILER_WORD_ALIGNED +static uint8_t udc_num_configuration = 0; + +//! Pointer on the selected speed device configuration +static udc_config_speed_t UDC_DESC_STORAGE *udc_ptr_conf; + +//! Pointer on interface descriptor used by SETUP request. +static usb_iface_desc_t UDC_DESC_STORAGE *udc_ptr_iface; + +//! @} + + +//! \name Internal structure to store the USB device main strings +//! @{ + +/** + * \brief Language ID of USB device (US ID by default) + */ +COMPILER_WORD_ALIGNED +static UDC_DESC_STORAGE usb_str_lgid_desc_t udc_string_desc_languageid = { + .desc.bLength = sizeof(usb_str_lgid_desc_t), + .desc.bDescriptorType = USB_DT_STRING, + .string = {LE16(USB_LANGID_EN_US)} +}; + +/** + * \brief USB device manufacture name storage + * String is allocated only if USB_DEVICE_MANUFACTURE_NAME is declared + * by usb application configuration + */ +#ifdef USB_DEVICE_MANUFACTURE_NAME +static uint8_t udc_string_manufacturer_name[] = USB_DEVICE_MANUFACTURE_NAME; +# define USB_DEVICE_MANUFACTURE_NAME_SIZE \ + (sizeof(udc_string_manufacturer_name)-1) +#else +# define USB_DEVICE_MANUFACTURE_NAME_SIZE 0 +#endif + +/** + * \brief USB device product name storage + * String is allocated only if USB_DEVICE_PRODUCT_NAME is declared + * by usb application configuration + */ +#ifdef USB_DEVICE_PRODUCT_NAME +static uint8_t udc_string_product_name[] = USB_DEVICE_PRODUCT_NAME; +# define USB_DEVICE_PRODUCT_NAME_SIZE (sizeof(udc_string_product_name)-1) +#else +# define USB_DEVICE_PRODUCT_NAME_SIZE 0 +#endif + +/** + * \brief Get USB device serial number + * + * Use the define USB_DEVICE_SERIAL_NAME to set static serial number. + * + * For dynamic serial number set the define USB_DEVICE_GET_SERIAL_NAME_POINTER + * to a suitable pointer. This will also require the serial number length + * define USB_DEVICE_GET_SERIAL_NAME_LENGTH. + */ +#if defined USB_DEVICE_GET_SERIAL_NAME_POINTER + static const uint8_t *udc_get_string_serial_name(void) + { + return (const uint8_t *)USB_DEVICE_GET_SERIAL_NAME_POINTER; + } +# define USB_DEVICE_SERIAL_NAME_SIZE \ + USB_DEVICE_GET_SERIAL_NAME_LENGTH +#elif defined USB_DEVICE_SERIAL_NAME + static const uint8_t *udc_get_string_serial_name(void) + { + return (const uint8_t *)USB_DEVICE_SERIAL_NAME; + } +# define USB_DEVICE_SERIAL_NAME_SIZE \ + (sizeof(USB_DEVICE_SERIAL_NAME)-1) +#else +# define USB_DEVICE_SERIAL_NAME_SIZE 0 +#endif + +/** + * \brief USB device string descriptor + * Structure used to transfer ASCII strings to USB String descriptor structure. + */ +struct udc_string_desc_t { + usb_str_desc_t header; + le16_t string[Max(Max(USB_DEVICE_MANUFACTURE_NAME_SIZE, \ + USB_DEVICE_PRODUCT_NAME_SIZE), USB_DEVICE_SERIAL_NAME_SIZE)]; +}; +COMPILER_WORD_ALIGNED +static UDC_DESC_STORAGE struct udc_string_desc_t udc_string_desc = { + .header.bDescriptorType = USB_DT_STRING +}; +//! @} + +usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void) +{ + return udc_ptr_iface; +} + +/** + * \brief Returns a value to check the end of USB Configuration descriptor + * + * \return address after the last byte of USB Configuration descriptor + */ +static usb_conf_desc_t UDC_DESC_STORAGE *udc_get_eof_conf(void) +{ + return (UDC_DESC_STORAGE usb_conf_desc_t *) ((uint8_t *) + udc_ptr_conf->desc + + le16_to_cpu(udc_ptr_conf->desc->wTotalLength)); +} + +#if (0!=USB_DEVICE_MAX_EP) +/** + * \brief Search specific descriptor in global interface descriptor + * + * \param desc Address of interface descriptor + * or previous specific descriptor found + * \param desc_id Descriptor ID to search + * + * \return address of specific descriptor found + * \return NULL if it is the end of global interface descriptor + */ +static usb_conf_desc_t UDC_DESC_STORAGE *udc_next_desc_in_iface(usb_conf_desc_t + UDC_DESC_STORAGE * desc, uint8_t desc_id) +{ + usb_conf_desc_t UDC_DESC_STORAGE *ptr_eof_desc; + + ptr_eof_desc = udc_get_eof_conf(); + // Go to next descriptor + desc = (UDC_DESC_STORAGE usb_conf_desc_t *) ((uint8_t *) desc + + desc->bLength); + // Check the end of configuration descriptor + while (ptr_eof_desc > desc) { + // If new interface descriptor is found, + // then it is the end of the current global interface descriptor + if (USB_DT_INTERFACE == desc->bDescriptorType) { + break; // End of global interface descriptor + } + if (desc_id == desc->bDescriptorType) { + return desc; // Specific descriptor found + } + // Go to next descriptor + desc = (UDC_DESC_STORAGE usb_conf_desc_t *) ((uint8_t *) desc + + desc->bLength); + } + return NULL; // No specific descriptor found +} +#endif + +/** + * \brief Search an interface descriptor + * This routine updates the internal pointer udc_ptr_iface. + * + * \param iface_num Interface number to find in Configuration Descriptor + * \param setting_num Setting number of interface to find + * + * \return 1 if found or 0 if not found + */ +static bool udc_update_iface_desc(uint8_t iface_num, uint8_t setting_num) +{ + usb_conf_desc_t UDC_DESC_STORAGE *ptr_end_desc; + + if (0 == udc_num_configuration) { + return false; + } + + if (iface_num >= udc_ptr_conf->desc->bNumInterfaces) { + return false; + } + + // Start at the beginning of configuration descriptor + udc_ptr_iface = (UDC_DESC_STORAGE usb_iface_desc_t *) + udc_ptr_conf->desc; + + // Check the end of configuration descriptor + ptr_end_desc = udc_get_eof_conf(); + while (ptr_end_desc > + (UDC_DESC_STORAGE usb_conf_desc_t *) udc_ptr_iface) { + if (USB_DT_INTERFACE == udc_ptr_iface->bDescriptorType) { + // A interface descriptor is found + // Check interface and alternate setting number + if ((iface_num == udc_ptr_iface->bInterfaceNumber) && + (setting_num == + udc_ptr_iface->bAlternateSetting)) { + return true; // Interface found + } + } + // Go to next descriptor + udc_ptr_iface = (UDC_DESC_STORAGE usb_iface_desc_t *) ( + (uint8_t *) udc_ptr_iface + + udc_ptr_iface->bLength); + } + return false; // Interface not found +} + +/** + * \brief Disables an usb device interface (UDI) + * This routine call the UDI corresponding to interface number + * + * \param iface_num Interface number to disable + * + * \return 1 if it is done or 0 if interface is not found + */ +static bool udc_iface_disable(uint8_t iface_num) +{ + udi_api_t UDC_DESC_STORAGE *udi_api; + + // Select first alternate setting of the interface + // to update udc_ptr_iface before call iface->getsetting() + if (!udc_update_iface_desc(iface_num, 0)) { + return false; + } + + // Select the interface with the current alternate setting + udi_api = udc_ptr_conf->udi_apis[iface_num]; + +#if (0!=USB_DEVICE_MAX_EP) + if (!udc_update_iface_desc(iface_num, udi_api->getsetting())) { + return false; + } + + // Start at the beginning of interface descriptor + { + usb_ep_desc_t UDC_DESC_STORAGE *ep_desc; + ep_desc = (UDC_DESC_STORAGE usb_ep_desc_t *) udc_ptr_iface; + while (1) { + // Search Endpoint descriptor included in global interface descriptor + ep_desc = (UDC_DESC_STORAGE usb_ep_desc_t *) + udc_next_desc_in_iface((UDC_DESC_STORAGE + usb_conf_desc_t *) + ep_desc, USB_DT_ENDPOINT); + if (NULL == ep_desc) { + break; + } + // Free the endpoint used by the interface + udd_ep_free(ep_desc->bEndpointAddress); + } + } +#endif + + // Disable interface + udi_api->disable(); + return true; +} + +/** + * \brief Enables an usb device interface (UDI) + * This routine calls the UDI corresponding + * to the interface and setting number. + * + * \param iface_num Interface number to enable + * \param setting_num Setting number to enable + * + * \return 1 if it is done or 0 if interface is not found + */ +static bool udc_iface_enable(uint8_t iface_num, uint8_t setting_num) +{ + // Select the interface descriptor + if (!udc_update_iface_desc(iface_num, setting_num)) { + return false; + } + +#if (0!=USB_DEVICE_MAX_EP) + usb_ep_desc_t UDC_DESC_STORAGE *ep_desc; + + // Start at the beginning of the global interface descriptor + ep_desc = (UDC_DESC_STORAGE usb_ep_desc_t *) udc_ptr_iface; + while (1) { + // Search Endpoint descriptor included in the global interface descriptor + ep_desc = (UDC_DESC_STORAGE usb_ep_desc_t *) + udc_next_desc_in_iface((UDC_DESC_STORAGE + usb_conf_desc_t *) ep_desc, + USB_DT_ENDPOINT); + if (NULL == ep_desc) + break; + // Alloc the endpoint used by the interface + if (!udd_ep_alloc(ep_desc->bEndpointAddress, + ep_desc->bmAttributes, + le16_to_cpu + (ep_desc->wMaxPacketSize))) { + return false; + } + } +#endif + // Enable the interface + return udc_ptr_conf->udi_apis[iface_num]->enable(); +} + +/*! \brief Start the USB Device stack + */ +void udc_start(void) +{ + udd_enable(); +} + +/*! \brief Stop the USB Device stack + */ +void udc_stop(void) +{ + udd_disable(); + udc_reset(); +} + +/** + * \brief Reset the current configuration of the USB device, + * This routines can be called by UDD when a RESET on the USB line occurs. + */ +void udc_reset(void) +{ + uint8_t iface_num; + + if (udc_num_configuration) { + for (iface_num = 0; + iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + udc_iface_disable(iface_num); + } + } + udc_num_configuration = 0; +#if (USB_CONFIG_ATTR_REMOTE_WAKEUP \ + == (USB_DEVICE_ATTR & USB_CONFIG_ATTR_REMOTE_WAKEUP)) + if (CPU_TO_LE16(USB_DEV_STATUS_REMOTEWAKEUP) & udc_device_status) { + // Remote wakeup is enabled then disable it + UDC_REMOTEWAKEUP_DISABLE(); + } +#endif + udc_device_status = +#if (USB_DEVICE_ATTR & USB_CONFIG_ATTR_SELF_POWERED) + CPU_TO_LE16(USB_DEV_STATUS_SELF_POWERED); +#else + CPU_TO_LE16(USB_DEV_STATUS_BUS_POWERED); +#endif +} + +void udc_sof_notify(void) +{ + uint8_t iface_num; + + if (udc_num_configuration) { + for (iface_num = 0; + iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + if (udc_ptr_conf->udi_apis[iface_num]->sof_notify != NULL) { + udc_ptr_conf->udi_apis[iface_num]->sof_notify(); + } + } + } +} + +/** + * \brief Standard device request to get device status + * + * \return true if success + */ +static bool udc_req_std_dev_get_status(void) +{ + if (udd_g_ctrlreq.req.wLength != sizeof(udc_device_status)) { + return false; + } + + udd_set_setup_payload( (uint8_t *) & udc_device_status, + sizeof(udc_device_status)); + return true; +} + +#if (0!=USB_DEVICE_MAX_EP) +/** + * \brief Standard endpoint request to get endpoint status + * + * \return true if success + */ +static bool udc_req_std_ep_get_status(void) +{ + static le16_t udc_ep_status; + + if (udd_g_ctrlreq.req.wLength != sizeof(udc_ep_status)) { + return false; + } + + udc_ep_status = udd_ep_is_halted(udd_g_ctrlreq.req. + wIndex & 0xFF) ? CPU_TO_LE16(USB_EP_STATUS_HALTED) : 0; + + udd_set_setup_payload( (uint8_t *) & udc_ep_status, + sizeof(udc_ep_status)); + return true; +} +#endif + +/** + * \brief Standard device request to change device status + * + * \return true if success + */ +static bool udc_req_std_dev_clear_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + + if (udd_g_ctrlreq.req.wValue == USB_DEV_FEATURE_REMOTE_WAKEUP) { + udc_device_status &= CPU_TO_LE16(~(uint32_t)USB_DEV_STATUS_REMOTEWAKEUP); +#if (USB_CONFIG_ATTR_REMOTE_WAKEUP \ + == (USB_DEVICE_ATTR & USB_CONFIG_ATTR_REMOTE_WAKEUP)) + UDC_REMOTEWAKEUP_DISABLE(); +#endif + return true; + } + return false; +} + +#if (0!=USB_DEVICE_MAX_EP) +/** + * \brief Standard endpoint request to clear endpoint feature + * + * \return true if success + */ +static bool udc_req_std_ep_clear_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + + if (udd_g_ctrlreq.req.wValue == USB_EP_FEATURE_HALT) { + return udd_ep_clear_halt(udd_g_ctrlreq.req.wIndex & 0xFF); + } + return false; +} +#endif + +/** + * \brief Standard device request to set a feature + * + * \return true if success + */ +static bool udc_req_std_dev_set_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + + switch (udd_g_ctrlreq.req.wValue) { + + case USB_DEV_FEATURE_REMOTE_WAKEUP: +#if (USB_CONFIG_ATTR_REMOTE_WAKEUP \ + == (USB_DEVICE_ATTR & USB_CONFIG_ATTR_REMOTE_WAKEUP)) + udc_device_status |= CPU_TO_LE16(USB_DEV_STATUS_REMOTEWAKEUP); + UDC_REMOTEWAKEUP_ENABLE(); + return true; +#else + return false; +#endif + +#ifdef USB_DEVICE_HS_SUPPORT + case USB_DEV_FEATURE_TEST_MODE: + if (!udd_is_high_speed()) { + break; + } + if (udd_g_ctrlreq.req.wIndex & 0xff) { + break; + } + // Unconfigure the device, terminating all ongoing requests + udc_reset(); + switch ((udd_g_ctrlreq.req.wIndex >> 8) & 0xFF) { + case USB_DEV_TEST_MODE_J: + udd_g_ctrlreq.callback = udd_test_mode_j; + return true; + + case USB_DEV_TEST_MODE_K: + udd_g_ctrlreq.callback = udd_test_mode_k; + return true; + + case USB_DEV_TEST_MODE_SE0_NAK: + udd_g_ctrlreq.callback = udd_test_mode_se0_nak; + return true; + + case USB_DEV_TEST_MODE_PACKET: + udd_g_ctrlreq.callback = udd_test_mode_packet; + return true; + + case USB_DEV_TEST_MODE_FORCE_ENABLE: // Only for downstream facing hub ports + default: + break; + } + break; +#endif + default: + break; + } + return false; +} + +/** + * \brief Standard endpoint request to halt an endpoint + * + * \return true if success + */ +#if (0!=USB_DEVICE_MAX_EP) +static bool udc_req_std_ep_set_feature(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + if (udd_g_ctrlreq.req.wValue == USB_EP_FEATURE_HALT) { + udd_ep_abort(udd_g_ctrlreq.req.wIndex & 0xFF); + return udd_ep_set_halt(udd_g_ctrlreq.req.wIndex & 0xFF); + } + return false; +} +#endif + +/** + * \brief Change the address of device + * Callback called at the end of request set address + */ +static void udc_valid_address(void) +{ + udd_set_address(udd_g_ctrlreq.req.wValue & 0x7F); +} + +/** + * \brief Standard device request to set device address + * + * \return true if success + */ +static bool udc_req_std_dev_set_address(void) +{ + if (udd_g_ctrlreq.req.wLength) { + return false; + } + + // The address must be changed at the end of setup request after the handshake + // then we use a callback to change address + udd_g_ctrlreq.callback = udc_valid_address; + return true; +} + +/** + * \brief Standard device request to get device string descriptor + * + * \return true if success + */ +static bool udc_req_std_dev_get_str_desc(void) +{ + uint8_t i; + const uint8_t *str; + uint8_t str_length = 0; + + // Link payload pointer to the string corresponding at request + switch (udd_g_ctrlreq.req.wValue & 0xff) { + case 0: + udd_set_setup_payload((uint8_t *) &udc_string_desc_languageid, + sizeof(udc_string_desc_languageid)); + break; + +#ifdef USB_DEVICE_MANUFACTURE_NAME + case 1: + str_length = USB_DEVICE_MANUFACTURE_NAME_SIZE; + str = udc_string_manufacturer_name; + break; +#endif +#ifdef USB_DEVICE_PRODUCT_NAME + case 2: + str_length = USB_DEVICE_PRODUCT_NAME_SIZE; + str = udc_string_product_name; + break; +#endif +#if defined USB_DEVICE_SERIAL_NAME || defined USB_DEVICE_GET_SERIAL_NAME_POINTER + case 3: + str_length = USB_DEVICE_SERIAL_NAME_SIZE; + str = udc_get_string_serial_name(); + break; +#endif + default: +#ifdef UDC_GET_EXTRA_STRING + if (UDC_GET_EXTRA_STRING()) { + break; + } +#endif + return false; + } + + if (str_length) { + for(i = 0; i < str_length; i++) { + udc_string_desc.string[i] = cpu_to_le16((le16_t)str[i]); + } + + udc_string_desc.header.bLength = 2 + (str_length) * 2; + udd_set_setup_payload( + (uint8_t *) &udc_string_desc, + udc_string_desc.header.bLength); + } + + return true; +} + +/** + * \brief Standard device request to get descriptors about USB device + * + * \return true if success + */ +static bool udc_req_std_dev_get_descriptor(void) +{ + uint8_t conf_num; + + conf_num = udd_g_ctrlreq.req.wValue & 0xff; + + // Check descriptor ID + switch ((uint8_t) (udd_g_ctrlreq.req.wValue >> 8)) { + case USB_DT_DEVICE: + // Device descriptor requested +#ifdef USB_DEVICE_HS_SUPPORT + if (!udd_is_high_speed()) { + udd_set_setup_payload( + (uint8_t *) udc_config.confdev_hs, + udc_config.confdev_hs->bLength); + } else +#endif + { + udd_set_setup_payload( + (uint8_t *) udc_config.confdev_lsfs, + udc_config.confdev_lsfs->bLength); + } + break; + + case USB_DT_CONFIGURATION: + // Configuration descriptor requested +#ifdef USB_DEVICE_HS_SUPPORT + if (udd_is_high_speed()) { + // HS descriptor + if (conf_num >= udc_config.confdev_hs-> + bNumConfigurations) { + return false; + } + udd_set_setup_payload( + (uint8_t *)udc_config.conf_hs[conf_num].desc, + le16_to_cpu(udc_config.conf_hs[conf_num].desc->wTotalLength)); + } else +#endif + { + // FS descriptor + if (conf_num >= udc_config.confdev_lsfs-> + bNumConfigurations) { + return false; + } + udd_set_setup_payload( + (uint8_t *)udc_config.conf_lsfs[conf_num].desc, + le16_to_cpu(udc_config.conf_lsfs[conf_num].desc->wTotalLength)); + } + ((usb_conf_desc_t *) udd_g_ctrlreq.payload)->bDescriptorType = + USB_DT_CONFIGURATION; + break; + +#ifdef USB_DEVICE_HS_SUPPORT + case USB_DT_DEVICE_QUALIFIER: + // Device qualifier descriptor requested + udd_set_setup_payload( (uint8_t *) udc_config.qualifier, + udc_config.qualifier->bLength); + break; + + case USB_DT_OTHER_SPEED_CONFIGURATION: + // Other configuration descriptor requested + if (!udd_is_high_speed()) { + // HS descriptor + if (conf_num >= udc_config.confdev_hs-> + bNumConfigurations) { + return false; + } + udd_set_setup_payload( + (uint8_t *)udc_config.conf_hs[conf_num].desc, + le16_to_cpu(udc_config.conf_hs[conf_num].desc->wTotalLength)); + } else { + // FS descriptor + if (conf_num >= udc_config.confdev_lsfs-> + bNumConfigurations) { + return false; + } + udd_set_setup_payload( + (uint8_t *)udc_config.conf_lsfs[conf_num].desc, + le16_to_cpu(udc_config.conf_lsfs[conf_num].desc->wTotalLength)); + } + ((usb_conf_desc_t *) udd_g_ctrlreq.payload)->bDescriptorType = + USB_DT_OTHER_SPEED_CONFIGURATION; + break; +#endif + + case USB_DT_BOS: + // Device BOS descriptor requested + if (udc_config.conf_bos == NULL) { + return false; + } + udd_set_setup_payload( (uint8_t *) udc_config.conf_bos, + udc_config.conf_bos->wTotalLength); + break; + + case USB_DT_STRING: + // String descriptor requested + if (!udc_req_std_dev_get_str_desc()) { + return false; + } + break; + + default: + // Unknown descriptor requested + return false; + } + // if the descriptor is larger than length requested, then reduce it + if (udd_g_ctrlreq.req.wLength < udd_g_ctrlreq.payload_size) { + udd_g_ctrlreq.payload_size = udd_g_ctrlreq.req.wLength; + } + return true; +} + +/** + * \brief Standard device request to get configuration number + * + * \return true if success + */ +static bool udc_req_std_dev_get_configuration(void) +{ + if (udd_g_ctrlreq.req.wLength != 1) { + return false; + } + + udd_set_setup_payload(&udc_num_configuration,1); + return true; +} + +/** + * \brief Standard device request to enable a configuration + * + * \return true if success + */ +static bool udc_req_std_dev_set_configuration(void) +{ + uint8_t iface_num; + + // Check request length + if (udd_g_ctrlreq.req.wLength) { + return false; + } + // Authorize configuration only if the address is valid + if (!udd_getaddress()) { + return false; + } + // Check the configuration number requested +#ifdef USB_DEVICE_HS_SUPPORT + if (udd_is_high_speed()) { + // HS descriptor + if ((udd_g_ctrlreq.req.wValue & 0xFF) > + udc_config.confdev_hs->bNumConfigurations) { + return false; + } + } else +#endif + { + // FS descriptor + if ((udd_g_ctrlreq.req.wValue & 0xFF) > + udc_config.confdev_lsfs->bNumConfigurations) { + return false; + } + } + + // Reset current configuration + udc_reset(); + + // Enable new configuration + udc_num_configuration = udd_g_ctrlreq.req.wValue & 0xFF; + if (udc_num_configuration == 0) { + return true; // Default empty configuration requested + } + // Update pointer of the configuration descriptor +#ifdef USB_DEVICE_HS_SUPPORT + if (udd_is_high_speed()) { + // HS descriptor + udc_ptr_conf = &udc_config.conf_hs[udc_num_configuration - 1]; + } else +#endif + { + // FS descriptor + udc_ptr_conf = &udc_config.conf_lsfs[udc_num_configuration - 1]; + } + // Enable all interfaces of the selected configuration + for (iface_num = 0; iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + if (!udc_iface_enable(iface_num, 0)) { + return false; + } + } + return true; +} + +/** + * \brief Standard interface request + * to get the alternate setting number of an interface + * + * \return true if success + */ +static bool udc_req_std_iface_get_setting(void) +{ + uint8_t iface_num; + udi_api_t UDC_DESC_STORAGE *udi_api; + + if (udd_g_ctrlreq.req.wLength != 1) { + return false; // Error in request + } + if (!udc_num_configuration) { + return false; // The device is not is configured state yet + } + + // Check the interface number included in the request + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + if (iface_num >= udc_ptr_conf->desc->bNumInterfaces) { + return false; + } + + // Select first alternate setting of the interface to update udc_ptr_iface + // before call iface->getsetting() + if (!udc_update_iface_desc(iface_num, 0)) { + return false; + } + // Get alternate setting from UDI + udi_api = udc_ptr_conf->udi_apis[iface_num]; + udc_iface_setting = udi_api->getsetting(); + + // Link value to payload pointer of request + udd_set_setup_payload(&udc_iface_setting,1); + return true; +} + +/** + * \brief Standard interface request + * to set an alternate setting of an interface + * + * \return true if success + */ +static bool udc_req_std_iface_set_setting(void) +{ + uint8_t iface_num, setting_num; + + if (udd_g_ctrlreq.req.wLength) { + return false; // Error in request + } + if (!udc_num_configuration) { + return false; // The device is not is configured state yet + } + + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + setting_num = udd_g_ctrlreq.req.wValue & 0xFF; + + // Disable current setting + if (!udc_iface_disable(iface_num)) { + return false; + } + + // Enable new setting + return udc_iface_enable(iface_num, setting_num); +} + +/** + * \brief Main routine to manage the standard USB SETUP request + * + * \return true if the request is supported + */ +static bool udc_reqstd(void) +{ + if (Udd_setup_is_in()) { + // GET Standard Requests + if (udd_g_ctrlreq.req.wLength == 0) { + return false; // Error for USB host + } + + if (USB_REQ_RECIP_DEVICE == Udd_setup_recipient()) { + // Standard Get Device request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_GET_STATUS: + return udc_req_std_dev_get_status(); + case USB_REQ_GET_DESCRIPTOR: + return udc_req_std_dev_get_descriptor(); + case USB_REQ_GET_CONFIGURATION: + return udc_req_std_dev_get_configuration(); + default: + break; + } + } + + if (USB_REQ_RECIP_INTERFACE == Udd_setup_recipient()) { + // Standard Get Interface request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_GET_INTERFACE: + return udc_req_std_iface_get_setting(); + default: + break; + } + } +#if (0!=USB_DEVICE_MAX_EP) + if (USB_REQ_RECIP_ENDPOINT == Udd_setup_recipient()) { + // Standard Get Endpoint request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_GET_STATUS: + return udc_req_std_ep_get_status(); + default: + break; + } + } +#endif + } else { + // SET Standard Requests + if (USB_REQ_RECIP_DEVICE == Udd_setup_recipient()) { + // Standard Set Device request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_SET_ADDRESS: + return udc_req_std_dev_set_address(); + case USB_REQ_CLEAR_FEATURE: + return udc_req_std_dev_clear_feature(); + case USB_REQ_SET_FEATURE: + return udc_req_std_dev_set_feature(); + case USB_REQ_SET_CONFIGURATION: + return udc_req_std_dev_set_configuration(); + case USB_REQ_SET_DESCRIPTOR: + /* Not supported (defined as optional by the USB 2.0 spec) */ + break; + default: + break; + } + } + + if (USB_REQ_RECIP_INTERFACE == Udd_setup_recipient()) { + // Standard Set Interface request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_SET_INTERFACE: + return udc_req_std_iface_set_setting(); + default: + break; + } + } +#if (0!=USB_DEVICE_MAX_EP) + if (USB_REQ_RECIP_ENDPOINT == Udd_setup_recipient()) { + // Standard Set Endpoint request + switch (udd_g_ctrlreq.req.bRequest) { + case USB_REQ_CLEAR_FEATURE: + return udc_req_std_ep_clear_feature(); + case USB_REQ_SET_FEATURE: + return udc_req_std_ep_set_feature(); + default: + break; + } + } +#endif + } + return false; +} + +/** + * \brief Send the SETUP interface request to UDI + * + * \return true if the request is supported + */ +static bool udc_req_iface(void) +{ + uint8_t iface_num; + udi_api_t UDC_DESC_STORAGE *udi_api; + + if (0 == udc_num_configuration) { + return false; // The device is not is configured state yet + } + // Check interface number + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + if (iface_num >= udc_ptr_conf->desc->bNumInterfaces) { + return false; + } + + //* To update udc_ptr_iface with the selected interface in request + // Select first alternate setting of interface to update udc_ptr_iface + // before calling udi_api->getsetting() + if (!udc_update_iface_desc(iface_num, 0)) { + return false; + } + // Select the interface with the current alternate setting + udi_api = udc_ptr_conf->udi_apis[iface_num]; + if (!udc_update_iface_desc(iface_num, udi_api->getsetting())) { + return false; + } + + // Send the SETUP request to the UDI corresponding to the interface number + return udi_api->setup(); +} + +/** + * \brief Send the SETUP interface request to UDI + * + * \return true if the request is supported + */ +static bool udc_req_ep(void) +{ + uint8_t iface_num; + udi_api_t UDC_DESC_STORAGE *udi_api; + + if (0 == udc_num_configuration) { + return false; // The device is not is configured state yet + } + // Send this request on all enabled interfaces + iface_num = udd_g_ctrlreq.req.wIndex & 0xFF; + for (iface_num = 0; iface_num < udc_ptr_conf->desc->bNumInterfaces; + iface_num++) { + // Select the interface with the current alternate setting + udi_api = udc_ptr_conf->udi_apis[iface_num]; + if (!udc_update_iface_desc(iface_num, udi_api->getsetting())) { + return false; + } + + // Send the SETUP request to the UDI + if (udi_api->setup()) { + return true; + } + } + return false; +} + +static bool udc_reqvend(void){ + switch (udd_g_ctrlreq.req.bRequest){ + case 0xa0: //Break! (Debug command) + asm("nop"); + return 1; + case 0xa1: //Receive waveform for signal gen + TC_DAC.CTRLA = 0x00; + TC_DAC.PERBUF = udd_g_ctrlreq.req.wValue; + TC_DAC.CTRLA = (unsigned char) udd_g_ctrlreq.req.wIndex & 0x0F; + udd_set_setup_payload(dacBuf_CH1, udd_g_ctrlreq.req.wLength); + if(dacBuf_len != udd_g_ctrlreq.req.wLength){ + dacBuf_len = udd_g_ctrlreq.req.wLength; + switch(global_mode){ + case 0: + tiny_dma_set_mode_0(); + break; + case 1: + tiny_dma_set_mode_1(); + break; + case 2: + tiny_dma_set_mode_2(); + break; + case 3: + tiny_dma_set_mode_3(); + break; + case 4: + tiny_dma_set_mode_4(); + break; + case 5: + tiny_dma_set_mode_5(); + break; + case 6: + tiny_dma_set_mode_6(); + break; + case 7: + tiny_dma_set_mode_7(); + break; + } + } + return 1; + case 0xa2: //CH2 waveform + TC_AUXDAC.CTRLA = 0x00; + auxDacBufLen = udd_g_ctrlreq.req.wLength; + TC_AUXDAC.PERBUF = udd_g_ctrlreq.req.wValue; + TC_AUXDAC.CTRLA = (unsigned char) udd_g_ctrlreq.req.wIndex & 0x0F; + udd_set_setup_payload(dacBuf_CH2, udd_g_ctrlreq.req.wLength); + if(dacBuf_len != udd_g_ctrlreq.req.wLength){ + dacBuf_len = udd_g_ctrlreq.req.wLength; + switch(global_mode){ + case 0: + tiny_dma_set_mode_0(); + break; + case 1: + tiny_dma_set_mode_1(); + break; + case 2: + tiny_dma_set_mode_2(); + break; + case 3: + tiny_dma_set_mode_3(); + break; + case 4: + tiny_dma_set_mode_4(); + break; + case 5: + tiny_dma_set_mode_5(); + break; + case 6: + tiny_dma_set_mode_6(); + break; + case 7: + tiny_dma_set_mode_7(); + break; + } + } + return 1; + case 0xa3: //PSU voltage control + TC_PSU.CCA = 0; + PSU_target = udd_g_ctrlreq.req.wValue; + return 1; + case 0xa4: //Triple mode + PORTB.OUT = udd_g_ctrlreq.req.wValue; + return 1; + case 0xa5: //Control Gain and Scope modes + switch(udd_g_ctrlreq.req.wValue){ + case 0: //Mode 0 + tiny_adc_setup(0, 0); + tiny_adc_ch0setup(udd_g_ctrlreq.req.wIndex); + tiny_dma_set_mode_0(); + break; + case 1: //Mode 1 + tiny_adc_setup(0, 0); + tiny_adc_ch0setup(udd_g_ctrlreq.req.wIndex); + tiny_dma_set_mode_1(); + break; + case 2: //Mode 2 + tiny_adc_setup(1, 1); + tiny_adc_ch0setup(udd_g_ctrlreq.req.wIndex); + tiny_adc_ch1setup(udd_g_ctrlreq.req.wIndex>>8); + tiny_dma_set_mode_2(); + break; + case 3: //Mode 3 + tiny_dma_set_mode_3(); + break; + case 4: //Mode 4 + tiny_dma_set_mode_4(); + break; + case 5: //Mode 5 + tiny_adc_setup(0, 0); + tiny_adc_ch0setup(udd_g_ctrlreq.req.wIndex); + tiny_dma_set_mode_5(); + break; + case 6: //Mode 6 + tiny_adc_setup(0, 1); + tiny_adc_ch0setup(udd_g_ctrlreq.req.wIndex); + tiny_dma_set_mode_6(); + break; + case 7: //Mode 7 + tiny_adc_setup(0, 2); + tiny_adc_ch0setup(udd_g_ctrlreq.req.wIndex | 0x80); + tiny_dma_set_mode_7(); + break; + default: + return 0; + } + return 1; + case 0xa6: //Digital out??? + PORTE.OUT = udd_g_ctrlreq.req.wValue; + return 1; + case 0xa7: //Soft Reset + + //Code here from SprinterSB + //http://www.avrfreaks.net/comment/872674 + //I don't understand it, but it seems to do the job + __asm volatile ("cli" "\n\t" + "out __CCP__, %[ccp]" "\n\t" + "st %a[rst], %[swrst]" + : + : [ccp] "r" ((uint8_t) CCP_IOREG_gc), + [swrst] "r" ((uint8_t) RST_SWRST_bm), + [rst] "e" (&RST.CTRL) + : "memory"); + __builtin_unreachable(); + default: + return 0; + } +} +/** + * \brief Main routine to manage the USB SETUP request. + * + * This function parses a USB SETUP request and submits an appropriate + * response back to the host or, in the case of SETUP OUT requests + * with data, sets up a buffer for receiving the data payload. + * + * The main standard requests defined by the USB 2.0 standard are handled + * internally. The interface requests are sent to UDI, and the specific request + * sent to a specific application callback. + * + * \return true if the request is supported, else the request is stalled by UDD + */ +bool udc_process_setup(void) +{ + // By default no data (receive/send) and no callbacks registered + udd_g_ctrlreq.payload_size = 0; + udd_g_ctrlreq.callback = NULL; + udd_g_ctrlreq.over_under_run = NULL; + + if (Udd_setup_is_in()) { + if (udd_g_ctrlreq.req.wLength == 0) { + return false; // Error from USB host + } + } + + if (Udd_setup_type() == USB_REQ_TYPE_VENDOR){ + if (udc_reqvend()) { + return true; + } + } + + // If standard request then try to decode it in UDC + if (Udd_setup_type() == USB_REQ_TYPE_STANDARD) { + if (udc_reqstd()) { + return true; + } + } + + // If interface request then try to decode it in UDI + if (Udd_setup_recipient() == USB_REQ_RECIP_INTERFACE) { + if (udc_req_iface()) { + return true; + } + } + + // If endpoint request then try to decode it in UDI + if (Udd_setup_recipient() == USB_REQ_RECIP_ENDPOINT) { + if (udc_req_ep()) { + return true; + } + } + + // Here SETUP request unknown by UDC and UDIs +#ifdef USB_DEVICE_SPECIFIC_REQUEST + // Try to decode it in specific callback + return USB_DEVICE_SPECIFIC_REQUEST(); // Ex: Vendor request,... +#else + return false; +#endif +} + +//! @} diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/udc/udc.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/udc/udc.h new file mode 100644 index 00000000..edfe7078 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/udc/udc.h @@ -0,0 +1,697 @@ +/** + * \file + * + * \brief Interface of the USB Device Controller (UDC) + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDC_H_ +#define _UDC_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "udc_desc.h" +#include "udd.h" + +#if USB_DEVICE_VENDOR_ID == 0 +# error USB_DEVICE_VENDOR_ID cannot be equal to 0 +#endif + +#if USB_DEVICE_PRODUCT_ID == 0 +# error USB_DEVICE_PRODUCT_ID cannot be equal to 0 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup usb_device_group + * \defgroup udc_group USB Device Controller (UDC) + * + * The UDC provides a high-level abstraction of the usb device. + * You can use these functions to control the main device state + * (start/attach/wakeup). + * + * \section USB_DEVICE_CONF USB Device Custom configuration + * The following USB Device configuration must be included in the conf_usb.h + * file of the application. + * + * USB_DEVICE_VENDOR_ID (Word)
+ * Vendor ID provided by USB org (ATMEL 0x03EB). + * + * USB_DEVICE_PRODUCT_ID (Word)
+ * Product ID (Referenced in usb_atmel.h). + * + * USB_DEVICE_MAJOR_VERSION (Byte)
+ * Major version of the device + * + * USB_DEVICE_MINOR_VERSION (Byte)
+ * Minor version of the device + * + * USB_DEVICE_MANUFACTURE_NAME (string)
+ * ASCII name for the manufacture + * + * USB_DEVICE_PRODUCT_NAME (string)
+ * ASCII name for the product + * + * USB_DEVICE_SERIAL_NAME (string)
+ * ASCII name to enable and set a serial number + * + * USB_DEVICE_POWER (Numeric)
+ * (unit mA) Maximum device power + * + * USB_DEVICE_ATTR (Byte)
+ * USB attributes available: + * - USB_CONFIG_ATTR_SELF_POWERED + * - USB_CONFIG_ATTR_REMOTE_WAKEUP + * Note: if remote wake enabled then defines remotewakeup callbacks, + * see Table 5-2. External API from UDC - Callback + * + * USB_DEVICE_LOW_SPEED (Only defined)
+ * Force the USB Device to run in low speed + * + * USB_DEVICE_HS_SUPPORT (Only defined)
+ * Authorize the USB Device to run in high speed + * + * USB_DEVICE_MAX_EP (Byte)
+ * Define the maximum endpoint number used by the USB Device.
+ * This one is already defined in UDI default configuration. + * Ex: + * - When endpoint control 0x00, endpoint 0x01 and + * endpoint 0x82 is used then USB_DEVICE_MAX_EP=2 + * - When only endpoint control 0x00 is used then USB_DEVICE_MAX_EP=0 + * - When endpoint 0x01 and endpoint 0x81 is used then USB_DEVICE_MAX_EP=1
+ * (configuration not possible on USBB interface) + * @{ + */ + +/** + * \brief Authorizes the VBUS event + * + * \return true, if the VBUS monitoring is possible. + * + * \section udc_vbus_monitoring VBus monitoring used cases + * + * The VBus monitoring is used only for USB SELF Power application. + * + * - By default the USB device is automatically attached when Vbus is high + * or when USB is start for devices without internal Vbus monitoring. + * conf_usb.h file does not contains define USB_DEVICE_ATTACH_AUTO_DISABLE. + * \code //#define USB_DEVICE_ATTACH_AUTO_DISABLE \endcode + * + * - Add custom VBUS monitoring. conf_usb.h file contains define + * USB_DEVICE_ATTACH_AUTO_DISABLE: + * \code #define USB_DEVICE_ATTACH_AUTO_DISABLE \endcode + * User C file contains: + * \code + // Authorize VBUS monitoring + if (!udc_include_vbus_monitoring()) { + // Implement custom VBUS monitoring via GPIO or other + } + Event_VBUS_present() // VBUS interrupt or GPIO interrupt or other + { + // Attach USB Device + udc_attach(); + } +\endcode + * + * - Case of battery charging. conf_usb.h file contains define + * USB_DEVICE_ATTACH_AUTO_DISABLE: + * \code #define USB_DEVICE_ATTACH_AUTO_DISABLE \endcode + * User C file contains: + * \code + Event VBUS present() // VBUS interrupt or GPIO interrupt or .. + { + // Authorize battery charging, but wait key press to start USB. + } + Event Key press() + { + // Stop batteries charging + // Start USB + udc_attach(); + } +\endcode + */ +static inline bool udc_include_vbus_monitoring(void) +{ + return udd_include_vbus_monitoring(); +} + +/*! \brief Start the USB Device stack + */ +void udc_start(void); + +/*! \brief Stop the USB Device stack + */ +void udc_stop(void); + +/** + * \brief Attach device to the bus when possible + * + * \warning If a VBus control is included in driver, + * then it will attach device when an acceptable Vbus + * level from the host is detected. + */ +static inline void udc_attach(void) +{ + udd_attach(); +} + + +/** + * \brief Detaches the device from the bus + * + * The driver must remove pull-up on USB line D- or D+. + */ +static inline void udc_detach(void) +{ + udd_detach(); +} + + +/*! \brief The USB driver sends a resume signal called \e "Upstream Resume" + * This is authorized only when the remote wakeup feature is enabled by host. + */ +static inline void udc_remotewakeup(void) +{ + udd_send_remotewakeup(); +} + + +/** + * \brief Returns a pointer on the current interface descriptor + * + * \return pointer on the current interface descriptor. + */ +usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void); + +//@} + +/** + * \ingroup usb_group + * \defgroup usb_device_group USB Stack Device + * + * This module includes USB Stack Device implementation. + * The stack is divided in three parts: + * - USB Device Controller (UDC) provides USB chapter 9 compliance + * - USB Device Interface (UDI) provides USB Class compliance + * - USB Device Driver (UDD) provides USB Driver for each Atmel MCU + + * Many USB Device applications can be implemented on Atmel MCU. + * Atmel provides many application notes for different applications: + * - AVR4900, provides general information about Device Stack + * - AVR4901, explains how to create a new class + * - AVR4902, explains how to create a composite device + * - AVR49xx, all device classes provided in ASF have an application note + * + * A basic USB knowledge is required to understand the USB Device + * Class application notes (HID,MS,CDC,PHDC,...). + * Then, to create an USB device with + * only one class provided by ASF, refer directly to the application note + * corresponding to this USB class. The USB Device application note for + * New Class and Composite is dedicated to advanced USB users. + * + * @{ + */ + +//! @} + +#ifdef __cplusplus +} +#endif + +/** + * \ingroup udc_group + * \defgroup udc_basic_use_case_setup_prereq USB Device Controller (UDC) - Prerequisites + * Common prerequisites for all USB devices. + * + * This module is based on USB device stack full interrupt driven, and supporting + * \ref sleepmgr_group sleepmgr. For AVR and SAM3/4 devices the \ref clk_group clock services + * is supported. For SAMD devices the \ref asfdoc_sam0_system_clock_group clock driver is supported. + * + * The following procedure must be executed to setup the project correctly: + * - Specify the clock configuration: + * - XMEGA USB devices need 48MHz clock input.\n + * XMEGA USB devices need CPU frequency higher than 12MHz.\n + * You can use either an internal RC48MHz auto calibrated by Start of Frames + * or an external OSC. + * - UC3 and SAM3/4 devices without USB high speed support need 48MHz clock input.\n + * You must use a PLL and an external OSC. + * - UC3 and SAM3/4 devices with USB high speed support need 12MHz clock input.\n + * You must use an external OSC. + * - UC3 devices with USBC hardware need CPU frequency higher than 25MHz. + * - SAMD devices without USB high speed support need 48MHz clock input.\n + * You should use DFLL with USBCRM. + * - In conf_board.h, the define CONF_BOARD_USB_PORT must be added to enable USB lines. + * (Not mandatory for all boards) + * - Enable interrupts + * - Initialize the clock service + * + * The usage of \ref sleepmgr_group sleepmgr service is optional, but recommended to reduce power + * consumption: + * - Initialize the sleep manager service + * - Activate sleep mode when the application is in IDLE state + * + * \subpage udc_conf_clock. + * + * for AVR and SAM3/4 devices, add to the initialization code: + * \code + sysclk_init(); + irq_initialize_vectors(); + cpu_irq_enable(); + board_init(); + sleepmgr_init(); // Optional +\endcode + * + * For SAMD devices, add to the initialization code: + * \code + system_init(); + irq_initialize_vectors(); + cpu_irq_enable(); + sleepmgr_init(); // Optional +\endcode + * Add to the main IDLE loop: + * \code + sleepmgr_enter_sleep(); // Optional +\endcode + * + */ + +/** + * \ingroup udc_group + * \defgroup udc_basic_use_case_setup_code USB Device Controller (UDC) - Example code + * Common example code for all USB devices. + * + * Content of conf_usb.h: + * \code + #define USB_DEVICE_VENDOR_ID 0x03EB + #define USB_DEVICE_PRODUCT_ID 0xXXXX + #define USB_DEVICE_MAJOR_VERSION 1 + #define USB_DEVICE_MINOR_VERSION 0 + #define USB_DEVICE_POWER 100 + #define USB_DEVICE_ATTR USB_CONFIG_ATTR_BUS_POWERED +\endcode + * + * Add to application C-file: + * \code + void usb_init(void) + { + udc_start(); + } +\endcode + */ + +/** + * \ingroup udc_group + * \defgroup udc_basic_use_case_setup_flow USB Device Controller (UDC) - Workflow + * Common workflow for all USB devices. + * + * -# Ensure that conf_usb.h is available and contains the following configuration + * which is the main USB device configuration: + * - \code // Vendor ID provided by USB org (ATMEL 0x03EB) + #define USB_DEVICE_VENDOR_ID 0x03EB // Type Word + // Product ID (Atmel PID referenced in usb_atmel.h) + #define USB_DEVICE_PRODUCT_ID 0xXXXX // Type Word + // Major version of the device + #define USB_DEVICE_MAJOR_VERSION 1 // Type Byte + // Minor version of the device + #define USB_DEVICE_MINOR_VERSION 0 // Type Byte + // Maximum device power (mA) + #define USB_DEVICE_POWER 100 // Type 9-bits + // USB attributes to enable features + #define USB_DEVICE_ATTR USB_CONFIG_ATTR_BUS_POWERED // Flags \endcode + * -# Call the USB device stack start function to enable stack and start USB: + * - \code udc_start(); \endcode + * \note In case of USB dual roles (Device and Host) managed through USB OTG connector + * (USB ID pin), the call of udc_start() must be removed and replaced by uhc_start(). + * SeRefer to "AVR4950 section 6.1 Dual roles" for further information about dual roles. + */ + +/** + * \page udc_conf_clock conf_clock.h examples with USB support + * + * Content of XMEGA conf_clock.h: + * \code + // Configuration based on internal RC: + // USB clock need of 48Mhz + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_RCOSC + #define CONFIG_OSC_RC32_CAL 48000000UL + #define CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC OSC_ID_USBSOF + // CPU clock need of clock > 12MHz to run with USB (Here 24MHz) + #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RC32MHZ + #define CONFIG_SYSCLK_PSADIV SYSCLK_PSADIV_2 + #define CONFIG_SYSCLK_PSBCDIV SYSCLK_PSBCDIV_1_1 +\endcode + * + * Content of conf_clock.h for AT32UC3A0, AT32UC3A1, AT32UC3B devices (USBB): + * \code + // Configuration based on 12MHz external OSC: + #define CONFIG_PLL1_SOURCE PLL_SRC_OSC0 + #define CONFIG_PLL1_MUL 8 + #define CONFIG_PLL1_DIV 2 + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1 + #define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) +\endcode + * + * Content of conf_clock.h for AT32UC3A3, AT32UC3A4 devices (USBB with high speed support): + * \code + // Configuration based on 12MHz external OSC: + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_OSC0 + #define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) +\endcode + * + * Content of conf_clock.h for AT32UC3C, ATUCXXD, ATUCXXL3U, ATUCXXL4U devices (USBC): + * \code + // Configuration based on 12MHz external OSC: + #define CONFIG_PLL1_SOURCE PLL_SRC_OSC0 + #define CONFIG_PLL1_MUL 8 + #define CONFIG_PLL1_DIV 2 + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1 + #define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div) + // CPU clock need of clock > 25MHz to run with USBC + #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL1 +\endcode + * + * Content of conf_clock.h for SAM3S, SAM3SD, SAM4S devices (UPD: USB Peripheral Device): + * \code + // PLL1 (B) Options (Fpll = (Fclk * PLL_mul) / PLL_div) + #define CONFIG_PLL1_SOURCE PLL_SRC_MAINCK_XTAL + #define CONFIG_PLL1_MUL 16 + #define CONFIG_PLL1_DIV 2 + // USB Clock Source Options (Fusb = FpllX / USB_div) + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1 + #define CONFIG_USBCLK_DIV 2 +\endcode + * + * Content of conf_clock.h for SAM3U device (UPDHS: USB Peripheral Device High Speed): + * \code + // USB Clock Source fixed at UPLL. +\endcode + * + * Content of conf_clock.h for SAM3X, SAM3A devices (UOTGHS: USB OTG High Speed): + * \code + // USB Clock Source fixed at UPLL. + #define CONFIG_USBCLK_SOURCE USBCLK_SRC_UPLL + #define CONFIG_USBCLK_DIV 1 +\endcode + * + * Content of conf_clocks.h for SAMD devices (USB): + * \code + // System clock bus configuration + # define CONF_CLOCK_FLASH_WAIT_STATES 2 + + // USB Clock Source fixed at DFLL. + // SYSTEM_CLOCK_SOURCE_DFLL configuration - Digital Frequency Locked Loop + # define CONF_CLOCK_DFLL_ENABLE true + # define CONF_CLOCK_DFLL_LOOP_MODE SYSTEM_CLOCK_DFLL_LOOP_MODE_USB_RECOVERY + # define CONF_CLOCK_DFLL_ON_DEMAND true + + // Set this to true to configure the GCLK when running clocks_init. + // If set to false, none of the GCLK generators will be configured in clocks_init(). + # define CONF_CLOCK_CONFIGURE_GCLK true + + // Configure GCLK generator 0 (Main Clock) + # define CONF_CLOCK_GCLK_0_ENABLE true + # define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY true + # define CONF_CLOCK_GCLK_0_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_DFLL + # define CONF_CLOCK_GCLK_0_PRESCALER 1 + # define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE false +\endcode + */ + +/** + * \page udc_use_case_1 Change USB speed + * + * In this use case, the USB device is used with different USB speeds. + * + * \section udc_use_case_1_setup Setup steps + * + * Prior to implement this use case, be sure to have already + * apply the UDI module "basic use case". + * + * \section udc_use_case_1_usage Usage steps + * + * \subsection udc_use_case_1_usage_code Example code + * Content of conf_usb.h: + * \code + #if // Low speed + #define USB_DEVICE_LOW_SPEED + // #define USB_DEVICE_HS_SUPPORT + + #elif // Full speed + // #define USB_DEVICE_LOW_SPEED + // #define USB_DEVICE_HS_SUPPORT + + #elif // High speed + // #define USB_DEVICE_LOW_SPEED + #define USB_DEVICE_HS_SUPPORT + + #endif +\endcode + * + * \subsection udc_use_case_1_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters + * required for a USB device low speed (1.5Mbit/s): + * - \code #define USB_DEVICE_LOW_SPEED + //#define USB_DEVICE_HS_SUPPORT \endcode + * -# Ensure that conf_usb.h contains the following parameters + * required for a USB device full speed (12Mbit/s): + * - \code //#define USB_DEVICE_LOW_SPEED + //#define USB_DEVICE_HS_SUPPORT \endcode + * -# Ensure that conf_usb.h contains the following parameters + * required for a USB device high speed (480Mbit/s): + * - \code //#define USB_DEVICE_LOW_SPEED + #define USB_DEVICE_HS_SUPPORT \endcode + */ + +/** + * \page udc_use_case_2 Use USB strings + * + * In this use case, the usual USB strings is added in the USB device. + * + * \section udc_use_case_2_setup Setup steps + * Prior to implement this use case, be sure to have already + * apply the UDI module "basic use case". + * + * \section udc_use_case_2_usage Usage steps + * + * \subsection udc_use_case_2_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_MANUFACTURE_NAME "Manufacture name" + #define USB_DEVICE_PRODUCT_NAME "Product name" + #define USB_DEVICE_SERIAL_NAME "12...EF" +\endcode + * + * \subsection udc_use_case_2_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters + * required to enable different USB strings: + * - \code // Static ASCII name for the manufacture + #define USB_DEVICE_MANUFACTURE_NAME "Manufacture name" \endcode + * - \code // Static ASCII name for the product + #define USB_DEVICE_PRODUCT_NAME "Product name" \endcode + * - \code // Static ASCII name to enable and set a serial number + #define USB_DEVICE_SERIAL_NAME "12...EF" \endcode + */ + +/** + * \page udc_use_case_3 Use USB remote wakeup feature + * + * In this use case, the USB remote wakeup feature is enabled. + * + * \section udc_use_case_3_setup Setup steps + * Prior to implement this use case, be sure to have already + * apply the UDI module "basic use case". + * + * \section udc_use_case_3_usage Usage steps + * + * \subsection udc_use_case_3_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_ATTR \ + (USB_CONFIG_ATTR_REMOTE_WAKEUP | USB_CONFIG_ATTR_..._POWERED) + #define UDC_REMOTEWAKEUP_ENABLE() my_callback_remotewakeup_enable() + extern void my_callback_remotewakeup_enable(void); + #define UDC_REMOTEWAKEUP_DISABLE() my_callback_remotewakeup_disable() + extern void my_callback_remotewakeup_disable(void); +\endcode + * + * Add to application C-file: + * \code + void my_callback_remotewakeup_enable(void) + { + // Enable application wakeup events (e.g. enable GPIO interrupt) + } + void my_callback_remotewakeup_disable(void) + { + // Disable application wakeup events (e.g. disable GPIO interrupt) + } + + void my_interrupt_event(void) + { + udc_remotewakeup(); + } +\endcode + * + * \subsection udc_use_case_3_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters + * required to enable remote wakeup feature: + * - \code // Authorizes the remote wakeup feature + #define USB_DEVICE_ATTR (USB_CONFIG_ATTR_REMOTE_WAKEUP | USB_CONFIG_ATTR_..._POWERED) \endcode + * - \code // Define callback called when the host enables the remotewakeup feature + #define UDC_REMOTEWAKEUP_ENABLE() my_callback_remotewakeup_enable() + extern void my_callback_remotewakeup_enable(void); \endcode + * - \code // Define callback called when the host disables the remotewakeup feature + #define UDC_REMOTEWAKEUP_DISABLE() my_callback_remotewakeup_disable() + extern void my_callback_remotewakeup_disable(void); \endcode + * -# Send a remote wakeup (USB upstream): + * - \code udc_remotewakeup(); \endcode + */ + +/** + * \page udc_use_case_5 Bus power application recommendations + * + * In this use case, the USB device BUS power feature is enabled. + * This feature requires a correct power consumption management. + * + * \section udc_use_case_5_setup Setup steps + * Prior to implement this use case, be sure to have already + * apply the UDI module "basic use case". + * + * \section udc_use_case_5_usage Usage steps + * + * \subsection udc_use_case_5_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_ATTR (USB_CONFIG_ATTR_BUS_POWERED) + #define UDC_SUSPEND_EVENT() user_callback_suspend_action() + extern void user_callback_suspend_action(void) + #define UDC_RESUME_EVENT() user_callback_resume_action() + extern void user_callback_resume_action(void) +\endcode + * + * Add to application C-file: + * \code + void user_callback_suspend_action(void) + { + // Disable hardware component to reduce power consumption + } + void user_callback_resume_action(void) + { + // Re-enable hardware component + } +\endcode + * + * \subsection udc_use_case_5_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters: + * - \code // Authorizes the BUS power feature + #define USB_DEVICE_ATTR (USB_CONFIG_ATTR_BUS_POWERED) \endcode + * - \code // Define callback called when the host suspend the USB line + #define UDC_SUSPEND_EVENT() user_callback_suspend_action() + extern void user_callback_suspend_action(void); \endcode + * - \code // Define callback called when the host or device resume the USB line + #define UDC_RESUME_EVENT() user_callback_resume_action() + extern void user_callback_resume_action(void); \endcode + * -# Reduce power consumption in suspend mode (max. 2.5mA on Vbus): + * - \code void user_callback_suspend_action(void) + { + turn_off_components(); + } \endcode + */ + +/** + * \page udc_use_case_6 USB dynamic serial number + * + * In this use case, the USB serial strings is dynamic. + * For a static serial string refer to \ref udc_use_case_2. + * + * \section udc_use_case_6_setup Setup steps + * Prior to implement this use case, be sure to have already + * apply the UDI module "basic use case". + * + * \section udc_use_case_6_usage Usage steps + * + * \subsection udc_use_case_6_usage_code Example code + * Content of conf_usb.h: + * \code + #define USB_DEVICE_SERIAL_NAME + #define USB_DEVICE_GET_SERIAL_NAME_POINTER serial_number + #define USB_DEVICE_GET_SERIAL_NAME_LENGTH 12 + extern uint8_t serial_number[]; +\endcode + * + * Add to application C-file: + * \code + uint8_t serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH]; + + void init_build_usb_serial_number(void) + { + serial_number[0] = 'A'; + serial_number[1] = 'B'; + ... + serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH-1] = 'C'; + } \endcode + * + * \subsection udc_use_case_6_usage_flow Workflow + * -# Ensure that conf_usb.h is available and contains the following parameters + * required to enable a USB serial number strings dynamically: + * - \code #define USB_DEVICE_SERIAL_NAME // Define this empty + #define USB_DEVICE_GET_SERIAL_NAME_POINTER serial_number // Give serial array pointer + #define USB_DEVICE_GET_SERIAL_NAME_LENGTH 12 // Give size of serial array + extern uint8_t serial_number[]; // Declare external serial array \endcode + * -# Before start USB stack, initialize the serial array + * - \code + uint8_t serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH]; + + void init_build_usb_serial_number(void) + { + serial_number[0] = 'A'; + serial_number[1] = 'B'; + ... + serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH-1] = 'C'; + } \endcode + */ + + + +#endif // _UDC_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/udc/udc_desc.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/udc/udc_desc.h new file mode 100644 index 00000000..88ed08a9 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/udc/udc_desc.h @@ -0,0 +1,135 @@ +/** + * \file + * + * \brief Common API for USB Device Interface + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDC_DESC_H_ +#define _UDC_DESC_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" +#include "udi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup udc_group + * \defgroup udc_desc_group USB Device Descriptor + * + * @{ + */ + +/** + * \brief Defines the memory's location of USB descriptors + * + * By default the Descriptor is stored in RAM + * (UDC_DESC_STORAGE is defined empty). + * + * If you have need to free RAM space, + * it is possible to put descriptor in flash in following case: + * - USB driver authorize flash transfer (USBB on UC3 and USB on Mega) + * - USB Device is not high speed (UDC no need to change USB descriptors) + * + * For UC3 application used "const". + * + * For Mega application used "code". + */ +#define UDC_DESC_STORAGE + // Descriptor storage in internal RAM +#if (defined UDC_DATA_USE_HRAM_SUPPORT) +# if defined(__GNUC__) +# define UDC_DATA(x) COMPILER_WORD_ALIGNED __attribute__((__section__(".data_hram0"))) +# define UDC_BSS(x) COMPILER_ALIGNED(x) __attribute__((__section__(".bss_hram0"))) +# elif defined(__ICCAVR32__) +# define UDC_DATA(x) COMPILER_ALIGNED(x) __data32 +# define UDC_BSS(x) COMPILER_ALIGNED(x) __data32 +# endif +#else +# define UDC_DATA(x) COMPILER_ALIGNED(x) +# define UDC_BSS(x) COMPILER_ALIGNED(x) +#endif + + + +/** + * \brief Configuration descriptor and UDI link for one USB speed + */ +typedef struct { + //! USB configuration descriptor + usb_conf_desc_t UDC_DESC_STORAGE *desc; + //! Array of UDI API pointer + udi_api_t UDC_DESC_STORAGE *UDC_DESC_STORAGE * udi_apis; +} udc_config_speed_t; + + +/** + * \brief All information about the USB Device + */ +typedef struct { + //! USB device descriptor for low or full speed + usb_dev_desc_t UDC_DESC_STORAGE *confdev_lsfs; + //! USB configuration descriptor and UDI API pointers for low or full speed + udc_config_speed_t UDC_DESC_STORAGE *conf_lsfs; +#ifdef USB_DEVICE_HS_SUPPORT + //! USB device descriptor for high speed + usb_dev_desc_t UDC_DESC_STORAGE *confdev_hs; + //! USB device qualifier, only use in high speed mode + usb_dev_qual_desc_t UDC_DESC_STORAGE *qualifier; + //! USB configuration descriptor and UDI API pointers for high speed + udc_config_speed_t UDC_DESC_STORAGE *conf_hs; +#endif + usb_dev_bos_desc_t UDC_DESC_STORAGE *conf_bos; +} udc_config_t; + +//! Global variables of USB Device Descriptor and UDI links +extern UDC_DESC_STORAGE udc_config_t udc_config; + +//@} + +#ifdef __cplusplus +} +#endif +#endif // _UDC_DESC_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/udc/udd.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/udc/udd.h new file mode 100644 index 00000000..10807f43 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/udc/udd.h @@ -0,0 +1,396 @@ +/** + * \file + * + * \brief Common API for USB Device Drivers (UDD) + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDD_H_ +#define _UDD_H_ + +#include "usb_protocol.h" +#include "udc_desc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup usb_device_group + * \defgroup udd_group USB Device Driver (UDD) + * + * The UDD driver provides a low-level abstraction of the device + * controller hardware. Most events coming from the hardware such as + * interrupts, which may cause the UDD to call into the UDC and UDI. + * + * @{ + */ + +//! \brief Endpoint identifier +typedef uint8_t udd_ep_id_t; + +//! \brief Endpoint transfer status +//! Returned in parameters of callback register via udd_ep_run routine. +typedef enum { + UDD_EP_TRANSFER_OK = 0, + UDD_EP_TRANSFER_ABORT = 1, +} udd_ep_status_t; + +/** + * \brief Global variable to give and record information of the setup request management + * + * This global variable allows to decode and response a setup request. + * It can be updated by udc_process_setup() from UDC or *setup() from UDIs. + */ +typedef struct { + //! Data received in USB SETUP packet + //! Note: The swap of "req.wValues" from uin16_t to le16_t is done by UDD. + usb_setup_req_t req; + + //! Point to buffer to send or fill with data following SETUP packet + //! This buffer must be word align for DATA IN phase (use prefix COMPILER_WORD_ALIGNED for buffer) + uint8_t *payload; + + //! Size of buffer to send or fill, and content the number of byte transfered + uint16_t payload_size; + + //! Callback called after reception of ZLP from setup request + void (*callback) (void); + + //! Callback called when the buffer given (.payload) is full or empty. + //! This one return false to abort data transfer, or true with a new buffer in .payload. + bool(*over_under_run) (void); +} udd_ctrl_request_t; +extern udd_ctrl_request_t udd_g_ctrlreq; + +//! Return true if the setup request \a udd_g_ctrlreq indicates IN data transfer +#define Udd_setup_is_in() \ + (USB_REQ_DIR_IN == (udd_g_ctrlreq.req.bmRequestType & USB_REQ_DIR_MASK)) + +//! Return true if the setup request \a udd_g_ctrlreq indicates OUT data transfer +#define Udd_setup_is_out() \ + (USB_REQ_DIR_OUT == (udd_g_ctrlreq.req.bmRequestType & USB_REQ_DIR_MASK)) + +//! Return the type of the SETUP request \a udd_g_ctrlreq. \see usb_reqtype. +#define Udd_setup_type() \ + (udd_g_ctrlreq.req.bmRequestType & USB_REQ_TYPE_MASK) + +//! Return the recipient of the SETUP request \a udd_g_ctrlreq. \see usb_recipient +#define Udd_setup_recipient() \ + (udd_g_ctrlreq.req.bmRequestType & USB_REQ_RECIP_MASK) + +/** + * \brief End of halt callback function type. + * Registered by routine udd_ep_wait_stall_clear() + * Callback called when endpoint stall is cleared. + */ +typedef void (*udd_callback_halt_cleared_t) (void); + +/** + * \brief End of transfer callback function type. + * Registered by routine udd_ep_run() + * Callback called by USB interrupt after data transfer or abort (reset,...). + * + * \param status UDD_EP_TRANSFER_OK, if transfer is complete + * \param status UDD_EP_TRANSFER_ABORT, if transfer is aborted + * \param n number of data transfered + */ +typedef void (*udd_callback_trans_t) (udd_ep_status_t status, + iram_size_t nb_transfered, udd_ep_id_t ep); + +/** + * \brief Authorizes the VBUS event + * + * \return true, if the VBUS monitoring is possible. + */ +bool udd_include_vbus_monitoring(void); + +/** + * \brief Enables the USB Device mode + */ +void udd_enable(void); + +/** + * \brief Disables the USB Device mode + */ +void udd_disable(void); + +/** + * \brief Attach device to the bus when possible + * + * \warning If a VBus control is included in driver, + * then it will attach device when an acceptable Vbus + * level from the host is detected. + */ +void udd_attach(void); + +/** + * \brief Detaches the device from the bus + * + * The driver must remove pull-up on USB line D- or D+. + */ +void udd_detach(void); + +/** + * \brief Test whether the USB Device Controller is running at high + * speed or not. + * + * \return \c true if the Device is running at high speed mode, otherwise \c false. + */ +bool udd_is_high_speed(void); + +/** + * \brief Changes the USB address of device + * + * \param address New USB address + */ +void udd_set_address(uint8_t address); + +/** + * \brief Returns the USB address of device + * + * \return USB address + */ +uint8_t udd_getaddress(void); + +/** + * \brief Returns the current start of frame number + * + * \return current start of frame number. + */ +uint16_t udd_get_frame_number(void); + +/** + * \brief Returns the current micro start of frame number + * + * \return current micro start of frame number required in high speed mode. + */ +uint16_t udd_get_micro_frame_number(void); + +/*! \brief The USB driver sends a resume signal called Upstream Resume + */ +void udd_send_remotewakeup(void); + +/** + * \brief Load setup payload + * + * \param payload Pointer on payload + * \param payload_size Size of payload + */ +void udd_set_setup_payload( uint8_t *payload, uint16_t payload_size ); + + +/** + * \name Endpoint Management + * + * The following functions allow drivers to create and remove + * endpoints, as well as set, clear and query their "halted" and + * "wedged" states. + */ +//@{ + +#if (USB_DEVICE_MAX_EP != 0) + +/** + * \brief Configures and enables an endpoint + * + * \param ep Endpoint number including direction (USB_EP_DIR_IN/USB_EP_DIR_OUT). + * \param bmAttributes Attributes of endpoint declared in the descriptor. + * \param MaxEndpointSize Endpoint maximum size + * + * \return \c 1 if the endpoint is enabled, otherwise \c 0. + */ +bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes, + uint16_t MaxEndpointSize); + +/** + * \brief Disables an endpoint + * + * \param ep Endpoint number including direction (USB_EP_DIR_IN/USB_EP_DIR_OUT). + */ +void udd_ep_free(udd_ep_id_t ep); + +/** + * \brief Check if the endpoint \a ep is halted. + * + * \param ep The ID of the endpoint to check. + * + * \return \c 1 if \a ep is halted, otherwise \c 0. + */ +bool udd_ep_is_halted(udd_ep_id_t ep); + +/** + * \brief Set the halted state of the endpoint \a ep + * + * After calling this function, any transaction on \a ep will result + * in a STALL handshake being sent. Any pending transactions will be + * performed first, however. + * + * \param ep The ID of the endpoint to be halted + * + * \return \c 1 if \a ep is halted, otherwise \c 0. + */ +bool udd_ep_set_halt(udd_ep_id_t ep); + +/** + * \brief Clear the halted state of the endpoint \a ep + * + * After calling this function, any transaction on \a ep will + * be handled normally, i.e. a STALL handshake will not be sent, and + * the data toggle sequence will start at DATA0. + * + * \param ep The ID of the endpoint to be un-halted + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udd_ep_clear_halt(udd_ep_id_t ep); + +/** + * \brief Registers a callback to call when endpoint halt is cleared + * + * \param ep The ID of the endpoint to use + * \param callback NULL or function to call when endpoint halt is cleared + * + * \warning if the endpoint is not halted then the \a callback is called immediately. + * + * \return \c 1 if the register is accepted, otherwise \c 0. + */ +bool udd_ep_wait_stall_clear(udd_ep_id_t ep, + udd_callback_halt_cleared_t callback); + +/** + * \brief Allows to receive or send data on an endpoint + * + * The driver uses a specific DMA USB to transfer data + * from internal RAM to endpoint, if this one is available. + * When the transfer is finished or aborted (stall, reset, ...), the \a callback is called. + * The \a callback returns the transfer status and eventually the number of byte transfered. + * Note: The control endpoint is not authorized. + * + * \param ep The ID of the endpoint to use + * \param b_shortpacket Enabled automatic short packet + * \param buf Buffer on Internal RAM to send or fill. + * It must be align, then use COMPILER_WORD_ALIGNED. + * \param buf_size Buffer size to send or fill + * \param callback NULL or function to call at the end of transfer + * + * \warning About \a b_shortpacket, for IN endpoint it means that a short packet + * (or a Zero Length Packet) will be sent to the USB line to properly close the usb + * transfer at the end of the data transfer. + * For Bulk and Interrupt OUT endpoint, it will automatically stop the transfer + * at the end of the data transfer (received short packet). + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ +bool udd_ep_run(udd_ep_id_t ep, bool b_shortpacket, + uint8_t * buf, iram_size_t buf_size, + udd_callback_trans_t callback); +/** + * \brief Aborts transfer on going on endpoint + * + * If a transfer is on going, then it is stopped and + * the callback registered is called to signal the end of transfer. + * Note: The control endpoint is not authorized. + * + * \param ep Endpoint to abort + */ +void udd_ep_abort(udd_ep_id_t ep); + +#endif + +//@} + + +/** + * \name High speed test mode management + * + * The following functions allow the device to jump to a specific test mode required in high speed mode. + */ +//@{ +void udd_test_mode_j(void); +void udd_test_mode_k(void); +void udd_test_mode_se0_nak(void); +void udd_test_mode_packet(void); +//@} + + +/** + * \name UDC callbacks to provide for UDD + * + * The following callbacks are used by UDD. + */ +//@{ + +/** + * \brief Decodes and manages a setup request + * + * The driver call it when a SETUP packet is received. + * The \c udd_g_ctrlreq contains the data of SETUP packet. + * If this callback accepts the setup request then it must + * return \c 1 and eventually update \c udd_g_ctrlreq to send or receive data. + * + * \return \c 1 if the request is accepted, otherwise \c 0. + */ +extern bool udc_process_setup(void); + +/** + * \brief Reset the UDC + * + * The UDC must reset all configuration. + */ +extern void udc_reset(void); + +/** + * \brief To signal that a SOF is occurred + * + * The UDC must send the signal to all UDIs enabled + */ +extern void udc_sof_notify(void); + +//@} + +//@} + +#ifdef __cplusplus +} +#endif +#endif // _UDD_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/udc/udi.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/udc/udi.h new file mode 100644 index 00000000..1fc7ae5d --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/udc/udi.h @@ -0,0 +1,133 @@ +/** + * \file + * + * \brief Common API for USB Device Interface + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UDI_H_ +#define _UDI_H_ + +#include "conf_usb.h" +#include "usb_protocol.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \ingroup usb_device_group + * \defgroup udi_group USB Device Interface (UDI) + * The UDI provides a common API for all classes, + * and this is used by UDC for the main control of USB Device interface. + * @{ + */ + +/** + * \brief UDI API. + * + * The callbacks within this structure are called only by + * USB Device Controller (UDC) + * + * The udc_get_interface_desc() can be use by UDI to know the interface descriptor + * selected by UDC. + */ +typedef struct { + /** + * \brief Enable the interface. + * + * This function is called when the host selects a configuration + * to which this interface belongs through a Set Configuration + * request, and when the host selects an alternate setting of + * this interface through a Set Interface request. + * + * \return \c 1 if function was successfully done, otherwise \c 0. + */ + bool(*enable) (void); + + /** + * \brief Disable the interface. + * + * This function is called when this interface is currently + * active, and + * - the host selects any configuration through a Set + * Configuration request, or + * - the host issues a USB reset, or + * - the device is detached from the host (i.e. Vbus is no + * longer present) + */ + void (*disable) (void); + + /** + * \brief Handle a control request directed at an interface. + * + * This function is called when this interface is currently + * active and the host sends a SETUP request + * with this interface as the recipient. + * + * Use udd_g_ctrlreq to decode and response to SETUP request. + * + * \return \c 1 if this interface supports the SETUP request, otherwise \c 0. + */ + bool(*setup) (void); + + /** + * \brief Returns the current setting of the selected interface. + * + * This function is called when UDC when know alternate setting of selected interface. + * + * \return alternate setting of selected interface + */ + uint8_t(*getsetting) (void); + + /** + * \brief To signal that a SOF is occurred + */ + void(*sof_notify) (void); +} udi_api_t; + +//@} + +#ifdef __cplusplus +} +#endif +#endif // _UDI_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/usb_atmel.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/usb_atmel.h new file mode 100644 index 00000000..049459cc --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/usb_atmel.h @@ -0,0 +1,190 @@ +/** + * \file + * + * \brief All USB VIDs and PIDs from Atmel USB applications + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _USB_ATMEL_H_ +#define _USB_ATMEL_H_ + +/** + * \defgroup usb_group USB Stack + * + * This stack includes the USB Device Stack, USB Host Stack and common + * definitions. + * @{ + */ + +//! @} + +/** + * \ingroup usb_group + * \defgroup usb_atmel_ids_group Atmel USB Identifiers + * + * This module defines Atmel PID and VIDs constants. + * + * @{ + */ + +//! \name Vendor Identifier assigned by USB org to ATMEL +#define USB_VID_ATMEL 0x03EB + + +//! \name Product Identifier assigned by ATMEL to AVR applications +//! @{ + +//! \name The range from 2000h to 20FFh is reserved to the old PID for C51, MEGA, and others. +//! @{ +#define USB_PID_ATMEL_MEGA_HIDGENERIC 0x2013 +#define USB_PID_ATMEL_MEGA_HIDKEYBOARD 0x2017 +#define USB_PID_ATMEL_MEGA_CDC 0x2018 +#define USB_PID_ATMEL_MEGA_AUDIO_IN 0x2019 +#define USB_PID_ATMEL_MEGA_MS 0x201A +#define USB_PID_ATMEL_MEGA_AUDIO_IN_OUT 0x201B +#define USB_PID_ATMEL_MEGA_HIDMOUSE 0x201C +#define USB_PID_ATMEL_MEGA_HIDMOUSE_CERTIF_U4 0x201D +#define USB_PID_ATMEL_MEGA_CDC_MULTI 0x201E +#define USB_PID_ATMEL_MEGA_MS_HIDMS_HID_USBKEY 0x2022 +#define USB_PID_ATMEL_MEGA_MS_HIDMS_HID_STK525 0x2023 +#define USB_PID_ATMEL_MEGA_MS_2 0x2029 +#define USB_PID_ATMEL_MEGA_MS_HIDMS 0x202A +#define USB_PID_ATMEL_MEGA_MS_3 0x2032 +#define USB_PID_ATMEL_MEGA_LIBUSB 0x2050 +//! @} + +//! \name The range 2100h to 21FFh is reserved to PIDs for AVR Tools. +//! @{ +#define USB_PID_ATMEL_XPLAINED 0x2122 +#define USB_PID_ATMEL_XMEGA_USB_ZIGBIT_2_4GHZ 0x214A +#define USB_PID_ATMEL_XMEGA_USB_ZIGBIT_SUBGHZ 0x214B +//! @} + +//! \name The range 2300h to 23FFh is reserved to PIDs for demo from ASF1.7=> +//! @{ +#define USB_PID_ATMEL_UC3_ENUM 0x2300 +#define USB_PID_ATMEL_UC3_MS 0x2301 +#define USB_PID_ATMEL_UC3_MS_SDRAM_LOADER 0x2302 +#define USB_PID_ATMEL_UC3_EVK1100_CTRLPANEL 0x2303 +#define USB_PID_ATMEL_UC3_HID 0x2304 +#define USB_PID_ATMEL_UC3_EVK1101_CTRLPANEL_HID 0x2305 +#define USB_PID_ATMEL_UC3_EVK1101_CTRLPANEL_HID_MS 0x2306 +#define USB_PID_ATMEL_UC3_CDC 0x2307 +#define USB_PID_ATMEL_UC3_AUDIO_MICRO 0x2308 +#define USB_PID_ATMEL_UC3_CDC_DEBUG 0x2310 // Virtual Com (debug interface) on EVK11xx +#define USB_PID_ATMEL_UC3_AUDIO_SPEAKER_MICRO 0x2311 +#define USB_PID_ATMEL_UC3_CDC_MSC 0x2312 +//! @} + +//! \name The range 2400h to 24FFh is reserved to PIDs for ASF applications +//! @{ +#define USB_PID_ATMEL_ASF_HIDMOUSE 0x2400 +#define USB_PID_ATMEL_ASF_HIDKEYBOARD 0x2401 +#define USB_PID_ATMEL_ASF_HIDGENERIC 0x2402 +#define USB_PID_ATMEL_ASF_MSC 0x2403 +#define USB_PID_ATMEL_ASF_CDC 0x2404 +#define USB_PID_ATMEL_ASF_PHDC 0x2405 +#define USB_PID_ATMEL_ASF_MSC_HIDMOUSE 0x2420 +#define USB_PID_ATMEL_ASF_MSC_HIDS_CDC 0x2421 +#define USB_PID_ATMEL_ASF_MSC_HIDKEYBOARD 0x2422 +#define USB_PID_ATMEL_ASF_VENDOR_CLASS 0x2423 +#define USB_PID_ATMEL_ASF_MSC_CDC 0x2424 +#define USB_PID_ATMEL_ASF_TWO_CDC 0x2425 +#define USB_PID_ATMEL_ASF_SEVEN_CDC 0x2426 +#define USB_PID_ATMEL_ASF_XPLAIN_BC_POWERONLY 0x2430 +#define USB_PID_ATMEL_ASF_XPLAIN_BC_TERMINAL 0x2431 +#define USB_PID_ATMEL_ASF_XPLAIN_BC_TOUCH 0x2432 +#define USB_PID_ATMEL_ASF_AUDIO_SPEAKER 0x2433 +#define USB_PID_ATMEL_ASF_XMEGA_B1_XPLAINED 0x2434 +//! @} + +//! \name The range 2F00h to 2FFFh is reserved to official PIDs for AVR bootloaders +//! Note, !!!! don't use this range for demos or examples !!!! +//! @{ +#define USB_PID_ATMEL_DFU_ATXMEGA64C3 0x2FD6 +#define USB_PID_ATMEL_DFU_ATXMEGA128C3 0x2FD7 +#define USB_PID_ATMEL_DFU_ATXMEGA16C4 0x2FD8 +#define USB_PID_ATMEL_DFU_ATXMEGA32C4 0x2FD9 +#define USB_PID_ATMEL_DFU_ATXMEGA256C3 0x2FDA +#define USB_PID_ATMEL_DFU_ATXMEGA384C3 0x2FDB +#define USB_PID_ATMEL_DFU_ATUCL3_L4 0x2FDC +#define USB_PID_ATMEL_DFU_ATXMEGA64A4U 0x2FDD +#define USB_PID_ATMEL_DFU_ATXMEGA128A4U 0x2FDE + +#define USB_PID_ATMEL_DFU_ATXMEGA64B3 0x2FDF +#define USB_PID_ATMEL_DFU_ATXMEGA128B3 0x2FE0 +#define USB_PID_ATMEL_DFU_ATXMEGA64B1 0x2FE1 +#define USB_PID_ATMEL_DFU_ATXMEGA256A3BU 0x2FE2 +#define USB_PID_ATMEL_DFU_ATXMEGA16A4U 0x2FE3 +#define USB_PID_ATMEL_DFU_ATXMEGA32A4U 0x2FE4 +#define USB_PID_ATMEL_DFU_ATXMEGA64A3U 0x2FE5 +#define USB_PID_ATMEL_DFU_ATXMEGA128A3U 0x2FE6 +#define USB_PID_ATMEL_DFU_ATXMEGA192A3U 0x2FE7 +#define USB_PID_ATMEL_DFU_ATXMEGA64A1U 0x2FE8 +#define USB_PID_ATMEL_DFU_ATUC3D 0x2FE9 +#define USB_PID_ATMEL_DFU_ATXMEGA128B1 0x2FEA +#define USB_PID_ATMEL_DFU_AT32UC3C 0x2FEB +#define USB_PID_ATMEL_DFU_ATXMEGA256A3U 0x2FEC +#define USB_PID_ATMEL_DFU_ATXMEGA128A1U 0x2FED +#define USB_PID_ATMEL_DFU_ATMEGA8U2 0x2FEE +#define USB_PID_ATMEL_DFU_ATMEGA16U2 0x2FEF +#define USB_PID_ATMEL_DFU_ATMEGA32U2 0x2FF0 +#define USB_PID_ATMEL_DFU_AT32UC3A3 0x2FF1 +#define USB_PID_ATMEL_DFU_ATMEGA32U6 0x2FF2 +#define USB_PID_ATMEL_DFU_ATMEGA16U4 0x2FF3 +#define USB_PID_ATMEL_DFU_ATMEGA32U4 0x2FF4 +#define USB_PID_ATMEL_DFU_AT32AP7200 0x2FF5 +#define USB_PID_ATMEL_DFU_AT32UC3B 0x2FF6 +#define USB_PID_ATMEL_DFU_AT90USB82 0x2FF7 +#define USB_PID_ATMEL_DFU_AT32UC3A 0x2FF8 +#define USB_PID_ATMEL_DFU_AT90USB64 0x2FF9 +#define USB_PID_ATMEL_DFU_AT90USB162 0x2FFA +#define USB_PID_ATMEL_DFU_AT90USB128 0x2FFB +// 2FFCh to 2FFFh used by C51 family products +//! @} + +//! @} + +//! @} + + +#endif // _USB_ATMEL_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/usb_protocol.h b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/usb_protocol.h new file mode 100644 index 00000000..0b532938 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/services/usb/usb_protocol.h @@ -0,0 +1,505 @@ +/** + * \file + * + * \brief USB protocol definitions. + * + * This file contains the USB definitions and data structures provided by the + * USB 2.0 specification. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _USB_PROTOCOL_H_ +#define _USB_PROTOCOL_H_ + +#include "usb_atmel.h" + +/** + * \ingroup usb_group + * \defgroup usb_protocol_group USB Protocol Definitions + * + * This module defines constants and data structures provided by the USB + * 2.0 specification. + * + * @{ + */ + +//! Value for field bcdUSB +#define USB_V2_0 0x0200 //!< USB Specification version 2.00 +#define USB_V2_1 0x0201 //!< USB Specification version 2.01 + +/*! \name Generic definitions (Class, subclass and protocol) + */ +//! @{ +#define NO_CLASS 0x00 +#define CLASS_VENDOR_SPECIFIC 0xFF +#define NO_SUBCLASS 0x00 +#define NO_PROTOCOL 0x00 +//! @} + +//! \name IAD (Interface Association Descriptor) constants +//! @{ +#define CLASS_IAD 0xEF +#define SUB_CLASS_IAD 0x02 +#define PROTOCOL_IAD 0x01 +//! @} + +/** + * \brief USB request data transfer direction (bmRequestType) + */ +#define USB_REQ_DIR_OUT (0<<7) //!< Host to device +#define USB_REQ_DIR_IN (1<<7) //!< Device to host +#define USB_REQ_DIR_MASK (1<<7) //!< Mask + +/** + * \brief USB request types (bmRequestType) + */ +#define USB_REQ_TYPE_STANDARD (0<<5) //!< Standard request +#define USB_REQ_TYPE_CLASS (1<<5) //!< Class-specific request +#define USB_REQ_TYPE_VENDOR (2<<5) //!< Vendor-specific request +#define USB_REQ_TYPE_MASK (3<<5) //!< Mask + +/** + * \brief USB recipient codes (bmRequestType) + */ +#define USB_REQ_RECIP_DEVICE (0<<0) //!< Recipient device +#define USB_REQ_RECIP_INTERFACE (1<<0) //!< Recipient interface +#define USB_REQ_RECIP_ENDPOINT (2<<0) //!< Recipient endpoint +#define USB_REQ_RECIP_OTHER (3<<0) //!< Recipient other +#define USB_REQ_RECIP_MASK (0x1F) //!< Mask + +/** + * \brief Standard USB requests (bRequest) + */ +enum usb_reqid { + USB_REQ_GET_STATUS = 0, + USB_REQ_CLEAR_FEATURE = 1, + USB_REQ_SET_FEATURE = 3, + USB_REQ_SET_ADDRESS = 5, + USB_REQ_GET_DESCRIPTOR = 6, + USB_REQ_SET_DESCRIPTOR = 7, + USB_REQ_GET_CONFIGURATION = 8, + USB_REQ_SET_CONFIGURATION = 9, + USB_REQ_GET_INTERFACE = 10, + USB_REQ_SET_INTERFACE = 11, + USB_REQ_SYNCH_FRAME = 12, +}; + +/** + * \brief Standard USB device status flags + * + */ +enum usb_device_status { + USB_DEV_STATUS_BUS_POWERED = 0, + USB_DEV_STATUS_SELF_POWERED = 1, + USB_DEV_STATUS_REMOTEWAKEUP = 2 +}; + +/** + * \brief Standard USB Interface status flags + * + */ +enum usb_interface_status { + USB_IFACE_STATUS_RESERVED = 0 +}; + +/** + * \brief Standard USB endpoint status flags + * + */ +enum usb_endpoint_status { + USB_EP_STATUS_HALTED = 1, +}; + +/** + * \brief Standard USB device feature flags + * + * \note valid for SetFeature request. + */ +enum usb_device_feature { + USB_DEV_FEATURE_REMOTE_WAKEUP = 1, //!< Remote wakeup enabled + USB_DEV_FEATURE_TEST_MODE = 2, //!< USB test mode + USB_DEV_FEATURE_OTG_B_HNP_ENABLE = 3, + USB_DEV_FEATURE_OTG_A_HNP_SUPPORT = 4, + USB_DEV_FEATURE_OTG_A_ALT_HNP_SUPPORT = 5 +}; + +/** + * \brief Test Mode possible on HS USB device + * + * \note valid for USB_DEV_FEATURE_TEST_MODE request. + */ +enum usb_device_hs_test_mode { + USB_DEV_TEST_MODE_J = 1, + USB_DEV_TEST_MODE_K = 2, + USB_DEV_TEST_MODE_SE0_NAK = 3, + USB_DEV_TEST_MODE_PACKET = 4, + USB_DEV_TEST_MODE_FORCE_ENABLE = 5, +}; + +/** + * \brief Standard USB endpoint feature/status flags + */ +enum usb_endpoint_feature { + USB_EP_FEATURE_HALT = 0, +}; + +/** + * \brief Standard USB Test Mode Selectors + */ +enum usb_test_mode_selector { + USB_TEST_J = 0x01, + USB_TEST_K = 0x02, + USB_TEST_SE0_NAK = 0x03, + USB_TEST_PACKET = 0x04, + USB_TEST_FORCE_ENABLE = 0x05, +}; + +/** + * \brief Standard USB descriptor types + */ +enum usb_descriptor_type { + USB_DT_DEVICE = 1, + USB_DT_CONFIGURATION = 2, + USB_DT_STRING = 3, + USB_DT_INTERFACE = 4, + USB_DT_ENDPOINT = 5, + USB_DT_DEVICE_QUALIFIER = 6, + USB_DT_OTHER_SPEED_CONFIGURATION = 7, + USB_DT_INTERFACE_POWER = 8, + USB_DT_OTG = 9, + USB_DT_IAD = 0x0B, + USB_DT_BOS = 0x0F, + USB_DT_DEVICE_CAPABILITY = 0x10, +}; + +/** + * \brief USB Device Capability types + */ +enum usb_capability_type { + USB_DC_USB20_EXTENSION = 0x02, +}; + +/** + * \brief USB Device Capability - USB 2.0 Extension + * To fill bmAttributes field of usb_capa_ext_desc_t structure. + */ +enum usb_capability_extension_attr { + USB_DC_EXT_LPM = 0x00000002, + USB_DC_EXT_BESL = 0x00000004, + USB_DC_EXT_BESL_BASELINE_VALID = 0x00000008, + USB_DC_EXT_BESL_DEEP_VALID = 0x00000010, +}; +#define USB_DC_EXT_BESL_DEEP_OFFSET 8 +#define USB_DC_EXT_BESL_DEEP(besl) ((besl & 0xF) << USB_DC_EXT_BESL_DEEP_OFFSET) +#define USB_DC_EXT_BESL_BASELINE_OFFSET 12 +#define USB_DC_EXT_BESL_BASELINE(besl) ((besl & 0xF) << USB_DC_EXT_BESL_BASELINE_OFFSET) + +#define BESL_125_US 0 +#define BESL_150_US 1 +#define BESL_200_US 2 +#define BESL_300_US 3 +#define BESL_400_US 4 +#define BESL_500_US 5 +#define BESL_1000_US 6 +#define BESL_2000_US 7 +#define BESL_3000_US 8 +#define BESL_4000_US 9 +#define BESL_5000_US 10 +#define BESL_6000_US 11 +#define BESL_7000_US 12 +#define BESL_8000_US 13 +#define BESL_9000_US 14 +#define BESL_10000_US 15 + +/** Fields definition from a LPM TOKEN */ +#define USB_LPM_ATTRIBUT_BLINKSTATE_MASK (0xF << 0) +#define USB_LPM_ATTRIBUT_BESL_MASK (0xF << 4) +#define USB_LPM_ATTRIBUT_REMOTEWAKE_MASK (1 << 8) +#define USB_LPM_ATTRIBUT_BLINKSTATE(value) ((value & 0xF) << 0) +#define USB_LPM_ATTRIBUT_BESL(value) ((value & 0xF) << 4) +#define USB_LPM_ATTRIBUT_REMOTEWAKE(value) ((value & 1) << 8) +#define USB_LPM_ATTRIBUT_BLINKSTATE_L1 USB_LPM_ATTRIBUT_BLINKSTATE(1) + +/** + * \brief Standard USB endpoint transfer types + */ +enum usb_ep_type { + USB_EP_TYPE_CONTROL = 0x00, + USB_EP_TYPE_ISOCHRONOUS = 0x01, + USB_EP_TYPE_BULK = 0x02, + USB_EP_TYPE_INTERRUPT = 0x03, + USB_EP_TYPE_MASK = 0x03, +}; + +/** + * \brief Standard USB language IDs for string descriptors + */ +enum usb_langid { + USB_LANGID_EN_US = 0x0409, //!< English (United States) +}; + +/** + * \brief Mask selecting the index part of an endpoint address + */ +#define USB_EP_ADDR_MASK 0x0f + +//! \brief USB address identifier +typedef uint8_t usb_add_t; + +/** + * \brief Endpoint transfer direction is IN + */ +#define USB_EP_DIR_IN 0x80 + +/** + * \brief Endpoint transfer direction is OUT + */ +#define USB_EP_DIR_OUT 0x00 + +//! \brief Endpoint identifier +typedef uint8_t usb_ep_t; + +/** + * \brief Maximum length in bytes of a USB descriptor + * + * The maximum length of a USB descriptor is limited by the 8-bit + * bLength field. + */ +#define USB_MAX_DESC_LEN 255 + +/* + * 2-byte alignment requested for all USB structures. + */ +COMPILER_PACK_SET(1) + +/** + * \brief A USB Device SETUP request + * + * The data payload of SETUP packets always follows this structure. + */ +typedef struct { + uint8_t bmRequestType; + uint8_t bRequest; + le16_t wValue; + le16_t wIndex; + le16_t wLength; +} usb_setup_req_t; + +/** + * \brief Standard USB device descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + le16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + le16_t idVendor; + le16_t idProduct; + le16_t bcdDevice; + uint8_t iManufacturer; + uint8_t iProduct; + uint8_t iSerialNumber; + uint8_t bNumConfigurations; +} usb_dev_desc_t; + +/** + * \brief Standard USB device qualifier descriptor structure + * + * This descriptor contains information about the device when running at + * the "other" speed (i.e. if the device is currently operating at high + * speed, this descriptor can be used to determine what would change if + * the device was operating at full speed.) + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + le16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint8_t bNumConfigurations; + uint8_t bReserved; +} usb_dev_qual_desc_t; + +/** + * \brief USB Device BOS descriptor structure + * + * The BOS descriptor (Binary device Object Store) defines a root + * descriptor that is similar to the configuration descriptor, and is + * the base descriptor for accessing a family of related descriptors. + * A host can read a BOS descriptor and learn from the wTotalLength field + * the entire size of the device-level descriptor set, or it can read in + * the entire BOS descriptor set of device capabilities. + * The host accesses this descriptor using the GetDescriptor() request. + * The descriptor type in the GetDescriptor() request is set to BOS. + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + le16_t wTotalLength; + uint8_t bNumDeviceCaps; +} usb_dev_bos_desc_t; + + +/** + * \brief USB Device Capabilities - USB 2.0 Extension Descriptor structure + * + * Defines the set of USB 1.1-specific device level capabilities. + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDevCapabilityType; + le32_t bmAttributes; +} usb_dev_capa_ext_desc_t; + +/** + * \brief USB Device LPM Descriptor structure + * + * The BOS descriptor and capabilities descriptors for LPM. + */ +typedef struct { + usb_dev_bos_desc_t bos; + usb_dev_capa_ext_desc_t capa_ext; +} usb_dev_lpm_desc_t; + +/** + * \brief Standard USB Interface Association Descriptor structure + */ +typedef struct { + uint8_t bLength; //!< size of this descriptor in bytes + uint8_t bDescriptorType; //!< INTERFACE descriptor type + uint8_t bFirstInterface; //!< Number of interface + uint8_t bInterfaceCount; //!< value to select alternate setting + uint8_t bFunctionClass; //!< Class code assigned by the USB + uint8_t bFunctionSubClass;//!< Sub-class code assigned by the USB + uint8_t bFunctionProtocol;//!< Protocol code assigned by the USB + uint8_t iFunction; //!< Index of string descriptor +} usb_association_desc_t; + + +/** + * \brief Standard USB configuration descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + le16_t wTotalLength; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; +} usb_conf_desc_t; + + +#define USB_CONFIG_ATTR_MUST_SET (1 << 7) //!< Must always be set +#define USB_CONFIG_ATTR_BUS_POWERED (0 << 6) //!< Bus-powered +#define USB_CONFIG_ATTR_SELF_POWERED (1 << 6) //!< Self-powered +#define USB_CONFIG_ATTR_REMOTE_WAKEUP (1 << 5) //!< remote wakeup supported + +#define USB_CONFIG_MAX_POWER(ma) (((ma) + 1) / 2) //!< Max power in mA + +/** + * \brief Standard USB association descriptor structure + */ +typedef struct { + uint8_t bLength; //!< Size of this descriptor in bytes + uint8_t bDescriptorType; //!< Interface descriptor type + uint8_t bFirstInterface; //!< Number of interface + uint8_t bInterfaceCount; //!< value to select alternate setting + uint8_t bFunctionClass; //!< Class code assigned by the USB + uint8_t bFunctionSubClass; //!< Sub-class code assigned by the USB + uint8_t bFunctionProtocol; //!< Protocol code assigned by the USB + uint8_t iFunction; //!< Index of string descriptor +} usb_iad_desc_t; + +/** + * \brief Standard USB interface descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t bNumEndpoints; + uint8_t bInterfaceClass; + uint8_t bInterfaceSubClass; + uint8_t bInterfaceProtocol; + uint8_t iInterface; +} usb_iface_desc_t; + +/** + * \brief Standard USB endpoint descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + le16_t wMaxPacketSize; + uint8_t bInterval; +} usb_ep_desc_t; + + +/** + * \brief A standard USB string descriptor structure + */ +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; +} usb_str_desc_t; + +typedef struct { + usb_str_desc_t desc; + le16_t string[1]; +} usb_str_lgid_desc_t; + +COMPILER_PACK_RESET() + +//! @} + +#endif /* _USB_PROTOCOL_H_ */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/utils/interrupt.h b/AVR Code/USB_BULK_TEST/src/ASF/common/utils/interrupt.h new file mode 100644 index 00000000..80401572 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/utils/interrupt.h @@ -0,0 +1,142 @@ +/** + * \file + * + * \brief Global interrupt management for 8- and 32-bit AVR + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef UTILS_INTERRUPT_H +#define UTILS_INTERRUPT_H + +#include + +#if XMEGA || MEGA || TINY +# include "interrupt/interrupt_avr8.h" +#elif UC3 +# include "interrupt/interrupt_avr32.h" +#elif SAM +# include "interrupt/interrupt_sam_nvic.h" +#else +# error Unsupported device. +#endif + +/** + * \defgroup interrupt_group Global interrupt management + * + * This is a driver for global enabling and disabling of interrupts. + * + * @{ + */ + +#if defined(__DOXYGEN__) +/** + * \def CONFIG_INTERRUPT_FORCE_INTC + * \brief Force usage of the ASF INTC driver + * + * Predefine this symbol when preprocessing to force the use of the ASF INTC driver. + * This is useful to ensure compatibility across compilers and shall be used only when required + * by the application needs. + */ +# define CONFIG_INTERRUPT_FORCE_INTC +#endif + +//! \name Global interrupt flags +//@{ +/** + * \typedef irqflags_t + * \brief Type used for holding state of interrupt flag + */ + +/** + * \def cpu_irq_enable + * \brief Enable interrupts globally + */ + +/** + * \def cpu_irq_disable + * \brief Disable interrupts globally + */ + +/** + * \fn irqflags_t cpu_irq_save(void) + * \brief Get and clear the global interrupt flags + * + * Use in conjunction with \ref cpu_irq_restore. + * + * \return Current state of interrupt flags. + * + * \note This function leaves interrupts disabled. + */ + +/** + * \fn void cpu_irq_restore(irqflags_t flags) + * \brief Restore global interrupt flags + * + * Use in conjunction with \ref cpu_irq_save. + * + * \param flags State to set interrupt flag to. + */ + +/** + * \fn bool cpu_irq_is_enabled_flags(irqflags_t flags) + * \brief Check if interrupts are globally enabled in supplied flags + * + * \param flags Currents state of interrupt flags. + * + * \return True if interrupts are enabled. + */ + +/** + * \def cpu_irq_is_enabled + * \brief Check if interrupts are globally enabled + * + * \return True if interrupts are enabled. + */ +//@} + +//! @} + +/** + * \ingroup interrupt_group + * \defgroup interrupt_deprecated_group Deprecated interrupt definitions + */ + +#endif /* UTILS_INTERRUPT_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/utils/interrupt/interrupt_avr8.h b/AVR Code/USB_BULK_TEST/src/ASF/common/utils/interrupt/interrupt_avr8.h new file mode 100644 index 00000000..1c55fb29 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/utils/interrupt/interrupt_avr8.h @@ -0,0 +1,148 @@ +/** + * \file + * + * \brief Global interrupt management for 8-bit AVR + * + * Copyright (C) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef UTILS_INTERRUPT_INTERRUPT_H +#define UTILS_INTERRUPT_INTERRUPT_H + +#include +#include + +/** + * \weakgroup interrupt_group + * + * @{ + */ + +#ifdef ISR_CUSTOM_H +# include ISR_CUSTOM_H +#else + +/** + * \def ISR + * \brief Define service routine for specified interrupt vector + * + * Usage: + * \code + ISR(FOO_vect) + { + ... + } +\endcode + * + * \param vect Interrupt vector name as found in the device header files. + */ +#if defined(__DOXYGEN__) +# define ISR(vect) +#elif defined(__GNUC__) +# include +#elif defined(__ICCAVR__) +# define __ISR(x) _Pragma(#x) +# define ISR(vect) __ISR(vector=vect) __interrupt void handler_##vect(void) +#endif +#endif // ISR_CUSTOM_H + +#if XMEGA +/** + * \brief Initialize interrupt vectors + * Enables all interrupt levels, with vectors located in the application section + * and fixed priority scheduling. + */ +#define irq_initialize_vectors() \ + PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; +#elif MEGA_RF +#define irq_initialize_vectors() +#endif + +#ifdef __GNUC__ +# define cpu_irq_enable() sei() +# define cpu_irq_disable() cli() +#else +# define cpu_irq_enable() __enable_interrupt() +# define cpu_irq_disable() __disable_interrupt() +#endif + +typedef uint8_t irqflags_t; + +static inline irqflags_t cpu_irq_save(void) +{ + irqflags_t flags = SREG; + cpu_irq_disable(); + return flags; +} + +static inline void cpu_irq_restore(irqflags_t flags) +{ + barrier(); + SREG = flags; +} + +static inline bool cpu_irq_is_enabled_flags(irqflags_t flags) +{ +#if XMEGA +# ifdef __GNUC__ + return flags & CPU_I_bm; +# else + return flags & I_bm; +# endif +#elif MEGA || TINY + return flags & (1 << SREG_I); +#endif +} + +#define cpu_irq_is_enabled() cpu_irq_is_enabled_flags(SREG) + +//! @} + +/** + * \weakgroup interrupt_deprecated_group + * @{ + */ +// Deprecated definitions. +#define Enable_global_interrupt() cpu_irq_enable() +#define Disable_global_interrupt() cpu_irq_disable() +#define Is_global_interrupt_enabled() cpu_irq_is_enabled() +//! @} + +#endif /* UTILS_INTERRUPT_INTERRUPT_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/utils/make/Makefile.avr.in b/AVR Code/USB_BULK_TEST/src/ASF/common/utils/make/Makefile.avr.in new file mode 100644 index 00000000..5d9a8375 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/utils/make/Makefile.avr.in @@ -0,0 +1,483 @@ +# List of available make goals: +# +# all Default target, builds the project +# clean Clean up the project +# rebuild Rebuild the project +# +# doc Build the documentation +# cleandoc Clean up the documentation +# rebuilddoc Rebuild the documentation +# +# +# Copyright (c) 2009 - 2013 Atmel Corporation. All rights reserved. +# +# \asf_license_start +# +# \page License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3. The name of Atmel may not be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# 4. This software may only be redistributed and used in connection with an +# Atmel microcontroller product. +# +# THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE +# EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# \asf_license_stop +# + +# Include the config.mk file from the current working path, e.g., where the +# user called make. +include config.mk + +# Tool to use to generate documentation from the source code +DOCGEN ?= doxygen + +# Look for source files relative to the top-level source directory +VPATH := $(PRJ_PATH) + +# Output target file +target := $(TARGET) + +# Output project name (target name minus suffix) +project := $(basename $(target)) + +# Output target file (typically ELF or static library) +ifeq ($(suffix $(target)),.a) +target_type := lib +else +ifeq ($(suffix $(target)),.elf) +target_type := elf +else +$(error "Target type $(target_type) is not supported") +endif +endif + +# Allow override of operating system detection. The user can add OS=Linux or +# OS=Windows on the command line to explicit set the host OS. +# +# This allows to work around broken uname utility on certain systems. +ifdef OS + ifeq ($(strip $(OS)), Linux) + os_type := Linux + endif + ifeq ($(strip $(OS)), Windows) + os_type := windows32_64 + endif +endif + +os_type ?= $(strip $(shell uname)) + +ifeq ($(os_type),windows32) +os := Windows +else +ifeq ($(os_type),windows64) +os := Windows +else +ifeq ($(os_type),windows32_64) +os ?= Windows +else +ifeq ($(os_type),) +os := Windows +else +# Default to Linux style operating system. Both Cygwin and mingw are fully +# compatible (for this Makefile) with Linux. +os := Linux +endif +endif +endif +endif + +# Output documentation directory and configuration file. +docdir := ../doxygen/html +doccfg := ../doxygen/doxyfile.doxygen + +CROSS ?= avr- +AR := $(CROSS)ar +AS := $(CROSS)as +CC := $(CROSS)gcc +CPP := $(CROSS)gcc -E +CXX := $(CROSS)g++ +LD := $(CROSS)gcc +NM := $(CROSS)nm +OBJCOPY := $(CROSS)objcopy +OBJDUMP := $(CROSS)objdump +SIZE := $(CROSS)size + +RM := rm +ifeq ($(os),Windows) +RMDIR := rmdir /S /Q +else +RMDIR := rmdir -p --ignore-fail-on-non-empty +endif + +# On Windows, we need to override the shell to force the use of cmd.exe +ifeq ($(os),Windows) +SHELL := cmd +endif + +# Strings for beautifying output +MSG_CLEAN_FILES = "RM *.o *.d" +MSG_CLEAN_DIRS = "RMDIR $(strip $(clean-dirs))" +MSG_CLEAN_DOC = "RMDIR $(docdir)" +MSG_MKDIR = "MKDIR $(dir $@)" + +MSG_INFO = "INFO " +MSG_PREBUILD = "PREBUILD $(PREBUILD_CMD)" +MSG_POSTBUILD = "POSTBUILD $(POSTBUILD_CMD)" + +MSG_ARCHIVING = "AR $@" +MSG_ASSEMBLING = "AS $@" +MSG_BINARY_IMAGE = "OBJCOPY $@" +MSG_COMPILING = "CC $@" +MSG_COMPILING_CXX = "CXX $@" +MSG_EEPROM_IMAGE = "OBJCOPY $@" +MSG_EXTENDED_LISTING = "OBJDUMP $@" +MSG_IHEX_IMAGE = "OBJCOPY $@" +MSG_LINKING = "LN $@" +MSG_PREPROCESSING = "CPP $@" +MSG_SIZE = "SIZE $@" +MSG_SYMBOL_TABLE = "NM $@" + +MSG_GENERATING_DOC = "DOXYGEN $(docdir)" + +# Don't use make's built-in rules and variables +MAKEFLAGS += -rR + +# Don't print 'Entering directory ...' +MAKEFLAGS += --no-print-directory + +# Function for reversing the order of a list +reverse = $(if $(1),$(call reverse,$(wordlist 2,$(words $(1)),$(1)))) $(firstword $(1)) + +# Hide command output by default, but allow the user to override this +# by adding V=1 on the command line. +# +# This is inspired by the Kbuild system used by the Linux kernel. +ifdef V + ifeq ("$(origin V)", "command line") + VERBOSE = $(V) + endif +endif +ifndef VERBOSE + VERBOSE = 0 +endif + +ifeq ($(VERBOSE), 1) + Q = +else + Q = @ +endif + +arflags-gnu-y := $(ARFLAGS) +asflags-gnu-y := $(ASFLAGS) +cflags-gnu-y := $(CFLAGS) +cxxflags-gnu-y := $(CXXFLAGS) +cppflags-gnu-y := $(CPPFLAGS) +cpuflags-gnu-y := +dbgflags-gnu-y := $(DBGFLAGS) +libflags-gnu-y := $(foreach LIB,$(LIBS),-l$(LIB)) +ldflags-gnu-y := $(LDFLAGS) +flashflags-gnu-y := $(FLASHFLAGS) +eepromflags-gnu-y := $(EEPROMFLAGS) +clean-files := +clean-dirs := + +clean-files += $(wildcard $(target) $(project).map) +clean-files += $(wildcard $(project).hex $(project).eep) +clean-files += $(wildcard $(project).lss $(project).sym) +clean-files += $(wildcard $(build)) + +# Use pipes instead of temporary files for communication between processes +cflags-gnu-y += -pipe +asflags-gnu-y += -pipe +ldflags-gnu-y += -pipe + +# Archiver flags. +arflags-gnu-y += rcs + +# Always enable warnings. And be very careful about implicit +# declarations. +cflags-gnu-y += -Wall -Wstrict-prototypes -Wmissing-prototypes +cflags-gnu-y += -Werror-implicit-function-declaration +cxxflags-gnu-y += -Wall +# IAR doesn't allow arithmetic on void pointers, so warn about that. +cflags-gnu-y += -Wpointer-arith +cxxflags-gnu-y += -Wpointer-arith + +# Preprocessor flags. +cppflags-gnu-y += $(foreach INC,$(addprefix $(PRJ_PATH)/,$(INC_PATH)),-I$(INC)) +asflags-gnu-y += $(foreach INC,$(addprefix $(PRJ_PATH)/,$(INC_PATH)),'-Wa,-I$(INC)') + +# CPU specific flags. +cpuflags-gnu-y += -mmcu=$(MCU) + +# Dependency file flags. +depflags = -MD -MP -MQ $@ + +# Debug specific flags. +ifdef BUILD_DEBUG_LEVEL +dbgflags-gnu-y += -g$(BUILD_DEBUG_LEVEL) +else +dbgflags-gnu-y += -gdwarf-2 +endif + +# Optimization specific flags. +ifdef BUILD_OPTIMIZATION +optflags-gnu-y = -O$(BUILD_OPTIMIZATION) +else +optflags-gnu-y = $(OPTIMIZATION) +endif + +# Relax compilation and linking. +cflags-gnu-y += -mrelax +cxxflags-gnu-y += -mrelax +asflags-gnu-y += -mrelax +ldflags-gnu-y += -Wl,--relax + +# Always preprocess assembler files. +asflags-gnu-y += -x assembler-with-cpp +# Compile C files using the GNU99 standard. +cflags-gnu-y += -std=gnu99 +# Compile C++ files using the GNU++98 standard. +cxxflags-gnu-y += -std=gnu++98 + +# Use unsigned character type when compiling. +cflags-gnu-y += -funsigned-char +cxxflags-gnu-y += -funsigned-char + +# Don't use strict aliasing (very common in embedded applications). +cflags-gnu-y += -fno-strict-aliasing +cxxflags-gnu-y += -fno-strict-aliasing + +# Separate each function and data into its own separate section to allow +# garbage collection of unused sections. +cflags-gnu-y += -ffunction-sections -fdata-sections +cxxflags-gnu-y += -ffunction-sections -fdata-sections + +# Garbage collect unreferred sections when linking. +ldflags-gnu-y += -Wl,--gc-sections + +# Output a link map file and a cross reference table +ldflags-gnu-y += -Wl,-Map=$(project).map,--cref + +# Add library search paths relative to the top level directory. +ldflags-gnu-y += $(foreach _LIB_PATH,$(addprefix $(PRJ_PATH)/,$(LIB_PATH)),-L$(_LIB_PATH)) + +a_flags = $(cpuflags-gnu-y) $(depflags) $(cppflags-gnu-y) $(asflags-gnu-y) -D__ASSEMBLY__ +c_flags = $(cpuflags-gnu-y) $(dbgflags-gnu-y) $(depflags) $(optflags-gnu-y) $(cppflags-gnu-y) $(cflags-gnu-y) +cxx_flags= $(cpuflags-gnu-y) $(dbgflags-gnu-y) $(depflags) $(optflags-gnu-y) $(cppflags-gnu-y) $(cxxflags-gnu-y) +l_flags = $(cpuflags-gnu-y) $(optflags-gnu-y) $(ldflags-gnu-y) +ar_flags = $(arflags-gnu-y) + +# Intel Hex file production flags +flashflags-gnu-y += -R .eeprom -R .usb_descriptor_table + +# Eeprom file production flags +eepromflags-gnu-y += -j .eeprom +eepromflags-gnu-y += --set-section-flags=.eeprom="alloc,load" +eepromflags-gnu-y += --change-section-lma .eeprom=0 + +# Source files list and part informations must already be included before +# running this makefile + +# If a custom build directory is specified, use it -- force trailing / in directory name. +ifdef BUILD_DIR + build-dir := $(dir $(BUILD_DIR))$(if $(notdir $(BUILD_DIR)),$(notdir $(BUILD_DIR))/) +else + build-dir = +endif + +# Create object files list from source files list. +obj-y := $(addprefix $(build-dir), $(addsuffix .o,$(basename $(CSRCS) $(ASSRCS)))) + +# Create dependency files list from source files list. +dep-files := $(wildcard $(foreach f,$(obj-y),$(basename $(f)).d)) + +clean-files += $(wildcard $(obj-y)) +clean-files += $(dep-files) + +clean-dirs += $(call reverse,$(sort $(wildcard $(dir $(obj-y))))) + +# Default target. +.PHONY: all +ifeq ($(target_type),lib) +all: $(target) $(project).lss $(project).sym +else +ifeq ($(target_type),elf) +all: prebuild $(target) $(project).lss $(project).sym $(project).hex $(project).bin postbuild +endif +endif + +prebuild: +ifneq ($(strip $(PREBUILD_CMD)),) + @echo $(MSG_PREBUILD) + $(Q)$(PREBUILD_CMD) +endif + +postbuild: +ifneq ($(strip $(POSTBUILD_CMD)),) + @echo $(MSG_POSTBUILD) + $(Q)$(POSTBUILD_CMD) +endif + +# Clean up the project. +.PHONY: clean +clean: + @$(if $(strip $(clean-files)),echo $(MSG_CLEAN_FILES)) + $(if $(strip $(clean-files)),$(Q)$(RM) $(clean-files),) + @$(if $(strip $(clean-dirs)),echo $(MSG_CLEAN_DIRS)) +# Remove created directories, and make sure we only remove existing +# directories, since recursive rmdir might help us a bit on the way. +ifeq ($(os),Windows) + $(Q)$(if $(strip $(clean-dirs)), \ + $(RMDIR) $(strip $(subst /,\,$(clean-dirs)))) +else + $(Q)$(if $(strip $(clean-dirs)), \ + for directory in $(strip $(clean-dirs)); do \ + if [ -d "$$directory" ]; then \ + $(RMDIR) $$directory; \ + fi \ + done \ + ) +endif + +# Rebuild the project. +.PHONY: rebuild +rebuild: clean all + +.PHONY: objfiles +objfiles: $(obj-y) + +# Create object files from C source files. +$(build-dir)%.o: %.c $(MAKEFILE_PATH) config.mk + $(Q)test -d $(dir $@) || echo $(MSG_MKDIR) +ifeq ($(os),Windows) + $(Q)test -d $(patsubst %/,%,$(dir $@)) || mkdir $(subst /,\,$(dir $@)) +else + $(Q)test -d $(dir $@) || mkdir -p $(dir $@) +endif + @echo $(MSG_COMPILING) + $(Q)$(CC) $(c_flags) -c $< -o $@ + +# Create object files from C++ source files. +$(build-dir)%.o: %.cpp $(MAKEFILE_PATH) config.mk + $(Q)test -d $(dir $@) || echo $(MSG_MKDIR) +ifeq ($(os),Windows) + $(Q)test -d $(patsubst %/,%,$(dir $@)) || mkdir $(subst /,\,$(dir $@)) +else + $(Q)test -d $(dir $@) || mkdir -p $(dir $@) +endif + @echo $(MSG_COMPILING_CXX) + $(Q)$(CXX) $(cxx_flags) -c $< -o $@ + +# Preprocess and assemble: create object files from assembler source files. +$(build-dir)%.o: %.s $(MAKEFILE_PATH) config.mk + $(Q)test -d $(dir $@) || echo $(MSG_MKDIR) +ifeq ($(os),Windows) + $(Q)test -d $(patsubst %/,%,$(dir $@)) || mkdir $(subst /,\,$(dir $@)) +else + $(Q)test -d $(dir $@) || mkdir -p $(dir $@) +endif + @echo $(MSG_ASSEMBLING) + $(Q)$(CC) $(a_flags) -c $< -o $@ + +# Preprocess and assemble: create object files from assembler source files. +$(build-dir)%.o: %.S $(MAKEFILE_PATH) config.mk + $(Q)test -d $(dir $@) || echo $(MSG_MKDIR) +ifeq ($(os),Windows) + $(Q)test -d $(patsubst %/,%,$(dir $@)) || mkdir $(subst /,\,$(dir $@)) +else + $(Q)test -d $(dir $@) || mkdir -p $(dir $@) +endif + @echo $(MSG_ASSEMBLING) + $(Q)$(CC) $(a_flags) -c $< -o $@ + +# Include all dependency files to add depedency to all header files in use. +include $(dep-files) + +ifeq ($(target_type),lib) +# Archive object files into an archive +$(target): $(MAKEFILE_PATH) config.mk $(obj-y) + @echo $(MSG_ARCHIVING) + $(Q)$(AR) $(ar_flags) $@ $(obj-y) + @echo $(MSG_SIZE) + $(Q)$(SIZE) -Bxt $@ +else +ifeq ($(target_type),elf) +# Link the object files into an ELF file. Also make sure the target is rebuilt +# if the common Makefile.avr.in or project config.mk is changed. +$(target): $(MAKEFILE_PATH) config.mk $(obj-y) + @echo $(MSG_LINKING) + $(Q)$(LD) $(l_flags) $(obj-y) $(libflags-gnu-y) -o $@ + @echo $(MSG_SIZE) + $(Q)$(SIZE) -Ax $@ + $(Q)$(SIZE) -Bx $@ +endif +endif + +# Create extended function listing from target output file. +%.lss: $(target) + @echo $(MSG_EXTENDED_LISTING) + $(Q)$(OBJDUMP) -h -S $< > $@ + +# Create symbol table from target output file. +%.sym: $(target) + @echo $(MSG_SYMBOL_TABLE) + $(Q)$(NM) -n $< > $@ + +# Create Intel HEX image from ELF output file. +%.hex: $(target) + @echo $(MSG_IHEX_IMAGE) + $(Q)$(OBJCOPY) -O ihex $(flashflags-gnu-y) $< $@ + +# Create EEPROM Intel HEX image from ELF output file. +%.eep: $(target) + @echo $(MSG_EEPROM_IMAGE) + $(Q)$(OBJCOPY) $(eepromflags-gnu-y) -O ihex $< $@ || exit 0 + +# Create binary image from ELF output file. +%.bin: $(target) + @echo $(MSG_BINARY_IMAGE) + $(Q)$(OBJCOPY) -O binary $< $@ + +# Provide information about the detected host operating system. +.SECONDARY: info-os +info-os: + @echo $(MSG_INFO)$(os) build host detected + +# Build Doxygen generated documentation. +.PHONY: doc +doc: + @echo $(MSG_GENERATING_DOC) + $(Q)cd $(dir $(doccfg)) && $(DOCGEN) $(notdir $(doccfg)) + +# Clean Doxygen generated documentation. +.PHONY: cleandoc +cleandoc: + @$(if $(wildcard $(docdir)),echo $(MSG_CLEAN_DOC)) + $(Q)$(if $(wildcard $(docdir)),$(RM) --recursive $(docdir)) + +# Rebuild the Doxygen generated documentation. +.PHONY: rebuilddoc +rebuilddoc: cleandoc doc diff --git a/AVR Code/USB_BULK_TEST/src/ASF/common/utils/parts.h b/AVR Code/USB_BULK_TEST/src/ASF/common/utils/parts.h new file mode 100644 index 00000000..b0ddbdf4 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/common/utils/parts.h @@ -0,0 +1,1292 @@ +/** + * \file + * + * \brief Atmel part identification macros + * + * Copyright (C) 2012-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef ATMEL_PARTS_H +#define ATMEL_PARTS_H + +/** + * \defgroup part_macros_group Atmel part identification macros + * + * This collection of macros identify which series and families that the various + * Atmel parts belong to. These can be used to select part-dependent sections of + * code at compile time. + * + * @{ + */ + +/** + * \name Convenience macros for part checking + * @{ + */ +/* ! Check GCC and IAR part definition for 8-bit AVR */ +#define AVR8_PART_IS_DEFINED(part) \ + (defined(__ ## part ## __) || defined(__AVR_ ## part ## __)) + +/* ! Check GCC and IAR part definition for 32-bit AVR */ +#define AVR32_PART_IS_DEFINED(part) \ + (defined(__AT32 ## part ## __) || defined(__AVR32_ ## part ## __)) + +/* ! Check GCC and IAR part definition for SAM */ +#define SAM_PART_IS_DEFINED(part) (defined(__ ## part ## __)) +/** @} */ + +/** + * \defgroup uc3_part_macros_group AVR UC3 parts + * @{ + */ + +/** + * \name AVR UC3 A series + * @{ + */ +#define UC3A0 ( \ + AVR32_PART_IS_DEFINED(UC3A0128) || \ + AVR32_PART_IS_DEFINED(UC3A0256) || \ + AVR32_PART_IS_DEFINED(UC3A0512) \ + ) + +#define UC3A1 ( \ + AVR32_PART_IS_DEFINED(UC3A1128) || \ + AVR32_PART_IS_DEFINED(UC3A1256) || \ + AVR32_PART_IS_DEFINED(UC3A1512) \ + ) + +#define UC3A3 ( \ + AVR32_PART_IS_DEFINED(UC3A364) || \ + AVR32_PART_IS_DEFINED(UC3A364S) || \ + AVR32_PART_IS_DEFINED(UC3A3128) || \ + AVR32_PART_IS_DEFINED(UC3A3128S) || \ + AVR32_PART_IS_DEFINED(UC3A3256) || \ + AVR32_PART_IS_DEFINED(UC3A3256S) \ + ) + +#define UC3A4 ( \ + AVR32_PART_IS_DEFINED(UC3A464) || \ + AVR32_PART_IS_DEFINED(UC3A464S) || \ + AVR32_PART_IS_DEFINED(UC3A4128) || \ + AVR32_PART_IS_DEFINED(UC3A4128S) || \ + AVR32_PART_IS_DEFINED(UC3A4256) || \ + AVR32_PART_IS_DEFINED(UC3A4256S) \ + ) +/** @} */ + +/** + * \name AVR UC3 B series + * @{ + */ +#define UC3B0 ( \ + AVR32_PART_IS_DEFINED(UC3B064) || \ + AVR32_PART_IS_DEFINED(UC3B0128) || \ + AVR32_PART_IS_DEFINED(UC3B0256) || \ + AVR32_PART_IS_DEFINED(UC3B0512) \ + ) + +#define UC3B1 ( \ + AVR32_PART_IS_DEFINED(UC3B164) || \ + AVR32_PART_IS_DEFINED(UC3B1128) || \ + AVR32_PART_IS_DEFINED(UC3B1256) || \ + AVR32_PART_IS_DEFINED(UC3B1512) \ + ) +/** @} */ + +/** + * \name AVR UC3 C series + * @{ + */ +#define UC3C0 ( \ + AVR32_PART_IS_DEFINED(UC3C064C) || \ + AVR32_PART_IS_DEFINED(UC3C0128C) || \ + AVR32_PART_IS_DEFINED(UC3C0256C) || \ + AVR32_PART_IS_DEFINED(UC3C0512C) \ + ) + +#define UC3C1 ( \ + AVR32_PART_IS_DEFINED(UC3C164C) || \ + AVR32_PART_IS_DEFINED(UC3C1128C) || \ + AVR32_PART_IS_DEFINED(UC3C1256C) || \ + AVR32_PART_IS_DEFINED(UC3C1512C) \ + ) + +#define UC3C2 ( \ + AVR32_PART_IS_DEFINED(UC3C264C) || \ + AVR32_PART_IS_DEFINED(UC3C2128C) || \ + AVR32_PART_IS_DEFINED(UC3C2256C) || \ + AVR32_PART_IS_DEFINED(UC3C2512C) \ + ) +/** @} */ + +/** + * \name AVR UC3 D series + * @{ + */ +#define UC3D3 ( \ + AVR32_PART_IS_DEFINED(UC64D3) || \ + AVR32_PART_IS_DEFINED(UC128D3) \ + ) + +#define UC3D4 ( \ + AVR32_PART_IS_DEFINED(UC64D4) || \ + AVR32_PART_IS_DEFINED(UC128D4) \ + ) +/** @} */ + +/** + * \name AVR UC3 L series + * @{ + */ +#define UC3L0 ( \ + AVR32_PART_IS_DEFINED(UC3L016) || \ + AVR32_PART_IS_DEFINED(UC3L032) || \ + AVR32_PART_IS_DEFINED(UC3L064) \ + ) + +#define UC3L0128 ( \ + AVR32_PART_IS_DEFINED(UC3L0128) \ + ) + +#define UC3L0256 ( \ + AVR32_PART_IS_DEFINED(UC3L0256) \ + ) + +#define UC3L3 ( \ + AVR32_PART_IS_DEFINED(UC64L3U) || \ + AVR32_PART_IS_DEFINED(UC128L3U) || \ + AVR32_PART_IS_DEFINED(UC256L3U) \ + ) + +#define UC3L4 ( \ + AVR32_PART_IS_DEFINED(UC64L4U) || \ + AVR32_PART_IS_DEFINED(UC128L4U) || \ + AVR32_PART_IS_DEFINED(UC256L4U) \ + ) + +#define UC3L3_L4 (UC3L3 || UC3L4) +/** @} */ + +/** + * \name AVR UC3 families + * @{ + */ +/** AVR UC3 A family */ +#define UC3A (UC3A0 || UC3A1 || UC3A3 || UC3A4) + +/** AVR UC3 B family */ +#define UC3B (UC3B0 || UC3B1) + +/** AVR UC3 C family */ +#define UC3C (UC3C0 || UC3C1 || UC3C2) + +/** AVR UC3 D family */ +#define UC3D (UC3D3 || UC3D4) + +/** AVR UC3 L family */ +#define UC3L (UC3L0 || UC3L0128 || UC3L0256 || UC3L3_L4) +/** @} */ + +/** AVR UC3 product line */ +#define UC3 (UC3A || UC3B || UC3C || UC3D || UC3L) + +/** @} */ + +/** + * \defgroup xmega_part_macros_group AVR XMEGA parts + * @{ + */ + +/** + * \name AVR XMEGA A series + * @{ + */ +#define XMEGA_A1 ( \ + AVR8_PART_IS_DEFINED(ATxmega64A1) || \ + AVR8_PART_IS_DEFINED(ATxmega128A1) \ + ) + +#define XMEGA_A3 ( \ + AVR8_PART_IS_DEFINED(ATxmega64A3) || \ + AVR8_PART_IS_DEFINED(ATxmega128A3) || \ + AVR8_PART_IS_DEFINED(ATxmega192A3) || \ + AVR8_PART_IS_DEFINED(ATxmega256A3) \ + ) + +#define XMEGA_A3B ( \ + AVR8_PART_IS_DEFINED(ATxmega256A3B) \ + ) + +#define XMEGA_A4 ( \ + AVR8_PART_IS_DEFINED(ATxmega16A4) || \ + AVR8_PART_IS_DEFINED(ATxmega32A4) \ + ) +/** @} */ + +/** + * \name AVR XMEGA AU series + * @{ + */ +#define XMEGA_A1U ( \ + AVR8_PART_IS_DEFINED(ATxmega64A1U) || \ + AVR8_PART_IS_DEFINED(ATxmega128A1U) \ + ) + +#define XMEGA_A3U ( \ + AVR8_PART_IS_DEFINED(ATxmega64A3U) || \ + AVR8_PART_IS_DEFINED(ATxmega128A3U) || \ + AVR8_PART_IS_DEFINED(ATxmega192A3U) || \ + AVR8_PART_IS_DEFINED(ATxmega256A3U) \ + ) + +#define XMEGA_A3BU ( \ + AVR8_PART_IS_DEFINED(ATxmega256A3BU) \ + ) + +#define XMEGA_A4U ( \ + AVR8_PART_IS_DEFINED(ATxmega16A4U) || \ + AVR8_PART_IS_DEFINED(ATxmega32A4U) || \ + AVR8_PART_IS_DEFINED(ATxmega64A4U) || \ + AVR8_PART_IS_DEFINED(ATxmega128A4U) \ + ) +/** @} */ + +/** + * \name AVR XMEGA B series + * @{ + */ +#define XMEGA_B1 ( \ + AVR8_PART_IS_DEFINED(ATxmega64B1) || \ + AVR8_PART_IS_DEFINED(ATxmega128B1) \ + ) + +#define XMEGA_B3 ( \ + AVR8_PART_IS_DEFINED(ATxmega64B3) || \ + AVR8_PART_IS_DEFINED(ATxmega128B3) \ + ) +/** @} */ + +/** + * \name AVR XMEGA C series + * @{ + */ +#define XMEGA_C3 ( \ + AVR8_PART_IS_DEFINED(ATxmega384C3) || \ + AVR8_PART_IS_DEFINED(ATxmega256C3) || \ + AVR8_PART_IS_DEFINED(ATxmega192C3) || \ + AVR8_PART_IS_DEFINED(ATxmega128C3) || \ + AVR8_PART_IS_DEFINED(ATxmega64C3) || \ + AVR8_PART_IS_DEFINED(ATxmega32C3) \ + ) + +#define XMEGA_C4 ( \ + AVR8_PART_IS_DEFINED(ATxmega32C4) || \ + AVR8_PART_IS_DEFINED(ATxmega16C4) \ + ) +/** @} */ + +/** + * \name AVR XMEGA D series + * @{ + */ +#define XMEGA_D3 ( \ + AVR8_PART_IS_DEFINED(ATxmega32D3) || \ + AVR8_PART_IS_DEFINED(ATxmega64D3) || \ + AVR8_PART_IS_DEFINED(ATxmega128D3) || \ + AVR8_PART_IS_DEFINED(ATxmega192D3) || \ + AVR8_PART_IS_DEFINED(ATxmega256D3) || \ + AVR8_PART_IS_DEFINED(ATxmega384D3) \ + ) + +#define XMEGA_D4 ( \ + AVR8_PART_IS_DEFINED(ATxmega16D4) || \ + AVR8_PART_IS_DEFINED(ATxmega32D4) || \ + AVR8_PART_IS_DEFINED(ATxmega64D4) || \ + AVR8_PART_IS_DEFINED(ATxmega128D4) \ + ) +/** @} */ + +/** + * \name AVR XMEGA E series + * @{ + */ +#define XMEGA_E5 ( \ + AVR8_PART_IS_DEFINED(ATxmega8E5) || \ + AVR8_PART_IS_DEFINED(ATxmega16E5) || \ + AVR8_PART_IS_DEFINED(ATxmega32E5) \ + ) +/** @} */ + + +/** + * \name AVR XMEGA families + * @{ + */ +/** AVR XMEGA A family */ +#define XMEGA_A (XMEGA_A1 || XMEGA_A3 || XMEGA_A3B || XMEGA_A4) + +/** AVR XMEGA AU family */ +#define XMEGA_AU (XMEGA_A1U || XMEGA_A3U || XMEGA_A3BU || XMEGA_A4U) + +/** AVR XMEGA B family */ +#define XMEGA_B (XMEGA_B1 || XMEGA_B3) + +/** AVR XMEGA C family */ +#define XMEGA_C (XMEGA_C3 || XMEGA_C4) + +/** AVR XMEGA D family */ +#define XMEGA_D (XMEGA_D3 || XMEGA_D4) + +/** AVR XMEGA E family */ +#define XMEGA_E (XMEGA_E5) +/** @} */ + + +/** AVR XMEGA product line */ +#define XMEGA (XMEGA_A || XMEGA_AU || XMEGA_B || XMEGA_C || XMEGA_D || XMEGA_E) + +/** @} */ + +/** + * \defgroup mega_part_macros_group megaAVR parts + * + * \note These megaAVR groupings are based on the groups in AVR Libc for the + * part header files. They are not names of official megaAVR device series or + * families. + * + * @{ + */ + +/** + * \name ATmegaxx0/xx1 subgroups + * @{ + */ +#define MEGA_XX0 ( \ + AVR8_PART_IS_DEFINED(ATmega640) || \ + AVR8_PART_IS_DEFINED(ATmega1280) || \ + AVR8_PART_IS_DEFINED(ATmega2560) \ + ) + +#define MEGA_XX1 ( \ + AVR8_PART_IS_DEFINED(ATmega1281) || \ + AVR8_PART_IS_DEFINED(ATmega2561) \ + ) +/** @} */ + +/** + * \name megaAVR groups + * @{ + */ +/** ATmegaxx0/xx1 group */ +#define MEGA_XX0_1 (MEGA_XX0 || MEGA_XX1) + +/** ATmegaxx4 group */ +#define MEGA_XX4 ( \ + AVR8_PART_IS_DEFINED(ATmega164A) || \ + AVR8_PART_IS_DEFINED(ATmega164PA) || \ + AVR8_PART_IS_DEFINED(ATmega324A) || \ + AVR8_PART_IS_DEFINED(ATmega324PA) || \ + AVR8_PART_IS_DEFINED(ATmega644) || \ + AVR8_PART_IS_DEFINED(ATmega644A) || \ + AVR8_PART_IS_DEFINED(ATmega644PA) || \ + AVR8_PART_IS_DEFINED(ATmega1284P) || \ + AVR8_PART_IS_DEFINED(ATmega128RFA1) \ + ) + +/** ATmegaxx4 group */ +#define MEGA_XX4_A ( \ + AVR8_PART_IS_DEFINED(ATmega164A) || \ + AVR8_PART_IS_DEFINED(ATmega164PA) || \ + AVR8_PART_IS_DEFINED(ATmega324A) || \ + AVR8_PART_IS_DEFINED(ATmega324PA) || \ + AVR8_PART_IS_DEFINED(ATmega644A) || \ + AVR8_PART_IS_DEFINED(ATmega644PA) || \ + AVR8_PART_IS_DEFINED(ATmega1284P) \ + ) + +/** ATmegaxx8 group */ +#define MEGA_XX8 ( \ + AVR8_PART_IS_DEFINED(ATmega48) || \ + AVR8_PART_IS_DEFINED(ATmega48A) || \ + AVR8_PART_IS_DEFINED(ATmega48PA) || \ + AVR8_PART_IS_DEFINED(ATmega88) || \ + AVR8_PART_IS_DEFINED(ATmega88A) || \ + AVR8_PART_IS_DEFINED(ATmega88PA) || \ + AVR8_PART_IS_DEFINED(ATmega168) || \ + AVR8_PART_IS_DEFINED(ATmega168A) || \ + AVR8_PART_IS_DEFINED(ATmega168PA) || \ + AVR8_PART_IS_DEFINED(ATmega328) || \ + AVR8_PART_IS_DEFINED(ATmega328P) \ + ) + +/** ATmegaxx8A/P/PA group */ +#define MEGA_XX8_A ( \ + AVR8_PART_IS_DEFINED(ATmega48A) || \ + AVR8_PART_IS_DEFINED(ATmega48PA) || \ + AVR8_PART_IS_DEFINED(ATmega88A) || \ + AVR8_PART_IS_DEFINED(ATmega88PA) || \ + AVR8_PART_IS_DEFINED(ATmega168A) || \ + AVR8_PART_IS_DEFINED(ATmega168PA) || \ + AVR8_PART_IS_DEFINED(ATmega328P) \ + ) + +/** ATmegaxx group */ +#define MEGA_XX ( \ + AVR8_PART_IS_DEFINED(ATmega16) || \ + AVR8_PART_IS_DEFINED(ATmega16A) || \ + AVR8_PART_IS_DEFINED(ATmega32) || \ + AVR8_PART_IS_DEFINED(ATmega32A) || \ + AVR8_PART_IS_DEFINED(ATmega64) || \ + AVR8_PART_IS_DEFINED(ATmega64A) || \ + AVR8_PART_IS_DEFINED(ATmega128) || \ + AVR8_PART_IS_DEFINED(ATmega128A) \ + ) + +/** ATmegaxxA/P/PA group */ +#define MEGA_XX_A ( \ + AVR8_PART_IS_DEFINED(ATmega16A) || \ + AVR8_PART_IS_DEFINED(ATmega32A) || \ + AVR8_PART_IS_DEFINED(ATmega64A) || \ + AVR8_PART_IS_DEFINED(ATmega128A) \ + ) +/** ATmegaxxRFA1 group */ +#define MEGA_RFA1 ( \ + AVR8_PART_IS_DEFINED(ATmega128RFA1) \ + ) + +/** ATmegaxxRFR2 group */ +#define MEGA_RFR2 ( \ + AVR8_PART_IS_DEFINED(ATmega64RFR2) || \ + AVR8_PART_IS_DEFINED(ATmega128RFR2) || \ + AVR8_PART_IS_DEFINED(ATmega256RFR2) || \ + AVR8_PART_IS_DEFINED(ATmega644RFR2) || \ + AVR8_PART_IS_DEFINED(ATmega1284RFR2) || \ + AVR8_PART_IS_DEFINED(ATmega2564RFR2) \ + ) + + +/** ATmegaxxRFxx group */ +#define MEGA_RF (MEGA_RFA1 || MEGA_RFR2) + +/** + * \name ATmegaxx_un0/un1/un2 subgroups + * @{ + */ +#define MEGA_XX_UN0 ( \ + AVR8_PART_IS_DEFINED(ATmega16) || \ + AVR8_PART_IS_DEFINED(ATmega16A) || \ + AVR8_PART_IS_DEFINED(ATmega32) || \ + AVR8_PART_IS_DEFINED(ATmega32A) \ + ) + +/** ATmegaxx group without power reduction and + * And interrupt sense register. + */ +#define MEGA_XX_UN1 ( \ + AVR8_PART_IS_DEFINED(ATmega64) || \ + AVR8_PART_IS_DEFINED(ATmega64A) || \ + AVR8_PART_IS_DEFINED(ATmega128) || \ + AVR8_PART_IS_DEFINED(ATmega128A) \ + ) + +/** ATmegaxx group without power reduction and + * And interrupt sense register. + */ +#define MEGA_XX_UN2 ( \ + AVR8_PART_IS_DEFINED(ATmega169P) || \ + AVR8_PART_IS_DEFINED(ATmega169PA) || \ + AVR8_PART_IS_DEFINED(ATmega329P) || \ + AVR8_PART_IS_DEFINED(ATmega329PA) \ + ) + +/** Devices added to complete megaAVR offering. + * Please do not use this group symbol as it is not intended + * to be permanent: the devices should be regrouped. + */ +#define MEGA_UNCATEGORIZED ( \ + AVR8_PART_IS_DEFINED(AT90CAN128) || \ + AVR8_PART_IS_DEFINED(AT90CAN32) || \ + AVR8_PART_IS_DEFINED(AT90CAN64) || \ + AVR8_PART_IS_DEFINED(AT90PWM1) || \ + AVR8_PART_IS_DEFINED(AT90PWM216) || \ + AVR8_PART_IS_DEFINED(AT90PWM2B) || \ + AVR8_PART_IS_DEFINED(AT90PWM316) || \ + AVR8_PART_IS_DEFINED(AT90PWM3B) || \ + AVR8_PART_IS_DEFINED(AT90PWM81) || \ + AVR8_PART_IS_DEFINED(AT90USB1286) || \ + AVR8_PART_IS_DEFINED(AT90USB1287) || \ + AVR8_PART_IS_DEFINED(AT90USB162) || \ + AVR8_PART_IS_DEFINED(AT90USB646) || \ + AVR8_PART_IS_DEFINED(AT90USB647) || \ + AVR8_PART_IS_DEFINED(AT90USB82) || \ + AVR8_PART_IS_DEFINED(ATmega1284) || \ + AVR8_PART_IS_DEFINED(ATmega162) || \ + AVR8_PART_IS_DEFINED(ATmega164P) || \ + AVR8_PART_IS_DEFINED(ATmega165A) || \ + AVR8_PART_IS_DEFINED(ATmega165P) || \ + AVR8_PART_IS_DEFINED(ATmega165PA) || \ + AVR8_PART_IS_DEFINED(ATmega168P) || \ + AVR8_PART_IS_DEFINED(ATmega169A) || \ + AVR8_PART_IS_DEFINED(ATmega16M1) || \ + AVR8_PART_IS_DEFINED(ATmega16U2) || \ + AVR8_PART_IS_DEFINED(ATmega16U4) || \ + AVR8_PART_IS_DEFINED(ATmega256RFA2) || \ + AVR8_PART_IS_DEFINED(ATmega324P) || \ + AVR8_PART_IS_DEFINED(ATmega325) || \ + AVR8_PART_IS_DEFINED(ATmega3250) || \ + AVR8_PART_IS_DEFINED(ATmega3250A) || \ + AVR8_PART_IS_DEFINED(ATmega3250P) || \ + AVR8_PART_IS_DEFINED(ATmega3250PA) || \ + AVR8_PART_IS_DEFINED(ATmega325A) || \ + AVR8_PART_IS_DEFINED(ATmega325P) || \ + AVR8_PART_IS_DEFINED(ATmega325PA) || \ + AVR8_PART_IS_DEFINED(ATmega329) || \ + AVR8_PART_IS_DEFINED(ATmega3290) || \ + AVR8_PART_IS_DEFINED(ATmega3290A) || \ + AVR8_PART_IS_DEFINED(ATmega3290P) || \ + AVR8_PART_IS_DEFINED(ATmega3290PA) || \ + AVR8_PART_IS_DEFINED(ATmega329A) || \ + AVR8_PART_IS_DEFINED(ATmega32M1) || \ + AVR8_PART_IS_DEFINED(ATmega32U2) || \ + AVR8_PART_IS_DEFINED(ATmega32U4) || \ + AVR8_PART_IS_DEFINED(ATmega48P) || \ + AVR8_PART_IS_DEFINED(ATmega644P) || \ + AVR8_PART_IS_DEFINED(ATmega645) || \ + AVR8_PART_IS_DEFINED(ATmega6450) || \ + AVR8_PART_IS_DEFINED(ATmega6450A) || \ + AVR8_PART_IS_DEFINED(ATmega6450P) || \ + AVR8_PART_IS_DEFINED(ATmega645A) || \ + AVR8_PART_IS_DEFINED(ATmega645P) || \ + AVR8_PART_IS_DEFINED(ATmega649) || \ + AVR8_PART_IS_DEFINED(ATmega6490) || \ + AVR8_PART_IS_DEFINED(ATmega6490A) || \ + AVR8_PART_IS_DEFINED(ATmega6490P) || \ + AVR8_PART_IS_DEFINED(ATmega649A) || \ + AVR8_PART_IS_DEFINED(ATmega649P) || \ + AVR8_PART_IS_DEFINED(ATmega64M1) || \ + AVR8_PART_IS_DEFINED(ATmega64RFA2) || \ + AVR8_PART_IS_DEFINED(ATmega8) || \ + AVR8_PART_IS_DEFINED(ATmega8515) || \ + AVR8_PART_IS_DEFINED(ATmega8535) || \ + AVR8_PART_IS_DEFINED(ATmega88P) || \ + AVR8_PART_IS_DEFINED(ATmega8A) || \ + AVR8_PART_IS_DEFINED(ATmega8U2) \ + ) + +/** Unspecified group */ +#define MEGA_UNSPECIFIED (MEGA_XX_UN0 || MEGA_XX_UN1 || MEGA_XX_UN2 || \ + MEGA_UNCATEGORIZED) + +/** @} */ + +/** megaAVR product line */ +#define MEGA (MEGA_XX0_1 || MEGA_XX4 || MEGA_XX8 || MEGA_XX || MEGA_RF || \ + MEGA_UNSPECIFIED) + +/** @} */ + +/** + * \defgroup tiny_part_macros_group tinyAVR parts + * + * @{ + */ + +/** + * \name tinyAVR groups + * @{ + */ + +/** Devices added to complete tinyAVR offering. + * Please do not use this group symbol as it is not intended + * to be permanent: the devices should be regrouped. + */ +#define TINY_UNCATEGORIZED ( \ + AVR8_PART_IS_DEFINED(ATtiny10) || \ + AVR8_PART_IS_DEFINED(ATtiny13) || \ + AVR8_PART_IS_DEFINED(ATtiny13A) || \ + AVR8_PART_IS_DEFINED(ATtiny1634) || \ + AVR8_PART_IS_DEFINED(ATtiny167) || \ + AVR8_PART_IS_DEFINED(ATtiny20) || \ + AVR8_PART_IS_DEFINED(ATtiny2313) || \ + AVR8_PART_IS_DEFINED(ATtiny2313A) || \ + AVR8_PART_IS_DEFINED(ATtiny24) || \ + AVR8_PART_IS_DEFINED(ATtiny24A) || \ + AVR8_PART_IS_DEFINED(ATtiny25) || \ + AVR8_PART_IS_DEFINED(ATtiny26) || \ + AVR8_PART_IS_DEFINED(ATtiny261) || \ + AVR8_PART_IS_DEFINED(ATtiny261A) || \ + AVR8_PART_IS_DEFINED(ATtiny4) || \ + AVR8_PART_IS_DEFINED(ATtiny40) || \ + AVR8_PART_IS_DEFINED(ATtiny4313) || \ + AVR8_PART_IS_DEFINED(ATtiny43U) || \ + AVR8_PART_IS_DEFINED(ATtiny44) || \ + AVR8_PART_IS_DEFINED(ATtiny44A) || \ + AVR8_PART_IS_DEFINED(ATtiny45) || \ + AVR8_PART_IS_DEFINED(ATtiny461) || \ + AVR8_PART_IS_DEFINED(ATtiny461A) || \ + AVR8_PART_IS_DEFINED(ATtiny48) || \ + AVR8_PART_IS_DEFINED(ATtiny5) || \ + AVR8_PART_IS_DEFINED(ATtiny828) || \ + AVR8_PART_IS_DEFINED(ATtiny84) || \ + AVR8_PART_IS_DEFINED(ATtiny84A) || \ + AVR8_PART_IS_DEFINED(ATtiny85) || \ + AVR8_PART_IS_DEFINED(ATtiny861) || \ + AVR8_PART_IS_DEFINED(ATtiny861A) || \ + AVR8_PART_IS_DEFINED(ATtiny87) || \ + AVR8_PART_IS_DEFINED(ATtiny88) || \ + AVR8_PART_IS_DEFINED(ATtiny9) \ + ) + +/** @} */ + +/** tinyAVR product line */ +#define TINY (TINY_UNCATEGORIZED) + +/** @} */ + +/** + * \defgroup sam_part_macros_group SAM parts + * @{ + */ + +/** + * \name SAM3S series + * @{ + */ +#define SAM3S1 ( \ + SAM_PART_IS_DEFINED(SAM3S1A) || \ + SAM_PART_IS_DEFINED(SAM3S1B) || \ + SAM_PART_IS_DEFINED(SAM3S1C) \ + ) + +#define SAM3S2 ( \ + SAM_PART_IS_DEFINED(SAM3S2A) || \ + SAM_PART_IS_DEFINED(SAM3S2B) || \ + SAM_PART_IS_DEFINED(SAM3S2C) \ + ) + +#define SAM3S4 ( \ + SAM_PART_IS_DEFINED(SAM3S4A) || \ + SAM_PART_IS_DEFINED(SAM3S4B) || \ + SAM_PART_IS_DEFINED(SAM3S4C) \ + ) + +#define SAM3S8 ( \ + SAM_PART_IS_DEFINED(SAM3S8B) || \ + SAM_PART_IS_DEFINED(SAM3S8C) \ + ) + +#define SAM3SD8 ( \ + SAM_PART_IS_DEFINED(SAM3SD8B) || \ + SAM_PART_IS_DEFINED(SAM3SD8C) \ + ) +/** @} */ + +/** + * \name SAM3U series + * @{ + */ +#define SAM3U1 ( \ + SAM_PART_IS_DEFINED(SAM3U1C) || \ + SAM_PART_IS_DEFINED(SAM3U1E) \ + ) + +#define SAM3U2 ( \ + SAM_PART_IS_DEFINED(SAM3U2C) || \ + SAM_PART_IS_DEFINED(SAM3U2E) \ + ) + +#define SAM3U4 ( \ + SAM_PART_IS_DEFINED(SAM3U4C) || \ + SAM_PART_IS_DEFINED(SAM3U4E) \ + ) +/** @} */ + +/** + * \name SAM3N series + * @{ + */ +#define SAM3N00 ( \ + SAM_PART_IS_DEFINED(SAM3N00A) || \ + SAM_PART_IS_DEFINED(SAM3N00B) \ + ) + +#define SAM3N0 ( \ + SAM_PART_IS_DEFINED(SAM3N0A) || \ + SAM_PART_IS_DEFINED(SAM3N0B) || \ + SAM_PART_IS_DEFINED(SAM3N0C) \ + ) + +#define SAM3N1 ( \ + SAM_PART_IS_DEFINED(SAM3N1A) || \ + SAM_PART_IS_DEFINED(SAM3N1B) || \ + SAM_PART_IS_DEFINED(SAM3N1C) \ + ) + +#define SAM3N2 ( \ + SAM_PART_IS_DEFINED(SAM3N2A) || \ + SAM_PART_IS_DEFINED(SAM3N2B) || \ + SAM_PART_IS_DEFINED(SAM3N2C) \ + ) + +#define SAM3N4 ( \ + SAM_PART_IS_DEFINED(SAM3N4A) || \ + SAM_PART_IS_DEFINED(SAM3N4B) || \ + SAM_PART_IS_DEFINED(SAM3N4C) \ + ) +/** @} */ + +/** + * \name SAM3X series + * @{ + */ +#define SAM3X4 ( \ + SAM_PART_IS_DEFINED(SAM3X4C) || \ + SAM_PART_IS_DEFINED(SAM3X4E) \ + ) + +#define SAM3X8 ( \ + SAM_PART_IS_DEFINED(SAM3X8C) || \ + SAM_PART_IS_DEFINED(SAM3X8E) || \ + SAM_PART_IS_DEFINED(SAM3X8H) \ + ) +/** @} */ + +/** + * \name SAM3A series + * @{ + */ +#define SAM3A4 ( \ + SAM_PART_IS_DEFINED(SAM3A4C) \ + ) + +#define SAM3A8 ( \ + SAM_PART_IS_DEFINED(SAM3A8C) \ + ) +/** @} */ + +/** + * \name SAM4S series + * @{ + */ +#define SAM4S2 ( \ + SAM_PART_IS_DEFINED(SAM4S2A) || \ + SAM_PART_IS_DEFINED(SAM4S2B) || \ + SAM_PART_IS_DEFINED(SAM4S2C) \ + ) + +#define SAM4S4 ( \ + SAM_PART_IS_DEFINED(SAM4S4A) || \ + SAM_PART_IS_DEFINED(SAM4S4B) || \ + SAM_PART_IS_DEFINED(SAM4S4C) \ + ) + +#define SAM4S8 ( \ + SAM_PART_IS_DEFINED(SAM4S8B) || \ + SAM_PART_IS_DEFINED(SAM4S8C) \ + ) + +#define SAM4S16 ( \ + SAM_PART_IS_DEFINED(SAM4S16B) || \ + SAM_PART_IS_DEFINED(SAM4S16C) \ + ) + +#define SAM4SA16 ( \ + SAM_PART_IS_DEFINED(SAM4SA16B) || \ + SAM_PART_IS_DEFINED(SAM4SA16C) \ + ) + +#define SAM4SD16 ( \ + SAM_PART_IS_DEFINED(SAM4SD16B) || \ + SAM_PART_IS_DEFINED(SAM4SD16C) \ + ) + +#define SAM4SD32 ( \ + SAM_PART_IS_DEFINED(SAM4SD32B) || \ + SAM_PART_IS_DEFINED(SAM4SD32C) \ + ) +/** @} */ + +/** + * \name SAM4L series + * @{ + */ +#define SAM4LS ( \ + SAM_PART_IS_DEFINED(SAM4LS2A) || \ + SAM_PART_IS_DEFINED(SAM4LS2B) || \ + SAM_PART_IS_DEFINED(SAM4LS2C) || \ + SAM_PART_IS_DEFINED(SAM4LS4A) || \ + SAM_PART_IS_DEFINED(SAM4LS4B) || \ + SAM_PART_IS_DEFINED(SAM4LS4C) || \ + SAM_PART_IS_DEFINED(SAM4LS8A) || \ + SAM_PART_IS_DEFINED(SAM4LS8B) || \ + SAM_PART_IS_DEFINED(SAM4LS8C) \ + ) + +#define SAM4LC ( \ + SAM_PART_IS_DEFINED(SAM4LC2A) || \ + SAM_PART_IS_DEFINED(SAM4LC2B) || \ + SAM_PART_IS_DEFINED(SAM4LC2C) || \ + SAM_PART_IS_DEFINED(SAM4LC4A) || \ + SAM_PART_IS_DEFINED(SAM4LC4B) || \ + SAM_PART_IS_DEFINED(SAM4LC4C) || \ + SAM_PART_IS_DEFINED(SAM4LC8A) || \ + SAM_PART_IS_DEFINED(SAM4LC8B) || \ + SAM_PART_IS_DEFINED(SAM4LC8C) \ + ) +/** @} */ + +/** + * \name SAMD20 series + * @{ + */ +#define SAMD20J ( \ + SAM_PART_IS_DEFINED(SAMD20J14) || \ + SAM_PART_IS_DEFINED(SAMD20J15) || \ + SAM_PART_IS_DEFINED(SAMD20J16) || \ + SAM_PART_IS_DEFINED(SAMD20J17) || \ + SAM_PART_IS_DEFINED(SAMD20J18) \ + ) + +#define SAMD20G ( \ + SAM_PART_IS_DEFINED(SAMD20G14) || \ + SAM_PART_IS_DEFINED(SAMD20G15) || \ + SAM_PART_IS_DEFINED(SAMD20G16) || \ + SAM_PART_IS_DEFINED(SAMD20G17) || \ + SAM_PART_IS_DEFINED(SAMD20G17U) || \ + SAM_PART_IS_DEFINED(SAMD20G18) || \ + SAM_PART_IS_DEFINED(SAMD20G18U) \ + ) + +#define SAMD20E ( \ + SAM_PART_IS_DEFINED(SAMD20E14) || \ + SAM_PART_IS_DEFINED(SAMD20E15) || \ + SAM_PART_IS_DEFINED(SAMD20E16) || \ + SAM_PART_IS_DEFINED(SAMD20E17) || \ + SAM_PART_IS_DEFINED(SAMD20E18) || \ + SAM_PART_IS_DEFINED(SAMD20E1F) \ + ) +/** @} */ + +/** + * \name SAMD21 series + * @{ + */ +#define SAMD21J ( \ + SAM_PART_IS_DEFINED(SAMD21J15A) || \ + SAM_PART_IS_DEFINED(SAMD21J16A) || \ + SAM_PART_IS_DEFINED(SAMD21J17A) || \ + SAM_PART_IS_DEFINED(SAMD21J18A) || \ + SAM_PART_IS_DEFINED(SAMD21J15B) || \ + SAM_PART_IS_DEFINED(SAMD21J16B) \ + ) + +#define SAMD21G ( \ + SAM_PART_IS_DEFINED(SAMD21G15A) || \ + SAM_PART_IS_DEFINED(SAMD21G16A) || \ + SAM_PART_IS_DEFINED(SAMD21G17A) || \ + SAM_PART_IS_DEFINED(SAMD21G17AU) || \ + SAM_PART_IS_DEFINED(SAMD21G18A) || \ + SAM_PART_IS_DEFINED(SAMD21G18AU) || \ + SAM_PART_IS_DEFINED(SAMD21G15B) || \ + SAM_PART_IS_DEFINED(SAMD21G16B) \ + ) + +#define SAMD21E ( \ + SAM_PART_IS_DEFINED(SAMD21E15A) || \ + SAM_PART_IS_DEFINED(SAMD21E16A) || \ + SAM_PART_IS_DEFINED(SAMD21E17A) || \ + SAM_PART_IS_DEFINED(SAMD21E18A) || \ + SAM_PART_IS_DEFINED(SAMD21E15B) || \ + SAM_PART_IS_DEFINED(SAMD21E15BU) || \ + SAM_PART_IS_DEFINED(SAMD21E16B) || \ + SAM_PART_IS_DEFINED(SAMD21E16BU) || \ + SAM_PART_IS_DEFINED(SAMD21E15L) || \ + SAM_PART_IS_DEFINED(SAMD21E16L) \ + ) +/** @} */ + +/** + * \name SAMR21 series + * @{ + */ +#define SAMR21G ( \ + SAM_PART_IS_DEFINED(SAMR21G16A) || \ + SAM_PART_IS_DEFINED(SAMR21G17A) || \ + SAM_PART_IS_DEFINED(SAMR21G18A) \ + ) + +#define SAMR21E ( \ + SAM_PART_IS_DEFINED(SAMR21E16A) || \ + SAM_PART_IS_DEFINED(SAMR21E17A) || \ + SAM_PART_IS_DEFINED(SAMR21E18A) \ + ) +/** @} */ + +/** + * \name SAMD10 series + * @{ + */ +#define SAMD10C ( \ + SAM_PART_IS_DEFINED(SAMD10C12A) || \ + SAM_PART_IS_DEFINED(SAMD10C13A) || \ + SAM_PART_IS_DEFINED(SAMD10C14A) \ + ) + +#define SAMD10DS ( \ + SAM_PART_IS_DEFINED(SAMD10D12AS) || \ + SAM_PART_IS_DEFINED(SAMD10D13AS) || \ + SAM_PART_IS_DEFINED(SAMD10D14AS) \ + ) + +#define SAMD10DM ( \ + SAM_PART_IS_DEFINED(SAMD10D12AM) || \ + SAM_PART_IS_DEFINED(SAMD10D13AM) || \ + SAM_PART_IS_DEFINED(SAMD10D14AM) \ + ) +/** @} */ + +/** + * \name SAMD11 series + * @{ + */ +#define SAMD11C ( \ + SAM_PART_IS_DEFINED(SAMD11C14A) \ + ) + +#define SAMD11DS ( \ + SAM_PART_IS_DEFINED(SAMD11D14AS) \ + ) + +#define SAMD11DM ( \ + SAM_PART_IS_DEFINED(SAMD11D14AM) \ + ) +/** @} */ + +/** + * \name SAML21 series + * @{ + */ +#define SAML21E ( \ + SAM_PART_IS_DEFINED(SAML21E15A) || \ + SAM_PART_IS_DEFINED(SAML21E16A) || \ + SAM_PART_IS_DEFINED(SAML21E17A) || \ + SAM_PART_IS_DEFINED(SAML21E18A) \ + ) + +#define SAML21G ( \ + SAM_PART_IS_DEFINED(SAML21G16A) || \ + SAM_PART_IS_DEFINED(SAML21G17A) || \ + SAM_PART_IS_DEFINED(SAML21G18A) \ + ) + +#define SAML21J ( \ + SAM_PART_IS_DEFINED(SAML21J16A) || \ + SAM_PART_IS_DEFINED(SAML21J17A) || \ + SAM_PART_IS_DEFINED(SAML21J18A) \ + ) +/** @} */ + +/** + * \name SAM4E series + * @{ + */ +#define SAM4E8 ( \ + SAM_PART_IS_DEFINED(SAM4E8C) || \ + SAM_PART_IS_DEFINED(SAM4E8E) \ + ) + +#define SAM4E16 ( \ + SAM_PART_IS_DEFINED(SAM4E16C) || \ + SAM_PART_IS_DEFINED(SAM4E16E) \ + ) +/** @} */ + +/** + * \name SAM4N series + * @{ + */ +#define SAM4N8 ( \ + SAM_PART_IS_DEFINED(SAM4N8A) || \ + SAM_PART_IS_DEFINED(SAM4N8B) || \ + SAM_PART_IS_DEFINED(SAM4N8C) \ + ) + +#define SAM4N16 ( \ + SAM_PART_IS_DEFINED(SAM4N16B) || \ + SAM_PART_IS_DEFINED(SAM4N16C) \ + ) +/** @} */ + +/** + * \name SAM4C series + * @{ + */ +#define SAM4C8_0 ( \ + SAM_PART_IS_DEFINED(SAM4C8C_0) \ + ) + +#define SAM4C8_1 ( \ + SAM_PART_IS_DEFINED(SAM4C8C_1) \ + ) + +#define SAM4C8 (SAM4C8_0 || SAM4C8_1) + +#define SAM4C16_0 ( \ + SAM_PART_IS_DEFINED(SAM4C16C_0) \ + ) + +#define SAM4C16_1 ( \ + SAM_PART_IS_DEFINED(SAM4C16C_1) \ + ) + +#define SAM4C16 (SAM4C16_0 || SAM4C16_1) + +#define SAM4C32_0 ( \ + SAM_PART_IS_DEFINED(SAM4C32C_0) ||\ + SAM_PART_IS_DEFINED(SAM4C32E_0) \ + ) + +#define SAM4C32_1 ( \ + SAM_PART_IS_DEFINED(SAM4C32C_1) ||\ + SAM_PART_IS_DEFINED(SAM4C32E_1) \ + ) + + +#define SAM4C32 (SAM4C32_0 || SAM4C32_1) + +/** @} */ + +/** + * \name SAM4CM series + * @{ + */ +#define SAM4CMP8_0 ( \ + SAM_PART_IS_DEFINED(SAM4CMP8C_0) \ + ) + +#define SAM4CMP8_1 ( \ + SAM_PART_IS_DEFINED(SAM4CMP8C_1) \ + ) + +#define SAM4CMP8 (SAM4CMP8_0 || SAM4CMP8_1) + +#define SAM4CMP16_0 ( \ + SAM_PART_IS_DEFINED(SAM4CMP16C_0) \ + ) + +#define SAM4CMP16_1 ( \ + SAM_PART_IS_DEFINED(SAM4CMP16C_1) \ + ) + +#define SAM4CMP16 (SAM4CMP16_0 || SAM4CMP16_1) + +#define SAM4CMP32_0 ( \ + SAM_PART_IS_DEFINED(SAM4CMP32C_0) \ + ) + +#define SAM4CMP32_1 ( \ + SAM_PART_IS_DEFINED(SAM4CMP32C_1) \ + ) + +#define SAM4CMP32 (SAM4CMP32_0 || SAM4CMP32_1) + +#define SAM4CMS8_0 ( \ + SAM_PART_IS_DEFINED(SAM4CMS8C_0) \ + ) + +#define SAM4CMS8_1 ( \ + SAM_PART_IS_DEFINED(SAM4CMS8C_1) \ + ) + +#define SAM4CMS8 (SAM4CMS8_0 || SAM4CMS8_1) + +#define SAM4CMS16_0 ( \ + SAM_PART_IS_DEFINED(SAM4CMS16C_0) \ + ) + +#define SAM4CMS16_1 ( \ + SAM_PART_IS_DEFINED(SAM4CMS16C_1) \ + ) + +#define SAM4CMS16 (SAM4CMS16_0 || SAM4CMS16_1) + +#define SAM4CMS32_0 ( \ + SAM_PART_IS_DEFINED(SAM4CMS32C_0) \ + ) + +#define SAM4CMS32_1 ( \ + SAM_PART_IS_DEFINED(SAM4CMS32C_1) \ + ) + +#define SAM4CMS32 (SAM4CMS32_0 || SAM4CMS32_1) + +/** @} */ + +/** + * \name SAM4CP series + * @{ + */ +#define SAM4CP16_0 ( \ + SAM_PART_IS_DEFINED(SAM4CP16B_0) \ + ) + +#define SAM4CP16_1 ( \ + SAM_PART_IS_DEFINED(SAM4CP16B_1) \ + ) + +#define SAM4CP16 (SAM4CP16_0 || SAM4CP16_1) +/** @} */ + +/** + * \name SAMG series + * @{ + */ +#define SAMG51 ( \ + SAM_PART_IS_DEFINED(SAMG51G18) \ + ) + +#define SAMG53 ( \ + SAM_PART_IS_DEFINED(SAMG53G19) ||\ + SAM_PART_IS_DEFINED(SAMG53N19) \ + ) + +#define SAMG54 ( \ + SAM_PART_IS_DEFINED(SAMG54G19) ||\ + SAM_PART_IS_DEFINED(SAMG54J19) ||\ + SAM_PART_IS_DEFINED(SAMG54N19) \ + ) + +#define SAMG55 ( \ + SAM_PART_IS_DEFINED(SAMG55G18) ||\ + SAM_PART_IS_DEFINED(SAMG55G19) ||\ + SAM_PART_IS_DEFINED(SAMG55J18) ||\ + SAM_PART_IS_DEFINED(SAMG55J19) ||\ + SAM_PART_IS_DEFINED(SAMG55N19) \ + ) +/** @} */ +/** + * \name SAM families + * @{ + */ +/** SAM3S Family */ +#define SAM3S (SAM3S1 || SAM3S2 || SAM3S4 || SAM3S8 || SAM3SD8) + +/** SAM3U Family */ +#define SAM3U (SAM3U1 || SAM3U2 || SAM3U4) + +/** SAM3N Family */ +#define SAM3N (SAM3N00 || SAM3N0 || SAM3N1 || SAM3N2 || SAM3N4) + +/** SAM3XA Family */ +#define SAM3XA (SAM3X4 || SAM3X8 || SAM3A4 || SAM3A8) + +/** SAM4S Family */ +#define SAM4S (SAM4S2 || SAM4S4 || SAM4S8 || SAM4S16 || SAM4SA16 || SAM4SD16 || SAM4SD32) + +/** SAM4L Family */ +#define SAM4L (SAM4LS || SAM4LC) + +/** SAMD20 Family */ +#define SAMD20 (SAMD20J || SAMD20G || SAMD20E) + +/** SAMD21 Family */ +#define SAMD21 (SAMD21J || SAMD21G || SAMD21E) + +/** SAMD10 Family */ +#define SAMD10 (SAMD10C || SAMD10DS || SAMD10DM) + +/** SAMD11 Family */ +#define SAMD11 (SAMD11C || SAMD11DS || SAMD11DM) + +/** SAMD Family */ +#define SAMD (SAMD20 || SAMD21 || SAMD10 || SAMD11) + +/** SAMR21 Family */ +#define SAMR21 (SAMR21G || SAMR21E) + +/** SAML21 Family */ +#define SAML21 (SAML21J || SAML21G || SAML21E) + +/** SAM4E Family */ +#define SAM4E (SAM4E8 || SAM4E16) + +/** SAM4N Family */ +#define SAM4N (SAM4N8 || SAM4N16) + +/** SAM4C Family */ +#define SAM4C_0 (SAM4C8_0 || SAM4C16_0 || SAM4C32_0) +#define SAM4C_1 (SAM4C8_1 || SAM4C16_1 || SAM4C32_1) +#define SAM4C (SAM4C8 || SAM4C16 || SAM4C32) + +/** SAM4CM Family */ +#define SAM4CM_0 (SAM4CMP8_0 || SAM4CMP16_0 || SAM4CMP32_0 || SAM4CMS8_0 || \ + SAM4CMS16_0 || SAM4CMS32_0) +#define SAM4CM_1 (SAM4CMP8_1 || SAM4CMP16_1 || SAM4CMP32_1 || SAM4CMS8_1 || \ + SAM4CMS16_1 || SAM4CMS32_1) +#define SAM4CM (SAM4CMP8 || SAM4CMP16 || SAM4CMP32 || SAM4CMS8 || \ + SAM4CMS16 || SAM4CMS32) + +/** SAM4CP Family */ +#define SAM4CP_0 (SAM4CP16_0) +#define SAM4CP_1 (SAM4CP16_1) +#define SAM4CP (SAM4CP16) + +/** SAMG Family */ +#define SAMG (SAMG51 || SAMG53 || SAMG54 || SAMG55) + +/** SAM0 product line (cortex-m0+) */ +#define SAM0 (SAMD20 || SAMD21 || SAMR21 || SAMD10 || SAMD11 || SAML21) + +/** @} */ + +/** SAM product line */ +#define SAM (SAM3S || SAM3U || SAM3N || SAM3XA || SAM4S || SAM4L || SAM4E || \ + SAM0 || SAM4N || SAM4C || SAM4CM || SAM4CP || SAMG) + +/** @} */ + +/** @} */ + +/** @} */ + +#endif /* ATMEL_PARTS_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/boards/xmega_a3bu_xplained/init.c b/AVR Code/USB_BULK_TEST/src/ASF/xmega/boards/xmega_a3bu_xplained/init.c new file mode 100644 index 00000000..571692ee --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/boards/xmega_a3bu_xplained/init.c @@ -0,0 +1,163 @@ +/** + * \file + * + * \brief XMEGA-A3BU Xplained board init. + * + * This file contains board initialization function. + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#include +#include +#include + +/** + * \addtogroup xmega_a3bu_xplained_group + * @{ + */ + +void board_init(void) +{ + ioport_configure_pin(LED0_GPIO, IOPORT_DIR_OUTPUT | IOPORT_INIT_HIGH); + ioport_configure_pin(LED1_GPIO, IOPORT_DIR_OUTPUT | IOPORT_INIT_HIGH); + ioport_configure_pin(LED2_GPIO, IOPORT_DIR_OUTPUT | IOPORT_INIT_HIGH); + ioport_configure_pin(LED3_GPIO, IOPORT_DIR_OUTPUT | IOPORT_INIT_LOW + | IOPORT_INV_ENABLED); + + ioport_configure_pin(GPIO_PUSH_BUTTON_0, IOPORT_DIR_INPUT + | IOPORT_LEVEL | IOPORT_PULL_UP); + ioport_configure_pin(GPIO_PUSH_BUTTON_1, IOPORT_DIR_INPUT + | IOPORT_LEVEL | IOPORT_PULL_UP); + ioport_configure_pin(GPIO_PUSH_BUTTON_2, IOPORT_DIR_INPUT + | IOPORT_LEVEL | IOPORT_PULL_UP); + +#ifdef CONF_BOARD_C12832A1Z + ioport_configure_pin(NHD_C12832A1Z_SPI_SCK, IOPORT_DIR_OUTPUT + | IOPORT_INIT_HIGH); + ioport_configure_pin(NHD_C12832A1Z_SPI_MOSI, IOPORT_DIR_OUTPUT + | IOPORT_INIT_HIGH); + ioport_configure_pin(NHD_C12832A1Z_CSN, IOPORT_DIR_OUTPUT + | IOPORT_INIT_HIGH); + ioport_configure_pin(NHD_C12832A1Z_REGISTER_SELECT, IOPORT_DIR_OUTPUT + | IOPORT_INIT_HIGH); + ioport_configure_pin(NHD_C12832A1Z_RESETN, IOPORT_DIR_OUTPUT + | IOPORT_INIT_HIGH); + ioport_configure_pin(NHD_C12832A1Z_BACKLIGHT, IOPORT_DIR_OUTPUT + | IOPORT_INIT_LOW); +#endif + +#ifdef CONF_BOARD_AT45DBX + ioport_configure_pin(AT45DBX_MASTER_SCK, IOPORT_DIR_OUTPUT + | IOPORT_INIT_HIGH); + ioport_configure_pin(AT45DBX_MASTER_MOSI, IOPORT_DIR_OUTPUT + | IOPORT_INIT_HIGH); + ioport_configure_pin(AT45DBX_MASTER_MISO, IOPORT_DIR_INPUT); + ioport_configure_pin(AT45DBX_CS, IOPORT_DIR_OUTPUT | IOPORT_INIT_HIGH); +#endif + +#ifdef CONF_BOARD_ENABLE_MXT143E_XPLAINED + ioport_configure_pin(MXT143E_XPLAINED_SCK, IOPORT_DIR_OUTPUT + | IOPORT_INIT_HIGH); + ioport_configure_pin(MXT143E_XPLAINED_MOSI, IOPORT_DIR_OUTPUT + | IOPORT_INIT_HIGH); + ioport_configure_pin(MXT143E_XPLAINED_MISO, IOPORT_DIR_INPUT); + ioport_configure_pin(MXT143E_XPLAINED_CS, IOPORT_DIR_OUTPUT + | IOPORT_INIT_HIGH); + ioport_configure_pin(MXT143E_XPLAINED_CHG, IOPORT_DIR_INPUT); + ioport_configure_pin(MXT143E_XPLAINED_DC, IOPORT_DIR_OUTPUT + | IOPORT_INIT_LOW); + #ifndef MXT143E_XPLAINED_BACKLIGHT_DISABLE + ioport_configure_pin(MXT143E_XPLAINED_BACKLIGHT, IOPORT_DIR_OUTPUT + | IOPORT_INIT_LOW); + #endif + ioport_configure_pin(MXT143E_XPLAINED_LCD_RESET, IOPORT_DIR_OUTPUT + | IOPORT_INIT_LOW); +#endif + +#ifdef CONF_BOARD_ENABLE_AC_PINS + ioport_configure_pin(IOPORT_CREATE_PIN(PORTA, 0), IOPORT_DIR_INPUT); + ioport_configure_pin(IOPORT_CREATE_PIN(PORTA, 2), IOPORT_DIR_INPUT); + ioport_configure_pin(IOPORT_CREATE_PIN(PORTB, 1), IOPORT_DIR_INPUT); +#endif + +#ifdef CONF_BOARD_ENABLE_USARTC0 + ioport_configure_pin(IOPORT_CREATE_PIN(PORTC, 3), IOPORT_DIR_OUTPUT + | IOPORT_INIT_HIGH); + ioport_configure_pin(IOPORT_CREATE_PIN(PORTC, 2), IOPORT_DIR_INPUT); +#endif + +#ifdef CONF_BOARD_ENABLE_USARTD0 + ioport_configure_pin(IOPORT_CREATE_PIN(PORTD, 3), IOPORT_DIR_OUTPUT + | IOPORT_INIT_HIGH); + ioport_configure_pin(IOPORT_CREATE_PIN(PORTD, 2), IOPORT_DIR_INPUT); +#endif + +#ifdef CONF_BOARD_ENABLE_USARTE0 + ioport_configure_pin(IOPORT_CREATE_PIN(PORTE, 3), IOPORT_DIR_OUTPUT + | IOPORT_INIT_HIGH); + ioport_configure_pin(IOPORT_CREATE_PIN(PORTE, 2), IOPORT_DIR_INPUT); +#endif + +#if defined (SENSORS_XPLAINED_BOARD) + /* Configure the Xplained Sensor extension board, if any, after + * the platform Xplained board has configured basic clock settings, + * GPIO pin mapping, interrupt controller options, etc. + */ + sensor_board_init (); +#endif + +#ifdef CONF_BOARD_AT86RFX + ioport_configure_pin(AT86RFX_SPI_SCK, IOPORT_DIR_OUTPUT + | IOPORT_INIT_HIGH); + ioport_configure_pin(AT86RFX_SPI_MOSI, IOPORT_DIR_OUTPUT + | IOPORT_INIT_HIGH); + ioport_configure_pin(AT86RFX_SPI_MISO, IOPORT_DIR_INPUT); + ioport_configure_pin(AT86RFX_SPI_CS, IOPORT_DIR_OUTPUT | IOPORT_INIT_HIGH); + + /* Initialize TRX_RST and SLP_TR as GPIO. */ + ioport_configure_pin(AT86RFX_RST_PIN, IOPORT_DIR_OUTPUT | IOPORT_INIT_HIGH); + ioport_configure_pin(AT86RFX_SLP_PIN, IOPORT_DIR_OUTPUT | IOPORT_INIT_HIGH); +#endif +} + +/** + * @} + */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/boards/xmega_a3bu_xplained/led.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/boards/xmega_a3bu_xplained/led.h new file mode 100644 index 00000000..702e895f --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/boards/xmega_a3bu_xplained/led.h @@ -0,0 +1,83 @@ +/** + * \file + * + * \brief XMEGA-A3BU board LEDs support package. + * + * This file contains definitions and services related to the LED features of + * the XMEGA-A3BU Xplained board. + * + * To use this board, define BOARD=XMEGA_A3BU_XPLAINED. + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef _LED_H_ +#define _LED_H_ + +#include "gpio.h" + +/** + * \brief Turns off the specified LEDs. + * + * \param led_gpio LED to turn off (LEDx_GPIO). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +#define LED_Off(led_gpio) gpio_set_pin_high(led_gpio) + +/** + * \brief Turns on the specified LEDs. + * + * \param led_gpio LED to turn on (LEDx_GPIO). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +#define LED_On(led_gpio) gpio_set_pin_low(led_gpio) + +/** + * \brief Toggles the specified LEDs. + * + * \param led_gpio LED to toggle (LEDx_GPIO). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +#define LED_Toggle(led_gpio) gpio_toggle_pin(led_gpio) + +#endif /* _LED_H_ */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h new file mode 100644 index 00000000..e8165188 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/boards/xmega_a3bu_xplained/xmega_a3bu_xplained.h @@ -0,0 +1,417 @@ +/** + * \file + * + * \brief XMEGA-A3BU-XPLAINED board header file. + * + * This file contains definitions and services related to the features of the + * XMEGA-A3BU Xplained board. + * + * To use this board define BOARD=XMEGA_A3BU_XPLAINED. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef _XMEGA_A3BU_XPLAINED_H_ +#define _XMEGA_A3BU_XPLAINED_H_ + +#include + +#define MCU_SOC_NAME "ATxmega256A3BU" +#define BOARD_NAME "XMEGA-A3BU-XPLAINED" +/** + * \defgroup xmega_a3bu_xplained_group XMEGA-A3BU Xplained board + * @{ + */ + +/** + * \defgroup xmega_a3bu_xplained_feature_group Feature definitions + * @{ + */ + +//! \name Miscellaneous data +//@{ +//! Validate board support for the common sensor service. +#define COMMON_SENSOR_PLATFORM +//@} + +/** + * \name LEDs + * + * LED0 and LED1 are single yellow LEDs that are active low.. + * LED2 and LED3 are inside one package (Led red and green close + * to USB connector) but can be controlled individually. + * LED2 has a red color and is active low. This LED can be + * used for general purposes. + * LED3 has a green color and is active high. By default this + * LED is on since it shall indicate that power is applied to the + * board. By pulling the gate of a N-FET low it is possible to + * turn off the LED if needed. + */ +//@{ +#define LED0_GPIO IOPORT_CREATE_PIN(PORTR, 0) +#define LED1_GPIO IOPORT_CREATE_PIN(PORTR, 1) +#define LED2_GPIO IOPORT_CREATE_PIN(PORTD, 4) +#define LED3_GPIO IOPORT_CREATE_PIN(PORTD, 5) +#define LED0 LED0_GPIO +#define LED1 LED1_GPIO +#define LED2 LED2_GPIO +#define LED3 LED3_GPIO +//! Number of LEDs. +#define LED_COUNT 4 +//@} + +//! \name Push buttons +//@{ +#define GPIO_PUSH_BUTTON_0 IOPORT_CREATE_PIN(PORTE, 5) +#define GPIO_PUSH_BUTTON_1 IOPORT_CREATE_PIN(PORTF, 1) +#define GPIO_PUSH_BUTTON_2 IOPORT_CREATE_PIN(PORTF, 2) +//@} + +//! \name QTouch button +//! This button requires the software QTouch library +//@{ +#define QTOUCH_BUTTON_SNS IOPORT_CREATE_PIN(PORTF, 6) +#define QTOUCH_BUTTON_SNSK IOPORT_CREATE_PIN(PORTF, 7) +//@} + +//! \name Light sensor +//@{ +#define LIGHT_SENSOR_ADC_MODULE ADCA +#define LIGHT_SENSOR_ADC_INPUT ADCCH_POS_PIN0 +#define LIGHT_SENSOR_SIGNAL_PIN IOPORT_CREATE_PIN(PORTA, 0) +//@} + +//! \name Temperature sensor (NTC) +//@{ +#define TEMPERATURE_SENSOR_ADC_MODULE ADCA +#define TEMPERATURE_SENSOR_ADC_INPUT ADCCH_POS_PIN1 +#define TEMPERATURE_SENSOR_SIGNAL_PIN IOPORT_CREATE_PIN(PORTA, 1) +//@} + +//! \name Analog filter (lowpass RC @ 159 Hz) +//@{ +#define FILTER_INPUT_SIGNAL_PIN IOPORT_CREATE_PIN(PORTF, 0) +#define FILTER_OUTPUT_ADC_MODULE ADCA +#define FILTER_OUTPUT_ADC_INPUT ADCCH_POS_PIN2 +#define FILTER_OUTPUT_SIGNAL_PIN IOPORT_CREATE_PIN(PORTA, 2) +//@} + +//! \name LCD backlight +//@{ +#define LCD_BACKLIGHT_ENABLE_PIN IOPORT_CREATE_PIN(PORTE, 4) +#define LCD_BACKLIGHT_ENABLE_LEVEL true +//@} + +//! \name LCD controller (NHD-C12832A1Z-FSW-FBW-3V3) +//@{ +#define NHD_C12832A1Z_SPI &USARTD0 +#define NHD_C12832A1Z_SPI_SCK IOPORT_CREATE_PIN(PORTD, 1) +#define NHD_C12832A1Z_SPI_MOSI IOPORT_CREATE_PIN(PORTD, 3) +#define NHD_C12832A1Z_CSN IOPORT_CREATE_PIN(PORTF, 3) +//! If this signal is set high display data is sent otherwise commands +#define NHD_C12832A1Z_REGISTER_SELECT IOPORT_CREATE_PIN(PORTD, 0) +#define NHD_C12832A1Z_RESETN IOPORT_CREATE_PIN(PORTA, 3) +//! The backlight is active high +#define NHD_C12832A1Z_BACKLIGHT IOPORT_CREATE_PIN(PORTE, 4) +//@} + +//! \name LCD dimensions +//@{ +#define LCD_WIDTH_PIXELS (128) +#define LCD_HEIGHT_PIXELS (32) +//@} + +//! \name DataFlash memory (AT45DBX) +//@{ +#define AT45DBX_SPI &USARTD0 +#define AT45DBX_CS IOPORT_CREATE_PIN(PORTF, 4) +//! SCK pin +#define AT45DBX_MASTER_SCK IOPORT_CREATE_PIN(PORTD, 1) +//! MOSI pin +#define AT45DBX_MASTER_MOSI IOPORT_CREATE_PIN(PORTD, 3) +//! MISO pin +#define AT45DBX_MASTER_MISO IOPORT_CREATE_PIN(PORTD, 2) +//@} + +//! \name MXT143E Xplained top module +//@{ +#define MXT143E_XPLAINED_TWI &TWIC +#define MXT143E_XPLAINED_USART_SPI &USARTC1 +#define MXT143E_XPLAINED_CS IOPORT_CREATE_PIN(PORTC, 4) +#define MXT143E_XPLAINED_SCK IOPORT_CREATE_PIN(PORTC, 7) +#define MXT143E_XPLAINED_MOSI IOPORT_CREATE_PIN(PORTC, 5) +#define MXT143E_XPLAINED_MISO IOPORT_CREATE_PIN(PORTC, 6) +#define MXT143E_XPLAINED_CHG IOPORT_CREATE_PIN(PORTC, 2) +#define MXT143E_XPLAINED_DC IOPORT_CREATE_PIN(PORTC, 3) +#define MXT143E_XPLAINED_BACKLIGHT IOPORT_CREATE_PIN(PORTA, 4) +#define MXT143E_XPLAINED_LCD_RESET IOPORT_CREATE_PIN(PORTA, 6) +//@} + +/** + * \name External oscillator + * + * \todo Need to measure the actual startup time on the hardware. + */ +//@{ +#define BOARD_XOSC_HZ 32768 +#define BOARD_XOSC_TYPE XOSC_TYPE_32KHZ +#define BOARD_XOSC_STARTUP_US 1000000 +//@} + +//! \name Communication interfaces on header J1 +//@{ +#define TWIC_SDA IOPORT_CREATE_PIN(PORTC, 0) +#define TWIC_SCL IOPORT_CREATE_PIN(PORTC, 1) +#define USARTC0_RXD IOPORT_CREATE_PIN(PORTC, 2) +#define USARTC0_TXD IOPORT_CREATE_PIN(PORTC, 3) +#define SPIC_SS IOPORT_CREATE_PIN(PORTC, 4) +#define SPIC_MOSI IOPORT_CREATE_PIN(PORTC, 5) +#define SPIC_MISO IOPORT_CREATE_PIN(PORTC, 6) +#define SPIC_SCK IOPORT_CREATE_PIN(PORTC, 7) +//@} + + +/*! \name Connections of the AT86RFX transceiver + */ +//! @{ +#define AT86RFX_SPI &SPIC +#define AT86RFX_RST_PIN IOPORT_CREATE_PIN(PORTC, 0) +#define AT86RFX_MISC_PIN IOPORT_CREATE_PIN(PORTC, 1) +#define AT86RFX_IRQ_PIN IOPORT_CREATE_PIN(PORTC, 2) +#define AT86RFX_SLP_PIN IOPORT_CREATE_PIN(PORTC, 3) +#define AT86RFX_SPI_CS IOPORT_CREATE_PIN(PORTC, 4) +#define AT86RFX_SPI_MOSI IOPORT_CREATE_PIN(PORTC, 5) +#define AT86RFX_SPI_MISO IOPORT_CREATE_PIN(PORTC, 6) +#define AT86RFX_SPI_SCK IOPORT_CREATE_PIN(PORTC, 7) + +#define AT86RFX_INTC_INIT() ioport_configure_pin(AT86RFX_IRQ_PIN, IOPORT_DIR_INPUT); \ + PORTC.PIN2CTRL = PORT_ISC0_bm; \ + PORTC.INT0MASK = PIN2_bm; \ + PORTC.INTFLAGS = PORT_INT0IF_bm; + +#define AT86RFX_ISR() ISR(PORTC_INT0_vect) + +/** Enables the transceiver main interrupt. */ +#define ENABLE_TRX_IRQ() (PORTC.INTCTRL |= PORT_INT0LVL_gm) + +/** Disables the transceiver main interrupt. */ +#define DISABLE_TRX_IRQ() (PORTC.INTCTRL &= ~PORT_INT0LVL_gm) + +/** Clears the transceiver main interrupt. */ +#define CLEAR_TRX_IRQ() (PORTC.INTFLAGS = PORT_INT0IF_bm) + +/* + * This macro saves the trx interrupt status and disables the trx interrupt. + */ +#define ENTER_TRX_REGION() { uint8_t irq_mask = PORTC.INTCTRL; PORTC.INTCTRL &= ~PORT_INT0LVL_gm + +/* + * This macro restores the transceiver interrupt status + */ +#define LEAVE_TRX_REGION() PORTC.INTCTRL = irq_mask; } + +//! @} + + +/** + * \name Pin connections on header J1 + * + * The whole port C is directly connected to J1. + * + * \note For the TWI lines there are footprints for pull up resistors, which + * are by default not mounted on the board. + */ +//@{ +#define J1_PIN0 IOPORT_CREATE_PIN(PORTC, 0) +#define J1_PIN1 IOPORT_CREATE_PIN(PORTC, 1) +#define J1_PIN2 IOPORT_CREATE_PIN(PORTC, 2) +#define J1_PIN3 IOPORT_CREATE_PIN(PORTC, 3) +#define J1_PIN4 IOPORT_CREATE_PIN(PORTC, 4) +#define J1_PIN5 IOPORT_CREATE_PIN(PORTC, 5) +#define J1_PIN6 IOPORT_CREATE_PIN(PORTC, 6) +#define J1_PIN7 IOPORT_CREATE_PIN(PORTC, 7) +//@} + +/** + * \name Pin connections on header J2 + * + * The lower half of port B is connected to the lower pins of J2 while the + * upper half of port A is connected to the upper pins of J2. + * + * The port pins are connected directly to this header and are not shared with + * any on-board functionality. + */ +//@{ +#define J2_PIN0 IOPORT_CREATE_PIN(PORTB, 0) +#define J2_PIN1 IOPORT_CREATE_PIN(PORTB, 1) +#define J2_PIN2 IOPORT_CREATE_PIN(PORTB, 2) +#define J2_PIN3 IOPORT_CREATE_PIN(PORTB, 3) +#define J2_PIN4 IOPORT_CREATE_PIN(PORTA, 4) +#define J2_PIN5 IOPORT_CREATE_PIN(PORTA, 5) +#define J2_PIN6 IOPORT_CREATE_PIN(PORTA, 6) +#define J2_PIN7 IOPORT_CREATE_PIN(PORTA, 7) +//@} + +/** + * \name Pin connections on header J3 + * + * The lower half of port A is connected to the lower pins of J3 while the + * upper half of port B is connected to the upper pins of J3. + * + * Following pins are shared with on-board functionality: + * - J3_PIN0 Light sensor output (can be disconnected via scratch pad) + * - J3_PIN1 NTC sensor output (can be disconnected via scratch pad) + * - J3_PIN2 Filter output (can be disconnected via scratch pad) + * - J3_PIN3 Display reset input (can't be used when display is in use) + * - J3_PIN4 JTAG TMS (pin can't be used while JTAG device connected) + * - J3_PIN5 JTAG TDI (pin can't be used while JTAG device connected) + * - J3_PIN6 JTAG TCK (pin can't be used while JTAG device connected) + * - J3_PIN7 JTAG TDO & PID DATA (pin can't be used while JTAG/PDI device is + * connected) + */ +//@{ +#define J3_PIN0 IOPORT_CREATE_PIN(PORTA, 0) +#define J3_PIN1 IOPORT_CREATE_PIN(PORTA, 1) +#define J3_PIN2 IOPORT_CREATE_PIN(PORTA, 2) +#define J3_PIN3 IOPORT_CREATE_PIN(PORTA, 3) +#define J3_PIN4 IOPORT_CREATE_PIN(PORTB, 4) +#define J3_PIN5 IOPORT_CREATE_PIN(PORTB, 5) +#define J3_PIN6 IOPORT_CREATE_PIN(PORTB, 6) +#define J3_PIN7 IOPORT_CREATE_PIN(PORTB, 7) +//@} + +/** + * \name Pin connections on header J4 + * + * The lower half of port E is connected to the lower pins of J4 and the lower + * half of port D is connected to the upper pins of J4. + */ +//@{ +#define J4_PIN0 IOPORT_CREATE_PIN(PORTE, 0) +#define J4_PIN1 IOPORT_CREATE_PIN(PORTE, 1) +#define J4_PIN2 IOPORT_CREATE_PIN(PORTE, 2) +#define J4_PIN3 IOPORT_CREATE_PIN(PORTE, 3) +#define J4_PIN4 IOPORT_CREATE_PIN(PORTD, 0) +#define J4_PIN5 IOPORT_CREATE_PIN(PORTD, 3) +#define J4_PIN6 IOPORT_CREATE_PIN(PORTD, 2) +#define J4_PIN7 IOPORT_CREATE_PIN(PORTD, 1) +//@} + +/** + * @} + */ + +/** + * \defgroup xmega_a3bu_xplained_config_group Configuration options + * @{ + */ + +#if defined(__DOXYGEN__) + +/** + * \name Initialization + * \note Define these symbols in \ref conf_board.h to enable the corresponding + * features. + */ +//@{ + +/** + * \def CONF_BOARD_C12832A1Z + * \brief Initialize SPI and control pins for C12832A1Z LCD controller + */ +# if !defined(CONF_BOARD_C12832A1Z) +# define CONF_BOARD_C12832A1Z +# endif + +/** + * \def CONF_BOARD_AT45DBX + * \brief Initialize SPI pins for AT45DBX DataFlash + */ +# if !defined(CONF_BOARD_AT45DBX) +# define CONF_BOARD_AT45DBX +# endif + +/** + * \def CONF_BOARD_ENABLE_AC_PINS + * \brief Initialize IO pins for Analog Comparator + * + * \note This initializes pins PA0, PA2 and PB1 as inputs. + */ +# if !defined(CONF_BOARD_ENABLE_AC_PINS) +# define CONF_BOARD_ENABLE_AC_PINS +# endif + +/** + * \def CONF_BOARD_ENABLE_USARTC0 + * \brief Initialize IO pins for USART 0 on port C + */ +# if !defined(CONF_BOARD_ENABLE_USARTC0) +# define CONF_BOARD_ENABLE_USARTC0 +# endif + +/** + * \def CONF_BOARD_ENABLE_USARTD0 + * \brief Initialize IO pins for USART 0 on port D + */ +# if !defined(CONF_BOARD_ENABLE_USARTD0) +# define CONF_BOARD_ENABLE_USARTD0 +# endif + +/** + * \def CONF_BOARD_ENABLE_USARTE0 + * \brief Initialize IO pins for USART 0 on port E + */ +# if !defined(CONF_BOARD_ENABLE_USARTE0) +# define CONF_BOARD_ENABLE_USARTE0 +# endif + +//@} + +#endif // __DOXYGEN__ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* _XMEGA_A3BU_XPLAINED_H_ */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/cpu/ccp.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/cpu/ccp.h new file mode 100644 index 00000000..1e929a4d --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/cpu/ccp.h @@ -0,0 +1,123 @@ +/** + * \file + * + * \brief Configuration Change Protection write functions + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef CPU_CCP_H +#define CPU_CCP_H +#include + +/** + * \defgroup ccp_group Configuration Change Protection + * + * See \ref xmega_ccp_quickstart. + * + * Function for writing to protected IO registers. + * @{ + */ + +#if defined(__DOXYGEN__) +//! \name IAR Memory Model defines. +//@{ + +/** + * \def CONFIG_MEMORY_MODEL_TINY + * \brief Configuration symbol to enable 8 bit pointers. + * + */ +# define CONFIG_MEMORY_MODEL_TINY + +/** + * \def CONFIG_MEMORY_MODEL_SMALL + * \brief Configuration symbol to enable 16 bit pointers. + * \note If no memory model is defined, SMALL is default. + * + */ +# define CONFIG_MEMORY_MODEL_SMALL + + +/** + * \def CONFIG_MEMORY_MODEL_LARGE + * \brief Configuration symbol to enable 24 bit pointers. + * + */ +# define CONFIG_MEMORY_MODEL_LARGE + +//@} +#endif + + +/** + * \brief Write to a CCP-protected 8-bit I/O register + * + * \param addr Address of the I/O register + * \param value Value to be written + * + * \note Using IAR Embedded workbench, the choice of memory model has an impact + * on calling convention. The memory model is not visible to the + * preprocessor, so it must be defined in the Assembler preprocessor directives. + */ +extern void ccp_write_io(void *addr, uint8_t value); + +/** @} */ + +/** + * \page xmega_ccp_quickstart Quick start guide for CCP driver + * + * This is the quick start guide for the \ref ccp_group + * "Configuration Change Protection (CCP) driver", with step-by-step + * instructions on how to use the driver. + * + * The use case contains a code fragment, and this can be copied into, e.g., + * the main application function. + * + * \section ccp_basic_use_case Basic use case + * In this use case, the CCP is used to write to the protected XMEGA Clock + * Control register. + * + * \subsection ccp_basic_use_case_setup_flow Workflow + * -# call CCP write io to change system clock selection: + * - \code ccp_write_io((uint8_t *)&CLK.CTRL, CLK_SCLKSEL_RC32M_gc); \endcode + */ + +#endif /* CPU_CCP_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/cpu/ccp.s b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/cpu/ccp.s new file mode 100644 index 00000000..91f8fb02 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/cpu/ccp.s @@ -0,0 +1,100 @@ +/** + * \file + * + * \brief Configuration Change Protection + * + * Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +#include + +//! Value to write to CCP for access to protected IO registers. +#define CCP_IOREG 0xd8 + + /* + * GNU and IAR use different calling conventions. Since this is + * a very small and simple function to begin with, it's easier + * to implement it twice than to deal with the differences + * within a single implementation. + * + * Interrupts are disabled by hardware during the timed + * sequence, so there's no need to save/restore interrupt state. + */ + + PUBLIC_FUNCTION(ccp_write_io) + +#if defined(__GNUC__) + + out RAMPZ, r1 // Reset bits 23:16 of Z + movw r30, r24 // Load addr into Z + ldi r18, CCP_IOREG // Load magic CCP value + out CCP, r18 // Start CCP handshake + st Z, r22 // Write value to I/O register + ret // Return to caller + +#elif defined(__IAR_SYSTEMS_ASM__) + +# if !defined(CONFIG_MEMORY_MODEL_TINY) && !defined(CONFIG_MEMORY_MODEL_SMALL) \ + && !defined(CONFIG_MEMORY_MODEL_LARGE) +# define CONFIG_MEMORY_MODEL_SMALL +# endif + ldi r20, 0 + out RAMPZ, r20 // Reset bits 23:16 of Z +# if defined(CONFIG_MEMORY_MODEL_TINY) + mov r31, r20 // Reset bits 8:15 of Z + mov r30, r16 // Load addr into Z +# else + movw r30, r16 // Load addr into Z +# endif + ldi r21, CCP_IOREG // Load magic CCP value + out CCP, r21 // Start CCP handshake +# if defined(CONFIG_MEMORY_MODEL_TINY) + st Z, r17 // Write value to I/O register +# elif defined(CONFIG_MEMORY_MODEL_SMALL) + st Z, r18 // Write value to I/O register +# elif defined(CONFIG_MEMORY_MODEL_LARGE) + st Z, r19 // Write value to I/O register +# else +# error Unknown memory model in use, no idea how registers should be accessed +# endif + ret +#else +# error Unknown assembler +#endif + + END_FUNC(ccp_write_io) + END_FILE() diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/cpu/xmega_reset_cause.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/cpu/xmega_reset_cause.h new file mode 100644 index 00000000..ff6840a8 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/cpu/xmega_reset_cause.h @@ -0,0 +1,108 @@ +/** + * \file + * + * \brief Chip-specific reset cause functions + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef XMEGA_DRIVERS_CPU_RESET_CAUSE_H +#define XMEGA_DRIVERS_CPU_RESET_CAUSE_H + +#include "compiler.h" +#include "ccp.h" + +/** + * \ingroup reset_cause_group + * \defgroup xmega_reset_cause_group XMEGA reset cause + * + * See \ref reset_cause_quickstart + * + * @{ + */ + +/** + * \brief Chip-specific reset cause type capable of holding all chip reset + * causes. Typically reflects the size of the reset cause register. + */ +typedef uint8_t reset_cause_t; + +//! \internal \name Chip-specific reset causes +//@{ +//! \internal External reset cause +#define CHIP_RESET_CAUSE_EXTRST RST_EXTRF_bm +//! \internal brown-out detected reset cause, same as for CPU +#define CHIP_RESET_CAUSE_BOD_IO RST_BORF_bm +//! \internal Brown-out detected reset cause, same as for I/O +#define CHIP_RESET_CAUSE_BOD_CPU RST_BORF_bm +//! \internal On-chip debug system reset cause +#define CHIP_RESET_CAUSE_OCD RST_PDIRF_bm +//! \internal Power-on-reset reset cause +#define CHIP_RESET_CAUSE_POR RST_PORF_bm +//! \internal Software reset reset cause +#define CHIP_RESET_CAUSE_SOFT RST_SRF_bm +//! \internal Spike detected reset cause +#define CHIP_RESET_CAUSE_SPIKE RST_SDRF_bm +//! \internal Watchdog timeout reset cause +#define CHIP_RESET_CAUSE_WDT RST_WDRF_bm +//@} + +static inline reset_cause_t reset_cause_get_causes(void) +{ + return (reset_cause_t)RST.STATUS; +} + +static inline void reset_cause_clear_causes(reset_cause_t causes) +{ + RST.STATUS = causes; +} + +static inline void reset_do_soft_reset(void) +{ + ccp_write_io((void *)&RST.CTRL, RST_SWRST_bm); + + while (1) { + /* Intentionally empty. */ + } +} + +//! @} + +#endif /* XMEGA_DRIVERS_CPU_RESET_CAUSE_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/nvm/nvm.c b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/nvm/nvm.c new file mode 100644 index 00000000..61455202 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/nvm/nvm.c @@ -0,0 +1,710 @@ +/** + * \file + * + * \brief Non Volatile Memory controller driver + * + * Copyright (C) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#include "compiler.h" +#include "ccp.h" +#include "nvm.h" +#include + +/** + * \weakgroup nvm_signature_group + * @{ + */ + +/** + * \brief Read the device serial + * + * This function returns the device serial stored in the device. + * + * \note This function is modifying the NVM.CMD register. + * If the application are using program space access in interrupts + * (__flash pointers in IAR EW or pgm_read_byte in GCC) interrupts + * needs to be disabled when running EEPROM access functions. If not + * the program space reads will be corrupted. + * + * \retval storage Pointer to the structure where to store the device serial + */ +void nvm_read_device_serial(struct nvm_device_serial *storage) +{ + storage->lotnum0 = nvm_read_production_signature_row( + nvm_get_production_signature_row_offset(LOTNUM0)); + storage->lotnum1 = nvm_read_production_signature_row( + nvm_get_production_signature_row_offset(LOTNUM1)); + storage->lotnum2 = nvm_read_production_signature_row( + nvm_get_production_signature_row_offset(LOTNUM2)); + storage->lotnum3 = nvm_read_production_signature_row( + nvm_get_production_signature_row_offset(LOTNUM3)); + storage->lotnum4 = nvm_read_production_signature_row( + nvm_get_production_signature_row_offset(LOTNUM4)); + storage->lotnum5 = nvm_read_production_signature_row( + nvm_get_production_signature_row_offset(LOTNUM5)); + + storage->wafnum = nvm_read_production_signature_row( + nvm_get_production_signature_row_offset(WAFNUM)); + + storage->coordx0 = nvm_read_production_signature_row( + nvm_get_production_signature_row_offset(COORDX0)); + storage->coordx1 = nvm_read_production_signature_row( + nvm_get_production_signature_row_offset(COORDX1)); + storage->coordy0 = nvm_read_production_signature_row( + nvm_get_production_signature_row_offset(COORDY0)); + storage->coordy1 = nvm_read_production_signature_row( + nvm_get_production_signature_row_offset(COORDY1)); +} + +//! @} + +/** + * \weakgroup nvm_eeprom_group + * @{ + */ + +/** + * \brief Read one byte from EEPROM using mapped access. + * + * This function reads one byte from EEPROM using mapped access. + * + * \param addr EEPROM address, between 0 and EEPROM_SIZE + * + * \return Byte value read from EEPROM. + */ +uint8_t nvm_eeprom_read_byte(eeprom_addr_t addr) +{ + uint8_t data; + Assert(addr <= EEPROM_SIZE); + + /* Wait until NVM is ready */ + nvm_wait_until_ready(); + eeprom_enable_mapping(); + data = *(uint8_t*)(addr + MAPPED_EEPROM_START), + eeprom_disable_mapping(); + return data; +} + +/** + * \brief Read buffer within the eeprom + * + * \param address the address to where to read + * \param buf pointer to the data + * \param len the number of bytes to read + */ +void nvm_eeprom_read_buffer(eeprom_addr_t address, void *buf, uint16_t len) +{ + nvm_wait_until_ready(); + eeprom_enable_mapping(); + memcpy( buf,(void*)(address+MAPPED_EEPROM_START), len ); + eeprom_disable_mapping(); +} + + +/** + * \brief Write one byte to EEPROM using IO mapping. + * + * This function writes one byte to EEPROM using IO-mapped access. + * This function will cancel all ongoing EEPROM page buffer loading + * operations, if any. + * + * \param address EEPROM address (max EEPROM_SIZE) + * \param value Byte value to write to EEPROM. + */ +void nvm_eeprom_write_byte(eeprom_addr_t address, uint8_t value) +{ + uint8_t old_cmd; + + Assert(address <= EEPROM_SIZE); + /* Flush buffer to make sure no unintentional data is written and load + * the "Page Load" command into the command register. + */ + old_cmd = NVM.CMD; + nvm_eeprom_flush_buffer(); + // Wait until NVM is ready + nvm_wait_until_ready(); + nvm_eeprom_load_byte_to_buffer(address, value); + + // Set address to write to + NVM.ADDR2 = 0x00; + NVM.ADDR1 = (address >> 8) & 0xFF; + NVM.ADDR0 = address & 0xFF; + + /* Issue EEPROM Atomic Write (Erase&Write) command. Load command, write + * the protection signature and execute command. + */ + NVM.CMD = NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc; + nvm_exec(); + NVM.CMD = old_cmd; +} + +/** + * \brief Write buffer within the eeprom + * + * \param address the address to where to write + * \param buf pointer to the data + * \param len the number of bytes to write + */ +void nvm_eeprom_erase_and_write_buffer(eeprom_addr_t address, const void *buf, uint16_t len) +{ + while (len) { + if (((address%EEPROM_PAGE_SIZE)==0) && (len>=EEPROM_PAGE_SIZE)) { + // A full page can be written + nvm_eeprom_load_page_to_buffer((uint8_t*)buf); + nvm_eeprom_atomic_write_page(address/EEPROM_PAGE_SIZE); + address += EEPROM_PAGE_SIZE; + buf = (uint8_t*)buf + EEPROM_PAGE_SIZE; + len -= EEPROM_PAGE_SIZE; + } else { + nvm_eeprom_write_byte(address++, *(uint8_t*)buf); + buf = (uint8_t*)buf + 1; + len--; + } + } +} + + +/** + * \brief Flush temporary EEPROM page buffer. + * + * This function flushes the EEPROM page buffers. This function will cancel + * any ongoing EEPROM page buffer loading operations, if any. + * This function also works for memory mapped EEPROM access. + * + * \note An EEPROM write operations will automatically flush the buffer for you. + * \note The function does not preserve the value of the NVM.CMD register + */ +void nvm_eeprom_flush_buffer(void) +{ + // Wait until NVM is ready + nvm_wait_until_ready(); + + // Flush EEPROM page buffer if necessary + if ((NVM.STATUS & NVM_EELOAD_bm) != 0) { + NVM.CMD = NVM_CMD_ERASE_EEPROM_BUFFER_gc; + nvm_exec(); + } +} + +/** + * \brief Load single byte into temporary page buffer. + * + * This function loads one byte into the temporary EEPROM page buffers. + * If memory mapped EEPROM is enabled, this function will not work. + * Make sure that the buffer is flushed before starting to load bytes. + * Also, if multiple bytes are loaded into the same location, they will + * be ANDed together, thus 0x55 and 0xAA will result in 0x00 in the buffer. + * + * \note Only one page buffer exist, thus only one page can be loaded with + * data and programmed into one page. If data needs to be written to + * different pages, the loading and writing needs to be repeated. + * + * \param byte_addr EEPROM Byte address, between 0 and EEPROM_PAGE_SIZE. + * \param value Byte value to write to buffer. + */ +void nvm_eeprom_load_byte_to_buffer(uint8_t byte_addr, uint8_t value) +{ + // Wait until NVM is ready + nvm_wait_until_ready(); + + eeprom_enable_mapping(); + *(uint8_t*)(byte_addr + MAPPED_EEPROM_START) = value; + eeprom_disable_mapping(); +} + + +/** + * \brief Load entire page into temporary EEPROM page buffer. + * + * This function loads an entire EEPROM page from an SRAM buffer to + * the EEPROM page buffers. If memory mapped EEPROM is enabled, this + * function will not work. Make sure that the buffer is flushed before + * starting to load bytes. + * + * \note Only the lower part of the address is used to address the buffer. + * Therefore, no address parameter is needed. In the end, the data + * is written to the EEPROM page given by the address parameter to the + * EEPROM write page operation. + * + * \param values Pointer to SRAM buffer containing an entire page. + */ +void nvm_eeprom_load_page_to_buffer(const uint8_t *values) +{ + // Wait until NVM is ready + nvm_wait_until_ready(); + + // Load multiple bytes into page buffer + uint8_t i; + for (i = 0; i < EEPROM_PAGE_SIZE; ++i) { + nvm_eeprom_load_byte_to_buffer(i, *values); + ++values; + } +} + +/** + * \brief Erase and write bytes from page buffer into EEPROM. + * + * This function writes the contents of an already loaded EEPROM page + * buffer into EEPROM memory. + * + * As this is an atomic write, the page in EEPROM will be erased + * automatically before writing. Note that only the page buffer locations + * that have been loaded will be used when writing to EEPROM. Page buffer + * locations that have not been loaded will be left untouched in EEPROM. + * + * \param page_addr EEPROM Page address, between 0 and EEPROM_SIZE/EEPROM_PAGE_SIZE + */ +void nvm_eeprom_atomic_write_page(uint8_t page_addr) +{ + // Wait until NVM is ready + nvm_wait_until_ready(); + + // Calculate page address + uint16_t address = (uint16_t)(page_addr * EEPROM_PAGE_SIZE); + + Assert(address <= EEPROM_SIZE); + + // Set address + NVM.ADDR2 = 0x00; + NVM.ADDR1 = (address >> 8) & 0xFF; + NVM.ADDR0 = address & 0xFF; + + // Issue EEPROM Atomic Write (Erase&Write) command + nvm_issue_command(NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc); +} + +/** + * \brief Write (without erasing) EEPROM page. + * + * This function writes the contents of an already loaded EEPROM page + * buffer into EEPROM memory. + * + * As this is a split write, the page in EEPROM will _not_ be erased + * before writing. + * + * \param page_addr EEPROM Page address, between 0 and EEPROM_SIZE/EEPROM_PAGE_SIZE + */ +void nvm_eeprom_split_write_page(uint8_t page_addr) +{ + // Wait until NVM is ready + nvm_wait_until_ready(); + + // Calculate page address + uint16_t address = (uint16_t)(page_addr * EEPROM_PAGE_SIZE); + + Assert(address <= EEPROM_SIZE); + + // Set address + NVM.ADDR2 = 0x00; + NVM.ADDR1 = (address >> 8) & 0xFF; + NVM.ADDR0 = address & 0xFF; + + // Issue EEPROM Split Write command + nvm_issue_command(NVM_CMD_WRITE_EEPROM_PAGE_gc); +} + +/** + * \brief Fill temporary EEPROM page buffer with value. + * + * This fills the the EEPROM page buffers with a given value. + * If memory mapped EEPROM is enabled, this function will not work. + * + * \note Only the lower part of the address is used to address the buffer. + * Therefore, no address parameter is needed. In the end, the data + * is written to the EEPROM page given by the address parameter to the + * EEPROM write page operation. + * + * \param value Value to copy to the page buffer. + */ +void nvm_eeprom_fill_buffer_with_value(uint8_t value) +{ + nvm_eeprom_flush_buffer(); + // Wait until NVM is ready + nvm_wait_until_ready(); + // Load multiple bytes into page buffer + uint8_t i; + for (i = 0; i < EEPROM_PAGE_SIZE; ++i) { + nvm_eeprom_load_byte_to_buffer(i, value); + } +} + +/** + * \brief Erase bytes from EEPROM page. + * + * This function erases bytes from one EEPROM page, so that every location + * written to in the page buffer reads 0xFF. + * + * \param page_addr EEPROM Page address, between 0 and EEPROM_SIZE/EEPROM_PAGE_SIZE + */ +void nvm_eeprom_erase_bytes_in_page(uint8_t page_addr) +{ + // Wait until NVM is ready + nvm_wait_until_ready(); + + // Calculate page address + uint16_t address = (uint16_t)(page_addr * EEPROM_PAGE_SIZE); + + Assert(address <= EEPROM_SIZE); + + // Set address + NVM.ADDR2 = 0x00; + NVM.ADDR1 = (address >> 8) & 0xFF; + NVM.ADDR0 = address & 0xFF; + + // Issue EEPROM Erase command + nvm_issue_command(NVM_CMD_ERASE_EEPROM_PAGE_gc); +} + +/** + * \brief Erase EEPROM page. + * + * This function erases one EEPROM page, so that every location reads 0xFF. + * + * \param page_addr EEPROM Page address, between 0 and EEPROM_SIZE/EEPROM_PAGE_SIZE + */ +void nvm_eeprom_erase_page(uint8_t page_addr) +{ + // Mark all addresses to be deleted + nvm_eeprom_fill_buffer_with_value(0xff); + // Erase bytes + nvm_eeprom_erase_bytes_in_page(page_addr); +} + + +/** + * \brief Erase bytes from all EEPROM pages. + * + * This function erases bytes from all EEPROM pages, so that every location + * written to in the page buffer reads 0xFF. + */ +void nvm_eeprom_erase_bytes_in_all_pages(void) +{ + // Wait until NVM is ready + nvm_wait_until_ready(); + + // Issue EEPROM Erase All command + nvm_issue_command(NVM_CMD_ERASE_EEPROM_gc); +} + +/** + * \brief Erase entire EEPROM memory. + * + * This function erases the entire EEPROM memory block to 0xFF. + */ +void nvm_eeprom_erase_all(void) +{ + // Mark all addresses to be deleted + nvm_eeprom_fill_buffer_with_value(0xff); + // Erase all pages + nvm_eeprom_erase_bytes_in_all_pages(); +} + +//! @} + + +//! @} + + +/** + * \weakgroup nvm_flash_group + * @{ + */ + +/** + * \brief Issue flash range CRC command + * + * This function sets the FLASH range CRC command in the NVM.CMD register. + * It then loads the start and end byte address of the part of FLASH to + * generate a CRC-32 for into the ADDR and DATA registers and finally performs + * the execute command. + * + * \note Should only be called from the CRC module. The function saves and + * restores the NVM.CMD register, but if this + * function is called from an interrupt, interrupts must be disabled + * before this function is called. + * + * \param start_addr end byte address + * \param end_addr start byte address + */ +void nvm_issue_flash_range_crc(flash_addr_t start_addr, flash_addr_t end_addr) +{ + uint8_t old_cmd; + // Save current nvm command + old_cmd = NVM.CMD; + + // Load the NVM CMD register with the Flash Range CRC command + NVM.CMD = NVM_CMD_FLASH_RANGE_CRC_gc; + + // Load the start byte address in the NVM Address Register + NVM.ADDR0 = start_addr & 0xFF; + NVM.ADDR1 = (start_addr >> 8) & 0xFF; +#if (FLASH_SIZE >= 0x10000UL) + NVM.ADDR2 = (start_addr >> 16) & 0xFF; +#endif + + // Load the end byte address in NVM Data Register + NVM.DATA0 = end_addr & 0xFF; + NVM.DATA1 = (end_addr >> 8) & 0xFF; +#if (FLASH_SIZE >= 0x10000UL) + NVM.DATA2 = (end_addr >> 16) & 0xFF; +#endif + + // Execute command + ccp_write_io((uint8_t *)&NVM.CTRLA, NVM_CMDEX_bm); + + // Restore command register + NVM.CMD = old_cmd; +} + +/** + * \brief Read buffer within the application section + * + * \param address the address to where to read + * \param buf pointer to the data + * \param len the number of bytes to read + */ +void nvm_flash_read_buffer(flash_addr_t address, void *buf, uint16_t len) +{ +#if (FLASH_SIZE>0x10000) + uint32_t opt_address = address; +#else + uint16_t opt_address = (uint16_t)address; +#endif + nvm_wait_until_ready(); + while ( len ) { + *(uint8_t*)buf = nvm_flash_read_byte(opt_address); + buf=(uint8_t*)buf+1; + opt_address++; + len--; + } +} + +/** + * \brief Read buffer within the user section + * + * \param address the address to where to read + * \param buf pointer to the data + * \param len the number of bytes to read + */ +void nvm_user_sig_read_buffer(flash_addr_t address, void *buf, uint16_t len) +{ + uint16_t opt_address = (uint16_t)address&(FLASH_PAGE_SIZE-1); + while ( len ) { + *(uint8_t*)buf = nvm_read_user_signature_row(opt_address); + buf=(uint8_t*)buf+1; + opt_address++; + len--; + } +} + +/** + * \brief Write specific parts of user flash section + * + * \param address the address to where to write + * \param buf pointer to the data + * \param len the number of bytes to write + * \param b_blank_check if True then the page flash is checked before write + * to run or not the erase page command. + * + * Set b_blank_check to false if all application flash is erased before. + */ +void nvm_user_sig_write_buffer(flash_addr_t address, const void *buf, + uint16_t len, bool b_blank_check) +{ + uint16_t w_value; + uint16_t page_pos; + uint16_t opt_address = (uint16_t)address; + bool b_flag_erase = false; + + while ( len ) { + for (page_pos=0; page_pos0x10000) + uint32_t page_address; + uint32_t opt_address = address; +#else + uint16_t page_address; + uint16_t opt_address = (uint16_t)address; +#endif + + // Compute the start of the page to be modified + page_address = opt_address-(opt_address%FLASH_PAGE_SIZE); + + // For each page + while ( len ) { + b_flag_erase = false; + + nvm_wait_until_ready(); + for (page_pos=0; page_posAtmel Support + */ +#ifndef NVM_H +#define NVM_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \defgroup nvm_group NVM driver + * + * See \ref xmega_nvm_quickstart + * + * \brief Low-level driver implementation for the AVR XMEGA Non Volatile + * Memory Controller (NVM). + * + * The XMEGA NVM controller interfaces the internal non-volatile memories + * in the XMEGA devices. Program memory, EEPROM and signature row is can be + * interfaced by the module. See the documentation of each sub-module for + * more information. + * + * \note If using GCC and the flash sub-module, remember to configure + * the boot section in the make file. More information in the sub-module + * documentation. + * + * \section xmega_nvm_quickstart_section Quick Start Guide + * See \ref xmega_nvm_quickstart + */ + +/** + * \defgroup nvm_generic_group NVM driver generic module handling + * \ingroup nvm_group + * \brief Support functions for the NVM driver. + * + * These functions are helper functions for the functions of the + * \ref nvm_group "NVM driver". + * + * @{ + */ + +/** + * \brief Wait for any NVM access to finish. + * + * This function is blocking and waits for any NVM access to finish. + * Use this function before any NVM accesses, if you are not certain that + * any previous operations are finished yet. + */ +static inline void nvm_wait_until_ready( void ) +{ + do { + // Block execution while waiting for the NVM to be ready + } while ((NVM.STATUS & NVM_NVMBUSY_bm) == NVM_NVMBUSY_bm); +} + +/** + * \brief Non-Volatile Memory Execute Command + * + * This function sets the CCP register before setting the CMDEX bit in the + * NVM.CTRLA register. + * + * \note The correct NVM command must be set in the NVM.CMD register before + * calling this function. + */ +static inline void nvm_exec(void) +{ + ccp_write_io((uint8_t *)&NVM.CTRLA, NVM_CMDEX_bm); +} + +/** + * \brief Non-Volatile Memory Execute Specific Command + * + * This function sets a command in the NVM.CMD register, then performs an + * execute command by writing the CMDEX bit to the NVM.CTRLA register. + * + * \note The function saves and restores the NVM.CMD register, but if this + * function is called from an interrupt, interrupts must be disabled + * before this function is called. + * + * \param nvm_command NVM Command to execute. + */ +static inline void nvm_issue_command(NVM_CMD_t nvm_command) +{ + uint8_t old_cmd; + + old_cmd = NVM.CMD; + NVM.CMD = nvm_command; + ccp_write_io((uint8_t *)&NVM.CTRLA, NVM_CMDEX_bm); + NVM.CMD = old_cmd; +} + +/** + * \brief Read one byte using the LDI instruction + * \internal + * + * This function sets the specified NVM_CMD, reads one byte using at the + * specified byte address with the LPM instruction. NVM_CMD is restored after + * use. + * + * \note Interrupts should be disabled before running this function + * if program memory/NVM controller is accessed from ISRs. + * + * \param nvm_cmd NVM command to load before running LPM + * \param address Byte offset into the signature row + */ +uint8_t nvm_read_byte(uint8_t nvm_cmd, uint16_t address); + + +/** + * \brief Perform SPM write + * \internal + * + * This function sets the specified NVM_CMD, sets CCP and then runs the SPM + * instruction to write to flash. + * + * \note Interrupts should be disabled before running this function + * if program memory/NVM controller is accessed from ISRs. + * + * \param addr Address to perform the SPM on. + * \param nvm_cmd NVM command to use in the NVM_CMD register + */ +void nvm_common_spm(uint32_t addr, uint8_t nvm_cmd); + +//! @} + +/** + * \defgroup nvm_signature_group NVM driver signature handling + * \ingroup nvm_group + * \brief Handling of signature rows + * + * Functions for handling signature rows. The following is supported: + * - Reading values from production and user signature row + * - Reading device id + * - Reading device revision + * - Reading device serial + * + * \note Some of these functions are modifying the NVM.CMD register. + * If the application are using program space access in interrupts + * (__flash pointers in IAR EW or pgm_read_byte in GCC) interrupts + * needs to be disabled when running EEPROM access functions. If not, + * the program space reads will be corrupted. See documentation for + * each individual function. + * \note Do not use the functions of this module in an interrupt service + * routine (ISR), since the functions can take several milliseconds to + * complete and hence block the interrupt for several milliseconds. + * In addition the functions of this module are modifying the page buffer + * which will corrupt any ongoing EEPROM handing used outside an ISR. + * @{ + */ + +/** + * \brief Structure containing the device ID + * + * This structure can be used to store the device ID of a device. + */ +struct nvm_device_id { + union { + struct { + uint8_t devid0; + uint8_t devid1; + uint8_t devid2; + }; + uint8_t byte[3]; + }; +}; + +/** + * \brief Structure containing the device serial + * + * This structure can be used to store the serial number of a device. + */ +struct nvm_device_serial { + union { + struct { + uint8_t lotnum0; + uint8_t lotnum1; + uint8_t lotnum2; + uint8_t lotnum3; + uint8_t lotnum4; + uint8_t lotnum5; + uint8_t wafnum; + uint8_t coordx0; + uint8_t coordx1; + uint8_t coordy0; + uint8_t coordy1; + }; + uint8_t byte[11]; + }; +}; + +/** + * \brief Get offset of calibration bytes in the production signature row + * + * \param regname Name of register within the production signature row + * \retval Offset of register into the production signature row + */ +#if defined(__GNUC__) +# define nvm_get_production_signature_row_offset(regname) \ + offsetof(NVM_PROD_SIGNATURES_t, regname) +#elif defined(__ICCAVR__) +# define nvm_get_production_signature_row_offset(regname) (regname##_offset) +#else +# error Unknown compiler +#endif + + +/** + * \brief Read one byte from the production signature row + * + * This function reads one byte from the production signature row of the device + * at the given address. + * + * \note This function is modifying the NVM.CMD register. + * If the application are using program space access in interrupts + * (__flash pointers in IAR EW or pgm_read_byte in GCC) interrupts + * needs to be disabled when running EEPROM access functions. If not + * the program space reads will be corrupted. + * + * \param address Byte offset into the signature row + */ +static inline uint8_t nvm_read_production_signature_row(uint8_t address) +{ + return nvm_read_byte(NVM_CMD_READ_CALIB_ROW_gc, address); +} + +/** + * \brief Read one byte from the user signature row + * + * This function reads one byte from the user signature row of the device + * at the given address. + * + * \note This function is modifying the NVM.CMD register. + * If the application are using program space access in interrupts + * (__flash pointers in IAR EW or pgm_read_byte in GCC) interrupts + * needs to be disabled when running EEPROM access functions. If not + * the program space reads will be corrupted. + * + * \param address Byte offset into the signature row + */ +static inline uint8_t nvm_read_user_signature_row(uint16_t address) +{ + return nvm_read_byte(NVM_CMD_READ_USER_SIG_ROW_gc, address); +} + +/** + * \brief Read the device id + * + * This function returns the device ID stored in the device. + * + * \retval storage Pointer to the structure where to store the device id + */ +static inline void nvm_read_device_id(struct nvm_device_id *storage) +{ + storage->devid0 = MCU.DEVID0; + storage->devid1 = MCU.DEVID1; + storage->devid2 = MCU.DEVID2; +} + +/** + * \brief Read the device revision + * + * This function returns the device revision stored in the device. + * + * \retval unsigned 8 bit value with the current device revision. + */ +static inline uint8_t nvm_read_device_rev(void) +{ + return MCU.REVID; +} + +void nvm_read_device_serial(struct nvm_device_serial *storage); + +//! @} + + +/** + * \defgroup nvm_eeprom_group NVM driver EEPROM handling + * \ingroup nvm_group + * \brief Functions for handling internal EEPROM memory. + * + * The internal EEPROM can be used to store data that will persist after + * power is removed. This can typically be used to store calibration data, + * application state, encryption keys or other data that need to be preserved + * when power is removed. + * + * The functions in this module uses IO register access to manipulate the + * EEPROM. + * + * \note The functions in this module are modifying the NVM.CMD register. + * If the application are using program space access in interrupts + * (__flash pointers in IAR EW or pgm_read_byte in GCC) interrupts + * needs to be disabled when running EEPROM access functions. If not + * the program space reads will be corrupted. + * @{ + */ + +#ifndef EEPROM_PAGE_SIZE +# if XMEGA_A || XMEGA_AU || XMEGA_B || XMEGA_C || XMEGA_D || XMEGA_E +# define EEPROM_PAGE_SIZE 32 +# else +# error Unknown EEPROM page size +# endif +#endif + +#ifndef CONFIG_NVM_IGNORE_XMEGA_A3_D3_REVB_ERRATA +# if XMEGA_A3 || XMEGA_D3 +# error This NVM driver does not support rev B of XMEGA A3/D3 devices. \ + Set CONFIG_NVM_IGNORE_XMEGA_A3_D3_REVB_ERRATA to disable this message +# endif +#endif + +/** + * Data type for holding eeprom memory addresses. + */ +typedef uint16_t eeprom_addr_t; + + +/*! \brief Enable EEPROM mapping into data space. + * + * This macro enables mapping of EEPROM into data space. + * EEPROM starts at EEPROM_START in data memory. Read access + * can be done similar to ordinary SRAM access. + * + * \note This disables IO-mapped access to EEPROM, although page erase and + * write operations still needs to be done through IO register. + */ +static inline void eeprom_enable_mapping(void) +{ +#if !XMEGA_E + NVM_CTRLB = NVM_CTRLB | NVM_EEMAPEN_bm; +#endif +} + + +/*! \brief Disable EEPROM mapping into data space. + * + * This macro disables mapping of EEPROM into data space. + * IO mapped access is now enabled. + */ +static inline void eeprom_disable_mapping(void) +{ +#if !XMEGA_E + NVM_CTRLB = NVM_CTRLB & ~NVM_EEMAPEN_bm; +#endif +} + + +uint8_t nvm_eeprom_read_byte(eeprom_addr_t addr); +void nvm_eeprom_write_byte(eeprom_addr_t address, uint8_t value); +void nvm_eeprom_read_buffer(eeprom_addr_t address, void *buf, uint16_t len); +void nvm_eeprom_erase_and_write_buffer(eeprom_addr_t address, const void *buf, uint16_t len); + +void nvm_eeprom_flush_buffer(void); +void nvm_eeprom_load_byte_to_buffer(uint8_t byte_addr, uint8_t value); +void nvm_eeprom_load_page_to_buffer(const uint8_t *values); +void nvm_eeprom_atomic_write_page(uint8_t page_addr); +void nvm_eeprom_split_write_page(uint8_t page_addr); +void nvm_eeprom_fill_buffer_with_value(uint8_t value); +void nvm_eeprom_erase_bytes_in_page(uint8_t page_addr); +void nvm_eeprom_erase_page(uint8_t page_addr); +void nvm_eeprom_erase_bytes_in_all_pages(void); +void nvm_eeprom_erase_all(void); + +//! @} + +/** + * \defgroup nvm_flash_group NVM driver flash handling + * \ingroup nvm_group + * \brief Functions for handling internal flash memory. + * + * The internal flash memory on the XMEGA devices consists of the application + * section, the application table section and the bootloader section. + * All these sections can store program code for the MCU, but if there is + * available space, they can be used for storing other persistent data. + * + * Writing the flash memory can only be done one page at a time. It consists + * of loading the data to the internal page buffer and then running one of + * the write commands. If the page has not been erased before writing, the + * data will not be written correctly. + * + * In order to be able to write to flash memory the programming commands need + * to be run from the boot section. + * - When using IAR this is handled automatically by the linker script. + * - When using GCC this needs to be specified manually in the make files. For + * example the ATxmega128A1 has the boot section at the word address 0x10000 + * the corresponding byte address of 0x20000 needs to be added to the + * config.mk makefile: + * LDFLAGS += -Wl,--section-start=.BOOT=0x20000 + * See the device datasheet for the correct address for other devices. + * + * \note If using GCC and the flash sub-module, remember to configure + * the boot section in the make file. + * + * \note The functions in this module are modifying the NVM.CMD register. + * If the application are using program space access in interrupts + * (__flash pointers in IAR EW or pgm_read_byte in GCC) interrupts + * needs to be disabled when running EEPROM access functions. If not + * the program space reads will be corrupted. + * @{ + */ + +/** + * \brief Size of a flash page in bytes + * + * The page size in bytes taken from the toolchain header files. + * + * \note Page size is currently missing from the IAR header files, so it needs + * to be defined in the driver until it is fixed. + */ +#ifdef __DOXYGEN__ +# define FLASH_SIZE +# define FLASH_PAGE_SIZE +#else + +// 8K devices +# if AVR8_PART_IS_DEFINED(ATxmega8E5) +# define FLASH_SIZE (8*1024L) +# define FLASH_PAGE_SIZE (128) + +// 16K devices +# elif AVR8_PART_IS_DEFINED(ATxmega16A4) | \ + AVR8_PART_IS_DEFINED(ATxmega16A4U) | \ + AVR8_PART_IS_DEFINED(ATxmega16D4) | \ + AVR8_PART_IS_DEFINED(ATxmega16C4) +# define FLASH_SIZE (16*1024L) +# define FLASH_PAGE_SIZE (256) + +# elif AVR8_PART_IS_DEFINED(ATxmega16E5) +# define FLASH_SIZE (16*1024L) +# define FLASH_PAGE_SIZE (128) + +// 32K devices +# elif AVR8_PART_IS_DEFINED(ATxmega32A4) | \ + AVR8_PART_IS_DEFINED(ATxmega32A4U) | \ + AVR8_PART_IS_DEFINED(ATxmega32D4) | \ + AVR8_PART_IS_DEFINED(ATxmega32C4) +# define FLASH_SIZE (32*1024L) +# define FLASH_PAGE_SIZE (256) + +# elif AVR8_PART_IS_DEFINED(ATxmega32E5) +# define FLASH_SIZE (32*1024L) +# define FLASH_PAGE_SIZE (128) + +// 64K devices +# elif AVR8_PART_IS_DEFINED(ATxmega64A1) | \ + AVR8_PART_IS_DEFINED(ATxmega64A1U) | \ + AVR8_PART_IS_DEFINED(ATxmega64A3) | \ + AVR8_PART_IS_DEFINED(ATxmega64A3U) | \ + AVR8_PART_IS_DEFINED(ATxmega64A4U) | \ + AVR8_PART_IS_DEFINED(ATxmega64B1) | \ + AVR8_PART_IS_DEFINED(ATxmega64B3) | \ + AVR8_PART_IS_DEFINED(ATxmega64C3) | \ + AVR8_PART_IS_DEFINED(ATxmega64D3) | \ + AVR8_PART_IS_DEFINED(ATxmega64D4) +# define FLASH_SIZE (64*1024L) +# define FLASH_PAGE_SIZE (256) + +// 128K devices +# elif AVR8_PART_IS_DEFINED(ATxmega128A1) | \ + AVR8_PART_IS_DEFINED(ATxmega128A1U) | \ + AVR8_PART_IS_DEFINED(ATxmega128A3) | \ + AVR8_PART_IS_DEFINED(ATxmega128A3U) | \ + AVR8_PART_IS_DEFINED(ATxmega128C3) | \ + AVR8_PART_IS_DEFINED(ATxmega128D3) | \ + AVR8_PART_IS_DEFINED(ATxmega128D4) +# define FLASH_SIZE (128*1024L) +# define FLASH_PAGE_SIZE (512) + +# elif AVR8_PART_IS_DEFINED(ATxmega128A4U) | \ + AVR8_PART_IS_DEFINED(ATxmega128B1) | \ + AVR8_PART_IS_DEFINED(ATxmega128B3) +# define FLASH_SIZE (128*1024L) +# define FLASH_PAGE_SIZE (256) + +// 192K devices +# elif AVR8_PART_IS_DEFINED(ATxmega192A3U) | \ + AVR8_PART_IS_DEFINED(ATxmega192C3) | \ + AVR8_PART_IS_DEFINED(ATxmega192D3) +# define FLASH_SIZE (192*1024L) +# define FLASH_PAGE_SIZE (512) + +// 256K devices +# elif AVR8_PART_IS_DEFINED(ATxmega256A3) | \ + AVR8_PART_IS_DEFINED(ATxmega256A3U) | \ + AVR8_PART_IS_DEFINED(ATxmega256A3B) | \ + AVR8_PART_IS_DEFINED(ATxmega256A3BU) | \ + AVR8_PART_IS_DEFINED(ATxmega256C3) | \ + AVR8_PART_IS_DEFINED(ATxmega256D3) +# define FLASH_SIZE (256*1024L) +# define FLASH_PAGE_SIZE (512) + +// 384K devices +# elif AVR8_PART_IS_DEFINED(ATxmega384C3) +# define FLASH_SIZE (384*1024L) +# define FLASH_PAGE_SIZE (512) +# elif AVR8_PART_IS_DEFINED(ATxmega384D3) +# define FLASH_SIZE (384*1024L) +# define FLASH_PAGE_SIZE (512) +# else +# error Flash page size needs to be defined. +# endif +#endif + +/** + * Data type for holding flash memory addresses. + * + */ +#if (FLASH_SIZE >= 0x10000UL) // Note: Xmega with 64KB of flash have 4KB boot flash +typedef uint32_t flash_addr_t; +#else +typedef uint16_t flash_addr_t; +#endif + +/** + * Flash pointer type to use for accessing flash memory with IAR + */ +#if (FLASH_SIZE >= 0x10000UL) // Note: Xmega with 64KB of flash have 4KB boot flash +# define IAR_FLASH_PTR __farflash +#else +# define IAR_FLASH_PTR __flash +#endif + +/** + * \brief Load byte from flash memory + * + * Load one word of flash using byte addressing. IAR has __flash pointers + * and GCC have pgm_read_byte_xx functions which load data from flash memory. + * This function used for compatibility between the compilers. + * + * \param addr Byte address to load + * \return Byte from program memory + */ +static inline uint8_t nvm_flash_read_byte(flash_addr_t addr) +{ +#if defined(__GNUC__) + return pgm_read_byte_far(addr); +#elif defined(__ICCAVR__) + uint8_t IAR_FLASH_PTR *flashptr = (uint8_t IAR_FLASH_PTR *)addr; + return *flashptr; +#else +# error Unknown compiler +#endif +} + +/** + * \brief Load word from flash memory + * + * Load one word of flash using byte addressing. IAR has __flash pointers + * and GCC have pgm_read_byte_xx functions which load data from flash memory. + * This function used for compatibility between the compilers. + * + * \param addr Byte address to load (last bit is ignored) + * \return Word from program memory + */ +static inline uint16_t nvm_flash_read_word(flash_addr_t addr) +{ +#if defined(__GNUC__) + return pgm_read_word_far(addr); +#elif defined(__ICCAVR__) + uint16_t IAR_FLASH_PTR *flashptr = (uint16_t IAR_FLASH_PTR *)addr; + return *flashptr; +#endif +} + + +/** + * \brief Flush flash page buffer + * + * Clear the NVM controller page buffer for flash. This needs to be called + * before using \ref nvm_flash_load_word_to_buffer if it has not already been + * cleared. + * + */ +static inline void nvm_flash_flush_buffer(void) +{ + nvm_wait_until_ready(); + nvm_common_spm(0, NVM_CMD_ERASE_FLASH_BUFFER_gc); +} + + +/** + * \brief Load word into flash page buffer + * + * Clear the NVM controller page buffer for flash. This needs to be called + * before using \ref nvm_flash_load_word_to_buffer if it has not already been + * cleared. + * + * \param word_addr Address to store data. The upper bits beyond the page size + * is ignored. \ref FLASH_PAGE_SIZE + * \param data Data word to load into the page buffer + */ +void nvm_flash_load_word_to_buffer(uint32_t word_addr, uint16_t data); + + +/** + * \brief Erase entire application section + * + * Erase all of the application section. + */ +static inline void nvm_flash_erase_app(void) +{ + nvm_wait_until_ready(); + nvm_common_spm(0, NVM_CMD_ERASE_APP_gc); +} + +/** + * \brief Erase a page within the application section + * + * Erase one page within the application section + * + * \param page_addr Byte address to the page to delete + */ +static inline void nvm_flash_erase_app_page(flash_addr_t page_addr) +{ + nvm_wait_until_ready(); + nvm_common_spm(page_addr, NVM_CMD_ERASE_APP_PAGE_gc); +} + +/** + * \brief Write a page within the application section + * + * Write a page within the application section with the data stored in the + * page buffer. The page needs to be erased before the write to avoid + * corruption of the data written. + * + * \param page_addr Byte address to the page to delete + */ +static inline void nvm_flash_split_write_app_page(flash_addr_t page_addr) +{ + nvm_wait_until_ready(); + nvm_common_spm(page_addr, NVM_CMD_WRITE_APP_PAGE_gc); +} + +/** + * \brief Erase and write a page within the application section + * + * Erase and the write a page within the application section with the data + * stored in the page buffer. Erase and write is done in an atomic operation. + * + * \param page_addr Byte address to the page to delete + */ +static inline void nvm_flash_atomic_write_app_page(flash_addr_t page_addr) +{ + nvm_wait_until_ready(); + nvm_common_spm(page_addr, NVM_CMD_ERASE_WRITE_APP_PAGE_gc); +} + +void nvm_issue_flash_range_crc(flash_addr_t start_addr, flash_addr_t end_addr); + +void nvm_flash_read_buffer(flash_addr_t address, void *buf, uint16_t len); + +void nvm_flash_erase_and_write_buffer(flash_addr_t address, const void *buf, + uint16_t len, bool b_blank_check); + +/** + * \brief Erase a page within the boot section + * + * Erase one page within the boot section + * + * \param page_addr Byte address to the page to delete + */ +static inline void nvm_flash_erase_boot_page(flash_addr_t page_addr) +{ + nvm_wait_until_ready(); + nvm_common_spm(page_addr, NVM_CMD_ERASE_BOOT_PAGE_gc); +} + +/** + * \brief Write a page within the boot section + * + * Write a page within the boot section with the data stored in the + * page buffer. The page needs to be erased before the write to avoid + * corruption of the data written. + * + * \param page_addr Byte address to the page to delete + */ +static inline void nvm_flash_split_write_boot_page(flash_addr_t page_addr) +{ + nvm_wait_until_ready(); + nvm_common_spm(page_addr, NVM_CMD_WRITE_BOOT_PAGE_gc); +} + +/** + * \brief Erase and write a page within the boot section + * + * Erase and the write a page within the boot section with the data + * stored in the page buffer. Erase and write is done in an atomic operation. + * + * \param page_addr Byte address to the page to delete + */ +static inline void nvm_flash_atomic_write_boot_page(flash_addr_t page_addr) +{ + nvm_wait_until_ready(); + nvm_common_spm(page_addr, NVM_CMD_ERASE_WRITE_BOOT_PAGE_gc); +} + +void nvm_user_sig_read_buffer(flash_addr_t address, void *buf, uint16_t len); +void nvm_user_sig_write_buffer(flash_addr_t address, const void *buf, + uint16_t len, bool b_blank_check); + +/** + * \brief Erase the user calibration section page + * + * Erase the user calibration section page. There is only one page, so no + * parameters are needed. + */ +static inline void nvm_flash_erase_user_section(void) +{ + nvm_wait_until_ready(); + nvm_common_spm(0, NVM_CMD_ERASE_USER_SIG_ROW_gc); +} + +/** + * \brief Write the user calibration section page + * + * Write a the user calibration section page with the data stored in the + * page buffer. The page needs to be erased before the write to avoid + * corruption of the data written. There is only one page, so no + * parameters are needed. + */ +static inline void nvm_flash_write_user_page(void) +{ + nvm_wait_until_ready(); + nvm_common_spm(0, NVM_CMD_WRITE_USER_SIG_ROW_gc); +} + +//! @} + +/** + * \defgroup nvm_fuse_lock_group NVM driver fuse and lock bits handling + * \ingroup nvm_group + * \brief Functions for reading fuses and writing lock bits. + * + * The Fuses are used to set important system functions and can only be written + * from an external programming interface. The application software can read + * the fuses. The fuses are used to configure reset sources such as Brown-out + * Detector and Watchdog, Start-up configuration, JTAG enable and JTAG user ID. + * + * The Lock bits are used to set protection level on the different flash + * sections. They are used to block read and/or write on the different flash + * sections. Lock bits can be written from en external programmer and from the + * application software to set a more strict protection level, but not to set a + * less strict protection level. Chip erase is the only way to erase the lock + * bits. The lock bits are erased after the rest of the flash memory is erased. + * An unprogrammed fuse or lock bit will have the value one, while a programmed + * fuse or lock bit will have the value zero. + * Both fuses and lock bits are reprogrammable like the Flash Program memory. + * + * \note The functions in this module are modifying the NVM.CMD register. + * If the application are using program space access in interrupts + * (__flash pointers in IAR EW or pgm_read_byte in GCC) interrupts + * needs to be disabled when running EEPROM access functions. If not + * the program space reads will be corrupted. + * @{ + */ + +// The different fuse bytes +enum fuse_byte_t { + FUSEBYTE0 = 0, + FUSEBYTE1 = 1, + FUSEBYTE2 = 2, + FUSEBYTE3 = 3, // not used on current devices + FUSEBYTE4 = 4, + FUSEBYTE5 = 5, +}; + +uint8_t nvm_fuses_read(enum fuse_byte_t fuse); + +/** + * \brief Program the lock bits. + * + * Program the lock bits to the given values. Lock bits can only be programmed + * to a more secure setting than previously programmed. To clear lock bits, a + * flash erase has to be issued. + * + * \param blbb_lock Boot loader section lock bits to program + * \param blba_lock Application section lock bits to program + * \param blbat_lock Application table section lock bits to program + * \param lb_lock Flash/eeprom lock bits to program + */ +static inline void nvm_lock_bits_write(enum NVM_BLBB_enum blbb_lock, + enum NVM_BLBA_enum blba_lock, enum NVM_BLBAT_enum blbat_lock, + enum NVM_LB_enum lb_lock) +{ + nvm_wait_until_ready(); + NVM.DATA0 = (uint8_t)blbb_lock | (uint8_t)blba_lock | (uint8_t)blbat_lock | + (uint8_t)lb_lock; + nvm_issue_command(NVM_CMD_WRITE_LOCK_BITS_gc); +} + +/** + * \brief Program the BLBB lock bits. + * + * Program the lock bits for the boot loader section (BLBB). Other lock bits + * (BLBA, BLBAT and LB) are not altered (ie. programmed to NOLOCK). + * + * \param blbb_lock Boot loader section lock bits to program + */ +static inline void nvm_blbb_lock_bits_write(enum NVM_BLBB_enum blbb_lock) +{ + nvm_lock_bits_write(blbb_lock, NVM_BLBA_NOLOCK_gc, NVM_BLBAT_NOLOCK_gc, + NVM_LB_NOLOCK_gc); +} + +/** + * \brief Program the BLBA lock bits. + * + * Program the lock bits for the application section (BLBA). Other lock bits + * (BLBB, BLBAT and LB) are not altered (ie. programmed to NOLOCK). + * + * \param blba_lock Application section lock bits to program + */ +static inline void nvm_blba_lock_bits_write(enum NVM_BLBA_enum blba_lock) +{ + nvm_lock_bits_write(NVM_BLBB_NOLOCK_gc, blba_lock, NVM_BLBAT_NOLOCK_gc, + NVM_LB_NOLOCK_gc); +} + +/** + * \brief Program the BLBAT lock bits. + * + * Program the lock bits for the application table section (BLBAT). Other lock + * bits (BLBB, BLBA and LB) are not altered (ie. programmed to NOLOCK). + * + * \param blbat_lock Application table section lock bits to program + */ +static inline void nvm_blbat_lock_bits_write(enum NVM_BLBAT_enum blbat_lock) +{ + nvm_lock_bits_write(NVM_BLBB_NOLOCK_gc, NVM_BLBA_NOLOCK_gc, blbat_lock, + NVM_LB_NOLOCK_gc); +} + +/** + * \brief Program the LB lock bits. + * + * Program the lock bits for the flash and eeprom (LB). Other lock bits + * (BLBB, BLBA and BLBAT) are not altered (ie. programmed to NOLOCK). + * + * \param lb_lock Flash/eeprom lock bits to program + */ +static inline void nvm_lb_lock_bits_write(enum NVM_LB_enum lb_lock) +{ + nvm_lock_bits_write(NVM_BLBB_NOLOCK_gc, NVM_BLBA_NOLOCK_gc, + NVM_BLBAT_NOLOCK_gc, lb_lock); +} + +//! @} + +/** + * \page xmega_nvm_quickstart Quick Start Guide for the XMEGA NVM Driver + * + * This is the quick start guide for the \ref nvm_group "NVM Driver", with + * step-by-step instructions on how to configure and use the driver for + * specific use cases. + * + * The section described below can be compiled into e.g. the main application + * loop or any other function that will need to interface non-volatile memory. + * + * \section xmega_nvm_quickstart_basic Basic usage of the NVM driver + * This section will present three use cases of the NVM driver. The first will + * write a page to EEPROM and verify that it has been written, the second will + * access the BOD-level fuse to verify that the level is correctly set, and the + * third will read a chunk from the user signature row. + * + * \section xmega_nvm_quickstart_eeprom_case Use case 1: EEPROM + * + * The NVM driver has functions for interfacing many types of non-volatile + * memory, including flash, EEPROM, fuses and lock bits. The example code + * below will write a page to the internal EEPROM, and read it back to verify, + * using memory mapped I/O. + * + * \section xmega_nvm_quickstart_eeprom_case_setup_steps Setup steps + * There are no setup steps required for this use case. + * + * \subsection nvm_quickstart_eeprom_case_example_code Example code + * + * \code + #define EXAMPLE_PAGE 2 + #define EXAMPLE_ADDR EXAMPLE_PAGE * EEPROM_PAGE_SIZE + + uint8_t write_page[EEPROM_PAGE_SIZE]; + uint8_t read_page[EEPROM_PAGE_SIZE]; + + fill_page_with_known_data(write_page); + fill_page_with_zeroes(read_page); + + nvm_eeprom_load_page_to_buffer(write_page); + nvm_eeprom_atomic_write_page(EXAMPLE_PAGE); + + nvm_eeprom_read_buffer(EXAMPLE_ADDR, + read_page, EEPROM_PAGE_SIZE); + + check_if_pages_are_equal(write_page, read_page); +\endcode + * + * \subsection nvm_quickstart_eeprom_case_workflow Workflow + * + * -# We define where we would like to store our data, and we arbitrarily + * choose page 2 of EEPROM: + * - \code + #define EXAMPLE_PAGE 2 + #define EXAMPLE_ADDR EXAMPLE_PAGE * EEPROM_PAGE_SIZE +\endcode + * -# Define two tables, one which contains the data which we will write, + * and one which we will read the data into: + * - \code + uint8_t write_page[EEPROM_PAGE_SIZE]; + uint8_t read_page[EEPROM_PAGE_SIZE]; +\endcode + * -# Fill the tables with our data, and zero out the read table: + * - \code + fill_page_with_known_data(write_page); + fill_page_with_zeroes(read_page); +\endcode + * - \note These functions are undeclared, you should replace them with + * your own appropriate functions. + * -# We load our page into a temporary EEPROM page buffer: + * - \code + nvm_eeprom_load_page_to_buffer(write_page); +\endcode + * - \attention The function used above will not work if memory mapping + * is enabled. + * -# Do an atomic write of the page from buffer into the specified page: + * - \code + nvm_eeprom_atomic_write_page(EXAMPLE_PAGE); +\endcode + * - \note The function \ref nvm_eeprom_atomic_write_page() erases the + * page before writing the new one. For non-atomic (split) + * writing without deleting, see \ref nvm_eeprom_split_write_page() + * -# Read the page back into our read_page[] table: + * - \code + nvm_eeprom_read_buffer(EXAMPLE_ADDR, + read_page, EEPROM_PAGE_SIZE); +\endcode + * -# Verify that the page is equal to the one that was written earlier: + * - \code + check_if_pages_are_equal(write_page, read_page); +\endcode + * - \note This function is not declared, you should replace it with your + * own appropriate function. + * + * \section xmega_nvm_quickstart_fuse_case Use case 2: Fuses + * + * The NVM driver has functions for reading fuses. + * See \ref nvm_fuse_lock_group. + * + * We would like to check whether the Brown-out Detection level is set to + * 2.1V. This is set by programming the fuses when the chip is connected + * to a suitable programmer. The fuse is a part of FUSEBYTE5. If the BODLVL + * is correct, we turn on LED0. + * + * \section xmega_nvm_quickstart_fuse_case_setup_steps Setup steps + * There are no setup steps required for this use case. + * + * \subsection nvm_quickstart_fuse_case_example_code Example code + * \code + uint8_t fuse_value; + fuse_value = nvm_fuses_read(FUSEBYTE5); + + if ((fuse_value & NVM_FUSES_BODLVL_gm) == BODLVL_2V1_gc) { + gpio_set_pin_low(LED0_GPIO); + } +\endcode + * + * \subsection nvm_quickstart_fuse_case_workflow Workflow + * + * -# Create a variable to store the fuse contents: + * - \code + uint8_t fuse_value; +\endcode + * -# The fuse value we are interested in, BODLVL, is stored in FUSEBYTE5. + * We call the function \ref nvm_fuses_read() to read the fuse into our + * variable: + * - \code + fuse_value = nvm_fuses_read(FUSEBYTE5); +\endcode + * -# This ends the reading portion, but we would like to see whether the + * BOD-level is correct, and if it is, light up an LED: + * - \code + if ((fuse_value & NVM_FUSES_BODLVL_gm) == BODLVL_2V1_gc) { + gpio_set_pin_low(LED0_GPIO); + } +\endcode + * + * \section xmega_nvm_quickstart_signature_case Use case 3: Signature row + * + * The NVM driver has functions for reading the signature row of the device. + * Here we will simply read 16 bytes from the user signature row, assuming + * we need what is stored there. + * + * \section xmega_nvm_quickstart_signature_row_setup_steps Setup steps + * There are no setup steps required for this use case. + * + * \subsection xmega_nvm_quickstart_signature_row_example_code Example code + * + * \code + #define START_ADDR 0x10 + #define DATA_LENGTH 16 + + uint8_t values[LENGTH]; + uint8_t i; + + for (i = 0; i < DATA_LENGTH; i++) { + values[i] = nvm_read_user_signature_row(START_ADDR + i); + } +\endcode + * + * \subsection nvm_quickstart_signature_case_workflow Workflow + * + * -# Define starting address and length of data segment, and create + * variables needed to store and process the data: + * - \code + #define START_ADDR 0x10 + #define DATA_LENGTH 16 + + uint8_t values[LENGTH]; + uint8_t i; +\endcode + * -# Iterate through the user signature row, and store our desired data: + * - \code + for (i = 0; i < DATA_LENGTH; i++) { + values[i] = nvm_read_user_signature_row(START_ADDR + i); + } +\endcode + * + */ + +#ifdef __cplusplus +} +#endif + +#endif /* NVM_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/nvm/nvm_asm.s b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/nvm/nvm_asm.s new file mode 100644 index 00000000..6d74e08e --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/nvm/nvm_asm.s @@ -0,0 +1,197 @@ +/** + * \file + * + * \brief Non Volatile Memory controller driver + * + * Copyright (c) 2010 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +#include + +#if defined(__GNUC__) +//! Value to write to CCP for access to protected IO registers. +# define CCP_SPM_gc 0x9D + +//! NVM busy flag +# define NVM_NVMBUSY_bp 7 + +//! NVM command for loading flash buffer +# define NVM_CMD_LOAD_FLASH_BUFFER_gc 0x23 +#elif defined(__IAR_SYSTEMS_ASM__) +// All values are defined for IAR +#else +# error Unknown assembler +#endif + +#ifndef __DOXYGEN__ + PUBLIC_FUNCTION(nvm_read_byte) +#if defined(__GNUC__) + lds r20, NVM_CMD ; Store NVM command register + mov ZL, r22 ; Load byte index into low byte of Z. + mov ZH, r23 ; Load high byte into Z. + sts NVM_CMD, r24 ; Load prepared command into NVM Command register. + lpm r24, Z ; Perform an LPM to read out byte + sts NVM_CMD, r20 ; Restore NVM command register +#elif defined(__IAR_SYSTEMS_ASM__) + lds r20, NVM_CMD ; Store NVM command register + mov ZL, r18 ; Load byte index into low byte of Z. + mov ZH, r19 ; Load high byte into Z. + sts NVM_CMD, r16 ; Load prepared command into NVM Command register. + lpm r16, Z ; Perform an LPM to read out byte + sts NVM_CMD, r20 ; Restore NVM command register +#endif + + ret + + END_FUNC(nvm_read_byte) + +// IAR forgets about include files after each module, so need to include again +#if defined(__IAR_SYSTEMS_ASM__) +# include +#endif + + /** + * \brief Perform SPM command + */ + PUBLIC_FUNCTION_SEGMENT(nvm_common_spm, BOOT) + +#if defined(__GNUC__) + /** + * For GCC: + * \param address uint32_t r22:r25 + * \param nvm_cmd uint8_t r20 + */ + in r25, RAMPZ ; Store RAMPZ. Highest address byte is ignored, so using that + out RAMPZ, r24 ; Load R24 into RAMPZ + movw ZL, r22 ; Load R22:R23 into Z. + lds r24, NVM_CMD ; Store NVM command register (r24 is no longer needed) + sts NVM_CMD, r20 ; Load prepared command into NVM Command register. + ldi r23, CCP_SPM_gc ; Prepare Protect SPM signature (r23 is no longer needed) + sts CCP, r23 ; Enable SPM operation (this disables interrupts for 4 cycles). + spm ; Self-program. + sts NVM_CMD, r24 ; Restore NVM command register + out RAMPZ, r25 ; Restore RAMPZ register. +#elif defined(__IAR_SYSTEMS_ASM__) + /** + * For IAR: + * \param address uint32_t r16:r19 + * \param nvm_cmd uint8_t r20 + */ + in r19, RAMPZ ; Store RAMPZ. Highest address byte is ignored, so using that + out RAMPZ, r18 ; Load R18 into RAMPZ + movw ZL, r16 ; Load R16:R17 into Z. + lds r18, NVM_CMD ; Store NVM command register (r18 is no longer needed) + sts NVM_CMD, r20 ; Load prepared command into NVM Command register. + ldi r19, CCP_SPM_gc ; Prepare Protect SPM signature (r19 is no longer needed) + sts CCP, r19 ; Enable SPM operation (this disables interrupts for 4 cycles). + spm ; Self-program. + sts NVM_CMD, r18 ; Restore NVM command register + out RAMPZ, r19 ; Restore RAMPZ register. +#endif + + ret + + END_FUNC(nvm_common_spm) + +// IAR forgets about include files after each module, so need to include again +#if defined(__IAR_SYSTEMS_ASM__) +# include +#endif + + /** + * \brief Load byte to page buffer + * + */ + PUBLIC_FUNCTION_SEGMENT(nvm_flash_load_word_to_buffer, BOOT) + +#if defined(__GNUC__) + /** + * For GCC: + * \param word_addr uint32_t r22:r25 + * \param data uint16_t r20:r21 + */ +wait_nvm: + lds r18, NVM_STATUS + sbrc r18, NVM_NVMBUSY_bp + rjmp wait_nvm + + in r25, RAMPZ ; Store RAMPZ. Highest address byte is ignored, so using that + out RAMPZ, r24 ; Load R24 into RAMPZ + movw ZL, r22 ; Load R22:R23 into Z. + + lds r24, NVM_CMD ; Store NVM command register (r24 is no longer needed) + ldi r18, NVM_CMD_LOAD_FLASH_BUFFER_gc + sts NVM_CMD, r18 ; Load prepared command into NVM Command register. + + movw r0, r20 ; Load R20:R21 into R0:R1 + spm ; Self-program. + + clr r1 ; Clear R1 for GCC _zero_reg_ to function properly. + sts NVM_CMD, r24 ; Restore NVM command register + out RAMPZ, r25 ; Restore RAMPZ register. +#elif defined(__IAR_SYSTEMS_ASM__) + /** + * For IAR: + * \param word_addr uint32_t r16:r19 + * \param data uint16_t r20:r21 + */ +wait_nvm: + lds r19, NVM_STATUS + sbrc r19, NVM_NVMBUSY_bp + rjmp wait_nvm + + in r19, RAMPZ ; Store RAMPZ. Highest byte is ignored, so using that + out RAMPZ, r18 ; Load R18 into RAMPZ + movw ZL, r16 ; Load R16:R17 into Z. + + lds r18, NVM_CMD ; Store NVM command register (r18 is no longer needed) + ldi r17, NVM_CMD_LOAD_FLASH_BUFFER_gc + sts NVM_CMD, r17 ; Load prepared command into NVM Command register. + + movw r0, r20 ; Load R20:R21 into R0:R1 + spm ; Self-program. + + sts NVM_CMD, r18 ; Restore NVM command register + out RAMPZ, r19 ; Restore RAMPZ register. +#endif + + ret + + END_FUNC(nvm_flash_load_word_to_buffer) + + END_FILE() +#endif // __DOXYGEN__ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/pmic/pmic.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/pmic/pmic.h new file mode 100644 index 00000000..81f56157 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/pmic/pmic.h @@ -0,0 +1,352 @@ +/** + * \file + * + * \brief Programmable Multilevel Interrupt Controller driver + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef PMIC_H +#define PMIC_H + +#include +#include + +/** + * \defgroup pmic_group Programmable Multilevel Interrupt Controller + * + * See \ref xmega_pmic_quickstart. + * + * This is a low-level driver implementation for the AVR XMEGA Programmable + * Multilevel Interrupt Controller. + * + * \note If these functions are used in interrupt service routines (ISRs), any + * non-ISR code or ISR code for lower level interrupts must ensure that the + * operations are atomic, i.e., by disabling interrupts during the function + * calls. + * @{ + */ + +/** + * \brief Interrupt level bitmasks + * + * \note These may be OR'ed, e.g., if multiple levels are to be enabled or + * disabled. + */ +enum pmic_level { + PMIC_LVL_LOW = PMIC_LOLVLEN_bm, //!< Low-level interrupts + PMIC_LVL_MEDIUM = PMIC_MEDLVLEN_bm, //!< Medium-level interrupts + PMIC_LVL_HIGH = PMIC_HILVLEN_bm, //!< High-level interrupts + /** + * \brief Non-maskable interrupts + * \note These cannot be enabled nor disabled. + */ + PMIC_LVL_NMI = PMIC_NMIEX_bp, +}; + +//! Interrupt vector locations +enum pmic_vector { + PMIC_VEC_APPLICATION, //!< Application section + PMIC_VEC_BOOT, //!< Boot section + PMIC_NR_OF_VECTORS, //!< Number of interrupt vector locations +}; + +//! Interrupt scheduling schemes +enum pmic_schedule { + PMIC_SCH_FIXED_PRIORITY, //!< Default, fixed priority scheduling + PMIC_SCH_ROUND_ROBIN, //!< Round-robin scheduling + PMIC_NR_OF_SCHEDULES, //!< Number of interrupt scheduling schemes +}; + +/** + * \brief Initialize the PMIC + * + * Enables all interrupt levels, with vectors located in the application section + * and fixed priority scheduling. + */ +static inline void pmic_init(void) +{ + PMIC.CTRL = PMIC_LVL_LOW | PMIC_LVL_MEDIUM | + PMIC_LVL_HIGH; +} + +/** + * \brief Enable interrupts with specified \a level(s). + * + * \param level Interrupt level(s) to enable. + */ +static inline void pmic_enable_level(enum pmic_level level) +{ + Assert((level & PMIC_LVL_NMI)); + + PMIC.CTRL |= level; +} + +/** + * \brief Disable interrupts with specified \a level(s). + * + * \param level Interrupt level(s) to disable. + */ +static inline void pmic_disable_level(enum pmic_level level) +{ + Assert((level & PMIC_LVL_NMI)); + + PMIC.CTRL &= ~level; +} + +/** + * \brief Check if specified interrupt \a level(s) is enabled. + * + * \param level Interrupt level(s) to check. + * + * \return True if interrupt level(s) is enabled. + */ +static inline bool pmic_level_is_enabled(enum pmic_level level) +{ + Assert((level & PMIC_LVL_NMI)); + + return PMIC.CTRL & level; +} + +/** + * \brief Get currently enabled level(s) + * + * \return Bitmask with currently enabled levels. + */ +static inline enum pmic_level pmic_get_enabled_levels(void) +{ + return (enum pmic_level)(PMIC.CTRL & (PMIC_LVL_LOW | PMIC_LVL_MEDIUM + | PMIC_LVL_HIGH)); +} + +/** + * \brief Check if an interrupt level(s) is currently executing. + * + * \param level Interrupt level(s) to check. + * + * \return True if interrupt level(s) is currently executing. + */ +static inline bool pmic_level_is_executing(enum pmic_level level) +{ + return PMIC.STATUS & level; +} + +/** + * \brief Set interrupt scheduling for low-level interrupts. + * + * \param schedule Interrupt scheduling method to set. + * + * \note The low-priority vector, INTPRI, must be set to 0 when round-robin + * scheduling is disabled to return to default interrupt priority order. + */ +static inline void pmic_set_scheduling(enum pmic_schedule schedule) +{ + Assert(schedule < PMIC_NR_OF_SCHEDULES); + + switch (schedule) { + case PMIC_SCH_FIXED_PRIORITY: + PMIC.CTRL &= ~PMIC_RREN_bm; + PMIC.INTPRI = 0; + break; + + case PMIC_SCH_ROUND_ROBIN: + PMIC.CTRL |= PMIC_RREN_bm; + break; + + default: + break; + }; +} + +/** + * \brief Set location of interrupt vectors. + * + * \param vector Location to use for interrupt vectors. + */ +static inline void pmic_set_vector_location(enum pmic_vector vector) +{ + uint8_t ctrl = PMIC.CTRL; + + Assert(vector < PMIC_NR_OF_VECTORS); + + switch (vector) { + case PMIC_VEC_APPLICATION: + ctrl &= ~PMIC_IVSEL_bm; + break; + + case PMIC_VEC_BOOT: + ctrl |= PMIC_IVSEL_bm; + break; + + default: + break; + } + + ccp_write_io((uint8_t*)&PMIC.CTRL, ctrl); +} + +//! @} + +/** + * \page xmega_pmic_quickstart Quick start guide for PMIC driver + * + * This is the quick start guide for the \ref pmic_group "PMIC driver" and + * the closely related \ref interrupt_group "global interrupt driver", with + * step-by-step instructions on how to configure and use the drivers in a + * selection of use cases. + * + * The use cases contain several code fragments. The code fragments in the + * steps for setup can be copied into a custom initialization function, while + * the steps for usage can be copied into, e.g., the main application function. + * + * \section pmic_basic_use_case Basic use case + * In this basic use case, the PMIC is configured for: + * - all interrupt levels enabled + * - round-robin scheduling + * + * This will allow for interrupts from other modules being used. + * + * \section pmic_basic_use_case_setup Setup steps + * + * \subsection pmic_basic_use_case_setup_prereq Prerequisites + * For the setup code of this use case to work, the following must + * be added to the project: + * -# Interrupts for the module requiring the PMIC module have to be + * enabled. + * -# An Interrupt Service Routine (ISR) for a given interrupt vector has to be + * defined, where the interrupt vectors available are defined by toolchain and + * listed in the subsection 'Interrupt Vector Summary' in the data sheet. + * \code + ISR(interrupt_vector){ + //Interrupt Service Routine + } +\endcode + * + * \subsection pmic_basic_use_case_setup_code Example code + * Add to the initialization code: + * \code + pmic_init(); + pmic_set_scheduling(PMIC_SCH_ROUND_ROBIN); + cpu_irq_enable(); +\endcode + * + * \subsection pmic_basic_use_case_setup_flow Workflow + * -# call the PMIC driver's own init function to enable all interrupt levels: + * - \code pmic_init(); \endcode + * -# enable round-robin instead of fixed priority interrupt scheduling: + * - \code pmic_set_scheduling(PMIC_SCH_ROUND_ROBIN); \endcode + * -# enable interrupts globally: + * - \code cpu_irq_enable(); \endcode + * - \attention Interrupts will not trigger without this step. + * + * \section pmic_use_cases Advanced use cases + * For more advanced use of the PMIC driver, see the following use cases: + * - \subpage pmic_use_case_1 : atomic operations + */ + +/** + * \page pmic_use_case_1 Use case #1 + * + * In this use case, the PMIC is configured for: + * - all interrupt levels enabled + * + * This will allow for interrupts from other modules being used. + * + * This use case shows how to make an operation which consists of multiple + * instructions uninterruptible, i.e., into an atomic operation. This is often + * necessary if there is a risk that data can be accessed by interrupt handlers + * while other code is accessing it, and at least one of them modifies it. + * + * \section pmic_use_case_1_setup Setup steps + * + * \subsection pmic_basic_use_case_setup_prereq Prerequisites + * For the setup code of this use case to work, the following must + * be added to the project: + * -# Interrupts for the module requiring the PMIC module have to be + * enabled. + * -# An Interrupt Service Routine (ISR) for a given interrupt vector has to be + * defined, where the interrupt vectors available are defined by toolchain and + * listed in the subsection 'Interrupt Vector Summary' in the data sheet. + * \code + ISR(interrupt_vector){ + //Interrupt Service Routine + } +\endcode + * + * \subsection pmic_use_case_1_setup_code Example code + * Add to application initialization: + * \code + pmic_init(); + cpu_irq_enable(); +\endcode + * + * \subsection pmic_use_case_1_setup_flow Workflow + * -# call the PMIC driver's own init function to enable all interrupt levels: + * - \code pmic_init(); \endcode + * -# set global interrupt enable flag: + * - \code cpu_irq_enable(); \endcode + * + * \section pmic_use_case_1_usage Usage steps + * + * \subsection pmic_use_case_1_usage_code Example code + * \code + Add to application: + void atomic_operation(void) + { + irqflags_t flags; + + flags = cpu_irq_save(); + + // Uninterruptible block of code + + cpu_irq_restore(flags); + } +\endcode + * + * \subsection pmic_use_case_1_usage_flow Workflow + * -# allocate temporary storage for interrupt enable: + * - \code irqflags_t flags; \endcode + * -# clear global interrupt enable flag while saving its previous state: + * - \code flags = cpu_irq_save(); \endcode + * -# restore the previous state of global interrupt flag after operation: + * - \code cpu_irq_restore(flags); \endcode + */ + +#endif /* PMIC_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/sleep/sleep.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/sleep/sleep.h new file mode 100644 index 00000000..8a218c41 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/sleep/sleep.h @@ -0,0 +1,169 @@ +/** + * \file + * + * \brief Sleep controller driver + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef SLEEP_H +#define SLEEP_H + +#include + +/** + * \defgroup sleep_group Sleep controller driver + * + * This is a low-level driver implementation for the AVR XMEGA sleep controller. + * + * \note To minimize the code overhead, these functions do not feature + * interrupt-protected access since they are likely to be called inside + * interrupt handlers or in applications where such protection is not + * necessary. If such protection is needed, it must be ensured by the calling + * code. + * + * \section xmega_sleep_quickstart_section Quick Start Guide + * See \ref xmega_sleep_quickstart + * @{ + */ + +#if defined(__ICCAVR__) || defined(__DOXYGEN__) +# include +//! Macro for issuing the sleep instruction. +# define sleep_enter() __sleep() + +/** + * \brief Enable sleep + */ +static inline void sleep_enable(void) +{ + SLEEP.CTRL |= SLEEP_SEN_bm; +} + +/** + * \brief Disable sleep + */ +static inline void sleep_disable(void) +{ + SLEEP.CTRL &= ~SLEEP_SEN_bm; +} + +#elif defined(__GNUC__) +# include +# define sleep_enter() sleep_cpu() + +#else +# error Unsupported compiler. +#endif + +/** + * \brief Set new sleep mode + * + * \param mode Sleep mode, from the device IO header file. + */ +static inline void sleep_set_mode(enum SLEEP_SMODE_enum mode) +{ + SLEEP.CTRL = mode | (SLEEP.CTRL & ~SLEEP_SMODE_gm); +} + +//! @} + +/** + * \page xmega_sleep_quickstart Quick Start Guide for the XMEGA Sleep Driver + * + * This is the quick start guide for the \ref sleep_group "Sleep Driver", with + * step-by-step instructions on how to configure and use the driver for a + * specific use case. + * + * The section described below can be copied into, e.g. the main application + * loop or any other function that will need to control and execute different + * sleep modes on the device. + * + * \section xmega_sleep_quickstart_basic Basic usage of the sleep driver + * This use case will prepare the device to enter the Power Down sleep mode and + * then enter the sleep mode. After waking up it will disable sleep. + * + * \section xmega_sleep_basic_usage Usage steps + * \subsection xmega_sleep_basic_usage_code Example code + * Add to, e.g., the main loop in the application C-file: + * \code + sleep_set_mode(SLEEP_SMODE_PDOWN_gc); + sleep_enable(); + sleep_enter(); + sleep_disable(); +\endcode + * + * \subsection xmega_sleep_basic_usage Workflow + * -# Set what sleep mode to use, the different sleep modes can be found in the + * device header file under the enum definition SLEEP_SMODE_enum: + * - \code sleep_set_mode(SLEEP_SMODE_PDOWN_gc); \endcode + * -# Enable that the device are allowed to go to sleep: + * - \code sleep_enable(); \endcode + * - \note This function has to be called in order for the device to go to + * sleep. This is a safety feature to stop the device to go to sleep + * unintentionally, even though it is possible to have this enabled at all times + * it is recommended to enable sleep mode only when you intend to go to sleep + * within a few clock cycles. + * -# Enter sleep mode: + * - \code sleep_enter(); \endcode + * - \attention Make sure to enable global interrupt and the interrupt you + * plan to use as wake-up source for your device, do also pay special + * attention to what wake-up sources are available for the different sleep + * modes. Failing to enable interrupts may result in indefinite sleep until + * power is cycled! + * -# When the device is woken from sleep it will execute the interrupt handler + * related to the wakeup-source (interrupt source) and continue on the next line + * of code after the \ref sleep_enter() call. Make sure to disable sleep when + * waking up. + * - \code sleep_disable(); \endcode + * + * \subsection xmega_sleep_basic_sleep_modes Sleep Modes + * Possible sleep modes depend on the device that is used. Please refer to the + * device datasheet and header file to find these definitions. + * + * As an example the ATxmega32A4U device has the following sleep modes: + * - Idle sleep: SLEEP_SMODE_IDLE_gc + * - Power Down: SLEEP_SMODE_PDOWN_gc + * - Power Save: SLEEP_SMODE_PSAVE_gc + * - Standby: SLEEP_SMODE_STDBY_gc + * - Extended standby: SLEEP_SMODE_ESTDBY_gc + */ + +#endif /* SLEEP_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/spi/spi.c b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/spi/spi.c new file mode 100644 index 00000000..37511077 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/spi/spi.c @@ -0,0 +1,119 @@ +/***************************************************************************** + * + * \file + * + * \brief SPI software driver functions. + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + *****************************************************************************/ +/* + * Support and FAQ: visit Atmel Support + */ + +#include "spi.h" + +/*! \brief Calculates the SPI baudrate divider. + * + * \param baudrate The expected baudrate on the SPI. + * \param clkper_hz SPI module input clock frequency (Peripheral clock, Hz). + * \param spi The SPI module address + * + * \return Status of operation. + * \retval >=0 Success. + * \retval <0 Error. + */ +int8_t spi_xmega_set_baud_div(SPI_t *spi, uint32_t baudrate, uint32_t clkper_hz) +{ + uint32_t divisor; + uint8_t divisor_8bit; + uint8_t ctrl; + + // Sanity check, requested baudrate is lower than system clock + Assert(clkper_hz > baudrate); + + /* + * Get wanted divisor rounded up so we don't get speed higher than + * requested baudrate. + */ + divisor = (clkper_hz + baudrate - 1) / baudrate; + + if (divisor > 128) { + /* + * Highest possible divisor is 128 so fail since we can't get + * low enough baudrate. + */ + return -1; + } + + /* + * We now know that the divisor is 128 or lower so move it into a 8-bit + * variable to make sure the following comparison is more optimized. + */ + divisor_8bit = divisor; + + /* + * For divisor values between the possible ones round up to the closest + * higher one to avoid higher baudrate than requested. + */ + if (divisor_8bit > 64) { + ctrl = SPI_PRESCALER_DIV128_gc; + } + else if (divisor_8bit > 32) { + ctrl = SPI_PRESCALER_DIV64_gc; + } + else if (divisor_8bit > 16) { + ctrl = SPI_CLK2X_bm | SPI_PRESCALER_DIV64_gc; + } + else if (divisor_8bit > 8) { + ctrl = SPI_PRESCALER_DIV16_gc; + } + else if (divisor_8bit > 4) { + ctrl = SPI_CLK2X_bm | SPI_PRESCALER_DIV16_gc; + } + else if (divisor_8bit > 2) { + ctrl = SPI_PRESCALER_DIV4_gc; + } + else { + ctrl = SPI_CLK2X_bm | SPI_PRESCALER_DIV4_gc; + } + + // Update register and make sure to clear out any leftover bits + spi->CTRL = (spi->CTRL & ~(SPI_CLK2X_bm | SPI_PRESCALER_gm)) | ctrl; + + return 1; +} diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/spi/spi.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/spi/spi.h new file mode 100644 index 00000000..766f6329 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/spi/spi.h @@ -0,0 +1,166 @@ +/***************************************************************************** + * + * \file + * + * \brief SPI driver for AVR. + * + * This file defines a useful set of functions for the SPI interface on AVR + * devices. + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + ******************************************************************************/ +/* + * Support and FAQ: visit Atmel Support + */ + + +#ifndef _SPI_H_ +#define _SPI_H_ + +/** + * \defgroup group_xmega_drivers_spi SPI - Serial Peripheral Interface + * + * Driver for the Serial Peripheral Interface (SPI). + * Provides functions for configuring and using the SPI. + * + * \{ + */ + +#include "compiler.h" +#include "status_codes.h" +#include "ioport.h" + +/*! \brief Calculates the SPI baudrate divider. + * + * \param baudrate The expected baudrate on the SPI. + * \param clkper_hz SPI module input clock frequency (Peripheral clock, Hz). + * \param spi The SPI module address + * + * \return Divider or error code. + * \retval >=0 Success. + * \retval <0 Error. + */ +int8_t spi_xmega_set_baud_div(SPI_t *spi, uint32_t baudrate, uint32_t clkper_hz); + +/*! \brief Enables the SPI. + * + * \param spi Base address of the SPI instance. + */ +static inline void spi_enable(SPI_t *spi) +{ + spi->CTRL |= SPI_ENABLE_bm; +} + +/*! \brief Disables the SPI. + * + * Ensures that nothing is transferred while setting up buffers. + * + * \param spi Base address of the SPI instance. + * + * \warning This may cause data loss if used on a slave SPI. + */ +static inline void spi_disable(SPI_t *spi) +{ + spi->CTRL &= ~SPI_ENABLE_bm; +} + +/*! \brief Tests if the SPI is enabled. + * + * \param spi Base address of the SPI instance. + * + * \return \c 1 if the SPI is enabled, otherwise \c 0. + */ +static inline bool spi_is_enabled(SPI_t *spi) +{ + return spi->CTRL & SPI_ENABLE_bm ? true : false; +} + +/*! \brief Put one data byte to a SPI peripheral. + * + * \param spi Base address of the SPI instance. + * \param data The data byte to be loaded + * + */ +static inline void spi_put(SPI_t *spi, uint8_t data) +{ + spi->DATA = data; +} + +/*! \brief Get one data byte to a SPI peripheral. + * + * \param spi Base address of the SPI instance. + * \return The data byte + * + */ +static inline uint8_t spi_get(SPI_t *spi) +{ + return spi->DATA; +} + +/*! \brief Tests if the SPI contains a received character. + * + * \param spi Base address of the SPI instance. + * + * \return \c 1 if the SPI Receive Holding Register is full, otherwise \c 0. + */ +static inline bool spi_is_tx_ok(SPI_t *spi) +{ + return spi->STATUS & SPI_IF_bm ? true : false; +} + +/*! \brief Activate SPI master mode of a SPI peripheral + * + * \param spi Base address of the SPI instance. + * + * \warning This may cause data loss if used on a slave SPI. + */ +static inline void spi_enable_master_mode(SPI_t *spi) +{ + spi->CTRL |= SPI_MASTER_bm; +} + +/*! \name Part Specific SPI Driver + */ +//! @{ +//! @} + +/** + * \} + */ + +#endif // _SPI_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/usart/usart.c b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/usart/usart.c new file mode 100644 index 00000000..a4bc1421 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/usart/usart.c @@ -0,0 +1,467 @@ +/** + * \file + * + * \brief USART driver for AVR XMEGA. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#include +#include "compiler.h" +#include "usart.h" +#include "sysclk.h" +#include "ioport.h" +#include "status_codes.h" + +/* + * Fix XMEGA header files + * USART.CTRLC bit masks and bit positions + */ +#ifndef USART_UCPHA_bm +# define USART_UCPHA_bm 0x02 +#endif +#ifndef USART_DORD_bm +# define USART_DORD_bm 0x04 +#endif + +/** + * \brief Initialize USART in RS232 mode. + * + * This function initializes the USART module in RS232 mode using the + * usart_rs232_options_t configuration structure and CPU frequency. + * + * \param usart The USART module. + * \param opt The RS232 configuration option. + * + * \retval true if the initialization was successfull + * \retval false if the initialization failed (error in baud rate calculation) + */ +bool usart_init_rs232(USART_t *usart, const usart_rs232_options_t *opt) +{ + bool result; + sysclk_enable_peripheral_clock(usart); + usart_set_mode(usart, USART_CMODE_ASYNCHRONOUS_gc); + usart_format_set(usart, opt->charlength, opt->paritytype, + opt->stopbits); + result = usart_set_baudrate(usart, opt->baudrate, sysclk_get_per_hz()); + usart_tx_enable(usart); + usart_rx_enable(usart); + + return result; +} + +/** + * \brief Initialize USART in SPI master mode. + * + * This function initializes the USART module in SPI master mode using the + * usart_spi_options_t configuration structure and CPU frequency. + * + * \param usart The USART module. + * \param opt The RS232 configuration option. + */ +void usart_init_spi(USART_t *usart, const usart_spi_options_t *opt) +{ + ioport_pin_t sck_pin; + bool invert_sck; + + sysclk_enable_peripheral_clock(usart); + + usart_rx_disable(usart); + + /* configure Clock polarity using INVEN bit of the correct SCK I/O port **/ + invert_sck = (opt->spimode == 2) || (opt->spimode == 3); + UNUSED(invert_sck); + +#ifdef USARTC0 + if ((uint16_t)usart == (uint16_t)&USARTC0) { +# ifdef PORT_USART0_bm + if (PORTC.REMAP & PORT_USART0_bm) { + sck_pin = IOPORT_CREATE_PIN(PORTC, 5); + } else { + sck_pin = IOPORT_CREATE_PIN(PORTC, 1); + } +# else + sck_pin = IOPORT_CREATE_PIN(PORTC, 1); +# endif + } +#endif +#ifdef USARTC1 + if ((uint16_t)usart == (uint16_t)&USARTC1) { + sck_pin = IOPORT_CREATE_PIN(PORTC, 5); + } +#endif +#ifdef USARTD0 + if ((uint16_t)usart == (uint16_t)&USARTD0) { +# ifdef PORT_USART0_bm + if (PORTD.REMAP & PORT_USART0_bm) { + sck_pin = IOPORT_CREATE_PIN(PORTD, 5); + } else { + sck_pin = IOPORT_CREATE_PIN(PORTD, 1); + } +# else + sck_pin = IOPORT_CREATE_PIN(PORTD, 1); +# endif + } +#endif +#ifdef USARTD1 + if ((uint16_t)usart == (uint16_t)&USARTD1) { + sck_pin = IOPORT_CREATE_PIN(PORTD, 5); + } +#endif +#ifdef USARTE0 + if ((uint16_t)usart == (uint16_t)&USARTE0) { +# ifdef PORT_USART0_bm + if(PORTE.REMAP & PORT_USART0_bm) { + sck_pin = IOPORT_CREATE_PIN(PORTE, 5); + } else { + sck_pin = IOPORT_CREATE_PIN(PORTE, 1); + } +# else + sck_pin = IOPORT_CREATE_PIN(PORTE, 1); +# endif + } +#endif +#ifdef USARTE1 + if ((uint16_t)usart == (uint16_t)&USARTE1) { + sck_pin = IOPORT_CREATE_PIN(PORTE, 5); + } +#endif +#ifdef USARTF0 + if ((uint16_t)usart == (uint16_t)&USARTF0) { +# ifdef PORT_USART0_bm + if(PORTF.REMAP & PORT_USART0_bm) { + sck_pin = IOPORT_CREATE_PIN(PORTF, 5); + } else { + sck_pin = IOPORT_CREATE_PIN(PORTF, 1); + } +# else + sck_pin = IOPORT_CREATE_PIN(PORTF, 1); +# endif + } +#endif +#ifdef USARTF1 + if ((uint16_t)usart == (uint16_t)&USARTF1) { + sck_pin = IOPORT_CREATE_PIN(PORTF, 5); + } +#endif + + /* Configure the USART output pin */ + ioport_set_pin_dir(sck_pin, IOPORT_DIR_OUTPUT); + ioport_set_pin_mode(sck_pin, + IOPORT_MODE_TOTEM | (invert_sck? IOPORT_MODE_INVERT_PIN : 0)); + ioport_set_pin_level(sck_pin, IOPORT_PIN_LEVEL_HIGH); + + usart_set_mode(usart, USART_CMODE_MSPI_gc); + + if (opt->spimode == 1 || opt->spimode == 3) { + usart->CTRLC |= USART_UCPHA_bm; + } else { + usart->CTRLC &= ~USART_UCPHA_bm; + } + if (opt->data_order) { + (usart)->CTRLC |= USART_DORD_bm; + } else { + (usart)->CTRLC &= ~USART_DORD_bm; + } + + usart_spi_set_baudrate(usart, opt->baudrate, sysclk_get_per_hz()); + usart_tx_enable(usart); + usart_rx_enable(usart); +} + +/** + * \brief Send a data with the USART module + * + * This function outputs a data using the USART module. + * + * \param usart The USART module. + * \param c The data to send. + * + * \return STATUS_OK + */ +enum status_code usart_putchar(USART_t *usart, uint8_t c) +{ + while (usart_data_register_is_empty(usart) == false) { + } + + (usart)->DATA = c; + return STATUS_OK; +} + +/** + * \brief Receive a data with the USART module + * + * This function returns the received data from the USART module. + * + * \param usart The USART module. + * + * \return The received data. + */ +uint8_t usart_getchar(USART_t *usart) +{ + while (usart_rx_is_complete(usart) == false) { + } + + return ((uint8_t)(usart)->DATA); +} + +/** + * \brief Get the offset for lookup in the baudrate table + * + * \param baud The requested baudrate + * + * \return The baudrate offset in PROGMEM table + * \retval USART_BAUD_UNDEFINED for baudrates not in lookup table + */ +static uint8_t usart_get_baud_offset(uint32_t baud) +{ + switch (baud) { + case 1200: + return (uint8_t)USART_BAUD_1200; + + case 2400: + return (uint8_t)USART_BAUD_2400; + + case 4800: + return (uint8_t)USART_BAUD_4800; + + case 9600: + return (uint8_t)USART_BAUD_9600; + + case 19200: + return (uint8_t)USART_BAUD_19200; + + case 38400: + return (uint8_t)USART_BAUD_38400; + + case 57600: + return (uint8_t)USART_BAUD_57600; + + default: + return (uint8_t)USART_BAUD_UNDEFINED; + } +} + +/** + * \brief Set the baudrate by setting the BSEL and BSCALE values in the USART + * + * This function sets the selected BSEL and BSCALE value in the BAUDCTRL + * registers with BSCALE 0. For calculation options, see table 21-1 in XMEGA A + * manual. + * + * \param usart The USART module. + * \param bsel Calculated BSEL value. + * \param bscale Calculated BSEL value. + * + */ +void usart_set_bsel_bscale_value(USART_t *usart, uint16_t bsel, uint8_t bscale) +{ + (usart)->BAUDCTRLA = (uint8_t)(bsel); + (usart)->BAUDCTRLB = (uint8_t)(((bsel >> 8) & 0X0F) | (bscale << 4)); +} + +/** + * \brief Set the baudrate using precalculated BAUDCTRL values from PROGMEM + * + * \note This function only works for cpu_hz 2Mhz or 32Mhz and baudrate values + * 1200, 2400, 4800, 9600, 19200, 38400 and 57600. + * + * \param usart The USART module. + * \param baud The baudrate. + * \param cpu_hz The CPU frequency. + * + */ +void usart_set_baudrate_precalculated(USART_t *usart, uint32_t baud, + uint32_t cpu_hz) +{ + uint8_t baud_offset; + uint16_t baudctrl = 0; + + baud_offset = usart_get_baud_offset(baud); + + if (cpu_hz == 2000000UL) { + baudctrl = PROGMEM_READ_WORD(baudctrl_2mhz + baud_offset); + } else if (cpu_hz == 32000000UL) { + baudctrl = PROGMEM_READ_WORD(baudctrl_32mhz + baud_offset); + } else { + /* Error, system clock speed or USART baud rate is not supported + * by the look-up table */ + Assert(false); + } + + if (baud_offset != USART_BAUD_UNDEFINED) { + (usart)->BAUDCTRLB = (uint8_t)((uint16_t)baudctrl); + (usart)->BAUDCTRLA = (uint8_t)((uint16_t)baudctrl >> 8); + } +} + +/** + * \brief Set the baudrate value in the USART module + * + * This function sets the baudrate register with scaling regarding the CPU + * frequency and makes sure the baud rate is supported by the hardware. + * The function can be used if you don't want to calculate the settings + * yourself or changes to baudrate at runtime is required. + * + * \param usart The USART module. + * \param baud The baudrate. + * \param cpu_hz The CPU frequency. + * + * \retval true if the hardware supports the baud rate + * \retval false if the hardware does not support the baud rate (i.e. it's + * either too high or too low.) + */ +bool usart_set_baudrate(USART_t *usart, uint32_t baud, uint32_t cpu_hz) +{ + int8_t exp; + uint32_t div; + uint32_t limit; + uint32_t ratio; + uint32_t min_rate; + uint32_t max_rate; + + /* + * Check if the hardware supports the given baud rate + */ + /* 8 = (2^0) * 8 * (2^0) = (2^BSCALE_MIN) * 8 * (BSEL_MIN) */ + max_rate = cpu_hz / 8; + /* 4194304 = (2^7) * 8 * (2^12) = (2^BSCALE_MAX) * 8 * (BSEL_MAX+1) */ + min_rate = cpu_hz / 4194304; + + if (!((usart)->CTRLB & USART_CLK2X_bm)) { + max_rate /= 2; + min_rate /= 2; + } + + if ((baud > max_rate) || (baud < min_rate)) { + return false; + } + + /* Check if double speed is enabled. */ + if (!((usart)->CTRLB & USART_CLK2X_bm)) { + baud *= 2; + } + + /* Find the lowest possible exponent. */ + limit = 0xfffU >> 4; + ratio = cpu_hz / baud; + + for (exp = -7; exp < 7; exp++) { + if (ratio < limit) { + break; + } + + limit <<= 1; + + if (exp < -3) { + limit |= 1; + } + } + + /* + * Depending on the value of exp, scale either the input frequency or + * the target baud rate. By always scaling upwards, we never introduce + * any additional inaccuracy. + * + * We are including the final divide-by-8 (aka. right-shift-by-3) in + * this operation as it ensures that we never exceeed 2**32 at any + * point. + * + * The formula for calculating BSEL is slightly different when exp is + * negative than it is when exp is positive. + */ + if (exp < 0) { + /* We are supposed to subtract 1, then apply BSCALE. We want to + * apply BSCALE first, so we need to turn everything inside the + * parenthesis into a single fractional expression. + */ + cpu_hz -= 8 * baud; + + /* If we end up with a left-shift after taking the final + * divide-by-8 into account, do the shift before the divide. + * Otherwise, left-shift the denominator instead (effectively + * resulting in an overall right shift.) + */ + if (exp <= -3) { + div = ((cpu_hz << (-exp - 3)) + baud / 2) / baud; + } else { + baud <<= exp + 3; + div = (cpu_hz + baud / 2) / baud; + } + } else { + /* We will always do a right shift in this case, but we need to + * shift three extra positions because of the divide-by-8. + */ + baud <<= exp + 3; + div = (cpu_hz + baud / 2) / baud - 1; + } + + (usart)->BAUDCTRLB = (uint8_t)(((div >> 8) & 0X0F) | (exp << 4)); + (usart)->BAUDCTRLA = (uint8_t)div; + + return true; +} + +/** + * \brief Set the baudrate value in the USART_SPI module + * + * This function sets the baudrate register regarding the CPU frequency. + * + * \param usart The USART(SPI) module. + * \param baud The baudrate. + * \param cpu_hz The CPU frequency. + */ +void usart_spi_set_baudrate(USART_t *usart, uint32_t baud, uint32_t cpu_hz) +{ + uint16_t bsel_value; + + /* Check if baudrate is less than the maximim limit specified in + * datasheet */ + if (baud < (cpu_hz / 2)) { + bsel_value = (cpu_hz / (baud * 2)) - 1; + } else { + /* If baudrate is not within the specfication in datasheet, + * assign maximum baudrate possible for the current CPU frequency */ + bsel_value = 0; + } + + (usart)->BAUDCTRLB = (uint8_t)((~USART_BSCALE_gm) & (bsel_value >> 8)); + (usart)->BAUDCTRLA = (uint8_t)(bsel_value); +} diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/usart/usart.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/usart/usart.h new file mode 100644 index 00000000..8a3cb986 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/usart/usart.h @@ -0,0 +1,558 @@ +/** + * \file + * + * \brief USART driver for AVR XMEGA. + * + * This file contains basic functions for the AVR XMEGA USART, with support for all + * modes, settings and clock speeds. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef _USART_H_ +#define _USART_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "compiler.h" +#include "pmic.h" + +/** + * \defgroup usart_group USART module (USART) + * + * See \ref xmega_usart_quickstart. + * + * This is a driver for configuring, enabling, disabling and use of the on-chip + * USART. + * + * \section dependencies Dependencies + * + * The USART module depends on the following modules: + * - \ref sysclk_group for peripheral clock control. + * - \ref port_driver_group for peripheral io port control. + * + * @{ + */ + +//! Offset in lookup table for baudrate 1200 +#define USART_BAUD_1200 0x00 +//! Offset in lookup table for baudrate 2400 +#define USART_BAUD_2400 0x01 +//! Offset in lookup table for baudrate 4800 +#define USART_BAUD_4800 0x02 +//! Offset in lookup table for baudrate 9600 +#define USART_BAUD_9600 0x03 +//! Offset in lookup table for baudrate 19200 +#define USART_BAUD_19200 0x04 +//! Offset in lookup table for baudrate 38400 +#define USART_BAUD_38400 0x05 +//! Offset in lookup table for baudrate 57600 +#define USART_BAUD_57600 0x06 +//! Baudrate not in lookup table +#define USART_BAUD_UNDEFINED 0xFF + +//! Lookup table containing baudctrl values for CPU frequency 2 Mhz +static PROGMEM_DECLARE(uint16_t, baudctrl_2mhz[]) = { + 0xE5BC, // Baud: 1200 + 0xC5AC, // Baud: 2400 + 0x859C, // Baud: 4800 + 0x0396, // Baud: 9600 + 0xC192, // Baud: 19200 + 0x2191, // Baud: 38400 + 0x9690, // Baud: 57600 +}; + +//! Lookup table containing baudctrl values for CPU frequency 32 Mhz +static PROGMEM_DECLARE(uint16_t, baudctrl_32mhz[]) = { + 0x031D, // Baud: 1200 + 0x01ED, // Baud: 2400 + 0xFDDC, // Baud: 4800 + 0xF5CC, // Baud: 9600 + 0xE5BC, // Baud: 19200 + 0xC5AC, // Baud: 38400 + 0x6EA8, // Baud: 57600 +}; + + +//! Input parameters when initializing RS232 and similar modes. +typedef struct usart_rs232_options { + //! Set baud rate of the USART (unused in slave modes). + uint32_t baudrate; + + //! Number of bits to transmit as a character (5 to 9). + USART_CHSIZE_t charlength; + + //! Parity type: USART_PMODE_DISABLED_gc, USART_PMODE_EVEN_gc, + //! USART_PMODE_ODD_gc. + USART_PMODE_t paritytype; + + //! Number of stop bits between two characters: + //! true: 2 stop bits + //! false: 1 stop bit + bool stopbits; + +} usart_rs232_options_t; + +//! Input parameters when initializing SPI master mode. +typedef struct usart_spi_options { + //! Set baud rate of the USART in SPI mode. + uint32_t baudrate; + + //! SPI transmission mode. + uint8_t spimode; + + uint8_t data_order; +} usart_spi_options_t; + +//! USART interrupt levels +enum usart_int_level_t { + USART_INT_LVL_OFF = 0x00, + USART_INT_LVL_LO = 0x01, + USART_INT_LVL_MED = 0x02, + USART_INT_LVL_HI = 0x03, +}; + +/** + * \brief Enable USART receiver. + * + * \param usart Pointer to the USART module + */ +static inline void usart_rx_enable(USART_t *usart) +{ + (usart)->CTRLB |= USART_RXEN_bm; +} + +/** + * \brief Disable USART receiver. + * + * \param usart Pointer to the USART module. + */ +static inline void usart_rx_disable(USART_t *usart) +{ + (usart)->CTRLB &= ~USART_RXEN_bm; +} + +/** + * \brief Configure the USART frame format. + * + * Sets the frame format, Frame Size, parity mode and number of stop bits. + * + * \param usart Pointer to the USART module + * \param charSize The character size. Use USART_CHSIZE_t type. + * \param parityMode The parity Mode. Use USART_PMODE_t type. + * \param twoStopBits Enable two stop bit mode. Use bool type. + */ +static inline void usart_format_set(USART_t *usart, USART_CHSIZE_t charSize, + USART_PMODE_t parityMode, bool twoStopBits) +{ + (usart)->CTRLC = (uint8_t)charSize | parityMode + | (twoStopBits ? USART_SBMODE_bm : 0); +} + +/** + * \brief Enable USART transmitter. + * + * \param usart Pointer to the USART module. + */ +static inline void usart_tx_enable(USART_t *usart) +{ + (usart)->CTRLB |= USART_TXEN_bm; +} + +/** + * \brief Disable USART transmitter. + * + * \param usart Pointer to the USART module. + */ +static inline void usart_tx_disable(USART_t *usart) +{ + (usart)->CTRLB &= ~USART_TXEN_bm; +} + +/** + * \brief Set USART RXD interrupt level. + * + * Sets the interrupt level on RX Complete interrupt. + * + * \param usart Pointer to the USART module. + * \param level Interrupt level of the RXD interrupt. + */ +static inline void usart_set_rx_interrupt_level(USART_t *usart, + enum usart_int_level_t level) +{ + (usart)->CTRLA = ((usart)->CTRLA & ~USART_RXCINTLVL_gm) | + (level << USART_RXCINTLVL_gp); +} + +/** + * \brief Set USART TXD interrupt level. + * + * Sets the interrupt level on TX Complete interrupt. + * + * \param usart Pointer to the USART module. + * \param level Interrupt level of the TXD interrupt. + */ +static inline void usart_set_tx_interrupt_level(USART_t *usart, + enum usart_int_level_t level) +{ + (usart)->CTRLA = ((usart)->CTRLA & ~USART_TXCINTLVL_gm) | + (level << USART_TXCINTLVL_gp); +} + +/** + * \brief Set USART DRE interrupt level. + * + * Sets the interrupt level on Data Register interrupt. + * + * \param usart Pointer to the USART module. + * \param level Interrupt level of the DRE interrupt. + * Use USART_DREINTLVL_t type. + */ +static inline void usart_set_dre_interrupt_level(USART_t *usart, + enum usart_int_level_t level) +{ + (usart)->CTRLA = ((usart)->CTRLA & ~USART_DREINTLVL_gm) | + (level << USART_DREINTLVL_gp); +} + +/** + * \brief Set the mode the USART run in. + * + * Set the mode the USART run in. The default mode is asynchronous mode. + * + * \param usart Pointer to the USART module register section. + * \param usartmode Selects the USART mode. Use USART_CMODE_t type. + * + * USART modes: + * - 0x0 : Asynchronous mode. + * - 0x1 : Synchronous mode. + * - 0x2 : IrDA mode. + * - 0x3 : Master SPI mode. + */ +static inline void usart_set_mode(USART_t *usart, USART_CMODE_t usartmode) +{ + (usart)->CTRLC = ((usart)->CTRLC & (~USART_CMODE_gm)) | usartmode; +} + +/** + * \brief Check if data register empty flag is set. + * + * \param usart The USART module. + */ +static inline bool usart_data_register_is_empty(USART_t * usart) +{ + return (usart)->STATUS & USART_DREIF_bm; +} + +/** + * \brief Checks if the RX complete interrupt flag is set. + * + * Checks if the RX complete interrupt flag is set. + * + * \param usart The USART module. + */ +static inline bool usart_rx_is_complete(USART_t * usart) +{ + return (usart)->STATUS & USART_RXCIF_bm; +} + +/** + * \brief Checks if the TX complete interrupt flag is set. + * + * Checks if the TX complete interrupt flag is set. + * + * \param usart The USART module. + */ +static inline bool usart_tx_is_complete(USART_t * usart) +{ + return (usart)->STATUS & USART_TXCIF_bm; +} + +/** + * \brief Clear TX complete interrupt flag. + * + * \param usart The USART module. + */ +static inline void usart_clear_tx_complete(USART_t * usart) +{ + (usart)->STATUS = USART_TXCIF_bm; +} + +/** + * \brief Clear RX complete interrupt flag. + * + * \param usart The USART module. + */ +static inline void usart_clear_rx_complete(USART_t *usart) +{ + (usart)->STATUS = USART_RXCIF_bm; +} + +/** + * \brief Write a data to the USART data register. + * + * \param usart The USART module. + * \param txdata The data to be transmitted. + */ +static inline void usart_put(USART_t * usart, uint8_t txdata) +{ + (usart)->DATA = txdata; +} + +/** + * \brief Read a data to the USART data register. + * + * \param usart The USART module. + * + * \return The received data + */ +static inline uint8_t usart_get(USART_t * usart) +{ + return (usart)->DATA; +} + +/** + * \brief Performs a data transfer on the USART in SPI mode. + * + * \param usart The USART module. + * \param txdata The data to be transmitted. + * + * \return The received data + */ +static inline uint8_t usart_spi_transmit(USART_t * usart, + uint8_t txdata) +{ + while (usart_data_register_is_empty(usart) == false); + usart_put(usart, txdata); + while (!usart_tx_is_complete(usart)); + usart_clear_tx_complete(usart); + return usart_get(usart); +} + +bool usart_init_rs232(USART_t *usart, const usart_rs232_options_t *opt); +void usart_init_spi(USART_t * usart, const usart_spi_options_t * opt); + +enum status_code usart_putchar(USART_t * usart, uint8_t c); +uint8_t usart_getchar(USART_t * usart); + +void usart_set_bsel_bscale_value(USART_t *usart, uint16_t bsel, uint8_t bscale); +void usart_set_baudrate_precalculated(USART_t *usart, uint32_t baud, + uint32_t cpu_hz); +bool usart_set_baudrate(USART_t *usart, uint32_t baud, uint32_t cpu_hz); +void usart_spi_set_baudrate(USART_t * usart, uint32_t baud, uint32_t cpu_hz); +//! @} + +#ifdef __cplusplus +} +#endif + +/** + * \page xmega_usart_quickstart Quick start guide for USART module + * + * This is the quick start guide for the \ref usart_group "USART module", with + * step-by-step instructions on how to configure and use the driver in a + * selection of use cases. + * + * The use cases contain several code fragments. The code fragments in the + * steps for setup can be copied into a custom initialization function, while + * the steps for usage can be copied into, e.g., the main application function. + * + * \section usart_basic_use_case Basic use case + * \section usart_use_cases USART use cases + * - \ref usart_basic_use_case + * - \subpage usart_use_case_1 + * + * \section usart_basic_use_case Basic use case - transmit a character + * In this use case, the USART module is configured for: + * - Using USARTD0 + * - Baudrate: 9600 + * - Character length: 8 bit + * - Parity mode: Disabled + * - Stop bit: None + * - RS232 mode + * + * \section usart_basic_use_case_setup Setup steps + * + * \subsection usart_basic_use_case_setup_prereq Prerequisites + * -# \ref sysclk_group + * \subsection usart_basic_use_case_setup_code Example code + * The following configuration must be added to the project (typically to a + * conf_usart.h file, but it can also be added to your main application file.) + * \code + #define USART_SERIAL &USARTD0 + #define USART_SERIAL_BAUDRATE 9600 + #define USART_SERIAL_CHAR_LENGTH USART_CHSIZE_8BIT_gc + #define USART_SERIAL_PARITY USART_PMODE_DISABLED_gc + #define USART_SERIAL_STOP_BIT false +\endcode + * + * Add to application initialization: + * \code + sysclk_init(); + static usart_rs232_options_t USART_SERIAL_OPTIONS = { + .baudrate = USART_SERIAL_BAUDRATE, + .charlength = USART_SERIAL_CHAR_LENGTH, + .paritytype = USART_SERIAL_PARITY, + .stopbits = USART_SERIAL_STOP_BIT + }; + sysclk_enable_module(SYSCLK_PORT_D, PR_USART0_bm); + usart_init_rs232(USART_SERIAL, &USART_SERIAL_OPTIONS); +\endcode + * + * \subsection usart_basic_use_case_setup_flow Workflow + * -# Initialize system clock: + * - \code sysclk_init(); \endcode + * - \note Not always required, but since the \ref usart_group driver is + * dependent on \ref sysclk_group it is good practise to initialize + * this module. + * -# Create USART options struct: + * - \code + static usart_rs232_options_t USART_SERIAL_OPTIONS = { + .baudrate = USART_SERIAL_BAUDRATE, + .charlength = USART_SERIAL_CHAR_LENGTH, + .paritytype = USART_SERIAL_PARITY, + .stopbits = USART_SERIAL_STOP_BIT + }; +\endcode + * -# Enable the clock for the USART module: + * - \code sysclk_enable_module(SYSCLK_PORT_D, PR_USART0_bm); \endcode + * -# Initialize in RS232 mode: + * - \code usart_init_rs232(USART_SERIAL, &USART_SERIAL_OPTIONS); +\endcode + * + * \section usart_basic_use_case_usage Usage steps + * + * \subsection usart_basic_use_case_usage_code Example code + * Add to application C-file: + * \code + usart_putchar(USART_SERIAL, 'a'); +\endcode + * + * \subsection usart_basic_use_case_usage_flow Workflow + * -# Send an 'a' character via USART + * - \code usart_putchar(USART_SERIAL, 'a'); \endcode + */ + +/** + * \page usart_use_case_1 USART receive character and echo back + * + * In this use case, the USART module is configured for: + * - Using USARTD0 + * - Baudrate: 9600 + * - Character length: 8 bit + * - Parity mode: Disabled + * - Stop bit: None + * - RS232 mode + * + * The use case waits for a received character on the configured USART and + * echoes the character back to the same USART. + * + * \section usart_use_case_1_setup Setup steps + * + * \subsection usart_use_case_1_setup_prereq Prerequisites + * -# \ref sysclk_group + * + * \subsection usart_use_case_1_setup_code Example code + * -# The following configuration must be added to the project (typically to a + * conf_usart.h file, but it can also be added to your main application file.): + * \code + #define USART_SERIAL &USARTD0 + #define USART_SERIAL_BAUDRATE 9600 + #define USART_SERIAL_CHAR_LENGTH USART_CHSIZE_8BIT_gc + #define USART_SERIAL_PARITY USART_PMODE_DISABLED_gc + #define USART_SERIAL_STOP_BIT false +\endcode + * + * A variable for the received byte must be added: + * \code uint8_t received_byte; \endcode + * + * Add to application initialization: + * \code + sysclk_init(); + static usart_rs232_options_t USART_SERIAL_OPTIONS = { + .baudrate = USART_SERIAL_BAUDRATE, + .charlength = USART_SERIAL_CHAR_LENGTH, + .paritytype = USART_SERIAL_PARITY, + .stopbits = USART_SERIAL_STOP_BIT + }; + sysclk_enable_module(SYSCLK_PORT_D, PR_USART0_bm); + usart_init_rs232(USART_SERIAL, &USART_SERIAL_OPTIONS); +\endcode + * + * \subsection usart_use_case_1_setup_flow Workflow + * -# Initialize system clock: + * - \code sysclk_init(); \endcode + * - \note Not always required, but since the \ref usart_group driver is + * dependent on \ref sysclk_group it is good practise to initialize + * this module. + * -# Create USART options struct: + * - \code + static usart_rs232_options_t USART_SERIAL_OPTIONS = { + .baudrate = USART_SERIAL_BAUDRATE, + .charlength = USART_SERIAL_CHAR_LENGTH, + .paritytype = USART_SERIAL_PARITY, + .stopbits = USART_SERIAL_STOP_BIT + }; +\endcode + * -# Enable the clock for the USART module: + * - \code sysclk_enable_module(SYSCLK_PORT_D, PR_USART0_bm); \endcode + * -# Initialize in RS232 mode: + * - \code usart_init_rs232(USART_SERIAL, &USART_SERIAL_OPTIONS); +\endcode + * + * \section usart_use_case_1_usage Usage steps + * + * \subsection usart_use_case_1_usage_code Example code + * Add to, e.g., main loop in application C-file: + * \code + received_byte = usart_getchar(USART_SERIAL); + usart_putchar(USART_SERIAL, received_byte); +\endcode + * + * \subsection usart_use_case_1_usage_flow Workflow + * -# Wait for reception of a character: + * - \code received_byte = usart_getchar(USART_SERIAL); \endcode + * -# Echo the character back: + * - \code usart_putchar(USART_SERIAL, received_byte); \endcode + */ + +#endif // _USART_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/usb/usb_device.c b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/usb/usb_device.c new file mode 100644 index 00000000..a0b77ded --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/usb/usb_device.c @@ -0,0 +1,1460 @@ +/** + * \file + * + * \brief USB Device driver + * Compliance with common driver UDD + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#include "conf_usb.h" + +// Read Modify Write opcode is implemented after IAR AVR 5.51 +#ifdef __ICCAVR__ +# if (__VER__ <= 551 || (__VER__ <= 611 && XMEGA_A1U) ) +# undef USB_WORKAROUND_DO_NOT_USE_RMW +# define USB_WORKAROUND_DO_NOT_USE_RMW +# endif +#endif + +#include "sysclk.h" +#include "udd.h" +#include "usb_device.h" +#include + +#ifndef UDD_NO_SLEEP_MGR +#include "sleepmgr.h" +#endif + +#ifndef UDD_USB_INT_LEVEL +// By default USB interrupt have low priority +# define UDD_USB_INT_LEVEL USB_INTLVL_MED_gc +#endif + + + +#ifdef USB_DEVICE_HS_SUPPORT +#error This product does not support high speed mode, please remove define USB_DEVICE_HS_SUPPORT in conf_usb.h +#endif + +//////////////////////////////////////////////////// +// USBB Device low-level driver (UDD) +//////////////////////////////////////////////////// +/** + * \ingroup udd_group + * \defgroup udd_xmega_usb_group Xmega USB Device Driver + * + * \section USBB_CONF USBB Custom configuration + * The following USBB driver configuration must be included in the conf_usb.h + * file of the application. + * + * UDD_USB_INT_LEVEL
+ * Option to change the interrupt priority (USB_INTLVL_x_gc) + * by default USB_INTLVL_LO_gc (recommended). + * + * \section Callbacks management + * The USB driver is fully managed by interrupt and does not request periodic + * task. Thereby, the USB events use callbacks to transfer the information. + * The callbacks are declared in static during compilation or in variable during + * code execution. + * + * Static declarations defined in conf_usb.h: + * - UDC_VBUS_EVENT(bool b_present)
+ * To signal Vbus level change + * - UDC_SUSPEND_EVENT()
+ * Called when USB bus enter in suspend mode + * - UDC_RESUME_EVENT()
+ * Called when USB bus is wakeup + * - UDC_SOF_EVENT()
+ * Called for each received SOF, Note: Each 1ms in HS/FS mode only. + * + * Dynamic callbacks, called "endpoint job" , are registered + * in udd_ep_job_t structure via the following functions: + * - udd_ep_run()
+ * To call it when a transfer is finish + * - udd_ep_wait_stall_clear()
+ * To call it when a endpoint halt is disabled + * + * \section Power mode management + * The Sleep modes authorized : + * - in USB IDLE state, the USB needs of USB clock and authorizes up to IDLE mode + * - in USB SUSPEND state, the USB no needs USB clock but requests a minimum + * clock restart timing. Thus, it authorizes up to POWER_DOWN or STANDBY mode. + * + * The USB_SLEEP_MODE_USB_IDLE equals SLEEPMGR_IDLE. + * + * The USB_SLEEP_MODE_USB_SUSPEND depends on USB clock startup timing: + * | Clock Startup | Sleep mode authorized | + * | >10ms | SLEEPMGR_STDBY | + * | <=10ms | SLEEPMGR_PDOWN | + * + * @{ + */ + + +// Check USB Device configuration +#ifndef USB_DEVICE_EP_CTRL_SIZE +# error USB_DEVICE_EP_CTRL_SIZE not defined +#endif +#ifndef USB_DEVICE_MAX_EP +# error USB_DEVICE_MAX_EP not defined +#endif + + +/** + * \name Power management routine. + */ +//@{ + + +#ifndef UDD_NO_SLEEP_MGR + +//! Definition of sleep levels +#if ((defined USB_DEVICE_HS_SUPPORT) && (USBCLK_STARTUP_TIMEOUT>3000)) \ + || ((!defined USB_DEVICE_HS_SUPPORT) && (USBCLK_STARTUP_TIMEOUT>10000)) +# define USBC_SLEEP_MODE_USB_SUSPEND SLEEPMGR_IDLE +#else +# define USBC_SLEEP_MODE_USB_SUSPEND SLEEPMGR_PDOWN +#endif +#define USBC_SLEEP_MODE_USB_IDLE SLEEPMGR_IDLE + +//! State of USB line +static bool udd_b_idle; + + +/*! \brief Authorize or not the CPU powerdown mode + * + * \param b_enable true to authorize powerdown mode + */ +static void udd_sleep_mode(bool b_idle) +{ + if (!b_idle && udd_b_idle) { + sleepmgr_unlock_mode(USBC_SLEEP_MODE_USB_IDLE); + } + if (b_idle && !udd_b_idle) { + sleepmgr_lock_mode(USBC_SLEEP_MODE_USB_IDLE); + } + udd_b_idle = b_idle; +} +#else + +static void udd_sleep_mode(bool b_idle) { +} +#endif // UDD_NO_SLEEP_MGR + +//@} + +/** + * \brief USB SRAM data about fifo, endpoint descriptor table and frame number + * + * The content of the USB SRAM can be: + * - modified by USB hardware by interface to signal endpoint status. + * Thereby, it is read by software. + * - modified by USB software to control endpoint. + * Thereby, it is read by hardware. + * This data section is volatile and the specific opcode read/modify/write must be used. + * + * @{ + */ +struct udd_sram_data { +#if XMEGA_A1U +# if (0!=((USB_DEVICE_MAX_EP+1)%4)) + uint8_t padding_align[16 - ((USB_DEVICE_MAX_EP + 1) * + sizeof(uint32_t)) % 16]; +# endif +#endif + uint32_t fifo[USB_DEVICE_MAX_EP + 1]; + USB_EP_t ep_ctrl[2 * (USB_DEVICE_MAX_EP + 1)]; + uint16_t frame_number; +}; +#if XMEGA_A1U +COMPILER_ALIGNED(16) +#else +COMPILER_ALIGNED(4) //! Caution seems GCC does not handle 2 alignment properly +#endif +static volatile struct udd_sram_data udd_sram; +#define UDD_EP_t USB_EP_t volatile + +// @} + +/** + * \name initialization of endpoint + */ +//@{ +/** + * \brief Configures and enables an endpoint + * + * \param ep Endpoint number including direction (USB_EP_DIR_IN/USB_EP_DIR_OUT). + * \param bmAttributes Attribute of endpoint declared in descriptor. + * \param MaxEndpointSize Endpoint size maximum + */ +static void udd_ep_init(udd_ep_id_t ep, uint8_t bmAttributes, + uint16_t MaxEndpointSize); + +/** + * \brief Returns a pointer on endpoint control SRAM corresponding at endpoint number + * + * \param ep Endpoint number including direction (USB_EP_DIR_IN/USB_EP_DIR_OUT). + * + * \return endpoint descriptor index + */ +static UDD_EP_t *udd_ep_get_ctrl(udd_ep_id_t ep); +//@} + + +/** + * \name Control endpoint low level management routine. + * + * This function performs control endpoint management. + * It handle the SETUP/DATA/HANDSHAKE phases of a control transaction. + */ +//@{ + +//! Global variable to give and record information about setup request management +udd_ctrl_request_t udd_g_ctrlreq; + +//! Bit definitions about endpoint control state machine for udd_ep_control_state +typedef enum { + UDD_EPCTRL_SETUP = 0, //!< Wait a SETUP packet + UDD_EPCTRL_DATA_OUT = 1, //!< Wait a OUT data packet + UDD_EPCTRL_DATA_IN = 2, //!< Wait a IN data packet + UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP = 3, //!< Wait a IN ZLP packet + UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP = 4, //!< Wait a OUT ZLP packet + UDD_EPCTRL_STALL_REQ = 5, //!< STALL enabled on IN & OUT packet +} udd_ctrl_ep_state_t; + +//! State of the endpoint control management +static udd_ctrl_ep_state_t udd_ep_control_state; +//! Total number of data received/sent during data packet phase with previous payload buffers +static uint16_t udd_ctrl_prev_payload_nb_trans; +//! Number of data received/sent to/from udd_g_ctrlreq.payload buffer +static uint16_t udd_ctrl_payload_nb_trans; + +/** + * \brief Buffer to store the data received on control endpoint (SETUP/OUT endpoint 0) + * + * Used to avoid a RAM buffer overflow in case of the payload buffer + * is smaller than control endpoint size + */ +static uint8_t udd_ctrl_buffer[USB_DEVICE_EP_CTRL_SIZE]; + +/** + * \brief Reset control endpoint management + * + * Called after a USB line reset or at the end of SETUP request (after ZLP) + */ +static void udd_ctrl_init(void); + +//! \brief Managed reception of SETUP packet on control endpoint +static void udd_ctrl_setup_received(void); + +//! \brief Managed reception of IN packet on control endpoint +static void udd_ctrl_in_sent(void); + +//! \brief Managed reception of OUT packet on control endpoint +static void udd_ctrl_out_received(void); + +//! \brief Managed underflow event of IN packet on control endpoint +//! It is used to detect a DATA phase stopped by the host via a ZLP request. +//! This is mandatory for chapter 8 compliance +static void udd_ctrl_underflow(void); + +//! \brief Managed overflow event of OUT packet on control endpoint +//! It is used to detect a DATA phase stopped by the host via a ZLP request. +//! This is mandatory for chapter 8 compliance +static void udd_ctrl_overflow(void); + +//! \brief Managed stall event of IN/OUT packet on control endpoint +static void udd_ctrl_stall_data(void); + +//! \brief Send a ZLP IN on control endpoint +static void udd_ctrl_send_zlp_in(void); + +//! \brief Send a ZLP OUT on control endpoint +static void udd_ctrl_send_zlp_out(void); + +//! \brief Call callback associated to setup request +static void udd_ctrl_endofrequest(void); + +/** + * \brief Sub interrupt routine to manage error on control endpoint + * + * \return \c 1 if an error about control endpoint is occurred, otherwise \c 0. + */ +static bool udd_ctrl_interrupt_error(void); + +/** + * \brief Sub interrupt routine to manage a SETUP transfer complete on control endpoint + * + * \return \c 1 if an SETUP transfer complete about control endpoint is occurred, + * otherwise \c 0. + */ +static bool udd_ctrl_interrupt_tc_setup(void); + +//@} + + +/** + * \name Management of bulk/interrupt/isochronous endpoints + * + * The UDD manages the data transfer on endpoints: + * - Start data transfer on endpoint with USB Device DMA + * - Send a ZLP packet if requested + * - Call callback registered to signal end of transfer + * The transfer abort and stall feature are supported. + */ +//@{ +#if (0!=USB_DEVICE_MAX_EP) + +//! Structure definition about job registered on an endpoint +typedef struct { + //! A job is registered on this endpoint + uint8_t busy:1; + //! A short packet is requested for this job on endpoint IN + uint8_t b_shortpacket:1; + //! The cache buffer is currently used on endpoint OUT + uint8_t b_use_out_cache_buffer:1; + //! Buffer located in internal RAM to send or fill during job + uint8_t *buf; + //! Size of buffer to send or fill + iram_size_t buf_size; + //! Total number of data transfered on endpoint + iram_size_t nb_trans; + union { + //! Callback to call at the end of transfer + udd_callback_trans_t call_trans; + //! Callback to call when the endpoint halt is cleared + udd_callback_halt_cleared_t call_nohalt; + }; +} udd_ep_job_t; + +//! Array to register a job on bulk/interrupt/isochronous endpoint +static udd_ep_job_t udd_ep_job[USB_DEVICE_MAX_EP * 2]; + +/** + * \brief Buffer to store the data received on bulk/interrupt endpoints + * + * Used to avoid a RAM buffer overflow in case of the user buffer + * is smaller than endpoint size + * + * \warning The isochronous endpoint is not protected by this system + * and the user must always use a buffer corresponding at endpoint size + */ +#ifdef USB_DEVICE_LOW_SPEED +static uint8_t udd_ep_out_cache_buffer[USB_DEVICE_MAX_EP][8]; +#else +static uint8_t udd_ep_out_cache_buffer[USB_DEVICE_MAX_EP][64]; +#endif + + +/** + * \brief Checks endpoint number + * + * \param ep endpoint number + */ +bool udd_ep_is_valid(udd_ep_id_t ep); + +/** + * \brief Manages transfer complete on bulk/interrupt/isochronous endpoints + * + * \param ep endpoint number to manage + */ +static void udd_ep_trans_complet(udd_ep_id_t ep); + +/** + * \brief Returns the size of endpoint + * + * \return the size of current selected endpoint + */ +static uint16_t udd_ep_get_size(UDD_EP_t * ep_ctrl); + +/** + * \brief Returns a pointer on endpoint job corresponding at endpoint number + * + * \param ep Endpoint number including direction (USB_EP_DIR_IN/USB_EP_DIR_OUT). + */ +static udd_ep_job_t *udd_ep_get_job(udd_ep_id_t ep); + +#endif // (0!=USB_DEVICE_MAX_EP) +//@} + + +void udd_enable(void) +{ + uint8_t i; + irqflags_t flags; + + // Sanity check Silicon revision +#if AVR8_PART_IS_DEFINED(ATxmega128A1U) + // The part ATxmega128A1U Rev. J is not supported, please use new silicon revision. + Assert(!(MCU_REVID < 0x0A)); +#endif + +#ifdef CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC +# if CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC == OSC_ID_USBSOF + // RC oscillator calibration via USB Start Of Frame is not available + // in low speed mode. + // Thus, the calibration is disabled + // when USB interface start in low speed mode + DFLLRC32M.CTRL = 0; +# endif +#endif + +#ifdef USB_DEVICE_LOW_SPEED + // The USB hardware need of 6MHz in low speed mode + sysclk_enable_usb(6); + udd_set_low_speed(); +#else + // The USB hardware need of 48MHz in full speed mode + sysclk_enable_usb(48); + udd_set_full_speed(); +#endif + +// The XMEGA_A1U does not support the RC calibration through Keepalive (Low speed). +#if (!defined USB_DEVICE_LOW_SPEED) || (!XMEGA_A1U) +# ifdef CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC +# if CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC == OSC_ID_USBSOF + // The SOF calibration can be enabled + DFLLRC32M.CTRL = DFLL_ENABLE_bm; +# endif +# endif +#endif + + flags = cpu_irq_save(); + + // Reset endpoints table + for (i = 0; i < ((USB_DEVICE_MAX_EP + 1) * 2); i++) { + udd_sram.ep_ctrl[i].CTRL = 0; + } +#if (0!=USB_DEVICE_MAX_EP) + // Reset internal variables + for (i = 0; i < (USB_DEVICE_MAX_EP * 2); i++) { + udd_ep_job[i].busy = false; + } +#endif + + //** Enable USB hardware + usb_pad_init(); + udd_set_nb_max_ep(USB_DEVICE_MAX_EP); + udd_enable_interface(); + udd_enable_store_frame_number(); +#if XMEGA_A1U + Assert(((uint16_t)(&udd_sram) & 0x0F) == 0); /* check align on 16bit */ +#else + Assert(((uint16_t)(&udd_sram) & 0x01) == 0); /* check align on WORD */ +#endif + udd_set_ep_table_addr(udd_sram.ep_ctrl); + // Enable TC fifo management + udd_enable_fifo(); + udd_reset_fifo(); + // Enable Interrupt USB Device + udd_enable_interrupt(UDD_USB_INT_LEVEL); + +#ifndef UDD_NO_SLEEP_MGR + // Initialize the sleep mode authorized for the USB suspend mode + udd_b_idle = false; + sleepmgr_lock_mode(USBC_SLEEP_MODE_USB_SUSPEND); +#endif + +#ifndef USB_DEVICE_ATTACH_AUTO_DISABLE + udd_attach(); +#endif + cpu_irq_restore(flags); +} + + +void udd_disable(void) +{ + irqflags_t flags; + flags = cpu_irq_save(); + udd_detach_device(); + // Disable interface + USB_CTRLA = 0; + USB_CTRLB = 0; + sysclk_disable_usb(); + udd_sleep_mode(false); +#ifndef UDD_NO_SLEEP_MGR + sleepmgr_unlock_mode(USBC_SLEEP_MODE_USB_SUSPEND); +#endif + cpu_irq_restore(flags); +} + +bool udd_include_vbus_monitoring(void) +{ + return false; // No Vbus monitoring +} + +void udd_attach(void) +{ + irqflags_t flags; + flags = cpu_irq_save(); + + // At startup the USB bus state is unknown, + // therefore the state is considered IDLE to not miss any USB event + udd_sleep_mode(true); + + udd_ack_suspend_event(); + udd_ack_resume_event(); + udd_attach_device(); + // Enable main USB interrupts + udd_enable_tc_interrupt(); + udd_enable_busevt_interrupt(); + udd_enable_setup_interrupt(); + udd_enable_start_of_frame_interrupt(); + + cpu_irq_restore(flags); +} + +void udd_detach(void) +{ + // Detach device from the bus + udd_detach_device(); +} + +bool udd_is_high_speed(void) +{ + return false; +} + +void udd_set_address(uint8_t address) +{ + udd_set_device_address(address); +} + +uint8_t udd_getaddress(void) +{ + return udd_get_device_address(); +} + +uint16_t udd_get_frame_number(void) +{ + return udd_sram.frame_number; +} + +uint16_t udd_get_micro_frame_number(void) +{ + return 0; +} + +void udd_send_remotewakeup(void) +{ +#ifndef UDD_NO_SLEEP_MGR + if (!udd_b_idle) +#endif + { + udd_sleep_mode(true); // Enter in IDLE mode + udd_send_remote_wake_up(); + } +} + +void udd_set_setup_payload( uint8_t *payload, uint16_t payload_size ) +{ + udd_g_ctrlreq.payload = payload; + udd_g_ctrlreq.payload_size = payload_size; +} + +#if (0!=USB_DEVICE_MAX_EP) +bool udd_ep_alloc(udd_ep_id_t ep, uint8_t bmAttributes, + uint16_t MaxEndpointSize) +{ + UDD_EP_t *ep_ctrl; + Assert(udd_ep_is_valid(ep)); + + ep_ctrl = udd_ep_get_ctrl(ep); + if (udd_endpoint_is_enable(ep_ctrl)) { + return false; // Already allocated + } + udd_ep_init(ep, bmAttributes, MaxEndpointSize); + +/* + // Do not use multipacket mode with isochronous 1023 bytes endpoint + if (udd_endpoint_get_type(ep_ctrl)==USB_EP_TYPE_ISOCHRONOUS_gc + && (udd_endpoint_get_size_field(ep_ctrl) + ==USB_EP_BUFSIZE_1023_gc)) { + return true; + }*/ + + udd_endpoint_set_multipacket(ep_ctrl); + return true; +} + +void udd_ep_free(udd_ep_id_t ep) +{ + UDD_EP_t *ep_ctrl; + Assert(udd_ep_is_valid(ep)); + + udd_ep_abort(ep); + ep_ctrl = udd_ep_get_ctrl(ep); + udd_endpoint_disable(ep_ctrl); +} + +bool udd_ep_is_halted(udd_ep_id_t ep) +{ + UDD_EP_t *ep_ctrl; + Assert(udd_ep_is_valid(ep)); + + ep_ctrl = udd_ep_get_ctrl(ep); + return (udd_endpoint_is_stall(ep_ctrl)); +} + +bool udd_ep_set_halt(udd_ep_id_t ep) +{ + UDD_EP_t *ep_ctrl; + Assert(udd_ep_is_valid(ep)); + + ep_ctrl = udd_ep_get_ctrl(ep); + udd_endpoint_enable_stall(ep_ctrl); + udd_endpoint_clear_dtgl(ep_ctrl); + + udd_ep_abort(ep); + return true; +} + +bool udd_ep_clear_halt(udd_ep_id_t ep) +{ + udd_ep_job_t *ptr_job; + UDD_EP_t *ep_ctrl; + Assert(udd_ep_is_valid(ep)); + + ep_ctrl = udd_ep_get_ctrl(ep); + if (!udd_endpoint_is_stall(ep_ctrl)) { + return true; // No stall on going + } + udd_endpoint_disable_stall(ep_ctrl); + + // If a job is register on clear halt action + // then execute callback + ptr_job = udd_ep_get_job(ep); + if (ptr_job->busy == true) { + ptr_job->busy = false; + ptr_job->call_nohalt(); + } + return true; +} + +bool udd_ep_run(udd_ep_id_t ep, bool b_shortpacket, uint8_t * buf, + iram_size_t buf_size, udd_callback_trans_t callback) +{ + udd_ep_job_t *ptr_job; + irqflags_t flags; + UDD_EP_t *ep_ctrl; + + Assert(udd_ep_is_valid(ep)); + + // Get control & job about this endpoint + ptr_job = udd_ep_get_job(ep); + ep_ctrl = udd_ep_get_ctrl(ep); + + if (!udd_endpoint_is_enable(ep_ctrl)) { + return false; // Endpoint not allocated + } + if (udd_endpoint_get_type(ep_ctrl)!=USB_EP_TYPE_ISOCHRONOUS_gc + && udd_endpoint_is_stall(ep_ctrl)) { + return false; // Endpoint is halted + } + flags = cpu_irq_save(); + if (ptr_job->busy == true) { + cpu_irq_restore(flags); + return false; // Job already on going + } + ptr_job->busy = true; + cpu_irq_restore(flags); + + + // Update Job information + ptr_job->buf = buf; + ptr_job->buf_size = buf_size; + ptr_job->nb_trans = 0; + ptr_job->call_trans = callback; + // Need to enable shortpacket to send a ZLP (buf_size==0) + ptr_job->b_shortpacket = b_shortpacket || (buf_size==0); + ptr_job->b_use_out_cache_buffer = false; + + // Initialize value to simulate a empty transfer + if (USB_EP_DIR_IN == (ep & USB_EP_DIR_IN)) { + udd_endpoint_in_reset_nb_sent(ep_ctrl); + } + else + { + if ((USB_EP_TYPE_ISOCHRONOUS_gc == udd_endpoint_get_type(ep_ctrl)) + && (0 != (buf_size % udd_ep_get_size(ep_ctrl)))) { + // The user must use a buffer size modulo endpoint size + ptr_job->busy = false; + return false; + } + udd_endpoint_out_reset_nb_received(ep_ctrl); + udd_endpoint_out_set_nbbyte(ep_ctrl, 0); + } + // Request next transfer + udd_ep_trans_complet(ep); + return true; +} + +void udd_ep_abort(udd_ep_id_t ep) +{ + UDD_EP_t *ep_ctrl; + udd_ep_job_t *ptr_job; + Assert(udd_ep_is_valid(ep)); + + ep_ctrl = udd_ep_get_ctrl(ep); + ptr_job = udd_ep_get_job(ep); + + // Stop transfer + udd_endpoint_set_NACK0(ep_ctrl); + if (ptr_job->busy == false) { + return; // No job on going + } + ptr_job->busy = false; + if (NULL != ptr_job->call_trans) { + ptr_job->call_trans(UDD_EP_TRANSFER_ABORT, + (ep & USB_EP_DIR_IN) ? + udd_endpoint_in_nb_sent(ep_ctrl) + : udd_endpoint_out_nb_receiv(ep_ctrl), + ep); + } +} + +bool udd_ep_wait_stall_clear(udd_ep_id_t ep, + udd_callback_halt_cleared_t callback) +{ + udd_ep_job_t *ptr_job; + UDD_EP_t *ep_ctrl; + Assert(udd_ep_is_valid(ep)); + + ep_ctrl = udd_ep_get_ctrl(ep); + ptr_job = udd_ep_get_job(ep); + + if (udd_endpoint_is_stall(ep_ctrl)) { + // Wait clear halt endpoint + if (ptr_job->busy == true) { + return false; // Job already on going + } + ptr_job->busy = true; + ptr_job->call_nohalt = callback; + } else { + // endpoint not halted then call directly callback + callback(); + } + return true; +} +#endif // (0!=USB_DEVICE_MAX_EP) + +//-------------------------------------------------------- +//--- INTERNAL ROUTINES TO MANAGED GLOBAL EVENTS + +/** + * \internal + * \brief Function called by USB bus event interrupt + * + * USB bus event interrupt includes : + * - USB line events SOF, reset, suspend, resume, wakeup + * - endpoint control errors underflow, overflow, stall + */ +ISR(USB_BUSEVENT_vect) +{ + if (udd_is_start_of_frame_event()) { + udd_ack_start_of_frame_event(); + udc_sof_notify(); +#ifdef UDC_SOF_EVENT + UDC_SOF_EVENT(); +#endif + goto udd_interrupt_bus_event_end; + } + + if (udd_ctrl_interrupt_error()) { + goto udd_interrupt_bus_event_end; + } + if (udd_is_reset_event()) { + udd_ack_reset_event(); +#if (0!=USB_DEVICE_MAX_EP) + // Abort all endpoint jobs on going + uint8_t i; + for (i = 1; i < USB_DEVICE_MAX_EP; i++) { + udd_ep_abort(i); + udd_ep_abort(i | USB_EP_DIR_IN); + } +#endif + udc_reset(); + + // Reset USB address to 0 + udd_set_device_address(0); + // Alloc and configure control endpoint + udd_ep_init(0, USB_EP_TYPE_CONTROL, USB_DEVICE_EP_CTRL_SIZE); + udd_ep_init(0 | USB_EP_DIR_IN, USB_EP_TYPE_CONTROL, + USB_DEVICE_EP_CTRL_SIZE); + udd_control_out_set_buf(&udd_ctrl_buffer); + // Reset endpoint control management + udd_ctrl_init(); + goto udd_interrupt_bus_event_end; + } + + if (udd_is_suspend_event()) { + udd_ack_suspend_event(); + udd_sleep_mode(false); // Enter in SUSPEND mode +#ifdef UDC_SUSPEND_EVENT + UDC_SUSPEND_EVENT(); +#endif + goto udd_interrupt_bus_event_end; + } + + if (udd_is_resume_event()) { + udd_ack_resume_event(); + udd_sleep_mode(true); // Enter in power reduction mode +#ifdef UDC_RESUME_EVENT + UDC_RESUME_EVENT(); +#endif + goto udd_interrupt_bus_event_end; + } + +udd_interrupt_bus_event_end: + return; +} + +/** + * \internal + * \brief Function called by USB transfer complete interrupt + * + * USB transfer complete interrupt includes events about endpoint transfer on all endpoints. + */ +ISR(USB_TRNCOMPL_vect) +{ +#if (0!=USB_DEVICE_MAX_EP) + uint8_t ep_index; + uint8_t i_fifo; + uint16_t ad; + uint16_t *p_ad; + int8_t rp; + UDD_EP_t *ep_ctrl; + udd_ep_id_t ep; +#endif + + if (!udd_is_tc_event()) { + // If no other transfer complete + // then check reception of SETUP packet on control endpoint + if (udd_ctrl_interrupt_tc_setup()) { + // Interrupt acked by control endpoint managed + goto udd_interrupt_tc_end; + } + Assert(false); + } + // Check IN/OUT transfer complete on all endpoints + udd_ack_tc_event(); + +#if (0!=USB_DEVICE_MAX_EP) + //** Decode TC FIFO + // Compute ep addr + rp = udd_get_fifo_rp(); + i_fifo = 2 * (1 + ~rp); + ad = ((uint16_t) udd_sram.ep_ctrl) - i_fifo; + p_ad = (uint16_t *) ad; + // Compute ep + ep_index = (((uint16_t) * p_ad - ((uint16_t) udd_sram.ep_ctrl)) >> 3); + ep = (ep_index / 2) + ((ep_index & 1) ? USB_EP_DIR_IN : 0); + Assert(USB_DEVICE_MAX_EP >= (ep & USB_EP_ADDR_MASK)); + + // Ack IT TC of endpoint + ep_ctrl = udd_ep_get_ctrl(ep); + if (!udd_endpoint_transfer_complete(ep_ctrl)) { + return; // Error, TC is generated by Multipacket transfer + } + udd_endpoint_ack_transfer_complete(ep_ctrl); + + // Check status on control endpoint + if (ep == 0) { + udd_ctrl_out_received(); + goto udd_interrupt_tc_end; // Interrupt acked by control endpoint managed + } + if (ep == (0 | USB_EP_DIR_IN)) { + udd_ctrl_in_sent(); + goto udd_interrupt_tc_end; // Interrupt acked by control endpoint managed + } + Assert(udd_ep_is_valid(ep)); + // Manage end of transfer on endpoint bulk/interrupt/isochronous + udd_ep_trans_complet(ep); + +#else + + udd_get_fifo_rp(); + if (udd_endpoint_transfer_complete(udd_ep_get_ctrl(0))) { + udd_endpoint_ack_transfer_complete(udd_ep_get_ctrl(0)); + udd_ctrl_out_received(); + }else{ + udd_endpoint_ack_transfer_complete(udd_ep_get_ctrl(0 | USB_EP_DIR_IN)); + udd_ctrl_in_sent(); + } +#endif + +udd_interrupt_tc_end: + return; +} + +//-------------------------------------------------------- +//--- INTERNAL ROUTINES TO INITIALIZE ENDPOINT + +static void udd_ep_init(udd_ep_id_t ep, uint8_t bmAttributes, + uint16_t MaxEndpointSize) +{ + USB_EP_TYPE_t type; + USB_EP_BUFSIZE_t size; + UDD_EP_t *ep_ctrl; + +#if (0!=USB_DEVICE_MAX_EP) + // Translate USB attribute to hardware defines + switch (bmAttributes & USB_EP_TYPE_MASK) { + case USB_EP_TYPE_CONTROL: + type = USB_EP_TYPE_CONTROL_gc; + break; + case USB_EP_TYPE_ISOCHRONOUS: + type = USB_EP_TYPE_ISOCHRONOUS_gc; + break; + case USB_EP_TYPE_BULK: + case USB_EP_TYPE_INTERRUPT: //interrupt behaves as bulk + type = USB_EP_TYPE_BULK_gc; + break; + default: + Assert(false); // Wrong value + return; + } +#else + type = USB_EP_TYPE_CONTROL_gc; +#endif + + // Translate USB endpoint size to hardware defines + switch (MaxEndpointSize) { + default: + Assert(false); // Wrong value + case 8: + size = USB_EP_BUFSIZE_8_gc; + break; + case 16: + size = USB_EP_BUFSIZE_16_gc; + break; + case 32: + size = USB_EP_BUFSIZE_32_gc; + break; + case 64: + size = USB_EP_BUFSIZE_64_gc; + break; +#if (0!=USB_DEVICE_MAX_EP) + case 128: + size = USB_EP_BUFSIZE_128_gc; + break; + case 256: + size = USB_EP_BUFSIZE_256_gc; + break; + case 512: + size = USB_EP_BUFSIZE_512_gc; + break; + case 1023: + size =USB_EP_BUFSIZE_1023_gc; + break; +#endif + } + + // Enable endpoint + ep_ctrl = udd_ep_get_ctrl(ep); + udd_endpoint_disable(ep_ctrl); + udd_endpoint_clear_status(ep_ctrl); + udd_endpoint_set_control(ep_ctrl, (uint8_t) type | (uint8_t) size); +} + +static UDD_EP_t *udd_ep_get_ctrl(udd_ep_id_t ep) +{ + return &udd_sram.ep_ctrl[(2 * (ep & USB_EP_ADDR_MASK) + + ((ep & USB_EP_DIR_IN) ? 1 : 0))]; +} + + +//-------------------------------------------------------- +//--- INTERNAL ROUTINES TO MANAGED THE CONTROL ENDPOINT + +static void udd_ctrl_init(void) +{ + udd_disable_overflow_interrupt(); + udd_disable_underflow_interrupt(); + + // Clear status flag from control endpoints + // Mandatory for ATxmega128A1 Rev. K + udd_control_in_set_NACK0(); + udd_control_in_set_bytecnt(0); + udd_control_in_ack_tc(); + udd_control_ack_in_underflow(); + udd_control_out_ack_tc(); + udd_control_ack_out_overflow(); + + udd_g_ctrlreq.callback = NULL; + udd_g_ctrlreq.over_under_run = NULL; + udd_g_ctrlreq.payload_size = 0; + udd_ep_control_state = UDD_EPCTRL_SETUP; +} + +static void udd_ctrl_setup_received(void) +{ + if (UDD_EPCTRL_SETUP != udd_ep_control_state) { + if ((UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP == udd_ep_control_state) + || (UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP == udd_ep_control_state)) { + // Accept that ZLP event can be hidden by setup packet event + // in case of setup packet sending quickly after a ZLP + udd_ctrl_endofrequest(); + } + // Reinitializes control endpoint management + udd_ctrl_init(); + } + // Fill setup request structure + if (8 != udd_control_out_get_bytecnt()) + return; // Error data number don't correspond to SETUP packet + memcpy((uint8_t *) & udd_g_ctrlreq.req, udd_ctrl_buffer, 8); + + // To detect a protocol error on setup, enable nak interrupt on IN/OUT of control endpoint + udd_enable_overflow_interrupt(); + udd_enable_underflow_interrupt(); + + // Decode setup request + if (udc_process_setup() == false) { + // Setup request unknown then stall it + udd_ctrl_stall_data(); + return; + } + + if (Udd_setup_is_in()) { + udd_ctrl_prev_payload_nb_trans = 0; + udd_ctrl_payload_nb_trans = 0; + udd_ep_control_state = UDD_EPCTRL_DATA_IN; + udd_ctrl_in_sent(); // Send first data transfer + } else { + if (0 == udd_g_ctrlreq.req.wLength) { + // No data phase requested + // Send IN ZLP to ACK setup request + udd_ctrl_send_zlp_in(); + return; + } + // OUT data phase requested + udd_ctrl_prev_payload_nb_trans = 0; + udd_ctrl_payload_nb_trans = 0; + udd_ep_control_state = UDD_EPCTRL_DATA_OUT; + // Clear packet to receive first packet + udd_control_out_clear_NACK0(); + } +} + +static void udd_ctrl_in_sent(void) +{ + static bool b_shortpacket = false; + uint16_t nb_remain; + + if (UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP == udd_ep_control_state) { + // ZLP on IN is sent, then valid end of setup request + udd_ctrl_endofrequest(); + // Reinitializes control endpoint management + udd_ctrl_init(); + return; + } + Assert(udd_ep_control_state == UDD_EPCTRL_DATA_IN); + + nb_remain = udd_g_ctrlreq.payload_size - udd_ctrl_payload_nb_trans; + if (0 == nb_remain) { + // Update number of total data sending by previous playload buffer + udd_ctrl_prev_payload_nb_trans += udd_ctrl_payload_nb_trans; + if ((udd_g_ctrlreq.req.wLength == udd_ctrl_prev_payload_nb_trans) + || b_shortpacket) { + // All data requested are transfered or a short packet has been sent + // then it is the end of data phase. + // Generate an OUT ZLP for handshake phase. + udd_ctrl_send_zlp_out(); + return; + } + // Need of new buffer because the data phase is not complete + if ((!udd_g_ctrlreq.over_under_run) + || (!udd_g_ctrlreq.over_under_run())) { + // Underrun then send zlp on IN + // nb_remain == 0 allows to send a IN ZLP + } else { + // A new payload buffer is given + udd_ctrl_payload_nb_trans = 0; + nb_remain = udd_g_ctrlreq.payload_size; + } + } + // Continue transfer an send next data + if (nb_remain >= USB_DEVICE_EP_CTRL_SIZE) { + nb_remain = USB_DEVICE_EP_CTRL_SIZE; + b_shortpacket = false; + } else { + b_shortpacket = true; + } + udd_control_in_set_bytecnt(nb_remain); + + // Link payload buffer directly on USB hardware + udd_control_in_set_buf(udd_g_ctrlreq.payload + udd_ctrl_payload_nb_trans); + udd_ctrl_payload_nb_trans += nb_remain; + + // Valid and sent the data available in control endpoint buffer + udd_control_in_clear_NACK0(); +} + +static void udd_ctrl_out_received(void) +{ + uint16_t nb_data; + + if (UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP == udd_ep_control_state) { + // Valid end of setup request + udd_ctrl_endofrequest(); + // Reinitializes control endpoint management + udd_ctrl_init(); + return; + } + Assert(udd_ep_control_state == UDD_EPCTRL_DATA_OUT); + + // Read data received during OUT phase + nb_data = udd_control_out_get_bytecnt(); + + if (udd_g_ctrlreq.payload_size < (udd_ctrl_payload_nb_trans + nb_data)) { + // Payload buffer too small, ignore data remaining + nb_data = udd_g_ctrlreq.payload_size - udd_ctrl_payload_nb_trans; + } + + memcpy((uint8_t *) (udd_g_ctrlreq.payload + udd_ctrl_payload_nb_trans), + udd_ctrl_buffer, nb_data); + udd_ctrl_payload_nb_trans += nb_data; + + if ((USB_DEVICE_EP_CTRL_SIZE != nb_data) || (udd_g_ctrlreq.req.wLength + <= (udd_ctrl_prev_payload_nb_trans + + udd_ctrl_payload_nb_trans))) { + // End of reception because it is a short packet + // or all data are transfered + + // Before send ZLP, call intermediate callback + // in case of data receive generate a stall + udd_g_ctrlreq.payload_size = udd_ctrl_payload_nb_trans; + if (NULL != udd_g_ctrlreq.over_under_run) { + if (!udd_g_ctrlreq.over_under_run()) { + // Stall ZLP + udd_ctrl_stall_data(); + return; + } + } + // Send IN ZLP to ACK setup request + udd_ctrl_send_zlp_in(); + return; + } + + if (udd_g_ctrlreq.payload_size == udd_ctrl_payload_nb_trans) { + // Overrun then request a new payload buffer + if (!udd_g_ctrlreq.over_under_run) { + // No callback available to request a new payload buffer + udd_ctrl_stall_data(); + return; + } + if (!udd_g_ctrlreq.over_under_run()) { + // No new payload buffer delivered + udd_ctrl_stall_data(); + return; + } + // New payload buffer available + // Update number of total data received + udd_ctrl_prev_payload_nb_trans += udd_ctrl_payload_nb_trans; + // Reinit reception on payload buffer + udd_ctrl_payload_nb_trans = 0; + } + // Free buffer of OUT control endpoint to authorize next reception + udd_control_out_clear_NACK0(); +} + +static void udd_ctrl_underflow(void) +{ + if (udd_is_tc_event() || udd_ctrl_interrupt_tc_setup()) { + return; // underflow ignored if a transfer complete has been no processed + } + if (UDD_EPCTRL_DATA_OUT == udd_ep_control_state) { + // Host want to stop OUT transaction + // then stop to wait OUT data phase and wait IN ZLP handshake + udd_ctrl_send_zlp_in(); + } else if (UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP == udd_ep_control_state) { + // A OUT handshake is waiting by device, + // but host want extra IN data then stall extra IN data and following status stage + udd_control_in_enable_stall(); + udd_control_out_enable_stall(); + } +} + +static void udd_ctrl_overflow(void) +{ + if (udd_is_tc_event() || udd_ctrl_interrupt_tc_setup()) { + return; // overflow ignored if a transfer complete has been no processed + } + if (UDD_EPCTRL_DATA_IN == udd_ep_control_state) { + // Host want to stop IN transaction + // then stop to wait IN data phase and wait OUT ZLP handshake + udd_ctrl_send_zlp_out(); + } else if (UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP == udd_ep_control_state) { + // A IN handshake is waiting by device, + // but host want extra OUT data then stall extra OUT data and following status stage + udd_control_in_enable_stall(); + udd_control_out_enable_stall(); + } +} + +static void udd_ctrl_stall_data(void) +{ + // Stall all packets on IN & OUT control endpoint + udd_ep_control_state = UDD_EPCTRL_STALL_REQ; + udd_control_in_enable_stall(); + udd_control_out_enable_stall(); +} + +static void udd_ctrl_send_zlp_in(void) +{ + udd_ep_control_state = UDD_EPCTRL_HANDSHAKE_WAIT_IN_ZLP; + // Valid and sent empty IN packet on control endpoint + udd_control_in_set_bytecnt(0); + udd_control_in_clear_NACK0(); +} + +static void udd_ctrl_send_zlp_out(void) +{ + udd_ep_control_state = UDD_EPCTRL_HANDSHAKE_WAIT_OUT_ZLP; + // Valid reception of OUT packet on control endpoint + udd_control_out_clear_NACK0(); +} + +static void udd_ctrl_endofrequest(void) +{ + // If a callback is registered then call it + if (udd_g_ctrlreq.callback) { + udd_g_ctrlreq.callback(); + } +} + +static bool udd_ctrl_interrupt_error(void) +{ + // Underflow only managed for control endpoint + if (udd_is_underflow_event()) { + udd_ack_underflow_event(); + if (udd_control_in_underflow()) { + udd_ctrl_underflow(); + } + return true; + } + // Overflow only managed for control endpoint + if (udd_is_overflow_event()) { + udd_ack_overflow_event(); + if (udd_control_out_overflow()) { + udd_ctrl_overflow(); + } + return true; + } + return false; +} + +static bool udd_ctrl_interrupt_tc_setup(void) +{ + if (!udd_is_setup_event()) { + return false; + } + udd_ack_setup_event(); + + // Clear eventually previous stall events + udd_control_out_ack_stall(); + udd_control_in_ack_stall(); + udd_ack_stall_event(); + + Assert(udd_control_setup()); // A setup must be received on control endpoint + + // Ack SETUP packet and decode request + udd_control_ack_setup(); + udd_ctrl_setup_received(); + return true; +} + + +//-------------------------------------------------------- +//--- INTERNAL ROUTINES TO MANAGED THE BULK/INTERRUPT/ISOCHRONOUS ENDPOINTS + +#if (0!=USB_DEVICE_MAX_EP) + +static uint16_t udd_ep_get_size(UDD_EP_t * ep_ctrl) +{ + // Translate hardware defines to USB endpoint size + switch (udd_endpoint_get_size_field(ep_ctrl)) { + default: + case USB_EP_BUFSIZE_8_gc: + return 8; + case USB_EP_BUFSIZE_16_gc: + return 16; + case USB_EP_BUFSIZE_32_gc: + return 32; + case USB_EP_BUFSIZE_64_gc: + return 64; + case USB_EP_BUFSIZE_128_gc: + return 128; + case USB_EP_BUFSIZE_256_gc: + return 256; + case USB_EP_BUFSIZE_512_gc: + return 512; + case USB_EP_BUFSIZE_1023_gc: + return 1023; + } +} + +static udd_ep_job_t *udd_ep_get_job(udd_ep_id_t ep) +{ + return &udd_ep_job[(2 * (ep & USB_EP_ADDR_MASK) + + ((ep & USB_EP_DIR_IN) ? 1 : 0)) - 2]; +} + +bool udd_ep_is_valid(udd_ep_id_t ep) +{ + ep &= USB_EP_ADDR_MASK; + if (ep == 0) { + return false; + } + return (USB_DEVICE_MAX_EP >= ep); +} + +static void udd_ep_trans_complet(udd_ep_id_t ep) +{ + UDD_EP_t *ep_ctrl; + udd_ep_job_t *ptr_job; + uint16_t ep_size, nb_trans; + iram_size_t next_trans; + + ptr_job = udd_ep_get_job(ep); + ep_ctrl = udd_ep_get_ctrl(ep); + ep_size = udd_ep_get_size(ep_ctrl); + + if (USB_EP_DIR_IN == (ep & USB_EP_DIR_IN)) { + // Transfer complete on IN + nb_trans = udd_endpoint_in_nb_sent(ep_ctrl); + + // Update number of data transfered + ptr_job->nb_trans += nb_trans; + + // Need to send other data + if (ptr_job->nb_trans != ptr_job->buf_size) { + next_trans = ptr_job->buf_size - ptr_job->nb_trans; + if (UDD_ENDPOINT_MAX_TRANS < next_trans) { + // The USB hardware support a maximum + // transfer size of UDD_ENDPOINT_MAX_TRANS Bytes + next_trans = UDD_ENDPOINT_MAX_TRANS - + (UDD_ENDPOINT_MAX_TRANS % ep_size); + } + // Need ZLP, if requested and last packet is not a short packet + ptr_job->b_shortpacket = ptr_job->b_shortpacket + && (0==(next_trans % ep_size)); + udd_endpoint_in_reset_nb_sent(ep_ctrl); + udd_endpoint_in_set_bytecnt(ep_ctrl, next_trans); + // Link the user buffer directly on USB hardware DMA + udd_endpoint_set_buf(ep_ctrl, &ptr_job->buf[ptr_job->nb_trans]); + udd_endpoint_clear_NACK0(ep_ctrl); + return; + } + + // Need to send a ZLP after all data transfer + if (ptr_job->b_shortpacket) { + ptr_job->b_shortpacket = false; + udd_endpoint_in_reset_nb_sent(ep_ctrl); + udd_endpoint_in_set_bytecnt(ep_ctrl, 0); + udd_endpoint_clear_NACK0(ep_ctrl); + return; + } + } + else + { + // Transfer complete on OUT + nb_trans = udd_endpoint_out_nb_receiv(ep_ctrl); + + // Can be necessary to copy data receive from cache buffer to user buffer + if (ptr_job->b_use_out_cache_buffer) { + memcpy(&ptr_job->buf[ptr_job->nb_trans] + , udd_ep_out_cache_buffer[ep - 1] + , ptr_job->buf_size % ep_size); + } + + // Update number of data transfered + ptr_job->nb_trans += nb_trans; + if (ptr_job->nb_trans > ptr_job->buf_size) { + ptr_job->nb_trans = ptr_job->buf_size; + } + + // If all previous data requested are received and user buffer not full + // then need to receive other data + if ((nb_trans == udd_endpoint_out_get_nbbyte_requested(ep_ctrl)) + && (ptr_job->nb_trans != ptr_job->buf_size)) { + next_trans = ptr_job->buf_size - ptr_job->nb_trans; + if (UDD_ENDPOINT_MAX_TRANS < next_trans) { + // The USB hardware support a maximum transfer size + // of UDD_ENDPOINT_MAX_TRANS Bytes + next_trans = UDD_ENDPOINT_MAX_TRANS + - (UDD_ENDPOINT_MAX_TRANS % ep_size); + } else { + next_trans -= next_trans % ep_size; + } + + udd_endpoint_out_reset_nb_received(ep_ctrl); + if (next_trans < ep_size) { + // Use the cache buffer for Bulk or Interrupt size endpoint + ptr_job->b_use_out_cache_buffer = true; + udd_endpoint_set_buf( ep_ctrl, + udd_ep_out_cache_buffer[ep - 1]); + udd_endpoint_out_set_nbbyte(ep_ctrl, ep_size); + } else { + // Link the user buffer directly on USB hardware DMA + udd_endpoint_set_buf(ep_ctrl, &ptr_job->buf[ptr_job->nb_trans]); + udd_endpoint_out_set_nbbyte(ep_ctrl, next_trans); + } + // Start transfer + udd_endpoint_clear_NACK0(ep_ctrl); + return; + } + } + + // Job complete then call callback + if (ptr_job->busy) { + ptr_job->busy = false; + if (NULL != ptr_job->call_trans) { + ptr_job->call_trans(UDD_EP_TRANSFER_OK, + ptr_job->nb_trans, + ep); + } + } + return; +} +#endif // (0!=USB_DEVICE_MAX_EP) +//@} diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/usb/usb_device.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/usb/usb_device.h new file mode 100644 index 00000000..351c0ef9 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/drivers/usb/usb_device.h @@ -0,0 +1,390 @@ +/** + * \file + * + * \brief USB Driver header file for XMEGA products including USB interface. + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _USB_DEVICE_H_ +#define _USB_DEVICE_H_ + +#include + +/** + * \ingroup udd_group + * \defgroup udd_xmega_usb_group Xmega USB Device Driver + * USBC low-level driver for USB Device mode + * + * + * @{ + */ + +//! @name USB Device main management +//! @{ + +/** + * \brief Initializes the USB DP/DM buffers + * + * This functions initializes the USB buffer using the calibration value + * stored in production raw. + * If the calibration value is not found (0xFF) value, a default typical + * value is applied. + * Alternatively user can force calibration values using USB_PAD_USER_CAL0 + * and USB_PAD_USER_CAL1 + * + */ +static inline void usb_pad_init(void) +{ + uint8_t cal; + +#ifdef USB_PAD_USER_CAL0 + USB_CAL0 = USB_PAD_USER_CAL0; +#else + cal = nvm_read_production_signature_row + (nvm_get_production_signature_row_offset(USBCAL0)); + if (cal != 0xFF) { + USB_CAL0 = cal; + } else { + USB_CAL0 = 0x1F; + } +#endif + +#ifdef USB_PAD_USER_CAL1 + USB_CAL1 = USB_PAD_USER_CAL1; +#else + cal = nvm_read_production_signature_row + (nvm_get_production_signature_row_offset(USBCAL1)); + if (cal != 0xFF) { + USB_CAL1 = cal; + } else { + USB_CAL1 = 0x1F; + } +#endif +} + +#define udd_enable_interface() (USB_CTRLA |= USB_ENABLE_bm) +#define udd_disable_interface() (USB_CTRLA &= ~USB_ENABLE_bm) +#define udd_attach_device() (USB_CTRLB |= USB_ATTACH_bm) +#define udd_detach_device() (USB_CTRLB &= ~USB_ATTACH_bm) +#define udd_gnak_disable() (USB_CTRLB &= ~USB_GNACK_bm) +#define udd_gnak_enable() (USB_CTRLB |= USB_GNACK_bm) +#define udd_gnak_is_enable() (USB_CTRLB & USB_GNACK_bm) +#define udd_set_nb_max_ep(n) (USB_CTRLA |= n) +#define udd_enable_store_frame_number() (USB_CTRLA |= USB_STFRNUM_bm) +#define udd_disable_store_frame_number() (USB_CTRLA &= ~USB_STFRNUM_bm) +#define udd_set_full_speed() (USB_CTRLA |= USB_SPEED_bm) +#define udd_set_low_speed() (USB_CTRLA &= ~USB_SPEED_bm) +#define udd_set_ep_table_addr(n) (USB.EPPTR = (uint16_t)n) +#define udd_get_ep_table_addr() (USB.EPPTR) +#define udd_get_fifo_rp() (USB_FIFORP) +#define udd_reset_fifo() (USB_FIFORP=0xFF) +#define udd_enable_interrupt(level) (USB_INTCTRLA |= level&(USB_INTLVL1_bm|USB_INTLVL0_bm)) + +#define udd_set_device_address(n) (USB_ADDR=n) +#define udd_get_device_address() (USB_ADDR) +#define udd_enable_fifo() (USB_CTRLA |= USB_FIFOEN_bm) +#define udd_disable_fifo() (USB_CTRLA &= ~USB_FIFOEN_bm) + +#define udd_send_remote_wake_up() (USB_CTRLB &= ~USB_RWAKEUP_bm, USB_CTRLB |= USB_RWAKEUP_bm) +#define udd_set_global_nack() (USB_CTRLB |= USB_GNACK_bm) +#define udd_is_crc_event() (USB_INTFLAGSASET & USB_CRCIF_bm ? true : false) +#define udd_ack_crc_event() (USB_INTFLAGSACLR = USB_CRCIF_bm) +#define udd_set_crc_event() (USB_INTFLAGSASET = USB_CRCIF_bm) +#define udd_enable_crc_interrupt() (USB_INTCTRLA |= USB_CRCIE_bm) +#define udd_disable_crc_interrupt() (USB_INTCTRLA &= ~USB_CRCIE_bm) + +#define udd_is_start_of_frame_event() (USB_INTFLAGSASET & USB_SOFIF_bm ? true : false) +#define udd_ack_start_of_frame_event() (USB_INTFLAGSACLR = USB_SOFIF_bm) +#define udd_set_start_of_frame_event() (USB_INTFLAGSASET = USB_SOFIF_bm) +#define udd_enable_start_of_frame_interrupt() (USB_INTCTRLA |= USB_SOFIE_bm) +#define udd_disable_start_of_frame_interrupt() (USB_INTCTRLA &= ~USB_SOFIE_bm) +#define udd_is_enable_start_of_frame_interrupt() (0!=(USB_INTCTRLA|USB_SOFIE_bm)) + +#define udd_is_reset_event() (USB_INTFLAGSASET & USB_RSTIF_bm ? true : false) +#define udd_ack_reset_event() (USB_INTFLAGSACLR = USB_RSTIF_bm) +#define udd_set_reset_event() (USB_INTFLAGSASET = USB_RSTIF_bm) + +#define udd_is_suspend_event() (USB_INTFLAGSASET & USB_SUSPENDIF_bm ? true : false) +#define udd_ack_suspend_event() (USB_INTFLAGSACLR = USB_SUSPENDIF_bm) +#define udd_set_suspend_event() (USB_INTFLAGSASET = USB_SUSPENDIF_bm) + +#define udd_is_resume_event() (USB_INTFLAGSASET & USB_RESUMEIF_bm ? true : false) +#define udd_ack_resume_event() (USB_INTFLAGSACLR = USB_RESUMEIF_bm) +#define udd_set_resume_event() (USB_INTFLAGSASET = USB_RESUMEIF_bm) + +#define udd_enable_busevt_interrupt() (USB_INTCTRLA |= USB_BUSEVIE_bm) +#define udd_disable_busevt_interrupt() (USB_INTCTRLA &= ~USB_BUSEVIE_bm) + +#define udd_is_setup_event() (USB_INTFLAGSBCLR & USB_SETUPIF_bm ? true : false) +#define udd_ack_setup_event() (USB_INTFLAGSBCLR = USB_SETUPIF_bm) +#define udd_set_setup_event() (USB_INTFLAGSBSET = USB_SETUPIF_bm) +#define udd_enable_setup_interrupt() (USB_INTCTRLB |= USB_SETUPIE_bm) +#define udd_disable_setup_interrupt() (USB_INTCTRLB &= ~USB_SETUPIE_bm) + +#define udd_is_tc_event() (USB_INTFLAGSBCLR & USB_TRNIF_bm ? true : false) +#define udd_ack_tc_event() (USB_INTFLAGSBCLR = USB_TRNIF_bm) +#define udd_set_tc_event() (USB_INTFLAGSBSET = USB_TRNIF_bm) +#define udd_enable_tc_interrupt() (USB_INTCTRLB |= USB_TRNIE_bm) +#define udd_disable_tc_interrupt() (USB_INTCTRLB &= ~USB_TRNIE_bm) + +#define udd_is_overflow_event() (USB_INTFLAGSASET & USB_OVFIF_bm ? true : false) +#define udd_ack_overflow_event() (USB_INTFLAGSACLR = USB_OVFIF_bm) +#define udd_set_overflow_event() (USB_INTFLAGSASET = USB_OVFIF_bm) +#define udd_enable_overflow_interrupt() (USB_INTCTRLA |= USB_BUSERRIE_bm) +#define udd_disable_overflow_interrupt() (USB_INTCTRLA &= ~USB_BUSERRIE_bm) +#define udd_is_enable_overflow_interrupt() (USB_INTCTRLA&USB_BUSERRIE_bm ? true : false) + +#define udd_is_underflow_event() (USB_INTFLAGSASET & USB_UNFIF_bm ? true : false) +#define udd_ack_underflow_event() (USB_INTFLAGSACLR = USB_UNFIF_bm) +#define udd_set_underflow_event() (USB_INTFLAGSASET = USB_UNFIF_bm) +#define udd_enable_underflow_interrupt() (USB_INTCTRLA |= USB_BUSERRIE_bm) +#define udd_disable_underflow_interrupt() (USB_INTCTRLA &= ~USB_BUSERRIE_bm) +#define udd_is_enable_underflow_interrupt() (USB_INTCTRLA&USB_BUSERRIE_bm ? true : false) + +#define udd_is_stall_event() (USB_INTFLAGSASET & USB_STALLIF_bm ? true : false) +#define udd_ack_stall_event() (USB_INTFLAGSACLR = USB_STALLIF_bm) +#define udd_set_stall_event() (USB_INTFLAGSASET = USB_STALLIF_bm) +#define udd_enable_stall_interrupt() (USB_INTCTRLA |= USB_STALLIE_bm) +#define udd_disable_stall_interrupt() (USB_INTCTRLA &= ~USB_STALLIE_bm) +#define udd_is_enable_stall_interrupt() (USB_INTCTRLA&USB_STALLIE_bm ? true : false) +//! @} + +//! @name USB Device read/modify/write management +//! @{ +#ifndef USB_WORKAROUND_DO_NOT_USE_RMW +/* + * Read modify write new instructions for Xmega + * inline asm implementation with R16 register. + * This should be removed later on when the new instructions + * will be available within the compiler. + * + */ +// Load and Clear +#ifdef __GNUC__ +#define LACR16(addr,msk) \ + __asm__ __volatile__ ( \ + "ldi r16, %1" "\n\t" \ + ".dc.w 0x9306" "\n\t"\ + ::"z" (addr), "M" (msk):"r16") +#else +#define LACR16(addr,msk) __lac((unsigned char)msk,(unsigned char*)addr) +#endif + +// Load and Set +#ifdef __GNUC__ +#define LASR16(addr,msk) \ + __asm__ __volatile__ ( \ + "ldi r16, %1" "\n\t" \ + ".dc.w 0x9305" "\n\t"\ + ::"z" (addr), "M" (msk):"r16") +#else +#define LASR16(addr,msk) __las((unsigned char)msk,(unsigned char*)addr) +#endif + +// Exchange +#ifdef __GNUC__ +#define XCHR16(addr,msk) \ + __asm__ __volatile__ ( \ + "ldi r16, %1" "\n\t" \ + ".dc.w 0x9304" "\n\t"\ + ::"z" (addr), "M" (msk):"r16") +#else +#define XCHR16(addr,msk) __xch(msk,addr) +#endif + +// Load and toggle +#ifdef __GNUC__ +#define LATR16(addr,msk) \ + __asm__ __volatile__ ( \ + "ldi r16, %1" "\n\t" \ + ".dc.w 0x9307" "\n\t"\ + ::"z" (addr), "M" (msk):"r16") +#else +#define LATR16(addr,msk) __lat(msk,addr) +#endif + +#else + +// Load and Clear +#define LACR16(addr,msk) (*addr &= ~msk) +// Load and Set +#define LASR16(addr,msk)(*addr |= msk) + +#endif +//! @} + + +//! @name USB Device endpoints table management +//! @{ + +#define udd_endpoint_set_control(ep_ctrl,val) (ep_ctrl->CTRL=val) +#define udd_endpoint_get_control(ep_ctrl) (ep_ctrl->CTRL) + +#define udd_endpoint_disable(ep_ctrl) udd_endpoint_set_control(ep_ctrl,0) +#define udd_endpoint_is_enable(ep_ctrl) (USB_EP_TYPE_DISABLE_gc!=udd_endpoint_get_type(ep_ctrl)) + + +#define udd_endpoint_enable_stall(ep_ctrl) (ep_ctrl->CTRL |= USB_EP_STALL_bm) +#define udd_endpoint_disable_stall(ep_ctrl) (ep_ctrl->CTRL &= ~USB_EP_STALL_bm) +#define udd_endpoint_is_stall(ep_ctrl) (ep_ctrl->CTRL &USB_EP_STALL_bm ? true : false) +#define udd_endpoint_set_multipacket(ep_ctrl) (ep_ctrl->CTRL |= USB_EP_MULTIPKT_bm) +#define udd_endpoint_TC_int_disable(ep_ctrl) (ep_ctrl->CTRL |= USB_EP_INTDSBL_bm) +#define udd_endpoint_set_pingpong(ep_ctrl) (ep_ctrl->CTRL |= USB_EP_PINGPONG_bm) +#define udd_endpoint_get_size_field(ep_ctrl) (ep_ctrl->CTRL & USB_EP_BUFSIZE_gm) +#define udd_endpoint_get_type(ep_ctrl) (ep_ctrl->CTRL & USB_EP_TYPE_gm) + +#define udd_endpoint_get_status(ep_ctrl) (ep_ctrl->STATUS) +#define udd_endpoint_clear_status(ep_ctrl) (ep_ctrl->STATUS=USB_EP_BUSNACK0_bm|USB_EP_BUSNACK1_bm) + +#define udd_endpoint_setup_received(ep_ctrl) (ep_ctrl->STATUS&USB_EP_SETUP_bm ? true : false) +#define udd_endpoint_ack_setup_received(ep_ctrl) LACR16(&ep_ctrl->STATUS, USB_EP_SETUP_bm) + +#define udd_endpoint_transfer_complete(ep_ctrl) (ep_ctrl->STATUS&USB_EP_TRNCOMPL0_bm ? true : false) +#define udd_endpoint_ack_transfer_complete(ep_ctrl) LACR16(&(ep_ctrl->STATUS), USB_EP_TRNCOMPL0_bm) +#define udd_endpoint_transfer_complete_bank0(ep_ctrl) (ep_ctrl->STATUS&USB_EP_TRNCOMPL0_bm ? true : false) +#define udd_endpoint_ack_transfer_complete_bankO(ep_ctrl) LACR16(&ep_ctrl->STATUS, USB_EP_TRNCOMPL0_bm) +#define udd_endpoint_transfer_complete_bank1(ep_ctrl) (ep_ctrl->STATUS&USB_EP_SETUP_bm ? true : false) +#define udd_endpoint_ack_transfer_complete_bank1(ep_ctrl) LACR16(&ep_ctrl->STATUS, USB_EP_SETUP_bm) + +#define udd_endpoint_get_bank(ep_ctrl) (ep_ctrl->STATUS & USB_EP_BANK_bm ? true : false) +#define udd_endpoint_set_bank(ep_ctrl) LASR16(&ep_ctrl->STATUS, USB_EP_BANK_bm) +#define udd_endpoint_clear_bank(ep_ctrl) LACR16(&ep_ctrl->STATUS, USB_EP_BANK_bm) + +#define udd_endpoint_set_dtgl(ep_ctrl) LASR16(&ep_ctrl->STATUS,USB_EP_TOGGLE_bm) +#define udd_endpoint_clear_dtgl(ep_ctrl) LACR16(&ep_ctrl->STATUS, USB_EP_TOGGLE_bm ) +#define udd_endpoint_get_dtgl(ep_ctrl) ((ep_ctrl->STATUS)&USB_EP_TOGGLE_bm ? true : false) +#define udd_endpoint_toggle_dtgl(ep_ctrl) LATR16(&ep_ctrl->STATUS, USB_EP_TOGGLE_bm) + +#define udd_endpoint_set_NACK0(ep_ctrl) LASR16(&ep_ctrl->STATUS,USB_EP_BUSNACK0_bm) +#define udd_endpoint_set_NACK1(ep_ctrl) LASR16(&ep_ctrl->STATUS,USB_EP_BUSNACK1_bm) +#define udd_endpoint_clear_NACK0(ep_ctrl) LACR16(&ep_ctrl->STATUS, USB_EP_BUSNACK0_bm) +#define udd_endpoint_clear_NACK1(ep_ctrl) LACR16(&ep_ctrl->STATUS, USB_EP_BUSNACK1_bm) +#define udd_endpoint_get_NACK1(ep_ctrl) ((ep_ctrl->STATUS&USB_EP_BUSNACK1_bm) ? true : false) +#define udd_endpoint_get_NACK0(ep_ctrl) ((ep_ctrl->STATUS&USB_EP_BUSNACK0_bm) ? true : false) +#define udd_endpoint_overflow(ep_ctrl) (ep_ctrl->STATUS&USB_EP_OVF_bm ? true : false) +#define udd_endpoint_underflow(ep_ctrl) (ep_ctrl->STATUS&USB_EP_UNF_bm ? true : false) + +#define UDD_ENDPOINT_MAX_TRANS (0x3FF) + +#define udd_endpoint_out_nb_receiv(ep_ctrl) (ep_ctrl->CNT) +#define udd_endpoint_out_reset_nb_received(ep_ctrl) (ep_ctrl->CNT = 0) +#define udd_endpoint_in_set_bytecnt(ep_ctrl,n) (ep_ctrl->CNT = n) +#define udd_endpoint_set_azlp(ep_ctrl) (ep_ctrl->CNT |= 0x8000) +#define udd_endpoint_clear_azlp(ep_ctrl) (ep_ctrl->CNT &= ~0x8000) + +#define udd_endpoint_set_buf(ep_ctrl,buf) (ep_ctrl->DATAPTR = (uint16_t) buf) + +#define udd_endpoint_in_nb_sent(ep_ctrl) (ep_ctrl->AUXDATA) +#define udd_endpoint_in_reset_nb_sent(ep_ctrl) (ep_ctrl->AUXDATA = 0) +#define udd_endpoint_out_set_nbbyte(ep_ctrl,nb) (ep_ctrl->AUXDATA = nb) +#define udd_endpoint_out_get_nbbyte_requested(ep_ctrl) (ep_ctrl->AUXDATA) +#define udd_endpoint_set_aux(ep_ctrl,buf) (ep_ctrl->AUXDATA = (uint16_t) buf) +//! @} + + +//! @name USB Device endpoint control field management +//! @{ + +//! @name USB Device endpoint control setup field management +//! @{ +#define udd_control_setup() (udd_sram.ep_ctrl[0].STATUS&USB_EP_SETUP_bm ? true : false) +#define udd_control_ack_setup() LACR16(&udd_sram.ep_ctrl[0].STATUS,USB_EP_SETUP_bm) +//! @} + +//! @name USB Device endpoint control OUT field management +//! @{ +#define udd_control_out_is_enable_stall() (udd_sram.ep_ctrl[0].CTRL&USB_EP_STALL_bm ? true : false) +#define udd_control_out_enable_stall() LASR16(&udd_sram.ep_ctrl[0].CTRL,USB_EP_STALL_bm) +#define udd_control_out_disable_stall() LACR16(&udd_sram.ep_ctrl[0].CTRL,USB_EP_STALL_bm) +#define udd_control_out_is_stalled() (udd_sram.ep_ctrl[0].STATUS&USB_EP_STALLF_bm ? true : false) +#define udd_control_out_ack_stall() LACR16(&udd_sram.ep_ctrl[0].STATUS,USB_EP_STALLF_bm) +#define udd_control_out_set_NACK0() LASR16(&udd_sram.ep_ctrl[0].STATUS,USB_EP_BUSNACK0_bm) +#define udd_control_out_clear_NACK0() LACR16(&udd_sram.ep_ctrl[0].STATUS,USB_EP_BUSNACK0_bm) + +#define udd_control_out_overflow() (udd_sram.ep_ctrl[0].STATUS&USB_EP_OVF_bm ? true : false) +#define udd_control_ack_out_overflow() LACR16(&udd_sram.ep_ctrl[0].STATUS,USB_EP_OVF_bm) + +#define udd_control_out_tc() (udd_sram.ep_ctrl[0].STATUS&USB_EP_TRNCOMPL0_bm ? true : false) +#define udd_control_out_ack_tc() LACR16(&udd_sram.ep_ctrl[0].STATUS,USB_EP_TRNCOMPL0_bm) +#define udd_control_out_set_tc() LASR16(&udd_sram.ep_ctrl[0].STATUS,USB_EP_TRNCOMPL0_bm) + +#define udd_control_out_dt_get() (udd_sram.ep_ctrl[0].STATUS&USB_EP_TOGGLE_bm ? true : false) +#define udd_control_out_dt_set() LASR16(&udd_sram.ep_ctrl[0].STATUS,USB_EP_TOGGLE_bm ) +#define udd_control_out_dt_clear() LACR16(&udd_sram.ep_ctrl[0].STATUS,USB_EP_TOGGLE_bm ) +#define udd_control_out_dt_toggle() LATR16(&udd_sram.ep_ctrl[0].STATUS,USB_EP_TOGGLE_bm) + +#define udd_control_out_set_buf(buf) (udd_sram.ep_ctrl[0].DATAPTR = (uint16_t) buf) + +#define udd_control_out_get_bytecnt() (udd_sram.ep_ctrl[0].CNT) +//! @} + +//! @name USB Device endpoint control IN field management +//! @{ +#define udd_control_in_is_enable_stall() (udd_sram.ep_ctrl[1].CTRL&USB_EP_STALL_bm ? true : false) +#define udd_control_in_enable_stall() LASR16(&udd_sram.ep_ctrl[1].CTRL,USB_EP_STALL_bm) +#define udd_control_in_disable_stall() LACR16(&udd_sram.ep_ctrl[1].CTRL,USB_EP_STALL_bm) +#define udd_control_in_is_stalled() (udd_sram.ep_ctrl[1].STATUS&USB_EP_STALLF_bm ? true : false) +#define udd_control_in_ack_stall() LACR16(&udd_sram.ep_ctrl[1].STATUS,USB_EP_STALLF_bm) +#define udd_control_in_set_NACK0() LASR16(&udd_sram.ep_ctrl[1].STATUS,USB_EP_BUSNACK0_bm) +#define udd_control_in_clear_NACK0() LACR16(&udd_sram.ep_ctrl[1].STATUS,USB_EP_BUSNACK0_bm) + +#define udd_control_in_underflow() (udd_sram.ep_ctrl[1].STATUS&USB_EP_UNF_bm ? true : false) +#define udd_control_ack_in_underflow() LACR16(&udd_sram.ep_ctrl[1].STATUS,USB_EP_UNF_bm) + +#define udd_control_in_tc() (udd_sram.ep_ctrl[1].STATUS&USB_EP_TRNCOMPL0_bm ? true : false) +#define udd_control_in_ack_tc() LACR16(&udd_sram.ep_ctrl[1].STATUS,USB_EP_TRNCOMPL0_bm) +#define udd_control_in_set_tc() LASR16(&udd_sram.ep_ctrl[1].STATUS,USB_EP_TRNCOMPL0_bm) + +#define udd_control_in_dt_get() (udd_sram.ep_ctrl[1].STATUS&USB_EP_TOGGLE_bm ? true : false) +#define udd_control_in_dt_set() LASR16(&udd_sram.ep_ctrl[1].STATUS,USB_EP_TOGGLE_bm ) +#define udd_control_in_dt_clear() LACR16(&udd_sram.ep_ctrl[1].STATUS,USB_EP_TOGGLE_bm ) +#define udd_control_in_dt_toggle() LATR16(&udd_sram.ep_ctrl[1].STATUS,USB_EP_TOGGLE_bm) + +#define udd_control_in_set_buf(buf) (udd_sram.ep_ctrl[1].DATAPTR = (uint16_t) buf) + +#define udd_control_in_set_bytecnt(n) (udd_sram.ep_ctrl[1].CNT = n) +//! @} +//! @} + +//! @} + +#endif // _USB_DEVICE_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/assembler.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/assembler.h new file mode 100644 index 00000000..8a2dfca0 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/assembler.h @@ -0,0 +1,159 @@ +/** + * \file + * + * \brief Assembler abstraction layer and utilities + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef ASSEMBLER_H_INCLUDED +#define ASSEMBLER_H_INCLUDED + +#if !defined(__ASSEMBLER__) && !defined(__IAR_SYSTEMS_ASM__) \ + && !defined(__DOXYGEN__) +# error This file may only be included from assembly files +#endif + +#if defined(__ASSEMBLER__) +# include "assembler/gas.h" +# include +#elif defined(__IAR_SYSTEMS_ASM__) +# include "assembler/iar.h" +# include +#endif + +/** + * \ingroup group_xmega_utils + * \defgroup assembler_group Assembler Support + * + * This group provides a good handful of macros intended to smooth out + * the differences between various assemblers, similar to what compiler.h does + * for compilers, except that assemblers tend to be much less standardized than + * compilers. + * + * @{ + */ + +//! \name Control Statements +//@{ +/** + * \def REPEAT(count) + * \brief Repeat the following statements \a count times + */ +/** + * \def END_REPEAT() + * \brief Mark the end of the statements to be repeated + */ +/** + * \def SET_LOC(offset) + * \brief Set the location counter to \a offset + */ +/** + * \def END_FILE() + * \brief Mark the end of the file + */ +//@} + +//! \name Data Objects +//@{ +/** + * \def FILL_BYTES(count) + * \brief Allocate space for \a count bytes + */ +//@} + +//! \name Symbol Definition +//@{ +/** + * \def L(name) + * \brief Turn \a name into a local symbol, if possible + */ +/** + * \def EXTERN_SYMBOL(name) + * \brief Declare \a name as an external symbol referenced by this file + */ +/** + * \def FUNCTION(name) + * \brief Define a file-local function called \a name + */ +/** + * \def PUBLIC_FUNCTION(name) + * \brief Define a globally visible function called \a name + */ +/** + * \def WEAK_FUNCTION(name) + * \brief Define a weak function called \a name + * + * Weak functions are only referenced if no strong definitions are found + */ +/** + * \def WEAK_FUNCTION_ALIAS(name, strong_name) + * \brief Define \a name as a weak alias for the function \a strong_name + * \sa WEAK_FUNCTION + */ +/** + * \def END_FUNC(name) + * \brief Mark the end of the function called \a name + */ +//@} + +//! \name Section Definition +//@{ +/** + * \def TEXT_SECTION(name) + * \brief Start a new section containing executable code + */ +/** + * \def RODATA_SECTION(name) + * \brief Start a new section containing read-only data + */ +/** + * \def DATA_SECTION(name) + * \brief Start a new section containing writeable initialized data + */ +/** + * \def BSS_SECTION(name) + * \brief Start a new section containing writeable zero-initialized data + */ +//@} + +//! @} + +#endif /* ASSEMBLER_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/assembler/gas.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/assembler/gas.h new file mode 100644 index 00000000..58a54094 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/assembler/gas.h @@ -0,0 +1,124 @@ +/** + * \file + * + * \brief Assembler abstraction layer: GNU Assembler specifics + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef ASSEMBLER_GAS_H_INCLUDED +#define ASSEMBLER_GAS_H_INCLUDED + +#ifndef __DOXYGEN__ + + /* IAR doesn't accept dots in macro names */ + .macro ld_addr, reg, sym + lda.w \reg, \sym + .endm + + /* Define a function \a name that is either globally visible or only + * file-local. + */ + .macro gas_begin_func name, is_public + .if \is_public + .global \name + .endif + .section .text.\name, "ax", @progbits + .type \name, @function + \name : + .endm + + /* Define a function \a name that is either globally visible or only + * file-local in a given segment. + */ + .macro gas_begin_func_segm name, is_public, segment + .if \is_public + .global \name + .endif + .section .\segment, "ax", @progbits + .type \name, @function + \name : + .endm + + /* Define \a name as a weak alias for the function \a strong_name */ + .macro gas_weak_function_alias name, strong_name + .global \name + .weak \name + .type \name, @function + .set \name, \strong_name + .endm + + /* Define a weak function called \a name */ + .macro gas_weak_function name + .weak \name + gas_begin_func \name 1 + .endm + +#define REPEAT(count) .rept count +#define END_REPEAT() .endr +#define FILL_BYTES(count) .fill count +#define SET_LOC(offset) .org offset +#define L(name) .L##name +#define EXTERN_SYMBOL(name) + +#define TEXT_SECTION(name) \ + .section name, "ax", @progbits +#define RODATA_SECTION(name) \ + .section name, "a", @progbits +#define DATA_SECTION(name) \ + .section name, "aw", @progbits +#define BSS_SECTION(name) \ + .section name, "aw", @nobits + +#define FUNCTION(name) gas_begin_func name 0 +#define PUBLIC_FUNCTION(name) gas_begin_func name 1 +#define PUBLIC_FUNCTION_SEGMENT(name, segment) \ + gas_begin_func_segm name 1 segment +#define WEAK_FUNCTION(name) gas_weak_function name +#define WEAK_FUNCTION_ALIAS(name, strong_name) \ + gas_weak_function_alias name strong_name +#define END_FUNC(name) \ + .size name, . - name + +#define END_FILE() + +#endif /* __DOXYGEN__ */ + +#endif /* ASSEMBLER_GAS_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/bit_handling/clz_ctz.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/bit_handling/clz_ctz.h new file mode 100644 index 00000000..a58f1f4e --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/bit_handling/clz_ctz.h @@ -0,0 +1,215 @@ +/** + * \file + * + * \brief CLZ/CTZ C implementation. + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef CLZ_CTH_H +#define CLZ_CTH_H + +/** + * \brief Count leading zeros in unsigned integer + * + * This macro takes unsigned integers of any size, and evaluates to a call to + * the clz-function for its size. These functions count the number of zeros, + * starting with the MSB, before a one occurs in the integer. + * + * \param x Unsigned integer to count the leading zeros in. + * + * \return The number of leading zeros in \a x. + */ +#define clz(x) compiler_demux_size(sizeof(x), clz, (x)) + +/** + * \internal + * \brief Count leading zeros in unsigned, 8-bit integer + * + * \param x Unsigned byte to count the leading zeros in. + * + * \return The number of leading zeros in \a x. + */ +__always_inline static uint8_t clz8(uint8_t x) +{ + uint8_t bit = 0; + + if (x & 0xf0) { + x >>= 4; + } else { + bit += 4; + } + + if (x & 0x0c) { + x >>= 2; + } else { + bit += 2; + } + + if (!(x & 0x02)) { + bit++; + } + + return bit; + +} + +/** + * \internal + * \brief Count leading zeros in unsigned, 16-bit integer + * + * \param x Unsigned word to count the leading zeros in. + * + * \return The number of leading zeros in \a x. + */ +__always_inline static uint8_t clz16(uint16_t x) +{ + uint8_t bit = 0; + + if (x & 0xff00) { + x >>= 8; + } else { + bit += 8; + } + + return bit + clz8(x); +} + +/** + * \internal + * \brief Count leading zeros in unsigned, 32-bit integer + * + * \param x Unsigned double word to count the leading zeros in. + * + * \return The number of leading zeros in \a x. + */ +__always_inline static uint8_t clz32(uint32_t x) +{ + uint8_t bit = 0; + + if (x & 0xffff0000) { + x >>= 16; + } else { + bit += 16; + } + + return bit + clz16(x); +} + +/** + * \brief Count trailing zeros in unsigned integer + * + * This macro takes unsigned integers of any size, and evaluates to a call to + * the ctz-function for its size. These functions count the number of zeros, + * starting with the LSB, before a one occurs in the integer. + * + * \param x Unsigned integer to count the trailing zeros in. + * + * \return The number of trailing zeros in \a x. + */ +#define ctz(x) compiler_demux_size(sizeof(x), ctz, (x)) + +/** + * \internal + * \brief Count trailing zeros in unsigned, 8-bit integer + * + * \param x Unsigned byte to count the trailing zeros in. + * + * \return The number of leading zeros in \a x. + */ +__always_inline static uint8_t ctz8(uint8_t x) +{ + uint8_t bit = 0; + + if (!(x & 0x0f)) { + bit += 4; + x >>= 4; + } + if (!(x & 0x03)) { + bit += 2; + x >>= 2; + } + if (!(x & 0x01)) + bit++; + + return bit; +} + +/** + * \internal + * \brief Count trailing zeros in unsigned, 16-bit integer + * + * \param x Unsigned word to count the trailing zeros in. + * + * \return The number of trailing zeros in \a x. + */ +__always_inline static uint8_t ctz16(uint16_t x) +{ + uint8_t bit = 0; + + if (!(x & 0x00ff)) { + bit += 8; + x >>= 8; + } + + return bit + ctz8(x); +} + +/** + * \internal + * \brief Count trailing zeros in unsigned, 32-bit integer + * + * \param x Unsigned double word to count the trailing zeros in. + * + * \return The number of trailing zeros in \a x. + */ +__always_inline static uint8_t ctz32(uint32_t x) +{ + uint8_t bit = 0; + + if (!(x & 0x0000ffff)) { + bit += 16; + x >>= 16; + } + + return bit + ctz16(x); +} + +#endif /* CLZ_CTZ_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/compiler.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/compiler.h new file mode 100644 index 00000000..5e4f2c43 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/compiler.h @@ -0,0 +1,1189 @@ +/** + * \file + * + * \brief Commonly used includes, types and macros. + * + * Copyright (c) 2010-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef UTILS_COMPILER_H +#define UTILS_COMPILER_H + +/** + * \defgroup group_xmega_utils XMEGA compiler driver + * + * Compiler abstraction layer and code utilities for 8-bit AVR. + * This module provides various abstraction layers and utilities to make code compatible between different compilers. + * + * \{ + */ + +#if defined(__GNUC__) +# include +# include +#elif defined(__ICCAVR__) +# include +# include +#else +# error Unsupported compiler. +#endif + +#include +#include +#include +#include + +#include + +#ifdef __ICCAVR__ +/*! \name Compiler Keywords + * + * Port of some keywords from GCC to IAR Embedded Workbench. + */ +//! @{ +#define __asm__ asm +#define __inline__ inline +#define __volatile__ +//! @} +#endif + +/** + * \def UNUSED + * \brief Marking \a v as a unused parameter or value. + */ +#define UNUSED(v) (void)(v) + +/** + * \def unused + * \brief Marking \a v as a unused parameter or value. + */ +#define unused(v) do { (void)(v); } while(0) + +/** + * \def barrier + * \brief Memory barrier + */ +#ifdef __GNUC__ +# define barrier() asm volatile("" ::: "memory") +#else +# define barrier() asm ("") +#endif + +/** + * \brief Emit the compiler pragma \a arg. + * + * \param arg The pragma directive as it would appear after \e \#pragma + * (i.e. not stringified). + */ +#define COMPILER_PRAGMA(arg) _Pragma(#arg) + +/* + * AVR arch does not care about alignment anyway. + */ +#define COMPILER_PACK_RESET(alignment) +#define COMPILER_PACK_SET(alignment) + +/** + * \brief Set aligned boundary. + */ +#if (defined __GNUC__) +#define COMPILER_ALIGNED(a) __attribute__((__aligned__(a))) +#elif (defined __ICCAVR__) +#define COMPILER_ALIGNED(a) COMPILER_PRAGMA(data_alignment = a) +#endif + +/** + * \brief Set word-aligned boundary. + */ +#if (defined __GNUC__) +#define COMPILER_WORD_ALIGNED __attribute__((__aligned__(2))) +#elif (defined __ICCAVR__) +#define COMPILER_WORD_ALIGNED COMPILER_PRAGMA(data_alignment = 2) +#endif + +/** + * \name Tag functions as deprecated + * + * Tagging a function as deprecated will produce a warning when and only + * when the function is called. + * + * Usage is to add the __DEPRECATED__ symbol before the function definition. + * E.g.: + * __DEPRECATED__ uint8_t some_deprecated_function (void) + * { + * ... + * } + * + * \note Only supported by GCC 3.1 and above, no IAR support + * @{ + */ +#if ((defined __GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >=1))) +#define __DEPRECATED__ __attribute__((__deprecated__)) +#else +#define __DEPRECATED__ +#endif +//! @} + +/*! \name Usual Types + */ +//! @{ +typedef unsigned char Bool; //!< Boolean. +#ifndef __cplusplus +#if !defined(__bool_true_false_are_defined) +typedef unsigned char bool; //!< Boolean. +#endif +#endif +typedef int8_t S8 ; //!< 8-bit signed integer. +typedef uint8_t U8 ; //!< 8-bit unsigned integer. +typedef int16_t S16; //!< 16-bit signed integer. +typedef uint16_t U16; //!< 16-bit unsigned integer. +typedef uint16_t le16_t; +typedef uint16_t be16_t; +typedef int32_t S32; //!< 32-bit signed integer. +typedef uint32_t U32; //!< 32-bit unsigned integer. +typedef uint32_t le32_t; +typedef uint32_t be32_t; +typedef int64_t S64; //!< 64-bit signed integer. +typedef uint64_t U64; //!< 64-bit unsigned integer. +typedef float F32; //!< 32-bit floating-point number. +typedef double F64; //!< 64-bit floating-point number. +typedef uint16_t iram_size_t; +//! @} + + +/*! \name Status Types + */ +//! @{ +typedef Bool Status_bool_t; //!< Boolean status. +typedef U8 Status_t; //!< 8-bit-coded status. +//! @} + + +/*! \name Aliasing Aggregate Types + */ +//! @{ + +//! 16-bit union. +typedef union +{ + S16 s16 ; + U16 u16 ; + S8 s8 [2]; + U8 u8 [2]; +} Union16; + +//! 32-bit union. +typedef union +{ + S32 s32 ; + U32 u32 ; + S16 s16[2]; + U16 u16[2]; + S8 s8 [4]; + U8 u8 [4]; +} Union32; + +//! 64-bit union. +typedef union +{ + S64 s64 ; + U64 u64 ; + S32 s32[2]; + U32 u32[2]; + S16 s16[4]; + U16 u16[4]; + S8 s8 [8]; + U8 u8 [8]; +} Union64; + +//! Union of pointers to 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + S64 *s64ptr; + U64 *u64ptr; + S32 *s32ptr; + U32 *u32ptr; + S16 *s16ptr; + U16 *u16ptr; + S8 *s8ptr ; + U8 *u8ptr ; +} UnionPtr; + +//! Union of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + volatile S64 *s64ptr; + volatile U64 *u64ptr; + volatile S32 *s32ptr; + volatile U32 *u32ptr; + volatile S16 *s16ptr; + volatile U16 *u16ptr; + volatile S8 *s8ptr ; + volatile U8 *u8ptr ; +} UnionVPtr; + +//! Union of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + const S64 *s64ptr; + const U64 *u64ptr; + const S32 *s32ptr; + const U32 *u32ptr; + const S16 *s16ptr; + const U16 *u16ptr; + const S8 *s8ptr ; + const U8 *u8ptr ; +} UnionCPtr; + +//! Union of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + const volatile S64 *s64ptr; + const volatile U64 *u64ptr; + const volatile S32 *s32ptr; + const volatile U32 *u32ptr; + const volatile S16 *s16ptr; + const volatile U16 *u16ptr; + const volatile S8 *s8ptr ; + const volatile U8 *u8ptr ; +} UnionCVPtr; + +//! Structure of pointers to 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + S64 *s64ptr; + U64 *u64ptr; + S32 *s32ptr; + U32 *u32ptr; + S16 *s16ptr; + U16 *u16ptr; + S8 *s8ptr ; + U8 *u8ptr ; +} StructPtr; + +//! Structure of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + volatile S64 *s64ptr; + volatile U64 *u64ptr; + volatile S32 *s32ptr; + volatile U32 *u32ptr; + volatile S16 *s16ptr; + volatile U16 *u16ptr; + volatile S8 *s8ptr ; + volatile U8 *u8ptr ; +} StructVPtr; + +//! Structure of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + const S64 *s64ptr; + const U64 *u64ptr; + const S32 *s32ptr; + const U32 *u32ptr; + const S16 *s16ptr; + const U16 *u16ptr; + const S8 *s8ptr ; + const U8 *u8ptr ; +} StructCPtr; + +//! Structure of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + const volatile S64 *s64ptr; + const volatile U64 *u64ptr; + const volatile S32 *s32ptr; + const volatile U32 *u32ptr; + const volatile S16 *s16ptr; + const volatile U16 *u16ptr; + const volatile S8 *s8ptr ; + const volatile U8 *u8ptr ; +} StructCVPtr; + +//! @} + + +//_____ M A C R O S ________________________________________________________ + +/*! \name Usual Constants + */ +//! @{ +#define DISABLE 0 +#define ENABLE 1 +#ifndef __cplusplus +#if !defined(__bool_true_false_are_defined) +#define false 0 +#define true 1 +#endif +#endif +#define PASS 0 +#define FAIL 1 +#define LOW 0 +#define HIGH 1 +//! @} + + +//! \name Compile time error handling +//@{ + +/** + * \internal + * \def ERROR_FUNC(name, msg) + * \brief Fail compilation if function call isn't eliminated + * + * If the compiler fails to optimize away all calls to the function \a + * name, terminate compilation and display \a msg to the user. + * + * \note Not all compilers support this, so this is best-effort only. + * Sometimes, there may be a linker error instead, and when optimization + * is disabled, this mechanism will be completely disabled. + */ +#ifndef ERROR_FUNC +# define ERROR_FUNC(name, msg) \ + extern int name(void) +#endif + +//@} + +//! \name Function call demultiplexing +//@{ + +//! Error function for failed demultiplexing. +ERROR_FUNC(compiler_demux_bad_size, "Invalid parameter size"); + +/** + * \internal + * \brief Demultiplex function call based on size of datatype + * + * Evaluates to a function call to a function name with suffix 8, 16 or 32 + * depending on the size of the datatype. Any number of parameters can be + * passed to the function. + * + * Usage: + * \code + void foo8(uint8_t a, void *b); + void foo16(uint16_t a, void *b); + void foo32(uint32_t a, void *b); + + #define foo(x, y) compiler_demux_size(sizeof(x), foo, x, y) +\endcode + * + * \param size Size of the datatype. + * \param func Base function name. + * \param ... List of parameters to pass to the function. + */ +#define compiler_demux_size(size, func, ...) \ + (((size) == 1) ? func##8(__VA_ARGS__) : \ + ((size) == 2) ? func##16(__VA_ARGS__) : \ + ((size) == 4) ? func##32(__VA_ARGS__) : \ + compiler_demux_bad_size()) + +//@} + +/** + * \def __always_inline + * \brief The function should always be inlined. + * + * This annotation instructs the compiler to ignore its inlining + * heuristics and inline the function no matter how big it thinks it + * becomes. + */ +#if (defined __GNUC__) + #define __always_inline inline __attribute__((__always_inline__)) +#elif (defined __ICCAVR__) + #define __always_inline _Pragma("inline=forced") +#endif + +//! \name Optimization Control +//@{ + +/** + * \def __always_optimize + * \brief The function should always be optimized. + * + * This annotation instructs the compiler to ignore global optimization + * settings and always compile the function with a high level of + * optimization. + */ +#if (defined __GNUC__) + #define __always_optimize __attribute__((optimize(3))) +#elif (defined __ICCAVR__) + #define __always_optimize _Pragma("optimize=high") +#endif + +/** + * \def likely(exp) + * \brief The expression \a exp is likely to be true + */ +#ifndef likely +# define likely(exp) (exp) +#endif + +/** + * \def unlikely(exp) + * \brief The expression \a exp is unlikely to be true + */ +#ifndef unlikely +# define unlikely(exp) (exp) +#endif + +/** + * \def is_constant(exp) + * \brief Determine if an expression evaluates to a constant value. + * + * \param exp Any expression + * + * \return true if \a exp is constant, false otherwise. + */ +#ifdef __GNUC__ +# define is_constant(exp) __builtin_constant_p(exp) +#else +# define is_constant(exp) (0) +#endif + +//! @} + +/*! \name Bit-Field Handling + */ +#include "bit_handling/clz_ctz.h" +//! @{ + +/*! \brief Reads the bits of a value specified by a given bit-mask. + * + * \param value Value to read bits from. + * \param mask Bit-mask indicating bits to read. + * + * \return Read bits. + */ +#define Rd_bits( value, mask) ((value)&(mask)) + +/*! \brief Writes the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue to write bits to. + * \param mask Bit-mask indicating bits to write. + * \param bits Bits to write. + * + * \return Resulting value with written bits. + */ +#define Wr_bits(lvalue, mask, bits) ((lvalue) = ((lvalue) & ~(mask)) |\ + ((bits ) & (mask))) + +/*! \brief Tests the bits of a value specified by a given bit-mask. + * + * \param value Value of which to test bits. + * \param mask Bit-mask indicating bits to test. + * + * \return \c 1 if at least one of the tested bits is set, else \c 0. + */ +#define Tst_bits( value, mask) (Rd_bits(value, mask) != 0) + +/*! \brief Clears the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue of which to clear bits. + * \param mask Bit-mask indicating bits to clear. + * + * \return Resulting value with cleared bits. + */ +#define Clr_bits(lvalue, mask) ((lvalue) &= ~(mask)) + +/*! \brief Sets the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue of which to set bits. + * \param mask Bit-mask indicating bits to set. + * + * \return Resulting value with set bits. + */ +#define Set_bits(lvalue, mask) ((lvalue) |= (mask)) + +/*! \brief Toggles the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue of which to toggle bits. + * \param mask Bit-mask indicating bits to toggle. + * + * \return Resulting value with toggled bits. + */ +#define Tgl_bits(lvalue, mask) ((lvalue) ^= (mask)) + +/*! \brief Reads the bit-field of a value specified by a given bit-mask. + * + * \param value Value to read a bit-field from. + * \param mask Bit-mask indicating the bit-field to read. + * + * \return Read bit-field. + */ +#define Rd_bitfield( value,mask) (Rd_bits( value, (uint32_t)mask) >> ctz(mask)) + +/*! \brief Writes the bit-field of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue to write a bit-field to. + * \param mask Bit-mask indicating the bit-field to write. + * \param bitfield Bit-field to write. + * + * \return Resulting value with written bit-field. + */ +#define Wr_bitfield(lvalue, mask, bitfield) (Wr_bits(lvalue, mask, (uint32_t)(bitfield) << ctz(mask))) + +//! @} + + +/*! \brief This macro is used to test fatal errors. + * + * The macro tests if the expression is false. If it is, a fatal error is + * detected and the application hangs up. If TEST_SUITE_DEFINE_ASSERT_MACRO + * is defined, a unit test version of the macro is used, to allow execution + * of further tests after a false expression. + * + * \param expr Expression to evaluate and supposed to be nonzero. + */ +#if defined(_ASSERT_ENABLE_) +# if defined(TEST_SUITE_DEFINE_ASSERT_MACRO) + // Assert() is defined in unit_test/suite.h +# include "unit_test/suite.h" +# else +# define Assert(expr) \ + {\ + if (!(expr)) while (true);\ + } +# endif +#else +# define Assert(expr) ((void) 0) +#endif + +/*! \name Bit Reversing + */ +//! @{ + +/*! \brief Reverses the bits of \a u8. + * + * \param u8 U8 of which to reverse the bits. + * + * \return Value resulting from \a u8 with reversed bits. + */ +#define bit_reverse8(u8) ((U8)(bit_reverse32((U8)(u8)) >> 24)) + +/*! \brief Reverses the bits of \a u16. + * + * \param u16 U16 of which to reverse the bits. + * + * \return Value resulting from \a u16 with reversed bits. + */ +#define bit_reverse16(u16) ((U16)(bit_reverse32((U16)(u16)) >> 16)) + +/*! \brief Reverses the bits of \a u32. + * + * \param u32 U32 of which to reverse the bits. + * + * \return Value resulting from \a u32 with reversed bits. + */ +#if (defined __GNUC__) + #define bit_reverse32(u32) \ + (\ + {\ + unsigned int __value = (U32)(u32);\ + __asm__ ("brev\t%0" : "+r" (__value) : : "cc");\ + (U32)__value;\ + }\ + ) +#elif (defined __ICCAVR__) + #define bit_reverse32(u32) ((U32)__bit_reverse((U32)(u32))) +#endif + +/*! \brief Reverses the bits of \a u64. + * + * \param u64 U64 of which to reverse the bits. + * + * \return Value resulting from \a u64 with reversed bits. + */ +#define bit_reverse64(u64) ((U64)(((U64)bit_reverse32((U64)(u64) >> 32)) |\ + ((U64)bit_reverse32((U64)(u64)) << 32))) + +//! @} + +//! \name Logarithmic functions +//! @{ + +/** + * \internal + * Undefined function. Will cause a link failure if ilog2() is called + * with an invalid constant value. + */ +int_fast8_t ilog2_undefined(void); + +/** + * \brief Calculate the base-2 logarithm of a number rounded down to + * the nearest integer. + * + * \param x A 32-bit value + * \return The base-2 logarithm of \a x, or -1 if \a x is 0. + */ +static inline int_fast8_t ilog2(uint32_t x) +{ + if (is_constant(x)) + return ((x) & (1ULL << 31) ? 31 : + (x) & (1ULL << 30) ? 30 : + (x) & (1ULL << 29) ? 29 : + (x) & (1ULL << 28) ? 28 : + (x) & (1ULL << 27) ? 27 : + (x) & (1ULL << 26) ? 26 : + (x) & (1ULL << 25) ? 25 : + (x) & (1ULL << 24) ? 24 : + (x) & (1ULL << 23) ? 23 : + (x) & (1ULL << 22) ? 22 : + (x) & (1ULL << 21) ? 21 : + (x) & (1ULL << 20) ? 20 : + (x) & (1ULL << 19) ? 19 : + (x) & (1ULL << 18) ? 18 : + (x) & (1ULL << 17) ? 17 : + (x) & (1ULL << 16) ? 16 : + (x) & (1ULL << 15) ? 15 : + (x) & (1ULL << 14) ? 14 : + (x) & (1ULL << 13) ? 13 : + (x) & (1ULL << 12) ? 12 : + (x) & (1ULL << 11) ? 11 : + (x) & (1ULL << 10) ? 10 : + (x) & (1ULL << 9) ? 9 : + (x) & (1ULL << 8) ? 8 : + (x) & (1ULL << 7) ? 7 : + (x) & (1ULL << 6) ? 6 : + (x) & (1ULL << 5) ? 5 : + (x) & (1ULL << 4) ? 4 : + (x) & (1ULL << 3) ? 3 : + (x) & (1ULL << 2) ? 2 : + (x) & (1ULL << 1) ? 1 : + (x) & (1ULL << 0) ? 0 : + ilog2_undefined()); + + return 31 - clz(x); +} + +//! @} + +/*! \name Alignment + */ +//! @{ + +/*! \brief Tests alignment of the number \a val with the \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return \c 1 if the number \a val is aligned with the \a n boundary, else \c 0. + */ +#define Test_align(val, n ) (!Tst_bits( val, (n) - 1 ) ) + +/*! \brief Gets alignment of the number \a val with respect to the \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return Alignment of the number \a val with respect to the \a n boundary. + */ +#define Get_align( val, n ) ( Rd_bits( val, (n) - 1 ) ) + +/*! \brief Sets alignment of the lvalue number \a lval to \a alg with respect to the \a n boundary. + * + * \param lval Input/output lvalue. + * \param n Boundary. + * \param alg Alignment. + * + * \return New value of \a lval resulting from its alignment set to \a alg with respect to the \a n boundary. + */ +#define Set_align(lval, n, alg) ( Wr_bits(lval, (n) - 1, alg) ) + +/*! \brief Aligns the number \a val with the upper \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return Value resulting from the number \a val aligned with the upper \a n boundary. + */ +#define Align_up( val, n ) (((val) + ((n) - 1)) & ~((n) - 1)) + +/*! \brief Aligns the number \a val with the lower \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return Value resulting from the number \a val aligned with the lower \a n boundary. + */ +#define Align_down(val, n ) ( (val) & ~((n) - 1)) + +//! @} + + +/*! \name Mathematics + * + * Compiler optimization for non-constant expressions, only for abs under WinAVR + */ +//! @{ + +/*! \brief Takes the absolute value of \a a. + * + * \param a Input value. + * + * \return Absolute value of \a a. + * + * \note More optimized if only used with values known at compile time. + */ +#define Abs(a) (((a) < 0 ) ? -(a) : (a)) +#ifndef abs +#define abs(a) Abs(a) +#endif + +/*! \brief Takes the minimal value of \a a and \a b. + * + * \param a Input value. + * \param b Input value. + * + * \return Minimal value of \a a and \a b. + * + * \note More optimized if only used with values known at compile time. + */ +#define Min(a, b) (((a) < (b)) ? (a) : (b)) +#define min(a, b) Min(a, b) + +/*! \brief Takes the maximal value of \a a and \a b. + * + * \param a Input value. + * \param b Input value. + * + * \return Maximal value of \a a and \a b. + * + * \note More optimized if only used with values known at compile time. + */ +#define Max(a, b) (((a) > (b)) ? (a) : (b)) +#define max(a, b) Max(a, b) + +//! @} + + +/*! \brief Calls the routine at address \a addr. + * + * It generates a long call opcode. + * + * For example, `Long_call(0x80000000)' generates a software reset on a UC3 if + * it is invoked from the CPU supervisor mode. + * + * \param addr Address of the routine to call. + * + * \note It may be used as a long jump opcode in some special cases. + */ +#define Long_call(addr) ((*(void (*)(void))(addr))()) + +/*! \name System Register Access + */ +//! @{ + +/*! \brief Gets the value of the \a sysreg system register. + * + * \param sysreg Address of the system register of which to get the value. + * + * \return Value of the \a sysreg system register. + */ +#if (defined __GNUC__) + #define Get_system_register(sysreg) __builtin_mfsr(sysreg) +#elif (defined __ICCAVR__) + #define Get_system_register(sysreg) __get_system_register(sysreg) +#endif + +/*! \brief Sets the value of the \a sysreg system register to \a value. + * + * \param sysreg Address of the system register of which to set the value. + * \param value Value to set the \a sysreg system register to. + */ +#if (defined __GNUC__) + #define Set_system_register(sysreg, value) __builtin_mtsr(sysreg, value) +#elif (defined __ICCAVR__) + #define Set_system_register(sysreg, value) __set_system_register(sysreg, value) +#endif + +//! @} + +/*! \name Debug Register Access + */ +//! @{ + +/*! \brief Gets the value of the \a dbgreg debug register. + * + * \param dbgreg Address of the debug register of which to get the value. + * + * \return Value of the \a dbgreg debug register. + */ +#if (defined __GNUC__) + #define Get_debug_register(dbgreg) __builtin_mfdr(dbgreg) +#elif (defined __ICCAVR__) + #define Get_debug_register(dbgreg) __get_debug_register(dbgreg) +#endif + +/*! \brief Sets the value of the \a dbgreg debug register to \a value. + * + * \param dbgreg Address of the debug register of which to set the value. + * \param value Value to set the \a dbgreg debug register to. + */ +#if (defined __GNUC__) + #define Set_debug_register(dbgreg, value) __builtin_mtdr(dbgreg, value) +#elif (defined __ICCAVR__) + #define Set_debug_register(dbgreg, value) __set_debug_register(dbgreg, value) +#endif + +//! @} + + +/*! \name MCU Endianism Handling + * xmega is a MCU little endianism. + */ +//! @{ +#define MSB(u16) (((uint8_t* )&u16)[1]) +#define LSB(u16) (((uint8_t* )&u16)[0]) + +#define MSW(u32) (((uint16_t*)&u32)[1]) +#define LSW(u32) (((uint16_t*)&u32)[0]) +#define MSB0W(u32) (((uint8_t*)&(u32))[3]) //!< Most significant byte of 1st rank of \a u32. +#define MSB1W(u32) (((uint8_t*)&(u32))[2]) //!< Most significant byte of 2nd rank of \a u32. +#define MSB2W(u32) (((uint8_t*)&(u32))[1]) //!< Most significant byte of 3rd rank of \a u32. +#define MSB3W(u32) (((uint8_t*)&(u32))[0]) //!< Most significant byte of 4th rank of \a u32. +#define LSB3W(u32) MSB0W(u32) //!< Least significant byte of 4th rank of \a u32. +#define LSB2W(u32) MSB1W(u32) //!< Least significant byte of 3rd rank of \a u32. +#define LSB1W(u32) MSB2W(u32) //!< Least significant byte of 2nd rank of \a u32. +#define LSB0W(u32) MSB3W(u32) //!< Least significant byte of 1st rank of \a u32. + +#define MSB0(u32) (((uint8_t*)&u32)[3]) +#define MSB1(u32) (((uint8_t*)&u32)[2]) +#define MSB2(u32) (((uint8_t*)&u32)[1]) +#define MSB3(u32) (((uint8_t*)&u32)[0]) +#define LSB0(u32) MSB3(u32) +#define LSB1(u32) MSB2(u32) +#define LSB2(u32) MSB1(u32) +#define LSB3(u32) MSB0(u32) + +#define LE16(x) (x) +#define le16_to_cpu(x) (x) +#define cpu_to_le16(x) (x) +#define LE16_TO_CPU(x) (x) +#define CPU_TO_LE16(x) (x) + +#define BE16(x) Swap16(x) +#define be16_to_cpu(x) swap16(x) +#define cpu_to_be16(x) swap16(x) +#define BE16_TO_CPU(x) Swap16(x) +#define CPU_TO_BE16(x) Swap16(x) + +#define LE32(x) (x) +#define le32_to_cpu(x) (x) +#define cpu_to_le32(x) (x) +#define LE32_TO_CPU(x) (x) +#define CPU_TO_LE32(x) (x) + +#define BE32(x) Swap32(x) +#define be32_to_cpu(x) swap32(x) +#define cpu_to_be32(x) swap32(x) +#define BE32_TO_CPU(x) Swap32(x) +#define CPU_TO_BE32(x) Swap32(x) + + + +//! @} + + +/*! \name Endianism Conversion + * + * The same considerations as for clz and ctz apply here but AVR32-GCC's + * __builtin_bswap_16 and __builtin_bswap_32 do not behave like macros when + * applied to constant expressions, so two sets of macros are defined here: + * - Swap16, Swap32 and Swap64 to apply to constant expressions (values known + * at compile time); + * - swap16, swap32 and swap64 to apply to non-constant expressions (values + * unknown at compile time). + */ +//! @{ + +/*! \brief Toggles the endianism of \a u16 (by swapping its bytes). + * + * \param u16 U16 of which to toggle the endianism. + * + * \return Value resulting from \a u16 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap16(u16) ((U16)(((U16)(u16) >> 8) |\ + ((U16)(u16) << 8))) + +/*! \brief Toggles the endianism of \a u32 (by swapping its bytes). + * + * \param u32 U32 of which to toggle the endianism. + * + * \return Value resulting from \a u32 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap32(u32) ((U32)(((U32)Swap16((U32)(u32) >> 16)) |\ + ((U32)Swap16((U32)(u32)) << 16))) + +/*! \brief Toggles the endianism of \a u64 (by swapping its bytes). + * + * \param u64 U64 of which to toggle the endianism. + * + * \return Value resulting from \a u64 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap64(u64) ((U64)(((U64)Swap32((U64)(u64) >> 32)) |\ + ((U64)Swap32((U64)(u64)) << 32))) + +/*! \brief Toggles the endianism of \a u16 (by swapping its bytes). + * + * \param u16 U16 of which to toggle the endianism. + * + * \return Value resulting from \a u16 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#define swap16(u16) Swap16(u16) + +/*! \brief Toggles the endianism of \a u32 (by swapping its bytes). + * + * \param u32 U32 of which to toggle the endianism. + * + * \return Value resulting from \a u32 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#define swap32(u32) Swap32(u32) + +/*! \brief Toggles the endianism of \a u64 (by swapping its bytes). + * + * \param u64 U64 of which to toggle the endianism. + * + * \return Value resulting from \a u64 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#define swap64(u64) ((U64)(((U64)swap32((U64)(u64) >> 32)) |\ + ((U64)swap32((U64)(u64)) << 32))) + +//! @} + + +/*! \name Target Abstraction + */ +//! @{ + +#define _GLOBEXT_ extern //!< extern storage-class specifier. +#define _CONST_TYPE_ const //!< const type qualifier. +#define _MEM_TYPE_SLOW_ //!< Slow memory type. +#define _MEM_TYPE_MEDFAST_ //!< Fairly fast memory type. +#define _MEM_TYPE_FAST_ //!< Fast memory type. + +typedef U8 Byte; //!< 8-bit unsigned integer. + +#define memcmp_ram2ram memcmp //!< Target-specific memcmp of RAM to RAM. +#define memcmp_code2ram memcmp //!< Target-specific memcmp of RAM to NVRAM. +#define memcpy_ram2ram memcpy //!< Target-specific memcpy from RAM to RAM. +#define memcpy_code2ram memcpy //!< Target-specific memcpy from NVRAM to RAM. + +//! @} + +/** + * \brief Calculate \f$ \left\lceil \frac{a}{b} \right\rceil \f$ using + * integer arithmetic. + * + * \param a An integer + * \param b Another integer + * + * \return (\a a / \a b) rounded up to the nearest integer. + */ +#define div_ceil(a, b) (((a) + (b) - 1) / (b)) + +#include "preprocessor.h" +#include "progmem.h" +#include "interrupt.h" + + +#if (defined __GNUC__) + #define SHORTENUM __attribute__ ((packed)) +#elif (defined __ICCAVR__) + #define SHORTENUM /**/ +#endif + +#if (defined __GNUC__) + #define FUNC_PTR void * +#elif (defined __ICCAVR__) +#if (FLASHEND > 0x1FFFF) // Required for program code larger than 128K + #define FUNC_PTR void __farflash * +#else + #define FUNC_PTR void * +#endif /* ENABLE_FAR_FLASH */ +#endif + + +#if (defined __GNUC__) + #define FLASH_DECLARE(x) const x __attribute__((__progmem__)) +#elif (defined __ICCAVR__) + #define FLASH_DECLARE(x) const __flash x +#endif + +#if (defined __GNUC__) + #define FLASH_EXTERN(x) extern const x +#elif (defined __ICCAVR__) + #define FLASH_EXTERN(x) extern const __flash x +#endif + + +/*Defines the Flash Storage for the request and response of MAC*/ +#define CMD_ID_OCTET (0) + +/* Converting of values from CPU endian to little endian. */ +#define CPU_ENDIAN_TO_LE16(x) (x) +#define CPU_ENDIAN_TO_LE32(x) (x) +#define CPU_ENDIAN_TO_LE64(x) (x) + +/* Converting of values from little endian to CPU endian. */ +#define LE16_TO_CPU_ENDIAN(x) (x) +#define LE32_TO_CPU_ENDIAN(x) (x) +#define LE64_TO_CPU_ENDIAN(x) (x) + +/* Converting of constants from little endian to CPU endian. */ +#define CLE16_TO_CPU_ENDIAN(x) (x) +#define CLE32_TO_CPU_ENDIAN(x) (x) +#define CLE64_TO_CPU_ENDIAN(x) (x) + +/* Converting of constants from CPU endian to little endian. */ +#define CCPU_ENDIAN_TO_LE16(x) (x) +#define CCPU_ENDIAN_TO_LE32(x) (x) +#define CCPU_ENDIAN_TO_LE64(x) (x) + +#if (defined __GNUC__) + #define ADDR_COPY_DST_SRC_16(dst, src) memcpy((&(dst)), (&(src)), sizeof(uint16_t)) + #define ADDR_COPY_DST_SRC_64(dst, src) memcpy((&(dst)), (&(src)), sizeof(uint64_t)) + +/* Converts a 2 Byte array into a 16-Bit value */ +#define convert_byte_array_to_16_bit(data) \ + (*(uint16_t *)(data)) + +/* Converts a 4 Byte array into a 32-Bit value */ +#define convert_byte_array_to_32_bit(data) \ + (*(uint32_t *)(data)) + +/* Converts a 8 Byte array into a 64-Bit value */ +#define convert_byte_array_to_64_bit(data) \ + (*(uint64_t *)(data)) + +/* Converts a 16-Bit value into a 2 Byte array */ +#define convert_16_bit_to_byte_array(value, data) \ + ((*(uint16_t *)(data)) = (uint16_t)(value)) + +/* Converts spec 16-Bit value into a 2 Byte array */ +#define convert_spec_16_bit_to_byte_array(value, data) \ + ((*(uint16_t *)(data)) = (uint16_t)(value)) + +/* Converts spec 16-Bit value into a 2 Byte array */ +#define convert_16_bit_to_byte_address(value, data) \ + ((*(uint16_t *)(data)) = (uint16_t)(value)) + +/* Converts a 32-Bit value into a 4 Byte array */ +#define convert_32_bit_to_byte_array(value, data) \ + ((*(uint32_t *)(data)) = (uint32_t)(value)) + +/* Converts a 64-Bit value into a 8 Byte array */ +/* Here memcpy requires much less footprint */ +#define convert_64_bit_to_byte_array(value, data) \ + memcpy((data), (&(value)), sizeof(uint64_t)) + +#elif (defined __ICCAVR__) + #define ADDR_COPY_DST_SRC_16(dst, src) ((dst) = (src)) + #define ADDR_COPY_DST_SRC_64(dst, src) ((dst) = (src)) + +/* Converts a 2 Byte array into a 16-Bit value */ +#define convert_byte_array_to_16_bit(data) \ + (*(uint16_t *)(data)) + +/* Converts a 4 Byte array into a 32-Bit value */ +#define convert_byte_array_to_32_bit(data) \ + (*(uint32_t *)(data)) + +/* Converts a 8 Byte array into a 64-Bit value */ +#define convert_byte_array_to_64_bit(data) \ + (*(uint64_t *)(data)) + +/* Converts a 16-Bit value into a 2 Byte array */ +#define convert_16_bit_to_byte_array(value, data) \ + ((*(uint16_t *)(data)) = (uint16_t)(value)) + +/* Converts spec 16-Bit value into a 2 Byte array */ +#define convert_spec_16_bit_to_byte_array(value, data) \ + ((*(uint16_t *)(data)) = (uint16_t)(value)) + +/* Converts spec 16-Bit value into a 2 Byte array */ +#define convert_16_bit_to_byte_address(value, data) \ + ((*(uint16_t *)(data)) = (uint16_t)(value)) + +/* Converts a 32-Bit value into a 4 Byte array */ +#define convert_32_bit_to_byte_array(value, data) \ + ((*(uint32_t *)(data)) = (uint32_t)(value)) + +/* Converts a 64-Bit value into a 8 Byte array */ +#define convert_64_bit_to_byte_array(value, data) \ + ((*(uint64_t *)(data)) = (uint64_t)(value)) +#endif + +#define MEMCPY_ENDIAN memcpy +#define PGM_READ_BLOCK(dst, src, len) memcpy_P((dst), (src), (len)) + +#if (defined __GNUC__) + #define PGM_READ_BYTE(x) pgm_read_byte(x) + #define PGM_READ_WORD(x) pgm_read_word(x) +#elif (defined __ICCAVR__) + #define PGM_READ_BYTE(x) *(x) + #define PGM_READ_WORD(x) *(x) +#endif + + +#if (defined __GNUC__) + #define nop() do { __asm__ __volatile__ ("nop"); } while (0) +#elif (defined __ICCAVR__) + #define nop() __no_operation() +#endif + + +/** + * \} + */ + +#endif // UTILS_COMPILER_H diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/preprocessor/mrepeat.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/preprocessor/mrepeat.h new file mode 100644 index 00000000..f4f9c94c --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/preprocessor/mrepeat.h @@ -0,0 +1,338 @@ +/** + * \file + * + * \brief Preprocessor macro repeating utils. + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef _MREPEAT_H_ +#define _MREPEAT_H_ + +/** + * \defgroup group_xmega_utils_mrepeat Macro Repeat + * + * \ingroup group_xmega_utils + * + * \{ + */ + +#include "preprocessor.h" + + +//! Maximal number of repetitions supported by MREPEAT. +#define MREPEAT_LIMIT 256 + +/*! \brief Macro repeat. + * + * This macro represents a horizontal repetition construct. + * + * \param count The number of repetitious calls to macro. Valid values range from 0 to MREPEAT_LIMIT. + * \param macro A binary operation of the form macro(n, data). This macro is expanded by MREPEAT with + * the current repetition number and the auxiliary data argument. + * \param data Auxiliary data passed to macro. + * + * \return macro(0, data) macro(1, data) ... macro(count - 1, data) + */ +#define MREPEAT(count, macro, data) TPASTE2(MREPEAT, count)(macro, data) + +#define MREPEAT0( macro, data) +#define MREPEAT1( macro, data) MREPEAT0( macro, data) macro( 0, data) +#define MREPEAT2( macro, data) MREPEAT1( macro, data) macro( 1, data) +#define MREPEAT3( macro, data) MREPEAT2( macro, data) macro( 2, data) +#define MREPEAT4( macro, data) MREPEAT3( macro, data) macro( 3, data) +#define MREPEAT5( macro, data) MREPEAT4( macro, data) macro( 4, data) +#define MREPEAT6( macro, data) MREPEAT5( macro, data) macro( 5, data) +#define MREPEAT7( macro, data) MREPEAT6( macro, data) macro( 6, data) +#define MREPEAT8( macro, data) MREPEAT7( macro, data) macro( 7, data) +#define MREPEAT9( macro, data) MREPEAT8( macro, data) macro( 8, data) +#define MREPEAT10( macro, data) MREPEAT9( macro, data) macro( 9, data) +#define MREPEAT11( macro, data) MREPEAT10( macro, data) macro( 10, data) +#define MREPEAT12( macro, data) MREPEAT11( macro, data) macro( 11, data) +#define MREPEAT13( macro, data) MREPEAT12( macro, data) macro( 12, data) +#define MREPEAT14( macro, data) MREPEAT13( macro, data) macro( 13, data) +#define MREPEAT15( macro, data) MREPEAT14( macro, data) macro( 14, data) +#define MREPEAT16( macro, data) MREPEAT15( macro, data) macro( 15, data) +#define MREPEAT17( macro, data) MREPEAT16( macro, data) macro( 16, data) +#define MREPEAT18( macro, data) MREPEAT17( macro, data) macro( 17, data) +#define MREPEAT19( macro, data) MREPEAT18( macro, data) macro( 18, data) +#define MREPEAT20( macro, data) MREPEAT19( macro, data) macro( 19, data) +#define MREPEAT21( macro, data) MREPEAT20( macro, data) macro( 20, data) +#define MREPEAT22( macro, data) MREPEAT21( macro, data) macro( 21, data) +#define MREPEAT23( macro, data) MREPEAT22( macro, data) macro( 22, data) +#define MREPEAT24( macro, data) MREPEAT23( macro, data) macro( 23, data) +#define MREPEAT25( macro, data) MREPEAT24( macro, data) macro( 24, data) +#define MREPEAT26( macro, data) MREPEAT25( macro, data) macro( 25, data) +#define MREPEAT27( macro, data) MREPEAT26( macro, data) macro( 26, data) +#define MREPEAT28( macro, data) MREPEAT27( macro, data) macro( 27, data) +#define MREPEAT29( macro, data) MREPEAT28( macro, data) macro( 28, data) +#define MREPEAT30( macro, data) MREPEAT29( macro, data) macro( 29, data) +#define MREPEAT31( macro, data) MREPEAT30( macro, data) macro( 30, data) +#define MREPEAT32( macro, data) MREPEAT31( macro, data) macro( 31, data) +#define MREPEAT33( macro, data) MREPEAT32( macro, data) macro( 32, data) +#define MREPEAT34( macro, data) MREPEAT33( macro, data) macro( 33, data) +#define MREPEAT35( macro, data) MREPEAT34( macro, data) macro( 34, data) +#define MREPEAT36( macro, data) MREPEAT35( macro, data) macro( 35, data) +#define MREPEAT37( macro, data) MREPEAT36( macro, data) macro( 36, data) +#define MREPEAT38( macro, data) MREPEAT37( macro, data) macro( 37, data) +#define MREPEAT39( macro, data) MREPEAT38( macro, data) macro( 38, data) +#define MREPEAT40( macro, data) MREPEAT39( macro, data) macro( 39, data) +#define MREPEAT41( macro, data) MREPEAT40( macro, data) macro( 40, data) +#define MREPEAT42( macro, data) MREPEAT41( macro, data) macro( 41, data) +#define MREPEAT43( macro, data) MREPEAT42( macro, data) macro( 42, data) +#define MREPEAT44( macro, data) MREPEAT43( macro, data) macro( 43, data) +#define MREPEAT45( macro, data) MREPEAT44( macro, data) macro( 44, data) +#define MREPEAT46( macro, data) MREPEAT45( macro, data) macro( 45, data) +#define MREPEAT47( macro, data) MREPEAT46( macro, data) macro( 46, data) +#define MREPEAT48( macro, data) MREPEAT47( macro, data) macro( 47, data) +#define MREPEAT49( macro, data) MREPEAT48( macro, data) macro( 48, data) +#define MREPEAT50( macro, data) MREPEAT49( macro, data) macro( 49, data) +#define MREPEAT51( macro, data) MREPEAT50( macro, data) macro( 50, data) +#define MREPEAT52( macro, data) MREPEAT51( macro, data) macro( 51, data) +#define MREPEAT53( macro, data) MREPEAT52( macro, data) macro( 52, data) +#define MREPEAT54( macro, data) MREPEAT53( macro, data) macro( 53, data) +#define MREPEAT55( macro, data) MREPEAT54( macro, data) macro( 54, data) +#define MREPEAT56( macro, data) MREPEAT55( macro, data) macro( 55, data) +#define MREPEAT57( macro, data) MREPEAT56( macro, data) macro( 56, data) +#define MREPEAT58( macro, data) MREPEAT57( macro, data) macro( 57, data) +#define MREPEAT59( macro, data) MREPEAT58( macro, data) macro( 58, data) +#define MREPEAT60( macro, data) MREPEAT59( macro, data) macro( 59, data) +#define MREPEAT61( macro, data) MREPEAT60( macro, data) macro( 60, data) +#define MREPEAT62( macro, data) MREPEAT61( macro, data) macro( 61, data) +#define MREPEAT63( macro, data) MREPEAT62( macro, data) macro( 62, data) +#define MREPEAT64( macro, data) MREPEAT63( macro, data) macro( 63, data) +#define MREPEAT65( macro, data) MREPEAT64( macro, data) macro( 64, data) +#define MREPEAT66( macro, data) MREPEAT65( macro, data) macro( 65, data) +#define MREPEAT67( macro, data) MREPEAT66( macro, data) macro( 66, data) +#define MREPEAT68( macro, data) MREPEAT67( macro, data) macro( 67, data) +#define MREPEAT69( macro, data) MREPEAT68( macro, data) macro( 68, data) +#define MREPEAT70( macro, data) MREPEAT69( macro, data) macro( 69, data) +#define MREPEAT71( macro, data) MREPEAT70( macro, data) macro( 70, data) +#define MREPEAT72( macro, data) MREPEAT71( macro, data) macro( 71, data) +#define MREPEAT73( macro, data) MREPEAT72( macro, data) macro( 72, data) +#define MREPEAT74( macro, data) MREPEAT73( macro, data) macro( 73, data) +#define MREPEAT75( macro, data) MREPEAT74( macro, data) macro( 74, data) +#define MREPEAT76( macro, data) MREPEAT75( macro, data) macro( 75, data) +#define MREPEAT77( macro, data) MREPEAT76( macro, data) macro( 76, data) +#define MREPEAT78( macro, data) MREPEAT77( macro, data) macro( 77, data) +#define MREPEAT79( macro, data) MREPEAT78( macro, data) macro( 78, data) +#define MREPEAT80( macro, data) MREPEAT79( macro, data) macro( 79, data) +#define MREPEAT81( macro, data) MREPEAT80( macro, data) macro( 80, data) +#define MREPEAT82( macro, data) MREPEAT81( macro, data) macro( 81, data) +#define MREPEAT83( macro, data) MREPEAT82( macro, data) macro( 82, data) +#define MREPEAT84( macro, data) MREPEAT83( macro, data) macro( 83, data) +#define MREPEAT85( macro, data) MREPEAT84( macro, data) macro( 84, data) +#define MREPEAT86( macro, data) MREPEAT85( macro, data) macro( 85, data) +#define MREPEAT87( macro, data) MREPEAT86( macro, data) macro( 86, data) +#define MREPEAT88( macro, data) MREPEAT87( macro, data) macro( 87, data) +#define MREPEAT89( macro, data) MREPEAT88( macro, data) macro( 88, data) +#define MREPEAT90( macro, data) MREPEAT89( macro, data) macro( 89, data) +#define MREPEAT91( macro, data) MREPEAT90( macro, data) macro( 90, data) +#define MREPEAT92( macro, data) MREPEAT91( macro, data) macro( 91, data) +#define MREPEAT93( macro, data) MREPEAT92( macro, data) macro( 92, data) +#define MREPEAT94( macro, data) MREPEAT93( macro, data) macro( 93, data) +#define MREPEAT95( macro, data) MREPEAT94( macro, data) macro( 94, data) +#define MREPEAT96( macro, data) MREPEAT95( macro, data) macro( 95, data) +#define MREPEAT97( macro, data) MREPEAT96( macro, data) macro( 96, data) +#define MREPEAT98( macro, data) MREPEAT97( macro, data) macro( 97, data) +#define MREPEAT99( macro, data) MREPEAT98( macro, data) macro( 98, data) +#define MREPEAT100(macro, data) MREPEAT99( macro, data) macro( 99, data) +#define MREPEAT101(macro, data) MREPEAT100(macro, data) macro(100, data) +#define MREPEAT102(macro, data) MREPEAT101(macro, data) macro(101, data) +#define MREPEAT103(macro, data) MREPEAT102(macro, data) macro(102, data) +#define MREPEAT104(macro, data) MREPEAT103(macro, data) macro(103, data) +#define MREPEAT105(macro, data) MREPEAT104(macro, data) macro(104, data) +#define MREPEAT106(macro, data) MREPEAT105(macro, data) macro(105, data) +#define MREPEAT107(macro, data) MREPEAT106(macro, data) macro(106, data) +#define MREPEAT108(macro, data) MREPEAT107(macro, data) macro(107, data) +#define MREPEAT109(macro, data) MREPEAT108(macro, data) macro(108, data) +#define MREPEAT110(macro, data) MREPEAT109(macro, data) macro(109, data) +#define MREPEAT111(macro, data) MREPEAT110(macro, data) macro(110, data) +#define MREPEAT112(macro, data) MREPEAT111(macro, data) macro(111, data) +#define MREPEAT113(macro, data) MREPEAT112(macro, data) macro(112, data) +#define MREPEAT114(macro, data) MREPEAT113(macro, data) macro(113, data) +#define MREPEAT115(macro, data) MREPEAT114(macro, data) macro(114, data) +#define MREPEAT116(macro, data) MREPEAT115(macro, data) macro(115, data) +#define MREPEAT117(macro, data) MREPEAT116(macro, data) macro(116, data) +#define MREPEAT118(macro, data) MREPEAT117(macro, data) macro(117, data) +#define MREPEAT119(macro, data) MREPEAT118(macro, data) macro(118, data) +#define MREPEAT120(macro, data) MREPEAT119(macro, data) macro(119, data) +#define MREPEAT121(macro, data) MREPEAT120(macro, data) macro(120, data) +#define MREPEAT122(macro, data) MREPEAT121(macro, data) macro(121, data) +#define MREPEAT123(macro, data) MREPEAT122(macro, data) macro(122, data) +#define MREPEAT124(macro, data) MREPEAT123(macro, data) macro(123, data) +#define MREPEAT125(macro, data) MREPEAT124(macro, data) macro(124, data) +#define MREPEAT126(macro, data) MREPEAT125(macro, data) macro(125, data) +#define MREPEAT127(macro, data) MREPEAT126(macro, data) macro(126, data) +#define MREPEAT128(macro, data) MREPEAT127(macro, data) macro(127, data) +#define MREPEAT129(macro, data) MREPEAT128(macro, data) macro(128, data) +#define MREPEAT130(macro, data) MREPEAT129(macro, data) macro(129, data) +#define MREPEAT131(macro, data) MREPEAT130(macro, data) macro(130, data) +#define MREPEAT132(macro, data) MREPEAT131(macro, data) macro(131, data) +#define MREPEAT133(macro, data) MREPEAT132(macro, data) macro(132, data) +#define MREPEAT134(macro, data) MREPEAT133(macro, data) macro(133, data) +#define MREPEAT135(macro, data) MREPEAT134(macro, data) macro(134, data) +#define MREPEAT136(macro, data) MREPEAT135(macro, data) macro(135, data) +#define MREPEAT137(macro, data) MREPEAT136(macro, data) macro(136, data) +#define MREPEAT138(macro, data) MREPEAT137(macro, data) macro(137, data) +#define MREPEAT139(macro, data) MREPEAT138(macro, data) macro(138, data) +#define MREPEAT140(macro, data) MREPEAT139(macro, data) macro(139, data) +#define MREPEAT141(macro, data) MREPEAT140(macro, data) macro(140, data) +#define MREPEAT142(macro, data) MREPEAT141(macro, data) macro(141, data) +#define MREPEAT143(macro, data) MREPEAT142(macro, data) macro(142, data) +#define MREPEAT144(macro, data) MREPEAT143(macro, data) macro(143, data) +#define MREPEAT145(macro, data) MREPEAT144(macro, data) macro(144, data) +#define MREPEAT146(macro, data) MREPEAT145(macro, data) macro(145, data) +#define MREPEAT147(macro, data) MREPEAT146(macro, data) macro(146, data) +#define MREPEAT148(macro, data) MREPEAT147(macro, data) macro(147, data) +#define MREPEAT149(macro, data) MREPEAT148(macro, data) macro(148, data) +#define MREPEAT150(macro, data) MREPEAT149(macro, data) macro(149, data) +#define MREPEAT151(macro, data) MREPEAT150(macro, data) macro(150, data) +#define MREPEAT152(macro, data) MREPEAT151(macro, data) macro(151, data) +#define MREPEAT153(macro, data) MREPEAT152(macro, data) macro(152, data) +#define MREPEAT154(macro, data) MREPEAT153(macro, data) macro(153, data) +#define MREPEAT155(macro, data) MREPEAT154(macro, data) macro(154, data) +#define MREPEAT156(macro, data) MREPEAT155(macro, data) macro(155, data) +#define MREPEAT157(macro, data) MREPEAT156(macro, data) macro(156, data) +#define MREPEAT158(macro, data) MREPEAT157(macro, data) macro(157, data) +#define MREPEAT159(macro, data) MREPEAT158(macro, data) macro(158, data) +#define MREPEAT160(macro, data) MREPEAT159(macro, data) macro(159, data) +#define MREPEAT161(macro, data) MREPEAT160(macro, data) macro(160, data) +#define MREPEAT162(macro, data) MREPEAT161(macro, data) macro(161, data) +#define MREPEAT163(macro, data) MREPEAT162(macro, data) macro(162, data) +#define MREPEAT164(macro, data) MREPEAT163(macro, data) macro(163, data) +#define MREPEAT165(macro, data) MREPEAT164(macro, data) macro(164, data) +#define MREPEAT166(macro, data) MREPEAT165(macro, data) macro(165, data) +#define MREPEAT167(macro, data) MREPEAT166(macro, data) macro(166, data) +#define MREPEAT168(macro, data) MREPEAT167(macro, data) macro(167, data) +#define MREPEAT169(macro, data) MREPEAT168(macro, data) macro(168, data) +#define MREPEAT170(macro, data) MREPEAT169(macro, data) macro(169, data) +#define MREPEAT171(macro, data) MREPEAT170(macro, data) macro(170, data) +#define MREPEAT172(macro, data) MREPEAT171(macro, data) macro(171, data) +#define MREPEAT173(macro, data) MREPEAT172(macro, data) macro(172, data) +#define MREPEAT174(macro, data) MREPEAT173(macro, data) macro(173, data) +#define MREPEAT175(macro, data) MREPEAT174(macro, data) macro(174, data) +#define MREPEAT176(macro, data) MREPEAT175(macro, data) macro(175, data) +#define MREPEAT177(macro, data) MREPEAT176(macro, data) macro(176, data) +#define MREPEAT178(macro, data) MREPEAT177(macro, data) macro(177, data) +#define MREPEAT179(macro, data) MREPEAT178(macro, data) macro(178, data) +#define MREPEAT180(macro, data) MREPEAT179(macro, data) macro(179, data) +#define MREPEAT181(macro, data) MREPEAT180(macro, data) macro(180, data) +#define MREPEAT182(macro, data) MREPEAT181(macro, data) macro(181, data) +#define MREPEAT183(macro, data) MREPEAT182(macro, data) macro(182, data) +#define MREPEAT184(macro, data) MREPEAT183(macro, data) macro(183, data) +#define MREPEAT185(macro, data) MREPEAT184(macro, data) macro(184, data) +#define MREPEAT186(macro, data) MREPEAT185(macro, data) macro(185, data) +#define MREPEAT187(macro, data) MREPEAT186(macro, data) macro(186, data) +#define MREPEAT188(macro, data) MREPEAT187(macro, data) macro(187, data) +#define MREPEAT189(macro, data) MREPEAT188(macro, data) macro(188, data) +#define MREPEAT190(macro, data) MREPEAT189(macro, data) macro(189, data) +#define MREPEAT191(macro, data) MREPEAT190(macro, data) macro(190, data) +#define MREPEAT192(macro, data) MREPEAT191(macro, data) macro(191, data) +#define MREPEAT193(macro, data) MREPEAT192(macro, data) macro(192, data) +#define MREPEAT194(macro, data) MREPEAT193(macro, data) macro(193, data) +#define MREPEAT195(macro, data) MREPEAT194(macro, data) macro(194, data) +#define MREPEAT196(macro, data) MREPEAT195(macro, data) macro(195, data) +#define MREPEAT197(macro, data) MREPEAT196(macro, data) macro(196, data) +#define MREPEAT198(macro, data) MREPEAT197(macro, data) macro(197, data) +#define MREPEAT199(macro, data) MREPEAT198(macro, data) macro(198, data) +#define MREPEAT200(macro, data) MREPEAT199(macro, data) macro(199, data) +#define MREPEAT201(macro, data) MREPEAT200(macro, data) macro(200, data) +#define MREPEAT202(macro, data) MREPEAT201(macro, data) macro(201, data) +#define MREPEAT203(macro, data) MREPEAT202(macro, data) macro(202, data) +#define MREPEAT204(macro, data) MREPEAT203(macro, data) macro(203, data) +#define MREPEAT205(macro, data) MREPEAT204(macro, data) macro(204, data) +#define MREPEAT206(macro, data) MREPEAT205(macro, data) macro(205, data) +#define MREPEAT207(macro, data) MREPEAT206(macro, data) macro(206, data) +#define MREPEAT208(macro, data) MREPEAT207(macro, data) macro(207, data) +#define MREPEAT209(macro, data) MREPEAT208(macro, data) macro(208, data) +#define MREPEAT210(macro, data) MREPEAT209(macro, data) macro(209, data) +#define MREPEAT211(macro, data) MREPEAT210(macro, data) macro(210, data) +#define MREPEAT212(macro, data) MREPEAT211(macro, data) macro(211, data) +#define MREPEAT213(macro, data) MREPEAT212(macro, data) macro(212, data) +#define MREPEAT214(macro, data) MREPEAT213(macro, data) macro(213, data) +#define MREPEAT215(macro, data) MREPEAT214(macro, data) macro(214, data) +#define MREPEAT216(macro, data) MREPEAT215(macro, data) macro(215, data) +#define MREPEAT217(macro, data) MREPEAT216(macro, data) macro(216, data) +#define MREPEAT218(macro, data) MREPEAT217(macro, data) macro(217, data) +#define MREPEAT219(macro, data) MREPEAT218(macro, data) macro(218, data) +#define MREPEAT220(macro, data) MREPEAT219(macro, data) macro(219, data) +#define MREPEAT221(macro, data) MREPEAT220(macro, data) macro(220, data) +#define MREPEAT222(macro, data) MREPEAT221(macro, data) macro(221, data) +#define MREPEAT223(macro, data) MREPEAT222(macro, data) macro(222, data) +#define MREPEAT224(macro, data) MREPEAT223(macro, data) macro(223, data) +#define MREPEAT225(macro, data) MREPEAT224(macro, data) macro(224, data) +#define MREPEAT226(macro, data) MREPEAT225(macro, data) macro(225, data) +#define MREPEAT227(macro, data) MREPEAT226(macro, data) macro(226, data) +#define MREPEAT228(macro, data) MREPEAT227(macro, data) macro(227, data) +#define MREPEAT229(macro, data) MREPEAT228(macro, data) macro(228, data) +#define MREPEAT230(macro, data) MREPEAT229(macro, data) macro(229, data) +#define MREPEAT231(macro, data) MREPEAT230(macro, data) macro(230, data) +#define MREPEAT232(macro, data) MREPEAT231(macro, data) macro(231, data) +#define MREPEAT233(macro, data) MREPEAT232(macro, data) macro(232, data) +#define MREPEAT234(macro, data) MREPEAT233(macro, data) macro(233, data) +#define MREPEAT235(macro, data) MREPEAT234(macro, data) macro(234, data) +#define MREPEAT236(macro, data) MREPEAT235(macro, data) macro(235, data) +#define MREPEAT237(macro, data) MREPEAT236(macro, data) macro(236, data) +#define MREPEAT238(macro, data) MREPEAT237(macro, data) macro(237, data) +#define MREPEAT239(macro, data) MREPEAT238(macro, data) macro(238, data) +#define MREPEAT240(macro, data) MREPEAT239(macro, data) macro(239, data) +#define MREPEAT241(macro, data) MREPEAT240(macro, data) macro(240, data) +#define MREPEAT242(macro, data) MREPEAT241(macro, data) macro(241, data) +#define MREPEAT243(macro, data) MREPEAT242(macro, data) macro(242, data) +#define MREPEAT244(macro, data) MREPEAT243(macro, data) macro(243, data) +#define MREPEAT245(macro, data) MREPEAT244(macro, data) macro(244, data) +#define MREPEAT246(macro, data) MREPEAT245(macro, data) macro(245, data) +#define MREPEAT247(macro, data) MREPEAT246(macro, data) macro(246, data) +#define MREPEAT248(macro, data) MREPEAT247(macro, data) macro(247, data) +#define MREPEAT249(macro, data) MREPEAT248(macro, data) macro(248, data) +#define MREPEAT250(macro, data) MREPEAT249(macro, data) macro(249, data) +#define MREPEAT251(macro, data) MREPEAT250(macro, data) macro(250, data) +#define MREPEAT252(macro, data) MREPEAT251(macro, data) macro(251, data) +#define MREPEAT253(macro, data) MREPEAT252(macro, data) macro(252, data) +#define MREPEAT254(macro, data) MREPEAT253(macro, data) macro(253, data) +#define MREPEAT255(macro, data) MREPEAT254(macro, data) macro(254, data) +#define MREPEAT256(macro, data) MREPEAT255(macro, data) macro(255, data) + +/** + * \} + */ + +#endif // _MREPEAT_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/preprocessor/preprocessor.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/preprocessor/preprocessor.h new file mode 100644 index 00000000..b597f58d --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/preprocessor/preprocessor.h @@ -0,0 +1,54 @@ +/** + * \file + * + * \brief Preprocessor utils. + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef _PREPROCESSOR_H_ +#define _PREPROCESSOR_H_ + +#include "tpaste.h" +#include "stringz.h" +#include "mrepeat.h" + + +#endif // _PREPROCESSOR_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/preprocessor/stringz.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/preprocessor/stringz.h new file mode 100644 index 00000000..fcb3d93b --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/preprocessor/stringz.h @@ -0,0 +1,84 @@ +/** + * \file + * + * \brief Preprocessor stringizing utils. + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef _STRINGZ_H_ +#define _STRINGZ_H_ + +/** + * \defgroup group_xmega_utils_stringz Stringize + * + * \ingroup group_xmega_utils + * + * \{ + */ + +/*! \brief Stringize. + * + * Stringize a preprocessing token, this token being allowed to be \#defined. + * + * May be used only within macros with the token passed as an argument if the token is \#defined. + * + * For example, writing STRINGZ(PIN) within a macro \#defined by PIN_NAME(PIN) + * and invoked as PIN_NAME(PIN0) with PIN0 \#defined as A0 is equivalent to + * writing "A0". + */ +#define STRINGZ(x) #x + +/*! \brief Absolute stringize. + * + * Stringize a preprocessing token, this token being allowed to be \#defined. + * + * No restriction of use if the token is \#defined. + * + * For example, writing ASTRINGZ(PIN0) anywhere with PIN0 \#defined as A0 is + * equivalent to writing "A0". + */ +#define ASTRINGZ(x) STRINGZ(x) + +/** + * \} + */ + +#endif // _STRINGZ_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/preprocessor/tpaste.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/preprocessor/tpaste.h new file mode 100644 index 00000000..168a0cf8 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/preprocessor/tpaste.h @@ -0,0 +1,104 @@ +/** + * \file + * + * \brief Preprocessor token pasting utils. + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef _TPASTE_H_ +#define _TPASTE_H_ + +/** + * \defgroup group_xmega_utils_tpaste Token Paste + * + * \ingroup group_xmega_utils + * + * \{ + */ + +/*! \name Token Paste + * + * Paste N preprocessing tokens together, these tokens being allowed to be \#defined. + * + * May be used only within macros with the tokens passed as arguments if the tokens are \#defined. + * + * For example, writing TPASTE2(U, WIDTH) within a macro \#defined by + * UTYPE(WIDTH) and invoked as UTYPE(UL_WIDTH) with UL_WIDTH \#defined as 32 is + * equivalent to writing U32. + */ +//! @{ +#define TPASTE2( a, b) a##b +#define TPASTE3( a, b, c) a##b##c +#define TPASTE4( a, b, c, d) a##b##c##d +#define TPASTE5( a, b, c, d, e) a##b##c##d##e +#define TPASTE6( a, b, c, d, e, f) a##b##c##d##e##f +#define TPASTE7( a, b, c, d, e, f, g) a##b##c##d##e##f##g +#define TPASTE8( a, b, c, d, e, f, g, h) a##b##c##d##e##f##g##h +#define TPASTE9( a, b, c, d, e, f, g, h, i) a##b##c##d##e##f##g##h##i +#define TPASTE10(a, b, c, d, e, f, g, h, i, j) a##b##c##d##e##f##g##h##i##j +//! @} + +/*! \name Absolute Token Paste + * + * Paste N preprocessing tokens together, these tokens being allowed to be \#defined. + * + * No restriction of use if the tokens are \#defined. + * + * For example, writing ATPASTE2(U, UL_WIDTH) anywhere with UL_WIDTH \#defined + * as 32 is equivalent to writing U32. + */ +//! @{ +#define ATPASTE2( a, b) TPASTE2( a, b) +#define ATPASTE3( a, b, c) TPASTE3( a, b, c) +#define ATPASTE4( a, b, c, d) TPASTE4( a, b, c, d) +#define ATPASTE5( a, b, c, d, e) TPASTE5( a, b, c, d, e) +#define ATPASTE6( a, b, c, d, e, f) TPASTE6( a, b, c, d, e, f) +#define ATPASTE7( a, b, c, d, e, f, g) TPASTE7( a, b, c, d, e, f, g) +#define ATPASTE8( a, b, c, d, e, f, g, h) TPASTE8( a, b, c, d, e, f, g, h) +#define ATPASTE9( a, b, c, d, e, f, g, h, i) TPASTE9( a, b, c, d, e, f, g, h, i) +#define ATPASTE10(a, b, c, d, e, f, g, h, i, j) TPASTE10(a, b, c, d, e, f, g, h, i, j) +//! @} + +/** + * \} + */ + +#endif // _TPASTE_H_ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/progmem.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/progmem.h new file mode 100644 index 00000000..fcab5dbb --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/progmem.h @@ -0,0 +1,102 @@ +/** + * \file + * + * \brief Program memory access + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef UTILS_PROGMEM_H +#define UTILS_PROGMEM_H + +/** + * \defgroup group_xmega_utils_progmem Program memory + * + * \ingroup group_xmega_utils + * + * \{ + */ + +/*! \name Program memory + * + * Macros for locating and accessing data in program memory. + * + * @{ + */ +#if defined(__GNUC__) || defined(__DOXYGEN__) +# include +# define PROGMEM_LOCATION(type, name, loc) \ + type name __attribute__((section (#loc))) +# define PROGMEM_DECLARE(type, name) const type name __attribute__((__progmem__)) +# define PROGMEM_STRING(x) PSTR(x) +# define PROGMEM_STRING_T PGM_P +# define PROGMEM_T const +# define PROGMEM_PTR_T const * +# define PROGMEM_BYTE_ARRAY_T uint8_t* +# define PROGMEM_WORD_ARRAY_T uint16_t* +# define PROGMEM_READ_BYTE(x) pgm_read_byte(x) +# define PROGMEM_READ_WORD(x) pgm_read_word(x) + +#elif defined(__ICCAVR__) +# include +# ifndef __HAS_ELPM__ +# define _MEMATTR_ASF __flash +# else /* __HAS_ELPM__ */ +# define _MEMATTR_ASF __hugeflash +# endif /* __HAS_ELPM__ */ +# define PROGMEM_LOCATION(type, name, loc) const _MEMATTR_ASF type name @ loc +# define PROGMEM_DECLARE(type, name) _MEMATTR_ASF type name +# define PROGMEM_STRING(x) ((_MEMATTR_ASF const char *)(x)) +# define PROGMEM_STRING_T char const _MEMATTR_ASF * +# define PROGMEM_T const _MEMATTR_ASF +# define PROGMEM_PTR_T const _MEMATTR_ASF * +# define PROGMEM_BYTE_ARRAY_T uint8_t const _MEMATTR_ASF * +# define PROGMEM_WORD_ARRAY_T uint16_t const _MEMATTR_ASF * +# define PROGMEM_READ_BYTE(x) *(x) +# define PROGMEM_READ_WORD(x) *(x) +#endif +//! @} + +/** + * \} + */ + +#endif /* UTILS_PROGMEM_H */ diff --git a/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/status_codes.h b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/status_codes.h new file mode 100644 index 00000000..035e6963 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ASF/xmega/utils/status_codes.h @@ -0,0 +1,121 @@ +/** + * \file + * + * \brief Status code definitions. + * + * This file defines various status codes returned by functions, + * indicating success or failure as well as what kind of failure. + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef STATUS_CODES_H_INCLUDED +#define STATUS_CODES_H_INCLUDED + +/** + * \defgroup group_xmega_utils_status_codes Status Codes + * + * \ingroup group_xmega_utils + * + * \{ + */ + +/* Note: this is a local workaround to avoid a pre-processor clash due to the + * lwIP macro ERR_TIMEOUT. */ +#if defined(__LWIP_ERR_H__) && defined(ERR_TIMEOUT) +#if (ERR_TIMEOUT != -3) + +/* Internal check to make sure that the later restore of lwIP's ERR_TIMEOUT + * macro is set to the correct value. Note that it is highly improbable that + * this value ever changes in lwIP. */ +#error ASF developers: check lwip err.h new value for ERR_TIMEOUT +#endif +#undef ERR_TIMEOUT +#endif + +/** + * Status code that may be returned by shell commands and protocol + * implementations. + * + * \note Any change to these status codes and the corresponding + * message strings is strictly forbidden. New codes can be added, + * however, but make sure that any message string tables are updated + * at the same time. + */ +enum status_code { + STATUS_OK = 0, //!< Success + ERR_IO_ERROR = -1, //!< I/O error + ERR_FLUSHED = -2, //!< Request flushed from queue + ERR_TIMEOUT = -3, //!< Operation timed out + ERR_BAD_DATA = -4, //!< Data integrity check failed + ERR_PROTOCOL = -5, //!< Protocol error + ERR_UNSUPPORTED_DEV = -6, //!< Unsupported device + ERR_NO_MEMORY = -7, //!< Insufficient memory + ERR_INVALID_ARG = -8, //!< Invalid argument + ERR_BAD_ADDRESS = -9, //!< Bad address + ERR_BUSY = -10, //!< Resource is busy + ERR_BAD_FORMAT = -11, //!< Data format not recognized + ERR_NO_TIMER = -12, //!< No timer available + ERR_TIMER_ALREADY_RUNNING = -13, //!< Timer already running + ERR_TIMER_NOT_RUNNING = -14, //!< Timer not running + + /** + * \brief Operation in progress + * + * This status code is for driver-internal use when an operation + * is currently being performed. + * + * \note Drivers should never return this status code to any + * callers. It is strictly for internal use. + */ + OPERATION_IN_PROGRESS = -128, +}; + +typedef enum status_code status_code_t; + +#if defined(__LWIP_ERR_H__) +#define ERR_TIMEOUT -3 +#endif + +/** + * \} + */ + +#endif /* STATUS_CODES_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/asf.h b/AVR Code/USB_BULK_TEST/src/asf.h new file mode 100644 index 00000000..cd3cf2f2 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/asf.h @@ -0,0 +1,101 @@ +/** + * \file + * + * \brief Autogenerated API include file for the Atmel Software Framework (ASF) + * + * Copyright (c) 2012 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ + +#ifndef ASF_H +#define ASF_H + +/* + * This file includes all API header files for the selected drivers from ASF. + * Note: There might be duplicate includes required by more than one driver. + * + * The file is automatically generated and will be re-written when + * running the ASF driver selector tool. Any changes will be discarded. + */ + +// From module: CPU specific features +#include +#include + +// From module: Common build items for user board support templates +#include + +// From module: Generic board support +#include + +// From module: IOPORT - General purpose I/O service +#include + +// From module: Interrupt management - XMEGA implementation +#include + +// From module: NVM - Non Volatile Memory +#include + +// From module: Part identification macros +#include + +// From module: Sleep Controller driver +#include + +// From module: Sleep manager - XMEGA A/AU/B/D implementation +#include +#include + +// From module: System Clock Control - XMEGA A1U/A3U/A3BU/A4U/B/C implementation +#include + +// From module: USB Device Stack Core (Common API) +#include +#include + +// From module: USB Device Vendor Class (Single Interface Device) +#include + +// From module: USB Vendor Protocol +#include + +// From module: XMEGA compiler driver +#include +#include + +#endif // ASF_H diff --git a/AVR Code/USB_BULK_TEST/src/config/conf_board.h b/AVR Code/USB_BULK_TEST/src/config/conf_board.h new file mode 100644 index 00000000..7b88c97f --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/config/conf_board.h @@ -0,0 +1,14 @@ +/** + * \file + * + * \brief User board configuration template + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef CONF_BOARD_H +#define CONF_BOARD_H + +#endif // CONF_BOARD_H diff --git a/AVR Code/USB_BULK_TEST/src/config/conf_clock.h b/AVR Code/USB_BULK_TEST/src/config/conf_clock.h new file mode 100644 index 00000000..9f74e559 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/config/conf_clock.h @@ -0,0 +1,80 @@ +/** + * \file + * + * \brief Chip-specific system clock manager configuration + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef CONF_CLOCK_H_INCLUDED +#define CONF_CLOCK_H_INCLUDED + +//! Configuration using On-Chip RC oscillator at 48MHz +//! The RC oscillator is calibrated via USB Start Of Frame +//! Clk USB = 48MHz (used by USB) +//! Clk sys = 48MHz +//! Clk cpu/per = 24MHz +#define CONFIG_USBCLK_SOURCE USBCLK_SRC_RCOSC +#define CONFIG_OSC_RC32_CAL 48000000UL + +#define CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC OSC_ID_USBSOF + +#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RC32MHZ +#define CONFIG_SYSCLK_PSADIV SYSCLK_PSADIV_2 +#define CONFIG_SYSCLK_PSBCDIV SYSCLK_PSBCDIV_1_1 + +/* +//! Use external board OSC (8MHz) +//! Clk pll = 48MHz (used by USB) +//! Clk sys = 48MHz +//! Clk cpu/per = 12MHz + +#define CONFIG_PLL0_SOURCE PLL_SRC_XOSC +#define CONFIG_PLL0_MUL 6 +#define CONFIG_PLL0_DIV 1 + +#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL + +#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL +#define CONFIG_SYSCLK_PSADIV SYSCLK_PSADIV_2 +#define CONFIG_SYSCLK_PSBCDIV SYSCLK_PSBCDIV_1_2 +*/ + +#endif /* CONF_CLOCK_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/config/conf_menu.h b/AVR Code/USB_BULK_TEST/src/config/conf_menu.h new file mode 100644 index 00000000..5a765a77 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/config/conf_menu.h @@ -0,0 +1,72 @@ +/** + * \file + * + * \brief Default configurations for menu system + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef DEFAULT_MENU_H_INCLUDED +#define DEFAULT_MENU_H_INCLUDED + +//! \name Indicator icon definitions +//@{ +//! Bitmap data, row by row, MSB is leftmost pixel, one byte per row. +#define GFX_MONO_MENU_INDICATOR_BITMAP 0xFF, 0x7E, 0x3C, 0x18 +//! Height in pixels of indicator icon +#define GFX_MONO_MENU_INDICATOR_HEIGHT 8 +//! Width in pixels of indicator icon +#define GFX_MONO_MENU_INDICATOR_WIDTH 4 +//@} + +//! \name Keyboard codes +//@{ +//! Down +#define GFX_MONO_MENU_KEYCODE_DOWN 40 +//! Up +#define GFX_MONO_MENU_KEYCODE_UP 38 +//! Back/exit +#define GFX_MONO_MENU_KEYCODE_BACK 8 +//! Enter/select +#define GFX_MONO_MENU_KEYCODE_ENTER 13 +//@} + +#endif /* DEFAULT_MENU_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/config/conf_sleepmgr.h b/AVR Code/USB_BULK_TEST/src/config/conf_sleepmgr.h new file mode 100644 index 00000000..4c6708d9 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/config/conf_sleepmgr.h @@ -0,0 +1,51 @@ +/** + * \file + * + * \brief Sleep manager configuration + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef CONF_SLEEPMGR_H +#define CONF_SLEEPMGR_H + +#define CONFIG_SLEEPMGR_ENABLE + +#endif /* CONF_SLEEPMGR_H */ diff --git a/AVR Code/USB_BULK_TEST/src/config/conf_spi_master.h b/AVR Code/USB_BULK_TEST/src/config/conf_spi_master.h new file mode 100644 index 00000000..afdc02ed --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/config/conf_spi_master.h @@ -0,0 +1,52 @@ +/** + * \file ********************************************************************* + * + * \brief Spi Master configuration for spi example + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef CONF_SPI_MASTER_H_INCLUDED +#define CONF_SPI_MASTER_H_INCLUDED + +//! Default Config Spi Master Dummy Field +// #define CONFIG_SPI_MASTER_DUMMY 0xFF + +#endif /* CONF_SPI_MASTER_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/config/conf_spinctrl.h b/AVR Code/USB_BULK_TEST/src/config/conf_spinctrl.h new file mode 100644 index 00000000..2090b6a1 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/config/conf_spinctrl.h @@ -0,0 +1,75 @@ +/** + * \file + * + * \brief Default configurations for gfx_mono_spinctrl + * + * Copyright (c) 2009-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef DEFAULT_GFX_MONO_SPINCTRL_H_INCLUDED +#define DEFAULT_GFX_MONO_SPINCTRL_H_INCLUDED + +//! Spinner value indicator +/* Bitmap data, row by row, MSB is leftmost pixel, one byte per row. */ +#define GFX_MONO_SPINCTRL_SPIN_INDICATOR_BITMAP 0x18, 0x3C, 0x7E, 0xFF +//! Height of spinner value indicator +#define GFX_MONO_SPINCTRL_SPIN_INDICATOR_HEIGHT 8 +//! Width of spinner value indicator +#define GFX_MONO_SPINCTRL_SPIN_INDICATOR_WIDTH 4 + +//! Spinner indicator +/* Bitmap data, row by row, MSB is leftmost pixel, one byte per row. */ +#define GFX_MONO_SPINCTRL_INDICATOR_BITMAP 0xFF, 0x7E, 0x3C, 0x18 +//! Height of spinner indicator +#define GFX_MONO_SPINCTRL_INDICATOR_HEIGHT 8 +//! Width of spinner indicator +#define GFX_MONO_SPINCTRL_INDICATOR_WIDTH 4 + +//! Keyboard code down +#define GFX_MONO_SPINCTRL_KEYCODE_DOWN 40 +//! Keyboard code up +#define GFX_MONO_SPINCTRL_KEYCODE_UP 38 +//! Keyboard code back +#define GFX_MONO_SPINCTRL_KEYCODE_BACK 8 +//! Keyboard code enter +#define GFX_MONO_SPINCTRL_KEYCODE_ENTER 13 + +#endif /* DEFAULT_GFX_MONO_SPINCTRL_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/config/conf_st7565r.h b/AVR Code/USB_BULK_TEST/src/config/conf_st7565r.h new file mode 100644 index 00000000..0dd67fd8 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/config/conf_st7565r.h @@ -0,0 +1,101 @@ +/** + * \file + * + * \brief ST7565R display controller driver configuration file. + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef CONF_ST7565R_H_INCLUDED +#define CONF_ST7565R_H_INCLUDED + +#include + +#if BOARD == XMEGA_A3BU_XPLAINED +// Interface configuration for XMEGA-A3BU Xplained + +# define ST7565R_USART_SPI_INTERFACE +# define ST7565R_USART_SPI &USARTD0 + +# define ST7565R_A0_PIN NHD_C12832A1Z_REGISTER_SELECT +# define ST7565R_CS_PIN NHD_C12832A1Z_CSN +# define ST7565R_RESET_PIN NHD_C12832A1Z_RESETN + +#else +// Interface configuration for other boards +# warning ST7565R driver must be configured. Please see conf_st7565r.h. + +// Interface possibilities: +// 1) Regular SPI interface +// #define ST7565R_SPI_INTERFACE +// #define ST7565R_SPI &SPID + +// 2) USART SPI interface +// #define ST7565R_USART_SPI_INTERFACE +// #define ST7565R_USART_SPI &USARTD0 + +// Pin mapping: +// - Register select +// #define ST7565R_A0_PIN 0 +// - Chip select +// #define ST7565R_CS_PIN 1 +// - Reset +// #define ST7565R_RESET_PIN 2 + + +// Placeholder setup + +# define ST7565R_SPI_INTERFACE +# define ST7565R_SPI 0 + +# define ST7565R_A0_PIN 0 +# define ST7565R_CS_PIN 1 +# define ST7565R_RESET_PIN 2 + +#endif // BOARD + +// Board independent configuration + +// Minimum clock period is 50ns@3.3V -> max frequency is 20MHz +#define ST7565R_CLOCK_SPEED 1000000 +#define ST7565R_DISPLAY_CONTRAST_MAX 40 +#define ST7565R_DISPLAY_CONTRAST_MIN 30 + +#endif /* CONF_ST7565R_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/config/conf_sysfont.h b/AVR Code/USB_BULK_TEST/src/config/conf_sysfont.h new file mode 100644 index 00000000..05daa73b --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/config/conf_sysfont.h @@ -0,0 +1,1170 @@ +/** + * \file + * + * \brief Default configurations for sysfont + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef CONF_SYSFONT_H +#define CONF_SYSFONT_H + +/** + * \weakgroup gfx_mono_sysfont + * @{ + */ + +#include + +/* #define USE_FONT_BPMONO_10x16 */ +/* #define USE_FONT_BPMONO_10x14 */ +/* #define USE_FONT_MONO_MMM_10x12 */ +#define USE_FONT_BASIC_6x7 + +#if defined(USE_FONT_BPMONO_10x16) +/** Width of each glyph, including spacer column. */ +# define SYSFONT_WIDTH 10 +/** Height of each glyph, excluding spacer line. */ +# define SYSFONT_HEIGHT 16 +/** Line height. */ +# define SYSFONT_LINESPACING 8 +/** First character defined. */ +# define SYSFONT_FIRSTCHAR ((uint8_t)' ') +/** Last character defined. */ +# define SYSFONT_LASTCHAR ((uint8_t)'}') + +/** Define variable containing the font */ +# define SYSFONT_DEFINE_GLYPHS \ + /* Glyph data, row by row, MSB is leftmost pixel, one byte per row. */ \ + static PROGMEM_DECLARE(uint8_t, sysfont_glyphs[]) = { \ + /* "BPmono" font (http://www.backpacker.gr) at size 10x16 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, \ + 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, \ + 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* ! */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6C, 0x00, \ + 0x6C, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* " */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, \ + 0x48, 0x00, 0xFC, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, \ + 0xFC, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* # */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x3C, 0x00, 0x40, 0x00, 0x30, 0x00, 0x08, 0x00, 0x04, 0x00, \ + 0x78, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* $ */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, \ + 0xA4, 0x00, 0xA8, 0x00, 0x48, 0x00, 0x10, 0x00, 0x14, 0x00, \ + 0x2A, 0x00, 0x4A, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* % */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, 0x88, 0x00, 0x8A, 0x00, \ + 0x8A, 0x00, 0x8C, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* & */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* ' */ \ + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* ( */ \ + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, \ + 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* ) */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x10, 0x00, \ + 0x7C, 0x00, 0x10, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* * */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xFE, 0x00, \ + 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* + */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x20, 0x00, \ + 0x00, 0x00, /* , */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* - */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* . */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, \ + 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* / */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x8C, 0x00, 0x94, 0x00, 0xA4, 0x00, 0xC4, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* 0 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x00, \ + 0x50, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x10, 0x00, 0x10, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* 1 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x40, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* 2 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x08, 0x00, 0x08, 0x00, 0x30, 0x00, 0x08, 0x00, 0x08, 0x00, \ + 0x08, 0x00, 0x88, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* 3 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, \ + 0x28, 0x00, 0x28, 0x00, 0x48, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0xFC, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* 4 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0xB8, 0x00, 0xC4, 0x00, 0x04, 0x00, 0x04, 0x00, \ + 0x04, 0x00, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* 5 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x40, 0x00, \ + 0x80, 0x00, 0x80, 0x00, 0xB0, 0x00, 0xC8, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* 6 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x04, 0x00, \ + 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* 7 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x78, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* 8 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x8C, 0x00, 0x74, 0x00, 0x04, 0x00, \ + 0x08, 0x00, 0x10, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* 9 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* : */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0xC0, 0x00, 0x80, 0x00, \ + 0x00, 0x00, /* ; */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x04, 0x00, 0x18, 0x00, 0x60, 0x00, 0x80, 0x00, \ + 0x60, 0x00, 0x18, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* < */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* = */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x40, 0x00, 0x30, 0x00, 0x0C, 0x00, 0x02, 0x00, \ + 0x0C, 0x00, 0x30, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* > */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* ? */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x3C, 0x00, 0x42, 0x00, 0xBA, 0x00, 0xAA, 0x00, 0xAA, 0x00, \ + 0xAA, 0x00, 0xBC, 0x00, 0x40, 0x00, 0x3C, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* @ */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x44, 0x00, 0x7C, 0x00, \ + 0x44, 0x00, 0x82, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* A */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x88, 0x00, 0xF0, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x88, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* B */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, \ + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* C */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x88, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x88, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* D */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x40, 0x00, \ + 0x40, 0x00, 0x40, 0x00, 0x78, 0x00, 0x40, 0x00, 0x40, 0x00, \ + 0x40, 0x00, 0x40, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* E */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x40, 0x00, \ + 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x78, 0x00, 0x40, 0x00, \ + 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* F */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x44, 0x00, \ + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x9C, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x44, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* G */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0xFC, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* H */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x10, 0x00, \ + 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x10, 0x00, 0x10, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* I */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x08, 0x00, \ + 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, \ + 0x08, 0x00, 0x10, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* J */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x88, 0x00, 0x90, 0x00, 0xA0, 0x00, 0xD0, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x84, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* K */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0x80, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* L */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0xCC, 0x00, 0xCC, 0x00, 0xB4, 0x00, 0xB4, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* M */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0xC4, 0x00, \ + 0xC4, 0x00, 0xA4, 0x00, 0xA4, 0x00, 0x94, 0x00, 0x94, 0x00, \ + 0x8C, 0x00, 0x8C, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* N */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x48, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* O */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x88, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x88, 0x00, 0xF0, 0x00, \ + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* P */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x48, 0x00, 0x30, 0x00, 0x20, 0x00, 0x1C, 0x00, \ + 0x00, 0x00, /* Q */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x88, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x88, 0x00, 0xF0, 0x00, 0x90, 0x00, \ + 0x88, 0x00, 0x84, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* R */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, \ + 0x80, 0x00, 0x40, 0x00, 0x30, 0x00, 0x08, 0x00, 0x04, 0x00, \ + 0x04, 0x00, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* S */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x10, 0x00, \ + 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* T */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* U */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x82, 0x00, \ + 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28, 0x00, \ + 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* V */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0xB4, 0x00, 0xB4, 0x00, 0xB4, 0x00, \ + 0x78, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* W */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x44, 0x00, \ + 0x44, 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x28, 0x00, \ + 0x44, 0x00, 0x44, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* X */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x44, 0x00, \ + 0x44, 0x00, 0x28, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, \ + 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* Y */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x04, 0x00, \ + 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, \ + 0x40, 0x00, 0x40, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* Z */ \ + 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xE0, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* [ */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, \ + 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* \ */ \ + 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xE0, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* ] */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, \ + 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* ^ */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* _ */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, \ + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* ` */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x78, 0x00, 0x04, 0x00, 0x04, 0x00, 0x7C, 0x00, \ + 0x84, 0x00, 0x8C, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* a */ \ + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0xB8, 0x00, 0xC4, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x88, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* b */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x7C, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0x80, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* c */ \ + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, \ + 0x02, 0x00, 0x3E, 0x00, 0x42, 0x00, 0x82, 0x00, 0x82, 0x00, \ + 0x82, 0x00, 0x42, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* d */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x7C, 0x00, 0x82, 0x00, 0x82, 0x00, 0xFE, 0x00, \ + 0x80, 0x00, 0x80, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* e */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0xFC, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* f */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x7C, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x8C, 0x00, 0x74, 0x00, 0x04, 0x00, 0x44, 0x00, \ + 0x38, 0x00, /* g */ \ + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0xB8, 0x00, 0xC4, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* h */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x70, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x10, 0x00, 0x10, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* i */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x78, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, \ + 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, \ + 0xE0, 0x00, /* j */ \ + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0x88, 0x00, 0x90, 0x00, 0xA0, 0x00, 0xE0, 0x00, \ + 0x90, 0x00, 0x88, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* k */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x10, 0x00, \ + 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x10, 0x00, 0x10, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* l */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0xAC, 0x00, 0xD4, 0x00, 0x94, 0x00, 0x94, 0x00, \ + 0x94, 0x00, 0x94, 0x00, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* m */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0xB8, 0x00, 0xC4, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* n */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* o */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0xB8, 0x00, 0xC4, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0xF8, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x80, 0x00, /* p */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x7C, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x7C, 0x00, 0x04, 0x00, 0x04, 0x00, \ + 0x04, 0x00, /* q */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0xCC, 0x00, 0x30, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* r */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x7C, 0x00, 0x80, 0x00, 0x80, 0x00, 0x78, 0x00, \ + 0x04, 0x00, 0x04, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* s */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x20, 0x00, 0xFC, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* t */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x88, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* u */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x82, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28, 0x00, \ + 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* v */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x84, 0x00, 0x84, 0x00, 0xB4, 0x00, 0xB4, 0x00, \ + 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* w */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x44, 0x00, 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, \ + 0x28, 0x00, 0x44, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* x */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x82, 0x00, 0x44, 0x00, 0x44, 0x00, 0x28, 0x00, \ + 0x28, 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, \ + 0x20, 0x00, /* y */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0xFC, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, \ + 0x20, 0x00, 0x40, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* z */ \ + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, \ + 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* { */ \ + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, \ + 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* | */ \ + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, \ + 0x00, 0x00, /* } */ \ + }; +#elif defined(USE_FONT_BPMONO_10x14) +/** Width of each glyph, including spacer column. */ +# define SYSFONT_WIDTH 10 +/** Height of each glyph, excluding spacer line. */ +# define SYSFONT_HEIGHT 14 +/** Line height. */ +# define SYSFONT_LINESPACING 8 +/** First character defined. */ +# define SYSFONT_FIRSTCHAR ((uint8_t)' ') +/** Last character defined. */ +# define SYSFONT_LASTCHAR ((uint8_t)'}') + +/** Define variable containing the font */ +# define SYSFONT_DEFINE_GLYPHS \ + /* Glyph data, row by row, MSB is leftmost pixel, one byte per row. */ \ + static PROGMEM_DECLARE(uint8_t, sysfont_glyphs[]) = { \ + /* "BPmono" font (http://www.backpacker.gr) at size 10x14 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* */ \ + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, \ + 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, \ + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ! */ \ + 0x00, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6C, 0x00, 0x6C, 0x00, \ + 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* " */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x28, 0x00, \ + 0x7C, 0x00, 0x28, 0x00, 0x28, 0x00, 0x7C, 0x00, 0x28, 0x00, \ + 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* # */ \ + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x3C, 0x00, 0x40, 0x00, \ + 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x78, 0x00, \ + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* $ */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0xA4, 0x00, \ + 0xA8, 0x00, 0x50, 0x00, 0x28, 0x00, 0x54, 0x00, 0x94, 0x00, \ + 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* % */ \ + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x90, 0x00, 0x90, 0x00, \ + 0x90, 0x00, 0x60, 0x00, 0x94, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* & */ \ + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ' */ \ + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, /* ( */ \ + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, \ + 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, \ + 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, /* ) */ \ + 0x00, 0x00, 0x28, 0x00, 0x10, 0x00, 0x7C, 0x00, 0x10, 0x00, \ + 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* * */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, \ + 0x10, 0x00, 0x10, 0x00, 0xFE, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* + */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x10, 0x00, 0x30, 0x00, 0x20, 0x00, 0x00, 0x00, /* , */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* - */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, \ + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* . */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, \ + 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, \ + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* / */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, \ + 0x8C, 0x00, 0x94, 0x00, 0xA4, 0x00, 0xC4, 0x00, 0x84, 0x00, \ + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x00, \ + 0x50, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 1 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00, \ + 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 2 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x08, 0x00, 0x30, 0x00, 0x08, 0x00, 0x08, 0x00, 0x88, 0x00, \ + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 3 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, \ + 0x28, 0x00, 0x48, 0x00, 0x88, 0x00, 0xFC, 0x00, 0x08, 0x00, \ + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 4 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0xF0, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, \ + 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 5 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x40, 0x00, \ + 0x80, 0x00, 0xF0, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 6 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x08, 0x00, \ + 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, \ + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 7 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x70, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 8 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, 0x08, 0x00, 0x10, 0x00, \ + 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 9 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, \ + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* : */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, \ + 0x30, 0x00, 0x60, 0x00, 0x40, 0x00, 0x00, 0x00, /* ; */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, \ + 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, \ + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* < */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* = */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, \ + 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, \ + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* > */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, \ + 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ? */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, \ + 0x42, 0x00, 0x9A, 0x00, 0xAA, 0x00, 0xAA, 0x00, 0xBE, 0x00, \ + 0x80, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, /* @ */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, \ + 0x28, 0x00, 0x44, 0x00, 0x7C, 0x00, 0x44, 0x00, 0x44, 0x00, \ + 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* A */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0xF8, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* B */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x40, 0x00, \ + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x40, 0x00, \ + 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* C */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x88, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x88, 0x00, \ + 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* D */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0xF0, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* E */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0xF8, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* F */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x40, 0x00, \ + 0x80, 0x00, 0x80, 0x00, 0x9C, 0x00, 0x84, 0x00, 0x44, 0x00, \ + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* G */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0xF8, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* H */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* I */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x08, 0x00, \ + 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, \ + 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* J */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x88, 0x00, \ + 0x90, 0x00, 0xA0, 0x00, 0xD0, 0x00, 0x88, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* K */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* L */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0xCC, 0x00, \ + 0xCC, 0x00, 0xB4, 0x00, 0xB4, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* M */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0xC4, 0x00, \ + 0xC4, 0x00, 0xA4, 0x00, 0xA4, 0x00, 0x94, 0x00, 0x94, 0x00, \ + 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* N */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* O */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0xF8, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* P */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x78, 0x00, 0x20, 0x00, 0x18, 0x00, 0x00, 0x00, /* Q */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0xF8, 0x00, 0x88, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* R */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0x60, 0x00, 0x18, 0x00, 0x04, 0x00, 0x04, 0x00, \ + 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* S */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* T */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* U */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x48, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, \ + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* V */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0xA8, 0x00, \ + 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0x50, 0x00, \ + 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* W */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x50, 0x00, 0x20, 0x00, 0x20, 0x00, 0x50, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* X */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x50, 0x00, 0x50, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Y */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x04, 0x00, \ + 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00, \ + 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Z */ \ + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x40, 0x00, 0x40, 0x00, \ + 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, \ + 0x40, 0x00, 0x40, 0x00, 0x70, 0x00, 0x00, 0x00, /* [ */ \ + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, /* \ */ \ + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x08, 0x00, 0x08, 0x00, \ + 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, \ + 0x08, 0x00, 0x08, 0x00, 0x38, 0x00, 0x00, 0x00, /* ] */ \ + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x28, 0x00, 0x44, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ^ */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* _ */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* ` */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x70, 0x00, 0x08, 0x00, 0x08, 0x00, 0x78, 0x00, 0x88, 0x00, \ + 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* a */ \ + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0xF8, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* b */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x78, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* c */ \ + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, \ + 0x7C, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x8C, 0x00, \ + 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* d */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x78, 0x00, 0x84, 0x00, 0xFC, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* e */ \ + 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0xFC, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* f */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x7C, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x7C, 0x00, 0x04, 0x00, 0x78, 0x00, 0x00, 0x00, /* g */ \ + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0xB8, 0x00, 0xC4, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* h */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, \ + 0x70, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* i */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, \ + 0x78, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, \ + 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x70, 0x00, /* j */ \ + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x88, 0x00, 0x90, 0x00, 0xA0, 0x00, 0xD0, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* k */ \ + 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* l */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0xA4, 0x00, 0xFC, 0x00, 0xA4, 0x00, 0xA4, 0x00, 0xA4, 0x00, \ + 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* m */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0xB8, 0x00, 0xC4, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* n */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x78, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* o */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0xB8, 0x00, 0xC4, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0xF8, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, /* p */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x7C, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, \ + 0x7C, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, /* q */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0xD8, 0x00, 0x60, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, \ + 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* r */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x78, 0x00, 0x80, 0x00, 0x40, 0x00, 0x30, 0x00, 0x08, 0x00, \ + 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* s */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, \ + 0xFC, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* t */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* u */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x48, 0x00, 0x48, 0x00, \ + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* v */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x88, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, \ + 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* w */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x88, 0x00, 0x50, 0x00, 0x20, 0x00, 0x20, 0x00, 0x50, 0x00, \ + 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* x */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x84, 0x00, 0x84, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, 0x00, \ + 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, /* y */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0xF8, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, \ + 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* z */ \ + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x10, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, /* { */ \ + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, /* | */ \ + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x10, 0x00, \ + 0x10, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, /* } */ \ + }; +#elif defined(USE_FONT_MONO_MMM_10x12) +/** Width of each glyph, including spacer column. */ +# define SYSFONT_WIDTH 10 +/** Height of each glyph, excluding spacer line. */ +# define SYSFONT_HEIGHT 12 +/** Line height. */ +# define SYSFONT_LINESPACING 8 +/** First character defined. */ +# define SYSFONT_FIRSTCHAR ((uint8_t)' ') +/** Last character defined. */ +# define SYSFONT_LASTCHAR ((uint8_t)'}') + +/** Define variable containing the font */ +# define SYSFONT_DEFINE_GLYPHS \ + /* Glyph data, row by row, MSB is leftmost pixel, one byte per row. */ \ + static PROGMEM_DECLARE(uint8_t, sysfont_glyphs[]) = { \ + /* "MonoMMM" font (http://www.dafont.com/monommm-5.font) size 10x12 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* ! */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x50, 0x00, \ + 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* " */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0xF8, 0x00, \ + 0x50, 0x00, 0xF8, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* # */ \ + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x70, 0x00, 0xA8, 0x00, \ + 0xA0, 0x00, 0x70, 0x00, 0x28, 0x00, 0xA8, 0x00, 0x70, 0x00, \ + 0x20, 0x00, 0x00, 0x00, /* $ */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x00, 0xB0, 0x00, \ + 0x50, 0x00, 0x20, 0x00, 0x50, 0x00, 0x68, 0x00, 0x98, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* % */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x90, 0x00, \ + 0xA0, 0x00, 0x40, 0x00, 0xA8, 0x00, 0x90, 0x00, 0x68, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* & */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* ' */ \ + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x10, 0x00, 0x00, 0x00, /* ( */ \ + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x40, 0x00, 0x00, 0x00, /* ) */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xF8, 0x00, \ + 0x70, 0x00, 0xF8, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* * */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0xF8, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* + */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x40, 0x00, /* , */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* - */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* . */ \ + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, \ + 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0x60, 0x00, 0x40, 0x00, \ + 0xC0, 0x00, 0x00, 0x00, /* / */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x98, 0x00, 0xA8, 0x00, 0xC8, 0x00, 0x88, 0x00, 0x70, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* 0 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xE0, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* 1 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0xF8, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* 2 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x08, 0x00, 0x30, 0x00, 0x08, 0x00, 0x88, 0x00, 0x70, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* 3 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x00, \ + 0x50, 0x00, 0x90, 0x00, 0xF8, 0x00, 0x10, 0x00, 0x10, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* 4 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x80, 0x00, \ + 0xF0, 0x00, 0x08, 0x00, 0x08, 0x00, 0x88, 0x00, 0x70, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* 5 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0xF0, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* 6 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x08, 0x00, \ + 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* 7 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x70, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* 8 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x78, 0x00, 0x08, 0x00, 0x08, 0x00, 0x70, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* 9 */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* : */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x40, 0x00, /* ; */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, \ + 0x20, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* < */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0xF8, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* = */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, \ + 0x10, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* > */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* ? */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0xB8, 0x00, 0xA8, 0x00, 0xB8, 0x00, 0x80, 0x00, 0x78, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* @ */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x88, 0x00, 0xF8, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* A */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0xF0, 0x00, 0x88, 0x00, 0x88, 0x00, 0xF0, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* B */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x88, 0x00, 0x70, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* C */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0xF0, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* D */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0xF0, 0x00, 0x80, 0x00, 0x80, 0x00, 0xF8, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* E */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0xF0, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* F */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x80, 0x00, 0x98, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* G */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0xF8, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* H */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xF8, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* I */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, \ + 0x08, 0x00, 0x08, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* J */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x00, 0xB0, 0x00, \ + 0xE0, 0x00, 0xC0, 0x00, 0xE0, 0x00, 0xB0, 0x00, 0x98, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* K */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xF8, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* L */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0xD8, 0x00, \ + 0xF8, 0x00, 0xA8, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* M */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0xC8, 0x00, \ + 0xC8, 0x00, 0xA8, 0x00, 0x98, 0x00, 0x98, 0x00, 0x88, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* N */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* O */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0xF0, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* P */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0xA8, 0x00, 0x70, 0x00, \ + 0x08, 0x00, 0x00, 0x00, /* Q */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0xF0, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* R */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x88, 0x00, \ + 0x80, 0x00, 0x70, 0x00, 0x08, 0x00, 0x88, 0x00, 0x70, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* S */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* T */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* U */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* V */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x88, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0x50, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* W */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x50, 0x00, \ + 0x70, 0x00, 0x20, 0x00, 0x70, 0x00, 0x50, 0x00, 0x88, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* X */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x50, 0x00, \ + 0x70, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* Y */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x08, 0x00, \ + 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00, 0xF8, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* Z */ \ + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x30, 0x00, 0x00, 0x00, /* [ */ \ + 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x40, 0x00, 0x60, 0x00, \ + 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, \ + 0x04, 0x00, 0x00, 0x00, /* \ */ \ + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x60, 0x00, 0x00, 0x00, /* ] */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x50, 0x00, \ + 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* ^ */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0xFC, 0x00, /* _ */ \ + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* ` */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0xF0, 0x00, 0x08, 0x00, 0xF8, 0x00, 0x88, 0x00, 0xF8, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* a */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0xF0, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0xF0, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* b */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x70, 0x00, 0x88, 0x00, 0x80, 0x00, 0x88, 0x00, 0x70, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* c */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, \ + 0x78, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* d */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x70, 0x00, 0x88, 0x00, 0xF8, 0x00, 0x80, 0x00, 0x78, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* e */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x20, 0x00, \ + 0x70, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* f */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x78, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, \ + 0x08, 0x00, 0x70, 0x00, /* g */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0xF0, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* h */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, \ + 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x70, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* i */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, \ + 0xE0, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0xC0, 0x00, /* j */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x98, 0x00, 0xA0, 0x00, 0xE0, 0x00, 0x90, 0x00, 0x88, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* k */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0xF8, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* l */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0xF8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* m */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0xF0, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* n */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x70, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* o */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0xF0, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0xF0, 0x00, \ + 0x80, 0x00, 0x80, 0x00, /* p */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x78, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, \ + 0x08, 0x00, 0x08, 0x00, /* q */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0xF8, 0x00, 0x88, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* r */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0xF8, 0x00, 0x80, 0x00, 0xF8, 0x00, 0x08, 0x00, 0xF8, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* s */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x78, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x18, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* t */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* u */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x88, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x20, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* v */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0x50, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* w */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0xD8, 0x00, 0x50, 0x00, 0x20, 0x00, 0x50, 0x00, 0xD8, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* x */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x78, 0x00, \ + 0x08, 0x00, 0x70, 0x00, /* y */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0xF8, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0xF8, 0x00, \ + 0x00, 0x00, 0x00, 0x00, /* z */ \ + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x10, 0x00, 0x00, 0x00, /* { */ \ + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x00, 0x00, /* | */ \ + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x20, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, \ + 0x40, 0x00, 0x00, 0x00, /* } */ \ + }; +#elif defined(USE_FONT_BASIC_6x7) +/** Width of each glyph, including spacer column. */ +# define SYSFONT_WIDTH 6 +/** Height of each glyph, excluding spacer line. */ +# define SYSFONT_HEIGHT 7 +/** Line height. */ +# define SYSFONT_LINESPACING 8 +/** First character defined. */ +# define SYSFONT_FIRSTCHAR ((uint8_t)' ') +/** Last character defined. */ +# define SYSFONT_LASTCHAR ((uint8_t)'}') + +/** Define variable containing the font */ +# define SYSFONT_DEFINE_GLYPHS \ + /* Glyph data, row by row, MSB is leftmost pixel, one byte per row. */ \ + static PROGMEM_DECLARE(uint8_t, sysfont_glyphs[]) = { \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* " " */ \ + 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x20, /* "!" */ \ + 0x50, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, /* """ */ \ + 0x50, 0x50, 0xf8, 0x50, 0xf8, 0x50, 0x50, /* "#" */ \ + 0x20, 0x78, 0xa0, 0x70, 0x28, 0xf0, 0x20, /* "$" */ \ + 0xc0, 0xc8, 0x10, 0x20, 0x40, 0x98, 0x18, /* "%" */ \ + 0x60, 0x90, 0xa0, 0x40, 0xa8, 0x90, 0x68, /* "&" */ \ + 0x60, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, /* "'" */ \ + 0x10, 0x20, 0x40, 0x40, 0x40, 0x20, 0x10, /* "(" */ \ + 0x40, 0x20, 0x10, 0x10, 0x10, 0x20, 0x40, /* ")" */ \ + 0x00, 0x50, 0x20, 0xf8, 0x20, 0x50, 0x00, /* "*" */ \ + 0x00, 0x20, 0x20, 0xf8, 0x20, 0x20, 0x00, /* "+" */ \ + 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x40, /* "," */ \ + 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, /* "-" */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, /* "." */ \ + 0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, /* "/" */ \ + 0x70, 0x88, 0x98, 0xa8, 0xc8, 0x88, 0x70, /* "0" */ \ + 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x70, /* "1" */ \ + 0x70, 0x88, 0x08, 0x10, 0x20, 0x40, 0xf8, /* "2" */ \ + 0xf8, 0x10, 0x20, 0x10, 0x08, 0x88, 0x70, /* "3" */ \ + 0x10, 0x30, 0x50, 0x90, 0xf8, 0x10, 0x10, /* "4" */ \ + 0xf8, 0x80, 0xf0, 0x08, 0x08, 0x88, 0x70, /* "5" */ \ + 0x30, 0x40, 0x80, 0xf0, 0x88, 0x88, 0x70, /* "6" */ \ + 0xf8, 0x08, 0x10, 0x20, 0x40, 0x40, 0x40, /* "7" */ \ + 0x70, 0x88, 0x88, 0x70, 0x88, 0x88, 0x70, /* "8" */ \ + 0x70, 0x88, 0x88, 0x78, 0x08, 0x10, 0x60, /* "9" */ \ + 0x00, 0x60, 0x60, 0x00, 0x60, 0x60, 0x00, /* ":" */ \ + 0x00, 0x60, 0x60, 0x00, 0x60, 0x20, 0x40, /* ";" */ \ + 0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08, /* "<" */ \ + 0x00, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0x00, /* "=" */ \ + 0x80, 0x40, 0x20, 0x10, 0x20, 0x40, 0x80, /* ">" */ \ + 0x70, 0x88, 0x08, 0x10, 0x20, 0x00, 0x20, /* "?" */ \ + 0x70, 0x88, 0x08, 0x68, 0xa8, 0xa8, 0x70, /* "@" */ \ + 0x70, 0x88, 0x88, 0x88, 0xf8, 0x88, 0x88, /* "A" */ \ + 0xf0, 0x88, 0x88, 0xf0, 0x88, 0x88, 0xf0, /* "B" */ \ + 0x70, 0x88, 0x80, 0x80, 0x80, 0x88, 0x70, /* "C" */ \ + 0xe0, 0x90, 0x88, 0x88, 0x88, 0x90, 0xe0, /* "D" */ \ + 0xf8, 0x80, 0x80, 0xf0, 0x80, 0x80, 0xf8, /* "E" */ \ + 0xf8, 0x80, 0x80, 0xe0, 0x80, 0x80, 0x80, /* "F" */ \ + 0x70, 0x88, 0x80, 0x80, 0x98, 0x88, 0x70, /* "G" */ \ + 0x88, 0x88, 0x88, 0xf8, 0x88, 0x88, 0x88, /* "H" */ \ + 0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, /* "I" */ \ + 0x38, 0x10, 0x10, 0x10, 0x10, 0x90, 0x60, /* "J" */ \ + 0x88, 0x90, 0xa0, 0xc0, 0xa0, 0x90, 0x88, /* "K" */ \ + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xf8, /* "L" */ \ + 0x88, 0xd8, 0xa8, 0x88, 0x88, 0x88, 0x88, /* "M" */ \ + 0x88, 0x88, 0xc8, 0xa8, 0x98, 0x88, 0x88, /* "N" */ \ + 0x70, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, /* "O" */ \ + 0xf0, 0x88, 0x88, 0xf0, 0x80, 0x80, 0x80, /* "P" */ \ + 0x70, 0x88, 0x88, 0x88, 0xa8, 0x90, 0x68, /* "Q" */ \ + 0xf0, 0x88, 0x88, 0xf0, 0xa0, 0x90, 0x88, /* "R" */ \ + 0x78, 0x80, 0x80, 0x70, 0x08, 0x08, 0xf0, /* "S" */ \ + 0xf8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /* "T" */ \ + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, /* "U" */ \ + 0x88, 0x88, 0x88, 0x88, 0x88, 0x50, 0x20, /* "V" */ \ + 0x88, 0x88, 0x88, 0xa8, 0xa8, 0xd8, 0x88, /* "W" */ \ + 0x88, 0x88, 0x50, 0x20, 0x50, 0x88, 0x88, /* "X" */ \ + 0x88, 0x88, 0x50, 0x20, 0x20, 0x20, 0x20, /* "Y" */ \ + 0xf8, 0x08, 0x10, 0x20, 0x40, 0x80, 0xf8, /* "Z" */ \ + 0x38, 0x20, 0x20, 0x20, 0x20, 0x20, 0x38, /* "[" */ \ + 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00, /* "\" */ \ + 0xe0, 0x20, 0x20, 0x20, 0x20, 0x20, 0xe0, /* "]" */ \ + 0x20, 0x50, 0x88, 0x00, 0x00, 0x00, 0x00, /* "^" */ \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, /* "_" */ \ + 0x40, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, /* "`" */ \ + 0x00, 0x00, 0x70, 0x08, 0x78, 0x88, 0x78, /* "a" */ \ + 0x80, 0x80, 0xb0, 0xc8, 0x88, 0x88, 0xf0, /* "b" */ \ + 0x00, 0x00, 0x70, 0x80, 0x80, 0x88, 0x70, /* "c" */ \ + 0x08, 0x08, 0x68, 0x98, 0x88, 0x88, 0x78, /* "d" */ \ + 0x00, 0x00, 0x70, 0x88, 0xf8, 0x80, 0x70, /* "e" */ \ + 0x30, 0x48, 0x40, 0xe0, 0x40, 0x40, 0x40, /* "f" */ \ + 0x00, 0x00, 0x78, 0x88, 0x78, 0x08, 0x30, /* "g" */ \ + 0x80, 0x80, 0xb0, 0xc8, 0x88, 0x88, 0x88, /* "h" */ \ + 0x20, 0x00, 0x60, 0x20, 0x20, 0x20, 0x70, /* "i" */ \ + 0x10, 0x00, 0x30, 0x10, 0x10, 0x90, 0x60, /* "j" */ \ + 0x40, 0x40, 0x48, 0x50, 0x60, 0x50, 0x48, /* "k" */ \ + 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, /* "l" */ \ + 0x00, 0x00, 0xd0, 0xa8, 0xa8, 0x88, 0x88, /* "m" */ \ + 0x00, 0x00, 0xb0, 0xc8, 0x88, 0x88, 0x88, /* "n" */ \ + 0x00, 0x00, 0x70, 0x88, 0x88, 0x88, 0x70, /* "o" */ \ + 0x00, 0x00, 0xf0, 0x88, 0xf0, 0x80, 0x80, /* "p" */ \ + 0x00, 0x00, 0x68, 0x98, 0x78, 0x08, 0x08, /* "q" */ \ + 0x00, 0x00, 0xb0, 0xc8, 0x80, 0x80, 0x80, /* "r" */ \ + 0x00, 0x00, 0x70, 0x80, 0x70, 0x08, 0xf0, /* "s" */ \ + 0x40, 0x40, 0xe0, 0x40, 0x40, 0x48, 0x30, /* "t" */ \ + 0x00, 0x00, 0x88, 0x88, 0x88, 0x98, 0x68, /* "u" */ \ + 0x00, 0x00, 0x88, 0x88, 0x88, 0x50, 0x20, /* "v" */ \ + 0x00, 0x00, 0x88, 0x88, 0xa8, 0xa8, 0x50, /* "w" */ \ + 0x00, 0x00, 0x88, 0x50, 0x20, 0x50, 0x88, /* "x" */ \ + 0x00, 0x00, 0x88, 0x88, 0x78, 0x08, 0x70, /* "y" */ \ + 0x00, 0x00, 0xf8, 0x10, 0x20, 0x40, 0xf8, /* "z" */ \ + 0x10, 0x20, 0x20, 0x40, 0x20, 0x20, 0x10, /* "{" */ \ + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /* "|" */ \ + 0x40, 0x20, 0x20, 0x10, 0x20, 0x20, 0x40, /* "}" */ \ + }; +#endif + +/** @} */ + +#endif /* CONF_SYSFONT_H */ diff --git a/AVR Code/USB_BULK_TEST/src/config/conf_usart_spi.h b/AVR Code/USB_BULK_TEST/src/config/conf_usart_spi.h new file mode 100644 index 00000000..aa9a9718 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/config/conf_usart_spi.h @@ -0,0 +1,50 @@ +/** + * \file ********************************************************************* + * + * \brief Spi Master configuration for spi example + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ +#ifndef CONF_USART_SPI_H_INCLUDED +#define CONF_USART_SPI_H_INCLUDED + + +#endif /* CONF_USART_SPI_H_INCLUDED */ diff --git a/AVR Code/USB_BULK_TEST/src/config/conf_usb.h b/AVR Code/USB_BULK_TEST/src/config/conf_usb.h new file mode 100644 index 00000000..ceef6929 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/config/conf_usb.h @@ -0,0 +1,160 @@ +/** + * \file + * + * \brief USB configuration file + * + * Copyright (c) 2011-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _CONF_USB_H_ +#define _CONF_USB_H_ + +#include "compiler.h" + + +/** + * USB Device Configuration + * @{ + */ + +//! Device definition (mandatory) +#define USB_DEVICE_VENDOR_ID 0x03eb +#define USB_DEVICE_PRODUCT_ID 0xa000 +#define USB_DEVICE_MAJOR_VERSION 2 +#define USB_DEVICE_MINOR_VERSION 0 +#define USB_DEVICE_POWER 500 // Consumption on Vbus line (mA) +#define USB_DEVICE_ATTR \ + (USB_CONFIG_ATTR_BUS_POWERED) +// (USB_CONFIG_ATTR_SELF_POWERED) +// (USB_CONFIG_ATTR_REMOTE_WAKEUP|USB_CONFIG_ATTR_SELF_POWERED) +// (USB_CONFIG_ATTR_REMOTE_WAKEUP|USB_CONFIG_ATTR_BUS_POWERED) + +//! USB Device string definitions (Optional) +#define USB_DEVICE_MANUFACTURE_NAME "TapirTech" +#define USB_DEVICE_PRODUCT_NAME "USBGobindar Dummy Device" +// #define USB_DEVICE_SERIAL_NAME "123123123123" + +/** + * Device speeds support + * Low speed not supported by this vendor class + * @{ + */ +//! To authorize the High speed +#if (UC3A3||UC3A4) +# define USB_DEVICE_HS_SUPPORT +#elif (SAM3XA||SAM3U) +# define USB_DEVICE_HS_SUPPORT +#endif +//@} + + +/** + * USB Device Callbacks definitions (Optional) + * @{ + */ +#define UDC_VBUS_EVENT(b_vbus_high) +#define UDC_SOF_EVENT() main_sof_action() +#define UDC_SUSPEND_EVENT() main_suspend_action() +#define UDC_RESUME_EVENT() main_resume_action() +//! Mandatory when USB_DEVICE_ATTR authorizes remote wakeup feature +// #define UDC_REMOTEWAKEUP_ENABLE() user_callback_remotewakeup_enable() +// extern void user_callback_remotewakeup_enable(void); +// #define UDC_REMOTEWAKEUP_DISABLE() user_callback_remotewakeup_disable() +// extern void user_callback_remotewakeup_disable(void); +//! When a extra string descriptor must be supported +//! other than manufacturer, product and serial string +// #define UDC_GET_EXTRA_STRING() +//@} + +//@} + + +/** + * USB Interface Configuration + * @{ + */ + +/** + * Configuration of vendor interface + * @{ + */ +//! Interface callback definition +#define UDI_VENDOR_ENABLE_EXT() main_vendor_enable() +#define UDI_VENDOR_DISABLE_EXT() main_vendor_disable() +#define UDI_VENDOR_SETUP_OUT_RECEIVED() main_setup_out_received() +#define UDI_VENDOR_SETUP_IN_RECEIVED() main_setup_in_received() + +//! endpoints size for full speed +//! Note: Disable the endpoints of a type, if size equal 0 +#define UDI_VENDOR_EPS_SIZE_INT_FS 0 +#define UDI_VENDOR_EPS_SIZE_BULK_FS 64 +#if SAMG55 +#define UDI_VENDOR_EPS_SIZE_ISO_FS 0 +#else +#define UDI_VENDOR_EPS_SIZE_ISO_FS 1023 +#endif + +//! endpoints size for high speed +#define UDI_VENDOR_EPS_SIZE_INT_HS 64 +#define UDI_VENDOR_EPS_SIZE_BULK_HS 512 +#define UDI_VENDOR_EPS_SIZE_ISO_HS 64 + +//@} + +//@} + + +/** + * USB Device Driver Configuration + * @{ + */ +//! Limit the isochronous endpoint in singe bank mode for USBB driver +//! to avoid exceeding USB DPRAM. +#define UDD_ISOCHRONOUS_NB_BANK(ep) 1 +//@} + +//! The includes of classes and other headers must be done +//! at the end of this file to avoid compile error +#include "udi_vendor_conf.h" +#include "ui.h" +#include "main.h" + +#endif // _CONF_USB_H_ diff --git a/AVR Code/USB_BULK_TEST/src/globals.h b/AVR Code/USB_BULK_TEST/src/globals.h new file mode 100644 index 00000000..e3c5aafe --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/globals.h @@ -0,0 +1,49 @@ +/* + * globals.h + * + * Created: 18/04/2015 12:44:42 PM + * Author: Esposch + */ + + +#ifndef GLOBALS_H_ +#define GLOBALS_H_ + +#define VERO + +#define TC_SPISLAVE TCD0 +#define TC_PSU TCD1 +#define TC_PSU_OVF TCD1_OVF_vect +#define TC_DAC TCC0 +#define TCDAC_OVF EVSYS_CHMUX_TCC0_OVF_gc +#define TC_AUXDAC TCC1 +#define TCDAC_AUX_OVF EVSYS_CHMUX_TCC1_OVF_gc +#define HALFPACKET_SIZE 375 +#define PACKET_SIZE 750 +#define B2_START 1125 +#define BUFFER_SIZE PACKET_SIZE*2 +#define DACBUF_SIZE 512 + +COMPILER_WORD_ALIGNED +extern volatile unsigned char isoBuf[BUFFER_SIZE]; +COMPILER_WORD_ALIGNED +extern volatile unsigned char dacBuf_CH1[DACBUF_SIZE]; +extern volatile unsigned char dacBuf_CH2[DACBUF_SIZE]; + +extern volatile unsigned char b1_state; +extern volatile unsigned char b2_state; + +extern volatile bool main_b_vendor_enable; + +extern volatile uint16_t dacBuf_len; +extern volatile uint16_t auxDacBufLen; + +extern volatile unsigned char dummy; + +extern volatile unsigned char global_mode; + +extern volatile char PSU_target; + +extern volatile unsigned char test_byte; + +#endif /* GLOBALS_H_ */ \ No newline at end of file diff --git a/AVR Code/USB_BULK_TEST/src/main.c b/AVR Code/USB_BULK_TEST/src/main.c new file mode 100644 index 00000000..3e870e68 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/main.c @@ -0,0 +1,143 @@ +//Include the ASF Licence! + +#include +#include +#include "ui.h" +#include "globals.h" +#include "tiny_adc.h" +#include "tiny_dma.h" +#include "tiny_timer.h" +#include "tiny_dac.h" +#include "tiny_uart.h" +#include "tiny_dig.h" + +volatile bool main_b_vendor_enable = false; + +COMPILER_WORD_ALIGNED +volatile unsigned char isoBuf[BUFFER_SIZE]; +COMPILER_WORD_ALIGNED +volatile unsigned char dacBuf_CH1[DACBUF_SIZE];// = {128, 134, 140, 146, 153, 159, 165, 171, 177, 182, 188, 194, 199, 204, 209, 214, 218, 223, 227, 230, 234, 237, 240, 243, 246, 248, 250, 252, 253, 254, 255, 255, 255, 255, 254, 253, 252, 251, 249, 247, 245, 242, 239, 236, 232, 229, 225, 220, 216, 211, 206, 201, 196, 191, 185, 180, 174, 168, 162, 156, 149, 143, 137, 131, 124, 118, 112, 106, 99, 93, 87, 81, 75, 70, 64, 59, 54, 49, 44, 39, 35, 30, 26, 23, 19, 16, 13, 10, 8, 6, 4, 3, 2, 1, 0, 0, 0, 0, 1, 2, 3, 5, 7, 9, 12, 15, 18, 21, 25, 28, 32, 37, 41, 46, 51, 56, 61, 67, 73, 78, 84, 90, 96, 102, 109, 115, 121, 127}; +volatile unsigned char dacBuf_CH2[DACBUF_SIZE]; + +volatile unsigned char b1_state = 0; +volatile unsigned char b2_state = 0; + +volatile uint16_t dacBuf_len = 128; +volatile uint16_t auxDacBufLen = 128; +volatile unsigned char dummy = 0x55; +volatile unsigned char global_mode = 255; + +volatile char PSU_target = 0; + +volatile unsigned char test_byte = 123; + +int main(void){ + irq_initialize_vectors(); + cpu_irq_enable(); + sysclk_init(); + board_init(); + udc_start(); + tiny_dac_setup(); + tiny_dma_setup(); + tiny_adc_setup(0, 0); + tiny_adc_pid_setup(); + tiny_adc_ch1setup(12); + tiny_timer_setup(); + tiny_uart_setup(); + tiny_spi_setup(); + tiny_dig_setup(); + + //USARTC0.DATA = 0x55; + //asm("nop"); + + while (true) { + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + asm("nop"); + //test_byte = ADCA.CH1.RESH; + //DO NOTHING! + } +} + +//! Global variable to give and record information about setup request management +udd_ctrl_request_t udd_g_ctrlreq; + +//CALLBACKS: +void main_suspend_action(void) +{ + return; +} + +void main_resume_action(void) +{ + return; +} + +void main_sof_action(void) +{ + switch(global_mode){ + case 0: + tiny_dma_loop_mode_0(); + break; + case 1: + tiny_dma_loop_mode_1(); + break; + case 2: + tiny_dma_loop_mode_2(); + break; + case 3: + tiny_dma_loop_mode_3(); + break; + case 4: + tiny_dma_loop_mode_4(); + break; + case 6: + tiny_dma_loop_mode_6(); + break; + case 7: + tiny_dma_loop_mode_7(); + break; + default: + break; + } + b1_state = !b1_state; + return; +} + +bool main_vendor_enable(void) +{ + main_b_vendor_enable = true; + udi_vendor_iso_in_run((uint8_t *)&isoBuf[0], PACKET_SIZE, iso_callback); + return true; +} + +void main_vendor_disable(void) +{ + main_b_vendor_enable = false; +} + +bool main_setup_out_received(void) +{ + return 1; +} + +bool main_setup_in_received(void) +{ + return true; +} + +void iso_callback(udd_ep_status_t status, iram_size_t nb_transfered, udd_ep_id_t ep){ + udi_vendor_iso_in_run((uint8_t *)&isoBuf[!b1_state * PACKET_SIZE], PACKET_SIZE, iso_callback); + return; +} \ No newline at end of file diff --git a/AVR Code/USB_BULK_TEST/src/main.h b/AVR Code/USB_BULK_TEST/src/main.h new file mode 100644 index 00000000..7b7817ed --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/main.h @@ -0,0 +1,91 @@ +/** + * \file + * + * \brief Declaration of main function used by example + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _MAIN_H_ +#define _MAIN_H_ + +/*! \brief Notify via user interface that enumeration is ok + * This is called by vendor interface when USB Host enable it. + * + * \retval true if vendor startup is successfully done + */ +bool main_vendor_enable(void); + +/*! \brief Notify via user interface that enumeration is disabled + * This is called by vendor interface when USB Host disable it. + */ +void main_vendor_disable(void); + +/*! \brief Manages the leds behaviors + * Called when a start of frame is received on USB line each 1ms. + */ +void main_sof_action(void); + +/*! \brief Enters the application in low power mode + * Callback called when USB host sets USB line in suspend state + */ +void main_suspend_action(void); + +/*! \brief Turn on a led to notify active mode + * Called when the USB line is resumed from the suspend state + */ +void main_resume_action(void); + +/*! \brief Manage the reception of setup request OUT + * + * \retval true if request accepted + */ +bool main_setup_out_received(void); + +/*! \brief Manage the reception of setup request IN + * + * \retval true if request accepted + */ +bool main_setup_in_received(void); + +void iso_callback(udd_ep_status_t status, iram_size_t nb_transfered, udd_ep_id_t ep); + +#endif // _MAIN_H_ diff --git a/AVR Code/USB_BULK_TEST/src/tiny_adc.c b/AVR Code/USB_BULK_TEST/src/tiny_adc.c new file mode 100644 index 00000000..e5cb6b40 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/tiny_adc.c @@ -0,0 +1,81 @@ +/* + * tiny_adc.c + * + * Created: 19/06/2015 7:17:23 PM + * Author: Esposch + */ + +#include "tiny_adc.h" +#include "globals.h" +#include "string.h" +#include +#include +#include + +// These 2 files need to be included in order to read +// the production calibration values from EEPROM +#include +#include + +void tiny_adc_setup(unsigned char ch2_enable, unsigned char seven_fiddy_ksps){ + PR.PRPA &=0b11111101; + + ADCA.CTRLA = 0x00; //Turn off + ADCA.CTRLB = ADC_FREERUN_bm | (seven_fiddy_ksps == 2 ? ADC_RESOLUTION_LEFT12BIT_gc : ADC_RESOLUTION_8BIT_gc) | ADC_CONMODE_bm ; + ADCA.REFCTRL = ADC_REFSEL_INTVCC2_gc; + ADCA.EVCTRL = ch2_enable ? ADC_SWEEP_0123_gc : ADC_SWEEP_01_gc; //Non-zero causes issues with interrupts! ;.; + + ADCA.PRESCALER = seven_fiddy_ksps == 1 ? ADC_PRESCALER_DIV16_gc : ADC_PRESCALER_DIV32_gc; //ADC Clock = Sysclock/128 + ADCA.CALL = ReadCalibrationByte(offsetof(NVM_PROD_SIGNATURES_t, ADCACAL0)); //Load calibration bytes from production row. + ADCA.CALH = ReadCalibrationByte(offsetof(NVM_PROD_SIGNATURES_t, ADCACAL1)); //Load calibration bytes from production row. + ADCA.CMP = 0x0000; //No compare used + + ADCA.CTRLA = ADC_ENABLE_bm; + + tiny_adc_pid_setup(); + + return; +} + +void tiny_adc_ch0setup(unsigned char gain_mask){ + ADCA.CH0.CTRL = 0x00; //Reset + ADCA.CH0.CTRL = ADC_CH_START_bm | (gain_mask&0x1c) | ADC_CH_INPUTMODE_DIFFWGAIN_gc; + #ifdef VERO + ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN0_gc | ((gain_mask&0x80) ? ADC_CH_MUXNEG_PIN6_gc : ADC_CH_MUXNEG_PIN4_gc); + #else + ADCA.CH0.MUXCTRL = ((gain_mask&0x80) ? ADC_CH_MUXPOS_PIN2_gc : ADC_CH_MUXPOS_PIN0_gc) | ((gain_mask&0x80) ? ADC_CH_MUXNEG_PIN6_gc : ADC_CH_MUXNEG_PIN4_gc); + #endif + ADCA.CH0.INTCTRL = ADC_CH_INTLVL_OFF_gc; + ADCA.CH0.SCAN = 0x00; //Disable scanning +} + +void tiny_adc_ch1setup(unsigned char gain_mask){ + ADCA.CH2.CTRL = 0x00; //Reset + ADCA.CH2.CTRL = ADC_CH_START_bm | gain_mask | ADC_CH_INPUTMODE_DIFFWGAIN_gc; + ADCA.CH2.MUXCTRL = ADC_CH_MUXPOS_PIN2_gc | ADC_CH_MUXNEG_PIN4_gc; + ADCA.CH2.INTCTRL = ADC_CH_INTLVL_OFF_gc; + ADCA.CH2.SCAN = 0x00; //Disable scanning +} + +void tiny_adc_pid_setup(void){ + ADCA.CH1.CTRL = 0x00; //Reset + ADCA.CH1.CTRL = ADC_CH_START_bm | ADC_CH_GAIN_1X_gc | ADC_CH_INPUTMODE_DIFFWGAIN_gc; + ADCA.CH1.MUXCTRL = ADC_CH_MUXPOS_PIN5_gc | 0b00000111; + ADCA.CH1.INTCTRL = ADC_CH_INTLVL_OFF_gc; + ADCA.CH1.SCAN = 0x00; //Disable scanning +} + + +//FROM: http://www.avrfreaks.net/forum/xmega-production-signature-row +uint8_t ReadCalibrationByte(uint8_t index){ + uint8_t result; + + /* Load the NVM Command register to read the calibration row. */ + NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc; + result = pgm_read_byte(index); + + /* Clean up NVM Command register. */ + NVM_CMD = NVM_CMD_NO_OPERATION_gc; + + return( result ); +} \ No newline at end of file diff --git a/AVR Code/USB_BULK_TEST/src/tiny_adc.h b/AVR Code/USB_BULK_TEST/src/tiny_adc.h new file mode 100644 index 00000000..d2b00170 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/tiny_adc.h @@ -0,0 +1,23 @@ +/* + * tiny_adc.h + * + * Created: 19/06/2015 7:15:32 PM + * Author: Esposch + */ + + +#ifndef TINY_ADC_H_ +#define TINY_ADC_H_ + +#include +#include + +void tiny_adc_setup(unsigned char ch2_enable, unsigned char seven_fiddy_ksps); +void tiny_adc_ch0setup(unsigned char gain_mask); +void tiny_adc_ch1setup(unsigned char gain_mask); +uint8_t ReadCalibrationByte(uint8_t index); //FROM: http://www.avrfreaks.net/forum/xmega-production-signature-row +void tiny_adc_pid_setup(void); + + + +#endif /* TINY_ADC_H_ */ \ No newline at end of file diff --git a/AVR Code/USB_BULK_TEST/src/tiny_dac.c b/AVR Code/USB_BULK_TEST/src/tiny_dac.c new file mode 100644 index 00000000..195c6b22 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/tiny_dac.c @@ -0,0 +1,38 @@ +/* + * tiny_dac.c + * + * Created: 3/07/2015 1:06:44 PM + * Author: Esposch + */ + +#include "tiny_dac.h" +#include "tiny_adc.h" + +#include +#include + +void tiny_dac_setup(void){ + + //Turn on in PR + PR.PRPB &=0b11111011; + + DACB.CTRLA = DAC_CH1EN_bm | DAC_CH0EN_bm | DAC_ENABLE_bm; + DACB.CTRLB = DAC_CHSEL_DUAL_gc; + DACB.CTRLC = DAC_REFSEL_AVCC_gc | DAC_LEFTADJ_bm; + //EVCTRL unset + //DACB.CH0DATAH = 127;//contains (8-bit) sample, assuming left adjust! + + //TODO: Calibrate + DACB.CH0GAINCAL = ReadCalibrationByte(offsetof(NVM_PROD_SIGNATURES_t, DACB0GAINCAL)); //Load calibration bytes from production row. + DACB.CH0OFFSETCAL = ReadCalibrationByte(offsetof(NVM_PROD_SIGNATURES_t, DACB0OFFCAL)); //Load calibration bytes from production row. + + DACB.CH1GAINCAL = ReadCalibrationByte(offsetof(NVM_PROD_SIGNATURES_t, DACB1GAINCAL)); //Load calibration bytes from production row. + DACB.CH1OFFSETCAL = ReadCalibrationByte(offsetof(NVM_PROD_SIGNATURES_t, DACB1OFFCAL)); //Load calibration bytes from production row. + + //Set up for triple mode! + PORTB.DIR |= 0x03; + PORTB.OUT = 0x00; + + + +} \ No newline at end of file diff --git a/AVR Code/USB_BULK_TEST/src/tiny_dac.h b/AVR Code/USB_BULK_TEST/src/tiny_dac.h new file mode 100644 index 00000000..59894c9f --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/tiny_dac.h @@ -0,0 +1,18 @@ +/* + * tiny_dac.h + * + * Created: 3/07/2015 1:06:53 PM + * Author: Esposch + */ + +#include +#include + +#ifndef TINY_DAC_H_ +#define TINY_DAC_H_ + +void tiny_dac_setup(void); + + + +#endif /* TINY_DAC_H_ */ \ No newline at end of file diff --git a/AVR Code/USB_BULK_TEST/src/tiny_dig.c b/AVR Code/USB_BULK_TEST/src/tiny_dig.c new file mode 100644 index 00000000..8063205e --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/tiny_dig.c @@ -0,0 +1,16 @@ +/* + * tiny_dig_out.c + * + * Created: 14/10/2015 4:51:19 PM + * Author: Esposch + */ + +#include "tiny_dig.h" +#include "globals.h" + + +void tiny_dig_setup(void){ + PORTE.DIR = 0x0f; + PORTE.OUT = 0x05; + return; +} diff --git a/AVR Code/USB_BULK_TEST/src/tiny_dig.h b/AVR Code/USB_BULK_TEST/src/tiny_dig.h new file mode 100644 index 00000000..57af7a9f --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/tiny_dig.h @@ -0,0 +1,18 @@ +/* + * tiny_dig_out.h + * + * Created: 14/10/2015 4:51:29 PM + * Author: Esposch + */ + + +#ifndef TINY_DIG_OUT_H_ +#define TINY_DIG_OUT_H_ + +#include + +void tiny_dig_setup(void); + + + +#endif /* TINY_DIG_OUT_H_ */ \ No newline at end of file diff --git a/AVR Code/USB_BULK_TEST/src/tiny_dma.c b/AVR Code/USB_BULK_TEST/src/tiny_dma.c new file mode 100644 index 00000000..6e9e9cd7 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/tiny_dma.c @@ -0,0 +1,658 @@ +/* + * tiny_dma.c + * + * Created: 25/06/2015 9:00:42 AM + * Author: Esposch + */ + +#include "tiny_dma.h" +#include "tiny_adc.h" +#include "tiny_uart.h" +#include "globals.h" + + +void tiny_dma_setup(void){ + //Turn on DMA + PR.PRGEN &=0b111111110; //Turn on DMA clk + DMA.CTRL = DMA_ENABLE_bm | DMA_PRIMODE_RR0123_gc; +} +void tiny_dma_flush(void){ + DMA.CH0.CTRLA = 0x00; + DMA.CH0.CTRLA = DMA_CH_RESET_bm; + + DMA.CH1.CTRLA = 0x00; + DMA.CH1.CTRLA = DMA_CH_RESET_bm; + + DMA.CH2.CTRLA = 0x00; + DMA.CH2.CTRLA = DMA_CH_RESET_bm; + + DMA.CH3.CTRLA = 0x00; + DMA.CH3.CTRLA = DMA_CH_RESET_bm; + + b1_state = 0; + b2_state = 0; +} +void tiny_dma_set_mode_0(void){ + + global_mode = 0; + + tiny_dma_flush(); + + DMA.CH2.REPCNT = 0; //Repeat forever! + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + DMA.CH2.CTRLB = 0x00; //No interrupt for DacBuf!! + DMA.CH2.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH1_gc; //Triggered from TCC0 when it hits PER + DMA.CH2.TRFCNT = auxDacBufLen; + + DMA.CH2.SRCADDR0 = (( (uint16_t) &dacBuf_CH2[0]) >> 0) & 0xFF; //Source address is dacbuf + DMA.CH2.SRCADDR1 = (( (uint16_t) &dacBuf_CH2[0]) >> 8) & 0xFF; + DMA.CH2.SRCADDR2 = 0x00; + + DMA.CH2.DESTADDR0 = (( (uint16_t) &DACB.CH1DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + DMA.CH2.DESTADDR1 = (( (uint16_t) &DACB.CH1DATAH) >> 8) & 0xFF; + DMA.CH2.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + + DMA.CH3.REPCNT = 0; //Repeat forever! + DMA.CH3.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + DMA.CH3.CTRLB = 0x00; //Hi interrupt on block complete + DMA.CH3.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + DMA.CH3.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH2_gc; //Triggered from TCC0 when it hits PER + DMA.CH3.TRFCNT = dacBuf_len; + + DMA.CH3.SRCADDR0 = (( (uint16_t) &dacBuf_CH1[0]) >> 0) & 0xFF; //Source address is dacbuf + DMA.CH3.SRCADDR1 = (( (uint16_t) &dacBuf_CH1[0]) >> 8) & 0xFF; + DMA.CH3.SRCADDR2 = 0x00; + + DMA.CH3.DESTADDR0 = (( (uint16_t) &DACB.CH0DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + DMA.CH3.DESTADDR1 = (( (uint16_t) &DACB.CH0DATAH) >> 8) & 0xFF; + DMA.CH3.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH3.CTRLA |= DMA_CH_ENABLE_bm; //Enable! +} + +void tiny_dma_loop_mode_0(void){ + DMA.CH0.CTRLA = 0x00; + DMA.CH0.CTRLA = DMA_CH_RESET_bm; + + DMA.CH0.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + DMA.CH0.CTRLB = 0x00; //No interrupt! + DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH0_gc; //Triggered from ADCA channel 0 + DMA.CH0.TRFCNT = HALFPACKET_SIZE; + + DMA.CH0.SRCADDR0 = (( (uint16_t) &ADCA.CH0.RESL) >> 0) & 0xFF; //Source address is ADC + DMA.CH0.SRCADDR1 = (( (uint16_t) &ADCA.CH0.RESL) >> 8) & 0xFF; + DMA.CH0.SRCADDR2 = 0x00; + + DMA.CH0.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + DMA.CH0.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 8) & 0xFF; + DMA.CH0.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm; //Enable! +} + +void tiny_dma_set_mode_1(void){ + + global_mode = 1; + + tiny_dma_flush(); + + //AUX channel (to keep it tx, therefore always rx) + DMA.CH2.CTRLA = 0x00; + DMA.CH2.CTRLA = DMA_CH_RESET_bm; + + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + DMA.CH2.CTRLB = 0x00; //No int + DMA.CH2.ADDRCTRL = DMA_CH_SRCDIR_FIXED_gc | DMA_CH_DESTDIR_FIXED_gc; //Source and address fixed. + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_USARTC0_RXC_gc; + DMA.CH2.TRFCNT = 0; + DMA.CH2.REPCNT = 0; + + DMA.CH2.SRCADDR0 = (( (uint16_t) &dummy) >> 0) & 0xFF; + DMA.CH2.SRCADDR1 = (( (uint16_t) &dummy) >> 8) & 0xFF; + DMA.CH2.SRCADDR2 = 0x00; + + DMA.CH2.DESTADDR0 = (( (uint16_t) &USARTC0.DATA) >> 0) & 0xFF; + DMA.CH2.DESTADDR1 = (( (uint16_t) &USARTC0.DATA) >> 8) & 0xFF; + DMA.CH2.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_REPEAT_bm | DMA_CH_ENABLE_bm; //Enable! + + USARTC0.DATA = 0x55; + + + DMA.CH3.REPCNT = 0; //Repeat forever! + DMA.CH3.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + DMA.CH3.CTRLB = 0x00; //No interrupt for DacBuf!! + DMA.CH3.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + DMA.CH3.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH1_gc; //Triggered from TCC0 when it hits PER + DMA.CH3.TRFCNT = auxDacBufLen; + + DMA.CH3.SRCADDR0 = (( (uint16_t) &dacBuf_CH2[0]) >> 0) & 0xFF; //Source address is dacbuf + DMA.CH3.SRCADDR1 = (( (uint16_t) &dacBuf_CH2[0]) >> 8) & 0xFF; + DMA.CH3.SRCADDR2 = 0x00; + + DMA.CH3.DESTADDR0 = (( (uint16_t) &DACB.CH1DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + DMA.CH3.DESTADDR1 = (( (uint16_t) &DACB.CH1DATAH) >> 8) & 0xFF; + DMA.CH3.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH3.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + +} + +void tiny_dma_loop_mode_1(void){ + DMA.CH0.CTRLA = 0x00; + DMA.CH0.CTRLA = DMA_CH_RESET_bm; + + DMA.CH0.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + DMA.CH0.CTRLB = 0x00; //No interrupt! + DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH0_gc; //Triggered from ADCA channel 0 + DMA.CH0.TRFCNT = HALFPACKET_SIZE; + + DMA.CH0.SRCADDR0 = (( (uint16_t) &ADCA.CH0.RESL) >> 0) & 0xFF; //Source address is ADC + DMA.CH0.SRCADDR1 = (( (uint16_t) &ADCA.CH0.RESL) >> 8) & 0xFF; + DMA.CH0.SRCADDR2 = 0x00; + + DMA.CH0.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + DMA.CH0.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 8) & 0xFF; + DMA.CH0.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + + DMA.CH1.CTRLA = 0x00; + DMA.CH1.CTRLA = DMA_CH_RESET_bm; + + DMA.CH1.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + DMA.CH1.CTRLB = 0x00; //No interrupt + DMA.CH1.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + DMA.CH1.TRIGSRC = DMA_CH_TRIGSRC_USARTC0_RXC_gc; + DMA.CH1.TRFCNT = HALFPACKET_SIZE; + + DMA.CH1.SRCADDR0 = (( (uint16_t) &USARTC0.DATA) >> 0) & 0xFF; //Source address is ADC + DMA.CH1.SRCADDR1 = (( (uint16_t) &USARTC0.DATA) >> 8) & 0xFF; + DMA.CH1.SRCADDR2 = 0x00; + + DMA.CH1.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE + HALFPACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + DMA.CH1.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE + HALFPACKET_SIZE]) >> 8) & 0xFF; + DMA.CH1.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH1.CTRLA |= DMA_CH_ENABLE_bm; //Enable! +} + +void tiny_dma_set_mode_2(void){ + + global_mode = 2; + + tiny_dma_flush(); + + DMA.CH2.REPCNT = 0; //Repeat forever! + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + DMA.CH2.CTRLB = 0x00; //Hi interrupt on block complete + DMA.CH2.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH2_gc; //Triggered from TCC0 when it hits PER + DMA.CH2.TRFCNT = dacBuf_len; + + DMA.CH2.SRCADDR0 = (( (uint16_t) &dacBuf_CH1[0]) >> 0) & 0xFF; //Source address is dacbuf + DMA.CH2.SRCADDR1 = (( (uint16_t) &dacBuf_CH1[0]) >> 8) & 0xFF; + DMA.CH2.SRCADDR2 = 0x00; + + DMA.CH2.DESTADDR0 = (( (uint16_t) &DACB.CH0DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + DMA.CH2.DESTADDR1 = (( (uint16_t) &DACB.CH0DATAH) >> 8) & 0xFF; + DMA.CH2.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + + + DMA.CH3.REPCNT = 0; //Repeat forever! + DMA.CH3.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + DMA.CH3.CTRLB = 0x00; //No interrupt for DacBuf!! + DMA.CH3.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + DMA.CH3.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH1_gc; //Triggered from TCC0 when it hits PER + DMA.CH3.TRFCNT = auxDacBufLen; + + DMA.CH3.SRCADDR0 = (( (uint16_t) &dacBuf_CH2[0]) >> 0) & 0xFF; //Source address is dacbuf + DMA.CH3.SRCADDR1 = (( (uint16_t) &dacBuf_CH2[0]) >> 8) & 0xFF; + DMA.CH3.SRCADDR2 = 0x00; + + DMA.CH3.DESTADDR0 = (( (uint16_t) &DACB.CH1DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + DMA.CH3.DESTADDR1 = (( (uint16_t) &DACB.CH1DATAH) >> 8) & 0xFF; + DMA.CH3.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH3.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + +} + +void tiny_dma_loop_mode_2(void){ + DMA.CH0.CTRLA = 0x00; + DMA.CH0.CTRLA = DMA_CH_RESET_bm; + + DMA.CH0.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + DMA.CH0.CTRLB = 0x00; //No interrupt! + DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH0_gc; //Triggered from ADCA channel 0 + DMA.CH0.TRFCNT = HALFPACKET_SIZE; + + DMA.CH0.SRCADDR0 = (( (uint16_t) &ADCA.CH0.RESL) >> 0) & 0xFF; //Source address is ADC + DMA.CH0.SRCADDR1 = (( (uint16_t) &ADCA.CH0.RESL) >> 8) & 0xFF; + DMA.CH0.SRCADDR2 = 0x00; + + DMA.CH0.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + DMA.CH0.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 8) & 0xFF; + DMA.CH0.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + + DMA.CH1.CTRLA = 0x00; + DMA.CH1.CTRLA = DMA_CH_RESET_bm; + + DMA.CH1.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + DMA.CH1.CTRLB = 0x00; //No interrupt! + DMA.CH1.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + DMA.CH1.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH2_gc; //Triggered from ADCA channel 0 + DMA.CH1.TRFCNT = HALFPACKET_SIZE; + + DMA.CH1.SRCADDR0 = (( (uint16_t) &ADCA.CH2.RESL) >> 0) & 0xFF; //Source address is ADC + DMA.CH1.SRCADDR1 = (( (uint16_t) &ADCA.CH2.RESL) >> 8) & 0xFF; + DMA.CH1.SRCADDR2 = 0x00; + + DMA.CH1.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE + HALFPACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + DMA.CH1.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE + HALFPACKET_SIZE]) >> 8) & 0xFF; + DMA.CH1.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH1.CTRLA |= DMA_CH_ENABLE_bm; //Enable! +} + + + +void tiny_dma_set_mode_3(void){ + + global_mode = 3; + + tiny_dma_flush(); + + //AUX channel (to keep it tx, therefore always rx) + DMA.CH1.CTRLA = 0x00; + DMA.CH1.CTRLA = DMA_CH_RESET_bm; + + DMA.CH1.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + DMA.CH1.CTRLB = 0x00; //No int + DMA.CH1.ADDRCTRL = DMA_CH_SRCDIR_FIXED_gc | DMA_CH_DESTDIR_FIXED_gc; //Source and address fixed. + DMA.CH1.TRIGSRC = DMA_CH_TRIGSRC_USARTC0_RXC_gc; + DMA.CH1.TRFCNT = 0; + DMA.CH1.REPCNT = 0; + + DMA.CH1.SRCADDR0 = (( (uint16_t) &dummy) >> 0) & 0xFF; + DMA.CH1.SRCADDR1 = (( (uint16_t) &dummy) >> 8) & 0xFF; + DMA.CH1.SRCADDR2 = 0x00; + + DMA.CH1.DESTADDR0 = (( (uint16_t) &USARTC0.DATA) >> 0) & 0xFF; + DMA.CH1.DESTADDR1 = (( (uint16_t) &USARTC0.DATA) >> 8) & 0xFF; + DMA.CH1.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH1.CTRLA |= DMA_CH_REPEAT_bm | DMA_CH_ENABLE_bm; //Enable! + + USARTC0.DATA = 0x55; + + DMA.CH2.REPCNT = 0; //Repeat forever! + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + DMA.CH2.CTRLB = 0x00; //No interrupt for DacBuf!! + DMA.CH2.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH1_gc; //Triggered from TCC0 when it hits PER + DMA.CH2.TRFCNT = auxDacBufLen; + + DMA.CH2.SRCADDR0 = (( (uint16_t) &dacBuf_CH2[0]) >> 0) & 0xFF; //Source address is dacbuf + DMA.CH2.SRCADDR1 = (( (uint16_t) &dacBuf_CH2[0]) >> 8) & 0xFF; + DMA.CH2.SRCADDR2 = 0x00; + + DMA.CH2.DESTADDR0 = (( (uint16_t) &DACB.CH1DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + DMA.CH2.DESTADDR1 = (( (uint16_t) &DACB.CH1DATAH) >> 8) & 0xFF; + DMA.CH2.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + + DMA.CH3.REPCNT = 0; //Repeat forever! + DMA.CH3.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + DMA.CH3.CTRLB = 0x00; //Hi interrupt on block complete + DMA.CH3.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + DMA.CH3.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH2_gc; //Triggered from TCC0 when it hits PER + DMA.CH3.TRFCNT = dacBuf_len; + + DMA.CH3.SRCADDR0 = (( (uint16_t) &dacBuf_CH1[0]) >> 0) & 0xFF; //Source address is dacbuf + DMA.CH3.SRCADDR1 = (( (uint16_t) &dacBuf_CH1[0]) >> 8) & 0xFF; + DMA.CH3.SRCADDR2 = 0x00; + + DMA.CH3.DESTADDR0 = (( (uint16_t) &DACB.CH0DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + DMA.CH3.DESTADDR1 = (( (uint16_t) &DACB.CH0DATAH) >> 8) & 0xFF; + DMA.CH3.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH3.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + +} + +void tiny_dma_loop_mode_3(void){ + //Actual data being transferred + DMA.CH0.CTRLA = 0x00; + DMA.CH0.CTRLA = DMA_CH_RESET_bm; + + DMA.CH0.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + DMA.CH0.CTRLB = 0x00; //No interrupt + DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_USARTC0_RXC_gc; + DMA.CH0.TRFCNT = HALFPACKET_SIZE; + + DMA.CH0.SRCADDR0 = (( (uint16_t) &USARTC0.DATA) >> 0) & 0xFF; //Source address is ADC + DMA.CH0.SRCADDR1 = (( (uint16_t) &USARTC0.DATA) >> 8) & 0xFF; + DMA.CH0.SRCADDR2 = 0x00; + + DMA.CH0.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state*PACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + DMA.CH0.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state*PACKET_SIZE]) >> 8) & 0xFF; + DMA.CH0.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm; //Enable! +} + +void tiny_dma_set_mode_4(void){ + + global_mode = 4; + + tiny_dma_flush(); + + //AUX channel (to keep it tx, therefore always rx) + DMA.CH1.CTRLA = 0x00; + DMA.CH1.CTRLA = DMA_CH_RESET_bm; + + DMA.CH1.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + DMA.CH1.CTRLB = 0x00; //No int + DMA.CH1.ADDRCTRL = DMA_CH_SRCDIR_FIXED_gc | DMA_CH_DESTDIR_FIXED_gc; //Source and address fixed. + DMA.CH1.TRIGSRC = DMA_CH_TRIGSRC_USARTC0_RXC_gc; + DMA.CH1.TRFCNT = 0; + DMA.CH1.REPCNT = 0; + + DMA.CH1.SRCADDR0 = (( (uint16_t) &dummy) >> 0) & 0xFF; + DMA.CH1.SRCADDR1 = (( (uint16_t) &dummy) >> 8) & 0xFF; + DMA.CH1.SRCADDR2 = 0x00; + + DMA.CH1.DESTADDR0 = (( (uint16_t) &USARTC0.DATA) >> 0) & 0xFF; + DMA.CH1.DESTADDR1 = (( (uint16_t) &USARTC0.DATA) >> 8) & 0xFF; + DMA.CH1.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH1.CTRLA |= DMA_CH_REPEAT_bm | DMA_CH_ENABLE_bm; //Enable! + + USARTC0.DATA = 0x55; + + DMA.CH2.REPCNT = 0; //Repeat forever! + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + DMA.CH2.CTRLB = 0x00; //Hi interrupt on block complete + DMA.CH2.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH2_gc; //Triggered from TCC0 when it hits PER + DMA.CH2.TRFCNT = dacBuf_len; + + DMA.CH2.SRCADDR0 = (( (uint16_t) &dacBuf_CH1[0]) >> 0) & 0xFF; //Source address is dacbuf + DMA.CH2.SRCADDR1 = (( (uint16_t) &dacBuf_CH1[0]) >> 8) & 0xFF; + DMA.CH2.SRCADDR2 = 0x00; + + DMA.CH2.DESTADDR0 = (( (uint16_t) &DACB.CH0DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + DMA.CH2.DESTADDR1 = (( (uint16_t) &DACB.CH0DATAH) >> 8) & 0xFF; + DMA.CH2.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + + + DMA.CH3.REPCNT = 0; //Repeat forever! + DMA.CH3.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + DMA.CH3.CTRLB = 0x00; //No interrupt for DacBuf!! + DMA.CH3.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + DMA.CH3.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH1_gc; //Triggered from TCC0 when it hits PER + DMA.CH3.TRFCNT = auxDacBufLen; + + DMA.CH3.SRCADDR0 = (( (uint16_t) &dacBuf_CH2[0]) >> 0) & 0xFF; //Source address is dacbuf + DMA.CH3.SRCADDR1 = (( (uint16_t) &dacBuf_CH2[0]) >> 8) & 0xFF; + DMA.CH3.SRCADDR2 = 0x00; + + DMA.CH3.DESTADDR0 = (( (uint16_t) &DACB.CH1DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + DMA.CH3.DESTADDR1 = (( (uint16_t) &DACB.CH1DATAH) >> 8) & 0xFF; + DMA.CH3.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH3.CTRLA |= DMA_CH_ENABLE_bm; //Enable! +} + +void tiny_dma_loop_mode_4(void){ + //Actual data being transferred + DMA.CH0.CTRLA = 0x00; + DMA.CH0.CTRLA = DMA_CH_RESET_bm; + + DMA.CH0.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + DMA.CH0.CTRLB = 0x00; //No interrupt + DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_USARTC0_RXC_gc; + DMA.CH0.TRFCNT = HALFPACKET_SIZE; + + DMA.CH0.SRCADDR0 = (( (uint16_t) &USARTC0.DATA) >> 0) & 0xFF; //Source address is ADC + DMA.CH0.SRCADDR1 = (( (uint16_t) &USARTC0.DATA) >> 8) & 0xFF; + DMA.CH0.SRCADDR2 = 0x00; + + DMA.CH0.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state*PACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + DMA.CH0.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state*PACKET_SIZE]) >> 8) & 0xFF; + DMA.CH0.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + + DMA.CH2.CTRLA = 0x00; + DMA.CH2.CTRLA = DMA_CH_RESET_bm; + + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + DMA.CH2.CTRLB = 0x00; //Hi interrupt on block complete + DMA.CH2.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_SPIC_gc; + DMA.CH2.TRFCNT = HALFPACKET_SIZE; + + DMA.CH2.SRCADDR0 = (( (uint16_t) &SPIC.DATA) >> 0) & 0xFF; //Source address is ADC + DMA.CH2.SRCADDR1 = (( (uint16_t) &SPIC.DATA) >> 8) & 0xFF; + DMA.CH2.SRCADDR2 = 0x00; + + DMA.CH2.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE + HALFPACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + DMA.CH2.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE + HALFPACKET_SIZE]) >> 8) & 0xFF; + DMA.CH2.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_ENABLE_bm; //Enable! +} + + +void tiny_dma_set_mode_5(void){ + global_mode = 5; + + tiny_dma_flush(); + + DMA.CH2.REPCNT = 0; //Repeat forever! + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + DMA.CH2.CTRLB = 0x00; //Hi interrupt on block complete + DMA.CH2.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH2_gc; //Triggered from TCC0 when it hits PER + DMA.CH2.TRFCNT = dacBuf_len; + + DMA.CH2.SRCADDR0 = (( (uint16_t) &dacBuf_CH1[0]) >> 0) & 0xFF; //Source address is dacbuf + DMA.CH2.SRCADDR1 = (( (uint16_t) &dacBuf_CH1[0]) >> 8) & 0xFF; + DMA.CH2.SRCADDR2 = 0x00; + + DMA.CH2.DESTADDR0 = (( (uint16_t) &DACB.CH0DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + DMA.CH2.DESTADDR1 = (( (uint16_t) &DACB.CH0DATAH) >> 8) & 0xFF; + DMA.CH2.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + + DMA.CH3.REPCNT = 0; //Repeat forever! + DMA.CH3.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + DMA.CH3.CTRLB = 0x00; //No interrupt for DacBuf!! + DMA.CH3.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + DMA.CH3.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH2_gc; //Triggered from TCC0 when it hits PER + DMA.CH3.TRFCNT = dacBuf_len; + + DMA.CH3.SRCADDR0 = (( (uint16_t) &isoBuf[0]) >> 0) & 0xFF; //Source address is dacbuf + DMA.CH3.SRCADDR1 = (( (uint16_t) &isoBuf[0]) >> 8) & 0xFF; + DMA.CH3.SRCADDR2 = 0x00; + + DMA.CH3.DESTADDR0 = (( (uint16_t) &DACB.CH0DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + DMA.CH3.DESTADDR1 = (( (uint16_t) &DACB.CH0DATAH) >> 8) & 0xFF; + DMA.CH3.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH3.CTRLA |= DMA_CH_ENABLE_bm; //Enable! +} + +void tiny_dma_set_mode_6(void){ + + global_mode = 6; + + tiny_dma_flush(); + + DMA.CH2.REPCNT = 0; //Repeat forever! + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + DMA.CH2.CTRLB = 0x00; //Hi interrupt on block complete + DMA.CH2.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH2_gc; //Triggered from TCC0 when it hits PER + DMA.CH2.TRFCNT = dacBuf_len; + + DMA.CH2.SRCADDR0 = (( (uint16_t) &dacBuf_CH1[0]) >> 0) & 0xFF; //Source address is dacbuf + DMA.CH2.SRCADDR1 = (( (uint16_t) &dacBuf_CH1[0]) >> 8) & 0xFF; + DMA.CH2.SRCADDR2 = 0x00; + + DMA.CH2.DESTADDR0 = (( (uint16_t) &DACB.CH0DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + DMA.CH2.DESTADDR1 = (( (uint16_t) &DACB.CH0DATAH) >> 8) & 0xFF; + DMA.CH2.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + + DMA.CH3.REPCNT = 0; //Repeat forever! + DMA.CH3.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + DMA.CH3.CTRLB = 0x00; //No interrupt for DacBuf!! + DMA.CH3.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + DMA.CH3.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH1_gc; //Triggered from TCC0 when it hits PER + DMA.CH3.TRFCNT = auxDacBufLen; + + DMA.CH3.SRCADDR0 = (( (uint16_t) &dacBuf_CH2[0]) >> 0) & 0xFF; //Source address is dacbuf + DMA.CH3.SRCADDR1 = (( (uint16_t) &dacBuf_CH2[0]) >> 8) & 0xFF; + DMA.CH3.SRCADDR2 = 0x00; + + DMA.CH3.DESTADDR0 = (( (uint16_t) &DACB.CH1DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + DMA.CH3.DESTADDR1 = (( (uint16_t) &DACB.CH1DATAH) >> 8) & 0xFF; + DMA.CH3.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH3.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + +} + +void tiny_dma_loop_mode_6(void){ + DMA.CH0.CTRLA = 0x00; + DMA.CH0.CTRLA = DMA_CH_RESET_bm; + + DMA.CH0.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + DMA.CH0.CTRLB = 0x00; //No interrupt! + DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH0_gc; //Triggered from ADCA channel 0 + DMA.CH0.TRFCNT = PACKET_SIZE; + + DMA.CH0.SRCADDR0 = (( (uint16_t) &ADCA.CH0.RESL) >> 0) & 0xFF; //Source address is ADC + DMA.CH0.SRCADDR1 = (( (uint16_t) &ADCA.CH0.RESL) >> 8) & 0xFF; + DMA.CH0.SRCADDR2 = 0x00; + + DMA.CH0.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + DMA.CH0.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 8) & 0xFF; + DMA.CH0.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm; //Enable! +} + +void tiny_dma_set_mode_7(void){ + + global_mode = 7; + + tiny_dma_flush(); + + DMA.CH2.REPCNT = 0; //Repeat forever! + DMA.CH2.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + DMA.CH2.CTRLB = 0x00; //Hi interrupt on block complete + DMA.CH2.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + DMA.CH2.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH2_gc; //Triggered from TCC0 when it hits PER + DMA.CH2.TRFCNT = dacBuf_len; + + DMA.CH2.SRCADDR0 = (( (uint16_t) &dacBuf_CH1[0]) >> 0) & 0xFF; //Source address is dacbuf + DMA.CH2.SRCADDR1 = (( (uint16_t) &dacBuf_CH1[0]) >> 8) & 0xFF; + DMA.CH2.SRCADDR2 = 0x00; + + DMA.CH2.DESTADDR0 = (( (uint16_t) &DACB.CH0DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + DMA.CH2.DESTADDR1 = (( (uint16_t) &DACB.CH0DATAH) >> 8) & 0xFF; + DMA.CH2.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH2.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + + DMA.CH3.REPCNT = 0; //Repeat forever! + DMA.CH3.CTRLA = DMA_CH_BURSTLEN_1BYTE_gc | DMA_CH_SINGLE_bm | DMA_CH_REPEAT_bm; + DMA.CH3.CTRLB = 0x00; //No interrupt for DacBuf!! + DMA.CH3.ADDRCTRL = DMA_CH_DESTRELOAD_BURST_gc | DMA_CH_DESTDIR_INC_gc | DMA_CH_SRCRELOAD_BLOCK_gc | DMA_CH_SRCDIR_INC_gc; //Dest reloads after each burst, with byte incrementing. Src reloads at end of block, also incrementing address. + DMA.CH3.TRIGSRC = DMA_CH_TRIGSRC_EVSYS_CH1_gc; //Triggered from TCC0 when it hits PER + DMA.CH3.TRFCNT = auxDacBufLen; + + DMA.CH3.SRCADDR0 = (( (uint16_t) &dacBuf_CH2[0]) >> 0) & 0xFF; //Source address is dacbuf + DMA.CH3.SRCADDR1 = (( (uint16_t) &dacBuf_CH2[0]) >> 8) & 0xFF; + DMA.CH3.SRCADDR2 = 0x00; + + DMA.CH3.DESTADDR0 = (( (uint16_t) &DACB.CH1DATAH) >> 0) & 0xFF; //Dest address is high byte of DAC register + DMA.CH3.DESTADDR1 = (( (uint16_t) &DACB.CH1DATAH) >> 8) & 0xFF; + DMA.CH3.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH3.CTRLA |= DMA_CH_ENABLE_bm; //Enable! +} + +void tiny_dma_loop_mode_7(void){ + + DMA.CH0.CTRLA = 0x00; + DMA.CH0.CTRLA = DMA_CH_RESET_bm; + + DMA.CH0.CTRLA = DMA_CH_BURSTLEN_2BYTE_gc | DMA_CH_SINGLE_bm; //Do not repeat! + DMA.CH0.CTRLB = 0x00; //No interrupt! + DMA.CH0.ADDRCTRL = DMA_CH_SRCRELOAD_BURST_gc | DMA_CH_SRCDIR_INC_gc | DMA_CH_DESTDIR_INC_gc; //Source reloads after each burst, with byte incrementing. Dest does not reload, but does increment address. + DMA.CH0.TRIGSRC = DMA_CH_TRIGSRC_ADCA_CH0_gc; //Triggered from ADCA channel 0 + DMA.CH0.TRFCNT = PACKET_SIZE; + + DMA.CH0.SRCADDR0 = (( (uint16_t) &ADCA.CH0.RESL) >> 0) & 0xFF; //Source address is ADC + DMA.CH0.SRCADDR1 = (( (uint16_t) &ADCA.CH0.RESL) >> 8) & 0xFF; + DMA.CH0.SRCADDR2 = 0x00; + + DMA.CH0.DESTADDR0 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 0) & 0xFF; //Dest address is isoBuf + DMA.CH0.DESTADDR1 = (( (uint16_t) &isoBuf[b1_state * PACKET_SIZE]) >> 8) & 0xFF; + DMA.CH0.DESTADDR2 = 0x00; + + //Must enable last for REPCNT won't work! + DMA.CH0.CTRLA |= DMA_CH_ENABLE_bm; //Enable! + +} \ No newline at end of file diff --git a/AVR Code/USB_BULK_TEST/src/tiny_dma.h b/AVR Code/USB_BULK_TEST/src/tiny_dma.h new file mode 100644 index 00000000..0531294e --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/tiny_dma.h @@ -0,0 +1,46 @@ +/* + * tiny_dma.h + * + * Created: 25/06/2015 9:01:15 AM + * Author: Esposch + */ + + +#ifndef TINY_DMA_H_ +#define TINY_DMA_H_ + +#include +#include +#include "globals.h" + +void tiny_dma_setup(void); +void tiny_dma_flush(void); + +void tiny_dma_set_mode_0(void); +void tiny_dma_loop_mode_0(void); + +void tiny_dma_set_mode_1(void); +void tiny_dma_loop_mode_1(void); + +void tiny_dma_set_mode_2(void); +void tiny_dma_loop_mode_2(void); + +void tiny_dma_set_mode_3(void); +void tiny_dma_loop_mode_3(void); + +void tiny_dma_set_mode_4(void); +void tiny_dma_loop_mode_4(void); + +void tiny_dma_set_mode_5(void); + +void tiny_dma_set_mode_6(void); +void tiny_dma_loop_mode_6(void); + +void tiny_dma_set_mode_7(void); +void tiny_dma_loop_mode_7(void); + +ISR(DMA_CH3_vect); + + + +#endif /* TINY_DMA_H_ */ \ No newline at end of file diff --git a/AVR Code/USB_BULK_TEST/src/tiny_timer.c b/AVR Code/USB_BULK_TEST/src/tiny_timer.c new file mode 100644 index 00000000..c2a5cddc --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/tiny_timer.c @@ -0,0 +1,79 @@ +/* + * tiny_timercounter.c + * + * Created: 2/07/2015 10:50:11 AM + * Author: Esposch + */ + +#include "tiny_timer.h" +#include "globals.h" + +#define PSU_PER 3000 +#define jump 6 + +void tiny_timer_setup(void){ + //Turn everything on! + PR.PRPC &= 0b11111100; //Enable TCC0, TCC1 + PR.PRPD &= 0b11111100; //Enable TCD0, TCD1 + PR.PRGEN &= 0b11111101; //Enable EVSYS + + //Set up EVSYS + EVSYS.CH2MUX = TCDAC_OVF; + EVSYS.CH2CTRL = 0x00; //No filtering or Quadrature stuff + + EVSYS.CH1MUX = TCDAC_AUX_OVF; + EVSYS.CH1CTRL = 0x00; //No filtering or Quadrature stuff + + //Waveform (50Hz sin wave) + TC_DAC.CTRLA = 0x04; //Some clk setting - not 100% sure since it was SW generated + TC_DAC.CTRLB = TC_WGMODE_SINGLESLOPE_gc; //No enable is set + TC_DAC.CTRLE = TC_BYTEM_NORMAL_gc; + TC_DAC.PER = 469; + TC_DAC.INTCTRLA = 0x00; + //Aux channel (blank 50Hz) + TC_AUXDAC.CTRLA = 0x04; //Some clk setting - not 100% sure since it was SW generated + TC_AUXDAC.CTRLB = TC_WGMODE_SINGLESLOPE_gc; //No enable is set + TC_AUXDAC.CTRLE = TC_BYTEM_NORMAL_gc; + TC_AUXDAC.PER = 469; + TC_AUXDAC.INTCTRLA = 0x00; + + //PSU + PORTD.DIR |= 0b00010000; + TC_PSU.CTRLB = 0x10 | TC_WGMODE_SINGLESLOPE_gc; //CCAEN is set + TC_PSU.CTRLE = TC_BYTEM_NORMAL_gc; + TC_PSU.INTCTRLA = TC_OVFINTLVL_LO_gc; + TC_PSU.PER = PSU_PER; // Max value of CNT + TC_PSU.CCA = 0; //Initial Duty cycle of 0% + TC_PSU.CTRLA = TC_CLKSEL_DIV1_gc; + /* + //PSU "PID"loop + TCC1.CTRLB = 0x00 | TC_WGMODE_SINGLESLOPE_gc; + TCC1.INTCTRLA = TC_OVFINTLVL_LO_gc; + TCC1.CTRLE = TC_BYTEM_NORMAL_gc; + TCC1.PER = 1800; // Max value of CNT + TCC1.CTRLA = TC_CLKSEL_DIV1_gc; + */ +} + +ISR(TC_PSU_OVF){ + char tempvar; + char err; + volatile char nothing; + if (global_mode == 7){ + nothing = ADCA.CH1.RESL; + tempvar = ADCA.CH1.RESH; + } + else{ + tempvar = ADCA.CH1.RESL; + } + //tempvar = (global_mode == 7 ? (char) ADCA.CH1.RESH : (char) ADCA.CH1.RESL); + //test_byte = tempvar; + + err = (char) (PSU_target - tempvar); + if ((err > 1) & ((unsigned short) TC_PSU.CCA < PSU_PER - jump) ){ + TC_PSU.CCABUF = TC_PSU.CCA + ((err > 8) ? jump : 1); + } + else if ((err < -1) & ((unsigned short) TC_PSU.CCA > jump)){ + TC_PSU.CCABUF = TC_PSU.CCA - ((err < -8) ? jump : 1); + } +} \ No newline at end of file diff --git a/AVR Code/USB_BULK_TEST/src/tiny_timer.h b/AVR Code/USB_BULK_TEST/src/tiny_timer.h new file mode 100644 index 00000000..ed5a0ab5 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/tiny_timer.h @@ -0,0 +1,19 @@ +/* + * tiny_timercounter.h + * + * Created: 2/07/2015 10:49:59 AM + * Author: Esposch + */ + +#include +#include + +#ifndef TINY_TIMER_H_ +#define TINY_TIMER_H_ + +void tiny_timer_setup(void); +void tiny_spi_setup(void); + + + +#endif /* TINY_TIMERCOUNTER_H_ */ \ No newline at end of file diff --git a/AVR Code/USB_BULK_TEST/src/tiny_uart.c b/AVR Code/USB_BULK_TEST/src/tiny_uart.c new file mode 100644 index 00000000..be99076e --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/tiny_uart.c @@ -0,0 +1,44 @@ +/* + * tiny_uart.c + * + * Created: 16/07/2015 6:32:52 PM + * Author: Esposch + */ + +#include "tiny_uart.h" +#include "globals.h" + + +void tiny_uart_setup(void){ + PR.PRPC &= 0b11101111; + //PR.PRPE &= 0b11111110; ??? + + PORTC.DIR |= 0b10101010; + PORTC.OUT = 0xff; + PORTC.PIN2CTRL = PORT_INVEN_bm | PORT_OPC_PULLUP_gc; + //PORTC.REMAP = 0x10; //Remap USART to [7:4] + #ifndef VERO + PORTC.REMAP = 0x20; //Swap MOSI and SCK - for small boards only!!! + #endif + + USARTC0.CTRLC = USART_CMODE_MSPI_gc | 0b00000100; //LSB received first, UPCHA disabled + USARTC0.BAUDCTRLA = 3; //BSEL = fper/(2fbaud) -1; 24/(2*3) - 1 = 3 + USARTC0.BAUDCTRLB = 0x00;//USART_BSCALE0_bm; + USARTC0.CTRLB = USART_RXEN_bm | USART_TXEN_bm; +} + + +void tiny_spi_setup(void){ + //Power Reduction disable + PR.PRPC &= 0b11110111; + + //SPI enable + SPIC.CTRL = SPI_ENABLE_bm; //Slave mode + #ifdef VERO + PORTC.PIN5CTRL = PORT_INVEN_bm | PORT_OPC_PULLUP_gc; //Pin5 if not swapped + #else + PORTC.PIN7CTRL = PORT_INVEN_bm | PORT_OPC_PULLUP_gc; //Pin5 if not swapped + #endif + + return; +} \ No newline at end of file diff --git a/AVR Code/USB_BULK_TEST/src/tiny_uart.h b/AVR Code/USB_BULK_TEST/src/tiny_uart.h new file mode 100644 index 00000000..ec38ec38 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/tiny_uart.h @@ -0,0 +1,19 @@ +/* + * tiny_uart.h + * + * Created: 16/07/2015 6:33:02 PM + * Author: Esposch + */ + + +#ifndef TINY_UART_H_ +#define TINY_UART_H_ + +#include +#include + +void tiny_uart_setup(void); +void tiny_spi_setup(void); + + +#endif /* TINY_UART_H_ */ \ No newline at end of file diff --git a/AVR Code/USB_BULK_TEST/src/ui.h b/AVR Code/USB_BULK_TEST/src/ui.h new file mode 100644 index 00000000..2ac4dfa3 --- /dev/null +++ b/AVR Code/USB_BULK_TEST/src/ui.h @@ -0,0 +1,73 @@ +/** + * \file + * + * \brief Common User Interface for USB vendor class application + * + * Copyright (c) 2014-2015 Atmel Corporation. All rights reserved. + * + * \asf_license_start + * + * \page License + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an + * Atmel microcontroller product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * \asf_license_stop + * + */ +/* + * Support and FAQ: visit Atmel Support + */ + +#ifndef _UI_H_ +#define _UI_H_ + +//! \brief Initializes the user interface +void ui_init(void); + +//! \brief Enters the user interface in power down mode +void ui_powerdown(void); + +//! \brief Exits the user interface of power down mode +void ui_wakeup(void); + +/*! \brief Notify the state of loopback + * It is called when a the loopback is started and stopped. + * + * \param b_started loopback started if true, else stopped + */ +void ui_loop_back_state(bool b_started); + +/*! \brief This process is called each 1ms + * It is called only if the USB interface is enabled. + * + * \param framenumber Current frame number + */ +void ui_process(uint16_t framenumber); + +#endif // _UI_H_ diff --git a/Desktop Interface/Labrador_libusbK.pro b/Desktop Interface/Labrador_libusbK.pro new file mode 100644 index 00000000..920082c9 --- /dev/null +++ b/Desktop Interface/Labrador_libusbK.pro @@ -0,0 +1,63 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2016-03-30T13:27:52 +# +#------------------------------------------------- + +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport + +TARGET = Labrador_libusbk +TEMPLATE = app + + +SOURCES += main.cpp\ + mainwindow.cpp \ + qcustomplot.cpp \ + buffercontrol.cpp \ + esposlider.cpp \ + espospinbox.cpp \ + winusbdriver.cpp \ + espocombobox.cpp \ + functiongencontrol.cpp \ + isodriver.cpp \ + isobuffer.cpp \ + siprint.cpp \ + noclosemenu.cpp \ + cursorenabler.cpp \ + desktop_settings.cpp \ + deviceconnecteddisplay.cpp \ + timedtickbox.cpp + +HEADERS += mainwindow.h \ + qcustomplot.h \ + buffercontrol.h \ + esposlider.h \ + espospinbox.h \ + winusbdriver.h \ + espocombobox.h \ + functiongencontrol.h \ + xmega.h \ + isodriver.h \ + isobuffer.h \ + desktop_settings.h \ + siprint.h \ + noclosemenu.h \ + cursorenabler.h \ + deviceconnecteddisplay.h \ + timedtickbox.h + +FORMS += mainwindow.ui + +RESOURCES += \ + resources.qrc + +win32:CONFIG(release, debug|release): LIBS += -L$$PWD/libusbk/bin/lib/amd64/ -llibusbK +else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/libusbk/bin/lib/amd64/ -llibusbK + +INCLUDEPATH += $$PWD/libusbk/includes +DEPENDPATH += $$PWD/libusbk/includes + + +DESTDIR = bin diff --git a/Desktop Interface/Labrador_libusbK.pro.user b/Desktop Interface/Labrador_libusbK.pro.user new file mode 100644 index 00000000..f068c47f --- /dev/null +++ b/Desktop Interface/Labrador_libusbK.pro.user @@ -0,0 +1,316 @@ + + + + + + EnvironmentId + {a20d7eba-78df-44a5-84f6-66ed3da35499} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + + ProjectExplorer.Project.Target.0 + + Desktop Qt 5.6.0 MSVC2013 64bit + Desktop Qt 5.6.0 MSVC2013 64bit + qt.56.win64_msvc2013_64_kit + 1 + 0 + 0 + + C:/Users/Esposch/Documents/Qt Projects/build-kf + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + + Qt4ProjectManager.Qt4BuildConfiguration + 2 + true + + + C:/Users/Esposch/Documents/Qt Projects/labrador_libusbK_x64 + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + + C:/Users/Esposch/Documents/Qt Projects/build-Kindiesfirst-Desktop_Qt_5_6_0_MSVC2013_64bit-Profile + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + true + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 3 + + + 0 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deploy locally + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + Labrador_libusbK + + Qt4ProjectManager.Qt4RunConfiguration:C:/Users/Esposch/Documents/qt-code/Labrador_libusbk/Labrador_libusbK.pro + true + + Labrador_libusbK.pro + false + false + + 3768 + false + true + false + false + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 18 + + + Version + 18 + + diff --git a/Desktop Interface/buffer_0.bmp b/Desktop Interface/buffer_0.bmp new file mode 100644 index 00000000..8d8e3b91 Binary files /dev/null and b/Desktop Interface/buffer_0.bmp differ diff --git a/Desktop Interface/buffer_1.bmp b/Desktop Interface/buffer_1.bmp new file mode 100644 index 00000000..7d348291 Binary files /dev/null and b/Desktop Interface/buffer_1.bmp differ diff --git a/Desktop Interface/buffer_2.bmp b/Desktop Interface/buffer_2.bmp new file mode 100644 index 00000000..b47a9187 Binary files /dev/null and b/Desktop Interface/buffer_2.bmp differ diff --git a/Desktop Interface/buffercontrol.cpp b/Desktop Interface/buffercontrol.cpp new file mode 100644 index 00000000..b5d889cf --- /dev/null +++ b/Desktop Interface/buffercontrol.cpp @@ -0,0 +1,240 @@ +#include "buffercontrol.h" + +bufferControl::bufferControl(QWidget *parent) : QLabel(parent) +{ + //refreshImage(); +} + +void bufferControl::refreshImage(void){ + //qDebug() << "Trying to show bitmap " << numBuffers; + + switch(numBuffers){ + case 0: + bufferImage = QPixmap(":/bitmap/buffer_0.bmp"); + break; + case 1: + bufferImage = QPixmap(":/bitmap/buffer_1.bmp"); + break; + case 2: + bufferImage = QPixmap(":/bitmap/buffer_2.bmp"); + break; + } + + if(bufferImage.isNull()) qFatal("Resource not found\n"); + + this->setPixmap(bufferImage); + //qDebug() << this->text(); + this->show(); + return; +} + +void bufferControl::scopeIn_CH1(bool state){ //What about DSR!? + scopeState_CH1 = state; + + if (scopeState_CH2){ //Implicitly state is false + scopeState_CH2 = false; + //updateBuffer(0); - Causes issues because the uncheck below called scopeIn_CH2 (but only when toggle)!!! + scopeUncheck(0); + } + + scopeDsrOut(state); + scopeOut_CH2(state); + + updateBuffer(state,1); // Do this last to ensure anything accidentally enabled is immediately switched off + qDebug() << "scopeIn_CH1" << state; + updateMode(); +} + +void bufferControl::scopeIn_CH2(bool state){ + scopeState_CH2 = state; + + updateBuffer(state,1); + qDebug() << "scopeIn_CH2" << state; + updateMode(); +} + +void bufferControl::scopeDsrIn(bool state){ + scopeDsrState = state; + + updateBuffer(state,1); + qDebug() << "scopeDsrIn" << state; + updateMode(); +} + +/*void bufferControl::signalGenIn(bool state){ + signalGenState = state; + + updateBuffer(state,1); + qDebug() << "signalGenIn" << state; + updateMode(); +}*/ + +void bufferControl::busSnifferIn_CH1(bool state){ + busSnifferState_CH1 = state; + + if (busSnifferState_CH2){ //Implicitly state is false + busSnifferState_CH2 = false; + //updateBuffer(0); - Causes issues because the uncheck below called scopeIn_CH2 (but only when toggle)!!! + busSnifferUncheck(0); + } + + busSnifferOut_CH2(state); + + updateBuffer(state,1); + qDebug() << "busSnifferIn_CH1" << state; + updateMode(); +} + +void bufferControl::busSnifferIn_CH2(bool state){ + busSnifferState_CH2 = state; + + updateBuffer(state,1); + qDebug() << "busSnifferIn_CH2" << state; + updateMode(); +} + +void bufferControl::multimeterIn(bool state){ + multimeterState = state; + + updateBuffer(state,2); + qDebug() << "multimeterIn" << state; + updateMode(); +} + + + +void bufferControl::updateBuffer(bool decrement, int amount){ + if(decrement){ + numBuffers-=amount; + } + else{ + numBuffers+=amount; + } + refreshImage(); + + //Write new state + switch(numBuffers){ + case 0: + if(scopeState_CH1 == false) scopeOut_CH1(0); + if(scopeState_CH2 == false) scopeOut_CH2(0); + if(scopeDsrState == false) scopeDsrOut(0); + //if(signalGenState == false) signalGenOut(0); + if(busSnifferState_CH1 == false) busSnifferOut_CH1(0); + if(busSnifferState_CH2 == false) busSnifferOut_CH2(0); + if(multimeterState == false) multimeterOut(0); + break; + case 1: + scopeOut_CH1(1); + if(scopeState_CH1 == true){ + scopeDsrOut(1); + scopeOut_CH2(1); + } + //signalGenOut(1); + busSnifferOut_CH1(1); + if(busSnifferState_CH1 == true){ + busSnifferOut_CH2(1); + } + + //busSnifferOut_CH2(1); + multimeterOut(0); + break; + case 2: + scopeOut_CH1(1); + //scopeOut_CH2(1); + if(scopeState_CH1 == true) scopeDsrOut(1); + //signalGenOut(1); + busSnifferOut_CH1(1); + //busSnifferOut_CH2(1); + multimeterOut(1); + break; + default: + qFatal("numBuffers is not equal to 0, 1 or 2"); + } + +} + +void bufferControl::digIn_CH1(bool state){ + unsigned char mask = 0x01; + if(state){ + digState |= mask; + } + else{ + digState &= (unsigned char) 0xff - mask; + } + updateDig(digState); +} + +void bufferControl::digIn_CH2(bool state){ + unsigned char mask = 0x02; + if(state){ + digState |= mask; + } + else{ + digState &= (unsigned char) 0xff - mask; + } updateDig(digState); +} + +void bufferControl::digIn_CH3(bool state){ + unsigned char mask = 0x04; + if(state){ + digState |= mask; + } + else{ + digState &= (unsigned char) 0xff - mask; + } updateDig(digState); +} + +void bufferControl::digIn_CH4(bool state){ + unsigned char mask = 0x08; + if(state){ + digState |= mask; + } + else{ + digState &= (unsigned char) 0xff - mask; + } updateDig(digState); +} + +void bufferControl::updateMode(void){ + if(multimeterState){ + modeChange(7); + qDebug() << "Changed to mode 7"; + return; + } + if(scopeDsrState){ + modeChange(6); + qDebug() << "Changed to mode 6"; + return; + } + + if (busSnifferState_CH2){ + modeChange(4); + qDebug() << "Changed to mode 4"; + return; + } + if(busSnifferState_CH1 && scopeState_CH1){ + modeChange(1); + qDebug() << "Changed to mode 1"; + return; + } + if (scopeState_CH2){ + modeChange(2); + qDebug() << "Changed to mode 2"; + return; + } + if(busSnifferState_CH1){ + modeChange(3); + qDebug() << "Changed to mode 3"; + return; + } + if(scopeState_CH1){ + modeChange(0); + qDebug() << "Changed to mode 0"; + return; + } + + modeChange(5); + qDebug() << "Changed to mode 5"; + return; + +} + diff --git a/Desktop Interface/buffercontrol.h b/Desktop Interface/buffercontrol.h new file mode 100644 index 00000000..d6faa3fb --- /dev/null +++ b/Desktop Interface/buffercontrol.h @@ -0,0 +1,57 @@ +#ifndef BUFFERCONTROL_H +#define BUFFERCONTROL_H + +#include +#include +#include + +class bufferControl : public QLabel +{ + Q_OBJECT +public: + explicit bufferControl(QWidget *parent = 0); + void refreshImage(void); +private: + QPixmap bufferImage; + int numBuffers = 1; + bool scopeState_CH1 = true; + bool scopeState_CH2 = false; + bool scopeDsrState = false; + //bool signalGenState = false; + bool busSnifferState_CH1 = false; + bool busSnifferState_CH2 = false; + bool multimeterState = false; + unsigned char digState = 0x00; + + void updateBuffer(bool increment, int amount); + void updateMode(void); + +signals: + void scopeOut_CH1(bool state); + void scopeOut_CH2(bool state); + void scopeUncheck(bool state); + void scopeDsrOut(bool state); + void scopeDsrUncheck(bool state); + //void signalGenOut(bool state); + void busSnifferOut_CH1(bool state); + void busSnifferOut_CH2(bool state); + void busSnifferUncheck(bool state); + void multimeterOut(bool state); + void updateDig(int digMask); + void modeChange(int newMode); +public slots: + void scopeIn_CH1(bool state); + void scopeIn_CH2(bool state); + void scopeDsrIn(bool state); + //void signalGenIn(bool state); + void busSnifferIn_CH1(bool state); + void busSnifferIn_CH2(bool state); + void multimeterIn(bool state); + void digIn_CH1(bool state); + void digIn_CH2(bool state); + void digIn_CH3(bool state); + void digIn_CH4(bool state); + +}; + +#endif // BUFFERCONTROL_H diff --git a/Desktop Interface/cursorenabler.cpp b/Desktop Interface/cursorenabler.cpp new file mode 100644 index 00000000..f5aadffa --- /dev/null +++ b/Desktop Interface/cursorenabler.cpp @@ -0,0 +1,22 @@ +#include "cursorenabler.h" + +cursorEnabler::cursorEnabler(QWidget *parent) : QLabel(parent) +{ + this->setVisible(0); +} + +void cursorEnabler::setTurnedOn(bool enabled){ + turnedOn = enabled; +} + +void cursorEnabler::clickDetected(QMouseEvent* event){ + if(turnedOn){ + if (event->button() == Qt::LeftButton){ + tickHori(1); + } + if (event->button() == Qt::RightButton){ + tickVert(1); + } + } + passOnSignal(event); +} diff --git a/Desktop Interface/cursorenabler.h b/Desktop Interface/cursorenabler.h new file mode 100644 index 00000000..446554ff --- /dev/null +++ b/Desktop Interface/cursorenabler.h @@ -0,0 +1,26 @@ +#ifndef CURSORENABLER_H +#define CURSORENABLER_H + +#include +#include +#include + +class cursorEnabler : public QLabel +{ + Q_OBJECT +public: + explicit cursorEnabler(QWidget *parent = 0); +private: + bool turnedOn = true; + +signals: + void tickHori(bool); + void tickVert(bool); + void passOnSignal(QMouseEvent* event); + +public slots: + void setTurnedOn(bool enabled); + void clickDetected(QMouseEvent* event); +}; + +#endif // CURSORENABLER_H diff --git a/Desktop Interface/desktop_settings.cpp b/Desktop Interface/desktop_settings.cpp new file mode 100644 index 00000000..b2cf0f9f --- /dev/null +++ b/Desktop Interface/desktop_settings.cpp @@ -0,0 +1,18 @@ +#include "desktop_settings.h" + +//USB iso stuff +int MAX_TRANSFER_SIZE = 1023; +int MAX_PENDING_TRANSFERS = 16384; +int MAX_PENDING_IO = 32; + +//Plot settings +int GRAPH_SAMPLES = 1024; +int TIMER_PERIOD = 17; +int ISO_RECOVERY_TIME = (200); +int MAX_WINDOW_SIZE = 10; +int TICK_SEPARATION = 96; + +//Multimeter settings +int MULTIMETER_PERIOD = 500; + +double SERIAL_DELAY = 0.01; //100 baud? diff --git a/Desktop Interface/desktop_settings.h b/Desktop Interface/desktop_settings.h new file mode 100644 index 00000000..c371271f --- /dev/null +++ b/Desktop Interface/desktop_settings.h @@ -0,0 +1,23 @@ +#ifndef DESKTOP_SETTINGS_H +#define DESKTOP_SETTINGS_H + +//USB iso stuff +extern int MAX_TRANSFER_SIZE; +extern int MAX_PENDING_TRANSFERS; +extern int MAX_PENDING_IO; + +//Plot settings +extern int GRAPH_SAMPLES; +extern int TIMER_PERIOD; +extern int ISO_RECOVERY_TIME; +extern int MAX_WINDOW_SIZE; +extern int TICK_SEPARATION; +#define TRIGGER_COUNT_THRESH (7 + log10(window)) //Is this the right number? + +//Multimeter settings +extern int MULTIMETER_PERIOD; + +extern double SERIAL_DELAY; + +#endif // DESKTOP_SETTINGS_H + diff --git a/Desktop Interface/deviceconnecteddisplay.cpp b/Desktop Interface/deviceconnecteddisplay.cpp new file mode 100644 index 00000000..9f075f53 --- /dev/null +++ b/Desktop Interface/deviceconnecteddisplay.cpp @@ -0,0 +1,18 @@ +#include "deviceconnecteddisplay.h" + +deviceConnectedDisplay::deviceConnectedDisplay(QWidget *parent) : QLabel(parent) +{ + +} + +void deviceConnectedDisplay::connectedStatusChanged(bool status){ + qDebug() << "deviceConnectedDisplay::connectedStatusChanged running!"; + if(status){ + this->setText("Device Connected"); + this->setStyleSheet("QLabel { color:black; }"); + } + else{ + this->setText("Device Not Detected!"); + this->setStyleSheet("QLabel { color:red; }"); + } +} diff --git a/Desktop Interface/deviceconnecteddisplay.h b/Desktop Interface/deviceconnecteddisplay.h new file mode 100644 index 00000000..1cb3b07c --- /dev/null +++ b/Desktop Interface/deviceconnecteddisplay.h @@ -0,0 +1,20 @@ +#ifndef DEVICECONNECTEDDISPLAY_H +#define DEVICECONNECTEDDISPLAY_H + +#include +#include +#include + +class deviceConnectedDisplay : public QLabel +{ + Q_OBJECT +public: + explicit deviceConnectedDisplay(QWidget *parent = 0); + +signals: + +public slots: + void connectedStatusChanged(bool status); +}; + +#endif // DEVICECONNECTEDDISPLAY_H diff --git a/Desktop Interface/espocombobox.cpp b/Desktop Interface/espocombobox.cpp new file mode 100644 index 00000000..57208f01 --- /dev/null +++ b/Desktop Interface/espocombobox.cpp @@ -0,0 +1,27 @@ +#include "espocombobox.h" + +espoComboBox::espoComboBox(QWidget *parent) : QComboBox(parent) +{ + +} + + +void espoComboBox::readWaveformList(void) +{ + FILE *listPtr = fopen("C:/kfvcc/waveforms/_list.wfl", "r"); + QStringList *newNames = new QStringList(); + char nameBuffer[255]; + + if(listPtr == NULL){ + qFatal("Could not load _list.wfl"); + } + + while (fgets(nameBuffer,256,listPtr) !=NULL){ + qDebug() << "nameBuffer = " << nameBuffer; + strtok(nameBuffer, "\n"); + newNames->append(nameBuffer); + } + this->addItems(*(newNames)); + delete newNames; + fclose(listPtr); +} diff --git a/Desktop Interface/espocombobox.h b/Desktop Interface/espocombobox.h new file mode 100644 index 00000000..e008c1f7 --- /dev/null +++ b/Desktop Interface/espocombobox.h @@ -0,0 +1,19 @@ +#ifndef ESPOCOMBOBOX_H +#define ESPOCOMBOBOX_H + +#include +#include +#include + +class espoComboBox : public QComboBox +{ + Q_OBJECT +public: + explicit espoComboBox(QWidget *parent = 0); + void readWaveformList(void); +signals: + +public slots: +}; + +#endif // ESPOCOMBOBOX_H diff --git a/Desktop Interface/esposlider.cpp b/Desktop Interface/esposlider.cpp new file mode 100644 index 00000000..04b37bd2 --- /dev/null +++ b/Desktop Interface/esposlider.cpp @@ -0,0 +1,100 @@ +//Known issues: +//Memory leak +//Must be called by main window or labels can disappear. + +#include "esposlider.h" + +#define MIN(a,b) (((a)<(b))?(a):(b)) + + +espoSlider::espoSlider(QWidget *parent) : QSlider(parent) +{ + windowPointer = parent; + labelMargin = 3; +} + +bool espoSlider::setTickLabel(QString label, int position) +{ + if (position > maxTick()){ + //qDebug() << "Tried to label tick at position " << position << "but ticks range from 0 to " << maxTick(); + return true; + } + QLabel * working = addressBook.at(position); + working->setText(label); + working->setGeometry(QRect(0, 0, 100, 12)); + //qDebug() << "Set Geometry of QLabel" << working; + working->show(); + + return false; +} + +void espoSlider::resizeEvent(QResizeEvent *event){ + this->debug_var++; + //qDebug() << "move/resize event" << debug_var; + rearrange(); +} + +void espoSlider::moveEvent(QMoveEvent *event){ + this->debug_var++; + //qDebug() << "move/resize event" << debug_var; + rearrange(); +} + + +void espoSlider::setTickInterval(int ti){ + addressBook.resize(maxTick(ti) + 1, NULL); //Leaky, but not significantly. Old qlabels never deleted. + for (int i=0; itickInterval() == 0){ + return 0; + } + return (this->maximum() - this-> minimum() + 1) / (this->tickInterval()); +} + +int espoSlider::maxTick(int ti){ + if (ti == 0){ + return 0; + } + return (this->maximum() - this-> minimum() + 1) / ti; +} + +void espoSlider::rearrange(){ + QLabel *working; + int k = 5; + int c = 5; + + int left = this->geometry().left(); + int right = this->geometry().right(); + int top = this->geometry().top(); + int bottom = this->geometry().bottom(); + int height = bottom - top; + int internalHeight = height-c-k; + int margin = (width()/3) - 6; + + //qDebug() << "left = " << left << "right = " << right << "top = " << top << "bottom = " << bottom << "height = " << height << "internalHeight = " << internalHeight << "margin = " << margin; + //qDebug() << "maxTick() =" << maxTick(); + if (addressBook.size() > 1) + for (int i=addressBook.size()-1; i>0; i--){ + working = addressBook.at(i); + working->setGeometry(QRect(right-margin+labelMargin, top + c + (internalHeight * i * this->tickInterval()) / (this->maximum() - this->minimum()) - 5, 100, 9)); + } + working = addressBook.at(0); + working->setGeometry(QRect(right-margin+labelMargin, top + c - 5, 100, 9)); +} + +void espoSlider::selfMoved(int newval) +{ + QString newstring; + newstring.setNum((double) newval/20, 'f', 2); + //qDebug() << newstring; + voltageChanged(((double) newval) / 20); + lcdOut(newstring); + return; +} diff --git a/Desktop Interface/esposlider.h b/Desktop Interface/esposlider.h new file mode 100644 index 00000000..d2a65db6 --- /dev/null +++ b/Desktop Interface/esposlider.h @@ -0,0 +1,35 @@ +#ifndef ESPOSLIDER_H +#define ESPOSLIDER_H + +#include +#include +//#include +#include +#include +#include + +class espoSlider : public QSlider +{ + Q_OBJECT +public: + explicit espoSlider(QWidget *parent = 0); + bool setTickLabel(QString label, int position); + void resizeEvent(QResizeEvent *event); + void moveEvent(QMoveEvent *event); + void setTickInterval(int ti); + int maxTick(); + int maxTick(int ti); +private: + int debug_var = 0; + void rearrange(); + std::vector addressBook; + QWidget* windowPointer; + int labelMargin; +signals: + void lcdOut(QString values); + void voltageChanged(double newVoltage); +public slots: + void selfMoved(int newval); +}; + +#endif // ESPOSLIDER_H diff --git a/Desktop Interface/espospinbox.cpp b/Desktop Interface/espospinbox.cpp new file mode 100644 index 00000000..f339c37f --- /dev/null +++ b/Desktop Interface/espospinbox.cpp @@ -0,0 +1,47 @@ +#include "espospinbox.h" + +espoSpinBox::espoSpinBox(QWidget *parent) : QDoubleSpinBox(parent) +{ + +} + +QString espoSpinBox::textFromValue(double value) const{ + QString windowText; + if (value == 0){ + QTextStream(&windowText) << value; + return windowText; + } + if (value >= 1000000){ + QTextStream(&windowText) << value/1000000 << "M"; + return windowText; + } + if (value >= 1000){ + QTextStream(&windowText) << value/1000 << "k"; + return windowText; + } + if (value >= 1){ + QTextStream(&windowText) << value; + return windowText; + } + if (value >= 1/1000){ + QTextStream(&windowText) << value * 1000 << "m"; + return windowText; + } + if (value >= 1/1000000){ + QTextStream(&windowText) << value * 1000000 << "u"; + return windowText; + } + return "invalid"; +} + +void espoSpinBox::maximumChanged(double linked){ + this->setMaximum(9.6-linked); +} + +void espoSpinBox::setMax(double newMax){ + this->setMaximum(newMax); +} + +void espoSpinBox::setMin(double newMin){ + this->setMinimum(newMin); +} diff --git a/Desktop Interface/espospinbox.h b/Desktop Interface/espospinbox.h new file mode 100644 index 00000000..5ada4751 --- /dev/null +++ b/Desktop Interface/espospinbox.h @@ -0,0 +1,25 @@ +#ifndef ESPOSPINBOX_H +#define ESPOSPINBOX_H + +#include +#include +#include +#include + +class espoSpinBox : public QDoubleSpinBox +{ + Q_OBJECT +public: + explicit espoSpinBox(QWidget *parent = 0); +private: + QString textFromValue(double value) const; + +signals: + +public slots: + void maximumChanged(double linked); + void setMax(double newMax); + void setMin(double newMin); +}; + +#endif // ESPOSPINBOX_H diff --git a/Desktop Interface/functiongencontrol.cpp b/Desktop Interface/functiongencontrol.cpp new file mode 100644 index 00000000..4308b675 --- /dev/null +++ b/Desktop Interface/functiongencontrol.cpp @@ -0,0 +1,143 @@ +#include "functiongencontrol.h" + +functionGenControl::functionGenControl(QWidget *parent) : QLabel(parent) +{ + this->hide(); + samples_CH1 = (unsigned char *) malloc(0); + samples_CH2 = (unsigned char *) malloc(0); + +} + +void functionGenControl::waveformName_CH1(QString newName) +{ + qDebug() << "newName = " << newName; + newName.append(".tlw"); + + QString *directory = new QString("C:/kfvcc/waveforms/"); + + directory->append(newName); + QByteArray temp = directory->toLatin1(); + char *fileName = temp.data(); + + qDebug() << "opening" << fileName; + FILE *fptr = fopen(fileName, "r"); + if (fptr==NULL){ + qFatal("%s could not be opened!", fileName); + } + + char lengthString[5]; + fgets(lengthString, 5, fptr); + sscanf(lengthString, "%d", &length_CH1); + + char divisibilityString[5]; + fgets(divisibilityString, 5, fptr); + sscanf(divisibilityString, "%d", &divisibility_CH1); + + qDebug() << "Length = " << length_CH1; + qDebug() << "Divisibility = " << divisibility_CH1; + + free(samples_CH1); + samples_CH1 = (unsigned char *) malloc(length_CH1); + + char *dataString = (char *) malloc(length_CH1*5+1); + fgets(dataString, length_CH1*5+1, fptr); + + int dummy; + char *dataStringCurrent = dataString; + for (int i=0;i>(divisibility_CH1-1))); + setMinFreq_CH1((double) CLOCK_FREQ/1024/65535/length_CH1); + functionGenToUpdate(0, this); +} + +void functionGenControl::freqUpdate_CH1(double newFreq){ + qDebug() << "newFreq = " << newFreq; + freq_CH1 = newFreq; + functionGenToUpdate(0, this); +} + +void functionGenControl::amplitudeUpdate_CH1(double newAmplitude){ + qDebug() << "newAmplitude = " << newAmplitude; + amplitude_CH1 = newAmplitude; + functionGenToUpdate(0, this); +} + +void functionGenControl::offsetUpdate_CH1(double newOffset){ + qDebug() << "newOffset = " << newOffset; + offset_CH1 = newOffset; + functionGenToUpdate(0, this); +} + +void functionGenControl::waveformName_CH2(QString newName) +{ + qDebug() << "newName = " << newName; + newName.append(".tlw"); + + QString *directory = new QString("C:/kfvcc/waveforms/"); + + directory->append(newName); + QByteArray temp = directory->toLatin1(); + char *fileName = temp.data(); + + qDebug() << "opening" << fileName; + FILE *fptr = fopen(fileName, "r"); + if (fptr==NULL){ + qFatal("%s could not be opened!", fileName); + } + + char lengthString[5]; + fgets(lengthString, 5, fptr); + sscanf(lengthString, "%d", &length_CH2); + + char divisibilityString[5]; + fgets(divisibilityString, 5, fptr); + sscanf(divisibilityString, "%d", &divisibility_CH2); + + qDebug() << "Length = " << length_CH2; + qDebug() << "Divisibility = " << divisibility_CH2; + + free(samples_CH2); + samples_CH2 = (unsigned char *) malloc(length_CH2); + + char *dataString = (char *) malloc(length_CH2*5+1); + fgets(dataString, length_CH2*5+1, fptr); + + int dummy; + char *dataStringCurrent = dataString; + for (int i=0;i>(divisibility_CH2-1))); + setMinFreq_CH2((double) CLOCK_FREQ/1024/65535/length_CH2); + functionGenToUpdate(1, this); +} + +void functionGenControl::freqUpdate_CH2(double newFreq){ + qDebug() << "newFreq = " << newFreq; + freq_CH2 = newFreq; + functionGenToUpdate(1, this); +} + +void functionGenControl::amplitudeUpdate_CH2(double newAmplitude){ + qDebug() << "newAmplitude = " << newAmplitude; + amplitude_CH2 = newAmplitude; + functionGenToUpdate(1, this); +} + +void functionGenControl::offsetUpdate_CH2(double newOffset){ + qDebug() << "newOffset = " << newOffset; + offset_CH2 = newOffset; + functionGenToUpdate(1, this); +} diff --git a/Desktop Interface/functiongencontrol.h b/Desktop Interface/functiongencontrol.h new file mode 100644 index 00000000..c82abc76 --- /dev/null +++ b/Desktop Interface/functiongencontrol.h @@ -0,0 +1,35 @@ +#ifndef FUNCTIONGENCONTROL_H +#define FUNCTIONGENCONTROL_H + +#include +#include +#include +#include "xmega.h" + +class functionGenControl : public QLabel +{ + Q_OBJECT +public: + explicit functionGenControl(QWidget *parent = 0); + unsigned char *samples_CH1, *samples_CH2; + int length_CH1, divisibility_CH1, length_CH2, divisibility_CH2; + double freq_CH1 = 1000, amplitude_CH1 = 0, offset_CH1 = 0, freq_CH2 = 1000, amplitude_CH2 = 0, offset_CH2 = 0; +private: +signals: + void functionGenToUpdate(int channel, functionGenControl *fGenControl); + void setMaxFreq_CH1(double maxFreq); + void setMinFreq_CH1(double minFreq); + void setMaxFreq_CH2(double maxFreq); + void setMinFreq_CH2(double minFreq); +public slots: + void waveformName_CH1(QString newName); + void freqUpdate_CH1(double newFreq); + void amplitudeUpdate_CH1(double newAmplitude); + void offsetUpdate_CH1(double newOffset); + void waveformName_CH2(QString newName); + void freqUpdate_CH2(double newFreq); + void amplitudeUpdate_CH2(double newAmplitude); + void offsetUpdate_CH2(double newOffset); +}; + +#endif // FUNCTIONGENCONTROL_H diff --git a/Desktop Interface/isobuffer.cpp b/Desktop Interface/isobuffer.cpp new file mode 100644 index 00000000..dfc30b0f --- /dev/null +++ b/Desktop Interface/isobuffer.cpp @@ -0,0 +1,254 @@ +#include "isobuffer.h" + +isoBuffer::isoBuffer(int bufferLen) +{ + buffer = (short *) calloc(bufferLen*2, sizeof(short)); + bufferEnd = bufferLen-1; + samplesPerSecond = (double) bufferLen/(double)21; + samplesPerSecond = samplesPerSecond/375*374; //BABABOOEY +} +void isoBuffer::openFile(QString newFile) +{ + if (fptr != NULL){ + fclose(fptr); + } + if (newFile.isEmpty()){ + fptr = NULL; + } + else { + QByteArray temp = newFile.toLatin1(); + char *fileName = temp.data(); + fptr = fopen(fileName, "w"); + if (fptr == NULL) qFatal("Null fptr in isoBuffer::openFile"); + qDebug() << "opening file" << fileName; + qDebug() << "fptr = " << fptr; + } +} + +void isoBuffer::writeBuffer_char(char* data, int len) +{ + //for (int i=(len-1);i>-1;i--){ + for (int i=0; i (bitPeriod_seconds + SERIAL_DELAY)){ + tempPtr = (unsigned short *) readBuffer(0, 1, false, dist_seconds - bitPeriod_seconds); + tempShort = *(tempPtr); + tempShort = tempShort & 0xff; + tempChar = tempShort & (1 << serialPhase) ? 0 : 1; + if(serialDecodingSymbol){ + //if((tempShort != 0) && (tempShort!= 255)) qDebug() << "tempShort = " << tempShort; + qDebug() << numOnes(tempShort); + decodeSymbol(numOnes(tempShort) > 4); + } + else serialDecodingSymbol = (numOnes(tempShort) < 8); + marchSerialPtr(bitPeriod_seconds * samplesPerSecond); + dist_seconds = (double)serialDistance()/samplesPerSecond; + } +} + +int isoBuffer::serialDistance() +{ + if(back >= serialPtr){ + return back - serialPtr; + }else return bufferEnd - serialPtr + back; +} + +void isoBuffer::serialBegin() +{ + serialPtr = back; +} + + +void isoBuffer::decodeSymbol(unsigned char newBit) //Slow but works. +{ + if(symbolCurrent == symbolMax){ //Last bit in symbol + console -> insertPlainText(QString(QChar((char)symbol))); + if(serialAutoScroll){ + //http://stackoverflow.com/questions/21059678/how-can-i-set-auto-scroll-for-a-qtgui-qtextedit-in-pyqt4 DANKON + QTextCursor c = console->textCursor(); + c.movePosition(QTextCursor::End); + console->setTextCursor(c); + // txtedit.ensureCursorVisible(); // you might need this also + } + symbolCurrent++; + return; + } + if(symbolCurrent > symbolMax){ //Wait for stop bit. Stops over the top calculation when you get a string of zeroes... + if(newBit == 1){ + serialDecodingSymbol = false; + symbolCurrent = 0; + symbol = 0; + } + return; + } + //otherwise + symbol |= newBit << symbolCurrent; + symbolCurrent++; +} + +void isoBuffer::marchSerialPtr(int bitPeriod_samples) +{ + int halfPeriod = bitPeriod_samples * 0.6; + int sampleDistance = -1; + + serialPtr += bitPeriod_samples; + if(serialPtr >= bufferEnd){ + serialPtr -= bufferEnd; + } + if(!serialDecodingSymbol){ + return; + } + + if((serialPtr <= halfPeriod) || (serialPtr > (bufferEnd - halfPeriod))) return; //Don't bother readjusting. Too hard. + + //otherwise... + if(buffer[serialPtr] != buffer[serialPtr - halfPeriod]){ //use LHS to calibrate + for (int i=halfPeriod;i>=0;i--){ + if(buffer[serialPtr] == buffer[serialPtr-i]){ + sampleDistance = i; + break; + } + } + if(sampleDistance != -1) serialPtr += (bitPeriod_samples/2) - sampleDistance; + } + + if(sampleDistance == -1){ + if(buffer[serialPtr] != buffer[serialPtr + halfPeriod]){ //same as above but with RHS + for (int i=halfPeriod;i>=0;i--){ + if(buffer[serialPtr] == buffer[serialPtr+i]){ + sampleDistance = i; + break; + } + } + if(sampleDistance != -1) serialPtr -= (bitPeriod_samples/2) - sampleDistance; + } + } +} + +unsigned char isoBuffer::numOnes(unsigned short var){ + return ((var&0x01) ? 1 : 0) + ((var&0x02) ? 1 : 0) + ((var&0x04) ? 1 : 0) + ((var&0x08) ? 1 : 0) + ((var&0x10) ? 1 : 0) + ((var&0x20) ? 1 : 0) + ((var&0x40) ? 1 : 0) + ((var&0x80) ? 1 : 0); +} diff --git a/Desktop Interface/isobuffer.h b/Desktop Interface/isobuffer.h new file mode 100644 index 00000000..00d260da --- /dev/null +++ b/Desktop Interface/isobuffer.h @@ -0,0 +1,44 @@ +#ifndef ISOBUFFER_H +#define ISOBUFFER_H + +#include +#include +#include +#include +#include "xmega.h" +#include "desktop_settings.h" +#include + +class isoBuffer +{ +public: + isoBuffer(int bufferLen); + void openFile(QString newFile); + void writeBuffer_char(char *data, int len); + void writeBuffer_short(short *data, int len); + short *readBuffer(double sampleWindow, int numSamples, bool singleBit, double delayOffset); + void clearBuffer(); + void gainBuffer(int gain_log); + void glitchInsert(short type); + void serialDecode(double baudRate, unsigned char channel); + int serialDistance(); + void serialBegin(); + QPlainTextEdit *console, *console1, *console2; + bool serialAutoScroll = true; +private: + short *buffer, *readData = NULL; + FILE* fptr = NULL; + int bufferEnd, back = 0, serialPtr = 0; + int samplesPerSecond; + bool firstTime = true; + bool serialDecodingSymbol = false; + unsigned char symbolMax = 7; + unsigned char symbolCurrent = 0; + unsigned short symbol = 0; + void decodeSymbol(unsigned char newBit); + void marchSerialPtr(int bitPeriod_samples); + char serialPhase = 0; + unsigned char numOnes(unsigned short var); +}; + +#endif // ISOBUFFER_H diff --git a/Desktop Interface/isodriver.cpp b/Desktop Interface/isodriver.cpp new file mode 100644 index 00000000..486e0a43 --- /dev/null +++ b/Desktop Interface/isodriver.cpp @@ -0,0 +1,988 @@ +#include "isodriver.h" + +isoDriver::isoDriver(QWidget *parent) : QLabel(parent) +{ + this->hide(); + internalBuffer375_CH1 = new isoBuffer(MAX_WINDOW_SIZE*ADC_SPS/20*21); + internalBuffer375_CH2 = new isoBuffer(MAX_WINDOW_SIZE*ADC_SPS/20*21); + internalBuffer750 = new isoBuffer(MAX_WINDOW_SIZE*ADC_SPS/10*21); + + isoTemp = (char *) malloc(TIMER_PERIOD*ADC_SPF + 8); //8-byte header contains (unsigned long) length + + char volts[2] = "V"; + char seconds[2] = "s"; + char hertz[3] = "Hz"; + + v0 = new siprint(volts, 1234); + v1 = new siprint(volts, 0); + dv = new siprint(volts, 0); + t0 = new siprint(seconds, 0); + t1 = new siprint(seconds, 0); + dt = new siprint(seconds, 0); + f = new siprint(hertz, 0); + + startTimer(); + + slowTimer = new QTimer; + slowTimer->setTimerType(Qt::PreciseTimer); + slowTimer->start(MULTIMETER_PERIOD); + connect(slowTimer, SIGNAL(timeout()), this, SLOT(slowTimerTick())); +} + +void isoDriver::setDriver(winUsbDriver *newDriver){ + driver = newDriver; + qDebug() << "driver = " << driver; +} + +void isoDriver::setAxes(QCustomPlot *newAxes){ + axes = newAxes; + qDebug() << "axes = " << axes; +} + +void isoDriver::setWindow(int newWindow){ + window = pow( (double)10, ( (double)newWindow / 10) ); + windowAtPause = window; + qDebug() << "window = " << window; +} + +void isoDriver::timerTick(void){ + if(firstFrame){ + autoGain(); + firstFrame = false; + } + //qDebug() << "TICK!" << QDateTime::currentMSecsSinceEpoch(); + if (driver->recoveryInProcess){ + //qDebug() << "Recovery in process! Aborting"; + return; + } + + isoTemp = driver->isoRead(TIMER_PERIOD*ADC_SPF*2); + length = *((PUINT)isoTemp); + total_read += length; + + if (driver->recoveryInProcess){ + recoverIsoStream(); + free(isoTemp); + return; + } + + switch(driver->deviceMode){ + case 0: + frameActionGeneric(1,0); + break; + case 1: + frameActionGeneric(1,2); + if(serialDecodeEnabled_CH1){ + internalBuffer375_CH2->serialDecode(baudRate_CH1, 1); + } + break; + case 2: + frameActionGeneric(1,1); + break; + case 3: + frameActionGeneric(2,0); + if(serialDecodeEnabled_CH1){ + internalBuffer375_CH1->serialDecode(baudRate_CH1, 1); + } + break; + case 4: + frameActionGeneric(2,2); + if(serialDecodeEnabled_CH1){ + internalBuffer375_CH1->serialDecode(baudRate_CH1, 1); + } + if(serialDecodeEnabled_CH2){ + internalBuffer375_CH2->serialDecode(baudRate_CH2, 2); + } + break; + case 5: + break; + case 6: + frameActionGeneric(-1,0); + break; + case 7: + multimeterAction(); + break; + default: + qFatal("Error in isoDriver::timerTick. Invalid device mode."); + } + free(isoTemp); +} + +void isoDriver::analogConvert(short *shortPtr, QVector *doublePtr, int TOP, bool AC){ + + double scope_gain = (double)(driver->scopeGain); + double accumulated = 0; + currentVmax = -20; + currentVmin = 20; + + double *data = doublePtr->data(); + for (int i=0;ideviceMode != 7) data[i] += vcc*(R2/(R1+R2)); + #ifdef INVERT_MM + if(driver->deviceMode == 7) data[i] *= -1; + #endif + + accumulated += data[i]; + if (data[i] > currentVmax) currentVmax = data[i]; + if (data[i] < currentVmin) currentVmin = data[i]; + } + currentVmean = accumulated / GRAPH_SAMPLES; + if(AC){ + for (int i=0;i *doublePtr){ + + double *data = doublePtr->data(); + double top = topRange - (topRange - botRange)/10; + double bot = botRange + (topRange - botRange)/10; + for (int i=0;isetTimerType(Qt::PreciseTimer); + isoTimer->start(TIMER_PERIOD); + connect(isoTimer, SIGNAL(timeout()), this, SLOT(timerTick())); + //qFatal("ISO TIMER STARTED"); +} + +void isoDriver::recoverIsoStream(void){ + QTimer::singleShot(ISO_RECOVERY_TIME, this, SLOT(recoveryTick())); +} + +void isoDriver::recoveryTick(void){ + //qDebug() << "(recovery) TICK"; + + //axes->yAxis->setAutoTickCount((axes->height() + TICK_SEPARATION / 2) / TICK_SEPARATION); + //axes->xAxis->setAutoTickCount((axes->width() + TICK_SEPARATION / 2) / TICK_SEPARATION); + + + if(driver->recoverySuccess){ + //isoTimer->start(TIMER_PERIOD); + //connect(isoTimer, SIGNAL(timeout()), this, SLOT(timerTick())); + driver->recoveryInProcess = false; + driver->dutyTemp = 0; + disableWindow(1); + //qDebug() << "recoveryTick() completed successfully"; + } + else{ + driver->reinitialise(1); + QTimer::singleShot(ISO_RECOVERY_TIME, this, SLOT(recoveryTick())); + //qDebug() << "recoveryTick() completed with errors. Retrying..."; + } +} + +void isoDriver::clearBuffers(bool ch3751, bool ch3752, bool ch750){ + if(ch3751) internalBuffer375_CH1->clearBuffer(); + if(ch3752) internalBuffer375_CH2->clearBuffer(); + if(ch750) internalBuffer750->clearBuffer(); +} + +void isoDriver::setVisible_CH2(bool visible){ + axes->graph(1)->setVisible(visible); +} + +void isoDriver::setVoltageRange(QWheelEvent *event){ + if (!(event->modifiers() == Qt::ControlModifier)){ + double c = (topRange - botRange) / (double)400; + + QCPRange range = axes->yAxis->range(); + + double pixPct = (double)100 - ((double)100 * (((double)axes->yAxis->pixelToCoord(event->y())-range.lower) / (double)(range.upper - range.lower))); + if (pixPct<0) pixPct = 0; + if (pixPct>100) pixPct = 100; + + + qDebug() << "WHEEL @ " << pixPct << "%"; + qDebug() << range.upper; + //qDebug() << event->delta(); + + if (event->delta()==120){ + topRange -= c* ((double)pixPct); + botRange += c* ((double)100 - (double)pixPct); + } + else{ + topRange += c* ((double)pixPct); + botRange -= c* ((double)100 - (double)pixPct); + } + + if (topRange > (double)20) topRange = (double)20; + if (botRange <- (double)20) botRange = (double)-20; + if (autoGainEnabled && !properlyPaused()) autoGain(); + } + else if(properlyPaused()){ + double c = (window) / (double)200; + QCPRange range = axes->xAxis->range(); + + double pixPct = (double)100 * (((double)axes->xAxis->pixelToCoord(event->x())-range.lower) / (double)(range.upper - range.lower)); + if (pixPct<0) pixPct = 0; + if (pixPct>100) pixPct = 100; + + qDebug() << "WHEEL @ " << pixPct << "%"; + qDebug() << event->delta(); + + if (event->delta()==120){ + window -= c* ((double)pixPct); + delay += c* ((double)100 - (double)pixPct) * pixPct/100; + } + else{ + window += c* ((double)pixPct); + delay -= c* ((double)100 - (double)pixPct) * pixPct/100; + } + + if (window > (double)MAX_WINDOW_SIZE) window = (double)MAX_WINDOW_SIZE; + if ((window + delay) > MAX_WINDOW_SIZE) delay -= window + delay - (double)MAX_WINDOW_SIZE; + if (delay < 0) delay = 0; + qDebug() << window << delay; + } else { + qDebug() << "TIGGERED"; + double c = (window) / (double)200; + QCPRange range = axes->xAxis->range(); + + double pixPct = (double)100 * (((double)axes->xAxis->pixelToCoord(event->x())-range.lower) / (double)(window)); + if (pixPct<0) pixPct = 0; + if (pixPct>100) pixPct = 100; + + qDebug() << "WHEEL @ " << pixPct << "%"; + qDebug() << event->delta(); + qDebug() << "upper = " << range.upper << "lower = " << range.lower; + qDebug() << "triggerDelay = " << triggerDelay; + qDebug() << "window = " << window; + qDebug() << c* ((double)pixPct); + qDebug() << c* ((double)100 - (double)pixPct) * pixPct/100; + + if (event->delta()==120){ + window -= c* ((double)pixPct); + delay += c* ((double)100 - (double)pixPct) * pixPct/100; + } + else{ + window += c* ((double)pixPct); + delay -= c* ((double)100 - (double)pixPct) * pixPct/100; + } + + if (window > (double)MAX_WINDOW_SIZE) window = (double)MAX_WINDOW_SIZE; + if ((window + delay) > MAX_WINDOW_SIZE) delay -= window + delay - (double)MAX_WINDOW_SIZE; + if (delay < 0) delay = 0; + windowAtPause = window; + qDebug() << window << delay; + } + //changeTimeAxis(event->delta()==-120); + //qDebug() << window; +} + +bool isoDriver::properlyPaused(){ + if(paused_CH1 & paused_CH2){ + qDebug() << "Properly paused"; + return true; + } + if ((driver->deviceMode == 0) || (driver->deviceMode == 3) || (driver->deviceMode == 6)){ + if(paused_CH1) qDebug() << "Properly paused"; else qDebug() << "Not properly paused"; + return paused_CH1; + } + if(paused_multimeter){ + qDebug() << "Properly paused"; + return true; + } + qDebug() << "Not properly paused"; + return false; +} + +void isoDriver::pauseEnable_CH1(bool enabled){ + paused_CH1 = enabled; + + if(!properlyPaused()) { + delay = 0; + window = windowAtPause; + } + + if(!enabled) clearBuffers(1,0,1); + qDebug() << "pauseEnable_CH1" << enabled; +} + + +void isoDriver::pauseEnable_CH2(bool enabled){ + paused_CH2 = enabled; + + if(!properlyPaused()){ + delay = 0; + window = windowAtPause; + } + + if(!enabled) clearBuffers(0,1,0); +} + +void isoDriver::pauseEnable_multimeter(bool enabled){ + paused_multimeter = enabled; + + if(!properlyPaused()) { + delay = 0; + window = windowAtPause; + } + + if(!enabled) clearBuffers(1,0,0); + qDebug() << "pauseEnable_multimeter" << enabled; +} + + +void isoDriver::autoGain(){ + double maxgain = vcc / (2 * ((double)topRange - vref) * R4/(R3+R4)); + double mingain = vcc / (2 * ((double)botRange - vref) * R4/(R3+R4)); + maxgain = std::min(abs(mingain) * 0.98, abs(maxgain) * 0.98); + + double snap[8] = {64, 32, 16, 8, 4, 2, 1, 0.5}; + + for (int i=0;i<8;i++){ + if (maxgain>snap[i]){ + setGain(snap[i]); + return; + } + } +} + +void isoDriver::gainBuffers(double multiplier){ + multi = multiplier; + QTimer::singleShot(TIMER_PERIOD*4, this, SLOT(gainTick())); +} + +void isoDriver::gainTick(void){ + qDebug() << "Multiplying by " << multi; + if (driver->deviceMode <5) internalBuffer375_CH1->gainBuffer(log2(multi)); + if ((driver->deviceMode == 1) | (driver->deviceMode == 2) | (driver->deviceMode == 4)) internalBuffer375_CH2->gainBuffer(log2(multi)); + if ((driver->deviceMode == 6) | (driver->deviceMode == 7)) internalBuffer750->gainBuffer(log2(multi)); +} + +void isoDriver::setAutoGain(bool enabled){ + autoGainEnabled = enabled; + if(enabled){ + autoGain(); + } +} + +void isoDriver::graphMousePress(QMouseEvent *event){ + qDebug() << event->button(); + if (horiCursorEnabled && (event->button() == Qt::LeftButton)){ + placingHoriAxes = true; + y0 = axes->yAxis->pixelToCoord(event->y()); + }else if(vertCursorEnabled && (event->button() == Qt::RightButton)){ + placingVertAxes = true; + x0 = axes->xAxis->pixelToCoord(event->x()); + } + qDebug() << "x0 =" << x0 << "x1 =" << x1 << "y0 =" << y0 << "y1 =" << y1; +} + +void isoDriver::graphMouseRelease(QMouseEvent *event){ + if(horiCursorEnabled && placingHoriAxes && (event->button() == Qt::LeftButton)){ + placingHoriAxes = false; + } else if (vertCursorEnabled && placingVertAxes && (event->button() == Qt::RightButton)){ + placingVertAxes = false; + } + qDebug() << "x0 =" << x0 << "x1 =" << x1 << "y0 =" << y0 << "y1 =" << y1; +} + +void isoDriver::graphMouseMove(QMouseEvent *event){ + if(horiCursorEnabled && placingHoriAxes){ + y1 = axes->yAxis->pixelToCoord(event->y()); + } else if(vertCursorEnabled && placingVertAxes){ + x1 = axes->xAxis->pixelToCoord(event->x()); + } +} + +void isoDriver::cursorEnableHori(bool enabled){ + horiCursorEnabled = enabled; + axes->graph(4)->setVisible(enabled); + axes->graph(5)->setVisible(enabled); +} + +void isoDriver::cursorEnableVert(bool enabled){ + vertCursorEnabled = enabled; + axes->graph(2)->setVisible(enabled); + axes->graph(3)->setVisible(enabled); +} + +void isoDriver::udateCursors(void){ + if(!(vertCursorEnabled || horiCursorEnabled)){ + cursorTextPtr->setVisible(0); + return; + } + + QVector vert0x(2), vert1x(2), hori0x(2), hori1x(2), vert0y(2), vert1y(2), hori0y(2), hori1y(2); + + vert0x[0] = x0; + vert0x[1] = x0; + vert0y[0] = botRange; + vert0y[1] = topRange; + + vert1x[0] = x1; + vert1x[1] = x1; + vert1y[0] = botRange; + vert1y[1] = topRange; + + hori0x[0] = -window - delay; + hori0x[1] = -delay; + hori0y[0] = y0; + hori0y[1] = y0; + + hori1x[0] = -window - delay; + hori1x[1] = -delay; + hori1y[0] = y1; + hori1y[1] = y1; + + if(vertCursorEnabled){ + axes->graph(2)->setData(vert0x, vert0y); + axes->graph(3)->setData(vert1x, vert1y); + } + if(horiCursorEnabled){ + axes->graph(4)->setData(hori0x, hori0y); + axes->graph(5)->setData(hori1x, hori1y); + } + + cursorTextPtr->setVisible(cursorStatsEnabled); + if (!cursorStatsEnabled) return; + + QString *cursorStatsString = new QString(); + + v0->value = y0; + v1->value = y1; + dv->value = y0-y1; + t0->value = x0; + t1->value = x1; + dt->value = abs(x0-x1); + f->value = 1/(x1-x0); + + char temp_hori[64]; + char temp_vert[64]; + char temp_separator[2]; + sprintf(temp_hori, "V0=%s, V1=%s, ΔV=%s", v0->printVal(), v1->printVal(), dv->printVal()); + sprintf(temp_vert, "t0=%s, t1=%s, Δt=%s, f=%s", t0->printVal(), t1->printVal(), dt->printVal(), f->printVal()); + sprintf(temp_separator, "\n"); + + //sprintf(temp, "hello!"); + if(horiCursorEnabled) cursorStatsString->append(temp_hori); + if(horiCursorEnabled && vertCursorEnabled) cursorStatsString->append(temp_separator); + if(vertCursorEnabled) cursorStatsString->append(temp_vert); + //qDebug() << temp; + cursorTextPtr->setText(*(cursorStatsString)); + delete cursorStatsString; +} + +int isoDriver::trigger(void){ + if(driver->deviceMode>2 && driver->deviceMode != 7){ //No scope + return -2; + } + if(triggerType>1 && driver->deviceMode!=2){ //No CH2! + return -1; + } + + bool AC = (triggerType > 1) ? AC_CH2 : AC_CH1; + double offsetMean = AC ? currentVmean : 0; + + short target = (triggerType%2) ? reverseFrontEnd(triggerLevel*1.1 + offsetMean) : reverseFrontEnd(triggerLevel + offsetMean); + short lowThresh = (triggerType%2) ? reverseFrontEnd(triggerLevel + offsetMean) : reverseFrontEnd(triggerLevel*0.9 + offsetMean); + + int location = -1; + + if(driver->deviceMode == 7){ + for (int i=0;i= target){ + triggerCountSeeking = (triggerType % 2) ? 0 : triggerCountSeeking + 1; + triggerCountNotSeeking = (triggerType % 2) ? triggerCountNotSeeking + 1 : 0; + } + else if (isoTemp_short[i+4] < lowThresh){ + triggerCountNotSeeking = (triggerType % 2) ? 0 : triggerCountNotSeeking + 1; + triggerCountSeeking = (triggerType % 2) ? triggerCountSeeking + 1 : 0; + } + else{ + triggerCountSeeking = 0; + triggerCountNotSeeking = 0; + } + + //Check for found + if(triggerSeeking && (triggerCountSeeking > TRIGGER_COUNT_THRESH)){ + if(location == -1) location = i; + triggerSeeking = false; + } + + //Check for lost + if((!triggerSeeking) && (triggerCountNotSeeking > TRIGGER_COUNT_THRESH)){ + triggerSeeking = true; + } + } + } + else{ + for (int i=0;i 374) && (triggerType<2)) || (((i%750 < 375) || (i%750 == 749)) && (triggerType>1))) continue; //Not a valid sample + + //A bit of thresholding... + //Gives DAT STABILITY + + if(isoTemp[i+8] >= target){ + triggerCountSeeking = (triggerType % 2) ? 0 : triggerCountSeeking + 1; + triggerCountNotSeeking = (triggerType % 2) ? triggerCountNotSeeking + 1 : 0; + } + else if (isoTemp[i+8] < lowThresh){ + triggerCountNotSeeking = (triggerType % 2) ? 0 : triggerCountNotSeeking + 1; + triggerCountSeeking = (triggerType % 2) ? triggerCountSeeking + 1 : 0; + } + else{ + triggerCountSeeking = 0; + triggerCountNotSeeking = 0; + } + + //Check for found + if(triggerSeeking && (triggerCountSeeking > TRIGGER_COUNT_THRESH)){ + if(location == -1) location = i; + triggerSeeking = false; + } + + //Check for lost + if((!triggerSeeking) && (triggerCountNotSeeking > TRIGGER_COUNT_THRESH)){ + triggerSeeking = true; + } + } + } + + if(singleShotEnabled && (location != -1)) { + delay = triggerDelay; + singleShotTriggered(1); + } + return location; +} + +short isoDriver::reverseFrontEnd(double voltage){ + //qFatal("reverseFrontEnd driver mode 7"); + #ifdef INVERT_MM + if(driver->deviceMode == 7) voltage *= -1; + #endif + + + double vn = vcc * (R2/(R1+R2)); + double vx = vn + (voltage - vn) * (R4 / (R3+R4)); + double TOP = (driver->deviceMode == 7) ? 2048 : 128; + + if (driver->deviceMode == 7){ + qDebug() << "SEEEKING"; + qDebug() << ((vx - vn)/vref * (double)driver->scopeGain * (double)TOP + (double)0.5); + qDebug() << "SEEEKING"; + return ((vx - vn)/vref * (double)driver->scopeGain * (double)TOP + (double)0.5); + } + + //qDebug() << "seeking" << voltage << "V"; + + + return ((vx - vn)/vref * (double)driver->scopeGain * (double)TOP + (double)0.5); +} + +void isoDriver::setTriggerEnabled(bool enabled){ + triggerEnabled = enabled; +} + +void isoDriver::setTriggerLevel(double level){ + triggerLevel = level; +} + +void isoDriver::setSingleShotEnabled(bool enabled){ + singleShotEnabled = enabled; +} + +void isoDriver::setTriggerMode(int newMode){ + triggerType = (triggerType_enum)newMode; +} + +void isoDriver::frameActionGeneric(char CH1_mode, char CH2_mode) //0 for off, 1 for ana, 2 for dig, -1 for ana750 +{ + if(!paused_CH1 && CH1_mode == - 1){ + for (int i=0;i<(length/ADC_SPF);i++){ + internalBuffer750->writeBuffer_char(&isoTemp[ADC_SPF*i+8], ADC_SPF-2); //Offset because the first 8 bytes of the array contain the length (no samples!!)! + } + } + + if(!paused_CH1 && CH1_mode > 0){ + for (int i=0;i<(length/ADC_SPF);i++){ + internalBuffer375_CH1->writeBuffer_char(&isoTemp[ADC_SPF*i+8], ADC_SPF/2-1); //Offset because the first 8 bytes of the array contain the length (no samples!!)! + } + } + + if(!paused_CH2 && CH2_mode > 0){ + for (int i=0;i<(length/ADC_SPF);i++){ + internalBuffer375_CH2->writeBuffer_char(&isoTemp[ADC_SPF*i+8+ADC_SPF/2], ADC_SPF/2-1); //+375 to get the second half of the packet + } + } + + if(!paused_CH1){ + int offset = -2; //No trigger! + if(triggerEnabled && (triggerWaiting == 0) ){ + offset = trigger(); + } + if(offset == -1){ //Trigger is active but nothing found! + return; + } + + //qDebug() << "offset =" << offset; + + int backLength = length/750; + backLength *= (CH1_mode == -1) ? 748 : 374; + + if(offset>0){ + int temp_offset = offset % 750; + offset /= 750; + offset *= (CH1_mode == -1) ? 748 : 374; + offset += temp_offset; + } + + //qDebug() << "Now offset = " << offset; + + if((!paused_CH1) && triggerEnabled && (triggerWaiting == 0)){ + triggerDelay = backLength - offset; + triggerDelay /= (CH1_mode == -1) ? 748000 : 374000; + triggerDelay += delay; + triggerWaiting = (triggerDelay<(window/2)) * 2; + } + + //qDebug() << "triggerDelay = " << triggerDelay; + + //qDebug() << "triggerWaiting =" << triggerWaiting; + + if(triggerWaiting == 1) triggerWaiting = 0; + + //qDebug() << "triggerWaiting =" << triggerWaiting; + + if(triggerEnabled && triggerWaiting){ + triggerDelay += (double)TIMER_PERIOD/(double)1000; + triggerWaiting = (triggerDelay<(window/2)) + 1; + return; + } + } + + readData375_CH1 = internalBuffer375_CH1->readBuffer(window,GRAPH_SAMPLES,CH1_mode==2, delay + ((triggerEnabled&&!paused_CH1) ? triggerDelay + window/2 : 0)); + if(CH2_mode) readData375_CH2 = internalBuffer375_CH2->readBuffer(window,GRAPH_SAMPLES,CH1_mode==2, delay + (triggerEnabled ? triggerDelay + window/2 : 0)); + if(CH1_mode == -1) readData750 = internalBuffer750->readBuffer(window,GRAPH_SAMPLES,false, delay); + + QVector x(GRAPH_SAMPLES), CH1(GRAPH_SAMPLES), CH2(GRAPH_SAMPLES); + + + if (CH1_mode == 1){ + analogConvert(readData375_CH1, &CH1, 128, AC_CH1); + xmin = (currentVmin < xmin) ? currentVmin : xmin; + xmax = (currentVmax > xmax) ? currentVmax : xmax; + broadcastStats(0); + } + if (CH1_mode == 2) digitalConvert(readData375_CH1, &CH1); + + if (CH2_mode == 1){ + analogConvert(readData375_CH2, &CH2, 128, AC_CH2); + ymin = (currentVmin < ymin) ? currentVmin : ymin; + ymax = (currentVmax > ymax) ? currentVmax : ymax; + broadcastStats(1); + } + if (CH2_mode == 2) digitalConvert(readData375_CH2, &CH2); + + if(CH1_mode == -1) { + analogConvert(readData750, &CH1, 128, AC_CH1); + broadcastStats(0); + } + + for (double i=0; i0) { + CH1[i] = 0; + CH2[i] = 0; + } + } + + udateCursors(); + + if(XYmode){ + axes->graph(0)->setData(CH1,CH2); + axes->xAxis->setRange(xmin, xmax); + axes->yAxis->setRange(ymin, ymax); + }else{ + axes->graph(0)->setData(x,CH1); + if(CH2_mode) axes->graph(1)->setData(x,CH2); + axes->xAxis->setRange(-window-delay,-delay); + axes->yAxis->setRange(topRange, botRange); + } + + axes->replot(); +} + +void isoDriver::multimeterAction(){ + isoTemp_short = (short *)isoTemp; + if(!paused_multimeter){ + for (int i=0;i<(length/ADC_SPF);i++){ + internalBuffer375_CH1->writeBuffer_short(&isoTemp_short[ADC_SPF/2*i+(8/sizeof(short))], ADC_SPF/2-1); //Offset because the first 8 bytes of the array contain the length (no samples!!)! + } + } + + if(!paused_multimeter){ + int offset = -2; //No trigger! + if(triggerEnabled && (triggerWaiting == 0) ){ + offset = trigger(); + } + if(offset == -1){ //Trigger is active but nothing found! + return; + } + + qDebug() << "offset =" << offset; + + int backLength = length/750; + backLength *= 374; + + if(offset>0){ + int temp_offset = offset % 750; + offset /= 750; + offset *= 374; + offset += temp_offset; + } + + qDebug() << "Now offset = " << offset; + + if((!paused_CH1) && triggerEnabled && (triggerWaiting == 0)){ + triggerDelay = backLength - offset; + triggerDelay /= 374000; + triggerDelay += delay; + triggerWaiting = (triggerDelay<(window/2)) * 2; + } + + qDebug() << "triggerDelay = " << triggerDelay; + + qDebug() << "triggerWaiting =" << triggerWaiting; + + if(triggerWaiting == 1) triggerWaiting = 0; + + qDebug() << "triggerWaiting =" << triggerWaiting; + + if(triggerEnabled && triggerWaiting){ + triggerDelay += (double)TIMER_PERIOD/(double)1000; + triggerWaiting = (triggerDelay<(window/2)) + 1; + return; + } + } + + qDebug() << triggerEnabled; + qDebug() << !paused_multimeter; + qDebug() << (triggerEnabled&&!paused_multimeter); + + qDebug() << ((triggerEnabled&&!paused_multimeter) ? triggerDelay + window/2 : 0); + + readData375_CH1 = internalBuffer375_CH1->readBuffer(window,GRAPH_SAMPLES, false, delay + ((triggerEnabled&&!paused_multimeter) ? triggerDelay + window/2 : 0)); + + QVector x(GRAPH_SAMPLES), CH1(GRAPH_SAMPLES); + analogConvert(readData375_CH1, &CH1, 2048, 0); //No AC coupling! + + for (double i=0; i0) { + CH1[i] = 0; + } + } + axes->graph(0)->setData(x,CH1); + + udateCursors(); + + axes->xAxis->setRange(-window-delay,-delay); + axes->yAxis->setRange(topRange, botRange); + + axes->replot(); + multimeterStats(); +} + +void isoDriver::setAC_CH1(bool enabled){ + AC_CH1 = enabled; +} + +void isoDriver::setAC_CH2(bool enabled){ + AC_CH2 = enabled; +} + +void isoDriver::setMultimeterType(int type){ + multimeterType = (multimeterType_enum) type; + qDebug() << "multimeterType = " << multimeterType; +} + +void isoDriver::setSeriesResistance(double resistance){ + seriesResistance = resistance; + qDebug() << "seriesResistance = " << seriesResistance; +} + +void isoDriver::multimeterStats(){ + if (!multimeterShow) return; + + QTimer::singleShot(MULTIMETER_PERIOD, this, SLOT(enableMM())); + + multimeterShow = false; + bool mvMax, mvMin, mvMean, maMax, maMin, maMean; //We'll let the compiler work out this one. + + if(autoMultimeterV){ + mvMax = currentVmax < 1; + mvMin = currentVmin < 1; + mvMean = currentVmean < 1; + } + if(autoMultimeterI){ + maMax = (currentVmax / seriesResistance) < 1; + maMin = (currentVmin / seriesResistance) < 1; + maMean = (currentVmean / seriesResistance) < 1; + } + + if(forceMillivolts){ + mvMax = true; + mvMin = true; + mvMean = true; + } + if(forceMilliamps){ + maMax = true; + maMin = true; + maMean = true; + } + if(forceVolts){ + mvMax = false; + mvMin = false; + mvMean = false; + } + if(forceAmps){ + maMax = false; + maMin = false; + maMean = false; + } + + if(multimeterType == V){ + if(mvMax){ + currentVmax *= 1000; + sendMultimeterLabel1("Max (mV)"); + }else sendMultimeterLabel1("Max (V)"); + + if(mvMin){ + currentVmin *= 1000; + sendMultimeterLabel2("Min (mV)"); + }else sendMultimeterLabel2("Min (V)"); + + if(mvMean){ + currentVmean *= 1000; + sendMultimeterLabel3("Mean (mV)"); + }else sendMultimeterLabel3("Mean (V)"); + + multimeterMax(currentVmax); + multimeterMin(currentVmin); + multimeterMean(currentVmean); + return; + } + + if(multimeterType == I){ + if(maMax){ + currentVmax *= 1000; + sendMultimeterLabel1("Max (mA)"); + }else sendMultimeterLabel1("Max (A)"); + + if(maMin){ + currentVmin *= 1000; + sendMultimeterLabel2("Min (mA)"); + }else sendMultimeterLabel2("Min (A)"); + + if(maMean){ + currentVmean *= 1000; + sendMultimeterLabel3("Mean (mA)"); + }else sendMultimeterLabel3("Mean (A)"); + + multimeterMax(currentVmax / seriesResistance); + multimeterMin(currentVmin / seriesResistance); + multimeterMean(currentVmean / seriesResistance); + return; + } + +} + +void isoDriver::enableMM(){ + multimeterShow = true; +} + + +void isoDriver::setAutoMultimeterV(bool enabled){ + autoMultimeterV = enabled; +} + +void isoDriver::setAutoMultimeterI(bool enabled){ + autoMultimeterI = enabled; +} + + +void isoDriver::setForceMillivolts(bool enabled){ + forceMillivolts = enabled; +} + +void isoDriver::setForceMilliamps(bool enabled){ + forceMilliamps = enabled; +} + +void isoDriver::setForceVolts(bool enabled){ + forceVolts = enabled; +} + +void isoDriver::setForceAmps(bool enabled){ + forceAmps = enabled; +} + +void isoDriver::setSerialDecodeEnabled_CH1(bool enabled){ + serialDecodeEnabled_CH1 = enabled; +} + +void isoDriver::setSerialDecodeEnabled_CH2(bool enabled){ + serialDecodeEnabled_CH2 = enabled; +} + +void isoDriver::setXYmode(bool enabled){ + XYmode = enabled; + if(!enabled){ + xmin = 20; + xmax = -20; + ymin = 20; + ymax = -20; + } + axes->graph(1)->setVisible(!enabled); +} + +void isoDriver::triggerGroupStateChange(bool enabled){ + if(enabled) sendTriggerValue((currentVmax-currentVmin)*0.85 + currentVmin); +} + +void isoDriver::broadcastStats(bool CH2){ + if(CH2){ + if(!update_CH2) return; + update_CH2 = false; + sendVmax_CH2(currentVmax); + sendVmin_CH2(currentVmin); + sendVmean_CH2(currentVmean); + //sendVrms_CH2(currentVrms); + } else{ + if(!update_CH1) return; + update_CH1 = false; + sendVmax_CH1(currentVmax); + sendVmin_CH1(currentVmin); + sendVmean_CH1(currentVmean); + //sendVrms_CH1(currentVrms); + } +} + +void isoDriver::slowTimerTick(){ + update_CH1 = true; + update_CH2 = true; +} diff --git a/Desktop Interface/isodriver.h b/Desktop Interface/isodriver.h new file mode 100644 index 00000000..69dbf351 --- /dev/null +++ b/Desktop Interface/isodriver.h @@ -0,0 +1,144 @@ +#ifndef ISODRIVER_H +#define ISODRIVER_H + +#include +#include +#include +#include +#include "qcustomplot.h" +#include "winusbdriver.h" +#include "isobuffer.h" +#include "desktop_settings.h" +#include "siprint.h" + +class isoDriver : public QLabel +{ + Q_OBJECT +public: + explicit isoDriver(QWidget *parent = 0); + void setDriver(winUsbDriver *newDriver); + void setAxes(QCustomPlot *newAxes); + bool cursorStatsEnabled = true; + isoBuffer *internalBuffer375_CH1, *internalBuffer375_CH2, *internalBuffer750; + int baudRate_CH1 = 9600, baudRate_CH2 = 9600; + double delay = 0, window = 0.01; + QCPItemText *cursorTextPtr; +private: + winUsbDriver *driver; + QCustomPlot *axes; + double windowAtPause = 0.01; + QTimer* isoTimer = NULL, *recoveryTimer = NULL, *slowTimer = NULL; + short *readData375_CH1, *readData375_CH2, *readData750; + long total_read = 0; + void analogConvert(short *shortPtr, QVector *doublePtr, int TOP, bool AC); + void digitalConvert(short *shortPtr, QVector *doublePtr); + double topRange=2.5, botRange=-0.5; + bool paused_CH1 = false, paused_CH2 = false, paused_multimeter = false; + void recoverIsoStream(void); + void frameActionGeneric(char CH1_mode, char CH2_mode); + char *isoTemp = NULL; + short *isoTemp_short = NULL; + bool properlyPaused(); + void autoGain(void); + double multi = 0; + bool autoGainEnabled = true; + bool placingHoriAxes = false, placingVertAxes = false, horiCursorEnabled = false, vertCursorEnabled = false; + double y0=0, y1=0, x0=0, x1=0; + void udateCursors(void); + short reverseFrontEnd(double voltage); + int trigger(void); + bool triggerSeeking = true; + bool triggerEnabled = false; + double triggerLevel = 0; + enum triggerType_enum {rising_ch1 = 0, falling_ch1 = 1, rising_ch2 = 2, falling_ch2 = 3}; + triggerType_enum triggerType = rising_ch1; + int length; + siprint *v0, *v1, *dv, *t0, *t1, *dt, *f; + bool singleShotEnabled = false; + double triggerDelay; + int triggerCountSeeking = 0, triggerCountNotSeeking = 0; + unsigned char triggerWaiting = 0; + bool firstFrame = true; + void multimeterAction(); + bool AC_CH1 = false, AC_CH2 = false; + double currentVmax, currentVmin, currentVmean; + enum multimeterType_enum {V = 0, I = 1, R = 2, C = 3}; + multimeterType_enum multimeterType = V; + double seriesResistance = 0; + bool multimeterShow = false; + bool autoMultimeterV = true; + bool autoMultimeterI = true; + bool forceMillivolts = false; + bool forceMilliamps = false; + bool forceVolts = false; + bool forceAmps = false; + bool serialDecodeEnabled_CH1 = false, serialDecodeEnabled_CH2 = false; + bool XYmode = false; + double xmin = 20, xmax = -20, ymin = 20, ymax = -20; + bool update_CH1 = true, update_CH2 = true; + void broadcastStats(bool CH2); + +signals: + void setGain(double newGain); + void disableWindow(bool enabled); + void setCursorStatsVisible(bool enabled); + void sendCursorStatsText(QString text); + void singleShotTriggered(bool triggered); + void multimeterMax(double); + void multimeterMin(double); + void multimeterMean(double); + void sendMultimeterLabel1(QString); + void sendMultimeterLabel2(QString); + void sendMultimeterLabel3(QString); + void changeTimeAxis(bool positive); + void sendTriggerValue(double); + void sendVmax_CH1(double); + void sendVmin_CH1(double); + void sendVmean_CH1(double); + void sendVmax_CH2(double); + void sendVmin_CH2(double); + void sendVmean_CH2(double); + +public slots: + void setWindow(int newWindow); + void setVoltageRange(QWheelEvent *event); + void timerTick(void); + void recoveryTick(void); + void pauseEnable_CH1(bool enabled); + void pauseEnable_CH2(bool enabled); + void pauseEnable_multimeter(bool enabled); + void startTimer(); + void clearBuffers(bool ch3751, bool ch3752, bool ch750); + void setVisible_CH2(bool visible); + void gainBuffers(double multiplier); + void gainTick(void); + void setAutoGain(bool enabled); + void graphMousePress(QMouseEvent *event); + void graphMouseRelease(QMouseEvent *event); + void graphMouseMove(QMouseEvent *event); + void cursorEnableHori(bool enabled); + void cursorEnableVert(bool enabled); + void setTriggerEnabled(bool enabled); + void setTriggerLevel(double level); + void setSingleShotEnabled(bool enabled); + void setTriggerMode(int newMode); + void setAC_CH1(bool enabled); + void setAC_CH2(bool enabled); + void setMultimeterType(int type); + void setSeriesResistance(double resistance); + void multimeterStats(); + void enableMM(); + void setAutoMultimeterV(bool enabled); + void setAutoMultimeterI(bool enabled); + void setForceMillivolts(bool enabled); + void setForceMilliamps(bool enabled); + void setForceVolts(bool enabled); + void setForceAmps(bool enabled); + void setSerialDecodeEnabled_CH1(bool enabled); + void setSerialDecodeEnabled_CH2(bool enabled); + void setXYmode(bool enabled); + void triggerGroupStateChange(bool enabled); + void slowTimerTick(); +}; + +#endif // ISODRIVER_H diff --git a/Desktop Interface/libusbk/bin/dll/amd64/libusbK.dll b/Desktop Interface/libusbk/bin/dll/amd64/libusbK.dll new file mode 100644 index 00000000..d8112b9e Binary files /dev/null and b/Desktop Interface/libusbk/bin/dll/amd64/libusbK.dll differ diff --git a/Desktop Interface/libusbk/bin/dll/ia64/libusbK.dll b/Desktop Interface/libusbk/bin/dll/ia64/libusbK.dll new file mode 100644 index 00000000..717244d5 Binary files /dev/null and b/Desktop Interface/libusbk/bin/dll/ia64/libusbK.dll differ diff --git a/Desktop Interface/libusbk/bin/dll/x86/libusbK.dll b/Desktop Interface/libusbk/bin/dll/x86/libusbK.dll new file mode 100644 index 00000000..0d410629 Binary files /dev/null and b/Desktop Interface/libusbk/bin/dll/x86/libusbK.dll differ diff --git a/Desktop Interface/libusbk/bin/lib/amd64/libusbK.lib b/Desktop Interface/libusbk/bin/lib/amd64/libusbK.lib new file mode 100644 index 00000000..c8358a40 Binary files /dev/null and b/Desktop Interface/libusbk/bin/lib/amd64/libusbK.lib differ diff --git a/Desktop Interface/libusbk/bin/lib/ia64/libusbK.lib b/Desktop Interface/libusbk/bin/lib/ia64/libusbK.lib new file mode 100644 index 00000000..b8bdd816 Binary files /dev/null and b/Desktop Interface/libusbk/bin/lib/ia64/libusbK.lib differ diff --git a/Desktop Interface/libusbk/bin/lib/static/amd64/libusbK.lib b/Desktop Interface/libusbk/bin/lib/static/amd64/libusbK.lib new file mode 100644 index 00000000..f20f18de Binary files /dev/null and b/Desktop Interface/libusbk/bin/lib/static/amd64/libusbK.lib differ diff --git a/Desktop Interface/libusbk/bin/lib/static/ia64/libusbK.lib b/Desktop Interface/libusbk/bin/lib/static/ia64/libusbK.lib new file mode 100644 index 00000000..0e43a803 Binary files /dev/null and b/Desktop Interface/libusbk/bin/lib/static/ia64/libusbK.lib differ diff --git a/Desktop Interface/libusbk/bin/lib/static/x86/libusbK.lib b/Desktop Interface/libusbk/bin/lib/static/x86/libusbK.lib new file mode 100644 index 00000000..f5ccfdfb Binary files /dev/null and b/Desktop Interface/libusbk/bin/lib/static/x86/libusbK.lib differ diff --git a/Desktop Interface/libusbk/bin/lib/x86/libusbK.lib b/Desktop Interface/libusbk/bin/lib/x86/libusbK.lib new file mode 100644 index 00000000..2f390040 Binary files /dev/null and b/Desktop Interface/libusbk/bin/lib/x86/libusbK.lib differ diff --git a/Desktop Interface/libusbk/includes/libusbk.h b/Desktop Interface/libusbk/includes/libusbk.h new file mode 100644 index 00000000..bac5f81b --- /dev/null +++ b/Desktop Interface/libusbk/includes/libusbk.h @@ -0,0 +1,4000 @@ +/*! \file libusbk.h +* \brief functions for usb device communication. +* +* \note +* This is the \b main libusbK USB user include file. +*/ + +#ifndef _LIBUSBK_H__ +#define _LIBUSBK_H__ + +#include "lusbk_shared.h" + +/////////////////////////////////////////////////////////////////////// +// L I B U S B K PUBLIC STRUCTS, DEFINES, AND ENUMS ////////////////// +/////////////////////////////////////////////////////////////////////// + +#ifndef _LIBUSBK_LIBK_TYPES + +/*! \addtogroup libk +* @{ +*/ + +#define _in +#define _inopt +#define _out +#define _outopt +#define _ref +#define _refopt + +//! UsbK base function pointer, See \ref LibK_GetProcAddress. +typedef INT_PTR (FAR WINAPI* KPROC)(); + +//! Indicates that a function is an exported API call. +#if defined(DYNAMIC_DLL) +#define KUSB_EXP +#else +#define KUSB_EXP +#endif + +//! Indicates the calling convention. This is always WINAPI (stdcall) by default. +#if !defined(KUSB_API) +#define KUSB_API WINAPI +#endif + +#pragma warning(disable:4201) + +#if _MSC_VER >= 1200 +#pragma warning(push) +#endif +#pragma warning (disable:4201) +#pragma warning(disable:4214) // named type definition in parentheses + +//! User defined handle context space, see \ref LibK_GetContext. +typedef INT_PTR KLIB_USER_CONTEXT; + +//! KUSB control setup packet. +/*! +* This union structure is identical in size to a \ref WINUSB_SETUP_PACKET, +* but provides additional field accessors. (see \ref libusbk.h for structure details) +*/ +typedef union _KUSB_SETUP_PACKET +{ + UCHAR Bytes[8]; + USHORT Words[4]; + struct + { + //! Request value + struct + { + UCHAR Recipient: 2; + UCHAR Reserved: 3; + UCHAR Type: 2; + UCHAR Dir: 1; + } BmRequest; + + //! Request type value + UCHAR Request; + + //! wValue + USHORT Value; + + //! wIndex + USHORT Index; + + //! wLength ushort value + USHORT Length; + }; + struct + { + struct + { + UCHAR b0: 1; + UCHAR b1: 1; + UCHAR b2: 1; + UCHAR b3: 1; + UCHAR b4: 1; + UCHAR b5: 1; + UCHAR b6: 1; + UCHAR b7: 1; + } BmRequestBits; + + struct + { + UCHAR b0: 1; + UCHAR b1: 1; + UCHAR b2: 1; + UCHAR b3: 1; + UCHAR b4: 1; + UCHAR b5: 1; + UCHAR b6: 1; + UCHAR b7: 1; + } RequestBits; + + UCHAR ValueLo; + UCHAR ValueHi; + UCHAR IndexLo; + UCHAR IndexHi; + UCHAR LengthLo; + UCHAR LengthHi; + }; +} KUSB_SETUP_PACKET; +// setup packet is eight bytes -- defined by spec +C_ASSERT(sizeof(KUSB_SETUP_PACKET) == 8); + +#if _MSC_VER >= 1200 +#pragma warning(pop) +#endif + + +//! Base handle type for all library handles, See \ref KLIB_HANDLE_TYPE. +typedef void* KLIB_HANDLE; + +//! Opaque UsbK handle, see \ref UsbK_Init. +typedef KLIB_HANDLE KUSB_HANDLE; + +//! Opaque LstK handle, see \ref LstK_Init. +typedef KLIB_HANDLE KLST_HANDLE; + +//! Opaque HotK handle, see \ref HotK_Init. +typedef KLIB_HANDLE KHOT_HANDLE; + +//! Opaque OvlK handle, see \ref OvlK_Acquire. +typedef KLIB_HANDLE KOVL_HANDLE; + + +//! Opaque OvlPoolK handle, see \ref OvlK_Init. +typedef KLIB_HANDLE KOVL_POOL_HANDLE; + +//! Opaque StmK handle, see \ref StmK_Init. +typedef KLIB_HANDLE KSTM_HANDLE; + +//! Handle type enumeration. +typedef enum _KLIB_HANDLE_TYPE +{ + //! Hot plug handle. \ref KHOT_HANDLE + KLIB_HANDLE_TYPE_HOTK, + + //! USB handle. \ref KUSB_HANDLE + KLIB_HANDLE_TYPE_USBK, + + //! Shared USB handle. \ref KUSB_HANDLE + KLIB_HANDLE_TYPE_USBSHAREDK, + + //! Device list handle. \ref KLST_HANDLE + KLIB_HANDLE_TYPE_LSTK, + + //! Device info handle. \ref KLST_DEVINFO_HANDLE + KLIB_HANDLE_TYPE_LSTINFOK, + + //! Overlapped handle. \ref KOVL_HANDLE + KLIB_HANDLE_TYPE_OVLK, + + //! Overlapped pool handle. \ref KOVL_POOL_HANDLE + KLIB_HANDLE_TYPE_OVLPOOLK, + + //! Pipe stream handle. \ref KSTM_HANDLE + KLIB_HANDLE_TYPE_STMK, + + //! Max handle type count. + KLIB_HANDLE_TYPE_COUNT +} KLIB_HANDLE_TYPE; + +//! Function typedef for \ref LibK_SetCleanupCallback. +typedef INT KUSB_API KLIB_HANDLE_CLEANUP_CB (_in KLIB_HANDLE Handle, _in KLIB_HANDLE_TYPE HandleType, _in KLIB_USER_CONTEXT UserContext); + +//! libusbK verson information structure. +typedef struct _KLIB_VERSION +{ + //! Major version number. + INT Major; + + //! Minor version number. + INT Minor; + + //! Micro version number. + INT Micro; + + //! Nano version number. + INT Nano; +} KLIB_VERSION; +//! Pointer to a \copybrief KLIB_VERSION +typedef KLIB_VERSION* PKLIB_VERSION; + +/*! @} */ +#endif + +#ifndef _LIBUSBK_ISOK_TYPES +/*! \addtogroup isok +* @{ +*/ + + +//! Callback function typedef for \ref IsoK_EnumPackets +typedef BOOL KUSB_API KISO_ENUM_PACKETS_CB (_in UINT PacketIndex, _in PKISO_PACKET IsoPacket, _in PVOID UserState); + +/*! @} */ +#endif + +#ifndef _LIBUSBK_LSTK_TYPES + +/*! \addtogroup lstk +* @{ +*/ + +//! Allocated length for all strings in a \ref KLST_DEVINFO structure. +#define KLST_STRING_MAX_LEN 256 + +//! Device list sync flags. +/*! +* These sync flags are also use by the hot plug module to indicate device +* arrival/removal notifications: +* - \b DeviceArrival = KLST_SYNC_FLAG_ADDED +* - \b DeviceRemoval = KLST_SYNC_FLAG_REMOVED +*/ +typedef enum _KLST_SYNC_FLAG +{ + //! Cleared/invalid state. + KLST_SYNC_FLAG_NONE = 0L, + + //! Unchanged state, + KLST_SYNC_FLAG_UNCHANGED = 0x0001, + + //! Added (Arrival) state, + KLST_SYNC_FLAG_ADDED = 0x0002, + + //! Removed (Unplugged) state, + KLST_SYNC_FLAG_REMOVED = 0x0004, + + //! Connect changed state. + KLST_SYNC_FLAG_CONNECT_CHANGE = 0x0008, + + //! All states. + KLST_SYNC_FLAG_MASK = 0x000F, +} KLST_SYNC_FLAG; + +//! Common usb device information structure +typedef struct _KLST_DEV_COMMON_INFO +{ + //! VendorID parsed from \ref KLST_DEVINFO::DeviceID + INT Vid; + + //! ProductID parsed from \ref KLST_DEVINFO::DeviceID + INT Pid; + + //! Composite interface number parsed from \ref KLST_DEVINFO::DeviceID. Set to \b -1 for devices that do not have the composite parent driver. + INT MI; + + // An ID that uniquely identifies a USB device. + CHAR InstanceID[KLST_STRING_MAX_LEN]; + +} KLST_DEV_COMMON_INFO; +//! Pointer to a \c KLST_DEV_COMMON_INFO structure. +typedef KLST_DEV_COMMON_INFO* PKLST_DEV_COMMON_INFO; + +//! Semi-opaque device information structure of a device list. +/*! +* +* \attention This structure is semi-opaque. +* +*/ +typedef struct _KLST_DEVINFO +{ + //! Common usb device information + KLST_DEV_COMMON_INFO Common; + + //! Driver id this device element is using + INT DriverID; + + //! Device interface GUID + CHAR DeviceInterfaceGUID[KLST_STRING_MAX_LEN]; + + //! Device instance ID. + /*! + * A Device instance ID has the following format: + * [enumerator]\[enumerator-specific-device-ID]\[instance-specific-ID] + * - [enumerator] + * - For USB device, the enumerator is always \c USB + * - [enumerator-specific-device-ID] + * - Contains the vendor and product id (VID_xxxx&PID_xxxx) + * - If present, contains the usbccgp (windows composite device layer) interface number (MI_xx) + * - [instance-specific-ID] + * - If the device is composite, contains a unique interface ID generated by Windows. + * - If the device is not composite and has a serial number, contains the devices serial number. + * - If the device does not have a serial number, contains a unique ID generated by Windows. + */ + CHAR DeviceID[KLST_STRING_MAX_LEN]; + + //! Class GUID. + CHAR ClassGUID[KLST_STRING_MAX_LEN]; + + //! Manufacturer name as specified in the INF file. + CHAR Mfg[KLST_STRING_MAX_LEN]; + + //! Device description as specified in the INF file. + CHAR DeviceDesc[KLST_STRING_MAX_LEN]; + + //! Driver service name. + CHAR Service[KLST_STRING_MAX_LEN]; + + //! Unique identifier. + CHAR SymbolicLink[KLST_STRING_MAX_LEN]; + + //! physical device filename used with the Windows \c CreateFile() + CHAR DevicePath[KLST_STRING_MAX_LEN]; + + //! libusb-win32 filter index id. + INT LUsb0FilterIndex; + + //! Indicates the devices connection state. + BOOL Connected; + + //! Synchronization flags. (internal use only) + KLST_SYNC_FLAG SyncFlags; + + INT BusNumber; + + INT DeviceAddress; + + //! If the the device is serialized, represents the string value of \ref USB_DEVICE_DESCRIPTOR::iSerialNumber. For Devices without a \b iSerialNumber, represents the unique \b InstanceID assigned by \b Windows. + CHAR SerialNumber[KLST_STRING_MAX_LEN]; + +} KLST_DEVINFO; +//! Pointer to a \ref KLST_DEVINFO structure. (semi-opaque) +typedef KLST_DEVINFO* KLST_DEVINFO_HANDLE; + +//! Device list initialization flags. +typedef enum _KLST_FLAG +{ + //! No flags (or 0) + KLST_FLAG_NONE = 0L, + + //! Enable listings for the raw device interface GUID \b only. {A5DCBF10-6530-11D2-901F-00C04FB951ED} + KLST_FLAG_INCLUDE_RAWGUID = 0x0001, + + //! List all libusbK devices including those not currently connected. + KLST_FLAG_INCLUDE_DISCONNECT = 0x0002, + +} KLST_FLAG; + +//! Device list/hot-plug pattern match structure. +/*! +* \fixedstruct{1024} +* +* These ansi char strings are used to specify which devices should be included in a device list. +* All strings file pattern match strings allowing asterisk or question mark chars as wildcards. +* +*/ +typedef struct _KLST_PATTERN_MATCH +{ + //! Pattern match a device instance id. + CHAR DeviceID[KLST_STRING_MAX_LEN]; + + //! Pattern match a device interface guid. + CHAR DeviceInterfaceGUID[KLST_STRING_MAX_LEN]; + + //! Pattern match a symbolic link. + CHAR ClassGUID[KLST_STRING_MAX_LEN]; + + //! fixed structure padding. + UCHAR z_F_i_x_e_d[1024 - KLST_STRING_MAX_LEN * 3]; + +} KLST_PATTERN_MATCH; +C_ASSERT(sizeof(KLST_PATTERN_MATCH) == 1024); + +//! Pointer to a \ref KLST_PATTERN_MATCH structure. +typedef KLST_PATTERN_MATCH* PKLST_PATTERN_MATCH; + +//! Device list enumeration function callback typedef. +/*! +* +* \param DeviceList +* The device list \c DeviceInfo belongs to +* +* \param DeviceInfo +* Device information +* +* \param Context +* User context that was passed into \ref LstK_Enumerate +* +* Use this typedef as a prototype for an enumeration function with \ref LstK_Enumerate. +* +*/ +typedef BOOL KUSB_API KLST_ENUM_DEVINFO_CB ( + _in KLST_HANDLE DeviceList, + _in KLST_DEVINFO_HANDLE DeviceInfo, + _in PVOID Context); + +/*! @} */ + +#endif + +#ifndef __USB_H__ + +#include + +/*! \addtogroup libk +* @{ +*/ + +//! Maximum value that can be added to the current start frame. +#define USBD_ISO_START_FRAME_RANGE 1024 + + +//! bmRequest.Dir +typedef enum _BMREQUEST_DIR +{ + BMREQUEST_DIR_HOST_TO_DEVICE = 0, + BMREQUEST_DIR_DEVICE_TO_HOST = 1, +} BMREQUEST_DIR; + +//! bmRequest.Type +typedef enum _BMREQUEST_TYPE +{ + //! Standard request. See \ref USB_REQUEST_ENUM + BMREQUEST_TYPE_STANDARD = 0, + + //! Class-specific request. + BMREQUEST_TYPE_CLASS = 1, + + //! Vendor-specific request + BMREQUEST_TYPE_VENDOR = 2, +} BMREQUEST_TYPE; + +//! bmRequest.Recipient +typedef enum _BMREQUEST_RECIPIENT +{ + //! Request is for a device. + BMREQUEST_RECIPIENT_DEVICE = 0, + + //! Request is for an interface of a device. + BMREQUEST_RECIPIENT_INTERFACE = 1, + + //! Request is for an endpoint of a device. + BMREQUEST_RECIPIENT_ENDPOINT = 2, + + //! Request is for a vendor-specific purpose. + BMREQUEST_RECIPIENT_OTHER = 3, +} BMREQUEST_RECIPIENT; + +//! Maximum length (in bytes) of a usb string. USB strings are always stored in wide-char format. +#define MAXIMUM_USB_STRING_LENGTH 255 + +//! Values for the bits returned by the \ref USB_REQUEST_GET_STATUS request. +typedef enum _USB_GETSTATUS +{ + //! Device is self powered + USB_GETSTATUS_SELF_POWERED = 0x01, + + //! Device can wake the system from a low power/sleeping state. + USB_GETSTATUS_REMOTE_WAKEUP_ENABLED = 0x02 +} USB_GETSTATUS; + +//! Standard USB descriptor types. For more information, see section 9-5 of the USB 3.0 specifications. +typedef enum _USB_DESCRIPTOR_TYPE +{ + //! Device descriptor type. + USB_DESCRIPTOR_TYPE_DEVICE = 0x01, + + //! Configuration descriptor type. + USB_DESCRIPTOR_TYPE_CONFIGURATION = 0x02, + + //! String descriptor type. + USB_DESCRIPTOR_TYPE_STRING = 0x03, + + //! Interface descriptor type. + USB_DESCRIPTOR_TYPE_INTERFACE = 0x04, + + //! Endpoint descriptor type. + USB_DESCRIPTOR_TYPE_ENDPOINT = 0x05, + + //! Device qualifier descriptor type. + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER = 0x06, + + //! Config power descriptor type. + USB_DESCRIPTOR_TYPE_CONFIG_POWER = 0x07, + + //! Interface power descriptor type. + USB_DESCRIPTOR_TYPE_INTERFACE_POWER = 0x08, + + //! Interface association descriptor type. + USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION = 0x0B, +} USB_DESCRIPTOR_TYPE; + +//! Makes \c wValue for a \ref USB_REQUEST_GET_DESCRIPTOR or \ref USB_REQUEST_SET_DESCRIPTOR request. +#define USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX(d, i) \ + ((USHORT)((USHORT)d<<8 | i)) + +//! Endpoint type mask for the \c bmAttributes field of a \ref USB_ENDPOINT_DESCRIPTOR +#define USB_ENDPOINT_TYPE_MASK 0x03 + +//! Indicates a control endpoint +#define USB_ENDPOINT_TYPE_CONTROL 0x00 + +//! Indicates an isochronous endpoint +#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01 + +//! Indicates a bulk endpoint +#define USB_ENDPOINT_TYPE_BULK 0x02 + +//! Indicates an interrupt endpoint +#define USB_ENDPOINT_TYPE_INTERRUPT 0x03 + +//! Config power mask for the \c bmAttributes field of a \ref USB_CONFIGURATION_DESCRIPTOR +#define USB_CONFIG_POWERED_MASK 0xc0 + +//! Values used in the \c bmAttributes field of a \ref USB_CONFIGURATION_DESCRIPTOR +enum USB_CONFIG_BM_ATTRIBUTE_ENUM +{ + //! The device is powered by it's host. + USB_CONFIG_BUS_POWERED = 0x80, + + //! The device has an external power source. + USB_CONFIG_SELF_POWERED = 0x40, + + //! The device is capable of waking the the host from a low power/sleeping state. + USB_CONFIG_REMOTE_WAKEUP = 0x20, +}; + +//! Endpoint direction mask for the \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR +#define USB_ENDPOINT_DIRECTION_MASK 0x80 + +//! Endpoint address mask for the \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR +#define USB_ENDPOINT_ADDRESS_MASK 0x0F + +//! Tests the \c bEndpointAddress direction bit. TRUE if the endpoint address is an OUT endpoint. (HostToDevice, PC Write) +/*! +* \param addr \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR +*/ +#define USB_ENDPOINT_DIRECTION_OUT(addr) (!((addr) & USB_ENDPOINT_DIRECTION_MASK)) + +//! Tests the \c bEndpointAddress direction bit. TRUE if the endpoint address is an IN endpoint. (DeviceToHost, PC Read) +/*! +* \param addr \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR +*/ +#define USB_ENDPOINT_DIRECTION_IN(addr) ((addr) & USB_ENDPOINT_DIRECTION_MASK) + +//! USB defined request codes +/* +* see Chapter 9 of the USB 2.0 specification for +* more information. +* +* These are the correct values based on the USB 2.0 specification. +*/ +enum USB_REQUEST_ENUM +{ + //! Request status of the specific recipient + USB_REQUEST_GET_STATUS = 0x00, + + //! Clear or disable a specific feature + USB_REQUEST_CLEAR_FEATURE = 0x01, + + //! Set or enable a specific feature + USB_REQUEST_SET_FEATURE = 0x03, + + //! Set device address for all future accesses + USB_REQUEST_SET_ADDRESS = 0x05, + + //! Get the specified descriptor + USB_REQUEST_GET_DESCRIPTOR = 0x06, + + //! Update existing descriptors or add new descriptors + USB_REQUEST_SET_DESCRIPTOR = 0x07, + + //! Get the current device configuration value + USB_REQUEST_GET_CONFIGURATION = 0x08, + + //! Set device configuration + USB_REQUEST_SET_CONFIGURATION = 0x09, + + //! Return the selected alternate setting for the specified interface + USB_REQUEST_GET_INTERFACE = 0x0A, + + //! Select an alternate interface for the specified interface + USB_REQUEST_SET_INTERFACE = 0x0B, + + //! Set then report an endpoint's synchronization frame + USB_REQUEST_SYNC_FRAME = 0x0C, +}; + +//! USB defined class codes +/*! +* see http://www.usb.org/developers/defined_class for more information. +* +*/ +enum USB_DEVICE_CLASS_ENUM +{ + //! Reserved class + USB_DEVICE_CLASS_RESERVED = 0x00, + + //! Audio class + USB_DEVICE_CLASS_AUDIO = 0x01, + + //! Communications class + USB_DEVICE_CLASS_COMMUNICATIONS = 0x02, + + //! Human Interface Device class + USB_DEVICE_CLASS_HUMAN_INTERFACE = 0x03, + + //! Imaging class + USB_DEVICE_CLASS_IMAGING = 0x06, + + //! Printer class + USB_DEVICE_CLASS_PRINTER = 0x07, + + //! Mass storage class + USB_DEVICE_CLASS_STORAGE = 0x08, + + //! Hub class + USB_DEVICE_CLASS_HUB = 0x09, + + //! vendor-specific class + USB_DEVICE_CLASS_VENDOR_SPECIFIC = 0xFF, +}; + +//! A structure representing the standard USB device descriptor. +/*! +* This descriptor is documented in section 9.6.1 of the USB 2.0 specification. +* All multiple-byte fields are represented in host-endian format. +*/ +typedef struct _USB_DEVICE_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! USB specification release number in binary-coded decimal. + /*! + * A value of 0x0200 indicates USB 2.0, 0x0110 indicates USB 1.1, etc. + */ + USHORT bcdUSB; + + //! USB-IF class code for the device + UCHAR bDeviceClass; + + //! USB-IF subclass code for the device + UCHAR bDeviceSubClass; + + //! USB-IF protocol code for the device + UCHAR bDeviceProtocol; + + //! Maximum packet size for control endpoint 0 + UCHAR bMaxPacketSize0; + + //! USB-IF vendor ID + USHORT idVendor; + + //! USB-IF product ID + USHORT idProduct; + + //! Device release number in binary-coded decimal + USHORT bcdDevice; + + //! Index of string descriptor describing manufacturer + UCHAR iManufacturer; + + //! Index of string descriptor describing product + UCHAR iProduct; + + //! Index of string descriptor containing device serial number + UCHAR iSerialNumber; + + //! Number of possible configurations + UCHAR bNumConfigurations; + +} USB_DEVICE_DESCRIPTOR; +//! pointer to a \c USB_DEVICE_DESCRIPTOR +typedef USB_DEVICE_DESCRIPTOR* PUSB_DEVICE_DESCRIPTOR; + +//! A structure representing the standard USB endpoint descriptor. +/*! +* This descriptor is documented in section 9.6.3 of the USB 2.0 specification. +* All multiple-byte fields are represented in host-endian format. +*/ +typedef struct _USB_ENDPOINT_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! The address of the endpoint described by this descriptor. + /*! + * - Bits 0:3 are the endpoint number + * - Bits 4:6 are reserved + * - Bit 7 indicates direction + */ + UCHAR bEndpointAddress; + + //! Attributes which apply to the endpoint when it is configured using the bConfigurationValue. + /*! + * - Bits 0:1 determine the transfer type. + * - Bits 2:3 are only used for isochronous endpoints and refer to sync type. + * - Bits 4:5 are also only used for isochronous endpoints and refer to usage type. + * - Bits 6:7 are reserved. + */ + UCHAR bmAttributes; + + //! Maximum packet size this endpoint is capable of sending/receiving. + USHORT wMaxPacketSize; + + //! Interval for polling endpoint for data transfers. + UCHAR bInterval; + +} USB_ENDPOINT_DESCRIPTOR; +//! pointer to a \c USB_ENDPOINT_DESCRIPTOR +typedef USB_ENDPOINT_DESCRIPTOR* PUSB_ENDPOINT_DESCRIPTOR; + +//! A structure representing the standard USB configuration descriptor. +/* +* +* This descriptor is documented in section 9.6.3 of the USB 2.0 specification. +* All multiple-byte fields are represented in host-endian format. +* +*/ +typedef struct _USB_CONFIGURATION_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! Total length of data returned for this configuration + USHORT wTotalLength; + + //! Number of interfaces supported by this configuration + UCHAR bNumInterfaces; + + //! Identifier value for this configuration + UCHAR bConfigurationValue; + + //! Index of string descriptor describing this configuration + UCHAR iConfiguration; + + //! Configuration characteristics + UCHAR bmAttributes; + + //! Maximum power consumption of the USB device from this bus in this configuration when the device is fully operation. + /*! + * Expressed in units of 2 mA. + */ + UCHAR MaxPower; +} USB_CONFIGURATION_DESCRIPTOR; +//! pointer to a \c USB_CONFIGURATION_DESCRIPTOR +typedef USB_CONFIGURATION_DESCRIPTOR* PUSB_CONFIGURATION_DESCRIPTOR; + +//! A structure representing the standard USB interface descriptor. +/*! +* This descriptor is documented in section 9.6.5 of the USB 2.0 specification. +* All multiple-byte fields are represented in host-endian format. +*/ +typedef struct _USB_INTERFACE_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! Number of this interface + UCHAR bInterfaceNumber; + + //! Value used to select this alternate setting for this interface + UCHAR bAlternateSetting; + + //! Number of endpoints used by this interface (excluding the control endpoint) + UCHAR bNumEndpoints; + + //! USB-IF class code for this interface + UCHAR bInterfaceClass; + + //! USB-IF subclass code for this interface + UCHAR bInterfaceSubClass; + + //! USB-IF protocol code for this interface + UCHAR bInterfaceProtocol; + + //! Index of string descriptor describing this interface + UCHAR iInterface; + +} USB_INTERFACE_DESCRIPTOR; +//! pointer to a \c USB_INTERFACE_DESCRIPTOR +typedef USB_INTERFACE_DESCRIPTOR* PUSB_INTERFACE_DESCRIPTOR; + +//! A structure representing the standard USB string descriptor. +/*! +* This descriptor is documented in section 9.6.5 of the USB 2.0 specification. +* All multiple-byte fields are represented in host-endian format. +*/ +typedef struct _USB_STRING_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! Content of the string + WCHAR bString[1]; + +} USB_STRING_DESCRIPTOR; +//! pointer to a \c USB_STRING_DESCRIPTOR +typedef USB_STRING_DESCRIPTOR* PUSB_STRING_DESCRIPTOR; + +//! A structure representing the common USB descriptor. +typedef struct _USB_COMMON_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + +} USB_COMMON_DESCRIPTOR; +//! pointer to a \c USB_COMMON_DESCRIPTOR +typedef USB_COMMON_DESCRIPTOR* PUSB_COMMON_DESCRIPTOR; + +#if _MSC_VER >= 1200 +#pragma warning(push) +#endif +#pragma warning (disable:4201) +#pragma warning(disable:4214) // named type definition in parentheses + +//! Allows hardware manufacturers to define groupings of interfaces. +/*! +* +* The ECN specifies a USB descriptor, called the Interface Association +* Descriptor (IAD). +* +* The Universal Serial Bus Specification, revision 2.0, does not support +* grouping more than one interface of a composite device within a single +* function. However, the USB Device Working Group (DWG) created USB device +* classes that allow for functions with multiple interfaces, and the USB +* Implementor's Forum issued an Engineering Change Notification (ECN) that +* defines a mechanism for grouping interfaces. +* +*/ +typedef struct _USB_INTERFACE_ASSOCIATION_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! First interface number of the set of interfaces that follow this descriptor + UCHAR bFirstInterface; + + //! The Number of interfaces follow this descriptor that are considered "associated" + UCHAR bInterfaceCount; + + //! \c bInterfaceClass used for this associated interfaces + UCHAR bFunctionClass; + + //! \c bInterfaceSubClass used for the associated interfaces + UCHAR bFunctionSubClass; + + //! \c bInterfaceProtocol used for the associated interfaces + UCHAR bFunctionProtocol; + + //! Index of string descriptor describing the associated interfaces + UCHAR iFunction; + +} USB_INTERFACE_ASSOCIATION_DESCRIPTOR; +//! pointer to a \c USB_INTERFACE_ASSOCIATION_DESCRIPTOR +typedef USB_INTERFACE_ASSOCIATION_DESCRIPTOR* PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR; + +#if _MSC_VER >= 1200 +#pragma warning(pop) +#endif + +/*! @} */ + +#include +#endif // __USB_H__ + +#ifndef _LIBUSBK_LIBK_TYPES + +/*! \addtogroup libk +* @{ +*/ + +//! Usb handle specific properties that can be retrieved with \ref UsbK_GetProperty. +typedef enum _KUSB_PROPERTY +{ + //! Get the internal device file handle used for operations such as GetOverlappedResult or DeviceIoControl. + KUSB_PROPERTY_DEVICE_FILE_HANDLE, + + KUSB_PROPERTY_COUNT + +} KUSB_PROPERTY; + +//! Supported driver id enumeration. +typedef enum _KUSB_DRVID +{ + //! libusbK.sys driver ID + KUSB_DRVID_LIBUSBK, + + //! libusb0.sys driver ID + KUSB_DRVID_LIBUSB0, + + //! WinUSB.sys driver ID + KUSB_DRVID_WINUSB, + + //! libusb0.sys filter driver ID + KUSB_DRVID_LIBUSB0_FILTER, + + //! Supported driver count + KUSB_DRVID_COUNT + +} KUSB_DRVID; + +//! Supported function id enumeration. +typedef enum _KUSB_FNID +{ + //! \ref UsbK_Init dynamic driver function id. + KUSB_FNID_Init, + + //! \ref UsbK_Free dynamic driver function id. + KUSB_FNID_Free, + + //! \ref UsbK_ClaimInterface dynamic driver function id. + KUSB_FNID_ClaimInterface, + + //! \ref UsbK_ReleaseInterface dynamic driver function id. + KUSB_FNID_ReleaseInterface, + + //! \ref UsbK_SetAltInterface dynamic driver function id. + KUSB_FNID_SetAltInterface, + + //! \ref UsbK_GetAltInterface dynamic driver function id. + KUSB_FNID_GetAltInterface, + + //! \ref UsbK_GetDescriptor dynamic driver function id. + KUSB_FNID_GetDescriptor, + + //! \ref UsbK_ControlTransfer dynamic driver function id. + KUSB_FNID_ControlTransfer, + + //! \ref UsbK_SetPowerPolicy dynamic driver function id. + KUSB_FNID_SetPowerPolicy, + + //! \ref UsbK_GetPowerPolicy dynamic driver function id. + KUSB_FNID_GetPowerPolicy, + + //! \ref UsbK_SetConfiguration dynamic driver function id. + KUSB_FNID_SetConfiguration, + + //! \ref UsbK_GetConfiguration dynamic driver function id. + KUSB_FNID_GetConfiguration, + + //! \ref UsbK_ResetDevice dynamic driver function id. + KUSB_FNID_ResetDevice, + + //! \ref UsbK_Initialize dynamic driver function id. + KUSB_FNID_Initialize, + + //! \ref UsbK_SelectInterface dynamic driver function id. + KUSB_FNID_SelectInterface, + + //! \ref UsbK_GetAssociatedInterface dynamic driver function id. + KUSB_FNID_GetAssociatedInterface, + + //! \ref UsbK_Clone dynamic driver function id. + KUSB_FNID_Clone, + + //! \ref UsbK_QueryInterfaceSettings dynamic driver function id. + KUSB_FNID_QueryInterfaceSettings, + + //! \ref UsbK_QueryDeviceInformation dynamic driver function id. + KUSB_FNID_QueryDeviceInformation, + + //! \ref UsbK_SetCurrentAlternateSetting dynamic driver function id. + KUSB_FNID_SetCurrentAlternateSetting, + + //! \ref UsbK_GetCurrentAlternateSetting dynamic driver function id. + KUSB_FNID_GetCurrentAlternateSetting, + + //! \ref UsbK_QueryPipe dynamic driver function id. + KUSB_FNID_QueryPipe, + + //! \ref UsbK_SetPipePolicy dynamic driver function id. + KUSB_FNID_SetPipePolicy, + + //! \ref UsbK_GetPipePolicy dynamic driver function id. + KUSB_FNID_GetPipePolicy, + + //! \ref UsbK_ReadPipe dynamic driver function id. + KUSB_FNID_ReadPipe, + + //! \ref UsbK_WritePipe dynamic driver function id. + KUSB_FNID_WritePipe, + + //! \ref UsbK_ResetPipe dynamic driver function id. + KUSB_FNID_ResetPipe, + + //! \ref UsbK_AbortPipe dynamic driver function id. + KUSB_FNID_AbortPipe, + + //! \ref UsbK_FlushPipe dynamic driver function id. + KUSB_FNID_FlushPipe, + + //! \ref UsbK_IsoReadPipe dynamic driver function id. + KUSB_FNID_IsoReadPipe, + + //! \ref UsbK_IsoWritePipe dynamic driver function id. + KUSB_FNID_IsoWritePipe, + + //! \ref UsbK_GetCurrentFrameNumber dynamic driver function id. + KUSB_FNID_GetCurrentFrameNumber, + + //! \ref UsbK_GetOverlappedResult dynamic driver function id. + KUSB_FNID_GetOverlappedResult, + + //! \ref UsbK_GetProperty dynamic driver function id. + KUSB_FNID_GetProperty, + + + //! Supported function count + KUSB_FNID_COUNT, + +} KUSB_FNID; + +typedef BOOL KUSB_API KUSB_Init ( + _out KUSB_HANDLE* InterfaceHandle, + _in KLST_DEVINFO_HANDLE DevInfo); + +typedef BOOL KUSB_API KUSB_Free ( + _in KUSB_HANDLE InterfaceHandle); + +typedef BOOL KUSB_API KUSB_ClaimInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API KUSB_ReleaseInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API KUSB_SetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _in UCHAR AltSettingNumber); + +typedef BOOL KUSB_API KUSB_GetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _out PUCHAR AltSettingNumber); + +typedef BOOL KUSB_API KUSB_GetDescriptor ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR DescriptorType, + _in UCHAR Index, + _in USHORT LanguageID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred); + +typedef BOOL KUSB_API KUSB_ControlTransfer ( + _in KUSB_HANDLE InterfaceHandle, + _in WINUSB_SETUP_PACKET SetupPacket, + _refopt PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API KUSB_SetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +typedef BOOL KUSB_API KUSB_GetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +typedef BOOL KUSB_API KUSB_SetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR ConfigurationNumber); + +typedef BOOL KUSB_API KUSB_GetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR ConfigurationNumber); + +typedef BOOL KUSB_API KUSB_ResetDevice ( + _in KUSB_HANDLE InterfaceHandle); + +typedef BOOL KUSB_API KUSB_Initialize ( + _in HANDLE DeviceHandle, + _out KUSB_HANDLE* InterfaceHandle); + +typedef BOOL KUSB_API KUSB_SelectInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API KUSB_GetAssociatedInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AssociatedInterfaceIndex, + _out KUSB_HANDLE* AssociatedInterfaceHandle); + +typedef BOOL KUSB_API KUSB_Clone ( + _in KUSB_HANDLE InterfaceHandle, + _out KUSB_HANDLE* DstInterfaceHandle); + +typedef BOOL KUSB_API KUSB_QueryInterfaceSettings ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingIndex, + _out PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor); + +typedef BOOL KUSB_API KUSB_QueryDeviceInformation ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT InformationType, + _ref PUINT BufferLength, + _ref PVOID Buffer); + +typedef BOOL KUSB_API KUSB_SetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber); + +typedef BOOL KUSB_API KUSB_GetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR AltSettingNumber); + +typedef BOOL KUSB_API KUSB_QueryPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber, + _in UCHAR PipeIndex, + _out PWINUSB_PIPE_INFORMATION PipeInformation); + +typedef BOOL KUSB_API KUSB_SetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +typedef BOOL KUSB_API KUSB_GetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +typedef BOOL KUSB_API KUSB_ReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API KUSB_WritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API KUSB_ResetPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API KUSB_AbortPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API KUSB_FlushPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API KUSB_IsoReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +typedef BOOL KUSB_API KUSB_IsoWritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +typedef BOOL KUSB_API KUSB_GetCurrentFrameNumber ( + _in KUSB_HANDLE InterfaceHandle, + _out PUINT FrameNumber); + +typedef BOOL KUSB_API KUSB_GetOverlappedResult ( + _in KUSB_HANDLE InterfaceHandle, + _in LPOVERLAPPED Overlapped, + _out PUINT lpNumberOfBytesTransferred, + _in BOOL bWait); + +typedef BOOL KUSB_API KUSB_GetProperty ( + _in KUSB_HANDLE InterfaceHandle, + _in KUSB_PROPERTY PropertyType, + _ref PUINT PropertySize, + _out PVOID Value); + + + +//! USB core driver API information structure. +/*! +* This structure is part of \ref KUSB_DRIVER_API and contains +* driver and user specific information. +* +*/ +typedef struct _KUSB_DRIVER_API_INFO +{ + //! \readonly Driver id of the driver api. + INT DriverID; + + //! \readonly Number of valid functions contained in the driver API. + INT FunctionCount; + +} KUSB_DRIVER_API_INFO; + +//! Driver API function set structure. +/* +* Contains the driver specific USB core function pointer set. +* +* \note +* This structure has a fixed 512 byte structure size. +*/ +typedef struct _KUSB_DRIVER_API +{ + //! Driver API information. + KUSB_DRIVER_API_INFO Info; + + /*! \fn BOOL KUSB_API Init (_out KUSB_HANDLE* InterfaceHandle, _in KLST_DEVINFO_HANDLE DevInfo) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_Init + */ + KUSB_Init* Init; + + /*! \fn BOOL KUSB_API Free (_in KUSB_HANDLE InterfaceHandle) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_Free + */ + KUSB_Free* Free; + + /*! \fn BOOL KUSB_API ClaimInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR NumberOrIndex, _in BOOL IsIndex) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ClaimInterface + */ + KUSB_ClaimInterface* ClaimInterface; + + /*! \fn BOOL KUSB_API ReleaseInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR NumberOrIndex, _in BOOL IsIndex) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ReleaseInterface + */ + KUSB_ReleaseInterface* ReleaseInterface; + + /*! \fn BOOL KUSB_API SetAltInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR NumberOrIndex, _in BOOL IsIndex, _in UCHAR AltSettingNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SetAltInterface + */ + KUSB_SetAltInterface* SetAltInterface; + + /*! \fn BOOL KUSB_API GetAltInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR NumberOrIndex, _in BOOL IsIndex, _out PUCHAR AltSettingNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetAltInterface + */ + KUSB_GetAltInterface* GetAltInterface; + + /*! \fn BOOL KUSB_API GetDescriptor (_in KUSB_HANDLE InterfaceHandle, _in UCHAR DescriptorType, _in UCHAR Index, _in USHORT LanguageID, _out PUCHAR Buffer, _in UINT BufferLength, _outopt PUINT LengthTransferred) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetDescriptor + */ + KUSB_GetDescriptor* GetDescriptor; + + /*! \fn BOOL KUSB_API ControlTransfer (_in KUSB_HANDLE InterfaceHandle, _in WINUSB_SETUP_PACKET SetupPacket, _refopt PUCHAR Buffer, _in UINT BufferLength, _outopt PUINT LengthTransferred, _inopt LPOVERLAPPED Overlapped) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ControlTransfer + */ + KUSB_ControlTransfer* ControlTransfer; + + /*! \fn BOOL KUSB_API SetPowerPolicy (_in KUSB_HANDLE InterfaceHandle, _in UINT PolicyType, _in UINT ValueLength, _in PVOID Value) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SetPowerPolicy + */ + KUSB_SetPowerPolicy* SetPowerPolicy; + + /*! \fn BOOL KUSB_API GetPowerPolicy (_in KUSB_HANDLE InterfaceHandle, _in UINT PolicyType, _ref PUINT ValueLength, _out PVOID Value) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetPowerPolicy + */ + KUSB_GetPowerPolicy* GetPowerPolicy; + + /*! \fn BOOL KUSB_API SetConfiguration (_in KUSB_HANDLE InterfaceHandle, _in UCHAR ConfigurationNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SetConfiguration + */ + KUSB_SetConfiguration* SetConfiguration; + + /*! \fn BOOL KUSB_API GetConfiguration (_in KUSB_HANDLE InterfaceHandle, _out PUCHAR ConfigurationNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetConfiguration + */ + KUSB_GetConfiguration* GetConfiguration; + + /*! \fn BOOL KUSB_API ResetDevice (_in KUSB_HANDLE InterfaceHandle) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ResetDevice + */ + KUSB_ResetDevice* ResetDevice; + + /*! \fn BOOL KUSB_API Initialize (_in HANDLE DeviceHandle, _out KUSB_HANDLE* InterfaceHandle) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_Initialize + */ + KUSB_Initialize* Initialize; + + /*! \fn BOOL KUSB_API SelectInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR NumberOrIndex, _in BOOL IsIndex) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SelectInterface + */ + KUSB_SelectInterface* SelectInterface; + + /*! \fn BOOL KUSB_API GetAssociatedInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR AssociatedInterfaceIndex, _out KUSB_HANDLE* AssociatedInterfaceHandle) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetAssociatedInterface + */ + KUSB_GetAssociatedInterface* GetAssociatedInterface; + + /*! \fn BOOL KUSB_API Clone (_in KUSB_HANDLE InterfaceHandle, _out KUSB_HANDLE* DstInterfaceHandle) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_Clone + */ + KUSB_Clone* Clone; + + /*! \fn BOOL KUSB_API QueryInterfaceSettings (_in KUSB_HANDLE InterfaceHandle, _in UCHAR AltSettingIndex, _out PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_QueryInterfaceSettings + */ + KUSB_QueryInterfaceSettings* QueryInterfaceSettings; + + /*! \fn BOOL KUSB_API QueryDeviceInformation (_in KUSB_HANDLE InterfaceHandle, _in UINT InformationType, _ref PUINT BufferLength, _ref PVOID Buffer) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_QueryDeviceInformation + */ + KUSB_QueryDeviceInformation* QueryDeviceInformation; + + /*! \fn BOOL KUSB_API SetCurrentAlternateSetting (_in KUSB_HANDLE InterfaceHandle, _in UCHAR AltSettingNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SetCurrentAlternateSetting + */ + KUSB_SetCurrentAlternateSetting* SetCurrentAlternateSetting; + + /*! \fn BOOL KUSB_API GetCurrentAlternateSetting (_in KUSB_HANDLE InterfaceHandle, _out PUCHAR AltSettingNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetCurrentAlternateSetting + */ + KUSB_GetCurrentAlternateSetting* GetCurrentAlternateSetting; + + /*! \fn BOOL KUSB_API QueryPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR AltSettingNumber, _in UCHAR PipeIndex, _out PWINUSB_PIPE_INFORMATION PipeInformation) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_QueryPipe + */ + KUSB_QueryPipe* QueryPipe; + + /*! \fn BOOL KUSB_API SetPipePolicy (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _in UINT PolicyType, _in UINT ValueLength, _in PVOID Value) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SetPipePolicy + */ + KUSB_SetPipePolicy* SetPipePolicy; + + /*! \fn BOOL KUSB_API GetPipePolicy (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _in UINT PolicyType, _ref PUINT ValueLength, _out PVOID Value) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetPipePolicy + */ + KUSB_GetPipePolicy* GetPipePolicy; + + /*! \fn BOOL KUSB_API ReadPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _out PUCHAR Buffer, _in UINT BufferLength, _outopt PUINT LengthTransferred, _inopt LPOVERLAPPED Overlapped) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ReadPipe + */ + KUSB_ReadPipe* ReadPipe; + + /*! \fn BOOL KUSB_API WritePipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _in PUCHAR Buffer, _in UINT BufferLength, _outopt PUINT LengthTransferred, _inopt LPOVERLAPPED Overlapped) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_WritePipe + */ + KUSB_WritePipe* WritePipe; + + /*! \fn BOOL KUSB_API ResetPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ResetPipe + */ + KUSB_ResetPipe* ResetPipe; + + /*! \fn BOOL KUSB_API AbortPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_AbortPipe + */ + KUSB_AbortPipe* AbortPipe; + + /*! \fn BOOL KUSB_API FlushPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_FlushPipe + */ + KUSB_FlushPipe* FlushPipe; + + /*! \fn BOOL KUSB_API IsoReadPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _out PUCHAR Buffer, _in UINT BufferLength, _in LPOVERLAPPED Overlapped, _refopt PKISO_CONTEXT IsoContext) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_IsoReadPipe + */ + KUSB_IsoReadPipe* IsoReadPipe; + + /*! \fn BOOL KUSB_API IsoWritePipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _in PUCHAR Buffer, _in UINT BufferLength, _in LPOVERLAPPED Overlapped, _refopt PKISO_CONTEXT IsoContext) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_IsoWritePipe + */ + KUSB_IsoWritePipe* IsoWritePipe; + + /*! \fn BOOL KUSB_API GetCurrentFrameNumber (_in KUSB_HANDLE InterfaceHandle, _out PUINT FrameNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetCurrentFrameNumber + */ + KUSB_GetCurrentFrameNumber* GetCurrentFrameNumber; + + /*! \fn BOOL KUSB_API GetOverlappedResult (_in KUSB_HANDLE InterfaceHandle, _in LPOVERLAPPED Overlapped, _out PUINT lpNumberOfBytesTransferred, _in BOOL bWait) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetOverlappedResult + */ + KUSB_GetOverlappedResult* GetOverlappedResult; + + /*! \fn BOOL KUSB_API GetProperty (_in KUSB_HANDLE InterfaceHandle, _in KUSB_PROPERTY PropertyType, _ref PUINT PropertySize, _out PVOID Value) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetProperty + */ + KUSB_GetProperty* GetProperty; + + //! fixed structure padding. + UCHAR z_F_i_x_e_d[512 - sizeof(KUSB_DRIVER_API_INFO) - sizeof(UINT_PTR) * KUSB_FNID_COUNT]; + +} KUSB_DRIVER_API; +typedef KUSB_DRIVER_API* PKUSB_DRIVER_API; +C_ASSERT(sizeof(KUSB_DRIVER_API) == 512); +/**@}*/ +#endif + +#ifndef _LIBUSBK_HOTK_TYPES + +/*! \addtogroup hotk +* @{ +*/ + +//! Hot plug config flags. +typedef enum _KHOT_FLAG +{ + //! No flags (or 0) + KHOT_FLAG_NONE, + + //! Notify all devices which match upon a succuessful call to \ref HotK_Init. + KHOT_FLAG_PLUG_ALL_ON_INIT = 0x0001, + + //! Allow other \ref KHOT_HANDLE instances to consume this match. + KHOT_FLAG_PASS_DUPE_INSTANCE = 0x0002, + + //! If a \c UserHwnd is specified, use \c PostMessage instead of \c SendMessage. + KHOT_FLAG_POST_USER_MESSAGE = 0x0004, +} KHOT_FLAG; + +//! Hot plug event function definition. +typedef VOID KUSB_API KHOT_PLUG_CB( + _in KHOT_HANDLE HotHandle, + _in KLST_DEVINFO_HANDLE DeviceInfo, + _in KLST_SYNC_FLAG PlugType); + +//! Power broadcast event function definition. +typedef VOID KUSB_API KHOT_POWER_BROADCAST_CB( + _in KHOT_HANDLE HotHandle, + _in KLST_DEVINFO_HANDLE DeviceInfo, + _in UINT PbtEvent); + +//! Hot plug parameter structure. +/*! +* \fixedstruct{2048} +* +* This structure is intially passed as a parameter to \ref HotK_Init. +* +*/ +typedef struct _KHOT_PARAMS +{ + //! Hot plug event window handle to send/post messages when notifications occur. + HWND UserHwnd; + + //! WM_USER message start offset used when sending/posting messages, See details. + /*! + * \attention The \ref hotk will send UserMessage+1 for arrival notifications and UserMessage+0 for removal notifications. + * + * - WPARAM = \ref KHOT_HANDLE + * - LPARAM = \ref KLST_DEVINFO_HANDLE + */ + UINT UserMessage; + + //! Additional init/config parameters + KHOT_FLAG Flags; + + //! File pattern matches for restricting notifcations to a single/group or all supported usb devices. + KLST_PATTERN_MATCH PatternMatch; + + //! Hot plug event callback function invoked when notifications occur. + /*! \fn VOID KUSB_API OnHotPlug (_in KHOT_HANDLE HotHandle, _in KLST_DEVINFO_HANDLE DeviceInfo, _in KLST_SYNC_FLAG PlugType) + * \memberof KHOT_PARAMS + */ + KHOT_PLUG_CB* OnHotPlug; + + //! \b WM_POWERBROADCAST event callback function invoked when a power-management event has occurred. + /*! \fn VOID KUSB_API OnPowerBroadcast (_in KHOT_HANDLE HotHandle, _in KLST_DEVINFO_HANDLE DeviceInfo, _in UINT PbtEvent) + * \memberof KHOT_PARAMS + */ + KHOT_POWER_BROADCAST_CB* OnPowerBroadcast; + + //! fixed structure padding. + UCHAR z_F_i_x_e_d[2048 - sizeof(KLST_PATTERN_MATCH) - sizeof(UINT_PTR) * 3 - sizeof(UINT) * 2]; + +} KHOT_PARAMS; +C_ASSERT(sizeof(KHOT_PARAMS) == 2048); + +//! Pointer to a \ref KHOT_PARAMS structure. +typedef KHOT_PARAMS* PKHOT_PARAMS; + +/**@}*/ + +#endif + +#ifndef _LIBUSBK_OVLK_TYPES + +/*! \addtogroup ovlk +* @{ +*/ + +//! \c WaitFlags used by \ref OvlK_Wait. +/*! +* +*/ +typedef enum _KOVL_WAIT_FLAG +{ + //! Do not perform any additional actions upon exiting \ref OvlK_Wait. + KOVL_WAIT_FLAG_NONE = 0L, + + //! If the i/o operation completes successfully, release the OverlappedK back to it's pool. + KOVL_WAIT_FLAG_RELEASE_ON_SUCCESS = 0x0001, + + //! If the i/o operation fails, release the OverlappedK back to it's pool. + KOVL_WAIT_FLAG_RELEASE_ON_FAIL = 0x0002, + + //! If the i/o operation fails or completes successfully, release the OverlappedK back to its pool. Perform no actions if it times-out. + KOVL_WAIT_FLAG_RELEASE_ON_SUCCESS_FAIL = 0x0003, + + //! If the i/o operation times-out cancel it, but do not release the OverlappedK back to its pool. + KOVL_WAIT_FLAG_CANCEL_ON_TIMEOUT = 0x0004, + + //! If the i/o operation times-out, cancel it and release the OverlappedK back to its pool. + KOVL_WAIT_FLAG_RELEASE_ON_TIMEOUT = 0x000C, + + //! Always release the OverlappedK back to its pool. If the operation timed-out, cancel it before releasing back to its pool. + KOVL_WAIT_FLAG_RELEASE_ALWAYS = 0x000F, + + //! Uses alterable wait functions. See http://msdn.microsoft.com/en-us/library/windows/desktop/ms687036%28v=vs.85%29.aspx + KOVL_WAIT_FLAG_ALERTABLE = 0x0010, + +} KOVL_WAIT_FLAG; + +//! \c Overlapped pool config flags. +/*! +* \attention Currently not used. +*/ +typedef enum _KOVL_POOL_FLAG +{ + KOVL_POOL_FLAG_NONE = 0L, +} KOVL_POOL_FLAG; + +/**@}*/ + +#endif + +#ifndef _LIBUSBK_STMK_TYPES + +/*! \addtogroup stmk +* @{ +*/ +//! Stream config flags. +/*! +* \attention Currently not used. +*/ +typedef enum _KSTM_FLAG +{ + //! None + KSTM_FLAG_NONE = 0L, + KSTM_FLAG_NO_PARTIAL_XFERS = 0x00100000, + KSTM_FLAG_USE_TIMEOUT = 0x80000000, + KSTM_FLAG_TIMEOUT_MASK = 0x0001FFFF +} KSTM_FLAG; + +//! Stream config flags. +/*! +* \attention Currently not used. +*/ +typedef enum _KSTM_COMPLETE_RESULT +{ + //! Valid + KSTM_COMPLETE_RESULT_VALID = 0L, + //! Invalid + KSTM_COMPLETE_RESULT_INVALID, +} KSTM_COMPLETE_RESULT; + +//! Stream transfer context structure. +/*! +* This structure is passed into the stream callback functions. +* The stream transfer context list is allocated upon a successful call to \ref StmK_Init. There is one +* transfer context for each transfer. (0 to \c MaxPendingTransfers). +* +*/ +typedef struct _KSTM_XFER_CONTEXT +{ + + //! Internal stream buffer. + PUCHAR Buffer; + + //! Size of internal stream buffer. + INT BufferSize; + + //! Number of bytes to write or number of bytes read. + INT TransferLength; + + //! User defined state. + PVOID UserState; + +} KSTM_XFER_CONTEXT; +//! Pointer to a \ref KSTM_XFER_CONTEXT structure. +typedef KSTM_XFER_CONTEXT* PKSTM_XFER_CONTEXT; + +//! Stream information structure. +/*! +* This structure is passed into the stream callback functions. +* The stream context is allocated upon a successful call to \ref StmK_Init. There is only one +* stream context per stream. +* +*/ +typedef struct _KSTM_INFO +{ + //! \ref KUSB_HANDLE this stream uses. + KUSB_HANDLE UsbHandle; + + //! This parameter corresponds to the bEndpointAddress field in the endpoint descriptor. + UCHAR PipeID; + + //! Maximum transfer read/write request allowed pending. + INT MaxPendingTransfers; + + //! Maximum transfer sage size. + INT MaxTransferSize; + + //! Maximum number of I/O request allowed pending. + INT MaxPendingIO; + + //! Populated with the endpoint descriptor for the specified \c PipeID. + USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; + + //! Populated with the driver api for the specified \c UsbHandle. + KUSB_DRIVER_API DriverAPI; + + //! Populated with the device file handle for the specified \c UsbHandle. + HANDLE DeviceHandle; + + //! Stream handle. + KSTM_HANDLE StreamHandle; + + //! Stream info user defined state. + PVOID UserState; + +} KSTM_INFO; +//! Pointer to a \ref KSTM_INFO structure. +typedef KSTM_INFO* PKSTM_INFO; + +//! Function definition for an optional user-defined callback; executed when a transfer error occurs. +/*! \fn INT KUSB_API KSTM_ERROR_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in INT ErrorCode) +* \memberof KSTM_CALLBACK +*/ +typedef INT KUSB_API KSTM_ERROR_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in INT ErrorCode); + +//! Function definition for an optional user-defined callback; executed to submit a transfer. +/*! \fn INT KUSB_API KSTM_SUBMIT_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in LPOVERLAPPED Overlapped) +* \memberof KSTM_CALLBACK +*/ +typedef INT KUSB_API KSTM_SUBMIT_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in LPOVERLAPPED Overlapped); + +//! Function definition for an optional user-defined callback; executed for each transfer context when the stream is started with \ref StmK_Start. +/*! \fn INT KUSB_API KSTM_STARTED_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex) +* \memberof KSTM_CALLBACK +*/ +typedef INT KUSB_API KSTM_STARTED_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex); + +//! Function definition for an optional user-defined callback; executed for each transfer context when the stream is stopped with \ref StmK_Stop. +/*! \fn INT KUSB_API KSTM_STOPPED_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex) +* \memberof KSTM_CALLBACK +*/ +typedef INT KUSB_API KSTM_STOPPED_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex); + +//! Function definition for an optional user-defined callback; executed when a valid transfer completes. +/*! \fn INT KUSB_API KSTM_COMPLETE_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in INT ErrorCode) +* \memberof KSTM_CALLBACK +*/ +typedef INT KUSB_API KSTM_COMPLETE_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in INT ErrorCode); + +//! Function definition for an optional user-defined callback; executed immediately after a transfer completes. +/*! \fn KSTM_COMPLETE_RESULT KUSB_API KSTM_BEFORE_COMPLETE_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _ref PINT ErrorCode) +* \memberof KSTM_CALLBACK +* +* This callback function allows the user to accept or reject the transfer: +* - IN (Read, DeviceToHost) endpoints. +* - KSTM_COMPLETE_RESULT_VALID +* Continue normal processing; add the transfer to the internal complete list and make it available to \ref StmK_Read. +* - KSTM_COMPLETE_RESULT_INVALID +* Ignore this transfer. +* - OUT (Write, HostToDevice) endpoints. +* - KSTM_COMPLETE_RESULT_VALID +* Continue normal processing; add the transfer to the internal complete list and make it available subsequent \ref StmK_Write requests. +* - KSTM_COMPLETE_RESULT_INVALID +* Return this transfer to the internal queued list for automatic resubmission to the device. +* +*/ +typedef KSTM_COMPLETE_RESULT KUSB_API KSTM_BEFORE_COMPLETE_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in PINT ErrorCode); + +//! Stream callback structure. +/*! +* \fixedstruct{64} +* +* These optional callback functions are executed from the streams internal thread at various stages of operation. +* +*/ +typedef struct _KSTM_CALLBACK +{ + //! Executed when a transfer error occurs. + KSTM_ERROR_CB* Error; + + //! Executed to submit a transfer. + KSTM_SUBMIT_CB* Submit; + + //! Executed when a valid transfer completes. + KSTM_COMPLETE_CB* Complete; + + //! Executed for every transfer context when the stream is started with \ref StmK_Start. + KSTM_STARTED_CB* Started; + + //! Executed for every transfer context when the stream is stopped with \ref StmK_Stop. + KSTM_STOPPED_CB* Stopped; + + //! Executed immediately after a transfer completes. + KSTM_BEFORE_COMPLETE_CB* BeforeComplete; + + //! fixed structure padding. + UCHAR z_F_i_x_e_d[64 - sizeof(UINT_PTR) * 6]; + +} KSTM_CALLBACK; +//! Pointer to a \ref KSTM_CALLBACK structure. +typedef KSTM_CALLBACK* PKSTM_CALLBACK; +C_ASSERT(sizeof(KSTM_CALLBACK) == 64); + +/**@}*/ + +#endif +/////////////////////////////////////////////////////////////////////// +// L I B U S B K PUBLIC FUNCTIONS //////////////////////////////////// +/////////////////////////////////////////////////////////////////////// + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _LIBUSBK_LIBK_FUNCTIONS + /*! \addtogroup libk + * @{ + */ + +//! Gets the internal user context for the specified \ref KLIB_HANDLE. + /*! + * + * \param[out] Version + * Receives the libusbK library verson information. + * + * \returns NONE + */ + KUSB_EXP VOID KUSB_API LibK_GetVersion(_out PKLIB_VERSION Version); + +//! Gets the internal user context for the specified \ref KLIB_HANDLE. + /*! + * + * \param[in] Handle + * The handle containg the context to retrieve. + * + * \param[in] HandleType + * Handle type of \c Handle. + * + * \returns + * - on success, The user context value. + * - On failure, returns NULL and sets last error to \c ERROR_INVALID_HANDLE. + * + */ + KUSB_EXP KLIB_USER_CONTEXT KUSB_API LibK_GetContext( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType); + +//! Sets internal user context for the specified \ref KLIB_HANDLE. + /*! + * + * \param[in] Handle + * The handle containg the context to set. + * + * \param[in] HandleType + * Handle type of \c Handle. + * + * \param[in] ContextValue + * Value to assign to the handle user context space. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_SetContext( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue); + +//! Assigns a cleanup callback function to a \ref KLIB_HANDLE. + /*! + * + * \param[in] Handle + * The handle containg the cleanup callback function to set. + * + * \param[in] HandleType + * Handle type of \c Handle. + * + * \param[in] CleanupCB + * User supplied callback function to execute when the handles internal reference count reaches 0. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_SetCleanupCallback( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_HANDLE_CLEANUP_CB* CleanupCB); + +//! Initialize a driver API set. + /*! + * + * \param[out] DriverAPI + * A driver API structure to populate. + * + * \param[in] DriverID + * The driver id of the API set to retrieve. See \ref KUSB_DRVID + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_LoadDriverAPI( + _out PKUSB_DRIVER_API DriverAPI, + _in INT DriverID); + +//! Copies the driver API set out of a \ref KUSB_HANDLE + /*! + * + * \param[out] DriverAPI + * A driver API structure to populate. + * + * \param[in] UsbHandle + * Handle containing the desired driver API. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_CopyDriverAPI( + _out PKUSB_DRIVER_API DriverAPI, + _in KUSB_HANDLE UsbHandle); + +//! Initialize a driver API function. + /*! + * \param[out] ProcAddress + * Reference to a function pointer that will receive the API function pointer. + * + * \param[in] DriverID + * The driver id of the API to use. See \ref KUSB_DRVID + * + * \param[in] FunctionID + * The function id. See \ref KUSB_FNID + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_GetProcAddress( + _out KPROC* ProcAddress, + _in INT DriverID, + _in INT FunctionID); + +//! Sets the default user context for the specified \ref KLIB_HANDLE_TYPE. + /*! + * + * \param[in] HandleType + * The handle type which will be assigned the default ContextValue. + * + * \param[in] ContextValue + * Value assigned to the default user context for the specified \ref KLIB_HANDLE_TYPE. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_SetDefaultContext( + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue); + +//! Gets the default user context for the specified \ref KLIB_HANDLE_TYPE. + /*! + * + * \param[in] HandleType + * Handle type used to retrieve the default user context. + * + * \returns + * - on success, The default user context value. + * - On failure, returns NULL and sets last error to \c ERROR_INVALID_HANDLE. + * + */ + KUSB_EXP KLIB_USER_CONTEXT KUSB_API LibK_GetDefaultContext( + _in KLIB_HANDLE_TYPE HandleType); + +//! Initializes the global libusbK process context. + /*! + * + * If this function is not called at startup, libusbK initializes the global libusbK process context automatically. + * + * \param[in] Heap + * A handle to the memory heap libusbK will use for dynamic memory allocation. + * \note The process context itself is always allocated from the proccess heap. + * \note If \b Heap is \b NULL, dynamic memory is allocated from the proccess heap. + * + * \param[in] Reserved + * Reserved for future use. Must set to \b NULL. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_Context_Init( + _inopt HANDLE Heap, + _in PVOID Reserved); + +//! Frees the global libusbK process context. + /*! + * + * If this function is not called on exit, libusbK frees the global libusbK process context automatically when it terminates. + * + * \returns NONE. + * + */ + KUSB_EXP VOID KUSB_API LibK_Context_Free(VOID); + + + /**@}*/ +#endif + +#ifndef _LIBUSBK_USBK_FUNCTIONS + /*! \addtogroup usbk + * @{ + */ + +//! Creates/opens a libusbK interface handle from the device list. This is a preferred method. + /*! + * + * \param[out] InterfaceHandle + * Receives a handle configured to the first (default) interface on the device. This handle is required by + * other libusbK routines that perform operations on the default interface. The handle is opaque. To release + * this handle, call the \ref UsbK_Free function. + * + * \param[in] DevInfo + * The device list element to open. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c UsbK_Init performs the same tasks as \ref UsbK_Initialize with the following exceptions: + * - Uses a \ref KLST_DEVINFO instead of a file handle created with the Windows CreateFile() API function. + * - File handles are managed internally and are closed when the last \ref KUSB_HANDLE is closed with + * \ref UsbK_Free. To obtain the internal file device handle, See \ref UsbK_GetProperty. + * + * \note + * A \c KUSB_HANDLE is required by other library routines that perform operations on a device. Once + * initialized, it can access all interfaces/endpoints of a device. An initialized handle can be cloned with + * \ref UsbK_Clone or \ref UsbK_GetAssociatedInterface. A Cloned handle will behave just as the orignal + * except in will maintain it's own \b selected interface setting. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_Init ( + _out KUSB_HANDLE* InterfaceHandle, + _in KLST_DEVINFO_HANDLE DevInfo); + +//! Frees a libusbK interface handle. + /*! + * + * \param[in] InterfaceHandle + * Handle to an interface on the device. This handle must be created by a previous call to \ref UsbK_Init, + * \ref UsbK_Initialize, \ref UsbK_GetAssociatedInterface, or \ref UsbK_Clone. + * + * \returns TRUE. + * + * The \ref UsbK_Free function releases resources alocated to the InterfaceHandle. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_Free ( + _in KUSB_HANDLE InterfaceHandle); + +//! Claims the specified interface by number or index. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] NumberOrIndex + * Interfaces can be claimed or released by a interface index or \c bInterfaceNumber. + * - Interface indexes always start from 0 and continue sequentially for all interfaces of the device. + * - An interface number always represents the actual \ref USB_INTERFACE_DESCRIPTOR::bInterfaceNumber. + * Interface numbers are not guaranteed to be zero based or sequential. + * + * \param[in] IsIndex + * If TRUE, \c NumberOrIndex represents an interface index.\n if FALSE \c NumberOrIndex represents a + * \c bInterfaceNumber. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * Claiming an interface allows applications a way to prevent other applications or multiple instances of the + * same application from using an interface at the same time. + * + * When an interface is claimed with \ref UsbK_ClaimInterface it performs the following actions: + * - Checks if the interface exists. If it does not, returns FALSE and sets last error to + * ERROR_NO_MORE_ITEMS. + * - The default (or current) interface for the device is changed to \c NumberOrIndex. + * - libusb0.sys and libusbK.sys: + * - A request to claim the interface is sent to the driver. If the interface is not claimed or already + * claimed by the application the request succeeds. If the interface is claimed by another application, + * \ref UsbK_ClaimInterface returns FALSE and sets last error to \c ERROR_BUSY. In this case the The + * default (or current) interface for the device is \b still changed to \c NumberOrIndex. + * - WinUSB.sys: All WinUSB device interfaces are claimed when the device is opened. This function performs + * identically to \ref UsbK_SelectInterface + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ClaimInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +//! Releases the specified interface by number or index. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] NumberOrIndex + * Interfaces can be claimed or released by a interface index or \c bInterfaceNumber. + * - Interface indexes always start from 0 and continue sequentially for all interfaces of the device. + * - An interface number always represents the actual \ref USB_INTERFACE_DESCRIPTOR::bInterfaceNumber. + * Interface numbers are not guaranteed to be zero based or sequential. + * + * \param[in] IsIndex + * If TRUE, \c NumberOrIndex represents an interface index.\n if FALSE \c NumberOrIndex represents a + * \c bInterfaceNumber. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * When an interface is release with \ref UsbK_ReleaseInterface it performs the following actions: + * - Checks if the interface exists. If it does not, returns FALSE and sets last error to + * ERROR_NO_MORE_ITEMS. + * - The default (or current) interface for the device is changed to the previously claimed interface. + * - libusb0.sys and libusbK.sys: + * - A request to release the interface is sent to the driver. If the interface is not claimed by a + * different application the request succeeds. If the interface is claimed by another application, + * \ref UsbK_ReleaseInterface returns FALSE and sets last error to \c ERROR_BUSY. In this case, the + * default/current interface for the device is \b still changed to the previously claimed interface. + * - WinUSB.sys: No other action needed, returns TRUE. + * + * \note + * When an interface is released, it is moved to the bottom if an interface stack making a previously claimed + * interface the current. This will continue to occur regardless of whether the interface is claimed. For + * this reason, \ref UsbK_ReleaseInterface can be used as a means to change the current/default interface of + * an \c InterfaceHandle without claiming the interface. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ReleaseInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +//! Sets the alternate setting of the specified interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] NumberOrIndex + * Interfaces can be specified by a interface index or \c bInterfaceNumber. + * - Interface indexes always start from 0 and continue sequentially for all interfaces of the device. + * - An interface number always represents the actual \ref USB_INTERFACE_DESCRIPTOR::bInterfaceNumber. + * Interface numbers are not guaranteed to be zero based or sequential. + * + * \param[in] IsIndex + * If TRUE, \c NumberOrIndex represents an interface index.\n if FALSE \c NumberOrIndex represents a + * \c bInterfaceNumber. + * + * \param[in] AltSettingNumber + * The bAlternateSetting to activate. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \ref UsbK_SetAltInterface performs the same task as \ref UsbK_SetCurrentAlternateSetting except it + * provides the option of specifying which interfaces alternate setting to activate. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _in UCHAR AltSettingNumber); + +//! Gets the alternate setting for the specified interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] NumberOrIndex + * Interfaces can be specified by a interface index or \c bInterfaceNumber. + * - Interface indexes always start from 0 and continue sequentially for all interfaces of the device. + * - An interface number always represents the actual \ref USB_INTERFACE_DESCRIPTOR::bInterfaceNumber. + * Interface numbers are not guaranteed to be zero based or sequential. + * + * \param[in] IsIndex + * If TRUE, \c NumberOrIndex represents an interface index.\n if FALSE \c NumberOrIndex represents a + * \c bInterfaceNumber. + * + * \param[out] AltSettingNumber + * On success, returns the active bAlternateSetting. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \ref UsbK_GetAltInterface performs the same task as \ref UsbK_GetCurrentAlternateSetting except it + * provides the option of specifying which interfaces alternate setting is to be retrieved. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _out PUCHAR AltSettingNumber); + +//! Gets the requested descriptor. This is a synchronous operation. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] DescriptorType + * A value that specifies the type of descriptor to return. This parameter corresponds to the bDescriptorType + * field of a standard device descriptor, whose values are described in the Universal Serial Bus + * specification. + * + * \param[in] Index + * The descriptor index. For an explanation of the descriptor index, see the Universal Serial Bus + * specification (www.usb.org). + * + * \param[in] LanguageID + * A value that specifies the language identifier, if the requested descriptor is a string descriptor. + * + * \param[out] Buffer + * A caller-allocated buffer that receives the requested descriptor. + * + * \param[in] BufferLength + * The length, in bytes, of Buffer. + * + * \param[out] LengthTransferred + * The number of bytes that were copied into Buffer. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * If the device descriptor or active config descriptor is requested, \ref UsbK_GetDescriptor retrieves + * cached data and this becomes a non-blocking, non I/O request. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetDescriptor ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR DescriptorType, + _in UCHAR Index, + _in USHORT LanguageID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred); + +//! Transmits control data over a default control endpoint. + /*! + * + * \param[in] InterfaceHandle + * A valid libusbK interface handle returned by: + * - \ref UsbK_Init + * - \ref UsbK_Initialize + * - \ref UsbK_GetAssociatedInterface + * - \ref UsbK_Clone + * + * \param[in] SetupPacket + * The 8-byte setup packet of type WINUSB_SETUP_PACKET. + * + * \param[in,out] Buffer + * A caller-allocated buffer that contains the data to transfer. + * + * \param[in] BufferLength + * The number of bytes to transfer, not including the setup packet. This number must be less than or equal to + * the size, in bytes, of Buffer. + * + * \param[out] LengthTransferred + * A pointer to a UINT variable that receives the actual number of transferred bytes. If the application + * does not expect any data to be transferred during the data phase (BufferLength is zero), LengthTransferred + * can be NULL. + * + * \param[in] Overlapped + * An optional pointer to an OVERLAPPED structure, which is used for asynchronous operations. If this + * parameter is specified, \ref UsbK_ControlTransfer immediately returns, and the event is signaled when the + * operation is complete. If Overlapped is not supplied, the \ref UsbK_ControlTransfer function transfers + * data synchronously. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. If an + * \c Overlapped member is supplied and the operation succeeds this function returns FALSE and sets last + * error to ERROR_IO_PENDING. + * + * A \ref UsbK_ControlTransfer is never cached. These requests always go directly to the usb device. + * + * \attention + * This function should not be used for operations supported by the library.\n e.g. + * \ref UsbK_SetConfiguration, \ref UsbK_SetAltInterface, etc.. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ControlTransfer ( + _in KUSB_HANDLE InterfaceHandle, + _in WINUSB_SETUP_PACKET SetupPacket, + _refopt PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +//! Sets the power policy for a device. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PolicyType + * A value that specifies the power policy to set. The following table describes symbolic constants that are + * defined in \ref lusbk_shared.h. + * + * - AUTO_SUSPEND (0x81) + * - Specifies the auto-suspend policy type; the power policy parameter must be specified by the caller in + * the Value parameter. + * - For auto-suspend, the Value parameter must point to a UCHAR variable. + * - If Value is TRUE (nonzero), the USB stack suspends the device if the device is idle. A device is idle + * if there are no transfers pending, or if the only pending transfers are IN transfers to interrupt or + * bulk endpoints. + * - The default value is determined by the value set in the DefaultIdleState registry setting. By default, + * this value is TRUE. + * + * - SUSPEND_DELAY (0x83) + * - Specifies the suspend-delay policy type; the power policy parameter must be specified by the caller in + * the Value parameter. + * - For suspend-delay, Value must point to a UINT variable. + * - Value specifies the minimum amount of time, in milliseconds, that the driver must wait post transfer + * before it can suspend the device. + * - The default value is determined by the value set in the DefaultIdleTimeout registry setting. By + * default, this value is five seconds. + * + * \param[in] ValueLength + * The size, in bytes, of the buffer at Value. + * + * \param[in] Value + * The new value for the power policy parameter. Data type and value for Value depends on the type of power + * policy passed in PolicyType. For more information, see PolicyType. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * The following list summarizes the effects of changes to power management states: + * - All pipe handles, interface handles, locks, and alternate settings are preserved across power management + * events. + * - Any transfers that are in progress are suspended when a device transfers to a low power state, and they + * are resumed when the device is restored to a working state. + * - The device and system must be in a working state before the client can restore a device-specific + * configuration. Clients can determine whether the device and system are in a working state from the + * WM_POWERBROADCAST message. + * - The client can indicate that an interface is idle by calling \ref UsbK_SetPowerPolicy. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +//! Gets the power policy for a device. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PolicyType + * A value that specifies the power policy parameter to retrieve in Value. The following table describes + * symbolic constants that are defined in \ref lusbk_shared.h. + * + * - AUTO_SUSPEND (0x81) + * - If the caller specifies a power policy of AUTO_SUSPEND, \ref UsbK_GetPowerPolicy returns the value of + * the auto suspend policy parameter in the Value parameter. + * - If Value is TRUE (that is, nonzero), the USB stack suspends the device when no transfers are pending + * or the only transfers pending are IN transfers on an interrupt or bulk endpoint. + * - The value of the DefaultIdleState registry value determines the default value of the auto suspend + * policy parameter. + * - The Value parameter must point to a UCHAR variable. + * + * - SUSPEND_DELAY (0x83) + * - If the caller specifies a power policy of SUSPEND_DELAY, \ref UsbK_GetPowerPolicy returns the value of + * the suspend delay policy parameter in Value. + * - The suspend delay policy parameter specifies the minimum amount of time, in milliseconds, that the + * driver must wait after any transfer before it can suspend the device. + * - Value must point to a UINT variable. + * + * \param[in,out] ValueLength + * A pointer to the size of the buffer that Value. On output, ValueLength receives the size of the data that + * was copied into the Value buffer. + * + * \param[out] Value + * A buffer that receives the specified power policy parameter. For more information, see PolicyType. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +//! Sets the device configuration number. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] ConfigurationNumber + * The configuration number to activate. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \ref UsbK_SetConfiguration is only supported with libusb0.sys. If the driver in not libusb0.sys, this + * function performs the following emulation actions: + * - If the requested configuration number is the current configuration number, returns TRUE. + * - If the requested configuration number is one other than the current configuration number, returns FALSE + * and set last error to \c ERROR_NO_MORE_ITEMS. + * + * This function will fail if there are pending I/O operations or there are other libusbK interface handles + * referencing the device. \sa UsbK_Free + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR ConfigurationNumber); + +//! Gets the device current configuration number. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[out] ConfigurationNumber + * On success, receives the active configuration number. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR ConfigurationNumber); + +//! Resets the usb device of the specified interface handle. (port cycle). + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ResetDevice ( + _in KUSB_HANDLE InterfaceHandle); + +//! Creates a libusbK handle for the device specified by a file handle. + /*! + * + * \attention + * This function is supported for WinUSB API compatibility only and is not intended for new development. + * libusbK library users should use \ref UsbK_Init instead. (regardless of the driver they've selected) + * + * \param[in] DeviceHandle + * The handle to the device that CreateFile returned. libusbK uses overlapped I/O, so FILE_FLAG_OVERLAPPED + * must be specified in the dwFlagsAndAttributes parameter of CreateFile call for DeviceHandle to have the + * characteristics necessary for this to function properly. + * + * \param[out] InterfaceHandle + * Receives a handle configured to the first (default) interface on the device. This handle is required by + * other libusbK routines that perform operations on the default interface. The handle is opaque. To release + * this handle, call the \ref UsbK_Free function. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * When \ref UsbK_Initialize is called, the policy settings of the interface are reset to the default values. + * + * The \ref UsbK_Initialize call queries the underlying USB stack for various descriptors and allocates + * enough memory to store the retrieved descriptor data. + * + * \ref UsbK_Initialize first retrieves the device descriptor and then gets the associated configuration + * descriptor. From the configuration descriptor, the call derives the associated interface descriptors and + * stores them in an array. The interfaces in the array are identified by zero-based indexes. An index value + * of 0 indicates the first interface (the default interface), a value of 1 indicates the second associated + * interface, and so on. \ref UsbK_Initialize parses the default interface descriptor for the endpoint + * descriptors and caches information such as the associated pipes or state specific data. The handle + * received in the InterfaceHandle parameter will have its default interface configured to the first + * interface in the array. + * + * If an application wants to use another interface on the device, it can call + * \ref UsbK_GetAssociatedInterface, or \ref UsbK_ClaimInterface. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_Initialize ( + _in HANDLE DeviceHandle, + _out KUSB_HANDLE* InterfaceHandle); + +//! Selects the specified interface by number or index as the current interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] NumberOrIndex + * Interfaces can be claimed or released by a interface index or \c bInterfaceNumber. + * - Interface indexes always start from 0 and continue sequentially for all interfaces of the device. + * - An interface number always represents the actual \ref USB_INTERFACE_DESCRIPTOR::bInterfaceNumber. + * Interface numbers are not guaranteed to be zero based or sequential. + * + * \param[in] IsIndex + * If TRUE, \c NumberOrIndex represents an interface index.\n if FALSE \c NumberOrIndex represents a + * \c bInterfaceNumber. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \sa UsbK_ClaimInterface + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SelectInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +//! Retrieves a handle for an associated interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] AssociatedInterfaceIndex + * An index that specifies the associated interface to retrieve. A value of 0 indicates the first associated + * interface, a value of 1 indicates the second associated interface, and so on. + * + * \param[out] AssociatedInterfaceHandle + * A handle for the associated interface. Callers must pass this interface handle to libusbK Functions + * exposed by libusbK.dll. To close this handle, call \ref UsbK_Free. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * The \ref UsbK_GetAssociatedInterface function retrieves an opaque handle for an associated interface. This + * is a synchronous operation. + * + * The first associated interface is the interface that immediately follows the current (or default) + * interface of the specified /c InterfaceHandle. + * + * The handle that \ref UsbK_GetAssociatedInterface returns must be released by calling \ref UsbK_Free. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetAssociatedInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AssociatedInterfaceIndex, + _out KUSB_HANDLE* AssociatedInterfaceHandle); + +//! Clones the specified interface handle. + /*! + * + * Each cloned interface handle maintains it's own selected interface. + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[out] DstInterfaceHandle + * On success, the cloned return handle. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_Clone ( + _in KUSB_HANDLE InterfaceHandle, + _out KUSB_HANDLE* DstInterfaceHandle); + +//! Retrieves the interface descriptor for the specified alternate interface settings for a particular interface handle. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] AltSettingIndex + * A value that indicates which alternate setting index to return. A value of 0 indicates the first alternate + * setting, a value of 1 indicates the second alternate setting, and so on. + * + * \param[out] UsbAltInterfaceDescriptor + * A pointer to a caller-allocated \ref USB_INTERFACE_DESCRIPTOR structure that contains information about + * the interface that AltSettingNumber specified. + * + * The \ref UsbK_QueryInterfaceSettings call searches the current/default interface array for the alternate + * interface specified by the caller in the AltSettingIndex. If the specified alternate interface is found, + * the function populates the caller-allocated USB_INTERFACE_DESCRIPTOR structure. If the specified alternate + * interface is not found, then the call fails with the ERROR_NO_MORE_ITEMS code. + * + * To change the current/default interface, see \ref UsbK_SelectInterface and \ref UsbK_ClaimInterface + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_QueryInterfaceSettings ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingIndex, + _out PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor); + +//! Retrieves information about the physical device that is associated with a libusbK handle. + /*! + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] InformationType + * A value that specifies which interface information value to retrieve. On input, InformationType must have + * the following value: \c DEVICE_SPEED (0x01). + * + * \param[in,out] BufferLength + * The maximum number of bytes to read. This number must be less than or equal to the size, in bytes, of + * Buffer. On output, BufferLength is set to the actual number of bytes that were copied into Buffer. + * + * \param[in,out] Buffer + * A caller-allocated buffer that receives the requested value. On output, Buffer indicates the device speed: + * - (0x01) low/full speed device. + * - (0x03) high speed device. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_QueryDeviceInformation ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT InformationType, + _ref PUINT BufferLength, + _ref PVOID Buffer); + +//! Sets the alternate setting of an interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] AltSettingNumber + * The value that is contained in the bAlternateSetting member of the \ref USB_INTERFACE_DESCRIPTOR + * structure. This structure can be populated by the \ref UsbK_QueryInterfaceSettings routine. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * Sets the active bAlternateSetting for the current/default interface. + * + * To change the default/current interface see \ref UsbK_ClaimInterface and \ref UsbK_ReleaseInterface + * \sa UsbK_SetAltInterface + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber); + +//! Gets the current alternate interface setting for an interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[out] AltSettingNumber + * A pointer to an unsigned character that receives an integer that indicates the current alternate setting. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * Gets the active bAlternateSetting for the current/default interface. + * + * To change the default/current interface see \ref UsbK_ClaimInterface and \ref UsbK_ReleaseInterface + * \sa UsbK_GetAltInterface + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR AltSettingNumber); + +//! Retrieves information about a pipe that is associated with an interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] AltSettingNumber + * A value that specifies the alternate interface to return the information for. + * + * \param[in] PipeIndex + * A value that specifies the pipe to return information about. This value is not the same as the + * bEndpointAddress field in the endpoint descriptor. A PipeIndex value of 0 signifies the first endpoint + * that is associated with the interface, a value of 1 signifies the second endpoint, and so on. PipeIndex + * must be less than the value in the bNumEndpoints field of the interface descriptor. + * + * \param[out] PipeInformation + * A pointer, on output, to a caller-allocated \ref WINUSB_PIPE_INFORMATION structure that contains pipe + * information. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * The \ref UsbK_QueryPipe function does not retrieve information about the control pipe. + * + * Each interface on the USB device can have multiple endpoints. To communicate with each of these endpoints, + * the bus driver creates pipes for each endpoint on the interface. The pipe indices are zero-based. + * Therefore for n number of endpoints, the pipes' indices are set from n-1. \ref UsbK_QueryPipe parses the + * configuration descriptor to get the interface specified by the caller. It searches the interface + * descriptor for the endpoint descriptor associated with the caller-specified pipe. If the endpoint is + * found, the function populates the caller-allocated \ref WINUSB_PIPE_INFORMATION structure with information + * from the endpoint descriptor. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_QueryPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber, + _in UCHAR PipeIndex, + _out PWINUSB_PIPE_INFORMATION PipeInformation); + +//! Sets the policy for a specific pipe associated with an endpoint on the device. This is a synchronous operation. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[in] PolicyType + * A UINT variable that specifies the policy parameter to change. The Value parameter contains the new value + * for the policy parameter. See the remarks section for information about each of the pipe policies and the + * resulting behavior. + * + * \param[in] ValueLength + * The size, in bytes, of the buffer at Value. + * + * \param[in] Value + * The new value for the policy parameter that PolicyType specifies. The size of this input parameter depends + * on the policy to change. For information about the size of this parameter, see the description of the + * PolicyType parameter. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * The following list describes symbolic constants that are defined in \ref lusbk_shared.h + * + * - \c SHORT_PACKET_TERMINATE (0x01) + * - The default value is \c FALSE. + * - To enable \c SHORT_PACKET_TERMINATE, in Value pass the address of a caller-allocated \c UCHAR variable + * set to \c TRUE (nonzero). + * - Enabling \c SHORT_PACKET_TERMINATE causes the driver to send a zero-length packet at the end of every + * write request to the host controller. + * + * - \c AUTO_CLEAR_STALL (0x02) + * - The default value is \c FALSE. To enable \c AUTO_CLEAR_STALL, in Value pass the address of a + * caller-allocated \c UCHAR variable set to \c TRUE (nonzero). + * - Enabling \c AUTO_CLEAR_STALL causes libusbK to reset the pipe in order to automatically clear the + * stall condition. Data continues to flow on the bulk and interrupt \c IN endpoints again as soon as a + * new or a queued transfer arrives on the endpoint. This policy parameter does not affect control pipes. + * - Disabling \c AUTO_CLEAR_STALL causes all transfers (that arrive to the endpoint after the stalled + * transfer) to fail until the caller manually resets the endpoint's pipe by calling \ref UsbK_ResetPipe. + * + * - \c PIPE_TRANSFER_TIMEOUT (0x03) + * - The default value is zero. To set a time-out value, in Value pass the address of a caller-allocated + * \c UINT variable that contains the time-out interval. + * - The \c PIPE_TRANSFER_TIMEOUT value specifies the time-out interval, in milliseconds. The host + * controller cancels transfers that do not complete within the specified time-out interval. + * - A value of zero (default) indicates that transfers do not time out because the host controller never + * cancels the transfer. + * + * - \c IGNORE_SHORT_PACKETS (0x04) + * - The default value is \c FALSE. To enable \c IGNORE_SHORT_PACKETS, in Value pass the address of a + * caller-allocated \c UCHAR variable set to \c TRUE (nonzero). + * - Enabling \c IGNORE_SHORT_PACKETS causes the host controller to not complete a read operation after it + * receives a short packet. Instead, the host controller completes the operation only after the host has + * read the specified number of bytes. + * - Disabling \c IGNORE_SHORT_PACKETS causes the host controller to complete a read operation when either + * the host has read the specified number of bytes or the host has received a short packet. + * + * - \c ALLOW_PARTIAL_READS (0x05) + * - The default value is \c TRUE (nonzero). To disable \c ALLOW_PARTIAL_READS, in Value pass the address + * of a caller-allocated \c UCHAR variable set to \c FALSE (zero). + * - Disabling \c ALLOW_PARTIAL_READS causes the read requests to fail whenever the device returns more + * data (on bulk and interrupt \c IN endpoints) than the caller requested. + * - Enabling \c ALLOW_PARTIAL_READS causes libusbK to save or discard the extra data when the device + * returns more data (on bulk and interrupt \c IN endpoints) than the caller requested. This behavior is + * defined by setting the \c AUTO_FLUSH value. + * + * - \c AUTO_FLUSH (0x06) + * - The default value is \c FALSE (zero). To enable \c AUTO_FLUSH, in Value pass the address of a + * caller-allocated \c UCHAR variable set to \c TRUE (nonzero). + * - \c AUTO_FLUSH must be used with \c ALLOW_PARTIAL_READS enabled. If \c ALLOW_PARTIAL_READS is \c TRUE, + * the value of \c AUTO_FLUSH determines the action taken by libusbK when the device returns more data + * than the caller requested. + * - Disabling \c ALLOW_PARTIAL_READS causes libusbK to ignore the \c AUTO_FLUSH value. + * - Disabling \c AUTO_FLUSH with \c ALLOW_PARTIAL_READS enabled causes libusbK to save the extra data, add + * the data to the beginning of the caller's next read request, and send it to the caller in the next + * read operation. + * - Enabling \c AUTO_FLUSH with \c ALLOW_PARTIAL_READS enabled causes libusbK to discard the extra data + * remaining from the read request. + * + * - \c RAW_IO (0x07) + * - The default value is \c FALSE (zero). To enable \c RAW_IO, in Value pass the address of a + * caller-allocated \c UCHAR variable set to \c TRUE (nonzero). + * - Enabling \c RAW_IO causes libusbK to send data directly to the \c USB driver stack, bypassing + * libusbK's queuing and error handling mechanism. + * - The buffers that are passed to \ref UsbK_ReadPipe must be configured by the caller as follows: + * - The buffer length must be a multiple of the maximum endpoint packet size. + * - The length must be less than or equal to the value of \c MAXIMUM_TRANSFER_SIZE retrieved by + * \ref UsbK_GetPipePolicy. + * - Disabling \c RAW_IO (\c FALSE) does not impose any restriction on the buffers that are passed to + * \ref UsbK_ReadPipe. + * + * - \c RESET_PIPE_ON_RESUME (0x09) + * - The default value is \c FALSE (zero). To enable \c RESET_PIPE_ON_RESUME, in Value pass the address of + * a caller-allocated \c UCHAR variable set to \c TRUE (nonzero). + * - \c TRUE (or a nonzero value) indicates that on resume from suspend, libusbK resets the endpoint before + * it allows the caller to send new requests to the endpoint. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +//! Gets the policy for a specific pipe (endpoint). + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[in] PolicyType + * A UINT variable that specifies the policy parameter to retrieve. The current value for the policy + * parameter is retrieved the Value parameter. + * + * \param[in,out] ValueLength + * A pointer to the size, in bytes, of the buffer that Value points to. On output, ValueLength receives the + * size, in bytes, of the data that was copied into the Value buffer. + * + * \param[out] Value + * A pointer to a buffer that receives the specified pipe policy value. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +//! Reads data from the specified pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[out] Buffer + * A caller-allocated buffer that receives the data that is read. + * + * \param[in] BufferLength + * The maximum number of bytes to read. This number must be less than or equal to the size, in bytes, of + * Buffer. + * + * \param[out] LengthTransferred + * A pointer to a UINT variable that receives the actual number of bytes that were copied into Buffer. For + * more information, see Remarks. + * + * \param[in] Overlapped + * An optional pointer to an overlapped structure for asynchronous operations. This can be a \ref KOVL_HANDLE + * or a pointer to a standard windows OVERLAPPED structure. If this parameter is specified, \c UsbK_ReadPipe + * returns immediately rather than waiting synchronously for the operation to complete before returning. An + * event is signaled when the operation is complete. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +//! Writes data to a pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[in] Buffer + * A caller-allocated buffer the data is written from. + * + * \param[in] BufferLength + * The maximum number of bytes to write. This number must be less than or equal to the size, in bytes, of + * Buffer. + * + * \param[out] LengthTransferred + * A pointer to a UINT variable that receives the actual number of bytes that were transferred from Buffer. + * For more information, see Remarks. + * + * \param[in] Overlapped + * An optional pointer to an overlapped structure for asynchronous operations. This can be a \ref KOVL_HANDLE + * or a pointer to a standard windows OVERLAPPED structure. If this parameter is specified, \c UsbK_WritePipe + * returns immediately rather than waiting synchronously for the operation to complete before returning. An + * event is signaled when the operation is complete. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_WritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +//! Resets the data toggle and clears the stall condition on a pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ResetPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +//! Aborts all of the pending transfers for a pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_AbortPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +//! Discards any data that is cached in a pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_FlushPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +//! Reads from an isochronous pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[out] Buffer + * A caller-allocated buffer that receives the data that is read. + * + * \param[in] BufferLength + * The maximum number of bytes to read. This number must be less than or equal to the size, in bytes, of + * Buffer. + * + * \param[in] Overlapped + * A \b required pointer to an overlapped structure for asynchronous operations. This can be a + * \ref KOVL_HANDLE or a pointer to a standard windows OVERLAPPED structure. If this parameter is specified, + * \c UsbK_IsoReadPipe returns immediately rather than waiting synchronously for the operation to complete + * before returning. An event is signaled when the operation is complete. + * + * \param[in,out] IsoContext + * Pointer to an isochronous transfer context created with \ref IsoK_Init. If \c IsoContext is NULL, + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \par Overlapped I/O considerations + * If an \c Overlapped parameter is specified and the transfer is submitted successfully, the function + * returns \b FALSE and sets last error to \c ERROR_IO_PENDING. When using overlapped I/O, users may ignore + * the return results of this function and instead use the return results from one of the \ref ovlk wait + * functions or from \ref UsbK_GetOverlappedResult. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_IsoReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +//! Writes to an isochronous pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[in] Buffer + * A caller-allocated buffer that receives the data that is read. + * + * \param[in] BufferLength + * The maximum number of bytes to write. This number must be less than or equal to the size, in bytes, of + * Buffer. + * + * \param[in] Overlapped + * An optional pointer to an overlapped structure for asynchronous operations. This can be a \ref KOVL_HANDLE + * or a pointer to a standard windows OVERLAPPED structure. If this parameter is specified, + * \c UsbK_IsoWritePipe returns immediately rather than waiting synchronously for the operation to complete + * before returning. An event is signaled when the operation is complete. + * + * \param[in,out] IsoContext + * Pointer to an isochronous transfer context created with \ref IsoK_Init. See remarks below. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_IsoWritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +//! Retrieves the current USB frame number. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[out] FrameNumber + * A pointer to a location that receives the current 32-bit frame number on the USB bus (from the host + * controller driver). + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetCurrentFrameNumber ( + _in KUSB_HANDLE InterfaceHandle, + _out PUINT FrameNumber); + +//! Retrieves the results of an overlapped operation on the specified libusbK handle. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] Overlapped + * A pointer to a standard windows OVERLAPPED structure that was specified when the overlapped operation was + * started. + * + * \param[out] lpNumberOfBytesTransferred + * A pointer to a variable that receives the number of bytes that were actually transferred by a read or + * write operation. + * + * \param[in] bWait + * If this parameter is TRUE, the function does not return until the operation has been completed. If this + * parameter is FALSE and the operation is still pending, the function returns FALSE and the GetLastError + * function returns ERROR_IO_INCOMPLETE. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * This function is like the Win32 API routine, GetOverlappedResult, with one difference; instead of passing + * a file handle that is returned from CreateFile, the caller passes an interface handle that is returned + * from \ref UsbK_Initialize, \ref UsbK_Init, or \ref UsbK_GetAssociatedInterface. The caller can use either + * API routine, if the appropriate handle is passed. The \ref UsbK_GetOverlappedResult function extracts the + * file handle from the interface handle and then calls GetOverlappedResult. \n + * + * The results that are reported by the \ref UsbK_GetOverlappedResult function are those from the specified + * handle's last overlapped operation to which the specified standard windows OVERLAPPED structure was + * provided, and for which the operation's results were pending. A pending operation is indicated when the + * function that started the operation returns FALSE, and the GetLastError routine returns ERROR_IO_PENDING. + * When an I/O operation is pending, the function that started the operation resets the hEvent member of the + * standard windows OVERLAPPED structure to the nonsignaled state. Then when the pending operation has been + * completed, the system sets the event object to the signaled state. \n + * + * The caller can specify that an event object is manually reset in the standard windows OVERLAPPED + * structure. If an automatic reset event object is used, the event handle must not be specified in any other + * wait operation in the interval between starting the overlapped operation and the call to + * \ref UsbK_GetOverlappedResult. For example, the event object is sometimes specified in one of the wait + * routines to wait for the operation to be completed. When the wait routine returns, the system sets an + * auto-reset event's state to nonsignaled, and a successive call to \ref UsbK_GetOverlappedResult with the + * bWait parameter set to TRUE causes the function to be blocked indefinitely. + * + * If the bWait parameter is TRUE, \ref UsbK_GetOverlappedResult determines whether the pending operation has + * been completed by waiting for the event object to be in the signaled state. + * + * If the hEvent member of the standard windows OVERLAPPED structure is NULL, the system uses the state of + * the file handle to signal when the operation has been completed. Do not use file handles for this purpose. + * It is better to use an event object because of the confusion that can occur when multiple concurrent + * overlapped operations are performed on the same file. In this situation, you cannot know which operation + * caused the state of the object to be signaled. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetOverlappedResult ( + _in KUSB_HANDLE InterfaceHandle, + _in LPOVERLAPPED Overlapped, + _out PUINT lpNumberOfBytesTransferred, + _in BOOL bWait); + +//! Gets a USB device (driver specific) property from usb handle. + /*! + * + * \param[in] InterfaceHandle + * USB handle of the property to retrieve. + * + * \param[in] PropertyType + * The propety type to retrieve. + * + * \param[in,out] PropertySize + * Size in bytes of \c Value. + * + * \param[out] Value + * On success, receives the proprty data. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetProperty ( + _in KUSB_HANDLE InterfaceHandle, + _in KUSB_PROPERTY PropertyType, + _ref PUINT PropertySize, + _out PVOID Value); + + /*! @} */ + + +#endif + +#ifndef _LIBUSBK_LSTK_FUNCTIONS + /*! \addtogroup lstk + *@{ + */ + +//! Initializes a new usb device list containing all supported devices. + /*! + * + * \param[out] DeviceList + * Pointer reference that will receive a populated device list. + * + * \param[in] Flags + * Search, filter, and listing options. see \c KLST_FLAG + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c LstK_Init populates \c DeviceList with connected usb devices that can be used by libusbK. + * + * \note if \ref LstK_Init returns TRUE, the device list must be freed with \ref LstK_Free when it is no + * longer needed. + * + */ + KUSB_EXP BOOL KUSB_API LstK_Init( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags); + +//! Initializes a new usb device list containing only devices matching a specific class GUID. + /*! + * + * \param[out] DeviceList + * Pointer reference that will receive a populated device list. + * + * \param[in] Flags + * Search, filter, and listing options. see \c KLST_FLAG + * + * \param[in] PatternMatch + * Pattern Search filter. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c LstK_InitEx populates \c DeviceList with usb devices that can be used by libusbK. Only device + * matching the \ref KLST_PATTERN_MATCH string are included in the list. + * + * \note + * This function significantly improves performance when used with a device interface guid pattern patch. + * + * \note if \ref LstK_InitEx returns TRUE, the device list must be freed with \ref LstK_Free when it it's no + * longer needed. + * + */ + KUSB_EXP BOOL KUSB_API LstK_InitEx( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags, + _in PKLST_PATTERN_MATCH PatternMatch); + + //! Frees a usb device list. + /*! + * + * \note if \ref LstK_Init returns TRUE, the device list must be freed with \ref LstK_Free when it is no + * longer needed. + * + * \param[in] DeviceList + * The \c DeviceList to free. + * + * \returns NONE + * + * Frees all resources that were allocated to \c DeviceList by \ref LstK_Init. + * + */ + KUSB_EXP BOOL KUSB_API LstK_Free( + _in KLST_HANDLE DeviceList); + +//! Enumerates \ref KLST_DEVINFO elements of a \ref KLST_HANDLE. + /*! + * + * \param[in] DeviceList + * The \c DeviceList to enumerate. + * + * \param[in] EnumDevListCB + * Function to call for each iteration. + * + * \param[in] Context + * Optional user context pointer. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * Calls \c EnumDevListCB for each element in the device list or until \c EnumDevListCB returns FALSE. + * + */ + KUSB_EXP BOOL KUSB_API LstK_Enumerate( + _in KLST_HANDLE DeviceList, + _in KLST_ENUM_DEVINFO_CB* EnumDevListCB, + _inopt PVOID Context); + +//! Gets the \ref KLST_DEVINFO element for the current position. + /*! + * + * \param[in] DeviceList + * The \c DeviceList to retrieve a current \ref KLST_DEVINFO for. + * + * \param[out] DeviceInfo + * The device information. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * After a \c DeviceList is created or after the \ref LstK_MoveReset method is called, the \c LstK_MoveNext + * method must be called to advance the device list enumerator to the first element of the \c DeviceList + * before calling \c LstK_Current otherwise, \c DeviceInfo is undefined. + * + * \c LstK_Current returns \c FALSE and sets last error to \c ERROR_NO_MORE_ITEMS if the last call to + * \c LstK_MoveNext returned \c FALSE, which indicates the end of the \c DeviceList. + * + * \c LstK_Current does not move the position of the device list enumerator, and consecutive calls to + * \c LstK_Current return the same object until either \c LstK_MoveNext or \ref LstK_MoveReset is called. + * + */ + KUSB_EXP BOOL KUSB_API LstK_Current( + _in KLST_HANDLE DeviceList, + _out KLST_DEVINFO_HANDLE* DeviceInfo); + +//! Advances the device list current \ref KLST_DEVINFO position. + /*! + * \param[in] DeviceList + * A usb device list returned by \ref LstK_Init + * + * \param[out] DeviceInfo + * On success, contains a pointer to the device information for the current enumerators position. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * After a \c DeviceList is created or after \ref LstK_MoveReset is called, an enumerator is positioned + * before the first element of the \c DeviceList and the \b first call to \c LstK_MoveNext moves the + * enumerator over the first element of the \c DeviceList. + * + * If \c LstK_MoveNext passes the end of the \c DeviceList, the enumerator is positioned after the last + * element in the \c DeviceList and \c LstK_MoveNext returns \c FALSE. When the enumerator is at this + * position, a subsequent call to \c LstK_MoveNext will reset the enumerator and it continues from the + * beginning. + * + */ + KUSB_EXP BOOL KUSB_API LstK_MoveNext( + _in KLST_HANDLE DeviceList, + _outopt KLST_DEVINFO_HANDLE* DeviceInfo); + +//! Sets the device list to its initial position, which is before the first element in the list. + /*! + * + * \param[in] DeviceList + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP VOID KUSB_API LstK_MoveReset( + _in KLST_HANDLE DeviceList); + +//! Find a device by vendor and product id + /*! + * + * \param[in] DeviceList + * The \c DeviceList to retrieve a current \ref KLST_DEVINFO for. + * + * \param[in] Vid + * ID is used in conjunction with the \c Pid to uniquely identify USB devices, providing traceability to the + * OEM. + * + * \param[in] Pid + * ID is used in conjunction with the \c Pid to uniquely identify USB devices, providing traceability to the + * OEM. + * + * \param[out] DeviceInfo + * On success, the device information pointer, otherwise NULL. + * + * \returns + * - TRUE if the device was found + * - FALSE if the device was \b not found or an error occurred. + * - Sets last error to \c ERROR_NO_MORE_ITEMS if the device was \b not found. + * + * Searches all elements in \c DeviceList for usb device matching the specified. + * + */ + KUSB_EXP BOOL KUSB_API LstK_FindByVidPid( + _in KLST_HANDLE DeviceList, + _in INT Vid, + _in INT Pid, + _out KLST_DEVINFO_HANDLE* DeviceInfo); + +//! Counts the number of device info elements in a device list. + /*! + * + * \param[in] DeviceList + * The deice list to count. + * + * \param[in,out] Count + * On success, receives the number of \ref KLST_DEVINFO elements in the list. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LstK_Count( + _in KLST_HANDLE DeviceList, + _ref PUINT Count); + + + /**@}*/ + +#endif + +#ifndef _LIBUSBK_HOTK_FUNCTIONS + /*! \addtogroup hotk + * @{ + */ + +//! Creates a new hot-plug handle for USB device arrival/removal event monitoring. + /*! + * + * \param[out] Handle + * Reference to a handle pointer that will receive the initialized hot-plug handle. + * + * \param[in,out] InitParams + * Hot plug handle initialization structure. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API HotK_Init( + _out KHOT_HANDLE* Handle, + _ref PKHOT_PARAMS InitParams); + +//! Frees the specified hot-plug handle. + /*! + * + * \param[in] Handle + * hot-plug handle pointer to free. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API HotK_Free( + _in KHOT_HANDLE Handle); + + //! Frees all hot-plug handles initialized with \ref HotK_Init. + /*! + * + */ + KUSB_EXP VOID KUSB_API HotK_FreeAll(VOID); + + /**@}*/ + +#endif + +#ifndef _LIBUSBK_OVLK_FUNCTIONS + /*! \addtogroup ovlk + * @{ + */ + +//! Gets a preallocated \c OverlappedK structure from the specified/default pool. + /*! + * + * \param[out] OverlappedK + * On Success, receives the overlapped handle. + * + * \param[in] PoolHandle + * The overlapped pool used to retrieve the next available \c OverlappedK. + * + * \returns On success, the next unused overlappedK available in the pool. Otherwise NULL. Use + * \c GetLastError() to get extended error information. + * + * After calling \ref OvlK_Acquire or \ref OvlK_ReUse the \c OverlappedK is ready to be used in an I/O + * operation. See one of the \c UsbK core transfer functions such as \ref UsbK_ReadPipe or + * \ref UsbK_WritePipe for more information. + * + * If the pools internal refurbished list (a re-usable list of \c OverlappedK structures) is not empty, the + * \ref OvlK_Acquire function will choose an overlapped from the refurbished list. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_Acquire( + _out KOVL_HANDLE* OverlappedK, + _in KOVL_POOL_HANDLE PoolHandle); + +//! Returns an \c OverlappedK structure to it's pool. + /*! + * + * \param[in] OverlappedK + * The overlappedK to release. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * When an overlapped is returned to pool, it resources are \b not freed. Instead, it is added to an internal + * refurbished list (a re-usable list of \c OverlappedK structures). + * + * \warning This function must not be called when the OverlappedK is in-use. If unsure, consider using + * \ref OvlK_WaitAndRelease instead. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_Release( + _in KOVL_HANDLE OverlappedK); + + +//! Creates a new overlapped pool. + /*! + * + * \param[out] PoolHandle + * On success, receives the new pool handle. + * + * \param[in] UsbHandle + * USB handle to associate with the pool. + * + * \param[in] MaxOverlappedCount + * Maximum number of overkappedK handles allowed in the pool. + * + * \param[in] Flags + * Pool flags. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_Init ( + _out KOVL_POOL_HANDLE* PoolHandle, + _in KUSB_HANDLE UsbHandle, + _in INT MaxOverlappedCount, + _inopt KOVL_POOL_FLAG Flags); + +//! Destroys the specified pool and all resources it created. + /*! + * + * \param[in] PoolHandle + * The overlapped pool to destroy. Once destroyed, the pool and all resources which belong to it can no + * longer be used. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \warning A pool should not be destroyed until all OverlappedKs acquired from it are no longer in-use. For + * more information see \ref OvlK_WaitAndRelease or \ref OvlK_Release. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_Free( + _in KOVL_POOL_HANDLE PoolHandle); + + +//! Returns the internal event handle used to signal IO operations. + /*! + * + * \param[in] OverlappedK + * The overlappedK used to return the internal event handle. + * + * \returns On success, The manual reset event handle being used by this overlappedK. Otherwise NULL. Use + * \c GetLastError() to get extended error information. + * + * \ref OvlK_GetEventHandle is useful for applications that must to their own event handling. It exposes the + * windows \c OVERLAPPED \c hEvent used for i/o completion signaling. This event handle can be used by the + * standard event wait functions; /c WaitForMultipleObjectsEx for example. + * + * \warning Use \ref OvlK_GetEventHandle with caution. Event handles returned by this function should never + * be used unless the OverlappedK has been \b acquired by the application. + * + */ + KUSB_EXP HANDLE KUSB_API OvlK_GetEventHandle( + _in KOVL_HANDLE OverlappedK); + +//! Waits for overlapped I/O completion, and performs actions specified in \c WaitFlags. + /*! + * + * \param[in] OverlappedK + * The overlappedK to wait on. + * + * \param[in] TimeoutMS + * Number of milliseconds to wait for overlapped completion. + * + * \param[in] WaitFlags + * See /ref KOVL_WAIT_FLAG + * + * \param[out] TransferredLength + * On success, returns the number of bytes transferred by this overlappedK. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. See + * the remarks section below for details on relevant error codes. + * + * \c OvlK_Wait waits the time interval specified in \c TimeoutMS for the overlapped I/O operation to + * complete. Different actions can then taken depending on the flags specified in \c WaitFlags. + * + * \WINERRORTABLE + * + * \WINERROR{ERROR_CANCELLED,1223} + * - The I/O was cancelled by the user. The transfer complete event was not signalled within the alotted + * transfer timeout time and the OvlK_Wait function issued a CancelIoEx/CancelIo request because the + * \ref KOVL_WAIT_FLAG_CANCEL_ON_TIMEOUT flag bit was set. + * \ENDWINERROR + * + * \WINERROR{ERROR_OPERATION_ABORTED,995} + * - The transfer complete event is signalled but the overlapped result was allready cancelled. The + * overlapped I/O may have bee cancelled for one of the following reasons: + * - Driver cancelled because of pipe timeout policy expiration. + * - The device was disconnected. + * - A \ref UsbK_AbortPipe request was issued. + * \ENDWINERROR + * + * \ENDWINERRORTABLE + * + */ + KUSB_EXP BOOL KUSB_API OvlK_Wait( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength); + +//! Waits for overlapped I/O completion on the oldest acquired OverlappedK handle and performs actions specified in \c WaitFlags. + /*! + * + * \param[in] PoolHandle + * The pool handle containing one or more acuired OverlappedKs. + * + * \param[out] OverlappedK + * On success, set to the oldest overlappedK in the acquired list. + * + * \param[in] TimeoutMS + * See /ref OvlK_Wait + * + * \param[in] WaitFlags + * See /ref KOVL_WAIT_FLAG + * + * \param[out] TransferredLength + * See /ref OvlK_Wait + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. See + * See /ref OvlK_Wait + */ + KUSB_EXP BOOL KUSB_API OvlK_WaitOldest( + _in KOVL_POOL_HANDLE PoolHandle, + _outopt KOVL_HANDLE* OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength); + +//! Waits for overlapped I/O completion, cancels on a timeout error. + /*! + * + * \param[in] OverlappedK + * The overlappedK to wait on. + * + * \param[in] TimeoutMS + * Number of milliseconds to wait for overlapped completion. + * + * \param[out] TransferredLength + * On success, returns the number of bytes transferred by this overlappedK. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. See + * \ref OvlK_Wait for details on relevant win32 error codes. + * + * \note This convenience function calls \ref OvlK_Wait with \ref KOVL_WAIT_FLAG_CANCEL_ON_TIMEOUT. + * + * \c OvlK_WaitOrCancel waits the the time interval specified by \c TimeoutMS for an overlapped result. If + * the \c TimeoutMS interval expires the I/O operation is cancelled. The \c OverlappedK is not released back + * to its pool. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_WaitOrCancel( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength); + +//! Waits for overlapped I/O completion, cancels on a timeout error and always releases the OvlK handle back to its pool. + /*! + * + * \param[in] OverlappedK + * The overlappedK to wait on. + * + * \param[in] TimeoutMS + * Number of milliseconds to wait for overlapped completion. + * + * \param[out] TransferredLength + * On success, returns the number of bytes transferred by this overlappedK. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. See + * \ref OvlK_Wait for details on relevant win32 error codes. + * + * \note This convenience function calls \ref OvlK_Wait with \ref KOVL_WAIT_FLAG_RELEASE_ALWAYS. + * + * \c OvlK_WaitAndRelease waits the the time interval specified by \c TimeoutMS for an overlapped result. + * When \c OvlK_WaitOrCancel returns, the I/O operation has either been completed or cancelled. The + * \c OverlappedK is always released back to its pool where it can be re-acquired with \ref OvlK_Acquire. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_WaitAndRelease( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength); + +//! Checks for i/o completion; returns immediately. (polling) + /*! + * + * \param[in] OverlappedK + * The overlappedK to check for completion. + * + * \warning \ref OvlK_IsComplete does \b no validation on the OverlappedK. It's purpose is to check the event + * signal state as fast as possible. + * + * \returns TRUE if the \c OverlappedK has completed, otherwise FALSE. + * + * \c OvlK_IsComplete quickly checks if the \c OverlappedK i/o operation has completed. + */ + KUSB_EXP BOOL KUSB_API OvlK_IsComplete( + _in KOVL_HANDLE OverlappedK); + +//! Initializes an overlappedK for re-use. The overlappedK is not return to its pool. + /*! + * + * \param[in] OverlappedK + * The overlappedK to re-use. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * This function performs the following actions: + * - Resets the overlapped event to non-signaled via ResetEvent(). + * - Clears the internal overlapped information. + * - Clears the 'Internal' and 'InternalHigh' members of the windows overlapped structure. + * + * \note + * Re-using OverlappedKs is the most efficient means of OverlappedK management. When an OverlappedK is + * "re-used" it is not returned to the pool. Instead, the application retains ownership for use in another + * i/o operation. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_ReUse( + _in KOVL_HANDLE OverlappedK); + + /**@}*/ + +#endif + +#ifndef _LIBUSBK_STMK_FUNCTIONS + + /*! \addtogroup stmk + * @{ + */ + +//! Initializes a new uni-directional pipe stream. + /*! + * + * \param[out] StreamHandle + * On success, receives the new stream handle. + * + * \param[in] UsbHandle + * Usb handle to associate with this stream. + * + * \param[in] PipeID + * Endpoint address of USB pipe to associate with this stream. + * + * \param[in] MaxTransferSize + * Maximum number of bytes transferred at once. Larger transfers committed with the stream read/write + * functions are automatically split into multiple smaller chunks. + * + * \param[in] MaxPendingTransfers + * Maximum number of transfers allowed to be outstanding and the total number of transfer contexts that are + * allocated to the stream. + * + * \param[in] MaxPendingIO + * Maximum number of I/O requests the internal stream thread is allowed to have submit at any given time. + * (Pending I/O) + * + * \param[in] Callbacks + * Optional user callback functions. If specified, these callback functions will be executed in real time + * (from within the context of the internal stream thread) as transfers go through the various states. + * + * \param[in] Flags + * Additional stream flags. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \par + * When a stream is initialized, it validates input parameters and allocates the required memory for the + * transfer context array and transfer lists from a private memory heap. The stream is not started and no I/O + * requests are sent to the device until \ref StmK_Start is executed. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Init( + _out KSTM_HANDLE* StreamHandle, + _in KUSB_HANDLE UsbHandle, + _in UCHAR PipeID, + _in INT MaxTransferSize, + _in INT MaxPendingTransfers, + _in INT MaxPendingIO, + _inopt PKSTM_CALLBACK Callbacks, + _inopt KSTM_FLAG Flags); + +//! Frees resources allocated by a stream handle. + /*! + * + * \param[in] StreamHandle + * The stream handle to free. + * + * \returns TRUE. + * + * If the stream is currently started it is automatically stopped before its resources are freed. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Free( + _in KSTM_HANDLE StreamHandle); + +//! Starts the internal stream thread. + /*! + * + * \param[in] StreamHandle + * The stream to start. A stream handle is created with \ref StmK_Init. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \par + * When a stream is started, an internal thread is created for managing pipe I/O operations. If a + * \ref KSTM_CALLBACK::Started callback function is assgined, it is executed \b for each transfer context. + * (\b MaxPendingTransfers) See \ref StmK_Init. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Start( + _in KSTM_HANDLE StreamHandle); + +//! Stops the internal stream thread. + /*! + * + * \param[in] StreamHandle + * The stream to stop. + * + * \param[in] TimeoutCancelMS + * Number of milliseconds the internal stream thread should wait for pending I/O to complete before + * cancelling all pending requests. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Stop( + _in KSTM_HANDLE StreamHandle, + _in INT TimeoutCancelMS); + +//! Reads data from the stream buffer. + /*! + * + * \param[in] StreamHandle + * The stream to read. + * + * \param[out] Buffer + * A caller-allocated buffer that receives the data that is read. + * + * \param[in] Offset + * Read start offset of \c Buffer. + * + * \param[in] Length + * Size of \c Buffer. + * + * \param[out] TransferredLength + * On success, receives the actual number of bytes that were copied into \c Buffer. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * - Read Stream Operations: + * -# The internal stream thread will always try and keep reads pending as specified by \b MaxPendingIO in + * \ref StmK_Init. + * -# As the stream submits transfers, it increments the \b PendingIO and \b PendingTransfer counts. As it + * completes transfers, it decrements the \b PendingIO count. As the user processes transfers with + * \ref StmK_Read, it decrements the \b PendingTransfer count and release control of the transfer context + * back to the stream where it is re-used. + * -# When the pending I/O count reaches \c MaxPendingIO, the stream completes the oldest + * \b PendingTransfer and moves it into a FIFO complete where it awaits user processing via the + * \ref StmK_Read function. + * -# If the stream has not exhausted its MaxPendingTransfers count, another read request is submitted + * immediately to satisfy \b MaxPendingIO. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Read( + _in KSTM_HANDLE StreamHandle, + _out PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength); + +//! Writes data to the stream buffer. + /*! + * + * \param[in] StreamHandle + * The stream to write. + * + * \param[in] Buffer + * A caller-allocated buffer the data is written from. + * + * \param[in] Offset + * Write start offset of \c Buffer. + * + * \param[in] Length + * Number of bytes to copy into the stream buffer. + * + * \param[out] TransferredLength + * On success, receives the actual number of bytes that were copied into the stream buffer. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * - Write Stream Operations: + * -# The internal stream thread will always try and exhaust all pending transfers submitted by the user + * via \ref StmK_Write. + * -# As the user submits transfers via \ref StmK_Write, the \b PendingTransfer count is inceremented and + * transfers are added to a queued FIFO list where they await processing by the internal stream thread. + * -# While the queued FIFO list is not empty and \b PendingIO count is less than \b MaxPendingIO, The + * \b PendingIO count increments and the request is sent to the device. + * -# When a transfer completes, the internal pending I/O count is decremented and the transfers is moved + * back into the idle list where it can be reused again by subsequent \ref StmK_Write requests. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Write( + _in KSTM_HANDLE StreamHandle, + _in PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength); + /**@}*/ + +#endif + +#ifndef _LIBUSBK_ISOK_FUNCTIONS + /*! \addtogroup isok + * @{ + */ + +//! Creates a new isochronous transfer context. + /*! + * + * \param[out] IsoContext + * Receives a new isochronous transfer context. + * + * \param[in] NumberOfPackets + * The number of \ref KISO_PACKET structures allocated to \c IsoContext. Assigned to + * \ref KISO_CONTEXT::NumberOfPackets. The \ref KISO_CONTEXT::NumberOfPackets field is assignable by + * \c IsoK_Init only and must not be changed by the user. + * + * \param[in] StartFrame + * The USB frame number this request must start on (or \b 0 for ASAP) and assigned to + * \ref KISO_CONTEXT::StartFrame. The \ref KISO_CONTEXT::StartFrame may be chamged by the user in subsequent + * request. For more information, see \ref KISO_CONTEXT::StartFrame. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c IsoK_Init is performs the following tasks in order: + * -# Allocates the \c IsoContext and the required \ref KISO_PACKET structures. + * -# Zero-initializes all ISO context memory. + * -# Assigns \b NumberOfPackets, \b PipeID, and \b StartFrame to \c IsoContext. + * + */ + KUSB_EXP BOOL KUSB_API IsoK_Init( + _out PKISO_CONTEXT* IsoContext, + _in INT NumberOfPackets, + _inopt INT StartFrame); + +//! Destroys an isochronous transfer context. + /*! + * \param[in] IsoContext + * A pointer to an isochronous transfer context created with \ref IsoK_Init. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + */ + KUSB_EXP BOOL KUSB_API IsoK_Free( + _in PKISO_CONTEXT IsoContext); + +//! Convenience function for setting the offset of all ISO packets of an isochronous transfer context. + /*! + * \param[in] IsoContext + * A pointer to an isochronous transfer context. + * + * \param[in] PacketSize + * The packet size used to calculate and assign the absolute data offset for each \ref KISO_PACKET in + * \c IsoContext. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c IsoK_SetPackets updates all \ref KISO_PACKET::Offset fields in a \ref KISO_CONTEXT so all offset are + * \c PacketSize apart. For example: + * - The offset of the first (0-index) packet is 0. + * - The offset of the second (1-index) packet is PacketSize. + * - The offset of the third (2-index) packet is PacketSize*2. + * + * \code + * for (packetIndex = 0; packetIndex < IsoContext->NumberOfPackets; packetIndex++) + * IsoContext->IsoPackets[packetIndex].Offset = packetIndex * PacketSize; + * \endcode + * + */ + KUSB_EXP BOOL KUSB_API IsoK_SetPackets( + _in PKISO_CONTEXT IsoContext, + _in INT PacketSize); + +//! Convenience function for setting all fields of a \ref KISO_PACKET. + /*! + * \param[in] IsoContext + * A pointer to an isochronous transfer context. + * + * \param[in] PacketIndex + * The packet index to set. + * + * \param[in] IsoPacket + * Pointer to a user allocated \c KISO_PACKET which is copied into the PKISO_CONTEXT::IsoPackets array at the + * specified index. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + */ + KUSB_EXP BOOL KUSB_API IsoK_SetPacket( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _in PKISO_PACKET IsoPacket); + +//! Convenience function for getting all fields of a \ref KISO_PACKET. + /*! + * \param[in] IsoContext + * A pointer to an isochronous transfer context. + * + * \param[in] PacketIndex + * The packet index to get. + * + * \param[out] IsoPacket + * Pointer to a user allocated \c KISO_PACKET which receives a copy of the ISO packet in the + * PKISO_CONTEXT::IsoPackets array at the specified index. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + */ + KUSB_EXP BOOL KUSB_API IsoK_GetPacket( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _out PKISO_PACKET IsoPacket); + +//! Convenience function for enumerating ISO packets of an isochronous transfer context. + /*! + * \param[in] IsoContext + * A pointer to an isochronous transfer context. + * + * \param[in] EnumPackets + * Pointer to a user supplied callback function which is executed for all ISO packets in \c IsoContext or + * until the user supplied callback function returns \c FALSE. + * + * \param[in] StartPacketIndex + * The zero-based ISO packet index to begin enumeration at. + * + * \param[in] UserState + * A user defined value which is passed as a parameter to the user supplied callback function. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + */ + KUSB_EXP BOOL KUSB_API IsoK_EnumPackets( + _in PKISO_CONTEXT IsoContext, + _in KISO_ENUM_PACKETS_CB* EnumPackets, + _inopt INT StartPacketIndex, + _inopt PVOID UserState); + +//! Convenience function for re-using an isochronous transfer context in a subsequent request. + /*! + * \param[in,out] IsoContext + * A pointer to an isochronous transfer context. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c IsoK_ReUse does the following: + * -# Zero-initializes the \b Length and \b Status fields of all \ref KISO_PACKET structures. + * -# Zero-initializes the \b StartFrame and \b ErrorCount of the \ref KISO_CONTEXT. + * + */ + KUSB_EXP BOOL KUSB_API IsoK_ReUse( + _ref PKISO_CONTEXT IsoContext); + + /*! @} */ + +#endif + +#ifdef __cplusplus +} +#endif + +#endif // _LIBUSBK_H__ diff --git a/Desktop Interface/libusbk/includes/lusbk_dynapi.c b/Desktop Interface/libusbk/includes/lusbk_dynapi.c new file mode 100644 index 00000000..3b414327 --- /dev/null +++ b/Desktop Interface/libusbk/includes/lusbk_dynapi.c @@ -0,0 +1,1915 @@ +/*!******************************************************************** +libusbK - Multi-driver USB library. +Copyright (C) 2012 Travis Lee Robinson. All Rights Reserved. +libusb-win32.sourceforge.net + +Development : Travis Lee Robinson (libusbdotnet@gmail.com) +Testing : Xiaofan Chen (xiaofanc@gmail.com) + +At the discretion of the user of this library, this software may be +licensed under the terms of the GNU Public License v3 or a BSD-Style +license as outlined in the following files: +* LICENSE-gpl3.txt +* LICENSE-bsd.txt + +License files are located in a license folder at the root of source and +binary distributions. +********************************************************************!*/ + +#include +#include "libusbk.h" + +#define mLoadLibraryExA LoadLibraryExA +#define mFreeLibrary FreeLibrary + +HMODULE mLibusbK_ModuleHandle = NULL; + +VOID LibusbK_DynApi_Free(VOID); +INT LibusbK_DynApi_Init(_inopt LPCSTR DllFullPathName); + +// Function typedefs: + +typedef VOID KUSB_API LibK_GetVersion_T(_out PKLIB_VERSION Version); + +typedef KLIB_USER_CONTEXT KUSB_API LibK_GetContext_T( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType); + +typedef BOOL KUSB_API LibK_SetContext_T( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue); + +typedef BOOL KUSB_API LibK_SetCleanupCallback_T( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_HANDLE_CLEANUP_CB* CleanupCB); + +typedef BOOL KUSB_API LibK_LoadDriverAPI_T( + _out PKUSB_DRIVER_API DriverAPI, + _in INT DriverID); + +typedef BOOL KUSB_API LibK_CopyDriverAPI_T( + _out PKUSB_DRIVER_API DriverAPI, + _in KUSB_HANDLE UsbHandle); + +typedef BOOL KUSB_API LibK_GetProcAddress_T( + _out KPROC* ProcAddress, + _in INT DriverID, + _in INT FunctionID); + +typedef BOOL KUSB_API LibK_SetDefaultContext_T( + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue); + +typedef KLIB_USER_CONTEXT KUSB_API LibK_GetDefaultContext_T( + _in KLIB_HANDLE_TYPE HandleType); + +typedef BOOL KUSB_API LibK_Context_Init_T( + _inopt HANDLE Heap, + _in PVOID Reserved); + +typedef VOID KUSB_API LibK_Context_Free_T(VOID); + +typedef BOOL KUSB_API UsbK_Init_T ( + _out KUSB_HANDLE* InterfaceHandle, + _in KLST_DEVINFO_HANDLE DevInfo); + +typedef BOOL KUSB_API UsbK_Free_T ( + _in KUSB_HANDLE InterfaceHandle); + +typedef BOOL KUSB_API UsbK_ClaimInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API UsbK_ReleaseInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API UsbK_SetAltInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _in UCHAR AltSettingNumber); + +typedef BOOL KUSB_API UsbK_GetAltInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _out PUCHAR AltSettingNumber); + +typedef BOOL KUSB_API UsbK_GetDescriptor_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR DescriptorType, + _in UCHAR Index, + _in USHORT LanguageID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred); + +typedef BOOL KUSB_API UsbK_ControlTransfer_T ( + _in KUSB_HANDLE InterfaceHandle, + _in WINUSB_SETUP_PACKET SetupPacket, + _refopt PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API UsbK_SetPowerPolicy_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +typedef BOOL KUSB_API UsbK_GetPowerPolicy_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +typedef BOOL KUSB_API UsbK_SetConfiguration_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR ConfigurationNumber); + +typedef BOOL KUSB_API UsbK_GetConfiguration_T ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR ConfigurationNumber); + +typedef BOOL KUSB_API UsbK_ResetDevice_T ( + _in KUSB_HANDLE InterfaceHandle); + +typedef BOOL KUSB_API UsbK_Initialize_T ( + _in HANDLE DeviceHandle, + _out KUSB_HANDLE* InterfaceHandle); + +typedef BOOL KUSB_API UsbK_SelectInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API UsbK_GetAssociatedInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AssociatedInterfaceIndex, + _out KUSB_HANDLE* AssociatedInterfaceHandle); + +typedef BOOL KUSB_API UsbK_Clone_T ( + _in KUSB_HANDLE InterfaceHandle, + _out KUSB_HANDLE* DstInterfaceHandle); + +typedef BOOL KUSB_API UsbK_QueryInterfaceSettings_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingIndex, + _out PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor); + +typedef BOOL KUSB_API UsbK_QueryDeviceInformation_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT InformationType, + _ref PUINT BufferLength, + _ref PVOID Buffer); + +typedef BOOL KUSB_API UsbK_SetCurrentAlternateSetting_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber); + +typedef BOOL KUSB_API UsbK_GetCurrentAlternateSetting_T ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR AltSettingNumber); + +typedef BOOL KUSB_API UsbK_QueryPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber, + _in UCHAR PipeIndex, + _out PWINUSB_PIPE_INFORMATION PipeInformation); + +typedef BOOL KUSB_API UsbK_SetPipePolicy_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +typedef BOOL KUSB_API UsbK_GetPipePolicy_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +typedef BOOL KUSB_API UsbK_ReadPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API UsbK_WritePipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API UsbK_ResetPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API UsbK_AbortPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API UsbK_FlushPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API UsbK_IsoReadPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +typedef BOOL KUSB_API UsbK_IsoWritePipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +typedef BOOL KUSB_API UsbK_GetCurrentFrameNumber_T ( + _in KUSB_HANDLE InterfaceHandle, + _out PUINT FrameNumber); + +typedef BOOL KUSB_API UsbK_GetOverlappedResult_T ( + _in KUSB_HANDLE InterfaceHandle, + _in LPOVERLAPPED Overlapped, + _out PUINT lpNumberOfBytesTransferred, + _in BOOL bWait); + +typedef BOOL KUSB_API UsbK_GetProperty_T ( + _in KUSB_HANDLE InterfaceHandle, + _in KUSB_PROPERTY PropertyType, + _ref PUINT PropertySize, + _out PVOID Value); + +typedef BOOL KUSB_API LstK_Init_T( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags); + +typedef BOOL KUSB_API LstK_InitEx_T( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags, + _in PKLST_PATTERN_MATCH PatternMatch); + +typedef BOOL KUSB_API LstK_Free_T( + _in KLST_HANDLE DeviceList); + +typedef BOOL KUSB_API LstK_Enumerate_T( + _in KLST_HANDLE DeviceList, + _in KLST_ENUM_DEVINFO_CB* EnumDevListCB, + _inopt PVOID Context); + +typedef BOOL KUSB_API LstK_Current_T( + _in KLST_HANDLE DeviceList, + _out KLST_DEVINFO_HANDLE* DeviceInfo); + +typedef BOOL KUSB_API LstK_MoveNext_T( + _in KLST_HANDLE DeviceList, + _outopt KLST_DEVINFO_HANDLE* DeviceInfo); + +typedef VOID KUSB_API LstK_MoveReset_T( + _in KLST_HANDLE DeviceList); + +typedef BOOL KUSB_API LstK_FindByVidPid_T( + _in KLST_HANDLE DeviceList, + _in INT Vid, + _in INT Pid, + _out KLST_DEVINFO_HANDLE* DeviceInfo); + +typedef BOOL KUSB_API LstK_Count_T( + _in KLST_HANDLE DeviceList, + _ref PUINT Count); + +typedef BOOL KUSB_API HotK_Init_T( + _out KHOT_HANDLE* Handle, + _ref PKHOT_PARAMS InitParams); + +typedef BOOL KUSB_API HotK_Free_T( + _in KHOT_HANDLE Handle); + +typedef VOID KUSB_API HotK_FreeAll_T(VOID); + +typedef BOOL KUSB_API OvlK_Acquire_T( + _out KOVL_HANDLE* OverlappedK, + _in KOVL_POOL_HANDLE PoolHandle); + +typedef BOOL KUSB_API OvlK_Release_T( + _in KOVL_HANDLE OverlappedK); + +typedef BOOL KUSB_API OvlK_Init_T ( + _out KOVL_POOL_HANDLE* PoolHandle, + _in KUSB_HANDLE UsbHandle, + _in INT MaxOverlappedCount, + _inopt KOVL_POOL_FLAG Flags); + +typedef BOOL KUSB_API OvlK_Free_T( + _in KOVL_POOL_HANDLE PoolHandle); + +typedef HANDLE KUSB_API OvlK_GetEventHandle_T( + _in KOVL_HANDLE OverlappedK); + +typedef BOOL KUSB_API OvlK_Wait_T( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API OvlK_WaitOldest_T( + _in KOVL_POOL_HANDLE PoolHandle, + _outopt KOVL_HANDLE* OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API OvlK_WaitOrCancel_T( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API OvlK_WaitAndRelease_T( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API OvlK_IsComplete_T( + _in KOVL_HANDLE OverlappedK); + +typedef BOOL KUSB_API OvlK_ReUse_T( + _in KOVL_HANDLE OverlappedK); + +typedef BOOL KUSB_API StmK_Init_T( + _out KSTM_HANDLE* StreamHandle, + _in KUSB_HANDLE UsbHandle, + _in UCHAR PipeID, + _in INT MaxTransferSize, + _in INT MaxPendingTransfers, + _in INT MaxPendingIO, + _inopt PKSTM_CALLBACK Callbacks, + _inopt KSTM_FLAG Flags); + +typedef BOOL KUSB_API StmK_Free_T( + _in KSTM_HANDLE StreamHandle); + +typedef BOOL KUSB_API StmK_Start_T( + _in KSTM_HANDLE StreamHandle); + +typedef BOOL KUSB_API StmK_Stop_T( + _in KSTM_HANDLE StreamHandle, + _in INT TimeoutCancelMS); + +typedef BOOL KUSB_API StmK_Read_T( + _in KSTM_HANDLE StreamHandle, + _out PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API StmK_Write_T( + _in KSTM_HANDLE StreamHandle, + _in PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API IsoK_Init_T( + _out PKISO_CONTEXT* IsoContext, + _in INT NumberOfPackets, + _inopt INT StartFrame); + +typedef BOOL KUSB_API IsoK_Free_T( + _in PKISO_CONTEXT IsoContext); + +typedef BOOL KUSB_API IsoK_SetPackets_T( + _in PKISO_CONTEXT IsoContext, + _in INT PacketSize); + +typedef BOOL KUSB_API IsoK_SetPacket_T( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _in PKISO_PACKET IsoPacket); + +typedef BOOL KUSB_API IsoK_GetPacket_T( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _out PKISO_PACKET IsoPacket); + +typedef BOOL KUSB_API IsoK_EnumPackets_T( + _in PKISO_CONTEXT IsoContext, + _in KISO_ENUM_PACKETS_CB* EnumPackets, + _inopt INT StartPacketIndex, + _inopt PVOID UserState); + +typedef BOOL KUSB_API IsoK_ReUse_T( + _ref PKISO_CONTEXT IsoContext); + + + +/////////////////////////////////////////////////////////////////////// + +// Function pointers: + +static LibK_GetVersion_T* pLibK_GetVersion = NULL; + +static LibK_GetContext_T* pLibK_GetContext = NULL; + +static LibK_SetContext_T* pLibK_SetContext = NULL; + +static LibK_SetCleanupCallback_T* pLibK_SetCleanupCallback = NULL; + +static LibK_LoadDriverAPI_T* pLibK_LoadDriverAPI = NULL; + +static LibK_CopyDriverAPI_T* pLibK_CopyDriverAPI = NULL; + +static LibK_GetProcAddress_T* pLibK_GetProcAddress = NULL; + +static LibK_SetDefaultContext_T* pLibK_SetDefaultContext = NULL; + +static LibK_GetDefaultContext_T* pLibK_GetDefaultContext = NULL; + +static LibK_Context_Init_T* pLibK_Context_Init = NULL; + +static LibK_Context_Free_T* pLibK_Context_Free = NULL; + +static UsbK_Init_T* pUsbK_Init = NULL; + +static UsbK_Free_T* pUsbK_Free = NULL; + +static UsbK_ClaimInterface_T* pUsbK_ClaimInterface = NULL; + +static UsbK_ReleaseInterface_T* pUsbK_ReleaseInterface = NULL; + +static UsbK_SetAltInterface_T* pUsbK_SetAltInterface = NULL; + +static UsbK_GetAltInterface_T* pUsbK_GetAltInterface = NULL; + +static UsbK_GetDescriptor_T* pUsbK_GetDescriptor = NULL; + +static UsbK_ControlTransfer_T* pUsbK_ControlTransfer = NULL; + +static UsbK_SetPowerPolicy_T* pUsbK_SetPowerPolicy = NULL; + +static UsbK_GetPowerPolicy_T* pUsbK_GetPowerPolicy = NULL; + +static UsbK_SetConfiguration_T* pUsbK_SetConfiguration = NULL; + +static UsbK_GetConfiguration_T* pUsbK_GetConfiguration = NULL; + +static UsbK_ResetDevice_T* pUsbK_ResetDevice = NULL; + +static UsbK_Initialize_T* pUsbK_Initialize = NULL; + +static UsbK_SelectInterface_T* pUsbK_SelectInterface = NULL; + +static UsbK_GetAssociatedInterface_T* pUsbK_GetAssociatedInterface = NULL; + +static UsbK_Clone_T* pUsbK_Clone = NULL; + +static UsbK_QueryInterfaceSettings_T* pUsbK_QueryInterfaceSettings = NULL; + +static UsbK_QueryDeviceInformation_T* pUsbK_QueryDeviceInformation = NULL; + +static UsbK_SetCurrentAlternateSetting_T* pUsbK_SetCurrentAlternateSetting = NULL; + +static UsbK_GetCurrentAlternateSetting_T* pUsbK_GetCurrentAlternateSetting = NULL; + +static UsbK_QueryPipe_T* pUsbK_QueryPipe = NULL; + +static UsbK_SetPipePolicy_T* pUsbK_SetPipePolicy = NULL; + +static UsbK_GetPipePolicy_T* pUsbK_GetPipePolicy = NULL; + +static UsbK_ReadPipe_T* pUsbK_ReadPipe = NULL; + +static UsbK_WritePipe_T* pUsbK_WritePipe = NULL; + +static UsbK_ResetPipe_T* pUsbK_ResetPipe = NULL; + +static UsbK_AbortPipe_T* pUsbK_AbortPipe = NULL; + +static UsbK_FlushPipe_T* pUsbK_FlushPipe = NULL; + +static UsbK_IsoReadPipe_T* pUsbK_IsoReadPipe = NULL; + +static UsbK_IsoWritePipe_T* pUsbK_IsoWritePipe = NULL; + +static UsbK_GetCurrentFrameNumber_T* pUsbK_GetCurrentFrameNumber = NULL; + +static UsbK_GetOverlappedResult_T* pUsbK_GetOverlappedResult = NULL; + +static UsbK_GetProperty_T* pUsbK_GetProperty = NULL; + +static LstK_Init_T* pLstK_Init = NULL; + +static LstK_InitEx_T* pLstK_InitEx = NULL; + +static LstK_Free_T* pLstK_Free = NULL; + +static LstK_Enumerate_T* pLstK_Enumerate = NULL; + +static LstK_Current_T* pLstK_Current = NULL; + +static LstK_MoveNext_T* pLstK_MoveNext = NULL; + +static LstK_MoveReset_T* pLstK_MoveReset = NULL; + +static LstK_FindByVidPid_T* pLstK_FindByVidPid = NULL; + +static LstK_Count_T* pLstK_Count = NULL; + +static HotK_Init_T* pHotK_Init = NULL; + +static HotK_Free_T* pHotK_Free = NULL; + +static HotK_FreeAll_T* pHotK_FreeAll = NULL; + +static OvlK_Acquire_T* pOvlK_Acquire = NULL; + +static OvlK_Release_T* pOvlK_Release = NULL; + +static OvlK_Init_T* pOvlK_Init = NULL; + +static OvlK_Free_T* pOvlK_Free = NULL; + +static OvlK_GetEventHandle_T* pOvlK_GetEventHandle = NULL; + +static OvlK_Wait_T* pOvlK_Wait = NULL; + +static OvlK_WaitOldest_T* pOvlK_WaitOldest = NULL; + +static OvlK_WaitOrCancel_T* pOvlK_WaitOrCancel = NULL; + +static OvlK_WaitAndRelease_T* pOvlK_WaitAndRelease = NULL; + +static OvlK_IsComplete_T* pOvlK_IsComplete = NULL; + +static OvlK_ReUse_T* pOvlK_ReUse = NULL; + +static StmK_Init_T* pStmK_Init = NULL; + +static StmK_Free_T* pStmK_Free = NULL; + +static StmK_Start_T* pStmK_Start = NULL; + +static StmK_Stop_T* pStmK_Stop = NULL; + +static StmK_Read_T* pStmK_Read = NULL; + +static StmK_Write_T* pStmK_Write = NULL; + +static IsoK_Init_T* pIsoK_Init = NULL; + +static IsoK_Free_T* pIsoK_Free = NULL; + +static IsoK_SetPackets_T* pIsoK_SetPackets = NULL; + +static IsoK_SetPacket_T* pIsoK_SetPacket = NULL; + +static IsoK_GetPacket_T* pIsoK_GetPacket = NULL; + +static IsoK_EnumPackets_T* pIsoK_EnumPackets = NULL; + +static IsoK_ReUse_T* pIsoK_ReUse = NULL; + + + +/////////////////////////////////////////////////////////////////////// + + +VOID LibusbK_DynApi_Free(VOID) +{ + if (mLibusbK_ModuleHandle) + { + mFreeLibrary(mLibusbK_ModuleHandle); + mLibusbK_ModuleHandle = NULL; + + // Set all function pointers to null: + + pLibK_GetVersion = NULL; + + pLibK_GetContext = NULL; + + pLibK_SetContext = NULL; + + pLibK_SetCleanupCallback = NULL; + + pLibK_LoadDriverAPI = NULL; + + pLibK_CopyDriverAPI = NULL; + + pLibK_GetProcAddress = NULL; + + pLibK_SetDefaultContext = NULL; + + pLibK_GetDefaultContext = NULL; + + pLibK_Context_Init = NULL; + + pLibK_Context_Free = NULL; + + pUsbK_Init = NULL; + + pUsbK_Free = NULL; + + pUsbK_ClaimInterface = NULL; + + pUsbK_ReleaseInterface = NULL; + + pUsbK_SetAltInterface = NULL; + + pUsbK_GetAltInterface = NULL; + + pUsbK_GetDescriptor = NULL; + + pUsbK_ControlTransfer = NULL; + + pUsbK_SetPowerPolicy = NULL; + + pUsbK_GetPowerPolicy = NULL; + + pUsbK_SetConfiguration = NULL; + + pUsbK_GetConfiguration = NULL; + + pUsbK_ResetDevice = NULL; + + pUsbK_Initialize = NULL; + + pUsbK_SelectInterface = NULL; + + pUsbK_GetAssociatedInterface = NULL; + + pUsbK_Clone = NULL; + + pUsbK_QueryInterfaceSettings = NULL; + + pUsbK_QueryDeviceInformation = NULL; + + pUsbK_SetCurrentAlternateSetting = NULL; + + pUsbK_GetCurrentAlternateSetting = NULL; + + pUsbK_QueryPipe = NULL; + + pUsbK_SetPipePolicy = NULL; + + pUsbK_GetPipePolicy = NULL; + + pUsbK_ReadPipe = NULL; + + pUsbK_WritePipe = NULL; + + pUsbK_ResetPipe = NULL; + + pUsbK_AbortPipe = NULL; + + pUsbK_FlushPipe = NULL; + + pUsbK_IsoReadPipe = NULL; + + pUsbK_IsoWritePipe = NULL; + + pUsbK_GetCurrentFrameNumber = NULL; + + pUsbK_GetOverlappedResult = NULL; + + pUsbK_GetProperty = NULL; + + pLstK_Init = NULL; + + pLstK_InitEx = NULL; + + pLstK_Free = NULL; + + pLstK_Enumerate = NULL; + + pLstK_Current = NULL; + + pLstK_MoveNext = NULL; + + pLstK_MoveReset = NULL; + + pLstK_FindByVidPid = NULL; + + pLstK_Count = NULL; + + pHotK_Init = NULL; + + pHotK_Free = NULL; + + pHotK_FreeAll = NULL; + + pOvlK_Acquire = NULL; + + pOvlK_Release = NULL; + + pOvlK_Init = NULL; + + pOvlK_Free = NULL; + + pOvlK_GetEventHandle = NULL; + + pOvlK_Wait = NULL; + + pOvlK_WaitOldest = NULL; + + pOvlK_WaitOrCancel = NULL; + + pOvlK_WaitAndRelease = NULL; + + pOvlK_IsComplete = NULL; + + pOvlK_ReUse = NULL; + + pStmK_Init = NULL; + + pStmK_Free = NULL; + + pStmK_Start = NULL; + + pStmK_Stop = NULL; + + pStmK_Read = NULL; + + pStmK_Write = NULL; + + pIsoK_Init = NULL; + + pIsoK_Free = NULL; + + pIsoK_SetPackets = NULL; + + pIsoK_SetPacket = NULL; + + pIsoK_GetPacket = NULL; + + pIsoK_EnumPackets = NULL; + + pIsoK_ReUse = NULL; + + + + /////////////////////////////////////////////////////////////////////// + } +} + +INT LibusbK_DynApi_Init(_inopt LPCSTR DllFullPathName) +{ + LPCSTR dllFullPathName = (DllFullPathName == NULL) ? "libusbK.dll" : DllFullPathName; + INT funcLoadFailCount = 0; + + if (mLibusbK_ModuleHandle) LibusbK_DynApi_Free(); + + if (DllFullPathName) + mLibusbK_ModuleHandle = mLoadLibraryExA(dllFullPathName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); + else + mLibusbK_ModuleHandle = mLoadLibraryExA(dllFullPathName, NULL, 0); + + if (mLibusbK_ModuleHandle == NULL) return -1; + + + // Function loads: + + if ((pLibK_GetVersion = (LibK_GetVersion_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_GetVersion")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_GetVersion.\n"); + } + + if ((pLibK_GetContext = (LibK_GetContext_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_GetContext")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_GetContext.\n"); + } + + if ((pLibK_SetContext = (LibK_SetContext_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_SetContext")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_SetContext.\n"); + } + + if ((pLibK_SetCleanupCallback = (LibK_SetCleanupCallback_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_SetCleanupCallback")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_SetCleanupCallback.\n"); + } + + if ((pLibK_LoadDriverAPI = (LibK_LoadDriverAPI_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_LoadDriverAPI")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_LoadDriverAPI.\n"); + } + + if ((pLibK_CopyDriverAPI = (LibK_CopyDriverAPI_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_CopyDriverAPI")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_CopyDriverAPI.\n"); + } + + if ((pLibK_GetProcAddress = (LibK_GetProcAddress_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_GetProcAddress")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_GetProcAddress.\n"); + } + + if ((pLibK_SetDefaultContext = (LibK_SetDefaultContext_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_SetDefaultContext")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_SetDefaultContext.\n"); + } + + if ((pLibK_GetDefaultContext = (LibK_GetDefaultContext_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_GetDefaultContext")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_GetDefaultContext.\n"); + } + + if ((pLibK_Context_Init = (LibK_Context_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_Context_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_Context_Init.\n"); + } + + if ((pLibK_Context_Free = (LibK_Context_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_Context_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_Context_Free.\n"); + } + + if ((pUsbK_Init = (UsbK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_Init.\n"); + } + + if ((pUsbK_Free = (UsbK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_Free.\n"); + } + + if ((pUsbK_ClaimInterface = (UsbK_ClaimInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ClaimInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ClaimInterface.\n"); + } + + if ((pUsbK_ReleaseInterface = (UsbK_ReleaseInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ReleaseInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ReleaseInterface.\n"); + } + + if ((pUsbK_SetAltInterface = (UsbK_SetAltInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SetAltInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SetAltInterface.\n"); + } + + if ((pUsbK_GetAltInterface = (UsbK_GetAltInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetAltInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetAltInterface.\n"); + } + + if ((pUsbK_GetDescriptor = (UsbK_GetDescriptor_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetDescriptor")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetDescriptor.\n"); + } + + if ((pUsbK_ControlTransfer = (UsbK_ControlTransfer_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ControlTransfer")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ControlTransfer.\n"); + } + + if ((pUsbK_SetPowerPolicy = (UsbK_SetPowerPolicy_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SetPowerPolicy")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SetPowerPolicy.\n"); + } + + if ((pUsbK_GetPowerPolicy = (UsbK_GetPowerPolicy_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetPowerPolicy")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetPowerPolicy.\n"); + } + + if ((pUsbK_SetConfiguration = (UsbK_SetConfiguration_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SetConfiguration")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SetConfiguration.\n"); + } + + if ((pUsbK_GetConfiguration = (UsbK_GetConfiguration_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetConfiguration")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetConfiguration.\n"); + } + + if ((pUsbK_ResetDevice = (UsbK_ResetDevice_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ResetDevice")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ResetDevice.\n"); + } + + if ((pUsbK_Initialize = (UsbK_Initialize_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_Initialize")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_Initialize.\n"); + } + + if ((pUsbK_SelectInterface = (UsbK_SelectInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SelectInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SelectInterface.\n"); + } + + if ((pUsbK_GetAssociatedInterface = (UsbK_GetAssociatedInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetAssociatedInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetAssociatedInterface.\n"); + } + + if ((pUsbK_Clone = (UsbK_Clone_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_Clone")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_Clone.\n"); + } + + if ((pUsbK_QueryInterfaceSettings = (UsbK_QueryInterfaceSettings_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_QueryInterfaceSettings")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_QueryInterfaceSettings.\n"); + } + + if ((pUsbK_QueryDeviceInformation = (UsbK_QueryDeviceInformation_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_QueryDeviceInformation")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_QueryDeviceInformation.\n"); + } + + if ((pUsbK_SetCurrentAlternateSetting = (UsbK_SetCurrentAlternateSetting_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SetCurrentAlternateSetting")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SetCurrentAlternateSetting.\n"); + } + + if ((pUsbK_GetCurrentAlternateSetting = (UsbK_GetCurrentAlternateSetting_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetCurrentAlternateSetting")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetCurrentAlternateSetting.\n"); + } + + if ((pUsbK_QueryPipe = (UsbK_QueryPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_QueryPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_QueryPipe.\n"); + } + + if ((pUsbK_SetPipePolicy = (UsbK_SetPipePolicy_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SetPipePolicy")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SetPipePolicy.\n"); + } + + if ((pUsbK_GetPipePolicy = (UsbK_GetPipePolicy_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetPipePolicy")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetPipePolicy.\n"); + } + + if ((pUsbK_ReadPipe = (UsbK_ReadPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ReadPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ReadPipe.\n"); + } + + if ((pUsbK_WritePipe = (UsbK_WritePipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_WritePipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_WritePipe.\n"); + } + + if ((pUsbK_ResetPipe = (UsbK_ResetPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ResetPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ResetPipe.\n"); + } + + if ((pUsbK_AbortPipe = (UsbK_AbortPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_AbortPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_AbortPipe.\n"); + } + + if ((pUsbK_FlushPipe = (UsbK_FlushPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_FlushPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_FlushPipe.\n"); + } + + if ((pUsbK_IsoReadPipe = (UsbK_IsoReadPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_IsoReadPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_IsoReadPipe.\n"); + } + + if ((pUsbK_IsoWritePipe = (UsbK_IsoWritePipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_IsoWritePipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_IsoWritePipe.\n"); + } + + if ((pUsbK_GetCurrentFrameNumber = (UsbK_GetCurrentFrameNumber_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetCurrentFrameNumber")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetCurrentFrameNumber.\n"); + } + + if ((pUsbK_GetOverlappedResult = (UsbK_GetOverlappedResult_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetOverlappedResult")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetOverlappedResult.\n"); + } + + if ((pUsbK_GetProperty = (UsbK_GetProperty_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetProperty")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetProperty.\n"); + } + + if ((pLstK_Init = (LstK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_Init.\n"); + } + + if ((pLstK_InitEx = (LstK_InitEx_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_InitEx")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_InitEx.\n"); + } + + if ((pLstK_Free = (LstK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_Free.\n"); + } + + if ((pLstK_Enumerate = (LstK_Enumerate_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_Enumerate")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_Enumerate.\n"); + } + + if ((pLstK_Current = (LstK_Current_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_Current")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_Current.\n"); + } + + if ((pLstK_MoveNext = (LstK_MoveNext_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_MoveNext")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_MoveNext.\n"); + } + + if ((pLstK_MoveReset = (LstK_MoveReset_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_MoveReset")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_MoveReset.\n"); + } + + if ((pLstK_FindByVidPid = (LstK_FindByVidPid_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_FindByVidPid")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_FindByVidPid.\n"); + } + + if ((pLstK_Count = (LstK_Count_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_Count")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_Count.\n"); + } + + if ((pHotK_Init = (HotK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "HotK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function HotK_Init.\n"); + } + + if ((pHotK_Free = (HotK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "HotK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function HotK_Free.\n"); + } + + if ((pHotK_FreeAll = (HotK_FreeAll_T*)GetProcAddress(mLibusbK_ModuleHandle, "HotK_FreeAll")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function HotK_FreeAll.\n"); + } + + if ((pOvlK_Acquire = (OvlK_Acquire_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_Acquire")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_Acquire.\n"); + } + + if ((pOvlK_Release = (OvlK_Release_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_Release")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_Release.\n"); + } + + if ((pOvlK_Init = (OvlK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_Init.\n"); + } + + if ((pOvlK_Free = (OvlK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_Free.\n"); + } + + if ((pOvlK_GetEventHandle = (OvlK_GetEventHandle_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_GetEventHandle")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_GetEventHandle.\n"); + } + + if ((pOvlK_Wait = (OvlK_Wait_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_Wait")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_Wait.\n"); + } + + if ((pOvlK_WaitOldest = (OvlK_WaitOldest_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_WaitOldest")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_WaitOldest.\n"); + } + + if ((pOvlK_WaitOrCancel = (OvlK_WaitOrCancel_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_WaitOrCancel")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_WaitOrCancel.\n"); + } + + if ((pOvlK_WaitAndRelease = (OvlK_WaitAndRelease_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_WaitAndRelease")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_WaitAndRelease.\n"); + } + + if ((pOvlK_IsComplete = (OvlK_IsComplete_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_IsComplete")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_IsComplete.\n"); + } + + if ((pOvlK_ReUse = (OvlK_ReUse_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_ReUse")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_ReUse.\n"); + } + + if ((pStmK_Init = (StmK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Init.\n"); + } + + if ((pStmK_Free = (StmK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Free.\n"); + } + + if ((pStmK_Start = (StmK_Start_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Start")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Start.\n"); + } + + if ((pStmK_Stop = (StmK_Stop_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Stop")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Stop.\n"); + } + + if ((pStmK_Read = (StmK_Read_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Read")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Read.\n"); + } + + if ((pStmK_Write = (StmK_Write_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Write")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Write.\n"); + } + + if ((pIsoK_Init = (IsoK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_Init.\n"); + } + + if ((pIsoK_Free = (IsoK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_Free.\n"); + } + + if ((pIsoK_SetPackets = (IsoK_SetPackets_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_SetPackets")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_SetPackets.\n"); + } + + if ((pIsoK_SetPacket = (IsoK_SetPacket_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_SetPacket")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_SetPacket.\n"); + } + + if ((pIsoK_GetPacket = (IsoK_GetPacket_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_GetPacket")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_GetPacket.\n"); + } + + if ((pIsoK_EnumPackets = (IsoK_EnumPackets_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_EnumPackets")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_EnumPackets.\n"); + } + + if ((pIsoK_ReUse = (IsoK_ReUse_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_ReUse")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_ReUse.\n"); + } + + + + /////////////////////////////////////////////////////////////////////// + + return funcLoadFailCount; +} + +// Function wrappers: + +KUSB_EXP VOID KUSB_API LibK_GetVersion(_out PKLIB_VERSION Version) +{ + pLibK_GetVersion(Version); +} + +KUSB_EXP KLIB_USER_CONTEXT KUSB_API LibK_GetContext( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType) +{ + return pLibK_GetContext(Handle, HandleType); +} + +KUSB_EXP BOOL KUSB_API LibK_SetContext( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue) +{ + return pLibK_SetContext(Handle, HandleType, ContextValue); +} + +KUSB_EXP BOOL KUSB_API LibK_SetCleanupCallback( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_HANDLE_CLEANUP_CB* CleanupCB) +{ + return pLibK_SetCleanupCallback(Handle, HandleType, CleanupCB); +} + +KUSB_EXP BOOL KUSB_API LibK_LoadDriverAPI( + _out PKUSB_DRIVER_API DriverAPI, + _in INT DriverID) +{ + return pLibK_LoadDriverAPI(DriverAPI, DriverID); +} + +KUSB_EXP BOOL KUSB_API LibK_CopyDriverAPI( + _out PKUSB_DRIVER_API DriverAPI, + _in KUSB_HANDLE UsbHandle) +{ + return pLibK_CopyDriverAPI(DriverAPI, UsbHandle); +} + +KUSB_EXP BOOL KUSB_API LibK_GetProcAddress( + _out KPROC* ProcAddress, + _in INT DriverID, + _in INT FunctionID) +{ + return pLibK_GetProcAddress(ProcAddress, DriverID, FunctionID); +} + +KUSB_EXP BOOL KUSB_API LibK_SetDefaultContext( + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue) +{ + return pLibK_SetDefaultContext(HandleType, ContextValue); +} + +KUSB_EXP KLIB_USER_CONTEXT KUSB_API LibK_GetDefaultContext( + _in KLIB_HANDLE_TYPE HandleType) +{ + return pLibK_GetDefaultContext(HandleType); +} + +KUSB_EXP BOOL KUSB_API LibK_Context_Init( + _inopt HANDLE Heap, + _in PVOID Reserved) +{ + return pLibK_Context_Init(Heap, Reserved); +} + +KUSB_EXP VOID KUSB_API LibK_Context_Free(VOID) +{ + pLibK_Context_Free(); +} + +KUSB_EXP BOOL KUSB_API UsbK_Init ( + _out KUSB_HANDLE* InterfaceHandle, + _in KLST_DEVINFO_HANDLE DevInfo) +{ + return pUsbK_Init(InterfaceHandle, DevInfo); +} + +KUSB_EXP BOOL KUSB_API UsbK_Free ( + _in KUSB_HANDLE InterfaceHandle) +{ + return pUsbK_Free(InterfaceHandle); +} + +KUSB_EXP BOOL KUSB_API UsbK_ClaimInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex) +{ + return pUsbK_ClaimInterface(InterfaceHandle, NumberOrIndex, IsIndex); +} + +KUSB_EXP BOOL KUSB_API UsbK_ReleaseInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex) +{ + return pUsbK_ReleaseInterface(InterfaceHandle, NumberOrIndex, IsIndex); +} + +KUSB_EXP BOOL KUSB_API UsbK_SetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _in UCHAR AltSettingNumber) +{ + return pUsbK_SetAltInterface(InterfaceHandle, NumberOrIndex, IsIndex, AltSettingNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _out PUCHAR AltSettingNumber) +{ + return pUsbK_GetAltInterface(InterfaceHandle, NumberOrIndex, IsIndex, AltSettingNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetDescriptor ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR DescriptorType, + _in UCHAR Index, + _in USHORT LanguageID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred) +{ + return pUsbK_GetDescriptor(InterfaceHandle, DescriptorType, Index, LanguageID, Buffer, BufferLength, LengthTransferred); +} + +KUSB_EXP BOOL KUSB_API UsbK_ControlTransfer ( + _in KUSB_HANDLE InterfaceHandle, + _in WINUSB_SETUP_PACKET SetupPacket, + _refopt PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped) +{ + return pUsbK_ControlTransfer(InterfaceHandle, SetupPacket, Buffer, BufferLength, LengthTransferred, Overlapped); +} + +KUSB_EXP BOOL KUSB_API UsbK_SetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value) +{ + return pUsbK_SetPowerPolicy(InterfaceHandle, PolicyType, ValueLength, Value); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value) +{ + return pUsbK_GetPowerPolicy(InterfaceHandle, PolicyType, ValueLength, Value); +} + +KUSB_EXP BOOL KUSB_API UsbK_SetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR ConfigurationNumber) +{ + return pUsbK_SetConfiguration(InterfaceHandle, ConfigurationNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR ConfigurationNumber) +{ + return pUsbK_GetConfiguration(InterfaceHandle, ConfigurationNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_ResetDevice ( + _in KUSB_HANDLE InterfaceHandle) +{ + return pUsbK_ResetDevice(InterfaceHandle); +} + +KUSB_EXP BOOL KUSB_API UsbK_Initialize ( + _in HANDLE DeviceHandle, + _out KUSB_HANDLE* InterfaceHandle) +{ + return pUsbK_Initialize(DeviceHandle, InterfaceHandle); +} + +KUSB_EXP BOOL KUSB_API UsbK_SelectInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex) +{ + return pUsbK_SelectInterface(InterfaceHandle, NumberOrIndex, IsIndex); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetAssociatedInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AssociatedInterfaceIndex, + _out KUSB_HANDLE* AssociatedInterfaceHandle) +{ + return pUsbK_GetAssociatedInterface(InterfaceHandle, AssociatedInterfaceIndex, AssociatedInterfaceHandle); +} + +KUSB_EXP BOOL KUSB_API UsbK_Clone ( + _in KUSB_HANDLE InterfaceHandle, + _out KUSB_HANDLE* DstInterfaceHandle) +{ + return pUsbK_Clone(InterfaceHandle, DstInterfaceHandle); +} + +KUSB_EXP BOOL KUSB_API UsbK_QueryInterfaceSettings ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingIndex, + _out PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor) +{ + return pUsbK_QueryInterfaceSettings(InterfaceHandle, AltSettingIndex, UsbAltInterfaceDescriptor); +} + +KUSB_EXP BOOL KUSB_API UsbK_QueryDeviceInformation ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT InformationType, + _ref PUINT BufferLength, + _ref PVOID Buffer) +{ + return pUsbK_QueryDeviceInformation(InterfaceHandle, InformationType, BufferLength, Buffer); +} + +KUSB_EXP BOOL KUSB_API UsbK_SetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber) +{ + return pUsbK_SetCurrentAlternateSetting(InterfaceHandle, AltSettingNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR AltSettingNumber) +{ + return pUsbK_GetCurrentAlternateSetting(InterfaceHandle, AltSettingNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_QueryPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber, + _in UCHAR PipeIndex, + _out PWINUSB_PIPE_INFORMATION PipeInformation) +{ + return pUsbK_QueryPipe(InterfaceHandle, AltSettingNumber, PipeIndex, PipeInformation); +} + +KUSB_EXP BOOL KUSB_API UsbK_SetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value) +{ + return pUsbK_SetPipePolicy(InterfaceHandle, PipeID, PolicyType, ValueLength, Value); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value) +{ + return pUsbK_GetPipePolicy(InterfaceHandle, PipeID, PolicyType, ValueLength, Value); +} + +KUSB_EXP BOOL KUSB_API UsbK_ReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped) +{ + return pUsbK_ReadPipe(InterfaceHandle, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped); +} + +KUSB_EXP BOOL KUSB_API UsbK_WritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped) +{ + return pUsbK_WritePipe(InterfaceHandle, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped); +} + +KUSB_EXP BOOL KUSB_API UsbK_ResetPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID) +{ + return pUsbK_ResetPipe(InterfaceHandle, PipeID); +} + +KUSB_EXP BOOL KUSB_API UsbK_AbortPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID) +{ + return pUsbK_AbortPipe(InterfaceHandle, PipeID); +} + +KUSB_EXP BOOL KUSB_API UsbK_FlushPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID) +{ + return pUsbK_FlushPipe(InterfaceHandle, PipeID); +} + +KUSB_EXP BOOL KUSB_API UsbK_IsoReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext) +{ + return pUsbK_IsoReadPipe(InterfaceHandle, PipeID, Buffer, BufferLength, Overlapped, IsoContext); +} + +KUSB_EXP BOOL KUSB_API UsbK_IsoWritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext) +{ + return pUsbK_IsoWritePipe(InterfaceHandle, PipeID, Buffer, BufferLength, Overlapped, IsoContext); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetCurrentFrameNumber ( + _in KUSB_HANDLE InterfaceHandle, + _out PUINT FrameNumber) +{ + return pUsbK_GetCurrentFrameNumber(InterfaceHandle, FrameNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetOverlappedResult ( + _in KUSB_HANDLE InterfaceHandle, + _in LPOVERLAPPED Overlapped, + _out PUINT lpNumberOfBytesTransferred, + _in BOOL bWait) +{ + return pUsbK_GetOverlappedResult(InterfaceHandle, Overlapped, lpNumberOfBytesTransferred, bWait); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetProperty ( + _in KUSB_HANDLE InterfaceHandle, + _in KUSB_PROPERTY PropertyType, + _ref PUINT PropertySize, + _out PVOID Value) +{ + return pUsbK_GetProperty(InterfaceHandle, PropertyType, PropertySize, Value); +} + +KUSB_EXP BOOL KUSB_API LstK_Init( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags) +{ + return pLstK_Init(DeviceList, Flags); +} + +KUSB_EXP BOOL KUSB_API LstK_InitEx( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags, + _in PKLST_PATTERN_MATCH PatternMatch) +{ + return pLstK_InitEx(DeviceList, Flags, PatternMatch); +} + +KUSB_EXP BOOL KUSB_API LstK_Free( + _in KLST_HANDLE DeviceList) +{ + return pLstK_Free(DeviceList); +} + +KUSB_EXP BOOL KUSB_API LstK_Enumerate( + _in KLST_HANDLE DeviceList, + _in KLST_ENUM_DEVINFO_CB* EnumDevListCB, + _inopt PVOID Context) +{ + return pLstK_Enumerate(DeviceList, EnumDevListCB, Context); +} + +KUSB_EXP BOOL KUSB_API LstK_Current( + _in KLST_HANDLE DeviceList, + _out KLST_DEVINFO_HANDLE* DeviceInfo) +{ + return pLstK_Current(DeviceList, DeviceInfo); +} + +KUSB_EXP BOOL KUSB_API LstK_MoveNext( + _in KLST_HANDLE DeviceList, + _outopt KLST_DEVINFO_HANDLE* DeviceInfo) +{ + return pLstK_MoveNext(DeviceList, DeviceInfo); +} + +KUSB_EXP VOID KUSB_API LstK_MoveReset( + _in KLST_HANDLE DeviceList) +{ + pLstK_MoveReset(DeviceList); +} + +KUSB_EXP BOOL KUSB_API LstK_FindByVidPid( + _in KLST_HANDLE DeviceList, + _in INT Vid, + _in INT Pid, + _out KLST_DEVINFO_HANDLE* DeviceInfo) +{ + return pLstK_FindByVidPid(DeviceList, Vid, Pid, DeviceInfo); +} + +KUSB_EXP BOOL KUSB_API LstK_Count( + _in KLST_HANDLE DeviceList, + _ref PUINT Count) +{ + return pLstK_Count(DeviceList, Count); +} + +KUSB_EXP BOOL KUSB_API HotK_Init( + _out KHOT_HANDLE* Handle, + _ref PKHOT_PARAMS InitParams) +{ + return pHotK_Init(Handle, InitParams); +} + +KUSB_EXP BOOL KUSB_API HotK_Free( + _in KHOT_HANDLE Handle) +{ + return pHotK_Free(Handle); +} + +KUSB_EXP VOID KUSB_API HotK_FreeAll(VOID) +{ + pHotK_FreeAll(); +} + +KUSB_EXP BOOL KUSB_API OvlK_Acquire( + _out KOVL_HANDLE* OverlappedK, + _in KOVL_POOL_HANDLE PoolHandle) +{ + return pOvlK_Acquire(OverlappedK, PoolHandle); +} + +KUSB_EXP BOOL KUSB_API OvlK_Release( + _in KOVL_HANDLE OverlappedK) +{ + return pOvlK_Release(OverlappedK); +} + +KUSB_EXP BOOL KUSB_API OvlK_Init ( + _out KOVL_POOL_HANDLE* PoolHandle, + _in KUSB_HANDLE UsbHandle, + _in INT MaxOverlappedCount, + _inopt KOVL_POOL_FLAG Flags) +{ + return pOvlK_Init(PoolHandle, UsbHandle, MaxOverlappedCount, Flags); +} + +KUSB_EXP BOOL KUSB_API OvlK_Free( + _in KOVL_POOL_HANDLE PoolHandle) +{ + return pOvlK_Free(PoolHandle); +} + +KUSB_EXP HANDLE KUSB_API OvlK_GetEventHandle( + _in KOVL_HANDLE OverlappedK) +{ + return pOvlK_GetEventHandle(OverlappedK); +} + +KUSB_EXP BOOL KUSB_API OvlK_Wait( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength) +{ + return pOvlK_Wait(OverlappedK, TimeoutMS, WaitFlags, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API OvlK_WaitOldest( + _in KOVL_POOL_HANDLE PoolHandle, + _outopt KOVL_HANDLE* OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength) +{ + return pOvlK_WaitOldest(PoolHandle, OverlappedK, TimeoutMS, WaitFlags, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API OvlK_WaitOrCancel( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength) +{ + return pOvlK_WaitOrCancel(OverlappedK, TimeoutMS, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API OvlK_WaitAndRelease( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength) +{ + return pOvlK_WaitAndRelease(OverlappedK, TimeoutMS, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API OvlK_IsComplete( + _in KOVL_HANDLE OverlappedK) +{ + return pOvlK_IsComplete(OverlappedK); +} + +KUSB_EXP BOOL KUSB_API OvlK_ReUse( + _in KOVL_HANDLE OverlappedK) +{ + return pOvlK_ReUse(OverlappedK); +} + +KUSB_EXP BOOL KUSB_API StmK_Init( + _out KSTM_HANDLE* StreamHandle, + _in KUSB_HANDLE UsbHandle, + _in UCHAR PipeID, + _in INT MaxTransferSize, + _in INT MaxPendingTransfers, + _in INT MaxPendingIO, + _inopt PKSTM_CALLBACK Callbacks, + _inopt KSTM_FLAG Flags) +{ + return pStmK_Init(StreamHandle, UsbHandle, PipeID, MaxTransferSize, MaxPendingTransfers, MaxPendingIO, Callbacks, Flags); +} + +KUSB_EXP BOOL KUSB_API StmK_Free( + _in KSTM_HANDLE StreamHandle) +{ + return pStmK_Free(StreamHandle); +} + +KUSB_EXP BOOL KUSB_API StmK_Start( + _in KSTM_HANDLE StreamHandle) +{ + return pStmK_Start(StreamHandle); +} + +KUSB_EXP BOOL KUSB_API StmK_Stop( + _in KSTM_HANDLE StreamHandle, + _in INT TimeoutCancelMS) +{ + return pStmK_Stop(StreamHandle, TimeoutCancelMS); +} + +KUSB_EXP BOOL KUSB_API StmK_Read( + _in KSTM_HANDLE StreamHandle, + _out PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength) +{ + return pStmK_Read(StreamHandle, Buffer, Offset, Length, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API StmK_Write( + _in KSTM_HANDLE StreamHandle, + _in PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength) +{ + return pStmK_Write(StreamHandle, Buffer, Offset, Length, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API IsoK_Init( + _out PKISO_CONTEXT* IsoContext, + _in INT NumberOfPackets, + _inopt INT StartFrame) +{ + return pIsoK_Init(IsoContext, NumberOfPackets, StartFrame); +} + +KUSB_EXP BOOL KUSB_API IsoK_Free( + _in PKISO_CONTEXT IsoContext) +{ + return pIsoK_Free(IsoContext); +} + +KUSB_EXP BOOL KUSB_API IsoK_SetPackets( + _in PKISO_CONTEXT IsoContext, + _in INT PacketSize) +{ + return pIsoK_SetPackets(IsoContext, PacketSize); +} + +KUSB_EXP BOOL KUSB_API IsoK_SetPacket( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _in PKISO_PACKET IsoPacket) +{ + return pIsoK_SetPacket(IsoContext, PacketIndex, IsoPacket); +} + +KUSB_EXP BOOL KUSB_API IsoK_GetPacket( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _out PKISO_PACKET IsoPacket) +{ + return pIsoK_GetPacket(IsoContext, PacketIndex, IsoPacket); +} + +KUSB_EXP BOOL KUSB_API IsoK_EnumPackets( + _in PKISO_CONTEXT IsoContext, + _in KISO_ENUM_PACKETS_CB* EnumPackets, + _inopt INT StartPacketIndex, + _inopt PVOID UserState) +{ + return pIsoK_EnumPackets(IsoContext, EnumPackets, StartPacketIndex, UserState); +} + +KUSB_EXP BOOL KUSB_API IsoK_ReUse( + _ref PKISO_CONTEXT IsoContext) +{ + return pIsoK_ReUse(IsoContext); +} + + + +/////////////////////////////////////////////////////////////////////// diff --git a/Desktop Interface/libusbk/includes/lusbk_shared.h b/Desktop Interface/libusbk/includes/lusbk_shared.h new file mode 100644 index 00000000..ddfa3fa9 --- /dev/null +++ b/Desktop Interface/libusbk/includes/lusbk_shared.h @@ -0,0 +1,309 @@ +/*! \file lusbk_shared.h +* \brief Types and defines shared with the driver. +*/ + +#ifndef __LUSBK_SHARED_H_ +#define __LUSBK_SHARED_H_ + +#ifndef __USB_H__ + +//! Values used in the \c bmAttributes field of a \ref USB_ENDPOINT_DESCRIPTOR +typedef enum _USBD_PIPE_TYPE +{ + //! Indicates a control endpoint + UsbdPipeTypeControl, + + //! Indicates an isochronous endpoint + UsbdPipeTypeIsochronous, + + //! Indicates a bulk endpoint + UsbdPipeTypeBulk, + + //! Indicates an interrupt endpoint + UsbdPipeTypeInterrupt, +} USBD_PIPE_TYPE; + +#endif + +#if !defined(__WINUSB_COMPAT_IO_H__) && !defined(__WUSBIO_H__) + +// pipe policy types /////////////// +#define SHORT_PACKET_TERMINATE 0x01 +#define AUTO_CLEAR_STALL 0x02 +#define PIPE_TRANSFER_TIMEOUT 0x03 +#define IGNORE_SHORT_PACKETS 0x04 +#define ALLOW_PARTIAL_READS 0x05 +#define AUTO_FLUSH 0x06 +#define RAW_IO 0x07 +#define MAXIMUM_TRANSFER_SIZE 0x08 +#define RESET_PIPE_ON_RESUME 0x09 + +// libusbK ISO pipe policy types /// +#define ISO_START_LATENCY 0x20 +#define ISO_ALWAYS_START_ASAP 0x21 +#define ISO_NUM_FIXED_PACKETS 0x22 + +// http://msdn.microsoft.com/en-us/library/windows/hardware/ff552359%28v=vs.85%29.aspx +// Settings.Parallel.NumberOfPresentedRequests +// Maximum number of transfers that can be asynchronously delivered at a +// time. Available in version 1.9 and later versions of KMDF. +#define SIMUL_PARALLEL_REQUESTS 0x30 + +// Power policy types ////////////// +#define AUTO_SUSPEND 0x81 +#define SUSPEND_DELAY 0x83 + +// Device Information types //////// +#define DEVICE_SPEED 0x01 + +// Device Speeds +#define LowSpeed 0x01 +#define FullSpeed 0x02 +#define HighSpeed 0x03 + +//! The \c WINUSB_PIPE_INFORMATION structure contains pipe information that the \ref UsbK_QueryPipe routine retrieves. +typedef struct _WINUSB_PIPE_INFORMATION +{ + //! A \c USBD_PIPE_TYPE enumeration value that specifies the pipe type + USBD_PIPE_TYPE PipeType; + + //! The pipe identifier (ID) + UCHAR PipeId; + + //! The maximum size, in bytes, of the packets that are transmitted on the pipe + USHORT MaximumPacketSize; + + //! The pipe interval + UCHAR Interval; + +} WINUSB_PIPE_INFORMATION; +//! Pointer to a \ref WINUSB_PIPE_INFORMATION structure +typedef WINUSB_PIPE_INFORMATION* PWINUSB_PIPE_INFORMATION; +C_ASSERT(sizeof(WINUSB_PIPE_INFORMATION) == 12); + +#include + +//! The \c WINUSB_SETUP_PACKET structure describes a USB setup packet. +/*! +* It is often more convient to use this structure in combination with a \ref KUSB_SETUP_PACKET. +* For example: +* \code + +* \endcode +*/ +typedef struct _WINUSB_SETUP_PACKET +{ + //! The request type. The values that are assigned to this member are defined in Table 9.2 of section 9.3 of the Universal Serial Bus (USB) specification (www.usb.org). + UCHAR RequestType; + + //! The device request. The values that are assigned to this member are defined in Table 9.3 of section 9.4 of the Universal Serial Bus (USB) specification. + UCHAR Request; + + //! The meaning of this member varies according to the request. For an explanation of this member, see the Universal Serial Bus (USB) specification. + USHORT Value; + + //! The meaning of this member varies according to the request. For an explanation of this member, see the Universal Serial Bus (USB) specification. + USHORT Index; + + //! The number of bytes to transfer. (not including the \c WINUSB_SETUP_PACKET itself) + USHORT Length; + +} WINUSB_SETUP_PACKET; +//! pointer to a \c WINUSB_SETUP_PACKET structure +typedef WINUSB_SETUP_PACKET* PWINUSB_SETUP_PACKET; +C_ASSERT(sizeof(WINUSB_SETUP_PACKET) == 8); + +#include + +#endif // __WUSBIO_H__ __WINUSB_COMPAT_IO_H__ + +#include + +/*! \addtogroup isok +* @{ +*/ + +//! Structure describing an isochronous transfer packet. +typedef struct _KISO_PACKET +{ + //! Specifies the offset, in bytes, of the buffer for this packet from the beginning of the entire isochronous transfer data buffer. + /*! + * \c Offset represents an absolute data offset from the start of the \c Buffer parameter \ref UsbK_IsoReadPipe or \ref UsbK_IsoWritePipe. + * + * \note This field is assigned by the user application only and used by the driver upon transfer submission and completion. + */ + UINT Offset; + + //! Set by the host controller to indicate the actual number of bytes received by the device for isochronous IN transfers. Length not used for isochronous OUT transfers. + /*! + * \note This field is is not user assignable and is updated by the driver upon transfer completion. + */ + USHORT Length; + + //! Contains the 16 least significant USBD status bits, on return from the host controller driver, of this transfer packet. + /*! + * See MSDN for USBD status codes: USBD status code reference + * + * \note This field is is not user assignable and is updated by the driver upon transfer completion. + */ + USHORT Status; + +} KISO_PACKET; +//! pointer to a \c KISO_PACKET structure +typedef KISO_PACKET* PKISO_PACKET; + +#pragma warning(disable:4200) + +//! Additional ISO transfer flags. +typedef enum _KISO_FLAG +{ + KISO_FLAG_NONE = 0, + + //! Do not start the transfer immediately, instead use \ref KISO_CONTEXT::StartFrame. + /*! + * By default, isochronous transfers start on the next frame and \ref KISO_CONTEXT::StartFrame is + * ignored. If this flag is specified, the transfer is postponed until the current usb frame number + * equals that specified by \ref KISO_CONTEXT::StartFrame. + * + * Under certain circumstances, the driver can specify 0 for \ref KISO_CONTEXT::StartFrame, and the bus + * driver will begin the transaction in the next available frame. + * + * Specifing \b 0 for \ref KISO_CONTEXT::StartFrame (start transfer ASAP) is restricted to the first + * transaction on a newly opened or reset pipe. Furthermore, the USB stack contains a bug in Microsoft + * Windows Server 2003 and Windows XP that limits the use of this to an isochronous context with 255 or fewer + * packets. + * + * For more information about resetting pipes, see \ref UsbK_ResetPipe. + */ + KISO_FLAG_SET_START_FRAME = 0x00000001, +} KISO_FLAG; + +//! Structure describing a user defined isochronous transfer. +/*! +* +* \fixedstruct{16} +* +* The \ref KISO_CONTEXT::StartFrame member of the \ref KISO_CONTEXT specifies the starting USB frame number +* for the transaction. The driver can use \ref UsbK_GetCurrentFrameNumber to request the current frame +* number. +* +* In full-speed transmissions, the frame number for any particular packet will be the sum of the start frame +* number and the packet index. For instance, the fourth packet in the \ref KISO_CONTEXT has an index of 3, so +* its frame number will be StartFrame + 3. In a write transfer, the port driver loads this frame with the +* buffer data at the data buffer offset specified by IsoPacket[3].Offset. +* +* When the driver processes the \ref KISO_CONTEXT, it discards all packets in the \ref KISO_CONTEXT whose +* frame numbers are lower than the current frame number. The port driver sets the Status member of the packet +* descriptor for each discarded packet to USBD_STATUS_ISO_NA_LATE_USBPORT, USBD_STATUS_ISO_NOT_ACCESSED_BY_HW +* or USBD_STATUS_ISO_NOT_ACCESSED_LATE. Even if it discards some packets, the port driver attempts to +* transmit those packets in the \ref KISO_CONTEXT whose frame numbers are higher than the current frame +* number. +* +* The check for a valid StartFrame member is slightly more complicated in high-speed transmissions because +* the port driver loads each packet into a high-speed microframe; however, the value in StartFrame refers to +* the 1 millisecond (full-speed) frame number, not the microframe. For example, if the StartFrame value +* recorded in the \ref KISO_CONTEXT is one less than the current frame, the port driver will discard as many +* as eight packets. The exact number of packets that the port driver discards depends on the period +* associated with the isochronous pipe. +* +* High-speed isochronous pipes can have periods of 1, 2, 4, or 8. The period number specifies the frequency +* with which the port driver inserts packets into the data stream. If the period is 2, for example, the port +* driver will insert a packet into the data stream every two microframes. This means that it will only use +* four of the eight microframes available within each 1-millisecond frame for isochronous data transmission. +* +* In general, the higher the period, the fewer packets the port driver will discard when a \ref KISO_CONTEXT +* arrives late. Assume the period on an isochronous pipe is 2. With a period of 2, each 1-millisecond speed +* frame will carry four packets of isochronous data for that pipe. So, for example, if CurrentFrame - +* StartFrame = 3, the port driver will discard 3 * 4 = 12 packets. On the other hand, if the period is 4, +* each 1-millisecond frame carries only two packets of isochronous data for the pipe. Therefore, if the +* \ref KISO_CONTEXT arrives three 1-millisecond frames late, as in the previous example, the port driver will +* discard 3 * 2 = 6 packets, instead of 12 packets. +* +* For all types of isochronous pipe, the distance between the current frame and the StartFrame value +* specified in the \ref KISO_CONTEXT must be less than USBD_ISO_START_FRAME_RANGE. If StartFrame is not +* within the proper range, the driver sets the Status member of the \ref KISO_PACKET +* \c USBD_STATUS_BAD_START_FRAME and discards the entire \ref KISO_CONTEXT. The following code example shows +* the precise check that the port driver does on the \ref KISO_CONTEXT start frame: +* \code +* if (abs((CurrentFrame - StartFrame)) > USBD_ISO_START_FRAME_RANGE) +* { +* // discard the KISO_CONTEXT +* } +* \endcode +* +*/ +typedef struct _KISO_CONTEXT +{ + //! Additional ISO transfer flags. See \ref KISO_FLAG. + KISO_FLAG Flags; + + //! Specifies the frame number that the transfer should begin on (0 for ASAP). + /*! + * This variable must be within a system-defined range of the current frame. The range is specified by the + * constant \ref USBD_ISO_START_FRAME_RANGE. + * + * If /ref KISO_FLAG_SET_START_FRAME was specified, this member contains the frame number that the transfer should begin on. + * When the request is returned by the host controller driver, this member is updated to reflect the frame number this transfer + * did begin on. + * + * \note This field may be assigned by the user application and is updated by the driver upon transfer + * completion. + */ + UINT StartFrame; + + //! Contains the number of packets that completed with an error condition on return from the host controller driver. + /*! + * \note This field is is not user assignable and is updated by the driver upon transfer completion. + */ + SHORT ErrorCount; + + //! Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + /* + * \note This field is assigned by the user application only and used by the driver upon transfer submission + * and completion. + */ + SHORT NumberOfPackets; + + //! Contains the URB Hdr.Status value on return from the host controller driver. + /*! + * \note This field is is not user assignable and is updated by the driver upon transfer completion. + * + * The USB bus driver always returns a value of USBD_STATUS_SUCCESS in + * Hdr.Status, unless every packet in the transfer generated an error or + * the request was not well-formed and could not be executed at all. The + * following table includes possible error codes returned in Hdr.Status: + * - USBD_STATUS_ISOCH_REQUEST_FAILED + * Indicates that every packet of an isochronous request was completed with + * errors. + * - USBD_STATUS_BAD_START_FRAME + * Indicates that the requested start frame is not within + * USBD_ISO_START_FRAME_RANGE of the current USB frame. + * - USBD_ISO_NOT_ACCESSED_LATE + * Indicates that every packet was submitted too late for the packet to be + * sent, based on the requested start frame. + * - USBD_STATUS_INVALID_PARAMETER + * Indicates that one of the URB parameters was incorrect. + */ + UINT UrbHdrStatus; + + //! Contains a variable-length array of \c KISO_PACKET structures that describe the isochronous transfer packets to be transferred on the USB bus. + /* + * \note This field is assigned by the user application, used by the driver upon transfer submission, and + * updated by the driver upon transfer completion. + */ + KISO_PACKET IsoPackets[0]; + +} KISO_CONTEXT; +C_ASSERT(sizeof(KISO_CONTEXT) == 16); + +//! pointer to a \c KISO_CONTEXT structure +typedef KISO_CONTEXT* PKISO_CONTEXT; + +/*! @} */ + +#pragma warning(default:4200) + +#include + +#endif // __LUSBK_SHARED_H_ + diff --git a/Desktop Interface/main.cpp b/Desktop Interface/main.cpp new file mode 100644 index 00000000..b48f94ec --- /dev/null +++ b/Desktop Interface/main.cpp @@ -0,0 +1,11 @@ +#include "mainwindow.h" +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + + return a.exec(); +} diff --git a/Desktop Interface/mainwindow.cpp b/Desktop Interface/mainwindow.cpp new file mode 100644 index 00000000..ef021b14 --- /dev/null +++ b/Desktop Interface/mainwindow.cpp @@ -0,0 +1,891 @@ +#include "mainwindow.h" +#include "qcustomplot.h" +#include "ui_mainwindow.h" +#include +#include +#include +#include +#include + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow) +{ + ui->setupUi(this); + ui->psuDisplay->display("4.00"); + ui->bufferDisplay->refreshImage(); + + ui->waveformSelect_CH1->readWaveformList(); + ui->waveformSelect_CH2->readWaveformList(); + + labelPsu(); + + ui->psuDisplay->display("4.50"); + + ui->controller_iso->setDriver(ui->controller_usb); + ui->controller_iso->setAxes(ui->scopeAxes); + + ui->timeBaseSlider->setMaximum(10*log10(MAX_WINDOW_SIZE)); + + ui->controller_usb->setBufferPtr(ui->bufferDisplay); + ui->cursorStatsLabel->hide(); + initialisePlot(); + menuSetup(); + + ui->voltageInfoMaxDisplay_CH1->display(5312); + ui->voltageInfoMinDisplay_CH1->display(0.01); + ui->voltageInfoMeanDisplay_CH1->display(0.02); + ui->voltageInfoRmsDisplay_CH1->display(6.00); + connectDisplaySignals(); + + ui->controller_iso->internalBuffer375_CH1->console1 = ui->console1; + ui->controller_iso->internalBuffer375_CH1->console2 = ui->console2; + + ui->controller_iso->internalBuffer375_CH2->console1 = ui->console1; + ui->controller_iso->internalBuffer375_CH2->console2 = ui->console2; + initShortcuts(); + + ui->console1->setVisible(0); + ui->console2->setVisible(0); + ui->timeBaseSlider->setVisible(0); + + /* + ui->multimeterModeLabel->setVisible(0); + ui->multimeterModeSelect->setVisible(0); + ui->multimeterResistanceLabel->setVisible(0); + ui->multimeterResistanceSelect->setVisible(0); + */ + + /* + ui->multimeterMaxLabel->setVisible(0); + ui->multimeterMinLabel->setVisible(0); + ui->multimeterMeanLabel->setVisible(0); + ui->multimeterRmsLabel->setVisible(0); + + ui->multimeterMaxDisplay->setVisible(0); + ui->multimeterMinDisplay->setVisible(0); + ui->multimeterMeanDisplay->setVisible(0); + ui->multimeterRmsDisplay->setVisible(0); + */ +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::initialisePlot() +{ + ui->scopeAxes->addGraph(); + ui->scopeAxes->addGraph(); + ui->scopeAxes->addGraph(); + ui->scopeAxes->addGraph(); + ui->scopeAxes->addGraph(); + ui->scopeAxes->addGraph(); + + textLabel = new QCPItemText(ui->scopeAxes); + ui->scopeAxes->addItem(textLabel); + textLabel->setPositionAlignment(Qt::AlignTop|Qt::AlignRight); + textLabel->position->setType(QCPItemPosition::ptAxisRectRatio); + textLabel->position->setCoords(0.99, 0); // place position at center/top of axis rect + textLabel->setText("Cursor Label Here"); + textLabel->setFont(QFont("Courier New", 12)); + textLabel->setColor(Qt::white); + textLabel->setPen(QPen(Qt::white)); + textLabel->setBrush(QBrush(Qt::black)); + + textLabel->setVisible(0); + ui->controller_iso->cursorTextPtr = textLabel; + + + QPen *dashPen = new QPen(Qt::white, 2); + dashPen->setStyle(Qt::DashLine); + + ui->scopeAxes->graph(0)->setPen(QPen(Qt::yellow, 1)); + ui->scopeAxes->graph(1)->setPen(QPen(Qt::cyan, 1)); + ui->scopeAxes->graph(2)->setPen(QPen(Qt::white, 2)); + ui->scopeAxes->graph(3)->setPen(*(dashPen)); + ui->scopeAxes->graph(4)->setPen(QPen(Qt::white, 2)); + ui->scopeAxes->graph(5)->setPen(*(dashPen)); + + ui->scopeAxes->yAxis->setAutoTickCount(9); + ui->scopeAxes->xAxis->setAutoTickCount(9); + + + ui->scopeAxes->xAxis->setBasePen(QPen(Qt::white, 1)); + ui->scopeAxes->yAxis->setBasePen(QPen(Qt::white, 1)); + ui->scopeAxes->xAxis->setTickPen(QPen(Qt::white, 1)); + ui->scopeAxes->yAxis->setTickPen(QPen(Qt::white, 1)); + ui->scopeAxes->xAxis->setSubTickPen(QPen(Qt::white, 1)); + ui->scopeAxes->yAxis->setSubTickPen(QPen(Qt::white, 1)); + ui->scopeAxes->xAxis->setTickLength(6); + ui->scopeAxes->yAxis->setTickLength(6); + ui->scopeAxes->xAxis->setSubTickLength(4); + ui->scopeAxes->yAxis->setSubTickLength(4); + ui->scopeAxes->xAxis->setTickLabelColor(Qt::white); + ui->scopeAxes->yAxis->setTickLabelColor(Qt::white); + + ui->scopeAxes->setBackground(Qt::black); + + + ui->scopeAxes->replot(); +} + +void MainWindow::labelPsu(){ + char tempString[4]; + int tempInt = ui->psuSlider->maximum(); + int tempCounter = 0; + while(tempInt>90){ + sprintf(tempString, "%dV", tempInt/20); + ui->psuSlider->setTickLabel(tempString, tempCounter); + tempInt -= 20; + tempCounter++; + } + ui->psuSlider->setTickLabel("4.5V", 11); +} + +void MainWindow::resizeEvent(QResizeEvent *event){ + //ui->scopeAxes->yAxis->setAutoTickCount((ui->scopeAxes->height() + TICK_SEPARATION / 2) / TICK_SEPARATION); + //ui->scopeAxes->xAxis->setAutoTickCount((ui->scopeAxes->width() + TICK_SEPARATION / 2) / TICK_SEPARATION); + + //ui->scopeAxes->resize(ui->scopeAxes->height(), ui->scopeAxes->height()); + //qDebug() << ui->scopeAxes->yAxis->autoTickCount() << ui->scopeAxes->xAxis->autoTickCount(); + + if(forceSquare){ + int tempHeight = ui->scopeAxes->height(); + int tempWidth = ui->scopeAxes->width(); + int newDims = (tempHeight > tempWidth) ? tempWidth : tempHeight; + ui->scopeAxes->resize(newDims, newDims); + if(tempWidth > tempHeight){ + ui->scopeAxes->move(tempWidth-tempHeight, ui->scopeAxes->y()); + }else{ + ui->scopeAxes->move(ui->scopeAxes->x(), ui->scopeAxes->y() + (tempHeight - tempWidth) / 2); + } + } +} + +void MainWindow::menuSetup(){ + gainGroup = new QActionGroup(this); + gainGroup->addAction(ui->actionGainAuto); + gainGroup->addAction(ui->actionGain0_5); + gainGroup->addAction(ui->actionGain1); + gainGroup->addAction(ui->actionGain2); + gainGroup->addAction(ui->actionGain4); + gainGroup->addAction(ui->actionGain8); + gainGroup->addAction(ui->actionGain16); + gainGroup->addAction(ui->actionGain32); + gainGroup->addAction(ui->actionGain64); + ui->actionGainAuto->setChecked(1); + + rangeGroupV = new QActionGroup(this); + rangeGroupV->addAction(ui->actionAutoV); + rangeGroupV->addAction(ui->actionMV); + rangeGroupV->addAction(ui->actionV); + + rangeGroupI = new QActionGroup(this); + rangeGroupI->addAction(ui->actionAutoI); + rangeGroupI->addAction(ui->actionMA); + rangeGroupI->addAction(ui->actionA); + + fpsGroup = new QActionGroup(this); + fpsGroup->addAction(ui->action60FPS); + fpsGroup->addAction(ui->action30FPS); + fpsGroup->addAction(ui->action20FPS); + fpsGroup->addAction(ui->action15FPS); + fpsGroup->addAction(ui->action10FPS); + fpsGroup->addAction(ui->action5FPS); + + + connect(ui->actionAutoV, SIGNAL(toggled(bool)), ui->controller_iso, SLOT(setAutoMultimeterV(bool))); + connect(ui->actionV, SIGNAL(toggled(bool)), ui->controller_iso, SLOT(setForceVolts(bool))); + connect(ui->actionMV, SIGNAL(toggled(bool)), ui->controller_iso, SLOT(setForceMillivolts(bool))); + connect(ui->actionAutoI, SIGNAL(toggled(bool)), ui->controller_iso, SLOT(setAutoMultimeterI(bool))); + connect(ui->actionA, SIGNAL(toggled(bool)), ui->controller_iso, SLOT(setForceAmps(bool))); + connect(ui->actionMA, SIGNAL(toggled(bool)), ui->controller_iso, SLOT(setForceMilliamps(bool))); + + uartBaudGroup_CH1 = new QActionGroup(this); + uartBaudGroup_CH1->addAction(ui->action300); + uartBaudGroup_CH1->addAction(ui->action600); + uartBaudGroup_CH1->addAction(ui->action1200); + uartBaudGroup_CH1->addAction(ui->action2400); + uartBaudGroup_CH1->addAction(ui->action4800); + uartBaudGroup_CH1->addAction(ui->action9600); + uartBaudGroup_CH1->addAction(ui->action14400); + uartBaudGroup_CH1->addAction(ui->action19200); + uartBaudGroup_CH1->addAction(ui->action28800); + uartBaudGroup_CH1->addAction(ui->action38400); + uartBaudGroup_CH1->addAction(ui->action57600); + uartBaudGroup_CH1->addAction(ui->action115200); + ui->action9600->setChecked(1); + + uartBaudGroup_CH2 = new QActionGroup(this); + uartBaudGroup_CH2->addAction(ui->action300_2); + uartBaudGroup_CH2->addAction(ui->action600_2); + uartBaudGroup_CH2->addAction(ui->action1200_2); + uartBaudGroup_CH2->addAction(ui->action2400_2); + uartBaudGroup_CH2->addAction(ui->action4800_2); + uartBaudGroup_CH2->addAction(ui->action9600_2); + uartBaudGroup_CH2->addAction(ui->action14400_2); + uartBaudGroup_CH2->addAction(ui->action19200_2); + uartBaudGroup_CH2->addAction(ui->action28800_2); + uartBaudGroup_CH2->addAction(ui->action38400_2); + uartBaudGroup_CH2->addAction(ui->action57600_2); + uartBaudGroup_CH2->addAction(ui->action115200_2); + ui->action9600_2->setChecked(1); +} + +void MainWindow::on_actionGain0_5_triggered() +{ + ui->controller_usb->setGain(0.5); + ui->controller_iso->setAutoGain(0); +} + +void MainWindow::on_actionGain1_triggered() +{ + ui->controller_usb->setGain(1); + ui->controller_iso->setAutoGain(0); +} + +void MainWindow::on_actionGain2_triggered() +{ + ui->controller_usb->setGain(2); + ui->controller_iso->setAutoGain(0); +} + +void MainWindow::on_actionGain4_triggered() +{ + ui->controller_usb->setGain(4); + ui->controller_iso->setAutoGain(0); +} + +void MainWindow::on_actionGain8_triggered() +{ + ui->controller_usb->setGain(8); + ui->controller_iso->setAutoGain(0); +} + +void MainWindow::on_actionGain16_triggered() +{ + ui->controller_usb->setGain(16); + ui->controller_iso->setAutoGain(0); +} + +void MainWindow::on_actionGain32_triggered() +{ + ui->controller_usb->setGain(32); + ui->controller_iso->setAutoGain(0); +} + +void MainWindow::on_actionGain64_triggered() +{ + ui->controller_usb->setGain(64); + ui->controller_iso->setAutoGain(0); +} +void MainWindow::on_actionGainAuto_triggered() +{ + ui->controller_iso->setAutoGain(1); +} + +void MainWindow::on_actionCursor_Stats_triggered(bool checked) +{ + ui->controller_iso->cursorStatsEnabled = checked; +} + +void MainWindow::connectDisplaySignals(){ + connect(ui->actionMax, SIGNAL(toggled(bool)), ui->voltageInfoMaxLabel_CH1, SLOT(setVisible(bool))); + connect(ui->actionMax, SIGNAL(toggled(bool)), ui->voltageInfoMaxDisplay_CH1, SLOT(setVisible(bool))); + + connect(ui->actionMin, SIGNAL(toggled(bool)), ui->voltageInfoMinLabel_CH1, SLOT(setVisible(bool))); + connect(ui->actionMin, SIGNAL(toggled(bool)), ui->voltageInfoMinDisplay_CH1, SLOT(setVisible(bool))); + + connect(ui->actionMean, SIGNAL(toggled(bool)), ui->VoltageInfoMeanLabel_CH1, SLOT(setVisible(bool))); + connect(ui->actionMean, SIGNAL(toggled(bool)), ui->voltageInfoMeanDisplay_CH1, SLOT(setVisible(bool))); + + connect(ui->actionRMS, SIGNAL(toggled(bool)), ui->voltageInfoRmsLabel_CH1, SLOT(setVisible(bool))); + connect(ui->actionRMS, SIGNAL(toggled(bool)), ui->voltageInfoRmsDisplay_CH1, SLOT(setVisible(bool))); + + ui->voltageInfoMaxLabel_CH1->setVisible(0); + ui->voltageInfoMaxDisplay_CH1->setVisible(0); + ui->voltageInfoMinLabel_CH1->setVisible(0); + ui->voltageInfoMinDisplay_CH1->setVisible(0); + ui->VoltageInfoMeanLabel_CH1->setVisible(0); + ui->voltageInfoMeanDisplay_CH1->setVisible(0); + ui->voltageInfoRmsLabel_CH1->setVisible(0); + ui->voltageInfoRmsDisplay_CH1->setVisible(0); + + connect(ui->actionMax_2, SIGNAL(toggled(bool)), ui->voltageInfoMaxLabel_CH2, SLOT(setVisible(bool))); + connect(ui->actionMax_2, SIGNAL(toggled(bool)), ui->voltageInfoMaxDisplay_CH2, SLOT(setVisible(bool))); + + connect(ui->actionMin_2, SIGNAL(toggled(bool)), ui->voltageInfoMinLabel_CH2, SLOT(setVisible(bool))); + connect(ui->actionMin_2, SIGNAL(toggled(bool)), ui->voltageInfoMinDisplay_CH2, SLOT(setVisible(bool))); + + connect(ui->actionMean_2, SIGNAL(toggled(bool)), ui->VoltageInfoMeanLabel_CH2, SLOT(setVisible(bool))); + connect(ui->actionMean_2, SIGNAL(toggled(bool)), ui->voltageInfoMeanDisplay_CH2, SLOT(setVisible(bool))); + + connect(ui->actionRMS_2, SIGNAL(toggled(bool)), ui->voltageInfoRmsLabel_CH2, SLOT(setVisible(bool))); + connect(ui->actionRMS_2, SIGNAL(toggled(bool)), ui->voltageInfoRmsDisplay_CH2, SLOT(setVisible(bool))); + + ui->voltageInfoMaxLabel_CH2->setVisible(0); + ui->voltageInfoMaxDisplay_CH2->setVisible(0); + ui->voltageInfoMinLabel_CH2->setVisible(0); + ui->voltageInfoMinDisplay_CH2->setVisible(0); + ui->VoltageInfoMeanLabel_CH2->setVisible(0); + ui->voltageInfoMeanDisplay_CH2->setVisible(0); + ui->voltageInfoRmsLabel_CH2->setVisible(0); + ui->voltageInfoRmsDisplay_CH2->setVisible(0); +} + + + +void MainWindow::on_action300_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH1 = 300; + } +} + +void MainWindow::on_action600_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH1 = 600; + } +} + +void MainWindow::on_action1200_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH1 = 1200; + } +} + +void MainWindow::on_action2400_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH1 = 2400; + } +} + +void MainWindow::on_action4800_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH1 = 4800; + } +} + +void MainWindow::on_action9600_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH1 = 9600; + } +} + +void MainWindow::on_action14400_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH1 = 14400; + } +} + +void MainWindow::on_action19200_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH1 = 19200; + } +} + +void MainWindow::on_action28800_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH1 = 28800; + } +} + +void MainWindow::on_action38400_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH1 = 38400; + } +} + +void MainWindow::on_action57600_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH1 = 57600; + } +} + +void MainWindow::on_action115200_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH1 = 115200; + } +} + +void MainWindow::on_action300_2_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH2 = 300; + } +} + +void MainWindow::on_action600_2_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH2 = 600; + } +} + +void MainWindow::on_action1200_2_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH2 = 1200; + } +} + +void MainWindow::on_action2400_2_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH2 = 2400; + } +} + +void MainWindow::on_action4800_2_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH2 = 4800; + } +} + +void MainWindow::on_action9600_2_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH2 = 9600; + } +} + +void MainWindow::on_action14400_2_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH2 = 14400; + } +} + +void MainWindow::on_action19200_2_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH2 = 19200; + } +} + +void MainWindow::on_action28800_2_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH2 = 28800; + } +} + +void MainWindow::on_action38400_2_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH2 = 38400; + } +} + +void MainWindow::on_action57600_2_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH2 = 57600; + } +} + +void MainWindow::on_action115200_2_toggled(bool arg1) +{ + if(arg1){ + ui->controller_iso->baudRate_CH2 = 115200; + } +} + +void MainWindow::cycleBaudRate_CH1(){ + QAction *currentAction = uartBaudGroup_CH1->checkedAction(); + qDebug() << currentAction; + if(currentAction==ui->action300){ + ui->action600->setChecked(1); + return; + } + if(currentAction==ui->action600){ + ui->action1200->setChecked(1); + return; + } + if(currentAction==ui->action1200){ + ui->action2400->setChecked(1); + return; + } + if(currentAction==ui->action2400){ + ui->action4800->setChecked(1); + return; + } + if(currentAction==ui->action4800){ + ui->action9600->setChecked(1); + return; + } + if(currentAction==ui->action9600){ + ui->action14400->setChecked(1); + return; + } + if(currentAction==ui->action14400){ + ui->action19200->setChecked(1); + return; + } + if(currentAction==ui->action19200){ + ui->action28800->setChecked(1); + return; + } + if(currentAction==ui->action28800){ + ui->action38400->setChecked(1); + return; + } + if(currentAction==ui->action38400){ + ui->action57600->setChecked(1); + return; + } + if(currentAction==ui->action57600){ + ui->action115200->setChecked(1); + return; + } + if(currentAction==ui->action115200){ + ui->action300->setChecked(1); + return; + } + qFatal("Invalid state in MainWindow::cycleBaudRate_CH1()"); +} + +void MainWindow::cycleBaudRateBackwards_CH1(){ + QAction *currentAction = uartBaudGroup_CH1->checkedAction(); + qDebug() << currentAction; + if(currentAction==ui->action1200){ + ui->action600->setChecked(1); + return; + } + if(currentAction==ui->action2400){ + ui->action1200->setChecked(1); + return; + } + if(currentAction==ui->action4800){ + ui->action2400->setChecked(1); + return; + } + if(currentAction==ui->action9600){ + ui->action4800->setChecked(1); + return; + } + if(currentAction==ui->action14400){ + ui->action9600->setChecked(1); + return; + } + if(currentAction==ui->action19200){ + ui->action14400->setChecked(1); + return; + } + if(currentAction==ui->action28800){ + ui->action19200->setChecked(1); + return; + } + if(currentAction==ui->action38400){ + ui->action28800->setChecked(1); + return; + } + if(currentAction==ui->action57600){ + ui->action38400->setChecked(1); + return; + } + if(currentAction==ui->action115200){ + ui->action57600->setChecked(1); + return; + } + if(currentAction==ui->action300){ + ui->action115200->setChecked(1); + return; + } + if(currentAction==ui->action600){ + ui->action300->setChecked(1); + return; + } + qFatal("Invalid state in MainWindow::cycleBaudRateBackwards_CH1()"); +} + +void MainWindow::cycleBaudRate_CH2(){ + QAction *currentAction = uartBaudGroup_CH2->checkedAction(); + qDebug() << currentAction; + if(currentAction==ui->action300_2){ + ui->action600_2->setChecked(1); + return; + } + if(currentAction==ui->action600_2){ + ui->action1200_2->setChecked(1); + return; + } + if(currentAction==ui->action1200_2){ + ui->action2400_2->setChecked(1); + return; + } + if(currentAction==ui->action2400_2){ + ui->action4800_2->setChecked(1); + return; + } + if(currentAction==ui->action4800_2){ + ui->action9600_2->setChecked(1); + return; + } + if(currentAction==ui->action9600_2){ + ui->action14400_2->setChecked(1); + return; + } + if(currentAction==ui->action14400_2){ + ui->action19200_2->setChecked(1); + return; + } + if(currentAction==ui->action19200_2){ + ui->action28800_2->setChecked(1); + return; + } + if(currentAction==ui->action28800_2){ + ui->action38400_2->setChecked(1); + return; + } + if(currentAction==ui->action38400_2){ + ui->action57600_2->setChecked(1); + return; + } + if(currentAction==ui->action57600_2){ + ui->action115200_2->setChecked(1); + return; + } + if(currentAction==ui->action115200_2){ + ui->action300_2->setChecked(1); + return; + } + qFatal("Invalid state in MainWindow::cycleBaudRate_CH2()"); +} + +void MainWindow::cycleBaudRateBackwards_CH2(){ + QAction *currentAction = uartBaudGroup_CH2->checkedAction(); + qDebug() << currentAction; + if(currentAction==ui->action1200_2){ + ui->action600_2->setChecked(1); + return; + } + if(currentAction==ui->action2400_2){ + ui->action1200_2->setChecked(1); + return; + } + if(currentAction==ui->action4800_2){ + ui->action2400_2->setChecked(1); + return; + } + if(currentAction==ui->action9600_2){ + ui->action4800_2->setChecked(1); + return; + } + if(currentAction==ui->action14400_2){ + ui->action9600_2->setChecked(1); + return; + } + if(currentAction==ui->action19200_2){ + ui->action14400_2->setChecked(1); + return; + } + if(currentAction==ui->action28800_2){ + ui->action19200_2->setChecked(1); + return; + } + if(currentAction==ui->action38400_2){ + ui->action28800_2->setChecked(1); + return; + } + if(currentAction==ui->action57600_2){ + ui->action38400_2->setChecked(1); + return; + } + if(currentAction==ui->action115200_2){ + ui->action57600_2->setChecked(1); + return; + } + if(currentAction==ui->action300_2){ + ui->action115200_2->setChecked(1); + return; + } + if(currentAction==ui->action600_2){ + ui->action300_2->setChecked(1); + return; + } + qFatal("Invalid state in MainWindow::cycleBaudRateBackwards_CH2()"); +} + +void MainWindow::initShortcuts(){ + shortcut_cycleBaudRate_CH1 = new QShortcut(QKeySequence("Ctrl+B"), ui->menuBar); + shortcut_cycleBaudRateBackwards_CH1 = new QShortcut(QKeySequence("Ctrl+Shift+B"), ui->menuBar); + shortcut_cycleBaudRate_CH2 = new QShortcut(QKeySequence("Ctrl+Alt+B"), ui->menuBar); + shortcut_cycleBaudRateBackwards_CH2 = new QShortcut(QKeySequence("Ctrl+Shift+Alt+B"), ui->menuBar); + + shortcut_ArrowUp = new QShortcut(QKeySequence("Up"), ui->menuBar); + shortcut_ArrowDown = new QShortcut(QKeySequence("Down"), ui->menuBar); + shortcut_CtrlArrowUp = new QShortcut(QKeySequence("Ctrl+Up"), ui->menuBar); + shortcut_CtrlArrowDown = new QShortcut(QKeySequence("Ctrl+Down"), ui->menuBar); + shortcut_w = new QShortcut(QKeySequence("w"), ui->menuBar); + shortcut_s = new QShortcut(QKeySequence("s"), ui->menuBar); + shortcut_ctrlW = new QShortcut(QKeySequence("Ctrl+w"), ui->menuBar); + shortcut_ctrlS = new QShortcut(QKeySequence("Ctrl+s"), ui->menuBar); + + shortcut_a = new QShortcut(QKeySequence("a"), this); + shortcut_d = new QShortcut(QKeySequence("d"), this); + shortcut_ArrowLeft = new QShortcut(QKeySequence("Left"), this); + shortcut_ArrowRight = new QShortcut(QKeySequence("Right"), this); + + + + connect(shortcut_cycleBaudRate_CH1, SIGNAL(activated()), this, SLOT(cycleBaudRate_CH1())); + connect(shortcut_cycleBaudRateBackwards_CH1, SIGNAL(activated()), this, SLOT(cycleBaudRateBackwards_CH1())); + connect(shortcut_cycleBaudRate_CH2, SIGNAL(activated()), this, SLOT(cycleBaudRate_CH2())); + connect(shortcut_cycleBaudRateBackwards_CH2, SIGNAL(activated()), this, SLOT(cycleBaudRateBackwards_CH2())); + + connect(shortcut_ArrowUp, SIGNAL(activated()), this, SLOT(arrowUpTriggered())); + connect(shortcut_ArrowDown, SIGNAL(activated()), this, SLOT(arrowDownTriggered())); + connect(shortcut_CtrlArrowUp, SIGNAL(activated()), this, SLOT(ctrlArrowUpTriggered())); + connect(shortcut_CtrlArrowDown, SIGNAL(activated()), this, SLOT(ctrlArrowDownTriggered())); + connect(shortcut_w, SIGNAL(activated()), this, SLOT(arrowUpTriggered())); + connect(shortcut_s, SIGNAL(activated()), this, SLOT(arrowDownTriggered())); + connect(shortcut_ctrlW, SIGNAL(activated()), this, SLOT(ctrlArrowUpTriggered())); + connect(shortcut_ctrlS, SIGNAL(activated()), this, SLOT(ctrlArrowDownTriggered())); + + connect(shortcut_a, SIGNAL(activated()), this, SLOT(cycleDelayLeft())); + connect(shortcut_d, SIGNAL(activated()), this, SLOT(cycleDelayRight())); + + connect(shortcut_ArrowLeft, SIGNAL(activated()), this, SLOT(cycleDelayLeft())); + connect(shortcut_ArrowRight, SIGNAL(activated()), this, SLOT(cycleDelayRight())); + + + + + +} + +void MainWindow::timeBaseNeedsChanging(bool positive){ + int tempVal = ui->timeBaseSlider->value(); + tempVal += positive ? 1 : -1; + ui->timeBaseSlider->setValue(tempVal); +} + +void MainWindow::on_actionForce_Square_triggered(bool checked) +{ + forceSquare = checked; + //Force redraw! + int tempHeight = this->height(); + int tempWidth = this->width(); + this->resize(tempWidth+1, tempHeight+1); + this->resize(tempWidth, tempHeight); +} + +void MainWindow::arrowUpTriggered(){ + qDebug() << "Boy UP!"; + if(!(ui->scopeAxes->underMouse())) return; + + QPoint point = ui->scopeAxes->mapFromGlobal(QCursor::pos()); + wheelEmu = new QWheelEvent(point, 120, 0, 0, Qt::Vertical); + ui->controller_iso->setVoltageRange(wheelEmu); +} + +void MainWindow::arrowDownTriggered(){ + qDebug() << "Boy DOWN!"; + if(!(ui->scopeAxes->underMouse())) return; + + QPoint point = ui->scopeAxes->mapFromGlobal(QCursor::pos()); + wheelEmu = new QWheelEvent(point, -120, 0, 0, Qt::Vertical); + ui->controller_iso->setVoltageRange(wheelEmu); +} + +void MainWindow::ctrlArrowUpTriggered(){ + qDebug() << "Boy (ctrl) UP!"; + if(!(ui->scopeAxes->underMouse())) return; + + QPoint point = ui->scopeAxes->mapFromGlobal(QCursor::pos()); + wheelEmu = new QWheelEvent(point, 120, 0, Qt::ControlModifier, Qt::Vertical); + ui->controller_iso->setVoltageRange(wheelEmu); +} + +void MainWindow::ctrlArrowDownTriggered(){ + qDebug() << "Boy (ctrl) DOWN!"; + if(!(ui->scopeAxes->underMouse())) return; + + QPoint point = ui->scopeAxes->mapFromGlobal(QCursor::pos()); + wheelEmu = new QWheelEvent(point, -120, 0, Qt::ControlModifier, Qt::Vertical); + ui->controller_iso->setVoltageRange(wheelEmu); +} + +void MainWindow::cycleDelayRight(){ + qDebug() << "RIGHT"; + ui->controller_iso->delay -= ui->controller_iso->window/10; + if(ui->controller_iso->delay < 0) ui->controller_iso->delay = 0; +} + +void MainWindow::cycleDelayLeft(){ + qDebug() << "LEFT"; + ui->controller_iso->delay += ui->controller_iso->window/10; + if(ui->controller_iso->delay > (MAX_WINDOW_SIZE - ui->controller_iso->window)) ui->controller_iso->delay = (MAX_WINDOW_SIZE - ui->controller_iso->window); +} + +void MainWindow::on_actionAutomatically_Enable_Cursors_toggled(bool enabled) +{ + ui->makeCursorsNicer->setTurnedOn(enabled); +} + +void MainWindow::on_action60FPS_toggled(bool enabled) +{ + if(enabled){ + TIMER_PERIOD = 17; + ui->controller_iso->startTimer(); + } +} +void MainWindow::on_action30FPS_toggled(bool enabled) +{ + if(enabled){ + TIMER_PERIOD = 33; + ui->controller_iso->startTimer(); + } +} +void MainWindow::on_action20FPS_toggled(bool enabled) +{ + if(enabled){ + TIMER_PERIOD = 40; + ui->controller_iso->startTimer(); + } +} +void MainWindow::on_action15FPS_toggled(bool enabled) +{ + if(enabled){ + TIMER_PERIOD = 67; + ui->controller_iso->startTimer(); + } +} +void MainWindow::on_action10FPS_toggled(bool enabled) +{ + if(enabled){ + TIMER_PERIOD = 100; + ui->controller_iso->startTimer(); + } +} +void MainWindow::on_action5FPS_toggled(bool enabled) +{ + qDebug() << "5FPS"; + if(enabled){ + qDebug() << "5FPS is enabled!"; + TIMER_PERIOD = 200; + ui->controller_iso->startTimer(); + } +} + + +void MainWindow::on_actionAuto_Lock_toggled(bool arg1) +{ + ui->lockPsuCheckBox->enableTimer(arg1); + ui->lockPsuCheckBox->timer->start(ui->lockPsuCheckBox->timerLength); +} diff --git a/Desktop Interface/mainwindow.h b/Desktop Interface/mainwindow.h new file mode 100644 index 00000000..9db97bd9 --- /dev/null +++ b/Desktop Interface/mainwindow.h @@ -0,0 +1,131 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include "isobuffer.h" +#include +#include +#include +#include "qcustomplot.h" +#include + +namespace Ui { +class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); + void resizeEvent(QResizeEvent *event); + +private slots: + void on_actionGain0_5_triggered(); + void on_actionGain1_triggered(); + void on_actionGain2_triggered(); + void on_actionGain4_triggered(); + void on_actionGain8_triggered(); + void on_actionGain16_triggered(); + void on_actionGain32_triggered(); + void on_actionGain64_triggered(); + void on_actionGainAuto_triggered(); + void on_actionCursor_Stats_triggered(bool checked); + void connectDisplaySignals(); + void on_action300_toggled(bool arg1); + void on_action600_toggled(bool arg1); + void on_action1200_toggled(bool arg1); + void on_action2400_toggled(bool arg1); + void on_action4800_toggled(bool arg1); + void on_action9600_toggled(bool arg1); + void on_action14400_toggled(bool arg1); + void on_action19200_toggled(bool arg1); + void on_action28800_toggled(bool arg1); + void on_action38400_toggled(bool arg1); + void on_action57600_toggled(bool arg1); + void on_action115200_toggled(bool arg1); + + void on_action300_2_toggled(bool arg1); + void on_action600_2_toggled(bool arg1); + void on_action1200_2_toggled(bool arg1); + void on_action2400_2_toggled(bool arg1); + void on_action4800_2_toggled(bool arg1); + void on_action9600_2_toggled(bool arg1); + void on_action14400_2_toggled(bool arg1); + void on_action19200_2_toggled(bool arg1); + void on_action28800_2_toggled(bool arg1); + void on_action38400_2_toggled(bool arg1); + void on_action57600_2_toggled(bool arg1); + void on_action115200_2_toggled(bool arg1); + void cycleBaudRate_CH1(); + void cycleBaudRateBackwards_CH1(); + void cycleBaudRate_CH2(); + void cycleBaudRateBackwards_CH2(); + + void timeBaseNeedsChanging(bool positive); + void on_actionForce_Square_triggered(bool checked); + + void arrowUpTriggered(); + void arrowDownTriggered(); + void ctrlArrowUpTriggered(); + void ctrlArrowDownTriggered(); + + void cycleDelayLeft(); + void cycleDelayRight(); + + + void on_actionAutomatically_Enable_Cursors_toggled(bool arg1); + + void on_action60FPS_toggled(bool enabled); + void on_action30FPS_toggled(bool enabled); + void on_action20FPS_toggled(bool enabled); + void on_action15FPS_toggled(bool enabled); + void on_action10FPS_toggled(bool enabled); + void on_action5FPS_toggled(bool enabled); + + + void on_actionAuto_Lock_toggled(bool arg1); + +private: + Ui::MainWindow *ui; + void initialisePlot(); + void labelPsu(); + void menuSetup(); + void initShortcuts(); + + QActionGroup *gainGroup; + QActionGroup *rangeGroupV; + QActionGroup *rangeGroupI; + QActionGroup *uartBaudGroup_CH1; + QActionGroup *uartBaudGroup_CH2; + QActionGroup *fpsGroup; + QShortcut *shortcut_cycleBaudRate_CH1; + QShortcut *shortcut_cycleBaudRateBackwards_CH1; + QShortcut *shortcut_cycleBaudRate_CH2; + QShortcut *shortcut_cycleBaudRateBackwards_CH2; + QShortcut *shortcut_ArrowUp; + QShortcut *shortcut_ArrowDown; + QShortcut *shortcut_CtrlArrowUp; + QShortcut *shortcut_CtrlArrowDown; + QShortcut *shortcut_w; + QShortcut *shortcut_ctrlW; + QShortcut *shortcut_s; + QShortcut *shortcut_ctrlS; + QShortcut *shortcut_a; + QShortcut *shortcut_d; + QShortcut *shortcut_ArrowLeft; + QShortcut *shortcut_ArrowRight; + + + + QWheelEvent *wheelEmu; + + bool forceSquare = false; + + QCPItemText *textLabel; + +}; + +#endif // MAINWINDOW_H diff --git a/Desktop Interface/mainwindow.ui b/Desktop Interface/mainwindow.ui new file mode 100644 index 00000000..41c5c959 --- /dev/null +++ b/Desktop Interface/mainwindow.ui @@ -0,0 +1,3907 @@ + + + MainWindow + + + true + + + + 0 + 0 + 1136 + 768 + + + + + 1024 + 768 + + + + EspoTek Labrador + + + + + + + QLayout::SetMinAndMaxSize + + + + + + 0 + 0 + + + + + 500 + 400 + + + + Qt::LeftToRight + + + + + + + -60 + + + 10 + + + 10 + + + -20 + + + -20 + + + true + + + Qt::Horizontal + + + QSlider::TicksBelow + + + 10 + + + + + + + true + + + + 0 + 0 + + + + + 16777215 + 48 + + + + true + + + + + + + + 16777215 + 48 + + + + true + + + + + + + + + + + Device disconnected! + + + Qt::AlignCenter + + + + + + + + + + + Oscilloscope CH1 + + + false + + + true + + + true + + + + + + Paused + + + + + + + AC Coupled + + + + + + + Filter + + + + + + + Double Sample Rate + + + + + + + 0 + + + + + Max + + + + + + + + 0 + 24 + + + + QFrame::NoFrame + + + + + + + Min + + + + + + + + 0 + 24 + + + + QFrame::NoFrame + + + + + + + Mean + + + + + + + RMS + + + + + + + + 0 + 24 + + + + QFrame::NoFrame + + + + + + + + 0 + 24 + + + + QFrame::NoFrame + + + + + + + acCoupledLabel_CH1 + filterLabel_CH1 + pausedLabeL_CH1 + doubleSampleLabel + + + + + + true + + + Cursor + + + false + + + false + + + + + + Horizontal + + + + + + + Vertical + + + + + + + CURSOR ENABLER + + + + + + + + + + + + + + true + + + Oscilloscope CH2 + + + false + + + true + + + false + + + + + + Paused + + + + + + + AC Coupled + + + + + + + Filter + + + + + + + X-Y Display + + + + + + + 0 + + + + + Max + + + + + + + + 0 + 24 + + + + QFrame::NoFrame + + + + + + + Min + + + + + + + + 0 + 24 + + + + QFrame::NoFrame + + + + + + + Mean + + + + + + + RMS + + + + + + + + 0 + 24 + + + + QFrame::NoFrame + + + + + + + + 0 + 24 + + + + QFrame::NoFrame + + + + + + + + + + + + true + + + Trigger + + + true + + + false + + + + + + + CH1 (Rising) + + + + + CH1 (Falling) + + + + + CH2 (Rising) + + + + + CH2 (Falling) + + + + + + + + -20.000000000000000 + + + 20.000000000000000 + + + 0.100000000000000 + + + + + + + Single Shot + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 16777215 + 48 + + + + cursorStatsLabel + + + Qt::AlignCenter + + + + + + + false + + + Multimeter++ + + + true + + + false + + + + + + + V + + + + + I + + + + + R + + + + + C + + + + + + + + 0 + + + 0 + + + + + Max + + + + + + + Min + + + + + + + + 0 + 24 + + + + QFrame::NoFrame + + + 4 + + + + + + + Mean + + + + + + + + 0 + 24 + + + + QFrame::NoFrame + + + 4 + + + + + + + RMS + + + + + + + + 0 + 24 + + + + QFrame::NoFrame + + + 4 + + + + + + + + 0 + 24 + + + + QFrame::NoFrame + + + 4 + + + + + + + + + Paused + + + + + + + Series Resistance + + + + + + + Mode + + + + + + + Ω + + + 0 + + + 1000000.000000000000000 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + SALUTON MI ESTAS FUNCTION GENERATOR CONTROLLER + + + + + + + + + true + + + Signal Gen CH1 + + + false + + + false + + + + + + Waveform + + + + + + + + + + Frequency + + + + + + + Hz + + + 4 + + + 0.200000000000000 + + + 1000000.000000000000000 + + + 1000.000000000000000 + + + + + + + Amplitude + + + + + + + V + + + 9.600000000000000 + + + 0.100000000000000 + + + + + + + DC Offset + + + + + + + V + + + 9.600000000000000 + + + 0.100000000000000 + + + + + + + + + + true + + + Signal Gen CH2 + + + false + + + false + + + + + + true + + + Waveform + + + + + + + true + + + + + + + true + + + Frequency + + + + + + + true + + + Hz + + + 2 + + + 1000000.000000000000000 + + + 1000.000000000000000 + + + + + + + true + + + Amplitude + + + + + + + true + + + V + + + 10.000000000000000 + + + 0.100000000000000 + + + + + + + true + + + DC Offset + + + + + + + true + + + V + + + 10.000000000000000 + + + 0.100000000000000 + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + SALUTON MI ESTAS ISO DRIVER + + + + + + + + + + + false + + + PSU + + + + + + false + + + 90 + + + 300 + + + 1 + + + Qt::Vertical + + + QSlider::TicksBelow + + + 20 + + + + + + + Lock PSU + + + true + + + + + + + + 108 + 36 + + + + + 108 + 36 + + + + true + + + 4 + + + 5.000000000000000 + + + 5 + + + + + + + + + + SALUTON MI ESTAS USB DRIVER + + + + + + + + + Bus Sniffer CH1 + + + true + + + false + + + + + + Serial Decoding + + + true + + + true + + + false + + + + 0 + + + 0 + + + 6 + + + 0 + + + 0 + + + + + + UART + + + + + SPI + + + + + I2C + + + + + + + + + + + + + + false + + + Bus Sniffer CH2 + + + true + + + false + + + + + + Serial Decoding + + + true + + + true + + + false + + + + 0 + + + 0 + + + 6 + + + 0 + + + 0 + + + + + + UART + + + + + SPI + + + + + I2C + + + + + + + + + + + + + + Digital Output + + + + + + Pin 3 + + + + + + + Pin 2 + + + + + + + Pin 1 + + + + + + + Pin 4 + + + + + digitalOutCheckbox_CH2 + digitalOutCheckbox_CH1 + digitalOutCheckbox_CH3 + digitalOutCheckbox_CH4 + + + + + + Debug! + + + + + + + + 96 + 36 + + + + + 96 + 36 + + + + BUFFER IMAGE HERE + + + Qt::AlignCenter + + + + + + + + + + + + + 0 + 0 + 1136 + 21 + + + + + File + + + + + + Oscilloscope + + + + Gain + + + + + + + + + + + + + + CH1 Stats + + + + + + + + + CH2 Stats + + + + + + + + + Frame rate + + + + + + + + + + + + + + + + + + + + + + + Multimeter + + + + Range (V) + + + + + + + + Range (I) + + + + + + + + + + + + Bus Sniffer + + + + UART 1 + + + + Baud Rate + + + + + + + + + + + + + + + + + Type Here + + + + + Parity Bit + + + + + + Data Bits + + + + + + + + + + + UART 2 + + + + Baud Rate + + + + + + + + + + + + + + + + + Data Bits + + + + + + Parity Bit + + + + + + + + + + + + + Power Supply + + + + + + + + + + + + true + + + Auto + + + + + true + + + 0.5 + + + + + true + + + 1 + + + + + true + + + 2 + + + + + true + + + 4 + + + + + true + + + 8 + + + + + true + + + 16 + + + + + true + + + 32 + + + + + true + + + 64 + + + QAction::TextHeuristicRole + + + + + Calibrate (coming soon!) + + + + + true + + + true + + + Cursor Stats + + + + + true + + + Max + + + + + true + + + Min + + + + + true + + + Mean + + + + + true + + + RMS + + + + + true + + + Max + + + + + true + + + Min + + + + + true + + + Mean + + + + + true + + + RMS + + + + + true + + + false + + + mV + + + + + true + + + false + + + V + + + + + true + + + true + + + Auto + + + + + true + + + true + + + Auto + + + + + true + + + false + + + mA + + + + + true + + + A + + + + + true + + + 300 + + + + + true + + + 600 + + + + + true + + + 1200 + + + + + true + + + 2400 + + + + + true + + + 4800 + + + + + true + + + 9600 + + + + + true + + + 14400 + + + + + true + + + 19200 + + + + + true + + + 28800 + + + + + true + + + 38400 + + + + + true + + + 57600 (Glitchy) + + + + + true + + + 115200 (Glitchy) + + + + + true + + + 8 + + + + + true + + + None + + + + + true + + + 300 + + + + + true + + + 600 + + + + + true + + + 1200 + + + + + true + + + 2400 + + + + + true + + + 4800 + + + + + true + + + 9600 + + + + + true + + + 14400 + + + + + true + + + 19200 + + + + + true + + + 28800 + + + + + true + + + 38400 + + + + + true + + + 57600 (Glitchy) + + + + + true + + + 115200 (Glitchy) + + + + + true + + + 8 + + + + + true + + + None + + + + + Coming Soon! + + + + + true + + + Force Square Display (Not Officially Supported) + + + + + true + + + true + + + Enable Cursors on Click + + + + + true + + + true + + + 60FPS + + + + + true + + + 30FPS + + + + + true + + + 20FPS + + + + + true + + + 15FPS + + + + + true + + + 10FPS + + + + + true + + + 5FPS + + + + + true + + + true + + + Auto Lock + + + + + + + QCustomPlot + QWidget +
qcustomplot.h
+ 1 + + mouseWheel(QWheelEvent*) + mouseRelease(QMouseEvent*) + mousePress(QMouseEvent*) + mouseMove(QMouseEvent*) + +
+ + bufferControl + QLabel +
buffercontrol.h
+ + scopeOut_CH1(bool) + scopeOut_CH2(bool) + scopeUncheck(bool) + signalGenOut(bool) + busSnifferOut_CH1(bool) + busSnifferOut_CH2(bool) + busSnifferUncheck(bool) + multimeterOut(bool) + scopeDsrOut(bool) + scopeDsrUncheck(bool) + updateDig(int) + modeChange(int) + scopeIn_CH1(bool) + scopeIn_CH2(bool) + signalGenIn(bool) + busSnifferIn_CH1(bool) + busSnifferIn_CH2(bool) + multimeterIn(bool) + scopeDsrIn(bool) + digIn_CH1(bool) + digIn_CH2(bool) + digIn_CH3(bool) + digIn_CH4(bool) + +
+ + espoSlider + QSlider +
esposlider.h
+ + lcdOut(QString) + voltageChanged(double) + selfMoved(int) + +
+ + espoSpinBox + QDoubleSpinBox +
espospinbox.h
+ + maximumChanged(double) + setMax(double) + setMin(double) + +
+ + winUsbDriver + QLabel +
winusbdriver.h
+ + startIsoTimer() + sendClearBuffer(bool,bool,bool) + setVisible_CH2(bool) + gainBuffers(double) + disableWindow(bool) + enableMMTimer() + checkXY(bool) + setPsu(double) + setFunctionGen(int,functionGenControl*) + newDig(int) + setDeviceMode(int) + setGain(double) + avrDebug() + +
+ + espoComboBox + QComboBox +
espocombobox.h
+
+ + functionGenControl + QLabel +
functiongencontrol.h
+ + functionGenToUpdate(int,functionGenControl*) + setMaxFreq_CH1(double) + setMinFreq_CH1(double) + setMaxFreq_CH2(double) + setMinFreq_CH2(double) + waveformName_CH1(QString) + waveformName_CH2(QString) + freqUpdate_CH1(double) + amplitudeUpdate_CH1(double) + offsetUpdate_CH1(double) + freqUpdate_CH2(double) + amplitudeUpdate_CH2(double) + offsetUpdate_CH2(double) + +
+ + isoDriver + QLabel +
isodriver.h
+ + setGain(double) + disableWindow(bool) + setCursorStatsVisible(bool) + sendCursorStatsText(QString) + singleShotTriggered(bool) + multimeterMax(double) + multimeterMin(double) + multimeterMean(double) + sendMultimeterLabel1(QString) + sendMultimeterLabel2(QString) + sendMultimeterLabel3(QString) + changeTimeAxis(bool) + sendTriggerValue(double) + sendVmax_CH1(double) + sendVmin_CH1(double) + sendVmean_CH1(double) + sendVmax_CH2(double) + sendVmin_CH2(double) + sendVmean_CH2(double) + setWindow(int) + setVoltageRange(QWheelEvent*) + pauseEnable_CH1(bool) + pauseEnable_CH2(bool) + startTimer() + clearBuffers(bool,bool,bool) + setVisible_CH2(bool) + gainBuffers(double) + setAutoGain(bool) + graphMousePress(QMouseEvent*) + graphMouseRelease(QMouseEvent*) + cursorEnableHori(bool) + cursorEnableVert(bool) + graphMouseMove(QMouseEvent*) + setTriggerEnabled(bool) + setTriggerLevel(double) + setSingleShotEnabled(bool) + setTriggerMode(int) + setAC_CH1(bool) + setAC_CH2(bool) + setMultimeterType(int) + setSeriesResistance(double) + enableMM() + setSerialDecodeEnabled_CH1(bool) + setSerialDecodeEnabled_CH2(bool) + setXYmode(bool) + triggerGroupStateChange(bool) + pauseEnable_multimeter(bool) + +
+ + noCloseMenu + QMenu +
noclosemenu.h
+
+ + cursorEnabler + QLabel +
cursorenabler.h
+ + tickHori(bool) + tickVert(bool) + passOnSignal(QMouseEvent*) + clickDetected(QMouseEvent*) + setTurnedOn(bool) + +
+ + deviceConnectedDisplay + QLabel +
deviceconnecteddisplay.h
+ + connectedStatusChanged(bool) + +
+ + timedTickBox + QCheckBox +
timedtickbox.h
+ + resetTimer() + +
+
+ + + + scopeGroup_CH1 + toggled(bool) + bufferDisplay + scopeIn_CH1(bool) + + + 691 + 64 + + + 1065 + 756 + + + + + scopeGroup_CH2 + toggled(bool) + bufferDisplay + scopeIn_CH2(bool) + + + 838 + 54 + + + 1065 + 756 + + + + + signalGenGroup_CH2 + toggled(bool) + bufferDisplay + signalGenIn(bool) + + + 843 + 577 + + + 1065 + 756 + + + + + bufferDisplay + busSnifferOut_CH2(bool) + busSnifferGroup_CH2 + setEnabled(bool) + + + 1065 + 756 + + + 1124 + 606 + + + + + bufferDisplay + signalGenOut(bool) + signalGenGroup_CH2 + setEnabled(bool) + + + 1065 + 756 + + + 843 + 577 + + + + + bufferDisplay + scopeOut_CH1(bool) + scopeGroup_CH1 + setEnabled(bool) + + + 1065 + 756 + + + 818 + 207 + + + + + bufferDisplay + scopeOut_CH2(bool) + scopeGroup_CH2 + setEnabled(bool) + + + 1065 + 756 + + + 958 + 197 + + + + + bufferDisplay + busSnifferUncheck(bool) + busSnifferGroup_CH2 + setChecked(bool) + + + 1065 + 756 + + + 1124 + 606 + + + + + bufferDisplay + scopeUncheck(bool) + scopeGroup_CH2 + setChecked(bool) + + + 1065 + 756 + + + 958 + 197 + + + + + doubleSampleLabel + toggled(bool) + bufferDisplay + scopeDsrIn(bool) + + + 808 + 160 + + + 1065 + 756 + + + + + bufferDisplay + scopeDsrUncheck(bool) + doubleSampleLabel + setChecked(bool) + + + 1065 + 756 + + + 808 + 160 + + + + + bufferDisplay + scopeDsrOut(bool) + doubleSampleLabel + setEnabled(bool) + + + 1065 + 756 + + + 808 + 160 + + + + + psuSlider + valueChanged(int) + psuSlider + selfMoved(int) + + + 979 + 308 + + + 979 + 345 + + + + + psuSlider + lcdOut(QString) + psuDisplay + display(QString) + + + 1002 + 355 + + + 1086 + 420 + + + + + amplitudeValue_CH1 + valueChanged(double) + dcOffsetValue_CH1 + maximumChanged(double) + + + 806 + 668 + + + 806 + 713 + + + + + amplitudeValue_CH2 + valueChanged(double) + dcOffsetValue_CH2 + maximumChanged(double) + + + 949 + 668 + + + 949 + 713 + + + + + dcOffsetValue_CH1 + valueChanged(double) + amplitudeValue_CH1 + maximumChanged(double) + + + 806 + 713 + + + 806 + 668 + + + + + dcOffsetValue_CH2 + valueChanged(double) + amplitudeValue_CH2 + maximumChanged(double) + + + 949 + 713 + + + 949 + 668 + + + + + waveformSelect_CH1 + currentTextChanged(QString) + controller_fg + waveformName_CH1(QString) + + + 806 + 578 + + + 960 + 509 + + + + + waveformSelect_CH2 + currentTextChanged(QString) + controller_fg + waveformName_CH2(QString) + + + 949 + 578 + + + 960 + 509 + + + + + frequencyValue_CH1 + valueChanged(double) + controller_fg + freqUpdate_CH1(double) + + + 806 + 623 + + + 960 + 509 + + + + + amplitudeValue_CH1 + valueChanged(double) + controller_fg + amplitudeUpdate_CH1(double) + + + 806 + 668 + + + 960 + 509 + + + + + dcOffsetValue_CH1 + valueChanged(double) + controller_fg + offsetUpdate_CH1(double) + + + 806 + 713 + + + 960 + 509 + + + + + controller_fg + setMaxFreq_CH1(double) + frequencyValue_CH1 + setMax(double) + + + 960 + 509 + + + 806 + 623 + + + + + controller_fg + setMinFreq_CH1(double) + frequencyValue_CH1 + setMin(double) + + + 960 + 509 + + + 806 + 623 + + + + + bufferDisplay + busSnifferOut_CH1(bool) + busSifferGroup_CH1 + setEnabled(bool) + + + 1065 + 756 + + + 1124 + 528 + + + + + bufferDisplay + busSnifferOut_CH2(bool) + busSnifferGroup_CH2 + setEnabled(bool) + + + 1065 + 756 + + + 1124 + 606 + + + + + busSifferGroup_CH1 + toggled(bool) + bufferDisplay + busSnifferIn_CH1(bool) + + + 1124 + 528 + + + 1065 + 756 + + + + + busSnifferGroup_CH2 + toggled(bool) + bufferDisplay + busSnifferIn_CH2(bool) + + + 1124 + 606 + + + 1065 + 756 + + + + + digitalOutCheckbox_CH1 + toggled(bool) + bufferDisplay + digIn_CH1(bool) + + + 1044 + 652 + + + 1065 + 756 + + + + + digitalOutCheckbox_CH2 + toggled(bool) + bufferDisplay + digIn_CH2(bool) + + + 1114 + 652 + + + 1065 + 756 + + + + + digitalOutCheckbox_CH3 + toggled(bool) + bufferDisplay + digIn_CH3(bool) + + + 1044 + 675 + + + 1065 + 756 + + + + + digitalOutCheckbox_CH4 + toggled(bool) + bufferDisplay + digIn_CH4(bool) + + + 1114 + 675 + + + 1065 + 756 + + + + + controller_fg + setMaxFreq_CH2(double) + frequencyValue_CH2 + setMax(double) + + + 960 + 509 + + + 949 + 623 + + + + + controller_fg + setMinFreq_CH2(double) + frequencyValue_CH2 + setMin(double) + + + 960 + 509 + + + 949 + 623 + + + + + frequencyValue_CH2 + valueChanged(double) + controller_fg + freqUpdate_CH2(double) + + + 949 + 623 + + + 960 + 509 + + + + + amplitudeValue_CH2 + valueChanged(double) + controller_fg + amplitudeUpdate_CH2(double) + + + 949 + 668 + + + 960 + 509 + + + + + dcOffsetValue_CH2 + valueChanged(double) + controller_fg + offsetUpdate_CH2(double) + + + 949 + 713 + + + 960 + 509 + + + + + timeBaseSlider + valueChanged(int) + controller_iso + setWindow(int) + + + 424 + 647 + + + 960 + 757 + + + + + scopeAxes + mouseWheel(QWheelEvent*) + controller_iso + setVoltageRange(QWheelEvent*) + + + 482 + 567 + + + 960 + 757 + + + + + pausedLabeL_CH1 + toggled(bool) + controller_iso + pauseEnable_CH1(bool) + + + 690 + 91 + + + 960 + 757 + + + + + pausedLabel_CH2 + toggled(bool) + controller_iso + pauseEnable_CH2(bool) + + + 837 + 91 + + + 960 + 757 + + + + + pausedLabeL_CH1 + toggled(bool) + pausedLabel_CH2 + setChecked(bool) + + + 690 + 91 + + + 837 + 91 + + + + + pausedLabel_CH2 + toggled(bool) + pausedLabeL_CH1 + setChecked(bool) + + + 837 + 90 + + + 690 + 91 + + + + + controller_iso + disableWindow(bool) + MainWindow + setEnabled(bool) + + + 960 + 757 + + + 1023 + 226 + + + + + scopeAxes + mouseRelease(QMouseEvent*) + controller_iso + graphMouseRelease(QMouseEvent*) + + + 354 + 510 + + + 960 + 757 + + + + + cursorHoriCheck + toggled(bool) + controller_iso + cursorEnableHori(bool) + + + 808 + 253 + + + 960 + 757 + + + + + cursorVertCheck + toggled(bool) + controller_iso + cursorEnableVert(bool) + + + 808 + 276 + + + 960 + 757 + + + + + scopeAxes + mouseMove(QMouseEvent*) + controller_iso + graphMouseMove(QMouseEvent*) + + + 441 + 474 + + + 960 + 757 + + + + + controller_iso + setCursorStatsVisible(bool) + cursorStatsLabel + setVisible(bool) + + + 960 + 757 + + + 960 + 332 + + + + + lockPsuCheckBox + toggled(bool) + psuSlider + setDisabled(bool) + + + 1115 + 378 + + + 1002 + 355 + + + + + triggerGroup + toggled(bool) + controller_iso + setTriggerEnabled(bool) + + + 838 + 280 + + + 960 + 757 + + + + + triggerLevelValue + valueChanged(double) + controller_iso + setTriggerLevel(double) + + + 948 + 272 + + + 960 + 757 + + + + + controller_iso + singleShotTriggered(bool) + pausedLabeL_CH1 + setChecked(bool) + + + 960 + 757 + + + 690 + 91 + + + + + singleShotCheckBox + toggled(bool) + controller_iso + setSingleShotEnabled(bool) + + + 948 + 295 + + + 960 + 757 + + + + + triggerChannelSelect + currentIndexChanged(int) + controller_iso + setTriggerMode(int) + + + 948 + 246 + + + 960 + 757 + + + + + acCoupledLabel_CH1 + toggled(bool) + controller_iso + setAC_CH1(bool) + + + 808 + 114 + + + 960 + 757 + + + + + acCoupledLabel_CH2 + toggled(bool) + controller_iso + setAC_CH2(bool) + + + 948 + 114 + + + 960 + 757 + + + + + controller_usb + gainBuffers(double) + controller_iso + gainBuffers(double) + + + 1125 + 449 + + + 960 + 757 + + + + + controller_iso + setGain(double) + controller_usb + setGain(double) + + + 960 + 757 + + + 1125 + 449 + + + + + controller_usb + disableWindow(bool) + MainWindow + setEnabled(bool) + + + 1125 + 449 + + + 659 + 767 + + + + + psuSlider + voltageChanged(double) + controller_usb + setPsu(double) + + + 1002 + 355 + + + 1125 + 449 + + + + + controller_fg + functionGenToUpdate(int,functionGenControl*) + controller_usb + setFunctionGen(int,functionGenControl*) + + + 960 + 509 + + + 1125 + 449 + + + + + bufferDisplay + updateDig(int) + controller_usb + newDig(int) + + + 1065 + 756 + + + 1125 + 449 + + + + + controller_usb + sendClearBuffer(bool,bool,bool) + controller_iso + clearBuffers(bool,bool,bool) + + + 1125 + 449 + + + 960 + 757 + + + + + controller_usb + startIsoTimer() + controller_iso + startTimer() + + + 1125 + 449 + + + 960 + 757 + + + + + bufferDisplay + modeChange(int) + controller_usb + setDeviceMode(int) + + + 1065 + 756 + + + 1125 + 449 + + + + + controller_usb + setVisible_CH2(bool) + controller_iso + setVisible_CH2(bool) + + + 1125 + 449 + + + 960 + 757 + + + + + multimeterGroup + toggled(bool) + bufferDisplay + multimeterIn(bool) + + + 960 + 484 + + + 1065 + 756 + + + + + bufferDisplay + multimeterOut(bool) + multimeterGroup + setEnabled(bool) + + + 1065 + 756 + + + 960 + 484 + + + + + multimeterModeSelect + currentIndexChanged(int) + controller_iso + setMultimeterType(int) + + + 816 + 400 + + + 960 + 757 + + + + + controller_iso + multimeterMax(double) + multimeterMaxDisplay + display(double) + + + 960 + 757 + + + 949 + 386 + + + + + controller_iso + multimeterMin(double) + multimeterMinDisplay + display(double) + + + 960 + 757 + + + 949 + 410 + + + + + controller_iso + multimeterMean(double) + multimeterMeanDisplay + display(double) + + + 960 + 757 + + + 949 + 434 + + + + + controller_usb + enableMMTimer() + controller_iso + enableMM() + + + 1125 + 449 + + + 960 + 757 + + + + + multimeterResistanceSelect + valueChanged(double) + controller_iso + setSeriesResistance(double) + + + 816 + 445 + + + 960 + 757 + + + + + controller_iso + sendMultimeterLabel1(QString) + multimeterMaxLabel + setText(QString) + + + 960 + 757 + + + 846 + 384 + + + + + controller_iso + sendMultimeterLabel2(QString) + multimeterMinLabel + setText(QString) + + + 960 + 757 + + + 842 + 408 + + + + + controller_iso + sendMultimeterLabel3(QString) + multimeterMeanLabel + setText(QString) + + + 960 + 757 + + + 852 + 432 + + + + + serialDecodingCheck_CH1 + toggled(bool) + controller_iso + setSerialDecodeEnabled_CH1(bool) + + + 1114 + 518 + + + 960 + 757 + + + + + serialDecodingCheck_CH2 + toggled(bool) + controller_iso + setSerialDecodeEnabled_CH2(bool) + + + 1114 + 596 + + + 960 + 757 + + + + + serialDecodingCheck_CH1 + toggled(bool) + console1 + setVisible(bool) + + + 1114 + 518 + + + 384 + 677 + + + + + serialDecodingCheck_CH2 + toggled(bool) + console2 + setVisible(bool) + + + 1114 + 596 + + + 488 + 731 + + + + + controller_iso + changeTimeAxis(bool) + MainWindow + timeBaseNeedsChanging(bool) + + + 960 + 757 + + + 800 + 696 + + + + + controller_usb + checkXY(bool) + xyDisplayLabel + setChecked(bool) + + + 1125 + 449 + + + 876 + 152 + + + + + xyDisplayLabel + toggled(bool) + controller_iso + setXYmode(bool) + + + 863 + 149 + + + 960 + 757 + + + + + busSnifferGroup_CH2 + toggled(bool) + signalGenGroup_CH2 + setDisabled(bool) + + + 1124 + 606 + + + 959 + 723 + + + + + scopeAxes + mousePress(QMouseEvent*) + makeCursorsNicer + clickDetected(QMouseEvent*) + + + 590 + 401 + + + 808 + 295 + + + + + makeCursorsNicer + tickHori(bool) + cursorHoriCheck + setChecked(bool) + + + 808 + 295 + + + 808 + 253 + + + + + makeCursorsNicer + tickVert(bool) + cursorVertCheck + setChecked(bool) + + + 808 + 295 + + + 808 + 276 + + + + + makeCursorsNicer + passOnSignal(QMouseEvent*) + controller_iso + graphMousePress(QMouseEvent*) + + + 808 + 295 + + + 960 + 757 + + + + + controller_iso + sendTriggerValue(double) + triggerLevelValue + setValue(double) + + + 960 + 757 + + + 948 + 272 + + + + + triggerGroup + toggled(bool) + controller_iso + triggerGroupStateChange(bool) + + + 905 + 230 + + + 960 + 757 + + + + + controller_usb + disableWindow(bool) + deviceConnected + connectedStatusChanged(bool) + + + 1125 + 449 + + + 905 + 36 + + + + + controller_iso + disableWindow(bool) + deviceConnected + connectedStatusChanged(bool) + + + 960 + 757 + + + 828 + 35 + + + + + multimeterPauseCheckBox + toggled(bool) + controller_iso + pauseEnable_multimeter(bool) + + + 816 + 474 + + + 960 + 757 + + + + + controller_iso + sendVmax_CH1(double) + voltageInfoMaxDisplay_CH1 + display(double) + + + 960 + 757 + + + 790 + 175 + + + + + controller_iso + sendVmin_CH1(double) + voltageInfoMinDisplay_CH1 + display(double) + + + 960 + 757 + + + 800 + 193 + + + + + controller_iso + sendVmean_CH1(double) + voltageInfoMeanDisplay_CH1 + display(double) + + + 960 + 757 + + + 807 + 206 + + + + + controller_iso + sendVmax_CH2(double) + voltageInfoMaxDisplay_CH2 + display(double) + + + 960 + 757 + + + 929 + 172 + + + + + controller_iso + sendVmin_CH2(double) + voltageInfoMinDisplay_CH2 + display(double) + + + 960 + 757 + + + 943 + 184 + + + + + controller_iso + sendVmean_CH2(double) + voltageInfoMeanDisplay_CH2 + display(double) + + + 960 + 757 + + + 940 + 196 + + + + + pushButton + clicked() + controller_usb + avrDebug() + + + 1023 + 707 + + + 1060 + 444 + + + + + lockPsuCheckBox + toggled(bool) + lockPsuCheckBox + resetTimer(bool) + + + 1036 + 372 + + + 1018 + 371 + + + + + lockPsuCheckBox + toggled(bool) + lockPsuCheckBox + resetTimer() + + + 1054 + 370 + + + 1013 + 371 + + + + + psuSlider + sliderMoved(int) + lockPsuCheckBox + resetTimer() + + + 986 + 113 + + + 1071 + 368 + + + + + + timeBaseNeedsChanging(bool) + +
diff --git a/Desktop Interface/noclosemenu.cpp b/Desktop Interface/noclosemenu.cpp new file mode 100644 index 00000000..07cc148d --- /dev/null +++ b/Desktop Interface/noclosemenu.cpp @@ -0,0 +1,22 @@ +#include "noclosemenu.h" + +noCloseMenu::noCloseMenu(QWidget *parent) : QMenu(parent) +{ + +} + +//Dankon, Jakob Leben +//http://stackoverflow.com/questions/2050462/prevent-a-qmenu-from-closing-when-one-of-its-qaction-is-triggered + +void noCloseMenu::mouseReleaseEvent(QMouseEvent *e) +{ + QAction *action = activeAction(); + if (action && action->isEnabled()) { + action->setEnabled(false); + QMenu::mouseReleaseEvent(e); + action->setEnabled(true); + action->trigger(); + } + else + QMenu::mouseReleaseEvent(e); +} diff --git a/Desktop Interface/noclosemenu.h b/Desktop Interface/noclosemenu.h new file mode 100644 index 00000000..b10099ca --- /dev/null +++ b/Desktop Interface/noclosemenu.h @@ -0,0 +1,19 @@ +#ifndef NOCLOSEMENU_H +#define NOCLOSEMENU_H + +#include +#include + +class noCloseMenu : public QMenu +{ + Q_OBJECT +public: + explicit noCloseMenu(QWidget *parent = 0); +private: + void mouseReleaseEvent(QMouseEvent *e); +signals: + +public slots: +}; + +#endif // NOCLOSEMENU_H diff --git a/Desktop Interface/qcustomplot.cpp b/Desktop Interface/qcustomplot.cpp new file mode 100644 index 00000000..30860827 --- /dev/null +++ b/Desktop Interface/qcustomplot.cpp @@ -0,0 +1,23553 @@ +/*************************************************************************** +** ** +** QCustomPlot, an easy to use, modern plotting widget for Qt ** +** Copyright (C) 2011-2015 Emanuel Eichhammer ** +** ** +** This program is free software: you can redistribute it and/or modify ** +** it under the terms of the GNU General Public License as published by ** +** the Free Software Foundation, either version 3 of the License, or ** +** (at your option) any later version. ** +** ** +** This program is distributed in the hope that it will be useful, ** +** but WITHOUT ANY WARRANTY; without even the implied warranty of ** +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** +** GNU General Public License for more details. ** +** ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see http://www.gnu.org/licenses/. ** +** ** +**************************************************************************** +** Author: Emanuel Eichhammer ** +** Website/Contact: http://www.qcustomplot.com/ ** +** Date: 22.12.15 ** +** Version: 1.3.2 ** +****************************************************************************/ + +#include "qcustomplot.h" + + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPPainter +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPPainter + \brief QPainter subclass used internally + + This QPainter subclass is used to provide some extended functionality e.g. for tweaking position + consistency between antialiased and non-antialiased painting. Further it provides workarounds + for QPainter quirks. + + \warning This class intentionally hides non-virtual functions of QPainter, e.g. setPen, save and + restore. So while it is possible to pass a QCPPainter instance to a function that expects a + QPainter pointer, some of the workarounds and tweaks will be unavailable to the function (because + it will call the base class implementations of the functions actually hidden by QCPPainter). +*/ + +/*! + Creates a new QCPPainter instance and sets default values +*/ +QCPPainter::QCPPainter() : + QPainter(), + mModes(pmDefault), + mIsAntialiasing(false) +{ + // don't setRenderHint(QPainter::NonCosmeticDefautPen) here, because painter isn't active yet and + // a call to begin() will follow +} + +/*! + Creates a new QCPPainter instance on the specified paint \a device and sets default values. Just + like the analogous QPainter constructor, begins painting on \a device immediately. + + Like \ref begin, this method sets QPainter::NonCosmeticDefaultPen in Qt versions before Qt5. +*/ +QCPPainter::QCPPainter(QPaintDevice *device) : + QPainter(device), + mModes(pmDefault), + mIsAntialiasing(false) +{ +#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) // before Qt5, default pens used to be cosmetic if NonCosmeticDefaultPen flag isn't set. So we set it to get consistency across Qt versions. + if (isActive()) + setRenderHint(QPainter::NonCosmeticDefaultPen); +#endif +} + +QCPPainter::~QCPPainter() +{ +} + +/*! + Sets the pen of the painter and applies certain fixes to it, depending on the mode of this + QCPPainter. + + \note this function hides the non-virtual base class implementation. +*/ +void QCPPainter::setPen(const QPen &pen) +{ + QPainter::setPen(pen); + if (mModes.testFlag(pmNonCosmetic)) + makeNonCosmetic(); +} + +/*! \overload + + Sets the pen (by color) of the painter and applies certain fixes to it, depending on the mode of + this QCPPainter. + + \note this function hides the non-virtual base class implementation. +*/ +void QCPPainter::setPen(const QColor &color) +{ + QPainter::setPen(color); + if (mModes.testFlag(pmNonCosmetic)) + makeNonCosmetic(); +} + +/*! \overload + + Sets the pen (by style) of the painter and applies certain fixes to it, depending on the mode of + this QCPPainter. + + \note this function hides the non-virtual base class implementation. +*/ +void QCPPainter::setPen(Qt::PenStyle penStyle) +{ + QPainter::setPen(penStyle); + if (mModes.testFlag(pmNonCosmetic)) + makeNonCosmetic(); +} + +/*! \overload + + Works around a Qt bug introduced with Qt 4.8 which makes drawing QLineF unpredictable when + antialiasing is disabled. Thus when antialiasing is disabled, it rounds the \a line to + integer coordinates and then passes it to the original drawLine. + + \note this function hides the non-virtual base class implementation. +*/ +void QCPPainter::drawLine(const QLineF &line) +{ + if (mIsAntialiasing || mModes.testFlag(pmVectorized)) + QPainter::drawLine(line); + else + QPainter::drawLine(line.toLine()); +} + +/*! + Sets whether painting uses antialiasing or not. Use this method instead of using setRenderHint + with QPainter::Antialiasing directly, as it allows QCPPainter to regain pixel exactness between + antialiased and non-antialiased painting (Since Qt < 5.0 uses slightly different coordinate systems for + AA/Non-AA painting). +*/ +void QCPPainter::setAntialiasing(bool enabled) +{ + setRenderHint(QPainter::Antialiasing, enabled); + if (mIsAntialiasing != enabled) + { + mIsAntialiasing = enabled; + if (!mModes.testFlag(pmVectorized)) // antialiasing half-pixel shift only needed for rasterized outputs + { + if (mIsAntialiasing) + translate(0.5, 0.5); + else + translate(-0.5, -0.5); + } + } +} + +/*! + Sets the mode of the painter. This controls whether the painter shall adjust its + fixes/workarounds optimized for certain output devices. +*/ +void QCPPainter::setModes(QCPPainter::PainterModes modes) +{ + mModes = modes; +} + +/*! + Sets the QPainter::NonCosmeticDefaultPen in Qt versions before Qt5 after beginning painting on \a + device. This is necessary to get cosmetic pen consistency across Qt versions, because since Qt5, + all pens are non-cosmetic by default, and in Qt4 this render hint must be set to get that + behaviour. + + The Constructor \ref QCPPainter(QPaintDevice *device) which directly starts painting also sets + the render hint as appropriate. + + \note this function hides the non-virtual base class implementation. +*/ +bool QCPPainter::begin(QPaintDevice *device) +{ + bool result = QPainter::begin(device); +#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) // before Qt5, default pens used to be cosmetic if NonCosmeticDefaultPen flag isn't set. So we set it to get consistency across Qt versions. + if (result) + setRenderHint(QPainter::NonCosmeticDefaultPen); +#endif + return result; +} + +/*! \overload + + Sets the mode of the painter. This controls whether the painter shall adjust its + fixes/workarounds optimized for certain output devices. +*/ +void QCPPainter::setMode(QCPPainter::PainterMode mode, bool enabled) +{ + if (!enabled && mModes.testFlag(mode)) + mModes &= ~mode; + else if (enabled && !mModes.testFlag(mode)) + mModes |= mode; +} + +/*! + Saves the painter (see QPainter::save). Since QCPPainter adds some new internal state to + QPainter, the save/restore functions are reimplemented to also save/restore those members. + + \note this function hides the non-virtual base class implementation. + + \see restore +*/ +void QCPPainter::save() +{ + mAntialiasingStack.push(mIsAntialiasing); + QPainter::save(); +} + +/*! + Restores the painter (see QPainter::restore). Since QCPPainter adds some new internal state to + QPainter, the save/restore functions are reimplemented to also save/restore those members. + + \note this function hides the non-virtual base class implementation. + + \see save +*/ +void QCPPainter::restore() +{ + if (!mAntialiasingStack.isEmpty()) + mIsAntialiasing = mAntialiasingStack.pop(); + else + qDebug() << Q_FUNC_INFO << "Unbalanced save/restore"; + QPainter::restore(); +} + +/*! + Changes the pen width to 1 if it currently is 0. This function is called in the \ref setPen + overrides when the \ref pmNonCosmetic mode is set. +*/ +void QCPPainter::makeNonCosmetic() +{ + if (qFuzzyIsNull(pen().widthF())) + { + QPen p = pen(); + p.setWidth(1); + QPainter::setPen(p); + } +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPScatterStyle +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPScatterStyle + \brief Represents the visual appearance of scatter points + + This class holds information about shape, color and size of scatter points. In plottables like + QCPGraph it is used to store how scatter points shall be drawn. For example, \ref + QCPGraph::setScatterStyle takes a QCPScatterStyle instance. + + A scatter style consists of a shape (\ref setShape), a line color (\ref setPen) and possibly a + fill (\ref setBrush), if the shape provides a fillable area. Further, the size of the shape can + be controlled with \ref setSize. + + \section QCPScatterStyle-defining Specifying a scatter style + + You can set all these configurations either by calling the respective functions on an instance: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpscatterstyle-creation-1 + + Or you can use one of the various constructors that take different parameter combinations, making + it easy to specify a scatter style in a single call, like so: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpscatterstyle-creation-2 + + \section QCPScatterStyle-undefinedpen Leaving the color/pen up to the plottable + + There are two constructors which leave the pen undefined: \ref QCPScatterStyle() and \ref + QCPScatterStyle(ScatterShape shape, double size). If those constructors are used, a call to \ref + isPenDefined will return false. It leads to scatter points that inherit the pen from the + plottable that uses the scatter style. Thus, if such a scatter style is passed to QCPGraph, the line + color of the graph (\ref QCPGraph::setPen) will be used by the scatter points. This makes + it very convenient to set up typical scatter settings: + + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpscatterstyle-shortcreation + + Notice that it wasn't even necessary to explicitly call a QCPScatterStyle constructor. This works + because QCPScatterStyle provides a constructor that can transform a \ref ScatterShape directly + into a QCPScatterStyle instance (that's the \ref QCPScatterStyle(ScatterShape shape, double size) + constructor with a default for \a size). In those cases, C++ allows directly supplying a \ref + ScatterShape, where actually a QCPScatterStyle is expected. + + \section QCPScatterStyle-custompath-and-pixmap Custom shapes and pixmaps + + QCPScatterStyle supports drawing custom shapes and arbitrary pixmaps as scatter points. + + For custom shapes, you can provide a QPainterPath with the desired shape to the \ref + setCustomPath function or call the constructor that takes a painter path. The scatter shape will + automatically be set to \ref ssCustom. + + For pixmaps, you call \ref setPixmap with the desired QPixmap. Alternatively you can use the + constructor that takes a QPixmap. The scatter shape will automatically be set to \ref ssPixmap. + Note that \ref setSize does not influence the appearance of the pixmap. +*/ + +/* start documentation of inline functions */ + +/*! \fn bool QCPScatterStyle::isNone() const + + Returns whether the scatter shape is \ref ssNone. + + \see setShape +*/ + +/*! \fn bool QCPScatterStyle::isPenDefined() const + + Returns whether a pen has been defined for this scatter style. + + The pen is undefined if a constructor is called that does not carry \a pen as parameter. Those are + \ref QCPScatterStyle() and \ref QCPScatterStyle(ScatterShape shape, double size). If the pen is + left undefined, the scatter color will be inherited from the plottable that uses this scatter + style. + + \see setPen +*/ + +/* end documentation of inline functions */ + +/*! + Creates a new QCPScatterStyle instance with size set to 6. No shape, pen or brush is defined. + + Since the pen is undefined (\ref isPenDefined returns false), the scatter color will be inherited + from the plottable that uses this scatter style. +*/ +QCPScatterStyle::QCPScatterStyle() : + mSize(6), + mShape(ssNone), + mPen(Qt::NoPen), + mBrush(Qt::NoBrush), + mPenDefined(false) +{ +} + +/*! + Creates a new QCPScatterStyle instance with shape set to \a shape and size to \a size. No pen or + brush is defined. + + Since the pen is undefined (\ref isPenDefined returns false), the scatter color will be inherited + from the plottable that uses this scatter style. +*/ +QCPScatterStyle::QCPScatterStyle(ScatterShape shape, double size) : + mSize(size), + mShape(shape), + mPen(Qt::NoPen), + mBrush(Qt::NoBrush), + mPenDefined(false) +{ +} + +/*! + Creates a new QCPScatterStyle instance with shape set to \a shape, the pen color set to \a color, + and size to \a size. No brush is defined, i.e. the scatter point will not be filled. +*/ +QCPScatterStyle::QCPScatterStyle(ScatterShape shape, const QColor &color, double size) : + mSize(size), + mShape(shape), + mPen(QPen(color)), + mBrush(Qt::NoBrush), + mPenDefined(true) +{ +} + +/*! + Creates a new QCPScatterStyle instance with shape set to \a shape, the pen color set to \a color, + the brush color to \a fill (with a solid pattern), and size to \a size. +*/ +QCPScatterStyle::QCPScatterStyle(ScatterShape shape, const QColor &color, const QColor &fill, double size) : + mSize(size), + mShape(shape), + mPen(QPen(color)), + mBrush(QBrush(fill)), + mPenDefined(true) +{ +} + +/*! + Creates a new QCPScatterStyle instance with shape set to \a shape, the pen set to \a pen, the + brush to \a brush, and size to \a size. + + \warning In some cases it might be tempting to directly use a pen style like Qt::NoPen as \a pen + and a color like Qt::blue as \a brush. Notice however, that the corresponding call\n + QCPScatterStyle(QCPScatterShape::ssCircle, Qt::NoPen, Qt::blue, 5)\n + doesn't necessarily lead C++ to use this constructor in some cases, but might mistake + Qt::NoPen for a QColor and use the + \ref QCPScatterStyle(ScatterShape shape, const QColor &color, const QColor &fill, double size) + constructor instead (which will lead to an unexpected look of the scatter points). To prevent + this, be more explicit with the parameter types. For example, use QBrush(Qt::blue) + instead of just Qt::blue, to clearly point out to the compiler that this constructor is + wanted. +*/ +QCPScatterStyle::QCPScatterStyle(ScatterShape shape, const QPen &pen, const QBrush &brush, double size) : + mSize(size), + mShape(shape), + mPen(pen), + mBrush(brush), + mPenDefined(pen.style() != Qt::NoPen) +{ +} + +/*! + Creates a new QCPScatterStyle instance which will show the specified \a pixmap. The scatter shape + is set to \ref ssPixmap. +*/ +QCPScatterStyle::QCPScatterStyle(const QPixmap &pixmap) : + mSize(5), + mShape(ssPixmap), + mPen(Qt::NoPen), + mBrush(Qt::NoBrush), + mPixmap(pixmap), + mPenDefined(false) +{ +} + +/*! + Creates a new QCPScatterStyle instance with a custom shape that is defined via \a customPath. The + scatter shape is set to \ref ssCustom. + + The custom shape line will be drawn with \a pen and filled with \a brush. The size has a slightly + different meaning than for built-in scatter points: The custom path will be drawn scaled by a + factor of \a size/6.0. Since the default \a size is 6, the custom path will appear at a its + natural size by default. To double the size of the path for example, set \a size to 12. +*/ +QCPScatterStyle::QCPScatterStyle(const QPainterPath &customPath, const QPen &pen, const QBrush &brush, double size) : + mSize(size), + mShape(ssCustom), + mPen(pen), + mBrush(brush), + mCustomPath(customPath), + mPenDefined(pen.style() != Qt::NoPen) +{ +} + +/*! + Sets the size (pixel diameter) of the drawn scatter points to \a size. + + \see setShape +*/ +void QCPScatterStyle::setSize(double size) +{ + mSize = size; +} + +/*! + Sets the shape to \a shape. + + Note that the calls \ref setPixmap and \ref setCustomPath automatically set the shape to \ref + ssPixmap and \ref ssCustom, respectively. + + \see setSize +*/ +void QCPScatterStyle::setShape(QCPScatterStyle::ScatterShape shape) +{ + mShape = shape; +} + +/*! + Sets the pen that will be used to draw scatter points to \a pen. + + If the pen was previously undefined (see \ref isPenDefined), the pen is considered defined after + a call to this function, even if \a pen is Qt::NoPen. + + \see setBrush +*/ +void QCPScatterStyle::setPen(const QPen &pen) +{ + mPenDefined = true; + mPen = pen; +} + +/*! + Sets the brush that will be used to fill scatter points to \a brush. Note that not all scatter + shapes have fillable areas. For example, \ref ssPlus does not while \ref ssCircle does. + + \see setPen +*/ +void QCPScatterStyle::setBrush(const QBrush &brush) +{ + mBrush = brush; +} + +/*! + Sets the pixmap that will be drawn as scatter point to \a pixmap. + + Note that \ref setSize does not influence the appearance of the pixmap. + + The scatter shape is automatically set to \ref ssPixmap. +*/ +void QCPScatterStyle::setPixmap(const QPixmap &pixmap) +{ + setShape(ssPixmap); + mPixmap = pixmap; +} + +/*! + Sets the custom shape that will be drawn as scatter point to \a customPath. + + The scatter shape is automatically set to \ref ssCustom. +*/ +void QCPScatterStyle::setCustomPath(const QPainterPath &customPath) +{ + setShape(ssCustom); + mCustomPath = customPath; +} + +/*! + Applies the pen and the brush of this scatter style to \a painter. If this scatter style has an + undefined pen (\ref isPenDefined), sets the pen of \a painter to \a defaultPen instead. + + This function is used by plottables (or any class that wants to draw scatters) just before a + number of scatters with this style shall be drawn with the \a painter. + + \see drawShape +*/ +void QCPScatterStyle::applyTo(QCPPainter *painter, const QPen &defaultPen) const +{ + painter->setPen(mPenDefined ? mPen : defaultPen); + painter->setBrush(mBrush); +} + +/*! + Draws the scatter shape with \a painter at position \a pos. + + This function does not modify the pen or the brush on the painter, as \ref applyTo is meant to be + called before scatter points are drawn with \ref drawShape. + + \see applyTo +*/ +void QCPScatterStyle::drawShape(QCPPainter *painter, QPointF pos) const +{ + drawShape(painter, pos.x(), pos.y()); +} + +/*! \overload + Draws the scatter shape with \a painter at position \a x and \a y. +*/ +void QCPScatterStyle::drawShape(QCPPainter *painter, double x, double y) const +{ + double w = mSize/2.0; + switch (mShape) + { + case ssNone: break; + case ssDot: + { + painter->drawLine(QPointF(x, y), QPointF(x+0.0001, y)); + break; + } + case ssCross: + { + painter->drawLine(QLineF(x-w, y-w, x+w, y+w)); + painter->drawLine(QLineF(x-w, y+w, x+w, y-w)); + break; + } + case ssPlus: + { + painter->drawLine(QLineF(x-w, y, x+w, y)); + painter->drawLine(QLineF( x, y+w, x, y-w)); + break; + } + case ssCircle: + { + painter->drawEllipse(QPointF(x , y), w, w); + break; + } + case ssDisc: + { + QBrush b = painter->brush(); + painter->setBrush(painter->pen().color()); + painter->drawEllipse(QPointF(x , y), w, w); + painter->setBrush(b); + break; + } + case ssSquare: + { + painter->drawRect(QRectF(x-w, y-w, mSize, mSize)); + break; + } + case ssDiamond: + { + painter->drawLine(QLineF(x-w, y, x, y-w)); + painter->drawLine(QLineF( x, y-w, x+w, y)); + painter->drawLine(QLineF(x+w, y, x, y+w)); + painter->drawLine(QLineF( x, y+w, x-w, y)); + break; + } + case ssStar: + { + painter->drawLine(QLineF(x-w, y, x+w, y)); + painter->drawLine(QLineF( x, y+w, x, y-w)); + painter->drawLine(QLineF(x-w*0.707, y-w*0.707, x+w*0.707, y+w*0.707)); + painter->drawLine(QLineF(x-w*0.707, y+w*0.707, x+w*0.707, y-w*0.707)); + break; + } + case ssTriangle: + { + painter->drawLine(QLineF(x-w, y+0.755*w, x+w, y+0.755*w)); + painter->drawLine(QLineF(x+w, y+0.755*w, x, y-0.977*w)); + painter->drawLine(QLineF( x, y-0.977*w, x-w, y+0.755*w)); + break; + } + case ssTriangleInverted: + { + painter->drawLine(QLineF(x-w, y-0.755*w, x+w, y-0.755*w)); + painter->drawLine(QLineF(x+w, y-0.755*w, x, y+0.977*w)); + painter->drawLine(QLineF( x, y+0.977*w, x-w, y-0.755*w)); + break; + } + case ssCrossSquare: + { + painter->drawLine(QLineF(x-w, y-w, x+w*0.95, y+w*0.95)); + painter->drawLine(QLineF(x-w, y+w*0.95, x+w*0.95, y-w)); + painter->drawRect(QRectF(x-w, y-w, mSize, mSize)); + break; + } + case ssPlusSquare: + { + painter->drawLine(QLineF(x-w, y, x+w*0.95, y)); + painter->drawLine(QLineF( x, y+w, x, y-w)); + painter->drawRect(QRectF(x-w, y-w, mSize, mSize)); + break; + } + case ssCrossCircle: + { + painter->drawLine(QLineF(x-w*0.707, y-w*0.707, x+w*0.670, y+w*0.670)); + painter->drawLine(QLineF(x-w*0.707, y+w*0.670, x+w*0.670, y-w*0.707)); + painter->drawEllipse(QPointF(x, y), w, w); + break; + } + case ssPlusCircle: + { + painter->drawLine(QLineF(x-w, y, x+w, y)); + painter->drawLine(QLineF( x, y+w, x, y-w)); + painter->drawEllipse(QPointF(x, y), w, w); + break; + } + case ssPeace: + { + painter->drawLine(QLineF(x, y-w, x, y+w)); + painter->drawLine(QLineF(x, y, x-w*0.707, y+w*0.707)); + painter->drawLine(QLineF(x, y, x+w*0.707, y+w*0.707)); + painter->drawEllipse(QPointF(x, y), w, w); + break; + } + case ssPixmap: + { + painter->drawPixmap(x-mPixmap.width()*0.5, y-mPixmap.height()*0.5, mPixmap); + break; + } + case ssCustom: + { + QTransform oldTransform = painter->transform(); + painter->translate(x, y); + painter->scale(mSize/6.0, mSize/6.0); + painter->drawPath(mCustomPath); + painter->setTransform(oldTransform); + break; + } + } +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPLayer +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPLayer + \brief A layer that may contain objects, to control the rendering order + + The Layering system of QCustomPlot is the mechanism to control the rendering order of the + elements inside the plot. + + It is based on the two classes QCPLayer and QCPLayerable. QCustomPlot holds an ordered list of + one or more instances of QCPLayer (see QCustomPlot::addLayer, QCustomPlot::layer, + QCustomPlot::moveLayer, etc.). When replotting, QCustomPlot goes through the list of layers + bottom to top and successively draws the layerables of the layers. + + A QCPLayer contains an ordered list of QCPLayerable instances. QCPLayerable is an abstract base + class from which almost all visible objects derive, like axes, grids, graphs, items, etc. + + Initially, QCustomPlot has five layers: "background", "grid", "main", "axes" and "legend" (in + that order). The top two layers "axes" and "legend" contain the default axes and legend, so they + will be drawn on top. In the middle, there is the "main" layer. It is initially empty and set as + the current layer (see QCustomPlot::setCurrentLayer). This means, all new plottables, items etc. + are created on this layer by default. Then comes the "grid" layer which contains the QCPGrid + instances (which belong tightly to QCPAxis, see \ref QCPAxis::grid). The Axis rect background + shall be drawn behind everything else, thus the default QCPAxisRect instance is placed on the + "background" layer. Of course, the layer affiliation of the individual objects can be changed as + required (\ref QCPLayerable::setLayer). + + Controlling the ordering of objects is easy: Create a new layer in the position you want it to + be, e.g. above "main", with QCustomPlot::addLayer. Then set the current layer with + QCustomPlot::setCurrentLayer to that new layer and finally create the objects normally. They will + be placed on the new layer automatically, due to the current layer setting. Alternatively you + could have also ignored the current layer setting and just moved the objects with + QCPLayerable::setLayer to the desired layer after creating them. + + It is also possible to move whole layers. For example, If you want the grid to be shown in front + of all plottables/items on the "main" layer, just move it above "main" with + QCustomPlot::moveLayer. + + The rendering order within one layer is simply by order of creation or insertion. The item + created last (or added last to the layer), is drawn on top of all other objects on that layer. + + When a layer is deleted, the objects on it are not deleted with it, but fall on the layer below + the deleted layer, see QCustomPlot::removeLayer. +*/ + +/* start documentation of inline functions */ + +/*! \fn QList QCPLayer::children() const + + Returns a list of all layerables on this layer. The order corresponds to the rendering order: + layerables with higher indices are drawn above layerables with lower indices. +*/ + +/*! \fn int QCPLayer::index() const + + Returns the index this layer has in the QCustomPlot. The index is the integer number by which this layer can be + accessed via \ref QCustomPlot::layer. + + Layers with higher indices will be drawn above layers with lower indices. +*/ + +/* end documentation of inline functions */ + +/*! + Creates a new QCPLayer instance. + + Normally you shouldn't directly instantiate layers, use \ref QCustomPlot::addLayer instead. + + \warning It is not checked that \a layerName is actually a unique layer name in \a parentPlot. + This check is only performed by \ref QCustomPlot::addLayer. +*/ +QCPLayer::QCPLayer(QCustomPlot *parentPlot, const QString &layerName) : + QObject(parentPlot), + mParentPlot(parentPlot), + mName(layerName), + mIndex(-1), // will be set to a proper value by the QCustomPlot layer creation function + mVisible(true) +{ + // Note: no need to make sure layerName is unique, because layer + // management is done with QCustomPlot functions. +} + +QCPLayer::~QCPLayer() +{ + // If child layerables are still on this layer, detach them, so they don't try to reach back to this + // then invalid layer once they get deleted/moved themselves. This only happens when layers are deleted + // directly, like in the QCustomPlot destructor. (The regular layer removal procedure for the user is to + // call QCustomPlot::removeLayer, which moves all layerables off this layer before deleting it.) + + while (!mChildren.isEmpty()) + mChildren.last()->setLayer(0); // removes itself from mChildren via removeChild() + + if (mParentPlot->currentLayer() == this) + qDebug() << Q_FUNC_INFO << "The parent plot's mCurrentLayer will be a dangling pointer. Should have been set to a valid layer or 0 beforehand."; +} + +/*! + Sets whether this layer is visible or not. If \a visible is set to false, all layerables on this + layer will be invisible. + + This function doesn't change the visibility property of the layerables (\ref + QCPLayerable::setVisible), but the \ref QCPLayerable::realVisibility of each layerable takes the + visibility of the parent layer into account. +*/ +void QCPLayer::setVisible(bool visible) +{ + mVisible = visible; +} + +/*! \internal + + Adds the \a layerable to the list of this layer. If \a prepend is set to true, the layerable will + be prepended to the list, i.e. be drawn beneath the other layerables already in the list. + + This function does not change the \a mLayer member of \a layerable to this layer. (Use + QCPLayerable::setLayer to change the layer of an object, not this function.) + + \see removeChild +*/ +void QCPLayer::addChild(QCPLayerable *layerable, bool prepend) +{ + if (!mChildren.contains(layerable)) + { + if (prepend) + mChildren.prepend(layerable); + else + mChildren.append(layerable); + } else + qDebug() << Q_FUNC_INFO << "layerable is already child of this layer" << reinterpret_cast(layerable); +} + +/*! \internal + + Removes the \a layerable from the list of this layer. + + This function does not change the \a mLayer member of \a layerable. (Use QCPLayerable::setLayer + to change the layer of an object, not this function.) + + \see addChild +*/ +void QCPLayer::removeChild(QCPLayerable *layerable) +{ + if (!mChildren.removeOne(layerable)) + qDebug() << Q_FUNC_INFO << "layerable is not child of this layer" << reinterpret_cast(layerable); +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPLayerable +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPLayerable + \brief Base class for all drawable objects + + This is the abstract base class most visible objects derive from, e.g. plottables, axes, grid + etc. + + Every layerable is on a layer (QCPLayer) which allows controlling the rendering order by stacking + the layers accordingly. + + For details about the layering mechanism, see the QCPLayer documentation. +*/ + +/* start documentation of inline functions */ + +/*! \fn QCPLayerable *QCPLayerable::parentLayerable() const + + Returns the parent layerable of this layerable. The parent layerable is used to provide + visibility hierarchies in conjunction with the method \ref realVisibility. This way, layerables + only get drawn if their parent layerables are visible, too. + + Note that a parent layerable is not necessarily also the QObject parent for memory management. + Further, a layerable doesn't always have a parent layerable, so this function may return 0. + + A parent layerable is set implicitly with when placed inside layout elements and doesn't need to be + set manually by the user. +*/ + +/* end documentation of inline functions */ +/* start documentation of pure virtual functions */ + +/*! \fn virtual void QCPLayerable::applyDefaultAntialiasingHint(QCPPainter *painter) const = 0 + \internal + + This function applies the default antialiasing setting to the specified \a painter, using the + function \ref applyAntialiasingHint. It is the antialiasing state the painter is put in, when + \ref draw is called on the layerable. If the layerable has multiple entities whose antialiasing + setting may be specified individually, this function should set the antialiasing state of the + most prominent entity. In this case however, the \ref draw function usually calls the specialized + versions of this function before drawing each entity, effectively overriding the setting of the + default antialiasing hint. + + First example: QCPGraph has multiple entities that have an antialiasing setting: The graph + line, fills, scatters and error bars. Those can be configured via QCPGraph::setAntialiased, + QCPGraph::setAntialiasedFill, QCPGraph::setAntialiasedScatters etc. Consequently, there isn't + only the QCPGraph::applyDefaultAntialiasingHint function (which corresponds to the graph line's + antialiasing), but specialized ones like QCPGraph::applyFillAntialiasingHint and + QCPGraph::applyScattersAntialiasingHint. So before drawing one of those entities, QCPGraph::draw + calls the respective specialized applyAntialiasingHint function. + + Second example: QCPItemLine consists only of a line so there is only one antialiasing + setting which can be controlled with QCPItemLine::setAntialiased. (This function is inherited by + all layerables. The specialized functions, as seen on QCPGraph, must be added explicitly to the + respective layerable subclass.) Consequently it only has the normal + QCPItemLine::applyDefaultAntialiasingHint. The \ref QCPItemLine::draw function doesn't need to + care about setting any antialiasing states, because the default antialiasing hint is already set + on the painter when the \ref draw function is called, and that's the state it wants to draw the + line with. +*/ + +/*! \fn virtual void QCPLayerable::draw(QCPPainter *painter) const = 0 + \internal + + This function draws the layerable with the specified \a painter. It is only called by + QCustomPlot, if the layerable is visible (\ref setVisible). + + Before this function is called, the painter's antialiasing state is set via \ref + applyDefaultAntialiasingHint, see the documentation there. Further, the clipping rectangle was + set to \ref clipRect. +*/ + +/* end documentation of pure virtual functions */ +/* start documentation of signals */ + +/*! \fn void QCPLayerable::layerChanged(QCPLayer *newLayer); + + This signal is emitted when the layer of this layerable changes, i.e. this layerable is moved to + a different layer. + + \see setLayer +*/ + +/* end documentation of signals */ + +/*! + Creates a new QCPLayerable instance. + + Since QCPLayerable is an abstract base class, it can't be instantiated directly. Use one of the + derived classes. + + If \a plot is provided, it automatically places itself on the layer named \a targetLayer. If \a + targetLayer is an empty string, it places itself on the current layer of the plot (see \ref + QCustomPlot::setCurrentLayer). + + It is possible to provide 0 as \a plot. In that case, you should assign a parent plot at a later + time with \ref initializeParentPlot. + + The layerable's parent layerable is set to \a parentLayerable, if provided. Direct layerable + parents are mainly used to control visibility in a hierarchy of layerables. This means a + layerable is only drawn, if all its ancestor layerables are also visible. Note that \a + parentLayerable does not become the QObject-parent (for memory management) of this layerable, \a + plot does. It is not uncommon to set the QObject-parent to something else in the constructors of + QCPLayerable subclasses, to guarantee a working destruction hierarchy. +*/ +QCPLayerable::QCPLayerable(QCustomPlot *plot, QString targetLayer, QCPLayerable *parentLayerable) : + QObject(plot), + mVisible(true), + mParentPlot(plot), + mParentLayerable(parentLayerable), + mLayer(0), + mAntialiased(true) +{ + if (mParentPlot) + { + if (targetLayer.isEmpty()) + setLayer(mParentPlot->currentLayer()); + else if (!setLayer(targetLayer)) + qDebug() << Q_FUNC_INFO << "setting QCPlayerable initial layer to" << targetLayer << "failed."; + } +} + +QCPLayerable::~QCPLayerable() +{ + if (mLayer) + { + mLayer->removeChild(this); + mLayer = 0; + } +} + +/*! + Sets the visibility of this layerable object. If an object is not visible, it will not be drawn + on the QCustomPlot surface, and user interaction with it (e.g. click and selection) is not + possible. +*/ +void QCPLayerable::setVisible(bool on) +{ + mVisible = on; +} + +/*! + Sets the \a layer of this layerable object. The object will be placed on top of the other objects + already on \a layer. + + If \a layer is 0, this layerable will not be on any layer and thus not appear in the plot (or + interact/receive events). + + Returns true if the layer of this layerable was successfully changed to \a layer. +*/ +bool QCPLayerable::setLayer(QCPLayer *layer) +{ + return moveToLayer(layer, false); +} + +/*! \overload + Sets the layer of this layerable object by name + + Returns true on success, i.e. if \a layerName is a valid layer name. +*/ +bool QCPLayerable::setLayer(const QString &layerName) +{ + if (!mParentPlot) + { + qDebug() << Q_FUNC_INFO << "no parent QCustomPlot set"; + return false; + } + if (QCPLayer *layer = mParentPlot->layer(layerName)) + { + return setLayer(layer); + } else + { + qDebug() << Q_FUNC_INFO << "there is no layer with name" << layerName; + return false; + } +} + +/*! + Sets whether this object will be drawn antialiased or not. + + Note that antialiasing settings may be overridden by QCustomPlot::setAntialiasedElements and + QCustomPlot::setNotAntialiasedElements. +*/ +void QCPLayerable::setAntialiased(bool enabled) +{ + mAntialiased = enabled; +} + +/*! + Returns whether this layerable is visible, taking the visibility of the layerable parent and the + visibility of the layer this layerable is on into account. This is the method that is consulted + to decide whether a layerable shall be drawn or not. + + If this layerable has a direct layerable parent (usually set via hierarchies implemented in + subclasses, like in the case of QCPLayoutElement), this function returns true only if this + layerable has its visibility set to true and the parent layerable's \ref realVisibility returns + true. + + If this layerable doesn't have a direct layerable parent, returns the state of this layerable's + visibility. +*/ +bool QCPLayerable::realVisibility() const +{ + return mVisible && (!mLayer || mLayer->visible()) && (!mParentLayerable || mParentLayerable.data()->realVisibility()); +} + +/*! + This function is used to decide whether a click hits a layerable object or not. + + \a pos is a point in pixel coordinates on the QCustomPlot surface. This function returns the + shortest pixel distance of this point to the object. If the object is either invisible or the + distance couldn't be determined, -1.0 is returned. Further, if \a onlySelectable is true and the + object is not selectable, -1.0 is returned, too. + + If the object is represented not by single lines but by an area like a \ref QCPItemText or the + bars of a \ref QCPBars plottable, a click inside the area should also be considered a hit. In + these cases this function thus returns a constant value greater zero but still below the parent + plot's selection tolerance. (typically the selectionTolerance multiplied by 0.99). + + Providing a constant value for area objects allows selecting line objects even when they are + obscured by such area objects, by clicking close to the lines (i.e. closer than + 0.99*selectionTolerance). + + The actual setting of the selection state is not done by this function. This is handled by the + parent QCustomPlot when the mouseReleaseEvent occurs, and the finally selected object is notified + via the selectEvent/deselectEvent methods. + + \a details is an optional output parameter. Every layerable subclass may place any information + in \a details. This information will be passed to \ref selectEvent when the parent QCustomPlot + decides on the basis of this selectTest call, that the object was successfully selected. The + subsequent call to \ref selectEvent will carry the \a details. This is useful for multi-part + objects (like QCPAxis). This way, a possibly complex calculation to decide which part was clicked + is only done once in \ref selectTest. The result (i.e. the actually clicked part) can then be + placed in \a details. So in the subsequent \ref selectEvent, the decision which part was + selected doesn't have to be done a second time for a single selection operation. + + You may pass 0 as \a details to indicate that you are not interested in those selection details. + + \see selectEvent, deselectEvent, QCustomPlot::setInteractions +*/ +double QCPLayerable::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(pos) + Q_UNUSED(onlySelectable) + Q_UNUSED(details) + return -1.0; +} + +/*! \internal + + Sets the parent plot of this layerable. Use this function once to set the parent plot if you have + passed 0 in the constructor. It can not be used to move a layerable from one QCustomPlot to + another one. + + Note that, unlike when passing a non-null parent plot in the constructor, this function does not + make \a parentPlot the QObject-parent of this layerable. If you want this, call + QObject::setParent(\a parentPlot) in addition to this function. + + Further, you will probably want to set a layer (\ref setLayer) after calling this function, to + make the layerable appear on the QCustomPlot. + + The parent plot change will be propagated to subclasses via a call to \ref parentPlotInitialized + so they can react accordingly (e.g. also initialize the parent plot of child layerables, like + QCPLayout does). +*/ +void QCPLayerable::initializeParentPlot(QCustomPlot *parentPlot) +{ + if (mParentPlot) + { + qDebug() << Q_FUNC_INFO << "called with mParentPlot already initialized"; + return; + } + + if (!parentPlot) + qDebug() << Q_FUNC_INFO << "called with parentPlot zero"; + + mParentPlot = parentPlot; + parentPlotInitialized(mParentPlot); +} + +/*! \internal + + Sets the parent layerable of this layerable to \a parentLayerable. Note that \a parentLayerable does not + become the QObject-parent (for memory management) of this layerable. + + The parent layerable has influence on the return value of the \ref realVisibility method. Only + layerables with a fully visible parent tree will return true for \ref realVisibility, and thus be + drawn. + + \see realVisibility +*/ +void QCPLayerable::setParentLayerable(QCPLayerable *parentLayerable) +{ + mParentLayerable = parentLayerable; +} + +/*! \internal + + Moves this layerable object to \a layer. If \a prepend is true, this object will be prepended to + the new layer's list, i.e. it will be drawn below the objects already on the layer. If it is + false, the object will be appended. + + Returns true on success, i.e. if \a layer is a valid layer. +*/ +bool QCPLayerable::moveToLayer(QCPLayer *layer, bool prepend) +{ + if (layer && !mParentPlot) + { + qDebug() << Q_FUNC_INFO << "no parent QCustomPlot set"; + return false; + } + if (layer && layer->parentPlot() != mParentPlot) + { + qDebug() << Q_FUNC_INFO << "layer" << layer->name() << "is not in same QCustomPlot as this layerable"; + return false; + } + + QCPLayer *oldLayer = mLayer; + if (mLayer) + mLayer->removeChild(this); + mLayer = layer; + if (mLayer) + mLayer->addChild(this, prepend); + if (mLayer != oldLayer) + emit layerChanged(mLayer); + return true; +} + +/*! \internal + + Sets the QCPainter::setAntialiasing state on the provided \a painter, depending on the \a + localAntialiased value as well as the overrides \ref QCustomPlot::setAntialiasedElements and \ref + QCustomPlot::setNotAntialiasedElements. Which override enum this function takes into account is + controlled via \a overrideElement. +*/ +void QCPLayerable::applyAntialiasingHint(QCPPainter *painter, bool localAntialiased, QCP::AntialiasedElement overrideElement) const +{ + if (mParentPlot && mParentPlot->notAntialiasedElements().testFlag(overrideElement)) + painter->setAntialiasing(false); + else if (mParentPlot && mParentPlot->antialiasedElements().testFlag(overrideElement)) + painter->setAntialiasing(true); + else + painter->setAntialiasing(localAntialiased); +} + +/*! \internal + + This function is called by \ref initializeParentPlot, to allow subclasses to react on the setting + of a parent plot. This is the case when 0 was passed as parent plot in the constructor, and the + parent plot is set at a later time. + + For example, QCPLayoutElement/QCPLayout hierarchies may be created independently of any + QCustomPlot at first. When they are then added to a layout inside the QCustomPlot, the top level + element of the hierarchy gets its parent plot initialized with \ref initializeParentPlot. To + propagate the parent plot to all the children of the hierarchy, the top level element then uses + this function to pass the parent plot on to its child elements. + + The default implementation does nothing. + + \see initializeParentPlot +*/ +void QCPLayerable::parentPlotInitialized(QCustomPlot *parentPlot) +{ + Q_UNUSED(parentPlot) +} + +/*! \internal + + Returns the selection category this layerable shall belong to. The selection category is used in + conjunction with \ref QCustomPlot::setInteractions to control which objects are selectable and + which aren't. + + Subclasses that don't fit any of the normal \ref QCP::Interaction values can use \ref + QCP::iSelectOther. This is what the default implementation returns. + + \see QCustomPlot::setInteractions +*/ +QCP::Interaction QCPLayerable::selectionCategory() const +{ + return QCP::iSelectOther; +} + +/*! \internal + + Returns the clipping rectangle of this layerable object. By default, this is the viewport of the + parent QCustomPlot. Specific subclasses may reimplement this function to provide different + clipping rects. + + The returned clipping rect is set on the painter before the draw function of the respective + object is called. +*/ +QRect QCPLayerable::clipRect() const +{ + if (mParentPlot) + return mParentPlot->viewport(); + else + return QRect(); +} + +/*! \internal + + This event is called when the layerable shall be selected, as a consequence of a click by the + user. Subclasses should react to it by setting their selection state appropriately. The default + implementation does nothing. + + \a event is the mouse event that caused the selection. \a additive indicates, whether the user + was holding the multi-select-modifier while performing the selection (see \ref + QCustomPlot::setMultiSelectModifier). if \a additive is true, the selection state must be toggled + (i.e. become selected when unselected and unselected when selected). + + Every selectEvent is preceded by a call to \ref selectTest, which has returned positively (i.e. + returned a value greater than 0 and less than the selection tolerance of the parent QCustomPlot). + The \a details data you output from \ref selectTest is fed back via \a details here. You may + use it to transport any kind of information from the selectTest to the possibly subsequent + selectEvent. Usually \a details is used to transfer which part was clicked, if it is a layerable + that has multiple individually selectable parts (like QCPAxis). This way selectEvent doesn't need + to do the calculation again to find out which part was actually clicked. + + \a selectionStateChanged is an output parameter. If the pointer is non-null, this function must + set the value either to true or false, depending on whether the selection state of this layerable + was actually changed. For layerables that only are selectable as a whole and not in parts, this + is simple: if \a additive is true, \a selectionStateChanged must also be set to true, because the + selection toggles. If \a additive is false, \a selectionStateChanged is only set to true, if the + layerable was previously unselected and now is switched to the selected state. + + \see selectTest, deselectEvent +*/ +void QCPLayerable::selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged) +{ + Q_UNUSED(event) + Q_UNUSED(additive) + Q_UNUSED(details) + Q_UNUSED(selectionStateChanged) +} + +/*! \internal + + This event is called when the layerable shall be deselected, either as consequence of a user + interaction or a call to \ref QCustomPlot::deselectAll. Subclasses should react to it by + unsetting their selection appropriately. + + just as in \ref selectEvent, the output parameter \a selectionStateChanged (if non-null), must + return true or false when the selection state of this layerable has changed or not changed, + respectively. + + \see selectTest, selectEvent +*/ +void QCPLayerable::deselectEvent(bool *selectionStateChanged) +{ + Q_UNUSED(selectionStateChanged) +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPRange +//////////////////////////////////////////////////////////////////////////////////////////////////// +/*! \class QCPRange + \brief Represents the range an axis is encompassing. + + contains a \a lower and \a upper double value and provides convenience input, output and + modification functions. + + \see QCPAxis::setRange +*/ + +/*! + Minimum range size (\a upper - \a lower) the range changing functions will accept. Smaller + intervals would cause errors due to the 11-bit exponent of double precision numbers, + corresponding to a minimum magnitude of roughly 1e-308. + \see validRange, maxRange +*/ +const double QCPRange::minRange = 1e-280; + +/*! + Maximum values (negative and positive) the range will accept in range-changing functions. + Larger absolute values would cause errors due to the 11-bit exponent of double precision numbers, + corresponding to a maximum magnitude of roughly 1e308. + Since the number of planck-volumes in the entire visible universe is only ~1e183, this should + be enough. + \see validRange, minRange +*/ +const double QCPRange::maxRange = 1e250; + +/*! + Constructs a range with \a lower and \a upper set to zero. +*/ +QCPRange::QCPRange() : + lower(0), + upper(0) +{ +} + +/*! \overload + Constructs a range with the specified \a lower and \a upper values. +*/ +QCPRange::QCPRange(double lower, double upper) : + lower(lower), + upper(upper) +{ + normalize(); +} + +/*! + Returns the size of the range, i.e. \a upper-\a lower +*/ +double QCPRange::size() const +{ + return upper-lower; +} + +/*! + Returns the center of the range, i.e. (\a upper+\a lower)*0.5 +*/ +double QCPRange::center() const +{ + return (upper+lower)*0.5; +} + +/*! + Makes sure \a lower is numerically smaller than \a upper. If this is not the case, the values + are swapped. +*/ +void QCPRange::normalize() +{ + if (lower > upper) + qSwap(lower, upper); +} + +/*! + Expands this range such that \a otherRange is contained in the new range. It is assumed that both + this range and \a otherRange are normalized (see \ref normalize). + + If \a otherRange is already inside the current range, this function does nothing. + + \see expanded +*/ +void QCPRange::expand(const QCPRange &otherRange) +{ + if (lower > otherRange.lower) + lower = otherRange.lower; + if (upper < otherRange.upper) + upper = otherRange.upper; +} + + +/*! + Returns an expanded range that contains this and \a otherRange. It is assumed that both this + range and \a otherRange are normalized (see \ref normalize). + + \see expand +*/ +QCPRange QCPRange::expanded(const QCPRange &otherRange) const +{ + QCPRange result = *this; + result.expand(otherRange); + return result; +} + +/*! + Returns a sanitized version of the range. Sanitized means for logarithmic scales, that + the range won't span the positive and negative sign domain, i.e. contain zero. Further + \a lower will always be numerically smaller (or equal) to \a upper. + + If the original range does span positive and negative sign domains or contains zero, + the returned range will try to approximate the original range as good as possible. + If the positive interval of the original range is wider than the negative interval, the + returned range will only contain the positive interval, with lower bound set to \a rangeFac or + \a rangeFac *\a upper, whichever is closer to zero. Same procedure is used if the negative interval + is wider than the positive interval, this time by changing the \a upper bound. +*/ +QCPRange QCPRange::sanitizedForLogScale() const +{ + double rangeFac = 1e-3; + QCPRange sanitizedRange(lower, upper); + sanitizedRange.normalize(); + // can't have range spanning negative and positive values in log plot, so change range to fix it + //if (qFuzzyCompare(sanitizedRange.lower+1, 1) && !qFuzzyCompare(sanitizedRange.upper+1, 1)) + if (sanitizedRange.lower == 0.0 && sanitizedRange.upper != 0.0) + { + // case lower is 0 + if (rangeFac < sanitizedRange.upper*rangeFac) + sanitizedRange.lower = rangeFac; + else + sanitizedRange.lower = sanitizedRange.upper*rangeFac; + } //else if (!qFuzzyCompare(lower+1, 1) && qFuzzyCompare(upper+1, 1)) + else if (sanitizedRange.lower != 0.0 && sanitizedRange.upper == 0.0) + { + // case upper is 0 + if (-rangeFac > sanitizedRange.lower*rangeFac) + sanitizedRange.upper = -rangeFac; + else + sanitizedRange.upper = sanitizedRange.lower*rangeFac; + } else if (sanitizedRange.lower < 0 && sanitizedRange.upper > 0) + { + // find out whether negative or positive interval is wider to decide which sign domain will be chosen + if (-sanitizedRange.lower > sanitizedRange.upper) + { + // negative is wider, do same as in case upper is 0 + if (-rangeFac > sanitizedRange.lower*rangeFac) + sanitizedRange.upper = -rangeFac; + else + sanitizedRange.upper = sanitizedRange.lower*rangeFac; + } else + { + // positive is wider, do same as in case lower is 0 + if (rangeFac < sanitizedRange.upper*rangeFac) + sanitizedRange.lower = rangeFac; + else + sanitizedRange.lower = sanitizedRange.upper*rangeFac; + } + } + // due to normalization, case lower>0 && upper<0 should never occur, because that implies upper= lower && value <= upper; +} + +/*! + Checks, whether the specified range is within valid bounds, which are defined + as QCPRange::maxRange and QCPRange::minRange. + A valid range means: + \li range bounds within -maxRange and maxRange + \li range size above minRange + \li range size below maxRange +*/ +bool QCPRange::validRange(double lower, double upper) +{ + return (lower > -maxRange && + upper < maxRange && + qAbs(lower-upper) > minRange && + qAbs(lower-upper) < maxRange && + !(lower > 0 && qIsInf(upper/lower)) && + !(upper < 0 && qIsInf(lower/upper))); +} + +/*! + \overload + Checks, whether the specified range is within valid bounds, which are defined + as QCPRange::maxRange and QCPRange::minRange. + A valid range means: + \li range bounds within -maxRange and maxRange + \li range size above minRange + \li range size below maxRange +*/ +bool QCPRange::validRange(const QCPRange &range) +{ + return (range.lower > -maxRange && + range.upper < maxRange && + qAbs(range.lower-range.upper) > minRange && + qAbs(range.lower-range.upper) < maxRange && + !(range.lower > 0 && qIsInf(range.upper/range.lower)) && + !(range.upper < 0 && qIsInf(range.lower/range.upper))); +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPMarginGroup +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPMarginGroup + \brief A margin group allows synchronization of margin sides if working with multiple layout elements. + + QCPMarginGroup allows you to tie a margin side of two or more layout elements together, such that + they will all have the same size, based on the largest required margin in the group. + + \n + \image html QCPMarginGroup.png "Demonstration of QCPMarginGroup" + \n + + In certain situations it is desirable that margins at specific sides are synchronized across + layout elements. For example, if one QCPAxisRect is below another one in a grid layout, it will + provide a cleaner look to the user if the left and right margins of the two axis rects are of the + same size. The left axis of the top axis rect will then be at the same horizontal position as the + left axis of the lower axis rect, making them appear aligned. The same applies for the right + axes. This is what QCPMarginGroup makes possible. + + To add/remove a specific side of a layout element to/from a margin group, use the \ref + QCPLayoutElement::setMarginGroup method. To completely break apart the margin group, either call + \ref clear, or just delete the margin group. + + \section QCPMarginGroup-example Example + + First create a margin group: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpmargingroup-creation-1 + Then set this group on the layout element sides: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpmargingroup-creation-2 + Here, we've used the first two axis rects of the plot and synchronized their left margins with + each other and their right margins with each other. +*/ + +/* start documentation of inline functions */ + +/*! \fn QList QCPMarginGroup::elements(QCP::MarginSide side) const + + Returns a list of all layout elements that have their margin \a side associated with this margin + group. +*/ + +/* end documentation of inline functions */ + +/*! + Creates a new QCPMarginGroup instance in \a parentPlot. +*/ +QCPMarginGroup::QCPMarginGroup(QCustomPlot *parentPlot) : + QObject(parentPlot), + mParentPlot(parentPlot) +{ + mChildren.insert(QCP::msLeft, QList()); + mChildren.insert(QCP::msRight, QList()); + mChildren.insert(QCP::msTop, QList()); + mChildren.insert(QCP::msBottom, QList()); +} + +QCPMarginGroup::~QCPMarginGroup() +{ + clear(); +} + +/*! + Returns whether this margin group is empty. If this function returns true, no layout elements use + this margin group to synchronize margin sides. +*/ +bool QCPMarginGroup::isEmpty() const +{ + QHashIterator > it(mChildren); + while (it.hasNext()) + { + it.next(); + if (!it.value().isEmpty()) + return false; + } + return true; +} + +/*! + Clears this margin group. The synchronization of the margin sides that use this margin group is + lifted and they will use their individual margin sizes again. +*/ +void QCPMarginGroup::clear() +{ + // make all children remove themselves from this margin group: + QHashIterator > it(mChildren); + while (it.hasNext()) + { + it.next(); + const QList elements = it.value(); + for (int i=elements.size()-1; i>=0; --i) + elements.at(i)->setMarginGroup(it.key(), 0); // removes itself from mChildren via removeChild + } +} + +/*! \internal + + Returns the synchronized common margin for \a side. This is the margin value that will be used by + the layout element on the respective side, if it is part of this margin group. + + The common margin is calculated by requesting the automatic margin (\ref + QCPLayoutElement::calculateAutoMargin) of each element associated with \a side in this margin + group, and choosing the largest returned value. (QCPLayoutElement::minimumMargins is taken into + account, too.) +*/ +int QCPMarginGroup::commonMargin(QCP::MarginSide side) const +{ + // query all automatic margins of the layout elements in this margin group side and find maximum: + int result = 0; + const QList elements = mChildren.value(side); + for (int i=0; iautoMargins().testFlag(side)) + continue; + int m = qMax(elements.at(i)->calculateAutoMargin(side), QCP::getMarginValue(elements.at(i)->minimumMargins(), side)); + if (m > result) + result = m; + } + return result; +} + +/*! \internal + + Adds \a element to the internal list of child elements, for the margin \a side. + + This function does not modify the margin group property of \a element. +*/ +void QCPMarginGroup::addChild(QCP::MarginSide side, QCPLayoutElement *element) +{ + if (!mChildren[side].contains(element)) + mChildren[side].append(element); + else + qDebug() << Q_FUNC_INFO << "element is already child of this margin group side" << reinterpret_cast(element); +} + +/*! \internal + + Removes \a element from the internal list of child elements, for the margin \a side. + + This function does not modify the margin group property of \a element. +*/ +void QCPMarginGroup::removeChild(QCP::MarginSide side, QCPLayoutElement *element) +{ + if (!mChildren[side].removeOne(element)) + qDebug() << Q_FUNC_INFO << "element is not child of this margin group side" << reinterpret_cast(element); +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPLayoutElement +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPLayoutElement + \brief The abstract base class for all objects that form \ref thelayoutsystem "the layout system". + + This is an abstract base class. As such, it can't be instantiated directly, rather use one of its subclasses. + + A Layout element is a rectangular object which can be placed in layouts. It has an outer rect + (QCPLayoutElement::outerRect) and an inner rect (\ref QCPLayoutElement::rect). The difference + between outer and inner rect is called its margin. The margin can either be set to automatic or + manual (\ref setAutoMargins) on a per-side basis. If a side is set to manual, that margin can be + set explicitly with \ref setMargins and will stay fixed at that value. If it's set to automatic, + the layout element subclass will control the value itself (via \ref calculateAutoMargin). + + Layout elements can be placed in layouts (base class QCPLayout) like QCPLayoutGrid. The top level + layout is reachable via \ref QCustomPlot::plotLayout, and is a \ref QCPLayoutGrid. Since \ref + QCPLayout itself derives from \ref QCPLayoutElement, layouts can be nested. + + Thus in QCustomPlot one can divide layout elements into two categories: The ones that are + invisible by themselves, because they don't draw anything. Their only purpose is to manage the + position and size of other layout elements. This category of layout elements usually use + QCPLayout as base class. Then there is the category of layout elements which actually draw + something. For example, QCPAxisRect, QCPLegend and QCPPlotTitle are of this category. This does + not necessarily mean that the latter category can't have child layout elements. QCPLegend for + instance, actually derives from QCPLayoutGrid and the individual legend items are child layout + elements in the grid layout. +*/ + +/* start documentation of inline functions */ + +/*! \fn QCPLayout *QCPLayoutElement::layout() const + + Returns the parent layout of this layout element. +*/ + +/*! \fn QRect QCPLayoutElement::rect() const + + Returns the inner rect of this layout element. The inner rect is the outer rect (\ref + setOuterRect) shrinked by the margins (\ref setMargins, \ref setAutoMargins). + + In some cases, the area between outer and inner rect is left blank. In other cases the margin + area is used to display peripheral graphics while the main content is in the inner rect. This is + where automatic margin calculation becomes interesting because it allows the layout element to + adapt the margins to the peripheral graphics it wants to draw. For example, \ref QCPAxisRect + draws the axis labels and tick labels in the margin area, thus needs to adjust the margins (if + \ref setAutoMargins is enabled) according to the space required by the labels of the axes. +*/ + +/*! \fn virtual void QCPLayoutElement::mousePressEvent(QMouseEvent *event) + + This event is called, if the mouse was pressed while being inside the outer rect of this layout + element. +*/ + +/*! \fn virtual void QCPLayoutElement::mouseMoveEvent(QMouseEvent *event) + + This event is called, if the mouse is moved inside the outer rect of this layout element. +*/ + +/*! \fn virtual void QCPLayoutElement::mouseReleaseEvent(QMouseEvent *event) + + This event is called, if the mouse was previously pressed inside the outer rect of this layout + element and is now released. +*/ + +/*! \fn virtual void QCPLayoutElement::mouseDoubleClickEvent(QMouseEvent *event) + + This event is called, if the mouse is double-clicked inside the outer rect of this layout + element. +*/ + +/*! \fn virtual void QCPLayoutElement::wheelEvent(QWheelEvent *event) + + This event is called, if the mouse wheel is scrolled while the cursor is inside the rect of this + layout element. +*/ + +/* end documentation of inline functions */ + +/*! + Creates an instance of QCPLayoutElement and sets default values. +*/ +QCPLayoutElement::QCPLayoutElement(QCustomPlot *parentPlot) : + QCPLayerable(parentPlot), // parenthood is changed as soon as layout element gets inserted into a layout (except for top level layout) + mParentLayout(0), + mMinimumSize(), + mMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX), + mRect(0, 0, 0, 0), + mOuterRect(0, 0, 0, 0), + mMargins(0, 0, 0, 0), + mMinimumMargins(0, 0, 0, 0), + mAutoMargins(QCP::msAll) +{ +} + +QCPLayoutElement::~QCPLayoutElement() +{ + setMarginGroup(QCP::msAll, 0); // unregister at margin groups, if there are any + // unregister at layout: + if (qobject_cast(mParentLayout)) // the qobject_cast is just a safeguard in case the layout forgets to call clear() in its dtor and this dtor is called by QObject dtor + mParentLayout->take(this); +} + +/*! + Sets the outer rect of this layout element. If the layout element is inside a layout, the layout + sets the position and size of this layout element using this function. + + Calling this function externally has no effect, since the layout will overwrite any changes to + the outer rect upon the next replot. + + The layout element will adapt its inner \ref rect by applying the margins inward to the outer rect. + + \see rect +*/ +void QCPLayoutElement::setOuterRect(const QRect &rect) +{ + if (mOuterRect != rect) + { + mOuterRect = rect; + mRect = mOuterRect.adjusted(mMargins.left(), mMargins.top(), -mMargins.right(), -mMargins.bottom()); + } +} + +/*! + Sets the margins of this layout element. If \ref setAutoMargins is disabled for some or all + sides, this function is used to manually set the margin on those sides. Sides that are still set + to be handled automatically are ignored and may have any value in \a margins. + + The margin is the distance between the outer rect (controlled by the parent layout via \ref + setOuterRect) and the inner \ref rect (which usually contains the main content of this layout + element). + + \see setAutoMargins +*/ +void QCPLayoutElement::setMargins(const QMargins &margins) +{ + if (mMargins != margins) + { + mMargins = margins; + mRect = mOuterRect.adjusted(mMargins.left(), mMargins.top(), -mMargins.right(), -mMargins.bottom()); + } +} + +/*! + If \ref setAutoMargins is enabled on some or all margins, this function is used to provide + minimum values for those margins. + + The minimum values are not enforced on margin sides that were set to be under manual control via + \ref setAutoMargins. + + \see setAutoMargins +*/ +void QCPLayoutElement::setMinimumMargins(const QMargins &margins) +{ + if (mMinimumMargins != margins) + { + mMinimumMargins = margins; + } +} + +/*! + Sets on which sides the margin shall be calculated automatically. If a side is calculated + automatically, a minimum margin value may be provided with \ref setMinimumMargins. If a side is + set to be controlled manually, the value may be specified with \ref setMargins. + + Margin sides that are under automatic control may participate in a \ref QCPMarginGroup (see \ref + setMarginGroup), to synchronize (align) it with other layout elements in the plot. + + \see setMinimumMargins, setMargins +*/ +void QCPLayoutElement::setAutoMargins(QCP::MarginSides sides) +{ + mAutoMargins = sides; +} + +/*! + Sets the minimum size for the inner \ref rect of this layout element. A parent layout tries to + respect the \a size here by changing row/column sizes in the layout accordingly. + + If the parent layout size is not sufficient to satisfy all minimum size constraints of its child + layout elements, the layout may set a size that is actually smaller than \a size. QCustomPlot + propagates the layout's size constraints to the outside by setting its own minimum QWidget size + accordingly, so violations of \a size should be exceptions. +*/ +void QCPLayoutElement::setMinimumSize(const QSize &size) +{ + if (mMinimumSize != size) + { + mMinimumSize = size; + if (mParentLayout) + mParentLayout->sizeConstraintsChanged(); + } +} + +/*! \overload + + Sets the minimum size for the inner \ref rect of this layout element. +*/ +void QCPLayoutElement::setMinimumSize(int width, int height) +{ + setMinimumSize(QSize(width, height)); +} + +/*! + Sets the maximum size for the inner \ref rect of this layout element. A parent layout tries to + respect the \a size here by changing row/column sizes in the layout accordingly. +*/ +void QCPLayoutElement::setMaximumSize(const QSize &size) +{ + if (mMaximumSize != size) + { + mMaximumSize = size; + if (mParentLayout) + mParentLayout->sizeConstraintsChanged(); + } +} + +/*! \overload + + Sets the maximum size for the inner \ref rect of this layout element. +*/ +void QCPLayoutElement::setMaximumSize(int width, int height) +{ + setMaximumSize(QSize(width, height)); +} + +/*! + Sets the margin \a group of the specified margin \a sides. + + Margin groups allow synchronizing specified margins across layout elements, see the documentation + of \ref QCPMarginGroup. + + To unset the margin group of \a sides, set \a group to 0. + + Note that margin groups only work for margin sides that are set to automatic (\ref + setAutoMargins). +*/ +void QCPLayoutElement::setMarginGroup(QCP::MarginSides sides, QCPMarginGroup *group) +{ + QVector sideVector; + if (sides.testFlag(QCP::msLeft)) sideVector.append(QCP::msLeft); + if (sides.testFlag(QCP::msRight)) sideVector.append(QCP::msRight); + if (sides.testFlag(QCP::msTop)) sideVector.append(QCP::msTop); + if (sides.testFlag(QCP::msBottom)) sideVector.append(QCP::msBottom); + + for (int i=0; iremoveChild(side, this); + + if (!group) // if setting to 0, remove hash entry. Else set hash entry to new group and register there + { + mMarginGroups.remove(side); + } else // setting to a new group + { + mMarginGroups[side] = group; + group->addChild(side, this); + } + } + } +} + +/*! + Updates the layout element and sub-elements. This function is automatically called before every + replot by the parent layout element. It is called multiple times, once for every \ref + UpdatePhase. The phases are run through in the order of the enum values. For details about what + happens at the different phases, see the documentation of \ref UpdatePhase. + + Layout elements that have child elements should call the \ref update method of their child + elements, and pass the current \a phase unchanged. + + The default implementation executes the automatic margin mechanism in the \ref upMargins phase. + Subclasses should make sure to call the base class implementation. +*/ +void QCPLayoutElement::update(UpdatePhase phase) +{ + if (phase == upMargins) + { + if (mAutoMargins != QCP::msNone) + { + // set the margins of this layout element according to automatic margin calculation, either directly or via a margin group: + QMargins newMargins = mMargins; + QList allMarginSides = QList() << QCP::msLeft << QCP::msRight << QCP::msTop << QCP::msBottom; + foreach (QCP::MarginSide side, allMarginSides) + { + if (mAutoMargins.testFlag(side)) // this side's margin shall be calculated automatically + { + if (mMarginGroups.contains(side)) + QCP::setMarginValue(newMargins, side, mMarginGroups[side]->commonMargin(side)); // this side is part of a margin group, so get the margin value from that group + else + QCP::setMarginValue(newMargins, side, calculateAutoMargin(side)); // this side is not part of a group, so calculate the value directly + // apply minimum margin restrictions: + if (QCP::getMarginValue(newMargins, side) < QCP::getMarginValue(mMinimumMargins, side)) + QCP::setMarginValue(newMargins, side, QCP::getMarginValue(mMinimumMargins, side)); + } + } + setMargins(newMargins); + } + } +} + +/*! + Returns the minimum size this layout element (the inner \ref rect) may be compressed to. + + if a minimum size (\ref setMinimumSize) was not set manually, parent layouts consult this + function to determine the minimum allowed size of this layout element. (A manual minimum size is + considered set if it is non-zero.) +*/ +QSize QCPLayoutElement::minimumSizeHint() const +{ + return mMinimumSize; +} + +/*! + Returns the maximum size this layout element (the inner \ref rect) may be expanded to. + + if a maximum size (\ref setMaximumSize) was not set manually, parent layouts consult this + function to determine the maximum allowed size of this layout element. (A manual maximum size is + considered set if it is smaller than Qt's QWIDGETSIZE_MAX.) +*/ +QSize QCPLayoutElement::maximumSizeHint() const +{ + return mMaximumSize; +} + +/*! + Returns a list of all child elements in this layout element. If \a recursive is true, all + sub-child elements are included in the list, too. + + \warning There may be entries with value 0 in the returned list. (For example, QCPLayoutGrid may have + empty cells which yield 0 at the respective index.) +*/ +QList QCPLayoutElement::elements(bool recursive) const +{ + Q_UNUSED(recursive) + return QList(); +} + +/*! + Layout elements are sensitive to events inside their outer rect. If \a pos is within the outer + rect, this method returns a value corresponding to 0.99 times the parent plot's selection + tolerance. However, layout elements are not selectable by default. So if \a onlySelectable is + true, -1.0 is returned. + + See \ref QCPLayerable::selectTest for a general explanation of this virtual method. + + QCPLayoutElement subclasses may reimplement this method to provide more specific selection test + behaviour. +*/ +double QCPLayoutElement::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + + if (onlySelectable) + return -1; + + if (QRectF(mOuterRect).contains(pos)) + { + if (mParentPlot) + return mParentPlot->selectionTolerance()*0.99; + else + { + qDebug() << Q_FUNC_INFO << "parent plot not defined"; + return -1; + } + } else + return -1; +} + +/*! \internal + + propagates the parent plot initialization to all child elements, by calling \ref + QCPLayerable::initializeParentPlot on them. +*/ +void QCPLayoutElement::parentPlotInitialized(QCustomPlot *parentPlot) +{ + foreach (QCPLayoutElement* el, elements(false)) + { + if (!el->parentPlot()) + el->initializeParentPlot(parentPlot); + } +} + +/*! \internal + + Returns the margin size for this \a side. It is used if automatic margins is enabled for this \a + side (see \ref setAutoMargins). If a minimum margin was set with \ref setMinimumMargins, the + returned value will not be smaller than the specified minimum margin. + + The default implementation just returns the respective manual margin (\ref setMargins) or the + minimum margin, whichever is larger. +*/ +int QCPLayoutElement::calculateAutoMargin(QCP::MarginSide side) +{ + return qMax(QCP::getMarginValue(mMargins, side), QCP::getMarginValue(mMinimumMargins, side)); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPLayout +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPLayout + \brief The abstract base class for layouts + + This is an abstract base class for layout elements whose main purpose is to define the position + and size of other child layout elements. In most cases, layouts don't draw anything themselves + (but there are exceptions to this, e.g. QCPLegend). + + QCPLayout derives from QCPLayoutElement, and thus can itself be nested in other layouts. + + QCPLayout introduces a common interface for accessing and manipulating the child elements. Those + functions are most notably \ref elementCount, \ref elementAt, \ref takeAt, \ref take, \ref + simplify, \ref removeAt, \ref remove and \ref clear. Individual subclasses may add more functions + to this interface which are more specialized to the form of the layout. For example, \ref + QCPLayoutGrid adds functions that take row and column indices to access cells of the layout grid + more conveniently. + + Since this is an abstract base class, you can't instantiate it directly. Rather use one of its + subclasses like QCPLayoutGrid or QCPLayoutInset. + + For a general introduction to the layout system, see the dedicated documentation page \ref + thelayoutsystem "The Layout System". +*/ + +/* start documentation of pure virtual functions */ + +/*! \fn virtual int QCPLayout::elementCount() const = 0 + + Returns the number of elements/cells in the layout. + + \see elements, elementAt +*/ + +/*! \fn virtual QCPLayoutElement* QCPLayout::elementAt(int index) const = 0 + + Returns the element in the cell with the given \a index. If \a index is invalid, returns 0. + + Note that even if \a index is valid, the respective cell may be empty in some layouts (e.g. + QCPLayoutGrid), so this function may return 0 in those cases. You may use this function to check + whether a cell is empty or not. + + \see elements, elementCount, takeAt +*/ + +/*! \fn virtual QCPLayoutElement* QCPLayout::takeAt(int index) = 0 + + Removes the element with the given \a index from the layout and returns it. + + If the \a index is invalid or the cell with that index is empty, returns 0. + + Note that some layouts don't remove the respective cell right away but leave an empty cell after + successful removal of the layout element. To collapse empty cells, use \ref simplify. + + \see elementAt, take +*/ + +/*! \fn virtual bool QCPLayout::take(QCPLayoutElement* element) = 0 + + Removes the specified \a element from the layout and returns true on success. + + If the \a element isn't in this layout, returns false. + + Note that some layouts don't remove the respective cell right away but leave an empty cell after + successful removal of the layout element. To collapse empty cells, use \ref simplify. + + \see takeAt +*/ + +/* end documentation of pure virtual functions */ + +/*! + Creates an instance of QCPLayout and sets default values. Note that since QCPLayout + is an abstract base class, it can't be instantiated directly. +*/ +QCPLayout::QCPLayout() +{ +} + +/*! + First calls the QCPLayoutElement::update base class implementation to update the margins on this + layout. + + Then calls \ref updateLayout which subclasses reimplement to reposition and resize their cells. + + Finally, \ref update is called on all child elements. +*/ +void QCPLayout::update(UpdatePhase phase) +{ + QCPLayoutElement::update(phase); + + // set child element rects according to layout: + if (phase == upLayout) + updateLayout(); + + // propagate update call to child elements: + const int elCount = elementCount(); + for (int i=0; iupdate(phase); + } +} + +/* inherits documentation from base class */ +QList QCPLayout::elements(bool recursive) const +{ + const int c = elementCount(); + QList result; +#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0) + result.reserve(c); +#endif + for (int i=0; ielements(recursive); + } + } + return result; +} + +/*! + Simplifies the layout by collapsing empty cells. The exact behavior depends on subclasses, the + default implementation does nothing. + + Not all layouts need simplification. For example, QCPLayoutInset doesn't use explicit + simplification while QCPLayoutGrid does. +*/ +void QCPLayout::simplify() +{ +} + +/*! + Removes and deletes the element at the provided \a index. Returns true on success. If \a index is + invalid or points to an empty cell, returns false. + + This function internally uses \ref takeAt to remove the element from the layout and then deletes + the returned element. Note that some layouts don't remove the respective cell right away but leave an + empty cell after successful removal of the layout element. To collapse empty cells, use \ref + simplify. + + \see remove, takeAt +*/ +bool QCPLayout::removeAt(int index) +{ + if (QCPLayoutElement *el = takeAt(index)) + { + delete el; + return true; + } else + return false; +} + +/*! + Removes and deletes the provided \a element. Returns true on success. If \a element is not in the + layout, returns false. + + This function internally uses \ref takeAt to remove the element from the layout and then deletes + the element. Note that some layouts don't remove the respective cell right away but leave an + empty cell after successful removal of the layout element. To collapse empty cells, use \ref + simplify. + + \see removeAt, take +*/ +bool QCPLayout::remove(QCPLayoutElement *element) +{ + if (take(element)) + { + delete element; + return true; + } else + return false; +} + +/*! + Removes and deletes all layout elements in this layout. Finally calls \ref simplify to make sure + all empty cells are collapsed. + + \see remove, removeAt +*/ +void QCPLayout::clear() +{ + for (int i=elementCount()-1; i>=0; --i) + { + if (elementAt(i)) + removeAt(i); + } + simplify(); +} + +/*! + Subclasses call this method to report changed (minimum/maximum) size constraints. + + If the parent of this layout is again a QCPLayout, forwards the call to the parent's \ref + sizeConstraintsChanged. If the parent is a QWidget (i.e. is the \ref QCustomPlot::plotLayout of + QCustomPlot), calls QWidget::updateGeometry, so if the QCustomPlot widget is inside a Qt QLayout, + it may update itself and resize cells accordingly. +*/ +void QCPLayout::sizeConstraintsChanged() const +{ + if (QWidget *w = qobject_cast(parent())) + w->updateGeometry(); + else if (QCPLayout *l = qobject_cast(parent())) + l->sizeConstraintsChanged(); +} + +/*! \internal + + Subclasses reimplement this method to update the position and sizes of the child elements/cells + via calling their \ref QCPLayoutElement::setOuterRect. The default implementation does nothing. + + The geometry used as a reference is the inner \ref rect of this layout. Child elements should stay + within that rect. + + \ref getSectionSizes may help with the reimplementation of this function. + + \see update +*/ +void QCPLayout::updateLayout() +{ +} + + +/*! \internal + + Associates \a el with this layout. This is done by setting the \ref QCPLayoutElement::layout, the + \ref QCPLayerable::parentLayerable and the QObject parent to this layout. + + Further, if \a el didn't previously have a parent plot, calls \ref + QCPLayerable::initializeParentPlot on \a el to set the paret plot. + + This method is used by subclass specific methods that add elements to the layout. Note that this + method only changes properties in \a el. The removal from the old layout and the insertion into + the new layout must be done additionally. +*/ +void QCPLayout::adoptElement(QCPLayoutElement *el) +{ + if (el) + { + el->mParentLayout = this; + el->setParentLayerable(this); + el->setParent(this); + if (!el->parentPlot()) + el->initializeParentPlot(mParentPlot); + } else + qDebug() << Q_FUNC_INFO << "Null element passed"; +} + +/*! \internal + + Disassociates \a el from this layout. This is done by setting the \ref QCPLayoutElement::layout + and the \ref QCPLayerable::parentLayerable to zero. The QObject parent is set to the parent + QCustomPlot. + + This method is used by subclass specific methods that remove elements from the layout (e.g. \ref + take or \ref takeAt). Note that this method only changes properties in \a el. The removal from + the old layout must be done additionally. +*/ +void QCPLayout::releaseElement(QCPLayoutElement *el) +{ + if (el) + { + el->mParentLayout = 0; + el->setParentLayerable(0); + el->setParent(mParentPlot); + // Note: Don't initializeParentPlot(0) here, because layout element will stay in same parent plot + } else + qDebug() << Q_FUNC_INFO << "Null element passed"; +} + +/*! \internal + + This is a helper function for the implementation of \ref updateLayout in subclasses. + + It calculates the sizes of one-dimensional sections with provided constraints on maximum section + sizes, minimum section sizes, relative stretch factors and the final total size of all sections. + + The QVector entries refer to the sections. Thus all QVectors must have the same size. + + \a maxSizes gives the maximum allowed size of each section. If there shall be no maximum size + imposed, set all vector values to Qt's QWIDGETSIZE_MAX. + + \a minSizes gives the minimum allowed size of each section. If there shall be no minimum size + imposed, set all vector values to zero. If the \a minSizes entries add up to a value greater than + \a totalSize, sections will be scaled smaller than the proposed minimum sizes. (In other words, + not exceeding the allowed total size is taken to be more important than not going below minimum + section sizes.) + + \a stretchFactors give the relative proportions of the sections to each other. If all sections + shall be scaled equally, set all values equal. If the first section shall be double the size of + each individual other section, set the first number of \a stretchFactors to double the value of + the other individual values (e.g. {2, 1, 1, 1}). + + \a totalSize is the value that the final section sizes will add up to. Due to rounding, the + actual sum may differ slightly. If you want the section sizes to sum up to exactly that value, + you could distribute the remaining difference on the sections. + + The return value is a QVector containing the section sizes. +*/ +QVector QCPLayout::getSectionSizes(QVector maxSizes, QVector minSizes, QVector stretchFactors, int totalSize) const +{ + if (maxSizes.size() != minSizes.size() || minSizes.size() != stretchFactors.size()) + { + qDebug() << Q_FUNC_INFO << "Passed vector sizes aren't equal:" << maxSizes << minSizes << stretchFactors; + return QVector(); + } + if (stretchFactors.isEmpty()) + return QVector(); + int sectionCount = stretchFactors.size(); + QVector sectionSizes(sectionCount); + // if provided total size is forced smaller than total minimum size, ignore minimum sizes (squeeze sections): + int minSizeSum = 0; + for (int i=0; i minimumLockedSections; + QList unfinishedSections; + for (int i=0; i result(sectionCount); + for (int i=0; i= 0 && row < mElements.size()) + { + if (column >= 0 && column < mElements.first().size()) + { + if (QCPLayoutElement *result = mElements.at(row).at(column)) + return result; + else + qDebug() << Q_FUNC_INFO << "Requested cell is empty. Row:" << row << "Column:" << column; + } else + qDebug() << Q_FUNC_INFO << "Invalid column. Row:" << row << "Column:" << column; + } else + qDebug() << Q_FUNC_INFO << "Invalid row. Row:" << row << "Column:" << column; + return 0; +} + +/*! + Returns the number of rows in the layout. + + \see columnCount +*/ +int QCPLayoutGrid::rowCount() const +{ + return mElements.size(); +} + +/*! + Returns the number of columns in the layout. + + \see rowCount +*/ +int QCPLayoutGrid::columnCount() const +{ + if (mElements.size() > 0) + return mElements.first().size(); + else + return 0; +} + +/*! + Adds the \a element to cell with \a row and \a column. If \a element is already in a layout, it + is first removed from there. If \a row or \a column don't exist yet, the layout is expanded + accordingly. + + Returns true if the element was added successfully, i.e. if the cell at \a row and \a column + didn't already have an element. + + \see element, hasElement, take, remove +*/ +bool QCPLayoutGrid::addElement(int row, int column, QCPLayoutElement *element) +{ + if (element) + { + if (!hasElement(row, column)) + { + if (element->layout()) // remove from old layout first + element->layout()->take(element); + expandTo(row+1, column+1); + mElements[row][column] = element; + adoptElement(element); + return true; + } else + qDebug() << Q_FUNC_INFO << "There is already an element in the specified row/column:" << row << column; + } else + qDebug() << Q_FUNC_INFO << "Can't add null element to row/column:" << row << column; + return false; +} + +/*! + Returns whether the cell at \a row and \a column exists and contains a valid element, i.e. isn't + empty. + + \see element +*/ +bool QCPLayoutGrid::hasElement(int row, int column) +{ + if (row >= 0 && row < rowCount() && column >= 0 && column < columnCount()) + return mElements.at(row).at(column); + else + return false; +} + +/*! + Sets the stretch \a factor of \a column. + + Stretch factors control the relative sizes of rows and columns. Cells will not be resized beyond + their minimum and maximum widths/heights (\ref QCPLayoutElement::setMinimumSize, \ref + QCPLayoutElement::setMaximumSize), regardless of the stretch factor. + + The default stretch factor of newly created rows/columns is 1. + + \see setColumnStretchFactors, setRowStretchFactor +*/ +void QCPLayoutGrid::setColumnStretchFactor(int column, double factor) +{ + if (column >= 0 && column < columnCount()) + { + if (factor > 0) + mColumnStretchFactors[column] = factor; + else + qDebug() << Q_FUNC_INFO << "Invalid stretch factor, must be positive:" << factor; + } else + qDebug() << Q_FUNC_INFO << "Invalid column:" << column; +} + +/*! + Sets the stretch \a factors of all columns. \a factors must have the size \ref columnCount. + + Stretch factors control the relative sizes of rows and columns. Cells will not be resized beyond + their minimum and maximum widths/heights (\ref QCPLayoutElement::setMinimumSize, \ref + QCPLayoutElement::setMaximumSize), regardless of the stretch factor. + + The default stretch factor of newly created rows/columns is 1. + + \see setColumnStretchFactor, setRowStretchFactors +*/ +void QCPLayoutGrid::setColumnStretchFactors(const QList &factors) +{ + if (factors.size() == mColumnStretchFactors.size()) + { + mColumnStretchFactors = factors; + for (int i=0; i= 0 && row < rowCount()) + { + if (factor > 0) + mRowStretchFactors[row] = factor; + else + qDebug() << Q_FUNC_INFO << "Invalid stretch factor, must be positive:" << factor; + } else + qDebug() << Q_FUNC_INFO << "Invalid row:" << row; +} + +/*! + Sets the stretch \a factors of all rows. \a factors must have the size \ref rowCount. + + Stretch factors control the relative sizes of rows and columns. Cells will not be resized beyond + their minimum and maximum widths/heights (\ref QCPLayoutElement::setMinimumSize, \ref + QCPLayoutElement::setMaximumSize), regardless of the stretch factor. + + The default stretch factor of newly created rows/columns is 1. + + \see setRowStretchFactor, setColumnStretchFactors +*/ +void QCPLayoutGrid::setRowStretchFactors(const QList &factors) +{ + if (factors.size() == mRowStretchFactors.size()) + { + mRowStretchFactors = factors; + for (int i=0; i()); + mRowStretchFactors.append(1); + } + // go through rows and expand columns as necessary: + int newColCount = qMax(columnCount(), newColumnCount); + for (int i=0; i rowCount()) + newIndex = rowCount(); + + mRowStretchFactors.insert(newIndex, 1); + QList newRow; + for (int col=0; col columnCount()) + newIndex = columnCount(); + + mColumnStretchFactors.insert(newIndex, 1); + for (int row=0; row minColWidths, minRowHeights, maxColWidths, maxRowHeights; + getMinimumRowColSizes(&minColWidths, &minRowHeights); + getMaximumRowColSizes(&maxColWidths, &maxRowHeights); + + int totalRowSpacing = (rowCount()-1) * mRowSpacing; + int totalColSpacing = (columnCount()-1) * mColumnSpacing; + QVector colWidths = getSectionSizes(maxColWidths, minColWidths, mColumnStretchFactors.toVector(), mRect.width()-totalColSpacing); + QVector rowHeights = getSectionSizes(maxRowHeights, minRowHeights, mRowStretchFactors.toVector(), mRect.height()-totalRowSpacing); + + // go through cells and set rects accordingly: + int yOffset = mRect.top(); + for (int row=0; row 0) + yOffset += rowHeights.at(row-1)+mRowSpacing; + int xOffset = mRect.left(); + for (int col=0; col 0) + xOffset += colWidths.at(col-1)+mColumnSpacing; + if (mElements.at(row).at(col)) + mElements.at(row).at(col)->setOuterRect(QRect(xOffset, yOffset, colWidths.at(col), rowHeights.at(row))); + } + } +} + +/* inherits documentation from base class */ +int QCPLayoutGrid::elementCount() const +{ + return rowCount()*columnCount(); +} + +/* inherits documentation from base class */ +QCPLayoutElement *QCPLayoutGrid::elementAt(int index) const +{ + if (index >= 0 && index < elementCount()) + return mElements.at(index / columnCount()).at(index % columnCount()); + else + return 0; +} + +/* inherits documentation from base class */ +QCPLayoutElement *QCPLayoutGrid::takeAt(int index) +{ + if (QCPLayoutElement *el = elementAt(index)) + { + releaseElement(el); + mElements[index / columnCount()][index % columnCount()] = 0; + return el; + } else + { + qDebug() << Q_FUNC_INFO << "Attempt to take invalid index:" << index; + return 0; + } +} + +/* inherits documentation from base class */ +bool QCPLayoutGrid::take(QCPLayoutElement *element) +{ + if (element) + { + for (int i=0; i QCPLayoutGrid::elements(bool recursive) const +{ + QList result; + int colC = columnCount(); + int rowC = rowCount(); +#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0) + result.reserve(colC*rowC); +#endif + for (int row=0; rowelements(recursive); + } + } + return result; +} + +/*! + Simplifies the layout by collapsing rows and columns which only contain empty cells. +*/ +void QCPLayoutGrid::simplify() +{ + // remove rows with only empty cells: + for (int row=rowCount()-1; row>=0; --row) + { + bool hasElements = false; + for (int col=0; col=0; --col) + { + bool hasElements = false; + for (int row=0; row minColWidths, minRowHeights; + getMinimumRowColSizes(&minColWidths, &minRowHeights); + QSize result(0, 0); + for (int i=0; i maxColWidths, maxRowHeights; + getMaximumRowColSizes(&maxColWidths, &maxRowHeights); + + QSize result(0, 0); + for (int i=0; i *minColWidths, QVector *minRowHeights) const +{ + *minColWidths = QVector(columnCount(), 0); + *minRowHeights = QVector(rowCount(), 0); + for (int row=0; rowminimumSizeHint(); + QSize min = mElements.at(row).at(col)->minimumSize(); + QSize final(min.width() > 0 ? min.width() : minHint.width(), min.height() > 0 ? min.height() : minHint.height()); + if (minColWidths->at(col) < final.width()) + (*minColWidths)[col] = final.width(); + if (minRowHeights->at(row) < final.height()) + (*minRowHeights)[row] = final.height(); + } + } + } +} + +/*! \internal + + Places the maximum column widths and row heights into \a maxColWidths and \a maxRowHeights + respectively. + + The maximum height of a row is the smallest maximum height of any element in that row. The + maximum width of a column is the smallest maximum width of any element in that column. + + This is a helper function for \ref updateLayout. + + \see getMinimumRowColSizes +*/ +void QCPLayoutGrid::getMaximumRowColSizes(QVector *maxColWidths, QVector *maxRowHeights) const +{ + *maxColWidths = QVector(columnCount(), QWIDGETSIZE_MAX); + *maxRowHeights = QVector(rowCount(), QWIDGETSIZE_MAX); + for (int row=0; rowmaximumSizeHint(); + QSize max = mElements.at(row).at(col)->maximumSize(); + QSize final(max.width() < QWIDGETSIZE_MAX ? max.width() : maxHint.width(), max.height() < QWIDGETSIZE_MAX ? max.height() : maxHint.height()); + if (maxColWidths->at(col) > final.width()) + (*maxColWidths)[col] = final.width(); + if (maxRowHeights->at(row) > final.height()) + (*maxRowHeights)[row] = final.height(); + } + } + } +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPLayoutInset +//////////////////////////////////////////////////////////////////////////////////////////////////// +/*! \class QCPLayoutInset + \brief A layout that places child elements aligned to the border or arbitrarily positioned + + Elements are placed either aligned to the border or at arbitrary position in the area of the + layout. Which placement applies is controlled with the \ref InsetPlacement (\ref + setInsetPlacement). + + Elements are added via \ref addElement(QCPLayoutElement *element, Qt::Alignment alignment) or + addElement(QCPLayoutElement *element, const QRectF &rect). If the first method is used, the inset + placement will default to \ref ipBorderAligned and the element will be aligned according to the + \a alignment parameter. The second method defaults to \ref ipFree and allows placing elements at + arbitrary position and size, defined by \a rect. + + The alignment or rect can be set via \ref setInsetAlignment or \ref setInsetRect, respectively. + + This is the layout that every QCPAxisRect has as \ref QCPAxisRect::insetLayout. +*/ + +/* start documentation of inline functions */ + +/*! \fn virtual void QCPLayoutInset::simplify() + + The QCPInsetLayout does not need simplification since it can never have empty cells due to its + linear index structure. This method does nothing. +*/ + +/* end documentation of inline functions */ + +/*! + Creates an instance of QCPLayoutInset and sets default values. +*/ +QCPLayoutInset::QCPLayoutInset() +{ +} + +QCPLayoutInset::~QCPLayoutInset() +{ + // clear all child layout elements. This is important because only the specific layouts know how + // to handle removing elements (clear calls virtual removeAt method to do that). + clear(); +} + +/*! + Returns the placement type of the element with the specified \a index. +*/ +QCPLayoutInset::InsetPlacement QCPLayoutInset::insetPlacement(int index) const +{ + if (elementAt(index)) + return mInsetPlacement.at(index); + else + { + qDebug() << Q_FUNC_INFO << "Invalid element index:" << index; + return ipFree; + } +} + +/*! + Returns the alignment of the element with the specified \a index. The alignment only has a + meaning, if the inset placement (\ref setInsetPlacement) is \ref ipBorderAligned. +*/ +Qt::Alignment QCPLayoutInset::insetAlignment(int index) const +{ + if (elementAt(index)) + return mInsetAlignment.at(index); + else + { + qDebug() << Q_FUNC_INFO << "Invalid element index:" << index; + return 0; + } +} + +/*! + Returns the rect of the element with the specified \a index. The rect only has a + meaning, if the inset placement (\ref setInsetPlacement) is \ref ipFree. +*/ +QRectF QCPLayoutInset::insetRect(int index) const +{ + if (elementAt(index)) + return mInsetRect.at(index); + else + { + qDebug() << Q_FUNC_INFO << "Invalid element index:" << index; + return QRectF(); + } +} + +/*! + Sets the inset placement type of the element with the specified \a index to \a placement. + + \see InsetPlacement +*/ +void QCPLayoutInset::setInsetPlacement(int index, QCPLayoutInset::InsetPlacement placement) +{ + if (elementAt(index)) + mInsetPlacement[index] = placement; + else + qDebug() << Q_FUNC_INFO << "Invalid element index:" << index; +} + +/*! + If the inset placement (\ref setInsetPlacement) is \ref ipBorderAligned, this function + is used to set the alignment of the element with the specified \a index to \a alignment. + + \a alignment is an or combination of the following alignment flags: Qt::AlignLeft, + Qt::AlignHCenter, Qt::AlighRight, Qt::AlignTop, Qt::AlignVCenter, Qt::AlignBottom. Any other + alignment flags will be ignored. +*/ +void QCPLayoutInset::setInsetAlignment(int index, Qt::Alignment alignment) +{ + if (elementAt(index)) + mInsetAlignment[index] = alignment; + else + qDebug() << Q_FUNC_INFO << "Invalid element index:" << index; +} + +/*! + If the inset placement (\ref setInsetPlacement) is \ref ipFree, this function is used to set the + position and size of the element with the specified \a index to \a rect. + + \a rect is given in fractions of the whole inset layout rect. So an inset with rect (0, 0, 1, 1) + will span the entire layout. An inset with rect (0.6, 0.1, 0.35, 0.35) will be in the top right + corner of the layout, with 35% width and height of the parent layout. + + Note that the minimum and maximum sizes of the embedded element (\ref + QCPLayoutElement::setMinimumSize, \ref QCPLayoutElement::setMaximumSize) are enforced. +*/ +void QCPLayoutInset::setInsetRect(int index, const QRectF &rect) +{ + if (elementAt(index)) + mInsetRect[index] = rect; + else + qDebug() << Q_FUNC_INFO << "Invalid element index:" << index; +} + +/* inherits documentation from base class */ +void QCPLayoutInset::updateLayout() +{ + for (int i=0; iminimumSizeHint(); + QSize maxSizeHint = mElements.at(i)->maximumSizeHint(); + finalMinSize.setWidth(mElements.at(i)->minimumSize().width() > 0 ? mElements.at(i)->minimumSize().width() : minSizeHint.width()); + finalMinSize.setHeight(mElements.at(i)->minimumSize().height() > 0 ? mElements.at(i)->minimumSize().height() : minSizeHint.height()); + finalMaxSize.setWidth(mElements.at(i)->maximumSize().width() < QWIDGETSIZE_MAX ? mElements.at(i)->maximumSize().width() : maxSizeHint.width()); + finalMaxSize.setHeight(mElements.at(i)->maximumSize().height() < QWIDGETSIZE_MAX ? mElements.at(i)->maximumSize().height() : maxSizeHint.height()); + if (mInsetPlacement.at(i) == ipFree) + { + insetRect = QRect(rect().x()+rect().width()*mInsetRect.at(i).x(), + rect().y()+rect().height()*mInsetRect.at(i).y(), + rect().width()*mInsetRect.at(i).width(), + rect().height()*mInsetRect.at(i).height()); + if (insetRect.size().width() < finalMinSize.width()) + insetRect.setWidth(finalMinSize.width()); + if (insetRect.size().height() < finalMinSize.height()) + insetRect.setHeight(finalMinSize.height()); + if (insetRect.size().width() > finalMaxSize.width()) + insetRect.setWidth(finalMaxSize.width()); + if (insetRect.size().height() > finalMaxSize.height()) + insetRect.setHeight(finalMaxSize.height()); + } else if (mInsetPlacement.at(i) == ipBorderAligned) + { + insetRect.setSize(finalMinSize); + Qt::Alignment al = mInsetAlignment.at(i); + if (al.testFlag(Qt::AlignLeft)) insetRect.moveLeft(rect().x()); + else if (al.testFlag(Qt::AlignRight)) insetRect.moveRight(rect().x()+rect().width()); + else insetRect.moveLeft(rect().x()+rect().width()*0.5-finalMinSize.width()*0.5); // default to Qt::AlignHCenter + if (al.testFlag(Qt::AlignTop)) insetRect.moveTop(rect().y()); + else if (al.testFlag(Qt::AlignBottom)) insetRect.moveBottom(rect().y()+rect().height()); + else insetRect.moveTop(rect().y()+rect().height()*0.5-finalMinSize.height()*0.5); // default to Qt::AlignVCenter + } + mElements.at(i)->setOuterRect(insetRect); + } +} + +/* inherits documentation from base class */ +int QCPLayoutInset::elementCount() const +{ + return mElements.size(); +} + +/* inherits documentation from base class */ +QCPLayoutElement *QCPLayoutInset::elementAt(int index) const +{ + if (index >= 0 && index < mElements.size()) + return mElements.at(index); + else + return 0; +} + +/* inherits documentation from base class */ +QCPLayoutElement *QCPLayoutInset::takeAt(int index) +{ + if (QCPLayoutElement *el = elementAt(index)) + { + releaseElement(el); + mElements.removeAt(index); + mInsetPlacement.removeAt(index); + mInsetAlignment.removeAt(index); + mInsetRect.removeAt(index); + return el; + } else + { + qDebug() << Q_FUNC_INFO << "Attempt to take invalid index:" << index; + return 0; + } +} + +/* inherits documentation from base class */ +bool QCPLayoutInset::take(QCPLayoutElement *element) +{ + if (element) + { + for (int i=0; irealVisibility() && mElements.at(i)->selectTest(pos, onlySelectable) >= 0) + return mParentPlot->selectionTolerance()*0.99; + } + return -1; +} + +/*! + Adds the specified \a element to the layout as an inset aligned at the border (\ref + setInsetAlignment is initialized with \ref ipBorderAligned). The alignment is set to \a + alignment. + + \a alignment is an or combination of the following alignment flags: Qt::AlignLeft, + Qt::AlignHCenter, Qt::AlighRight, Qt::AlignTop, Qt::AlignVCenter, Qt::AlignBottom. Any other + alignment flags will be ignored. + + \see addElement(QCPLayoutElement *element, const QRectF &rect) +*/ +void QCPLayoutInset::addElement(QCPLayoutElement *element, Qt::Alignment alignment) +{ + if (element) + { + if (element->layout()) // remove from old layout first + element->layout()->take(element); + mElements.append(element); + mInsetPlacement.append(ipBorderAligned); + mInsetAlignment.append(alignment); + mInsetRect.append(QRectF(0.6, 0.6, 0.4, 0.4)); + adoptElement(element); + } else + qDebug() << Q_FUNC_INFO << "Can't add null element"; +} + +/*! + Adds the specified \a element to the layout as an inset with free positioning/sizing (\ref + setInsetAlignment is initialized with \ref ipFree). The position and size is set to \a + rect. + + \a rect is given in fractions of the whole inset layout rect. So an inset with rect (0, 0, 1, 1) + will span the entire layout. An inset with rect (0.6, 0.1, 0.35, 0.35) will be in the top right + corner of the layout, with 35% width and height of the parent layout. + + \see addElement(QCPLayoutElement *element, Qt::Alignment alignment) +*/ +void QCPLayoutInset::addElement(QCPLayoutElement *element, const QRectF &rect) +{ + if (element) + { + if (element->layout()) // remove from old layout first + element->layout()->take(element); + mElements.append(element); + mInsetPlacement.append(ipFree); + mInsetAlignment.append(Qt::AlignRight|Qt::AlignTop); + mInsetRect.append(rect); + adoptElement(element); + } else + qDebug() << Q_FUNC_INFO << "Can't add null element"; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPLineEnding +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPLineEnding + \brief Handles the different ending decorations for line-like items + + \image html QCPLineEnding.png "The various ending styles currently supported" + + For every ending a line-like item has, an instance of this class exists. For example, QCPItemLine + has two endings which can be set with QCPItemLine::setHead and QCPItemLine::setTail. + + The styles themselves are defined via the enum QCPLineEnding::EndingStyle. Most decorations can + be modified regarding width and length, see \ref setWidth and \ref setLength. The direction of + the ending decoration (e.g. direction an arrow is pointing) is controlled by the line-like item. + For example, when both endings of a QCPItemLine are set to be arrows, they will point to opposite + directions, e.g. "outward". This can be changed by \ref setInverted, which would make the + respective arrow point inward. + + Note that due to the overloaded QCPLineEnding constructor, you may directly specify a + QCPLineEnding::EndingStyle where actually a QCPLineEnding is expected, e.g. + \snippet documentation/doc-code-snippets/mainwindow.cpp qcplineending-sethead +*/ + +/*! + Creates a QCPLineEnding instance with default values (style \ref esNone). +*/ +QCPLineEnding::QCPLineEnding() : + mStyle(esNone), + mWidth(8), + mLength(10), + mInverted(false) +{ +} + +/*! + Creates a QCPLineEnding instance with the specified values. +*/ +QCPLineEnding::QCPLineEnding(QCPLineEnding::EndingStyle style, double width, double length, bool inverted) : + mStyle(style), + mWidth(width), + mLength(length), + mInverted(inverted) +{ +} + +/*! + Sets the style of the ending decoration. +*/ +void QCPLineEnding::setStyle(QCPLineEnding::EndingStyle style) +{ + mStyle = style; +} + +/*! + Sets the width of the ending decoration, if the style supports it. On arrows, for example, the + width defines the size perpendicular to the arrow's pointing direction. + + \see setLength +*/ +void QCPLineEnding::setWidth(double width) +{ + mWidth = width; +} + +/*! + Sets the length of the ending decoration, if the style supports it. On arrows, for example, the + length defines the size in pointing direction. + + \see setWidth +*/ +void QCPLineEnding::setLength(double length) +{ + mLength = length; +} + +/*! + Sets whether the ending decoration shall be inverted. For example, an arrow decoration will point + inward when \a inverted is set to true. + + Note that also the \a width direction is inverted. For symmetrical ending styles like arrows or + discs, this doesn't make a difference. However, asymmetric styles like \ref esHalfBar are + affected by it, which can be used to control to which side the half bar points to. +*/ +void QCPLineEnding::setInverted(bool inverted) +{ + mInverted = inverted; +} + +/*! \internal + + Returns the maximum pixel radius the ending decoration might cover, starting from the position + the decoration is drawn at (typically a line ending/\ref QCPItemPosition of an item). + + This is relevant for clipping. Only omit painting of the decoration when the position where the + decoration is supposed to be drawn is farther away from the clipping rect than the returned + distance. +*/ +double QCPLineEnding::boundingDistance() const +{ + switch (mStyle) + { + case esNone: + return 0; + + case esFlatArrow: + case esSpikeArrow: + case esLineArrow: + case esSkewedBar: + return qSqrt(mWidth*mWidth+mLength*mLength); // items that have width and length + + case esDisc: + case esSquare: + case esDiamond: + case esBar: + case esHalfBar: + return mWidth*1.42; // items that only have a width -> width*sqrt(2) + + } + return 0; +} + +/*! + Starting from the origin of this line ending (which is style specific), returns the length + covered by the line ending symbol, in backward direction. + + For example, the \ref esSpikeArrow has a shorter real length than a \ref esFlatArrow, even if + both have the same \ref setLength value, because the spike arrow has an inward curved back, which + reduces the length along its center axis (the drawing origin for arrows is at the tip). + + This function is used for precise, style specific placement of line endings, for example in + QCPAxes. +*/ +double QCPLineEnding::realLength() const +{ + switch (mStyle) + { + case esNone: + case esLineArrow: + case esSkewedBar: + case esBar: + case esHalfBar: + return 0; + + case esFlatArrow: + return mLength; + + case esDisc: + case esSquare: + case esDiamond: + return mWidth*0.5; + + case esSpikeArrow: + return mLength*0.8; + } + return 0; +} + +/*! \internal + + Draws the line ending with the specified \a painter at the position \a pos. The direction of the + line ending is controlled with \a dir. +*/ +void QCPLineEnding::draw(QCPPainter *painter, const QVector2D &pos, const QVector2D &dir) const +{ + if (mStyle == esNone) + return; + + QVector2D lengthVec(dir.normalized()); + if (lengthVec.isNull()) + lengthVec = QVector2D(1, 0); + QVector2D widthVec(-lengthVec.y(), lengthVec.x()); + lengthVec *= (float)(mLength*(mInverted ? -1 : 1)); + widthVec *= (float)(mWidth*0.5*(mInverted ? -1 : 1)); + + QPen penBackup = painter->pen(); + QBrush brushBackup = painter->brush(); + QPen miterPen = penBackup; + miterPen.setJoinStyle(Qt::MiterJoin); // to make arrow heads spikey + QBrush brush(painter->pen().color(), Qt::SolidPattern); + switch (mStyle) + { + case esNone: break; + case esFlatArrow: + { + QPointF points[3] = {pos.toPointF(), + (pos-lengthVec+widthVec).toPointF(), + (pos-lengthVec-widthVec).toPointF() + }; + painter->setPen(miterPen); + painter->setBrush(brush); + painter->drawConvexPolygon(points, 3); + painter->setBrush(brushBackup); + painter->setPen(penBackup); + break; + } + case esSpikeArrow: + { + QPointF points[4] = {pos.toPointF(), + (pos-lengthVec+widthVec).toPointF(), + (pos-lengthVec*0.8f).toPointF(), + (pos-lengthVec-widthVec).toPointF() + }; + painter->setPen(miterPen); + painter->setBrush(brush); + painter->drawConvexPolygon(points, 4); + painter->setBrush(brushBackup); + painter->setPen(penBackup); + break; + } + case esLineArrow: + { + QPointF points[3] = {(pos-lengthVec+widthVec).toPointF(), + pos.toPointF(), + (pos-lengthVec-widthVec).toPointF() + }; + painter->setPen(miterPen); + painter->drawPolyline(points, 3); + painter->setPen(penBackup); + break; + } + case esDisc: + { + painter->setBrush(brush); + painter->drawEllipse(pos.toPointF(), mWidth*0.5, mWidth*0.5); + painter->setBrush(brushBackup); + break; + } + case esSquare: + { + QVector2D widthVecPerp(-widthVec.y(), widthVec.x()); + QPointF points[4] = {(pos-widthVecPerp+widthVec).toPointF(), + (pos-widthVecPerp-widthVec).toPointF(), + (pos+widthVecPerp-widthVec).toPointF(), + (pos+widthVecPerp+widthVec).toPointF() + }; + painter->setPen(miterPen); + painter->setBrush(brush); + painter->drawConvexPolygon(points, 4); + painter->setBrush(brushBackup); + painter->setPen(penBackup); + break; + } + case esDiamond: + { + QVector2D widthVecPerp(-widthVec.y(), widthVec.x()); + QPointF points[4] = {(pos-widthVecPerp).toPointF(), + (pos-widthVec).toPointF(), + (pos+widthVecPerp).toPointF(), + (pos+widthVec).toPointF() + }; + painter->setPen(miterPen); + painter->setBrush(brush); + painter->drawConvexPolygon(points, 4); + painter->setBrush(brushBackup); + painter->setPen(penBackup); + break; + } + case esBar: + { + painter->drawLine((pos+widthVec).toPointF(), (pos-widthVec).toPointF()); + break; + } + case esHalfBar: + { + painter->drawLine((pos+widthVec).toPointF(), pos.toPointF()); + break; + } + case esSkewedBar: + { + if (qFuzzyIsNull(painter->pen().widthF()) && !painter->modes().testFlag(QCPPainter::pmNonCosmetic)) + { + // if drawing with cosmetic pen (perfectly thin stroke, happens only in vector exports), draw bar exactly on tip of line + painter->drawLine((pos+widthVec+lengthVec*0.2f*(mInverted?-1:1)).toPointF(), + (pos-widthVec-lengthVec*0.2f*(mInverted?-1:1)).toPointF()); + } else + { + // if drawing with thick (non-cosmetic) pen, shift bar a little in line direction to prevent line from sticking through bar slightly + painter->drawLine((pos+widthVec+lengthVec*0.2f*(mInverted?-1:1)+dir.normalized()*qMax(1.0f, (float)painter->pen().widthF())*0.5f).toPointF(), + (pos-widthVec-lengthVec*0.2f*(mInverted?-1:1)+dir.normalized()*qMax(1.0f, (float)painter->pen().widthF())*0.5f).toPointF()); + } + break; + } + } +} + +/*! \internal + \overload + + Draws the line ending. The direction is controlled with the \a angle parameter in radians. +*/ +void QCPLineEnding::draw(QCPPainter *painter, const QVector2D &pos, double angle) const +{ + draw(painter, pos, QVector2D(qCos(angle), qSin(angle))); +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPGrid +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPGrid + \brief Responsible for drawing the grid of a QCPAxis. + + This class is tightly bound to QCPAxis. Every axis owns a grid instance and uses it to draw the + grid lines, sub grid lines and zero-line. You can interact with the grid of an axis via \ref + QCPAxis::grid. Normally, you don't need to create an instance of QCPGrid yourself. + + The axis and grid drawing was split into two classes to allow them to be placed on different + layers (both QCPAxis and QCPGrid inherit from QCPLayerable). Thus it is possible to have the grid + in the background and the axes in the foreground, and any plottables/items in between. This + described situation is the default setup, see the QCPLayer documentation. +*/ + +/*! + Creates a QCPGrid instance and sets default values. + + You shouldn't instantiate grids on their own, since every QCPAxis brings its own QCPGrid. +*/ +QCPGrid::QCPGrid(QCPAxis *parentAxis) : + QCPLayerable(parentAxis->parentPlot(), QString(), parentAxis), + mParentAxis(parentAxis) +{ + // warning: this is called in QCPAxis constructor, so parentAxis members should not be accessed/called + setParent(parentAxis); + setPen(QPen(QColor(200,200,200), 0, Qt::DotLine)); + setSubGridPen(QPen(QColor(220,220,220), 0, Qt::DotLine)); + setZeroLinePen(QPen(QColor(200,200,200), 0, Qt::SolidLine)); + setSubGridVisible(false); + setAntialiased(false); + setAntialiasedSubGrid(false); + setAntialiasedZeroLine(false); +} + +/*! + Sets whether grid lines at sub tick marks are drawn. + + \see setSubGridPen +*/ +void QCPGrid::setSubGridVisible(bool visible) +{ + mSubGridVisible = visible; +} + +/*! + Sets whether sub grid lines are drawn antialiased. +*/ +void QCPGrid::setAntialiasedSubGrid(bool enabled) +{ + mAntialiasedSubGrid = enabled; +} + +/*! + Sets whether zero lines are drawn antialiased. +*/ +void QCPGrid::setAntialiasedZeroLine(bool enabled) +{ + mAntialiasedZeroLine = enabled; +} + +/*! + Sets the pen with which (major) grid lines are drawn. +*/ +void QCPGrid::setPen(const QPen &pen) +{ + mPen = pen; +} + +/*! + Sets the pen with which sub grid lines are drawn. +*/ +void QCPGrid::setSubGridPen(const QPen &pen) +{ + mSubGridPen = pen; +} + +/*! + Sets the pen with which zero lines are drawn. + + Zero lines are lines at value coordinate 0 which may be drawn with a different pen than other grid + lines. To disable zero lines and just draw normal grid lines at zero, set \a pen to Qt::NoPen. +*/ +void QCPGrid::setZeroLinePen(const QPen &pen) +{ + mZeroLinePen = pen; +} + +/*! \internal + + A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter + before drawing the major grid lines. + + This is the antialiasing state the painter passed to the \ref draw method is in by default. + + This function takes into account the local setting of the antialiasing flag as well as the + overrides set with \ref QCustomPlot::setAntialiasedElements and \ref + QCustomPlot::setNotAntialiasedElements. + + \see setAntialiased +*/ +void QCPGrid::applyDefaultAntialiasingHint(QCPPainter *painter) const +{ + applyAntialiasingHint(painter, mAntialiased, QCP::aeGrid); +} + +/*! \internal + + Draws grid lines and sub grid lines at the positions of (sub) ticks of the parent axis, spanning + over the complete axis rect. Also draws the zero line, if appropriate (\ref setZeroLinePen). +*/ +void QCPGrid::draw(QCPPainter *painter) +{ + if (!mParentAxis) { qDebug() << Q_FUNC_INFO << "invalid parent axis"; return; } + + if (mSubGridVisible) + drawSubGridLines(painter); + drawGridLines(painter); +} + +/*! \internal + + Draws the main grid lines and possibly a zero line with the specified painter. + + This is a helper function called by \ref draw. +*/ +void QCPGrid::drawGridLines(QCPPainter *painter) const +{ + if (!mParentAxis) { qDebug() << Q_FUNC_INFO << "invalid parent axis"; return; } + + int lowTick = mParentAxis->mLowestVisibleTick; + int highTick = mParentAxis->mHighestVisibleTick; + double t; // helper variable, result of coordinate-to-pixel transforms + if (mParentAxis->orientation() == Qt::Horizontal) + { + // draw zeroline: + int zeroLineIndex = -1; + if (mZeroLinePen.style() != Qt::NoPen && mParentAxis->mRange.lower < 0 && mParentAxis->mRange.upper > 0) + { + applyAntialiasingHint(painter, mAntialiasedZeroLine, QCP::aeZeroLine); + painter->setPen(mZeroLinePen); + double epsilon = mParentAxis->range().size()*1E-6; // for comparing double to zero + for (int i=lowTick; i <= highTick; ++i) + { + if (qAbs(mParentAxis->mTickVector.at(i)) < epsilon) + { + zeroLineIndex = i; + t = mParentAxis->coordToPixel(mParentAxis->mTickVector.at(i)); // x + painter->drawLine(QLineF(t, mParentAxis->mAxisRect->bottom(), t, mParentAxis->mAxisRect->top())); + break; + } + } + } + // draw grid lines: + applyDefaultAntialiasingHint(painter); + painter->setPen(mPen); + for (int i=lowTick; i <= highTick; ++i) + { + if (i == zeroLineIndex) continue; // don't draw a gridline on top of the zeroline + t = mParentAxis->coordToPixel(mParentAxis->mTickVector.at(i)); // x + painter->drawLine(QLineF(t, mParentAxis->mAxisRect->bottom(), t, mParentAxis->mAxisRect->top())); + } + } else + { + // draw zeroline: + int zeroLineIndex = -1; + if (mZeroLinePen.style() != Qt::NoPen && mParentAxis->mRange.lower < 0 && mParentAxis->mRange.upper > 0) + { + applyAntialiasingHint(painter, mAntialiasedZeroLine, QCP::aeZeroLine); + painter->setPen(mZeroLinePen); + double epsilon = mParentAxis->mRange.size()*1E-6; // for comparing double to zero + for (int i=lowTick; i <= highTick; ++i) + { + if (qAbs(mParentAxis->mTickVector.at(i)) < epsilon) + { + zeroLineIndex = i; + t = mParentAxis->coordToPixel(mParentAxis->mTickVector.at(i)); // y + painter->drawLine(QLineF(mParentAxis->mAxisRect->left(), t, mParentAxis->mAxisRect->right(), t)); + break; + } + } + } + // draw grid lines: + applyDefaultAntialiasingHint(painter); + painter->setPen(mPen); + for (int i=lowTick; i <= highTick; ++i) + { + if (i == zeroLineIndex) continue; // don't draw a gridline on top of the zeroline + t = mParentAxis->coordToPixel(mParentAxis->mTickVector.at(i)); // y + painter->drawLine(QLineF(mParentAxis->mAxisRect->left(), t, mParentAxis->mAxisRect->right(), t)); + } + } +} + +/*! \internal + + Draws the sub grid lines with the specified painter. + + This is a helper function called by \ref draw. +*/ +void QCPGrid::drawSubGridLines(QCPPainter *painter) const +{ + if (!mParentAxis) { qDebug() << Q_FUNC_INFO << "invalid parent axis"; return; } + + applyAntialiasingHint(painter, mAntialiasedSubGrid, QCP::aeSubGrid); + double t; // helper variable, result of coordinate-to-pixel transforms + painter->setPen(mSubGridPen); + if (mParentAxis->orientation() == Qt::Horizontal) + { + for (int i=0; imSubTickVector.size(); ++i) + { + t = mParentAxis->coordToPixel(mParentAxis->mSubTickVector.at(i)); // x + painter->drawLine(QLineF(t, mParentAxis->mAxisRect->bottom(), t, mParentAxis->mAxisRect->top())); + } + } else + { + for (int i=0; imSubTickVector.size(); ++i) + { + t = mParentAxis->coordToPixel(mParentAxis->mSubTickVector.at(i)); // y + painter->drawLine(QLineF(mParentAxis->mAxisRect->left(), t, mParentAxis->mAxisRect->right(), t)); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPAxis +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPAxis + \brief Manages a single axis inside a QCustomPlot. + + Usually doesn't need to be instantiated externally. Access %QCustomPlot's default four axes via + QCustomPlot::xAxis (bottom), QCustomPlot::yAxis (left), QCustomPlot::xAxis2 (top) and + QCustomPlot::yAxis2 (right). + + Axes are always part of an axis rect, see QCPAxisRect. + \image html AxisNamesOverview.png +
Naming convention of axis parts
+ \n + + \image html AxisRectSpacingOverview.png +
Overview of the spacings and paddings that define the geometry of an axis. The dashed gray line + on the left represents the QCustomPlot widget border.
+ +*/ + +/* start of documentation of inline functions */ + +/*! \fn Qt::Orientation QCPAxis::orientation() const + + Returns the orientation of this axis. The axis orientation (horizontal or vertical) is deduced + from the axis type (left, top, right or bottom). + + \see orientation(AxisType type) +*/ + +/*! \fn QCPGrid *QCPAxis::grid() const + + Returns the \ref QCPGrid instance belonging to this axis. Access it to set details about the way the + grid is displayed. +*/ + +/*! \fn static Qt::Orientation QCPAxis::orientation(AxisType type) + + Returns the orientation of the specified axis type + + \see orientation() +*/ + +/* end of documentation of inline functions */ +/* start of documentation of signals */ + +/*! \fn void QCPAxis::ticksRequest() + + This signal is emitted when \ref setAutoTicks is false and the axis is about to generate tick + labels for a replot. + + Modifying the tick positions can be done with \ref setTickVector. If you also want to control the + tick labels, set \ref setAutoTickLabels to false and also provide the labels with \ref + setTickVectorLabels. + + If you only want static ticks you probably don't need this signal, since you can just set the + tick vector (and possibly tick label vector) once. However, if you want to provide ticks (and + maybe labels) dynamically, e.g. depending on the current axis range, connect a slot to this + signal and set the vector/vectors there. +*/ + +/*! \fn void QCPAxis::rangeChanged(const QCPRange &newRange) + + This signal is emitted when the range of this axis has changed. You can connect it to the \ref + setRange slot of another axis to communicate the new range to the other axis, in order for it to + be synchronized. + + You may also manipulate/correct the range with \ref setRange in a slot connected to this signal. + This is useful if for example a maximum range span shall not be exceeded, or if the lower/upper + range shouldn't go beyond certain values. For example, the following slot would limit the x axis + to only positive ranges: + \code + if (newRange.lower < 0) + plot->xAxis->setRange(0, newRange.size()); + \endcode +*/ + +/*! \fn void QCPAxis::rangeChanged(const QCPRange &newRange, const QCPRange &oldRange) + \overload + + Additionally to the new range, this signal also provides the previous range held by the axis as + \a oldRange. +*/ + +/*! \fn void QCPAxis::scaleTypeChanged(QCPAxis::ScaleType scaleType); + + This signal is emitted when the scale type changes, by calls to \ref setScaleType +*/ + +/*! \fn void QCPAxis::selectionChanged(QCPAxis::SelectableParts selection) + + This signal is emitted when the selection state of this axis has changed, either by user interaction + or by a direct call to \ref setSelectedParts. +*/ + +/*! \fn void QCPAxis::selectableChanged(const QCPAxis::SelectableParts &parts); + + This signal is emitted when the selectability changes, by calls to \ref setSelectableParts +*/ + +/* end of documentation of signals */ + +/*! + Constructs an Axis instance of Type \a type for the axis rect \a parent. + + Usually it isn't necessary to instantiate axes directly, because you can let QCustomPlot create + them for you with \ref QCPAxisRect::addAxis. If you want to use own QCPAxis-subclasses however, + create them manually and then inject them also via \ref QCPAxisRect::addAxis. +*/ +QCPAxis::QCPAxis(QCPAxisRect *parent, AxisType type) : + QCPLayerable(parent->parentPlot(), QString(), parent), + // axis base: + mAxisType(type), + mAxisRect(parent), + mPadding(5), + mOrientation(orientation(type)), + mSelectableParts(spAxis | spTickLabels | spAxisLabel), + mSelectedParts(spNone), + mBasePen(QPen(Qt::black, 0, Qt::SolidLine, Qt::SquareCap)), + mSelectedBasePen(QPen(Qt::blue, 2)), + // axis label: + mLabel(), + mLabelFont(mParentPlot->font()), + mSelectedLabelFont(QFont(mLabelFont.family(), mLabelFont.pointSize(), QFont::Bold)), + mLabelColor(Qt::black), + mSelectedLabelColor(Qt::blue), + // tick labels: + mTickLabels(true), + mAutoTickLabels(true), + mTickLabelType(ltNumber), + mTickLabelFont(mParentPlot->font()), + mSelectedTickLabelFont(QFont(mTickLabelFont.family(), mTickLabelFont.pointSize(), QFont::Bold)), + mTickLabelColor(Qt::black), + mSelectedTickLabelColor(Qt::blue), + mDateTimeFormat(QLatin1String("hh:mm:ss\ndd.MM.yy")), + mDateTimeSpec(Qt::LocalTime), + mNumberPrecision(6), + mNumberFormatChar('g'), + mNumberBeautifulPowers(true), + // ticks and subticks: + mTicks(true), + mTickStep(1), + mSubTickCount(4), + mAutoTickCount(6), + mAutoTicks(true), + mAutoTickStep(true), + mAutoSubTicks(true), + mTickPen(QPen(Qt::black, 0, Qt::SolidLine, Qt::SquareCap)), + mSelectedTickPen(QPen(Qt::blue, 2)), + mSubTickPen(QPen(Qt::black, 0, Qt::SolidLine, Qt::SquareCap)), + mSelectedSubTickPen(QPen(Qt::blue, 2)), + // scale and range: + mRange(0, 5), + mRangeReversed(false), + mScaleType(stLinear), + mScaleLogBase(10), + mScaleLogBaseLogInv(1.0/qLn(mScaleLogBase)), + // internal members: + mGrid(new QCPGrid(this)), + mAxisPainter(new QCPAxisPainterPrivate(parent->parentPlot())), + mLowestVisibleTick(0), + mHighestVisibleTick(-1), + mCachedMarginValid(false), + mCachedMargin(0) +{ + setParent(parent); + mGrid->setVisible(false); + setAntialiased(false); + setLayer(mParentPlot->currentLayer()); // it's actually on that layer already, but we want it in front of the grid, so we place it on there again + + if (type == atTop) + { + setTickLabelPadding(3); + setLabelPadding(6); + } else if (type == atRight) + { + setTickLabelPadding(7); + setLabelPadding(12); + } else if (type == atBottom) + { + setTickLabelPadding(3); + setLabelPadding(3); + } else if (type == atLeft) + { + setTickLabelPadding(5); + setLabelPadding(10); + } +} + +QCPAxis::~QCPAxis() +{ + delete mAxisPainter; + delete mGrid; // delete grid here instead of via parent ~QObject for better defined deletion order +} + +/* No documentation as it is a property getter */ +int QCPAxis::tickLabelPadding() const +{ + return mAxisPainter->tickLabelPadding; +} + +/* No documentation as it is a property getter */ +double QCPAxis::tickLabelRotation() const +{ + return mAxisPainter->tickLabelRotation; +} + +/* No documentation as it is a property getter */ +QCPAxis::LabelSide QCPAxis::tickLabelSide() const +{ + return mAxisPainter->tickLabelSide; +} + +/* No documentation as it is a property getter */ +QString QCPAxis::numberFormat() const +{ + QString result; + result.append(mNumberFormatChar); + if (mNumberBeautifulPowers) + { + result.append(QLatin1Char('b')); + if (mAxisPainter->numberMultiplyCross) + result.append(QLatin1Char('c')); + } + return result; +} + +/* No documentation as it is a property getter */ +int QCPAxis::tickLengthIn() const +{ + return mAxisPainter->tickLengthIn; +} + +/* No documentation as it is a property getter */ +int QCPAxis::tickLengthOut() const +{ + return mAxisPainter->tickLengthOut; +} + +/* No documentation as it is a property getter */ +int QCPAxis::subTickLengthIn() const +{ + return mAxisPainter->subTickLengthIn; +} + +/* No documentation as it is a property getter */ +int QCPAxis::subTickLengthOut() const +{ + return mAxisPainter->subTickLengthOut; +} + +/* No documentation as it is a property getter */ +int QCPAxis::labelPadding() const +{ + return mAxisPainter->labelPadding; +} + +/* No documentation as it is a property getter */ +int QCPAxis::offset() const +{ + return mAxisPainter->offset; +} + +/* No documentation as it is a property getter */ +QCPLineEnding QCPAxis::lowerEnding() const +{ + return mAxisPainter->lowerEnding; +} + +/* No documentation as it is a property getter */ +QCPLineEnding QCPAxis::upperEnding() const +{ + return mAxisPainter->upperEnding; +} + +/*! + Sets whether the axis uses a linear scale or a logarithmic scale. If \a type is set to \ref + stLogarithmic, the logarithm base can be set with \ref setScaleLogBase. In logarithmic axis + scaling, major tick marks appear at all powers of the logarithm base. Properties like tick step + (\ref setTickStep) don't apply in logarithmic scaling. If you wish a decimal base but less major + ticks, consider choosing a logarithm base of 100, 1000 or even higher. + + If \a type is \ref stLogarithmic and the number format (\ref setNumberFormat) uses the 'b' option + (beautifully typeset decimal powers), the display usually is "1 [multiplication sign] 10 + [superscript] n", which looks unnatural for logarithmic scaling (the "1 [multiplication sign]" + part). To only display the decimal power, set the number precision to zero with + \ref setNumberPrecision. +*/ +void QCPAxis::setScaleType(QCPAxis::ScaleType type) +{ + if (mScaleType != type) + { + mScaleType = type; + if (mScaleType == stLogarithmic) + setRange(mRange.sanitizedForLogScale()); + mCachedMarginValid = false; + emit scaleTypeChanged(mScaleType); + } +} + +/*! + If \ref setScaleType is set to \ref stLogarithmic, \a base will be the logarithm base of the + scaling. In logarithmic axis scaling, major tick marks appear at all powers of \a base. + + Properties like tick step (\ref setTickStep) don't apply in logarithmic scaling. If you wish a decimal base but + less major ticks, consider choosing \a base 100, 1000 or even higher. +*/ +void QCPAxis::setScaleLogBase(double base) +{ + if (base > 1) + { + mScaleLogBase = base; + mScaleLogBaseLogInv = 1.0/qLn(mScaleLogBase); // buffer for faster baseLog() calculation + mCachedMarginValid = false; + } else + qDebug() << Q_FUNC_INFO << "Invalid logarithmic scale base (must be greater 1):" << base; +} + +/*! + Sets the range of the axis. + + This slot may be connected with the \ref rangeChanged signal of another axis so this axis + is always synchronized with the other axis range, when it changes. + + To invert the direction of an axis, use \ref setRangeReversed. +*/ +void QCPAxis::setRange(const QCPRange &range) +{ + if (range.lower == mRange.lower && range.upper == mRange.upper) + return; + + if (!QCPRange::validRange(range)) return; + QCPRange oldRange = mRange; + if (mScaleType == stLogarithmic) + { + mRange = range.sanitizedForLogScale(); + } else + { + mRange = range.sanitizedForLinScale(); + } + mCachedMarginValid = false; + emit rangeChanged(mRange); + emit rangeChanged(mRange, oldRange); +} + +/*! + Sets whether the user can (de-)select the parts in \a selectable by clicking on the QCustomPlot surface. + (When \ref QCustomPlot::setInteractions contains iSelectAxes.) + + However, even when \a selectable is set to a value not allowing the selection of a specific part, + it is still possible to set the selection of this part manually, by calling \ref setSelectedParts + directly. + + \see SelectablePart, setSelectedParts +*/ +void QCPAxis::setSelectableParts(const SelectableParts &selectable) +{ + if (mSelectableParts != selectable) + { + mSelectableParts = selectable; + emit selectableChanged(mSelectableParts); + } +} + +/*! + Sets the selected state of the respective axis parts described by \ref SelectablePart. When a part + is selected, it uses a different pen/font. + + The entire selection mechanism for axes is handled automatically when \ref + QCustomPlot::setInteractions contains iSelectAxes. You only need to call this function when you + wish to change the selection state manually. + + This function can change the selection state of a part, independent of the \ref setSelectableParts setting. + + emits the \ref selectionChanged signal when \a selected is different from the previous selection state. + + \see SelectablePart, setSelectableParts, selectTest, setSelectedBasePen, setSelectedTickPen, setSelectedSubTickPen, + setSelectedTickLabelFont, setSelectedLabelFont, setSelectedTickLabelColor, setSelectedLabelColor +*/ +void QCPAxis::setSelectedParts(const SelectableParts &selected) +{ + if (mSelectedParts != selected) + { + mSelectedParts = selected; + emit selectionChanged(mSelectedParts); + } +} + +/*! + \overload + + Sets the lower and upper bound of the axis range. + + To invert the direction of an axis, use \ref setRangeReversed. + + There is also a slot to set a range, see \ref setRange(const QCPRange &range). +*/ +void QCPAxis::setRange(double lower, double upper) +{ + if (lower == mRange.lower && upper == mRange.upper) + return; + + if (!QCPRange::validRange(lower, upper)) return; + QCPRange oldRange = mRange; + mRange.lower = lower; + mRange.upper = upper; + if (mScaleType == stLogarithmic) + { + mRange = mRange.sanitizedForLogScale(); + } else + { + mRange = mRange.sanitizedForLinScale(); + } + mCachedMarginValid = false; + emit rangeChanged(mRange); + emit rangeChanged(mRange, oldRange); +} + +/*! + \overload + + Sets the range of the axis. + + The \a position coordinate indicates together with the \a alignment parameter, where the new + range will be positioned. \a size defines the size of the new axis range. \a alignment may be + Qt::AlignLeft, Qt::AlignRight or Qt::AlignCenter. This will cause the left border, right border, + or center of the range to be aligned with \a position. Any other values of \a alignment will + default to Qt::AlignCenter. +*/ +void QCPAxis::setRange(double position, double size, Qt::AlignmentFlag alignment) +{ + if (alignment == Qt::AlignLeft) + setRange(position, position+size); + else if (alignment == Qt::AlignRight) + setRange(position-size, position); + else // alignment == Qt::AlignCenter + setRange(position-size/2.0, position+size/2.0); +} + +/*! + Sets the lower bound of the axis range. The upper bound is not changed. + \see setRange +*/ +void QCPAxis::setRangeLower(double lower) +{ + if (mRange.lower == lower) + return; + + QCPRange oldRange = mRange; + mRange.lower = lower; + if (mScaleType == stLogarithmic) + { + mRange = mRange.sanitizedForLogScale(); + } else + { + mRange = mRange.sanitizedForLinScale(); + } + mCachedMarginValid = false; + emit rangeChanged(mRange); + emit rangeChanged(mRange, oldRange); +} + +/*! + Sets the upper bound of the axis range. The lower bound is not changed. + \see setRange +*/ +void QCPAxis::setRangeUpper(double upper) +{ + if (mRange.upper == upper) + return; + + QCPRange oldRange = mRange; + mRange.upper = upper; + if (mScaleType == stLogarithmic) + { + mRange = mRange.sanitizedForLogScale(); + } else + { + mRange = mRange.sanitizedForLinScale(); + } + mCachedMarginValid = false; + emit rangeChanged(mRange); + emit rangeChanged(mRange, oldRange); +} + +/*! + Sets whether the axis range (direction) is displayed reversed. Normally, the values on horizontal + axes increase left to right, on vertical axes bottom to top. When \a reversed is set to true, the + direction of increasing values is inverted. + + Note that the range and data interface stays the same for reversed axes, e.g. the \a lower part + of the \ref setRange interface will still reference the mathematically smaller number than the \a + upper part. +*/ +void QCPAxis::setRangeReversed(bool reversed) +{ + if (mRangeReversed != reversed) + { + mRangeReversed = reversed; + mCachedMarginValid = false; + } +} + +/*! + Sets whether the tick positions should be calculated automatically (either from an automatically + generated tick step or a tick step provided manually via \ref setTickStep, see \ref setAutoTickStep). + + If \a on is set to false, you must provide the tick positions manually via \ref setTickVector. + For these manual ticks you may let QCPAxis generate the appropriate labels automatically by + leaving \ref setAutoTickLabels set to true. If you also wish to control the displayed labels + manually, set \ref setAutoTickLabels to false and provide the label strings with \ref + setTickVectorLabels. + + If you need dynamically calculated tick vectors (and possibly tick label vectors), set the + vectors in a slot connected to the \ref ticksRequest signal. + + \see setAutoTickLabels, setAutoSubTicks, setAutoTickCount, setAutoTickStep +*/ +void QCPAxis::setAutoTicks(bool on) +{ + if (mAutoTicks != on) + { + mAutoTicks = on; + mCachedMarginValid = false; + } +} + +/*! + When \ref setAutoTickStep is true, \a approximateCount determines how many ticks should be + generated in the visible range, approximately. + + It's not guaranteed that this number of ticks is met exactly, but approximately within a + tolerance of about two. + + Only values greater than zero are accepted as \a approximateCount. + + \see setAutoTickStep, setAutoTicks, setAutoSubTicks +*/ +void QCPAxis::setAutoTickCount(int approximateCount) +{ + if (mAutoTickCount != approximateCount) + { + if (approximateCount > 0) + { + mAutoTickCount = approximateCount; + mCachedMarginValid = false; + } else + qDebug() << Q_FUNC_INFO << "approximateCount must be greater than zero:" << approximateCount; + } +} + +/*! + Sets whether the tick labels are generated automatically. Depending on the tick label type (\ref + ltNumber or \ref ltDateTime), the labels will either show the coordinate as floating point + number (\ref setNumberFormat), or a date/time formatted according to \ref setDateTimeFormat. + + If \a on is set to false, you should provide the tick labels via \ref setTickVectorLabels. This + is usually used in a combination with \ref setAutoTicks set to false for complete control over + tick positions and labels, e.g. when the ticks should be at multiples of pi and show "2pi", "3pi" + etc. as tick labels. + + If you need dynamically calculated tick vectors (and possibly tick label vectors), set the + vectors in a slot connected to the \ref ticksRequest signal. + + \see setAutoTicks +*/ +void QCPAxis::setAutoTickLabels(bool on) +{ + if (mAutoTickLabels != on) + { + mAutoTickLabels = on; + mCachedMarginValid = false; + } +} + +/*! + Sets whether the tick step, i.e. the interval between two (major) ticks, is calculated + automatically. If \a on is set to true, the axis finds a tick step that is reasonable for human + readable plots. + + The number of ticks the algorithm aims for within the visible range can be specified with \ref + setAutoTickCount. + + If \a on is set to false, you may set the tick step manually with \ref setTickStep. + + \see setAutoTicks, setAutoSubTicks, setAutoTickCount +*/ +void QCPAxis::setAutoTickStep(bool on) +{ + if (mAutoTickStep != on) + { + mAutoTickStep = on; + mCachedMarginValid = false; + } +} + +/*! + Sets whether the number of sub ticks in one tick interval is determined automatically. This + works, as long as the tick step mantissa is a multiple of 0.5. When \ref setAutoTickStep is + enabled, this is always the case. + + When \a on is set to false, you may set the sub tick count with \ref setSubTickCount manually. + + \see setAutoTickCount, setAutoTicks, setAutoTickStep +*/ +void QCPAxis::setAutoSubTicks(bool on) +{ + if (mAutoSubTicks != on) + { + mAutoSubTicks = on; + mCachedMarginValid = false; + } +} + +/*! + Sets whether tick marks are displayed. + + Note that setting \a show to false does not imply that tick labels are invisible, too. To achieve + that, see \ref setTickLabels. +*/ +void QCPAxis::setTicks(bool show) +{ + if (mTicks != show) + { + mTicks = show; + mCachedMarginValid = false; + } +} + +/*! + Sets whether tick labels are displayed. Tick labels are the numbers drawn next to tick marks. +*/ +void QCPAxis::setTickLabels(bool show) +{ + if (mTickLabels != show) + { + mTickLabels = show; + mCachedMarginValid = false; + } +} + +/*! + Sets the distance between the axis base line (including any outward ticks) and the tick labels. + \see setLabelPadding, setPadding +*/ +void QCPAxis::setTickLabelPadding(int padding) +{ + if (mAxisPainter->tickLabelPadding != padding) + { + mAxisPainter->tickLabelPadding = padding; + mCachedMarginValid = false; + } +} + +/*! + Sets whether the tick labels display numbers or dates/times. + + If \a type is set to \ref ltNumber, the format specifications of \ref setNumberFormat apply. + + If \a type is set to \ref ltDateTime, the format specifications of \ref setDateTimeFormat apply. + + In QCustomPlot, date/time coordinates are double numbers representing the seconds since + 1970-01-01T00:00:00 UTC. This format can be retrieved from QDateTime objects with the + QDateTime::toTime_t() function. Since this only gives a resolution of one second, there is also + the QDateTime::toMSecsSinceEpoch() function which returns the timespan described above in + milliseconds. Divide its return value by 1000.0 to get a value with the format needed for + date/time plotting, with a resolution of one millisecond. + + Using the toMSecsSinceEpoch function allows dates that go back to 2nd January 4713 B.C. + (represented by a negative number), unlike the toTime_t function, which works with unsigned + integers and thus only goes back to 1st January 1970. So both for range and accuracy, use of + toMSecsSinceEpoch()/1000.0 should be preferred as key coordinate for date/time axes. + + \see setTickLabels +*/ +void QCPAxis::setTickLabelType(LabelType type) +{ + if (mTickLabelType != type) + { + mTickLabelType = type; + mCachedMarginValid = false; + } +} + +/*! + Sets the font of the tick labels. + + \see setTickLabels, setTickLabelColor +*/ +void QCPAxis::setTickLabelFont(const QFont &font) +{ + if (font != mTickLabelFont) + { + mTickLabelFont = font; + mCachedMarginValid = false; + } +} + +/*! + Sets the color of the tick labels. + + \see setTickLabels, setTickLabelFont +*/ +void QCPAxis::setTickLabelColor(const QColor &color) +{ + if (color != mTickLabelColor) + { + mTickLabelColor = color; + mCachedMarginValid = false; + } +} + +/*! + Sets the rotation of the tick labels. If \a degrees is zero, the labels are drawn normally. Else, + the tick labels are drawn rotated by \a degrees clockwise. The specified angle is bound to values + from -90 to 90 degrees. + + If \a degrees is exactly -90, 0 or 90, the tick labels are centered on the tick coordinate. For + other angles, the label is drawn with an offset such that it seems to point toward or away from + the tick mark. +*/ +void QCPAxis::setTickLabelRotation(double degrees) +{ + if (!qFuzzyIsNull(degrees-mAxisPainter->tickLabelRotation)) + { + mAxisPainter->tickLabelRotation = qBound(-90.0, degrees, 90.0); + mCachedMarginValid = false; + } +} + +/*! + Sets whether the tick labels (numbers) shall appear inside or outside the axis rect. + + The usual and default setting is \ref lsOutside. Very compact plots sometimes require tick labels + to be inside the axis rect, to save space. If \a side is set to \ref lsInside, the tick labels + appear on the inside are additionally clipped to the axis rect. +*/ +void QCPAxis::setTickLabelSide(LabelSide side) +{ + mAxisPainter->tickLabelSide = side; + mCachedMarginValid = false; +} + +/*! + Sets the format in which dates and times are displayed as tick labels, if \ref setTickLabelType is \ref ltDateTime. + for details about the \a format string, see the documentation of QDateTime::toString(). + + Newlines can be inserted with "\n". + + \see setDateTimeSpec +*/ +void QCPAxis::setDateTimeFormat(const QString &format) +{ + if (mDateTimeFormat != format) + { + mDateTimeFormat = format; + mCachedMarginValid = false; + } +} + +/*! + Sets the time spec that is used for the date time values when \ref setTickLabelType is \ref + ltDateTime. + + The default value of QDateTime objects (and also QCustomPlot) is Qt::LocalTime. However, + if the date time values passed to QCustomPlot are given in the UTC spec, set \a + timeSpec to Qt::UTC to get the correct axis labels. + + \see setDateTimeFormat +*/ +void QCPAxis::setDateTimeSpec(const Qt::TimeSpec &timeSpec) +{ + mDateTimeSpec = timeSpec; +} + +/*! + Sets the number format for the numbers drawn as tick labels (if tick label type is \ref + ltNumber). This \a formatCode is an extended version of the format code used e.g. by + QString::number() and QLocale::toString(). For reference about that, see the "Argument Formats" + section in the detailed description of the QString class. \a formatCode is a string of one, two + or three characters. The first character is identical to the normal format code used by Qt. In + short, this means: 'e'/'E' scientific format, 'f' fixed format, 'g'/'G' scientific or fixed, + whichever is shorter. + + The second and third characters are optional and specific to QCustomPlot:\n + If the first char was 'e' or 'g', numbers are/might be displayed in the scientific format, e.g. + "5.5e9", which is ugly in a plot. So when the second char of \a formatCode is set to 'b' (for + "beautiful"), those exponential numbers are formatted in a more natural way, i.e. "5.5 + [multiplication sign] 10 [superscript] 9". By default, the multiplication sign is a centered dot. + If instead a cross should be shown (as is usual in the USA), the third char of \a formatCode can + be set to 'c'. The inserted multiplication signs are the UTF-8 characters 215 (0xD7) for the + cross and 183 (0xB7) for the dot. + + If the scale type (\ref setScaleType) is \ref stLogarithmic and the \a formatCode uses the 'b' + option (beautifully typeset decimal powers), the display usually is "1 [multiplication sign] 10 + [superscript] n", which looks unnatural for logarithmic scaling (the "1 [multiplication sign]" + part). To only display the decimal power, set the number precision to zero with \ref + setNumberPrecision. + + Examples for \a formatCode: + \li \c g normal format code behaviour. If number is small, fixed format is used, if number is large, + normal scientific format is used + \li \c gb If number is small, fixed format is used, if number is large, scientific format is used with + beautifully typeset decimal powers and a dot as multiplication sign + \li \c ebc All numbers are in scientific format with beautifully typeset decimal power and a cross as + multiplication sign + \li \c fb illegal format code, since fixed format doesn't support (or need) beautifully typeset decimal + powers. Format code will be reduced to 'f'. + \li \c hello illegal format code, since first char is not 'e', 'E', 'f', 'g' or 'G'. Current format + code will not be changed. +*/ +void QCPAxis::setNumberFormat(const QString &formatCode) +{ + if (formatCode.isEmpty()) + { + qDebug() << Q_FUNC_INFO << "Passed formatCode is empty"; + return; + } + mCachedMarginValid = false; + + // interpret first char as number format char: + QString allowedFormatChars(QLatin1String("eEfgG")); + if (allowedFormatChars.contains(formatCode.at(0))) + { + mNumberFormatChar = QLatin1Char(formatCode.at(0).toLatin1()); + } else + { + qDebug() << Q_FUNC_INFO << "Invalid number format code (first char not in 'eEfgG'):" << formatCode; + return; + } + if (formatCode.length() < 2) + { + mNumberBeautifulPowers = false; + mAxisPainter->numberMultiplyCross = false; + return; + } + + // interpret second char as indicator for beautiful decimal powers: + if (formatCode.at(1) == QLatin1Char('b') && (mNumberFormatChar == QLatin1Char('e') || mNumberFormatChar == QLatin1Char('g'))) + { + mNumberBeautifulPowers = true; + } else + { + qDebug() << Q_FUNC_INFO << "Invalid number format code (second char not 'b' or first char neither 'e' nor 'g'):" << formatCode; + return; + } + if (formatCode.length() < 3) + { + mAxisPainter->numberMultiplyCross = false; + return; + } + + // interpret third char as indicator for dot or cross multiplication symbol: + if (formatCode.at(2) == QLatin1Char('c')) + { + mAxisPainter->numberMultiplyCross = true; + } else if (formatCode.at(2) == QLatin1Char('d')) + { + mAxisPainter->numberMultiplyCross = false; + } else + { + qDebug() << Q_FUNC_INFO << "Invalid number format code (third char neither 'c' nor 'd'):" << formatCode; + return; + } +} + +/*! + Sets the precision of the tick label numbers. See QLocale::toString(double i, char f, int prec) + for details. The effect of precisions are most notably for number Formats starting with 'e', see + \ref setNumberFormat + + If the scale type (\ref setScaleType) is \ref stLogarithmic and the number format (\ref + setNumberFormat) uses the 'b' format code (beautifully typeset decimal powers), the display + usually is "1 [multiplication sign] 10 [superscript] n", which looks unnatural for logarithmic + scaling (the redundant "1 [multiplication sign]" part). To only display the decimal power "10 + [superscript] n", set \a precision to zero. +*/ +void QCPAxis::setNumberPrecision(int precision) +{ + if (mNumberPrecision != precision) + { + mNumberPrecision = precision; + mCachedMarginValid = false; + } +} + +/*! + If \ref setAutoTickStep is set to false, use this function to set the tick step manually. + The tick step is the interval between (major) ticks, in plot coordinates. + \see setSubTickCount +*/ +void QCPAxis::setTickStep(double step) +{ + if (mTickStep != step) + { + mTickStep = step; + mCachedMarginValid = false; + } +} + +/*! + If you want full control over what ticks (and possibly labels) the axes show, this function is + used to set the coordinates at which ticks will appear.\ref setAutoTicks must be disabled, else + the provided tick vector will be overwritten with automatically generated tick coordinates upon + replot. The labels of the ticks can be generated automatically when \ref setAutoTickLabels is + left enabled. If it is disabled, you can set the labels manually with \ref setTickVectorLabels. + + \a vec is a vector containing the positions of the ticks, in plot coordinates. + + \warning \a vec must be sorted in ascending order, no additional checks are made to ensure this. + + \see setTickVectorLabels +*/ +void QCPAxis::setTickVector(const QVector &vec) +{ + // don't check whether mTickVector != vec here, because it takes longer than we would save + mTickVector = vec; + mCachedMarginValid = false; +} + +/*! + If you want full control over what ticks and labels the axes show, this function is used to set a + number of QStrings that will be displayed at the tick positions which you need to provide with + \ref setTickVector. These two vectors should have the same size. (Note that you need to disable + \ref setAutoTicks and \ref setAutoTickLabels first.) + + \a vec is a vector containing the labels of the ticks. The entries correspond to the respective + indices in the tick vector, passed via \ref setTickVector. + + \see setTickVector +*/ +void QCPAxis::setTickVectorLabels(const QVector &vec) +{ + // don't check whether mTickVectorLabels != vec here, because it takes longer than we would save + mTickVectorLabels = vec; + mCachedMarginValid = false; +} + +/*! + Sets the length of the ticks in pixels. \a inside is the length the ticks will reach inside the + plot and \a outside is the length they will reach outside the plot. If \a outside is greater than + zero, the tick labels and axis label will increase their distance to the axis accordingly, so + they won't collide with the ticks. + + \see setSubTickLength, setTickLengthIn, setTickLengthOut +*/ +void QCPAxis::setTickLength(int inside, int outside) +{ + setTickLengthIn(inside); + setTickLengthOut(outside); +} + +/*! + Sets the length of the inward ticks in pixels. \a inside is the length the ticks will reach + inside the plot. + + \see setTickLengthOut, setTickLength, setSubTickLength +*/ +void QCPAxis::setTickLengthIn(int inside) +{ + if (mAxisPainter->tickLengthIn != inside) + { + mAxisPainter->tickLengthIn = inside; + } +} + +/*! + Sets the length of the outward ticks in pixels. \a outside is the length the ticks will reach + outside the plot. If \a outside is greater than zero, the tick labels and axis label will + increase their distance to the axis accordingly, so they won't collide with the ticks. + + \see setTickLengthIn, setTickLength, setSubTickLength +*/ +void QCPAxis::setTickLengthOut(int outside) +{ + if (mAxisPainter->tickLengthOut != outside) + { + mAxisPainter->tickLengthOut = outside; + mCachedMarginValid = false; // only outside tick length can change margin + } +} + +/*! + Sets the number of sub ticks in one (major) tick step. A sub tick count of three for example, + divides the tick intervals in four sub intervals. + + By default, the number of sub ticks is chosen automatically in a reasonable manner as long as the + mantissa of the tick step is a multiple of 0.5. When \ref setAutoTickStep is enabled, this is + always the case. + + If you want to disable automatic sub tick count and use this function to set the count manually, + see \ref setAutoSubTicks. +*/ +void QCPAxis::setSubTickCount(int count) +{ + mSubTickCount = count; +} + +/*! + Sets the length of the subticks in pixels. \a inside is the length the subticks will reach inside + the plot and \a outside is the length they will reach outside the plot. If \a outside is greater + than zero, the tick labels and axis label will increase their distance to the axis accordingly, + so they won't collide with the ticks. + + \see setTickLength, setSubTickLengthIn, setSubTickLengthOut +*/ +void QCPAxis::setSubTickLength(int inside, int outside) +{ + setSubTickLengthIn(inside); + setSubTickLengthOut(outside); +} + +/*! + Sets the length of the inward subticks in pixels. \a inside is the length the subticks will reach inside + the plot. + + \see setSubTickLengthOut, setSubTickLength, setTickLength +*/ +void QCPAxis::setSubTickLengthIn(int inside) +{ + if (mAxisPainter->subTickLengthIn != inside) + { + mAxisPainter->subTickLengthIn = inside; + } +} + +/*! + Sets the length of the outward subticks in pixels. \a outside is the length the subticks will reach + outside the plot. If \a outside is greater than zero, the tick labels will increase their + distance to the axis accordingly, so they won't collide with the ticks. + + \see setSubTickLengthIn, setSubTickLength, setTickLength +*/ +void QCPAxis::setSubTickLengthOut(int outside) +{ + if (mAxisPainter->subTickLengthOut != outside) + { + mAxisPainter->subTickLengthOut = outside; + mCachedMarginValid = false; // only outside tick length can change margin + } +} + +/*! + Sets the pen, the axis base line is drawn with. + + \see setTickPen, setSubTickPen +*/ +void QCPAxis::setBasePen(const QPen &pen) +{ + mBasePen = pen; +} + +/*! + Sets the pen, tick marks will be drawn with. + + \see setTickLength, setBasePen +*/ +void QCPAxis::setTickPen(const QPen &pen) +{ + mTickPen = pen; +} + +/*! + Sets the pen, subtick marks will be drawn with. + + \see setSubTickCount, setSubTickLength, setBasePen +*/ +void QCPAxis::setSubTickPen(const QPen &pen) +{ + mSubTickPen = pen; +} + +/*! + Sets the font of the axis label. + + \see setLabelColor +*/ +void QCPAxis::setLabelFont(const QFont &font) +{ + if (mLabelFont != font) + { + mLabelFont = font; + mCachedMarginValid = false; + } +} + +/*! + Sets the color of the axis label. + + \see setLabelFont +*/ +void QCPAxis::setLabelColor(const QColor &color) +{ + mLabelColor = color; +} + +/*! + Sets the text of the axis label that will be shown below/above or next to the axis, depending on + its orientation. To disable axis labels, pass an empty string as \a str. +*/ +void QCPAxis::setLabel(const QString &str) +{ + if (mLabel != str) + { + mLabel = str; + mCachedMarginValid = false; + } +} + +/*! + Sets the distance between the tick labels and the axis label. + + \see setTickLabelPadding, setPadding +*/ +void QCPAxis::setLabelPadding(int padding) +{ + if (mAxisPainter->labelPadding != padding) + { + mAxisPainter->labelPadding = padding; + mCachedMarginValid = false; + } +} + +/*! + Sets the padding of the axis. + + When \ref QCPAxisRect::setAutoMargins is enabled, the padding is the additional outer most space, + that is left blank. + + The axis padding has no meaning if \ref QCPAxisRect::setAutoMargins is disabled. + + \see setLabelPadding, setTickLabelPadding +*/ +void QCPAxis::setPadding(int padding) +{ + if (mPadding != padding) + { + mPadding = padding; + mCachedMarginValid = false; + } +} + +/*! + Sets the offset the axis has to its axis rect side. + + If an axis rect side has multiple axes and automatic margin calculation is enabled for that side, + only the offset of the inner most axis has meaning (even if it is set to be invisible). The + offset of the other, outer axes is controlled automatically, to place them at appropriate + positions. +*/ +void QCPAxis::setOffset(int offset) +{ + mAxisPainter->offset = offset; +} + +/*! + Sets the font that is used for tick labels when they are selected. + + \see setTickLabelFont, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions +*/ +void QCPAxis::setSelectedTickLabelFont(const QFont &font) +{ + if (font != mSelectedTickLabelFont) + { + mSelectedTickLabelFont = font; + // don't set mCachedMarginValid to false here because margin calculation is always done with non-selected fonts + } +} + +/*! + Sets the font that is used for the axis label when it is selected. + + \see setLabelFont, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions +*/ +void QCPAxis::setSelectedLabelFont(const QFont &font) +{ + mSelectedLabelFont = font; + // don't set mCachedMarginValid to false here because margin calculation is always done with non-selected fonts +} + +/*! + Sets the color that is used for tick labels when they are selected. + + \see setTickLabelColor, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions +*/ +void QCPAxis::setSelectedTickLabelColor(const QColor &color) +{ + if (color != mSelectedTickLabelColor) + { + mSelectedTickLabelColor = color; + } +} + +/*! + Sets the color that is used for the axis label when it is selected. + + \see setLabelColor, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions +*/ +void QCPAxis::setSelectedLabelColor(const QColor &color) +{ + mSelectedLabelColor = color; +} + +/*! + Sets the pen that is used to draw the axis base line when selected. + + \see setBasePen, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions +*/ +void QCPAxis::setSelectedBasePen(const QPen &pen) +{ + mSelectedBasePen = pen; +} + +/*! + Sets the pen that is used to draw the (major) ticks when selected. + + \see setTickPen, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions +*/ +void QCPAxis::setSelectedTickPen(const QPen &pen) +{ + mSelectedTickPen = pen; +} + +/*! + Sets the pen that is used to draw the subticks when selected. + + \see setSubTickPen, setSelectableParts, setSelectedParts, QCustomPlot::setInteractions +*/ +void QCPAxis::setSelectedSubTickPen(const QPen &pen) +{ + mSelectedSubTickPen = pen; +} + +/*! + Sets the style for the lower axis ending. See the documentation of QCPLineEnding for available + styles. + + For horizontal axes, this method refers to the left ending, for vertical axes the bottom ending. + Note that this meaning does not change when the axis range is reversed with \ref + setRangeReversed. + + \see setUpperEnding +*/ +void QCPAxis::setLowerEnding(const QCPLineEnding &ending) +{ + mAxisPainter->lowerEnding = ending; +} + +/*! + Sets the style for the upper axis ending. See the documentation of QCPLineEnding for available + styles. + + For horizontal axes, this method refers to the right ending, for vertical axes the top ending. + Note that this meaning does not change when the axis range is reversed with \ref + setRangeReversed. + + \see setLowerEnding +*/ +void QCPAxis::setUpperEnding(const QCPLineEnding &ending) +{ + mAxisPainter->upperEnding = ending; +} + +/*! + If the scale type (\ref setScaleType) is \ref stLinear, \a diff is added to the lower and upper + bounds of the range. The range is simply moved by \a diff. + + If the scale type is \ref stLogarithmic, the range bounds are multiplied by \a diff. This + corresponds to an apparent "linear" move in logarithmic scaling by a distance of log(diff). +*/ +void QCPAxis::moveRange(double diff) +{ + QCPRange oldRange = mRange; + if (mScaleType == stLinear) + { + mRange.lower += diff; + mRange.upper += diff; + } else // mScaleType == stLogarithmic + { + mRange.lower *= diff; + mRange.upper *= diff; + } + mCachedMarginValid = false; + emit rangeChanged(mRange); + emit rangeChanged(mRange, oldRange); +} + +/*! + Scales the range of this axis by \a factor around the coordinate \a center. For example, if \a + factor is 2.0, \a center is 1.0, then the axis range will double its size, and the point at + coordinate 1.0 won't have changed its position in the QCustomPlot widget (i.e. coordinates + around 1.0 will have moved symmetrically closer to 1.0). +*/ +void QCPAxis::scaleRange(double factor, double center) +{ + QCPRange oldRange = mRange; + if (mScaleType == stLinear) + { + QCPRange newRange; + newRange.lower = (mRange.lower-center)*factor + center; + newRange.upper = (mRange.upper-center)*factor + center; + if (QCPRange::validRange(newRange)) + mRange = newRange.sanitizedForLinScale(); + } else // mScaleType == stLogarithmic + { + if ((mRange.upper < 0 && center < 0) || (mRange.upper > 0 && center > 0)) // make sure center has same sign as range + { + QCPRange newRange; + newRange.lower = qPow(mRange.lower/center, factor)*center; + newRange.upper = qPow(mRange.upper/center, factor)*center; + if (QCPRange::validRange(newRange)) + mRange = newRange.sanitizedForLogScale(); + } else + qDebug() << Q_FUNC_INFO << "Center of scaling operation doesn't lie in same logarithmic sign domain as range:" << center; + } + mCachedMarginValid = false; + emit rangeChanged(mRange); + emit rangeChanged(mRange, oldRange); +} + +/*! + Scales the range of this axis to have a certain scale \a ratio to \a otherAxis. The scaling will + be done around the center of the current axis range. + + For example, if \a ratio is 1, this axis is the \a yAxis and \a otherAxis is \a xAxis, graphs + plotted with those axes will appear in a 1:1 aspect ratio, independent of the aspect ratio the + axis rect has. + + This is an operation that changes the range of this axis once, it doesn't fix the scale ratio + indefinitely. Note that calling this function in the constructor of the QCustomPlot's parent + won't have the desired effect, since the widget dimensions aren't defined yet, and a resizeEvent + will follow. +*/ +void QCPAxis::setScaleRatio(const QCPAxis *otherAxis, double ratio) +{ + int otherPixelSize, ownPixelSize; + + if (otherAxis->orientation() == Qt::Horizontal) + otherPixelSize = otherAxis->axisRect()->width(); + else + otherPixelSize = otherAxis->axisRect()->height(); + + if (orientation() == Qt::Horizontal) + ownPixelSize = axisRect()->width(); + else + ownPixelSize = axisRect()->height(); + + double newRangeSize = ratio*otherAxis->range().size()*ownPixelSize/(double)otherPixelSize; + setRange(range().center(), newRangeSize, Qt::AlignCenter); +} + +/*! + Changes the axis range such that all plottables associated with this axis are fully visible in + that dimension. + + \see QCPAbstractPlottable::rescaleAxes, QCustomPlot::rescaleAxes +*/ +void QCPAxis::rescale(bool onlyVisiblePlottables) +{ + QList p = plottables(); + QCPRange newRange; + bool haveRange = false; + for (int i=0; irealVisibility() && onlyVisiblePlottables) + continue; + QCPRange plottableRange; + bool currentFoundRange; + QCPAbstractPlottable::SignDomain signDomain = QCPAbstractPlottable::sdBoth; + if (mScaleType == stLogarithmic) + signDomain = (mRange.upper < 0 ? QCPAbstractPlottable::sdNegative : QCPAbstractPlottable::sdPositive); + if (p.at(i)->keyAxis() == this) + plottableRange = p.at(i)->getKeyRange(currentFoundRange, signDomain); + else + plottableRange = p.at(i)->getValueRange(currentFoundRange, signDomain); + if (currentFoundRange) + { + if (!haveRange) + newRange = plottableRange; + else + newRange.expand(plottableRange); + haveRange = true; + } + } + if (haveRange) + { + if (!QCPRange::validRange(newRange)) // likely due to range being zero (plottable has only constant data in this axis dimension), shift current range to at least center the plottable + { + double center = (newRange.lower+newRange.upper)*0.5; // upper and lower should be equal anyway, but just to make sure, incase validRange returned false for other reason + if (mScaleType == stLinear) + { + newRange.lower = center-mRange.size()/2.0; + newRange.upper = center+mRange.size()/2.0; + } else // mScaleType == stLogarithmic + { + newRange.lower = center/qSqrt(mRange.upper/mRange.lower); + newRange.upper = center*qSqrt(mRange.upper/mRange.lower); + } + } + setRange(newRange); + } +} + +/*! + Transforms \a value, in pixel coordinates of the QCustomPlot widget, to axis coordinates. +*/ +double QCPAxis::pixelToCoord(double value) const +{ + if (orientation() == Qt::Horizontal) + { + if (mScaleType == stLinear) + { + if (!mRangeReversed) + return (value-mAxisRect->left())/(double)mAxisRect->width()*mRange.size()+mRange.lower; + else + return -(value-mAxisRect->left())/(double)mAxisRect->width()*mRange.size()+mRange.upper; + } else // mScaleType == stLogarithmic + { + if (!mRangeReversed) + return qPow(mRange.upper/mRange.lower, (value-mAxisRect->left())/(double)mAxisRect->width())*mRange.lower; + else + return qPow(mRange.upper/mRange.lower, (mAxisRect->left()-value)/(double)mAxisRect->width())*mRange.upper; + } + } else // orientation() == Qt::Vertical + { + if (mScaleType == stLinear) + { + if (!mRangeReversed) + return (mAxisRect->bottom()-value)/(double)mAxisRect->height()*mRange.size()+mRange.lower; + else + return -(mAxisRect->bottom()-value)/(double)mAxisRect->height()*mRange.size()+mRange.upper; + } else // mScaleType == stLogarithmic + { + if (!mRangeReversed) + return qPow(mRange.upper/mRange.lower, (mAxisRect->bottom()-value)/(double)mAxisRect->height())*mRange.lower; + else + return qPow(mRange.upper/mRange.lower, (value-mAxisRect->bottom())/(double)mAxisRect->height())*mRange.upper; + } + } +} + +/*! + Transforms \a value, in coordinates of the axis, to pixel coordinates of the QCustomPlot widget. +*/ +double QCPAxis::coordToPixel(double value) const +{ + if (orientation() == Qt::Horizontal) + { + if (mScaleType == stLinear) + { + if (!mRangeReversed) + return (value-mRange.lower)/mRange.size()*mAxisRect->width()+mAxisRect->left(); + else + return (mRange.upper-value)/mRange.size()*mAxisRect->width()+mAxisRect->left(); + } else // mScaleType == stLogarithmic + { + if (value >= 0 && mRange.upper < 0) // invalid value for logarithmic scale, just draw it outside visible range + return !mRangeReversed ? mAxisRect->right()+200 : mAxisRect->left()-200; + else if (value <= 0 && mRange.upper > 0) // invalid value for logarithmic scale, just draw it outside visible range + return !mRangeReversed ? mAxisRect->left()-200 : mAxisRect->right()+200; + else + { + if (!mRangeReversed) + return baseLog(value/mRange.lower)/baseLog(mRange.upper/mRange.lower)*mAxisRect->width()+mAxisRect->left(); + else + return baseLog(mRange.upper/value)/baseLog(mRange.upper/mRange.lower)*mAxisRect->width()+mAxisRect->left(); + } + } + } else // orientation() == Qt::Vertical + { + if (mScaleType == stLinear) + { + if (!mRangeReversed) + return mAxisRect->bottom()-(value-mRange.lower)/mRange.size()*mAxisRect->height(); + else + return mAxisRect->bottom()-(mRange.upper-value)/mRange.size()*mAxisRect->height(); + } else // mScaleType == stLogarithmic + { + if (value >= 0 && mRange.upper < 0) // invalid value for logarithmic scale, just draw it outside visible range + return !mRangeReversed ? mAxisRect->top()-200 : mAxisRect->bottom()+200; + else if (value <= 0 && mRange.upper > 0) // invalid value for logarithmic scale, just draw it outside visible range + return !mRangeReversed ? mAxisRect->bottom()+200 : mAxisRect->top()-200; + else + { + if (!mRangeReversed) + return mAxisRect->bottom()-baseLog(value/mRange.lower)/baseLog(mRange.upper/mRange.lower)*mAxisRect->height(); + else + return mAxisRect->bottom()-baseLog(mRange.upper/value)/baseLog(mRange.upper/mRange.lower)*mAxisRect->height(); + } + } + } +} + +/*! + Returns the part of the axis that is hit by \a pos (in pixels). The return value of this function + is independent of the user-selectable parts defined with \ref setSelectableParts. Further, this + function does not change the current selection state of the axis. + + If the axis is not visible (\ref setVisible), this function always returns \ref spNone. + + \see setSelectedParts, setSelectableParts, QCustomPlot::setInteractions +*/ +QCPAxis::SelectablePart QCPAxis::getPartAt(const QPointF &pos) const +{ + if (!mVisible) + return spNone; + + if (mAxisPainter->axisSelectionBox().contains(pos.toPoint())) + return spAxis; + else if (mAxisPainter->tickLabelsSelectionBox().contains(pos.toPoint())) + return spTickLabels; + else if (mAxisPainter->labelSelectionBox().contains(pos.toPoint())) + return spAxisLabel; + else + return spNone; +} + +/* inherits documentation from base class */ +double QCPAxis::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + if (!mParentPlot) return -1; + SelectablePart part = getPartAt(pos); + if ((onlySelectable && !mSelectableParts.testFlag(part)) || part == spNone) + return -1; + + if (details) + details->setValue(part); + return mParentPlot->selectionTolerance()*0.99; +} + +/*! + Returns a list of all the plottables that have this axis as key or value axis. + + If you are only interested in plottables of type QCPGraph, see \ref graphs. + + \see graphs, items +*/ +QList QCPAxis::plottables() const +{ + QList result; + if (!mParentPlot) return result; + + for (int i=0; imPlottables.size(); ++i) + { + if (mParentPlot->mPlottables.at(i)->keyAxis() == this ||mParentPlot->mPlottables.at(i)->valueAxis() == this) + result.append(mParentPlot->mPlottables.at(i)); + } + return result; +} + +/*! + Returns a list of all the graphs that have this axis as key or value axis. + + \see plottables, items +*/ +QList QCPAxis::graphs() const +{ + QList result; + if (!mParentPlot) return result; + + for (int i=0; imGraphs.size(); ++i) + { + if (mParentPlot->mGraphs.at(i)->keyAxis() == this || mParentPlot->mGraphs.at(i)->valueAxis() == this) + result.append(mParentPlot->mGraphs.at(i)); + } + return result; +} + +/*! + Returns a list of all the items that are associated with this axis. An item is considered + associated with an axis if at least one of its positions uses the axis as key or value axis. + + \see plottables, graphs +*/ +QList QCPAxis::items() const +{ + QList result; + if (!mParentPlot) return result; + + for (int itemId=0; itemIdmItems.size(); ++itemId) + { + QList positions = mParentPlot->mItems.at(itemId)->positions(); + for (int posId=0; posIdkeyAxis() == this || positions.at(posId)->valueAxis() == this) + { + result.append(mParentPlot->mItems.at(itemId)); + break; + } + } + } + return result; +} + +/*! + Transforms a margin side to the logically corresponding axis type. (QCP::msLeft to + QCPAxis::atLeft, QCP::msRight to QCPAxis::atRight, etc.) +*/ +QCPAxis::AxisType QCPAxis::marginSideToAxisType(QCP::MarginSide side) +{ + switch (side) + { + case QCP::msLeft: return atLeft; + case QCP::msRight: return atRight; + case QCP::msTop: return atTop; + case QCP::msBottom: return atBottom; + default: break; + } + qDebug() << Q_FUNC_INFO << "Invalid margin side passed:" << (int)side; + return atLeft; +} + +/*! + Returns the axis type that describes the opposite axis of an axis with the specified \a type. +*/ +QCPAxis::AxisType QCPAxis::opposite(QCPAxis::AxisType type) +{ + switch (type) + { + case atLeft: return atRight; break; + case atRight: return atLeft; break; + case atBottom: return atTop; break; + case atTop: return atBottom; break; + default: qDebug() << Q_FUNC_INFO << "invalid axis type"; return atLeft; break; + } +} + +/*! \internal + + This function is called to prepare the tick vector, sub tick vector and tick label vector. If + \ref setAutoTicks is set to true, appropriate tick values are determined automatically via \ref + generateAutoTicks. If it's set to false, the signal ticksRequest is emitted, which can be used to + provide external tick positions. Then the sub tick vectors and tick label vectors are created. +*/ +void QCPAxis::setupTickVectors() +{ + if (!mParentPlot) return; + if ((!mTicks && !mTickLabels && !mGrid->visible()) || mRange.size() <= 0) return; + + // fill tick vectors, either by auto generating or by notifying user to fill the vectors himself + if (mAutoTicks) + { + generateAutoTicks(); + } else + { + emit ticksRequest(); + } + + visibleTickBounds(mLowestVisibleTick, mHighestVisibleTick); + if (mTickVector.isEmpty()) + { + mSubTickVector.clear(); + return; + } + + // generate subticks between ticks: + mSubTickVector.resize((mTickVector.size()-1)*mSubTickCount); + if (mSubTickCount > 0) + { + double subTickStep = 0; + double subTickPosition = 0; + int subTickIndex = 0; + bool done = false; + int lowTick = mLowestVisibleTick > 0 ? mLowestVisibleTick-1 : mLowestVisibleTick; + int highTick = mHighestVisibleTick < mTickVector.size()-1 ? mHighestVisibleTick+1 : mHighestVisibleTick; + for (int i=lowTick+1; i<=highTick; ++i) + { + subTickStep = (mTickVector.at(i)-mTickVector.at(i-1))/(double)(mSubTickCount+1); + for (int k=1; k<=mSubTickCount; ++k) + { + subTickPosition = mTickVector.at(i-1) + k*subTickStep; + if (subTickPosition < mRange.lower) + continue; + if (subTickPosition > mRange.upper) + { + done = true; + break; + } + mSubTickVector[subTickIndex] = subTickPosition; + subTickIndex++; + } + if (done) break; + } + mSubTickVector.resize(subTickIndex); + } + + // generate tick labels according to tick positions: + if (mAutoTickLabels) + { + int vecsize = mTickVector.size(); + mTickVectorLabels.resize(vecsize); + if (mTickLabelType == ltNumber) + { + for (int i=mLowestVisibleTick; i<=mHighestVisibleTick; ++i) + mTickVectorLabels[i] = mParentPlot->locale().toString(mTickVector.at(i), mNumberFormatChar.toLatin1(), mNumberPrecision); + } else if (mTickLabelType == ltDateTime) + { + for (int i=mLowestVisibleTick; i<=mHighestVisibleTick; ++i) + { +#if QT_VERSION < QT_VERSION_CHECK(4, 7, 0) // use fromMSecsSinceEpoch function if available, to gain sub-second accuracy on tick labels (e.g. for format "hh:mm:ss:zzz") + mTickVectorLabels[i] = mParentPlot->locale().toString(QDateTime::fromTime_t(mTickVector.at(i)).toTimeSpec(mDateTimeSpec), mDateTimeFormat); +#else + mTickVectorLabels[i] = mParentPlot->locale().toString(QDateTime::fromMSecsSinceEpoch(mTickVector.at(i)*1000).toTimeSpec(mDateTimeSpec), mDateTimeFormat); +#endif + } + } + } else // mAutoTickLabels == false + { + if (mAutoTicks) // ticks generated automatically, but not ticklabels, so emit ticksRequest here for labels + { + emit ticksRequest(); + } + // make sure provided tick label vector has correct (minimal) length: + if (mTickVectorLabels.size() < mTickVector.size()) + mTickVectorLabels.resize(mTickVector.size()); + } +} + +/*! \internal + + If \ref setAutoTicks is set to true, this function is called by \ref setupTickVectors to + generate reasonable tick positions (and subtick count). The algorithm tries to create + approximately mAutoTickCount ticks (set via \ref setAutoTickCount). + + If the scale is logarithmic, \ref setAutoTickCount is ignored, and one tick is generated at every + power of the current logarithm base, set via \ref setScaleLogBase. +*/ +void QCPAxis::generateAutoTicks() +{ + if (mScaleType == stLinear) + { + if (mAutoTickStep) + { + // Generate tick positions according to linear scaling: + mTickStep = mRange.size()/(double)(mAutoTickCount+1e-10); // mAutoTickCount ticks on average, the small addition is to prevent jitter on exact integers + double magnitudeFactor = qPow(10.0, qFloor(qLn(mTickStep)/qLn(10.0))); // get magnitude factor e.g. 0.01, 1, 10, 1000 etc. + double tickStepMantissa = mTickStep/magnitudeFactor; + if (tickStepMantissa < 5) + { + // round digit after decimal point to 0.5 + mTickStep = (int)(tickStepMantissa*2)/2.0*magnitudeFactor; + } else + { + // round to first digit in multiples of 2 + mTickStep = (int)(tickStepMantissa/2.0)*2.0*magnitudeFactor; + } + } + if (mAutoSubTicks) + mSubTickCount = calculateAutoSubTickCount(mTickStep); + // Generate tick positions according to mTickStep: + qint64 firstStep = floor(mRange.lower/mTickStep); // do not use qFloor here, or we'll lose 64 bit precision + qint64 lastStep = ceil(mRange.upper/mTickStep); // do not use qCeil here, or we'll lose 64 bit precision + int tickcount = lastStep-firstStep+1; + if (tickcount < 0) tickcount = 0; + mTickVector.resize(tickcount); + for (int i=0; i 0 && mRange.upper > 0) // positive range + { + double lowerMag = basePow(qFloor(baseLog(mRange.lower))); + double currentMag = lowerMag; + mTickVector.clear(); + mTickVector.append(currentMag); + while (currentMag < mRange.upper && currentMag > 0) // currentMag might be zero for ranges ~1e-300, just cancel in that case + { + currentMag *= mScaleLogBase; + mTickVector.append(currentMag); + } + } else if (mRange.lower < 0 && mRange.upper < 0) // negative range + { + double lowerMag = -basePow(qCeil(baseLog(-mRange.lower))); + double currentMag = lowerMag; + mTickVector.clear(); + mTickVector.append(currentMag); + while (currentMag < mRange.upper && currentMag < 0) // currentMag might be zero for ranges ~1e-300, just cancel in that case + { + currentMag /= mScaleLogBase; + mTickVector.append(currentMag); + } + } else // invalid range for logarithmic scale, because lower and upper have different sign + { + mTickVector.clear(); + qDebug() << Q_FUNC_INFO << "Invalid range for logarithmic plot: " << mRange.lower << "-" << mRange.upper; + } + } +} + +/*! \internal + + Called by generateAutoTicks when \ref setAutoSubTicks is set to true. Depending on the \a + tickStep between two major ticks on the axis, a different number of sub ticks is appropriate. For + Example taking 4 sub ticks for a \a tickStep of 1 makes more sense than taking 5 sub ticks, + because this corresponds to a sub tick step of 0.2, instead of the less intuitive 0.16667. Note + that a subtick count of 4 means dividing the major tick step into 5 sections. + + This is implemented by a hand made lookup for integer tick steps as well as fractional tick steps + with a fractional part of (approximately) 0.5. If a tick step is different (i.e. has no + fractional part close to 0.5), the currently set sub tick count (\ref setSubTickCount) is + returned. +*/ +int QCPAxis::calculateAutoSubTickCount(double tickStep) const +{ + int result = mSubTickCount; // default to current setting, if no proper value can be found + + // get mantissa of tickstep: + double magnitudeFactor = qPow(10.0, qFloor(qLn(tickStep)/qLn(10.0))); // get magnitude factor e.g. 0.01, 1, 10, 1000 etc. + double tickStepMantissa = tickStep/magnitudeFactor; + + // separate integer and fractional part of mantissa: + double epsilon = 0.01; + double intPartf; + int intPart; + double fracPart = modf(tickStepMantissa, &intPartf); + intPart = intPartf; + + // handle cases with (almost) integer mantissa: + if (fracPart < epsilon || 1.0-fracPart < epsilon) + { + if (1.0-fracPart < epsilon) + ++intPart; + switch (intPart) + { + case 1: result = 4; break; // 1.0 -> 0.2 substep + case 2: result = 3; break; // 2.0 -> 0.5 substep + case 3: result = 2; break; // 3.0 -> 1.0 substep + case 4: result = 3; break; // 4.0 -> 1.0 substep + case 5: result = 4; break; // 5.0 -> 1.0 substep + case 6: result = 2; break; // 6.0 -> 2.0 substep + case 7: result = 6; break; // 7.0 -> 1.0 substep + case 8: result = 3; break; // 8.0 -> 2.0 substep + case 9: result = 2; break; // 9.0 -> 3.0 substep + } + } else + { + // handle cases with significantly fractional mantissa: + if (qAbs(fracPart-0.5) < epsilon) // *.5 mantissa + { + switch (intPart) + { + case 1: result = 2; break; // 1.5 -> 0.5 substep + case 2: result = 4; break; // 2.5 -> 0.5 substep + case 3: result = 4; break; // 3.5 -> 0.7 substep + case 4: result = 2; break; // 4.5 -> 1.5 substep + case 5: result = 4; break; // 5.5 -> 1.1 substep (won't occur with autoTickStep from here on) + case 6: result = 4; break; // 6.5 -> 1.3 substep + case 7: result = 2; break; // 7.5 -> 2.5 substep + case 8: result = 4; break; // 8.5 -> 1.7 substep + case 9: result = 4; break; // 9.5 -> 1.9 substep + } + } + // if mantissa fraction isnt 0.0 or 0.5, don't bother finding good sub tick marks, leave default + } + + return result; +} + +/* inherits documentation from base class */ +void QCPAxis::selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged) +{ + Q_UNUSED(event) + SelectablePart part = details.value(); + if (mSelectableParts.testFlag(part)) + { + SelectableParts selBefore = mSelectedParts; + setSelectedParts(additive ? mSelectedParts^part : part); + if (selectionStateChanged) + *selectionStateChanged = mSelectedParts != selBefore; + } +} + +/* inherits documentation from base class */ +void QCPAxis::deselectEvent(bool *selectionStateChanged) +{ + SelectableParts selBefore = mSelectedParts; + setSelectedParts(mSelectedParts & ~mSelectableParts); + if (selectionStateChanged) + *selectionStateChanged = mSelectedParts != selBefore; +} + +/*! \internal + + A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter + before drawing axis lines. + + This is the antialiasing state the painter passed to the \ref draw method is in by default. + + This function takes into account the local setting of the antialiasing flag as well as the + overrides set with \ref QCustomPlot::setAntialiasedElements and \ref + QCustomPlot::setNotAntialiasedElements. + + \see setAntialiased +*/ +void QCPAxis::applyDefaultAntialiasingHint(QCPPainter *painter) const +{ + applyAntialiasingHint(painter, mAntialiased, QCP::aeAxes); +} + +/*! \internal + + Draws the axis with the specified \a painter, using the internal QCPAxisPainterPrivate instance. + +*/ +void QCPAxis::draw(QCPPainter *painter) +{ + const int lowTick = mLowestVisibleTick; + const int highTick = mHighestVisibleTick; + QVector subTickPositions; // the final coordToPixel transformed vector passed to QCPAxisPainter + QVector tickPositions; // the final coordToPixel transformed vector passed to QCPAxisPainter + QVector tickLabels; // the final vector passed to QCPAxisPainter + tickPositions.reserve(highTick-lowTick+1); + tickLabels.reserve(highTick-lowTick+1); + subTickPositions.reserve(mSubTickVector.size()); + + if (mTicks) + { + for (int i=lowTick; i<=highTick; ++i) + { + tickPositions.append(coordToPixel(mTickVector.at(i))); + if (mTickLabels) + tickLabels.append(mTickVectorLabels.at(i)); + } + + if (mSubTickCount > 0) + { + const int subTickCount = mSubTickVector.size(); + for (int i=0; itype = mAxisType; + mAxisPainter->basePen = getBasePen(); + mAxisPainter->labelFont = getLabelFont(); + mAxisPainter->labelColor = getLabelColor(); + mAxisPainter->label = mLabel; + mAxisPainter->substituteExponent = mAutoTickLabels && mNumberBeautifulPowers && mTickLabelType == ltNumber; + mAxisPainter->tickPen = getTickPen(); + mAxisPainter->subTickPen = getSubTickPen(); + mAxisPainter->tickLabelFont = getTickLabelFont(); + mAxisPainter->tickLabelColor = getTickLabelColor(); + mAxisPainter->axisRect = mAxisRect->rect(); + mAxisPainter->viewportRect = mParentPlot->viewport(); + mAxisPainter->abbreviateDecimalPowers = mScaleType == stLogarithmic; + mAxisPainter->reversedEndings = mRangeReversed; + mAxisPainter->tickPositions = tickPositions; + mAxisPainter->tickLabels = tickLabels; + mAxisPainter->subTickPositions = subTickPositions; + mAxisPainter->draw(painter); +} + +/*! \internal + + Returns via \a lowIndex and \a highIndex, which ticks in the current tick vector are visible in + the current range. The return values are indices of the tick vector, not the positions of the + ticks themselves. + + The actual use of this function is when an external tick vector is provided, since it might + exceed far beyond the currently displayed range, and would cause unnecessary calculations e.g. of + subticks. + + If all ticks are outside the axis range, an inverted range is returned, i.e. highIndex will be + smaller than lowIndex. There is one case, where this function returns indices that are not really + visible in the current axis range: When the tick spacing is larger than the axis range size and + one tick is below the axis range and the next tick is already above the axis range. Because in + such cases it is usually desirable to know the tick pair, to draw proper subticks. +*/ +void QCPAxis::visibleTickBounds(int &lowIndex, int &highIndex) const +{ + bool lowFound = false; + bool highFound = false; + lowIndex = 0; + highIndex = -1; + + for (int i=0; i < mTickVector.size(); ++i) + { + if (mTickVector.at(i) >= mRange.lower) + { + lowFound = true; + lowIndex = i; + break; + } + } + for (int i=mTickVector.size()-1; i >= 0; --i) + { + if (mTickVector.at(i) <= mRange.upper) + { + highFound = true; + highIndex = i; + break; + } + } + + if (!lowFound && highFound) + lowIndex = highIndex+1; + else if (lowFound && !highFound) + highIndex = lowIndex-1; +} + +/*! \internal + + A log function with the base mScaleLogBase, used mostly for coordinate transforms in logarithmic + scales with arbitrary log base. Uses the buffered mScaleLogBaseLogInv for faster calculation. + This is set to 1.0/qLn(mScaleLogBase) in \ref setScaleLogBase. + + \see basePow, setScaleLogBase, setScaleType +*/ +double QCPAxis::baseLog(double value) const +{ + return qLn(value)*mScaleLogBaseLogInv; +} + +/*! \internal + + A power function with the base mScaleLogBase, used mostly for coordinate transforms in + logarithmic scales with arbitrary log base. + + \see baseLog, setScaleLogBase, setScaleType +*/ +double QCPAxis::basePow(double value) const +{ + return qPow(mScaleLogBase, value); +} + +/*! \internal + + Returns the pen that is used to draw the axis base line. Depending on the selection state, this + is either mSelectedBasePen or mBasePen. +*/ +QPen QCPAxis::getBasePen() const +{ + return mSelectedParts.testFlag(spAxis) ? mSelectedBasePen : mBasePen; +} + +/*! \internal + + Returns the pen that is used to draw the (major) ticks. Depending on the selection state, this + is either mSelectedTickPen or mTickPen. +*/ +QPen QCPAxis::getTickPen() const +{ + return mSelectedParts.testFlag(spAxis) ? mSelectedTickPen : mTickPen; +} + +/*! \internal + + Returns the pen that is used to draw the subticks. Depending on the selection state, this + is either mSelectedSubTickPen or mSubTickPen. +*/ +QPen QCPAxis::getSubTickPen() const +{ + return mSelectedParts.testFlag(spAxis) ? mSelectedSubTickPen : mSubTickPen; +} + +/*! \internal + + Returns the font that is used to draw the tick labels. Depending on the selection state, this + is either mSelectedTickLabelFont or mTickLabelFont. +*/ +QFont QCPAxis::getTickLabelFont() const +{ + return mSelectedParts.testFlag(spTickLabels) ? mSelectedTickLabelFont : mTickLabelFont; +} + +/*! \internal + + Returns the font that is used to draw the axis label. Depending on the selection state, this + is either mSelectedLabelFont or mLabelFont. +*/ +QFont QCPAxis::getLabelFont() const +{ + return mSelectedParts.testFlag(spAxisLabel) ? mSelectedLabelFont : mLabelFont; +} + +/*! \internal + + Returns the color that is used to draw the tick labels. Depending on the selection state, this + is either mSelectedTickLabelColor or mTickLabelColor. +*/ +QColor QCPAxis::getTickLabelColor() const +{ + return mSelectedParts.testFlag(spTickLabels) ? mSelectedTickLabelColor : mTickLabelColor; +} + +/*! \internal + + Returns the color that is used to draw the axis label. Depending on the selection state, this + is either mSelectedLabelColor or mLabelColor. +*/ +QColor QCPAxis::getLabelColor() const +{ + return mSelectedParts.testFlag(spAxisLabel) ? mSelectedLabelColor : mLabelColor; +} + +/*! \internal + + Returns the appropriate outward margin for this axis. It is needed if \ref + QCPAxisRect::setAutoMargins is set to true on the parent axis rect. An axis with axis type \ref + atLeft will return an appropriate left margin, \ref atBottom will return an appropriate bottom + margin and so forth. For the calculation, this function goes through similar steps as \ref draw, + so changing one function likely requires the modification of the other one as well. + + The margin consists of the outward tick length, tick label padding, tick label size, label + padding, label size, and padding. + + The margin is cached internally, so repeated calls while leaving the axis range, fonts, etc. + unchanged are very fast. +*/ +int QCPAxis::calculateMargin() +{ + if (!mVisible) // if not visible, directly return 0, don't cache 0 because we can't react to setVisible in QCPAxis + return 0; + + if (mCachedMarginValid) + return mCachedMargin; + + // run through similar steps as QCPAxis::draw, and caluclate margin needed to fit axis and its labels + int margin = 0; + + int lowTick, highTick; + visibleTickBounds(lowTick, highTick); + QVector tickPositions; // the final coordToPixel transformed vector passed to QCPAxisPainter + QVector tickLabels; // the final vector passed to QCPAxisPainter + tickPositions.reserve(highTick-lowTick+1); + tickLabels.reserve(highTick-lowTick+1); + if (mTicks) + { + for (int i=lowTick; i<=highTick; ++i) + { + tickPositions.append(coordToPixel(mTickVector.at(i))); + if (mTickLabels) + tickLabels.append(mTickVectorLabels.at(i)); + } + } + // transfer all properties of this axis to QCPAxisPainterPrivate which it needs to calculate the size. + // Note that some axis painter properties are already set by direct feed-through with QCPAxis setters + mAxisPainter->type = mAxisType; + mAxisPainter->labelFont = getLabelFont(); + mAxisPainter->label = mLabel; + mAxisPainter->tickLabelFont = mTickLabelFont; + mAxisPainter->axisRect = mAxisRect->rect(); + mAxisPainter->viewportRect = mParentPlot->viewport(); + mAxisPainter->tickPositions = tickPositions; + mAxisPainter->tickLabels = tickLabels; + margin += mAxisPainter->size(); + margin += mPadding; + + mCachedMargin = margin; + mCachedMarginValid = true; + return margin; +} + +/* inherits documentation from base class */ +QCP::Interaction QCPAxis::selectionCategory() const +{ + return QCP::iSelectAxes; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPAxisPainterPrivate +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPAxisPainterPrivate + + \internal + \brief (Private) + + This is a private class and not part of the public QCustomPlot interface. + + It is used by QCPAxis to do the low-level drawing of axis backbone, tick marks, tick labels and + axis label. It also buffers the labels to reduce replot times. The parameters are configured by + directly accessing the public member variables. +*/ + +/*! + Constructs a QCPAxisPainterPrivate instance. Make sure to not create a new instance on every + redraw, to utilize the caching mechanisms. +*/ +QCPAxisPainterPrivate::QCPAxisPainterPrivate(QCustomPlot *parentPlot) : + type(QCPAxis::atLeft), + basePen(QPen(Qt::black, 0, Qt::SolidLine, Qt::SquareCap)), + lowerEnding(QCPLineEnding::esNone), + upperEnding(QCPLineEnding::esNone), + labelPadding(0), + tickLabelPadding(0), + tickLabelRotation(0), + tickLabelSide(QCPAxis::lsOutside), + substituteExponent(true), + numberMultiplyCross(false), + tickLengthIn(5), + tickLengthOut(0), + subTickLengthIn(2), + subTickLengthOut(0), + tickPen(QPen(Qt::black, 0, Qt::SolidLine, Qt::SquareCap)), + subTickPen(QPen(Qt::black, 0, Qt::SolidLine, Qt::SquareCap)), + offset(0), + abbreviateDecimalPowers(false), + reversedEndings(false), + mParentPlot(parentPlot), + mLabelCache(16) // cache at most 16 (tick) labels +{ +} + +QCPAxisPainterPrivate::~QCPAxisPainterPrivate() +{ +} + +/*! \internal + + Draws the axis with the specified \a painter. + + The selection boxes (mAxisSelectionBox, mTickLabelsSelectionBox, mLabelSelectionBox) are set + here, too. +*/ +void QCPAxisPainterPrivate::draw(QCPPainter *painter) +{ + QByteArray newHash = generateLabelParameterHash(); + if (newHash != mLabelParameterHash) + { + mLabelCache.clear(); + mLabelParameterHash = newHash; + } + + QPoint origin; + switch (type) + { + case QCPAxis::atLeft: origin = axisRect.bottomLeft() +QPoint(-offset, 0); break; + case QCPAxis::atRight: origin = axisRect.bottomRight()+QPoint(+offset, 0); break; + case QCPAxis::atTop: origin = axisRect.topLeft() +QPoint(0, -offset); break; + case QCPAxis::atBottom: origin = axisRect.bottomLeft() +QPoint(0, +offset); break; + } + + double xCor = 0, yCor = 0; // paint system correction, for pixel exact matches (affects baselines and ticks of top/right axes) + switch (type) + { + case QCPAxis::atTop: yCor = -1; break; + case QCPAxis::atRight: xCor = 1; break; + default: break; + } + int margin = 0; + // draw baseline: + QLineF baseLine; + painter->setPen(basePen); + if (QCPAxis::orientation(type) == Qt::Horizontal) + baseLine.setPoints(origin+QPointF(xCor, yCor), origin+QPointF(axisRect.width()+xCor, yCor)); + else + baseLine.setPoints(origin+QPointF(xCor, yCor), origin+QPointF(xCor, -axisRect.height()+yCor)); + if (reversedEndings) + baseLine = QLineF(baseLine.p2(), baseLine.p1()); // won't make a difference for line itself, but for line endings later + painter->drawLine(baseLine); + + // draw ticks: + if (!tickPositions.isEmpty()) + { + painter->setPen(tickPen); + int tickDir = (type == QCPAxis::atBottom || type == QCPAxis::atRight) ? -1 : 1; // direction of ticks ("inward" is right for left axis and left for right axis) + if (QCPAxis::orientation(type) == Qt::Horizontal) + { + for (int i=0; idrawLine(QLineF(tickPositions.at(i)+xCor, origin.y()-tickLengthOut*tickDir+yCor, tickPositions.at(i)+xCor, origin.y()+tickLengthIn*tickDir+yCor)); + } else + { + for (int i=0; idrawLine(QLineF(origin.x()-tickLengthOut*tickDir+xCor, tickPositions.at(i)+yCor, origin.x()+tickLengthIn*tickDir+xCor, tickPositions.at(i)+yCor)); + } + } + + // draw subticks: + if (!subTickPositions.isEmpty()) + { + painter->setPen(subTickPen); + // direction of ticks ("inward" is right for left axis and left for right axis) + int tickDir = (type == QCPAxis::atBottom || type == QCPAxis::atRight) ? -1 : 1; + if (QCPAxis::orientation(type) == Qt::Horizontal) + { + for (int i=0; idrawLine(QLineF(subTickPositions.at(i)+xCor, origin.y()-subTickLengthOut*tickDir+yCor, subTickPositions.at(i)+xCor, origin.y()+subTickLengthIn*tickDir+yCor)); + } else + { + for (int i=0; idrawLine(QLineF(origin.x()-subTickLengthOut*tickDir+xCor, subTickPositions.at(i)+yCor, origin.x()+subTickLengthIn*tickDir+xCor, subTickPositions.at(i)+yCor)); + } + } + margin += qMax(0, qMax(tickLengthOut, subTickLengthOut)); + + // draw axis base endings: + bool antialiasingBackup = painter->antialiasing(); + painter->setAntialiasing(true); // always want endings to be antialiased, even if base and ticks themselves aren't + painter->setBrush(QBrush(basePen.color())); + QVector2D baseLineVector(baseLine.dx(), baseLine.dy()); + if (lowerEnding.style() != QCPLineEnding::esNone) + lowerEnding.draw(painter, QVector2D(baseLine.p1())-baseLineVector.normalized()*lowerEnding.realLength()*(lowerEnding.inverted()?-1:1), -baseLineVector); + if (upperEnding.style() != QCPLineEnding::esNone) + upperEnding.draw(painter, QVector2D(baseLine.p2())+baseLineVector.normalized()*upperEnding.realLength()*(upperEnding.inverted()?-1:1), baseLineVector); + painter->setAntialiasing(antialiasingBackup); + + // tick labels: + QRect oldClipRect; + if (tickLabelSide == QCPAxis::lsInside) // if using inside labels, clip them to the axis rect + { + oldClipRect = painter->clipRegion().boundingRect(); + painter->setClipRect(axisRect); + } + QSize tickLabelsSize(0, 0); // size of largest tick label, for offset calculation of axis label + if (!tickLabels.isEmpty()) + { + if (tickLabelSide == QCPAxis::lsOutside) + margin += tickLabelPadding; + painter->setFont(tickLabelFont); + painter->setPen(QPen(tickLabelColor)); + const int maxLabelIndex = qMin(tickPositions.size(), tickLabels.size()); + int distanceToAxis = margin; + if (tickLabelSide == QCPAxis::lsInside) + distanceToAxis = -(qMax(tickLengthIn, subTickLengthIn)+tickLabelPadding); + for (int i=0; isetClipRect(oldClipRect); + + // axis label: + QRect labelBounds; + if (!label.isEmpty()) + { + margin += labelPadding; + painter->setFont(labelFont); + painter->setPen(QPen(labelColor)); + labelBounds = painter->fontMetrics().boundingRect(0, 0, 0, 0, Qt::TextDontClip, label); + if (type == QCPAxis::atLeft) + { + QTransform oldTransform = painter->transform(); + painter->translate((origin.x()-margin-labelBounds.height()), origin.y()); + painter->rotate(-90); + painter->drawText(0, 0, axisRect.height(), labelBounds.height(), Qt::TextDontClip | Qt::AlignCenter, label); + painter->setTransform(oldTransform); + } + else if (type == QCPAxis::atRight) + { + QTransform oldTransform = painter->transform(); + painter->translate((origin.x()+margin+labelBounds.height()), origin.y()-axisRect.height()); + painter->rotate(90); + painter->drawText(0, 0, axisRect.height(), labelBounds.height(), Qt::TextDontClip | Qt::AlignCenter, label); + painter->setTransform(oldTransform); + } + else if (type == QCPAxis::atTop) + painter->drawText(origin.x(), origin.y()-margin-labelBounds.height(), axisRect.width(), labelBounds.height(), Qt::TextDontClip | Qt::AlignCenter, label); + else if (type == QCPAxis::atBottom) + painter->drawText(origin.x(), origin.y()+margin, axisRect.width(), labelBounds.height(), Qt::TextDontClip | Qt::AlignCenter, label); + } + + // set selection boxes: + int selectionTolerance = 0; + if (mParentPlot) + selectionTolerance = mParentPlot->selectionTolerance(); + else + qDebug() << Q_FUNC_INFO << "mParentPlot is null"; + int selAxisOutSize = qMax(qMax(tickLengthOut, subTickLengthOut), selectionTolerance); + int selAxisInSize = selectionTolerance; + int selTickLabelSize; + int selTickLabelOffset; + if (tickLabelSide == QCPAxis::lsOutside) + { + selTickLabelSize = (QCPAxis::orientation(type) == Qt::Horizontal ? tickLabelsSize.height() : tickLabelsSize.width()); + selTickLabelOffset = qMax(tickLengthOut, subTickLengthOut)+tickLabelPadding; + } else + { + selTickLabelSize = -(QCPAxis::orientation(type) == Qt::Horizontal ? tickLabelsSize.height() : tickLabelsSize.width()); + selTickLabelOffset = -(qMax(tickLengthIn, subTickLengthIn)+tickLabelPadding); + } + int selLabelSize = labelBounds.height(); + int selLabelOffset = qMax(tickLengthOut, subTickLengthOut)+(!tickLabels.isEmpty() && tickLabelSide == QCPAxis::lsOutside ? tickLabelPadding+selTickLabelSize : 0)+labelPadding; + if (type == QCPAxis::atLeft) + { + mAxisSelectionBox.setCoords(origin.x()-selAxisOutSize, axisRect.top(), origin.x()+selAxisInSize, axisRect.bottom()); + mTickLabelsSelectionBox.setCoords(origin.x()-selTickLabelOffset-selTickLabelSize, axisRect.top(), origin.x()-selTickLabelOffset, axisRect.bottom()); + mLabelSelectionBox.setCoords(origin.x()-selLabelOffset-selLabelSize, axisRect.top(), origin.x()-selLabelOffset, axisRect.bottom()); + } else if (type == QCPAxis::atRight) + { + mAxisSelectionBox.setCoords(origin.x()-selAxisInSize, axisRect.top(), origin.x()+selAxisOutSize, axisRect.bottom()); + mTickLabelsSelectionBox.setCoords(origin.x()+selTickLabelOffset+selTickLabelSize, axisRect.top(), origin.x()+selTickLabelOffset, axisRect.bottom()); + mLabelSelectionBox.setCoords(origin.x()+selLabelOffset+selLabelSize, axisRect.top(), origin.x()+selLabelOffset, axisRect.bottom()); + } else if (type == QCPAxis::atTop) + { + mAxisSelectionBox.setCoords(axisRect.left(), origin.y()-selAxisOutSize, axisRect.right(), origin.y()+selAxisInSize); + mTickLabelsSelectionBox.setCoords(axisRect.left(), origin.y()-selTickLabelOffset-selTickLabelSize, axisRect.right(), origin.y()-selTickLabelOffset); + mLabelSelectionBox.setCoords(axisRect.left(), origin.y()-selLabelOffset-selLabelSize, axisRect.right(), origin.y()-selLabelOffset); + } else if (type == QCPAxis::atBottom) + { + mAxisSelectionBox.setCoords(axisRect.left(), origin.y()-selAxisInSize, axisRect.right(), origin.y()+selAxisOutSize); + mTickLabelsSelectionBox.setCoords(axisRect.left(), origin.y()+selTickLabelOffset+selTickLabelSize, axisRect.right(), origin.y()+selTickLabelOffset); + mLabelSelectionBox.setCoords(axisRect.left(), origin.y()+selLabelOffset+selLabelSize, axisRect.right(), origin.y()+selLabelOffset); + } + mAxisSelectionBox = mAxisSelectionBox.normalized(); + mTickLabelsSelectionBox = mTickLabelsSelectionBox.normalized(); + mLabelSelectionBox = mLabelSelectionBox.normalized(); + // draw hitboxes for debug purposes: + //painter->setBrush(Qt::NoBrush); + //painter->drawRects(QVector() << mAxisSelectionBox << mTickLabelsSelectionBox << mLabelSelectionBox); +} + +/*! \internal + + Returns the size ("margin" in QCPAxisRect context, so measured perpendicular to the axis backbone + direction) needed to fit the axis. +*/ +int QCPAxisPainterPrivate::size() const +{ + int result = 0; + + // get length of tick marks pointing outwards: + if (!tickPositions.isEmpty()) + result += qMax(0, qMax(tickLengthOut, subTickLengthOut)); + + // calculate size of tick labels: + if (tickLabelSide == QCPAxis::lsOutside) + { + QSize tickLabelsSize(0, 0); + if (!tickLabels.isEmpty()) + { + for (int i=0; iplottingHints().testFlag(QCP::phCacheLabels) && !painter->modes().testFlag(QCPPainter::pmNoCaching)) // label caching enabled + { + CachedLabel *cachedLabel = mLabelCache.take(text); // attempt to get label from cache + if (!cachedLabel) // no cached label existed, create it + { + cachedLabel = new CachedLabel; + TickLabelData labelData = getTickLabelData(painter->font(), text); + cachedLabel->offset = getTickLabelDrawOffset(labelData)+labelData.rotatedTotalBounds.topLeft(); + cachedLabel->pixmap = QPixmap(labelData.rotatedTotalBounds.size()); + cachedLabel->pixmap.fill(Qt::transparent); + QCPPainter cachePainter(&cachedLabel->pixmap); + cachePainter.setPen(painter->pen()); + drawTickLabel(&cachePainter, -labelData.rotatedTotalBounds.topLeft().x(), -labelData.rotatedTotalBounds.topLeft().y(), labelData); + } + // if label would be partly clipped by widget border on sides, don't draw it (only for outside tick labels): + bool labelClippedByBorder = false; + if (tickLabelSide == QCPAxis::lsOutside) + { + if (QCPAxis::orientation(type) == Qt::Horizontal) + labelClippedByBorder = labelAnchor.x()+cachedLabel->offset.x()+cachedLabel->pixmap.width() > viewportRect.right() || labelAnchor.x()+cachedLabel->offset.x() < viewportRect.left(); + else + labelClippedByBorder = labelAnchor.y()+cachedLabel->offset.y()+cachedLabel->pixmap.height() > viewportRect.bottom() || labelAnchor.y()+cachedLabel->offset.y() < viewportRect.top(); + } + if (!labelClippedByBorder) + { + painter->drawPixmap(labelAnchor+cachedLabel->offset, cachedLabel->pixmap); + finalSize = cachedLabel->pixmap.size(); + } + mLabelCache.insert(text, cachedLabel); // return label to cache or insert for the first time if newly created + } else // label caching disabled, draw text directly on surface: + { + TickLabelData labelData = getTickLabelData(painter->font(), text); + QPointF finalPosition = labelAnchor + getTickLabelDrawOffset(labelData); + // if label would be partly clipped by widget border on sides, don't draw it (only for outside tick labels): + bool labelClippedByBorder = false; + if (tickLabelSide == QCPAxis::lsOutside) + { + if (QCPAxis::orientation(type) == Qt::Horizontal) + labelClippedByBorder = finalPosition.x()+(labelData.rotatedTotalBounds.width()+labelData.rotatedTotalBounds.left()) > viewportRect.right() || finalPosition.x()+labelData.rotatedTotalBounds.left() < viewportRect.left(); + else + labelClippedByBorder = finalPosition.y()+(labelData.rotatedTotalBounds.height()+labelData.rotatedTotalBounds.top()) > viewportRect.bottom() || finalPosition.y()+labelData.rotatedTotalBounds.top() < viewportRect.top(); + } + if (!labelClippedByBorder) + { + drawTickLabel(painter, finalPosition.x(), finalPosition.y(), labelData); + finalSize = labelData.rotatedTotalBounds.size(); + } + } + + // expand passed tickLabelsSize if current tick label is larger: + if (finalSize.width() > tickLabelsSize->width()) + tickLabelsSize->setWidth(finalSize.width()); + if (finalSize.height() > tickLabelsSize->height()) + tickLabelsSize->setHeight(finalSize.height()); +} + +/*! \internal + + This is a \ref placeTickLabel helper function. + + Draws the tick label specified in \a labelData with \a painter at the pixel positions \a x and \a + y. This function is used by \ref placeTickLabel to create new tick labels for the cache, or to + directly draw the labels on the QCustomPlot surface when label caching is disabled, i.e. when + QCP::phCacheLabels plotting hint is not set. +*/ +void QCPAxisPainterPrivate::drawTickLabel(QCPPainter *painter, double x, double y, const TickLabelData &labelData) const +{ + // backup painter settings that we're about to change: + QTransform oldTransform = painter->transform(); + QFont oldFont = painter->font(); + + // transform painter to position/rotation: + painter->translate(x, y); + if (!qFuzzyIsNull(tickLabelRotation)) + painter->rotate(tickLabelRotation); + + // draw text: + if (!labelData.expPart.isEmpty()) // indicator that beautiful powers must be used + { + painter->setFont(labelData.baseFont); + painter->drawText(0, 0, 0, 0, Qt::TextDontClip, labelData.basePart); + painter->setFont(labelData.expFont); + painter->drawText(labelData.baseBounds.width()+1, 0, labelData.expBounds.width(), labelData.expBounds.height(), Qt::TextDontClip, labelData.expPart); + } else + { + painter->setFont(labelData.baseFont); + painter->drawText(0, 0, labelData.totalBounds.width(), labelData.totalBounds.height(), Qt::TextDontClip | Qt::AlignHCenter, labelData.basePart); + } + + // reset painter settings to what it was before: + painter->setTransform(oldTransform); + painter->setFont(oldFont); +} + +/*! \internal + + This is a \ref placeTickLabel helper function. + + Transforms the passed \a text and \a font to a tickLabelData structure that can then be further + processed by \ref getTickLabelDrawOffset and \ref drawTickLabel. It splits the text into base and + exponent if necessary (member substituteExponent) and calculates appropriate bounding boxes. +*/ +QCPAxisPainterPrivate::TickLabelData QCPAxisPainterPrivate::getTickLabelData(const QFont &font, const QString &text) const +{ + TickLabelData result; + + // determine whether beautiful decimal powers should be used + bool useBeautifulPowers = false; + int ePos = -1; // first index of exponent part, text before that will be basePart, text until eLast will be expPart + int eLast = -1; // last index of exponent part, rest of text after this will be suffixPart + if (substituteExponent) + { + ePos = text.indexOf(QLatin1Char('e')); + if (ePos > 0 && text.at(ePos-1).isDigit()) + { + eLast = ePos; + while (eLast+1 < text.size() && (text.at(eLast+1) == QLatin1Char('+') || text.at(eLast+1) == QLatin1Char('-') || text.at(eLast+1).isDigit())) + ++eLast; + if (eLast > ePos) // only if also to right of 'e' is a digit/+/- interpret it as beautifiable power + useBeautifulPowers = true; + } + } + + // calculate text bounding rects and do string preparation for beautiful decimal powers: + result.baseFont = font; + if (result.baseFont.pointSizeF() > 0) // might return -1 if specified with setPixelSize, in that case we can't do correction in next line + result.baseFont.setPointSizeF(result.baseFont.pointSizeF()+0.05); // QFontMetrics.boundingRect has a bug for exact point sizes that make the results oscillate due to internal rounding + if (useBeautifulPowers) + { + // split text into parts of number/symbol that will be drawn normally and part that will be drawn as exponent: + result.basePart = text.left(ePos); + // in log scaling, we want to turn "1*10^n" into "10^n", else add multiplication sign and decimal base: + if (abbreviateDecimalPowers && result.basePart == QLatin1String("1")) + result.basePart = QLatin1String("10"); + else + result.basePart += (numberMultiplyCross ? QString(QChar(215)) : QString(QChar(183))) + QLatin1String("10"); + result.expPart = text.mid(ePos+1); + // clip "+" and leading zeros off expPart: + while (result.expPart.length() > 2 && result.expPart.at(1) == QLatin1Char('0')) // length > 2 so we leave one zero when numberFormatChar is 'e' + result.expPart.remove(1, 1); + if (!result.expPart.isEmpty() && result.expPart.at(0) == QLatin1Char('+')) + result.expPart.remove(0, 1); + // prepare smaller font for exponent: + result.expFont = font; + if (result.expFont.pointSize() > 0) + result.expFont.setPointSize(result.expFont.pointSize()*0.75); + else + result.expFont.setPixelSize(result.expFont.pixelSize()*0.75); + // calculate bounding rects of base part, exponent part and total one: + result.baseBounds = QFontMetrics(result.baseFont).boundingRect(0, 0, 0, 0, Qt::TextDontClip, result.basePart); + result.expBounds = QFontMetrics(result.expFont).boundingRect(0, 0, 0, 0, Qt::TextDontClip, result.expPart); + result.totalBounds = result.baseBounds.adjusted(0, 0, result.expBounds.width()+2, 0); // +2 consists of the 1 pixel spacing between base and exponent (see drawTickLabel) and an extra pixel to include AA + } else // useBeautifulPowers == false + { + result.basePart = text; + result.totalBounds = QFontMetrics(result.baseFont).boundingRect(0, 0, 0, 0, Qt::TextDontClip | Qt::AlignHCenter, result.basePart); + } + result.totalBounds.moveTopLeft(QPoint(0, 0)); // want bounding box aligned top left at origin, independent of how it was created, to make further processing simpler + + // calculate possibly different bounding rect after rotation: + result.rotatedTotalBounds = result.totalBounds; + if (!qFuzzyIsNull(tickLabelRotation)) + { + QTransform transform; + transform.rotate(tickLabelRotation); + result.rotatedTotalBounds = transform.mapRect(result.rotatedTotalBounds); + } + + return result; +} + +/*! \internal + + This is a \ref placeTickLabel helper function. + + Calculates the offset at which the top left corner of the specified tick label shall be drawn. + The offset is relative to a point right next to the tick the label belongs to. + + This function is thus responsible for e.g. centering tick labels under ticks and positioning them + appropriately when they are rotated. +*/ +QPointF QCPAxisPainterPrivate::getTickLabelDrawOffset(const TickLabelData &labelData) const +{ + /* + calculate label offset from base point at tick (non-trivial, for best visual appearance): short + explanation for bottom axis: The anchor, i.e. the point in the label that is placed + horizontally under the corresponding tick is always on the label side that is closer to the + axis (e.g. the left side of the text when we're rotating clockwise). On that side, the height + is halved and the resulting point is defined the anchor. This way, a 90 degree rotated text + will be centered under the tick (i.e. displaced horizontally by half its height). At the same + time, a 45 degree rotated text will "point toward" its tick, as is typical for rotated tick + labels. + */ + bool doRotation = !qFuzzyIsNull(tickLabelRotation); + bool flip = qFuzzyCompare(qAbs(tickLabelRotation), 90.0); // perfect +/-90 degree flip. Indicates vertical label centering on vertical axes. + double radians = tickLabelRotation/180.0*M_PI; + int x=0, y=0; + if ((type == QCPAxis::atLeft && tickLabelSide == QCPAxis::lsOutside) || (type == QCPAxis::atRight && tickLabelSide == QCPAxis::lsInside)) // Anchor at right side of tick label + { + if (doRotation) + { + if (tickLabelRotation > 0) + { + x = -qCos(radians)*labelData.totalBounds.width(); + y = flip ? -labelData.totalBounds.width()/2.0 : -qSin(radians)*labelData.totalBounds.width()-qCos(radians)*labelData.totalBounds.height()/2.0; + } else + { + x = -qCos(-radians)*labelData.totalBounds.width()-qSin(-radians)*labelData.totalBounds.height(); + y = flip ? +labelData.totalBounds.width()/2.0 : +qSin(-radians)*labelData.totalBounds.width()-qCos(-radians)*labelData.totalBounds.height()/2.0; + } + } else + { + x = -labelData.totalBounds.width(); + y = -labelData.totalBounds.height()/2.0; + } + } else if ((type == QCPAxis::atRight && tickLabelSide == QCPAxis::lsOutside) || (type == QCPAxis::atLeft && tickLabelSide == QCPAxis::lsInside)) // Anchor at left side of tick label + { + if (doRotation) + { + if (tickLabelRotation > 0) + { + x = +qSin(radians)*labelData.totalBounds.height(); + y = flip ? -labelData.totalBounds.width()/2.0 : -qCos(radians)*labelData.totalBounds.height()/2.0; + } else + { + x = 0; + y = flip ? +labelData.totalBounds.width()/2.0 : -qCos(-radians)*labelData.totalBounds.height()/2.0; + } + } else + { + x = 0; + y = -labelData.totalBounds.height()/2.0; + } + } else if ((type == QCPAxis::atTop && tickLabelSide == QCPAxis::lsOutside) || (type == QCPAxis::atBottom && tickLabelSide == QCPAxis::lsInside)) // Anchor at bottom side of tick label + { + if (doRotation) + { + if (tickLabelRotation > 0) + { + x = -qCos(radians)*labelData.totalBounds.width()+qSin(radians)*labelData.totalBounds.height()/2.0; + y = -qSin(radians)*labelData.totalBounds.width()-qCos(radians)*labelData.totalBounds.height(); + } else + { + x = -qSin(-radians)*labelData.totalBounds.height()/2.0; + y = -qCos(-radians)*labelData.totalBounds.height(); + } + } else + { + x = -labelData.totalBounds.width()/2.0; + y = -labelData.totalBounds.height(); + } + } else if ((type == QCPAxis::atBottom && tickLabelSide == QCPAxis::lsOutside) || (type == QCPAxis::atTop && tickLabelSide == QCPAxis::lsInside)) // Anchor at top side of tick label + { + if (doRotation) + { + if (tickLabelRotation > 0) + { + x = +qSin(radians)*labelData.totalBounds.height()/2.0; + y = 0; + } else + { + x = -qCos(-radians)*labelData.totalBounds.width()-qSin(-radians)*labelData.totalBounds.height()/2.0; + y = +qSin(-radians)*labelData.totalBounds.width(); + } + } else + { + x = -labelData.totalBounds.width()/2.0; + y = 0; + } + } + + return QPointF(x, y); +} + +/*! \internal + + Simulates the steps done by \ref placeTickLabel by calculating bounding boxes of the text label + to be drawn, depending on number format etc. Since only the largest tick label is wanted for the + margin calculation, the passed \a tickLabelsSize is only expanded, if it's currently set to a + smaller width/height. +*/ +void QCPAxisPainterPrivate::getMaxTickLabelSize(const QFont &font, const QString &text, QSize *tickLabelsSize) const +{ + // note: this function must return the same tick label sizes as the placeTickLabel function. + QSize finalSize; + if (mParentPlot->plottingHints().testFlag(QCP::phCacheLabels) && mLabelCache.contains(text)) // label caching enabled and have cached label + { + const CachedLabel *cachedLabel = mLabelCache.object(text); + finalSize = cachedLabel->pixmap.size(); + } else // label caching disabled or no label with this text cached: + { + TickLabelData labelData = getTickLabelData(font, text); + finalSize = labelData.rotatedTotalBounds.size(); + } + + // expand passed tickLabelsSize if current tick label is larger: + if (finalSize.width() > tickLabelsSize->width()) + tickLabelsSize->setWidth(finalSize.width()); + if (finalSize.height() > tickLabelsSize->height()) + tickLabelsSize->setHeight(finalSize.height()); +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPAbstractPlottable +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPAbstractPlottable + \brief The abstract base class for all data representing objects in a plot. + + It defines a very basic interface like name, pen, brush, visibility etc. Since this class is + abstract, it can't be instantiated. Use one of the subclasses or create a subclass yourself to + create new ways of displaying data (see "Creating own plottables" below). + + All further specifics are in the subclasses, for example: + \li A normal graph with possibly a line, scatter points and error bars: \ref QCPGraph + (typically created with \ref QCustomPlot::addGraph) + \li A parametric curve: \ref QCPCurve + \li A bar chart: \ref QCPBars + \li A statistical box plot: \ref QCPStatisticalBox + \li A color encoded two-dimensional map: \ref QCPColorMap + \li An OHLC/Candlestick chart: \ref QCPFinancial + + \section plottables-subclassing Creating own plottables + + To create an own plottable, you implement a subclass of QCPAbstractPlottable. These are the pure + virtual functions, you must implement: + \li \ref clearData + \li \ref selectTest + \li \ref draw + \li \ref drawLegendIcon + \li \ref getKeyRange + \li \ref getValueRange + + See the documentation of those functions for what they need to do. + + For drawing your plot, you can use the \ref coordsToPixels functions to translate a point in plot + coordinates to pixel coordinates. This function is quite convenient, because it takes the + orientation of the key and value axes into account for you (x and y are swapped when the key axis + is vertical and the value axis horizontal). If you are worried about performance (i.e. you need + to translate many points in a loop like QCPGraph), you can directly use \ref + QCPAxis::coordToPixel. However, you must then take care about the orientation of the axis + yourself. + + Here are some important members you inherit from QCPAbstractPlottable: + + + + + + + + + + + + + + + + + + + + + + + + + + +
QCustomPlot *\b mParentPlotA pointer to the parent QCustomPlot instance. The parent plot is inferred from the axes that are passed in the constructor.
QString \b mNameThe name of the plottable.
QPen \b mPenThe generic pen of the plottable. You should use this pen for the most prominent data representing lines in the plottable (e.g QCPGraph uses this pen for its graph lines and scatters)
QPen \b mSelectedPenThe generic pen that should be used when the plottable is selected (hint: \ref mainPen gives you the right pen, depending on selection state).
QBrush \b mBrushThe generic brush of the plottable. You should use this brush for the most prominent fillable structures in the plottable (e.g. QCPGraph uses this brush to control filling under the graph)
QBrush \b mSelectedBrushThe generic brush that should be used when the plottable is selected (hint: \ref mainBrush gives you the right brush, depending on selection state).
QPointer\b mKeyAxis, \b mValueAxisThe key and value axes this plottable is attached to. Call their QCPAxis::coordToPixel functions to translate coordinates to pixels in either the key or value dimension. + Make sure to check whether the pointer is null before using it. If one of the axes is null, don't draw the plottable.
bool \b mSelectedindicates whether the plottable is selected or not.
+*/ + +/* start of documentation of pure virtual functions */ + +/*! \fn void QCPAbstractPlottable::clearData() = 0 + Clears all data in the plottable. +*/ + +/*! \fn void QCPAbstractPlottable::drawLegendIcon(QCPPainter *painter, const QRect &rect) const = 0 + \internal + + called by QCPLegend::draw (via QCPPlottableLegendItem::draw) to create a graphical representation + of this plottable inside \a rect, next to the plottable name. + + The passed \a painter has its cliprect set to \a rect, so painting outside of \a rect won't + appear outside the legend icon border. +*/ + +/*! \fn QCPRange QCPAbstractPlottable::getKeyRange(bool &foundRange, SignDomain inSignDomain) const = 0 + \internal + + called by rescaleAxes functions to get the full data key bounds. For logarithmic plots, one can + set \a inSignDomain to either \ref sdNegative or \ref sdPositive in order to restrict the + returned range to that sign domain. E.g. when only negative range is wanted, set \a inSignDomain + to \ref sdNegative and all positive points will be ignored for range calculation. For no + restriction, just set \a inSignDomain to \ref sdBoth (default). \a foundRange is an output + parameter that indicates whether a range could be found or not. If this is false, you shouldn't + use the returned range (e.g. no points in data). + + Note that \a foundRange is not the same as \ref QCPRange::validRange, since the range returned by + this function may have size zero, which wouldn't count as a valid range. + + \see rescaleAxes, getValueRange +*/ + +/*! \fn QCPRange QCPAbstractPlottable::getValueRange(bool &foundRange, SignDomain inSignDomain) const = 0 + \internal + + called by rescaleAxes functions to get the full data value bounds. For logarithmic plots, one can + set \a inSignDomain to either \ref sdNegative or \ref sdPositive in order to restrict the + returned range to that sign domain. E.g. when only negative range is wanted, set \a inSignDomain + to \ref sdNegative and all positive points will be ignored for range calculation. For no + restriction, just set \a inSignDomain to \ref sdBoth (default). \a foundRange is an output + parameter that indicates whether a range could be found or not. If this is false, you shouldn't + use the returned range (e.g. no points in data). + + Note that \a foundRange is not the same as \ref QCPRange::validRange, since the range returned by + this function may have size zero, which wouldn't count as a valid range. + + \see rescaleAxes, getKeyRange +*/ + +/* end of documentation of pure virtual functions */ +/* start of documentation of signals */ + +/*! \fn void QCPAbstractPlottable::selectionChanged(bool selected) + + This signal is emitted when the selection state of this plottable has changed, either by user + interaction or by a direct call to \ref setSelected. +*/ + +/*! \fn void QCPAbstractPlottable::selectableChanged(bool selectable); + + This signal is emitted when the selectability of this plottable has changed. + + \see setSelectable +*/ + +/* end of documentation of signals */ + +/*! + Constructs an abstract plottable which uses \a keyAxis as its key axis ("x") and \a valueAxis as + its value axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance + and have perpendicular orientations. If either of these restrictions is violated, a corresponding + message is printed to the debug output (qDebug), the construction is not aborted, though. + + Since QCPAbstractPlottable is an abstract class that defines the basic interface to plottables, + it can't be directly instantiated. + + You probably want one of the subclasses like \ref QCPGraph or \ref QCPCurve instead. +*/ +QCPAbstractPlottable::QCPAbstractPlottable(QCPAxis *keyAxis, QCPAxis *valueAxis) : + QCPLayerable(keyAxis->parentPlot(), QString(), keyAxis->axisRect()), + mName(), + mAntialiasedFill(true), + mAntialiasedScatters(true), + mAntialiasedErrorBars(false), + mPen(Qt::black), + mSelectedPen(Qt::black), + mBrush(Qt::NoBrush), + mSelectedBrush(Qt::NoBrush), + mKeyAxis(keyAxis), + mValueAxis(valueAxis), + mSelectable(true), + mSelected(false) +{ + if (keyAxis->parentPlot() != valueAxis->parentPlot()) + qDebug() << Q_FUNC_INFO << "Parent plot of keyAxis is not the same as that of valueAxis."; + if (keyAxis->orientation() == valueAxis->orientation()) + qDebug() << Q_FUNC_INFO << "keyAxis and valueAxis must be orthogonal to each other."; +} + +/*! + The name is the textual representation of this plottable as it is displayed in the legend + (\ref QCPLegend). It may contain any UTF-8 characters, including newlines. +*/ +void QCPAbstractPlottable::setName(const QString &name) +{ + mName = name; +} + +/*! + Sets whether fills of this plottable are drawn antialiased or not. + + Note that this setting may be overridden by \ref QCustomPlot::setAntialiasedElements and \ref + QCustomPlot::setNotAntialiasedElements. +*/ +void QCPAbstractPlottable::setAntialiasedFill(bool enabled) +{ + mAntialiasedFill = enabled; +} + +/*! + Sets whether the scatter symbols of this plottable are drawn antialiased or not. + + Note that this setting may be overridden by \ref QCustomPlot::setAntialiasedElements and \ref + QCustomPlot::setNotAntialiasedElements. +*/ +void QCPAbstractPlottable::setAntialiasedScatters(bool enabled) +{ + mAntialiasedScatters = enabled; +} + +/*! + Sets whether the error bars of this plottable are drawn antialiased or not. + + Note that this setting may be overridden by \ref QCustomPlot::setAntialiasedElements and \ref + QCustomPlot::setNotAntialiasedElements. +*/ +void QCPAbstractPlottable::setAntialiasedErrorBars(bool enabled) +{ + mAntialiasedErrorBars = enabled; +} + + +/*! + The pen is used to draw basic lines that make up the plottable representation in the + plot. + + For example, the \ref QCPGraph subclass draws its graph lines with this pen. + + \see setBrush +*/ +void QCPAbstractPlottable::setPen(const QPen &pen) +{ + mPen = pen; +} + +/*! + When the plottable is selected, this pen is used to draw basic lines instead of the normal + pen set via \ref setPen. + + \see setSelected, setSelectable, setSelectedBrush, selectTest +*/ +void QCPAbstractPlottable::setSelectedPen(const QPen &pen) +{ + mSelectedPen = pen; +} + +/*! + The brush is used to draw basic fills of the plottable representation in the + plot. The Fill can be a color, gradient or texture, see the usage of QBrush. + + For example, the \ref QCPGraph subclass draws the fill under the graph with this brush, when + it's not set to Qt::NoBrush. + + \see setPen +*/ +void QCPAbstractPlottable::setBrush(const QBrush &brush) +{ + mBrush = brush; +} + +/*! + When the plottable is selected, this brush is used to draw fills instead of the normal + brush set via \ref setBrush. + + \see setSelected, setSelectable, setSelectedPen, selectTest +*/ +void QCPAbstractPlottable::setSelectedBrush(const QBrush &brush) +{ + mSelectedBrush = brush; +} + +/*! + The key axis of a plottable can be set to any axis of a QCustomPlot, as long as it is orthogonal + to the plottable's value axis. This function performs no checks to make sure this is the case. + The typical mathematical choice is to use the x-axis (QCustomPlot::xAxis) as key axis and the + y-axis (QCustomPlot::yAxis) as value axis. + + Normally, the key and value axes are set in the constructor of the plottable (or \ref + QCustomPlot::addGraph when working with QCPGraphs through the dedicated graph interface). + + \see setValueAxis +*/ +void QCPAbstractPlottable::setKeyAxis(QCPAxis *axis) +{ + mKeyAxis = axis; +} + +/*! + The value axis of a plottable can be set to any axis of a QCustomPlot, as long as it is + orthogonal to the plottable's key axis. This function performs no checks to make sure this is the + case. The typical mathematical choice is to use the x-axis (QCustomPlot::xAxis) as key axis and + the y-axis (QCustomPlot::yAxis) as value axis. + + Normally, the key and value axes are set in the constructor of the plottable (or \ref + QCustomPlot::addGraph when working with QCPGraphs through the dedicated graph interface). + + \see setKeyAxis +*/ +void QCPAbstractPlottable::setValueAxis(QCPAxis *axis) +{ + mValueAxis = axis; +} + +/*! + Sets whether the user can (de-)select this plottable by clicking on the QCustomPlot surface. + (When \ref QCustomPlot::setInteractions contains iSelectPlottables.) + + However, even when \a selectable was set to false, it is possible to set the selection manually, + by calling \ref setSelected directly. + + \see setSelected +*/ +void QCPAbstractPlottable::setSelectable(bool selectable) +{ + if (mSelectable != selectable) + { + mSelectable = selectable; + emit selectableChanged(mSelectable); + } +} + +/*! + Sets whether this plottable is selected or not. When selected, it uses a different pen and brush + to draw its lines and fills, see \ref setSelectedPen and \ref setSelectedBrush. + + The entire selection mechanism for plottables is handled automatically when \ref + QCustomPlot::setInteractions contains iSelectPlottables. You only need to call this function when + you wish to change the selection state manually. + + This function can change the selection state even when \ref setSelectable was set to false. + + emits the \ref selectionChanged signal when \a selected is different from the previous selection state. + + \see setSelectable, selectTest +*/ +void QCPAbstractPlottable::setSelected(bool selected) +{ + if (mSelected != selected) + { + mSelected = selected; + emit selectionChanged(mSelected); + } +} + +/*! + Rescales the key and value axes associated with this plottable to contain all displayed data, so + the whole plottable is visible. If the scaling of an axis is logarithmic, rescaleAxes will make + sure not to rescale to an illegal range i.e. a range containing different signs and/or zero. + Instead it will stay in the current sign domain and ignore all parts of the plottable that lie + outside of that domain. + + \a onlyEnlarge makes sure the ranges are only expanded, never reduced. So it's possible to show + multiple plottables in their entirety by multiple calls to rescaleAxes where the first call has + \a onlyEnlarge set to false (the default), and all subsequent set to true. + + \see rescaleKeyAxis, rescaleValueAxis, QCustomPlot::rescaleAxes, QCPAxis::rescale +*/ +void QCPAbstractPlottable::rescaleAxes(bool onlyEnlarge) const +{ + rescaleKeyAxis(onlyEnlarge); + rescaleValueAxis(onlyEnlarge); +} + +/*! + Rescales the key axis of the plottable so the whole plottable is visible. + + See \ref rescaleAxes for detailed behaviour. +*/ +void QCPAbstractPlottable::rescaleKeyAxis(bool onlyEnlarge) const +{ + QCPAxis *keyAxis = mKeyAxis.data(); + if (!keyAxis) { qDebug() << Q_FUNC_INFO << "invalid key axis"; return; } + + SignDomain signDomain = sdBoth; + if (keyAxis->scaleType() == QCPAxis::stLogarithmic) + signDomain = (keyAxis->range().upper < 0 ? sdNegative : sdPositive); + + bool foundRange; + QCPRange newRange = getKeyRange(foundRange, signDomain); + if (foundRange) + { + if (onlyEnlarge) + newRange.expand(keyAxis->range()); + if (!QCPRange::validRange(newRange)) // likely due to range being zero (plottable has only constant data in this axis dimension), shift current range to at least center the plottable + { + double center = (newRange.lower+newRange.upper)*0.5; // upper and lower should be equal anyway, but just to make sure, incase validRange returned false for other reason + if (keyAxis->scaleType() == QCPAxis::stLinear) + { + newRange.lower = center-keyAxis->range().size()/2.0; + newRange.upper = center+keyAxis->range().size()/2.0; + } else // scaleType() == stLogarithmic + { + newRange.lower = center/qSqrt(keyAxis->range().upper/keyAxis->range().lower); + newRange.upper = center*qSqrt(keyAxis->range().upper/keyAxis->range().lower); + } + } + keyAxis->setRange(newRange); + } +} + +/*! + Rescales the value axis of the plottable so the whole plottable is visible. + + Returns true if the axis was actually scaled. This might not be the case if this plottable has an + invalid range, e.g. because it has no data points. + + See \ref rescaleAxes for detailed behaviour. +*/ +void QCPAbstractPlottable::rescaleValueAxis(bool onlyEnlarge) const +{ + QCPAxis *valueAxis = mValueAxis.data(); + if (!valueAxis) { qDebug() << Q_FUNC_INFO << "invalid value axis"; return; } + + SignDomain signDomain = sdBoth; + if (valueAxis->scaleType() == QCPAxis::stLogarithmic) + signDomain = (valueAxis->range().upper < 0 ? sdNegative : sdPositive); + + bool foundRange; + QCPRange newRange = getValueRange(foundRange, signDomain); + if (foundRange) + { + if (onlyEnlarge) + newRange.expand(valueAxis->range()); + if (!QCPRange::validRange(newRange)) // likely due to range being zero (plottable has only constant data in this axis dimension), shift current range to at least center the plottable + { + double center = (newRange.lower+newRange.upper)*0.5; // upper and lower should be equal anyway, but just to make sure, incase validRange returned false for other reason + if (valueAxis->scaleType() == QCPAxis::stLinear) + { + newRange.lower = center-valueAxis->range().size()/2.0; + newRange.upper = center+valueAxis->range().size()/2.0; + } else // scaleType() == stLogarithmic + { + newRange.lower = center/qSqrt(valueAxis->range().upper/valueAxis->range().lower); + newRange.upper = center*qSqrt(valueAxis->range().upper/valueAxis->range().lower); + } + } + valueAxis->setRange(newRange); + } +} + +/*! + Adds this plottable to the legend of the parent QCustomPlot (QCustomPlot::legend). + + Normally, a QCPPlottableLegendItem is created and inserted into the legend. If the plottable + needs a more specialized representation in the legend, this function will take this into account + and instead create the specialized subclass of QCPAbstractLegendItem. + + Returns true on success, i.e. when the legend exists and a legend item associated with this plottable isn't already in + the legend. + + \see removeFromLegend, QCPLegend::addItem +*/ +bool QCPAbstractPlottable::addToLegend() +{ + if (!mParentPlot || !mParentPlot->legend) + return false; + + if (!mParentPlot->legend->hasItemWithPlottable(this)) + { + mParentPlot->legend->addItem(new QCPPlottableLegendItem(mParentPlot->legend, this)); + return true; + } else + return false; +} + +/*! + Removes the plottable from the legend of the parent QCustomPlot. This means the + QCPAbstractLegendItem (usually a QCPPlottableLegendItem) that is associated with this plottable + is removed. + + Returns true on success, i.e. if the legend exists and a legend item associated with this + plottable was found and removed. + + \see addToLegend, QCPLegend::removeItem +*/ +bool QCPAbstractPlottable::removeFromLegend() const +{ + if (!mParentPlot->legend) + return false; + + if (QCPPlottableLegendItem *lip = mParentPlot->legend->itemWithPlottable(this)) + return mParentPlot->legend->removeItem(lip); + else + return false; +} + +/* inherits documentation from base class */ +QRect QCPAbstractPlottable::clipRect() const +{ + if (mKeyAxis && mValueAxis) + return mKeyAxis.data()->axisRect()->rect() & mValueAxis.data()->axisRect()->rect(); + else + return QRect(); +} + +/* inherits documentation from base class */ +QCP::Interaction QCPAbstractPlottable::selectionCategory() const +{ + return QCP::iSelectPlottables; +} + +/*! \internal + + Convenience function for transforming a key/value pair to pixels on the QCustomPlot surface, + taking the orientations of the axes associated with this plottable into account (e.g. whether key + represents x or y). + + \a key and \a value are transformed to the coodinates in pixels and are written to \a x and \a y. + + \see pixelsToCoords, QCPAxis::coordToPixel +*/ +void QCPAbstractPlottable::coordsToPixels(double key, double value, double &x, double &y) const +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } + + if (keyAxis->orientation() == Qt::Horizontal) + { + x = keyAxis->coordToPixel(key); + y = valueAxis->coordToPixel(value); + } else + { + y = keyAxis->coordToPixel(key); + x = valueAxis->coordToPixel(value); + } +} + +/*! \internal + \overload + + Returns the input as pixel coordinates in a QPointF. +*/ +const QPointF QCPAbstractPlottable::coordsToPixels(double key, double value) const +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QPointF(); } + + if (keyAxis->orientation() == Qt::Horizontal) + return QPointF(keyAxis->coordToPixel(key), valueAxis->coordToPixel(value)); + else + return QPointF(valueAxis->coordToPixel(value), keyAxis->coordToPixel(key)); +} + +/*! \internal + + Convenience function for transforming a x/y pixel pair on the QCustomPlot surface to plot coordinates, + taking the orientations of the axes associated with this plottable into account (e.g. whether key + represents x or y). + + \a x and \a y are transformed to the plot coodinates and are written to \a key and \a value. + + \see coordsToPixels, QCPAxis::coordToPixel +*/ +void QCPAbstractPlottable::pixelsToCoords(double x, double y, double &key, double &value) const +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } + + if (keyAxis->orientation() == Qt::Horizontal) + { + key = keyAxis->pixelToCoord(x); + value = valueAxis->pixelToCoord(y); + } else + { + key = keyAxis->pixelToCoord(y); + value = valueAxis->pixelToCoord(x); + } +} + +/*! \internal + \overload + + Returns the pixel input \a pixelPos as plot coordinates \a key and \a value. +*/ +void QCPAbstractPlottable::pixelsToCoords(const QPointF &pixelPos, double &key, double &value) const +{ + pixelsToCoords(pixelPos.x(), pixelPos.y(), key, value); +} + +/*! \internal + + Returns the pen that should be used for drawing lines of the plottable. Returns mPen when the + graph is not selected and mSelectedPen when it is. +*/ +QPen QCPAbstractPlottable::mainPen() const +{ + return mSelected ? mSelectedPen : mPen; +} + +/*! \internal + + Returns the brush that should be used for drawing fills of the plottable. Returns mBrush when the + graph is not selected and mSelectedBrush when it is. +*/ +QBrush QCPAbstractPlottable::mainBrush() const +{ + return mSelected ? mSelectedBrush : mBrush; +} + +/*! \internal + + A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter + before drawing plottable lines. + + This is the antialiasing state the painter passed to the \ref draw method is in by default. + + This function takes into account the local setting of the antialiasing flag as well as the + overrides set with \ref QCustomPlot::setAntialiasedElements and \ref + QCustomPlot::setNotAntialiasedElements. + + \see setAntialiased, applyFillAntialiasingHint, applyScattersAntialiasingHint, applyErrorBarsAntialiasingHint +*/ +void QCPAbstractPlottable::applyDefaultAntialiasingHint(QCPPainter *painter) const +{ + applyAntialiasingHint(painter, mAntialiased, QCP::aePlottables); +} + +/*! \internal + + A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter + before drawing plottable fills. + + This function takes into account the local setting of the antialiasing flag as well as the + overrides set with \ref QCustomPlot::setAntialiasedElements and \ref + QCustomPlot::setNotAntialiasedElements. + + \see setAntialiased, applyDefaultAntialiasingHint, applyScattersAntialiasingHint, applyErrorBarsAntialiasingHint +*/ +void QCPAbstractPlottable::applyFillAntialiasingHint(QCPPainter *painter) const +{ + applyAntialiasingHint(painter, mAntialiasedFill, QCP::aeFills); +} + +/*! \internal + + A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter + before drawing plottable scatter points. + + This function takes into account the local setting of the antialiasing flag as well as the + overrides set with \ref QCustomPlot::setAntialiasedElements and \ref + QCustomPlot::setNotAntialiasedElements. + + \see setAntialiased, applyFillAntialiasingHint, applyDefaultAntialiasingHint, applyErrorBarsAntialiasingHint +*/ +void QCPAbstractPlottable::applyScattersAntialiasingHint(QCPPainter *painter) const +{ + applyAntialiasingHint(painter, mAntialiasedScatters, QCP::aeScatters); +} + +/*! \internal + + A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter + before drawing plottable error bars. + + This function takes into account the local setting of the antialiasing flag as well as the + overrides set with \ref QCustomPlot::setAntialiasedElements and \ref + QCustomPlot::setNotAntialiasedElements. + + \see setAntialiased, applyFillAntialiasingHint, applyScattersAntialiasingHint, applyDefaultAntialiasingHint +*/ +void QCPAbstractPlottable::applyErrorBarsAntialiasingHint(QCPPainter *painter) const +{ + applyAntialiasingHint(painter, mAntialiasedErrorBars, QCP::aeErrorBars); +} + +/*! \internal + + Finds the shortest squared distance of \a point to the line segment defined by \a start and \a + end. + + This function may be used to help with the implementation of the \ref selectTest function for + specific plottables. + + \note This function is identical to QCPAbstractItem::distSqrToLine +*/ +double QCPAbstractPlottable::distSqrToLine(const QPointF &start, const QPointF &end, const QPointF &point) const +{ + QVector2D a(start); + QVector2D b(end); + QVector2D p(point); + QVector2D v(b-a); + + double vLengthSqr = v.lengthSquared(); + if (!qFuzzyIsNull(vLengthSqr)) + { + double mu = QVector2D::dotProduct(p-a, v)/vLengthSqr; + if (mu < 0) + return (a-p).lengthSquared(); + else if (mu > 1) + return (b-p).lengthSquared(); + else + return ((a + mu*v)-p).lengthSquared(); + } else + return (a-p).lengthSquared(); +} + +/* inherits documentation from base class */ +void QCPAbstractPlottable::selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged) +{ + Q_UNUSED(event) + Q_UNUSED(details) + if (mSelectable) + { + bool selBefore = mSelected; + setSelected(additive ? !mSelected : true); + if (selectionStateChanged) + *selectionStateChanged = mSelected != selBefore; + } +} + +/* inherits documentation from base class */ +void QCPAbstractPlottable::deselectEvent(bool *selectionStateChanged) +{ + if (mSelectable) + { + bool selBefore = mSelected; + setSelected(false); + if (selectionStateChanged) + *selectionStateChanged = mSelected != selBefore; + } +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPItemAnchor +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPItemAnchor + \brief An anchor of an item to which positions can be attached to. + + An item (QCPAbstractItem) may have one or more anchors. Unlike QCPItemPosition, an anchor doesn't + control anything on its item, but provides a way to tie other items via their positions to the + anchor. + + For example, a QCPItemRect is defined by its positions \a topLeft and \a bottomRight. + Additionally it has various anchors like \a top, \a topRight or \a bottomLeft etc. So you can + attach the \a start (which is a QCPItemPosition) of a QCPItemLine to one of the anchors by + calling QCPItemPosition::setParentAnchor on \a start, passing the wanted anchor of the + QCPItemRect. This way the start of the line will now always follow the respective anchor location + on the rect item. + + Note that QCPItemPosition derives from QCPItemAnchor, so every position can also serve as an + anchor to other positions. + + To learn how to provide anchors in your own item subclasses, see the subclassing section of the + QCPAbstractItem documentation. +*/ + +/* start documentation of inline functions */ + +/*! \fn virtual QCPItemPosition *QCPItemAnchor::toQCPItemPosition() + + Returns 0 if this instance is merely a QCPItemAnchor, and a valid pointer of type QCPItemPosition* if + it actually is a QCPItemPosition (which is a subclass of QCPItemAnchor). + + This safe downcast functionality could also be achieved with a dynamic_cast. However, QCustomPlot avoids + dynamic_cast to work with projects that don't have RTTI support enabled (e.g. -fno-rtti flag with + gcc compiler). +*/ + +/* end documentation of inline functions */ + +/*! + Creates a new QCPItemAnchor. You shouldn't create QCPItemAnchor instances directly, even if + you want to make a new item subclass. Use \ref QCPAbstractItem::createAnchor instead, as + explained in the subclassing section of the QCPAbstractItem documentation. +*/ +QCPItemAnchor::QCPItemAnchor(QCustomPlot *parentPlot, QCPAbstractItem *parentItem, const QString name, int anchorId) : + mName(name), + mParentPlot(parentPlot), + mParentItem(parentItem), + mAnchorId(anchorId) +{ +} + +QCPItemAnchor::~QCPItemAnchor() +{ + // unregister as parent at children: + foreach (QCPItemPosition *child, mChildrenX.toList()) + { + if (child->parentAnchorX() == this) + child->setParentAnchorX(0); // this acts back on this anchor and child removes itself from mChildrenX + } + foreach (QCPItemPosition *child, mChildrenY.toList()) + { + if (child->parentAnchorY() == this) + child->setParentAnchorY(0); // this acts back on this anchor and child removes itself from mChildrenY + } +} + +/*! + Returns the final absolute pixel position of the QCPItemAnchor on the QCustomPlot surface. + + The pixel information is internally retrieved via QCPAbstractItem::anchorPixelPosition of the + parent item, QCPItemAnchor is just an intermediary. +*/ +QPointF QCPItemAnchor::pixelPoint() const +{ + if (mParentItem) + { + if (mAnchorId > -1) + { + return mParentItem->anchorPixelPoint(mAnchorId); + } else + { + qDebug() << Q_FUNC_INFO << "no valid anchor id set:" << mAnchorId; + return QPointF(); + } + } else + { + qDebug() << Q_FUNC_INFO << "no parent item set"; + return QPointF(); + } +} + +/*! \internal + + Adds \a pos to the childX list of this anchor, which keeps track of which children use this + anchor as parent anchor for the respective coordinate. This is necessary to notify the children + prior to destruction of the anchor. + + Note that this function does not change the parent setting in \a pos. +*/ +void QCPItemAnchor::addChildX(QCPItemPosition *pos) +{ + if (!mChildrenX.contains(pos)) + mChildrenX.insert(pos); + else + qDebug() << Q_FUNC_INFO << "provided pos is child already" << reinterpret_cast(pos); +} + +/*! \internal + + Removes \a pos from the childX list of this anchor. + + Note that this function does not change the parent setting in \a pos. +*/ +void QCPItemAnchor::removeChildX(QCPItemPosition *pos) +{ + if (!mChildrenX.remove(pos)) + qDebug() << Q_FUNC_INFO << "provided pos isn't child" << reinterpret_cast(pos); +} + +/*! \internal + + Adds \a pos to the childY list of this anchor, which keeps track of which children use this + anchor as parent anchor for the respective coordinate. This is necessary to notify the children + prior to destruction of the anchor. + + Note that this function does not change the parent setting in \a pos. +*/ +void QCPItemAnchor::addChildY(QCPItemPosition *pos) +{ + if (!mChildrenY.contains(pos)) + mChildrenY.insert(pos); + else + qDebug() << Q_FUNC_INFO << "provided pos is child already" << reinterpret_cast(pos); +} + +/*! \internal + + Removes \a pos from the childY list of this anchor. + + Note that this function does not change the parent setting in \a pos. +*/ +void QCPItemAnchor::removeChildY(QCPItemPosition *pos) +{ + if (!mChildrenY.remove(pos)) + qDebug() << Q_FUNC_INFO << "provided pos isn't child" << reinterpret_cast(pos); +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPItemPosition +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPItemPosition + \brief Manages the position of an item. + + Every item has at least one public QCPItemPosition member pointer which provides ways to position the + item on the QCustomPlot surface. Some items have multiple positions, for example QCPItemRect has two: + \a topLeft and \a bottomRight. + + QCPItemPosition has a type (\ref PositionType) that can be set with \ref setType. This type + defines how coordinates passed to \ref setCoords are to be interpreted, e.g. as absolute pixel + coordinates, as plot coordinates of certain axes, etc. For more advanced plots it is also + possible to assign different types per X/Y coordinate of the position (see \ref setTypeX, \ref + setTypeY). This way an item could be positioned at a fixed pixel distance from the top in the Y + direction, while following a plot coordinate in the X direction. + + A QCPItemPosition may have a parent QCPItemAnchor, see \ref setParentAnchor. This way you can tie + multiple items together. If the QCPItemPosition has a parent, its coordinates (\ref setCoords) + are considered to be absolute pixels in the reference frame of the parent anchor, where (0, 0) + means directly ontop of the parent anchor. For example, You could attach the \a start position of + a QCPItemLine to the \a bottom anchor of a QCPItemText to make the starting point of the line + always be centered under the text label, no matter where the text is moved to. For more advanced + plots, it is possible to assign different parent anchors per X/Y coordinate of the position, see + \ref setParentAnchorX, \ref setParentAnchorY. This way an item could follow another item in the X + direction but stay at a fixed position in the Y direction. Or even follow item A in X, and item B + in Y. + + Note that every QCPItemPosition inherits from QCPItemAnchor and thus can itself be used as parent + anchor for other positions. + + To set the apparent pixel position on the QCustomPlot surface directly, use \ref setPixelPoint. This + works no matter what type this QCPItemPosition is or what parent-child situation it is in, as \ref + setPixelPoint transforms the coordinates appropriately, to make the position appear at the specified + pixel values. +*/ + +/* start documentation of inline functions */ + +/*! \fn QCPItemPosition::PositionType *QCPItemPosition::type() const + + Returns the current position type. + + If different types were set for X and Y (\ref setTypeX, \ref setTypeY), this method returns the + type of the X coordinate. In that case rather use \a typeX() and \a typeY(). + + \see setType +*/ + +/*! \fn QCPItemAnchor *QCPItemPosition::parentAnchor() const + + Returns the current parent anchor. + + If different parent anchors were set for X and Y (\ref setParentAnchorX, \ref setParentAnchorY), + this method returns the parent anchor of the Y coordinate. In that case rather use \a + parentAnchorX() and \a parentAnchorY(). + + \see setParentAnchor +*/ + +/* end documentation of inline functions */ + +/*! + Creates a new QCPItemPosition. You shouldn't create QCPItemPosition instances directly, even if + you want to make a new item subclass. Use \ref QCPAbstractItem::createPosition instead, as + explained in the subclassing section of the QCPAbstractItem documentation. +*/ +QCPItemPosition::QCPItemPosition(QCustomPlot *parentPlot, QCPAbstractItem *parentItem, const QString name) : + QCPItemAnchor(parentPlot, parentItem, name), + mPositionTypeX(ptAbsolute), + mPositionTypeY(ptAbsolute), + mKey(0), + mValue(0), + mParentAnchorX(0), + mParentAnchorY(0) +{ +} + +QCPItemPosition::~QCPItemPosition() +{ + // unregister as parent at children: + // Note: this is done in ~QCPItemAnchor again, but it's important QCPItemPosition does it itself, because only then + // the setParentAnchor(0) call the correct QCPItemPosition::pixelPoint function instead of QCPItemAnchor::pixelPoint + foreach (QCPItemPosition *child, mChildrenX.toList()) + { + if (child->parentAnchorX() == this) + child->setParentAnchorX(0); // this acts back on this anchor and child removes itself from mChildrenX + } + foreach (QCPItemPosition *child, mChildrenY.toList()) + { + if (child->parentAnchorY() == this) + child->setParentAnchorY(0); // this acts back on this anchor and child removes itself from mChildrenY + } + // unregister as child in parent: + if (mParentAnchorX) + mParentAnchorX->removeChildX(this); + if (mParentAnchorY) + mParentAnchorY->removeChildY(this); +} + +/* can't make this a header inline function, because QPointer breaks with forward declared types, see QTBUG-29588 */ +QCPAxisRect *QCPItemPosition::axisRect() const +{ + return mAxisRect.data(); +} + +/*! + Sets the type of the position. The type defines how the coordinates passed to \ref setCoords + should be handled and how the QCPItemPosition should behave in the plot. + + The possible values for \a type can be separated in two main categories: + + \li The position is regarded as a point in plot coordinates. This corresponds to \ref ptPlotCoords + and requires two axes that define the plot coordinate system. They can be specified with \ref setAxes. + By default, the QCustomPlot's x- and yAxis are used. + + \li The position is fixed on the QCustomPlot surface, i.e. independent of axis ranges. This + corresponds to all other types, i.e. \ref ptAbsolute, \ref ptViewportRatio and \ref + ptAxisRectRatio. They differ only in the way the absolute position is described, see the + documentation of \ref PositionType for details. For \ref ptAxisRectRatio, note that you can specify + the axis rect with \ref setAxisRect. By default this is set to the main axis rect. + + Note that the position type \ref ptPlotCoords is only available (and sensible) when the position + has no parent anchor (\ref setParentAnchor). + + If the type is changed, the apparent pixel position on the plot is preserved. This means + the coordinates as retrieved with coords() and set with \ref setCoords may change in the process. + + This method sets the type for both X and Y directions. It is also possible to set different types + for X and Y, see \ref setTypeX, \ref setTypeY. +*/ +void QCPItemPosition::setType(QCPItemPosition::PositionType type) +{ + setTypeX(type); + setTypeY(type); +} + +/*! + This method sets the position type of the X coordinate to \a type. + + For a detailed description of what a position type is, see the documentation of \ref setType. + + \see setType, setTypeY +*/ +void QCPItemPosition::setTypeX(QCPItemPosition::PositionType type) +{ + if (mPositionTypeX != type) + { + // if switching from or to coordinate type that isn't valid (e.g. because axes or axis rect + // were deleted), don't try to recover the pixelPoint() because it would output a qDebug warning. + bool retainPixelPosition = true; + if ((mPositionTypeX == ptPlotCoords || type == ptPlotCoords) && (!mKeyAxis || !mValueAxis)) + retainPixelPosition = false; + if ((mPositionTypeX == ptAxisRectRatio || type == ptAxisRectRatio) && (!mAxisRect)) + retainPixelPosition = false; + + QPointF pixel; + if (retainPixelPosition) + pixel = pixelPoint(); + + mPositionTypeX = type; + + if (retainPixelPosition) + setPixelPoint(pixel); + } +} + +/*! + This method sets the position type of the Y coordinate to \a type. + + For a detailed description of what a position type is, see the documentation of \ref setType. + + \see setType, setTypeX +*/ +void QCPItemPosition::setTypeY(QCPItemPosition::PositionType type) +{ + if (mPositionTypeY != type) + { + // if switching from or to coordinate type that isn't valid (e.g. because axes or axis rect + // were deleted), don't try to recover the pixelPoint() because it would output a qDebug warning. + bool retainPixelPosition = true; + if ((mPositionTypeY == ptPlotCoords || type == ptPlotCoords) && (!mKeyAxis || !mValueAxis)) + retainPixelPosition = false; + if ((mPositionTypeY == ptAxisRectRatio || type == ptAxisRectRatio) && (!mAxisRect)) + retainPixelPosition = false; + + QPointF pixel; + if (retainPixelPosition) + pixel = pixelPoint(); + + mPositionTypeY = type; + + if (retainPixelPosition) + setPixelPoint(pixel); + } +} + +/*! + Sets the parent of this QCPItemPosition to \a parentAnchor. This means the position will now + follow any position changes of the anchor. The local coordinate system of positions with a parent + anchor always is absolute pixels, with (0, 0) being exactly on top of the parent anchor. (Hence + the type shouldn't be set to \ref ptPlotCoords for positions with parent anchors.) + + if \a keepPixelPosition is true, the current pixel position of the QCPItemPosition is preserved + during reparenting. If it's set to false, the coordinates are set to (0, 0), i.e. the position + will be exactly on top of the parent anchor. + + To remove this QCPItemPosition from any parent anchor, set \a parentAnchor to 0. + + If the QCPItemPosition previously had no parent and the type is \ref ptPlotCoords, the type is + set to \ref ptAbsolute, to keep the position in a valid state. + + This method sets the parent anchor for both X and Y directions. It is also possible to set + different parents for X and Y, see \ref setParentAnchorX, \ref setParentAnchorY. +*/ +bool QCPItemPosition::setParentAnchor(QCPItemAnchor *parentAnchor, bool keepPixelPosition) +{ + bool successX = setParentAnchorX(parentAnchor, keepPixelPosition); + bool successY = setParentAnchorY(parentAnchor, keepPixelPosition); + return successX && successY; +} + +/*! + This method sets the parent anchor of the X coordinate to \a parentAnchor. + + For a detailed description of what a parent anchor is, see the documentation of \ref setParentAnchor. + + \see setParentAnchor, setParentAnchorY +*/ +bool QCPItemPosition::setParentAnchorX(QCPItemAnchor *parentAnchor, bool keepPixelPosition) +{ + // make sure self is not assigned as parent: + if (parentAnchor == this) + { + qDebug() << Q_FUNC_INFO << "can't set self as parent anchor" << reinterpret_cast(parentAnchor); + return false; + } + // make sure no recursive parent-child-relationships are created: + QCPItemAnchor *currentParent = parentAnchor; + while (currentParent) + { + if (QCPItemPosition *currentParentPos = currentParent->toQCPItemPosition()) + { + // is a QCPItemPosition, might have further parent, so keep iterating + if (currentParentPos == this) + { + qDebug() << Q_FUNC_INFO << "can't create recursive parent-child-relationship" << reinterpret_cast(parentAnchor); + return false; + } + currentParent = currentParentPos->parentAnchorX(); + } else + { + // is a QCPItemAnchor, can't have further parent. Now make sure the parent items aren't the + // same, to prevent a position being child of an anchor which itself depends on the position, + // because they're both on the same item: + if (currentParent->mParentItem == mParentItem) + { + qDebug() << Q_FUNC_INFO << "can't set parent to be an anchor which itself depends on this position" << reinterpret_cast(parentAnchor); + return false; + } + break; + } + } + + // if previously no parent set and PosType is still ptPlotCoords, set to ptAbsolute: + if (!mParentAnchorX && mPositionTypeX == ptPlotCoords) + setTypeX(ptAbsolute); + + // save pixel position: + QPointF pixelP; + if (keepPixelPosition) + pixelP = pixelPoint(); + // unregister at current parent anchor: + if (mParentAnchorX) + mParentAnchorX->removeChildX(this); + // register at new parent anchor: + if (parentAnchor) + parentAnchor->addChildX(this); + mParentAnchorX = parentAnchor; + // restore pixel position under new parent: + if (keepPixelPosition) + setPixelPoint(pixelP); + else + setCoords(0, coords().y()); + return true; +} + +/*! + This method sets the parent anchor of the Y coordinate to \a parentAnchor. + + For a detailed description of what a parent anchor is, see the documentation of \ref setParentAnchor. + + \see setParentAnchor, setParentAnchorX +*/ +bool QCPItemPosition::setParentAnchorY(QCPItemAnchor *parentAnchor, bool keepPixelPosition) +{ + // make sure self is not assigned as parent: + if (parentAnchor == this) + { + qDebug() << Q_FUNC_INFO << "can't set self as parent anchor" << reinterpret_cast(parentAnchor); + return false; + } + // make sure no recursive parent-child-relationships are created: + QCPItemAnchor *currentParent = parentAnchor; + while (currentParent) + { + if (QCPItemPosition *currentParentPos = currentParent->toQCPItemPosition()) + { + // is a QCPItemPosition, might have further parent, so keep iterating + if (currentParentPos == this) + { + qDebug() << Q_FUNC_INFO << "can't create recursive parent-child-relationship" << reinterpret_cast(parentAnchor); + return false; + } + currentParent = currentParentPos->parentAnchorY(); + } else + { + // is a QCPItemAnchor, can't have further parent. Now make sure the parent items aren't the + // same, to prevent a position being child of an anchor which itself depends on the position, + // because they're both on the same item: + if (currentParent->mParentItem == mParentItem) + { + qDebug() << Q_FUNC_INFO << "can't set parent to be an anchor which itself depends on this position" << reinterpret_cast(parentAnchor); + return false; + } + break; + } + } + + // if previously no parent set and PosType is still ptPlotCoords, set to ptAbsolute: + if (!mParentAnchorY && mPositionTypeY == ptPlotCoords) + setTypeY(ptAbsolute); + + // save pixel position: + QPointF pixelP; + if (keepPixelPosition) + pixelP = pixelPoint(); + // unregister at current parent anchor: + if (mParentAnchorY) + mParentAnchorY->removeChildY(this); + // register at new parent anchor: + if (parentAnchor) + parentAnchor->addChildY(this); + mParentAnchorY = parentAnchor; + // restore pixel position under new parent: + if (keepPixelPosition) + setPixelPoint(pixelP); + else + setCoords(coords().x(), 0); + return true; +} + +/*! + Sets the coordinates of this QCPItemPosition. What the coordinates mean, is defined by the type + (\ref setType, \ref setTypeX, \ref setTypeY). + + For example, if the type is \ref ptAbsolute, \a key and \a value mean the x and y pixel position + on the QCustomPlot surface. In that case the origin (0, 0) is in the top left corner of the + QCustomPlot viewport. If the type is \ref ptPlotCoords, \a key and \a value mean a point in the + plot coordinate system defined by the axes set by \ref setAxes. By default those are the + QCustomPlot's xAxis and yAxis. See the documentation of \ref setType for other available + coordinate types and their meaning. + + If different types were configured for X and Y (\ref setTypeX, \ref setTypeY), \a key and \a + value must also be provided in the different coordinate systems. Here, the X type refers to \a + key, and the Y type refers to \a value. + + \see setPixelPoint +*/ +void QCPItemPosition::setCoords(double key, double value) +{ + mKey = key; + mValue = value; +} + +/*! \overload + + Sets the coordinates as a QPointF \a pos where pos.x has the meaning of \a key and pos.y the + meaning of \a value of the \ref setCoords(double key, double value) method. +*/ +void QCPItemPosition::setCoords(const QPointF &pos) +{ + setCoords(pos.x(), pos.y()); +} + +/*! + Returns the final absolute pixel position of the QCPItemPosition on the QCustomPlot surface. It + includes all effects of type (\ref setType) and possible parent anchors (\ref setParentAnchor). + + \see setPixelPoint +*/ +QPointF QCPItemPosition::pixelPoint() const +{ + QPointF result; + + // determine X: + switch (mPositionTypeX) + { + case ptAbsolute: + { + result.rx() = mKey; + if (mParentAnchorX) + result.rx() += mParentAnchorX->pixelPoint().x(); + break; + } + case ptViewportRatio: + { + result.rx() = mKey*mParentPlot->viewport().width(); + if (mParentAnchorX) + result.rx() += mParentAnchorX->pixelPoint().x(); + else + result.rx() += mParentPlot->viewport().left(); + break; + } + case ptAxisRectRatio: + { + if (mAxisRect) + { + result.rx() = mKey*mAxisRect.data()->width(); + if (mParentAnchorX) + result.rx() += mParentAnchorX->pixelPoint().x(); + else + result.rx() += mAxisRect.data()->left(); + } else + qDebug() << Q_FUNC_INFO << "Item position type x is ptAxisRectRatio, but no axis rect was defined"; + break; + } + case ptPlotCoords: + { + if (mKeyAxis && mKeyAxis.data()->orientation() == Qt::Horizontal) + result.rx() = mKeyAxis.data()->coordToPixel(mKey); + else if (mValueAxis && mValueAxis.data()->orientation() == Qt::Horizontal) + result.rx() = mValueAxis.data()->coordToPixel(mValue); + else + qDebug() << Q_FUNC_INFO << "Item position type x is ptPlotCoords, but no axes were defined"; + break; + } + } + + // determine Y: + switch (mPositionTypeY) + { + case ptAbsolute: + { + result.ry() = mValue; + if (mParentAnchorY) + result.ry() += mParentAnchorY->pixelPoint().y(); + break; + } + case ptViewportRatio: + { + result.ry() = mValue*mParentPlot->viewport().height(); + if (mParentAnchorY) + result.ry() += mParentAnchorY->pixelPoint().y(); + else + result.ry() += mParentPlot->viewport().top(); + break; + } + case ptAxisRectRatio: + { + if (mAxisRect) + { + result.ry() = mValue*mAxisRect.data()->height(); + if (mParentAnchorY) + result.ry() += mParentAnchorY->pixelPoint().y(); + else + result.ry() += mAxisRect.data()->top(); + } else + qDebug() << Q_FUNC_INFO << "Item position type y is ptAxisRectRatio, but no axis rect was defined"; + break; + } + case ptPlotCoords: + { + if (mKeyAxis && mKeyAxis.data()->orientation() == Qt::Vertical) + result.ry() = mKeyAxis.data()->coordToPixel(mKey); + else if (mValueAxis && mValueAxis.data()->orientation() == Qt::Vertical) + result.ry() = mValueAxis.data()->coordToPixel(mValue); + else + qDebug() << Q_FUNC_INFO << "Item position type y is ptPlotCoords, but no axes were defined"; + break; + } + } + + return result; +} + +/*! + When \ref setType is \ref ptPlotCoords, this function may be used to specify the axes the + coordinates set with \ref setCoords relate to. By default they are set to the initial xAxis and + yAxis of the QCustomPlot. +*/ +void QCPItemPosition::setAxes(QCPAxis *keyAxis, QCPAxis *valueAxis) +{ + mKeyAxis = keyAxis; + mValueAxis = valueAxis; +} + +/*! + When \ref setType is \ref ptAxisRectRatio, this function may be used to specify the axis rect the + coordinates set with \ref setCoords relate to. By default this is set to the main axis rect of + the QCustomPlot. +*/ +void QCPItemPosition::setAxisRect(QCPAxisRect *axisRect) +{ + mAxisRect = axisRect; +} + +/*! + Sets the apparent pixel position. This works no matter what type (\ref setType) this + QCPItemPosition is or what parent-child situation it is in, as coordinates are transformed + appropriately, to make the position finally appear at the specified pixel values. + + Only if the type is \ref ptAbsolute and no parent anchor is set, this function's effect is + identical to that of \ref setCoords. + + \see pixelPoint, setCoords +*/ +void QCPItemPosition::setPixelPoint(const QPointF &pixelPoint) +{ + double x = pixelPoint.x(); + double y = pixelPoint.y(); + + switch (mPositionTypeX) + { + case ptAbsolute: + { + if (mParentAnchorX) + x -= mParentAnchorX->pixelPoint().x(); + break; + } + case ptViewportRatio: + { + if (mParentAnchorX) + x -= mParentAnchorX->pixelPoint().x(); + else + x -= mParentPlot->viewport().left(); + x /= (double)mParentPlot->viewport().width(); + break; + } + case ptAxisRectRatio: + { + if (mAxisRect) + { + if (mParentAnchorX) + x -= mParentAnchorX->pixelPoint().x(); + else + x -= mAxisRect.data()->left(); + x /= (double)mAxisRect.data()->width(); + } else + qDebug() << Q_FUNC_INFO << "Item position type x is ptAxisRectRatio, but no axis rect was defined"; + break; + } + case ptPlotCoords: + { + if (mKeyAxis && mKeyAxis.data()->orientation() == Qt::Horizontal) + x = mKeyAxis.data()->pixelToCoord(x); + else if (mValueAxis && mValueAxis.data()->orientation() == Qt::Horizontal) + y = mValueAxis.data()->pixelToCoord(x); + else + qDebug() << Q_FUNC_INFO << "Item position type x is ptPlotCoords, but no axes were defined"; + break; + } + } + + switch (mPositionTypeY) + { + case ptAbsolute: + { + if (mParentAnchorY) + y -= mParentAnchorY->pixelPoint().y(); + break; + } + case ptViewportRatio: + { + if (mParentAnchorY) + y -= mParentAnchorY->pixelPoint().y(); + else + y -= mParentPlot->viewport().top(); + y /= (double)mParentPlot->viewport().height(); + break; + } + case ptAxisRectRatio: + { + if (mAxisRect) + { + if (mParentAnchorY) + y -= mParentAnchorY->pixelPoint().y(); + else + y -= mAxisRect.data()->top(); + y /= (double)mAxisRect.data()->height(); + } else + qDebug() << Q_FUNC_INFO << "Item position type y is ptAxisRectRatio, but no axis rect was defined"; + break; + } + case ptPlotCoords: + { + if (mKeyAxis && mKeyAxis.data()->orientation() == Qt::Vertical) + x = mKeyAxis.data()->pixelToCoord(y); + else if (mValueAxis && mValueAxis.data()->orientation() == Qt::Vertical) + y = mValueAxis.data()->pixelToCoord(y); + else + qDebug() << Q_FUNC_INFO << "Item position type y is ptPlotCoords, but no axes were defined"; + break; + } + } + + setCoords(x, y); +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPAbstractItem +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPAbstractItem + \brief The abstract base class for all items in a plot. + + In QCustomPlot, items are supplemental graphical elements that are neither plottables + (QCPAbstractPlottable) nor axes (QCPAxis). While plottables are always tied to two axes and thus + plot coordinates, items can also be placed in absolute coordinates independent of any axes. Each + specific item has at least one QCPItemPosition member which controls the positioning. Some items + are defined by more than one coordinate and thus have two or more QCPItemPosition members (For + example, QCPItemRect has \a topLeft and \a bottomRight). + + This abstract base class defines a very basic interface like visibility and clipping. Since this + class is abstract, it can't be instantiated. Use one of the subclasses or create a subclass + yourself to create new items. + + The built-in items are: + + + + + + + + + + +
QCPItemLineA line defined by a start and an end point. May have different ending styles on each side (e.g. arrows).
QCPItemStraightLineA straight line defined by a start and a direction point. Unlike QCPItemLine, the straight line is infinitely long and has no endings.
QCPItemCurveA curve defined by start, end and two intermediate control points. May have different ending styles on each side (e.g. arrows).
QCPItemRectA rectangle
QCPItemEllipseAn ellipse
QCPItemPixmapAn arbitrary pixmap
QCPItemTextA text label
QCPItemBracketA bracket which may be used to reference/highlight certain parts in the plot.
QCPItemTracerAn item that can be attached to a QCPGraph and sticks to its data points, given a key coordinate.
+ + \section items-clipping Clipping + + Items are by default clipped to the main axis rect (they are only visible inside the axis rect). + To make an item visible outside that axis rect, disable clipping via \ref setClipToAxisRect + "setClipToAxisRect(false)". + + On the other hand if you want the item to be clipped to a different axis rect, specify it via + \ref setClipAxisRect. This clipAxisRect property of an item is only used for clipping behaviour, and + in principle is independent of the coordinate axes the item might be tied to via its position + members (\ref QCPItemPosition::setAxes). However, it is common that the axis rect for clipping + also contains the axes used for the item positions. + + \section items-using Using items + + First you instantiate the item you want to use and add it to the plot: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpitemline-creation-1 + by default, the positions of the item are bound to the x- and y-Axis of the plot. So we can just + set the plot coordinates where the line should start/end: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpitemline-creation-2 + If we don't want the line to be positioned in plot coordinates but a different coordinate system, + e.g. absolute pixel positions on the QCustomPlot surface, we need to change the position type like this: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpitemline-creation-3 + Then we can set the coordinates, this time in pixels: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpitemline-creation-4 + and make the line visible on the entire QCustomPlot, by disabling clipping to the axis rect: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpitemline-creation-5 + + For more advanced plots, it is even possible to set different types and parent anchors per X/Y + coordinate of an item position, using for example \ref QCPItemPosition::setTypeX or \ref + QCPItemPosition::setParentAnchorX. For details, see the documentation of \ref QCPItemPosition. + + \section items-subclassing Creating own items + + To create an own item, you implement a subclass of QCPAbstractItem. These are the pure + virtual functions, you must implement: + \li \ref selectTest + \li \ref draw + + See the documentation of those functions for what they need to do. + + \subsection items-positioning Allowing the item to be positioned + + As mentioned, item positions are represented by QCPItemPosition members. Let's assume the new item shall + have only one point as its position (as opposed to two like a rect or multiple like a polygon). You then add + a public member of type QCPItemPosition like so: + + \code QCPItemPosition * const myPosition;\endcode + + the const makes sure the pointer itself can't be modified from the user of your new item (the QCPItemPosition + instance it points to, can be modified, of course). + The initialization of this pointer is made easy with the \ref createPosition function. Just assign + the return value of this function to each QCPItemPosition in the constructor of your item. \ref createPosition + takes a string which is the name of the position, typically this is identical to the variable name. + For example, the constructor of QCPItemExample could look like this: + + \code + QCPItemExample::QCPItemExample(QCustomPlot *parentPlot) : + QCPAbstractItem(parentPlot), + myPosition(createPosition("myPosition")) + { + // other constructor code + } + \endcode + + \subsection items-drawing The draw function + + To give your item a visual representation, reimplement the \ref draw function and use the passed + QCPPainter to draw the item. You can retrieve the item position in pixel coordinates from the + position member(s) via \ref QCPItemPosition::pixelPoint. + + To optimize performance you should calculate a bounding rect first (don't forget to take the pen + width into account), check whether it intersects the \ref clipRect, and only draw the item at all + if this is the case. + + \subsection items-selection The selectTest function + + Your implementation of the \ref selectTest function may use the helpers \ref distSqrToLine and + \ref rectSelectTest. With these, the implementation of the selection test becomes significantly + simpler for most items. See the documentation of \ref selectTest for what the function parameters + mean and what the function should return. + + \subsection anchors Providing anchors + + Providing anchors (QCPItemAnchor) starts off like adding a position. First you create a public + member, e.g. + + \code QCPItemAnchor * const bottom;\endcode + + and create it in the constructor with the \ref createAnchor function, assigning it a name and an + anchor id (an integer enumerating all anchors on the item, you may create an own enum for this). + Since anchors can be placed anywhere, relative to the item's position(s), your item needs to + provide the position of every anchor with the reimplementation of the \ref anchorPixelPoint(int + anchorId) function. + + In essence the QCPItemAnchor is merely an intermediary that itself asks your item for the pixel + position when anything attached to the anchor needs to know the coordinates. +*/ + +/* start of documentation of inline functions */ + +/*! \fn QList QCPAbstractItem::positions() const + + Returns all positions of the item in a list. + + \see anchors, position +*/ + +/*! \fn QList QCPAbstractItem::anchors() const + + Returns all anchors of the item in a list. Note that since a position (QCPItemPosition) is always + also an anchor, the list will also contain the positions of this item. + + \see positions, anchor +*/ + +/* end of documentation of inline functions */ +/* start documentation of pure virtual functions */ + +/*! \fn void QCPAbstractItem::draw(QCPPainter *painter) = 0 + \internal + + Draws this item with the provided \a painter. + + The cliprect of the provided painter is set to the rect returned by \ref clipRect before this + function is called. The clipRect depends on the clipping settings defined by \ref + setClipToAxisRect and \ref setClipAxisRect. +*/ + +/* end documentation of pure virtual functions */ +/* start documentation of signals */ + +/*! \fn void QCPAbstractItem::selectionChanged(bool selected) + This signal is emitted when the selection state of this item has changed, either by user interaction + or by a direct call to \ref setSelected. +*/ + +/* end documentation of signals */ + +/*! + Base class constructor which initializes base class members. +*/ +QCPAbstractItem::QCPAbstractItem(QCustomPlot *parentPlot) : + QCPLayerable(parentPlot), + mClipToAxisRect(false), + mSelectable(true), + mSelected(false) +{ + QList rects = parentPlot->axisRects(); + if (rects.size() > 0) + { + setClipToAxisRect(true); + setClipAxisRect(rects.first()); + } +} + +QCPAbstractItem::~QCPAbstractItem() +{ + // don't delete mPositions because every position is also an anchor and thus in mAnchors + qDeleteAll(mAnchors); +} + +/* can't make this a header inline function, because QPointer breaks with forward declared types, see QTBUG-29588 */ +QCPAxisRect *QCPAbstractItem::clipAxisRect() const +{ + return mClipAxisRect.data(); +} + +/*! + Sets whether the item shall be clipped to an axis rect or whether it shall be visible on the + entire QCustomPlot. The axis rect can be set with \ref setClipAxisRect. + + \see setClipAxisRect +*/ +void QCPAbstractItem::setClipToAxisRect(bool clip) +{ + mClipToAxisRect = clip; + if (mClipToAxisRect) + setParentLayerable(mClipAxisRect.data()); +} + +/*! + Sets the clip axis rect. It defines the rect that will be used to clip the item when \ref + setClipToAxisRect is set to true. + + \see setClipToAxisRect +*/ +void QCPAbstractItem::setClipAxisRect(QCPAxisRect *rect) +{ + mClipAxisRect = rect; + if (mClipToAxisRect) + setParentLayerable(mClipAxisRect.data()); +} + +/*! + Sets whether the user can (de-)select this item by clicking on the QCustomPlot surface. + (When \ref QCustomPlot::setInteractions contains QCustomPlot::iSelectItems.) + + However, even when \a selectable was set to false, it is possible to set the selection manually, + by calling \ref setSelected. + + \see QCustomPlot::setInteractions, setSelected +*/ +void QCPAbstractItem::setSelectable(bool selectable) +{ + if (mSelectable != selectable) + { + mSelectable = selectable; + emit selectableChanged(mSelectable); + } +} + +/*! + Sets whether this item is selected or not. When selected, it might use a different visual + appearance (e.g. pen and brush), this depends on the specific item though. + + The entire selection mechanism for items is handled automatically when \ref + QCustomPlot::setInteractions contains QCustomPlot::iSelectItems. You only need to call this + function when you wish to change the selection state manually. + + This function can change the selection state even when \ref setSelectable was set to false. + + emits the \ref selectionChanged signal when \a selected is different from the previous selection state. + + \see setSelectable, selectTest +*/ +void QCPAbstractItem::setSelected(bool selected) +{ + if (mSelected != selected) + { + mSelected = selected; + emit selectionChanged(mSelected); + } +} + +/*! + Returns the QCPItemPosition with the specified \a name. If this item doesn't have a position by + that name, returns 0. + + This function provides an alternative way to access item positions. Normally, you access + positions direcly by their member pointers (which typically have the same variable name as \a + name). + + \see positions, anchor +*/ +QCPItemPosition *QCPAbstractItem::position(const QString &name) const +{ + for (int i=0; iname() == name) + return mPositions.at(i); + } + qDebug() << Q_FUNC_INFO << "position with name not found:" << name; + return 0; +} + +/*! + Returns the QCPItemAnchor with the specified \a name. If this item doesn't have an anchor by + that name, returns 0. + + This function provides an alternative way to access item anchors. Normally, you access + anchors direcly by their member pointers (which typically have the same variable name as \a + name). + + \see anchors, position +*/ +QCPItemAnchor *QCPAbstractItem::anchor(const QString &name) const +{ + for (int i=0; iname() == name) + return mAnchors.at(i); + } + qDebug() << Q_FUNC_INFO << "anchor with name not found:" << name; + return 0; +} + +/*! + Returns whether this item has an anchor with the specified \a name. + + Note that you can check for positions with this function, too. This is because every position is + also an anchor (QCPItemPosition inherits from QCPItemAnchor). + + \see anchor, position +*/ +bool QCPAbstractItem::hasAnchor(const QString &name) const +{ + for (int i=0; iname() == name) + return true; + } + return false; +} + +/*! \internal + + Returns the rect the visual representation of this item is clipped to. This depends on the + current setting of \ref setClipToAxisRect as well as the axis rect set with \ref setClipAxisRect. + + If the item is not clipped to an axis rect, the \ref QCustomPlot::viewport rect is returned. + + \see draw +*/ +QRect QCPAbstractItem::clipRect() const +{ + if (mClipToAxisRect && mClipAxisRect) + return mClipAxisRect.data()->rect(); + else + return mParentPlot->viewport(); +} + +/*! \internal + + A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter + before drawing item lines. + + This is the antialiasing state the painter passed to the \ref draw method is in by default. + + This function takes into account the local setting of the antialiasing flag as well as the + overrides set with \ref QCustomPlot::setAntialiasedElements and \ref + QCustomPlot::setNotAntialiasedElements. + + \see setAntialiased +*/ +void QCPAbstractItem::applyDefaultAntialiasingHint(QCPPainter *painter) const +{ + applyAntialiasingHint(painter, mAntialiased, QCP::aeItems); +} + +/*! \internal + + Finds the shortest squared distance of \a point to the line segment defined by \a start and \a + end. + + This function may be used to help with the implementation of the \ref selectTest function for + specific items. + + \note This function is identical to QCPAbstractPlottable::distSqrToLine + + \see rectSelectTest +*/ +double QCPAbstractItem::distSqrToLine(const QPointF &start, const QPointF &end, const QPointF &point) const +{ + QVector2D a(start); + QVector2D b(end); + QVector2D p(point); + QVector2D v(b-a); + + double vLengthSqr = v.lengthSquared(); + if (!qFuzzyIsNull(vLengthSqr)) + { + double mu = QVector2D::dotProduct(p-a, v)/vLengthSqr; + if (mu < 0) + return (a-p).lengthSquared(); + else if (mu > 1) + return (b-p).lengthSquared(); + else + return ((a + mu*v)-p).lengthSquared(); + } else + return (a-p).lengthSquared(); +} + +/*! \internal + + A convenience function which returns the selectTest value for a specified \a rect and a specified + click position \a pos. \a filledRect defines whether a click inside the rect should also be + considered a hit or whether only the rect border is sensitive to hits. + + This function may be used to help with the implementation of the \ref selectTest function for + specific items. + + For example, if your item consists of four rects, call this function four times, once for each + rect, in your \ref selectTest reimplementation. Finally, return the minimum of all four returned + values. + + \see distSqrToLine +*/ +double QCPAbstractItem::rectSelectTest(const QRectF &rect, const QPointF &pos, bool filledRect) const +{ + double result = -1; + + // distance to border: + QList lines; + lines << QLineF(rect.topLeft(), rect.topRight()) << QLineF(rect.bottomLeft(), rect.bottomRight()) + << QLineF(rect.topLeft(), rect.bottomLeft()) << QLineF(rect.topRight(), rect.bottomRight()); + double minDistSqr = std::numeric_limits::max(); + for (int i=0; i mParentPlot->selectionTolerance()*0.99) + { + if (rect.contains(pos)) + result = mParentPlot->selectionTolerance()*0.99; + } + return result; +} + +/*! \internal + + Returns the pixel position of the anchor with Id \a anchorId. This function must be reimplemented in + item subclasses if they want to provide anchors (QCPItemAnchor). + + For example, if the item has two anchors with id 0 and 1, this function takes one of these anchor + ids and returns the respective pixel points of the specified anchor. + + \see createAnchor +*/ +QPointF QCPAbstractItem::anchorPixelPoint(int anchorId) const +{ + qDebug() << Q_FUNC_INFO << "called on item which shouldn't have any anchors (this method not reimplemented). anchorId" << anchorId; + return QPointF(); +} + +/*! \internal + + Creates a QCPItemPosition, registers it with this item and returns a pointer to it. The specified + \a name must be a unique string that is usually identical to the variable name of the position + member (This is needed to provide the name-based \ref position access to positions). + + Don't delete positions created by this function manually, as the item will take care of it. + + Use this function in the constructor (initialization list) of the specific item subclass to + create each position member. Don't create QCPItemPositions with \b new yourself, because they + won't be registered with the item properly. + + \see createAnchor +*/ +QCPItemPosition *QCPAbstractItem::createPosition(const QString &name) +{ + if (hasAnchor(name)) + qDebug() << Q_FUNC_INFO << "anchor/position with name exists already:" << name; + QCPItemPosition *newPosition = new QCPItemPosition(mParentPlot, this, name); + mPositions.append(newPosition); + mAnchors.append(newPosition); // every position is also an anchor + newPosition->setAxes(mParentPlot->xAxis, mParentPlot->yAxis); + newPosition->setType(QCPItemPosition::ptPlotCoords); + if (mParentPlot->axisRect()) + newPosition->setAxisRect(mParentPlot->axisRect()); + newPosition->setCoords(0, 0); + return newPosition; +} + +/*! \internal + + Creates a QCPItemAnchor, registers it with this item and returns a pointer to it. The specified + \a name must be a unique string that is usually identical to the variable name of the anchor + member (This is needed to provide the name based \ref anchor access to anchors). + + The \a anchorId must be a number identifying the created anchor. It is recommended to create an + enum (e.g. "AnchorIndex") for this on each item that uses anchors. This id is used by the anchor + to identify itself when it calls QCPAbstractItem::anchorPixelPoint. That function then returns + the correct pixel coordinates for the passed anchor id. + + Don't delete anchors created by this function manually, as the item will take care of it. + + Use this function in the constructor (initialization list) of the specific item subclass to + create each anchor member. Don't create QCPItemAnchors with \b new yourself, because then they + won't be registered with the item properly. + + \see createPosition +*/ +QCPItemAnchor *QCPAbstractItem::createAnchor(const QString &name, int anchorId) +{ + if (hasAnchor(name)) + qDebug() << Q_FUNC_INFO << "anchor/position with name exists already:" << name; + QCPItemAnchor *newAnchor = new QCPItemAnchor(mParentPlot, this, name, anchorId); + mAnchors.append(newAnchor); + return newAnchor; +} + +/* inherits documentation from base class */ +void QCPAbstractItem::selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged) +{ + Q_UNUSED(event) + Q_UNUSED(details) + if (mSelectable) + { + bool selBefore = mSelected; + setSelected(additive ? !mSelected : true); + if (selectionStateChanged) + *selectionStateChanged = mSelected != selBefore; + } +} + +/* inherits documentation from base class */ +void QCPAbstractItem::deselectEvent(bool *selectionStateChanged) +{ + if (mSelectable) + { + bool selBefore = mSelected; + setSelected(false); + if (selectionStateChanged) + *selectionStateChanged = mSelected != selBefore; + } +} + +/* inherits documentation from base class */ +QCP::Interaction QCPAbstractItem::selectionCategory() const +{ + return QCP::iSelectItems; +} + + +/*! \file */ + + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCustomPlot +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCustomPlot + + \brief The central class of the library. This is the QWidget which displays the plot and + interacts with the user. + + For tutorials on how to use QCustomPlot, see the website\n + http://www.qcustomplot.com/ +*/ + +/* start of documentation of inline functions */ + +/*! \fn QRect QCustomPlot::viewport() const + + Returns the viewport rect of this QCustomPlot instance. The viewport is the area the plot is + drawn in, all mechanisms, e.g. margin caluclation take the viewport to be the outer border of the + plot. The viewport normally is the rect() of the QCustomPlot widget, i.e. a rect with top left + (0, 0) and size of the QCustomPlot widget. + + Don't confuse the viewport with the axis rect (QCustomPlot::axisRect). An axis rect is typically + an area enclosed by four axes, where the graphs/plottables are drawn in. The viewport is larger + and contains also the axes themselves, their tick numbers, their labels, the plot title etc. + + Only when saving to a file (see \ref savePng, \ref savePdf etc.) the viewport is temporarily + modified to allow saving plots with sizes independent of the current widget size. +*/ + +/*! \fn QCPLayoutGrid *QCustomPlot::plotLayout() const + + Returns the top level layout of this QCustomPlot instance. It is a \ref QCPLayoutGrid, initially containing just + one cell with the main QCPAxisRect inside. +*/ + +/* end of documentation of inline functions */ +/* start of documentation of signals */ + +/*! \fn void QCustomPlot::mouseDoubleClick(QMouseEvent *event) + + This signal is emitted when the QCustomPlot receives a mouse double click event. +*/ + +/*! \fn void QCustomPlot::mousePress(QMouseEvent *event) + + This signal is emitted when the QCustomPlot receives a mouse press event. + + It is emitted before QCustomPlot handles any other mechanism like range dragging. So a slot + connected to this signal can still influence the behaviour e.g. with \ref QCPAxisRect::setRangeDrag or \ref + QCPAxisRect::setRangeDragAxes. +*/ + +/*! \fn void QCustomPlot::mouseMove(QMouseEvent *event) + + This signal is emitted when the QCustomPlot receives a mouse move event. + + It is emitted before QCustomPlot handles any other mechanism like range dragging. So a slot + connected to this signal can still influence the behaviour e.g. with \ref QCPAxisRect::setRangeDrag or \ref + QCPAxisRect::setRangeDragAxes. + + \warning It is discouraged to change the drag-axes with \ref QCPAxisRect::setRangeDragAxes here, + because the dragging starting point was saved the moment the mouse was pressed. Thus it only has + a meaning for the range drag axes that were set at that moment. If you want to change the drag + axes, consider doing this in the \ref mousePress signal instead. +*/ + +/*! \fn void QCustomPlot::mouseRelease(QMouseEvent *event) + + This signal is emitted when the QCustomPlot receives a mouse release event. + + It is emitted before QCustomPlot handles any other mechanisms like object selection. So a + slot connected to this signal can still influence the behaviour e.g. with \ref setInteractions or + \ref QCPAbstractPlottable::setSelectable. +*/ + +/*! \fn void QCustomPlot::mouseWheel(QMouseEvent *event) + + This signal is emitted when the QCustomPlot receives a mouse wheel event. + + It is emitted before QCustomPlot handles any other mechanisms like range zooming. So a slot + connected to this signal can still influence the behaviour e.g. with \ref QCPAxisRect::setRangeZoom, \ref + QCPAxisRect::setRangeZoomAxes or \ref QCPAxisRect::setRangeZoomFactor. +*/ + +/*! \fn void QCustomPlot::plottableClick(QCPAbstractPlottable *plottable, QMouseEvent *event) + + This signal is emitted when a plottable is clicked. + + \a event is the mouse event that caused the click and \a plottable is the plottable that received + the click. + + \see plottableDoubleClick +*/ + +/*! \fn void QCustomPlot::plottableDoubleClick(QCPAbstractPlottable *plottable, QMouseEvent *event) + + This signal is emitted when a plottable is double clicked. + + \a event is the mouse event that caused the click and \a plottable is the plottable that received + the click. + + \see plottableClick +*/ + +/*! \fn void QCustomPlot::itemClick(QCPAbstractItem *item, QMouseEvent *event) + + This signal is emitted when an item is clicked. + + \a event is the mouse event that caused the click and \a item is the item that received the + click. + + \see itemDoubleClick +*/ + +/*! \fn void QCustomPlot::itemDoubleClick(QCPAbstractItem *item, QMouseEvent *event) + + This signal is emitted when an item is double clicked. + + \a event is the mouse event that caused the click and \a item is the item that received the + click. + + \see itemClick +*/ + +/*! \fn void QCustomPlot::axisClick(QCPAxis *axis, QCPAxis::SelectablePart part, QMouseEvent *event) + + This signal is emitted when an axis is clicked. + + \a event is the mouse event that caused the click, \a axis is the axis that received the click and + \a part indicates the part of the axis that was clicked. + + \see axisDoubleClick +*/ + +/*! \fn void QCustomPlot::axisDoubleClick(QCPAxis *axis, QCPAxis::SelectablePart part, QMouseEvent *event) + + This signal is emitted when an axis is double clicked. + + \a event is the mouse event that caused the click, \a axis is the axis that received the click and + \a part indicates the part of the axis that was clicked. + + \see axisClick +*/ + +/*! \fn void QCustomPlot::legendClick(QCPLegend *legend, QCPAbstractLegendItem *item, QMouseEvent *event) + + This signal is emitted when a legend (item) is clicked. + + \a event is the mouse event that caused the click, \a legend is the legend that received the + click and \a item is the legend item that received the click. If only the legend and no item is + clicked, \a item is 0. This happens for a click inside the legend padding or the space between + two items. + + \see legendDoubleClick +*/ + +/*! \fn void QCustomPlot::legendDoubleClick(QCPLegend *legend, QCPAbstractLegendItem *item, QMouseEvent *event) + + This signal is emitted when a legend (item) is double clicked. + + \a event is the mouse event that caused the click, \a legend is the legend that received the + click and \a item is the legend item that received the click. If only the legend and no item is + clicked, \a item is 0. This happens for a click inside the legend padding or the space between + two items. + + \see legendClick +*/ + +/*! \fn void QCustomPlot:: titleClick(QMouseEvent *event, QCPPlotTitle *title) + + This signal is emitted when a plot title is clicked. + + \a event is the mouse event that caused the click and \a title is the plot title that received + the click. + + \see titleDoubleClick +*/ + +/*! \fn void QCustomPlot::titleDoubleClick(QMouseEvent *event, QCPPlotTitle *title) + + This signal is emitted when a plot title is double clicked. + + \a event is the mouse event that caused the click and \a title is the plot title that received + the click. + + \see titleClick +*/ + +/*! \fn void QCustomPlot::selectionChangedByUser() + + This signal is emitted after the user has changed the selection in the QCustomPlot, e.g. by + clicking. It is not emitted when the selection state of an object has changed programmatically by + a direct call to setSelected() on an object or by calling \ref deselectAll. + + In addition to this signal, selectable objects also provide individual signals, for example + QCPAxis::selectionChanged or QCPAbstractPlottable::selectionChanged. Note that those signals are + emitted even if the selection state is changed programmatically. + + See the documentation of \ref setInteractions for details about the selection mechanism. + + \see selectedPlottables, selectedGraphs, selectedItems, selectedAxes, selectedLegends +*/ + +/*! \fn void QCustomPlot::beforeReplot() + + This signal is emitted immediately before a replot takes place (caused by a call to the slot \ref + replot). + + It is safe to mutually connect the replot slot with this signal on two QCustomPlots to make them + replot synchronously, it won't cause an infinite recursion. + + \see replot, afterReplot +*/ + +/*! \fn void QCustomPlot::afterReplot() + + This signal is emitted immediately after a replot has taken place (caused by a call to the slot \ref + replot). + + It is safe to mutually connect the replot slot with this signal on two QCustomPlots to make them + replot synchronously, it won't cause an infinite recursion. + + \see replot, beforeReplot +*/ + +/* end of documentation of signals */ +/* start of documentation of public members */ + +/*! \var QCPAxis *QCustomPlot::xAxis + + A pointer to the primary x Axis (bottom) of the main axis rect of the plot. + + QCustomPlot offers convenient pointers to the axes (\ref xAxis, \ref yAxis, \ref xAxis2, \ref + yAxis2) and the \ref legend. They make it very easy working with plots that only have a single + axis rect and at most one axis at each axis rect side. If you use \link thelayoutsystem the + layout system\endlink to add multiple axis rects or multiple axes to one side, use the \ref + QCPAxisRect::axis interface to access the new axes. If one of the four default axes or the + default legend is removed due to manipulation of the layout system (e.g. by removing the main + axis rect), the corresponding pointers become 0. +*/ + +/*! \var QCPAxis *QCustomPlot::yAxis + + A pointer to the primary y Axis (left) of the main axis rect of the plot. + + QCustomPlot offers convenient pointers to the axes (\ref xAxis, \ref yAxis, \ref xAxis2, \ref + yAxis2) and the \ref legend. They make it very easy working with plots that only have a single + axis rect and at most one axis at each axis rect side. If you use \link thelayoutsystem the + layout system\endlink to add multiple axis rects or multiple axes to one side, use the \ref + QCPAxisRect::axis interface to access the new axes. If one of the four default axes or the + default legend is removed due to manipulation of the layout system (e.g. by removing the main + axis rect), the corresponding pointers become 0. +*/ + +/*! \var QCPAxis *QCustomPlot::xAxis2 + + A pointer to the secondary x Axis (top) of the main axis rect of the plot. Secondary axes are + invisible by default. Use QCPAxis::setVisible to change this (or use \ref + QCPAxisRect::setupFullAxesBox). + + QCustomPlot offers convenient pointers to the axes (\ref xAxis, \ref yAxis, \ref xAxis2, \ref + yAxis2) and the \ref legend. They make it very easy working with plots that only have a single + axis rect and at most one axis at each axis rect side. If you use \link thelayoutsystem the + layout system\endlink to add multiple axis rects or multiple axes to one side, use the \ref + QCPAxisRect::axis interface to access the new axes. If one of the four default axes or the + default legend is removed due to manipulation of the layout system (e.g. by removing the main + axis rect), the corresponding pointers become 0. +*/ + +/*! \var QCPAxis *QCustomPlot::yAxis2 + + A pointer to the secondary y Axis (right) of the main axis rect of the plot. Secondary axes are + invisible by default. Use QCPAxis::setVisible to change this (or use \ref + QCPAxisRect::setupFullAxesBox). + + QCustomPlot offers convenient pointers to the axes (\ref xAxis, \ref yAxis, \ref xAxis2, \ref + yAxis2) and the \ref legend. They make it very easy working with plots that only have a single + axis rect and at most one axis at each axis rect side. If you use \link thelayoutsystem the + layout system\endlink to add multiple axis rects or multiple axes to one side, use the \ref + QCPAxisRect::axis interface to access the new axes. If one of the four default axes or the + default legend is removed due to manipulation of the layout system (e.g. by removing the main + axis rect), the corresponding pointers become 0. +*/ + +/*! \var QCPLegend *QCustomPlot::legend + + A pointer to the default legend of the main axis rect. The legend is invisible by default. Use + QCPLegend::setVisible to change this. + + QCustomPlot offers convenient pointers to the axes (\ref xAxis, \ref yAxis, \ref xAxis2, \ref + yAxis2) and the \ref legend. They make it very easy working with plots that only have a single + axis rect and at most one axis at each axis rect side. If you use \link thelayoutsystem the + layout system\endlink to add multiple legends to the plot, use the layout system interface to + access the new legend. For example, legends can be placed inside an axis rect's \ref + QCPAxisRect::insetLayout "inset layout", and must then also be accessed via the inset layout. If + the default legend is removed due to manipulation of the layout system (e.g. by removing the main + axis rect), the corresponding pointer becomes 0. +*/ + +/* end of documentation of public members */ + +/*! + Constructs a QCustomPlot and sets reasonable default values. +*/ +QCustomPlot::QCustomPlot(QWidget *parent) : + QWidget(parent), + xAxis(0), + yAxis(0), + xAxis2(0), + yAxis2(0), + legend(0), + mPlotLayout(0), + mAutoAddPlottableToLegend(true), + mAntialiasedElements(QCP::aeNone), + mNotAntialiasedElements(QCP::aeNone), + mInteractions(0), + mSelectionTolerance(8), + mNoAntialiasingOnDrag(false), + mBackgroundBrush(Qt::white, Qt::SolidPattern), + mBackgroundScaled(true), + mBackgroundScaledMode(Qt::KeepAspectRatioByExpanding), + mCurrentLayer(0), + mPlottingHints(QCP::phCacheLabels|QCP::phForceRepaint), + mMultiSelectModifier(Qt::ControlModifier), + mPaintBuffer(size()), + mMouseEventElement(0), + mReplotting(false) +{ + setAttribute(Qt::WA_NoMousePropagation); + setAttribute(Qt::WA_OpaquePaintEvent); + setMouseTracking(true); + QLocale currentLocale = locale(); + currentLocale.setNumberOptions(QLocale::OmitGroupSeparator); + setLocale(currentLocale); + + // create initial layers: + mLayers.append(new QCPLayer(this, QLatin1String("background"))); + mLayers.append(new QCPLayer(this, QLatin1String("grid"))); + mLayers.append(new QCPLayer(this, QLatin1String("main"))); + mLayers.append(new QCPLayer(this, QLatin1String("axes"))); + mLayers.append(new QCPLayer(this, QLatin1String("legend"))); + updateLayerIndices(); + setCurrentLayer(QLatin1String("main")); + + // create initial layout, axis rect and legend: + mPlotLayout = new QCPLayoutGrid; + mPlotLayout->initializeParentPlot(this); + mPlotLayout->setParent(this); // important because if parent is QWidget, QCPLayout::sizeConstraintsChanged will call QWidget::updateGeometry + mPlotLayout->setLayer(QLatin1String("main")); + QCPAxisRect *defaultAxisRect = new QCPAxisRect(this, true); + mPlotLayout->addElement(0, 0, defaultAxisRect); + xAxis = defaultAxisRect->axis(QCPAxis::atBottom); + yAxis = defaultAxisRect->axis(QCPAxis::atLeft); + xAxis2 = defaultAxisRect->axis(QCPAxis::atTop); + yAxis2 = defaultAxisRect->axis(QCPAxis::atRight); + legend = new QCPLegend; + legend->setVisible(false); + defaultAxisRect->insetLayout()->addElement(legend, Qt::AlignRight|Qt::AlignTop); + defaultAxisRect->insetLayout()->setMargins(QMargins(12, 12, 12, 12)); + + defaultAxisRect->setLayer(QLatin1String("background")); + xAxis->setLayer(QLatin1String("axes")); + yAxis->setLayer(QLatin1String("axes")); + xAxis2->setLayer(QLatin1String("axes")); + yAxis2->setLayer(QLatin1String("axes")); + xAxis->grid()->setLayer(QLatin1String("grid")); + yAxis->grid()->setLayer(QLatin1String("grid")); + xAxis2->grid()->setLayer(QLatin1String("grid")); + yAxis2->grid()->setLayer(QLatin1String("grid")); + legend->setLayer(QLatin1String("legend")); + + setViewport(rect()); // needs to be called after mPlotLayout has been created + + replot(); +} + +QCustomPlot::~QCustomPlot() +{ + clearPlottables(); + clearItems(); + + if (mPlotLayout) + { + delete mPlotLayout; + mPlotLayout = 0; + } + + mCurrentLayer = 0; + qDeleteAll(mLayers); // don't use removeLayer, because it would prevent the last layer to be removed + mLayers.clear(); +} + +/*! + Sets which elements are forcibly drawn antialiased as an \a or combination of QCP::AntialiasedElement. + + This overrides the antialiasing settings for whole element groups, normally controlled with the + \a setAntialiasing function on the individual elements. If an element is neither specified in + \ref setAntialiasedElements nor in \ref setNotAntialiasedElements, the antialiasing setting on + each individual element instance is used. + + For example, if \a antialiasedElements contains \ref QCP::aePlottables, all plottables will be + drawn antialiased, no matter what the specific QCPAbstractPlottable::setAntialiased value was set + to. + + if an element in \a antialiasedElements is already set in \ref setNotAntialiasedElements, it is + removed from there. + + \see setNotAntialiasedElements +*/ +void QCustomPlot::setAntialiasedElements(const QCP::AntialiasedElements &antialiasedElements) +{ + mAntialiasedElements = antialiasedElements; + + // make sure elements aren't in mNotAntialiasedElements and mAntialiasedElements simultaneously: + if ((mNotAntialiasedElements & mAntialiasedElements) != 0) + mNotAntialiasedElements |= ~mAntialiasedElements; +} + +/*! + Sets whether the specified \a antialiasedElement is forcibly drawn antialiased. + + See \ref setAntialiasedElements for details. + + \see setNotAntialiasedElement +*/ +void QCustomPlot::setAntialiasedElement(QCP::AntialiasedElement antialiasedElement, bool enabled) +{ + if (!enabled && mAntialiasedElements.testFlag(antialiasedElement)) + mAntialiasedElements &= ~antialiasedElement; + else if (enabled && !mAntialiasedElements.testFlag(antialiasedElement)) + mAntialiasedElements |= antialiasedElement; + + // make sure elements aren't in mNotAntialiasedElements and mAntialiasedElements simultaneously: + if ((mNotAntialiasedElements & mAntialiasedElements) != 0) + mNotAntialiasedElements |= ~mAntialiasedElements; +} + +/*! + Sets which elements are forcibly drawn not antialiased as an \a or combination of + QCP::AntialiasedElement. + + This overrides the antialiasing settings for whole element groups, normally controlled with the + \a setAntialiasing function on the individual elements. If an element is neither specified in + \ref setAntialiasedElements nor in \ref setNotAntialiasedElements, the antialiasing setting on + each individual element instance is used. + + For example, if \a notAntialiasedElements contains \ref QCP::aePlottables, no plottables will be + drawn antialiased, no matter what the specific QCPAbstractPlottable::setAntialiased value was set + to. + + if an element in \a notAntialiasedElements is already set in \ref setAntialiasedElements, it is + removed from there. + + \see setAntialiasedElements +*/ +void QCustomPlot::setNotAntialiasedElements(const QCP::AntialiasedElements ¬AntialiasedElements) +{ + mNotAntialiasedElements = notAntialiasedElements; + + // make sure elements aren't in mNotAntialiasedElements and mAntialiasedElements simultaneously: + if ((mNotAntialiasedElements & mAntialiasedElements) != 0) + mAntialiasedElements |= ~mNotAntialiasedElements; +} + +/*! + Sets whether the specified \a notAntialiasedElement is forcibly drawn not antialiased. + + See \ref setNotAntialiasedElements for details. + + \see setAntialiasedElement +*/ +void QCustomPlot::setNotAntialiasedElement(QCP::AntialiasedElement notAntialiasedElement, bool enabled) +{ + if (!enabled && mNotAntialiasedElements.testFlag(notAntialiasedElement)) + mNotAntialiasedElements &= ~notAntialiasedElement; + else if (enabled && !mNotAntialiasedElements.testFlag(notAntialiasedElement)) + mNotAntialiasedElements |= notAntialiasedElement; + + // make sure elements aren't in mNotAntialiasedElements and mAntialiasedElements simultaneously: + if ((mNotAntialiasedElements & mAntialiasedElements) != 0) + mAntialiasedElements |= ~mNotAntialiasedElements; +} + +/*! + If set to true, adding a plottable (e.g. a graph) to the QCustomPlot automatically also adds the + plottable to the legend (QCustomPlot::legend). + + \see addPlottable, addGraph, QCPLegend::addItem +*/ +void QCustomPlot::setAutoAddPlottableToLegend(bool on) +{ + mAutoAddPlottableToLegend = on; +} + +/*! + Sets the possible interactions of this QCustomPlot as an or-combination of \ref QCP::Interaction + enums. There are the following types of interactions: + + Axis range manipulation is controlled via \ref QCP::iRangeDrag and \ref QCP::iRangeZoom. When the + respective interaction is enabled, the user may drag axes ranges and zoom with the mouse wheel. + For details how to control which axes the user may drag/zoom and in what orientations, see \ref + QCPAxisRect::setRangeDrag, \ref QCPAxisRect::setRangeZoom, \ref QCPAxisRect::setRangeDragAxes, + \ref QCPAxisRect::setRangeZoomAxes. + + Plottable selection is controlled by \ref QCP::iSelectPlottables. If \ref QCP::iSelectPlottables is + set, the user may select plottables (graphs, curves, bars,...) by clicking on them or in their + vicinity (\ref setSelectionTolerance). Whether the user can actually select a plottable can + further be restricted with the \ref QCPAbstractPlottable::setSelectable function on the specific + plottable. To find out whether a specific plottable is selected, call + QCPAbstractPlottable::selected(). To retrieve a list of all currently selected plottables, call + \ref selectedPlottables. If you're only interested in QCPGraphs, you may use the convenience + function \ref selectedGraphs. + + Item selection is controlled by \ref QCP::iSelectItems. If \ref QCP::iSelectItems is set, the user + may select items (QCPItemLine, QCPItemText,...) by clicking on them or in their vicinity. To find + out whether a specific item is selected, call QCPAbstractItem::selected(). To retrieve a list of + all currently selected items, call \ref selectedItems. + + Axis selection is controlled with \ref QCP::iSelectAxes. If \ref QCP::iSelectAxes is set, the user + may select parts of the axes by clicking on them. What parts exactly (e.g. Axis base line, tick + labels, axis label) are selectable can be controlled via \ref QCPAxis::setSelectableParts for + each axis. To retrieve a list of all axes that currently contain selected parts, call \ref + selectedAxes. Which parts of an axis are selected, can be retrieved with QCPAxis::selectedParts(). + + Legend selection is controlled with \ref QCP::iSelectLegend. If this is set, the user may + select the legend itself or individual items by clicking on them. What parts exactly are + selectable can be controlled via \ref QCPLegend::setSelectableParts. To find out whether the + legend or any of its child items are selected, check the value of QCPLegend::selectedParts. To + find out which child items are selected, call \ref QCPLegend::selectedItems. + + All other selectable elements The selection of all other selectable objects (e.g. + QCPPlotTitle, or your own layerable subclasses) is controlled with \ref QCP::iSelectOther. If set, the + user may select those objects by clicking on them. To find out which are currently selected, you + need to check their selected state explicitly. + + If the selection state has changed by user interaction, the \ref selectionChangedByUser signal is + emitted. Each selectable object additionally emits an individual selectionChanged signal whenever + their selection state has changed, i.e. not only by user interaction. + + To allow multiple objects to be selected by holding the selection modifier (\ref + setMultiSelectModifier), set the flag \ref QCP::iMultiSelect. + + \note In addition to the selection mechanism presented here, QCustomPlot always emits + corresponding signals, when an object is clicked or double clicked. see \ref plottableClick and + \ref plottableDoubleClick for example. + + \see setInteraction, setSelectionTolerance +*/ +void QCustomPlot::setInteractions(const QCP::Interactions &interactions) +{ + mInteractions = interactions; +} + +/*! + Sets the single \a interaction of this QCustomPlot to \a enabled. + + For details about the interaction system, see \ref setInteractions. + + \see setInteractions +*/ +void QCustomPlot::setInteraction(const QCP::Interaction &interaction, bool enabled) +{ + if (!enabled && mInteractions.testFlag(interaction)) + mInteractions &= ~interaction; + else if (enabled && !mInteractions.testFlag(interaction)) + mInteractions |= interaction; +} + +/*! + Sets the tolerance that is used to decide whether a click selects an object (e.g. a plottable) or + not. + + If the user clicks in the vicinity of the line of e.g. a QCPGraph, it's only regarded as a + potential selection when the minimum distance between the click position and the graph line is + smaller than \a pixels. Objects that are defined by an area (e.g. QCPBars) only react to clicks + directly inside the area and ignore this selection tolerance. In other words, it only has meaning + for parts of objects that are too thin to exactly hit with a click and thus need such a + tolerance. + + \see setInteractions, QCPLayerable::selectTest +*/ +void QCustomPlot::setSelectionTolerance(int pixels) +{ + mSelectionTolerance = pixels; +} + +/*! + Sets whether antialiasing is disabled for this QCustomPlot while the user is dragging axes + ranges. If many objects, especially plottables, are drawn antialiased, this greatly improves + performance during dragging. Thus it creates a more responsive user experience. As soon as the + user stops dragging, the last replot is done with normal antialiasing, to restore high image + quality. + + \see setAntialiasedElements, setNotAntialiasedElements +*/ +void QCustomPlot::setNoAntialiasingOnDrag(bool enabled) +{ + mNoAntialiasingOnDrag = enabled; +} + +/*! + Sets the plotting hints for this QCustomPlot instance as an \a or combination of QCP::PlottingHint. + + \see setPlottingHint +*/ +void QCustomPlot::setPlottingHints(const QCP::PlottingHints &hints) +{ + mPlottingHints = hints; +} + +/*! + Sets the specified plotting \a hint to \a enabled. + + \see setPlottingHints +*/ +void QCustomPlot::setPlottingHint(QCP::PlottingHint hint, bool enabled) +{ + QCP::PlottingHints newHints = mPlottingHints; + if (!enabled) + newHints &= ~hint; + else + newHints |= hint; + + if (newHints != mPlottingHints) + setPlottingHints(newHints); +} + +/*! + Sets the keyboard modifier that will be recognized as multi-select-modifier. + + If \ref QCP::iMultiSelect is specified in \ref setInteractions, the user may select multiple objects + by clicking on them one after the other while holding down \a modifier. + + By default the multi-select-modifier is set to Qt::ControlModifier. + + \see setInteractions +*/ +void QCustomPlot::setMultiSelectModifier(Qt::KeyboardModifier modifier) +{ + mMultiSelectModifier = modifier; +} + +/*! + Sets the viewport of this QCustomPlot. The Viewport is the area that the top level layout + (QCustomPlot::plotLayout()) uses as its rect. Normally, the viewport is the entire widget rect. + + This function is used to allow arbitrary size exports with \ref toPixmap, \ref savePng, \ref + savePdf, etc. by temporarily changing the viewport size. +*/ +void QCustomPlot::setViewport(const QRect &rect) +{ + mViewport = rect; + if (mPlotLayout) + mPlotLayout->setOuterRect(mViewport); +} + +/*! + Sets \a pm as the viewport background pixmap (see \ref setViewport). The pixmap is always drawn + below all other objects in the plot. + + For cases where the provided pixmap doesn't have the same size as the viewport, scaling can be + enabled with \ref setBackgroundScaled and the scaling mode (whether and how the aspect ratio is + preserved) can be set with \ref setBackgroundScaledMode. To set all these options in one call, + consider using the overloaded version of this function. + + If a background brush was set with \ref setBackground(const QBrush &brush), the viewport will + first be filled with that brush, before drawing the background pixmap. This can be useful for + background pixmaps with translucent areas. + + \see setBackgroundScaled, setBackgroundScaledMode +*/ +void QCustomPlot::setBackground(const QPixmap &pm) +{ + mBackgroundPixmap = pm; + mScaledBackgroundPixmap = QPixmap(); +} + +/*! + Sets the background brush of the viewport (see \ref setViewport). + + Before drawing everything else, the background is filled with \a brush. If a background pixmap + was set with \ref setBackground(const QPixmap &pm), this brush will be used to fill the viewport + before the background pixmap is drawn. This can be useful for background pixmaps with translucent + areas. + + Set \a brush to Qt::NoBrush or Qt::Transparent to leave background transparent. This can be + useful for exporting to image formats which support transparency, e.g. \ref savePng. + + \see setBackgroundScaled, setBackgroundScaledMode +*/ +void QCustomPlot::setBackground(const QBrush &brush) +{ + mBackgroundBrush = brush; +} + +/*! \overload + + Allows setting the background pixmap of the viewport, whether it shall be scaled and how it + shall be scaled in one call. + + \see setBackground(const QPixmap &pm), setBackgroundScaled, setBackgroundScaledMode +*/ +void QCustomPlot::setBackground(const QPixmap &pm, bool scaled, Qt::AspectRatioMode mode) +{ + mBackgroundPixmap = pm; + mScaledBackgroundPixmap = QPixmap(); + mBackgroundScaled = scaled; + mBackgroundScaledMode = mode; +} + +/*! + Sets whether the viewport background pixmap shall be scaled to fit the viewport. If \a scaled is + set to true, control whether and how the aspect ratio of the original pixmap is preserved with + \ref setBackgroundScaledMode. + + Note that the scaled version of the original pixmap is buffered, so there is no performance + penalty on replots. (Except when the viewport dimensions are changed continuously.) + + \see setBackground, setBackgroundScaledMode +*/ +void QCustomPlot::setBackgroundScaled(bool scaled) +{ + mBackgroundScaled = scaled; +} + +/*! + If scaling of the viewport background pixmap is enabled (\ref setBackgroundScaled), use this + function to define whether and how the aspect ratio of the original pixmap is preserved. + + \see setBackground, setBackgroundScaled +*/ +void QCustomPlot::setBackgroundScaledMode(Qt::AspectRatioMode mode) +{ + mBackgroundScaledMode = mode; +} + +/*! + Returns the plottable with \a index. If the index is invalid, returns 0. + + There is an overloaded version of this function with no parameter which returns the last added + plottable, see QCustomPlot::plottable() + + \see plottableCount, addPlottable +*/ +QCPAbstractPlottable *QCustomPlot::plottable(int index) +{ + if (index >= 0 && index < mPlottables.size()) + { + return mPlottables.at(index); + } else + { + qDebug() << Q_FUNC_INFO << "index out of bounds:" << index; + return 0; + } +} + +/*! \overload + + Returns the last plottable that was added with \ref addPlottable. If there are no plottables in + the plot, returns 0. + + \see plottableCount, addPlottable +*/ +QCPAbstractPlottable *QCustomPlot::plottable() +{ + if (!mPlottables.isEmpty()) + { + return mPlottables.last(); + } else + return 0; +} + +/*! + Adds the specified plottable to the plot and, if \ref setAutoAddPlottableToLegend is enabled, to + the legend (QCustomPlot::legend). QCustomPlot takes ownership of the plottable. + + Returns true on success, i.e. when \a plottable isn't already in the plot and the parent plot of + \a plottable is this QCustomPlot (the latter is controlled by what axes were passed in the + plottable's constructor). + + \see plottable, plottableCount, removePlottable, clearPlottables +*/ +bool QCustomPlot::addPlottable(QCPAbstractPlottable *plottable) +{ + if (mPlottables.contains(plottable)) + { + qDebug() << Q_FUNC_INFO << "plottable already added to this QCustomPlot:" << reinterpret_cast(plottable); + return false; + } + if (plottable->parentPlot() != this) + { + qDebug() << Q_FUNC_INFO << "plottable not created with this QCustomPlot as parent:" << reinterpret_cast(plottable); + return false; + } + + mPlottables.append(plottable); + // possibly add plottable to legend: + if (mAutoAddPlottableToLegend) + plottable->addToLegend(); + // special handling for QCPGraphs to maintain the simple graph interface: + if (QCPGraph *graph = qobject_cast(plottable)) + mGraphs.append(graph); + if (!plottable->layer()) // usually the layer is already set in the constructor of the plottable (via QCPLayerable constructor) + plottable->setLayer(currentLayer()); + return true; +} + +/*! + Removes the specified plottable from the plot and, if necessary, from the legend (QCustomPlot::legend). + + Returns true on success. + + \see addPlottable, clearPlottables +*/ +bool QCustomPlot::removePlottable(QCPAbstractPlottable *plottable) +{ + if (!mPlottables.contains(plottable)) + { + qDebug() << Q_FUNC_INFO << "plottable not in list:" << reinterpret_cast(plottable); + return false; + } + + // remove plottable from legend: + plottable->removeFromLegend(); + // special handling for QCPGraphs to maintain the simple graph interface: + if (QCPGraph *graph = qobject_cast(plottable)) + mGraphs.removeOne(graph); + // remove plottable: + delete plottable; + mPlottables.removeOne(plottable); + return true; +} + +/*! \overload + + Removes the plottable by its \a index. +*/ +bool QCustomPlot::removePlottable(int index) +{ + if (index >= 0 && index < mPlottables.size()) + return removePlottable(mPlottables[index]); + else + { + qDebug() << Q_FUNC_INFO << "index out of bounds:" << index; + return false; + } +} + +/*! + Removes all plottables from the plot (and the QCustomPlot::legend, if necessary). + + Returns the number of plottables removed. + + \see removePlottable +*/ +int QCustomPlot::clearPlottables() +{ + int c = mPlottables.size(); + for (int i=c-1; i >= 0; --i) + removePlottable(mPlottables[i]); + return c; +} + +/*! + Returns the number of currently existing plottables in the plot + + \see plottable, addPlottable +*/ +int QCustomPlot::plottableCount() const +{ + return mPlottables.size(); +} + +/*! + Returns a list of the selected plottables. If no plottables are currently selected, the list is empty. + + There is a convenience function if you're only interested in selected graphs, see \ref selectedGraphs. + + \see setInteractions, QCPAbstractPlottable::setSelectable, QCPAbstractPlottable::setSelected +*/ +QList QCustomPlot::selectedPlottables() const +{ + QList result; + foreach (QCPAbstractPlottable *plottable, mPlottables) + { + if (plottable->selected()) + result.append(plottable); + } + return result; +} + +/*! + Returns the plottable at the pixel position \a pos. Plottables that only consist of single lines + (like graphs) have a tolerance band around them, see \ref setSelectionTolerance. If multiple + plottables come into consideration, the one closest to \a pos is returned. + + If \a onlySelectable is true, only plottables that are selectable + (QCPAbstractPlottable::setSelectable) are considered. + + If there is no plottable at \a pos, the return value is 0. + + \see itemAt, layoutElementAt +*/ +QCPAbstractPlottable *QCustomPlot::plottableAt(const QPointF &pos, bool onlySelectable) const +{ + QCPAbstractPlottable *resultPlottable = 0; + double resultDistance = mSelectionTolerance; // only regard clicks with distances smaller than mSelectionTolerance as selections, so initialize with that value + + foreach (QCPAbstractPlottable *plottable, mPlottables) + { + if (onlySelectable && !plottable->selectable()) // we could have also passed onlySelectable to the selectTest function, but checking here is faster, because we have access to QCPabstractPlottable::selectable + continue; + if ((plottable->keyAxis()->axisRect()->rect() & plottable->valueAxis()->axisRect()->rect()).contains(pos.toPoint())) // only consider clicks inside the rect that is spanned by the plottable's key/value axes + { + double currentDistance = plottable->selectTest(pos, false); + if (currentDistance >= 0 && currentDistance < resultDistance) + { + resultPlottable = plottable; + resultDistance = currentDistance; + } + } + } + + return resultPlottable; +} + +/*! + Returns whether this QCustomPlot instance contains the \a plottable. + + \see addPlottable +*/ +bool QCustomPlot::hasPlottable(QCPAbstractPlottable *plottable) const +{ + return mPlottables.contains(plottable); +} + +/*! + Returns the graph with \a index. If the index is invalid, returns 0. + + There is an overloaded version of this function with no parameter which returns the last created + graph, see QCustomPlot::graph() + + \see graphCount, addGraph +*/ +QCPGraph *QCustomPlot::graph(int index) const +{ + if (index >= 0 && index < mGraphs.size()) + { + return mGraphs.at(index); + } else + { + qDebug() << Q_FUNC_INFO << "index out of bounds:" << index; + return 0; + } +} + +/*! \overload + + Returns the last graph, that was created with \ref addGraph. If there are no graphs in the plot, + returns 0. + + \see graphCount, addGraph +*/ +QCPGraph *QCustomPlot::graph() const +{ + if (!mGraphs.isEmpty()) + { + return mGraphs.last(); + } else + return 0; +} + +/*! + Creates a new graph inside the plot. If \a keyAxis and \a valueAxis are left unspecified (0), the + bottom (xAxis) is used as key and the left (yAxis) is used as value axis. If specified, \a + keyAxis and \a valueAxis must reside in this QCustomPlot. + + \a keyAxis will be used as key axis (typically "x") and \a valueAxis as value axis (typically + "y") for the graph. + + Returns a pointer to the newly created graph, or 0 if adding the graph failed. + + \see graph, graphCount, removeGraph, clearGraphs +*/ +QCPGraph *QCustomPlot::addGraph(QCPAxis *keyAxis, QCPAxis *valueAxis) +{ + if (!keyAxis) keyAxis = xAxis; + if (!valueAxis) valueAxis = yAxis; + if (!keyAxis || !valueAxis) + { + qDebug() << Q_FUNC_INFO << "can't use default QCustomPlot xAxis or yAxis, because at least one is invalid (has been deleted)"; + return 0; + } + if (keyAxis->parentPlot() != this || valueAxis->parentPlot() != this) + { + qDebug() << Q_FUNC_INFO << "passed keyAxis or valueAxis doesn't have this QCustomPlot as parent"; + return 0; + } + + QCPGraph *newGraph = new QCPGraph(keyAxis, valueAxis); + if (addPlottable(newGraph)) + { + newGraph->setName(QLatin1String("Graph ")+QString::number(mGraphs.size())); + return newGraph; + } else + { + delete newGraph; + return 0; + } +} + +/*! + Removes the specified \a graph from the plot and, if necessary, from the QCustomPlot::legend. If + any other graphs in the plot have a channel fill set towards the removed graph, the channel fill + property of those graphs is reset to zero (no channel fill). + + Returns true on success. + + \see clearGraphs +*/ +bool QCustomPlot::removeGraph(QCPGraph *graph) +{ + return removePlottable(graph); +} + +/*! \overload + + Removes the graph by its \a index. +*/ +bool QCustomPlot::removeGraph(int index) +{ + if (index >= 0 && index < mGraphs.size()) + return removeGraph(mGraphs[index]); + else + return false; +} + +/*! + Removes all graphs from the plot (and the QCustomPlot::legend, if necessary). + + Returns the number of graphs removed. + + \see removeGraph +*/ +int QCustomPlot::clearGraphs() +{ + int c = mGraphs.size(); + for (int i=c-1; i >= 0; --i) + removeGraph(mGraphs[i]); + return c; +} + +/*! + Returns the number of currently existing graphs in the plot + + \see graph, addGraph +*/ +int QCustomPlot::graphCount() const +{ + return mGraphs.size(); +} + +/*! + Returns a list of the selected graphs. If no graphs are currently selected, the list is empty. + + If you are not only interested in selected graphs but other plottables like QCPCurve, QCPBars, + etc., use \ref selectedPlottables. + + \see setInteractions, selectedPlottables, QCPAbstractPlottable::setSelectable, QCPAbstractPlottable::setSelected +*/ +QList QCustomPlot::selectedGraphs() const +{ + QList result; + foreach (QCPGraph *graph, mGraphs) + { + if (graph->selected()) + result.append(graph); + } + return result; +} + +/*! + Returns the item with \a index. If the index is invalid, returns 0. + + There is an overloaded version of this function with no parameter which returns the last added + item, see QCustomPlot::item() + + \see itemCount, addItem +*/ +QCPAbstractItem *QCustomPlot::item(int index) const +{ + if (index >= 0 && index < mItems.size()) + { + return mItems.at(index); + } else + { + qDebug() << Q_FUNC_INFO << "index out of bounds:" << index; + return 0; + } +} + +/*! \overload + + Returns the last item, that was added with \ref addItem. If there are no items in the plot, + returns 0. + + \see itemCount, addItem +*/ +QCPAbstractItem *QCustomPlot::item() const +{ + if (!mItems.isEmpty()) + { + return mItems.last(); + } else + return 0; +} + +/*! + Adds the specified item to the plot. QCustomPlot takes ownership of the item. + + Returns true on success, i.e. when \a item wasn't already in the plot and the parent plot of \a + item is this QCustomPlot. + + \see item, itemCount, removeItem, clearItems +*/ +bool QCustomPlot::addItem(QCPAbstractItem *item) +{ + if (!mItems.contains(item) && item->parentPlot() == this) + { + mItems.append(item); + return true; + } else + { + qDebug() << Q_FUNC_INFO << "item either already in list or not created with this QCustomPlot as parent:" << reinterpret_cast(item); + return false; + } +} + +/*! + Removes the specified item from the plot. + + Returns true on success. + + \see addItem, clearItems +*/ +bool QCustomPlot::removeItem(QCPAbstractItem *item) +{ + if (mItems.contains(item)) + { + delete item; + mItems.removeOne(item); + return true; + } else + { + qDebug() << Q_FUNC_INFO << "item not in list:" << reinterpret_cast(item); + return false; + } +} + +/*! \overload + + Removes the item by its \a index. +*/ +bool QCustomPlot::removeItem(int index) +{ + if (index >= 0 && index < mItems.size()) + return removeItem(mItems[index]); + else + { + qDebug() << Q_FUNC_INFO << "index out of bounds:" << index; + return false; + } +} + +/*! + Removes all items from the plot. + + Returns the number of items removed. + + \see removeItem +*/ +int QCustomPlot::clearItems() +{ + int c = mItems.size(); + for (int i=c-1; i >= 0; --i) + removeItem(mItems[i]); + return c; +} + +/*! + Returns the number of currently existing items in the plot + + \see item, addItem +*/ +int QCustomPlot::itemCount() const +{ + return mItems.size(); +} + +/*! + Returns a list of the selected items. If no items are currently selected, the list is empty. + + \see setInteractions, QCPAbstractItem::setSelectable, QCPAbstractItem::setSelected +*/ +QList QCustomPlot::selectedItems() const +{ + QList result; + foreach (QCPAbstractItem *item, mItems) + { + if (item->selected()) + result.append(item); + } + return result; +} + +/*! + Returns the item at the pixel position \a pos. Items that only consist of single lines (e.g. \ref + QCPItemLine or \ref QCPItemCurve) have a tolerance band around them, see \ref + setSelectionTolerance. If multiple items come into consideration, the one closest to \a pos is + returned. + + If \a onlySelectable is true, only items that are selectable (QCPAbstractItem::setSelectable) are + considered. + + If there is no item at \a pos, the return value is 0. + + \see plottableAt, layoutElementAt +*/ +QCPAbstractItem *QCustomPlot::itemAt(const QPointF &pos, bool onlySelectable) const +{ + QCPAbstractItem *resultItem = 0; + double resultDistance = mSelectionTolerance; // only regard clicks with distances smaller than mSelectionTolerance as selections, so initialize with that value + + foreach (QCPAbstractItem *item, mItems) + { + if (onlySelectable && !item->selectable()) // we could have also passed onlySelectable to the selectTest function, but checking here is faster, because we have access to QCPAbstractItem::selectable + continue; + if (!item->clipToAxisRect() || item->clipRect().contains(pos.toPoint())) // only consider clicks inside axis cliprect of the item if actually clipped to it + { + double currentDistance = item->selectTest(pos, false); + if (currentDistance >= 0 && currentDistance < resultDistance) + { + resultItem = item; + resultDistance = currentDistance; + } + } + } + + return resultItem; +} + +/*! + Returns whether this QCustomPlot contains the \a item. + + \see addItem +*/ +bool QCustomPlot::hasItem(QCPAbstractItem *item) const +{ + return mItems.contains(item); +} + +/*! + Returns the layer with the specified \a name. If there is no layer with the specified name, 0 is + returned. + + Layer names are case-sensitive. + + \see addLayer, moveLayer, removeLayer +*/ +QCPLayer *QCustomPlot::layer(const QString &name) const +{ + foreach (QCPLayer *layer, mLayers) + { + if (layer->name() == name) + return layer; + } + return 0; +} + +/*! \overload + + Returns the layer by \a index. If the index is invalid, 0 is returned. + + \see addLayer, moveLayer, removeLayer +*/ +QCPLayer *QCustomPlot::layer(int index) const +{ + if (index >= 0 && index < mLayers.size()) + { + return mLayers.at(index); + } else + { + qDebug() << Q_FUNC_INFO << "index out of bounds:" << index; + return 0; + } +} + +/*! + Returns the layer that is set as current layer (see \ref setCurrentLayer). +*/ +QCPLayer *QCustomPlot::currentLayer() const +{ + return mCurrentLayer; +} + +/*! + Sets the layer with the specified \a name to be the current layer. All layerables (\ref + QCPLayerable), e.g. plottables and items, are created on the current layer. + + Returns true on success, i.e. if there is a layer with the specified \a name in the QCustomPlot. + + Layer names are case-sensitive. + + \see addLayer, moveLayer, removeLayer, QCPLayerable::setLayer +*/ +bool QCustomPlot::setCurrentLayer(const QString &name) +{ + if (QCPLayer *newCurrentLayer = layer(name)) + { + return setCurrentLayer(newCurrentLayer); + } else + { + qDebug() << Q_FUNC_INFO << "layer with name doesn't exist:" << name; + return false; + } +} + +/*! \overload + + Sets the provided \a layer to be the current layer. + + Returns true on success, i.e. when \a layer is a valid layer in the QCustomPlot. + + \see addLayer, moveLayer, removeLayer +*/ +bool QCustomPlot::setCurrentLayer(QCPLayer *layer) +{ + if (!mLayers.contains(layer)) + { + qDebug() << Q_FUNC_INFO << "layer not a layer of this QCustomPlot:" << reinterpret_cast(layer); + return false; + } + + mCurrentLayer = layer; + return true; +} + +/*! + Returns the number of currently existing layers in the plot + + \see layer, addLayer +*/ +int QCustomPlot::layerCount() const +{ + return mLayers.size(); +} + +/*! + Adds a new layer to this QCustomPlot instance. The new layer will have the name \a name, which + must be unique. Depending on \a insertMode, it is positioned either below or above \a otherLayer. + + Returns true on success, i.e. if there is no other layer named \a name and \a otherLayer is a + valid layer inside this QCustomPlot. + + If \a otherLayer is 0, the highest layer in the QCustomPlot will be used. + + For an explanation of what layers are in QCustomPlot, see the documentation of \ref QCPLayer. + + \see layer, moveLayer, removeLayer +*/ +bool QCustomPlot::addLayer(const QString &name, QCPLayer *otherLayer, QCustomPlot::LayerInsertMode insertMode) +{ + if (!otherLayer) + otherLayer = mLayers.last(); + if (!mLayers.contains(otherLayer)) + { + qDebug() << Q_FUNC_INFO << "otherLayer not a layer of this QCustomPlot:" << reinterpret_cast(otherLayer); + return false; + } + if (layer(name)) + { + qDebug() << Q_FUNC_INFO << "A layer exists already with the name" << name; + return false; + } + + QCPLayer *newLayer = new QCPLayer(this, name); + mLayers.insert(otherLayer->index() + (insertMode==limAbove ? 1:0), newLayer); + updateLayerIndices(); + return true; +} + +/*! + Removes the specified \a layer and returns true on success. + + All layerables (e.g. plottables and items) on the removed layer will be moved to the layer below + \a layer. If \a layer is the bottom layer, the layerables are moved to the layer above. In both + cases, the total rendering order of all layerables in the QCustomPlot is preserved. + + If \a layer is the current layer (\ref setCurrentLayer), the layer below (or above, if bottom + layer) becomes the new current layer. + + It is not possible to remove the last layer of the plot. + + \see layer, addLayer, moveLayer +*/ +bool QCustomPlot::removeLayer(QCPLayer *layer) +{ + if (!mLayers.contains(layer)) + { + qDebug() << Q_FUNC_INFO << "layer not a layer of this QCustomPlot:" << reinterpret_cast(layer); + return false; + } + if (mLayers.size() < 2) + { + qDebug() << Q_FUNC_INFO << "can't remove last layer"; + return false; + } + + // append all children of this layer to layer below (if this is lowest layer, prepend to layer above) + int removedIndex = layer->index(); + bool isFirstLayer = removedIndex==0; + QCPLayer *targetLayer = isFirstLayer ? mLayers.at(removedIndex+1) : mLayers.at(removedIndex-1); + QList children = layer->children(); + if (isFirstLayer) // prepend in reverse order (so order relative to each other stays the same) + { + for (int i=children.size()-1; i>=0; --i) + children.at(i)->moveToLayer(targetLayer, true); + } else // append normally + { + for (int i=0; imoveToLayer(targetLayer, false); + } + // if removed layer is current layer, change current layer to layer below/above: + if (layer == mCurrentLayer) + setCurrentLayer(targetLayer); + // remove layer: + delete layer; + mLayers.removeOne(layer); + updateLayerIndices(); + return true; +} + +/*! + Moves the specified \a layer either above or below \a otherLayer. Whether it's placed above or + below is controlled with \a insertMode. + + Returns true on success, i.e. when both \a layer and \a otherLayer are valid layers in the + QCustomPlot. + + \see layer, addLayer, moveLayer +*/ +bool QCustomPlot::moveLayer(QCPLayer *layer, QCPLayer *otherLayer, QCustomPlot::LayerInsertMode insertMode) +{ + if (!mLayers.contains(layer)) + { + qDebug() << Q_FUNC_INFO << "layer not a layer of this QCustomPlot:" << reinterpret_cast(layer); + return false; + } + if (!mLayers.contains(otherLayer)) + { + qDebug() << Q_FUNC_INFO << "otherLayer not a layer of this QCustomPlot:" << reinterpret_cast(otherLayer); + return false; + } + + if (layer->index() > otherLayer->index()) + mLayers.move(layer->index(), otherLayer->index() + (insertMode==limAbove ? 1:0)); + else if (layer->index() < otherLayer->index()) + mLayers.move(layer->index(), otherLayer->index() + (insertMode==limAbove ? 0:-1)); + + updateLayerIndices(); + return true; +} + +/*! + Returns the number of axis rects in the plot. + + All axis rects can be accessed via QCustomPlot::axisRect(). + + Initially, only one axis rect exists in the plot. + + \see axisRect, axisRects +*/ +int QCustomPlot::axisRectCount() const +{ + return axisRects().size(); +} + +/*! + Returns the axis rect with \a index. + + Initially, only one axis rect (with index 0) exists in the plot. If multiple axis rects were + added, all of them may be accessed with this function in a linear fashion (even when they are + nested in a layout hierarchy or inside other axis rects via QCPAxisRect::insetLayout). + + \see axisRectCount, axisRects +*/ +QCPAxisRect *QCustomPlot::axisRect(int index) const +{ + const QList rectList = axisRects(); + if (index >= 0 && index < rectList.size()) + { + return rectList.at(index); + } else + { + qDebug() << Q_FUNC_INFO << "invalid axis rect index" << index; + return 0; + } +} + +/*! + Returns all axis rects in the plot. + + \see axisRectCount, axisRect +*/ +QList QCustomPlot::axisRects() const +{ + QList result; + QStack elementStack; + if (mPlotLayout) + elementStack.push(mPlotLayout); + + while (!elementStack.isEmpty()) + { + foreach (QCPLayoutElement *element, elementStack.pop()->elements(false)) + { + if (element) + { + elementStack.push(element); + if (QCPAxisRect *ar = qobject_cast(element)) + result.append(ar); + } + } + } + + return result; +} + +/*! + Returns the layout element at pixel position \a pos. If there is no element at that position, + returns 0. + + Only visible elements are used. If \ref QCPLayoutElement::setVisible on the element itself or on + any of its parent elements is set to false, it will not be considered. + + \see itemAt, plottableAt +*/ +QCPLayoutElement *QCustomPlot::layoutElementAt(const QPointF &pos) const +{ + QCPLayoutElement *currentElement = mPlotLayout; + bool searchSubElements = true; + while (searchSubElements && currentElement) + { + searchSubElements = false; + foreach (QCPLayoutElement *subElement, currentElement->elements(false)) + { + if (subElement && subElement->realVisibility() && subElement->selectTest(pos, false) >= 0) + { + currentElement = subElement; + searchSubElements = true; + break; + } + } + } + return currentElement; +} + +/*! + Returns the axes that currently have selected parts, i.e. whose selection state is not \ref + QCPAxis::spNone. + + \see selectedPlottables, selectedLegends, setInteractions, QCPAxis::setSelectedParts, + QCPAxis::setSelectableParts +*/ +QList QCustomPlot::selectedAxes() const +{ + QList result, allAxes; + foreach (QCPAxisRect *rect, axisRects()) + allAxes << rect->axes(); + + foreach (QCPAxis *axis, allAxes) + { + if (axis->selectedParts() != QCPAxis::spNone) + result.append(axis); + } + + return result; +} + +/*! + Returns the legends that currently have selected parts, i.e. whose selection state is not \ref + QCPLegend::spNone. + + \see selectedPlottables, selectedAxes, setInteractions, QCPLegend::setSelectedParts, + QCPLegend::setSelectableParts, QCPLegend::selectedItems +*/ +QList QCustomPlot::selectedLegends() const +{ + QList result; + + QStack elementStack; + if (mPlotLayout) + elementStack.push(mPlotLayout); + + while (!elementStack.isEmpty()) + { + foreach (QCPLayoutElement *subElement, elementStack.pop()->elements(false)) + { + if (subElement) + { + elementStack.push(subElement); + if (QCPLegend *leg = qobject_cast(subElement)) + { + if (leg->selectedParts() != QCPLegend::spNone) + result.append(leg); + } + } + } + } + + return result; +} + +/*! + Deselects all layerables (plottables, items, axes, legends,...) of the QCustomPlot. + + Since calling this function is not a user interaction, this does not emit the \ref + selectionChangedByUser signal. The individual selectionChanged signals are emitted though, if the + objects were previously selected. + + \see setInteractions, selectedPlottables, selectedItems, selectedAxes, selectedLegends +*/ +void QCustomPlot::deselectAll() +{ + foreach (QCPLayer *layer, mLayers) + { + foreach (QCPLayerable *layerable, layer->children()) + layerable->deselectEvent(0); + } +} + +/*! + Causes a complete replot into the internal buffer. Finally, update() is called, to redraw the + buffer on the QCustomPlot widget surface. This is the method that must be called to make changes, + for example on the axis ranges or data points of graphs, visible. + + Under a few circumstances, QCustomPlot causes a replot by itself. Those are resize events of the + QCustomPlot widget and user interactions (object selection and range dragging/zooming). + + Before the replot happens, the signal \ref beforeReplot is emitted. After the replot, \ref + afterReplot is emitted. It is safe to mutually connect the replot slot with any of those two + signals on two QCustomPlots to make them replot synchronously, it won't cause an infinite + recursion. +*/ +void QCustomPlot::replot(QCustomPlot::RefreshPriority refreshPriority) +{ + if (mReplotting) // incase signals loop back to replot slot + return; + mReplotting = true; + emit beforeReplot(); + + mPaintBuffer.fill(mBackgroundBrush.style() == Qt::SolidPattern ? mBackgroundBrush.color() : Qt::transparent); + QCPPainter painter; + painter.begin(&mPaintBuffer); + if (painter.isActive()) + { + painter.setRenderHint(QPainter::HighQualityAntialiasing); // to make Antialiasing look good if using the OpenGL graphicssystem + if (mBackgroundBrush.style() != Qt::SolidPattern && mBackgroundBrush.style() != Qt::NoBrush) + painter.fillRect(mViewport, mBackgroundBrush); + draw(&painter); + painter.end(); + if ((refreshPriority == rpHint && mPlottingHints.testFlag(QCP::phForceRepaint)) || refreshPriority==rpImmediate) + repaint(); + else + update(); + } else // might happen if QCustomPlot has width or height zero + qDebug() << Q_FUNC_INFO << "Couldn't activate painter on buffer. This usually happens because QCustomPlot has width or height zero."; + + emit afterReplot(); + mReplotting = false; +} + +/*! + Rescales the axes such that all plottables (like graphs) in the plot are fully visible. + + if \a onlyVisiblePlottables is set to true, only the plottables that have their visibility set to true + (QCPLayerable::setVisible), will be used to rescale the axes. + + \see QCPAbstractPlottable::rescaleAxes, QCPAxis::rescale +*/ +void QCustomPlot::rescaleAxes(bool onlyVisiblePlottables) +{ + QList allAxes; + foreach (QCPAxisRect *rect, axisRects()) + allAxes << rect->axes(); + + foreach (QCPAxis *axis, allAxes) + axis->rescale(onlyVisiblePlottables); +} + +/*! + Saves a PDF with the vectorized plot to the file \a fileName. The axis ratio as well as the scale + of texts and lines will be derived from the specified \a width and \a height. This means, the + output will look like the normal on-screen output of a QCustomPlot widget with the corresponding + pixel width and height. If either \a width or \a height is zero, the exported image will have the + same dimensions as the QCustomPlot widget currently has. + + \a noCosmeticPen disables the use of cosmetic pens when drawing to the PDF file. Cosmetic pens + are pens with numerical width 0, which are always drawn as a one pixel wide line, no matter what + zoom factor is set in the PDF-Viewer. For more information about cosmetic pens, see the QPainter + and QPen documentation. + + The objects of the plot will appear in the current selection state. If you don't want any + selected objects to be painted in their selected look, deselect everything with \ref deselectAll + before calling this function. + + Returns true on success. + + \warning + \li If you plan on editing the exported PDF file with a vector graphics editor like + Inkscape, it is advised to set \a noCosmeticPen to true to avoid losing those cosmetic lines + (which might be quite many, because cosmetic pens are the default for e.g. axes and tick marks). + \li If calling this function inside the constructor of the parent of the QCustomPlot widget + (i.e. the MainWindow constructor, if QCustomPlot is inside the MainWindow), always provide + explicit non-zero widths and heights. If you leave \a width or \a height as 0 (default), this + function uses the current width and height of the QCustomPlot widget. However, in Qt, these + aren't defined yet inside the constructor, so you would get an image that has strange + widths/heights. + + \a pdfCreator and \a pdfTitle may be used to set the according metadata fields in the resulting + PDF file. + + \note On Android systems, this method does nothing and issues an according qDebug warning + message. This is also the case if for other reasons the define flag QT_NO_PRINTER is set. + + \see savePng, saveBmp, saveJpg, saveRastered +*/ +bool QCustomPlot::savePdf(const QString &fileName, bool noCosmeticPen, int width, int height, const QString &pdfCreator, const QString &pdfTitle) +{ + bool success = false; +#ifdef QT_NO_PRINTER + Q_UNUSED(fileName) + Q_UNUSED(noCosmeticPen) + Q_UNUSED(width) + Q_UNUSED(height) + Q_UNUSED(pdfCreator) + Q_UNUSED(pdfTitle) + qDebug() << Q_FUNC_INFO << "Qt was built without printer support (QT_NO_PRINTER). PDF not created."; +#else + int newWidth, newHeight; + if (width == 0 || height == 0) + { + newWidth = this->width(); + newHeight = this->height(); + } else + { + newWidth = width; + newHeight = height; + } + + QPrinter printer(QPrinter::ScreenResolution); + printer.setOutputFileName(fileName); + printer.setOutputFormat(QPrinter::PdfFormat); + printer.setColorMode(QPrinter::Color); + printer.printEngine()->setProperty(QPrintEngine::PPK_Creator, pdfCreator); + printer.printEngine()->setProperty(QPrintEngine::PPK_DocumentName, pdfTitle); + QRect oldViewport = viewport(); + setViewport(QRect(0, 0, newWidth, newHeight)); +#if QT_VERSION < QT_VERSION_CHECK(5, 3, 0) + printer.setFullPage(true); + printer.setPaperSize(viewport().size(), QPrinter::DevicePixel); +#else + QPageLayout pageLayout; + pageLayout.setMode(QPageLayout::FullPageMode); + pageLayout.setOrientation(QPageLayout::Portrait); + pageLayout.setMargins(QMarginsF(0, 0, 0, 0)); + pageLayout.setPageSize(QPageSize(viewport().size(), QPageSize::Point, QString(), QPageSize::ExactMatch)); + printer.setPageLayout(pageLayout); +#endif + QCPPainter printpainter; + if (printpainter.begin(&printer)) + { + printpainter.setMode(QCPPainter::pmVectorized); + printpainter.setMode(QCPPainter::pmNoCaching); + printpainter.setMode(QCPPainter::pmNonCosmetic, noCosmeticPen); + printpainter.setWindow(mViewport); + if (mBackgroundBrush.style() != Qt::NoBrush && + mBackgroundBrush.color() != Qt::white && + mBackgroundBrush.color() != Qt::transparent && + mBackgroundBrush.color().alpha() > 0) // draw pdf background color if not white/transparent + printpainter.fillRect(viewport(), mBackgroundBrush); + draw(&printpainter); + printpainter.end(); + success = true; + } + setViewport(oldViewport); +#endif // QT_NO_PRINTER + return success; +} + +/*! + Saves a PNG image file to \a fileName on disc. The output plot will have the dimensions \a width + and \a height in pixels. If either \a width or \a height is zero, the exported image will have + the same dimensions as the QCustomPlot widget currently has. Line widths and texts etc. are not + scaled up when larger widths/heights are used. If you want that effect, use the \a scale parameter. + + For example, if you set both \a width and \a height to 100 and \a scale to 2, you will end up with an + image file of size 200*200 in which all graphical elements are scaled up by factor 2 (line widths, + texts, etc.). This scaling is not done by stretching a 100*100 image, the result will have full + 200*200 pixel resolution. + + If you use a high scaling factor, it is recommended to enable antialiasing for all elements via + temporarily setting \ref QCustomPlot::setAntialiasedElements to \ref QCP::aeAll as this allows + QCustomPlot to place objects with sub-pixel accuracy. + + \warning If calling this function inside the constructor of the parent of the QCustomPlot widget + (i.e. the MainWindow constructor, if QCustomPlot is inside the MainWindow), always provide + explicit non-zero widths and heights. If you leave \a width or \a height as 0 (default), this + function uses the current width and height of the QCustomPlot widget. However, in Qt, these + aren't defined yet inside the constructor, so you would get an image that has strange + widths/heights. + + The objects of the plot will appear in the current selection state. If you don't want any selected + objects to be painted in their selected look, deselect everything with \ref deselectAll before calling + this function. + + If you want the PNG to have a transparent background, call \ref setBackground(const QBrush + &brush) with no brush (Qt::NoBrush) or a transparent color (Qt::transparent), before saving. + + PNG compression can be controlled with the \a quality parameter which must be between 0 and 100 or + -1 to use the default setting. + + Returns true on success. If this function fails, most likely the PNG format isn't supported by + the system, see Qt docs about QImageWriter::supportedImageFormats(). + + \see savePdf, saveBmp, saveJpg, saveRastered +*/ +bool QCustomPlot::savePng(const QString &fileName, int width, int height, double scale, int quality) +{ + return saveRastered(fileName, width, height, scale, "PNG", quality); +} + +/*! + Saves a JPG image file to \a fileName on disc. The output plot will have the dimensions \a width + and \a height in pixels. If either \a width or \a height is zero, the exported image will have + the same dimensions as the QCustomPlot widget currently has. Line widths and texts etc. are not + scaled up when larger widths/heights are used. If you want that effect, use the \a scale parameter. + + For example, if you set both \a width and \a height to 100 and \a scale to 2, you will end up with an + image file of size 200*200 in which all graphical elements are scaled up by factor 2 (line widths, + texts, etc.). This scaling is not done by stretching a 100*100 image, the result will have full + 200*200 pixel resolution. + + If you use a high scaling factor, it is recommended to enable antialiasing for all elements via + temporarily setting \ref QCustomPlot::setAntialiasedElements to \ref QCP::aeAll as this allows + QCustomPlot to place objects with sub-pixel accuracy. + + \warning If calling this function inside the constructor of the parent of the QCustomPlot widget + (i.e. the MainWindow constructor, if QCustomPlot is inside the MainWindow), always provide + explicit non-zero widths and heights. If you leave \a width or \a height as 0 (default), this + function uses the current width and height of the QCustomPlot widget. However, in Qt, these + aren't defined yet inside the constructor, so you would get an image that has strange + widths/heights. + + The objects of the plot will appear in the current selection state. If you don't want any selected + objects to be painted in their selected look, deselect everything with \ref deselectAll before calling + this function. + + JPG compression can be controlled with the \a quality parameter which must be between 0 and 100 or + -1 to use the default setting. + + Returns true on success. If this function fails, most likely the JPG format isn't supported by + the system, see Qt docs about QImageWriter::supportedImageFormats(). + + \see savePdf, savePng, saveBmp, saveRastered +*/ +bool QCustomPlot::saveJpg(const QString &fileName, int width, int height, double scale, int quality) +{ + return saveRastered(fileName, width, height, scale, "JPG", quality); +} + +/*! + Saves a BMP image file to \a fileName on disc. The output plot will have the dimensions \a width + and \a height in pixels. If either \a width or \a height is zero, the exported image will have + the same dimensions as the QCustomPlot widget currently has. Line widths and texts etc. are not + scaled up when larger widths/heights are used. If you want that effect, use the \a scale parameter. + + For example, if you set both \a width and \a height to 100 and \a scale to 2, you will end up with an + image file of size 200*200 in which all graphical elements are scaled up by factor 2 (line widths, + texts, etc.). This scaling is not done by stretching a 100*100 image, the result will have full + 200*200 pixel resolution. + + If you use a high scaling factor, it is recommended to enable antialiasing for all elements via + temporarily setting \ref QCustomPlot::setAntialiasedElements to \ref QCP::aeAll as this allows + QCustomPlot to place objects with sub-pixel accuracy. + + \warning If calling this function inside the constructor of the parent of the QCustomPlot widget + (i.e. the MainWindow constructor, if QCustomPlot is inside the MainWindow), always provide + explicit non-zero widths and heights. If you leave \a width or \a height as 0 (default), this + function uses the current width and height of the QCustomPlot widget. However, in Qt, these + aren't defined yet inside the constructor, so you would get an image that has strange + widths/heights. + + The objects of the plot will appear in the current selection state. If you don't want any selected + objects to be painted in their selected look, deselect everything with \ref deselectAll before calling + this function. + + Returns true on success. If this function fails, most likely the BMP format isn't supported by + the system, see Qt docs about QImageWriter::supportedImageFormats(). + + \see savePdf, savePng, saveJpg, saveRastered +*/ +bool QCustomPlot::saveBmp(const QString &fileName, int width, int height, double scale) +{ + return saveRastered(fileName, width, height, scale, "BMP"); +} + +/*! \internal + + Returns a minimum size hint that corresponds to the minimum size of the top level layout + (\ref plotLayout). To prevent QCustomPlot from being collapsed to size/width zero, set a minimum + size (setMinimumSize) either on the whole QCustomPlot or on any layout elements inside the plot. + This is especially important, when placed in a QLayout where other components try to take in as + much space as possible (e.g. QMdiArea). +*/ +QSize QCustomPlot::minimumSizeHint() const +{ + return mPlotLayout->minimumSizeHint(); +} + +/*! \internal + + Returns a size hint that is the same as \ref minimumSizeHint. + +*/ +QSize QCustomPlot::sizeHint() const +{ + return mPlotLayout->minimumSizeHint(); +} + +/*! \internal + + Event handler for when the QCustomPlot widget needs repainting. This does not cause a \ref replot, but + draws the internal buffer on the widget surface. +*/ +void QCustomPlot::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event); + QPainter painter(this); + painter.drawPixmap(0, 0, mPaintBuffer); +} + +/*! \internal + + Event handler for a resize of the QCustomPlot widget. Causes the internal buffer to be resized to + the new size. The viewport (which becomes the outer rect of mPlotLayout) is resized + appropriately. Finally a \ref replot is performed. +*/ +void QCustomPlot::resizeEvent(QResizeEvent *event) +{ + // resize and repaint the buffer: + mPaintBuffer = QPixmap(event->size()); + setViewport(rect()); + replot(rpQueued); // queued update is important here, to prevent painting issues in some contexts +} + +/*! \internal + + Event handler for when a double click occurs. Emits the \ref mouseDoubleClick signal, then emits + the specialized signals when certain objecs are clicked (e.g. \ref plottableDoubleClick, \ref + axisDoubleClick, etc.). Finally determines the affected layout element and forwards the event to + it. + + \see mousePressEvent, mouseReleaseEvent +*/ +void QCustomPlot::mouseDoubleClickEvent(QMouseEvent *event) +{ + emit mouseDoubleClick(event); + + QVariant details; + QCPLayerable *clickedLayerable = layerableAt(event->pos(), false, &details); + + // emit specialized object double click signals: + if (QCPAbstractPlottable *ap = qobject_cast(clickedLayerable)) + emit plottableDoubleClick(ap, event); + else if (QCPAxis *ax = qobject_cast(clickedLayerable)) + emit axisDoubleClick(ax, details.value(), event); + else if (QCPAbstractItem *ai = qobject_cast(clickedLayerable)) + emit itemDoubleClick(ai, event); + else if (QCPLegend *lg = qobject_cast(clickedLayerable)) + emit legendDoubleClick(lg, 0, event); + else if (QCPAbstractLegendItem *li = qobject_cast(clickedLayerable)) + emit legendDoubleClick(li->parentLegend(), li, event); + else if (QCPPlotTitle *pt = qobject_cast(clickedLayerable)) + emit titleDoubleClick(event, pt); + + // call double click event of affected layout element: + if (QCPLayoutElement *el = layoutElementAt(event->pos())) + el->mouseDoubleClickEvent(event); + + // call release event of affected layout element (as in mouseReleaseEvent, since the mouseDoubleClick replaces the second release event in double click case): + if (mMouseEventElement) + { + mMouseEventElement->mouseReleaseEvent(event); + mMouseEventElement = 0; + } + + //QWidget::mouseDoubleClickEvent(event); don't call base class implementation because it would just cause a mousePress/ReleaseEvent, which we don't want. +} + +/*! \internal + + Event handler for when a mouse button is pressed. Emits the mousePress signal. Then determines + the affected layout element and forwards the event to it. + + \see mouseMoveEvent, mouseReleaseEvent +*/ +void QCustomPlot::mousePressEvent(QMouseEvent *event) +{ + emit mousePress(event); + mMousePressPos = event->pos(); // need this to determine in releaseEvent whether it was a click (no position change between press and release) + + // call event of affected layout element: + mMouseEventElement = layoutElementAt(event->pos()); + if (mMouseEventElement) + mMouseEventElement->mousePressEvent(event); + + QWidget::mousePressEvent(event); +} + +/*! \internal + + Event handler for when the cursor is moved. Emits the \ref mouseMove signal. + + If a layout element has mouse capture focus (a mousePressEvent happened on top of the layout + element before), the mouseMoveEvent is forwarded to that element. + + \see mousePressEvent, mouseReleaseEvent +*/ +void QCustomPlot::mouseMoveEvent(QMouseEvent *event) +{ + emit mouseMove(event); + + // call event of affected layout element: + if (mMouseEventElement) + mMouseEventElement->mouseMoveEvent(event); + + QWidget::mouseMoveEvent(event); +} + +/*! \internal + + Event handler for when a mouse button is released. Emits the \ref mouseRelease signal. + + If the mouse was moved less than a certain threshold in any direction since the \ref + mousePressEvent, it is considered a click which causes the selection mechanism (if activated via + \ref setInteractions) to possibly change selection states accordingly. Further, specialized mouse + click signals are emitted (e.g. \ref plottableClick, \ref axisClick, etc.) + + If a layout element has mouse capture focus (a \ref mousePressEvent happened on top of the layout + element before), the \ref mouseReleaseEvent is forwarded to that element. + + \see mousePressEvent, mouseMoveEvent +*/ +void QCustomPlot::mouseReleaseEvent(QMouseEvent *event) +{ + emit mouseRelease(event); + bool doReplot = false; + + if ((mMousePressPos-event->pos()).manhattanLength() < 5) // determine whether it was a click operation + { + if (event->button() == Qt::LeftButton) + { + // handle selection mechanism: + QVariant details; + QCPLayerable *clickedLayerable = layerableAt(event->pos(), true, &details); + bool selectionStateChanged = false; + bool additive = mInteractions.testFlag(QCP::iMultiSelect) && event->modifiers().testFlag(mMultiSelectModifier); + // deselect all other layerables if not additive selection: + if (!additive) + { + foreach (QCPLayer *layer, mLayers) + { + foreach (QCPLayerable *layerable, layer->children()) + { + if (layerable != clickedLayerable && mInteractions.testFlag(layerable->selectionCategory())) + { + bool selChanged = false; + layerable->deselectEvent(&selChanged); + selectionStateChanged |= selChanged; + } + } + } + } + if (clickedLayerable && mInteractions.testFlag(clickedLayerable->selectionCategory())) + { + // a layerable was actually clicked, call its selectEvent: + bool selChanged = false; + clickedLayerable->selectEvent(event, additive, details, &selChanged); + selectionStateChanged |= selChanged; + } + if (selectionStateChanged) + { + doReplot = true; + emit selectionChangedByUser(); + } + } + + // emit specialized object click signals: + QVariant details; + QCPLayerable *clickedLayerable = layerableAt(event->pos(), false, &details); // for these signals, selectability is ignored, that's why we call this again with onlySelectable set to false + if (QCPAbstractPlottable *ap = qobject_cast(clickedLayerable)) + emit plottableClick(ap, event); + else if (QCPAxis *ax = qobject_cast(clickedLayerable)) + emit axisClick(ax, details.value(), event); + else if (QCPAbstractItem *ai = qobject_cast(clickedLayerable)) + emit itemClick(ai, event); + else if (QCPLegend *lg = qobject_cast(clickedLayerable)) + emit legendClick(lg, 0, event); + else if (QCPAbstractLegendItem *li = qobject_cast(clickedLayerable)) + emit legendClick(li->parentLegend(), li, event); + else if (QCPPlotTitle *pt = qobject_cast(clickedLayerable)) + emit titleClick(event, pt); + } + + // call event of affected layout element: + if (mMouseEventElement) + { + mMouseEventElement->mouseReleaseEvent(event); + mMouseEventElement = 0; + } + + if (doReplot || noAntialiasingOnDrag()) + replot(); + + QWidget::mouseReleaseEvent(event); +} + +/*! \internal + + Event handler for mouse wheel events. First, the \ref mouseWheel signal is emitted. Then + determines the affected layout element and forwards the event to it. + +*/ +void QCustomPlot::wheelEvent(QWheelEvent *event) +{ + emit mouseWheel(event); + + // call event of affected layout element: + if (QCPLayoutElement *el = layoutElementAt(event->pos())) + el->wheelEvent(event); + + QWidget::wheelEvent(event); +} + +/*! \internal + + This is the main draw function. It draws the entire plot, including background pixmap, with the + specified \a painter. Note that it does not fill the background with the background brush (as the + user may specify with \ref setBackground(const QBrush &brush)), this is up to the respective + functions calling this method (e.g. \ref replot, \ref toPixmap and \ref toPainter). +*/ +void QCustomPlot::draw(QCPPainter *painter) +{ + // run through layout phases: + mPlotLayout->update(QCPLayoutElement::upPreparation); + mPlotLayout->update(QCPLayoutElement::upMargins); + mPlotLayout->update(QCPLayoutElement::upLayout); + + // draw viewport background pixmap: + drawBackground(painter); + + // draw all layered objects (grid, axes, plottables, items, legend,...): + foreach (QCPLayer *layer, mLayers) + { + foreach (QCPLayerable *child, layer->children()) + { + if (child->realVisibility()) + { + painter->save(); + painter->setClipRect(child->clipRect().translated(0, -1)); + child->applyDefaultAntialiasingHint(painter); + child->draw(painter); + painter->restore(); + } + } + } + + /* Debug code to draw all layout element rects + foreach (QCPLayoutElement* el, findChildren()) + { + painter->setBrush(Qt::NoBrush); + painter->setPen(QPen(QColor(0, 0, 0, 100), 0, Qt::DashLine)); + painter->drawRect(el->rect()); + painter->setPen(QPen(QColor(255, 0, 0, 100), 0, Qt::DashLine)); + painter->drawRect(el->outerRect()); + } + */ +} + +/*! \internal + + Draws the viewport background pixmap of the plot. + + If a pixmap was provided via \ref setBackground, this function buffers the scaled version + depending on \ref setBackgroundScaled and \ref setBackgroundScaledMode and then draws it inside + the viewport with the provided \a painter. The scaled version is buffered in + mScaledBackgroundPixmap to prevent expensive rescaling at every redraw. It is only updated, when + the axis rect has changed in a way that requires a rescale of the background pixmap (this is + dependent on the \ref setBackgroundScaledMode), or when a differend axis background pixmap was + set. + + Note that this function does not draw a fill with the background brush (\ref setBackground(const + QBrush &brush)) beneath the pixmap. + + \see setBackground, setBackgroundScaled, setBackgroundScaledMode +*/ +void QCustomPlot::drawBackground(QCPPainter *painter) +{ + // Note: background color is handled in individual replot/save functions + + // draw background pixmap (on top of fill, if brush specified): + if (!mBackgroundPixmap.isNull()) + { + if (mBackgroundScaled) + { + // check whether mScaledBackground needs to be updated: + QSize scaledSize(mBackgroundPixmap.size()); + scaledSize.scale(mViewport.size(), mBackgroundScaledMode); + if (mScaledBackgroundPixmap.size() != scaledSize) + mScaledBackgroundPixmap = mBackgroundPixmap.scaled(mViewport.size(), mBackgroundScaledMode, Qt::SmoothTransformation); + painter->drawPixmap(mViewport.topLeft(), mScaledBackgroundPixmap, QRect(0, 0, mViewport.width(), mViewport.height()) & mScaledBackgroundPixmap.rect()); + } else + { + painter->drawPixmap(mViewport.topLeft(), mBackgroundPixmap, QRect(0, 0, mViewport.width(), mViewport.height())); + } + } +} + + +/*! \internal + + This method is used by \ref QCPAxisRect::removeAxis to report removed axes to the QCustomPlot + so it may clear its QCustomPlot::xAxis, yAxis, xAxis2 and yAxis2 members accordingly. +*/ +void QCustomPlot::axisRemoved(QCPAxis *axis) +{ + if (xAxis == axis) + xAxis = 0; + if (xAxis2 == axis) + xAxis2 = 0; + if (yAxis == axis) + yAxis = 0; + if (yAxis2 == axis) + yAxis2 = 0; + + // Note: No need to take care of range drag axes and range zoom axes, because they are stored in smart pointers +} + +/*! \internal + + This method is used by the QCPLegend destructor to report legend removal to the QCustomPlot so + it may clear its QCustomPlot::legend member accordingly. +*/ +void QCustomPlot::legendRemoved(QCPLegend *legend) +{ + if (this->legend == legend) + this->legend = 0; +} + +/*! \internal + + Assigns all layers their index (QCPLayer::mIndex) in the mLayers list. This method is thus called + after every operation that changes the layer indices, like layer removal, layer creation, layer + moving. +*/ +void QCustomPlot::updateLayerIndices() const +{ + for (int i=0; imIndex = i; +} + +/*! \internal + + Returns the layerable at pixel position \a pos. If \a onlySelectable is set to true, only those + layerables that are selectable will be considered. (Layerable subclasses communicate their + selectability via the QCPLayerable::selectTest method, by returning -1.) + + \a selectionDetails is an output parameter that contains selection specifics of the affected + layerable. This is useful if the respective layerable shall be given a subsequent + QCPLayerable::selectEvent (like in \ref mouseReleaseEvent). \a selectionDetails usually contains + information about which part of the layerable was hit, in multi-part layerables (e.g. + QCPAxis::SelectablePart). +*/ +QCPLayerable *QCustomPlot::layerableAt(const QPointF &pos, bool onlySelectable, QVariant *selectionDetails) const +{ + for (int layerIndex=mLayers.size()-1; layerIndex>=0; --layerIndex) + { + const QList layerables = mLayers.at(layerIndex)->children(); + double minimumDistance = selectionTolerance()*1.1; + QCPLayerable *minimumDistanceLayerable = 0; + for (int i=layerables.size()-1; i>=0; --i) + { + if (!layerables.at(i)->realVisibility()) + continue; + QVariant details; + double dist = layerables.at(i)->selectTest(pos, onlySelectable, &details); + if (dist >= 0 && dist < minimumDistance) + { + minimumDistance = dist; + minimumDistanceLayerable = layerables.at(i); + if (selectionDetails) *selectionDetails = details; + } + } + if (minimumDistance < selectionTolerance()) + return minimumDistanceLayerable; + } + return 0; +} + +/*! + Saves the plot to a rastered image file \a fileName in the image format \a format. The plot is + sized to \a width and \a height in pixels and scaled with \a scale. (width 100 and scale 2.0 lead + to a full resolution file with width 200.) If the \a format supports compression, \a quality may + be between 0 and 100 to control it. + + Returns true on success. If this function fails, most likely the given \a format isn't supported + by the system, see Qt docs about QImageWriter::supportedImageFormats(). + + \see saveBmp, saveJpg, savePng, savePdf +*/ +bool QCustomPlot::saveRastered(const QString &fileName, int width, int height, double scale, const char *format, int quality) +{ + QPixmap buffer = toPixmap(width, height, scale); + if (!buffer.isNull()) + return buffer.save(fileName, format, quality); + else + return false; +} + +/*! + Renders the plot to a pixmap and returns it. + + The plot is sized to \a width and \a height in pixels and scaled with \a scale. (width 100 and + scale 2.0 lead to a full resolution pixmap with width 200.) + + \see toPainter, saveRastered, saveBmp, savePng, saveJpg, savePdf +*/ +QPixmap QCustomPlot::toPixmap(int width, int height, double scale) +{ + // this method is somewhat similar to toPainter. Change something here, and a change in toPainter might be necessary, too. + int newWidth, newHeight; + if (width == 0 || height == 0) + { + newWidth = this->width(); + newHeight = this->height(); + } else + { + newWidth = width; + newHeight = height; + } + int scaledWidth = qRound(scale*newWidth); + int scaledHeight = qRound(scale*newHeight); + + QPixmap result(scaledWidth, scaledHeight); + result.fill(mBackgroundBrush.style() == Qt::SolidPattern ? mBackgroundBrush.color() : Qt::transparent); // if using non-solid pattern, make transparent now and draw brush pattern later + QCPPainter painter; + painter.begin(&result); + if (painter.isActive()) + { + QRect oldViewport = viewport(); + setViewport(QRect(0, 0, newWidth, newHeight)); + painter.setMode(QCPPainter::pmNoCaching); + if (!qFuzzyCompare(scale, 1.0)) + { + if (scale > 1.0) // for scale < 1 we always want cosmetic pens where possible, because else lines might disappear for very small scales + painter.setMode(QCPPainter::pmNonCosmetic); + painter.scale(scale, scale); + } + if (mBackgroundBrush.style() != Qt::SolidPattern && mBackgroundBrush.style() != Qt::NoBrush) // solid fills were done a few lines above with QPixmap::fill + painter.fillRect(mViewport, mBackgroundBrush); + draw(&painter); + setViewport(oldViewport); + painter.end(); + } else // might happen if pixmap has width or height zero + { + qDebug() << Q_FUNC_INFO << "Couldn't activate painter on pixmap"; + return QPixmap(); + } + return result; +} + +/*! + Renders the plot using the passed \a painter. + + The plot is sized to \a width and \a height in pixels. If the \a painter's scale is not 1.0, the resulting plot will + appear scaled accordingly. + + \note If you are restricted to using a QPainter (instead of QCPPainter), create a temporary QPicture and open a QCPPainter + on it. Then call \ref toPainter with this QCPPainter. After ending the paint operation on the picture, draw it with + the QPainter. This will reproduce the painter actions the QCPPainter took, with a QPainter. + + \see toPixmap +*/ +void QCustomPlot::toPainter(QCPPainter *painter, int width, int height) +{ + // this method is somewhat similar to toPixmap. Change something here, and a change in toPixmap might be necessary, too. + int newWidth, newHeight; + if (width == 0 || height == 0) + { + newWidth = this->width(); + newHeight = this->height(); + } else + { + newWidth = width; + newHeight = height; + } + + if (painter->isActive()) + { + QRect oldViewport = viewport(); + setViewport(QRect(0, 0, newWidth, newHeight)); + painter->setMode(QCPPainter::pmNoCaching); + if (mBackgroundBrush.style() != Qt::NoBrush) // unlike in toPixmap, we can't do QPixmap::fill for Qt::SolidPattern brush style, so we also draw solid fills with fillRect here + painter->fillRect(mViewport, mBackgroundBrush); + draw(painter); + setViewport(oldViewport); + } else + qDebug() << Q_FUNC_INFO << "Passed painter is not active"; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPColorGradient +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPColorGradient + \brief Defines a color gradient for use with e.g. \ref QCPColorMap + + This class describes a color gradient which can be used to encode data with color. For example, + QCPColorMap and QCPColorScale have \ref QCPColorMap::setGradient "setGradient" methods which + take an instance of this class. Colors are set with \ref setColorStopAt(double position, const QColor &color) + with a \a position from 0 to 1. In between these defined color positions, the + color will be interpolated linearly either in RGB or HSV space, see \ref setColorInterpolation. + + Alternatively, load one of the preset color gradients shown in the image below, with \ref + loadPreset, or by directly specifying the preset in the constructor. + + \image html QCPColorGradient.png + + The fact that the \ref QCPColorGradient(GradientPreset preset) constructor allows directly + converting a \ref GradientPreset to a QCPColorGradient, you can also directly pass \ref + GradientPreset to all the \a setGradient methods, e.g.: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcolorgradient-setgradient + + The total number of levels used in the gradient can be set with \ref setLevelCount. Whether the + color gradient shall be applied periodically (wrapping around) to data values that lie outside + the data range specified on the plottable instance can be controlled with \ref setPeriodic. +*/ + +/*! + Constructs a new QCPColorGradient initialized with the colors and color interpolation according + to \a preset. + + The color level count is initialized to 350. +*/ +QCPColorGradient::QCPColorGradient(GradientPreset preset) : + mLevelCount(350), + mColorInterpolation(ciRGB), + mPeriodic(false), + mColorBufferInvalidated(true) +{ + mColorBuffer.fill(qRgb(0, 0, 0), mLevelCount); + loadPreset(preset); +} + +/* undocumented operator */ +bool QCPColorGradient::operator==(const QCPColorGradient &other) const +{ + return ((other.mLevelCount == this->mLevelCount) && + (other.mColorInterpolation == this->mColorInterpolation) && + (other.mPeriodic == this->mPeriodic) && + (other.mColorStops == this->mColorStops)); +} + +/*! + Sets the number of discretization levels of the color gradient to \a n. The default is 350 which + is typically enough to create a smooth appearance. + + \image html QCPColorGradient-levelcount.png +*/ +void QCPColorGradient::setLevelCount(int n) +{ + if (n < 2) + { + qDebug() << Q_FUNC_INFO << "n must be greater or equal 2 but was" << n; + n = 2; + } + if (n != mLevelCount) + { + mLevelCount = n; + mColorBufferInvalidated = true; + } +} + +/*! + Sets at which positions from 0 to 1 which color shall occur. The positions are the keys, the + colors are the values of the passed QMap \a colorStops. In between these color stops, the color + is interpolated according to \ref setColorInterpolation. + + A more convenient way to create a custom gradient may be to clear all color stops with \ref + clearColorStops and then adding them one by one with \ref setColorStopAt. + + \see clearColorStops +*/ +void QCPColorGradient::setColorStops(const QMap &colorStops) +{ + mColorStops = colorStops; + mColorBufferInvalidated = true; +} + +/*! + Sets the \a color the gradient will have at the specified \a position (from 0 to 1). In between + these color stops, the color is interpolated according to \ref setColorInterpolation. + + \see setColorStops, clearColorStops +*/ +void QCPColorGradient::setColorStopAt(double position, const QColor &color) +{ + mColorStops.insert(position, color); + mColorBufferInvalidated = true; +} + +/*! + Sets whether the colors in between the configured color stops (see \ref setColorStopAt) shall be + interpolated linearly in RGB or in HSV color space. + + For example, a sweep in RGB space from red to green will have a muddy brown intermediate color, + whereas in HSV space the intermediate color is yellow. +*/ +void QCPColorGradient::setColorInterpolation(QCPColorGradient::ColorInterpolation interpolation) +{ + if (interpolation != mColorInterpolation) + { + mColorInterpolation = interpolation; + mColorBufferInvalidated = true; + } +} + +/*! + Sets whether data points that are outside the configured data range (e.g. \ref + QCPColorMap::setDataRange) are colored by periodically repeating the color gradient or whether + they all have the same color, corresponding to the respective gradient boundary color. + + \image html QCPColorGradient-periodic.png + + As shown in the image above, gradients that have the same start and end color are especially + suitable for a periodic gradient mapping, since they produce smooth color transitions throughout + the color map. A preset that has this property is \ref gpHues. + + In practice, using periodic color gradients makes sense when the data corresponds to a periodic + dimension, such as an angle or a phase. If this is not the case, the color encoding might become + ambiguous, because multiple different data values are shown as the same color. +*/ +void QCPColorGradient::setPeriodic(bool enabled) +{ + mPeriodic = enabled; +} + +/*! + This method is used to quickly convert a \a data array to colors. The colors will be output in + the array \a scanLine. Both \a data and \a scanLine must have the length \a n when passed to this + function. The data range that shall be used for mapping the data value to the gradient is passed + in \a range. \a logarithmic indicates whether the data values shall be mapped to colors + logarithmically. + + if \a data actually contains 2D-data linearized via [row*columnCount + column], you can + set \a dataIndexFactor to columnCount to convert a column instead of a row of the data + array, in \a scanLine. \a scanLine will remain a regular (1D) array. This works because \a data + is addressed data[i*dataIndexFactor]. +*/ +void QCPColorGradient::colorize(const double *data, const QCPRange &range, QRgb *scanLine, int n, int dataIndexFactor, bool logarithmic) +{ + // If you change something here, make sure to also adapt ::color() + if (!data) + { + qDebug() << Q_FUNC_INFO << "null pointer given as data"; + return; + } + if (!scanLine) + { + qDebug() << Q_FUNC_INFO << "null pointer given as scanLine"; + return; + } + if (mColorBufferInvalidated) + updateColorBuffer(); + + if (!logarithmic) + { + const double posToIndexFactor = (mLevelCount-1)/range.size(); + if (mPeriodic) + { + for (int i=0; i= mLevelCount) + index = mLevelCount-1; + scanLine[i] = mColorBuffer.at(index); + } + } + } else // logarithmic == true + { + if (mPeriodic) + { + for (int i=0; i= mLevelCount) + index = mLevelCount-1; + scanLine[i] = mColorBuffer.at(index); + } + } + } +} + +/*! \internal + + This method is used to colorize a single data value given in \a position, to colors. The data + range that shall be used for mapping the data value to the gradient is passed in \a range. \a + logarithmic indicates whether the data value shall be mapped to a color logarithmically. + + If an entire array of data values shall be converted, rather use \ref colorize, for better + performance. +*/ +QRgb QCPColorGradient::color(double position, const QCPRange &range, bool logarithmic) +{ + // If you change something here, make sure to also adapt ::colorize() + if (mColorBufferInvalidated) + updateColorBuffer(); + int index = 0; + if (!logarithmic) + index = (position-range.lower)*(mLevelCount-1)/range.size(); + else + index = qLn(position/range.lower)/qLn(range.upper/range.lower)*(mLevelCount-1); + if (mPeriodic) + { + index = index % mLevelCount; + if (index < 0) + index += mLevelCount; + } else + { + if (index < 0) + index = 0; + else if (index >= mLevelCount) + index = mLevelCount-1; + } + return mColorBuffer.at(index); +} + +/*! + Clears the current color stops and loads the specified \a preset. A preset consists of predefined + color stops and the corresponding color interpolation method. + + The available presets are: + \image html QCPColorGradient.png +*/ +void QCPColorGradient::loadPreset(GradientPreset preset) +{ + clearColorStops(); + switch (preset) + { + case gpGrayscale: + setColorInterpolation(ciRGB); + setColorStopAt(0, Qt::black); + setColorStopAt(1, Qt::white); + break; + case gpHot: + setColorInterpolation(ciRGB); + setColorStopAt(0, QColor(50, 0, 0)); + setColorStopAt(0.2, QColor(180, 10, 0)); + setColorStopAt(0.4, QColor(245, 50, 0)); + setColorStopAt(0.6, QColor(255, 150, 10)); + setColorStopAt(0.8, QColor(255, 255, 50)); + setColorStopAt(1, QColor(255, 255, 255)); + break; + case gpCold: + setColorInterpolation(ciRGB); + setColorStopAt(0, QColor(0, 0, 50)); + setColorStopAt(0.2, QColor(0, 10, 180)); + setColorStopAt(0.4, QColor(0, 50, 245)); + setColorStopAt(0.6, QColor(10, 150, 255)); + setColorStopAt(0.8, QColor(50, 255, 255)); + setColorStopAt(1, QColor(255, 255, 255)); + break; + case gpNight: + setColorInterpolation(ciHSV); + setColorStopAt(0, QColor(10, 20, 30)); + setColorStopAt(1, QColor(250, 255, 250)); + break; + case gpCandy: + setColorInterpolation(ciHSV); + setColorStopAt(0, QColor(0, 0, 255)); + setColorStopAt(1, QColor(255, 250, 250)); + break; + case gpGeography: + setColorInterpolation(ciRGB); + setColorStopAt(0, QColor(70, 170, 210)); + setColorStopAt(0.20, QColor(90, 160, 180)); + setColorStopAt(0.25, QColor(45, 130, 175)); + setColorStopAt(0.30, QColor(100, 140, 125)); + setColorStopAt(0.5, QColor(100, 140, 100)); + setColorStopAt(0.6, QColor(130, 145, 120)); + setColorStopAt(0.7, QColor(140, 130, 120)); + setColorStopAt(0.9, QColor(180, 190, 190)); + setColorStopAt(1, QColor(210, 210, 230)); + break; + case gpIon: + setColorInterpolation(ciHSV); + setColorStopAt(0, QColor(50, 10, 10)); + setColorStopAt(0.45, QColor(0, 0, 255)); + setColorStopAt(0.8, QColor(0, 255, 255)); + setColorStopAt(1, QColor(0, 255, 0)); + break; + case gpThermal: + setColorInterpolation(ciRGB); + setColorStopAt(0, QColor(0, 0, 50)); + setColorStopAt(0.15, QColor(20, 0, 120)); + setColorStopAt(0.33, QColor(200, 30, 140)); + setColorStopAt(0.6, QColor(255, 100, 0)); + setColorStopAt(0.85, QColor(255, 255, 40)); + setColorStopAt(1, QColor(255, 255, 255)); + break; + case gpPolar: + setColorInterpolation(ciRGB); + setColorStopAt(0, QColor(50, 255, 255)); + setColorStopAt(0.18, QColor(10, 70, 255)); + setColorStopAt(0.28, QColor(10, 10, 190)); + setColorStopAt(0.5, QColor(0, 0, 0)); + setColorStopAt(0.72, QColor(190, 10, 10)); + setColorStopAt(0.82, QColor(255, 70, 10)); + setColorStopAt(1, QColor(255, 255, 50)); + break; + case gpSpectrum: + setColorInterpolation(ciHSV); + setColorStopAt(0, QColor(50, 0, 50)); + setColorStopAt(0.15, QColor(0, 0, 255)); + setColorStopAt(0.35, QColor(0, 255, 255)); + setColorStopAt(0.6, QColor(255, 255, 0)); + setColorStopAt(0.75, QColor(255, 30, 0)); + setColorStopAt(1, QColor(50, 0, 0)); + break; + case gpJet: + setColorInterpolation(ciRGB); + setColorStopAt(0, QColor(0, 0, 100)); + setColorStopAt(0.15, QColor(0, 50, 255)); + setColorStopAt(0.35, QColor(0, 255, 255)); + setColorStopAt(0.65, QColor(255, 255, 0)); + setColorStopAt(0.85, QColor(255, 30, 0)); + setColorStopAt(1, QColor(100, 0, 0)); + break; + case gpHues: + setColorInterpolation(ciHSV); + setColorStopAt(0, QColor(255, 0, 0)); + setColorStopAt(1.0/3.0, QColor(0, 0, 255)); + setColorStopAt(2.0/3.0, QColor(0, 255, 0)); + setColorStopAt(1, QColor(255, 0, 0)); + break; + } +} + +/*! + Clears all color stops. + + \see setColorStops, setColorStopAt +*/ +void QCPColorGradient::clearColorStops() +{ + mColorStops.clear(); + mColorBufferInvalidated = true; +} + +/*! + Returns an inverted gradient. The inverted gradient has all properties as this \ref + QCPColorGradient, but the order of the color stops is inverted. + + \see setColorStops, setColorStopAt +*/ +QCPColorGradient QCPColorGradient::inverted() const +{ + QCPColorGradient result(*this); + result.clearColorStops(); + for (QMap::const_iterator it=mColorStops.constBegin(); it!=mColorStops.constEnd(); ++it) + result.setColorStopAt(1.0-it.key(), it.value()); + return result; +} + +/*! \internal + + Updates the internal color buffer which will be used by \ref colorize and \ref color, to quickly + convert positions to colors. This is where the interpolation between color stops is calculated. +*/ +void QCPColorGradient::updateColorBuffer() +{ + if (mColorBuffer.size() != mLevelCount) + mColorBuffer.resize(mLevelCount); + if (mColorStops.size() > 1) + { + double indexToPosFactor = 1.0/(double)(mLevelCount-1); + for (int i=0; i::const_iterator it = mColorStops.lowerBound(position); + if (it == mColorStops.constEnd()) // position is on or after last stop, use color of last stop + { + mColorBuffer[i] = (it-1).value().rgb(); + } else if (it == mColorStops.constBegin()) // position is on or before first stop, use color of first stop + { + mColorBuffer[i] = it.value().rgb(); + } else // position is in between stops (or on an intermediate stop), interpolate color + { + QMap::const_iterator high = it; + QMap::const_iterator low = it-1; + double t = (position-low.key())/(high.key()-low.key()); // interpolation factor 0..1 + switch (mColorInterpolation) + { + case ciRGB: + { + mColorBuffer[i] = qRgb((1-t)*low.value().red() + t*high.value().red(), + (1-t)*low.value().green() + t*high.value().green(), + (1-t)*low.value().blue() + t*high.value().blue()); + break; + } + case ciHSV: + { + QColor lowHsv = low.value().toHsv(); + QColor highHsv = high.value().toHsv(); + double hue = 0; + double hueDiff = highHsv.hueF()-lowHsv.hueF(); + if (hueDiff > 0.5) + hue = lowHsv.hueF() - t*(1.0-hueDiff); + else if (hueDiff < -0.5) + hue = lowHsv.hueF() + t*(1.0+hueDiff); + else + hue = lowHsv.hueF() + t*hueDiff; + if (hue < 0) hue += 1.0; + else if (hue >= 1.0) hue -= 1.0; + mColorBuffer[i] = QColor::fromHsvF(hue, (1-t)*lowHsv.saturationF() + t*highHsv.saturationF(), (1-t)*lowHsv.valueF() + t*highHsv.valueF()).rgb(); + break; + } + } + } + } + } else if (mColorStops.size() == 1) + { + mColorBuffer.fill(mColorStops.constBegin().value().rgb()); + } else // mColorStops is empty, fill color buffer with black + { + mColorBuffer.fill(qRgb(0, 0, 0)); + } + mColorBufferInvalidated = false; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPAxisRect +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPAxisRect + \brief Holds multiple axes and arranges them in a rectangular shape. + + This class represents an axis rect, a rectangular area that is bounded on all sides with an + arbitrary number of axes. + + Initially QCustomPlot has one axis rect, accessible via QCustomPlot::axisRect(). However, the + layout system allows to have multiple axis rects, e.g. arranged in a grid layout + (QCustomPlot::plotLayout). + + By default, QCPAxisRect comes with four axes, at bottom, top, left and right. They can be + accessed via \ref axis by providing the respective axis type (\ref QCPAxis::AxisType) and index. + If you need all axes in the axis rect, use \ref axes. The top and right axes are set to be + invisible initially (QCPAxis::setVisible). To add more axes to a side, use \ref addAxis or \ref + addAxes. To remove an axis, use \ref removeAxis. + + The axis rect layerable itself only draws a background pixmap or color, if specified (\ref + setBackground). It is placed on the "background" layer initially (see \ref QCPLayer for an + explanation of the QCustomPlot layer system). The axes that are held by the axis rect can be + placed on other layers, independently of the axis rect. + + Every axis rect has a child layout of type \ref QCPLayoutInset. It is accessible via \ref + insetLayout and can be used to have other layout elements (or even other layouts with multiple + elements) hovering inside the axis rect. + + If an axis rect is clicked and dragged, it processes this by moving certain axis ranges. The + behaviour can be controlled with \ref setRangeDrag and \ref setRangeDragAxes. If the mouse wheel + is scrolled while the cursor is on the axis rect, certain axes are scaled. This is controllable + via \ref setRangeZoom, \ref setRangeZoomAxes and \ref setRangeZoomFactor. These interactions are + only enabled if \ref QCustomPlot::setInteractions contains \ref QCP::iRangeDrag and \ref + QCP::iRangeZoom. + + \image html AxisRectSpacingOverview.png +
Overview of the spacings and paddings that define the geometry of an axis. The dashed + line on the far left indicates the viewport/widget border.
+*/ + +/* start documentation of inline functions */ + +/*! \fn QCPLayoutInset *QCPAxisRect::insetLayout() const + + Returns the inset layout of this axis rect. It can be used to place other layout elements (or + even layouts with multiple other elements) inside/on top of an axis rect. + + \see QCPLayoutInset +*/ + +/*! \fn int QCPAxisRect::left() const + + Returns the pixel position of the left border of this axis rect. Margins are not taken into + account here, so the returned value is with respect to the inner \ref rect. +*/ + +/*! \fn int QCPAxisRect::right() const + + Returns the pixel position of the right border of this axis rect. Margins are not taken into + account here, so the returned value is with respect to the inner \ref rect. +*/ + +/*! \fn int QCPAxisRect::top() const + + Returns the pixel position of the top border of this axis rect. Margins are not taken into + account here, so the returned value is with respect to the inner \ref rect. +*/ + +/*! \fn int QCPAxisRect::bottom() const + + Returns the pixel position of the bottom border of this axis rect. Margins are not taken into + account here, so the returned value is with respect to the inner \ref rect. +*/ + +/*! \fn int QCPAxisRect::width() const + + Returns the pixel width of this axis rect. Margins are not taken into account here, so the + returned value is with respect to the inner \ref rect. +*/ + +/*! \fn int QCPAxisRect::height() const + + Returns the pixel height of this axis rect. Margins are not taken into account here, so the + returned value is with respect to the inner \ref rect. +*/ + +/*! \fn QSize QCPAxisRect::size() const + + Returns the pixel size of this axis rect. Margins are not taken into account here, so the + returned value is with respect to the inner \ref rect. +*/ + +/*! \fn QPoint QCPAxisRect::topLeft() const + + Returns the top left corner of this axis rect in pixels. Margins are not taken into account here, + so the returned value is with respect to the inner \ref rect. +*/ + +/*! \fn QPoint QCPAxisRect::topRight() const + + Returns the top right corner of this axis rect in pixels. Margins are not taken into account + here, so the returned value is with respect to the inner \ref rect. +*/ + +/*! \fn QPoint QCPAxisRect::bottomLeft() const + + Returns the bottom left corner of this axis rect in pixels. Margins are not taken into account + here, so the returned value is with respect to the inner \ref rect. +*/ + +/*! \fn QPoint QCPAxisRect::bottomRight() const + + Returns the bottom right corner of this axis rect in pixels. Margins are not taken into account + here, so the returned value is with respect to the inner \ref rect. +*/ + +/*! \fn QPoint QCPAxisRect::center() const + + Returns the center of this axis rect in pixels. Margins are not taken into account here, so the + returned value is with respect to the inner \ref rect. +*/ + +/* end documentation of inline functions */ + +/*! + Creates a QCPAxisRect instance and sets default values. An axis is added for each of the four + sides, the top and right axes are set invisible initially. +*/ +QCPAxisRect::QCPAxisRect(QCustomPlot *parentPlot, bool setupDefaultAxes) : + QCPLayoutElement(parentPlot), + mBackgroundBrush(Qt::NoBrush), + mBackgroundScaled(true), + mBackgroundScaledMode(Qt::KeepAspectRatioByExpanding), + mInsetLayout(new QCPLayoutInset), + mRangeDrag(Qt::Horizontal|Qt::Vertical), + mRangeZoom(Qt::Horizontal|Qt::Vertical), + mRangeZoomFactorHorz(0.85), + mRangeZoomFactorVert(0.85), + mDragging(false) +{ + mInsetLayout->initializeParentPlot(mParentPlot); + mInsetLayout->setParentLayerable(this); + mInsetLayout->setParent(this); + + setMinimumSize(50, 50); + setMinimumMargins(QMargins(15, 15, 15, 15)); + mAxes.insert(QCPAxis::atLeft, QList()); + mAxes.insert(QCPAxis::atRight, QList()); + mAxes.insert(QCPAxis::atTop, QList()); + mAxes.insert(QCPAxis::atBottom, QList()); + + if (setupDefaultAxes) + { + QCPAxis *xAxis = addAxis(QCPAxis::atBottom); + QCPAxis *yAxis = addAxis(QCPAxis::atLeft); + QCPAxis *xAxis2 = addAxis(QCPAxis::atTop); + QCPAxis *yAxis2 = addAxis(QCPAxis::atRight); + setRangeDragAxes(xAxis, yAxis); + setRangeZoomAxes(xAxis, yAxis); + xAxis2->setVisible(false); + yAxis2->setVisible(false); + xAxis->grid()->setVisible(true); + yAxis->grid()->setVisible(true); + xAxis2->grid()->setVisible(false); + yAxis2->grid()->setVisible(false); + xAxis2->grid()->setZeroLinePen(Qt::NoPen); + yAxis2->grid()->setZeroLinePen(Qt::NoPen); + xAxis2->grid()->setVisible(false); + yAxis2->grid()->setVisible(false); + } +} + +QCPAxisRect::~QCPAxisRect() +{ + delete mInsetLayout; + mInsetLayout = 0; + + QList axesList = axes(); + for (int i=0; i ax(mAxes.value(type)); + if (index >= 0 && index < ax.size()) + { + return ax.at(index); + } else + { + qDebug() << Q_FUNC_INFO << "Axis index out of bounds:" << index; + return 0; + } +} + +/*! + Returns all axes on the axis rect sides specified with \a types. + + \a types may be a single \ref QCPAxis::AxisType or an or-combination, to get the axes of + multiple sides. + + \see axis +*/ +QList QCPAxisRect::axes(QCPAxis::AxisTypes types) const +{ + QList result; + if (types.testFlag(QCPAxis::atLeft)) + result << mAxes.value(QCPAxis::atLeft); + if (types.testFlag(QCPAxis::atRight)) + result << mAxes.value(QCPAxis::atRight); + if (types.testFlag(QCPAxis::atTop)) + result << mAxes.value(QCPAxis::atTop); + if (types.testFlag(QCPAxis::atBottom)) + result << mAxes.value(QCPAxis::atBottom); + return result; +} + +/*! \overload + + Returns all axes of this axis rect. +*/ +QList QCPAxisRect::axes() const +{ + QList result; + QHashIterator > it(mAxes); + while (it.hasNext()) + { + it.next(); + result << it.value(); + } + return result; +} + +/*! + Adds a new axis to the axis rect side specified with \a type, and returns it. If \a axis is 0, a + new QCPAxis instance is created internally. + + You may inject QCPAxis instances (or sublasses of QCPAxis) by setting \a axis to an axis that was + previously created outside QCustomPlot. It is important to note that QCustomPlot takes ownership + of the axis, so you may not delete it afterwards. Further, the \a axis must have been created + with this axis rect as parent and with the same axis type as specified in \a type. If this is not + the case, a debug output is generated, the axis is not added, and the method returns 0. + + This method can not be used to move \a axis between axis rects. The same \a axis instance must + not be added multiple times to the same or different axis rects. + + If an axis rect side already contains one or more axes, the lower and upper endings of the new + axis (\ref QCPAxis::setLowerEnding, \ref QCPAxis::setUpperEnding) are set to \ref + QCPLineEnding::esHalfBar. + + \see addAxes, setupFullAxesBox +*/ +QCPAxis *QCPAxisRect::addAxis(QCPAxis::AxisType type, QCPAxis *axis) +{ + QCPAxis *newAxis = axis; + if (!newAxis) + { + newAxis = new QCPAxis(this, type); + } else // user provided existing axis instance, do some sanity checks + { + if (newAxis->axisType() != type) + { + qDebug() << Q_FUNC_INFO << "passed axis has different axis type than specified in type parameter"; + return 0; + } + if (newAxis->axisRect() != this) + { + qDebug() << Q_FUNC_INFO << "passed axis doesn't have this axis rect as parent axis rect"; + return 0; + } + if (axes().contains(newAxis)) + { + qDebug() << Q_FUNC_INFO << "passed axis is already owned by this axis rect"; + return 0; + } + } + if (mAxes[type].size() > 0) // multiple axes on one side, add half-bar axis ending to additional axes with offset + { + bool invert = (type == QCPAxis::atRight) || (type == QCPAxis::atBottom); + newAxis->setLowerEnding(QCPLineEnding(QCPLineEnding::esHalfBar, 6, 10, !invert)); + newAxis->setUpperEnding(QCPLineEnding(QCPLineEnding::esHalfBar, 6, 10, invert)); + } + mAxes[type].append(newAxis); + return newAxis; +} + +/*! + Adds a new axis with \ref addAxis to each axis rect side specified in \a types. This may be an + or-combination of QCPAxis::AxisType, so axes can be added to multiple sides at once. + + Returns a list of the added axes. + + \see addAxis, setupFullAxesBox +*/ +QList QCPAxisRect::addAxes(QCPAxis::AxisTypes types) +{ + QList result; + if (types.testFlag(QCPAxis::atLeft)) + result << addAxis(QCPAxis::atLeft); + if (types.testFlag(QCPAxis::atRight)) + result << addAxis(QCPAxis::atRight); + if (types.testFlag(QCPAxis::atTop)) + result << addAxis(QCPAxis::atTop); + if (types.testFlag(QCPAxis::atBottom)) + result << addAxis(QCPAxis::atBottom); + return result; +} + +/*! + Removes the specified \a axis from the axis rect and deletes it. + + Returns true on success, i.e. if \a axis was a valid axis in this axis rect. + + \see addAxis +*/ +bool QCPAxisRect::removeAxis(QCPAxis *axis) +{ + // don't access axis->axisType() to provide safety when axis is an invalid pointer, rather go through all axis containers: + QHashIterator > it(mAxes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains(axis)) + { + mAxes[it.key()].removeOne(axis); + if (qobject_cast(parentPlot())) // make sure this isn't called from QObject dtor when QCustomPlot is already destructed (happens when the axis rect is not in any layout and thus QObject-child of QCustomPlot) + parentPlot()->axisRemoved(axis); + delete axis; + return true; + } + } + qDebug() << Q_FUNC_INFO << "Axis isn't in axis rect:" << reinterpret_cast(axis); + return false; +} + +/*! + Convenience function to create an axis on each side that doesn't have any axes yet and set their + visibility to true. Further, the top/right axes are assigned the following properties of the + bottom/left axes: + + \li range (\ref QCPAxis::setRange) + \li range reversed (\ref QCPAxis::setRangeReversed) + \li scale type (\ref QCPAxis::setScaleType) + \li scale log base (\ref QCPAxis::setScaleLogBase) + \li ticks (\ref QCPAxis::setTicks) + \li auto (major) tick count (\ref QCPAxis::setAutoTickCount) + \li sub tick count (\ref QCPAxis::setSubTickCount) + \li auto sub ticks (\ref QCPAxis::setAutoSubTicks) + \li tick step (\ref QCPAxis::setTickStep) + \li auto tick step (\ref QCPAxis::setAutoTickStep) + \li number format (\ref QCPAxis::setNumberFormat) + \li number precision (\ref QCPAxis::setNumberPrecision) + \li tick label type (\ref QCPAxis::setTickLabelType) + \li date time format (\ref QCPAxis::setDateTimeFormat) + \li date time spec (\ref QCPAxis::setDateTimeSpec) + + Tick labels (\ref QCPAxis::setTickLabels) of the right and top axes are set to false. + + If \a connectRanges is true, the \ref QCPAxis::rangeChanged "rangeChanged" signals of the bottom + and left axes are connected to the \ref QCPAxis::setRange slots of the top and right axes. +*/ +void QCPAxisRect::setupFullAxesBox(bool connectRanges) +{ + QCPAxis *xAxis, *yAxis, *xAxis2, *yAxis2; + if (axisCount(QCPAxis::atBottom) == 0) + xAxis = addAxis(QCPAxis::atBottom); + else + xAxis = axis(QCPAxis::atBottom); + + if (axisCount(QCPAxis::atLeft) == 0) + yAxis = addAxis(QCPAxis::atLeft); + else + yAxis = axis(QCPAxis::atLeft); + + if (axisCount(QCPAxis::atTop) == 0) + xAxis2 = addAxis(QCPAxis::atTop); + else + xAxis2 = axis(QCPAxis::atTop); + + if (axisCount(QCPAxis::atRight) == 0) + yAxis2 = addAxis(QCPAxis::atRight); + else + yAxis2 = axis(QCPAxis::atRight); + + xAxis->setVisible(true); + yAxis->setVisible(true); + xAxis2->setVisible(true); + yAxis2->setVisible(true); + xAxis2->setTickLabels(false); + yAxis2->setTickLabels(false); + + xAxis2->setRange(xAxis->range()); + xAxis2->setRangeReversed(xAxis->rangeReversed()); + xAxis2->setScaleType(xAxis->scaleType()); + xAxis2->setScaleLogBase(xAxis->scaleLogBase()); + xAxis2->setTicks(xAxis->ticks()); + xAxis2->setAutoTickCount(xAxis->autoTickCount()); + xAxis2->setSubTickCount(xAxis->subTickCount()); + xAxis2->setAutoSubTicks(xAxis->autoSubTicks()); + xAxis2->setTickStep(xAxis->tickStep()); + xAxis2->setAutoTickStep(xAxis->autoTickStep()); + xAxis2->setNumberFormat(xAxis->numberFormat()); + xAxis2->setNumberPrecision(xAxis->numberPrecision()); + xAxis2->setTickLabelType(xAxis->tickLabelType()); + xAxis2->setDateTimeFormat(xAxis->dateTimeFormat()); + xAxis2->setDateTimeSpec(xAxis->dateTimeSpec()); + + yAxis2->setRange(yAxis->range()); + yAxis2->setRangeReversed(yAxis->rangeReversed()); + yAxis2->setScaleType(yAxis->scaleType()); + yAxis2->setScaleLogBase(yAxis->scaleLogBase()); + yAxis2->setTicks(yAxis->ticks()); + yAxis2->setAutoTickCount(yAxis->autoTickCount()); + yAxis2->setSubTickCount(yAxis->subTickCount()); + yAxis2->setAutoSubTicks(yAxis->autoSubTicks()); + yAxis2->setTickStep(yAxis->tickStep()); + yAxis2->setAutoTickStep(yAxis->autoTickStep()); + yAxis2->setNumberFormat(yAxis->numberFormat()); + yAxis2->setNumberPrecision(yAxis->numberPrecision()); + yAxis2->setTickLabelType(yAxis->tickLabelType()); + yAxis2->setDateTimeFormat(yAxis->dateTimeFormat()); + yAxis2->setDateTimeSpec(yAxis->dateTimeSpec()); + + if (connectRanges) + { + connect(xAxis, SIGNAL(rangeChanged(QCPRange)), xAxis2, SLOT(setRange(QCPRange))); + connect(yAxis, SIGNAL(rangeChanged(QCPRange)), yAxis2, SLOT(setRange(QCPRange))); + } +} + +/*! + Returns a list of all the plottables that are associated with this axis rect. + + A plottable is considered associated with an axis rect if its key or value axis (or both) is in + this axis rect. + + \see graphs, items +*/ +QList QCPAxisRect::plottables() const +{ + // Note: don't append all QCPAxis::plottables() into a list, because we might get duplicate entries + QList result; + for (int i=0; imPlottables.size(); ++i) + { + if (mParentPlot->mPlottables.at(i)->keyAxis()->axisRect() == this ||mParentPlot->mPlottables.at(i)->valueAxis()->axisRect() == this) + result.append(mParentPlot->mPlottables.at(i)); + } + return result; +} + +/*! + Returns a list of all the graphs that are associated with this axis rect. + + A graph is considered associated with an axis rect if its key or value axis (or both) is in + this axis rect. + + \see plottables, items +*/ +QList QCPAxisRect::graphs() const +{ + // Note: don't append all QCPAxis::graphs() into a list, because we might get duplicate entries + QList result; + for (int i=0; imGraphs.size(); ++i) + { + if (mParentPlot->mGraphs.at(i)->keyAxis()->axisRect() == this || mParentPlot->mGraphs.at(i)->valueAxis()->axisRect() == this) + result.append(mParentPlot->mGraphs.at(i)); + } + return result; +} + +/*! + Returns a list of all the items that are associated with this axis rect. + + An item is considered associated with an axis rect if any of its positions has key or value axis + set to an axis that is in this axis rect, or if any of its positions has \ref + QCPItemPosition::setAxisRect set to the axis rect, or if the clip axis rect (\ref + QCPAbstractItem::setClipAxisRect) is set to this axis rect. + + \see plottables, graphs +*/ +QList QCPAxisRect::items() const +{ + // Note: don't just append all QCPAxis::items() into a list, because we might get duplicate entries + // and miss those items that have this axis rect as clipAxisRect. + QList result; + for (int itemId=0; itemIdmItems.size(); ++itemId) + { + if (mParentPlot->mItems.at(itemId)->clipAxisRect() == this) + { + result.append(mParentPlot->mItems.at(itemId)); + continue; + } + QList positions = mParentPlot->mItems.at(itemId)->positions(); + for (int posId=0; posIdaxisRect() == this || + positions.at(posId)->keyAxis()->axisRect() == this || + positions.at(posId)->valueAxis()->axisRect() == this) + { + result.append(mParentPlot->mItems.at(itemId)); + break; + } + } + } + return result; +} + +/*! + This method is called automatically upon replot and doesn't need to be called by users of + QCPAxisRect. + + Calls the base class implementation to update the margins (see \ref QCPLayoutElement::update), + and finally passes the \ref rect to the inset layout (\ref insetLayout) and calls its + QCPInsetLayout::update function. +*/ +void QCPAxisRect::update(UpdatePhase phase) +{ + QCPLayoutElement::update(phase); + + switch (phase) + { + case upPreparation: + { + QList allAxes = axes(); + for (int i=0; isetupTickVectors(); + break; + } + case upLayout: + { + mInsetLayout->setOuterRect(rect()); + break; + } + default: break; + } + + // pass update call on to inset layout (doesn't happen automatically, because QCPAxisRect doesn't derive from QCPLayout): + mInsetLayout->update(phase); +} + +/* inherits documentation from base class */ +QList QCPAxisRect::elements(bool recursive) const +{ + QList result; + if (mInsetLayout) + { + result << mInsetLayout; + if (recursive) + result << mInsetLayout->elements(recursive); + } + return result; +} + +/* inherits documentation from base class */ +void QCPAxisRect::applyDefaultAntialiasingHint(QCPPainter *painter) const +{ + painter->setAntialiasing(false); +} + +/* inherits documentation from base class */ +void QCPAxisRect::draw(QCPPainter *painter) +{ + drawBackground(painter); +} + +/*! + Sets \a pm as the axis background pixmap. The axis background pixmap will be drawn inside the + axis rect. Since axis rects place themselves on the "background" layer by default, the axis rect + backgrounds are usually drawn below everything else. + + For cases where the provided pixmap doesn't have the same size as the axis rect, scaling can be + enabled with \ref setBackgroundScaled and the scaling mode (i.e. whether and how the aspect ratio + is preserved) can be set with \ref setBackgroundScaledMode. To set all these options in one call, + consider using the overloaded version of this function. + + Below the pixmap, the axis rect may be optionally filled with a brush, if specified with \ref + setBackground(const QBrush &brush). + + \see setBackgroundScaled, setBackgroundScaledMode, setBackground(const QBrush &brush) +*/ +void QCPAxisRect::setBackground(const QPixmap &pm) +{ + mBackgroundPixmap = pm; + mScaledBackgroundPixmap = QPixmap(); +} + +/*! \overload + + Sets \a brush as the background brush. The axis rect background will be filled with this brush. + Since axis rects place themselves on the "background" layer by default, the axis rect backgrounds + are usually drawn below everything else. + + The brush will be drawn before (under) any background pixmap, which may be specified with \ref + setBackground(const QPixmap &pm). + + To disable drawing of a background brush, set \a brush to Qt::NoBrush. + + \see setBackground(const QPixmap &pm) +*/ +void QCPAxisRect::setBackground(const QBrush &brush) +{ + mBackgroundBrush = brush; +} + +/*! \overload + + Allows setting the background pixmap of the axis rect, whether it shall be scaled and how it + shall be scaled in one call. + + \see setBackground(const QPixmap &pm), setBackgroundScaled, setBackgroundScaledMode +*/ +void QCPAxisRect::setBackground(const QPixmap &pm, bool scaled, Qt::AspectRatioMode mode) +{ + mBackgroundPixmap = pm; + mScaledBackgroundPixmap = QPixmap(); + mBackgroundScaled = scaled; + mBackgroundScaledMode = mode; +} + +/*! + Sets whether the axis background pixmap shall be scaled to fit the axis rect or not. If \a scaled + is set to true, you may control whether and how the aspect ratio of the original pixmap is + preserved with \ref setBackgroundScaledMode. + + Note that the scaled version of the original pixmap is buffered, so there is no performance + penalty on replots. (Except when the axis rect dimensions are changed continuously.) + + \see setBackground, setBackgroundScaledMode +*/ +void QCPAxisRect::setBackgroundScaled(bool scaled) +{ + mBackgroundScaled = scaled; +} + +/*! + If scaling of the axis background pixmap is enabled (\ref setBackgroundScaled), use this function to + define whether and how the aspect ratio of the original pixmap passed to \ref setBackground is preserved. + \see setBackground, setBackgroundScaled +*/ +void QCPAxisRect::setBackgroundScaledMode(Qt::AspectRatioMode mode) +{ + mBackgroundScaledMode = mode; +} + +/*! + Returns the range drag axis of the \a orientation provided. + + \see setRangeDragAxes +*/ +QCPAxis *QCPAxisRect::rangeDragAxis(Qt::Orientation orientation) +{ + return (orientation == Qt::Horizontal ? mRangeDragHorzAxis.data() : mRangeDragVertAxis.data()); +} + +/*! + Returns the range zoom axis of the \a orientation provided. + + \see setRangeZoomAxes +*/ +QCPAxis *QCPAxisRect::rangeZoomAxis(Qt::Orientation orientation) +{ + return (orientation == Qt::Horizontal ? mRangeZoomHorzAxis.data() : mRangeZoomVertAxis.data()); +} + +/*! + Returns the range zoom factor of the \a orientation provided. + + \see setRangeZoomFactor +*/ +double QCPAxisRect::rangeZoomFactor(Qt::Orientation orientation) +{ + return (orientation == Qt::Horizontal ? mRangeZoomFactorHorz : mRangeZoomFactorVert); +} + +/*! + Sets which axis orientation may be range dragged by the user with mouse interaction. + What orientation corresponds to which specific axis can be set with + \ref setRangeDragAxes(QCPAxis *horizontal, QCPAxis *vertical). By + default, the horizontal axis is the bottom axis (xAxis) and the vertical axis + is the left axis (yAxis). + + To disable range dragging entirely, pass 0 as \a orientations or remove \ref QCP::iRangeDrag from \ref + QCustomPlot::setInteractions. To enable range dragging for both directions, pass Qt::Horizontal | + Qt::Vertical as \a orientations. + + In addition to setting \a orientations to a non-zero value, make sure \ref QCustomPlot::setInteractions + contains \ref QCP::iRangeDrag to enable the range dragging interaction. + + \see setRangeZoom, setRangeDragAxes, QCustomPlot::setNoAntialiasingOnDrag +*/ +void QCPAxisRect::setRangeDrag(Qt::Orientations orientations) +{ + mRangeDrag = orientations; +} + +/*! + Sets which axis orientation may be zoomed by the user with the mouse wheel. What orientation + corresponds to which specific axis can be set with \ref setRangeZoomAxes(QCPAxis *horizontal, + QCPAxis *vertical). By default, the horizontal axis is the bottom axis (xAxis) and the vertical + axis is the left axis (yAxis). + + To disable range zooming entirely, pass 0 as \a orientations or remove \ref QCP::iRangeZoom from \ref + QCustomPlot::setInteractions. To enable range zooming for both directions, pass Qt::Horizontal | + Qt::Vertical as \a orientations. + + In addition to setting \a orientations to a non-zero value, make sure \ref QCustomPlot::setInteractions + contains \ref QCP::iRangeZoom to enable the range zooming interaction. + + \see setRangeZoomFactor, setRangeZoomAxes, setRangeDrag +*/ +void QCPAxisRect::setRangeZoom(Qt::Orientations orientations) +{ + mRangeZoom = orientations; +} + +/*! + Sets the axes whose range will be dragged when \ref setRangeDrag enables mouse range dragging + on the QCustomPlot widget. + + \see setRangeZoomAxes +*/ +void QCPAxisRect::setRangeDragAxes(QCPAxis *horizontal, QCPAxis *vertical) +{ + mRangeDragHorzAxis = horizontal; + mRangeDragVertAxis = vertical; +} + +/*! + Sets the axes whose range will be zoomed when \ref setRangeZoom enables mouse wheel zooming on the + QCustomPlot widget. The two axes can be zoomed with different strengths, when different factors + are passed to \ref setRangeZoomFactor(double horizontalFactor, double verticalFactor). + + \see setRangeDragAxes +*/ +void QCPAxisRect::setRangeZoomAxes(QCPAxis *horizontal, QCPAxis *vertical) +{ + mRangeZoomHorzAxis = horizontal; + mRangeZoomVertAxis = vertical; +} + +/*! + Sets how strong one rotation step of the mouse wheel zooms, when range zoom was activated with + \ref setRangeZoom. The two parameters \a horizontalFactor and \a verticalFactor provide a way to + let the horizontal axis zoom at different rates than the vertical axis. Which axis is horizontal + and which is vertical, can be set with \ref setRangeZoomAxes. + + When the zoom factor is greater than one, scrolling the mouse wheel backwards (towards the user) + will zoom in (make the currently visible range smaller). For zoom factors smaller than one, the + same scrolling direction will zoom out. +*/ +void QCPAxisRect::setRangeZoomFactor(double horizontalFactor, double verticalFactor) +{ + mRangeZoomFactorHorz = horizontalFactor; + mRangeZoomFactorVert = verticalFactor; +} + +/*! \overload + + Sets both the horizontal and vertical zoom \a factor. +*/ +void QCPAxisRect::setRangeZoomFactor(double factor) +{ + mRangeZoomFactorHorz = factor; + mRangeZoomFactorVert = factor; +} + +/*! \internal + + Draws the background of this axis rect. It may consist of a background fill (a QBrush) and a + pixmap. + + If a brush was given via \ref setBackground(const QBrush &brush), this function first draws an + according filling inside the axis rect with the provided \a painter. + + Then, if a pixmap was provided via \ref setBackground, this function buffers the scaled version + depending on \ref setBackgroundScaled and \ref setBackgroundScaledMode and then draws it inside + the axis rect with the provided \a painter. The scaled version is buffered in + mScaledBackgroundPixmap to prevent expensive rescaling at every redraw. It is only updated, when + the axis rect has changed in a way that requires a rescale of the background pixmap (this is + dependant on the \ref setBackgroundScaledMode), or when a differend axis backgroud pixmap was + set. + + \see setBackground, setBackgroundScaled, setBackgroundScaledMode +*/ +void QCPAxisRect::drawBackground(QCPPainter *painter) +{ + // draw background fill: + if (mBackgroundBrush != Qt::NoBrush) + painter->fillRect(mRect, mBackgroundBrush); + + // draw background pixmap (on top of fill, if brush specified): + if (!mBackgroundPixmap.isNull()) + { + if (mBackgroundScaled) + { + // check whether mScaledBackground needs to be updated: + QSize scaledSize(mBackgroundPixmap.size()); + scaledSize.scale(mRect.size(), mBackgroundScaledMode); + if (mScaledBackgroundPixmap.size() != scaledSize) + mScaledBackgroundPixmap = mBackgroundPixmap.scaled(mRect.size(), mBackgroundScaledMode, Qt::SmoothTransformation); + painter->drawPixmap(mRect.topLeft()+QPoint(0, -1), mScaledBackgroundPixmap, QRect(0, 0, mRect.width(), mRect.height()) & mScaledBackgroundPixmap.rect()); + } else + { + painter->drawPixmap(mRect.topLeft()+QPoint(0, -1), mBackgroundPixmap, QRect(0, 0, mRect.width(), mRect.height())); + } + } +} + +/*! \internal + + This function makes sure multiple axes on the side specified with \a type don't collide, but are + distributed according to their respective space requirement (QCPAxis::calculateMargin). + + It does this by setting an appropriate offset (\ref QCPAxis::setOffset) on all axes except the + one with index zero. + + This function is called by \ref calculateAutoMargin. +*/ +void QCPAxisRect::updateAxesOffset(QCPAxis::AxisType type) +{ + const QList axesList = mAxes.value(type); + if (axesList.isEmpty()) + return; + + bool isFirstVisible = !axesList.first()->visible(); // if the first axis is visible, the second axis (which is where the loop starts) isn't the first visible axis, so initialize with false + for (int i=1; ioffset() + axesList.at(i-1)->calculateMargin(); + if (axesList.at(i)->visible()) // only add inner tick length to offset if this axis is visible and it's not the first visible one (might happen if true first axis is invisible) + { + if (!isFirstVisible) + offset += axesList.at(i)->tickLengthIn(); + isFirstVisible = false; + } + axesList.at(i)->setOffset(offset); + } +} + +/* inherits documentation from base class */ +int QCPAxisRect::calculateAutoMargin(QCP::MarginSide side) +{ + if (!mAutoMargins.testFlag(side)) + qDebug() << Q_FUNC_INFO << "Called with side that isn't specified as auto margin"; + + updateAxesOffset(QCPAxis::marginSideToAxisType(side)); + + // note: only need to look at the last (outer most) axis to determine the total margin, due to updateAxisOffset call + const QList axesList = mAxes.value(QCPAxis::marginSideToAxisType(side)); + if (axesList.size() > 0) + return axesList.last()->offset() + axesList.last()->calculateMargin(); + else + return 0; +} + +/*! \internal + + Event handler for when a mouse button is pressed on the axis rect. If the left mouse button is + pressed, the range dragging interaction is initialized (the actual range manipulation happens in + the \ref mouseMoveEvent). + + The mDragging flag is set to true and some anchor points are set that are needed to determine the + distance the mouse was dragged in the mouse move/release events later. + + \see mouseMoveEvent, mouseReleaseEvent +*/ +void QCPAxisRect::mousePressEvent(QMouseEvent *event) +{ + mDragStart = event->pos(); // need this even when not LeftButton is pressed, to determine in releaseEvent whether it was a full click (no position change between press and release) + if (event->buttons() & Qt::LeftButton) + { + mDragging = true; + // initialize antialiasing backup in case we start dragging: + if (mParentPlot->noAntialiasingOnDrag()) + { + mAADragBackup = mParentPlot->antialiasedElements(); + mNotAADragBackup = mParentPlot->notAntialiasedElements(); + } + // Mouse range dragging interaction: + if (mParentPlot->interactions().testFlag(QCP::iRangeDrag)) + { + if (mRangeDragHorzAxis) + mDragStartHorzRange = mRangeDragHorzAxis.data()->range(); + if (mRangeDragVertAxis) + mDragStartVertRange = mRangeDragVertAxis.data()->range(); + } + } +} + +/*! \internal + + Event handler for when the mouse is moved on the axis rect. If range dragging was activated in a + preceding \ref mousePressEvent, the range is moved accordingly. + + \see mousePressEvent, mouseReleaseEvent +*/ +void QCPAxisRect::mouseMoveEvent(QMouseEvent *event) +{ + // Mouse range dragging interaction: + if (mDragging && mParentPlot->interactions().testFlag(QCP::iRangeDrag)) + { + if (mRangeDrag.testFlag(Qt::Horizontal)) + { + if (QCPAxis *rangeDragHorzAxis = mRangeDragHorzAxis.data()) + { + if (rangeDragHorzAxis->mScaleType == QCPAxis::stLinear) + { + double diff = rangeDragHorzAxis->pixelToCoord(mDragStart.x()) - rangeDragHorzAxis->pixelToCoord(event->pos().x()); + rangeDragHorzAxis->setRange(mDragStartHorzRange.lower+diff, mDragStartHorzRange.upper+diff); + } else if (rangeDragHorzAxis->mScaleType == QCPAxis::stLogarithmic) + { + double diff = rangeDragHorzAxis->pixelToCoord(mDragStart.x()) / rangeDragHorzAxis->pixelToCoord(event->pos().x()); + rangeDragHorzAxis->setRange(mDragStartHorzRange.lower*diff, mDragStartHorzRange.upper*diff); + } + } + } + if (mRangeDrag.testFlag(Qt::Vertical)) + { + if (QCPAxis *rangeDragVertAxis = mRangeDragVertAxis.data()) + { + if (rangeDragVertAxis->mScaleType == QCPAxis::stLinear) + { + double diff = rangeDragVertAxis->pixelToCoord(mDragStart.y()) - rangeDragVertAxis->pixelToCoord(event->pos().y()); + rangeDragVertAxis->setRange(mDragStartVertRange.lower+diff, mDragStartVertRange.upper+diff); + } else if (rangeDragVertAxis->mScaleType == QCPAxis::stLogarithmic) + { + double diff = rangeDragVertAxis->pixelToCoord(mDragStart.y()) / rangeDragVertAxis->pixelToCoord(event->pos().y()); + rangeDragVertAxis->setRange(mDragStartVertRange.lower*diff, mDragStartVertRange.upper*diff); + } + } + } + if (mRangeDrag != 0) // if either vertical or horizontal drag was enabled, do a replot + { + if (mParentPlot->noAntialiasingOnDrag()) + mParentPlot->setNotAntialiasedElements(QCP::aeAll); + mParentPlot->replot(); + } + } +} + +/* inherits documentation from base class */ +void QCPAxisRect::mouseReleaseEvent(QMouseEvent *event) +{ + Q_UNUSED(event) + mDragging = false; + if (mParentPlot->noAntialiasingOnDrag()) + { + mParentPlot->setAntialiasedElements(mAADragBackup); + mParentPlot->setNotAntialiasedElements(mNotAADragBackup); + } +} + +/*! \internal + + Event handler for mouse wheel events. If rangeZoom is Qt::Horizontal, Qt::Vertical or both, the + ranges of the axes defined as rangeZoomHorzAxis and rangeZoomVertAxis are scaled. The center of + the scaling operation is the current cursor position inside the axis rect. The scaling factor is + dependant on the mouse wheel delta (which direction the wheel was rotated) to provide a natural + zooming feel. The Strength of the zoom can be controlled via \ref setRangeZoomFactor. + + Note, that event->delta() is usually +/-120 for single rotation steps. However, if the mouse + wheel is turned rapidly, many steps may bunch up to one event, so the event->delta() may then be + multiples of 120. This is taken into account here, by calculating \a wheelSteps and using it as + exponent of the range zoom factor. This takes care of the wheel direction automatically, by + inverting the factor, when the wheel step is negative (f^-1 = 1/f). +*/ +void QCPAxisRect::wheelEvent(QWheelEvent *event) +{ + // Mouse range zooming interaction: + if (mParentPlot->interactions().testFlag(QCP::iRangeZoom)) + { + if (mRangeZoom != 0) + { + double factor; + double wheelSteps = event->delta()/120.0; // a single step delta is +/-120 usually + if (mRangeZoom.testFlag(Qt::Horizontal)) + { + factor = qPow(mRangeZoomFactorHorz, wheelSteps); + if (mRangeZoomHorzAxis.data()) + mRangeZoomHorzAxis.data()->scaleRange(factor, mRangeZoomHorzAxis.data()->pixelToCoord(event->pos().x())); + } + if (mRangeZoom.testFlag(Qt::Vertical)) + { + factor = qPow(mRangeZoomFactorVert, wheelSteps); + if (mRangeZoomVertAxis.data()) + mRangeZoomVertAxis.data()->scaleRange(factor, mRangeZoomVertAxis.data()->pixelToCoord(event->pos().y())); + } + mParentPlot->replot(); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPAbstractLegendItem +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPAbstractLegendItem + \brief The abstract base class for all entries in a QCPLegend. + + It defines a very basic interface for entries in a QCPLegend. For representing plottables in the + legend, the subclass \ref QCPPlottableLegendItem is more suitable. + + Only derive directly from this class when you need absolute freedom (e.g. a custom legend entry + that's not even associated with a plottable). + + You must implement the following pure virtual functions: + \li \ref draw (from QCPLayerable) + + You inherit the following members you may use: + + + + + + + + +
QCPLegend *\b mParentLegendA pointer to the parent QCPLegend.
QFont \b mFontThe generic font of the item. You should use this font for all or at least the most prominent text of the item.
+*/ + +/* start of documentation of signals */ + +/*! \fn void QCPAbstractLegendItem::selectionChanged(bool selected) + + This signal is emitted when the selection state of this legend item has changed, either by user + interaction or by a direct call to \ref setSelected. +*/ + +/* end of documentation of signals */ + +/*! + Constructs a QCPAbstractLegendItem and associates it with the QCPLegend \a parent. This does not + cause the item to be added to \a parent, so \ref QCPLegend::addItem must be called separately. +*/ +QCPAbstractLegendItem::QCPAbstractLegendItem(QCPLegend *parent) : + QCPLayoutElement(parent->parentPlot()), + mParentLegend(parent), + mFont(parent->font()), + mTextColor(parent->textColor()), + mSelectedFont(parent->selectedFont()), + mSelectedTextColor(parent->selectedTextColor()), + mSelectable(true), + mSelected(false) +{ + setLayer(QLatin1String("legend")); + setMargins(QMargins(8, 2, 8, 2)); +} + +/*! + Sets the default font of this specific legend item to \a font. + + \see setTextColor, QCPLegend::setFont +*/ +void QCPAbstractLegendItem::setFont(const QFont &font) +{ + mFont = font; +} + +/*! + Sets the default text color of this specific legend item to \a color. + + \see setFont, QCPLegend::setTextColor +*/ +void QCPAbstractLegendItem::setTextColor(const QColor &color) +{ + mTextColor = color; +} + +/*! + When this legend item is selected, \a font is used to draw generic text, instead of the normal + font set with \ref setFont. + + \see setFont, QCPLegend::setSelectedFont +*/ +void QCPAbstractLegendItem::setSelectedFont(const QFont &font) +{ + mSelectedFont = font; +} + +/*! + When this legend item is selected, \a color is used to draw generic text, instead of the normal + color set with \ref setTextColor. + + \see setTextColor, QCPLegend::setSelectedTextColor +*/ +void QCPAbstractLegendItem::setSelectedTextColor(const QColor &color) +{ + mSelectedTextColor = color; +} + +/*! + Sets whether this specific legend item is selectable. + + \see setSelectedParts, QCustomPlot::setInteractions +*/ +void QCPAbstractLegendItem::setSelectable(bool selectable) +{ + if (mSelectable != selectable) + { + mSelectable = selectable; + emit selectableChanged(mSelectable); + } +} + +/*! + Sets whether this specific legend item is selected. + + It is possible to set the selection state of this item by calling this function directly, even if + setSelectable is set to false. + + \see setSelectableParts, QCustomPlot::setInteractions +*/ +void QCPAbstractLegendItem::setSelected(bool selected) +{ + if (mSelected != selected) + { + mSelected = selected; + emit selectionChanged(mSelected); + } +} + +/* inherits documentation from base class */ +double QCPAbstractLegendItem::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + if (!mParentPlot) return -1; + if (onlySelectable && (!mSelectable || !mParentLegend->selectableParts().testFlag(QCPLegend::spItems))) + return -1; + + if (mRect.contains(pos.toPoint())) + return mParentPlot->selectionTolerance()*0.99; + else + return -1; +} + +/* inherits documentation from base class */ +void QCPAbstractLegendItem::applyDefaultAntialiasingHint(QCPPainter *painter) const +{ + applyAntialiasingHint(painter, mAntialiased, QCP::aeLegendItems); +} + +/* inherits documentation from base class */ +QRect QCPAbstractLegendItem::clipRect() const +{ + return mOuterRect; +} + +/* inherits documentation from base class */ +void QCPAbstractLegendItem::selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged) +{ + Q_UNUSED(event) + Q_UNUSED(details) + if (mSelectable && mParentLegend->selectableParts().testFlag(QCPLegend::spItems)) + { + bool selBefore = mSelected; + setSelected(additive ? !mSelected : true); + if (selectionStateChanged) + *selectionStateChanged = mSelected != selBefore; + } +} + +/* inherits documentation from base class */ +void QCPAbstractLegendItem::deselectEvent(bool *selectionStateChanged) +{ + if (mSelectable && mParentLegend->selectableParts().testFlag(QCPLegend::spItems)) + { + bool selBefore = mSelected; + setSelected(false); + if (selectionStateChanged) + *selectionStateChanged = mSelected != selBefore; + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPPlottableLegendItem +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPPlottableLegendItem + \brief A legend item representing a plottable with an icon and the plottable name. + + This is the standard legend item for plottables. It displays an icon of the plottable next to the + plottable name. The icon is drawn by the respective plottable itself (\ref + QCPAbstractPlottable::drawLegendIcon), and tries to give an intuitive symbol for the plottable. + For example, the QCPGraph draws a centered horizontal line and/or a single scatter point in the + middle. + + Legend items of this type are always associated with one plottable (retrievable via the + plottable() function and settable with the constructor). You may change the font of the plottable + name with \ref setFont. Icon padding and border pen is taken from the parent QCPLegend, see \ref + QCPLegend::setIconBorderPen and \ref QCPLegend::setIconTextPadding. + + The function \ref QCPAbstractPlottable::addToLegend/\ref QCPAbstractPlottable::removeFromLegend + creates/removes legend items of this type in the default implementation. However, these functions + may be reimplemented such that a different kind of legend item (e.g a direct subclass of + QCPAbstractLegendItem) is used for that plottable. + + Since QCPLegend is based on QCPLayoutGrid, a legend item itself is just a subclass of + QCPLayoutElement. While it could be added to a legend (or any other layout) via the normal layout + interface, QCPLegend has specialized functions for handling legend items conveniently, see the + documentation of \ref QCPLegend. +*/ + +/*! + Creates a new legend item associated with \a plottable. + + Once it's created, it can be added to the legend via \ref QCPLegend::addItem. + + A more convenient way of adding/removing a plottable to/from the legend is via the functions \ref + QCPAbstractPlottable::addToLegend and \ref QCPAbstractPlottable::removeFromLegend. +*/ +QCPPlottableLegendItem::QCPPlottableLegendItem(QCPLegend *parent, QCPAbstractPlottable *plottable) : + QCPAbstractLegendItem(parent), + mPlottable(plottable) +{ +} + +/*! \internal + + Returns the pen that shall be used to draw the icon border, taking into account the selection + state of this item. +*/ +QPen QCPPlottableLegendItem::getIconBorderPen() const +{ + return mSelected ? mParentLegend->selectedIconBorderPen() : mParentLegend->iconBorderPen(); +} + +/*! \internal + + Returns the text color that shall be used to draw text, taking into account the selection state + of this item. +*/ +QColor QCPPlottableLegendItem::getTextColor() const +{ + return mSelected ? mSelectedTextColor : mTextColor; +} + +/*! \internal + + Returns the font that shall be used to draw text, taking into account the selection state of this + item. +*/ +QFont QCPPlottableLegendItem::getFont() const +{ + return mSelected ? mSelectedFont : mFont; +} + +/*! \internal + + Draws the item with \a painter. The size and position of the drawn legend item is defined by the + parent layout (typically a \ref QCPLegend) and the \ref minimumSizeHint and \ref maximumSizeHint + of this legend item. +*/ +void QCPPlottableLegendItem::draw(QCPPainter *painter) +{ + if (!mPlottable) return; + painter->setFont(getFont()); + painter->setPen(QPen(getTextColor())); + QSizeF iconSize = mParentLegend->iconSize(); + QRectF textRect = painter->fontMetrics().boundingRect(0, 0, 0, iconSize.height(), Qt::TextDontClip, mPlottable->name()); + QRectF iconRect(mRect.topLeft(), iconSize); + int textHeight = qMax(textRect.height(), iconSize.height()); // if text has smaller height than icon, center text vertically in icon height, else align tops + painter->drawText(mRect.x()+iconSize.width()+mParentLegend->iconTextPadding(), mRect.y(), textRect.width(), textHeight, Qt::TextDontClip, mPlottable->name()); + // draw icon: + painter->save(); + painter->setClipRect(iconRect, Qt::IntersectClip); + mPlottable->drawLegendIcon(painter, iconRect); + painter->restore(); + // draw icon border: + if (getIconBorderPen().style() != Qt::NoPen) + { + painter->setPen(getIconBorderPen()); + painter->setBrush(Qt::NoBrush); + painter->drawRect(iconRect); + } +} + +/*! \internal + + Calculates and returns the size of this item. This includes the icon, the text and the padding in + between. +*/ +QSize QCPPlottableLegendItem::minimumSizeHint() const +{ + if (!mPlottable) return QSize(); + QSize result(0, 0); + QRect textRect; + QFontMetrics fontMetrics(getFont()); + QSize iconSize = mParentLegend->iconSize(); + textRect = fontMetrics.boundingRect(0, 0, 0, iconSize.height(), Qt::TextDontClip, mPlottable->name()); + result.setWidth(iconSize.width() + mParentLegend->iconTextPadding() + textRect.width() + mMargins.left() + mMargins.right()); + result.setHeight(qMax(textRect.height(), iconSize.height()) + mMargins.top() + mMargins.bottom()); + return result; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPLegend +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPLegend + \brief Manages a legend inside a QCustomPlot. + + A legend is a small box somewhere in the plot which lists plottables with their name and icon. + + Normally, the legend is populated by calling \ref QCPAbstractPlottable::addToLegend. The + respective legend item can be removed with \ref QCPAbstractPlottable::removeFromLegend. However, + QCPLegend also offers an interface to add and manipulate legend items directly: \ref item, \ref + itemWithPlottable, \ref itemCount, \ref addItem, \ref removeItem, etc. + + The QCPLegend derives from QCPLayoutGrid and as such can be placed in any position a + QCPLayoutElement may be positioned. The legend items are themselves QCPLayoutElements which are + placed in the grid layout of the legend. QCPLegend only adds an interface specialized for + handling child elements of type QCPAbstractLegendItem, as mentioned above. In principle, any + other layout elements may also be added to a legend via the normal \ref QCPLayoutGrid interface. + However, the QCPAbstractLegendItem-Interface will ignore those elements (e.g. \ref itemCount will + only return the number of items with QCPAbstractLegendItems type). + + By default, every QCustomPlot has one legend (QCustomPlot::legend) which is placed in the inset + layout of the main axis rect (\ref QCPAxisRect::insetLayout). To move the legend to another + position inside the axis rect, use the methods of the \ref QCPLayoutInset. To move the legend + outside of the axis rect, place it anywhere else with the QCPLayout/QCPLayoutElement interface. +*/ + +/* start of documentation of signals */ + +/*! \fn void QCPLegend::selectionChanged(QCPLegend::SelectableParts selection); + + This signal is emitted when the selection state of this legend has changed. + + \see setSelectedParts, setSelectableParts +*/ + +/* end of documentation of signals */ + +/*! + Constructs a new QCPLegend instance with \a parentPlot as the containing plot and default values. + + Note that by default, QCustomPlot already contains a legend ready to be used as + QCustomPlot::legend +*/ +QCPLegend::QCPLegend() +{ + setRowSpacing(0); + setColumnSpacing(10); + setMargins(QMargins(2, 3, 2, 2)); + setAntialiased(false); + setIconSize(32, 18); + + setIconTextPadding(7); + + setSelectableParts(spLegendBox | spItems); + setSelectedParts(spNone); + + setBorderPen(QPen(Qt::black)); + setSelectedBorderPen(QPen(Qt::blue, 2)); + setIconBorderPen(Qt::NoPen); + setSelectedIconBorderPen(QPen(Qt::blue, 2)); + setBrush(Qt::white); + setSelectedBrush(Qt::white); + setTextColor(Qt::black); + setSelectedTextColor(Qt::blue); +} + +QCPLegend::~QCPLegend() +{ + clearItems(); + if (qobject_cast(mParentPlot)) // make sure this isn't called from QObject dtor when QCustomPlot is already destructed (happens when the legend is not in any layout and thus QObject-child of QCustomPlot) + mParentPlot->legendRemoved(this); +} + +/* no doc for getter, see setSelectedParts */ +QCPLegend::SelectableParts QCPLegend::selectedParts() const +{ + // check whether any legend elements selected, if yes, add spItems to return value + bool hasSelectedItems = false; + for (int i=0; iselected()) + { + hasSelectedItems = true; + break; + } + } + if (hasSelectedItems) + return mSelectedParts | spItems; + else + return mSelectedParts & ~spItems; +} + +/*! + Sets the pen, the border of the entire legend is drawn with. +*/ +void QCPLegend::setBorderPen(const QPen &pen) +{ + mBorderPen = pen; +} + +/*! + Sets the brush of the legend background. +*/ +void QCPLegend::setBrush(const QBrush &brush) +{ + mBrush = brush; +} + +/*! + Sets the default font of legend text. Legend items that draw text (e.g. the name of a graph) will + use this font by default. However, a different font can be specified on a per-item-basis by + accessing the specific legend item. + + This function will also set \a font on all already existing legend items. + + \see QCPAbstractLegendItem::setFont +*/ +void QCPLegend::setFont(const QFont &font) +{ + mFont = font; + for (int i=0; isetFont(mFont); + } +} + +/*! + Sets the default color of legend text. Legend items that draw text (e.g. the name of a graph) + will use this color by default. However, a different colors can be specified on a per-item-basis + by accessing the specific legend item. + + This function will also set \a color on all already existing legend items. + + \see QCPAbstractLegendItem::setTextColor +*/ +void QCPLegend::setTextColor(const QColor &color) +{ + mTextColor = color; + for (int i=0; isetTextColor(color); + } +} + +/*! + Sets the size of legend icons. Legend items that draw an icon (e.g. a visual + representation of the graph) will use this size by default. +*/ +void QCPLegend::setIconSize(const QSize &size) +{ + mIconSize = size; +} + +/*! \overload +*/ +void QCPLegend::setIconSize(int width, int height) +{ + mIconSize.setWidth(width); + mIconSize.setHeight(height); +} + +/*! + Sets the horizontal space in pixels between the legend icon and the text next to it. + Legend items that draw an icon (e.g. a visual representation of the graph) and text (e.g. the + name of the graph) will use this space by default. +*/ +void QCPLegend::setIconTextPadding(int padding) +{ + mIconTextPadding = padding; +} + +/*! + Sets the pen used to draw a border around each legend icon. Legend items that draw an + icon (e.g. a visual representation of the graph) will use this pen by default. + + If no border is wanted, set this to \a Qt::NoPen. +*/ +void QCPLegend::setIconBorderPen(const QPen &pen) +{ + mIconBorderPen = pen; +} + +/*! + Sets whether the user can (de-)select the parts in \a selectable by clicking on the QCustomPlot surface. + (When \ref QCustomPlot::setInteractions contains \ref QCP::iSelectLegend.) + + However, even when \a selectable is set to a value not allowing the selection of a specific part, + it is still possible to set the selection of this part manually, by calling \ref setSelectedParts + directly. + + \see SelectablePart, setSelectedParts +*/ +void QCPLegend::setSelectableParts(const SelectableParts &selectable) +{ + if (mSelectableParts != selectable) + { + mSelectableParts = selectable; + emit selectableChanged(mSelectableParts); + } +} + +/*! + Sets the selected state of the respective legend parts described by \ref SelectablePart. When a part + is selected, it uses a different pen/font and brush. If some legend items are selected and \a selected + doesn't contain \ref spItems, those items become deselected. + + The entire selection mechanism is handled automatically when \ref QCustomPlot::setInteractions + contains iSelectLegend. You only need to call this function when you wish to change the selection + state manually. + + This function can change the selection state of a part even when \ref setSelectableParts was set to a + value that actually excludes the part. + + emits the \ref selectionChanged signal when \a selected is different from the previous selection state. + + Note that it doesn't make sense to set the selected state \ref spItems here when it wasn't set + before, because there's no way to specify which exact items to newly select. Do this by calling + \ref QCPAbstractLegendItem::setSelected directly on the legend item you wish to select. + + \see SelectablePart, setSelectableParts, selectTest, setSelectedBorderPen, setSelectedIconBorderPen, setSelectedBrush, + setSelectedFont +*/ +void QCPLegend::setSelectedParts(const SelectableParts &selected) +{ + SelectableParts newSelected = selected; + mSelectedParts = this->selectedParts(); // update mSelectedParts in case item selection changed + + if (mSelectedParts != newSelected) + { + if (!mSelectedParts.testFlag(spItems) && newSelected.testFlag(spItems)) // attempt to set spItems flag (can't do that) + { + qDebug() << Q_FUNC_INFO << "spItems flag can not be set, it can only be unset with this function"; + newSelected &= ~spItems; + } + if (mSelectedParts.testFlag(spItems) && !newSelected.testFlag(spItems)) // spItems flag was unset, so clear item selection + { + for (int i=0; isetSelected(false); + } + } + mSelectedParts = newSelected; + emit selectionChanged(mSelectedParts); + } +} + +/*! + When the legend box is selected, this pen is used to draw the border instead of the normal pen + set via \ref setBorderPen. + + \see setSelectedParts, setSelectableParts, setSelectedBrush +*/ +void QCPLegend::setSelectedBorderPen(const QPen &pen) +{ + mSelectedBorderPen = pen; +} + +/*! + Sets the pen legend items will use to draw their icon borders, when they are selected. + + \see setSelectedParts, setSelectableParts, setSelectedFont +*/ +void QCPLegend::setSelectedIconBorderPen(const QPen &pen) +{ + mSelectedIconBorderPen = pen; +} + +/*! + When the legend box is selected, this brush is used to draw the legend background instead of the normal brush + set via \ref setBrush. + + \see setSelectedParts, setSelectableParts, setSelectedBorderPen +*/ +void QCPLegend::setSelectedBrush(const QBrush &brush) +{ + mSelectedBrush = brush; +} + +/*! + Sets the default font that is used by legend items when they are selected. + + This function will also set \a font on all already existing legend items. + + \see setFont, QCPAbstractLegendItem::setSelectedFont +*/ +void QCPLegend::setSelectedFont(const QFont &font) +{ + mSelectedFont = font; + for (int i=0; isetSelectedFont(font); + } +} + +/*! + Sets the default text color that is used by legend items when they are selected. + + This function will also set \a color on all already existing legend items. + + \see setTextColor, QCPAbstractLegendItem::setSelectedTextColor +*/ +void QCPLegend::setSelectedTextColor(const QColor &color) +{ + mSelectedTextColor = color; + for (int i=0; isetSelectedTextColor(color); + } +} + +/*! + Returns the item with index \a i. + + \see itemCount +*/ +QCPAbstractLegendItem *QCPLegend::item(int index) const +{ + return qobject_cast(elementAt(index)); +} + +/*! + Returns the QCPPlottableLegendItem which is associated with \a plottable (e.g. a \ref QCPGraph*). + If such an item isn't in the legend, returns 0. + + \see hasItemWithPlottable +*/ +QCPPlottableLegendItem *QCPLegend::itemWithPlottable(const QCPAbstractPlottable *plottable) const +{ + for (int i=0; i(item(i))) + { + if (pli->plottable() == plottable) + return pli; + } + } + return 0; +} + +/*! + Returns the number of items currently in the legend. + \see item +*/ +int QCPLegend::itemCount() const +{ + return elementCount(); +} + +/*! + Returns whether the legend contains \a itm. +*/ +bool QCPLegend::hasItem(QCPAbstractLegendItem *item) const +{ + for (int i=0; iitem(i)) + return true; + } + return false; +} + +/*! + Returns whether the legend contains a QCPPlottableLegendItem which is associated with \a plottable (e.g. a \ref QCPGraph*). + If such an item isn't in the legend, returns false. + + \see itemWithPlottable +*/ +bool QCPLegend::hasItemWithPlottable(const QCPAbstractPlottable *plottable) const +{ + return itemWithPlottable(plottable); +} + +/*! + Adds \a item to the legend, if it's not present already. + + Returns true on sucess, i.e. if the item wasn't in the list already and has been successfuly added. + + The legend takes ownership of the item. +*/ +bool QCPLegend::addItem(QCPAbstractLegendItem *item) +{ + if (!hasItem(item)) + { + return addElement(rowCount(), 0, item); + } else + return false; +} + +/*! + Removes the item with index \a index from the legend. + + Returns true, if successful. + + \see itemCount, clearItems +*/ +bool QCPLegend::removeItem(int index) +{ + if (QCPAbstractLegendItem *ali = item(index)) + { + bool success = remove(ali); + simplify(); + return success; + } else + return false; +} + +/*! \overload + + Removes \a item from the legend. + + Returns true, if successful. + + \see clearItems +*/ +bool QCPLegend::removeItem(QCPAbstractLegendItem *item) +{ + bool success = remove(item); + simplify(); + return success; +} + +/*! + Removes all items from the legend. +*/ +void QCPLegend::clearItems() +{ + for (int i=itemCount()-1; i>=0; --i) + removeItem(i); +} + +/*! + Returns the legend items that are currently selected. If no items are selected, + the list is empty. + + \see QCPAbstractLegendItem::setSelected, setSelectable +*/ +QList QCPLegend::selectedItems() const +{ + QList result; + for (int i=0; iselected()) + result.append(ali); + } + } + return result; +} + +/*! \internal + + A convenience function to easily set the QPainter::Antialiased hint on the provided \a painter + before drawing main legend elements. + + This is the antialiasing state the painter passed to the \ref draw method is in by default. + + This function takes into account the local setting of the antialiasing flag as well as the + overrides set with \ref QCustomPlot::setAntialiasedElements and \ref + QCustomPlot::setNotAntialiasedElements. + + \see setAntialiased +*/ +void QCPLegend::applyDefaultAntialiasingHint(QCPPainter *painter) const +{ + applyAntialiasingHint(painter, mAntialiased, QCP::aeLegend); +} + +/*! \internal + + Returns the pen used to paint the border of the legend, taking into account the selection state + of the legend box. +*/ +QPen QCPLegend::getBorderPen() const +{ + return mSelectedParts.testFlag(spLegendBox) ? mSelectedBorderPen : mBorderPen; +} + +/*! \internal + + Returns the brush used to paint the background of the legend, taking into account the selection + state of the legend box. +*/ +QBrush QCPLegend::getBrush() const +{ + return mSelectedParts.testFlag(spLegendBox) ? mSelectedBrush : mBrush; +} + +/*! \internal + + Draws the legend box with the provided \a painter. The individual legend items are layerables + themselves, thus are drawn independently. +*/ +void QCPLegend::draw(QCPPainter *painter) +{ + // draw background rect: + painter->setBrush(getBrush()); + painter->setPen(getBorderPen()); + painter->drawRect(mOuterRect); +} + +/* inherits documentation from base class */ +double QCPLegend::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + if (!mParentPlot) return -1; + if (onlySelectable && !mSelectableParts.testFlag(spLegendBox)) + return -1; + + if (mOuterRect.contains(pos.toPoint())) + { + if (details) details->setValue(spLegendBox); + return mParentPlot->selectionTolerance()*0.99; + } + return -1; +} + +/* inherits documentation from base class */ +void QCPLegend::selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged) +{ + Q_UNUSED(event) + mSelectedParts = selectedParts(); // in case item selection has changed + if (details.value() == spLegendBox && mSelectableParts.testFlag(spLegendBox)) + { + SelectableParts selBefore = mSelectedParts; + setSelectedParts(additive ? mSelectedParts^spLegendBox : mSelectedParts|spLegendBox); // no need to unset spItems in !additive case, because they will be deselected by QCustomPlot (they're normal QCPLayerables with own deselectEvent) + if (selectionStateChanged) + *selectionStateChanged = mSelectedParts != selBefore; + } +} + +/* inherits documentation from base class */ +void QCPLegend::deselectEvent(bool *selectionStateChanged) +{ + mSelectedParts = selectedParts(); // in case item selection has changed + if (mSelectableParts.testFlag(spLegendBox)) + { + SelectableParts selBefore = mSelectedParts; + setSelectedParts(selectedParts() & ~spLegendBox); + if (selectionStateChanged) + *selectionStateChanged = mSelectedParts != selBefore; + } +} + +/* inherits documentation from base class */ +QCP::Interaction QCPLegend::selectionCategory() const +{ + return QCP::iSelectLegend; +} + +/* inherits documentation from base class */ +QCP::Interaction QCPAbstractLegendItem::selectionCategory() const +{ + return QCP::iSelectLegend; +} + +/* inherits documentation from base class */ +void QCPLegend::parentPlotInitialized(QCustomPlot *parentPlot) +{ + Q_UNUSED(parentPlot) +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPPlotTitle +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPPlotTitle + \brief A layout element displaying a plot title text + + The text may be specified with \ref setText, theformatting can be controlled with \ref setFont + and \ref setTextColor. + + A plot title can be added as follows: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpplottitle-creation + + Since a plot title is a common requirement, QCustomPlot offers specialized selection signals for + easy interaction with QCPPlotTitle. If a layout element of type QCPPlotTitle is clicked, the + signal \ref QCustomPlot::titleClick is emitted. A double click emits the \ref + QCustomPlot::titleDoubleClick signal. +*/ + +/* start documentation of signals */ + +/*! \fn void QCPPlotTitle::selectionChanged(bool selected) + + This signal is emitted when the selection state has changed to \a selected, either by user + interaction or by a direct call to \ref setSelected. + + \see setSelected, setSelectable +*/ + +/* end documentation of signals */ + +/*! + Creates a new QCPPlotTitle instance and sets default values. The initial text is empty (\ref setText). + + To set the title text in the constructor, rather use \ref QCPPlotTitle(QCustomPlot *parentPlot, const QString &text). +*/ +QCPPlotTitle::QCPPlotTitle(QCustomPlot *parentPlot) : + QCPLayoutElement(parentPlot), + mFont(QFont(QLatin1String("sans serif"), 13*1.5, QFont::Bold)), + mTextColor(Qt::black), + mSelectedFont(QFont(QLatin1String("sans serif"), 13*1.6, QFont::Bold)), + mSelectedTextColor(Qt::blue), + mSelectable(false), + mSelected(false) +{ + if (parentPlot) + { + setLayer(parentPlot->currentLayer()); + mFont = QFont(parentPlot->font().family(), parentPlot->font().pointSize()*1.5, QFont::Bold); + mSelectedFont = QFont(parentPlot->font().family(), parentPlot->font().pointSize()*1.6, QFont::Bold); + } + setMargins(QMargins(5, 5, 5, 0)); +} + +/*! \overload + + Creates a new QCPPlotTitle instance and sets default values. The initial text is set to \a text. +*/ +QCPPlotTitle::QCPPlotTitle(QCustomPlot *parentPlot, const QString &text) : + QCPLayoutElement(parentPlot), + mText(text), + mFont(QFont(parentPlot->font().family(), parentPlot->font().pointSize()*1.5, QFont::Bold)), + mTextColor(Qt::black), + mSelectedFont(QFont(parentPlot->font().family(), parentPlot->font().pointSize()*1.6, QFont::Bold)), + mSelectedTextColor(Qt::blue), + mSelectable(false), + mSelected(false) +{ + setLayer(QLatin1String("axes")); + setMargins(QMargins(5, 5, 5, 0)); +} + +/*! + Sets the text that will be displayed to \a text. Multiple lines can be created by insertion of "\n". + + \see setFont, setTextColor +*/ +void QCPPlotTitle::setText(const QString &text) +{ + mText = text; +} + +/*! + Sets the \a font of the title text. + + \see setTextColor, setSelectedFont +*/ +void QCPPlotTitle::setFont(const QFont &font) +{ + mFont = font; +} + +/*! + Sets the \a color of the title text. + + \see setFont, setSelectedTextColor +*/ +void QCPPlotTitle::setTextColor(const QColor &color) +{ + mTextColor = color; +} + +/*! + Sets the \a font of the title text that will be used if the plot title is selected (\ref setSelected). + + \see setFont +*/ +void QCPPlotTitle::setSelectedFont(const QFont &font) +{ + mSelectedFont = font; +} + +/*! + Sets the \a color of the title text that will be used if the plot title is selected (\ref setSelected). + + \see setTextColor +*/ +void QCPPlotTitle::setSelectedTextColor(const QColor &color) +{ + mSelectedTextColor = color; +} + +/*! + Sets whether the user may select this plot title to \a selectable. + + Note that even when \a selectable is set to false, the selection state may be changed + programmatically via \ref setSelected. +*/ +void QCPPlotTitle::setSelectable(bool selectable) +{ + if (mSelectable != selectable) + { + mSelectable = selectable; + emit selectableChanged(mSelectable); + } +} + +/*! + Sets the selection state of this plot title to \a selected. If the selection has changed, \ref + selectionChanged is emitted. + + Note that this function can change the selection state independently of the current \ref + setSelectable state. +*/ +void QCPPlotTitle::setSelected(bool selected) +{ + if (mSelected != selected) + { + mSelected = selected; + emit selectionChanged(mSelected); + } +} + +/* inherits documentation from base class */ +void QCPPlotTitle::applyDefaultAntialiasingHint(QCPPainter *painter) const +{ + applyAntialiasingHint(painter, mAntialiased, QCP::aeNone); +} + +/* inherits documentation from base class */ +void QCPPlotTitle::draw(QCPPainter *painter) +{ + painter->setFont(mainFont()); + painter->setPen(QPen(mainTextColor())); + painter->drawText(mRect, Qt::AlignCenter, mText, &mTextBoundingRect); +} + +/* inherits documentation from base class */ +QSize QCPPlotTitle::minimumSizeHint() const +{ + QFontMetrics metrics(mFont); + QSize result = metrics.boundingRect(0, 0, 0, 0, Qt::AlignCenter, mText).size(); + result.rwidth() += mMargins.left() + mMargins.right(); + result.rheight() += mMargins.top() + mMargins.bottom(); + return result; +} + +/* inherits documentation from base class */ +QSize QCPPlotTitle::maximumSizeHint() const +{ + QFontMetrics metrics(mFont); + QSize result = metrics.boundingRect(0, 0, 0, 0, Qt::AlignCenter, mText).size(); + result.rheight() += mMargins.top() + mMargins.bottom(); + result.setWidth(QWIDGETSIZE_MAX); + return result; +} + +/* inherits documentation from base class */ +void QCPPlotTitle::selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged) +{ + Q_UNUSED(event) + Q_UNUSED(details) + if (mSelectable) + { + bool selBefore = mSelected; + setSelected(additive ? !mSelected : true); + if (selectionStateChanged) + *selectionStateChanged = mSelected != selBefore; + } +} + +/* inherits documentation from base class */ +void QCPPlotTitle::deselectEvent(bool *selectionStateChanged) +{ + if (mSelectable) + { + bool selBefore = mSelected; + setSelected(false); + if (selectionStateChanged) + *selectionStateChanged = mSelected != selBefore; + } +} + +/* inherits documentation from base class */ +double QCPPlotTitle::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + if (onlySelectable && !mSelectable) + return -1; + + if (mTextBoundingRect.contains(pos.toPoint())) + return mParentPlot->selectionTolerance()*0.99; + else + return -1; +} + +/*! \internal + + Returns the main font to be used. This is mSelectedFont if \ref setSelected is set to + true, else mFont is returned. +*/ +QFont QCPPlotTitle::mainFont() const +{ + return mSelected ? mSelectedFont : mFont; +} + +/*! \internal + + Returns the main color to be used. This is mSelectedTextColor if \ref setSelected is set to + true, else mTextColor is returned. +*/ +QColor QCPPlotTitle::mainTextColor() const +{ + return mSelected ? mSelectedTextColor : mTextColor; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPColorScale +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPColorScale + \brief A color scale for use with color coding data such as QCPColorMap + + This layout element can be placed on the plot to correlate a color gradient with data values. It + is usually used in combination with one or multiple \ref QCPColorMap "QCPColorMaps". + + \image html QCPColorScale.png + + The color scale can be either horizontal or vertical, as shown in the image above. The + orientation and the side where the numbers appear is controlled with \ref setType. + + Use \ref QCPColorMap::setColorScale to connect a color map with a color scale. Once they are + connected, they share their gradient, data range and data scale type (\ref setGradient, \ref + setDataRange, \ref setDataScaleType). Multiple color maps may be associated with a single color + scale, to make them all synchronize these properties. + + To have finer control over the number display and axis behaviour, you can directly access the + \ref axis. See the documentation of QCPAxis for details about configuring axes. For example, if + you want to change the number of automatically generated ticks, call + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcolorscale-autotickcount + + Placing a color scale next to the main axis rect works like with any other layout element: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcolorscale-creation + In this case we have placed it to the right of the default axis rect, so it wasn't necessary to + call \ref setType, since \ref QCPAxis::atRight is already the default. The text next to the color + scale can be set with \ref setLabel. + + For optimum appearance (like in the image above), it may be desirable to line up the axis rect and + the borders of the color scale. Use a \ref QCPMarginGroup to achieve this: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcolorscale-margingroup + + Color scales are initialized with a non-zero minimum top and bottom margin (\ref + setMinimumMargins), because vertical color scales are most common and the minimum top/bottom + margin makes sure it keeps some distance to the top/bottom widget border. So if you change to a + horizontal color scale by setting \ref setType to \ref QCPAxis::atBottom or \ref QCPAxis::atTop, you + might want to also change the minimum margins accordingly, e.g. setMinimumMargins(QMargins(6, 0, 6, 0)). +*/ + +/* start documentation of inline functions */ + +/*! \fn QCPAxis *QCPColorScale::axis() const + + Returns the internal \ref QCPAxis instance of this color scale. You can access it to alter the + appearance and behaviour of the axis. \ref QCPColorScale duplicates some properties in its + interface for convenience. Those are \ref setDataRange (\ref QCPAxis::setRange), \ref + setDataScaleType (\ref QCPAxis::setScaleType), and the method \ref setLabel (\ref + QCPAxis::setLabel). As they each are connected, it does not matter whether you use the method on + the QCPColorScale or on its QCPAxis. + + If the type of the color scale is changed with \ref setType, the axis returned by this method + will change, too, to either the left, right, bottom or top axis, depending on which type was set. +*/ + +/* end documentation of signals */ +/* start documentation of signals */ + +/*! \fn void QCPColorScale::dataRangeChanged(QCPRange newRange); + + This signal is emitted when the data range changes. + + \see setDataRange +*/ + +/*! \fn void QCPColorScale::dataScaleTypeChanged(QCPAxis::ScaleType scaleType); + + This signal is emitted when the data scale type changes. + + \see setDataScaleType +*/ + +/*! \fn void QCPColorScale::gradientChanged(QCPColorGradient newGradient); + + This signal is emitted when the gradient changes. + + \see setGradient +*/ + +/* end documentation of signals */ + +/*! + Constructs a new QCPColorScale. +*/ +QCPColorScale::QCPColorScale(QCustomPlot *parentPlot) : + QCPLayoutElement(parentPlot), + mType(QCPAxis::atTop), // set to atTop such that setType(QCPAxis::atRight) below doesn't skip work because it thinks it's already atRight + mDataScaleType(QCPAxis::stLinear), + mBarWidth(20), + mAxisRect(new QCPColorScaleAxisRectPrivate(this)) +{ + setMinimumMargins(QMargins(0, 6, 0, 6)); // for default right color scale types, keep some room at bottom and top (important if no margin group is used) + setType(QCPAxis::atRight); + setDataRange(QCPRange(0, 6)); +} + +QCPColorScale::~QCPColorScale() +{ + delete mAxisRect; +} + +/* undocumented getter */ +QString QCPColorScale::label() const +{ + if (!mColorAxis) + { + qDebug() << Q_FUNC_INFO << "internal color axis undefined"; + return QString(); + } + + return mColorAxis.data()->label(); +} + +/* undocumented getter */ +bool QCPColorScale::rangeDrag() const +{ + if (!mAxisRect) + { + qDebug() << Q_FUNC_INFO << "internal axis rect was deleted"; + return false; + } + + return mAxisRect.data()->rangeDrag().testFlag(QCPAxis::orientation(mType)) && + mAxisRect.data()->rangeDragAxis(QCPAxis::orientation(mType)) && + mAxisRect.data()->rangeDragAxis(QCPAxis::orientation(mType))->orientation() == QCPAxis::orientation(mType); +} + +/* undocumented getter */ +bool QCPColorScale::rangeZoom() const +{ + if (!mAxisRect) + { + qDebug() << Q_FUNC_INFO << "internal axis rect was deleted"; + return false; + } + + return mAxisRect.data()->rangeZoom().testFlag(QCPAxis::orientation(mType)) && + mAxisRect.data()->rangeZoomAxis(QCPAxis::orientation(mType)) && + mAxisRect.data()->rangeZoomAxis(QCPAxis::orientation(mType))->orientation() == QCPAxis::orientation(mType); +} + +/*! + Sets at which side of the color scale the axis is placed, and thus also its orientation. + + Note that after setting \a type to a different value, the axis returned by \ref axis() will + be a different one. The new axis will adopt the following properties from the previous axis: The + range, scale type, log base and label. +*/ +void QCPColorScale::setType(QCPAxis::AxisType type) +{ + if (!mAxisRect) + { + qDebug() << Q_FUNC_INFO << "internal axis rect was deleted"; + return; + } + if (mType != type) + { + mType = type; + QCPRange rangeTransfer(0, 6); + double logBaseTransfer = 10; + QString labelTransfer; + // revert some settings on old axis: + if (mColorAxis) + { + rangeTransfer = mColorAxis.data()->range(); + labelTransfer = mColorAxis.data()->label(); + logBaseTransfer = mColorAxis.data()->scaleLogBase(); + mColorAxis.data()->setLabel(QString()); + disconnect(mColorAxis.data(), SIGNAL(rangeChanged(QCPRange)), this, SLOT(setDataRange(QCPRange))); + disconnect(mColorAxis.data(), SIGNAL(scaleTypeChanged(QCPAxis::ScaleType)), this, SLOT(setDataScaleType(QCPAxis::ScaleType))); + } + QList allAxisTypes = QList() << QCPAxis::atLeft << QCPAxis::atRight << QCPAxis::atBottom << QCPAxis::atTop; + foreach (QCPAxis::AxisType atype, allAxisTypes) + { + mAxisRect.data()->axis(atype)->setTicks(atype == mType); + mAxisRect.data()->axis(atype)->setTickLabels(atype== mType); + } + // set new mColorAxis pointer: + mColorAxis = mAxisRect.data()->axis(mType); + // transfer settings to new axis: + mColorAxis.data()->setRange(rangeTransfer); // transfer range of old axis to new one (necessary if axis changes from vertical to horizontal or vice versa) + mColorAxis.data()->setLabel(labelTransfer); + mColorAxis.data()->setScaleLogBase(logBaseTransfer); // scaleType is synchronized among axes in realtime via signals (connected in QCPColorScale ctor), so we only need to take care of log base here + connect(mColorAxis.data(), SIGNAL(rangeChanged(QCPRange)), this, SLOT(setDataRange(QCPRange))); + connect(mColorAxis.data(), SIGNAL(scaleTypeChanged(QCPAxis::ScaleType)), this, SLOT(setDataScaleType(QCPAxis::ScaleType))); + mAxisRect.data()->setRangeDragAxes(QCPAxis::orientation(mType) == Qt::Horizontal ? mColorAxis.data() : 0, + QCPAxis::orientation(mType) == Qt::Vertical ? mColorAxis.data() : 0); + } +} + +/*! + Sets the range spanned by the color gradient and that is shown by the axis in the color scale. + + It is equivalent to calling QCPColorMap::setDataRange on any of the connected color maps. It is + also equivalent to directly accessing the \ref axis and setting its range with \ref + QCPAxis::setRange. + + \see setDataScaleType, setGradient, rescaleDataRange +*/ +void QCPColorScale::setDataRange(const QCPRange &dataRange) +{ + if (mDataRange.lower != dataRange.lower || mDataRange.upper != dataRange.upper) + { + mDataRange = dataRange; + if (mColorAxis) + mColorAxis.data()->setRange(mDataRange); + emit dataRangeChanged(mDataRange); + } +} + +/*! + Sets the scale type of the color scale, i.e. whether values are linearly associated with colors + or logarithmically. + + It is equivalent to calling QCPColorMap::setDataScaleType on any of the connected color maps. It is + also equivalent to directly accessing the \ref axis and setting its scale type with \ref + QCPAxis::setScaleType. + + \see setDataRange, setGradient +*/ +void QCPColorScale::setDataScaleType(QCPAxis::ScaleType scaleType) +{ + if (mDataScaleType != scaleType) + { + mDataScaleType = scaleType; + if (mColorAxis) + mColorAxis.data()->setScaleType(mDataScaleType); + if (mDataScaleType == QCPAxis::stLogarithmic) + setDataRange(mDataRange.sanitizedForLogScale()); + emit dataScaleTypeChanged(mDataScaleType); + } +} + +/*! + Sets the color gradient that will be used to represent data values. + + It is equivalent to calling QCPColorMap::setGradient on any of the connected color maps. + + \see setDataRange, setDataScaleType +*/ +void QCPColorScale::setGradient(const QCPColorGradient &gradient) +{ + if (mGradient != gradient) + { + mGradient = gradient; + if (mAxisRect) + mAxisRect.data()->mGradientImageInvalidated = true; + emit gradientChanged(mGradient); + } +} + +/*! + Sets the axis label of the color scale. This is equivalent to calling \ref QCPAxis::setLabel on + the internal \ref axis. +*/ +void QCPColorScale::setLabel(const QString &str) +{ + if (!mColorAxis) + { + qDebug() << Q_FUNC_INFO << "internal color axis undefined"; + return; + } + + mColorAxis.data()->setLabel(str); +} + +/*! + Sets the width (or height, for horizontal color scales) the bar where the gradient is displayed + will have. +*/ +void QCPColorScale::setBarWidth(int width) +{ + mBarWidth = width; +} + +/*! + Sets whether the user can drag the data range (\ref setDataRange). + + Note that \ref QCP::iRangeDrag must be in the QCustomPlot's interactions (\ref + QCustomPlot::setInteractions) to allow range dragging. +*/ +void QCPColorScale::setRangeDrag(bool enabled) +{ + if (!mAxisRect) + { + qDebug() << Q_FUNC_INFO << "internal axis rect was deleted"; + return; + } + + if (enabled) + mAxisRect.data()->setRangeDrag(QCPAxis::orientation(mType)); + else + mAxisRect.data()->setRangeDrag(0); +} + +/*! + Sets whether the user can zoom the data range (\ref setDataRange) by scrolling the mouse wheel. + + Note that \ref QCP::iRangeZoom must be in the QCustomPlot's interactions (\ref + QCustomPlot::setInteractions) to allow range dragging. +*/ +void QCPColorScale::setRangeZoom(bool enabled) +{ + if (!mAxisRect) + { + qDebug() << Q_FUNC_INFO << "internal axis rect was deleted"; + return; + } + + if (enabled) + mAxisRect.data()->setRangeZoom(QCPAxis::orientation(mType)); + else + mAxisRect.data()->setRangeZoom(0); +} + +/*! + Returns a list of all the color maps associated with this color scale. +*/ +QList QCPColorScale::colorMaps() const +{ + QList result; + for (int i=0; iplottableCount(); ++i) + { + if (QCPColorMap *cm = qobject_cast(mParentPlot->plottable(i))) + if (cm->colorScale() == this) + result.append(cm); + } + return result; +} + +/*! + Changes the data range such that all color maps associated with this color scale are fully mapped + to the gradient in the data dimension. + + \see setDataRange +*/ +void QCPColorScale::rescaleDataRange(bool onlyVisibleMaps) +{ + QList maps = colorMaps(); + QCPRange newRange; + bool haveRange = false; + int sign = 0; // TODO: should change this to QCPAbstractPlottable::SignDomain later (currently is protected, maybe move to QCP namespace) + if (mDataScaleType == QCPAxis::stLogarithmic) + sign = (mDataRange.upper < 0 ? -1 : 1); + for (int i=0; irealVisibility() && onlyVisibleMaps) + continue; + QCPRange mapRange; + if (maps.at(i)->colorScale() == this) + { + bool currentFoundRange = true; + mapRange = maps.at(i)->data()->dataBounds(); + if (sign == 1) + { + if (mapRange.lower <= 0 && mapRange.upper > 0) + mapRange.lower = mapRange.upper*1e-3; + else if (mapRange.lower <= 0 && mapRange.upper <= 0) + currentFoundRange = false; + } else if (sign == -1) + { + if (mapRange.upper >= 0 && mapRange.lower < 0) + mapRange.upper = mapRange.lower*1e-3; + else if (mapRange.upper >= 0 && mapRange.lower >= 0) + currentFoundRange = false; + } + if (currentFoundRange) + { + if (!haveRange) + newRange = mapRange; + else + newRange.expand(mapRange); + haveRange = true; + } + } + } + if (haveRange) + { + if (!QCPRange::validRange(newRange)) // likely due to range being zero (plottable has only constant data in this dimension), shift current range to at least center the data + { + double center = (newRange.lower+newRange.upper)*0.5; // upper and lower should be equal anyway, but just to make sure, incase validRange returned false for other reason + if (mDataScaleType == QCPAxis::stLinear) + { + newRange.lower = center-mDataRange.size()/2.0; + newRange.upper = center+mDataRange.size()/2.0; + } else // mScaleType == stLogarithmic + { + newRange.lower = center/qSqrt(mDataRange.upper/mDataRange.lower); + newRange.upper = center*qSqrt(mDataRange.upper/mDataRange.lower); + } + } + setDataRange(newRange); + } +} + +/* inherits documentation from base class */ +void QCPColorScale::update(UpdatePhase phase) +{ + QCPLayoutElement::update(phase); + if (!mAxisRect) + { + qDebug() << Q_FUNC_INFO << "internal axis rect was deleted"; + return; + } + + mAxisRect.data()->update(phase); + + switch (phase) + { + case upMargins: + { + if (mType == QCPAxis::atBottom || mType == QCPAxis::atTop) + { + setMaximumSize(QWIDGETSIZE_MAX, mBarWidth+mAxisRect.data()->margins().top()+mAxisRect.data()->margins().bottom()+margins().top()+margins().bottom()); + setMinimumSize(0, mBarWidth+mAxisRect.data()->margins().top()+mAxisRect.data()->margins().bottom()+margins().top()+margins().bottom()); + } else + { + setMaximumSize(mBarWidth+mAxisRect.data()->margins().left()+mAxisRect.data()->margins().right()+margins().left()+margins().right(), QWIDGETSIZE_MAX); + setMinimumSize(mBarWidth+mAxisRect.data()->margins().left()+mAxisRect.data()->margins().right()+margins().left()+margins().right(), 0); + } + break; + } + case upLayout: + { + mAxisRect.data()->setOuterRect(rect()); + break; + } + default: break; + } +} + +/* inherits documentation from base class */ +void QCPColorScale::applyDefaultAntialiasingHint(QCPPainter *painter) const +{ + painter->setAntialiasing(false); +} + +/* inherits documentation from base class */ +void QCPColorScale::mousePressEvent(QMouseEvent *event) +{ + if (!mAxisRect) + { + qDebug() << Q_FUNC_INFO << "internal axis rect was deleted"; + return; + } + mAxisRect.data()->mousePressEvent(event); +} + +/* inherits documentation from base class */ +void QCPColorScale::mouseMoveEvent(QMouseEvent *event) +{ + if (!mAxisRect) + { + qDebug() << Q_FUNC_INFO << "internal axis rect was deleted"; + return; + } + mAxisRect.data()->mouseMoveEvent(event); +} + +/* inherits documentation from base class */ +void QCPColorScale::mouseReleaseEvent(QMouseEvent *event) +{ + if (!mAxisRect) + { + qDebug() << Q_FUNC_INFO << "internal axis rect was deleted"; + return; + } + mAxisRect.data()->mouseReleaseEvent(event); +} + +/* inherits documentation from base class */ +void QCPColorScale::wheelEvent(QWheelEvent *event) +{ + if (!mAxisRect) + { + qDebug() << Q_FUNC_INFO << "internal axis rect was deleted"; + return; + } + mAxisRect.data()->wheelEvent(event); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPColorScaleAxisRectPrivate +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPColorScaleAxisRectPrivate + + \internal + \brief An axis rect subclass for use in a QCPColorScale + + This is a private class and not part of the public QCustomPlot interface. + + It provides the axis rect functionality for the QCPColorScale class. +*/ + + +/*! + Creates a new instance, as a child of \a parentColorScale. +*/ +QCPColorScaleAxisRectPrivate::QCPColorScaleAxisRectPrivate(QCPColorScale *parentColorScale) : + QCPAxisRect(parentColorScale->parentPlot(), true), + mParentColorScale(parentColorScale), + mGradientImageInvalidated(true) +{ + setParentLayerable(parentColorScale); + setMinimumMargins(QMargins(0, 0, 0, 0)); + QList allAxisTypes = QList() << QCPAxis::atBottom << QCPAxis::atTop << QCPAxis::atLeft << QCPAxis::atRight; + foreach (QCPAxis::AxisType type, allAxisTypes) + { + axis(type)->setVisible(true); + axis(type)->grid()->setVisible(false); + axis(type)->setPadding(0); + connect(axis(type), SIGNAL(selectionChanged(QCPAxis::SelectableParts)), this, SLOT(axisSelectionChanged(QCPAxis::SelectableParts))); + connect(axis(type), SIGNAL(selectableChanged(QCPAxis::SelectableParts)), this, SLOT(axisSelectableChanged(QCPAxis::SelectableParts))); + } + + connect(axis(QCPAxis::atLeft), SIGNAL(rangeChanged(QCPRange)), axis(QCPAxis::atRight), SLOT(setRange(QCPRange))); + connect(axis(QCPAxis::atRight), SIGNAL(rangeChanged(QCPRange)), axis(QCPAxis::atLeft), SLOT(setRange(QCPRange))); + connect(axis(QCPAxis::atBottom), SIGNAL(rangeChanged(QCPRange)), axis(QCPAxis::atTop), SLOT(setRange(QCPRange))); + connect(axis(QCPAxis::atTop), SIGNAL(rangeChanged(QCPRange)), axis(QCPAxis::atBottom), SLOT(setRange(QCPRange))); + connect(axis(QCPAxis::atLeft), SIGNAL(scaleTypeChanged(QCPAxis::ScaleType)), axis(QCPAxis::atRight), SLOT(setScaleType(QCPAxis::ScaleType))); + connect(axis(QCPAxis::atRight), SIGNAL(scaleTypeChanged(QCPAxis::ScaleType)), axis(QCPAxis::atLeft), SLOT(setScaleType(QCPAxis::ScaleType))); + connect(axis(QCPAxis::atBottom), SIGNAL(scaleTypeChanged(QCPAxis::ScaleType)), axis(QCPAxis::atTop), SLOT(setScaleType(QCPAxis::ScaleType))); + connect(axis(QCPAxis::atTop), SIGNAL(scaleTypeChanged(QCPAxis::ScaleType)), axis(QCPAxis::atBottom), SLOT(setScaleType(QCPAxis::ScaleType))); + + // make layer transfers of color scale transfer to axis rect and axes + // the axes must be set after axis rect, such that they appear above color gradient drawn by axis rect: + connect(parentColorScale, SIGNAL(layerChanged(QCPLayer*)), this, SLOT(setLayer(QCPLayer*))); + foreach (QCPAxis::AxisType type, allAxisTypes) + connect(parentColorScale, SIGNAL(layerChanged(QCPLayer*)), axis(type), SLOT(setLayer(QCPLayer*))); +} + +/*! \internal + Updates the color gradient image if necessary, by calling \ref updateGradientImage, then draws + it. Then the axes are drawn by calling the \ref QCPAxisRect::draw base class implementation. +*/ +void QCPColorScaleAxisRectPrivate::draw(QCPPainter *painter) +{ + if (mGradientImageInvalidated) + updateGradientImage(); + + bool mirrorHorz = false; + bool mirrorVert = false; + if (mParentColorScale->mColorAxis) + { + mirrorHorz = mParentColorScale->mColorAxis.data()->rangeReversed() && (mParentColorScale->type() == QCPAxis::atBottom || mParentColorScale->type() == QCPAxis::atTop); + mirrorVert = mParentColorScale->mColorAxis.data()->rangeReversed() && (mParentColorScale->type() == QCPAxis::atLeft || mParentColorScale->type() == QCPAxis::atRight); + } + + painter->drawImage(rect().adjusted(0, -1, 0, -1), mGradientImage.mirrored(mirrorHorz, mirrorVert)); + QCPAxisRect::draw(painter); +} + +/*! \internal + + Uses the current gradient of the parent \ref QCPColorScale (specified in the constructor) to + generate a gradient image. This gradient image will be used in the \ref draw method. +*/ +void QCPColorScaleAxisRectPrivate::updateGradientImage() +{ + if (rect().isEmpty()) + return; + + int n = mParentColorScale->mGradient.levelCount(); + int w, h; + QVector data(n); + for (int i=0; imType == QCPAxis::atBottom || mParentColorScale->mType == QCPAxis::atTop) + { + w = n; + h = rect().height(); + mGradientImage = QImage(w, h, QImage::Format_RGB32); + QVector pixels; + for (int y=0; y(mGradientImage.scanLine(y))); + mParentColorScale->mGradient.colorize(data.constData(), QCPRange(0, n-1), pixels.first(), n); + for (int y=1; y(mGradientImage.scanLine(y)); + const QRgb lineColor = mParentColorScale->mGradient.color(data[h-1-y], QCPRange(0, n-1)); + for (int x=0; x allAxisTypes = QList() << QCPAxis::atBottom << QCPAxis::atTop << QCPAxis::atLeft << QCPAxis::atRight; + foreach (QCPAxis::AxisType type, allAxisTypes) + { + if (QCPAxis *senderAxis = qobject_cast(sender())) + if (senderAxis->axisType() == type) + continue; + + if (axis(type)->selectableParts().testFlag(QCPAxis::spAxis)) + { + if (selectedParts.testFlag(QCPAxis::spAxis)) + axis(type)->setSelectedParts(axis(type)->selectedParts() | QCPAxis::spAxis); + else + axis(type)->setSelectedParts(axis(type)->selectedParts() & ~QCPAxis::spAxis); + } + } +} + +/*! \internal + + This slot is connected to the selectableChanged signals of the four axes in the constructor. It + synchronizes the selectability of the axes. +*/ +void QCPColorScaleAxisRectPrivate::axisSelectableChanged(QCPAxis::SelectableParts selectableParts) +{ + // synchronize axis base selectability: + QList allAxisTypes = QList() << QCPAxis::atBottom << QCPAxis::atTop << QCPAxis::atLeft << QCPAxis::atRight; + foreach (QCPAxis::AxisType type, allAxisTypes) + { + if (QCPAxis *senderAxis = qobject_cast(sender())) + if (senderAxis->axisType() == type) + continue; + + if (axis(type)->selectableParts().testFlag(QCPAxis::spAxis)) + { + if (selectableParts.testFlag(QCPAxis::spAxis)) + axis(type)->setSelectableParts(axis(type)->selectableParts() | QCPAxis::spAxis); + else + axis(type)->setSelectableParts(axis(type)->selectableParts() & ~QCPAxis::spAxis); + } + } +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPData +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPData + \brief Holds the data of one single data point for QCPGraph. + + The container for storing multiple data points is \ref QCPDataMap. + + The stored data is: + \li \a key: coordinate on the key axis of this data point + \li \a value: coordinate on the value axis of this data point + \li \a keyErrorMinus: negative error in the key dimension (for error bars) + \li \a keyErrorPlus: positive error in the key dimension (for error bars) + \li \a valueErrorMinus: negative error in the value dimension (for error bars) + \li \a valueErrorPlus: positive error in the value dimension (for error bars) + + \see QCPDataMap +*/ + +/*! + Constructs a data point with key, value and all errors set to zero. +*/ +QCPData::QCPData() : + key(0), + value(0), + keyErrorPlus(0), + keyErrorMinus(0), + valueErrorPlus(0), + valueErrorMinus(0) +{ +} + +/*! + Constructs a data point with the specified \a key and \a value. All errors are set to zero. +*/ +QCPData::QCPData(double key, double value) : + key(key), + value(value), + keyErrorPlus(0), + keyErrorMinus(0), + valueErrorPlus(0), + valueErrorMinus(0) +{ +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPGraph +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPGraph + \brief A plottable representing a graph in a plot. + + \image html QCPGraph.png + + Usually you create new graphs by calling QCustomPlot::addGraph. The resulting instance can be + accessed via QCustomPlot::graph. + + To plot data, assign it with the \ref setData or \ref addData functions. Alternatively, you can + also access and modify the graph's data via the \ref data method, which returns a pointer to the + internal \ref QCPDataMap. + + Graphs are used to display single-valued data. Single-valued means that there should only be one + data point per unique key coordinate. In other words, the graph can't have \a loops. If you do + want to plot non-single-valued curves, rather use the QCPCurve plottable. + + Gaps in the graph line can be created by adding data points with NaN as value + (qQNaN() or std::numeric_limits::quiet_NaN()) in between the two data points that shall be + separated. + + \section appearance Changing the appearance + + The appearance of the graph is mainly determined by the line style, scatter style, brush and pen + of the graph (\ref setLineStyle, \ref setScatterStyle, \ref setBrush, \ref setPen). + + \subsection filling Filling under or between graphs + + QCPGraph knows two types of fills: Normal graph fills towards the zero-value-line parallel to + the key axis of the graph, and fills between two graphs, called channel fills. To enable a fill, + just set a brush with \ref setBrush which is neither Qt::NoBrush nor fully transparent. + + By default, a normal fill towards the zero-value-line will be drawn. To set up a channel fill + between this graph and another one, call \ref setChannelFillGraph with the other graph as + parameter. + + \see QCustomPlot::addGraph, QCustomPlot::graph +*/ + +/* start of documentation of inline functions */ + +/*! \fn QCPDataMap *QCPGraph::data() const + + Returns a pointer to the internal data storage of type \ref QCPDataMap. You may use it to + directly manipulate the data, which may be more convenient and faster than using the regular \ref + setData or \ref addData methods, in certain situations. +*/ + +/* end of documentation of inline functions */ + +/*! + Constructs a graph which uses \a keyAxis as its key axis ("x") and \a valueAxis as its value + axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance and not have + the same orientation. If either of these restrictions is violated, a corresponding message is + printed to the debug output (qDebug), the construction is not aborted, though. + + The constructed QCPGraph can be added to the plot with QCustomPlot::addPlottable, QCustomPlot + then takes ownership of the graph. + + To directly create a graph inside a plot, you can also use the simpler QCustomPlot::addGraph function. +*/ +QCPGraph::QCPGraph(QCPAxis *keyAxis, QCPAxis *valueAxis) : + QCPAbstractPlottable(keyAxis, valueAxis) +{ + mData = new QCPDataMap; + + setPen(QPen(Qt::blue, 0)); + setErrorPen(QPen(Qt::black)); + setBrush(Qt::NoBrush); + setSelectedPen(QPen(QColor(80, 80, 255), 2.5)); + setSelectedBrush(Qt::NoBrush); + + setLineStyle(lsLine); + setErrorType(etNone); + setErrorBarSize(6); + setErrorBarSkipSymbol(true); + setChannelFillGraph(0); + setAdaptiveSampling(true); +} + +QCPGraph::~QCPGraph() +{ + delete mData; +} + +/*! + Replaces the current data with the provided \a data. + + If \a copy is set to true, data points in \a data will only be copied. if false, the graph + takes ownership of the passed data and replaces the internal data pointer with it. This is + significantly faster than copying for large datasets. + + Alternatively, you can also access and modify the graph's data via the \ref data method, which + returns a pointer to the internal \ref QCPDataMap. +*/ +void QCPGraph::setData(QCPDataMap *data, bool copy) +{ + if (mData == data) + { + qDebug() << Q_FUNC_INFO << "The data pointer is already in (and owned by) this plottable" << reinterpret_cast(data); + return; + } + if (copy) + { + *mData = *data; + } else + { + delete mData; + mData = data; + } +} + +/*! \overload + + Replaces the current data with the provided points in \a key and \a value pairs. The provided + vectors should have equal length. Else, the number of added points will be the size of the + smallest vector. +*/ +void QCPGraph::setData(const QVector &key, const QVector &value) +{ + mData->clear(); + int n = key.size(); + n = qMin(n, value.size()); + QCPData newData; + for (int i=0; iinsertMulti(newData.key, newData); + } +} + +/*! + Replaces the current data with the provided points in \a key and \a value pairs. Additionally the + symmetrical value error of the data points are set to the values in \a valueError. + For error bars to show appropriately, see \ref setErrorType. + The provided vectors should have equal length. Else, the number of added points will be the size of the + smallest vector. + + For asymmetrical errors (plus different from minus), see the overloaded version of this function. +*/ +void QCPGraph::setDataValueError(const QVector &key, const QVector &value, const QVector &valueError) +{ + mData->clear(); + int n = key.size(); + n = qMin(n, value.size()); + n = qMin(n, valueError.size()); + QCPData newData; + for (int i=0; iinsertMulti(key[i], newData); + } +} + +/*! + \overload + Replaces the current data with the provided points in \a key and \a value pairs. Additionally the + negative value error of the data points are set to the values in \a valueErrorMinus, the positive + value error to \a valueErrorPlus. + For error bars to show appropriately, see \ref setErrorType. + The provided vectors should have equal length. Else, the number of added points will be the size of the + smallest vector. +*/ +void QCPGraph::setDataValueError(const QVector &key, const QVector &value, const QVector &valueErrorMinus, const QVector &valueErrorPlus) +{ + mData->clear(); + int n = key.size(); + n = qMin(n, value.size()); + n = qMin(n, valueErrorMinus.size()); + n = qMin(n, valueErrorPlus.size()); + QCPData newData; + for (int i=0; iinsertMulti(key[i], newData); + } +} + +/*! + Replaces the current data with the provided points in \a key and \a value pairs. Additionally the + symmetrical key error of the data points are set to the values in \a keyError. + For error bars to show appropriately, see \ref setErrorType. + The provided vectors should have equal length. Else, the number of added points will be the size of the + smallest vector. + + For asymmetrical errors (plus different from minus), see the overloaded version of this function. +*/ +void QCPGraph::setDataKeyError(const QVector &key, const QVector &value, const QVector &keyError) +{ + mData->clear(); + int n = key.size(); + n = qMin(n, value.size()); + n = qMin(n, keyError.size()); + QCPData newData; + for (int i=0; iinsertMulti(key[i], newData); + } +} + +/*! + \overload + Replaces the current data with the provided points in \a key and \a value pairs. Additionally the + negative key error of the data points are set to the values in \a keyErrorMinus, the positive + key error to \a keyErrorPlus. + For error bars to show appropriately, see \ref setErrorType. + The provided vectors should have equal length. Else, the number of added points will be the size of the + smallest vector. +*/ +void QCPGraph::setDataKeyError(const QVector &key, const QVector &value, const QVector &keyErrorMinus, const QVector &keyErrorPlus) +{ + mData->clear(); + int n = key.size(); + n = qMin(n, value.size()); + n = qMin(n, keyErrorMinus.size()); + n = qMin(n, keyErrorPlus.size()); + QCPData newData; + for (int i=0; iinsertMulti(key[i], newData); + } +} + +/*! + Replaces the current data with the provided points in \a key and \a value pairs. Additionally the + symmetrical key and value errors of the data points are set to the values in \a keyError and \a valueError. + For error bars to show appropriately, see \ref setErrorType. + The provided vectors should have equal length. Else, the number of added points will be the size of the + smallest vector. + + For asymmetrical errors (plus different from minus), see the overloaded version of this function. +*/ +void QCPGraph::setDataBothError(const QVector &key, const QVector &value, const QVector &keyError, const QVector &valueError) +{ + mData->clear(); + int n = key.size(); + n = qMin(n, value.size()); + n = qMin(n, valueError.size()); + n = qMin(n, keyError.size()); + QCPData newData; + for (int i=0; iinsertMulti(key[i], newData); + } +} + +/*! + \overload + Replaces the current data with the provided points in \a key and \a value pairs. Additionally the + negative key and value errors of the data points are set to the values in \a keyErrorMinus and \a valueErrorMinus. The positive + key and value errors are set to the values in \a keyErrorPlus \a valueErrorPlus. + For error bars to show appropriately, see \ref setErrorType. + The provided vectors should have equal length. Else, the number of added points will be the size of the + smallest vector. +*/ +void QCPGraph::setDataBothError(const QVector &key, const QVector &value, const QVector &keyErrorMinus, const QVector &keyErrorPlus, const QVector &valueErrorMinus, const QVector &valueErrorPlus) +{ + mData->clear(); + int n = key.size(); + n = qMin(n, value.size()); + n = qMin(n, valueErrorMinus.size()); + n = qMin(n, valueErrorPlus.size()); + n = qMin(n, keyErrorMinus.size()); + n = qMin(n, keyErrorPlus.size()); + QCPData newData; + for (int i=0; iinsertMulti(key[i], newData); + } +} + + +/*! + Sets how the single data points are connected in the plot. For scatter-only plots, set \a ls to + \ref lsNone and \ref setScatterStyle to the desired scatter style. + + \see setScatterStyle +*/ +void QCPGraph::setLineStyle(LineStyle ls) +{ + mLineStyle = ls; +} + +/*! + Sets the visual appearance of single data points in the plot. If set to \ref QCPScatterStyle::ssNone, no scatter points + are drawn (e.g. for line-only-plots with appropriate line style). + + \see QCPScatterStyle, setLineStyle +*/ +void QCPGraph::setScatterStyle(const QCPScatterStyle &style) +{ + mScatterStyle = style; +} + +/*! + Sets which kind of error bars (Key Error, Value Error or both) should be drawn on each data + point. If you set \a errorType to something other than \ref etNone, make sure to actually pass + error data via the specific setData functions along with the data points (e.g. \ref + setDataValueError, \ref setDataKeyError, \ref setDataBothError). + + \see ErrorType +*/ +void QCPGraph::setErrorType(ErrorType errorType) +{ + mErrorType = errorType; +} + +/*! + Sets the pen with which the error bars will be drawn. + \see setErrorBarSize, setErrorType +*/ +void QCPGraph::setErrorPen(const QPen &pen) +{ + mErrorPen = pen; +} + +/*! + Sets the width of the handles at both ends of an error bar in pixels. +*/ +void QCPGraph::setErrorBarSize(double size) +{ + mErrorBarSize = size; +} + +/*! + If \a enabled is set to true, the error bar will not be drawn as a solid line under the scatter symbol but + leave some free space around the symbol. + + This feature uses the current scatter size (\ref QCPScatterStyle::setSize) to determine the size + of the area to leave blank. So when drawing Pixmaps as scatter points (\ref + QCPScatterStyle::ssPixmap), the scatter size must be set manually to a value corresponding to the + size of the Pixmap, if the error bars should leave gaps to its boundaries. + + \ref setErrorType, setErrorBarSize, setScatterStyle +*/ +void QCPGraph::setErrorBarSkipSymbol(bool enabled) +{ + mErrorBarSkipSymbol = enabled; +} + +/*! + Sets the target graph for filling the area between this graph and \a targetGraph with the current + brush (\ref setBrush). + + When \a targetGraph is set to 0, a normal graph fill to the zero-value-line will be shown. To + disable any filling, set the brush to Qt::NoBrush. + + \see setBrush +*/ +void QCPGraph::setChannelFillGraph(QCPGraph *targetGraph) +{ + // prevent setting channel target to this graph itself: + if (targetGraph == this) + { + qDebug() << Q_FUNC_INFO << "targetGraph is this graph itself"; + mChannelFillGraph = 0; + return; + } + // prevent setting channel target to a graph not in the plot: + if (targetGraph && targetGraph->mParentPlot != mParentPlot) + { + qDebug() << Q_FUNC_INFO << "targetGraph not in same plot"; + mChannelFillGraph = 0; + return; + } + + mChannelFillGraph = targetGraph; +} + +/*! + Sets whether adaptive sampling shall be used when plotting this graph. QCustomPlot's adaptive + sampling technique can drastically improve the replot performance for graphs with a larger number + of points (e.g. above 10,000), without notably changing the appearance of the graph. + + By default, adaptive sampling is enabled. Even if enabled, QCustomPlot decides whether adaptive + sampling shall actually be used on a per-graph basis. So leaving adaptive sampling enabled has no + disadvantage in almost all cases. + + \image html adaptive-sampling-line.png "A line plot of 500,000 points without and with adaptive sampling" + + As can be seen, line plots experience no visual degradation from adaptive sampling. Outliers are + reproduced reliably, as well as the overall shape of the data set. The replot time reduces + dramatically though. This allows QCustomPlot to display large amounts of data in realtime. + + \image html adaptive-sampling-scatter.png "A scatter plot of 100,000 points without and with adaptive sampling" + + Care must be taken when using high-density scatter plots in combination with adaptive sampling. + The adaptive sampling algorithm treats scatter plots more carefully than line plots which still + gives a significant reduction of replot times, but not quite as much as for line plots. This is + because scatter plots inherently need more data points to be preserved in order to still resemble + the original, non-adaptive-sampling plot. As shown above, the results still aren't quite + identical, as banding occurs for the outer data points. This is in fact intentional, such that + the boundaries of the data cloud stay visible to the viewer. How strong the banding appears, + depends on the point density, i.e. the number of points in the plot. + + For some situations with scatter plots it might thus be desirable to manually turn adaptive + sampling off. For example, when saving the plot to disk. This can be achieved by setting \a + enabled to false before issuing a command like \ref QCustomPlot::savePng, and setting \a enabled + back to true afterwards. +*/ +void QCPGraph::setAdaptiveSampling(bool enabled) +{ + mAdaptiveSampling = enabled; +} + +/*! + Adds the provided data points in \a dataMap to the current data. + + Alternatively, you can also access and modify the graph's data via the \ref data method, which + returns a pointer to the internal \ref QCPDataMap. + + \see removeData +*/ +void QCPGraph::addData(const QCPDataMap &dataMap) +{ + mData->unite(dataMap); +} + +/*! \overload + Adds the provided single data point in \a data to the current data. + + Alternatively, you can also access and modify the graph's data via the \ref data method, which + returns a pointer to the internal \ref QCPDataMap. + + \see removeData +*/ +void QCPGraph::addData(const QCPData &data) +{ + mData->insertMulti(data.key, data); +} + +/*! \overload + Adds the provided single data point as \a key and \a value pair to the current data. + + Alternatively, you can also access and modify the graph's data via the \ref data method, which + returns a pointer to the internal \ref QCPDataMap. + + \see removeData +*/ +void QCPGraph::addData(double key, double value) +{ + QCPData newData; + newData.key = key; + newData.value = value; + mData->insertMulti(newData.key, newData); +} + +/*! \overload + Adds the provided data points as \a key and \a value pairs to the current data. + + Alternatively, you can also access and modify the graph's data via the \ref data method, which + returns a pointer to the internal \ref QCPDataMap. + + \see removeData +*/ +void QCPGraph::addData(const QVector &keys, const QVector &values) +{ + int n = qMin(keys.size(), values.size()); + QCPData newData; + for (int i=0; iinsertMulti(newData.key, newData); + } +} + +/*! + Removes all data points with keys smaller than \a key. + \see addData, clearData +*/ +void QCPGraph::removeDataBefore(double key) +{ + QCPDataMap::iterator it = mData->begin(); + while (it != mData->end() && it.key() < key) + it = mData->erase(it); +} + +/*! + Removes all data points with keys greater than \a key. + \see addData, clearData +*/ +void QCPGraph::removeDataAfter(double key) +{ + if (mData->isEmpty()) return; + QCPDataMap::iterator it = mData->upperBound(key); + while (it != mData->end()) + it = mData->erase(it); +} + +/*! + Removes all data points with keys between \a fromKey and \a toKey. + if \a fromKey is greater or equal to \a toKey, the function does nothing. To remove + a single data point with known key, use \ref removeData(double key). + + \see addData, clearData +*/ +void QCPGraph::removeData(double fromKey, double toKey) +{ + if (fromKey >= toKey || mData->isEmpty()) return; + QCPDataMap::iterator it = mData->upperBound(fromKey); + QCPDataMap::iterator itEnd = mData->upperBound(toKey); + while (it != itEnd) + it = mData->erase(it); +} + +/*! \overload + + Removes a single data point at \a key. If the position is not known with absolute precision, + consider using \ref removeData(double fromKey, double toKey) with a small fuzziness interval around + the suspected position, depeding on the precision with which the key is known. + + \see addData, clearData +*/ +void QCPGraph::removeData(double key) +{ + mData->remove(key); +} + +/*! + Removes all data points. + \see removeData, removeDataAfter, removeDataBefore +*/ +void QCPGraph::clearData() +{ + mData->clear(); +} + +/* inherits documentation from base class */ +double QCPGraph::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + if ((onlySelectable && !mSelectable) || mData->isEmpty()) + return -1; + if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return -1; } + + if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint())) + return pointDistance(pos); + else + return -1; +} + +/*! \overload + + Allows to define whether error bars are taken into consideration when determining the new axis + range. + + \see rescaleKeyAxis, rescaleValueAxis, QCPAbstractPlottable::rescaleAxes, QCustomPlot::rescaleAxes +*/ +void QCPGraph::rescaleAxes(bool onlyEnlarge, bool includeErrorBars) const +{ + rescaleKeyAxis(onlyEnlarge, includeErrorBars); + rescaleValueAxis(onlyEnlarge, includeErrorBars); +} + +/*! \overload + + Allows to define whether error bars (of kind \ref QCPGraph::etKey) are taken into consideration + when determining the new axis range. + + \see rescaleAxes, QCPAbstractPlottable::rescaleKeyAxis +*/ +void QCPGraph::rescaleKeyAxis(bool onlyEnlarge, bool includeErrorBars) const +{ + // this code is a copy of QCPAbstractPlottable::rescaleKeyAxis with the only change + // that getKeyRange is passed the includeErrorBars value. + if (mData->isEmpty()) return; + + QCPAxis *keyAxis = mKeyAxis.data(); + if (!keyAxis) { qDebug() << Q_FUNC_INFO << "invalid key axis"; return; } + + SignDomain signDomain = sdBoth; + if (keyAxis->scaleType() == QCPAxis::stLogarithmic) + signDomain = (keyAxis->range().upper < 0 ? sdNegative : sdPositive); + + bool foundRange; + QCPRange newRange = getKeyRange(foundRange, signDomain, includeErrorBars); + + if (foundRange) + { + if (onlyEnlarge) + { + if (keyAxis->range().lower < newRange.lower) + newRange.lower = keyAxis->range().lower; + if (keyAxis->range().upper > newRange.upper) + newRange.upper = keyAxis->range().upper; + } + keyAxis->setRange(newRange); + } +} + +/*! \overload + + Allows to define whether error bars (of kind \ref QCPGraph::etValue) are taken into consideration + when determining the new axis range. + + \see rescaleAxes, QCPAbstractPlottable::rescaleValueAxis +*/ +void QCPGraph::rescaleValueAxis(bool onlyEnlarge, bool includeErrorBars) const +{ + // this code is a copy of QCPAbstractPlottable::rescaleValueAxis with the only change + // is that getValueRange is passed the includeErrorBars value. + if (mData->isEmpty()) return; + + QCPAxis *valueAxis = mValueAxis.data(); + if (!valueAxis) { qDebug() << Q_FUNC_INFO << "invalid value axis"; return; } + + SignDomain signDomain = sdBoth; + if (valueAxis->scaleType() == QCPAxis::stLogarithmic) + signDomain = (valueAxis->range().upper < 0 ? sdNegative : sdPositive); + + bool foundRange; + QCPRange newRange = getValueRange(foundRange, signDomain, includeErrorBars); + + if (foundRange) + { + if (onlyEnlarge) + { + if (valueAxis->range().lower < newRange.lower) + newRange.lower = valueAxis->range().lower; + if (valueAxis->range().upper > newRange.upper) + newRange.upper = valueAxis->range().upper; + } + valueAxis->setRange(newRange); + } +} + +/* inherits documentation from base class */ +void QCPGraph::draw(QCPPainter *painter) +{ + if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } + if (mKeyAxis.data()->range().size() <= 0 || mData->isEmpty()) return; + if (mLineStyle == lsNone && mScatterStyle.isNone()) return; + + // allocate line and (if necessary) point vectors: + QVector *lineData = new QVector; + QVector *scatterData = 0; + if (!mScatterStyle.isNone()) + scatterData = new QVector; + + // fill vectors with data appropriate to plot style: + getPlotData(lineData, scatterData); + + // check data validity if flag set: +#ifdef QCUSTOMPLOT_CHECK_DATA + QCPDataMap::const_iterator it; + for (it = mData->constBegin(); it != mData->constEnd(); ++it) + { + if (QCP::isInvalidData(it.value().key, it.value().value) || + QCP::isInvalidData(it.value().keyErrorPlus, it.value().keyErrorMinus) || + QCP::isInvalidData(it.value().valueErrorPlus, it.value().valueErrorPlus)) + qDebug() << Q_FUNC_INFO << "Data point at" << it.key() << "invalid." << "Plottable name:" << name(); + } +#endif + + // draw fill of graph: + if (mLineStyle != lsNone) + drawFill(painter, lineData); + + // draw line: + if (mLineStyle == lsImpulse) + drawImpulsePlot(painter, lineData); + else if (mLineStyle != lsNone) + drawLinePlot(painter, lineData); // also step plots can be drawn as a line plot + + // draw scatters: + if (scatterData) + drawScatterPlot(painter, scatterData); + + // free allocated line and point vectors: + delete lineData; + if (scatterData) + delete scatterData; +} + +/* inherits documentation from base class */ +void QCPGraph::drawLegendIcon(QCPPainter *painter, const QRectF &rect) const +{ + // draw fill: + if (mBrush.style() != Qt::NoBrush) + { + applyFillAntialiasingHint(painter); + painter->fillRect(QRectF(rect.left(), rect.top()+rect.height()/2.0, rect.width(), rect.height()/3.0), mBrush); + } + // draw line vertically centered: + if (mLineStyle != lsNone) + { + applyDefaultAntialiasingHint(painter); + painter->setPen(mPen); + painter->drawLine(QLineF(rect.left(), rect.top()+rect.height()/2.0, rect.right()+5, rect.top()+rect.height()/2.0)); // +5 on x2 else last segment is missing from dashed/dotted pens + } + // draw scatter symbol: + if (!mScatterStyle.isNone()) + { + applyScattersAntialiasingHint(painter); + // scale scatter pixmap if it's too large to fit in legend icon rect: + if (mScatterStyle.shape() == QCPScatterStyle::ssPixmap && (mScatterStyle.pixmap().size().width() > rect.width() || mScatterStyle.pixmap().size().height() > rect.height())) + { + QCPScatterStyle scaledStyle(mScatterStyle); + scaledStyle.setPixmap(scaledStyle.pixmap().scaled(rect.size().toSize(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); + scaledStyle.applyTo(painter, mPen); + scaledStyle.drawShape(painter, QRectF(rect).center()); + } else + { + mScatterStyle.applyTo(painter, mPen); + mScatterStyle.drawShape(painter, QRectF(rect).center()); + } + } +} + +/*! \internal + + This function branches out to the line style specific "get(...)PlotData" functions, according to + the line style of the graph. + + \a lineData will be filled with raw points that will be drawn with the according draw functions, + e.g. \ref drawLinePlot and \ref drawImpulsePlot. These aren't necessarily the original data + points, since for step plots for example, additional points are needed for drawing lines that + make up steps. If the line style of the graph is \ref lsNone, the \a lineData vector will be left + untouched. + + \a scatterData will be filled with the original data points so \ref drawScatterPlot can draw the + scatter symbols accordingly. If no scatters need to be drawn, i.e. the scatter style's shape is + \ref QCPScatterStyle::ssNone, pass 0 as \a scatterData, and this step will be skipped. + + \see getScatterPlotData, getLinePlotData, getStepLeftPlotData, getStepRightPlotData, + getStepCenterPlotData, getImpulsePlotData +*/ +void QCPGraph::getPlotData(QVector *lineData, QVector *scatterData) const +{ + switch(mLineStyle) + { + case lsNone: getScatterPlotData(scatterData); break; + case lsLine: getLinePlotData(lineData, scatterData); break; + case lsStepLeft: getStepLeftPlotData(lineData, scatterData); break; + case lsStepRight: getStepRightPlotData(lineData, scatterData); break; + case lsStepCenter: getStepCenterPlotData(lineData, scatterData); break; + case lsImpulse: getImpulsePlotData(lineData, scatterData); break; + } +} + +/*! \internal + + If line style is \ref lsNone and the scatter style's shape is not \ref QCPScatterStyle::ssNone, + this function serves at providing the visible data points in \a scatterData, so the \ref + drawScatterPlot function can draw the scatter points accordingly. + + If line style is not \ref lsNone, this function is not called and the data for the scatter points + are (if needed) calculated inside the corresponding other "get(...)PlotData" functions. + + \see drawScatterPlot +*/ +void QCPGraph::getScatterPlotData(QVector *scatterData) const +{ + getPreparedData(0, scatterData); +} + +/*! \internal + + Places the raw data points needed for a normal linearly connected graph in \a linePixelData. + + As for all plot data retrieval functions, \a scatterData just contains all unaltered data (scatter) + points that are visible for drawing scatter points, if necessary. If drawing scatter points is + disabled (i.e. the scatter style's shape is \ref QCPScatterStyle::ssNone), pass 0 as \a + scatterData, and the function will skip filling the vector. + + \see drawLinePlot +*/ +void QCPGraph::getLinePlotData(QVector *linePixelData, QVector *scatterData) const +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } + if (!linePixelData) { qDebug() << Q_FUNC_INFO << "null pointer passed as linePixelData"; return; } + + QVector lineData; + getPreparedData(&lineData, scatterData); + linePixelData->reserve(lineData.size()+2); // added 2 to reserve memory for lower/upper fill base points that might be needed for fill + linePixelData->resize(lineData.size()); + + // transform lineData points to pixels: + if (keyAxis->orientation() == Qt::Vertical) + { + for (int i=0; icoordToPixel(lineData.at(i).value)); + (*linePixelData)[i].setY(keyAxis->coordToPixel(lineData.at(i).key)); + } + } else // key axis is horizontal + { + for (int i=0; icoordToPixel(lineData.at(i).key)); + (*linePixelData)[i].setY(valueAxis->coordToPixel(lineData.at(i).value)); + } + } +} + +/*! + \internal + Places the raw data points needed for a step plot with left oriented steps in \a lineData. + + As for all plot data retrieval functions, \a scatterData just contains all unaltered data (scatter) + points that are visible for drawing scatter points, if necessary. If drawing scatter points is + disabled (i.e. the scatter style's shape is \ref QCPScatterStyle::ssNone), pass 0 as \a + scatterData, and the function will skip filling the vector. + + \see drawLinePlot +*/ +void QCPGraph::getStepLeftPlotData(QVector *linePixelData, QVector *scatterData) const +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } + if (!linePixelData) { qDebug() << Q_FUNC_INFO << "null pointer passed as lineData"; return; } + + QVector lineData; + getPreparedData(&lineData, scatterData); + linePixelData->reserve(lineData.size()*2+2); // added 2 to reserve memory for lower/upper fill base points that might be needed for fill + linePixelData->resize(lineData.size()*2); + + // calculate steps from lineData and transform to pixel coordinates: + if (keyAxis->orientation() == Qt::Vertical) + { + double lastValue = valueAxis->coordToPixel(lineData.first().value); + double key; + for (int i=0; icoordToPixel(lineData.at(i).key); + (*linePixelData)[i*2+0].setX(lastValue); + (*linePixelData)[i*2+0].setY(key); + lastValue = valueAxis->coordToPixel(lineData.at(i).value); + (*linePixelData)[i*2+1].setX(lastValue); + (*linePixelData)[i*2+1].setY(key); + } + } else // key axis is horizontal + { + double lastValue = valueAxis->coordToPixel(lineData.first().value); + double key; + for (int i=0; icoordToPixel(lineData.at(i).key); + (*linePixelData)[i*2+0].setX(key); + (*linePixelData)[i*2+0].setY(lastValue); + lastValue = valueAxis->coordToPixel(lineData.at(i).value); + (*linePixelData)[i*2+1].setX(key); + (*linePixelData)[i*2+1].setY(lastValue); + } + } +} + +/*! + \internal + Places the raw data points needed for a step plot with right oriented steps in \a lineData. + + As for all plot data retrieval functions, \a scatterData just contains all unaltered data (scatter) + points that are visible for drawing scatter points, if necessary. If drawing scatter points is + disabled (i.e. the scatter style's shape is \ref QCPScatterStyle::ssNone), pass 0 as \a + scatterData, and the function will skip filling the vector. + + \see drawLinePlot +*/ +void QCPGraph::getStepRightPlotData(QVector *linePixelData, QVector *scatterData) const +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } + if (!linePixelData) { qDebug() << Q_FUNC_INFO << "null pointer passed as lineData"; return; } + + QVector lineData; + getPreparedData(&lineData, scatterData); + linePixelData->reserve(lineData.size()*2+2); // added 2 to reserve memory for lower/upper fill base points that might be needed for fill + linePixelData->resize(lineData.size()*2); + + // calculate steps from lineData and transform to pixel coordinates: + if (keyAxis->orientation() == Qt::Vertical) + { + double lastKey = keyAxis->coordToPixel(lineData.first().key); + double value; + for (int i=0; icoordToPixel(lineData.at(i).value); + (*linePixelData)[i*2+0].setX(value); + (*linePixelData)[i*2+0].setY(lastKey); + lastKey = keyAxis->coordToPixel(lineData.at(i).key); + (*linePixelData)[i*2+1].setX(value); + (*linePixelData)[i*2+1].setY(lastKey); + } + } else // key axis is horizontal + { + double lastKey = keyAxis->coordToPixel(lineData.first().key); + double value; + for (int i=0; icoordToPixel(lineData.at(i).value); + (*linePixelData)[i*2+0].setX(lastKey); + (*linePixelData)[i*2+0].setY(value); + lastKey = keyAxis->coordToPixel(lineData.at(i).key); + (*linePixelData)[i*2+1].setX(lastKey); + (*linePixelData)[i*2+1].setY(value); + } + } +} + +/*! + \internal + Places the raw data points needed for a step plot with centered steps in \a lineData. + + As for all plot data retrieval functions, \a scatterData just contains all unaltered data (scatter) + points that are visible for drawing scatter points, if necessary. If drawing scatter points is + disabled (i.e. the scatter style's shape is \ref QCPScatterStyle::ssNone), pass 0 as \a + scatterData, and the function will skip filling the vector. + + \see drawLinePlot +*/ +void QCPGraph::getStepCenterPlotData(QVector *linePixelData, QVector *scatterData) const +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } + if (!linePixelData) { qDebug() << Q_FUNC_INFO << "null pointer passed as lineData"; return; } + + QVector lineData; + getPreparedData(&lineData, scatterData); + linePixelData->reserve(lineData.size()*2+2); // added 2 to reserve memory for lower/upper fill base points that might be needed for fill + linePixelData->resize(lineData.size()*2); + // calculate steps from lineData and transform to pixel coordinates: + if (keyAxis->orientation() == Qt::Vertical) + { + double lastKey = keyAxis->coordToPixel(lineData.first().key); + double lastValue = valueAxis->coordToPixel(lineData.first().value); + double key; + (*linePixelData)[0].setX(lastValue); + (*linePixelData)[0].setY(lastKey); + for (int i=1; icoordToPixel(lineData.at(i).key)+lastKey)*0.5; + (*linePixelData)[i*2-1].setX(lastValue); + (*linePixelData)[i*2-1].setY(key); + lastValue = valueAxis->coordToPixel(lineData.at(i).value); + lastKey = keyAxis->coordToPixel(lineData.at(i).key); + (*linePixelData)[i*2+0].setX(lastValue); + (*linePixelData)[i*2+0].setY(key); + } + (*linePixelData)[lineData.size()*2-1].setX(lastValue); + (*linePixelData)[lineData.size()*2-1].setY(lastKey); + } else // key axis is horizontal + { + double lastKey = keyAxis->coordToPixel(lineData.first().key); + double lastValue = valueAxis->coordToPixel(lineData.first().value); + double key; + (*linePixelData)[0].setX(lastKey); + (*linePixelData)[0].setY(lastValue); + for (int i=1; icoordToPixel(lineData.at(i).key)+lastKey)*0.5; + (*linePixelData)[i*2-1].setX(key); + (*linePixelData)[i*2-1].setY(lastValue); + lastValue = valueAxis->coordToPixel(lineData.at(i).value); + lastKey = keyAxis->coordToPixel(lineData.at(i).key); + (*linePixelData)[i*2+0].setX(key); + (*linePixelData)[i*2+0].setY(lastValue); + } + (*linePixelData)[lineData.size()*2-1].setX(lastKey); + (*linePixelData)[lineData.size()*2-1].setY(lastValue); + } + +} + +/*! + \internal + Places the raw data points needed for an impulse plot in \a lineData. + + As for all plot data retrieval functions, \a scatterData just contains all unaltered data (scatter) + points that are visible for drawing scatter points, if necessary. If drawing scatter points is + disabled (i.e. the scatter style's shape is \ref QCPScatterStyle::ssNone), pass 0 as \a + scatterData, and the function will skip filling the vector. + + \see drawImpulsePlot +*/ +void QCPGraph::getImpulsePlotData(QVector *linePixelData, QVector *scatterData) const +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } + if (!linePixelData) { qDebug() << Q_FUNC_INFO << "null pointer passed as linePixelData"; return; } + + QVector lineData; + getPreparedData(&lineData, scatterData); + linePixelData->resize(lineData.size()*2); // no need to reserve 2 extra points because impulse plot has no fill + + // transform lineData points to pixels: + if (keyAxis->orientation() == Qt::Vertical) + { + double zeroPointX = valueAxis->coordToPixel(0); + double key; + for (int i=0; icoordToPixel(lineData.at(i).key); + (*linePixelData)[i*2+0].setX(zeroPointX); + (*linePixelData)[i*2+0].setY(key); + (*linePixelData)[i*2+1].setX(valueAxis->coordToPixel(lineData.at(i).value)); + (*linePixelData)[i*2+1].setY(key); + } + } else // key axis is horizontal + { + double zeroPointY = valueAxis->coordToPixel(0); + double key; + for (int i=0; icoordToPixel(lineData.at(i).key); + (*linePixelData)[i*2+0].setX(key); + (*linePixelData)[i*2+0].setY(zeroPointY); + (*linePixelData)[i*2+1].setX(key); + (*linePixelData)[i*2+1].setY(valueAxis->coordToPixel(lineData.at(i).value)); + } + } +} + +/*! \internal + + Draws the fill of the graph with the specified brush. + + If the fill is a normal fill towards the zero-value-line, only the \a lineData is required (and + two extra points at the zero-value-line, which are added by \ref addFillBasePoints and removed by + \ref removeFillBasePoints after the fill drawing is done). + + If the fill is a channel fill between this QCPGraph and another QCPGraph (mChannelFillGraph), the + more complex polygon is calculated with the \ref getChannelFillPolygon function. + + \see drawLinePlot +*/ +void QCPGraph::drawFill(QCPPainter *painter, QVector *lineData) const +{ + if (mLineStyle == lsImpulse) return; // fill doesn't make sense for impulse plot + if (mainBrush().style() == Qt::NoBrush || mainBrush().color().alpha() == 0) return; + + applyFillAntialiasingHint(painter); + if (!mChannelFillGraph) + { + // draw base fill under graph, fill goes all the way to the zero-value-line: + addFillBasePoints(lineData); + painter->setPen(Qt::NoPen); + painter->setBrush(mainBrush()); + painter->drawPolygon(QPolygonF(*lineData)); + removeFillBasePoints(lineData); + } else + { + // draw channel fill between this graph and mChannelFillGraph: + painter->setPen(Qt::NoPen); + painter->setBrush(mainBrush()); + painter->drawPolygon(getChannelFillPolygon(lineData)); + } +} + +/*! \internal + + Draws scatter symbols at every data point passed in \a scatterData. scatter symbols are independent + of the line style and are always drawn if the scatter style's shape is not \ref + QCPScatterStyle::ssNone. Hence, the \a scatterData vector is outputted by all "get(...)PlotData" + functions, together with the (line style dependent) line data. + + \see drawLinePlot, drawImpulsePlot +*/ +void QCPGraph::drawScatterPlot(QCPPainter *painter, QVector *scatterData) const +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } + + // draw error bars: + if (mErrorType != etNone) + { + applyErrorBarsAntialiasingHint(painter); + painter->setPen(mErrorPen); + if (keyAxis->orientation() == Qt::Vertical) + { + for (int i=0; isize(); ++i) + drawError(painter, valueAxis->coordToPixel(scatterData->at(i).value), keyAxis->coordToPixel(scatterData->at(i).key), scatterData->at(i)); + } else + { + for (int i=0; isize(); ++i) + drawError(painter, keyAxis->coordToPixel(scatterData->at(i).key), valueAxis->coordToPixel(scatterData->at(i).value), scatterData->at(i)); + } + } + + // draw scatter point symbols: + applyScattersAntialiasingHint(painter); + mScatterStyle.applyTo(painter, mPen); + if (keyAxis->orientation() == Qt::Vertical) + { + for (int i=0; isize(); ++i) + if (!qIsNaN(scatterData->at(i).value)) + mScatterStyle.drawShape(painter, valueAxis->coordToPixel(scatterData->at(i).value), keyAxis->coordToPixel(scatterData->at(i).key)); + } else + { + for (int i=0; isize(); ++i) + if (!qIsNaN(scatterData->at(i).value)) + mScatterStyle.drawShape(painter, keyAxis->coordToPixel(scatterData->at(i).key), valueAxis->coordToPixel(scatterData->at(i).value)); + } +} + +/*! \internal + + Draws line graphs from the provided data. It connects all points in \a lineData, which was + created by one of the "get(...)PlotData" functions for line styles that require simple line + connections between the point vector they create. These are for example \ref getLinePlotData, + \ref getStepLeftPlotData, \ref getStepRightPlotData and \ref getStepCenterPlotData. + + \see drawScatterPlot, drawImpulsePlot +*/ +void QCPGraph::drawLinePlot(QCPPainter *painter, QVector *lineData) const +{ + // draw line of graph: + if (mainPen().style() != Qt::NoPen && mainPen().color().alpha() != 0) + { + applyDefaultAntialiasingHint(painter); + painter->setPen(mainPen()); + painter->setBrush(Qt::NoBrush); + + /* Draws polyline in batches, currently not used: + int p = 0; + while (p < lineData->size()) + { + int batch = qMin(25, lineData->size()-p); + if (p != 0) + { + ++batch; + --p; // to draw the connection lines between two batches + } + painter->drawPolyline(lineData->constData()+p, batch); + p += batch; + } + */ + + // if drawing solid line and not in PDF, use much faster line drawing instead of polyline: + if (mParentPlot->plottingHints().testFlag(QCP::phFastPolylines) && + painter->pen().style() == Qt::SolidLine && + !painter->modes().testFlag(QCPPainter::pmVectorized) && + !painter->modes().testFlag(QCPPainter::pmNoCaching)) + { + int i = 0; + bool lastIsNan = false; + const int lineDataSize = lineData->size(); + while (i < lineDataSize && (qIsNaN(lineData->at(i).y()) || qIsNaN(lineData->at(i).x()))) // make sure first point is not NaN + ++i; + ++i; // because drawing works in 1 point retrospect + while (i < lineDataSize) + { + if (!qIsNaN(lineData->at(i).y()) && !qIsNaN(lineData->at(i).x())) // NaNs create a gap in the line + { + if (!lastIsNan) + painter->drawLine(lineData->at(i-1), lineData->at(i)); + else + lastIsNan = false; + } else + lastIsNan = true; + ++i; + } + } else + { + int segmentStart = 0; + int i = 0; + const int lineDataSize = lineData->size(); + while (i < lineDataSize) + { + if (qIsNaN(lineData->at(i).y()) || qIsNaN(lineData->at(i).x()) || qIsInf(lineData->at(i).y())) // NaNs create a gap in the line. Also filter Infs which make drawPolyline block + { + painter->drawPolyline(lineData->constData()+segmentStart, i-segmentStart); // i, because we don't want to include the current NaN point + segmentStart = i+1; + } + ++i; + } + // draw last segment: + painter->drawPolyline(lineData->constData()+segmentStart, lineDataSize-segmentStart); + } + } +} + +/*! \internal + + Draws impulses from the provided data, i.e. it connects all line pairs in \a lineData, which was + created by \ref getImpulsePlotData. + + \see drawScatterPlot, drawLinePlot +*/ +void QCPGraph::drawImpulsePlot(QCPPainter *painter, QVector *lineData) const +{ + // draw impulses: + if (mainPen().style() != Qt::NoPen && mainPen().color().alpha() != 0) + { + applyDefaultAntialiasingHint(painter); + QPen pen = mainPen(); + pen.setCapStyle(Qt::FlatCap); // so impulse line doesn't reach beyond zero-line + painter->setPen(pen); + painter->setBrush(Qt::NoBrush); + painter->drawLines(*lineData); + } +} + +/*! \internal + + Returns the \a lineData and \a scatterData that need to be plotted for this graph taking into + consideration the current axis ranges and, if \ref setAdaptiveSampling is enabled, local point + densities. + + 0 may be passed as \a lineData or \a scatterData to indicate that the respective dataset isn't + needed. For example, if the scatter style (\ref setScatterStyle) is \ref QCPScatterStyle::ssNone, \a + scatterData should be 0 to prevent unnecessary calculations. + + This method is used by the various "get(...)PlotData" methods to get the basic working set of data. +*/ +void QCPGraph::getPreparedData(QVector *lineData, QVector *scatterData) const +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } + // get visible data range: + QCPDataMap::const_iterator lower, upper; // note that upper is the actual upper point, and not 1 step after the upper point + getVisibleDataBounds(lower, upper); + if (lower == mData->constEnd() || upper == mData->constEnd()) + return; + + // count points in visible range, taking into account that we only need to count to the limit maxCount if using adaptive sampling: + int maxCount = std::numeric_limits::max(); + if (mAdaptiveSampling) + { + int keyPixelSpan = qAbs(keyAxis->coordToPixel(lower.key())-keyAxis->coordToPixel(upper.key())); + maxCount = 2*keyPixelSpan+2; + } + int dataCount = countDataInBounds(lower, upper, maxCount); + + if (mAdaptiveSampling && dataCount >= maxCount) // use adaptive sampling only if there are at least two points per pixel on average + { + if (lineData) + { + QCPDataMap::const_iterator it = lower; + QCPDataMap::const_iterator upperEnd = upper+1; + double minValue = it.value().value; + double maxValue = it.value().value; + QCPDataMap::const_iterator currentIntervalFirstPoint = it; + int reversedFactor = keyAxis->rangeReversed() != (keyAxis->orientation()==Qt::Vertical) ? -1 : 1; // is used to calculate keyEpsilon pixel into the correct direction + int reversedRound = keyAxis->rangeReversed() != (keyAxis->orientation()==Qt::Vertical) ? 1 : 0; // is used to switch between floor (normal) and ceil (reversed) rounding of currentIntervalStartKey + double currentIntervalStartKey = keyAxis->pixelToCoord((int)(keyAxis->coordToPixel(lower.key())+reversedRound)); + double lastIntervalEndKey = currentIntervalStartKey; + double keyEpsilon = qAbs(currentIntervalStartKey-keyAxis->pixelToCoord(keyAxis->coordToPixel(currentIntervalStartKey)+1.0*reversedFactor)); // interval of one pixel on screen when mapped to plot key coordinates + bool keyEpsilonVariable = keyAxis->scaleType() == QCPAxis::stLogarithmic; // indicates whether keyEpsilon needs to be updated after every interval (for log axes) + int intervalDataCount = 1; + ++it; // advance iterator to second data point because adaptive sampling works in 1 point retrospect + while (it != upperEnd) + { + if (it.key() < currentIntervalStartKey+keyEpsilon) // data point is still within same pixel, so skip it and expand value span of this cluster if necessary + { + if (it.value().value < minValue) + minValue = it.value().value; + else if (it.value().value > maxValue) + maxValue = it.value().value; + ++intervalDataCount; + } else // new pixel interval started + { + if (intervalDataCount >= 2) // last pixel had multiple data points, consolidate them to a cluster + { + if (lastIntervalEndKey < currentIntervalStartKey-keyEpsilon) // last point is further away, so first point of this cluster must be at a real data point + lineData->append(QCPData(currentIntervalStartKey+keyEpsilon*0.2, currentIntervalFirstPoint.value().value)); + lineData->append(QCPData(currentIntervalStartKey+keyEpsilon*0.25, minValue)); + lineData->append(QCPData(currentIntervalStartKey+keyEpsilon*0.75, maxValue)); + if (it.key() > currentIntervalStartKey+keyEpsilon*2) // new pixel started further away from previous cluster, so make sure the last point of the cluster is at a real data point + lineData->append(QCPData(currentIntervalStartKey+keyEpsilon*0.8, (it-1).value().value)); + } else + lineData->append(QCPData(currentIntervalFirstPoint.key(), currentIntervalFirstPoint.value().value)); + lastIntervalEndKey = (it-1).value().key; + minValue = it.value().value; + maxValue = it.value().value; + currentIntervalFirstPoint = it; + currentIntervalStartKey = keyAxis->pixelToCoord((int)(keyAxis->coordToPixel(it.key())+reversedRound)); + if (keyEpsilonVariable) + keyEpsilon = qAbs(currentIntervalStartKey-keyAxis->pixelToCoord(keyAxis->coordToPixel(currentIntervalStartKey)+1.0*reversedFactor)); + intervalDataCount = 1; + } + ++it; + } + // handle last interval: + if (intervalDataCount >= 2) // last pixel had multiple data points, consolidate them to a cluster + { + if (lastIntervalEndKey < currentIntervalStartKey-keyEpsilon) // last point wasn't a cluster, so first point of this cluster must be at a real data point + lineData->append(QCPData(currentIntervalStartKey+keyEpsilon*0.2, currentIntervalFirstPoint.value().value)); + lineData->append(QCPData(currentIntervalStartKey+keyEpsilon*0.25, minValue)); + lineData->append(QCPData(currentIntervalStartKey+keyEpsilon*0.75, maxValue)); + } else + lineData->append(QCPData(currentIntervalFirstPoint.key(), currentIntervalFirstPoint.value().value)); + } + + if (scatterData) + { + double valueMaxRange = valueAxis->range().upper; + double valueMinRange = valueAxis->range().lower; + QCPDataMap::const_iterator it = lower; + QCPDataMap::const_iterator upperEnd = upper+1; + double minValue = it.value().value; + double maxValue = it.value().value; + QCPDataMap::const_iterator minValueIt = it; + QCPDataMap::const_iterator maxValueIt = it; + QCPDataMap::const_iterator currentIntervalStart = it; + int reversedFactor = keyAxis->rangeReversed() ? -1 : 1; // is used to calculate keyEpsilon pixel into the correct direction + int reversedRound = keyAxis->rangeReversed() ? 1 : 0; // is used to switch between floor (normal) and ceil (reversed) rounding of currentIntervalStartKey + double currentIntervalStartKey = keyAxis->pixelToCoord((int)(keyAxis->coordToPixel(lower.key())+reversedRound)); + double keyEpsilon = qAbs(currentIntervalStartKey-keyAxis->pixelToCoord(keyAxis->coordToPixel(currentIntervalStartKey)+1.0*reversedFactor)); // interval of one pixel on screen when mapped to plot key coordinates + bool keyEpsilonVariable = keyAxis->scaleType() == QCPAxis::stLogarithmic; // indicates whether keyEpsilon needs to be updated after every interval (for log axes) + int intervalDataCount = 1; + ++it; // advance iterator to second data point because adaptive sampling works in 1 point retrospect + while (it != upperEnd) + { + if (it.key() < currentIntervalStartKey+keyEpsilon) // data point is still within same pixel, so skip it and expand value span of this pixel if necessary + { + if (it.value().value < minValue && it.value().value > valueMinRange && it.value().value < valueMaxRange) + { + minValue = it.value().value; + minValueIt = it; + } else if (it.value().value > maxValue && it.value().value > valueMinRange && it.value().value < valueMaxRange) + { + maxValue = it.value().value; + maxValueIt = it; + } + ++intervalDataCount; + } else // new pixel started + { + if (intervalDataCount >= 2) // last pixel had multiple data points, consolidate them + { + // determine value pixel span and add as many points in interval to maintain certain vertical data density (this is specific to scatter plot): + double valuePixelSpan = qAbs(valueAxis->coordToPixel(minValue)-valueAxis->coordToPixel(maxValue)); + int dataModulo = qMax(1, qRound(intervalDataCount/(valuePixelSpan/4.0))); // approximately every 4 value pixels one data point on average + QCPDataMap::const_iterator intervalIt = currentIntervalStart; + int c = 0; + while (intervalIt != it) + { + if ((c % dataModulo == 0 || intervalIt == minValueIt || intervalIt == maxValueIt) && intervalIt.value().value > valueMinRange && intervalIt.value().value < valueMaxRange) + scatterData->append(intervalIt.value()); + ++c; + ++intervalIt; + } + } else if (currentIntervalStart.value().value > valueMinRange && currentIntervalStart.value().value < valueMaxRange) + scatterData->append(currentIntervalStart.value()); + minValue = it.value().value; + maxValue = it.value().value; + currentIntervalStart = it; + currentIntervalStartKey = keyAxis->pixelToCoord((int)(keyAxis->coordToPixel(it.key())+reversedRound)); + if (keyEpsilonVariable) + keyEpsilon = qAbs(currentIntervalStartKey-keyAxis->pixelToCoord(keyAxis->coordToPixel(currentIntervalStartKey)+1.0*reversedFactor)); + intervalDataCount = 1; + } + ++it; + } + // handle last interval: + if (intervalDataCount >= 2) // last pixel had multiple data points, consolidate them + { + // determine value pixel span and add as many points in interval to maintain certain vertical data density (this is specific to scatter plot): + double valuePixelSpan = qAbs(valueAxis->coordToPixel(minValue)-valueAxis->coordToPixel(maxValue)); + int dataModulo = qMax(1, qRound(intervalDataCount/(valuePixelSpan/4.0))); // approximately every 4 value pixels one data point on average + QCPDataMap::const_iterator intervalIt = currentIntervalStart; + int c = 0; + while (intervalIt != it) + { + if ((c % dataModulo == 0 || intervalIt == minValueIt || intervalIt == maxValueIt) && intervalIt.value().value > valueMinRange && intervalIt.value().value < valueMaxRange) + scatterData->append(intervalIt.value()); + ++c; + ++intervalIt; + } + } else if (currentIntervalStart.value().value > valueMinRange && currentIntervalStart.value().value < valueMaxRange) + scatterData->append(currentIntervalStart.value()); + } + } else // don't use adaptive sampling algorithm, transfer points one-to-one from the map into the output parameters + { + QVector *dataVector = 0; + if (lineData) + dataVector = lineData; + else if (scatterData) + dataVector = scatterData; + if (dataVector) + { + QCPDataMap::const_iterator it = lower; + QCPDataMap::const_iterator upperEnd = upper+1; + dataVector->reserve(dataCount+2); // +2 for possible fill end points + while (it != upperEnd) + { + dataVector->append(it.value()); + ++it; + } + } + if (lineData && scatterData) + *scatterData = *dataVector; + } +} + +/*! \internal + + called by the scatter drawing function (\ref drawScatterPlot) to draw the error bars on one data + point. \a x and \a y pixel positions of the data point are passed since they are already known in + pixel coordinates in the drawing function, so we save some extra coordToPixel transforms here. \a + data is therefore only used for the errors, not key and value. +*/ +void QCPGraph::drawError(QCPPainter *painter, double x, double y, const QCPData &data) const +{ + if (qIsNaN(data.value)) + return; + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } + + double a, b; // positions of error bar bounds in pixels + double barWidthHalf = mErrorBarSize*0.5; + double skipSymbolMargin = mScatterStyle.size(); // pixels left blank per side, when mErrorBarSkipSymbol is true + + if (keyAxis->orientation() == Qt::Vertical) + { + // draw key error vertically and value error horizontally + if (mErrorType == etKey || mErrorType == etBoth) + { + a = keyAxis->coordToPixel(data.key-data.keyErrorMinus); + b = keyAxis->coordToPixel(data.key+data.keyErrorPlus); + if (keyAxis->rangeReversed()) + qSwap(a,b); + // draw spine: + if (mErrorBarSkipSymbol) + { + if (a-y > skipSymbolMargin) // don't draw spine if error is so small it's within skipSymbolmargin + painter->drawLine(QLineF(x, a, x, y+skipSymbolMargin)); + if (y-b > skipSymbolMargin) + painter->drawLine(QLineF(x, y-skipSymbolMargin, x, b)); + } else + painter->drawLine(QLineF(x, a, x, b)); + // draw handles: + painter->drawLine(QLineF(x-barWidthHalf, a, x+barWidthHalf, a)); + painter->drawLine(QLineF(x-barWidthHalf, b, x+barWidthHalf, b)); + } + if (mErrorType == etValue || mErrorType == etBoth) + { + a = valueAxis->coordToPixel(data.value-data.valueErrorMinus); + b = valueAxis->coordToPixel(data.value+data.valueErrorPlus); + if (valueAxis->rangeReversed()) + qSwap(a,b); + // draw spine: + if (mErrorBarSkipSymbol) + { + if (x-a > skipSymbolMargin) // don't draw spine if error is so small it's within skipSymbolmargin + painter->drawLine(QLineF(a, y, x-skipSymbolMargin, y)); + if (b-x > skipSymbolMargin) + painter->drawLine(QLineF(x+skipSymbolMargin, y, b, y)); + } else + painter->drawLine(QLineF(a, y, b, y)); + // draw handles: + painter->drawLine(QLineF(a, y-barWidthHalf, a, y+barWidthHalf)); + painter->drawLine(QLineF(b, y-barWidthHalf, b, y+barWidthHalf)); + } + } else // mKeyAxis->orientation() is Qt::Horizontal + { + // draw value error vertically and key error horizontally + if (mErrorType == etKey || mErrorType == etBoth) + { + a = keyAxis->coordToPixel(data.key-data.keyErrorMinus); + b = keyAxis->coordToPixel(data.key+data.keyErrorPlus); + if (keyAxis->rangeReversed()) + qSwap(a,b); + // draw spine: + if (mErrorBarSkipSymbol) + { + if (x-a > skipSymbolMargin) // don't draw spine if error is so small it's within skipSymbolmargin + painter->drawLine(QLineF(a, y, x-skipSymbolMargin, y)); + if (b-x > skipSymbolMargin) + painter->drawLine(QLineF(x+skipSymbolMargin, y, b, y)); + } else + painter->drawLine(QLineF(a, y, b, y)); + // draw handles: + painter->drawLine(QLineF(a, y-barWidthHalf, a, y+barWidthHalf)); + painter->drawLine(QLineF(b, y-barWidthHalf, b, y+barWidthHalf)); + } + if (mErrorType == etValue || mErrorType == etBoth) + { + a = valueAxis->coordToPixel(data.value-data.valueErrorMinus); + b = valueAxis->coordToPixel(data.value+data.valueErrorPlus); + if (valueAxis->rangeReversed()) + qSwap(a,b); + // draw spine: + if (mErrorBarSkipSymbol) + { + if (a-y > skipSymbolMargin) // don't draw spine if error is so small it's within skipSymbolmargin + painter->drawLine(QLineF(x, a, x, y+skipSymbolMargin)); + if (y-b > skipSymbolMargin) + painter->drawLine(QLineF(x, y-skipSymbolMargin, x, b)); + } else + painter->drawLine(QLineF(x, a, x, b)); + // draw handles: + painter->drawLine(QLineF(x-barWidthHalf, a, x+barWidthHalf, a)); + painter->drawLine(QLineF(x-barWidthHalf, b, x+barWidthHalf, b)); + } + } +} + +/*! \internal + + called by \ref getPreparedData to determine which data (key) range is visible at the current key + axis range setting, so only that needs to be processed. + + \a lower returns an iterator to the lowest data point that needs to be taken into account when + plotting. Note that in order to get a clean plot all the way to the edge of the axis rect, \a + lower may still be just outside the visible range. + + \a upper returns an iterator to the highest data point. Same as before, \a upper may also lie + just outside of the visible range. + + if the graph contains no data, both \a lower and \a upper point to constEnd. +*/ +void QCPGraph::getVisibleDataBounds(QCPDataMap::const_iterator &lower, QCPDataMap::const_iterator &upper) const +{ + if (!mKeyAxis) { qDebug() << Q_FUNC_INFO << "invalid key axis"; return; } + if (mData->isEmpty()) + { + lower = mData->constEnd(); + upper = mData->constEnd(); + return; + } + + // get visible data range as QMap iterators + QCPDataMap::const_iterator lbound = mData->lowerBound(mKeyAxis.data()->range().lower); + QCPDataMap::const_iterator ubound = mData->upperBound(mKeyAxis.data()->range().upper); + bool lowoutlier = lbound != mData->constBegin(); // indicates whether there exist points below axis range + bool highoutlier = ubound != mData->constEnd(); // indicates whether there exist points above axis range + + lower = (lowoutlier ? lbound-1 : lbound); // data point range that will be actually drawn + upper = (highoutlier ? ubound : ubound-1); // data point range that will be actually drawn +} + +/*! \internal + + Counts the number of data points between \a lower and \a upper (including them), up to a maximum + of \a maxCount. + + This function is used by \ref getPreparedData to determine whether adaptive sampling shall be + used (if enabled via \ref setAdaptiveSampling) or not. This is also why counting of data points + only needs to be done until \a maxCount is reached, which should be set to the number of data + points at which adaptive sampling sets in. +*/ +int QCPGraph::countDataInBounds(const QCPDataMap::const_iterator &lower, const QCPDataMap::const_iterator &upper, int maxCount) const +{ + if (upper == mData->constEnd() && lower == mData->constEnd()) + return 0; + QCPDataMap::const_iterator it = lower; + int count = 1; + while (it != upper && count < maxCount) + { + ++it; + ++count; + } + return count; +} + +/*! \internal + + The line data vector generated by e.g. getLinePlotData contains only the line that connects the + data points. If the graph needs to be filled, two additional points need to be added at the + value-zero-line in the lower and upper key positions of the graph. This function calculates these + points and adds them to the end of \a lineData. Since the fill is typically drawn before the line + stroke, these added points need to be removed again after the fill is done, with the + removeFillBasePoints function. + + The expanding of \a lineData by two points will not cause unnecessary memory reallocations, + because the data vector generation functions (getLinePlotData etc.) reserve two extra points when + they allocate memory for \a lineData. + + \see removeFillBasePoints, lowerFillBasePoint, upperFillBasePoint +*/ +void QCPGraph::addFillBasePoints(QVector *lineData) const +{ + if (!mKeyAxis) { qDebug() << Q_FUNC_INFO << "invalid key axis"; return; } + if (!lineData) { qDebug() << Q_FUNC_INFO << "passed null as lineData"; return; } + if (lineData->isEmpty()) return; + + // append points that close the polygon fill at the key axis: + if (mKeyAxis.data()->orientation() == Qt::Vertical) + { + *lineData << upperFillBasePoint(lineData->last().y()); + *lineData << lowerFillBasePoint(lineData->first().y()); + } else + { + *lineData << upperFillBasePoint(lineData->last().x()); + *lineData << lowerFillBasePoint(lineData->first().x()); + } +} + +/*! \internal + + removes the two points from \a lineData that were added by \ref addFillBasePoints. + + \see addFillBasePoints, lowerFillBasePoint, upperFillBasePoint +*/ +void QCPGraph::removeFillBasePoints(QVector *lineData) const +{ + if (!lineData) { qDebug() << Q_FUNC_INFO << "passed null as lineData"; return; } + if (lineData->isEmpty()) return; + + lineData->remove(lineData->size()-2, 2); +} + +/*! \internal + + called by \ref addFillBasePoints to conveniently assign the point which closes the fill polygon + on the lower side of the zero-value-line parallel to the key axis. The logarithmic axis scale + case is a bit special, since the zero-value-line in pixel coordinates is in positive or negative + infinity. So this case is handled separately by just closing the fill polygon on the axis which + lies in the direction towards the zero value. + + \a lowerKey will be the the key (in pixels) of the returned point. Depending on whether the key + axis is horizontal or vertical, \a lowerKey will end up as the x or y value of the returned + point, respectively. + + \see upperFillBasePoint, addFillBasePoints +*/ +QPointF QCPGraph::lowerFillBasePoint(double lowerKey) const +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QPointF(); } + + QPointF point; + if (valueAxis->scaleType() == QCPAxis::stLinear) + { + if (keyAxis->axisType() == QCPAxis::atLeft) + { + point.setX(valueAxis->coordToPixel(0)); + point.setY(lowerKey); + } else if (keyAxis->axisType() == QCPAxis::atRight) + { + point.setX(valueAxis->coordToPixel(0)); + point.setY(lowerKey); + } else if (keyAxis->axisType() == QCPAxis::atTop) + { + point.setX(lowerKey); + point.setY(valueAxis->coordToPixel(0)); + } else if (keyAxis->axisType() == QCPAxis::atBottom) + { + point.setX(lowerKey); + point.setY(valueAxis->coordToPixel(0)); + } + } else // valueAxis->mScaleType == QCPAxis::stLogarithmic + { + // In logarithmic scaling we can't just draw to value zero so we just fill all the way + // to the axis which is in the direction towards zero + if (keyAxis->orientation() == Qt::Vertical) + { + if ((valueAxis->range().upper < 0 && !valueAxis->rangeReversed()) || + (valueAxis->range().upper > 0 && valueAxis->rangeReversed())) // if range is negative, zero is on opposite side of key axis + point.setX(keyAxis->axisRect()->right()); + else + point.setX(keyAxis->axisRect()->left()); + point.setY(lowerKey); + } else if (keyAxis->axisType() == QCPAxis::atTop || keyAxis->axisType() == QCPAxis::atBottom) + { + point.setX(lowerKey); + if ((valueAxis->range().upper < 0 && !valueAxis->rangeReversed()) || + (valueAxis->range().upper > 0 && valueAxis->rangeReversed())) // if range is negative, zero is on opposite side of key axis + point.setY(keyAxis->axisRect()->top()); + else + point.setY(keyAxis->axisRect()->bottom()); + } + } + return point; +} + +/*! \internal + + called by \ref addFillBasePoints to conveniently assign the point which closes the fill + polygon on the upper side of the zero-value-line parallel to the key axis. The logarithmic axis + scale case is a bit special, since the zero-value-line in pixel coordinates is in positive or + negative infinity. So this case is handled separately by just closing the fill polygon on the + axis which lies in the direction towards the zero value. + + \a upperKey will be the the key (in pixels) of the returned point. Depending on whether the key + axis is horizontal or vertical, \a upperKey will end up as the x or y value of the returned + point, respectively. + + \see lowerFillBasePoint, addFillBasePoints +*/ +QPointF QCPGraph::upperFillBasePoint(double upperKey) const +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QPointF(); } + + QPointF point; + if (valueAxis->scaleType() == QCPAxis::stLinear) + { + if (keyAxis->axisType() == QCPAxis::atLeft) + { + point.setX(valueAxis->coordToPixel(0)); + point.setY(upperKey); + } else if (keyAxis->axisType() == QCPAxis::atRight) + { + point.setX(valueAxis->coordToPixel(0)); + point.setY(upperKey); + } else if (keyAxis->axisType() == QCPAxis::atTop) + { + point.setX(upperKey); + point.setY(valueAxis->coordToPixel(0)); + } else if (keyAxis->axisType() == QCPAxis::atBottom) + { + point.setX(upperKey); + point.setY(valueAxis->coordToPixel(0)); + } + } else // valueAxis->mScaleType == QCPAxis::stLogarithmic + { + // In logarithmic scaling we can't just draw to value 0 so we just fill all the way + // to the axis which is in the direction towards 0 + if (keyAxis->orientation() == Qt::Vertical) + { + if ((valueAxis->range().upper < 0 && !valueAxis->rangeReversed()) || + (valueAxis->range().upper > 0 && valueAxis->rangeReversed())) // if range is negative, zero is on opposite side of key axis + point.setX(keyAxis->axisRect()->right()); + else + point.setX(keyAxis->axisRect()->left()); + point.setY(upperKey); + } else if (keyAxis->axisType() == QCPAxis::atTop || keyAxis->axisType() == QCPAxis::atBottom) + { + point.setX(upperKey); + if ((valueAxis->range().upper < 0 && !valueAxis->rangeReversed()) || + (valueAxis->range().upper > 0 && valueAxis->rangeReversed())) // if range is negative, zero is on opposite side of key axis + point.setY(keyAxis->axisRect()->top()); + else + point.setY(keyAxis->axisRect()->bottom()); + } + } + return point; +} + +/*! \internal + + Generates the polygon needed for drawing channel fills between this graph (data passed via \a + lineData) and the graph specified by mChannelFillGraph (data generated by calling its \ref + getPlotData function). May return an empty polygon if the key ranges have no overlap or fill + target graph and this graph don't have same orientation (i.e. both key axes horizontal or both + key axes vertical). For increased performance (due to implicit sharing), keep the returned + QPolygonF const. +*/ +const QPolygonF QCPGraph::getChannelFillPolygon(const QVector *lineData) const +{ + if (!mChannelFillGraph) + return QPolygonF(); + + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QPolygonF(); } + if (!mChannelFillGraph.data()->mKeyAxis) { qDebug() << Q_FUNC_INFO << "channel fill target key axis invalid"; return QPolygonF(); } + + if (mChannelFillGraph.data()->mKeyAxis.data()->orientation() != keyAxis->orientation()) + return QPolygonF(); // don't have same axis orientation, can't fill that (Note: if keyAxis fits, valueAxis will fit too, because it's always orthogonal to keyAxis) + + if (lineData->isEmpty()) return QPolygonF(); + QVector otherData; + mChannelFillGraph.data()->getPlotData(&otherData, 0); + if (otherData.isEmpty()) return QPolygonF(); + QVector thisData; + thisData.reserve(lineData->size()+otherData.size()); // because we will join both vectors at end of this function + for (int i=0; isize(); ++i) // don't use the vector<<(vector), it squeezes internally, which ruins the performance tuning with reserve() + thisData << lineData->at(i); + + // pointers to be able to swap them, depending which data range needs cropping: + QVector *staticData = &thisData; + QVector *croppedData = &otherData; + + // crop both vectors to ranges in which the keys overlap (which coord is key, depends on axisType): + if (keyAxis->orientation() == Qt::Horizontal) + { + // x is key + // if an axis range is reversed, the data point keys will be descending. Reverse them, since following algorithm assumes ascending keys: + if (staticData->first().x() > staticData->last().x()) + { + int size = staticData->size(); + for (int i=0; ifirst().x() > croppedData->last().x()) + { + int size = croppedData->size(); + for (int i=0; ifirst().x() < croppedData->first().x()) // other one must be cropped + qSwap(staticData, croppedData); + int lowBound = findIndexBelowX(croppedData, staticData->first().x()); + if (lowBound == -1) return QPolygonF(); // key ranges have no overlap + croppedData->remove(0, lowBound); + // set lowest point of cropped data to fit exactly key position of first static data + // point via linear interpolation: + if (croppedData->size() < 2) return QPolygonF(); // need at least two points for interpolation + double slope; + if (croppedData->at(1).x()-croppedData->at(0).x() != 0) + slope = (croppedData->at(1).y()-croppedData->at(0).y())/(croppedData->at(1).x()-croppedData->at(0).x()); + else + slope = 0; + (*croppedData)[0].setY(croppedData->at(0).y()+slope*(staticData->first().x()-croppedData->at(0).x())); + (*croppedData)[0].setX(staticData->first().x()); + + // crop upper bound: + if (staticData->last().x() > croppedData->last().x()) // other one must be cropped + qSwap(staticData, croppedData); + int highBound = findIndexAboveX(croppedData, staticData->last().x()); + if (highBound == -1) return QPolygonF(); // key ranges have no overlap + croppedData->remove(highBound+1, croppedData->size()-(highBound+1)); + // set highest point of cropped data to fit exactly key position of last static data + // point via linear interpolation: + if (croppedData->size() < 2) return QPolygonF(); // need at least two points for interpolation + int li = croppedData->size()-1; // last index + if (croppedData->at(li).x()-croppedData->at(li-1).x() != 0) + slope = (croppedData->at(li).y()-croppedData->at(li-1).y())/(croppedData->at(li).x()-croppedData->at(li-1).x()); + else + slope = 0; + (*croppedData)[li].setY(croppedData->at(li-1).y()+slope*(staticData->last().x()-croppedData->at(li-1).x())); + (*croppedData)[li].setX(staticData->last().x()); + } else // mKeyAxis->orientation() == Qt::Vertical + { + // y is key + // similar to "x is key" but switched x,y. Further, lower/upper meaning is inverted compared to x, + // because in pixel coordinates, y increases from top to bottom, not bottom to top like data coordinate. + // if an axis range is reversed, the data point keys will be descending. Reverse them, since following algorithm assumes ascending keys: + if (staticData->first().y() < staticData->last().y()) + { + int size = staticData->size(); + for (int i=0; ifirst().y() < croppedData->last().y()) + { + int size = croppedData->size(); + for (int i=0; ifirst().y() > croppedData->first().y()) // other one must be cropped + qSwap(staticData, croppedData); + int lowBound = findIndexAboveY(croppedData, staticData->first().y()); + if (lowBound == -1) return QPolygonF(); // key ranges have no overlap + croppedData->remove(0, lowBound); + // set lowest point of cropped data to fit exactly key position of first static data + // point via linear interpolation: + if (croppedData->size() < 2) return QPolygonF(); // need at least two points for interpolation + double slope; + if (croppedData->at(1).y()-croppedData->at(0).y() != 0) // avoid division by zero in step plots + slope = (croppedData->at(1).x()-croppedData->at(0).x())/(croppedData->at(1).y()-croppedData->at(0).y()); + else + slope = 0; + (*croppedData)[0].setX(croppedData->at(0).x()+slope*(staticData->first().y()-croppedData->at(0).y())); + (*croppedData)[0].setY(staticData->first().y()); + + // crop upper bound: + if (staticData->last().y() < croppedData->last().y()) // other one must be cropped + qSwap(staticData, croppedData); + int highBound = findIndexBelowY(croppedData, staticData->last().y()); + if (highBound == -1) return QPolygonF(); // key ranges have no overlap + croppedData->remove(highBound+1, croppedData->size()-(highBound+1)); + // set highest point of cropped data to fit exactly key position of last static data + // point via linear interpolation: + if (croppedData->size() < 2) return QPolygonF(); // need at least two points for interpolation + int li = croppedData->size()-1; // last index + if (croppedData->at(li).y()-croppedData->at(li-1).y() != 0) // avoid division by zero in step plots + slope = (croppedData->at(li).x()-croppedData->at(li-1).x())/(croppedData->at(li).y()-croppedData->at(li-1).y()); + else + slope = 0; + (*croppedData)[li].setX(croppedData->at(li-1).x()+slope*(staticData->last().y()-croppedData->at(li-1).y())); + (*croppedData)[li].setY(staticData->last().y()); + } + + // return joined: + for (int i=otherData.size()-1; i>=0; --i) // insert reversed, otherwise the polygon will be twisted + thisData << otherData.at(i); + return QPolygonF(thisData); +} + +/*! \internal + + Finds the smallest index of \a data, whose points x value is just above \a x. Assumes x values in + \a data points are ordered ascending, as is the case when plotting with horizontal key axis. + + Used to calculate the channel fill polygon, see \ref getChannelFillPolygon. +*/ +int QCPGraph::findIndexAboveX(const QVector *data, double x) const +{ + for (int i=data->size()-1; i>=0; --i) + { + if (data->at(i).x() < x) + { + if (isize()-1) + return i+1; + else + return data->size()-1; + } + } + return -1; +} + +/*! \internal + + Finds the highest index of \a data, whose points x value is just below \a x. Assumes x values in + \a data points are ordered ascending, as is the case when plotting with horizontal key axis. + + Used to calculate the channel fill polygon, see \ref getChannelFillPolygon. +*/ +int QCPGraph::findIndexBelowX(const QVector *data, double x) const +{ + for (int i=0; isize(); ++i) + { + if (data->at(i).x() > x) + { + if (i>0) + return i-1; + else + return 0; + } + } + return -1; +} + +/*! \internal + + Finds the smallest index of \a data, whose points y value is just above \a y. Assumes y values in + \a data points are ordered descending, as is the case when plotting with vertical key axis. + + Used to calculate the channel fill polygon, see \ref getChannelFillPolygon. +*/ +int QCPGraph::findIndexAboveY(const QVector *data, double y) const +{ + for (int i=0; isize(); ++i) + { + if (data->at(i).y() < y) + { + if (i>0) + return i-1; + else + return 0; + } + } + return -1; +} + +/*! \internal + + Calculates the (minimum) distance (in pixels) the graph's representation has from the given \a + pixelPoint in pixels. This is used to determine whether the graph was clicked or not, e.g. in + \ref selectTest. + + If either the graph has no data or if the line style is \ref lsNone and the scatter style's shape + is \ref QCPScatterStyle::ssNone (i.e. there is no visual representation of the graph), returns -1.0. +*/ +double QCPGraph::pointDistance(const QPointF &pixelPoint) const +{ + if (mData->isEmpty()) + return -1.0; + if (mLineStyle == lsNone && mScatterStyle.isNone()) + return -1.0; + + // calculate minimum distances to graph representation: + if (mLineStyle == lsNone) + { + // no line displayed, only calculate distance to scatter points: + QVector scatterData; + getScatterPlotData(&scatterData); + if (scatterData.size() > 0) + { + double minDistSqr = std::numeric_limits::max(); + for (int i=0; i lineData; + getPlotData(&lineData, 0); // unlike with getScatterPlotData we get pixel coordinates here + if (lineData.size() > 1) // at least one line segment, compare distance to line segments + { + double minDistSqr = std::numeric_limits::max(); + if (mLineStyle == lsImpulse) + { + // impulse plot differs from other line styles in that the lineData points are only pairwise connected: + for (int i=0; i 0) // only single data point, calculate distance to that point + { + return QVector2D(lineData.at(0)-pixelPoint).length(); + } else // no data available in view to calculate distance to + return -1.0; + } +} + +/*! \internal + + Finds the highest index of \a data, whose points y value is just below \a y. Assumes y values in + \a data points are ordered descending, as is the case when plotting with vertical key axis (since + keys are ordered ascending). + + Used to calculate the channel fill polygon, see \ref getChannelFillPolygon. +*/ +int QCPGraph::findIndexBelowY(const QVector *data, double y) const +{ + for (int i=data->size()-1; i>=0; --i) + { + if (data->at(i).y() > y) + { + if (isize()-1) + return i+1; + else + return data->size()-1; + } + } + return -1; +} + +/* inherits documentation from base class */ +QCPRange QCPGraph::getKeyRange(bool &foundRange, SignDomain inSignDomain) const +{ + // just call the specialized version which takes an additional argument whether error bars + // should also be taken into consideration for range calculation. We set this to true here. + return getKeyRange(foundRange, inSignDomain, true); +} + +/* inherits documentation from base class */ +QCPRange QCPGraph::getValueRange(bool &foundRange, SignDomain inSignDomain) const +{ + // just call the specialized version which takes an additional argument whether error bars + // should also be taken into consideration for range calculation. We set this to true here. + return getValueRange(foundRange, inSignDomain, true); +} + +/*! \overload + + Allows to specify whether the error bars should be included in the range calculation. + + \see getKeyRange(bool &foundRange, SignDomain inSignDomain) +*/ +QCPRange QCPGraph::getKeyRange(bool &foundRange, SignDomain inSignDomain, bool includeErrors) const +{ + QCPRange range; + bool haveLower = false; + bool haveUpper = false; + + double current, currentErrorMinus, currentErrorPlus; + + if (inSignDomain == sdBoth) // range may be anywhere + { + QCPDataMap::const_iterator it = mData->constBegin(); + while (it != mData->constEnd()) + { + if (!qIsNaN(it.value().value)) + { + current = it.value().key; + currentErrorMinus = (includeErrors ? it.value().keyErrorMinus : 0); + currentErrorPlus = (includeErrors ? it.value().keyErrorPlus : 0); + if (current-currentErrorMinus < range.lower || !haveLower) + { + range.lower = current-currentErrorMinus; + haveLower = true; + } + if (current+currentErrorPlus > range.upper || !haveUpper) + { + range.upper = current+currentErrorPlus; + haveUpper = true; + } + } + ++it; + } + } else if (inSignDomain == sdNegative) // range may only be in the negative sign domain + { + QCPDataMap::const_iterator it = mData->constBegin(); + while (it != mData->constEnd()) + { + if (!qIsNaN(it.value().value)) + { + current = it.value().key; + currentErrorMinus = (includeErrors ? it.value().keyErrorMinus : 0); + currentErrorPlus = (includeErrors ? it.value().keyErrorPlus : 0); + if ((current-currentErrorMinus < range.lower || !haveLower) && current-currentErrorMinus < 0) + { + range.lower = current-currentErrorMinus; + haveLower = true; + } + if ((current+currentErrorPlus > range.upper || !haveUpper) && current+currentErrorPlus < 0) + { + range.upper = current+currentErrorPlus; + haveUpper = true; + } + if (includeErrors) // in case point is in valid sign domain but errobars stretch beyond it, we still want to geht that point. + { + if ((current < range.lower || !haveLower) && current < 0) + { + range.lower = current; + haveLower = true; + } + if ((current > range.upper || !haveUpper) && current < 0) + { + range.upper = current; + haveUpper = true; + } + } + } + ++it; + } + } else if (inSignDomain == sdPositive) // range may only be in the positive sign domain + { + QCPDataMap::const_iterator it = mData->constBegin(); + while (it != mData->constEnd()) + { + if (!qIsNaN(it.value().value)) + { + current = it.value().key; + currentErrorMinus = (includeErrors ? it.value().keyErrorMinus : 0); + currentErrorPlus = (includeErrors ? it.value().keyErrorPlus : 0); + if ((current-currentErrorMinus < range.lower || !haveLower) && current-currentErrorMinus > 0) + { + range.lower = current-currentErrorMinus; + haveLower = true; + } + if ((current+currentErrorPlus > range.upper || !haveUpper) && current+currentErrorPlus > 0) + { + range.upper = current+currentErrorPlus; + haveUpper = true; + } + if (includeErrors) // in case point is in valid sign domain but errobars stretch beyond it, we still want to get that point. + { + if ((current < range.lower || !haveLower) && current > 0) + { + range.lower = current; + haveLower = true; + } + if ((current > range.upper || !haveUpper) && current > 0) + { + range.upper = current; + haveUpper = true; + } + } + } + ++it; + } + } + + foundRange = haveLower && haveUpper; + return range; +} + +/*! \overload + + Allows to specify whether the error bars should be included in the range calculation. + + \see getValueRange(bool &foundRange, SignDomain inSignDomain) +*/ +QCPRange QCPGraph::getValueRange(bool &foundRange, SignDomain inSignDomain, bool includeErrors) const +{ + QCPRange range; + bool haveLower = false; + bool haveUpper = false; + + double current, currentErrorMinus, currentErrorPlus; + + if (inSignDomain == sdBoth) // range may be anywhere + { + QCPDataMap::const_iterator it = mData->constBegin(); + while (it != mData->constEnd()) + { + current = it.value().value; + if (!qIsNaN(current)) + { + currentErrorMinus = (includeErrors ? it.value().valueErrorMinus : 0); + currentErrorPlus = (includeErrors ? it.value().valueErrorPlus : 0); + if (current-currentErrorMinus < range.lower || !haveLower) + { + range.lower = current-currentErrorMinus; + haveLower = true; + } + if (current+currentErrorPlus > range.upper || !haveUpper) + { + range.upper = current+currentErrorPlus; + haveUpper = true; + } + } + ++it; + } + } else if (inSignDomain == sdNegative) // range may only be in the negative sign domain + { + QCPDataMap::const_iterator it = mData->constBegin(); + while (it != mData->constEnd()) + { + current = it.value().value; + if (!qIsNaN(current)) + { + currentErrorMinus = (includeErrors ? it.value().valueErrorMinus : 0); + currentErrorPlus = (includeErrors ? it.value().valueErrorPlus : 0); + if ((current-currentErrorMinus < range.lower || !haveLower) && current-currentErrorMinus < 0) + { + range.lower = current-currentErrorMinus; + haveLower = true; + } + if ((current+currentErrorPlus > range.upper || !haveUpper) && current+currentErrorPlus < 0) + { + range.upper = current+currentErrorPlus; + haveUpper = true; + } + if (includeErrors) // in case point is in valid sign domain but errobars stretch beyond it, we still want to get that point. + { + if ((current < range.lower || !haveLower) && current < 0) + { + range.lower = current; + haveLower = true; + } + if ((current > range.upper || !haveUpper) && current < 0) + { + range.upper = current; + haveUpper = true; + } + } + } + ++it; + } + } else if (inSignDomain == sdPositive) // range may only be in the positive sign domain + { + QCPDataMap::const_iterator it = mData->constBegin(); + while (it != mData->constEnd()) + { + current = it.value().value; + if (!qIsNaN(current)) + { + currentErrorMinus = (includeErrors ? it.value().valueErrorMinus : 0); + currentErrorPlus = (includeErrors ? it.value().valueErrorPlus : 0); + if ((current-currentErrorMinus < range.lower || !haveLower) && current-currentErrorMinus > 0) + { + range.lower = current-currentErrorMinus; + haveLower = true; + } + if ((current+currentErrorPlus > range.upper || !haveUpper) && current+currentErrorPlus > 0) + { + range.upper = current+currentErrorPlus; + haveUpper = true; + } + if (includeErrors) // in case point is in valid sign domain but errobars stretch beyond it, we still want to geht that point. + { + if ((current < range.lower || !haveLower) && current > 0) + { + range.lower = current; + haveLower = true; + } + if ((current > range.upper || !haveUpper) && current > 0) + { + range.upper = current; + haveUpper = true; + } + } + } + ++it; + } + } + + foundRange = haveLower && haveUpper; + return range; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPCurveData +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPCurveData + \brief Holds the data of one single data point for QCPCurve. + + The container for storing multiple data points is \ref QCPCurveDataMap. + + The stored data is: + \li \a t: the free parameter of the curve at this curve point (cp. the mathematical vector (x(t), y(t))) + \li \a key: coordinate on the key axis of this curve point + \li \a value: coordinate on the value axis of this curve point + + \see QCPCurveDataMap +*/ + +/*! + Constructs a curve data point with t, key and value set to zero. +*/ +QCPCurveData::QCPCurveData() : + t(0), + key(0), + value(0) +{ +} + +/*! + Constructs a curve data point with the specified \a t, \a key and \a value. +*/ +QCPCurveData::QCPCurveData(double t, double key, double value) : + t(t), + key(key), + value(value) +{ +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPCurve +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPCurve + \brief A plottable representing a parametric curve in a plot. + + \image html QCPCurve.png + + Unlike QCPGraph, plottables of this type may have multiple points with the same key coordinate, + so their visual representation can have \a loops. This is realized by introducing a third + coordinate \a t, which defines the order of the points described by the other two coordinates \a + x and \a y. + + To plot data, assign it with the \ref setData or \ref addData functions. + + Gaps in the curve can be created by adding data points with NaN as key and value + (qQNaN() or std::numeric_limits::quiet_NaN()) in between the two data points that shall be + separated. + + \section appearance Changing the appearance + + The appearance of the curve is determined by the pen and the brush (\ref setPen, \ref setBrush). + \section usage Usage + + Like all data representing objects in QCustomPlot, the QCPCurve is a plottable (QCPAbstractPlottable). So + the plottable-interface of QCustomPlot applies (QCustomPlot::plottable, QCustomPlot::addPlottable, QCustomPlot::removePlottable, etc.) + + Usually, you first create an instance and add it to the customPlot: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcurve-creation-1 + and then modify the properties of the newly created plottable, e.g.: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpcurve-creation-2 +*/ + +/*! + Constructs a curve which uses \a keyAxis as its key axis ("x") and \a valueAxis as its value + axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance and not have + the same orientation. If either of these restrictions is violated, a corresponding message is + printed to the debug output (qDebug), the construction is not aborted, though. + + The constructed QCPCurve can be added to the plot with QCustomPlot::addPlottable, QCustomPlot + then takes ownership of the graph. +*/ +QCPCurve::QCPCurve(QCPAxis *keyAxis, QCPAxis *valueAxis) : + QCPAbstractPlottable(keyAxis, valueAxis) +{ + mData = new QCPCurveDataMap; + mPen.setColor(Qt::blue); + mPen.setStyle(Qt::SolidLine); + mBrush.setColor(Qt::blue); + mBrush.setStyle(Qt::NoBrush); + mSelectedPen = mPen; + mSelectedPen.setWidthF(2.5); + mSelectedPen.setColor(QColor(80, 80, 255)); // lighter than Qt::blue of mPen + mSelectedBrush = mBrush; + + setScatterStyle(QCPScatterStyle()); + setLineStyle(lsLine); +} + +QCPCurve::~QCPCurve() +{ + delete mData; +} + +/*! + Replaces the current data with the provided \a data. + + If \a copy is set to true, data points in \a data will only be copied. if false, the plottable + takes ownership of the passed data and replaces the internal data pointer with it. This is + significantly faster than copying for large datasets. +*/ +void QCPCurve::setData(QCPCurveDataMap *data, bool copy) +{ + if (mData == data) + { + qDebug() << Q_FUNC_INFO << "The data pointer is already in (and owned by) this plottable" << reinterpret_cast(data); + return; + } + if (copy) + { + *mData = *data; + } else + { + delete mData; + mData = data; + } +} + +/*! \overload + + Replaces the current data with the provided points in \a t, \a key and \a value tuples. The + provided vectors should have equal length. Else, the number of added points will be the size of + the smallest vector. +*/ +void QCPCurve::setData(const QVector &t, const QVector &key, const QVector &value) +{ + mData->clear(); + int n = t.size(); + n = qMin(n, key.size()); + n = qMin(n, value.size()); + QCPCurveData newData; + for (int i=0; iinsertMulti(newData.t, newData); + } +} + +/*! \overload + + Replaces the current data with the provided \a key and \a value pairs. The t parameter + of each data point will be set to the integer index of the respective key/value pair. +*/ +void QCPCurve::setData(const QVector &key, const QVector &value) +{ + mData->clear(); + int n = key.size(); + n = qMin(n, value.size()); + QCPCurveData newData; + for (int i=0; iinsertMulti(newData.t, newData); + } +} + +/*! + Sets the visual appearance of single data points in the plot. If set to \ref + QCPScatterStyle::ssNone, no scatter points are drawn (e.g. for line-only plots with appropriate + line style). + + \see QCPScatterStyle, setLineStyle +*/ +void QCPCurve::setScatterStyle(const QCPScatterStyle &style) +{ + mScatterStyle = style; +} + +/*! + Sets how the single data points are connected in the plot or how they are represented visually + apart from the scatter symbol. For scatter-only plots, set \a style to \ref lsNone and \ref + setScatterStyle to the desired scatter style. + + \see setScatterStyle +*/ +void QCPCurve::setLineStyle(QCPCurve::LineStyle style) +{ + mLineStyle = style; +} + +/*! + Adds the provided data points in \a dataMap to the current data. + \see removeData +*/ +void QCPCurve::addData(const QCPCurveDataMap &dataMap) +{ + mData->unite(dataMap); +} + +/*! \overload + Adds the provided single data point in \a data to the current data. + \see removeData +*/ +void QCPCurve::addData(const QCPCurveData &data) +{ + mData->insertMulti(data.t, data); +} + +/*! \overload + Adds the provided single data point as \a t, \a key and \a value tuple to the current data + \see removeData +*/ +void QCPCurve::addData(double t, double key, double value) +{ + QCPCurveData newData; + newData.t = t; + newData.key = key; + newData.value = value; + mData->insertMulti(newData.t, newData); +} + +/*! \overload + + Adds the provided single data point as \a key and \a value pair to the current data The t + parameter of the data point is set to the t of the last data point plus 1. If there is no last + data point, t will be set to 0. + + \see removeData +*/ +void QCPCurve::addData(double key, double value) +{ + QCPCurveData newData; + if (!mData->isEmpty()) + newData.t = (mData->constEnd()-1).key()+1; + else + newData.t = 0; + newData.key = key; + newData.value = value; + mData->insertMulti(newData.t, newData); +} + +/*! \overload + Adds the provided data points as \a t, \a key and \a value tuples to the current data. + \see removeData +*/ +void QCPCurve::addData(const QVector &ts, const QVector &keys, const QVector &values) +{ + int n = ts.size(); + n = qMin(n, keys.size()); + n = qMin(n, values.size()); + QCPCurveData newData; + for (int i=0; iinsertMulti(newData.t, newData); + } +} + +/*! + Removes all data points with curve parameter t smaller than \a t. + \see addData, clearData +*/ +void QCPCurve::removeDataBefore(double t) +{ + QCPCurveDataMap::iterator it = mData->begin(); + while (it != mData->end() && it.key() < t) + it = mData->erase(it); +} + +/*! + Removes all data points with curve parameter t greater than \a t. + \see addData, clearData +*/ +void QCPCurve::removeDataAfter(double t) +{ + if (mData->isEmpty()) return; + QCPCurveDataMap::iterator it = mData->upperBound(t); + while (it != mData->end()) + it = mData->erase(it); +} + +/*! + Removes all data points with curve parameter t between \a fromt and \a tot. if \a fromt is + greater or equal to \a tot, the function does nothing. To remove a single data point with known + t, use \ref removeData(double t). + + \see addData, clearData +*/ +void QCPCurve::removeData(double fromt, double tot) +{ + if (fromt >= tot || mData->isEmpty()) return; + QCPCurveDataMap::iterator it = mData->upperBound(fromt); + QCPCurveDataMap::iterator itEnd = mData->upperBound(tot); + while (it != itEnd) + it = mData->erase(it); +} + +/*! \overload + + Removes a single data point at curve parameter \a t. If the position is not known with absolute + precision, consider using \ref removeData(double fromt, double tot) with a small fuzziness + interval around the suspected position, depeding on the precision with which the curve parameter + is known. + + \see addData, clearData +*/ +void QCPCurve::removeData(double t) +{ + mData->remove(t); +} + +/*! + Removes all data points. + \see removeData, removeDataAfter, removeDataBefore +*/ +void QCPCurve::clearData() +{ + mData->clear(); +} + +/* inherits documentation from base class */ +double QCPCurve::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + if ((onlySelectable && !mSelectable) || mData->isEmpty()) + return -1; + if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return -1; } + + if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint())) + return pointDistance(pos); + else + return -1; +} + +/* inherits documentation from base class */ +void QCPCurve::draw(QCPPainter *painter) +{ + if (mData->isEmpty()) return; + + // allocate line vector: + QVector *lineData = new QVector; + + // fill with curve data: + getCurveData(lineData); + + // check data validity if flag set: +#ifdef QCUSTOMPLOT_CHECK_DATA + QCPCurveDataMap::const_iterator it; + for (it = mData->constBegin(); it != mData->constEnd(); ++it) + { + if (QCP::isInvalidData(it.value().t) || + QCP::isInvalidData(it.value().key, it.value().value)) + qDebug() << Q_FUNC_INFO << "Data point at" << it.key() << "invalid." << "Plottable name:" << name(); + } +#endif + + // draw curve fill: + if (mainBrush().style() != Qt::NoBrush && mainBrush().color().alpha() != 0) + { + applyFillAntialiasingHint(painter); + painter->setPen(Qt::NoPen); + painter->setBrush(mainBrush()); + painter->drawPolygon(QPolygonF(*lineData)); + } + + // draw curve line: + if (mLineStyle != lsNone && mainPen().style() != Qt::NoPen && mainPen().color().alpha() != 0) + { + applyDefaultAntialiasingHint(painter); + painter->setPen(mainPen()); + painter->setBrush(Qt::NoBrush); + // if drawing solid line and not in PDF, use much faster line drawing instead of polyline: + if (mParentPlot->plottingHints().testFlag(QCP::phFastPolylines) && + painter->pen().style() == Qt::SolidLine && + !painter->modes().testFlag(QCPPainter::pmVectorized) && + !painter->modes().testFlag(QCPPainter::pmNoCaching)) + { + int i = 0; + bool lastIsNan = false; + const int lineDataSize = lineData->size(); + while (i < lineDataSize && (qIsNaN(lineData->at(i).y()) || qIsNaN(lineData->at(i).x()))) // make sure first point is not NaN + ++i; + ++i; // because drawing works in 1 point retrospect + while (i < lineDataSize) + { + if (!qIsNaN(lineData->at(i).y()) && !qIsNaN(lineData->at(i).x())) // NaNs create a gap in the line + { + if (!lastIsNan) + painter->drawLine(lineData->at(i-1), lineData->at(i)); + else + lastIsNan = false; + } else + lastIsNan = true; + ++i; + } + } else + { + int segmentStart = 0; + int i = 0; + const int lineDataSize = lineData->size(); + while (i < lineDataSize) + { + if (qIsNaN(lineData->at(i).y()) || qIsNaN(lineData->at(i).x())) // NaNs create a gap in the line + { + painter->drawPolyline(lineData->constData()+segmentStart, i-segmentStart); // i, because we don't want to include the current NaN point + segmentStart = i+1; + } + ++i; + } + // draw last segment: + painter->drawPolyline(lineData->constData()+segmentStart, lineDataSize-segmentStart); + } + } + + // draw scatters: + if (!mScatterStyle.isNone()) + drawScatterPlot(painter, lineData); + + // free allocated line data: + delete lineData; +} + +/* inherits documentation from base class */ +void QCPCurve::drawLegendIcon(QCPPainter *painter, const QRectF &rect) const +{ + // draw fill: + if (mBrush.style() != Qt::NoBrush) + { + applyFillAntialiasingHint(painter); + painter->fillRect(QRectF(rect.left(), rect.top()+rect.height()/2.0, rect.width(), rect.height()/3.0), mBrush); + } + // draw line vertically centered: + if (mLineStyle != lsNone) + { + applyDefaultAntialiasingHint(painter); + painter->setPen(mPen); + painter->drawLine(QLineF(rect.left(), rect.top()+rect.height()/2.0, rect.right()+5, rect.top()+rect.height()/2.0)); // +5 on x2 else last segment is missing from dashed/dotted pens + } + // draw scatter symbol: + if (!mScatterStyle.isNone()) + { + applyScattersAntialiasingHint(painter); + // scale scatter pixmap if it's too large to fit in legend icon rect: + if (mScatterStyle.shape() == QCPScatterStyle::ssPixmap && (mScatterStyle.pixmap().size().width() > rect.width() || mScatterStyle.pixmap().size().height() > rect.height())) + { + QCPScatterStyle scaledStyle(mScatterStyle); + scaledStyle.setPixmap(scaledStyle.pixmap().scaled(rect.size().toSize(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); + scaledStyle.applyTo(painter, mPen); + scaledStyle.drawShape(painter, QRectF(rect).center()); + } else + { + mScatterStyle.applyTo(painter, mPen); + mScatterStyle.drawShape(painter, QRectF(rect).center()); + } + } +} + +/*! \internal + + Draws scatter symbols at every data point passed in \a pointData. scatter symbols are independent of + the line style and are always drawn if scatter shape is not \ref QCPScatterStyle::ssNone. +*/ +void QCPCurve::drawScatterPlot(QCPPainter *painter, const QVector *pointData) const +{ + // draw scatter point symbols: + applyScattersAntialiasingHint(painter); + mScatterStyle.applyTo(painter, mPen); + for (int i=0; isize(); ++i) + if (!qIsNaN(pointData->at(i).x()) && !qIsNaN(pointData->at(i).y())) + mScatterStyle.drawShape(painter, pointData->at(i)); +} + +/*! \internal + + called by QCPCurve::draw to generate a point vector (in pixel coordinates) which represents the + line of the curve. + + Line segments that aren't visible in the current axis rect are handled in an optimized way. They + are projected onto a rectangle slightly larger than the visible axis rect and simplified + regarding point count. The algorithm makes sure to preserve appearance of lines and fills inside + the visible axis rect by generating new temporary points on the outer rect if necessary. + + Methods that are also involved in the algorithm are: \ref getRegion, \ref getOptimizedPoint, \ref + getOptimizedCornerPoints \ref mayTraverse, \ref getTraverse, \ref getTraverseCornerPoints. +*/ +void QCPCurve::getCurveData(QVector *lineData) const +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } + + // add margins to rect to compensate for stroke width + double strokeMargin = qMax(qreal(1.0), qreal(mainPen().widthF()*0.75)); // stroke radius + 50% safety + if (!mScatterStyle.isNone()) + strokeMargin = qMax(strokeMargin, mScatterStyle.size()); + double rectLeft = keyAxis->pixelToCoord(keyAxis->coordToPixel(keyAxis->range().lower)-strokeMargin*((keyAxis->orientation()==Qt::Vertical)!=keyAxis->rangeReversed()?-1:1)); + double rectRight = keyAxis->pixelToCoord(keyAxis->coordToPixel(keyAxis->range().upper)+strokeMargin*((keyAxis->orientation()==Qt::Vertical)!=keyAxis->rangeReversed()?-1:1)); + double rectBottom = valueAxis->pixelToCoord(valueAxis->coordToPixel(valueAxis->range().lower)+strokeMargin*((valueAxis->orientation()==Qt::Horizontal)!=valueAxis->rangeReversed()?-1:1)); + double rectTop = valueAxis->pixelToCoord(valueAxis->coordToPixel(valueAxis->range().upper)-strokeMargin*((valueAxis->orientation()==Qt::Horizontal)!=valueAxis->rangeReversed()?-1:1)); + int currentRegion; + QCPCurveDataMap::const_iterator it = mData->constBegin(); + QCPCurveDataMap::const_iterator prevIt = mData->constEnd()-1; + int prevRegion = getRegion(prevIt.value().key, prevIt.value().value, rectLeft, rectTop, rectRight, rectBottom); + QVector trailingPoints; // points that must be applied after all other points (are generated only when handling first point to get virtual segment between last and first point right) + while (it != mData->constEnd()) + { + currentRegion = getRegion(it.value().key, it.value().value, rectLeft, rectTop, rectRight, rectBottom); + if (currentRegion != prevRegion) // changed region, possibly need to add some optimized edge points or original points if entering R + { + if (currentRegion != 5) // segment doesn't end in R, so it's a candidate for removal + { + QPointF crossA, crossB; + if (prevRegion == 5) // we're coming from R, so add this point optimized + { + lineData->append(getOptimizedPoint(currentRegion, it.value().key, it.value().value, prevIt.value().key, prevIt.value().value, rectLeft, rectTop, rectRight, rectBottom)); + // in the situations 5->1/7/9/3 the segment may leave R and directly cross through two outer regions. In these cases we need to add an additional corner point + *lineData << getOptimizedCornerPoints(prevRegion, currentRegion, prevIt.value().key, prevIt.value().value, it.value().key, it.value().value, rectLeft, rectTop, rectRight, rectBottom); + } else if (mayTraverse(prevRegion, currentRegion) && + getTraverse(prevIt.value().key, prevIt.value().value, it.value().key, it.value().value, rectLeft, rectTop, rectRight, rectBottom, crossA, crossB)) + { + // add the two cross points optimized if segment crosses R and if segment isn't virtual zeroth segment between last and first curve point: + QVector beforeTraverseCornerPoints, afterTraverseCornerPoints; + getTraverseCornerPoints(prevRegion, currentRegion, rectLeft, rectTop, rectRight, rectBottom, beforeTraverseCornerPoints, afterTraverseCornerPoints); + if (it != mData->constBegin()) + { + *lineData << beforeTraverseCornerPoints; + lineData->append(crossA); + lineData->append(crossB); + *lineData << afterTraverseCornerPoints; + } else + { + lineData->append(crossB); + *lineData << afterTraverseCornerPoints; + trailingPoints << beforeTraverseCornerPoints << crossA ; + } + } else // doesn't cross R, line is just moving around in outside regions, so only need to add optimized point(s) at the boundary corner(s) + { + *lineData << getOptimizedCornerPoints(prevRegion, currentRegion, prevIt.value().key, prevIt.value().value, it.value().key, it.value().value, rectLeft, rectTop, rectRight, rectBottom); + } + } else // segment does end in R, so we add previous point optimized and this point at original position + { + if (it == mData->constBegin()) // it is first point in curve and prevIt is last one. So save optimized point for adding it to the lineData in the end + trailingPoints << getOptimizedPoint(prevRegion, prevIt.value().key, prevIt.value().value, it.value().key, it.value().value, rectLeft, rectTop, rectRight, rectBottom); + else + lineData->append(getOptimizedPoint(prevRegion, prevIt.value().key, prevIt.value().value, it.value().key, it.value().value, rectLeft, rectTop, rectRight, rectBottom)); + lineData->append(coordsToPixels(it.value().key, it.value().value)); + } + } else // region didn't change + { + if (currentRegion == 5) // still in R, keep adding original points + { + lineData->append(coordsToPixels(it.value().key, it.value().value)); + } else // still outside R, no need to add anything + { + // see how this is not doing anything? That's the main optimization... + } + } + prevIt = it; + prevRegion = currentRegion; + ++it; + } + *lineData << trailingPoints; +} + +/*! \internal + + This function is part of the curve optimization algorithm of \ref getCurveData. + + It returns the region of the given point (\a x, \a y) with respect to a rectangle defined by \a + rectLeft, \a rectTop, \a rectRight, and \a rectBottom. + + The regions are enumerated from top to bottom and left to right: + + + + + +
147
258
369
+ + With the rectangle being region 5, and the outer regions extending infinitely outwards. In the + curve optimization algorithm, region 5 is considered to be the visible portion of the plot. +*/ +int QCPCurve::getRegion(double x, double y, double rectLeft, double rectTop, double rectRight, double rectBottom) const +{ + if (x < rectLeft) // region 123 + { + if (y > rectTop) + return 1; + else if (y < rectBottom) + return 3; + else + return 2; + } else if (x > rectRight) // region 789 + { + if (y > rectTop) + return 7; + else if (y < rectBottom) + return 9; + else + return 8; + } else // region 456 + { + if (y > rectTop) + return 4; + else if (y < rectBottom) + return 6; + else + return 5; + } +} + +/*! \internal + + This function is part of the curve optimization algorithm of \ref getCurveData. + + This method is used in case the current segment passes from inside the visible rect (region 5, + see \ref getRegion) to any of the outer regions (\a otherRegion). The current segment is given by + the line connecting (\a key, \a value) with (\a otherKey, \a otherValue). + + It returns the intersection point of the segment with the border of region 5. + + For this function it doesn't matter whether (\a key, \a value) is the point inside region 5 or + whether it's (\a otherKey, \a otherValue), i.e. whether the segment is coming from region 5 or + leaving it. It is important though that \a otherRegion correctly identifies the other region not + equal to 5. +*/ +QPointF QCPCurve::getOptimizedPoint(int otherRegion, double otherKey, double otherValue, double key, double value, double rectLeft, double rectTop, double rectRight, double rectBottom) const +{ + double intersectKey = rectLeft; // initial value is just fail-safe + double intersectValue = rectTop; // initial value is just fail-safe + switch (otherRegion) + { + case 1: // top and left edge + { + intersectValue = rectTop; + intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue); + if (intersectKey < rectLeft || intersectKey > rectRight) // doesn't intersect, so must intersect other: + { + intersectKey = rectLeft; + intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey); + } + break; + } + case 2: // left edge + { + intersectKey = rectLeft; + intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey); + break; + } + case 3: // bottom and left edge + { + intersectValue = rectBottom; + intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue); + if (intersectKey < rectLeft || intersectKey > rectRight) // doesn't intersect, so must intersect other: + { + intersectKey = rectLeft; + intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey); + } + break; + } + case 4: // top edge + { + intersectValue = rectTop; + intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue); + break; + } + case 5: + { + break; // case 5 shouldn't happen for this function but we add it anyway to prevent potential discontinuity in branch table + } + case 6: // bottom edge + { + intersectValue = rectBottom; + intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue); + break; + } + case 7: // top and right edge + { + intersectValue = rectTop; + intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue); + if (intersectKey < rectLeft || intersectKey > rectRight) // doesn't intersect, so must intersect other: + { + intersectKey = rectRight; + intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey); + } + break; + } + case 8: // right edge + { + intersectKey = rectRight; + intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey); + break; + } + case 9: // bottom and right edge + { + intersectValue = rectBottom; + intersectKey = otherKey + (key-otherKey)/(value-otherValue)*(intersectValue-otherValue); + if (intersectKey < rectLeft || intersectKey > rectRight) // doesn't intersect, so must intersect other: + { + intersectKey = rectRight; + intersectValue = otherValue + (value-otherValue)/(key-otherKey)*(intersectKey-otherKey); + } + break; + } + } + return coordsToPixels(intersectKey, intersectValue); +} + +/*! \internal + + This function is part of the curve optimization algorithm of \ref getCurveData. + + In situations where a single segment skips over multiple regions it might become necessary to add + extra points at the corners of region 5 (see \ref getRegion) such that the optimized segment + doesn't unintentionally cut through the visible area of the axis rect and create plot artifacts. + This method provides these points that must be added, assuming the original segment doesn't + start, end, or traverse region 5. (Corner points where region 5 is traversed are calculated by + \ref getTraverseCornerPoints.) + + For example, consider a segment which directly goes from region 4 to 2 but originally is far out + to the top left such that it doesn't cross region 5. Naively optimizing these points by + projecting them on the top and left borders of region 5 will create a segment that surely crosses + 5, creating a visual artifact in the plot. This method prevents this by providing extra points at + the top left corner, making the optimized curve correctly pass from region 4 to 1 to 2 without + traversing 5. +*/ +QVector QCPCurve::getOptimizedCornerPoints(int prevRegion, int currentRegion, double prevKey, double prevValue, double key, double value, double rectLeft, double rectTop, double rectRight, double rectBottom) const +{ + QVector result; + switch (prevRegion) + { + case 1: + { + switch (currentRegion) + { + case 2: { result << coordsToPixels(rectLeft, rectTop); break; } + case 4: { result << coordsToPixels(rectLeft, rectTop); break; } + case 3: { result << coordsToPixels(rectLeft, rectTop) << coordsToPixels(rectLeft, rectBottom); break; } + case 7: { result << coordsToPixels(rectLeft, rectTop) << coordsToPixels(rectRight, rectTop); break; } + case 6: { result << coordsToPixels(rectLeft, rectTop) << coordsToPixels(rectLeft, rectBottom); result.append(result.last()); break; } + case 8: { result << coordsToPixels(rectLeft, rectTop) << coordsToPixels(rectRight, rectTop); result.append(result.last()); break; } + case 9: { // in this case we need another distinction of cases: segment may pass below or above rect, requiring either bottom right or top left corner points + if ((value-prevValue)/(key-prevKey)*(rectLeft-key)+value < rectBottom) // segment passes below R + { result << coordsToPixels(rectLeft, rectTop) << coordsToPixels(rectLeft, rectBottom); result.append(result.last()); result << coordsToPixels(rectRight, rectBottom); } + else + { result << coordsToPixels(rectLeft, rectTop) << coordsToPixels(rectRight, rectTop); result.append(result.last()); result << coordsToPixels(rectRight, rectBottom); } + break; + } + } + break; + } + case 2: + { + switch (currentRegion) + { + case 1: { result << coordsToPixels(rectLeft, rectTop); break; } + case 3: { result << coordsToPixels(rectLeft, rectBottom); break; } + case 4: { result << coordsToPixels(rectLeft, rectTop); result.append(result.last()); break; } + case 6: { result << coordsToPixels(rectLeft, rectBottom); result.append(result.last()); break; } + case 7: { result << coordsToPixels(rectLeft, rectTop); result.append(result.last()); result << coordsToPixels(rectRight, rectTop); break; } + case 9: { result << coordsToPixels(rectLeft, rectBottom); result.append(result.last()); result << coordsToPixels(rectRight, rectBottom); break; } + } + break; + } + case 3: + { + switch (currentRegion) + { + case 2: { result << coordsToPixels(rectLeft, rectBottom); break; } + case 6: { result << coordsToPixels(rectLeft, rectBottom); break; } + case 1: { result << coordsToPixels(rectLeft, rectBottom) << coordsToPixels(rectLeft, rectTop); break; } + case 9: { result << coordsToPixels(rectLeft, rectBottom) << coordsToPixels(rectRight, rectBottom); break; } + case 4: { result << coordsToPixels(rectLeft, rectBottom) << coordsToPixels(rectLeft, rectTop); result.append(result.last()); break; } + case 8: { result << coordsToPixels(rectLeft, rectBottom) << coordsToPixels(rectRight, rectBottom); result.append(result.last()); break; } + case 7: { // in this case we need another distinction of cases: segment may pass below or above rect, requiring either bottom right or top left corner points + if ((value-prevValue)/(key-prevKey)*(rectRight-key)+value < rectBottom) // segment passes below R + { result << coordsToPixels(rectLeft, rectBottom) << coordsToPixels(rectRight, rectBottom); result.append(result.last()); result << coordsToPixels(rectRight, rectTop); } + else + { result << coordsToPixels(rectLeft, rectBottom) << coordsToPixels(rectLeft, rectTop); result.append(result.last()); result << coordsToPixels(rectRight, rectTop); } + break; + } + } + break; + } + case 4: + { + switch (currentRegion) + { + case 1: { result << coordsToPixels(rectLeft, rectTop); break; } + case 7: { result << coordsToPixels(rectRight, rectTop); break; } + case 2: { result << coordsToPixels(rectLeft, rectTop); result.append(result.last()); break; } + case 8: { result << coordsToPixels(rectRight, rectTop); result.append(result.last()); break; } + case 3: { result << coordsToPixels(rectLeft, rectTop); result.append(result.last()); result << coordsToPixels(rectLeft, rectBottom); break; } + case 9: { result << coordsToPixels(rectRight, rectTop); result.append(result.last()); result << coordsToPixels(rectRight, rectBottom); break; } + } + break; + } + case 5: + { + switch (currentRegion) + { + case 1: { result << coordsToPixels(rectLeft, rectTop); break; } + case 7: { result << coordsToPixels(rectRight, rectTop); break; } + case 9: { result << coordsToPixels(rectRight, rectBottom); break; } + case 3: { result << coordsToPixels(rectLeft, rectBottom); break; } + } + break; + } + case 6: + { + switch (currentRegion) + { + case 3: { result << coordsToPixels(rectLeft, rectBottom); break; } + case 9: { result << coordsToPixels(rectRight, rectBottom); break; } + case 2: { result << coordsToPixels(rectLeft, rectBottom); result.append(result.last()); break; } + case 8: { result << coordsToPixels(rectRight, rectBottom); result.append(result.last()); break; } + case 1: { result << coordsToPixels(rectLeft, rectBottom); result.append(result.last()); result << coordsToPixels(rectLeft, rectTop); break; } + case 7: { result << coordsToPixels(rectRight, rectBottom); result.append(result.last()); result << coordsToPixels(rectRight, rectTop); break; } + } + break; + } + case 7: + { + switch (currentRegion) + { + case 4: { result << coordsToPixels(rectRight, rectTop); break; } + case 8: { result << coordsToPixels(rectRight, rectTop); break; } + case 1: { result << coordsToPixels(rectRight, rectTop) << coordsToPixels(rectLeft, rectTop); break; } + case 9: { result << coordsToPixels(rectRight, rectTop) << coordsToPixels(rectRight, rectBottom); break; } + case 2: { result << coordsToPixels(rectRight, rectTop) << coordsToPixels(rectLeft, rectTop); result.append(result.last()); break; } + case 6: { result << coordsToPixels(rectRight, rectTop) << coordsToPixels(rectRight, rectBottom); result.append(result.last()); break; } + case 3: { // in this case we need another distinction of cases: segment may pass below or above rect, requiring either bottom right or top left corner points + if ((value-prevValue)/(key-prevKey)*(rectRight-key)+value < rectBottom) // segment passes below R + { result << coordsToPixels(rectRight, rectTop) << coordsToPixels(rectRight, rectBottom); result.append(result.last()); result << coordsToPixels(rectLeft, rectBottom); } + else + { result << coordsToPixels(rectRight, rectTop) << coordsToPixels(rectLeft, rectTop); result.append(result.last()); result << coordsToPixels(rectLeft, rectBottom); } + break; + } + } + break; + } + case 8: + { + switch (currentRegion) + { + case 7: { result << coordsToPixels(rectRight, rectTop); break; } + case 9: { result << coordsToPixels(rectRight, rectBottom); break; } + case 4: { result << coordsToPixels(rectRight, rectTop); result.append(result.last()); break; } + case 6: { result << coordsToPixels(rectRight, rectBottom); result.append(result.last()); break; } + case 1: { result << coordsToPixels(rectRight, rectTop); result.append(result.last()); result << coordsToPixels(rectLeft, rectTop); break; } + case 3: { result << coordsToPixels(rectRight, rectBottom); result.append(result.last()); result << coordsToPixels(rectLeft, rectBottom); break; } + } + break; + } + case 9: + { + switch (currentRegion) + { + case 6: { result << coordsToPixels(rectRight, rectBottom); break; } + case 8: { result << coordsToPixels(rectRight, rectBottom); break; } + case 3: { result << coordsToPixels(rectRight, rectBottom) << coordsToPixels(rectLeft, rectBottom); break; } + case 7: { result << coordsToPixels(rectRight, rectBottom) << coordsToPixels(rectRight, rectTop); break; } + case 2: { result << coordsToPixels(rectRight, rectBottom) << coordsToPixels(rectLeft, rectBottom); result.append(result.last()); break; } + case 4: { result << coordsToPixels(rectRight, rectBottom) << coordsToPixels(rectRight, rectTop); result.append(result.last()); break; } + case 1: { // in this case we need another distinction of cases: segment may pass below or above rect, requiring either bottom right or top left corner points + if ((value-prevValue)/(key-prevKey)*(rectLeft-key)+value < rectBottom) // segment passes below R + { result << coordsToPixels(rectRight, rectBottom) << coordsToPixels(rectLeft, rectBottom); result.append(result.last()); result << coordsToPixels(rectLeft, rectTop); } + else + { result << coordsToPixels(rectRight, rectBottom) << coordsToPixels(rectRight, rectTop); result.append(result.last()); result << coordsToPixels(rectLeft, rectTop); } + break; + } + } + break; + } + } + return result; +} + +/*! \internal + + This function is part of the curve optimization algorithm of \ref getCurveData. + + This method returns whether a segment going from \a prevRegion to \a currentRegion (see \ref + getRegion) may traverse the visible region 5. This function assumes that neither \a prevRegion + nor \a currentRegion is 5 itself. + + If this method returns false, the segment for sure doesn't pass region 5. If it returns true, the + segment may or may not pass region 5 and a more fine-grained calculation must be used (\ref + getTraverse). +*/ +bool QCPCurve::mayTraverse(int prevRegion, int currentRegion) const +{ + switch (prevRegion) + { + case 1: + { + switch (currentRegion) + { + case 4: + case 7: + case 2: + case 3: return false; + default: return true; + } + } + case 2: + { + switch (currentRegion) + { + case 1: + case 3: return false; + default: return true; + } + } + case 3: + { + switch (currentRegion) + { + case 1: + case 2: + case 6: + case 9: return false; + default: return true; + } + } + case 4: + { + switch (currentRegion) + { + case 1: + case 7: return false; + default: return true; + } + } + case 5: return false; // should never occur + case 6: + { + switch (currentRegion) + { + case 3: + case 9: return false; + default: return true; + } + } + case 7: + { + switch (currentRegion) + { + case 1: + case 4: + case 8: + case 9: return false; + default: return true; + } + } + case 8: + { + switch (currentRegion) + { + case 7: + case 9: return false; + default: return true; + } + } + case 9: + { + switch (currentRegion) + { + case 3: + case 6: + case 8: + case 7: return false; + default: return true; + } + } + default: return true; + } +} + + +/*! \internal + + This function is part of the curve optimization algorithm of \ref getCurveData. + + This method assumes that the \ref mayTraverse test has returned true, so there is a chance the + segment defined by (\a prevKey, \a prevValue) and (\a key, \a value) goes through the visible + region 5. + + The return value of this method indicates whether the segment actually traverses region 5 or not. + + If the segment traverses 5, the output parameters \a crossA and \a crossB indicate the entry and + exit points of region 5. They will become the optimized points for that segment. +*/ +bool QCPCurve::getTraverse(double prevKey, double prevValue, double key, double value, double rectLeft, double rectTop, double rectRight, double rectBottom, QPointF &crossA, QPointF &crossB) const +{ + QList intersections; // x of QPointF corresponds to key and y to value + if (qFuzzyIsNull(key-prevKey)) // line is parallel to value axis + { + // due to region filter in mayTraverseR(), if line is parallel to value or key axis, R is traversed here + intersections.append(QPointF(key, rectBottom)); // direction will be taken care of at end of method + intersections.append(QPointF(key, rectTop)); + } else if (qFuzzyIsNull(value-prevValue)) // line is parallel to key axis + { + // due to region filter in mayTraverseR(), if line is parallel to value or key axis, R is traversed here + intersections.append(QPointF(rectLeft, value)); // direction will be taken care of at end of method + intersections.append(QPointF(rectRight, value)); + } else // line is skewed + { + double gamma; + double keyPerValue = (key-prevKey)/(value-prevValue); + // check top of rect: + gamma = prevKey + (rectTop-prevValue)*keyPerValue; + if (gamma >= rectLeft && gamma <= rectRight) + intersections.append(QPointF(gamma, rectTop)); + // check bottom of rect: + gamma = prevKey + (rectBottom-prevValue)*keyPerValue; + if (gamma >= rectLeft && gamma <= rectRight) + intersections.append(QPointF(gamma, rectBottom)); + double valuePerKey = 1.0/keyPerValue; + // check left of rect: + gamma = prevValue + (rectLeft-prevKey)*valuePerKey; + if (gamma >= rectBottom && gamma <= rectTop) + intersections.append(QPointF(rectLeft, gamma)); + // check right of rect: + gamma = prevValue + (rectRight-prevKey)*valuePerKey; + if (gamma >= rectBottom && gamma <= rectTop) + intersections.append(QPointF(rectRight, gamma)); + } + + // handle cases where found points isn't exactly 2: + if (intersections.size() > 2) + { + // line probably goes through corner of rect, and we got duplicate points there. single out the point pair with greatest distance in between: + double distSqrMax = 0; + QPointF pv1, pv2; + for (int i=0; i distSqrMax) + { + pv1 = intersections.at(i); + pv2 = intersections.at(k); + distSqrMax = distSqr; + } + } + } + intersections = QList() << pv1 << pv2; + } else if (intersections.size() != 2) + { + // one or even zero points found (shouldn't happen unless line perfectly tangent to corner), no need to draw segment + return false; + } + + // possibly re-sort points so optimized point segment has same direction as original segment: + if ((key-prevKey)*(intersections.at(1).x()-intersections.at(0).x()) + (value-prevValue)*(intersections.at(1).y()-intersections.at(0).y()) < 0) // scalar product of both segments < 0 -> opposite direction + intersections.move(0, 1); + crossA = coordsToPixels(intersections.at(0).x(), intersections.at(0).y()); + crossB = coordsToPixels(intersections.at(1).x(), intersections.at(1).y()); + return true; +} + +/*! \internal + + This function is part of the curve optimization algorithm of \ref getCurveData. + + This method assumes that the \ref getTraverse test has returned true, so the segment definitely + traverses the visible region 5 when going from \a prevRegion to \a currentRegion. + + In certain situations it is not sufficient to merely generate the entry and exit points of the + segment into/out of region 5, as \ref getTraverse provides. It may happen that a single segment, in + addition to traversing region 5, skips another region outside of region 5, which makes it + necessary to add an optimized corner point there (very similar to the job \ref + getOptimizedCornerPoints does for segments that are completely in outside regions and don't + traverse 5). + + As an example, consider a segment going from region 1 to region 6, traversing the lower left + corner of region 5. In this configuration, the segment additionally crosses the border between + region 1 and 2 before entering region 5. This makes it necessary to add an additional point in + the top left corner, before adding the optimized traverse points. So in this case, the output + parameter \a beforeTraverse will contain the top left corner point, and \a afterTraverse will be + empty. + + In some cases, such as when going from region 1 to 9, it may even be necessary to add additional + corner points before and after the traverse. Then both \a beforeTraverse and \a afterTraverse + return the respective corner points. +*/ +void QCPCurve::getTraverseCornerPoints(int prevRegion, int currentRegion, double rectLeft, double rectTop, double rectRight, double rectBottom, QVector &beforeTraverse, QVector &afterTraverse) const +{ + switch (prevRegion) + { + case 1: + { + switch (currentRegion) + { + case 6: { beforeTraverse << coordsToPixels(rectLeft, rectTop); break; } + case 9: { beforeTraverse << coordsToPixels(rectLeft, rectTop); afterTraverse << coordsToPixels(rectRight, rectBottom); break; } + case 8: { beforeTraverse << coordsToPixels(rectLeft, rectTop); break; } + } + break; + } + case 2: + { + switch (currentRegion) + { + case 7: { afterTraverse << coordsToPixels(rectRight, rectTop); break; } + case 9: { afterTraverse << coordsToPixels(rectRight, rectBottom); break; } + } + break; + } + case 3: + { + switch (currentRegion) + { + case 4: { beforeTraverse << coordsToPixels(rectLeft, rectBottom); break; } + case 7: { beforeTraverse << coordsToPixels(rectLeft, rectBottom); afterTraverse << coordsToPixels(rectRight, rectTop); break; } + case 8: { beforeTraverse << coordsToPixels(rectLeft, rectBottom); break; } + } + break; + } + case 4: + { + switch (currentRegion) + { + case 3: { afterTraverse << coordsToPixels(rectLeft, rectBottom); break; } + case 9: { afterTraverse << coordsToPixels(rectRight, rectBottom); break; } + } + break; + } + case 5: { break; } // shouldn't happen because this method only handles full traverses + case 6: + { + switch (currentRegion) + { + case 1: { afterTraverse << coordsToPixels(rectLeft, rectTop); break; } + case 7: { afterTraverse << coordsToPixels(rectRight, rectTop); break; } + } + break; + } + case 7: + { + switch (currentRegion) + { + case 2: { beforeTraverse << coordsToPixels(rectRight, rectTop); break; } + case 3: { beforeTraverse << coordsToPixels(rectRight, rectTop); afterTraverse << coordsToPixels(rectLeft, rectBottom); break; } + case 6: { beforeTraverse << coordsToPixels(rectRight, rectTop); break; } + } + break; + } + case 8: + { + switch (currentRegion) + { + case 1: { afterTraverse << coordsToPixels(rectLeft, rectTop); break; } + case 3: { afterTraverse << coordsToPixels(rectLeft, rectBottom); break; } + } + break; + } + case 9: + { + switch (currentRegion) + { + case 2: { beforeTraverse << coordsToPixels(rectRight, rectBottom); break; } + case 1: { beforeTraverse << coordsToPixels(rectRight, rectBottom); afterTraverse << coordsToPixels(rectLeft, rectTop); break; } + case 4: { beforeTraverse << coordsToPixels(rectRight, rectBottom); break; } + } + break; + } + } +} + +/*! \internal + + Calculates the (minimum) distance (in pixels) the curve's representation has from the given \a + pixelPoint in pixels. This is used to determine whether the curve was clicked or not, e.g. in + \ref selectTest. +*/ +double QCPCurve::pointDistance(const QPointF &pixelPoint) const +{ + if (mData->isEmpty()) + { + qDebug() << Q_FUNC_INFO << "requested point distance on curve" << mName << "without data"; + return 500; + } + if (mData->size() == 1) + { + QPointF dataPoint = coordsToPixels(mData->constBegin().key(), mData->constBegin().value().value); + return QVector2D(dataPoint-pixelPoint).length(); + } + + // calculate minimum distance to line segments: + QVector *lineData = new QVector; + getCurveData(lineData); + double minDistSqr = std::numeric_limits::max(); + for (int i=0; isize()-1; ++i) + { + double currentDistSqr = distSqrToLine(lineData->at(i), lineData->at(i+1), pixelPoint); + if (currentDistSqr < minDistSqr) + minDistSqr = currentDistSqr; + } + delete lineData; + return qSqrt(minDistSqr); +} + +/* inherits documentation from base class */ +QCPRange QCPCurve::getKeyRange(bool &foundRange, SignDomain inSignDomain) const +{ + QCPRange range; + bool haveLower = false; + bool haveUpper = false; + + double current; + + QCPCurveDataMap::const_iterator it = mData->constBegin(); + while (it != mData->constEnd()) + { + current = it.value().key; + if (!qIsNaN(current) && !qIsNaN(it.value().value)) + { + if (inSignDomain == sdBoth || (inSignDomain == sdNegative && current < 0) || (inSignDomain == sdPositive && current > 0)) + { + if (current < range.lower || !haveLower) + { + range.lower = current; + haveLower = true; + } + if (current > range.upper || !haveUpper) + { + range.upper = current; + haveUpper = true; + } + } + } + ++it; + } + + foundRange = haveLower && haveUpper; + return range; +} + +/* inherits documentation from base class */ +QCPRange QCPCurve::getValueRange(bool &foundRange, SignDomain inSignDomain) const +{ + QCPRange range; + bool haveLower = false; + bool haveUpper = false; + + double current; + + QCPCurveDataMap::const_iterator it = mData->constBegin(); + while (it != mData->constEnd()) + { + current = it.value().value; + if (!qIsNaN(current) && !qIsNaN(it.value().key)) + { + if (inSignDomain == sdBoth || (inSignDomain == sdNegative && current < 0) || (inSignDomain == sdPositive && current > 0)) + { + if (current < range.lower || !haveLower) + { + range.lower = current; + haveLower = true; + } + if (current > range.upper || !haveUpper) + { + range.upper = current; + haveUpper = true; + } + } + } + ++it; + } + + foundRange = haveLower && haveUpper; + return range; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPBarsGroup +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPBarsGroup + \brief Groups multiple QCPBars together so they appear side by side + + \image html QCPBarsGroup.png + + When showing multiple QCPBars in one plot which have bars at identical keys, it may be desirable + to have them appearing next to each other at each key. This is what adding the respective QCPBars + plottables to a QCPBarsGroup achieves. (An alternative approach is to stack them on top of each + other, see \ref QCPBars::moveAbove.) + + \section qcpbarsgroup-usage Usage + + To add a QCPBars plottable to the group, create a new group and then add the respective bars + intances: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpbarsgroup-creation + Alternatively to appending to the group like shown above, you can also set the group on the + QCPBars plottable via \ref QCPBars::setBarsGroup. + + The spacing between the bars can be configured via \ref setSpacingType and \ref setSpacing. The + bars in this group appear in the plot in the order they were appended. To insert a bars plottable + at a certain index position, or to reposition a bars plottable which is already in the group, use + \ref insert. + + To remove specific bars from the group, use either \ref remove or call \ref + QCPBars::setBarsGroup "QCPBars::setBarsGroup(0)" on the respective bars plottable. + + To clear the entire group, call \ref clear, or simply delete the group. + + \section qcpbarsgroup-example Example + + The image above is generated with the following code: + \snippet documentation/doc-image-generator/mainwindow.cpp qcpbarsgroup-example +*/ + +/* start of documentation of inline functions */ + +/*! \fn QList QCPBarsGroup::bars() const + + Returns all bars currently in this group. + + \see bars(int index) +*/ + +/*! \fn int QCPBarsGroup::size() const + + Returns the number of QCPBars plottables that are part of this group. + +*/ + +/*! \fn bool QCPBarsGroup::isEmpty() const + + Returns whether this bars group is empty. + + \see size +*/ + +/*! \fn bool QCPBarsGroup::contains(QCPBars *bars) + + Returns whether the specified \a bars plottable is part of this group. + +*/ + +/* end of documentation of inline functions */ + +/*! + Constructs a new bars group for the specified QCustomPlot instance. +*/ +QCPBarsGroup::QCPBarsGroup(QCustomPlot *parentPlot) : + QObject(parentPlot), + mParentPlot(parentPlot), + mSpacingType(stAbsolute), + mSpacing(4) +{ +} + +QCPBarsGroup::~QCPBarsGroup() +{ + clear(); +} + +/*! + Sets how the spacing between adjacent bars is interpreted. See \ref SpacingType. + + The actual spacing can then be specified with \ref setSpacing. + + \see setSpacing +*/ +void QCPBarsGroup::setSpacingType(SpacingType spacingType) +{ + mSpacingType = spacingType; +} + +/*! + Sets the spacing between adjacent bars. What the number passed as \a spacing actually means, is + defined by the current \ref SpacingType, which can be set with \ref setSpacingType. + + \see setSpacingType +*/ +void QCPBarsGroup::setSpacing(double spacing) +{ + mSpacing = spacing; +} + +/*! + Returns the QCPBars instance with the specified \a index in this group. If no such QCPBars + exists, returns 0. + + \see bars(), size +*/ +QCPBars *QCPBarsGroup::bars(int index) const +{ + if (index >= 0 && index < mBars.size()) + { + return mBars.at(index); + } else + { + qDebug() << Q_FUNC_INFO << "index out of bounds:" << index; + return 0; + } +} + +/*! + Removes all QCPBars plottables from this group. + + \see isEmpty +*/ +void QCPBarsGroup::clear() +{ + foreach (QCPBars *bars, mBars) // since foreach takes a copy, removing bars in the loop is okay + bars->setBarsGroup(0); // removes itself via removeBars +} + +/*! + Adds the specified \a bars plottable to this group. Alternatively, you can also use \ref + QCPBars::setBarsGroup on the \a bars instance. + + \see insert, remove +*/ +void QCPBarsGroup::append(QCPBars *bars) +{ + if (!bars) + { + qDebug() << Q_FUNC_INFO << "bars is 0"; + return; + } + + if (!mBars.contains(bars)) + bars->setBarsGroup(this); + else + qDebug() << Q_FUNC_INFO << "bars plottable is already in this bars group:" << reinterpret_cast(bars); +} + +/*! + Inserts the specified \a bars plottable into this group at the specified index position \a i. + This gives you full control over the ordering of the bars. + + \a bars may already be part of this group. In that case, \a bars is just moved to the new index + position. + + \see append, remove +*/ +void QCPBarsGroup::insert(int i, QCPBars *bars) +{ + if (!bars) + { + qDebug() << Q_FUNC_INFO << "bars is 0"; + return; + } + + // first append to bars list normally: + if (!mBars.contains(bars)) + bars->setBarsGroup(this); + // then move to according position: + mBars.move(mBars.indexOf(bars), qBound(0, i, mBars.size()-1)); +} + +/*! + Removes the specified \a bars plottable from this group. + + \see contains, clear +*/ +void QCPBarsGroup::remove(QCPBars *bars) +{ + if (!bars) + { + qDebug() << Q_FUNC_INFO << "bars is 0"; + return; + } + + if (mBars.contains(bars)) + bars->setBarsGroup(0); + else + qDebug() << Q_FUNC_INFO << "bars plottable is not in this bars group:" << reinterpret_cast(bars); +} + +/*! \internal + + Adds the specified \a bars to the internal mBars list of bars. This method does not change the + barsGroup property on \a bars. + + \see unregisterBars +*/ +void QCPBarsGroup::registerBars(QCPBars *bars) +{ + if (!mBars.contains(bars)) + mBars.append(bars); +} + +/*! \internal + + Removes the specified \a bars from the internal mBars list of bars. This method does not change + the barsGroup property on \a bars. + + \see registerBars +*/ +void QCPBarsGroup::unregisterBars(QCPBars *bars) +{ + mBars.removeOne(bars); +} + +/*! \internal + + Returns the pixel offset in the key dimension the specified \a bars plottable should have at the + given key coordinate \a keyCoord. The offset is relative to the pixel position of the key + coordinate \a keyCoord. +*/ +double QCPBarsGroup::keyPixelOffset(const QCPBars *bars, double keyCoord) +{ + // find list of all base bars in case some mBars are stacked: + QList baseBars; + foreach (const QCPBars *b, mBars) + { + while (b->barBelow()) + b = b->barBelow(); + if (!baseBars.contains(b)) + baseBars.append(b); + } + // find base bar this "bars" is stacked on: + const QCPBars *thisBase = bars; + while (thisBase->barBelow()) + thisBase = thisBase->barBelow(); + + // determine key pixel offset of this base bars considering all other base bars in this barsgroup: + double result = 0; + int index = baseBars.indexOf(thisBase); + if (index >= 0) + { + int startIndex; + double lowerPixelWidth, upperPixelWidth; + if (baseBars.size() % 2 == 1 && index == (baseBars.size()-1)/2) // is center bar (int division on purpose) + { + return result; + } else if (index < (baseBars.size()-1)/2.0) // bar is to the left of center + { + if (baseBars.size() % 2 == 0) // even number of bars + { + startIndex = baseBars.size()/2-1; + result -= getPixelSpacing(baseBars.at(startIndex), keyCoord)*0.5; // half of middle spacing + } else // uneven number of bars + { + startIndex = (baseBars.size()-1)/2-1; + baseBars.at((baseBars.size()-1)/2)->getPixelWidth(keyCoord, lowerPixelWidth, upperPixelWidth); + result -= qAbs(upperPixelWidth-lowerPixelWidth)*0.5; // half of center bar + result -= getPixelSpacing(baseBars.at((baseBars.size()-1)/2), keyCoord); // center bar spacing + } + for (int i=startIndex; i>index; --i) // add widths and spacings of bars in between center and our bars + { + baseBars.at(i)->getPixelWidth(keyCoord, lowerPixelWidth, upperPixelWidth); + result -= qAbs(upperPixelWidth-lowerPixelWidth); + result -= getPixelSpacing(baseBars.at(i), keyCoord); + } + // finally half of our bars width: + baseBars.at(index)->getPixelWidth(keyCoord, lowerPixelWidth, upperPixelWidth); + result -= qAbs(upperPixelWidth-lowerPixelWidth)*0.5; + } else // bar is to the right of center + { + if (baseBars.size() % 2 == 0) // even number of bars + { + startIndex = baseBars.size()/2; + result += getPixelSpacing(baseBars.at(startIndex), keyCoord)*0.5; // half of middle spacing + } else // uneven number of bars + { + startIndex = (baseBars.size()-1)/2+1; + baseBars.at((baseBars.size()-1)/2)->getPixelWidth(keyCoord, lowerPixelWidth, upperPixelWidth); + result += qAbs(upperPixelWidth-lowerPixelWidth)*0.5; // half of center bar + result += getPixelSpacing(baseBars.at((baseBars.size()-1)/2), keyCoord); // center bar spacing + } + for (int i=startIndex; igetPixelWidth(keyCoord, lowerPixelWidth, upperPixelWidth); + result += qAbs(upperPixelWidth-lowerPixelWidth); + result += getPixelSpacing(baseBars.at(i), keyCoord); + } + // finally half of our bars width: + baseBars.at(index)->getPixelWidth(keyCoord, lowerPixelWidth, upperPixelWidth); + result += qAbs(upperPixelWidth-lowerPixelWidth)*0.5; + } + } + return result; +} + +/*! \internal + + Returns the spacing in pixels which is between this \a bars and the following one, both at the + key coordinate \a keyCoord. + + \note Typically the returned value doesn't depend on \a bars or \a keyCoord. \a bars is only + needed to get acces to the key axis transformation and axis rect for the modes \ref + stAxisRectRatio and \ref stPlotCoords. The \a keyCoord is only relevant for spacings given in + \ref stPlotCoords on a logarithmic axis. +*/ +double QCPBarsGroup::getPixelSpacing(const QCPBars *bars, double keyCoord) +{ + switch (mSpacingType) + { + case stAbsolute: + { + return mSpacing; + } + case stAxisRectRatio: + { + if (bars->keyAxis()->orientation() == Qt::Horizontal) + return bars->keyAxis()->axisRect()->width()*mSpacing; + else + return bars->keyAxis()->axisRect()->height()*mSpacing; + } + case stPlotCoords: + { + double keyPixel = bars->keyAxis()->coordToPixel(keyCoord); + return bars->keyAxis()->coordToPixel(keyCoord+mSpacing)-keyPixel; + } + } + return 0; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPBarData +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPBarData + \brief Holds the data of one single data point (one bar) for QCPBars. + + The container for storing multiple data points is \ref QCPBarDataMap. + + The stored data is: + \li \a key: coordinate on the key axis of this bar + \li \a value: height coordinate on the value axis of this bar + + \see QCPBarDataaMap +*/ + +/*! + Constructs a bar data point with key and value set to zero. +*/ +QCPBarData::QCPBarData() : + key(0), + value(0) +{ +} + +/*! + Constructs a bar data point with the specified \a key and \a value. +*/ +QCPBarData::QCPBarData(double key, double value) : + key(key), + value(value) +{ +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPBars +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPBars + \brief A plottable representing a bar chart in a plot. + + \image html QCPBars.png + + To plot data, assign it with the \ref setData or \ref addData functions. + + \section appearance Changing the appearance + + The appearance of the bars is determined by the pen and the brush (\ref setPen, \ref setBrush). + The width of the individual bars can be controlled with \ref setWidthType and \ref setWidth. + + Bar charts are stackable. This means, two QCPBars plottables can be placed on top of each other + (see \ref QCPBars::moveAbove). So when two bars are at the same key position, they will appear + stacked. + + If you would like to group multiple QCPBars plottables together so they appear side by side as + shown below, use QCPBarsGroup. + + \image html QCPBarsGroup.png + + \section usage Usage + + Like all data representing objects in QCustomPlot, the QCPBars is a plottable + (QCPAbstractPlottable). So the plottable-interface of QCustomPlot applies + (QCustomPlot::plottable, QCustomPlot::addPlottable, QCustomPlot::removePlottable, etc.) + + Usually, you first create an instance: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpbars-creation-1 + add it to the customPlot with QCustomPlot::addPlottable: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpbars-creation-2 + and then modify the properties of the newly created plottable, e.g.: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpbars-creation-3 +*/ + +/* start of documentation of inline functions */ + +/*! \fn QCPBars *QCPBars::barBelow() const + Returns the bars plottable that is directly below this bars plottable. + If there is no such plottable, returns 0. + + \see barAbove, moveBelow, moveAbove +*/ + +/*! \fn QCPBars *QCPBars::barAbove() const + Returns the bars plottable that is directly above this bars plottable. + If there is no such plottable, returns 0. + + \see barBelow, moveBelow, moveAbove +*/ + +/* end of documentation of inline functions */ + +/*! + Constructs a bar chart which uses \a keyAxis as its key axis ("x") and \a valueAxis as its value + axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance and not have + the same orientation. If either of these restrictions is violated, a corresponding message is + printed to the debug output (qDebug), the construction is not aborted, though. + + The constructed QCPBars can be added to the plot with QCustomPlot::addPlottable, QCustomPlot + then takes ownership of the bar chart. +*/ +QCPBars::QCPBars(QCPAxis *keyAxis, QCPAxis *valueAxis) : + QCPAbstractPlottable(keyAxis, valueAxis), + mData(new QCPBarDataMap), + mWidth(0.75), + mWidthType(wtPlotCoords), + mBarsGroup(0), + mBaseValue(0) +{ + // modify inherited properties from abstract plottable: + mPen.setColor(Qt::blue); + mPen.setStyle(Qt::SolidLine); + mBrush.setColor(QColor(40, 50, 255, 30)); + mBrush.setStyle(Qt::SolidPattern); + mSelectedPen = mPen; + mSelectedPen.setWidthF(2.5); + mSelectedPen.setColor(QColor(80, 80, 255)); // lighter than Qt::blue of mPen + mSelectedBrush = mBrush; +} + +QCPBars::~QCPBars() +{ + setBarsGroup(0); + if (mBarBelow || mBarAbove) + connectBars(mBarBelow.data(), mBarAbove.data()); // take this bar out of any stacking + delete mData; +} + +/*! + Sets the width of the bars. + + How the number passed as \a width is interpreted (e.g. screen pixels, plot coordinates,...), + depends on the currently set width type, see \ref setWidthType and \ref WidthType. +*/ +void QCPBars::setWidth(double width) +{ + mWidth = width; +} + +/*! + Sets how the width of the bars is defined. See the documentation of \ref WidthType for an + explanation of the possible values for \a widthType. + + The default value is \ref wtPlotCoords. + + \see setWidth +*/ +void QCPBars::setWidthType(QCPBars::WidthType widthType) +{ + mWidthType = widthType; +} + +/*! + Sets to which QCPBarsGroup this QCPBars instance belongs to. Alternatively, you can also use \ref + QCPBarsGroup::append. + + To remove this QCPBars from any group, set \a barsGroup to 0. +*/ +void QCPBars::setBarsGroup(QCPBarsGroup *barsGroup) +{ + // deregister at old group: + if (mBarsGroup) + mBarsGroup->unregisterBars(this); + mBarsGroup = barsGroup; + // register at new group: + if (mBarsGroup) + mBarsGroup->registerBars(this); +} + +/*! + Sets the base value of this bars plottable. + + The base value defines where on the value coordinate the bars start. How far the bars extend from + the base value is given by their individual value data. For example, if the base value is set to + 1, a bar with data value 2 will have its lowest point at value coordinate 1 and highest point at + 3. + + For stacked bars, only the base value of the bottom-most QCPBars has meaning. + + The default base value is 0. +*/ +void QCPBars::setBaseValue(double baseValue) +{ + mBaseValue = baseValue; +} + +/*! + Replaces the current data with the provided \a data. + + If \a copy is set to true, data points in \a data will only be copied. if false, the plottable + takes ownership of the passed data and replaces the internal data pointer with it. This is + significantly faster than copying for large datasets. +*/ +void QCPBars::setData(QCPBarDataMap *data, bool copy) +{ + if (mData == data) + { + qDebug() << Q_FUNC_INFO << "The data pointer is already in (and owned by) this plottable" << reinterpret_cast(data); + return; + } + if (copy) + { + *mData = *data; + } else + { + delete mData; + mData = data; + } +} + +/*! \overload + + Replaces the current data with the provided points in \a key and \a value tuples. The + provided vectors should have equal length. Else, the number of added points will be the size of + the smallest vector. +*/ +void QCPBars::setData(const QVector &key, const QVector &value) +{ + mData->clear(); + int n = key.size(); + n = qMin(n, value.size()); + QCPBarData newData; + for (int i=0; iinsertMulti(newData.key, newData); + } +} + +/*! + Moves this bars plottable below \a bars. In other words, the bars of this plottable will appear + below the bars of \a bars. The move target \a bars must use the same key and value axis as this + plottable. + + Inserting into and removing from existing bar stacking is handled gracefully. If \a bars already + has a bars object below itself, this bars object is inserted between the two. If this bars object + is already between two other bars, the two other bars will be stacked on top of each other after + the operation. + + To remove this bars plottable from any stacking, set \a bars to 0. + + \see moveBelow, barAbove, barBelow +*/ +void QCPBars::moveBelow(QCPBars *bars) +{ + if (bars == this) return; + if (bars && (bars->keyAxis() != mKeyAxis.data() || bars->valueAxis() != mValueAxis.data())) + { + qDebug() << Q_FUNC_INFO << "passed QCPBars* doesn't have same key and value axis as this QCPBars"; + return; + } + // remove from stacking: + connectBars(mBarBelow.data(), mBarAbove.data()); // Note: also works if one (or both) of them is 0 + // if new bar given, insert this bar below it: + if (bars) + { + if (bars->mBarBelow) + connectBars(bars->mBarBelow.data(), this); + connectBars(this, bars); + } +} + +/*! + Moves this bars plottable above \a bars. In other words, the bars of this plottable will appear + above the bars of \a bars. The move target \a bars must use the same key and value axis as this + plottable. + + Inserting into and removing from existing bar stacking is handled gracefully. If \a bars already + has a bars object above itself, this bars object is inserted between the two. If this bars object + is already between two other bars, the two other bars will be stacked on top of each other after + the operation. + + To remove this bars plottable from any stacking, set \a bars to 0. + + \see moveBelow, barBelow, barAbove +*/ +void QCPBars::moveAbove(QCPBars *bars) +{ + if (bars == this) return; + if (bars && (bars->keyAxis() != mKeyAxis.data() || bars->valueAxis() != mValueAxis.data())) + { + qDebug() << Q_FUNC_INFO << "passed QCPBars* doesn't have same key and value axis as this QCPBars"; + return; + } + // remove from stacking: + connectBars(mBarBelow.data(), mBarAbove.data()); // Note: also works if one (or both) of them is 0 + // if new bar given, insert this bar above it: + if (bars) + { + if (bars->mBarAbove) + connectBars(this, bars->mBarAbove.data()); + connectBars(bars, this); + } +} + +/*! + Adds the provided data points in \a dataMap to the current data. + \see removeData +*/ +void QCPBars::addData(const QCPBarDataMap &dataMap) +{ + mData->unite(dataMap); +} + +/*! \overload + Adds the provided single data point in \a data to the current data. + \see removeData +*/ +void QCPBars::addData(const QCPBarData &data) +{ + mData->insertMulti(data.key, data); +} + +/*! \overload + Adds the provided single data point as \a key and \a value tuple to the current data + \see removeData +*/ +void QCPBars::addData(double key, double value) +{ + QCPBarData newData; + newData.key = key; + newData.value = value; + mData->insertMulti(newData.key, newData); +} + +/*! \overload + Adds the provided data points as \a key and \a value tuples to the current data. + \see removeData +*/ +void QCPBars::addData(const QVector &keys, const QVector &values) +{ + int n = keys.size(); + n = qMin(n, values.size()); + QCPBarData newData; + for (int i=0; iinsertMulti(newData.key, newData); + } +} + +/*! + Removes all data points with key smaller than \a key. + \see addData, clearData +*/ +void QCPBars::removeDataBefore(double key) +{ + QCPBarDataMap::iterator it = mData->begin(); + while (it != mData->end() && it.key() < key) + it = mData->erase(it); +} + +/*! + Removes all data points with key greater than \a key. + \see addData, clearData +*/ +void QCPBars::removeDataAfter(double key) +{ + if (mData->isEmpty()) return; + QCPBarDataMap::iterator it = mData->upperBound(key); + while (it != mData->end()) + it = mData->erase(it); +} + +/*! + Removes all data points with key between \a fromKey and \a toKey. if \a fromKey is + greater or equal to \a toKey, the function does nothing. To remove a single data point with known + key, use \ref removeData(double key). + + \see addData, clearData +*/ +void QCPBars::removeData(double fromKey, double toKey) +{ + if (fromKey >= toKey || mData->isEmpty()) return; + QCPBarDataMap::iterator it = mData->upperBound(fromKey); + QCPBarDataMap::iterator itEnd = mData->upperBound(toKey); + while (it != itEnd) + it = mData->erase(it); +} + +/*! \overload + + Removes a single data point at \a key. If the position is not known with absolute precision, + consider using \ref removeData(double fromKey, double toKey) with a small fuzziness interval + around the suspected position, depeding on the precision with which the key is known. + + \see addData, clearData +*/ +void QCPBars::removeData(double key) +{ + mData->remove(key); +} + +/*! + Removes all data points. + \see removeData, removeDataAfter, removeDataBefore +*/ +void QCPBars::clearData() +{ + mData->clear(); +} + +/* inherits documentation from base class */ +double QCPBars::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + if (onlySelectable && !mSelectable) + return -1; + if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return -1; } + + if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint())) + { + QCPBarDataMap::ConstIterator it; + for (it = mData->constBegin(); it != mData->constEnd(); ++it) + { + if (getBarPolygon(it.value().key, it.value().value).boundingRect().contains(pos)) + return mParentPlot->selectionTolerance()*0.99; + } + } + return -1; +} + +/* inherits documentation from base class */ +void QCPBars::draw(QCPPainter *painter) +{ + if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } + if (mData->isEmpty()) return; + + QCPBarDataMap::const_iterator it, lower, upperEnd; + getVisibleDataBounds(lower, upperEnd); + for (it = lower; it != upperEnd; ++it) + { + // check data validity if flag set: +#ifdef QCUSTOMPLOT_CHECK_DATA + if (QCP::isInvalidData(it.value().key, it.value().value)) + qDebug() << Q_FUNC_INFO << "Data point at" << it.key() << "of drawn range invalid." << "Plottable name:" << name(); +#endif + QPolygonF barPolygon = getBarPolygon(it.key(), it.value().value); + // draw bar fill: + if (mainBrush().style() != Qt::NoBrush && mainBrush().color().alpha() != 0) + { + applyFillAntialiasingHint(painter); + painter->setPen(Qt::NoPen); + painter->setBrush(mainBrush()); + painter->drawPolygon(barPolygon); + } + // draw bar line: + if (mainPen().style() != Qt::NoPen && mainPen().color().alpha() != 0) + { + applyDefaultAntialiasingHint(painter); + painter->setPen(mainPen()); + painter->setBrush(Qt::NoBrush); + painter->drawPolyline(barPolygon); + } + } +} + +/* inherits documentation from base class */ +void QCPBars::drawLegendIcon(QCPPainter *painter, const QRectF &rect) const +{ + // draw filled rect: + applyDefaultAntialiasingHint(painter); + painter->setBrush(mBrush); + painter->setPen(mPen); + QRectF r = QRectF(0, 0, rect.width()*0.67, rect.height()*0.67); + r.moveCenter(rect.center()); + painter->drawRect(r); +} + +/*! \internal + + called by \ref draw to determine which data (key) range is visible at the current key axis range + setting, so only that needs to be processed. It also takes into account the bar width. + + \a lower returns an iterator to the lowest data point that needs to be taken into account when + plotting. Note that in order to get a clean plot all the way to the edge of the axis rect, \a + lower may still be just outside the visible range. + + \a upperEnd returns an iterator one higher than the highest visible data point. Same as before, \a + upperEnd may also lie just outside of the visible range. + + if the bars plottable contains no data, both \a lower and \a upperEnd point to constEnd. +*/ +void QCPBars::getVisibleDataBounds(QCPBarDataMap::const_iterator &lower, QCPBarDataMap::const_iterator &upperEnd) const +{ + if (!mKeyAxis) { qDebug() << Q_FUNC_INFO << "invalid key axis"; return; } + if (mData->isEmpty()) + { + lower = mData->constEnd(); + upperEnd = mData->constEnd(); + return; + } + + // get visible data range as QMap iterators + lower = mData->lowerBound(mKeyAxis.data()->range().lower); + upperEnd = mData->upperBound(mKeyAxis.data()->range().upper); + double lowerPixelBound = mKeyAxis.data()->coordToPixel(mKeyAxis.data()->range().lower); + double upperPixelBound = mKeyAxis.data()->coordToPixel(mKeyAxis.data()->range().upper); + bool isVisible = false; + // walk left from lbound to find lower bar that actually is completely outside visible pixel range: + QCPBarDataMap::const_iterator it = lower; + while (it != mData->constBegin()) + { + --it; + QRectF barBounds = getBarPolygon(it.value().key, it.value().value).boundingRect(); + if (mKeyAxis.data()->orientation() == Qt::Horizontal) + isVisible = ((!mKeyAxis.data()->rangeReversed() && barBounds.right() >= lowerPixelBound) || (mKeyAxis.data()->rangeReversed() && barBounds.left() <= lowerPixelBound)); + else // keyaxis is vertical + isVisible = ((!mKeyAxis.data()->rangeReversed() && barBounds.top() <= lowerPixelBound) || (mKeyAxis.data()->rangeReversed() && barBounds.bottom() >= lowerPixelBound)); + if (isVisible) + lower = it; + else + break; + } + // walk right from ubound to find upper bar that actually is completely outside visible pixel range: + it = upperEnd; + while (it != mData->constEnd()) + { + QRectF barBounds = getBarPolygon(upperEnd.value().key, upperEnd.value().value).boundingRect(); + if (mKeyAxis.data()->orientation() == Qt::Horizontal) + isVisible = ((!mKeyAxis.data()->rangeReversed() && barBounds.left() <= upperPixelBound) || (mKeyAxis.data()->rangeReversed() && barBounds.right() >= upperPixelBound)); + else // keyaxis is vertical + isVisible = ((!mKeyAxis.data()->rangeReversed() && barBounds.bottom() >= upperPixelBound) || (mKeyAxis.data()->rangeReversed() && barBounds.top() <= upperPixelBound)); + if (isVisible) + upperEnd = it+1; + else + break; + ++it; + } +} + +/*! \internal + + Returns the polygon of a single bar with \a key and \a value. The Polygon is open at the bottom + and shifted according to the bar stacking (see \ref moveAbove) and base value (see \ref + setBaseValue). +*/ +QPolygonF QCPBars::getBarPolygon(double key, double value) const +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return QPolygonF(); } + + QPolygonF result; + double lowerPixelWidth, upperPixelWidth; + getPixelWidth(key, lowerPixelWidth, upperPixelWidth); + double base = getStackedBaseValue(key, value >= 0); + double basePixel = valueAxis->coordToPixel(base); + double valuePixel = valueAxis->coordToPixel(base+value); + double keyPixel = keyAxis->coordToPixel(key); + if (mBarsGroup) + keyPixel += mBarsGroup->keyPixelOffset(this, key); + if (keyAxis->orientation() == Qt::Horizontal) + { + result << QPointF(keyPixel+lowerPixelWidth, basePixel); + result << QPointF(keyPixel+lowerPixelWidth, valuePixel); + result << QPointF(keyPixel+upperPixelWidth, valuePixel); + result << QPointF(keyPixel+upperPixelWidth, basePixel); + } else + { + result << QPointF(basePixel, keyPixel+lowerPixelWidth); + result << QPointF(valuePixel, keyPixel+lowerPixelWidth); + result << QPointF(valuePixel, keyPixel+upperPixelWidth); + result << QPointF(basePixel, keyPixel+upperPixelWidth); + } + return result; +} + +/*! \internal + + This function is used to determine the width of the bar at coordinate \a key, according to the + specified width (\ref setWidth) and width type (\ref setWidthType). + + The output parameters \a lower and \a upper return the number of pixels the bar extends to lower + and higher keys, relative to the \a key coordinate (so with a non-reversed horizontal axis, \a + lower is negative and \a upper positive). +*/ +void QCPBars::getPixelWidth(double key, double &lower, double &upper) const +{ + switch (mWidthType) + { + case wtAbsolute: + { + upper = mWidth*0.5; + lower = -upper; + if (mKeyAxis && (mKeyAxis.data()->rangeReversed() ^ (mKeyAxis.data()->orientation() == Qt::Vertical))) + qSwap(lower, upper); + break; + } + case wtAxisRectRatio: + { + if (mKeyAxis && mKeyAxis.data()->axisRect()) + { + if (mKeyAxis.data()->orientation() == Qt::Horizontal) + upper = mKeyAxis.data()->axisRect()->width()*mWidth*0.5; + else + upper = mKeyAxis.data()->axisRect()->height()*mWidth*0.5; + lower = -upper; + if (mKeyAxis && (mKeyAxis.data()->rangeReversed() ^ (mKeyAxis.data()->orientation() == Qt::Vertical))) + qSwap(lower, upper); + } else + qDebug() << Q_FUNC_INFO << "No key axis or axis rect defined"; + break; + } + case wtPlotCoords: + { + if (mKeyAxis) + { + double keyPixel = mKeyAxis.data()->coordToPixel(key); + upper = mKeyAxis.data()->coordToPixel(key+mWidth*0.5)-keyPixel; + lower = mKeyAxis.data()->coordToPixel(key-mWidth*0.5)-keyPixel; + // no need to qSwap(lower, higher) when range reversed, because higher/lower are gained by + // coordinate transform which includes range direction + } else + qDebug() << Q_FUNC_INFO << "No key axis defined"; + break; + } + } +} + +/*! \internal + + This function is called to find at which value to start drawing the base of a bar at \a key, when + it is stacked on top of another QCPBars (e.g. with \ref moveAbove). + + positive and negative bars are separated per stack (positive are stacked above baseValue upwards, + negative are stacked below baseValue downwards). This can be indicated with \a positive. So if the + bar for which we need the base value is negative, set \a positive to false. +*/ +double QCPBars::getStackedBaseValue(double key, bool positive) const +{ + if (mBarBelow) + { + double max = 0; // don't use mBaseValue here because only base value of bottom-most bar has meaning in a bar stack + // find bars of mBarBelow that are approximately at key and find largest one: + double epsilon = qAbs(key)*1e-6; // should be safe even when changed to use float at some point + if (key == 0) + epsilon = 1e-6; + QCPBarDataMap::const_iterator it = mBarBelow.data()->mData->lowerBound(key-epsilon); + QCPBarDataMap::const_iterator itEnd = mBarBelow.data()->mData->upperBound(key+epsilon); + while (it != itEnd) + { + if ((positive && it.value().value > max) || + (!positive && it.value().value < max)) + max = it.value().value; + ++it; + } + // recurse down the bar-stack to find the total height: + return max + mBarBelow.data()->getStackedBaseValue(key, positive); + } else + return mBaseValue; +} + +/*! \internal + + Connects \a below and \a above to each other via their mBarAbove/mBarBelow properties. The bar(s) + currently above lower and below upper will become disconnected to lower/upper. + + If lower is zero, upper will be disconnected at the bottom. + If upper is zero, lower will be disconnected at the top. +*/ +void QCPBars::connectBars(QCPBars *lower, QCPBars *upper) +{ + if (!lower && !upper) return; + + if (!lower) // disconnect upper at bottom + { + // disconnect old bar below upper: + if (upper->mBarBelow && upper->mBarBelow.data()->mBarAbove.data() == upper) + upper->mBarBelow.data()->mBarAbove = 0; + upper->mBarBelow = 0; + } else if (!upper) // disconnect lower at top + { + // disconnect old bar above lower: + if (lower->mBarAbove && lower->mBarAbove.data()->mBarBelow.data() == lower) + lower->mBarAbove.data()->mBarBelow = 0; + lower->mBarAbove = 0; + } else // connect lower and upper + { + // disconnect old bar above lower: + if (lower->mBarAbove && lower->mBarAbove.data()->mBarBelow.data() == lower) + lower->mBarAbove.data()->mBarBelow = 0; + // disconnect old bar below upper: + if (upper->mBarBelow && upper->mBarBelow.data()->mBarAbove.data() == upper) + upper->mBarBelow.data()->mBarAbove = 0; + lower->mBarAbove = upper; + upper->mBarBelow = lower; + } +} + +/* inherits documentation from base class */ +QCPRange QCPBars::getKeyRange(bool &foundRange, SignDomain inSignDomain) const +{ + QCPRange range; + bool haveLower = false; + bool haveUpper = false; + + double current; + QCPBarDataMap::const_iterator it = mData->constBegin(); + while (it != mData->constEnd()) + { + current = it.value().key; + if (inSignDomain == sdBoth || (inSignDomain == sdNegative && current < 0) || (inSignDomain == sdPositive && current > 0)) + { + if (current < range.lower || !haveLower) + { + range.lower = current; + haveLower = true; + } + if (current > range.upper || !haveUpper) + { + range.upper = current; + haveUpper = true; + } + } + ++it; + } + // determine exact range of bars by including bar width and barsgroup offset: + if (haveLower && mKeyAxis) + { + double lowerPixelWidth, upperPixelWidth, keyPixel; + getPixelWidth(range.lower, lowerPixelWidth, upperPixelWidth); + keyPixel = mKeyAxis.data()->coordToPixel(range.lower) + lowerPixelWidth; + if (mBarsGroup) + keyPixel += mBarsGroup->keyPixelOffset(this, range.lower); + range.lower = mKeyAxis.data()->pixelToCoord(keyPixel); + } + if (haveUpper && mKeyAxis) + { + double lowerPixelWidth, upperPixelWidth, keyPixel; + getPixelWidth(range.upper, lowerPixelWidth, upperPixelWidth); + keyPixel = mKeyAxis.data()->coordToPixel(range.upper) + upperPixelWidth; + if (mBarsGroup) + keyPixel += mBarsGroup->keyPixelOffset(this, range.upper); + range.upper = mKeyAxis.data()->pixelToCoord(keyPixel); + } + foundRange = haveLower && haveUpper; + return range; +} + +/* inherits documentation from base class */ +QCPRange QCPBars::getValueRange(bool &foundRange, SignDomain inSignDomain) const +{ + QCPRange range; + range.lower = mBaseValue; + range.upper = mBaseValue; + bool haveLower = true; // set to true, because baseValue should always be visible in bar charts + bool haveUpper = true; // set to true, because baseValue should always be visible in bar charts + double current; + + QCPBarDataMap::const_iterator it = mData->constBegin(); + while (it != mData->constEnd()) + { + current = it.value().value + getStackedBaseValue(it.value().key, it.value().value >= 0); + if (inSignDomain == sdBoth || (inSignDomain == sdNegative && current < 0) || (inSignDomain == sdPositive && current > 0)) + { + if (current < range.lower || !haveLower) + { + range.lower = current; + haveLower = true; + } + if (current > range.upper || !haveUpper) + { + range.upper = current; + haveUpper = true; + } + } + ++it; + } + + foundRange = true; // return true because bar charts always have the 0-line visible + return range; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPStatisticalBox +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPStatisticalBox + \brief A plottable representing a single statistical box in a plot. + + \image html QCPStatisticalBox.png + + To plot data, assign it with the individual parameter functions or use \ref setData to set all + parameters at once. The individual functions are: + \li \ref setMinimum + \li \ref setLowerQuartile + \li \ref setMedian + \li \ref setUpperQuartile + \li \ref setMaximum + + Additionally you can define a list of outliers, drawn as scatter datapoints: + \li \ref setOutliers + + \section appearance Changing the appearance + + The appearance of the box itself is controlled via \ref setPen and \ref setBrush. You may change + the width of the box with \ref setWidth in plot coordinates (not pixels). + + Analog functions exist for the minimum/maximum-whiskers: \ref setWhiskerPen, \ref + setWhiskerBarPen, \ref setWhiskerWidth. The whisker width is the width of the bar at the top + (maximum) and bottom (minimum). + + The median indicator line has its own pen, \ref setMedianPen. + + If the whisker backbone pen is changed, make sure to set the capStyle to Qt::FlatCap. Else, the + backbone line might exceed the whisker bars by a few pixels due to the pen cap being not + perfectly flat. + + The Outlier data points are drawn as normal scatter points. Their look can be controlled with + \ref setOutlierStyle + + \section usage Usage + + Like all data representing objects in QCustomPlot, the QCPStatisticalBox is a plottable. + Usually, you first create an instance and add it to the customPlot: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpstatisticalbox-creation-1 + and then modify the properties of the newly created plottable, e.g.: + \snippet documentation/doc-code-snippets/mainwindow.cpp qcpstatisticalbox-creation-2 +*/ + +/*! + Constructs a statistical box which uses \a keyAxis as its key axis ("x") and \a valueAxis as its + value axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance and + not have the same orientation. If either of these restrictions is violated, a corresponding + message is printed to the debug output (qDebug), the construction is not aborted, though. + + The constructed statistical box can be added to the plot with QCustomPlot::addPlottable, + QCustomPlot then takes ownership of the statistical box. +*/ +QCPStatisticalBox::QCPStatisticalBox(QCPAxis *keyAxis, QCPAxis *valueAxis) : + QCPAbstractPlottable(keyAxis, valueAxis), + mKey(0), + mMinimum(0), + mLowerQuartile(0), + mMedian(0), + mUpperQuartile(0), + mMaximum(0) +{ + setOutlierStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, Qt::blue, 6)); + setWhiskerWidth(0.2); + setWidth(0.5); + + setPen(QPen(Qt::black)); + setSelectedPen(QPen(Qt::blue, 2.5)); + setMedianPen(QPen(Qt::black, 3, Qt::SolidLine, Qt::FlatCap)); + setWhiskerPen(QPen(Qt::black, 0, Qt::DashLine, Qt::FlatCap)); + setWhiskerBarPen(QPen(Qt::black)); + setBrush(Qt::NoBrush); + setSelectedBrush(Qt::NoBrush); +} + +/*! + Sets the key coordinate of the statistical box. +*/ +void QCPStatisticalBox::setKey(double key) +{ + mKey = key; +} + +/*! + Sets the parameter "minimum" of the statistical box plot. This is the position of the lower + whisker, typically the minimum measurement of the sample that's not considered an outlier. + + \see setMaximum, setWhiskerPen, setWhiskerBarPen, setWhiskerWidth +*/ +void QCPStatisticalBox::setMinimum(double value) +{ + mMinimum = value; +} + +/*! + Sets the parameter "lower Quartile" of the statistical box plot. This is the lower end of the + box. The lower and the upper quartiles are the two statistical quartiles around the median of the + sample, they contain 50% of the sample data. + + \see setUpperQuartile, setPen, setBrush, setWidth +*/ +void QCPStatisticalBox::setLowerQuartile(double value) +{ + mLowerQuartile = value; +} + +/*! + Sets the parameter "median" of the statistical box plot. This is the value of the median mark + inside the quartile box. The median separates the sample data in half (50% of the sample data is + below/above the median). + + \see setMedianPen +*/ +void QCPStatisticalBox::setMedian(double value) +{ + mMedian = value; +} + +/*! + Sets the parameter "upper Quartile" of the statistical box plot. This is the upper end of the + box. The lower and the upper quartiles are the two statistical quartiles around the median of the + sample, they contain 50% of the sample data. + + \see setLowerQuartile, setPen, setBrush, setWidth +*/ +void QCPStatisticalBox::setUpperQuartile(double value) +{ + mUpperQuartile = value; +} + +/*! + Sets the parameter "maximum" of the statistical box plot. This is the position of the upper + whisker, typically the maximum measurement of the sample that's not considered an outlier. + + \see setMinimum, setWhiskerPen, setWhiskerBarPen, setWhiskerWidth +*/ +void QCPStatisticalBox::setMaximum(double value) +{ + mMaximum = value; +} + +/*! + Sets a vector of outlier values that will be drawn as scatters. Any data points in the sample + that are not within the whiskers (\ref setMinimum, \ref setMaximum) should be considered outliers + and displayed as such. + + \see setOutlierStyle +*/ +void QCPStatisticalBox::setOutliers(const QVector &values) +{ + mOutliers = values; +} + +/*! + Sets all parameters of the statistical box plot at once. + + \see setKey, setMinimum, setLowerQuartile, setMedian, setUpperQuartile, setMaximum +*/ +void QCPStatisticalBox::setData(double key, double minimum, double lowerQuartile, double median, double upperQuartile, double maximum) +{ + setKey(key); + setMinimum(minimum); + setLowerQuartile(lowerQuartile); + setMedian(median); + setUpperQuartile(upperQuartile); + setMaximum(maximum); +} + +/*! + Sets the width of the box in key coordinates. + + \see setWhiskerWidth +*/ +void QCPStatisticalBox::setWidth(double width) +{ + mWidth = width; +} + +/*! + Sets the width of the whiskers (\ref setMinimum, \ref setMaximum) in key coordinates. + + \see setWidth +*/ +void QCPStatisticalBox::setWhiskerWidth(double width) +{ + mWhiskerWidth = width; +} + +/*! + Sets the pen used for drawing the whisker backbone (That's the line parallel to the value axis). + + Make sure to set the \a pen capStyle to Qt::FlatCap to prevent the whisker backbone from reaching + a few pixels past the whisker bars, when using a non-zero pen width. + + \see setWhiskerBarPen +*/ +void QCPStatisticalBox::setWhiskerPen(const QPen &pen) +{ + mWhiskerPen = pen; +} + +/*! + Sets the pen used for drawing the whisker bars (Those are the lines parallel to the key axis at + each end of the whisker backbone). + + \see setWhiskerPen +*/ +void QCPStatisticalBox::setWhiskerBarPen(const QPen &pen) +{ + mWhiskerBarPen = pen; +} + +/*! + Sets the pen used for drawing the median indicator line inside the statistical box. +*/ +void QCPStatisticalBox::setMedianPen(const QPen &pen) +{ + mMedianPen = pen; +} + +/*! + Sets the appearance of the outlier data points. + + \see setOutliers +*/ +void QCPStatisticalBox::setOutlierStyle(const QCPScatterStyle &style) +{ + mOutlierStyle = style; +} + +/* inherits documentation from base class */ +void QCPStatisticalBox::clearData() +{ + setOutliers(QVector()); + setKey(0); + setMinimum(0); + setLowerQuartile(0); + setMedian(0); + setUpperQuartile(0); + setMaximum(0); +} + +/* inherits documentation from base class */ +double QCPStatisticalBox::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + if (onlySelectable && !mSelectable) + return -1; + if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return -1; } + + if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint())) + { + double posKey, posValue; + pixelsToCoords(pos, posKey, posValue); + // quartile box: + QCPRange keyRange(mKey-mWidth*0.5, mKey+mWidth*0.5); + QCPRange valueRange(mLowerQuartile, mUpperQuartile); + if (keyRange.contains(posKey) && valueRange.contains(posValue)) + return mParentPlot->selectionTolerance()*0.99; + + // min/max whiskers: + if (QCPRange(mMinimum, mMaximum).contains(posValue)) + return qAbs(mKeyAxis.data()->coordToPixel(mKey)-mKeyAxis.data()->coordToPixel(posKey)); + } + return -1; +} + +/* inherits documentation from base class */ +void QCPStatisticalBox::draw(QCPPainter *painter) +{ + if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } + + // check data validity if flag set: +#ifdef QCUSTOMPLOT_CHECK_DATA + if (QCP::isInvalidData(mKey, mMedian) || + QCP::isInvalidData(mLowerQuartile, mUpperQuartile) || + QCP::isInvalidData(mMinimum, mMaximum)) + qDebug() << Q_FUNC_INFO << "Data point at" << mKey << "of drawn range has invalid data." << "Plottable name:" << name(); + for (int i=0; isave(); + painter->setClipRect(quartileBox, Qt::IntersectClip); + drawMedian(painter); + painter->restore(); + + drawWhiskers(painter); + drawOutliers(painter); +} + +/* inherits documentation from base class */ +void QCPStatisticalBox::drawLegendIcon(QCPPainter *painter, const QRectF &rect) const +{ + // draw filled rect: + applyDefaultAntialiasingHint(painter); + painter->setPen(mPen); + painter->setBrush(mBrush); + QRectF r = QRectF(0, 0, rect.width()*0.67, rect.height()*0.67); + r.moveCenter(rect.center()); + painter->drawRect(r); +} + +/*! \internal + + Draws the quartile box. \a box is an output parameter that returns the quartile box (in pixel + coordinates) which is used to set the clip rect of the painter before calling \ref drawMedian (so + the median doesn't draw outside the quartile box). +*/ +void QCPStatisticalBox::drawQuartileBox(QCPPainter *painter, QRectF *quartileBox) const +{ + QRectF box; + box.setTopLeft(coordsToPixels(mKey-mWidth*0.5, mUpperQuartile)); + box.setBottomRight(coordsToPixels(mKey+mWidth*0.5, mLowerQuartile)); + applyDefaultAntialiasingHint(painter); + painter->setPen(mainPen()); + painter->setBrush(mainBrush()); + painter->drawRect(box); + if (quartileBox) + *quartileBox = box; +} + +/*! \internal + + Draws the median line inside the quartile box. +*/ +void QCPStatisticalBox::drawMedian(QCPPainter *painter) const +{ + QLineF medianLine; + medianLine.setP1(coordsToPixels(mKey-mWidth*0.5, mMedian)); + medianLine.setP2(coordsToPixels(mKey+mWidth*0.5, mMedian)); + applyDefaultAntialiasingHint(painter); + painter->setPen(mMedianPen); + painter->drawLine(medianLine); +} + +/*! \internal + + Draws both whisker backbones and bars. +*/ +void QCPStatisticalBox::drawWhiskers(QCPPainter *painter) const +{ + QLineF backboneMin, backboneMax, barMin, barMax; + backboneMax.setPoints(coordsToPixels(mKey, mUpperQuartile), coordsToPixels(mKey, mMaximum)); + backboneMin.setPoints(coordsToPixels(mKey, mLowerQuartile), coordsToPixels(mKey, mMinimum)); + barMax.setPoints(coordsToPixels(mKey-mWhiskerWidth*0.5, mMaximum), coordsToPixels(mKey+mWhiskerWidth*0.5, mMaximum)); + barMin.setPoints(coordsToPixels(mKey-mWhiskerWidth*0.5, mMinimum), coordsToPixels(mKey+mWhiskerWidth*0.5, mMinimum)); + applyErrorBarsAntialiasingHint(painter); + painter->setPen(mWhiskerPen); + painter->drawLine(backboneMin); + painter->drawLine(backboneMax); + painter->setPen(mWhiskerBarPen); + painter->drawLine(barMin); + painter->drawLine(barMax); +} + +/*! \internal + + Draws the outlier scatter points. +*/ +void QCPStatisticalBox::drawOutliers(QCPPainter *painter) const +{ + applyScattersAntialiasingHint(painter); + mOutlierStyle.applyTo(painter, mPen); + for (int i=0; i 0) + return QCPRange(mKey-mWidth*0.5, mKey+mWidth*0.5); + else if (mKey > 0) + return QCPRange(mKey, mKey+mWidth*0.5); + else + { + foundRange = false; + return QCPRange(); + } + } + foundRange = false; + return QCPRange(); +} + +/* inherits documentation from base class */ +QCPRange QCPStatisticalBox::getValueRange(bool &foundRange, SignDomain inSignDomain) const +{ + QVector values; // values that must be considered (i.e. all outliers and the five box-parameters) + values.reserve(mOutliers.size() + 5); + values << mMaximum << mUpperQuartile << mMedian << mLowerQuartile << mMinimum; + values << mOutliers; + // go through values and find the ones in legal range: + bool haveUpper = false; + bool haveLower = false; + double upper = 0; + double lower = 0; + for (int i=0; i 0) || + (inSignDomain == sdBoth)) + { + if (values.at(i) > upper || !haveUpper) + { + upper = values.at(i); + haveUpper = true; + } + if (values.at(i) < lower || !haveLower) + { + lower = values.at(i); + haveLower = true; + } + } + } + // return the bounds if we found some sensible values: + if (haveLower && haveUpper) + { + foundRange = true; + return QCPRange(lower, upper); + } else // might happen if all values are in other sign domain + { + foundRange = false; + return QCPRange(); + } +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPColorMapData +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPColorMapData + \brief Holds the two-dimensional data of a QCPColorMap plottable. + + This class is a data storage for \ref QCPColorMap. It holds a two-dimensional array, which \ref + QCPColorMap then displays as a 2D image in the plot, where the array values are represented by a + color, depending on the value. + + The size of the array can be controlled via \ref setSize (or \ref setKeySize, \ref setValueSize). + Which plot coordinates these cells correspond to can be configured with \ref setRange (or \ref + setKeyRange, \ref setValueRange). + + The data cells can be accessed in two ways: They can be directly addressed by an integer index + with \ref setCell. This is the fastest method. Alternatively, they can be addressed by their plot + coordinate with \ref setData. plot coordinate to cell index transformations and vice versa are + provided by the functions \ref coordToCell and \ref cellToCoord. + + This class also buffers the minimum and maximum values that are in the data set, to provide + QCPColorMap::rescaleDataRange with the necessary information quickly. Setting a cell to a value + that is greater than the current maximum increases this maximum to the new value. However, + setting the cell that currently holds the maximum value to a smaller value doesn't decrease the + maximum again, because finding the true new maximum would require going through the entire data + array, which might be time consuming. The same holds for the data minimum. This functionality is + given by \ref recalculateDataBounds, such that you can decide when it is sensible to find the + true current minimum and maximum. The method QCPColorMap::rescaleDataRange offers a convenience + parameter \a recalculateDataBounds which may be set to true to automatically call \ref + recalculateDataBounds internally. +*/ + +/* start of documentation of inline functions */ + +/*! \fn bool QCPColorMapData::isEmpty() const + + Returns whether this instance carries no data. This is equivalent to having a size where at least + one of the dimensions is 0 (see \ref setSize). +*/ + +/* end of documentation of inline functions */ + +/*! + Constructs a new QCPColorMapData instance. The instance has \a keySize cells in the key direction + and \a valueSize cells in the value direction. These cells will be displayed by the \ref QCPColorMap + at the coordinates \a keyRange and \a valueRange. + + \see setSize, setKeySize, setValueSize, setRange, setKeyRange, setValueRange +*/ +QCPColorMapData::QCPColorMapData(int keySize, int valueSize, const QCPRange &keyRange, const QCPRange &valueRange) : + mKeySize(0), + mValueSize(0), + mKeyRange(keyRange), + mValueRange(valueRange), + mIsEmpty(true), + mData(0), + mDataModified(true) +{ + setSize(keySize, valueSize); + fill(0); +} + +QCPColorMapData::~QCPColorMapData() +{ + if (mData) + delete[] mData; +} + +/*! + Constructs a new QCPColorMapData instance copying the data and range of \a other. +*/ +QCPColorMapData::QCPColorMapData(const QCPColorMapData &other) : + mKeySize(0), + mValueSize(0), + mIsEmpty(true), + mData(0), + mDataModified(true) +{ + *this = other; +} + +/*! + Overwrites this color map data instance with the data stored in \a other. +*/ +QCPColorMapData &QCPColorMapData::operator=(const QCPColorMapData &other) +{ + if (&other != this) + { + const int keySize = other.keySize(); + const int valueSize = other.valueSize(); + setSize(keySize, valueSize); + setRange(other.keyRange(), other.valueRange()); + if (!mIsEmpty) + memcpy(mData, other.mData, sizeof(mData[0])*keySize*valueSize); + mDataBounds = other.mDataBounds; + mDataModified = true; + } + return *this; +} + +/* undocumented getter */ +double QCPColorMapData::data(double key, double value) +{ + int keyCell = (key-mKeyRange.lower)/(mKeyRange.upper-mKeyRange.lower)*(mKeySize-1)+0.5; + int valueCell = (value-mValueRange.lower)/(mValueRange.upper-mValueRange.lower)*(mValueSize-1)+0.5; + if (keyCell >= 0 && keyCell < mKeySize && valueCell >= 0 && valueCell < mValueSize) + return mData[valueCell*mKeySize + keyCell]; + else + return 0; +} + +/* undocumented getter */ +double QCPColorMapData::cell(int keyIndex, int valueIndex) +{ + if (keyIndex >= 0 && keyIndex < mKeySize && valueIndex >= 0 && valueIndex < mValueSize) + return mData[valueIndex*mKeySize + keyIndex]; + else + return 0; +} + +/*! + Resizes the data array to have \a keySize cells in the key dimension and \a valueSize cells in + the value dimension. + + The current data is discarded and the map cells are set to 0, unless the map had already the + requested size. + + Setting at least one of \a keySize or \a valueSize to zero frees the internal data array and \ref + isEmpty returns true. + + \see setRange, setKeySize, setValueSize +*/ +void QCPColorMapData::setSize(int keySize, int valueSize) +{ + if (keySize != mKeySize || valueSize != mValueSize) + { + mKeySize = keySize; + mValueSize = valueSize; + if (mData) + delete[] mData; + mIsEmpty = mKeySize == 0 || mValueSize == 0; + if (!mIsEmpty) + { +#ifdef __EXCEPTIONS + try { // 2D arrays get memory intensive fast. So if the allocation fails, at least output debug message +#endif + mData = new double[mKeySize*mValueSize]; +#ifdef __EXCEPTIONS + } catch (...) { mData = 0; } +#endif + if (mData) + fill(0); + else + qDebug() << Q_FUNC_INFO << "out of memory for data dimensions "<< mKeySize << "*" << mValueSize; + } else + mData = 0; + mDataModified = true; + } +} + +/*! + Resizes the data array to have \a keySize cells in the key dimension. + + The current data is discarded and the map cells are set to 0, unless the map had already the + requested size. + + Setting \a keySize to zero frees the internal data array and \ref isEmpty returns true. + + \see setKeyRange, setSize, setValueSize +*/ +void QCPColorMapData::setKeySize(int keySize) +{ + setSize(keySize, mValueSize); +} + +/*! + Resizes the data array to have \a valueSize cells in the value dimension. + + The current data is discarded and the map cells are set to 0, unless the map had already the + requested size. + + Setting \a valueSize to zero frees the internal data array and \ref isEmpty returns true. + + \see setValueRange, setSize, setKeySize +*/ +void QCPColorMapData::setValueSize(int valueSize) +{ + setSize(mKeySize, valueSize); +} + +/*! + Sets the coordinate ranges the data shall be distributed over. This defines the rectangular area + covered by the color map in plot coordinates. + + The outer cells will be centered on the range boundaries given to this function. For example, if + the key size (\ref setKeySize) is 3 and \a keyRange is set to QCPRange(2, 3) there will + be cells centered on the key coordinates 2, 2.5 and 3. + + \see setSize +*/ +void QCPColorMapData::setRange(const QCPRange &keyRange, const QCPRange &valueRange) +{ + setKeyRange(keyRange); + setValueRange(valueRange); +} + +/*! + Sets the coordinate range the data shall be distributed over in the key dimension. Together with + the value range, This defines the rectangular area covered by the color map in plot coordinates. + + The outer cells will be centered on the range boundaries given to this function. For example, if + the key size (\ref setKeySize) is 3 and \a keyRange is set to QCPRange(2, 3) there will + be cells centered on the key coordinates 2, 2.5 and 3. + + \see setRange, setValueRange, setSize +*/ +void QCPColorMapData::setKeyRange(const QCPRange &keyRange) +{ + mKeyRange = keyRange; +} + +/*! + Sets the coordinate range the data shall be distributed over in the value dimension. Together with + the key range, This defines the rectangular area covered by the color map in plot coordinates. + + The outer cells will be centered on the range boundaries given to this function. For example, if + the value size (\ref setValueSize) is 3 and \a valueRange is set to QCPRange(2, 3) there + will be cells centered on the value coordinates 2, 2.5 and 3. + + \see setRange, setKeyRange, setSize +*/ +void QCPColorMapData::setValueRange(const QCPRange &valueRange) +{ + mValueRange = valueRange; +} + +/*! + Sets the data of the cell, which lies at the plot coordinates given by \a key and \a value, to \a + z. + + \note The QCPColorMap always displays the data at equal key/value intervals, even if the key or + value axis is set to a logarithmic scaling. If you want to use QCPColorMap with logarithmic axes, + you shouldn't use the \ref QCPColorMapData::setData method as it uses a linear transformation to + determine the cell index. Rather directly access the cell index with \ref + QCPColorMapData::setCell. + + \see setCell, setRange +*/ +void QCPColorMapData::setData(double key, double value, double z) +{ + int keyCell = (key-mKeyRange.lower)/(mKeyRange.upper-mKeyRange.lower)*(mKeySize-1)+0.5; + int valueCell = (value-mValueRange.lower)/(mValueRange.upper-mValueRange.lower)*(mValueSize-1)+0.5; + if (keyCell >= 0 && keyCell < mKeySize && valueCell >= 0 && valueCell < mValueSize) + { + mData[valueCell*mKeySize + keyCell] = z; + if (z < mDataBounds.lower) + mDataBounds.lower = z; + if (z > mDataBounds.upper) + mDataBounds.upper = z; + mDataModified = true; + } +} + +/*! + Sets the data of the cell with indices \a keyIndex and \a valueIndex to \a z. The indices + enumerate the cells starting from zero, up to the map's size-1 in the respective dimension (see + \ref setSize). + + In the standard plot configuration (horizontal key axis and vertical value axis, both not + range-reversed), the cell with indices (0, 0) is in the bottom left corner and the cell with + indices (keySize-1, valueSize-1) is in the top right corner of the color map. + + \see setData, setSize +*/ +void QCPColorMapData::setCell(int keyIndex, int valueIndex, double z) +{ + if (keyIndex >= 0 && keyIndex < mKeySize && valueIndex >= 0 && valueIndex < mValueSize) + { + mData[valueIndex*mKeySize + keyIndex] = z; + if (z < mDataBounds.lower) + mDataBounds.lower = z; + if (z > mDataBounds.upper) + mDataBounds.upper = z; + mDataModified = true; + } +} + +/*! + Goes through the data and updates the buffered minimum and maximum data values. + + Calling this method is only advised if you are about to call \ref QCPColorMap::rescaleDataRange + and can not guarantee that the cells holding the maximum or minimum data haven't been overwritten + with a smaller or larger value respectively, since the buffered maximum/minimum values have been + updated the last time. Why this is the case is explained in the class description (\ref + QCPColorMapData). + + Note that the method \ref QCPColorMap::rescaleDataRange provides a parameter \a + recalculateDataBounds for convenience. Setting this to true will call this method for you, before + doing the rescale. +*/ +void QCPColorMapData::recalculateDataBounds() +{ + if (mKeySize > 0 && mValueSize > 0) + { + double minHeight = mData[0]; + double maxHeight = mData[0]; + const int dataCount = mValueSize*mKeySize; + for (int i=0; i maxHeight) + maxHeight = mData[i]; + if (mData[i] < minHeight) + minHeight = mData[i]; + } + mDataBounds.lower = minHeight; + mDataBounds.upper = maxHeight; + } +} + +/*! + Frees the internal data memory. + + This is equivalent to calling \ref setSize "setSize(0, 0)". +*/ +void QCPColorMapData::clear() +{ + setSize(0, 0); +} + +/*! + Sets all cells to the value \a z. +*/ +void QCPColorMapData::fill(double z) +{ + const int dataCount = mValueSize*mKeySize; + for (int i=0; i(data); + return; + } + if (copy) + { + *mMapData = *data; + } else + { + delete mMapData; + mMapData = data; + } + mMapImageInvalidated = true; +} + +/*! + Sets the data range of this color map to \a dataRange. The data range defines which data values + are mapped to the color gradient. + + To make the data range span the full range of the data set, use \ref rescaleDataRange. + + \see QCPColorScale::setDataRange +*/ +void QCPColorMap::setDataRange(const QCPRange &dataRange) +{ + if (!QCPRange::validRange(dataRange)) return; + if (mDataRange.lower != dataRange.lower || mDataRange.upper != dataRange.upper) + { + if (mDataScaleType == QCPAxis::stLogarithmic) + mDataRange = dataRange.sanitizedForLogScale(); + else + mDataRange = dataRange.sanitizedForLinScale(); + mMapImageInvalidated = true; + emit dataRangeChanged(mDataRange); + } +} + +/*! + Sets whether the data is correlated with the color gradient linearly or logarithmically. + + \see QCPColorScale::setDataScaleType +*/ +void QCPColorMap::setDataScaleType(QCPAxis::ScaleType scaleType) +{ + if (mDataScaleType != scaleType) + { + mDataScaleType = scaleType; + mMapImageInvalidated = true; + emit dataScaleTypeChanged(mDataScaleType); + if (mDataScaleType == QCPAxis::stLogarithmic) + setDataRange(mDataRange.sanitizedForLogScale()); + } +} + +/*! + Sets the color gradient that is used to represent the data. For more details on how to create an + own gradient or use one of the preset gradients, see \ref QCPColorGradient. + + The colors defined by the gradient will be used to represent data values in the currently set + data range, see \ref setDataRange. Data points that are outside this data range will either be + colored uniformly with the respective gradient boundary color, or the gradient will repeat, + depending on \ref QCPColorGradient::setPeriodic. + + \see QCPColorScale::setGradient +*/ +void QCPColorMap::setGradient(const QCPColorGradient &gradient) +{ + if (mGradient != gradient) + { + mGradient = gradient; + mMapImageInvalidated = true; + emit gradientChanged(mGradient); + } +} + +/*! + Sets whether the color map image shall use bicubic interpolation when displaying the color map + shrinked or expanded, and not at a 1:1 pixel-to-data scale. + + \image html QCPColorMap-interpolate.png "A 10*10 color map, with interpolation and without interpolation enabled" +*/ +void QCPColorMap::setInterpolate(bool enabled) +{ + mInterpolate = enabled; + mMapImageInvalidated = true; // because oversampling factors might need to change +} + +/*! + Sets whether the outer most data rows and columns are clipped to the specified key and value + range (see \ref QCPColorMapData::setKeyRange, \ref QCPColorMapData::setValueRange). + + if \a enabled is set to false, the data points at the border of the color map are drawn with the + same width and height as all other data points. Since the data points are represented by + rectangles of one color centered on the data coordinate, this means that the shown color map + extends by half a data point over the specified key/value range in each direction. + + \image html QCPColorMap-tightboundary.png "A color map, with tight boundary enabled and disabled" +*/ +void QCPColorMap::setTightBoundary(bool enabled) +{ + mTightBoundary = enabled; +} + +/*! + Associates the color scale \a colorScale with this color map. + + This means that both the color scale and the color map synchronize their gradient, data range and + data scale type (\ref setGradient, \ref setDataRange, \ref setDataScaleType). Multiple color maps + can be associated with one single color scale. This causes the color maps to also synchronize + those properties, via the mutual color scale. + + This function causes the color map to adopt the current color gradient, data range and data scale + type of \a colorScale. After this call, you may change these properties at either the color map + or the color scale, and the setting will be applied to both. + + Pass 0 as \a colorScale to disconnect the color scale from this color map again. +*/ +void QCPColorMap::setColorScale(QCPColorScale *colorScale) +{ + if (mColorScale) // unconnect signals from old color scale + { + disconnect(this, SIGNAL(dataRangeChanged(QCPRange)), mColorScale.data(), SLOT(setDataRange(QCPRange))); + disconnect(this, SIGNAL(dataScaleTypeChanged(QCPAxis::ScaleType)), mColorScale.data(), SLOT(setDataScaleType(QCPAxis::ScaleType))); + disconnect(this, SIGNAL(gradientChanged(QCPColorGradient)), mColorScale.data(), SLOT(setGradient(QCPColorGradient))); + disconnect(mColorScale.data(), SIGNAL(dataRangeChanged(QCPRange)), this, SLOT(setDataRange(QCPRange))); + disconnect(mColorScale.data(), SIGNAL(gradientChanged(QCPColorGradient)), this, SLOT(setGradient(QCPColorGradient))); + disconnect(mColorScale.data(), SIGNAL(dataScaleTypeChanged(QCPAxis::ScaleType)), this, SLOT(setDataScaleType(QCPAxis::ScaleType))); + } + mColorScale = colorScale; + if (mColorScale) // connect signals to new color scale + { + setGradient(mColorScale.data()->gradient()); + setDataRange(mColorScale.data()->dataRange()); + setDataScaleType(mColorScale.data()->dataScaleType()); + connect(this, SIGNAL(dataRangeChanged(QCPRange)), mColorScale.data(), SLOT(setDataRange(QCPRange))); + connect(this, SIGNAL(dataScaleTypeChanged(QCPAxis::ScaleType)), mColorScale.data(), SLOT(setDataScaleType(QCPAxis::ScaleType))); + connect(this, SIGNAL(gradientChanged(QCPColorGradient)), mColorScale.data(), SLOT(setGradient(QCPColorGradient))); + connect(mColorScale.data(), SIGNAL(dataRangeChanged(QCPRange)), this, SLOT(setDataRange(QCPRange))); + connect(mColorScale.data(), SIGNAL(gradientChanged(QCPColorGradient)), this, SLOT(setGradient(QCPColorGradient))); + connect(mColorScale.data(), SIGNAL(dataScaleTypeChanged(QCPAxis::ScaleType)), this, SLOT(setDataScaleType(QCPAxis::ScaleType))); + } +} + +/*! + Sets the data range (\ref setDataRange) to span the minimum and maximum values that occur in the + current data set. This corresponds to the \ref rescaleKeyAxis or \ref rescaleValueAxis methods, + only for the third data dimension of the color map. + + The minimum and maximum values of the data set are buffered in the internal QCPColorMapData + instance (\ref data). As data is updated via its \ref QCPColorMapData::setCell or \ref + QCPColorMapData::setData, the buffered minimum and maximum values are updated, too. For + performance reasons, however, they are only updated in an expanding fashion. So the buffered + maximum can only increase and the buffered minimum can only decrease. In consequence, changes to + the data that actually lower the maximum of the data set (by overwriting the cell holding the + current maximum with a smaller value), aren't recognized and the buffered maximum overestimates + the true maximum of the data set. The same happens for the buffered minimum. To recalculate the + true minimum and maximum by explicitly looking at each cell, the method + QCPColorMapData::recalculateDataBounds can be used. For convenience, setting the parameter \a + recalculateDataBounds calls this method before setting the data range to the buffered minimum and + maximum. + + \see setDataRange +*/ +void QCPColorMap::rescaleDataRange(bool recalculateDataBounds) +{ + if (recalculateDataBounds) + mMapData->recalculateDataBounds(); + setDataRange(mMapData->dataBounds()); +} + +/*! + Takes the current appearance of the color map and updates the legend icon, which is used to + represent this color map in the legend (see \ref QCPLegend). + + The \a transformMode specifies whether the rescaling is done by a faster, low quality image + scaling algorithm (Qt::FastTransformation) or by a slower, higher quality algorithm + (Qt::SmoothTransformation). + + The current color map appearance is scaled down to \a thumbSize. Ideally, this should be equal to + the size of the legend icon (see \ref QCPLegend::setIconSize). If it isn't exactly the configured + legend icon size, the thumb will be rescaled during drawing of the legend item. + + \see setDataRange +*/ +void QCPColorMap::updateLegendIcon(Qt::TransformationMode transformMode, const QSize &thumbSize) +{ + if (mMapImage.isNull() && !data()->isEmpty()) + updateMapImage(); // try to update map image if it's null (happens if no draw has happened yet) + + if (!mMapImage.isNull()) // might still be null, e.g. if data is empty, so check here again + { + bool mirrorX = (keyAxis()->orientation() == Qt::Horizontal ? keyAxis() : valueAxis())->rangeReversed(); + bool mirrorY = (valueAxis()->orientation() == Qt::Vertical ? valueAxis() : keyAxis())->rangeReversed(); + mLegendIcon = QPixmap::fromImage(mMapImage.mirrored(mirrorX, mirrorY)).scaled(thumbSize, Qt::KeepAspectRatio, transformMode); + } +} + +/*! + Clears the colormap data by calling \ref QCPColorMapData::clear() on the internal data. This also + resizes the map to 0x0 cells. +*/ +void QCPColorMap::clearData() +{ + mMapData->clear(); +} + +/* inherits documentation from base class */ +double QCPColorMap::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + if (onlySelectable && !mSelectable) + return -1; + if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return -1; } + + if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint())) + { + double posKey, posValue; + pixelsToCoords(pos, posKey, posValue); + if (mMapData->keyRange().contains(posKey) && mMapData->valueRange().contains(posValue)) + return mParentPlot->selectionTolerance()*0.99; + } + return -1; +} + +/*! \internal + + Updates the internal map image buffer by going through the internal \ref QCPColorMapData and + turning the data values into color pixels with \ref QCPColorGradient::colorize. + + This method is called by \ref QCPColorMap::draw if either the data has been modified or the map image + has been invalidated for a different reason (e.g. a change of the data range with \ref + setDataRange). + + If the map cell count is low, the image created will be oversampled in order to avoid a + QPainter::drawImage bug which makes inner pixel boundaries jitter when stretch-drawing images + without smooth transform enabled. Accordingly, oversampling isn't performed if \ref + setInterpolate is true. +*/ +void QCPColorMap::updateMapImage() +{ + QCPAxis *keyAxis = mKeyAxis.data(); + if (!keyAxis) return; + if (mMapData->isEmpty()) return; + + const int keySize = mMapData->keySize(); + const int valueSize = mMapData->valueSize(); + int keyOversamplingFactor = mInterpolate ? 1 : (int)(1.0+100.0/(double)keySize); // make mMapImage have at least size 100, factor becomes 1 if size > 200 or interpolation is on + int valueOversamplingFactor = mInterpolate ? 1 : (int)(1.0+100.0/(double)valueSize); // make mMapImage have at least size 100, factor becomes 1 if size > 200 or interpolation is on + + // resize mMapImage to correct dimensions including possible oversampling factors, according to key/value axes orientation: + if (keyAxis->orientation() == Qt::Horizontal && (mMapImage.width() != keySize*keyOversamplingFactor || mMapImage.height() != valueSize*valueOversamplingFactor)) + mMapImage = QImage(QSize(keySize*keyOversamplingFactor, valueSize*valueOversamplingFactor), QImage::Format_RGB32); + else if (keyAxis->orientation() == Qt::Vertical && (mMapImage.width() != valueSize*valueOversamplingFactor || mMapImage.height() != keySize*keyOversamplingFactor)) + mMapImage = QImage(QSize(valueSize*valueOversamplingFactor, keySize*keyOversamplingFactor), QImage::Format_RGB32); + + QImage *localMapImage = &mMapImage; // this is the image on which the colorization operates. Either the final mMapImage, or if we need oversampling, mUndersampledMapImage + if (keyOversamplingFactor > 1 || valueOversamplingFactor > 1) + { + // resize undersampled map image to actual key/value cell sizes: + if (keyAxis->orientation() == Qt::Horizontal && (mUndersampledMapImage.width() != keySize || mUndersampledMapImage.height() != valueSize)) + mUndersampledMapImage = QImage(QSize(keySize, valueSize), QImage::Format_RGB32); + else if (keyAxis->orientation() == Qt::Vertical && (mUndersampledMapImage.width() != valueSize || mUndersampledMapImage.height() != keySize)) + mUndersampledMapImage = QImage(QSize(valueSize, keySize), QImage::Format_RGB32); + localMapImage = &mUndersampledMapImage; // make the colorization run on the undersampled image + } else if (!mUndersampledMapImage.isNull()) + mUndersampledMapImage = QImage(); // don't need oversampling mechanism anymore (map size has changed) but mUndersampledMapImage still has nonzero size, free it + + const double *rawData = mMapData->mData; + if (keyAxis->orientation() == Qt::Horizontal) + { + const int lineCount = valueSize; + const int rowCount = keySize; + for (int line=0; line(localMapImage->scanLine(lineCount-1-line)); // invert scanline index because QImage counts scanlines from top, but our vertical index counts from bottom (mathematical coordinate system) + mGradient.colorize(rawData+line*rowCount, mDataRange, pixels, rowCount, 1, mDataScaleType==QCPAxis::stLogarithmic); + } + } else // keyAxis->orientation() == Qt::Vertical + { + const int lineCount = keySize; + const int rowCount = valueSize; + for (int line=0; line(localMapImage->scanLine(lineCount-1-line)); // invert scanline index because QImage counts scanlines from top, but our vertical index counts from bottom (mathematical coordinate system) + mGradient.colorize(rawData+line, mDataRange, pixels, rowCount, lineCount, mDataScaleType==QCPAxis::stLogarithmic); + } + } + + if (keyOversamplingFactor > 1 || valueOversamplingFactor > 1) + { + if (keyAxis->orientation() == Qt::Horizontal) + mMapImage = mUndersampledMapImage.scaled(keySize*keyOversamplingFactor, valueSize*valueOversamplingFactor, Qt::IgnoreAspectRatio, Qt::FastTransformation); + else + mMapImage = mUndersampledMapImage.scaled(valueSize*valueOversamplingFactor, keySize*keyOversamplingFactor, Qt::IgnoreAspectRatio, Qt::FastTransformation); + } + mMapData->mDataModified = false; + mMapImageInvalidated = false; +} + +/* inherits documentation from base class */ +void QCPColorMap::draw(QCPPainter *painter) +{ + if (mMapData->isEmpty()) return; + if (!mKeyAxis || !mValueAxis) return; + applyDefaultAntialiasingHint(painter); + + if (mMapData->mDataModified || mMapImageInvalidated) + updateMapImage(); + + // use buffer if painting vectorized (PDF): + bool useBuffer = painter->modes().testFlag(QCPPainter::pmVectorized); + QCPPainter *localPainter = painter; // will be redirected to paint on mapBuffer if painting vectorized + QRectF mapBufferTarget; // the rect in absolute widget coordinates where the visible map portion/buffer will end up in + QPixmap mapBuffer; + double mapBufferPixelRatio = 3; // factor by which DPI is increased in embedded bitmaps + if (useBuffer) + { + mapBufferTarget = painter->clipRegion().boundingRect(); + mapBuffer = QPixmap((mapBufferTarget.size()*mapBufferPixelRatio).toSize()); + mapBuffer.fill(Qt::transparent); + localPainter = new QCPPainter(&mapBuffer); + localPainter->scale(mapBufferPixelRatio, mapBufferPixelRatio); + localPainter->translate(-mapBufferTarget.topLeft()); + } + + QRectF imageRect = QRectF(coordsToPixels(mMapData->keyRange().lower, mMapData->valueRange().lower), + coordsToPixels(mMapData->keyRange().upper, mMapData->valueRange().upper)).normalized(); + // extend imageRect to contain outer halves/quarters of bordering/cornering pixels (cells are centered on map range boundary): + double halfCellWidth = 0; // in pixels + double halfCellHeight = 0; // in pixels + if (keyAxis()->orientation() == Qt::Horizontal) + { + if (mMapData->keySize() > 1) + halfCellWidth = 0.5*imageRect.width()/(double)(mMapData->keySize()-1); + if (mMapData->valueSize() > 1) + halfCellHeight = 0.5*imageRect.height()/(double)(mMapData->valueSize()-1); + } else // keyAxis orientation is Qt::Vertical + { + if (mMapData->keySize() > 1) + halfCellHeight = 0.5*imageRect.height()/(double)(mMapData->keySize()-1); + if (mMapData->valueSize() > 1) + halfCellWidth = 0.5*imageRect.width()/(double)(mMapData->valueSize()-1); + } + imageRect.adjust(-halfCellWidth, -halfCellHeight, halfCellWidth, halfCellHeight); + bool mirrorX = (keyAxis()->orientation() == Qt::Horizontal ? keyAxis() : valueAxis())->rangeReversed(); + bool mirrorY = (valueAxis()->orientation() == Qt::Vertical ? valueAxis() : keyAxis())->rangeReversed(); + bool smoothBackup = localPainter->renderHints().testFlag(QPainter::SmoothPixmapTransform); + localPainter->setRenderHint(QPainter::SmoothPixmapTransform, mInterpolate); + QRegion clipBackup; + if (mTightBoundary) + { + clipBackup = localPainter->clipRegion(); + QRectF tightClipRect = QRectF(coordsToPixels(mMapData->keyRange().lower, mMapData->valueRange().lower), + coordsToPixels(mMapData->keyRange().upper, mMapData->valueRange().upper)).normalized(); + localPainter->setClipRect(tightClipRect, Qt::IntersectClip); + } + localPainter->drawImage(imageRect, mMapImage.mirrored(mirrorX, mirrorY)); + if (mTightBoundary) + localPainter->setClipRegion(clipBackup); + localPainter->setRenderHint(QPainter::SmoothPixmapTransform, smoothBackup); + + if (useBuffer) // localPainter painted to mapBuffer, so now draw buffer with original painter + { + delete localPainter; + painter->drawPixmap(mapBufferTarget.toRect(), mapBuffer); + } +} + +/* inherits documentation from base class */ +void QCPColorMap::drawLegendIcon(QCPPainter *painter, const QRectF &rect) const +{ + applyDefaultAntialiasingHint(painter); + // draw map thumbnail: + if (!mLegendIcon.isNull()) + { + QPixmap scaledIcon = mLegendIcon.scaled(rect.size().toSize(), Qt::KeepAspectRatio, Qt::FastTransformation); + QRectF iconRect = QRectF(0, 0, scaledIcon.width(), scaledIcon.height()); + iconRect.moveCenter(rect.center()); + painter->drawPixmap(iconRect.topLeft(), scaledIcon); + } + /* + // draw frame: + painter->setBrush(Qt::NoBrush); + painter->setPen(Qt::black); + painter->drawRect(rect.adjusted(1, 1, 0, 0)); + */ +} + +/* inherits documentation from base class */ +QCPRange QCPColorMap::getKeyRange(bool &foundRange, SignDomain inSignDomain) const +{ + foundRange = true; + QCPRange result = mMapData->keyRange(); + result.normalize(); + if (inSignDomain == QCPAbstractPlottable::sdPositive) + { + if (result.lower <= 0 && result.upper > 0) + result.lower = result.upper*1e-3; + else if (result.lower <= 0 && result.upper <= 0) + foundRange = false; + } else if (inSignDomain == QCPAbstractPlottable::sdNegative) + { + if (result.upper >= 0 && result.lower < 0) + result.upper = result.lower*1e-3; + else if (result.upper >= 0 && result.lower >= 0) + foundRange = false; + } + return result; +} + +/* inherits documentation from base class */ +QCPRange QCPColorMap::getValueRange(bool &foundRange, SignDomain inSignDomain) const +{ + foundRange = true; + QCPRange result = mMapData->valueRange(); + result.normalize(); + if (inSignDomain == QCPAbstractPlottable::sdPositive) + { + if (result.lower <= 0 && result.upper > 0) + result.lower = result.upper*1e-3; + else if (result.lower <= 0 && result.upper <= 0) + foundRange = false; + } else if (inSignDomain == QCPAbstractPlottable::sdNegative) + { + if (result.upper >= 0 && result.lower < 0) + result.upper = result.lower*1e-3; + else if (result.upper >= 0 && result.lower >= 0) + foundRange = false; + } + return result; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPFinancialData +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPFinancialData + \brief Holds the data of one single data point for QCPFinancial. + + The container for storing multiple data points is \ref QCPFinancialDataMap. + + The stored data is: + \li \a key: coordinate on the key axis of this data point + \li \a open: The opening value at the data point + \li \a high: The high/maximum value at the data point + \li \a low: The low/minimum value at the data point + \li \a close: The closing value at the data point + + \see QCPFinancialDataMap +*/ + +/*! + Constructs a data point with key and all values set to zero. +*/ +QCPFinancialData::QCPFinancialData() : + key(0), + open(0), + high(0), + low(0), + close(0) +{ +} + +/*! + Constructs a data point with the specified \a key and OHLC values. +*/ +QCPFinancialData::QCPFinancialData(double key, double open, double high, double low, double close) : + key(key), + open(open), + high(high), + low(low), + close(close) +{ +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPFinancial +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPFinancial + \brief A plottable representing a financial stock chart + + \image html QCPFinancial.png + + This plottable represents time series data binned to certain intervals, mainly used for stock + charts. The two common representations OHLC (Open-High-Low-Close) bars and Candlesticks can be + set via \ref setChartStyle. + + The data is passed via \ref setData as a set of open/high/low/close values at certain keys + (typically times). This means the data must be already binned appropriately. If data is only + available as a series of values (e.g. \a price against \a time), you can use the static + convenience function \ref timeSeriesToOhlc to generate binned OHLC-data which can then be passed + to \ref setData. + + The width of the OHLC bars/candlesticks can be controlled with \ref setWidth and is given in plot + key coordinates. A typical choice is to set it to (or slightly less than) one bin interval width. + + \section appearance Changing the appearance + + Charts can be either single- or two-colored (\ref setTwoColored). If set to be single-colored, + lines are drawn with the plottable's pen (\ref setPen) and fills with the brush (\ref setBrush). + + If set to two-colored, positive changes of the value during an interval (\a close >= \a open) are + represented with a different pen and brush than negative changes (\a close < \a open). These can + be configured with \ref setPenPositive, \ref setPenNegative, \ref setBrushPositive, and \ref + setBrushNegative. In two-colored mode, the normal plottable pen/brush is ignored. Upon selection + however, the normal selected pen/brush (\ref setSelectedPen, \ref setSelectedBrush) is used, + irrespective of whether the chart is single- or two-colored. + +*/ + +/* start of documentation of inline functions */ + +/*! \fn QCPFinancialDataMap *QCPFinancial::data() const + + Returns a pointer to the internal data storage of type \ref QCPFinancialDataMap. You may use it to + directly manipulate the data, which may be more convenient and faster than using the regular \ref + setData or \ref addData methods, in certain situations. +*/ + +/* end of documentation of inline functions */ + +/*! + Constructs a financial chart which uses \a keyAxis as its key axis ("x") and \a valueAxis as its value + axis ("y"). \a keyAxis and \a valueAxis must reside in the same QCustomPlot instance and not have + the same orientation. If either of these restrictions is violated, a corresponding message is + printed to the debug output (qDebug), the construction is not aborted, though. + + The constructed QCPFinancial can be added to the plot with QCustomPlot::addPlottable, QCustomPlot + then takes ownership of the financial chart. +*/ +QCPFinancial::QCPFinancial(QCPAxis *keyAxis, QCPAxis *valueAxis) : + QCPAbstractPlottable(keyAxis, valueAxis), + mData(0), + mChartStyle(csOhlc), + mWidth(0.5), + mTwoColored(false), + mBrushPositive(QBrush(QColor(210, 210, 255))), + mBrushNegative(QBrush(QColor(255, 210, 210))), + mPenPositive(QPen(QColor(10, 40, 180))), + mPenNegative(QPen(QColor(180, 40, 10))) +{ + mData = new QCPFinancialDataMap; + + setSelectedPen(QPen(QColor(80, 80, 255), 2.5)); + setSelectedBrush(QBrush(QColor(80, 80, 255))); +} + +QCPFinancial::~QCPFinancial() +{ + delete mData; +} + +/*! + Replaces the current data with the provided \a data. + + If \a copy is set to true, data points in \a data will only be copied. if false, the plottable + takes ownership of the passed data and replaces the internal data pointer with it. This is + significantly faster than copying for large datasets. + + Alternatively, you can also access and modify the plottable's data via the \ref data method, which + returns a pointer to the internal \ref QCPFinancialDataMap. + + \see timeSeriesToOhlc +*/ +void QCPFinancial::setData(QCPFinancialDataMap *data, bool copy) +{ + if (mData == data) + { + qDebug() << Q_FUNC_INFO << "The data pointer is already in (and owned by) this plottable" << reinterpret_cast(data); + return; + } + if (copy) + { + *mData = *data; + } else + { + delete mData; + mData = data; + } +} + +/*! \overload + + Replaces the current data with the provided open/high/low/close data. The provided vectors should + have equal length. Else, the number of added points will be the size of the smallest vector. + + \see timeSeriesToOhlc +*/ +void QCPFinancial::setData(const QVector &key, const QVector &open, const QVector &high, const QVector &low, const QVector &close) +{ + mData->clear(); + int n = key.size(); + n = qMin(n, open.size()); + n = qMin(n, high.size()); + n = qMin(n, low.size()); + n = qMin(n, close.size()); + for (int i=0; iinsertMulti(key[i], QCPFinancialData(key[i], open[i], high[i], low[i], close[i])); + } +} + +/*! + Sets which representation style shall be used to display the OHLC data. +*/ +void QCPFinancial::setChartStyle(QCPFinancial::ChartStyle style) +{ + mChartStyle = style; +} + +/*! + Sets the width of the individual bars/candlesticks to \a width in plot key coordinates. + + A typical choice is to set it to (or slightly less than) one bin interval width. +*/ +void QCPFinancial::setWidth(double width) +{ + mWidth = width; +} + +/*! + Sets whether this chart shall contrast positive from negative trends per data point by using two + separate colors to draw the respective bars/candlesticks. + + If \a twoColored is false, the normal plottable's pen and brush are used (\ref setPen, \ref + setBrush). + + \see setPenPositive, setPenNegative, setBrushPositive, setBrushNegative +*/ +void QCPFinancial::setTwoColored(bool twoColored) +{ + mTwoColored = twoColored; +} + +/*! + If \ref setTwoColored is set to true, this function controls the brush that is used to draw fills + of data points with a positive trend (i.e. bars/candlesticks with close >= open). + + If \a twoColored is false, the normal plottable's pen and brush are used (\ref setPen, \ref + setBrush). + + \see setBrushNegative, setPenPositive, setPenNegative +*/ +void QCPFinancial::setBrushPositive(const QBrush &brush) +{ + mBrushPositive = brush; +} + +/*! + If \ref setTwoColored is set to true, this function controls the brush that is used to draw fills + of data points with a negative trend (i.e. bars/candlesticks with close < open). + + If \a twoColored is false, the normal plottable's pen and brush are used (\ref setPen, \ref + setBrush). + + \see setBrushPositive, setPenNegative, setPenPositive +*/ +void QCPFinancial::setBrushNegative(const QBrush &brush) +{ + mBrushNegative = brush; +} + +/*! + If \ref setTwoColored is set to true, this function controls the pen that is used to draw + outlines of data points with a positive trend (i.e. bars/candlesticks with close >= open). + + If \a twoColored is false, the normal plottable's pen and brush are used (\ref setPen, \ref + setBrush). + + \see setPenNegative, setBrushPositive, setBrushNegative +*/ +void QCPFinancial::setPenPositive(const QPen &pen) +{ + mPenPositive = pen; +} + +/*! + If \ref setTwoColored is set to true, this function controls the pen that is used to draw + outlines of data points with a negative trend (i.e. bars/candlesticks with close < open). + + If \a twoColored is false, the normal plottable's pen and brush are used (\ref setPen, \ref + setBrush). + + \see setPenPositive, setBrushNegative, setBrushPositive +*/ +void QCPFinancial::setPenNegative(const QPen &pen) +{ + mPenNegative = pen; +} + +/*! + Adds the provided data points in \a dataMap to the current data. + + Alternatively, you can also access and modify the data via the \ref data method, which returns a + pointer to the internal \ref QCPFinancialDataMap. + + \see removeData +*/ +void QCPFinancial::addData(const QCPFinancialDataMap &dataMap) +{ + mData->unite(dataMap); +} + +/*! \overload + + Adds the provided single data point in \a data to the current data. + + Alternatively, you can also access and modify the data via the \ref data method, which returns a + pointer to the internal \ref QCPFinancialData. + + \see removeData +*/ +void QCPFinancial::addData(const QCPFinancialData &data) +{ + mData->insertMulti(data.key, data); +} + +/*! \overload + + Adds the provided single data point given by \a key, \a open, \a high, \a low, and \a close to + the current data. + + Alternatively, you can also access and modify the data via the \ref data method, which returns a + pointer to the internal \ref QCPFinancialData. + + \see removeData +*/ +void QCPFinancial::addData(double key, double open, double high, double low, double close) +{ + mData->insertMulti(key, QCPFinancialData(key, open, high, low, close)); +} + +/*! \overload + + Adds the provided open/high/low/close data to the current data. + + Alternatively, you can also access and modify the data via the \ref data method, which returns a + pointer to the internal \ref QCPFinancialData. + + \see removeData +*/ +void QCPFinancial::addData(const QVector &key, const QVector &open, const QVector &high, const QVector &low, const QVector &close) +{ + int n = key.size(); + n = qMin(n, open.size()); + n = qMin(n, high.size()); + n = qMin(n, low.size()); + n = qMin(n, close.size()); + for (int i=0; iinsertMulti(key[i], QCPFinancialData(key[i], open[i], high[i], low[i], close[i])); + } +} + +/*! + Removes all data points with keys smaller than \a key. + + \see addData, clearData +*/ +void QCPFinancial::removeDataBefore(double key) +{ + QCPFinancialDataMap::iterator it = mData->begin(); + while (it != mData->end() && it.key() < key) + it = mData->erase(it); +} + +/*! + Removes all data points with keys greater than \a key. + + \see addData, clearData +*/ +void QCPFinancial::removeDataAfter(double key) +{ + if (mData->isEmpty()) return; + QCPFinancialDataMap::iterator it = mData->upperBound(key); + while (it != mData->end()) + it = mData->erase(it); +} + +/*! + Removes all data points with keys between \a fromKey and \a toKey. if \a fromKey is greater or + equal to \a toKey, the function does nothing. To remove a single data point with known key, use + \ref removeData(double key). + + \see addData, clearData +*/ +void QCPFinancial::removeData(double fromKey, double toKey) +{ + if (fromKey >= toKey || mData->isEmpty()) return; + QCPFinancialDataMap::iterator it = mData->upperBound(fromKey); + QCPFinancialDataMap::iterator itEnd = mData->upperBound(toKey); + while (it != itEnd) + it = mData->erase(it); +} + +/*! \overload + + Removes a single data point at \a key. If the position is not known with absolute precision, + consider using \ref removeData(double fromKey, double toKey) with a small fuzziness interval + around the suspected position, depeding on the precision with which the key is known. + + \see addData, clearData +*/ +void QCPFinancial::removeData(double key) +{ + mData->remove(key); +} + +/*! + Removes all data points. + + \see removeData, removeDataAfter, removeDataBefore +*/ +void QCPFinancial::clearData() +{ + mData->clear(); +} + +/* inherits documentation from base class */ +double QCPFinancial::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + if (onlySelectable && !mSelectable) + return -1; + if (!mKeyAxis || !mValueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return -1; } + + if (mKeyAxis.data()->axisRect()->rect().contains(pos.toPoint())) + { + // get visible data range: + QCPFinancialDataMap::const_iterator lower, upper; // note that upper is the actual upper point, and not 1 step after the upper point + getVisibleDataBounds(lower, upper); + if (lower == mData->constEnd() || upper == mData->constEnd()) + return -1; + // perform select test according to configured style: + switch (mChartStyle) + { + case QCPFinancial::csOhlc: + return ohlcSelectTest(pos, lower, upper+1); break; + case QCPFinancial::csCandlestick: + return candlestickSelectTest(pos, lower, upper+1); break; + } + } + return -1; +} + +/*! + A convenience function that converts time series data (\a value against \a time) to OHLC binned + data points. The return value can then be passed on to \ref setData. + + The size of the bins can be controlled with \a timeBinSize in the same units as \a time is given. + For example, if the unit of \a time is seconds and single OHLC/Candlesticks should span an hour + each, set \a timeBinSize to 3600. + + \a timeBinOffset allows to control precisely at what \a time coordinate a bin should start. The + value passed as \a timeBinOffset doesn't need to be in the range encompassed by the \a time keys. + It merely defines the mathematical offset/phase of the bins that will be used to process the + data. +*/ +QCPFinancialDataMap QCPFinancial::timeSeriesToOhlc(const QVector &time, const QVector &value, double timeBinSize, double timeBinOffset) +{ + QCPFinancialDataMap map; + int count = qMin(time.size(), value.size()); + if (count == 0) + return QCPFinancialDataMap(); + + QCPFinancialData currentBinData(0, value.first(), value.first(), value.first(), value.first()); + int currentBinIndex = qFloor((time.first()-timeBinOffset)/timeBinSize+0.5); + for (int i=0; i currentBinData.high) currentBinData.high = value.at(i); + if (i == count-1) // last data point is in current bin, finalize bin: + { + currentBinData.close = value.at(i); + currentBinData.key = timeBinOffset+(index)*timeBinSize; + map.insert(currentBinData.key, currentBinData); + } + } else // data point not anymore in current bin, set close of old and open of new bin, and add old to map: + { + // finalize current bin: + currentBinData.close = value.at(i-1); + currentBinData.key = timeBinOffset+(index-1)*timeBinSize; + map.insert(currentBinData.key, currentBinData); + // start next bin: + currentBinIndex = index; + currentBinData.open = value.at(i); + currentBinData.high = value.at(i); + currentBinData.low = value.at(i); + } + } + + return map; +} + +/* inherits documentation from base class */ +void QCPFinancial::draw(QCPPainter *painter) +{ + // get visible data range: + QCPFinancialDataMap::const_iterator lower, upper; // note that upper is the actual upper point, and not 1 step after the upper point + getVisibleDataBounds(lower, upper); + if (lower == mData->constEnd() || upper == mData->constEnd()) + return; + + // draw visible data range according to configured style: + switch (mChartStyle) + { + case QCPFinancial::csOhlc: + drawOhlcPlot(painter, lower, upper+1); break; + case QCPFinancial::csCandlestick: + drawCandlestickPlot(painter, lower, upper+1); break; + } +} + +/* inherits documentation from base class */ +void QCPFinancial::drawLegendIcon(QCPPainter *painter, const QRectF &rect) const +{ + painter->setAntialiasing(false); // legend icon especially of csCandlestick looks better without antialiasing + if (mChartStyle == csOhlc) + { + if (mTwoColored) + { + // draw upper left half icon with positive color: + painter->setBrush(mBrushPositive); + painter->setPen(mPenPositive); + painter->setClipRegion(QRegion(QPolygon() << rect.bottomLeft().toPoint() << rect.topRight().toPoint() << rect.topLeft().toPoint())); + painter->drawLine(QLineF(0, rect.height()*0.5, rect.width(), rect.height()*0.5).translated(rect.topLeft())); + painter->drawLine(QLineF(rect.width()*0.2, rect.height()*0.3, rect.width()*0.2, rect.height()*0.5).translated(rect.topLeft())); + painter->drawLine(QLineF(rect.width()*0.8, rect.height()*0.5, rect.width()*0.8, rect.height()*0.7).translated(rect.topLeft())); + // draw bottom right hald icon with negative color: + painter->setBrush(mBrushNegative); + painter->setPen(mPenNegative); + painter->setClipRegion(QRegion(QPolygon() << rect.bottomLeft().toPoint() << rect.topRight().toPoint() << rect.bottomRight().toPoint())); + painter->drawLine(QLineF(0, rect.height()*0.5, rect.width(), rect.height()*0.5).translated(rect.topLeft())); + painter->drawLine(QLineF(rect.width()*0.2, rect.height()*0.3, rect.width()*0.2, rect.height()*0.5).translated(rect.topLeft())); + painter->drawLine(QLineF(rect.width()*0.8, rect.height()*0.5, rect.width()*0.8, rect.height()*0.7).translated(rect.topLeft())); + } else + { + painter->setBrush(mBrush); + painter->setPen(mPen); + painter->drawLine(QLineF(0, rect.height()*0.5, rect.width(), rect.height()*0.5).translated(rect.topLeft())); + painter->drawLine(QLineF(rect.width()*0.2, rect.height()*0.3, rect.width()*0.2, rect.height()*0.5).translated(rect.topLeft())); + painter->drawLine(QLineF(rect.width()*0.8, rect.height()*0.5, rect.width()*0.8, rect.height()*0.7).translated(rect.topLeft())); + } + } else if (mChartStyle == csCandlestick) + { + if (mTwoColored) + { + // draw upper left half icon with positive color: + painter->setBrush(mBrushPositive); + painter->setPen(mPenPositive); + painter->setClipRegion(QRegion(QPolygon() << rect.bottomLeft().toPoint() << rect.topRight().toPoint() << rect.topLeft().toPoint())); + painter->drawLine(QLineF(0, rect.height()*0.5, rect.width()*0.25, rect.height()*0.5).translated(rect.topLeft())); + painter->drawLine(QLineF(rect.width()*0.75, rect.height()*0.5, rect.width(), rect.height()*0.5).translated(rect.topLeft())); + painter->drawRect(QRectF(rect.width()*0.25, rect.height()*0.25, rect.width()*0.5, rect.height()*0.5).translated(rect.topLeft())); + // draw bottom right hald icon with negative color: + painter->setBrush(mBrushNegative); + painter->setPen(mPenNegative); + painter->setClipRegion(QRegion(QPolygon() << rect.bottomLeft().toPoint() << rect.topRight().toPoint() << rect.bottomRight().toPoint())); + painter->drawLine(QLineF(0, rect.height()*0.5, rect.width()*0.25, rect.height()*0.5).translated(rect.topLeft())); + painter->drawLine(QLineF(rect.width()*0.75, rect.height()*0.5, rect.width(), rect.height()*0.5).translated(rect.topLeft())); + painter->drawRect(QRectF(rect.width()*0.25, rect.height()*0.25, rect.width()*0.5, rect.height()*0.5).translated(rect.topLeft())); + } else + { + painter->setBrush(mBrush); + painter->setPen(mPen); + painter->drawLine(QLineF(0, rect.height()*0.5, rect.width()*0.25, rect.height()*0.5).translated(rect.topLeft())); + painter->drawLine(QLineF(rect.width()*0.75, rect.height()*0.5, rect.width(), rect.height()*0.5).translated(rect.topLeft())); + painter->drawRect(QRectF(rect.width()*0.25, rect.height()*0.25, rect.width()*0.5, rect.height()*0.5).translated(rect.topLeft())); + } + } +} + +/* inherits documentation from base class */ +QCPRange QCPFinancial::getKeyRange(bool &foundRange, QCPAbstractPlottable::SignDomain inSignDomain) const +{ + QCPRange range; + bool haveLower = false; + bool haveUpper = false; + + double current; + QCPFinancialDataMap::const_iterator it = mData->constBegin(); + while (it != mData->constEnd()) + { + current = it.value().key; + if (inSignDomain == sdBoth || (inSignDomain == sdNegative && current < 0) || (inSignDomain == sdPositive && current > 0)) + { + if (current < range.lower || !haveLower) + { + range.lower = current; + haveLower = true; + } + if (current > range.upper || !haveUpper) + { + range.upper = current; + haveUpper = true; + } + } + ++it; + } + // determine exact range by including width of bars/flags: + if (haveLower && mKeyAxis) + range.lower = range.lower-mWidth*0.5; + if (haveUpper && mKeyAxis) + range.upper = range.upper+mWidth*0.5; + foundRange = haveLower && haveUpper; + return range; +} + +/* inherits documentation from base class */ +QCPRange QCPFinancial::getValueRange(bool &foundRange, QCPAbstractPlottable::SignDomain inSignDomain) const +{ + QCPRange range; + bool haveLower = false; + bool haveUpper = false; + + QCPFinancialDataMap::const_iterator it = mData->constBegin(); + while (it != mData->constEnd()) + { + // high: + if (inSignDomain == sdBoth || (inSignDomain == sdNegative && it.value().high < 0) || (inSignDomain == sdPositive && it.value().high > 0)) + { + if (it.value().high < range.lower || !haveLower) + { + range.lower = it.value().high; + haveLower = true; + } + if (it.value().high > range.upper || !haveUpper) + { + range.upper = it.value().high; + haveUpper = true; + } + } + // low: + if (inSignDomain == sdBoth || (inSignDomain == sdNegative && it.value().low < 0) || (inSignDomain == sdPositive && it.value().low > 0)) + { + if (it.value().low < range.lower || !haveLower) + { + range.lower = it.value().low; + haveLower = true; + } + if (it.value().low > range.upper || !haveUpper) + { + range.upper = it.value().low; + haveUpper = true; + } + } + ++it; + } + + foundRange = haveLower && haveUpper; + return range; +} + +/*! \internal + + Draws the data from \a begin to \a end as OHLC bars with the provided \a painter. + + This method is a helper function for \ref draw. It is used when the chart style is \ref csOhlc. +*/ +void QCPFinancial::drawOhlcPlot(QCPPainter *painter, const QCPFinancialDataMap::const_iterator &begin, const QCPFinancialDataMap::const_iterator &end) +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } + + QPen linePen; + + if (keyAxis->orientation() == Qt::Horizontal) + { + for (QCPFinancialDataMap::const_iterator it = begin; it != end; ++it) + { + if (mSelected) + linePen = mSelectedPen; + else if (mTwoColored) + linePen = it.value().close >= it.value().open ? mPenPositive : mPenNegative; + else + linePen = mPen; + painter->setPen(linePen); + double keyPixel = keyAxis->coordToPixel(it.value().key); + double openPixel = valueAxis->coordToPixel(it.value().open); + double closePixel = valueAxis->coordToPixel(it.value().close); + // draw backbone: + painter->drawLine(QPointF(keyPixel, valueAxis->coordToPixel(it.value().high)), QPointF(keyPixel, valueAxis->coordToPixel(it.value().low))); + // draw open: + double keyWidthPixels = keyPixel-keyAxis->coordToPixel(it.value().key-mWidth*0.5); // sign of this makes sure open/close are on correct sides + painter->drawLine(QPointF(keyPixel-keyWidthPixels, openPixel), QPointF(keyPixel, openPixel)); + // draw close: + painter->drawLine(QPointF(keyPixel, closePixel), QPointF(keyPixel+keyWidthPixels, closePixel)); + } + } else + { + for (QCPFinancialDataMap::const_iterator it = begin; it != end; ++it) + { + if (mSelected) + linePen = mSelectedPen; + else if (mTwoColored) + linePen = it.value().close >= it.value().open ? mPenPositive : mPenNegative; + else + linePen = mPen; + painter->setPen(linePen); + double keyPixel = keyAxis->coordToPixel(it.value().key); + double openPixel = valueAxis->coordToPixel(it.value().open); + double closePixel = valueAxis->coordToPixel(it.value().close); + // draw backbone: + painter->drawLine(QPointF(valueAxis->coordToPixel(it.value().high), keyPixel), QPointF(valueAxis->coordToPixel(it.value().low), keyPixel)); + // draw open: + double keyWidthPixels = keyPixel-keyAxis->coordToPixel(it.value().key-mWidth*0.5); // sign of this makes sure open/close are on correct sides + painter->drawLine(QPointF(openPixel, keyPixel-keyWidthPixels), QPointF(openPixel, keyPixel)); + // draw close: + painter->drawLine(QPointF(closePixel, keyPixel), QPointF(closePixel, keyPixel+keyWidthPixels)); + } + } +} + +/*! \internal + + Draws the data from \a begin to \a end as Candlesticks with the provided \a painter. + + This method is a helper function for \ref draw. It is used when the chart style is \ref csCandlestick. +*/ +void QCPFinancial::drawCandlestickPlot(QCPPainter *painter, const QCPFinancialDataMap::const_iterator &begin, const QCPFinancialDataMap::const_iterator &end) +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return; } + + QPen linePen; + QBrush boxBrush; + + if (keyAxis->orientation() == Qt::Horizontal) + { + for (QCPFinancialDataMap::const_iterator it = begin; it != end; ++it) + { + if (mSelected) + { + linePen = mSelectedPen; + boxBrush = mSelectedBrush; + } else if (mTwoColored) + { + if (it.value().close >= it.value().open) + { + linePen = mPenPositive; + boxBrush = mBrushPositive; + } else + { + linePen = mPenNegative; + boxBrush = mBrushNegative; + } + } else + { + linePen = mPen; + boxBrush = mBrush; + } + painter->setPen(linePen); + painter->setBrush(boxBrush); + double keyPixel = keyAxis->coordToPixel(it.value().key); + double openPixel = valueAxis->coordToPixel(it.value().open); + double closePixel = valueAxis->coordToPixel(it.value().close); + // draw high: + painter->drawLine(QPointF(keyPixel, valueAxis->coordToPixel(it.value().high)), QPointF(keyPixel, valueAxis->coordToPixel(qMax(it.value().open, it.value().close)))); + // draw low: + painter->drawLine(QPointF(keyPixel, valueAxis->coordToPixel(it.value().low)), QPointF(keyPixel, valueAxis->coordToPixel(qMin(it.value().open, it.value().close)))); + // draw open-close box: + double keyWidthPixels = keyPixel-keyAxis->coordToPixel(it.value().key-mWidth*0.5); + painter->drawRect(QRectF(QPointF(keyPixel-keyWidthPixels, closePixel), QPointF(keyPixel+keyWidthPixels, openPixel))); + } + } else // keyAxis->orientation() == Qt::Vertical + { + for (QCPFinancialDataMap::const_iterator it = begin; it != end; ++it) + { + if (mSelected) + { + linePen = mSelectedPen; + boxBrush = mSelectedBrush; + } else if (mTwoColored) + { + if (it.value().close >= it.value().open) + { + linePen = mPenPositive; + boxBrush = mBrushPositive; + } else + { + linePen = mPenNegative; + boxBrush = mBrushNegative; + } + } else + { + linePen = mPen; + boxBrush = mBrush; + } + painter->setPen(linePen); + painter->setBrush(boxBrush); + double keyPixel = keyAxis->coordToPixel(it.value().key); + double openPixel = valueAxis->coordToPixel(it.value().open); + double closePixel = valueAxis->coordToPixel(it.value().close); + // draw high: + painter->drawLine(QPointF(valueAxis->coordToPixel(it.value().high), keyPixel), QPointF(valueAxis->coordToPixel(qMax(it.value().open, it.value().close)), keyPixel)); + // draw low: + painter->drawLine(QPointF(valueAxis->coordToPixel(it.value().low), keyPixel), QPointF(valueAxis->coordToPixel(qMin(it.value().open, it.value().close)), keyPixel)); + // draw open-close box: + double keyWidthPixels = keyPixel-keyAxis->coordToPixel(it.value().key-mWidth*0.5); + painter->drawRect(QRectF(QPointF(closePixel, keyPixel-keyWidthPixels), QPointF(openPixel, keyPixel+keyWidthPixels))); + } + } +} + +/*! \internal + + This method is a helper function for \ref selectTest. It is used to test for selection when the + chart style is \ref csOhlc. It only tests against the data points between \a begin and \a end. +*/ +double QCPFinancial::ohlcSelectTest(const QPointF &pos, const QCPFinancialDataMap::const_iterator &begin, const QCPFinancialDataMap::const_iterator &end) const +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return -1; } + + double minDistSqr = std::numeric_limits::max(); + QCPFinancialDataMap::const_iterator it; + if (keyAxis->orientation() == Qt::Horizontal) + { + for (it = begin; it != end; ++it) + { + double keyPixel = keyAxis->coordToPixel(it.value().key); + // calculate distance to backbone: + double currentDistSqr = distSqrToLine(QPointF(keyPixel, valueAxis->coordToPixel(it.value().high)), QPointF(keyPixel, valueAxis->coordToPixel(it.value().low)), pos); + if (currentDistSqr < minDistSqr) + minDistSqr = currentDistSqr; + } + } else // keyAxis->orientation() == Qt::Vertical + { + for (it = begin; it != end; ++it) + { + double keyPixel = keyAxis->coordToPixel(it.value().key); + // calculate distance to backbone: + double currentDistSqr = distSqrToLine(QPointF(valueAxis->coordToPixel(it.value().high), keyPixel), QPointF(valueAxis->coordToPixel(it.value().low), keyPixel), pos); + if (currentDistSqr < minDistSqr) + minDistSqr = currentDistSqr; + } + } + return qSqrt(minDistSqr); +} + +/*! \internal + + This method is a helper function for \ref selectTest. It is used to test for selection when the + chart style is \ref csCandlestick. It only tests against the data points between \a begin and \a + end. +*/ +double QCPFinancial::candlestickSelectTest(const QPointF &pos, const QCPFinancialDataMap::const_iterator &begin, const QCPFinancialDataMap::const_iterator &end) const +{ + QCPAxis *keyAxis = mKeyAxis.data(); + QCPAxis *valueAxis = mValueAxis.data(); + if (!keyAxis || !valueAxis) { qDebug() << Q_FUNC_INFO << "invalid key or value axis"; return -1; } + + double minDistSqr = std::numeric_limits::max(); + QCPFinancialDataMap::const_iterator it; + if (keyAxis->orientation() == Qt::Horizontal) + { + for (it = begin; it != end; ++it) + { + double currentDistSqr; + // determine whether pos is in open-close-box: + QCPRange boxKeyRange(it.value().key-mWidth*0.5, it.value().key+mWidth*0.5); + QCPRange boxValueRange(it.value().close, it.value().open); + double posKey, posValue; + pixelsToCoords(pos, posKey, posValue); + if (boxKeyRange.contains(posKey) && boxValueRange.contains(posValue)) // is in open-close-box + { + currentDistSqr = mParentPlot->selectionTolerance()*0.99 * mParentPlot->selectionTolerance()*0.99; + } else + { + // calculate distance to high/low lines: + double keyPixel = keyAxis->coordToPixel(it.value().key); + double highLineDistSqr = distSqrToLine(QPointF(keyPixel, valueAxis->coordToPixel(it.value().high)), QPointF(keyPixel, valueAxis->coordToPixel(qMax(it.value().open, it.value().close))), pos); + double lowLineDistSqr = distSqrToLine(QPointF(keyPixel, valueAxis->coordToPixel(it.value().low)), QPointF(keyPixel, valueAxis->coordToPixel(qMin(it.value().open, it.value().close))), pos); + currentDistSqr = qMin(highLineDistSqr, lowLineDistSqr); + } + if (currentDistSqr < minDistSqr) + minDistSqr = currentDistSqr; + } + } else // keyAxis->orientation() == Qt::Vertical + { + for (it = begin; it != end; ++it) + { + double currentDistSqr; + // determine whether pos is in open-close-box: + QCPRange boxKeyRange(it.value().key-mWidth*0.5, it.value().key+mWidth*0.5); + QCPRange boxValueRange(it.value().close, it.value().open); + double posKey, posValue; + pixelsToCoords(pos, posKey, posValue); + if (boxKeyRange.contains(posKey) && boxValueRange.contains(posValue)) // is in open-close-box + { + currentDistSqr = mParentPlot->selectionTolerance()*0.99 * mParentPlot->selectionTolerance()*0.99; + } else + { + // calculate distance to high/low lines: + double keyPixel = keyAxis->coordToPixel(it.value().key); + double highLineDistSqr = distSqrToLine(QPointF(valueAxis->coordToPixel(it.value().high), keyPixel), QPointF(valueAxis->coordToPixel(qMax(it.value().open, it.value().close)), keyPixel), pos); + double lowLineDistSqr = distSqrToLine(QPointF(valueAxis->coordToPixel(it.value().low), keyPixel), QPointF(valueAxis->coordToPixel(qMin(it.value().open, it.value().close)), keyPixel), pos); + currentDistSqr = qMin(highLineDistSqr, lowLineDistSqr); + } + if (currentDistSqr < minDistSqr) + minDistSqr = currentDistSqr; + } + } + return qSqrt(minDistSqr); +} + +/*! \internal + + called by the drawing methods to determine which data (key) range is visible at the current key + axis range setting, so only that needs to be processed. + + \a lower returns an iterator to the lowest data point that needs to be taken into account when + plotting. Note that in order to get a clean plot all the way to the edge of the axis rect, \a + lower may still be just outside the visible range. + + \a upper returns an iterator to the highest data point. Same as before, \a upper may also lie + just outside of the visible range. + + if the plottable contains no data, both \a lower and \a upper point to constEnd. + + \see QCPGraph::getVisibleDataBounds +*/ +void QCPFinancial::getVisibleDataBounds(QCPFinancialDataMap::const_iterator &lower, QCPFinancialDataMap::const_iterator &upper) const +{ + if (!mKeyAxis) { qDebug() << Q_FUNC_INFO << "invalid key axis"; return; } + if (mData->isEmpty()) + { + lower = mData->constEnd(); + upper = mData->constEnd(); + return; + } + + // get visible data range as QMap iterators + QCPFinancialDataMap::const_iterator lbound = mData->lowerBound(mKeyAxis.data()->range().lower); + QCPFinancialDataMap::const_iterator ubound = mData->upperBound(mKeyAxis.data()->range().upper); + bool lowoutlier = lbound != mData->constBegin(); // indicates whether there exist points below axis range + bool highoutlier = ubound != mData->constEnd(); // indicates whether there exist points above axis range + + lower = (lowoutlier ? lbound-1 : lbound); // data point range that will be actually drawn + upper = (highoutlier ? ubound : ubound-1); // data point range that will be actually drawn +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPItemStraightLine +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPItemStraightLine + \brief A straight line that spans infinitely in both directions + + \image html QCPItemStraightLine.png "Straight line example. Blue dotted circles are anchors, solid blue discs are positions." + + It has two positions, \a point1 and \a point2, which define the straight line. +*/ + +/*! + Creates a straight line item and sets default values. + + The constructed item can be added to the plot with QCustomPlot::addItem. +*/ +QCPItemStraightLine::QCPItemStraightLine(QCustomPlot *parentPlot) : + QCPAbstractItem(parentPlot), + point1(createPosition(QLatin1String("point1"))), + point2(createPosition(QLatin1String("point2"))) +{ + point1->setCoords(0, 0); + point2->setCoords(1, 1); + + setPen(QPen(Qt::black)); + setSelectedPen(QPen(Qt::blue,2)); +} + +QCPItemStraightLine::~QCPItemStraightLine() +{ +} + +/*! + Sets the pen that will be used to draw the line + + \see setSelectedPen +*/ +void QCPItemStraightLine::setPen(const QPen &pen) +{ + mPen = pen; +} + +/*! + Sets the pen that will be used to draw the line when selected + + \see setPen, setSelected +*/ +void QCPItemStraightLine::setSelectedPen(const QPen &pen) +{ + mSelectedPen = pen; +} + +/* inherits documentation from base class */ +double QCPItemStraightLine::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + if (onlySelectable && !mSelectable) + return -1; + + return distToStraightLine(QVector2D(point1->pixelPoint()), QVector2D(point2->pixelPoint()-point1->pixelPoint()), QVector2D(pos)); +} + +/* inherits documentation from base class */ +void QCPItemStraightLine::draw(QCPPainter *painter) +{ + QVector2D start(point1->pixelPoint()); + QVector2D end(point2->pixelPoint()); + // get visible segment of straight line inside clipRect: + double clipPad = mainPen().widthF(); + QLineF line = getRectClippedStraightLine(start, end-start, clipRect().adjusted(-clipPad, -clipPad, clipPad, clipPad)); + // paint visible segment, if existent: + if (!line.isNull()) + { + painter->setPen(mainPen()); + painter->drawLine(line); + } +} + +/*! \internal + + finds the shortest distance of \a point to the straight line defined by the base point \a + base and the direction vector \a vec. + + This is a helper function for \ref selectTest. +*/ +double QCPItemStraightLine::distToStraightLine(const QVector2D &base, const QVector2D &vec, const QVector2D &point) const +{ + return qAbs((base.y()-point.y())*vec.x()-(base.x()-point.x())*vec.y())/vec.length(); +} + +/*! \internal + + Returns the section of the straight line defined by \a base and direction vector \a + vec, that is visible in the specified \a rect. + + This is a helper function for \ref draw. +*/ +QLineF QCPItemStraightLine::getRectClippedStraightLine(const QVector2D &base, const QVector2D &vec, const QRect &rect) const +{ + double bx, by; + double gamma; + QLineF result; + if (vec.x() == 0 && vec.y() == 0) + return result; + if (qFuzzyIsNull(vec.x())) // line is vertical + { + // check top of rect: + bx = rect.left(); + by = rect.top(); + gamma = base.x()-bx + (by-base.y())*vec.x()/vec.y(); + if (gamma >= 0 && gamma <= rect.width()) + result.setLine(bx+gamma, rect.top(), bx+gamma, rect.bottom()); // no need to check bottom because we know line is vertical + } else if (qFuzzyIsNull(vec.y())) // line is horizontal + { + // check left of rect: + bx = rect.left(); + by = rect.top(); + gamma = base.y()-by + (bx-base.x())*vec.y()/vec.x(); + if (gamma >= 0 && gamma <= rect.height()) + result.setLine(rect.left(), by+gamma, rect.right(), by+gamma); // no need to check right because we know line is horizontal + } else // line is skewed + { + QList pointVectors; + // check top of rect: + bx = rect.left(); + by = rect.top(); + gamma = base.x()-bx + (by-base.y())*vec.x()/vec.y(); + if (gamma >= 0 && gamma <= rect.width()) + pointVectors.append(QVector2D(bx+gamma, by)); + // check bottom of rect: + bx = rect.left(); + by = rect.bottom(); + gamma = base.x()-bx + (by-base.y())*vec.x()/vec.y(); + if (gamma >= 0 && gamma <= rect.width()) + pointVectors.append(QVector2D(bx+gamma, by)); + // check left of rect: + bx = rect.left(); + by = rect.top(); + gamma = base.y()-by + (bx-base.x())*vec.y()/vec.x(); + if (gamma >= 0 && gamma <= rect.height()) + pointVectors.append(QVector2D(bx, by+gamma)); + // check right of rect: + bx = rect.right(); + by = rect.top(); + gamma = base.y()-by + (bx-base.x())*vec.y()/vec.x(); + if (gamma >= 0 && gamma <= rect.height()) + pointVectors.append(QVector2D(bx, by+gamma)); + + // evaluate points: + if (pointVectors.size() == 2) + { + result.setPoints(pointVectors.at(0).toPointF(), pointVectors.at(1).toPointF()); + } else if (pointVectors.size() > 2) + { + // line probably goes through corner of rect, and we got two points there. single out the point pair with greatest distance: + double distSqrMax = 0; + QVector2D pv1, pv2; + for (int i=0; i distSqrMax) + { + pv1 = pointVectors.at(i); + pv2 = pointVectors.at(k); + distSqrMax = distSqr; + } + } + } + result.setPoints(pv1.toPointF(), pv2.toPointF()); + } + } + return result; +} + +/*! \internal + + Returns the pen that should be used for drawing lines. Returns mPen when the + item is not selected and mSelectedPen when it is. +*/ +QPen QCPItemStraightLine::mainPen() const +{ + return mSelected ? mSelectedPen : mPen; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPItemLine +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPItemLine + \brief A line from one point to another + + \image html QCPItemLine.png "Line example. Blue dotted circles are anchors, solid blue discs are positions." + + It has two positions, \a start and \a end, which define the end points of the line. + + With \ref setHead and \ref setTail you may set different line ending styles, e.g. to create an arrow. +*/ + +/*! + Creates a line item and sets default values. + + The constructed item can be added to the plot with QCustomPlot::addItem. +*/ +QCPItemLine::QCPItemLine(QCustomPlot *parentPlot) : + QCPAbstractItem(parentPlot), + start(createPosition(QLatin1String("start"))), + end(createPosition(QLatin1String("end"))) +{ + start->setCoords(0, 0); + end->setCoords(1, 1); + + setPen(QPen(Qt::black)); + setSelectedPen(QPen(Qt::blue,2)); +} + +QCPItemLine::~QCPItemLine() +{ +} + +/*! + Sets the pen that will be used to draw the line + + \see setSelectedPen +*/ +void QCPItemLine::setPen(const QPen &pen) +{ + mPen = pen; +} + +/*! + Sets the pen that will be used to draw the line when selected + + \see setPen, setSelected +*/ +void QCPItemLine::setSelectedPen(const QPen &pen) +{ + mSelectedPen = pen; +} + +/*! + Sets the line ending style of the head. The head corresponds to the \a end position. + + Note that due to the overloaded QCPLineEnding constructor, you may directly specify + a QCPLineEnding::EndingStyle here, e.g. \code setHead(QCPLineEnding::esSpikeArrow) \endcode + + \see setTail +*/ +void QCPItemLine::setHead(const QCPLineEnding &head) +{ + mHead = head; +} + +/*! + Sets the line ending style of the tail. The tail corresponds to the \a start position. + + Note that due to the overloaded QCPLineEnding constructor, you may directly specify + a QCPLineEnding::EndingStyle here, e.g. \code setTail(QCPLineEnding::esSpikeArrow) \endcode + + \see setHead +*/ +void QCPItemLine::setTail(const QCPLineEnding &tail) +{ + mTail = tail; +} + +/* inherits documentation from base class */ +double QCPItemLine::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + if (onlySelectable && !mSelectable) + return -1; + + return qSqrt(distSqrToLine(start->pixelPoint(), end->pixelPoint(), pos)); +} + +/* inherits documentation from base class */ +void QCPItemLine::draw(QCPPainter *painter) +{ + QVector2D startVec(start->pixelPoint()); + QVector2D endVec(end->pixelPoint()); + if (startVec.toPoint() == endVec.toPoint()) + return; + // get visible segment of straight line inside clipRect: + double clipPad = qMax(mHead.boundingDistance(), mTail.boundingDistance()); + clipPad = qMax(clipPad, (double)mainPen().widthF()); + QLineF line = getRectClippedLine(startVec, endVec, clipRect().adjusted(-clipPad, -clipPad, clipPad, clipPad)); + // paint visible segment, if existent: + if (!line.isNull()) + { + painter->setPen(mainPen()); + painter->drawLine(line); + painter->setBrush(Qt::SolidPattern); + if (mTail.style() != QCPLineEnding::esNone) + mTail.draw(painter, startVec, startVec-endVec); + if (mHead.style() != QCPLineEnding::esNone) + mHead.draw(painter, endVec, endVec-startVec); + } +} + +/*! \internal + + Returns the section of the line defined by \a start and \a end, that is visible in the specified + \a rect. + + This is a helper function for \ref draw. +*/ +QLineF QCPItemLine::getRectClippedLine(const QVector2D &start, const QVector2D &end, const QRect &rect) const +{ + bool containsStart = rect.contains(start.x(), start.y()); + bool containsEnd = rect.contains(end.x(), end.y()); + if (containsStart && containsEnd) + return QLineF(start.toPointF(), end.toPointF()); + + QVector2D base = start; + QVector2D vec = end-start; + double bx, by; + double gamma, mu; + QLineF result; + QList pointVectors; + + if (!qFuzzyIsNull(vec.y())) // line is not horizontal + { + // check top of rect: + bx = rect.left(); + by = rect.top(); + mu = (by-base.y())/vec.y(); + if (mu >= 0 && mu <= 1) + { + gamma = base.x()-bx + mu*vec.x(); + if (gamma >= 0 && gamma <= rect.width()) + pointVectors.append(QVector2D(bx+gamma, by)); + } + // check bottom of rect: + bx = rect.left(); + by = rect.bottom(); + mu = (by-base.y())/vec.y(); + if (mu >= 0 && mu <= 1) + { + gamma = base.x()-bx + mu*vec.x(); + if (gamma >= 0 && gamma <= rect.width()) + pointVectors.append(QVector2D(bx+gamma, by)); + } + } + if (!qFuzzyIsNull(vec.x())) // line is not vertical + { + // check left of rect: + bx = rect.left(); + by = rect.top(); + mu = (bx-base.x())/vec.x(); + if (mu >= 0 && mu <= 1) + { + gamma = base.y()-by + mu*vec.y(); + if (gamma >= 0 && gamma <= rect.height()) + pointVectors.append(QVector2D(bx, by+gamma)); + } + // check right of rect: + bx = rect.right(); + by = rect.top(); + mu = (bx-base.x())/vec.x(); + if (mu >= 0 && mu <= 1) + { + gamma = base.y()-by + mu*vec.y(); + if (gamma >= 0 && gamma <= rect.height()) + pointVectors.append(QVector2D(bx, by+gamma)); + } + } + + if (containsStart) + pointVectors.append(start); + if (containsEnd) + pointVectors.append(end); + + // evaluate points: + if (pointVectors.size() == 2) + { + result.setPoints(pointVectors.at(0).toPointF(), pointVectors.at(1).toPointF()); + } else if (pointVectors.size() > 2) + { + // line probably goes through corner of rect, and we got two points there. single out the point pair with greatest distance: + double distSqrMax = 0; + QVector2D pv1, pv2; + for (int i=0; i distSqrMax) + { + pv1 = pointVectors.at(i); + pv2 = pointVectors.at(k); + distSqrMax = distSqr; + } + } + } + result.setPoints(pv1.toPointF(), pv2.toPointF()); + } + return result; +} + +/*! \internal + + Returns the pen that should be used for drawing lines. Returns mPen when the + item is not selected and mSelectedPen when it is. +*/ +QPen QCPItemLine::mainPen() const +{ + return mSelected ? mSelectedPen : mPen; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPItemCurve +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPItemCurve + \brief A curved line from one point to another + + \image html QCPItemCurve.png "Curve example. Blue dotted circles are anchors, solid blue discs are positions." + + It has four positions, \a start and \a end, which define the end points of the line, and two + control points which define the direction the line exits from the start and the direction from + which it approaches the end: \a startDir and \a endDir. + + With \ref setHead and \ref setTail you may set different line ending styles, e.g. to create an + arrow. + + Often it is desirable for the control points to stay at fixed relative positions to the start/end + point. This can be achieved by setting the parent anchor e.g. of \a startDir simply to \a start, + and then specify the desired pixel offset with QCPItemPosition::setCoords on \a startDir. +*/ + +/*! + Creates a curve item and sets default values. + + The constructed item can be added to the plot with QCustomPlot::addItem. +*/ +QCPItemCurve::QCPItemCurve(QCustomPlot *parentPlot) : + QCPAbstractItem(parentPlot), + start(createPosition(QLatin1String("start"))), + startDir(createPosition(QLatin1String("startDir"))), + endDir(createPosition(QLatin1String("endDir"))), + end(createPosition(QLatin1String("end"))) +{ + start->setCoords(0, 0); + startDir->setCoords(0.5, 0); + endDir->setCoords(0, 0.5); + end->setCoords(1, 1); + + setPen(QPen(Qt::black)); + setSelectedPen(QPen(Qt::blue,2)); +} + +QCPItemCurve::~QCPItemCurve() +{ +} + +/*! + Sets the pen that will be used to draw the line + + \see setSelectedPen +*/ +void QCPItemCurve::setPen(const QPen &pen) +{ + mPen = pen; +} + +/*! + Sets the pen that will be used to draw the line when selected + + \see setPen, setSelected +*/ +void QCPItemCurve::setSelectedPen(const QPen &pen) +{ + mSelectedPen = pen; +} + +/*! + Sets the line ending style of the head. The head corresponds to the \a end position. + + Note that due to the overloaded QCPLineEnding constructor, you may directly specify + a QCPLineEnding::EndingStyle here, e.g. \code setHead(QCPLineEnding::esSpikeArrow) \endcode + + \see setTail +*/ +void QCPItemCurve::setHead(const QCPLineEnding &head) +{ + mHead = head; +} + +/*! + Sets the line ending style of the tail. The tail corresponds to the \a start position. + + Note that due to the overloaded QCPLineEnding constructor, you may directly specify + a QCPLineEnding::EndingStyle here, e.g. \code setTail(QCPLineEnding::esSpikeArrow) \endcode + + \see setHead +*/ +void QCPItemCurve::setTail(const QCPLineEnding &tail) +{ + mTail = tail; +} + +/* inherits documentation from base class */ +double QCPItemCurve::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + if (onlySelectable && !mSelectable) + return -1; + + QPointF startVec(start->pixelPoint()); + QPointF startDirVec(startDir->pixelPoint()); + QPointF endDirVec(endDir->pixelPoint()); + QPointF endVec(end->pixelPoint()); + + QPainterPath cubicPath(startVec); + cubicPath.cubicTo(startDirVec, endDirVec, endVec); + + QPolygonF polygon = cubicPath.toSubpathPolygons().first(); + double minDistSqr = std::numeric_limits::max(); + for (int i=1; ipixelPoint()); + QPointF startDirVec(startDir->pixelPoint()); + QPointF endDirVec(endDir->pixelPoint()); + QPointF endVec(end->pixelPoint()); + if (QVector2D(endVec-startVec).length() > 1e10f) // too large curves cause crash + return; + + QPainterPath cubicPath(startVec); + cubicPath.cubicTo(startDirVec, endDirVec, endVec); + + // paint visible segment, if existent: + QRect clip = clipRect().adjusted(-mainPen().widthF(), -mainPen().widthF(), mainPen().widthF(), mainPen().widthF()); + QRect cubicRect = cubicPath.controlPointRect().toRect(); + if (cubicRect.isEmpty()) // may happen when start and end exactly on same x or y position + cubicRect.adjust(0, 0, 1, 1); + if (clip.intersects(cubicRect)) + { + painter->setPen(mainPen()); + painter->drawPath(cubicPath); + painter->setBrush(Qt::SolidPattern); + if (mTail.style() != QCPLineEnding::esNone) + mTail.draw(painter, QVector2D(startVec), M_PI-cubicPath.angleAtPercent(0)/180.0*M_PI); + if (mHead.style() != QCPLineEnding::esNone) + mHead.draw(painter, QVector2D(endVec), -cubicPath.angleAtPercent(1)/180.0*M_PI); + } +} + +/*! \internal + + Returns the pen that should be used for drawing lines. Returns mPen when the + item is not selected and mSelectedPen when it is. +*/ +QPen QCPItemCurve::mainPen() const +{ + return mSelected ? mSelectedPen : mPen; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPItemRect +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPItemRect + \brief A rectangle + + \image html QCPItemRect.png "Rectangle example. Blue dotted circles are anchors, solid blue discs are positions." + + It has two positions, \a topLeft and \a bottomRight, which define the rectangle. +*/ + +/*! + Creates a rectangle item and sets default values. + + The constructed item can be added to the plot with QCustomPlot::addItem. +*/ +QCPItemRect::QCPItemRect(QCustomPlot *parentPlot) : + QCPAbstractItem(parentPlot), + topLeft(createPosition(QLatin1String("topLeft"))), + bottomRight(createPosition(QLatin1String("bottomRight"))), + top(createAnchor(QLatin1String("top"), aiTop)), + topRight(createAnchor(QLatin1String("topRight"), aiTopRight)), + right(createAnchor(QLatin1String("right"), aiRight)), + bottom(createAnchor(QLatin1String("bottom"), aiBottom)), + bottomLeft(createAnchor(QLatin1String("bottomLeft"), aiBottomLeft)), + left(createAnchor(QLatin1String("left"), aiLeft)) +{ + topLeft->setCoords(0, 1); + bottomRight->setCoords(1, 0); + + setPen(QPen(Qt::black)); + setSelectedPen(QPen(Qt::blue,2)); + setBrush(Qt::NoBrush); + setSelectedBrush(Qt::NoBrush); +} + +QCPItemRect::~QCPItemRect() +{ +} + +/*! + Sets the pen that will be used to draw the line of the rectangle + + \see setSelectedPen, setBrush +*/ +void QCPItemRect::setPen(const QPen &pen) +{ + mPen = pen; +} + +/*! + Sets the pen that will be used to draw the line of the rectangle when selected + + \see setPen, setSelected +*/ +void QCPItemRect::setSelectedPen(const QPen &pen) +{ + mSelectedPen = pen; +} + +/*! + Sets the brush that will be used to fill the rectangle. To disable filling, set \a brush to + Qt::NoBrush. + + \see setSelectedBrush, setPen +*/ +void QCPItemRect::setBrush(const QBrush &brush) +{ + mBrush = brush; +} + +/*! + Sets the brush that will be used to fill the rectangle when selected. To disable filling, set \a + brush to Qt::NoBrush. + + \see setBrush +*/ +void QCPItemRect::setSelectedBrush(const QBrush &brush) +{ + mSelectedBrush = brush; +} + +/* inherits documentation from base class */ +double QCPItemRect::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + if (onlySelectable && !mSelectable) + return -1; + + QRectF rect = QRectF(topLeft->pixelPoint(), bottomRight->pixelPoint()).normalized(); + bool filledRect = mBrush.style() != Qt::NoBrush && mBrush.color().alpha() != 0; + return rectSelectTest(rect, pos, filledRect); +} + +/* inherits documentation from base class */ +void QCPItemRect::draw(QCPPainter *painter) +{ + QPointF p1 = topLeft->pixelPoint(); + QPointF p2 = bottomRight->pixelPoint(); + if (p1.toPoint() == p2.toPoint()) + return; + QRectF rect = QRectF(p1, p2).normalized(); + double clipPad = mainPen().widthF(); + QRectF boundingRect = rect.adjusted(-clipPad, -clipPad, clipPad, clipPad); + if (boundingRect.intersects(clipRect())) // only draw if bounding rect of rect item is visible in cliprect + { + painter->setPen(mainPen()); + painter->setBrush(mainBrush()); + painter->drawRect(rect); + } +} + +/* inherits documentation from base class */ +QPointF QCPItemRect::anchorPixelPoint(int anchorId) const +{ + QRectF rect = QRectF(topLeft->pixelPoint(), bottomRight->pixelPoint()); + switch (anchorId) + { + case aiTop: return (rect.topLeft()+rect.topRight())*0.5; + case aiTopRight: return rect.topRight(); + case aiRight: return (rect.topRight()+rect.bottomRight())*0.5; + case aiBottom: return (rect.bottomLeft()+rect.bottomRight())*0.5; + case aiBottomLeft: return rect.bottomLeft(); + case aiLeft: return (rect.topLeft()+rect.bottomLeft())*0.5; + } + + qDebug() << Q_FUNC_INFO << "invalid anchorId" << anchorId; + return QPointF(); +} + +/*! \internal + + Returns the pen that should be used for drawing lines. Returns mPen when the item is not selected + and mSelectedPen when it is. +*/ +QPen QCPItemRect::mainPen() const +{ + return mSelected ? mSelectedPen : mPen; +} + +/*! \internal + + Returns the brush that should be used for drawing fills of the item. Returns mBrush when the item + is not selected and mSelectedBrush when it is. +*/ +QBrush QCPItemRect::mainBrush() const +{ + return mSelected ? mSelectedBrush : mBrush; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPItemText +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPItemText + \brief A text label + + \image html QCPItemText.png "Text example. Blue dotted circles are anchors, solid blue discs are positions." + + Its position is defined by the member \a position and the setting of \ref setPositionAlignment. + The latter controls which part of the text rect shall be aligned with \a position. + + The text alignment itself (i.e. left, center, right) can be controlled with \ref + setTextAlignment. + + The text may be rotated around the \a position point with \ref setRotation. +*/ + +/*! + Creates a text item and sets default values. + + The constructed item can be added to the plot with QCustomPlot::addItem. +*/ +QCPItemText::QCPItemText(QCustomPlot *parentPlot) : + QCPAbstractItem(parentPlot), + position(createPosition(QLatin1String("position"))), + topLeft(createAnchor(QLatin1String("topLeft"), aiTopLeft)), + top(createAnchor(QLatin1String("top"), aiTop)), + topRight(createAnchor(QLatin1String("topRight"), aiTopRight)), + right(createAnchor(QLatin1String("right"), aiRight)), + bottomRight(createAnchor(QLatin1String("bottomRight"), aiBottomRight)), + bottom(createAnchor(QLatin1String("bottom"), aiBottom)), + bottomLeft(createAnchor(QLatin1String("bottomLeft"), aiBottomLeft)), + left(createAnchor(QLatin1String("left"), aiLeft)) +{ + position->setCoords(0, 0); + + setRotation(0); + setTextAlignment(Qt::AlignTop|Qt::AlignHCenter); + setPositionAlignment(Qt::AlignCenter); + setText(QLatin1String("text")); + + setPen(Qt::NoPen); + setSelectedPen(Qt::NoPen); + setBrush(Qt::NoBrush); + setSelectedBrush(Qt::NoBrush); + setColor(Qt::black); + setSelectedColor(Qt::blue); +} + +QCPItemText::~QCPItemText() +{ +} + +/*! + Sets the color of the text. +*/ +void QCPItemText::setColor(const QColor &color) +{ + mColor = color; +} + +/*! + Sets the color of the text that will be used when the item is selected. +*/ +void QCPItemText::setSelectedColor(const QColor &color) +{ + mSelectedColor = color; +} + +/*! + Sets the pen that will be used do draw a rectangular border around the text. To disable the + border, set \a pen to Qt::NoPen. + + \see setSelectedPen, setBrush, setPadding +*/ +void QCPItemText::setPen(const QPen &pen) +{ + mPen = pen; +} + +/*! + Sets the pen that will be used do draw a rectangular border around the text, when the item is + selected. To disable the border, set \a pen to Qt::NoPen. + + \see setPen +*/ +void QCPItemText::setSelectedPen(const QPen &pen) +{ + mSelectedPen = pen; +} + +/*! + Sets the brush that will be used do fill the background of the text. To disable the + background, set \a brush to Qt::NoBrush. + + \see setSelectedBrush, setPen, setPadding +*/ +void QCPItemText::setBrush(const QBrush &brush) +{ + mBrush = brush; +} + +/*! + Sets the brush that will be used do fill the background of the text, when the item is selected. To disable the + background, set \a brush to Qt::NoBrush. + + \see setBrush +*/ +void QCPItemText::setSelectedBrush(const QBrush &brush) +{ + mSelectedBrush = brush; +} + +/*! + Sets the font of the text. + + \see setSelectedFont, setColor +*/ +void QCPItemText::setFont(const QFont &font) +{ + mFont = font; +} + +/*! + Sets the font of the text that will be used when the item is selected. + + \see setFont +*/ +void QCPItemText::setSelectedFont(const QFont &font) +{ + mSelectedFont = font; +} + +/*! + Sets the text that will be displayed. Multi-line texts are supported by inserting a line break + character, e.g. '\n'. + + \see setFont, setColor, setTextAlignment +*/ +void QCPItemText::setText(const QString &text) +{ + mText = text; +} + +/*! + Sets which point of the text rect shall be aligned with \a position. + + Examples: + \li If \a alignment is Qt::AlignHCenter | Qt::AlignTop, the text will be positioned such + that the top of the text rect will be horizontally centered on \a position. + \li If \a alignment is Qt::AlignLeft | Qt::AlignBottom, \a position will indicate the + bottom left corner of the text rect. + + If you want to control the alignment of (multi-lined) text within the text rect, use \ref + setTextAlignment. +*/ +void QCPItemText::setPositionAlignment(Qt::Alignment alignment) +{ + mPositionAlignment = alignment; +} + +/*! + Controls how (multi-lined) text is aligned inside the text rect (typically Qt::AlignLeft, Qt::AlignCenter or Qt::AlignRight). +*/ +void QCPItemText::setTextAlignment(Qt::Alignment alignment) +{ + mTextAlignment = alignment; +} + +/*! + Sets the angle in degrees by which the text (and the text rectangle, if visible) will be rotated + around \a position. +*/ +void QCPItemText::setRotation(double degrees) +{ + mRotation = degrees; +} + +/*! + Sets the distance between the border of the text rectangle and the text. The appearance (and + visibility) of the text rectangle can be controlled with \ref setPen and \ref setBrush. +*/ +void QCPItemText::setPadding(const QMargins &padding) +{ + mPadding = padding; +} + +/* inherits documentation from base class */ +double QCPItemText::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + if (onlySelectable && !mSelectable) + return -1; + + // The rect may be rotated, so we transform the actual clicked pos to the rotated + // coordinate system, so we can use the normal rectSelectTest function for non-rotated rects: + QPointF positionPixels(position->pixelPoint()); + QTransform inputTransform; + inputTransform.translate(positionPixels.x(), positionPixels.y()); + inputTransform.rotate(-mRotation); + inputTransform.translate(-positionPixels.x(), -positionPixels.y()); + QPointF rotatedPos = inputTransform.map(pos); + QFontMetrics fontMetrics(mFont); + QRect textRect = fontMetrics.boundingRect(0, 0, 0, 0, Qt::TextDontClip|mTextAlignment, mText); + QRect textBoxRect = textRect.adjusted(-mPadding.left(), -mPadding.top(), mPadding.right(), mPadding.bottom()); + QPointF textPos = getTextDrawPoint(positionPixels, textBoxRect, mPositionAlignment); + textBoxRect.moveTopLeft(textPos.toPoint()); + + return rectSelectTest(textBoxRect, rotatedPos, true); +} + +/* inherits documentation from base class */ +void QCPItemText::draw(QCPPainter *painter) +{ + QPointF pos(position->pixelPoint()); + QTransform transform = painter->transform(); + transform.translate(pos.x(), pos.y()); + if (!qFuzzyIsNull(mRotation)) + transform.rotate(mRotation); + painter->setFont(mainFont()); + QRect textRect = painter->fontMetrics().boundingRect(0, 0, 0, 0, Qt::TextDontClip|mTextAlignment, mText); + QRect textBoxRect = textRect.adjusted(-mPadding.left(), -mPadding.top(), mPadding.right(), mPadding.bottom()); + QPointF textPos = getTextDrawPoint(QPointF(0, 0), textBoxRect, mPositionAlignment); // 0, 0 because the transform does the translation + textRect.moveTopLeft(textPos.toPoint()+QPoint(mPadding.left(), mPadding.top())); + textBoxRect.moveTopLeft(textPos.toPoint()); + double clipPad = mainPen().widthF(); + QRect boundingRect = textBoxRect.adjusted(-clipPad, -clipPad, clipPad, clipPad); + if (transform.mapRect(boundingRect).intersects(painter->transform().mapRect(clipRect()))) + { + painter->setTransform(transform); + if ((mainBrush().style() != Qt::NoBrush && mainBrush().color().alpha() != 0) || + (mainPen().style() != Qt::NoPen && mainPen().color().alpha() != 0)) + { + painter->setPen(mainPen()); + painter->setBrush(mainBrush()); + painter->drawRect(textBoxRect); + } + painter->setBrush(Qt::NoBrush); + painter->setPen(QPen(mainColor())); + painter->drawText(textRect, Qt::TextDontClip|mTextAlignment, mText); + } +} + +/* inherits documentation from base class */ +QPointF QCPItemText::anchorPixelPoint(int anchorId) const +{ + // get actual rect points (pretty much copied from draw function): + QPointF pos(position->pixelPoint()); + QTransform transform; + transform.translate(pos.x(), pos.y()); + if (!qFuzzyIsNull(mRotation)) + transform.rotate(mRotation); + QFontMetrics fontMetrics(mainFont()); + QRect textRect = fontMetrics.boundingRect(0, 0, 0, 0, Qt::TextDontClip|mTextAlignment, mText); + QRectF textBoxRect = textRect.adjusted(-mPadding.left(), -mPadding.top(), mPadding.right(), mPadding.bottom()); + QPointF textPos = getTextDrawPoint(QPointF(0, 0), textBoxRect, mPositionAlignment); // 0, 0 because the transform does the translation + textBoxRect.moveTopLeft(textPos.toPoint()); + QPolygonF rectPoly = transform.map(QPolygonF(textBoxRect)); + + switch (anchorId) + { + case aiTopLeft: return rectPoly.at(0); + case aiTop: return (rectPoly.at(0)+rectPoly.at(1))*0.5; + case aiTopRight: return rectPoly.at(1); + case aiRight: return (rectPoly.at(1)+rectPoly.at(2))*0.5; + case aiBottomRight: return rectPoly.at(2); + case aiBottom: return (rectPoly.at(2)+rectPoly.at(3))*0.5; + case aiBottomLeft: return rectPoly.at(3); + case aiLeft: return (rectPoly.at(3)+rectPoly.at(0))*0.5; + } + + qDebug() << Q_FUNC_INFO << "invalid anchorId" << anchorId; + return QPointF(); +} + +/*! \internal + + Returns the point that must be given to the QPainter::drawText function (which expects the top + left point of the text rect), according to the position \a pos, the text bounding box \a rect and + the requested \a positionAlignment. + + For example, if \a positionAlignment is Qt::AlignLeft | Qt::AlignBottom the returned point + will be shifted upward by the height of \a rect, starting from \a pos. So if the text is finally + drawn at that point, the lower left corner of the resulting text rect is at \a pos. +*/ +QPointF QCPItemText::getTextDrawPoint(const QPointF &pos, const QRectF &rect, Qt::Alignment positionAlignment) const +{ + if (positionAlignment == 0 || positionAlignment == (Qt::AlignLeft|Qt::AlignTop)) + return pos; + + QPointF result = pos; // start at top left + if (positionAlignment.testFlag(Qt::AlignHCenter)) + result.rx() -= rect.width()/2.0; + else if (positionAlignment.testFlag(Qt::AlignRight)) + result.rx() -= rect.width(); + if (positionAlignment.testFlag(Qt::AlignVCenter)) + result.ry() -= rect.height()/2.0; + else if (positionAlignment.testFlag(Qt::AlignBottom)) + result.ry() -= rect.height(); + return result; +} + +/*! \internal + + Returns the font that should be used for drawing text. Returns mFont when the item is not selected + and mSelectedFont when it is. +*/ +QFont QCPItemText::mainFont() const +{ + return mSelected ? mSelectedFont : mFont; +} + +/*! \internal + + Returns the color that should be used for drawing text. Returns mColor when the item is not + selected and mSelectedColor when it is. +*/ +QColor QCPItemText::mainColor() const +{ + return mSelected ? mSelectedColor : mColor; +} + +/*! \internal + + Returns the pen that should be used for drawing lines. Returns mPen when the item is not selected + and mSelectedPen when it is. +*/ +QPen QCPItemText::mainPen() const +{ + return mSelected ? mSelectedPen : mPen; +} + +/*! \internal + + Returns the brush that should be used for drawing fills of the item. Returns mBrush when the item + is not selected and mSelectedBrush when it is. +*/ +QBrush QCPItemText::mainBrush() const +{ + return mSelected ? mSelectedBrush : mBrush; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPItemEllipse +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPItemEllipse + \brief An ellipse + + \image html QCPItemEllipse.png "Ellipse example. Blue dotted circles are anchors, solid blue discs are positions." + + It has two positions, \a topLeft and \a bottomRight, which define the rect the ellipse will be drawn in. +*/ + +/*! + Creates an ellipse item and sets default values. + + The constructed item can be added to the plot with QCustomPlot::addItem. +*/ +QCPItemEllipse::QCPItemEllipse(QCustomPlot *parentPlot) : + QCPAbstractItem(parentPlot), + topLeft(createPosition(QLatin1String("topLeft"))), + bottomRight(createPosition(QLatin1String("bottomRight"))), + topLeftRim(createAnchor(QLatin1String("topLeftRim"), aiTopLeftRim)), + top(createAnchor(QLatin1String("top"), aiTop)), + topRightRim(createAnchor(QLatin1String("topRightRim"), aiTopRightRim)), + right(createAnchor(QLatin1String("right"), aiRight)), + bottomRightRim(createAnchor(QLatin1String("bottomRightRim"), aiBottomRightRim)), + bottom(createAnchor(QLatin1String("bottom"), aiBottom)), + bottomLeftRim(createAnchor(QLatin1String("bottomLeftRim"), aiBottomLeftRim)), + left(createAnchor(QLatin1String("left"), aiLeft)), + center(createAnchor(QLatin1String("center"), aiCenter)) +{ + topLeft->setCoords(0, 1); + bottomRight->setCoords(1, 0); + + setPen(QPen(Qt::black)); + setSelectedPen(QPen(Qt::blue, 2)); + setBrush(Qt::NoBrush); + setSelectedBrush(Qt::NoBrush); +} + +QCPItemEllipse::~QCPItemEllipse() +{ +} + +/*! + Sets the pen that will be used to draw the line of the ellipse + + \see setSelectedPen, setBrush +*/ +void QCPItemEllipse::setPen(const QPen &pen) +{ + mPen = pen; +} + +/*! + Sets the pen that will be used to draw the line of the ellipse when selected + + \see setPen, setSelected +*/ +void QCPItemEllipse::setSelectedPen(const QPen &pen) +{ + mSelectedPen = pen; +} + +/*! + Sets the brush that will be used to fill the ellipse. To disable filling, set \a brush to + Qt::NoBrush. + + \see setSelectedBrush, setPen +*/ +void QCPItemEllipse::setBrush(const QBrush &brush) +{ + mBrush = brush; +} + +/*! + Sets the brush that will be used to fill the ellipse when selected. To disable filling, set \a + brush to Qt::NoBrush. + + \see setBrush +*/ +void QCPItemEllipse::setSelectedBrush(const QBrush &brush) +{ + mSelectedBrush = brush; +} + +/* inherits documentation from base class */ +double QCPItemEllipse::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + if (onlySelectable && !mSelectable) + return -1; + + double result = -1; + QPointF p1 = topLeft->pixelPoint(); + QPointF p2 = bottomRight->pixelPoint(); + QPointF center((p1+p2)/2.0); + double a = qAbs(p1.x()-p2.x())/2.0; + double b = qAbs(p1.y()-p2.y())/2.0; + double x = pos.x()-center.x(); + double y = pos.y()-center.y(); + + // distance to border: + double c = 1.0/qSqrt(x*x/(a*a)+y*y/(b*b)); + result = qAbs(c-1)*qSqrt(x*x+y*y); + // filled ellipse, allow click inside to count as hit: + if (result > mParentPlot->selectionTolerance()*0.99 && mBrush.style() != Qt::NoBrush && mBrush.color().alpha() != 0) + { + if (x*x/(a*a) + y*y/(b*b) <= 1) + result = mParentPlot->selectionTolerance()*0.99; + } + return result; +} + +/* inherits documentation from base class */ +void QCPItemEllipse::draw(QCPPainter *painter) +{ + QPointF p1 = topLeft->pixelPoint(); + QPointF p2 = bottomRight->pixelPoint(); + if (p1.toPoint() == p2.toPoint()) + return; + QRectF ellipseRect = QRectF(p1, p2).normalized(); + QRect clip = clipRect().adjusted(-mainPen().widthF(), -mainPen().widthF(), mainPen().widthF(), mainPen().widthF()); + if (ellipseRect.intersects(clip)) // only draw if bounding rect of ellipse is visible in cliprect + { + painter->setPen(mainPen()); + painter->setBrush(mainBrush()); +#ifdef __EXCEPTIONS + try // drawEllipse sometimes throws exceptions if ellipse is too big + { +#endif + painter->drawEllipse(ellipseRect); +#ifdef __EXCEPTIONS + } catch (...) + { + qDebug() << Q_FUNC_INFO << "Item too large for memory, setting invisible"; + setVisible(false); + } +#endif + } +} + +/* inherits documentation from base class */ +QPointF QCPItemEllipse::anchorPixelPoint(int anchorId) const +{ + QRectF rect = QRectF(topLeft->pixelPoint(), bottomRight->pixelPoint()); + switch (anchorId) + { + case aiTopLeftRim: return rect.center()+(rect.topLeft()-rect.center())*1/qSqrt(2); + case aiTop: return (rect.topLeft()+rect.topRight())*0.5; + case aiTopRightRim: return rect.center()+(rect.topRight()-rect.center())*1/qSqrt(2); + case aiRight: return (rect.topRight()+rect.bottomRight())*0.5; + case aiBottomRightRim: return rect.center()+(rect.bottomRight()-rect.center())*1/qSqrt(2); + case aiBottom: return (rect.bottomLeft()+rect.bottomRight())*0.5; + case aiBottomLeftRim: return rect.center()+(rect.bottomLeft()-rect.center())*1/qSqrt(2); + case aiLeft: return (rect.topLeft()+rect.bottomLeft())*0.5; + case aiCenter: return (rect.topLeft()+rect.bottomRight())*0.5; + } + + qDebug() << Q_FUNC_INFO << "invalid anchorId" << anchorId; + return QPointF(); +} + +/*! \internal + + Returns the pen that should be used for drawing lines. Returns mPen when the item is not selected + and mSelectedPen when it is. +*/ +QPen QCPItemEllipse::mainPen() const +{ + return mSelected ? mSelectedPen : mPen; +} + +/*! \internal + + Returns the brush that should be used for drawing fills of the item. Returns mBrush when the item + is not selected and mSelectedBrush when it is. +*/ +QBrush QCPItemEllipse::mainBrush() const +{ + return mSelected ? mSelectedBrush : mBrush; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPItemPixmap +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPItemPixmap + \brief An arbitrary pixmap + + \image html QCPItemPixmap.png "Pixmap example. Blue dotted circles are anchors, solid blue discs are positions." + + It has two positions, \a topLeft and \a bottomRight, which define the rectangle the pixmap will + be drawn in. Depending on the scale setting (\ref setScaled), the pixmap will be either scaled to + fit the rectangle or be drawn aligned to the topLeft position. + + If scaling is enabled and \a topLeft is further to the bottom/right than \a bottomRight (as shown + on the right side of the example image), the pixmap will be flipped in the respective + orientations. +*/ + +/*! + Creates a rectangle item and sets default values. + + The constructed item can be added to the plot with QCustomPlot::addItem. +*/ +QCPItemPixmap::QCPItemPixmap(QCustomPlot *parentPlot) : + QCPAbstractItem(parentPlot), + topLeft(createPosition(QLatin1String("topLeft"))), + bottomRight(createPosition(QLatin1String("bottomRight"))), + top(createAnchor(QLatin1String("top"), aiTop)), + topRight(createAnchor(QLatin1String("topRight"), aiTopRight)), + right(createAnchor(QLatin1String("right"), aiRight)), + bottom(createAnchor(QLatin1String("bottom"), aiBottom)), + bottomLeft(createAnchor(QLatin1String("bottomLeft"), aiBottomLeft)), + left(createAnchor(QLatin1String("left"), aiLeft)), + mScaledPixmapInvalidated(true) +{ + topLeft->setCoords(0, 1); + bottomRight->setCoords(1, 0); + + setPen(Qt::NoPen); + setSelectedPen(QPen(Qt::blue)); + setScaled(false, Qt::KeepAspectRatio, Qt::SmoothTransformation); +} + +QCPItemPixmap::~QCPItemPixmap() +{ +} + +/*! + Sets the pixmap that will be displayed. +*/ +void QCPItemPixmap::setPixmap(const QPixmap &pixmap) +{ + mPixmap = pixmap; + mScaledPixmapInvalidated = true; + if (mPixmap.isNull()) + qDebug() << Q_FUNC_INFO << "pixmap is null"; +} + +/*! + Sets whether the pixmap will be scaled to fit the rectangle defined by the \a topLeft and \a + bottomRight positions. +*/ +void QCPItemPixmap::setScaled(bool scaled, Qt::AspectRatioMode aspectRatioMode, Qt::TransformationMode transformationMode) +{ + mScaled = scaled; + mAspectRatioMode = aspectRatioMode; + mTransformationMode = transformationMode; + mScaledPixmapInvalidated = true; +} + +/*! + Sets the pen that will be used to draw a border around the pixmap. + + \see setSelectedPen, setBrush +*/ +void QCPItemPixmap::setPen(const QPen &pen) +{ + mPen = pen; +} + +/*! + Sets the pen that will be used to draw a border around the pixmap when selected + + \see setPen, setSelected +*/ +void QCPItemPixmap::setSelectedPen(const QPen &pen) +{ + mSelectedPen = pen; +} + +/* inherits documentation from base class */ +double QCPItemPixmap::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + if (onlySelectable && !mSelectable) + return -1; + + return rectSelectTest(getFinalRect(), pos, true); +} + +/* inherits documentation from base class */ +void QCPItemPixmap::draw(QCPPainter *painter) +{ + bool flipHorz = false; + bool flipVert = false; + QRect rect = getFinalRect(&flipHorz, &flipVert); + double clipPad = mainPen().style() == Qt::NoPen ? 0 : mainPen().widthF(); + QRect boundingRect = rect.adjusted(-clipPad, -clipPad, clipPad, clipPad); + if (boundingRect.intersects(clipRect())) + { + updateScaledPixmap(rect, flipHorz, flipVert); + painter->drawPixmap(rect.topLeft(), mScaled ? mScaledPixmap : mPixmap); + QPen pen = mainPen(); + if (pen.style() != Qt::NoPen) + { + painter->setPen(pen); + painter->setBrush(Qt::NoBrush); + painter->drawRect(rect); + } + } +} + +/* inherits documentation from base class */ +QPointF QCPItemPixmap::anchorPixelPoint(int anchorId) const +{ + bool flipHorz; + bool flipVert; + QRect rect = getFinalRect(&flipHorz, &flipVert); + // we actually want denormal rects (negative width/height) here, so restore + // the flipped state: + if (flipHorz) + rect.adjust(rect.width(), 0, -rect.width(), 0); + if (flipVert) + rect.adjust(0, rect.height(), 0, -rect.height()); + + switch (anchorId) + { + case aiTop: return (rect.topLeft()+rect.topRight())*0.5; + case aiTopRight: return rect.topRight(); + case aiRight: return (rect.topRight()+rect.bottomRight())*0.5; + case aiBottom: return (rect.bottomLeft()+rect.bottomRight())*0.5; + case aiBottomLeft: return rect.bottomLeft(); + case aiLeft: return (rect.topLeft()+rect.bottomLeft())*0.5;; + } + + qDebug() << Q_FUNC_INFO << "invalid anchorId" << anchorId; + return QPointF(); +} + +/*! \internal + + Creates the buffered scaled image (\a mScaledPixmap) to fit the specified \a finalRect. The + parameters \a flipHorz and \a flipVert control whether the resulting image shall be flipped + horizontally or vertically. (This is used when \a topLeft is further to the bottom/right than \a + bottomRight.) + + This function only creates the scaled pixmap when the buffered pixmap has a different size than + the expected result, so calling this function repeatedly, e.g. in the \ref draw function, does + not cause expensive rescaling every time. + + If scaling is disabled, sets mScaledPixmap to a null QPixmap. +*/ +void QCPItemPixmap::updateScaledPixmap(QRect finalRect, bool flipHorz, bool flipVert) +{ + if (mPixmap.isNull()) + return; + + if (mScaled) + { + if (finalRect.isNull()) + finalRect = getFinalRect(&flipHorz, &flipVert); + if (mScaledPixmapInvalidated || finalRect.size() != mScaledPixmap.size()) + { + mScaledPixmap = mPixmap.scaled(finalRect.size(), mAspectRatioMode, mTransformationMode); + if (flipHorz || flipVert) + mScaledPixmap = QPixmap::fromImage(mScaledPixmap.toImage().mirrored(flipHorz, flipVert)); + } + } else if (!mScaledPixmap.isNull()) + mScaledPixmap = QPixmap(); + mScaledPixmapInvalidated = false; +} + +/*! \internal + + Returns the final (tight) rect the pixmap is drawn in, depending on the current item positions + and scaling settings. + + The output parameters \a flippedHorz and \a flippedVert return whether the pixmap should be drawn + flipped horizontally or vertically in the returned rect. (The returned rect itself is always + normalized, i.e. the top left corner of the rect is actually further to the top/left than the + bottom right corner). This is the case when the item position \a topLeft is further to the + bottom/right than \a bottomRight. + + If scaling is disabled, returns a rect with size of the original pixmap and the top left corner + aligned with the item position \a topLeft. The position \a bottomRight is ignored. +*/ +QRect QCPItemPixmap::getFinalRect(bool *flippedHorz, bool *flippedVert) const +{ + QRect result; + bool flipHorz = false; + bool flipVert = false; + QPoint p1 = topLeft->pixelPoint().toPoint(); + QPoint p2 = bottomRight->pixelPoint().toPoint(); + if (p1 == p2) + return QRect(p1, QSize(0, 0)); + if (mScaled) + { + QSize newSize = QSize(p2.x()-p1.x(), p2.y()-p1.y()); + QPoint topLeft = p1; + if (newSize.width() < 0) + { + flipHorz = true; + newSize.rwidth() *= -1; + topLeft.setX(p2.x()); + } + if (newSize.height() < 0) + { + flipVert = true; + newSize.rheight() *= -1; + topLeft.setY(p2.y()); + } + QSize scaledSize = mPixmap.size(); + scaledSize.scale(newSize, mAspectRatioMode); + result = QRect(topLeft, scaledSize); + } else + { + result = QRect(p1, mPixmap.size()); + } + if (flippedHorz) + *flippedHorz = flipHorz; + if (flippedVert) + *flippedVert = flipVert; + return result; +} + +/*! \internal + + Returns the pen that should be used for drawing lines. Returns mPen when the item is not selected + and mSelectedPen when it is. +*/ +QPen QCPItemPixmap::mainPen() const +{ + return mSelected ? mSelectedPen : mPen; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPItemTracer +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPItemTracer + \brief Item that sticks to QCPGraph data points + + \image html QCPItemTracer.png "Tracer example. Blue dotted circles are anchors, solid blue discs are positions." + + The tracer can be connected with a QCPGraph via \ref setGraph. Then it will automatically adopt + the coordinate axes of the graph and update its \a position to be on the graph's data. This means + the key stays controllable via \ref setGraphKey, but the value will follow the graph data. If a + QCPGraph is connected, note that setting the coordinates of the tracer item directly via \a + position will have no effect because they will be overriden in the next redraw (this is when the + coordinate update happens). + + If the specified key in \ref setGraphKey is outside the key bounds of the graph, the tracer will + stay at the corresponding end of the graph. + + With \ref setInterpolating you may specify whether the tracer may only stay exactly on data + points or whether it interpolates data points linearly, if given a key that lies between two data + points of the graph. + + The tracer has different visual styles, see \ref setStyle. It is also possible to make the tracer + have no own visual appearance (set the style to \ref tsNone), and just connect other item + positions to the tracer \a position (used as an anchor) via \ref + QCPItemPosition::setParentAnchor. + + \note The tracer position is only automatically updated upon redraws. So when the data of the + graph changes and immediately afterwards (without a redraw) the a position coordinates of the + tracer are retrieved, they will not reflect the updated data of the graph. In this case \ref + updatePosition must be called manually, prior to reading the tracer coordinates. +*/ + +/*! + Creates a tracer item and sets default values. + + The constructed item can be added to the plot with QCustomPlot::addItem. +*/ +QCPItemTracer::QCPItemTracer(QCustomPlot *parentPlot) : + QCPAbstractItem(parentPlot), + position(createPosition(QLatin1String("position"))), + mGraph(0) +{ + position->setCoords(0, 0); + + setBrush(Qt::NoBrush); + setSelectedBrush(Qt::NoBrush); + setPen(QPen(Qt::black)); + setSelectedPen(QPen(Qt::blue, 2)); + setStyle(tsCrosshair); + setSize(6); + setInterpolating(false); + setGraphKey(0); +} + +QCPItemTracer::~QCPItemTracer() +{ +} + +/*! + Sets the pen that will be used to draw the line of the tracer + + \see setSelectedPen, setBrush +*/ +void QCPItemTracer::setPen(const QPen &pen) +{ + mPen = pen; +} + +/*! + Sets the pen that will be used to draw the line of the tracer when selected + + \see setPen, setSelected +*/ +void QCPItemTracer::setSelectedPen(const QPen &pen) +{ + mSelectedPen = pen; +} + +/*! + Sets the brush that will be used to draw any fills of the tracer + + \see setSelectedBrush, setPen +*/ +void QCPItemTracer::setBrush(const QBrush &brush) +{ + mBrush = brush; +} + +/*! + Sets the brush that will be used to draw any fills of the tracer, when selected. + + \see setBrush, setSelected +*/ +void QCPItemTracer::setSelectedBrush(const QBrush &brush) +{ + mSelectedBrush = brush; +} + +/*! + Sets the size of the tracer in pixels, if the style supports setting a size (e.g. \ref tsSquare + does, \ref tsCrosshair does not). +*/ +void QCPItemTracer::setSize(double size) +{ + mSize = size; +} + +/*! + Sets the style/visual appearance of the tracer. + + If you only want to use the tracer \a position as an anchor for other items, set \a style to + \ref tsNone. +*/ +void QCPItemTracer::setStyle(QCPItemTracer::TracerStyle style) +{ + mStyle = style; +} + +/*! + Sets the QCPGraph this tracer sticks to. The tracer \a position will be set to type + QCPItemPosition::ptPlotCoords and the axes will be set to the axes of \a graph. + + To free the tracer from any graph, set \a graph to 0. The tracer \a position can then be placed + freely like any other item position. This is the state the tracer will assume when its graph gets + deleted while still attached to it. + + \see setGraphKey +*/ +void QCPItemTracer::setGraph(QCPGraph *graph) +{ + if (graph) + { + if (graph->parentPlot() == mParentPlot) + { + position->setType(QCPItemPosition::ptPlotCoords); + position->setAxes(graph->keyAxis(), graph->valueAxis()); + mGraph = graph; + updatePosition(); + } else + qDebug() << Q_FUNC_INFO << "graph isn't in same QCustomPlot instance as this item"; + } else + { + mGraph = 0; + } +} + +/*! + Sets the key of the graph's data point the tracer will be positioned at. This is the only free + coordinate of a tracer when attached to a graph. + + Depending on \ref setInterpolating, the tracer will be either positioned on the data point + closest to \a key, or will stay exactly at \a key and interpolate the value linearly. + + \see setGraph, setInterpolating +*/ +void QCPItemTracer::setGraphKey(double key) +{ + mGraphKey = key; +} + +/*! + Sets whether the value of the graph's data points shall be interpolated, when positioning the + tracer. + + If \a enabled is set to false and a key is given with \ref setGraphKey, the tracer is placed on + the data point of the graph which is closest to the key, but which is not necessarily exactly + there. If \a enabled is true, the tracer will be positioned exactly at the specified key, and + the appropriate value will be interpolated from the graph's data points linearly. + + \see setGraph, setGraphKey +*/ +void QCPItemTracer::setInterpolating(bool enabled) +{ + mInterpolating = enabled; +} + +/* inherits documentation from base class */ +double QCPItemTracer::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + if (onlySelectable && !mSelectable) + return -1; + + QPointF center(position->pixelPoint()); + double w = mSize/2.0; + QRect clip = clipRect(); + switch (mStyle) + { + case tsNone: return -1; + case tsPlus: + { + if (clipRect().intersects(QRectF(center-QPointF(w, w), center+QPointF(w, w)).toRect())) + return qSqrt(qMin(distSqrToLine(center+QPointF(-w, 0), center+QPointF(w, 0), pos), + distSqrToLine(center+QPointF(0, -w), center+QPointF(0, w), pos))); + break; + } + case tsCrosshair: + { + return qSqrt(qMin(distSqrToLine(QPointF(clip.left(), center.y()), QPointF(clip.right(), center.y()), pos), + distSqrToLine(QPointF(center.x(), clip.top()), QPointF(center.x(), clip.bottom()), pos))); + } + case tsCircle: + { + if (clip.intersects(QRectF(center-QPointF(w, w), center+QPointF(w, w)).toRect())) + { + // distance to border: + double centerDist = QVector2D(center-pos).length(); + double circleLine = w; + double result = qAbs(centerDist-circleLine); + // filled ellipse, allow click inside to count as hit: + if (result > mParentPlot->selectionTolerance()*0.99 && mBrush.style() != Qt::NoBrush && mBrush.color().alpha() != 0) + { + if (centerDist <= circleLine) + result = mParentPlot->selectionTolerance()*0.99; + } + return result; + } + break; + } + case tsSquare: + { + if (clip.intersects(QRectF(center-QPointF(w, w), center+QPointF(w, w)).toRect())) + { + QRectF rect = QRectF(center-QPointF(w, w), center+QPointF(w, w)); + bool filledRect = mBrush.style() != Qt::NoBrush && mBrush.color().alpha() != 0; + return rectSelectTest(rect, pos, filledRect); + } + break; + } + } + return -1; +} + +/* inherits documentation from base class */ +void QCPItemTracer::draw(QCPPainter *painter) +{ + updatePosition(); + if (mStyle == tsNone) + return; + + painter->setPen(mainPen()); + painter->setBrush(mainBrush()); + QPointF center(position->pixelPoint()); + double w = mSize/2.0; + QRect clip = clipRect(); + switch (mStyle) + { + case tsNone: return; + case tsPlus: + { + if (clip.intersects(QRectF(center-QPointF(w, w), center+QPointF(w, w)).toRect())) + { + painter->drawLine(QLineF(center+QPointF(-w, 0), center+QPointF(w, 0))); + painter->drawLine(QLineF(center+QPointF(0, -w), center+QPointF(0, w))); + } + break; + } + case tsCrosshair: + { + if (center.y() > clip.top() && center.y() < clip.bottom()) + painter->drawLine(QLineF(clip.left(), center.y(), clip.right(), center.y())); + if (center.x() > clip.left() && center.x() < clip.right()) + painter->drawLine(QLineF(center.x(), clip.top(), center.x(), clip.bottom())); + break; + } + case tsCircle: + { + if (clip.intersects(QRectF(center-QPointF(w, w), center+QPointF(w, w)).toRect())) + painter->drawEllipse(center, w, w); + break; + } + case tsSquare: + { + if (clip.intersects(QRectF(center-QPointF(w, w), center+QPointF(w, w)).toRect())) + painter->drawRect(QRectF(center-QPointF(w, w), center+QPointF(w, w))); + break; + } + } +} + +/*! + If the tracer is connected with a graph (\ref setGraph), this function updates the tracer's \a + position to reside on the graph data, depending on the configured key (\ref setGraphKey). + + It is called automatically on every redraw and normally doesn't need to be called manually. One + exception is when you want to read the tracer coordinates via \a position and are not sure that + the graph's data (or the tracer key with \ref setGraphKey) hasn't changed since the last redraw. + In that situation, call this function before accessing \a position, to make sure you don't get + out-of-date coordinates. + + If there is no graph set on this tracer, this function does nothing. +*/ +void QCPItemTracer::updatePosition() +{ + if (mGraph) + { + if (mParentPlot->hasPlottable(mGraph)) + { + if (mGraph->data()->size() > 1) + { + QCPDataMap::const_iterator first = mGraph->data()->constBegin(); + QCPDataMap::const_iterator last = mGraph->data()->constEnd()-1; + if (mGraphKey < first.key()) + position->setCoords(first.key(), first.value().value); + else if (mGraphKey > last.key()) + position->setCoords(last.key(), last.value().value); + else + { + QCPDataMap::const_iterator it = mGraph->data()->lowerBound(mGraphKey); + if (it != first) // mGraphKey is somewhere between iterators + { + QCPDataMap::const_iterator prevIt = it-1; + if (mInterpolating) + { + // interpolate between iterators around mGraphKey: + double slope = 0; + if (!qFuzzyCompare((double)it.key(), (double)prevIt.key())) + slope = (it.value().value-prevIt.value().value)/(it.key()-prevIt.key()); + position->setCoords(mGraphKey, (mGraphKey-prevIt.key())*slope+prevIt.value().value); + } else + { + // find iterator with key closest to mGraphKey: + if (mGraphKey < (prevIt.key()+it.key())*0.5) + it = prevIt; + position->setCoords(it.key(), it.value().value); + } + } else // mGraphKey is exactly on first iterator + position->setCoords(it.key(), it.value().value); + } + } else if (mGraph->data()->size() == 1) + { + QCPDataMap::const_iterator it = mGraph->data()->constBegin(); + position->setCoords(it.key(), it.value().value); + } else + qDebug() << Q_FUNC_INFO << "graph has no data"; + } else + qDebug() << Q_FUNC_INFO << "graph not contained in QCustomPlot instance (anymore)"; + } +} + +/*! \internal + + Returns the pen that should be used for drawing lines. Returns mPen when the item is not selected + and mSelectedPen when it is. +*/ +QPen QCPItemTracer::mainPen() const +{ + return mSelected ? mSelectedPen : mPen; +} + +/*! \internal + + Returns the brush that should be used for drawing fills of the item. Returns mBrush when the item + is not selected and mSelectedBrush when it is. +*/ +QBrush QCPItemTracer::mainBrush() const +{ + return mSelected ? mSelectedBrush : mBrush; +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////// QCPItemBracket +//////////////////////////////////////////////////////////////////////////////////////////////////// + +/*! \class QCPItemBracket + \brief A bracket for referencing/highlighting certain parts in the plot. + + \image html QCPItemBracket.png "Bracket example. Blue dotted circles are anchors, solid blue discs are positions." + + It has two positions, \a left and \a right, which define the span of the bracket. If \a left is + actually farther to the left than \a right, the bracket is opened to the bottom, as shown in the + example image. + + The bracket supports multiple styles via \ref setStyle. The length, i.e. how far the bracket + stretches away from the embraced span, can be controlled with \ref setLength. + + \image html QCPItemBracket-length.png +
Demonstrating the effect of different values for \ref setLength, for styles \ref + bsCalligraphic and \ref bsSquare. Anchors and positions are displayed for reference.
+ + It provides an anchor \a center, to allow connection of other items, e.g. an arrow (QCPItemLine + or QCPItemCurve) or a text label (QCPItemText), to the bracket. +*/ + +/*! + Creates a bracket item and sets default values. + + The constructed item can be added to the plot with QCustomPlot::addItem. +*/ +QCPItemBracket::QCPItemBracket(QCustomPlot *parentPlot) : + QCPAbstractItem(parentPlot), + left(createPosition(QLatin1String("left"))), + right(createPosition(QLatin1String("right"))), + center(createAnchor(QLatin1String("center"), aiCenter)) +{ + left->setCoords(0, 0); + right->setCoords(1, 1); + + setPen(QPen(Qt::black)); + setSelectedPen(QPen(Qt::blue, 2)); + setLength(8); + setStyle(bsCalligraphic); +} + +QCPItemBracket::~QCPItemBracket() +{ +} + +/*! + Sets the pen that will be used to draw the bracket. + + Note that when the style is \ref bsCalligraphic, only the color will be taken from the pen, the + stroke and width are ignored. To change the apparent stroke width of a calligraphic bracket, use + \ref setLength, which has a similar effect. + + \see setSelectedPen +*/ +void QCPItemBracket::setPen(const QPen &pen) +{ + mPen = pen; +} + +/*! + Sets the pen that will be used to draw the bracket when selected + + \see setPen, setSelected +*/ +void QCPItemBracket::setSelectedPen(const QPen &pen) +{ + mSelectedPen = pen; +} + +/*! + Sets the \a length in pixels how far the bracket extends in the direction towards the embraced + span of the bracket (i.e. perpendicular to the left-right-direction) + + \image html QCPItemBracket-length.png +
Demonstrating the effect of different values for \ref setLength, for styles \ref + bsCalligraphic and \ref bsSquare. Anchors and positions are displayed for reference.
+*/ +void QCPItemBracket::setLength(double length) +{ + mLength = length; +} + +/*! + Sets the style of the bracket, i.e. the shape/visual appearance. + + \see setPen +*/ +void QCPItemBracket::setStyle(QCPItemBracket::BracketStyle style) +{ + mStyle = style; +} + +/* inherits documentation from base class */ +double QCPItemBracket::selectTest(const QPointF &pos, bool onlySelectable, QVariant *details) const +{ + Q_UNUSED(details) + if (onlySelectable && !mSelectable) + return -1; + + QVector2D leftVec(left->pixelPoint()); + QVector2D rightVec(right->pixelPoint()); + if (leftVec.toPoint() == rightVec.toPoint()) + return -1; + + QVector2D widthVec = (rightVec-leftVec)*0.5f; + QVector2D lengthVec(-widthVec.y(), widthVec.x()); + lengthVec = lengthVec.normalized()*mLength; + QVector2D centerVec = (rightVec+leftVec)*0.5f-lengthVec; + + switch (mStyle) + { + case QCPItemBracket::bsSquare: + case QCPItemBracket::bsRound: + { + double a = distSqrToLine((centerVec-widthVec).toPointF(), (centerVec+widthVec).toPointF(), pos); + double b = distSqrToLine((centerVec-widthVec+lengthVec).toPointF(), (centerVec-widthVec).toPointF(), pos); + double c = distSqrToLine((centerVec+widthVec+lengthVec).toPointF(), (centerVec+widthVec).toPointF(), pos); + return qSqrt(qMin(qMin(a, b), c)); + } + case QCPItemBracket::bsCurly: + case QCPItemBracket::bsCalligraphic: + { + double a = distSqrToLine((centerVec-widthVec*0.75f+lengthVec*0.15f).toPointF(), (centerVec+lengthVec*0.3f).toPointF(), pos); + double b = distSqrToLine((centerVec-widthVec+lengthVec*0.7f).toPointF(), (centerVec-widthVec*0.75f+lengthVec*0.15f).toPointF(), pos); + double c = distSqrToLine((centerVec+widthVec*0.75f+lengthVec*0.15f).toPointF(), (centerVec+lengthVec*0.3f).toPointF(), pos); + double d = distSqrToLine((centerVec+widthVec+lengthVec*0.7f).toPointF(), (centerVec+widthVec*0.75f+lengthVec*0.15f).toPointF(), pos); + return qSqrt(qMin(qMin(a, b), qMin(c, d))); + } + } + return -1; +} + +/* inherits documentation from base class */ +void QCPItemBracket::draw(QCPPainter *painter) +{ + QVector2D leftVec(left->pixelPoint()); + QVector2D rightVec(right->pixelPoint()); + if (leftVec.toPoint() == rightVec.toPoint()) + return; + + QVector2D widthVec = (rightVec-leftVec)*0.5f; + QVector2D lengthVec(-widthVec.y(), widthVec.x()); + lengthVec = lengthVec.normalized()*mLength; + QVector2D centerVec = (rightVec+leftVec)*0.5f-lengthVec; + + QPolygon boundingPoly; + boundingPoly << leftVec.toPoint() << rightVec.toPoint() + << (rightVec-lengthVec).toPoint() << (leftVec-lengthVec).toPoint(); + QRect clip = clipRect().adjusted(-mainPen().widthF(), -mainPen().widthF(), mainPen().widthF(), mainPen().widthF()); + if (clip.intersects(boundingPoly.boundingRect())) + { + painter->setPen(mainPen()); + switch (mStyle) + { + case bsSquare: + { + painter->drawLine((centerVec+widthVec).toPointF(), (centerVec-widthVec).toPointF()); + painter->drawLine((centerVec+widthVec).toPointF(), (centerVec+widthVec+lengthVec).toPointF()); + painter->drawLine((centerVec-widthVec).toPointF(), (centerVec-widthVec+lengthVec).toPointF()); + break; + } + case bsRound: + { + painter->setBrush(Qt::NoBrush); + QPainterPath path; + path.moveTo((centerVec+widthVec+lengthVec).toPointF()); + path.cubicTo((centerVec+widthVec).toPointF(), (centerVec+widthVec).toPointF(), centerVec.toPointF()); + path.cubicTo((centerVec-widthVec).toPointF(), (centerVec-widthVec).toPointF(), (centerVec-widthVec+lengthVec).toPointF()); + painter->drawPath(path); + break; + } + case bsCurly: + { + painter->setBrush(Qt::NoBrush); + QPainterPath path; + path.moveTo((centerVec+widthVec+lengthVec).toPointF()); + path.cubicTo((centerVec+widthVec-lengthVec*0.8f).toPointF(), (centerVec+0.4f*widthVec+lengthVec).toPointF(), centerVec.toPointF()); + path.cubicTo((centerVec-0.4f*widthVec+lengthVec).toPointF(), (centerVec-widthVec-lengthVec*0.8f).toPointF(), (centerVec-widthVec+lengthVec).toPointF()); + painter->drawPath(path); + break; + } + case bsCalligraphic: + { + painter->setPen(Qt::NoPen); + painter->setBrush(QBrush(mainPen().color())); + QPainterPath path; + path.moveTo((centerVec+widthVec+lengthVec).toPointF()); + + path.cubicTo((centerVec+widthVec-lengthVec*0.8f).toPointF(), (centerVec+0.4f*widthVec+0.8f*lengthVec).toPointF(), centerVec.toPointF()); + path.cubicTo((centerVec-0.4f*widthVec+0.8f*lengthVec).toPointF(), (centerVec-widthVec-lengthVec*0.8f).toPointF(), (centerVec-widthVec+lengthVec).toPointF()); + + path.cubicTo((centerVec-widthVec-lengthVec*0.5f).toPointF(), (centerVec-0.2f*widthVec+1.2f*lengthVec).toPointF(), (centerVec+lengthVec*0.2f).toPointF()); + path.cubicTo((centerVec+0.2f*widthVec+1.2f*lengthVec).toPointF(), (centerVec+widthVec-lengthVec*0.5f).toPointF(), (centerVec+widthVec+lengthVec).toPointF()); + + painter->drawPath(path); + break; + } + } + } +} + +/* inherits documentation from base class */ +QPointF QCPItemBracket::anchorPixelPoint(int anchorId) const +{ + QVector2D leftVec(left->pixelPoint()); + QVector2D rightVec(right->pixelPoint()); + if (leftVec.toPoint() == rightVec.toPoint()) + return leftVec.toPointF(); + + QVector2D widthVec = (rightVec-leftVec)*0.5f; + QVector2D lengthVec(-widthVec.y(), widthVec.x()); + lengthVec = lengthVec.normalized()*mLength; + QVector2D centerVec = (rightVec+leftVec)*0.5f-lengthVec; + + switch (anchorId) + { + case aiCenter: + return centerVec.toPointF(); + } + qDebug() << Q_FUNC_INFO << "invalid anchorId" << anchorId; + return QPointF(); +} + +/*! \internal + + Returns the pen that should be used for drawing lines. Returns mPen when the + item is not selected and mSelectedPen when it is. +*/ +QPen QCPItemBracket::mainPen() const +{ + return mSelected ? mSelectedPen : mPen; +} + diff --git a/Desktop Interface/qcustomplot.h b/Desktop Interface/qcustomplot.h new file mode 100644 index 00000000..bb998f1c --- /dev/null +++ b/Desktop Interface/qcustomplot.h @@ -0,0 +1,3768 @@ +/*************************************************************************** +** ** +** QCustomPlot, an easy to use, modern plotting widget for Qt ** +** Copyright (C) 2011-2015 Emanuel Eichhammer ** +** ** +** This program is free software: you can redistribute it and/or modify ** +** it under the terms of the GNU General Public License as published by ** +** the Free Software Foundation, either version 3 of the License, or ** +** (at your option) any later version. ** +** ** +** This program is distributed in the hope that it will be useful, ** +** but WITHOUT ANY WARRANTY; without even the implied warranty of ** +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** +** GNU General Public License for more details. ** +** ** +** You should have received a copy of the GNU General Public License ** +** along with this program. If not, see http://www.gnu.org/licenses/. ** +** ** +**************************************************************************** +** Author: Emanuel Eichhammer ** +** Website/Contact: http://www.qcustomplot.com/ ** +** Date: 22.12.15 ** +** Version: 1.3.2 ** +****************************************************************************/ + +#ifndef QCUSTOMPLOT_H +#define QCUSTOMPLOT_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) +# include +# include +# include +#else +# include +# include +#endif + +class QCPPainter; +class QCustomPlot; +class QCPLayerable; +class QCPLayoutElement; +class QCPLayout; +class QCPAxis; +class QCPAxisRect; +class QCPAxisPainterPrivate; +class QCPAbstractPlottable; +class QCPGraph; +class QCPAbstractItem; +class QCPItemPosition; +class QCPLayer; +class QCPPlotTitle; +class QCPLegend; +class QCPAbstractLegendItem; +class QCPColorMap; +class QCPColorScale; +class QCPBars; + + +/*! \file */ + + +// decl definitions for shared library compilation/usage: +#if defined(QCUSTOMPLOT_COMPILE_LIBRARY) +# define QCP_LIB_DECL Q_DECL_EXPORT +#elif defined(QCUSTOMPLOT_USE_LIBRARY) +# define QCP_LIB_DECL Q_DECL_IMPORT +#else +# define QCP_LIB_DECL +#endif + +/*! + The QCP Namespace contains general enums and QFlags used throughout the QCustomPlot library +*/ +namespace QCP +{ +/*! + Defines the sides of a rectangular entity to which margins can be applied. + + \see QCPLayoutElement::setAutoMargins, QCPAxisRect::setAutoMargins +*/ +enum MarginSide { msLeft = 0x01 ///< 0x01 left margin + ,msRight = 0x02 ///< 0x02 right margin + ,msTop = 0x04 ///< 0x04 top margin + ,msBottom = 0x08 ///< 0x08 bottom margin + ,msAll = 0xFF ///< 0xFF all margins + ,msNone = 0x00 ///< 0x00 no margin + }; +Q_DECLARE_FLAGS(MarginSides, MarginSide) + +/*! + Defines what objects of a plot can be forcibly drawn antialiased/not antialiased. If an object is + neither forcibly drawn antialiased nor forcibly drawn not antialiased, it is up to the respective + element how it is drawn. Typically it provides a \a setAntialiased function for this. + + \c AntialiasedElements is a flag of or-combined elements of this enum type. + + \see QCustomPlot::setAntialiasedElements, QCustomPlot::setNotAntialiasedElements +*/ +enum AntialiasedElement { aeAxes = 0x0001 ///< 0x0001 Axis base line and tick marks + ,aeGrid = 0x0002 ///< 0x0002 Grid lines + ,aeSubGrid = 0x0004 ///< 0x0004 Sub grid lines + ,aeLegend = 0x0008 ///< 0x0008 Legend box + ,aeLegendItems = 0x0010 ///< 0x0010 Legend items + ,aePlottables = 0x0020 ///< 0x0020 Main lines of plottables (excluding error bars, see element \ref aeErrorBars) + ,aeItems = 0x0040 ///< 0x0040 Main lines of items + ,aeScatters = 0x0080 ///< 0x0080 Scatter symbols of plottables (excluding scatter symbols of type ssPixmap) + ,aeErrorBars = 0x0100 ///< 0x0100 Error bars + ,aeFills = 0x0200 ///< 0x0200 Borders of fills (e.g. under or between graphs) + ,aeZeroLine = 0x0400 ///< 0x0400 Zero-lines, see \ref QCPGrid::setZeroLinePen + ,aeAll = 0xFFFF ///< 0xFFFF All elements + ,aeNone = 0x0000 ///< 0x0000 No elements + }; +Q_DECLARE_FLAGS(AntialiasedElements, AntialiasedElement) + +/*! + Defines plotting hints that control various aspects of the quality and speed of plotting. + + \see QCustomPlot::setPlottingHints +*/ +enum PlottingHint { phNone = 0x000 ///< 0x000 No hints are set + ,phFastPolylines = 0x001 ///< 0x001 Graph/Curve lines are drawn with a faster method. This reduces the quality + ///< especially of the line segment joins. (Only relevant for solid line pens.) + ,phForceRepaint = 0x002 ///< 0x002 causes an immediate repaint() instead of a soft update() when QCustomPlot::replot() is called with parameter \ref QCustomPlot::rpHint. + ///< This is set by default to prevent the plot from freezing on fast consecutive replots (e.g. user drags ranges with mouse). + ,phCacheLabels = 0x004 ///< 0x004 axis (tick) labels will be cached as pixmaps, increasing replot performance. + }; +Q_DECLARE_FLAGS(PlottingHints, PlottingHint) + +/*! + Defines the mouse interactions possible with QCustomPlot. + + \c Interactions is a flag of or-combined elements of this enum type. + + \see QCustomPlot::setInteractions +*/ +enum Interaction { iRangeDrag = 0x001 ///< 0x001 Axis ranges are draggable (see \ref QCPAxisRect::setRangeDrag, \ref QCPAxisRect::setRangeDragAxes) + ,iRangeZoom = 0x002 ///< 0x002 Axis ranges are zoomable with the mouse wheel (see \ref QCPAxisRect::setRangeZoom, \ref QCPAxisRect::setRangeZoomAxes) + ,iMultiSelect = 0x004 ///< 0x004 The user can select multiple objects by holding the modifier set by \ref QCustomPlot::setMultiSelectModifier while clicking + ,iSelectPlottables = 0x008 ///< 0x008 Plottables are selectable (e.g. graphs, curves, bars,... see QCPAbstractPlottable) + ,iSelectAxes = 0x010 ///< 0x010 Axes are selectable (or parts of them, see QCPAxis::setSelectableParts) + ,iSelectLegend = 0x020 ///< 0x020 Legends are selectable (or their child items, see QCPLegend::setSelectableParts) + ,iSelectItems = 0x040 ///< 0x040 Items are selectable (Rectangles, Arrows, Textitems, etc. see \ref QCPAbstractItem) + ,iSelectOther = 0x080 ///< 0x080 All other objects are selectable (e.g. your own derived layerables, the plot title,...) + }; +Q_DECLARE_FLAGS(Interactions, Interaction) + +/*! \internal + + Returns whether the specified \a value is considered an invalid data value for plottables (i.e. + is \e nan or \e +/-inf). This function is used to check data validity upon replots, when the + compiler flag \c QCUSTOMPLOT_CHECK_DATA is set. +*/ +inline bool isInvalidData(double value) +{ + return qIsNaN(value) || qIsInf(value); +} + +/*! \internal + \overload + + Checks two arguments instead of one. +*/ +inline bool isInvalidData(double value1, double value2) +{ + return isInvalidData(value1) || isInvalidData(value2); +} + +/*! \internal + + Sets the specified \a side of \a margins to \a value + + \see getMarginValue +*/ +inline void setMarginValue(QMargins &margins, QCP::MarginSide side, int value) +{ + switch (side) + { + case QCP::msLeft: margins.setLeft(value); break; + case QCP::msRight: margins.setRight(value); break; + case QCP::msTop: margins.setTop(value); break; + case QCP::msBottom: margins.setBottom(value); break; + case QCP::msAll: margins = QMargins(value, value, value, value); break; + default: break; + } +} + +/*! \internal + + Returns the value of the specified \a side of \a margins. If \a side is \ref QCP::msNone or + \ref QCP::msAll, returns 0. + + \see setMarginValue +*/ +inline int getMarginValue(const QMargins &margins, QCP::MarginSide side) +{ + switch (side) + { + case QCP::msLeft: return margins.left(); + case QCP::msRight: return margins.right(); + case QCP::msTop: return margins.top(); + case QCP::msBottom: return margins.bottom(); + default: break; + } + return 0; +} + +} // end of namespace QCP + +Q_DECLARE_OPERATORS_FOR_FLAGS(QCP::AntialiasedElements) +Q_DECLARE_OPERATORS_FOR_FLAGS(QCP::PlottingHints) +Q_DECLARE_OPERATORS_FOR_FLAGS(QCP::MarginSides) +Q_DECLARE_OPERATORS_FOR_FLAGS(QCP::Interactions) + + +class QCP_LIB_DECL QCPScatterStyle +{ + Q_GADGET +public: + /*! + Defines the shape used for scatter points. + + On plottables/items that draw scatters, the sizes of these visualizations (with exception of + \ref ssDot and \ref ssPixmap) can be controlled with the \ref setSize function. Scatters are + drawn with the pen and brush specified with \ref setPen and \ref setBrush. + */ + Q_ENUMS(ScatterShape) + enum ScatterShape { ssNone ///< no scatter symbols are drawn (e.g. in QCPGraph, data only represented with lines) + ,ssDot ///< \enumimage{ssDot.png} a single pixel (use \ref ssDisc or \ref ssCircle if you want a round shape with a certain radius) + ,ssCross ///< \enumimage{ssCross.png} a cross + ,ssPlus ///< \enumimage{ssPlus.png} a plus + ,ssCircle ///< \enumimage{ssCircle.png} a circle + ,ssDisc ///< \enumimage{ssDisc.png} a circle which is filled with the pen's color (not the brush as with ssCircle) + ,ssSquare ///< \enumimage{ssSquare.png} a square + ,ssDiamond ///< \enumimage{ssDiamond.png} a diamond + ,ssStar ///< \enumimage{ssStar.png} a star with eight arms, i.e. a combination of cross and plus + ,ssTriangle ///< \enumimage{ssTriangle.png} an equilateral triangle, standing on baseline + ,ssTriangleInverted ///< \enumimage{ssTriangleInverted.png} an equilateral triangle, standing on corner + ,ssCrossSquare ///< \enumimage{ssCrossSquare.png} a square with a cross inside + ,ssPlusSquare ///< \enumimage{ssPlusSquare.png} a square with a plus inside + ,ssCrossCircle ///< \enumimage{ssCrossCircle.png} a circle with a cross inside + ,ssPlusCircle ///< \enumimage{ssPlusCircle.png} a circle with a plus inside + ,ssPeace ///< \enumimage{ssPeace.png} a circle, with one vertical and two downward diagonal lines + ,ssPixmap ///< a custom pixmap specified by \ref setPixmap, centered on the data point coordinates + ,ssCustom ///< custom painter operations are performed per scatter (As QPainterPath, see \ref setCustomPath) + }; + + QCPScatterStyle(); + QCPScatterStyle(ScatterShape shape, double size=6); + QCPScatterStyle(ScatterShape shape, const QColor &color, double size); + QCPScatterStyle(ScatterShape shape, const QColor &color, const QColor &fill, double size); + QCPScatterStyle(ScatterShape shape, const QPen &pen, const QBrush &brush, double size); + QCPScatterStyle(const QPixmap &pixmap); + QCPScatterStyle(const QPainterPath &customPath, const QPen &pen, const QBrush &brush=Qt::NoBrush, double size=6); + + // getters: + double size() const { return mSize; } + ScatterShape shape() const { return mShape; } + QPen pen() const { return mPen; } + QBrush brush() const { return mBrush; } + QPixmap pixmap() const { return mPixmap; } + QPainterPath customPath() const { return mCustomPath; } + + // setters: + void setSize(double size); + void setShape(ScatterShape shape); + void setPen(const QPen &pen); + void setBrush(const QBrush &brush); + void setPixmap(const QPixmap &pixmap); + void setCustomPath(const QPainterPath &customPath); + + // non-property methods: + bool isNone() const { return mShape == ssNone; } + bool isPenDefined() const { return mPenDefined; } + void applyTo(QCPPainter *painter, const QPen &defaultPen) const; + void drawShape(QCPPainter *painter, QPointF pos) const; + void drawShape(QCPPainter *painter, double x, double y) const; + +protected: + // property members: + double mSize; + ScatterShape mShape; + QPen mPen; + QBrush mBrush; + QPixmap mPixmap; + QPainterPath mCustomPath; + + // non-property members: + bool mPenDefined; +}; +Q_DECLARE_TYPEINFO(QCPScatterStyle, Q_MOVABLE_TYPE); + + +class QCP_LIB_DECL QCPPainter : public QPainter +{ + Q_GADGET +public: + /*! + Defines special modes the painter can operate in. They disable or enable certain subsets of features/fixes/workarounds, + depending on whether they are wanted on the respective output device. + */ + enum PainterMode { pmDefault = 0x00 ///< 0x00 Default mode for painting on screen devices + ,pmVectorized = 0x01 ///< 0x01 Mode for vectorized painting (e.g. PDF export). For example, this prevents some antialiasing fixes. + ,pmNoCaching = 0x02 ///< 0x02 Mode for all sorts of exports (e.g. PNG, PDF,...). For example, this prevents using cached pixmap labels + ,pmNonCosmetic = 0x04 ///< 0x04 Turns pen widths 0 to 1, i.e. disables cosmetic pens. (A cosmetic pen is always drawn with width 1 pixel in the vector image/pdf viewer, independent of zoom.) + }; + Q_FLAGS(PainterMode PainterModes) + Q_DECLARE_FLAGS(PainterModes, PainterMode) + + QCPPainter(); + QCPPainter(QPaintDevice *device); + ~QCPPainter(); + + // getters: + bool antialiasing() const { return testRenderHint(QPainter::Antialiasing); } + PainterModes modes() const { return mModes; } + + // setters: + void setAntialiasing(bool enabled); + void setMode(PainterMode mode, bool enabled=true); + void setModes(PainterModes modes); + + // methods hiding non-virtual base class functions (QPainter bug workarounds): + bool begin(QPaintDevice *device); + void setPen(const QPen &pen); + void setPen(const QColor &color); + void setPen(Qt::PenStyle penStyle); + void drawLine(const QLineF &line); + void drawLine(const QPointF &p1, const QPointF &p2) {drawLine(QLineF(p1, p2));} + void save(); + void restore(); + + // non-virtual methods: + void makeNonCosmetic(); + +protected: + // property members: + PainterModes mModes; + bool mIsAntialiasing; + + // non-property members: + QStack mAntialiasingStack; +}; +Q_DECLARE_OPERATORS_FOR_FLAGS(QCPPainter::PainterModes) + + +class QCP_LIB_DECL QCPLayer : public QObject +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QCustomPlot* parentPlot READ parentPlot) + Q_PROPERTY(QString name READ name) + Q_PROPERTY(int index READ index) + Q_PROPERTY(QList children READ children) + Q_PROPERTY(bool visible READ visible WRITE setVisible) + /// \endcond +public: + QCPLayer(QCustomPlot* parentPlot, const QString &layerName); + ~QCPLayer(); + + // getters: + QCustomPlot *parentPlot() const { return mParentPlot; } + QString name() const { return mName; } + int index() const { return mIndex; } + QList children() const { return mChildren; } + bool visible() const { return mVisible; } + + // setters: + void setVisible(bool visible); + +protected: + // property members: + QCustomPlot *mParentPlot; + QString mName; + int mIndex; + QList mChildren; + bool mVisible; + + // non-virtual methods: + void addChild(QCPLayerable *layerable, bool prepend); + void removeChild(QCPLayerable *layerable); + +private: + Q_DISABLE_COPY(QCPLayer) + + friend class QCustomPlot; + friend class QCPLayerable; +}; + +class QCP_LIB_DECL QCPLayerable : public QObject +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(bool visible READ visible WRITE setVisible) + Q_PROPERTY(QCustomPlot* parentPlot READ parentPlot) + Q_PROPERTY(QCPLayerable* parentLayerable READ parentLayerable) + Q_PROPERTY(QCPLayer* layer READ layer WRITE setLayer NOTIFY layerChanged) + Q_PROPERTY(bool antialiased READ antialiased WRITE setAntialiased) + /// \endcond +public: + QCPLayerable(QCustomPlot *plot, QString targetLayer=QString(), QCPLayerable *parentLayerable=0); + ~QCPLayerable(); + + // getters: + bool visible() const { return mVisible; } + QCustomPlot *parentPlot() const { return mParentPlot; } + QCPLayerable *parentLayerable() const { return mParentLayerable.data(); } + QCPLayer *layer() const { return mLayer; } + bool antialiased() const { return mAntialiased; } + + // setters: + void setVisible(bool on); + Q_SLOT bool setLayer(QCPLayer *layer); + bool setLayer(const QString &layerName); + void setAntialiased(bool enabled); + + // introduced virtual methods: + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + + // non-property methods: + bool realVisibility() const; + +signals: + void layerChanged(QCPLayer *newLayer); + +protected: + // property members: + bool mVisible; + QCustomPlot *mParentPlot; + QPointer mParentLayerable; + QCPLayer *mLayer; + bool mAntialiased; + + // introduced virtual methods: + virtual void parentPlotInitialized(QCustomPlot *parentPlot); + virtual QCP::Interaction selectionCategory() const; + virtual QRect clipRect() const; + virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const = 0; + virtual void draw(QCPPainter *painter) = 0; + // events: + virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged); + virtual void deselectEvent(bool *selectionStateChanged); + + // non-property methods: + void initializeParentPlot(QCustomPlot *parentPlot); + void setParentLayerable(QCPLayerable* parentLayerable); + bool moveToLayer(QCPLayer *layer, bool prepend); + void applyAntialiasingHint(QCPPainter *painter, bool localAntialiased, QCP::AntialiasedElement overrideElement) const; + +private: + Q_DISABLE_COPY(QCPLayerable) + + friend class QCustomPlot; + friend class QCPAxisRect; +}; + + +class QCP_LIB_DECL QCPRange +{ +public: + double lower, upper; + + QCPRange(); + QCPRange(double lower, double upper); + + bool operator==(const QCPRange& other) const { return lower == other.lower && upper == other.upper; } + bool operator!=(const QCPRange& other) const { return !(*this == other); } + + QCPRange &operator+=(const double& value) { lower+=value; upper+=value; return *this; } + QCPRange &operator-=(const double& value) { lower-=value; upper-=value; return *this; } + QCPRange &operator*=(const double& value) { lower*=value; upper*=value; return *this; } + QCPRange &operator/=(const double& value) { lower/=value; upper/=value; return *this; } + friend inline const QCPRange operator+(const QCPRange&, double); + friend inline const QCPRange operator+(double, const QCPRange&); + friend inline const QCPRange operator-(const QCPRange& range, double value); + friend inline const QCPRange operator*(const QCPRange& range, double value); + friend inline const QCPRange operator*(double value, const QCPRange& range); + friend inline const QCPRange operator/(const QCPRange& range, double value); + + double size() const; + double center() const; + void normalize(); + void expand(const QCPRange &otherRange); + QCPRange expanded(const QCPRange &otherRange) const; + QCPRange sanitizedForLogScale() const; + QCPRange sanitizedForLinScale() const; + bool contains(double value) const; + + static bool validRange(double lower, double upper); + static bool validRange(const QCPRange &range); + static const double minRange; //1e-280; + static const double maxRange; //1e280; + +}; +Q_DECLARE_TYPEINFO(QCPRange, Q_MOVABLE_TYPE); + +/* documentation of inline functions */ + +/*! \fn QCPRange &QCPRange::operator+=(const double& value) + + Adds \a value to both boundaries of the range. +*/ + +/*! \fn QCPRange &QCPRange::operator-=(const double& value) + + Subtracts \a value from both boundaries of the range. +*/ + +/*! \fn QCPRange &QCPRange::operator*=(const double& value) + + Multiplies both boundaries of the range by \a value. +*/ + +/*! \fn QCPRange &QCPRange::operator/=(const double& value) + + Divides both boundaries of the range by \a value. +*/ + +/* end documentation of inline functions */ + +/*! + Adds \a value to both boundaries of the range. +*/ +inline const QCPRange operator+(const QCPRange& range, double value) +{ + QCPRange result(range); + result += value; + return result; +} + +/*! + Adds \a value to both boundaries of the range. +*/ +inline const QCPRange operator+(double value, const QCPRange& range) +{ + QCPRange result(range); + result += value; + return result; +} + +/*! + Subtracts \a value from both boundaries of the range. +*/ +inline const QCPRange operator-(const QCPRange& range, double value) +{ + QCPRange result(range); + result -= value; + return result; +} + +/*! + Multiplies both boundaries of the range by \a value. +*/ +inline const QCPRange operator*(const QCPRange& range, double value) +{ + QCPRange result(range); + result *= value; + return result; +} + +/*! + Multiplies both boundaries of the range by \a value. +*/ +inline const QCPRange operator*(double value, const QCPRange& range) +{ + QCPRange result(range); + result *= value; + return result; +} + +/*! + Divides both boundaries of the range by \a value. +*/ +inline const QCPRange operator/(const QCPRange& range, double value) +{ + QCPRange result(range); + result /= value; + return result; +} + + +class QCP_LIB_DECL QCPMarginGroup : public QObject +{ + Q_OBJECT +public: + QCPMarginGroup(QCustomPlot *parentPlot); + ~QCPMarginGroup(); + + // non-virtual methods: + QList elements(QCP::MarginSide side) const { return mChildren.value(side); } + bool isEmpty() const; + void clear(); + +protected: + // non-property members: + QCustomPlot *mParentPlot; + QHash > mChildren; + + // non-virtual methods: + int commonMargin(QCP::MarginSide side) const; + void addChild(QCP::MarginSide side, QCPLayoutElement *element); + void removeChild(QCP::MarginSide side, QCPLayoutElement *element); + +private: + Q_DISABLE_COPY(QCPMarginGroup) + + friend class QCPLayoutElement; +}; + + +class QCP_LIB_DECL QCPLayoutElement : public QCPLayerable +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QCPLayout* layout READ layout) + Q_PROPERTY(QRect rect READ rect) + Q_PROPERTY(QRect outerRect READ outerRect WRITE setOuterRect) + Q_PROPERTY(QMargins margins READ margins WRITE setMargins) + Q_PROPERTY(QMargins minimumMargins READ minimumMargins WRITE setMinimumMargins) + Q_PROPERTY(QSize minimumSize READ minimumSize WRITE setMinimumSize) + Q_PROPERTY(QSize maximumSize READ maximumSize WRITE setMaximumSize) + /// \endcond +public: + /*! + Defines the phases of the update process, that happens just before a replot. At each phase, + \ref update is called with the according UpdatePhase value. + */ + enum UpdatePhase { upPreparation ///< Phase used for any type of preparation that needs to be done before margin calculation and layout + ,upMargins ///< Phase in which the margins are calculated and set + ,upLayout ///< Final phase in which the layout system places the rects of the elements + }; + Q_ENUMS(UpdatePhase) + + explicit QCPLayoutElement(QCustomPlot *parentPlot=0); + virtual ~QCPLayoutElement(); + + // getters: + QCPLayout *layout() const { return mParentLayout; } + QRect rect() const { return mRect; } + QRect outerRect() const { return mOuterRect; } + QMargins margins() const { return mMargins; } + QMargins minimumMargins() const { return mMinimumMargins; } + QCP::MarginSides autoMargins() const { return mAutoMargins; } + QSize minimumSize() const { return mMinimumSize; } + QSize maximumSize() const { return mMaximumSize; } + QCPMarginGroup *marginGroup(QCP::MarginSide side) const { return mMarginGroups.value(side, (QCPMarginGroup*)0); } + QHash marginGroups() const { return mMarginGroups; } + + // setters: + void setOuterRect(const QRect &rect); + void setMargins(const QMargins &margins); + void setMinimumMargins(const QMargins &margins); + void setAutoMargins(QCP::MarginSides sides); + void setMinimumSize(const QSize &size); + void setMinimumSize(int width, int height); + void setMaximumSize(const QSize &size); + void setMaximumSize(int width, int height); + void setMarginGroup(QCP::MarginSides sides, QCPMarginGroup *group); + + // introduced virtual methods: + virtual void update(UpdatePhase phase); + virtual QSize minimumSizeHint() const; + virtual QSize maximumSizeHint() const; + virtual QList elements(bool recursive) const; + + // reimplemented virtual methods: + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + +protected: + // property members: + QCPLayout *mParentLayout; + QSize mMinimumSize, mMaximumSize; + QRect mRect, mOuterRect; + QMargins mMargins, mMinimumMargins; + QCP::MarginSides mAutoMargins; + QHash mMarginGroups; + + // introduced virtual methods: + virtual int calculateAutoMargin(QCP::MarginSide side); + // events: + virtual void mousePressEvent(QMouseEvent *event) {Q_UNUSED(event)} + virtual void mouseMoveEvent(QMouseEvent *event) {Q_UNUSED(event)} + virtual void mouseReleaseEvent(QMouseEvent *event) {Q_UNUSED(event)} + virtual void mouseDoubleClickEvent(QMouseEvent *event) {Q_UNUSED(event)} + virtual void wheelEvent(QWheelEvent *event) {Q_UNUSED(event)} + + // reimplemented virtual methods: + virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const { Q_UNUSED(painter) } + virtual void draw(QCPPainter *painter) { Q_UNUSED(painter) } + virtual void parentPlotInitialized(QCustomPlot *parentPlot); + +private: + Q_DISABLE_COPY(QCPLayoutElement) + + friend class QCustomPlot; + friend class QCPLayout; + friend class QCPMarginGroup; +}; + + +class QCP_LIB_DECL QCPLayout : public QCPLayoutElement +{ + Q_OBJECT +public: + explicit QCPLayout(); + + // reimplemented virtual methods: + virtual void update(UpdatePhase phase); + virtual QList elements(bool recursive) const; + + // introduced virtual methods: + virtual int elementCount() const = 0; + virtual QCPLayoutElement* elementAt(int index) const = 0; + virtual QCPLayoutElement* takeAt(int index) = 0; + virtual bool take(QCPLayoutElement* element) = 0; + virtual void simplify(); + + // non-virtual methods: + bool removeAt(int index); + bool remove(QCPLayoutElement* element); + void clear(); + +protected: + // introduced virtual methods: + virtual void updateLayout(); + + // non-virtual methods: + void sizeConstraintsChanged() const; + void adoptElement(QCPLayoutElement *el); + void releaseElement(QCPLayoutElement *el); + QVector getSectionSizes(QVector maxSizes, QVector minSizes, QVector stretchFactors, int totalSize) const; + +private: + Q_DISABLE_COPY(QCPLayout) + friend class QCPLayoutElement; +}; + + +class QCP_LIB_DECL QCPLayoutGrid : public QCPLayout +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(int rowCount READ rowCount) + Q_PROPERTY(int columnCount READ columnCount) + Q_PROPERTY(QList columnStretchFactors READ columnStretchFactors WRITE setColumnStretchFactors) + Q_PROPERTY(QList rowStretchFactors READ rowStretchFactors WRITE setRowStretchFactors) + Q_PROPERTY(int columnSpacing READ columnSpacing WRITE setColumnSpacing) + Q_PROPERTY(int rowSpacing READ rowSpacing WRITE setRowSpacing) + /// \endcond +public: + explicit QCPLayoutGrid(); + virtual ~QCPLayoutGrid(); + + // getters: + int rowCount() const; + int columnCount() const; + QList columnStretchFactors() const { return mColumnStretchFactors; } + QList rowStretchFactors() const { return mRowStretchFactors; } + int columnSpacing() const { return mColumnSpacing; } + int rowSpacing() const { return mRowSpacing; } + + // setters: + void setColumnStretchFactor(int column, double factor); + void setColumnStretchFactors(const QList &factors); + void setRowStretchFactor(int row, double factor); + void setRowStretchFactors(const QList &factors); + void setColumnSpacing(int pixels); + void setRowSpacing(int pixels); + + // reimplemented virtual methods: + virtual void updateLayout(); + virtual int elementCount() const; + virtual QCPLayoutElement* elementAt(int index) const; + virtual QCPLayoutElement* takeAt(int index); + virtual bool take(QCPLayoutElement* element); + virtual QList elements(bool recursive) const; + virtual void simplify(); + virtual QSize minimumSizeHint() const; + virtual QSize maximumSizeHint() const; + + // non-virtual methods: + QCPLayoutElement *element(int row, int column) const; + bool addElement(int row, int column, QCPLayoutElement *element); + bool hasElement(int row, int column); + void expandTo(int newRowCount, int newColumnCount); + void insertRow(int newIndex); + void insertColumn(int newIndex); + +protected: + // property members: + QList > mElements; + QList mColumnStretchFactors; + QList mRowStretchFactors; + int mColumnSpacing, mRowSpacing; + + // non-virtual methods: + void getMinimumRowColSizes(QVector *minColWidths, QVector *minRowHeights) const; + void getMaximumRowColSizes(QVector *maxColWidths, QVector *maxRowHeights) const; + +private: + Q_DISABLE_COPY(QCPLayoutGrid) +}; + + +class QCP_LIB_DECL QCPLayoutInset : public QCPLayout +{ + Q_OBJECT +public: + /*! + Defines how the placement and sizing is handled for a certain element in a QCPLayoutInset. + */ + enum InsetPlacement { ipFree ///< The element may be positioned/sized arbitrarily, see \ref setInsetRect + ,ipBorderAligned ///< The element is aligned to one of the layout sides, see \ref setInsetAlignment + }; + + explicit QCPLayoutInset(); + virtual ~QCPLayoutInset(); + + // getters: + InsetPlacement insetPlacement(int index) const; + Qt::Alignment insetAlignment(int index) const; + QRectF insetRect(int index) const; + + // setters: + void setInsetPlacement(int index, InsetPlacement placement); + void setInsetAlignment(int index, Qt::Alignment alignment); + void setInsetRect(int index, const QRectF &rect); + + // reimplemented virtual methods: + virtual void updateLayout(); + virtual int elementCount() const; + virtual QCPLayoutElement* elementAt(int index) const; + virtual QCPLayoutElement* takeAt(int index); + virtual bool take(QCPLayoutElement* element); + virtual void simplify() {} + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + + // non-virtual methods: + void addElement(QCPLayoutElement *element, Qt::Alignment alignment); + void addElement(QCPLayoutElement *element, const QRectF &rect); + +protected: + // property members: + QList mElements; + QList mInsetPlacement; + QList mInsetAlignment; + QList mInsetRect; + +private: + Q_DISABLE_COPY(QCPLayoutInset) +}; + + +class QCP_LIB_DECL QCPLineEnding +{ + Q_GADGET +public: + /*! + Defines the type of ending decoration for line-like items, e.g. an arrow. + + \image html QCPLineEnding.png + + The width and length of these decorations can be controlled with the functions \ref setWidth + and \ref setLength. Some decorations like \ref esDisc, \ref esSquare, \ref esDiamond and \ref esBar only + support a width, the length property is ignored. + + \see QCPItemLine::setHead, QCPItemLine::setTail, QCPItemCurve::setHead, QCPItemCurve::setTail, QCPAxis::setLowerEnding, QCPAxis::setUpperEnding + */ + Q_ENUMS(EndingStyle) + enum EndingStyle { esNone ///< No ending decoration + ,esFlatArrow ///< A filled arrow head with a straight/flat back (a triangle) + ,esSpikeArrow ///< A filled arrow head with an indented back + ,esLineArrow ///< A non-filled arrow head with open back + ,esDisc ///< A filled circle + ,esSquare ///< A filled square + ,esDiamond ///< A filled diamond (45° rotated square) + ,esBar ///< A bar perpendicular to the line + ,esHalfBar ///< A bar perpendicular to the line, pointing out to only one side (to which side can be changed with \ref setInverted) + ,esSkewedBar ///< A bar that is skewed (skew controllable via \ref setLength) + }; + + QCPLineEnding(); + QCPLineEnding(EndingStyle style, double width=8, double length=10, bool inverted=false); + + // getters: + EndingStyle style() const { return mStyle; } + double width() const { return mWidth; } + double length() const { return mLength; } + bool inverted() const { return mInverted; } + + // setters: + void setStyle(EndingStyle style); + void setWidth(double width); + void setLength(double length); + void setInverted(bool inverted); + + // non-property methods: + double boundingDistance() const; + double realLength() const; + void draw(QCPPainter *painter, const QVector2D &pos, const QVector2D &dir) const; + void draw(QCPPainter *painter, const QVector2D &pos, double angle) const; + +protected: + // property members: + EndingStyle mStyle; + double mWidth, mLength; + bool mInverted; +}; +Q_DECLARE_TYPEINFO(QCPLineEnding, Q_MOVABLE_TYPE); + + +class QCP_LIB_DECL QCPGrid :public QCPLayerable +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(bool subGridVisible READ subGridVisible WRITE setSubGridVisible) + Q_PROPERTY(bool antialiasedSubGrid READ antialiasedSubGrid WRITE setAntialiasedSubGrid) + Q_PROPERTY(bool antialiasedZeroLine READ antialiasedZeroLine WRITE setAntialiasedZeroLine) + Q_PROPERTY(QPen pen READ pen WRITE setPen) + Q_PROPERTY(QPen subGridPen READ subGridPen WRITE setSubGridPen) + Q_PROPERTY(QPen zeroLinePen READ zeroLinePen WRITE setZeroLinePen) + /// \endcond +public: + QCPGrid(QCPAxis *parentAxis); + + // getters: + bool subGridVisible() const { return mSubGridVisible; } + bool antialiasedSubGrid() const { return mAntialiasedSubGrid; } + bool antialiasedZeroLine() const { return mAntialiasedZeroLine; } + QPen pen() const { return mPen; } + QPen subGridPen() const { return mSubGridPen; } + QPen zeroLinePen() const { return mZeroLinePen; } + + // setters: + void setSubGridVisible(bool visible); + void setAntialiasedSubGrid(bool enabled); + void setAntialiasedZeroLine(bool enabled); + void setPen(const QPen &pen); + void setSubGridPen(const QPen &pen); + void setZeroLinePen(const QPen &pen); + +protected: + // property members: + bool mSubGridVisible; + bool mAntialiasedSubGrid, mAntialiasedZeroLine; + QPen mPen, mSubGridPen, mZeroLinePen; + // non-property members: + QCPAxis *mParentAxis; + + // reimplemented virtual methods: + virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const; + virtual void draw(QCPPainter *painter); + + // non-virtual methods: + void drawGridLines(QCPPainter *painter) const; + void drawSubGridLines(QCPPainter *painter) const; + + friend class QCPAxis; +}; + + +class QCP_LIB_DECL QCPAxis : public QCPLayerable +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(AxisType axisType READ axisType) + Q_PROPERTY(QCPAxisRect* axisRect READ axisRect) + Q_PROPERTY(ScaleType scaleType READ scaleType WRITE setScaleType NOTIFY scaleTypeChanged) + Q_PROPERTY(double scaleLogBase READ scaleLogBase WRITE setScaleLogBase) + Q_PROPERTY(QCPRange range READ range WRITE setRange NOTIFY rangeChanged) + Q_PROPERTY(bool rangeReversed READ rangeReversed WRITE setRangeReversed) + Q_PROPERTY(bool autoTicks READ autoTicks WRITE setAutoTicks) + Q_PROPERTY(int autoTickCount READ autoTickCount WRITE setAutoTickCount) + Q_PROPERTY(bool autoTickLabels READ autoTickLabels WRITE setAutoTickLabels) + Q_PROPERTY(bool autoTickStep READ autoTickStep WRITE setAutoTickStep) + Q_PROPERTY(bool autoSubTicks READ autoSubTicks WRITE setAutoSubTicks) + Q_PROPERTY(bool ticks READ ticks WRITE setTicks) + Q_PROPERTY(bool tickLabels READ tickLabels WRITE setTickLabels) + Q_PROPERTY(int tickLabelPadding READ tickLabelPadding WRITE setTickLabelPadding) + Q_PROPERTY(LabelType tickLabelType READ tickLabelType WRITE setTickLabelType) + Q_PROPERTY(QFont tickLabelFont READ tickLabelFont WRITE setTickLabelFont) + Q_PROPERTY(QColor tickLabelColor READ tickLabelColor WRITE setTickLabelColor) + Q_PROPERTY(double tickLabelRotation READ tickLabelRotation WRITE setTickLabelRotation) + Q_PROPERTY(LabelSide tickLabelSide READ tickLabelSide WRITE setTickLabelSide) + Q_PROPERTY(QString dateTimeFormat READ dateTimeFormat WRITE setDateTimeFormat) + Q_PROPERTY(Qt::TimeSpec dateTimeSpec READ dateTimeSpec WRITE setDateTimeSpec) + Q_PROPERTY(QString numberFormat READ numberFormat WRITE setNumberFormat) + Q_PROPERTY(int numberPrecision READ numberPrecision WRITE setNumberPrecision) + Q_PROPERTY(double tickStep READ tickStep WRITE setTickStep) + Q_PROPERTY(QVector tickVector READ tickVector WRITE setTickVector) + Q_PROPERTY(QVector tickVectorLabels READ tickVectorLabels WRITE setTickVectorLabels) + Q_PROPERTY(int tickLengthIn READ tickLengthIn WRITE setTickLengthIn) + Q_PROPERTY(int tickLengthOut READ tickLengthOut WRITE setTickLengthOut) + Q_PROPERTY(int subTickCount READ subTickCount WRITE setSubTickCount) + Q_PROPERTY(int subTickLengthIn READ subTickLengthIn WRITE setSubTickLengthIn) + Q_PROPERTY(int subTickLengthOut READ subTickLengthOut WRITE setSubTickLengthOut) + Q_PROPERTY(QPen basePen READ basePen WRITE setBasePen) + Q_PROPERTY(QPen tickPen READ tickPen WRITE setTickPen) + Q_PROPERTY(QPen subTickPen READ subTickPen WRITE setSubTickPen) + Q_PROPERTY(QFont labelFont READ labelFont WRITE setLabelFont) + Q_PROPERTY(QColor labelColor READ labelColor WRITE setLabelColor) + Q_PROPERTY(QString label READ label WRITE setLabel) + Q_PROPERTY(int labelPadding READ labelPadding WRITE setLabelPadding) + Q_PROPERTY(int padding READ padding WRITE setPadding) + Q_PROPERTY(int offset READ offset WRITE setOffset) + Q_PROPERTY(SelectableParts selectedParts READ selectedParts WRITE setSelectedParts NOTIFY selectionChanged) + Q_PROPERTY(SelectableParts selectableParts READ selectableParts WRITE setSelectableParts NOTIFY selectableChanged) + Q_PROPERTY(QFont selectedTickLabelFont READ selectedTickLabelFont WRITE setSelectedTickLabelFont) + Q_PROPERTY(QFont selectedLabelFont READ selectedLabelFont WRITE setSelectedLabelFont) + Q_PROPERTY(QColor selectedTickLabelColor READ selectedTickLabelColor WRITE setSelectedTickLabelColor) + Q_PROPERTY(QColor selectedLabelColor READ selectedLabelColor WRITE setSelectedLabelColor) + Q_PROPERTY(QPen selectedBasePen READ selectedBasePen WRITE setSelectedBasePen) + Q_PROPERTY(QPen selectedTickPen READ selectedTickPen WRITE setSelectedTickPen) + Q_PROPERTY(QPen selectedSubTickPen READ selectedSubTickPen WRITE setSelectedSubTickPen) + Q_PROPERTY(QCPLineEnding lowerEnding READ lowerEnding WRITE setLowerEnding) + Q_PROPERTY(QCPLineEnding upperEnding READ upperEnding WRITE setUpperEnding) + Q_PROPERTY(QCPGrid* grid READ grid) + /// \endcond +public: + /*! + Defines at which side of the axis rect the axis will appear. This also affects how the tick + marks are drawn, on which side the labels are placed etc. + */ + enum AxisType { atLeft = 0x01 ///< 0x01 Axis is vertical and on the left side of the axis rect + ,atRight = 0x02 ///< 0x02 Axis is vertical and on the right side of the axis rect + ,atTop = 0x04 ///< 0x04 Axis is horizontal and on the top side of the axis rect + ,atBottom = 0x08 ///< 0x08 Axis is horizontal and on the bottom side of the axis rect + }; + Q_FLAGS(AxisType AxisTypes) + Q_DECLARE_FLAGS(AxisTypes, AxisType) + /*! + When automatic tick label generation is enabled (\ref setAutoTickLabels), defines how the + coordinate of the tick is interpreted, i.e. translated into a string. + + \see setTickLabelType + */ + enum LabelType { ltNumber ///< Tick coordinate is regarded as normal number and will be displayed as such. (see \ref setNumberFormat) + ,ltDateTime ///< Tick coordinate is regarded as a date/time (seconds since 1970-01-01T00:00:00 UTC) and will be displayed and formatted as such. (for details, see \ref setDateTimeFormat) + }; + Q_ENUMS(LabelType) + /*! + Defines on which side of the axis the tick labels (numbers) shall appear. + + \see setTickLabelSide + */ + enum LabelSide { lsInside ///< Tick labels will be displayed inside the axis rect and clipped to the inner axis rect + ,lsOutside ///< Tick labels will be displayed outside the axis rect + }; + Q_ENUMS(LabelSide) + /*! + Defines the scale of an axis. + \see setScaleType + */ + enum ScaleType { stLinear ///< Linear scaling + ,stLogarithmic ///< Logarithmic scaling with correspondingly transformed plots and (major) tick marks at every base power (see \ref setScaleLogBase). + }; + Q_ENUMS(ScaleType) + /*! + Defines the selectable parts of an axis. + \see setSelectableParts, setSelectedParts + */ + enum SelectablePart { spNone = 0 ///< None of the selectable parts + ,spAxis = 0x001 ///< The axis backbone and tick marks + ,spTickLabels = 0x002 ///< Tick labels (numbers) of this axis (as a whole, not individually) + ,spAxisLabel = 0x004 ///< The axis label + }; + Q_FLAGS(SelectablePart SelectableParts) + Q_DECLARE_FLAGS(SelectableParts, SelectablePart) + + explicit QCPAxis(QCPAxisRect *parent, AxisType type); + virtual ~QCPAxis(); + + // getters: + AxisType axisType() const { return mAxisType; } + QCPAxisRect *axisRect() const { return mAxisRect; } + ScaleType scaleType() const { return mScaleType; } + double scaleLogBase() const { return mScaleLogBase; } + const QCPRange range() const { return mRange; } + bool rangeReversed() const { return mRangeReversed; } + bool autoTicks() const { return mAutoTicks; } + int autoTickCount() const { return mAutoTickCount; } + bool autoTickLabels() const { return mAutoTickLabels; } + bool autoTickStep() const { return mAutoTickStep; } + bool autoSubTicks() const { return mAutoSubTicks; } + bool ticks() const { return mTicks; } + bool tickLabels() const { return mTickLabels; } + int tickLabelPadding() const; + LabelType tickLabelType() const { return mTickLabelType; } + QFont tickLabelFont() const { return mTickLabelFont; } + QColor tickLabelColor() const { return mTickLabelColor; } + double tickLabelRotation() const; + LabelSide tickLabelSide() const; + QString dateTimeFormat() const { return mDateTimeFormat; } + Qt::TimeSpec dateTimeSpec() const { return mDateTimeSpec; } + QString numberFormat() const; + int numberPrecision() const { return mNumberPrecision; } + double tickStep() const { return mTickStep; } + QVector tickVector() const { return mTickVector; } + QVector tickVectorLabels() const { return mTickVectorLabels; } + int tickLengthIn() const; + int tickLengthOut() const; + int subTickCount() const { return mSubTickCount; } + int subTickLengthIn() const; + int subTickLengthOut() const; + QPen basePen() const { return mBasePen; } + QPen tickPen() const { return mTickPen; } + QPen subTickPen() const { return mSubTickPen; } + QFont labelFont() const { return mLabelFont; } + QColor labelColor() const { return mLabelColor; } + QString label() const { return mLabel; } + int labelPadding() const; + int padding() const { return mPadding; } + int offset() const; + SelectableParts selectedParts() const { return mSelectedParts; } + SelectableParts selectableParts() const { return mSelectableParts; } + QFont selectedTickLabelFont() const { return mSelectedTickLabelFont; } + QFont selectedLabelFont() const { return mSelectedLabelFont; } + QColor selectedTickLabelColor() const { return mSelectedTickLabelColor; } + QColor selectedLabelColor() const { return mSelectedLabelColor; } + QPen selectedBasePen() const { return mSelectedBasePen; } + QPen selectedTickPen() const { return mSelectedTickPen; } + QPen selectedSubTickPen() const { return mSelectedSubTickPen; } + QCPLineEnding lowerEnding() const; + QCPLineEnding upperEnding() const; + QCPGrid *grid() const { return mGrid; } + + // setters: + Q_SLOT void setScaleType(QCPAxis::ScaleType type); + void setScaleLogBase(double base); + Q_SLOT void setRange(const QCPRange &range); + void setRange(double lower, double upper); + void setRange(double position, double size, Qt::AlignmentFlag alignment); + void setRangeLower(double lower); + void setRangeUpper(double upper); + void setRangeReversed(bool reversed); + void setAutoTicks(bool on); + void setAutoTickCount(int approximateCount); + void setAutoTickLabels(bool on); + void setAutoTickStep(bool on); + void setAutoSubTicks(bool on); + void setTicks(bool show); + void setTickLabels(bool show); + void setTickLabelPadding(int padding); + void setTickLabelType(LabelType type); + void setTickLabelFont(const QFont &font); + void setTickLabelColor(const QColor &color); + void setTickLabelRotation(double degrees); + void setTickLabelSide(LabelSide side); + void setDateTimeFormat(const QString &format); + void setDateTimeSpec(const Qt::TimeSpec &timeSpec); + void setNumberFormat(const QString &formatCode); + void setNumberPrecision(int precision); + void setTickStep(double step); + void setTickVector(const QVector &vec); + void setTickVectorLabels(const QVector &vec); + void setTickLength(int inside, int outside=0); + void setTickLengthIn(int inside); + void setTickLengthOut(int outside); + void setSubTickCount(int count); + void setSubTickLength(int inside, int outside=0); + void setSubTickLengthIn(int inside); + void setSubTickLengthOut(int outside); + void setBasePen(const QPen &pen); + void setTickPen(const QPen &pen); + void setSubTickPen(const QPen &pen); + void setLabelFont(const QFont &font); + void setLabelColor(const QColor &color); + void setLabel(const QString &str); + void setLabelPadding(int padding); + void setPadding(int padding); + void setOffset(int offset); + void setSelectedTickLabelFont(const QFont &font); + void setSelectedLabelFont(const QFont &font); + void setSelectedTickLabelColor(const QColor &color); + void setSelectedLabelColor(const QColor &color); + void setSelectedBasePen(const QPen &pen); + void setSelectedTickPen(const QPen &pen); + void setSelectedSubTickPen(const QPen &pen); + Q_SLOT void setSelectableParts(const QCPAxis::SelectableParts &selectableParts); + Q_SLOT void setSelectedParts(const QCPAxis::SelectableParts &selectedParts); + void setLowerEnding(const QCPLineEnding &ending); + void setUpperEnding(const QCPLineEnding &ending); + + // reimplemented virtual methods: + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + + // non-property methods: + Qt::Orientation orientation() const { return mOrientation; } + void moveRange(double diff); + void scaleRange(double factor, double center); + void setScaleRatio(const QCPAxis *otherAxis, double ratio=1.0); + void rescale(bool onlyVisiblePlottables=false); + double pixelToCoord(double value) const; + double coordToPixel(double value) const; + SelectablePart getPartAt(const QPointF &pos) const; + QList plottables() const; + QList graphs() const; + QList items() const; + + static AxisType marginSideToAxisType(QCP::MarginSide side); + static Qt::Orientation orientation(AxisType type) { return type==atBottom||type==atTop ? Qt::Horizontal : Qt::Vertical; } + static AxisType opposite(AxisType type); + +signals: + void ticksRequest(); + void rangeChanged(const QCPRange &newRange); + void rangeChanged(const QCPRange &newRange, const QCPRange &oldRange); + void scaleTypeChanged(QCPAxis::ScaleType scaleType); + void selectionChanged(const QCPAxis::SelectableParts &parts); + void selectableChanged(const QCPAxis::SelectableParts &parts); + +protected: + // property members: + // axis base: + AxisType mAxisType; + QCPAxisRect *mAxisRect; + //int mOffset; // in QCPAxisPainter + int mPadding; + Qt::Orientation mOrientation; + SelectableParts mSelectableParts, mSelectedParts; + QPen mBasePen, mSelectedBasePen; + //QCPLineEnding mLowerEnding, mUpperEnding; // in QCPAxisPainter + // axis label: + //int mLabelPadding; // in QCPAxisPainter + QString mLabel; + QFont mLabelFont, mSelectedLabelFont; + QColor mLabelColor, mSelectedLabelColor; + // tick labels: + //int mTickLabelPadding; // in QCPAxisPainter + bool mTickLabels, mAutoTickLabels; + //double mTickLabelRotation; // in QCPAxisPainter + LabelType mTickLabelType; + QFont mTickLabelFont, mSelectedTickLabelFont; + QColor mTickLabelColor, mSelectedTickLabelColor; + QString mDateTimeFormat; + Qt::TimeSpec mDateTimeSpec; + int mNumberPrecision; + QLatin1Char mNumberFormatChar; + bool mNumberBeautifulPowers; + //bool mNumberMultiplyCross; // QCPAxisPainter + // ticks and subticks: + bool mTicks; + double mTickStep; + int mSubTickCount, mAutoTickCount; + bool mAutoTicks, mAutoTickStep, mAutoSubTicks; + //int mTickLengthIn, mTickLengthOut, mSubTickLengthIn, mSubTickLengthOut; // QCPAxisPainter + QPen mTickPen, mSelectedTickPen; + QPen mSubTickPen, mSelectedSubTickPen; + // scale and range: + QCPRange mRange; + bool mRangeReversed; + ScaleType mScaleType; + double mScaleLogBase, mScaleLogBaseLogInv; + + // non-property members: + QCPGrid *mGrid; + QCPAxisPainterPrivate *mAxisPainter; + int mLowestVisibleTick, mHighestVisibleTick; + QVector mTickVector; + QVector mTickVectorLabels; + QVector mSubTickVector; + bool mCachedMarginValid; + int mCachedMargin; + + // introduced virtual methods: + virtual void setupTickVectors(); + virtual void generateAutoTicks(); + virtual int calculateAutoSubTickCount(double tickStep) const; + virtual int calculateMargin(); + + // reimplemented virtual methods: + virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const; + virtual void draw(QCPPainter *painter); + virtual QCP::Interaction selectionCategory() const; + // events: + virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged); + virtual void deselectEvent(bool *selectionStateChanged); + + // non-virtual methods: + void visibleTickBounds(int &lowIndex, int &highIndex) const; + double baseLog(double value) const; + double basePow(double value) const; + QPen getBasePen() const; + QPen getTickPen() const; + QPen getSubTickPen() const; + QFont getTickLabelFont() const; + QFont getLabelFont() const; + QColor getTickLabelColor() const; + QColor getLabelColor() const; + +private: + Q_DISABLE_COPY(QCPAxis) + + friend class QCustomPlot; + friend class QCPGrid; + friend class QCPAxisRect; +}; +Q_DECLARE_OPERATORS_FOR_FLAGS(QCPAxis::SelectableParts) +Q_DECLARE_OPERATORS_FOR_FLAGS(QCPAxis::AxisTypes) +Q_DECLARE_METATYPE(QCPAxis::SelectablePart) + + +class QCPAxisPainterPrivate +{ +public: + explicit QCPAxisPainterPrivate(QCustomPlot *parentPlot); + virtual ~QCPAxisPainterPrivate(); + + virtual void draw(QCPPainter *painter); + virtual int size() const; + void clearCache(); + + QRect axisSelectionBox() const { return mAxisSelectionBox; } + QRect tickLabelsSelectionBox() const { return mTickLabelsSelectionBox; } + QRect labelSelectionBox() const { return mLabelSelectionBox; } + + // public property members: + QCPAxis::AxisType type; + QPen basePen; + QCPLineEnding lowerEnding, upperEnding; // directly accessed by QCPAxis setters/getters + int labelPadding; // directly accessed by QCPAxis setters/getters + QFont labelFont; + QColor labelColor; + QString label; + int tickLabelPadding; // directly accessed by QCPAxis setters/getters + double tickLabelRotation; // directly accessed by QCPAxis setters/getters + QCPAxis::LabelSide tickLabelSide; // directly accessed by QCPAxis setters/getters + bool substituteExponent; + bool numberMultiplyCross; // directly accessed by QCPAxis setters/getters + int tickLengthIn, tickLengthOut, subTickLengthIn, subTickLengthOut; // directly accessed by QCPAxis setters/getters + QPen tickPen, subTickPen; + QFont tickLabelFont; + QColor tickLabelColor; + QRect axisRect, viewportRect; + double offset; // directly accessed by QCPAxis setters/getters + bool abbreviateDecimalPowers; + bool reversedEndings; + + QVector subTickPositions; + QVector tickPositions; + QVector tickLabels; + +protected: + struct CachedLabel + { + QPointF offset; + QPixmap pixmap; + }; + struct TickLabelData + { + QString basePart, expPart; + QRect baseBounds, expBounds, totalBounds, rotatedTotalBounds; + QFont baseFont, expFont; + }; + QCustomPlot *mParentPlot; + QByteArray mLabelParameterHash; // to determine whether mLabelCache needs to be cleared due to changed parameters + QCache mLabelCache; + QRect mAxisSelectionBox, mTickLabelsSelectionBox, mLabelSelectionBox; + + virtual QByteArray generateLabelParameterHash() const; + + virtual void placeTickLabel(QCPPainter *painter, double position, int distanceToAxis, const QString &text, QSize *tickLabelsSize); + virtual void drawTickLabel(QCPPainter *painter, double x, double y, const TickLabelData &labelData) const; + virtual TickLabelData getTickLabelData(const QFont &font, const QString &text) const; + virtual QPointF getTickLabelDrawOffset(const TickLabelData &labelData) const; + virtual void getMaxTickLabelSize(const QFont &font, const QString &text, QSize *tickLabelsSize) const; +}; + + +class QCP_LIB_DECL QCPAbstractPlottable : public QCPLayerable +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QString name READ name WRITE setName) + Q_PROPERTY(bool antialiasedFill READ antialiasedFill WRITE setAntialiasedFill) + Q_PROPERTY(bool antialiasedScatters READ antialiasedScatters WRITE setAntialiasedScatters) + Q_PROPERTY(bool antialiasedErrorBars READ antialiasedErrorBars WRITE setAntialiasedErrorBars) + Q_PROPERTY(QPen pen READ pen WRITE setPen) + Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen) + Q_PROPERTY(QBrush brush READ brush WRITE setBrush) + Q_PROPERTY(QBrush selectedBrush READ selectedBrush WRITE setSelectedBrush) + Q_PROPERTY(QCPAxis* keyAxis READ keyAxis WRITE setKeyAxis) + Q_PROPERTY(QCPAxis* valueAxis READ valueAxis WRITE setValueAxis) + Q_PROPERTY(bool selectable READ selectable WRITE setSelectable NOTIFY selectableChanged) + Q_PROPERTY(bool selected READ selected WRITE setSelected NOTIFY selectionChanged) + /// \endcond +public: + QCPAbstractPlottable(QCPAxis *keyAxis, QCPAxis *valueAxis); + + // getters: + QString name() const { return mName; } + bool antialiasedFill() const { return mAntialiasedFill; } + bool antialiasedScatters() const { return mAntialiasedScatters; } + bool antialiasedErrorBars() const { return mAntialiasedErrorBars; } + QPen pen() const { return mPen; } + QPen selectedPen() const { return mSelectedPen; } + QBrush brush() const { return mBrush; } + QBrush selectedBrush() const { return mSelectedBrush; } + QCPAxis *keyAxis() const { return mKeyAxis.data(); } + QCPAxis *valueAxis() const { return mValueAxis.data(); } + bool selectable() const { return mSelectable; } + bool selected() const { return mSelected; } + + // setters: + void setName(const QString &name); + void setAntialiasedFill(bool enabled); + void setAntialiasedScatters(bool enabled); + void setAntialiasedErrorBars(bool enabled); + void setPen(const QPen &pen); + void setSelectedPen(const QPen &pen); + void setBrush(const QBrush &brush); + void setSelectedBrush(const QBrush &brush); + void setKeyAxis(QCPAxis *axis); + void setValueAxis(QCPAxis *axis); + Q_SLOT void setSelectable(bool selectable); + Q_SLOT void setSelected(bool selected); + + // introduced virtual methods: + virtual void clearData() = 0; + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const = 0; + virtual bool addToLegend(); + virtual bool removeFromLegend() const; + + // non-property methods: + void rescaleAxes(bool onlyEnlarge=false) const; + void rescaleKeyAxis(bool onlyEnlarge=false) const; + void rescaleValueAxis(bool onlyEnlarge=false) const; + +signals: + void selectionChanged(bool selected); + void selectableChanged(bool selectable); + +protected: + /*! + Represents negative and positive sign domain for passing to \ref getKeyRange and \ref getValueRange. + */ + enum SignDomain { sdNegative ///< The negative sign domain, i.e. numbers smaller than zero + ,sdBoth ///< Both sign domains, including zero, i.e. all (rational) numbers + ,sdPositive ///< The positive sign domain, i.e. numbers greater than zero + }; + + // property members: + QString mName; + bool mAntialiasedFill, mAntialiasedScatters, mAntialiasedErrorBars; + QPen mPen, mSelectedPen; + QBrush mBrush, mSelectedBrush; + QPointer mKeyAxis, mValueAxis; + bool mSelectable, mSelected; + + // reimplemented virtual methods: + virtual QRect clipRect() const; + virtual void draw(QCPPainter *painter) = 0; + virtual QCP::Interaction selectionCategory() const; + void applyDefaultAntialiasingHint(QCPPainter *painter) const; + // events: + virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged); + virtual void deselectEvent(bool *selectionStateChanged); + + // introduced virtual methods: + virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const = 0; + virtual QCPRange getKeyRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const = 0; + virtual QCPRange getValueRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const = 0; + + // non-virtual methods: + void coordsToPixels(double key, double value, double &x, double &y) const; + const QPointF coordsToPixels(double key, double value) const; + void pixelsToCoords(double x, double y, double &key, double &value) const; + void pixelsToCoords(const QPointF &pixelPos, double &key, double &value) const; + QPen mainPen() const; + QBrush mainBrush() const; + void applyFillAntialiasingHint(QCPPainter *painter) const; + void applyScattersAntialiasingHint(QCPPainter *painter) const; + void applyErrorBarsAntialiasingHint(QCPPainter *painter) const; + double distSqrToLine(const QPointF &start, const QPointF &end, const QPointF &point) const; + +private: + Q_DISABLE_COPY(QCPAbstractPlottable) + + friend class QCustomPlot; + friend class QCPAxis; + friend class QCPPlottableLegendItem; +}; + + +class QCP_LIB_DECL QCPItemAnchor +{ +public: + QCPItemAnchor(QCustomPlot *parentPlot, QCPAbstractItem *parentItem, const QString name, int anchorId=-1); + virtual ~QCPItemAnchor(); + + // getters: + QString name() const { return mName; } + virtual QPointF pixelPoint() const; + +protected: + // property members: + QString mName; + + // non-property members: + QCustomPlot *mParentPlot; + QCPAbstractItem *mParentItem; + int mAnchorId; + QSet mChildrenX, mChildrenY; + + // introduced virtual methods: + virtual QCPItemPosition *toQCPItemPosition() { return 0; } + + // non-virtual methods: + void addChildX(QCPItemPosition* pos); // called from pos when this anchor is set as parent + void removeChildX(QCPItemPosition *pos); // called from pos when its parent anchor is reset or pos deleted + void addChildY(QCPItemPosition* pos); // called from pos when this anchor is set as parent + void removeChildY(QCPItemPosition *pos); // called from pos when its parent anchor is reset or pos deleted + +private: + Q_DISABLE_COPY(QCPItemAnchor) + + friend class QCPItemPosition; +}; + + + +class QCP_LIB_DECL QCPItemPosition : public QCPItemAnchor +{ +public: + /*! + Defines the ways an item position can be specified. Thus it defines what the numbers passed to + \ref setCoords actually mean. + + \see setType + */ + enum PositionType { ptAbsolute ///< Static positioning in pixels, starting from the top left corner of the viewport/widget. + ,ptViewportRatio ///< Static positioning given by a fraction of the viewport size. For example, if you call setCoords(0, 0), the position will be at the top + ///< left corner of the viewport/widget. setCoords(1, 1) will be at the bottom right corner, setCoords(0.5, 0) will be horizontally centered and + ///< vertically at the top of the viewport/widget, etc. + ,ptAxisRectRatio ///< Static positioning given by a fraction of the axis rect size (see \ref setAxisRect). For example, if you call setCoords(0, 0), the position will be at the top + ///< left corner of the axis rect. setCoords(1, 1) will be at the bottom right corner, setCoords(0.5, 0) will be horizontally centered and + ///< vertically at the top of the axis rect, etc. You can also go beyond the axis rect by providing negative coordinates or coordinates larger than 1. + ,ptPlotCoords ///< Dynamic positioning at a plot coordinate defined by two axes (see \ref setAxes). + }; + + QCPItemPosition(QCustomPlot *parentPlot, QCPAbstractItem *parentItem, const QString name); + virtual ~QCPItemPosition(); + + // getters: + PositionType type() const { return typeX(); } + PositionType typeX() const { return mPositionTypeX; } + PositionType typeY() const { return mPositionTypeY; } + QCPItemAnchor *parentAnchor() const { return parentAnchorX(); } + QCPItemAnchor *parentAnchorX() const { return mParentAnchorX; } + QCPItemAnchor *parentAnchorY() const { return mParentAnchorY; } + double key() const { return mKey; } + double value() const { return mValue; } + QPointF coords() const { return QPointF(mKey, mValue); } + QCPAxis *keyAxis() const { return mKeyAxis.data(); } + QCPAxis *valueAxis() const { return mValueAxis.data(); } + QCPAxisRect *axisRect() const; + virtual QPointF pixelPoint() const; + + // setters: + void setType(PositionType type); + void setTypeX(PositionType type); + void setTypeY(PositionType type); + bool setParentAnchor(QCPItemAnchor *parentAnchor, bool keepPixelPosition=false); + bool setParentAnchorX(QCPItemAnchor *parentAnchor, bool keepPixelPosition=false); + bool setParentAnchorY(QCPItemAnchor *parentAnchor, bool keepPixelPosition=false); + void setCoords(double key, double value); + void setCoords(const QPointF &coords); + void setAxes(QCPAxis* keyAxis, QCPAxis* valueAxis); + void setAxisRect(QCPAxisRect *axisRect); + void setPixelPoint(const QPointF &pixelPoint); + +protected: + // property members: + PositionType mPositionTypeX, mPositionTypeY; + QPointer mKeyAxis, mValueAxis; + QPointer mAxisRect; + double mKey, mValue; + QCPItemAnchor *mParentAnchorX, *mParentAnchorY; + + // reimplemented virtual methods: + virtual QCPItemPosition *toQCPItemPosition() { return this; } + +private: + Q_DISABLE_COPY(QCPItemPosition) + +}; + + +class QCP_LIB_DECL QCPAbstractItem : public QCPLayerable +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(bool clipToAxisRect READ clipToAxisRect WRITE setClipToAxisRect) + Q_PROPERTY(QCPAxisRect* clipAxisRect READ clipAxisRect WRITE setClipAxisRect) + Q_PROPERTY(bool selectable READ selectable WRITE setSelectable NOTIFY selectableChanged) + Q_PROPERTY(bool selected READ selected WRITE setSelected NOTIFY selectionChanged) + /// \endcond +public: + QCPAbstractItem(QCustomPlot *parentPlot); + virtual ~QCPAbstractItem(); + + // getters: + bool clipToAxisRect() const { return mClipToAxisRect; } + QCPAxisRect *clipAxisRect() const; + bool selectable() const { return mSelectable; } + bool selected() const { return mSelected; } + + // setters: + void setClipToAxisRect(bool clip); + void setClipAxisRect(QCPAxisRect *rect); + Q_SLOT void setSelectable(bool selectable); + Q_SLOT void setSelected(bool selected); + + // reimplemented virtual methods: + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const = 0; + + // non-virtual methods: + QList positions() const { return mPositions; } + QList anchors() const { return mAnchors; } + QCPItemPosition *position(const QString &name) const; + QCPItemAnchor *anchor(const QString &name) const; + bool hasAnchor(const QString &name) const; + +signals: + void selectionChanged(bool selected); + void selectableChanged(bool selectable); + +protected: + // property members: + bool mClipToAxisRect; + QPointer mClipAxisRect; + QList mPositions; + QList mAnchors; + bool mSelectable, mSelected; + + // reimplemented virtual methods: + virtual QCP::Interaction selectionCategory() const; + virtual QRect clipRect() const; + virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const; + virtual void draw(QCPPainter *painter) = 0; + // events: + virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged); + virtual void deselectEvent(bool *selectionStateChanged); + + // introduced virtual methods: + virtual QPointF anchorPixelPoint(int anchorId) const; + + // non-virtual methods: + double distSqrToLine(const QPointF &start, const QPointF &end, const QPointF &point) const; + double rectSelectTest(const QRectF &rect, const QPointF &pos, bool filledRect) const; + QCPItemPosition *createPosition(const QString &name); + QCPItemAnchor *createAnchor(const QString &name, int anchorId); + +private: + Q_DISABLE_COPY(QCPAbstractItem) + + friend class QCustomPlot; + friend class QCPItemAnchor; +}; + + +class QCP_LIB_DECL QCustomPlot : public QWidget +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QRect viewport READ viewport WRITE setViewport) + Q_PROPERTY(QPixmap background READ background WRITE setBackground) + Q_PROPERTY(bool backgroundScaled READ backgroundScaled WRITE setBackgroundScaled) + Q_PROPERTY(Qt::AspectRatioMode backgroundScaledMode READ backgroundScaledMode WRITE setBackgroundScaledMode) + Q_PROPERTY(QCPLayoutGrid* plotLayout READ plotLayout) + Q_PROPERTY(bool autoAddPlottableToLegend READ autoAddPlottableToLegend WRITE setAutoAddPlottableToLegend) + Q_PROPERTY(int selectionTolerance READ selectionTolerance WRITE setSelectionTolerance) + Q_PROPERTY(bool noAntialiasingOnDrag READ noAntialiasingOnDrag WRITE setNoAntialiasingOnDrag) + Q_PROPERTY(Qt::KeyboardModifier multiSelectModifier READ multiSelectModifier WRITE setMultiSelectModifier) + /// \endcond +public: + /*! + Defines how a layer should be inserted relative to an other layer. + + \see addLayer, moveLayer + */ + enum LayerInsertMode { limBelow ///< Layer is inserted below other layer + ,limAbove ///< Layer is inserted above other layer + }; + Q_ENUMS(LayerInsertMode) + + /*! + Defines with what timing the QCustomPlot surface is refreshed after a replot. + + \see replot + */ + enum RefreshPriority { rpImmediate ///< The QCustomPlot surface is immediately refreshed, by calling QWidget::repaint() after the replot + ,rpQueued ///< Queues the refresh such that it is performed at a slightly delayed point in time after the replot, by calling QWidget::update() after the replot + ,rpHint ///< Whether to use immediate repaint or queued update depends on whether the plotting hint \ref QCP::phForceRepaint is set, see \ref setPlottingHints. + }; + + explicit QCustomPlot(QWidget *parent = 0); + virtual ~QCustomPlot(); + + // getters: + QRect viewport() const { return mViewport; } + QPixmap background() const { return mBackgroundPixmap; } + bool backgroundScaled() const { return mBackgroundScaled; } + Qt::AspectRatioMode backgroundScaledMode() const { return mBackgroundScaledMode; } + QCPLayoutGrid *plotLayout() const { return mPlotLayout; } + QCP::AntialiasedElements antialiasedElements() const { return mAntialiasedElements; } + QCP::AntialiasedElements notAntialiasedElements() const { return mNotAntialiasedElements; } + bool autoAddPlottableToLegend() const { return mAutoAddPlottableToLegend; } + const QCP::Interactions interactions() const { return mInteractions; } + int selectionTolerance() const { return mSelectionTolerance; } + bool noAntialiasingOnDrag() const { return mNoAntialiasingOnDrag; } + QCP::PlottingHints plottingHints() const { return mPlottingHints; } + Qt::KeyboardModifier multiSelectModifier() const { return mMultiSelectModifier; } + + // setters: + void setViewport(const QRect &rect); + void setBackground(const QPixmap &pm); + void setBackground(const QPixmap &pm, bool scaled, Qt::AspectRatioMode mode=Qt::KeepAspectRatioByExpanding); + void setBackground(const QBrush &brush); + void setBackgroundScaled(bool scaled); + void setBackgroundScaledMode(Qt::AspectRatioMode mode); + void setAntialiasedElements(const QCP::AntialiasedElements &antialiasedElements); + void setAntialiasedElement(QCP::AntialiasedElement antialiasedElement, bool enabled=true); + void setNotAntialiasedElements(const QCP::AntialiasedElements ¬AntialiasedElements); + void setNotAntialiasedElement(QCP::AntialiasedElement notAntialiasedElement, bool enabled=true); + void setAutoAddPlottableToLegend(bool on); + void setInteractions(const QCP::Interactions &interactions); + void setInteraction(const QCP::Interaction &interaction, bool enabled=true); + void setSelectionTolerance(int pixels); + void setNoAntialiasingOnDrag(bool enabled); + void setPlottingHints(const QCP::PlottingHints &hints); + void setPlottingHint(QCP::PlottingHint hint, bool enabled=true); + void setMultiSelectModifier(Qt::KeyboardModifier modifier); + + // non-property methods: + // plottable interface: + QCPAbstractPlottable *plottable(int index); + QCPAbstractPlottable *plottable(); + bool addPlottable(QCPAbstractPlottable *plottable); + bool removePlottable(QCPAbstractPlottable *plottable); + bool removePlottable(int index); + int clearPlottables(); + int plottableCount() const; + QList selectedPlottables() const; + QCPAbstractPlottable *plottableAt(const QPointF &pos, bool onlySelectable=false) const; + bool hasPlottable(QCPAbstractPlottable *plottable) const; + + // specialized interface for QCPGraph: + QCPGraph *graph(int index) const; + QCPGraph *graph() const; + QCPGraph *addGraph(QCPAxis *keyAxis=0, QCPAxis *valueAxis=0); + bool removeGraph(QCPGraph *graph); + bool removeGraph(int index); + int clearGraphs(); + int graphCount() const; + QList selectedGraphs() const; + + // item interface: + QCPAbstractItem *item(int index) const; + QCPAbstractItem *item() const; + bool addItem(QCPAbstractItem* item); + bool removeItem(QCPAbstractItem *item); + bool removeItem(int index); + int clearItems(); + int itemCount() const; + QList selectedItems() const; + QCPAbstractItem *itemAt(const QPointF &pos, bool onlySelectable=false) const; + bool hasItem(QCPAbstractItem *item) const; + + // layer interface: + QCPLayer *layer(const QString &name) const; + QCPLayer *layer(int index) const; + QCPLayer *currentLayer() const; + bool setCurrentLayer(const QString &name); + bool setCurrentLayer(QCPLayer *layer); + int layerCount() const; + bool addLayer(const QString &name, QCPLayer *otherLayer=0, LayerInsertMode insertMode=limAbove); + bool removeLayer(QCPLayer *layer); + bool moveLayer(QCPLayer *layer, QCPLayer *otherLayer, LayerInsertMode insertMode=limAbove); + + // axis rect/layout interface: + int axisRectCount() const; + QCPAxisRect* axisRect(int index=0) const; + QList axisRects() const; + QCPLayoutElement* layoutElementAt(const QPointF &pos) const; + Q_SLOT void rescaleAxes(bool onlyVisiblePlottables=false); + + QList selectedAxes() const; + QList selectedLegends() const; + Q_SLOT void deselectAll(); + + bool savePdf(const QString &fileName, bool noCosmeticPen=false, int width=0, int height=0, const QString &pdfCreator=QString(), const QString &pdfTitle=QString()); + bool savePng(const QString &fileName, int width=0, int height=0, double scale=1.0, int quality=-1); + bool saveJpg(const QString &fileName, int width=0, int height=0, double scale=1.0, int quality=-1); + bool saveBmp(const QString &fileName, int width=0, int height=0, double scale=1.0); + bool saveRastered(const QString &fileName, int width, int height, double scale, const char *format, int quality=-1); + QPixmap toPixmap(int width=0, int height=0, double scale=1.0); + void toPainter(QCPPainter *painter, int width=0, int height=0); + Q_SLOT void replot(QCustomPlot::RefreshPriority refreshPriority=QCustomPlot::rpHint); + + QCPAxis *xAxis, *yAxis, *xAxis2, *yAxis2; + QCPLegend *legend; + +signals: + void mouseDoubleClick(QMouseEvent *event); + void mousePress(QMouseEvent *event); + void mouseMove(QMouseEvent *event); + void mouseRelease(QMouseEvent *event); + void mouseWheel(QWheelEvent *event); + + void plottableClick(QCPAbstractPlottable *plottable, QMouseEvent *event); + void plottableDoubleClick(QCPAbstractPlottable *plottable, QMouseEvent *event); + void itemClick(QCPAbstractItem *item, QMouseEvent *event); + void itemDoubleClick(QCPAbstractItem *item, QMouseEvent *event); + void axisClick(QCPAxis *axis, QCPAxis::SelectablePart part, QMouseEvent *event); + void axisDoubleClick(QCPAxis *axis, QCPAxis::SelectablePart part, QMouseEvent *event); + void legendClick(QCPLegend *legend, QCPAbstractLegendItem *item, QMouseEvent *event); + void legendDoubleClick(QCPLegend *legend, QCPAbstractLegendItem *item, QMouseEvent *event); + void titleClick(QMouseEvent *event, QCPPlotTitle *title); + void titleDoubleClick(QMouseEvent *event, QCPPlotTitle *title); + + void selectionChangedByUser(); + void beforeReplot(); + void afterReplot(); + +protected: + // property members: + QRect mViewport; + QCPLayoutGrid *mPlotLayout; + bool mAutoAddPlottableToLegend; + QList mPlottables; + QList mGraphs; // extra list of plottables also in mPlottables that are of type QCPGraph + QList mItems; + QList mLayers; + QCP::AntialiasedElements mAntialiasedElements, mNotAntialiasedElements; + QCP::Interactions mInteractions; + int mSelectionTolerance; + bool mNoAntialiasingOnDrag; + QBrush mBackgroundBrush; + QPixmap mBackgroundPixmap; + QPixmap mScaledBackgroundPixmap; + bool mBackgroundScaled; + Qt::AspectRatioMode mBackgroundScaledMode; + QCPLayer *mCurrentLayer; + QCP::PlottingHints mPlottingHints; + Qt::KeyboardModifier mMultiSelectModifier; + + // non-property members: + QPixmap mPaintBuffer; + QPoint mMousePressPos; + QPointer mMouseEventElement; + bool mReplotting; + + // reimplemented virtual methods: + virtual QSize minimumSizeHint() const; + virtual QSize sizeHint() const; + virtual void paintEvent(QPaintEvent *event); + virtual void resizeEvent(QResizeEvent *event); + virtual void mouseDoubleClickEvent(QMouseEvent *event); + virtual void mousePressEvent(QMouseEvent *event); + virtual void mouseMoveEvent(QMouseEvent *event); + virtual void mouseReleaseEvent(QMouseEvent *event); + virtual void wheelEvent(QWheelEvent *event); + + // introduced virtual methods: + virtual void draw(QCPPainter *painter); + virtual void axisRemoved(QCPAxis *axis); + virtual void legendRemoved(QCPLegend *legend); + + // non-virtual methods: + void updateLayerIndices() const; + QCPLayerable *layerableAt(const QPointF &pos, bool onlySelectable, QVariant *selectionDetails=0) const; + void drawBackground(QCPPainter *painter); + + friend class QCPLegend; + friend class QCPAxis; + friend class QCPLayer; + friend class QCPAxisRect; +}; + + +class QCP_LIB_DECL QCPColorGradient +{ + Q_GADGET +public: + /*! + Defines the color spaces in which color interpolation between gradient stops can be performed. + + \see setColorInterpolation + */ + enum ColorInterpolation { ciRGB ///< Color channels red, green and blue are linearly interpolated + ,ciHSV ///< Color channels hue, saturation and value are linearly interpolated (The hue is interpolated over the shortest angle distance) + }; + Q_ENUMS(ColorInterpolation) + + /*! + Defines the available presets that can be loaded with \ref loadPreset. See the documentation + there for an image of the presets. + */ + enum GradientPreset { gpGrayscale ///< Continuous lightness from black to white (suited for non-biased data representation) + ,gpHot ///< Continuous lightness from black over firey colors to white (suited for non-biased data representation) + ,gpCold ///< Continuous lightness from black over icey colors to white (suited for non-biased data representation) + ,gpNight ///< Continuous lightness from black over weak blueish colors to white (suited for non-biased data representation) + ,gpCandy ///< Blue over pink to white + ,gpGeography ///< Colors suitable to represent different elevations on geographical maps + ,gpIon ///< Half hue spectrum from black over purple to blue and finally green (creates banding illusion but allows more precise magnitude estimates) + ,gpThermal ///< Colors suitable for thermal imaging, ranging from dark blue over purple to orange, yellow and white + ,gpPolar ///< Colors suitable to emphasize polarity around the center, with blue for negative, black in the middle and red for positive values + ,gpSpectrum ///< An approximation of the visible light spectrum (creates banding illusion but allows more precise magnitude estimates) + ,gpJet ///< Hue variation similar to a spectrum, often used in numerical visualization (creates banding illusion but allows more precise magnitude estimates) + ,gpHues ///< Full hue cycle, with highest and lowest color red (suitable for periodic data, such as angles and phases, see \ref setPeriodic) + }; + Q_ENUMS(GradientPreset) + + QCPColorGradient(GradientPreset preset=gpCold); + bool operator==(const QCPColorGradient &other) const; + bool operator!=(const QCPColorGradient &other) const { return !(*this == other); } + + // getters: + int levelCount() const { return mLevelCount; } + QMap colorStops() const { return mColorStops; } + ColorInterpolation colorInterpolation() const { return mColorInterpolation; } + bool periodic() const { return mPeriodic; } + + // setters: + void setLevelCount(int n); + void setColorStops(const QMap &colorStops); + void setColorStopAt(double position, const QColor &color); + void setColorInterpolation(ColorInterpolation interpolation); + void setPeriodic(bool enabled); + + // non-property methods: + void colorize(const double *data, const QCPRange &range, QRgb *scanLine, int n, int dataIndexFactor=1, bool logarithmic=false); + QRgb color(double position, const QCPRange &range, bool logarithmic=false); + void loadPreset(GradientPreset preset); + void clearColorStops(); + QCPColorGradient inverted() const; + +protected: + void updateColorBuffer(); + + // property members: + int mLevelCount; + QMap mColorStops; + ColorInterpolation mColorInterpolation; + bool mPeriodic; + + // non-property members: + QVector mColorBuffer; + bool mColorBufferInvalidated; +}; + + +class QCP_LIB_DECL QCPAxisRect : public QCPLayoutElement +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QPixmap background READ background WRITE setBackground) + Q_PROPERTY(bool backgroundScaled READ backgroundScaled WRITE setBackgroundScaled) + Q_PROPERTY(Qt::AspectRatioMode backgroundScaledMode READ backgroundScaledMode WRITE setBackgroundScaledMode) + Q_PROPERTY(Qt::Orientations rangeDrag READ rangeDrag WRITE setRangeDrag) + Q_PROPERTY(Qt::Orientations rangeZoom READ rangeZoom WRITE setRangeZoom) + /// \endcond +public: + explicit QCPAxisRect(QCustomPlot *parentPlot, bool setupDefaultAxes=true); + virtual ~QCPAxisRect(); + + // getters: + QPixmap background() const { return mBackgroundPixmap; } + bool backgroundScaled() const { return mBackgroundScaled; } + Qt::AspectRatioMode backgroundScaledMode() const { return mBackgroundScaledMode; } + Qt::Orientations rangeDrag() const { return mRangeDrag; } + Qt::Orientations rangeZoom() const { return mRangeZoom; } + QCPAxis *rangeDragAxis(Qt::Orientation orientation); + QCPAxis *rangeZoomAxis(Qt::Orientation orientation); + double rangeZoomFactor(Qt::Orientation orientation); + + // setters: + void setBackground(const QPixmap &pm); + void setBackground(const QPixmap &pm, bool scaled, Qt::AspectRatioMode mode=Qt::KeepAspectRatioByExpanding); + void setBackground(const QBrush &brush); + void setBackgroundScaled(bool scaled); + void setBackgroundScaledMode(Qt::AspectRatioMode mode); + void setRangeDrag(Qt::Orientations orientations); + void setRangeZoom(Qt::Orientations orientations); + void setRangeDragAxes(QCPAxis *horizontal, QCPAxis *vertical); + void setRangeZoomAxes(QCPAxis *horizontal, QCPAxis *vertical); + void setRangeZoomFactor(double horizontalFactor, double verticalFactor); + void setRangeZoomFactor(double factor); + + // non-property methods: + int axisCount(QCPAxis::AxisType type) const; + QCPAxis *axis(QCPAxis::AxisType type, int index=0) const; + QList axes(QCPAxis::AxisTypes types) const; + QList axes() const; + QCPAxis *addAxis(QCPAxis::AxisType type, QCPAxis *axis=0); + QList addAxes(QCPAxis::AxisTypes types); + bool removeAxis(QCPAxis *axis); + QCPLayoutInset *insetLayout() const { return mInsetLayout; } + + void setupFullAxesBox(bool connectRanges=false); + QList plottables() const; + QList graphs() const; + QList items() const; + + // read-only interface imitating a QRect: + int left() const { return mRect.left(); } + int right() const { return mRect.right(); } + int top() const { return mRect.top(); } + int bottom() const { return mRect.bottom(); } + int width() const { return mRect.width(); } + int height() const { return mRect.height(); } + QSize size() const { return mRect.size(); } + QPoint topLeft() const { return mRect.topLeft(); } + QPoint topRight() const { return mRect.topRight(); } + QPoint bottomLeft() const { return mRect.bottomLeft(); } + QPoint bottomRight() const { return mRect.bottomRight(); } + QPoint center() const { return mRect.center(); } + + // reimplemented virtual methods: + virtual void update(UpdatePhase phase); + virtual QList elements(bool recursive) const; + +protected: + // property members: + QBrush mBackgroundBrush; + QPixmap mBackgroundPixmap; + QPixmap mScaledBackgroundPixmap; + bool mBackgroundScaled; + Qt::AspectRatioMode mBackgroundScaledMode; + QCPLayoutInset *mInsetLayout; + Qt::Orientations mRangeDrag, mRangeZoom; + QPointer mRangeDragHorzAxis, mRangeDragVertAxis, mRangeZoomHorzAxis, mRangeZoomVertAxis; + double mRangeZoomFactorHorz, mRangeZoomFactorVert; + // non-property members: + QCPRange mDragStartHorzRange, mDragStartVertRange; + QCP::AntialiasedElements mAADragBackup, mNotAADragBackup; + QPoint mDragStart; + bool mDragging; + QHash > mAxes; + + // reimplemented virtual methods: + virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const; + virtual void draw(QCPPainter *painter); + virtual int calculateAutoMargin(QCP::MarginSide side); + // events: + virtual void mousePressEvent(QMouseEvent *event); + virtual void mouseMoveEvent(QMouseEvent *event); + virtual void mouseReleaseEvent(QMouseEvent *event); + virtual void wheelEvent(QWheelEvent *event); + + // non-property methods: + void drawBackground(QCPPainter *painter); + void updateAxesOffset(QCPAxis::AxisType type); + +private: + Q_DISABLE_COPY(QCPAxisRect) + + friend class QCustomPlot; +}; + + +class QCP_LIB_DECL QCPAbstractLegendItem : public QCPLayoutElement +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QCPLegend* parentLegend READ parentLegend) + Q_PROPERTY(QFont font READ font WRITE setFont) + Q_PROPERTY(QColor textColor READ textColor WRITE setTextColor) + Q_PROPERTY(QFont selectedFont READ selectedFont WRITE setSelectedFont) + Q_PROPERTY(QColor selectedTextColor READ selectedTextColor WRITE setSelectedTextColor) + Q_PROPERTY(bool selectable READ selectable WRITE setSelectable NOTIFY selectionChanged) + Q_PROPERTY(bool selected READ selected WRITE setSelected NOTIFY selectableChanged) + /// \endcond +public: + explicit QCPAbstractLegendItem(QCPLegend *parent); + + // getters: + QCPLegend *parentLegend() const { return mParentLegend; } + QFont font() const { return mFont; } + QColor textColor() const { return mTextColor; } + QFont selectedFont() const { return mSelectedFont; } + QColor selectedTextColor() const { return mSelectedTextColor; } + bool selectable() const { return mSelectable; } + bool selected() const { return mSelected; } + + // setters: + void setFont(const QFont &font); + void setTextColor(const QColor &color); + void setSelectedFont(const QFont &font); + void setSelectedTextColor(const QColor &color); + Q_SLOT void setSelectable(bool selectable); + Q_SLOT void setSelected(bool selected); + + // reimplemented virtual methods: + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + +signals: + void selectionChanged(bool selected); + void selectableChanged(bool selectable); + +protected: + // property members: + QCPLegend *mParentLegend; + QFont mFont; + QColor mTextColor; + QFont mSelectedFont; + QColor mSelectedTextColor; + bool mSelectable, mSelected; + + // reimplemented virtual methods: + virtual QCP::Interaction selectionCategory() const; + virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const; + virtual QRect clipRect() const; + virtual void draw(QCPPainter *painter) = 0; + // events: + virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged); + virtual void deselectEvent(bool *selectionStateChanged); + +private: + Q_DISABLE_COPY(QCPAbstractLegendItem) + + friend class QCPLegend; +}; + + +class QCP_LIB_DECL QCPPlottableLegendItem : public QCPAbstractLegendItem +{ + Q_OBJECT +public: + QCPPlottableLegendItem(QCPLegend *parent, QCPAbstractPlottable *plottable); + + // getters: + QCPAbstractPlottable *plottable() { return mPlottable; } + +protected: + // property members: + QCPAbstractPlottable *mPlottable; + + // reimplemented virtual methods: + virtual void draw(QCPPainter *painter); + virtual QSize minimumSizeHint() const; + + // non-virtual methods: + QPen getIconBorderPen() const; + QColor getTextColor() const; + QFont getFont() const; +}; + + +class QCP_LIB_DECL QCPLegend : public QCPLayoutGrid +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QPen borderPen READ borderPen WRITE setBorderPen) + Q_PROPERTY(QBrush brush READ brush WRITE setBrush) + Q_PROPERTY(QFont font READ font WRITE setFont) + Q_PROPERTY(QColor textColor READ textColor WRITE setTextColor) + Q_PROPERTY(QSize iconSize READ iconSize WRITE setIconSize) + Q_PROPERTY(int iconTextPadding READ iconTextPadding WRITE setIconTextPadding) + Q_PROPERTY(QPen iconBorderPen READ iconBorderPen WRITE setIconBorderPen) + Q_PROPERTY(SelectableParts selectableParts READ selectableParts WRITE setSelectableParts NOTIFY selectionChanged) + Q_PROPERTY(SelectableParts selectedParts READ selectedParts WRITE setSelectedParts NOTIFY selectableChanged) + Q_PROPERTY(QPen selectedBorderPen READ selectedBorderPen WRITE setSelectedBorderPen) + Q_PROPERTY(QPen selectedIconBorderPen READ selectedIconBorderPen WRITE setSelectedIconBorderPen) + Q_PROPERTY(QBrush selectedBrush READ selectedBrush WRITE setSelectedBrush) + Q_PROPERTY(QFont selectedFont READ selectedFont WRITE setSelectedFont) + Q_PROPERTY(QColor selectedTextColor READ selectedTextColor WRITE setSelectedTextColor) + /// \endcond +public: + /*! + Defines the selectable parts of a legend + + \see setSelectedParts, setSelectableParts + */ + enum SelectablePart { spNone = 0x000 ///< 0x000 None + ,spLegendBox = 0x001 ///< 0x001 The legend box (frame) + ,spItems = 0x002 ///< 0x002 Legend items individually (see \ref selectedItems) + }; + Q_FLAGS(SelectablePart SelectableParts) + Q_DECLARE_FLAGS(SelectableParts, SelectablePart) + + explicit QCPLegend(); + virtual ~QCPLegend(); + + // getters: + QPen borderPen() const { return mBorderPen; } + QBrush brush() const { return mBrush; } + QFont font() const { return mFont; } + QColor textColor() const { return mTextColor; } + QSize iconSize() const { return mIconSize; } + int iconTextPadding() const { return mIconTextPadding; } + QPen iconBorderPen() const { return mIconBorderPen; } + SelectableParts selectableParts() const { return mSelectableParts; } + SelectableParts selectedParts() const; + QPen selectedBorderPen() const { return mSelectedBorderPen; } + QPen selectedIconBorderPen() const { return mSelectedIconBorderPen; } + QBrush selectedBrush() const { return mSelectedBrush; } + QFont selectedFont() const { return mSelectedFont; } + QColor selectedTextColor() const { return mSelectedTextColor; } + + // setters: + void setBorderPen(const QPen &pen); + void setBrush(const QBrush &brush); + void setFont(const QFont &font); + void setTextColor(const QColor &color); + void setIconSize(const QSize &size); + void setIconSize(int width, int height); + void setIconTextPadding(int padding); + void setIconBorderPen(const QPen &pen); + Q_SLOT void setSelectableParts(const SelectableParts &selectableParts); + Q_SLOT void setSelectedParts(const SelectableParts &selectedParts); + void setSelectedBorderPen(const QPen &pen); + void setSelectedIconBorderPen(const QPen &pen); + void setSelectedBrush(const QBrush &brush); + void setSelectedFont(const QFont &font); + void setSelectedTextColor(const QColor &color); + + // reimplemented virtual methods: + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + + // non-virtual methods: + QCPAbstractLegendItem *item(int index) const; + QCPPlottableLegendItem *itemWithPlottable(const QCPAbstractPlottable *plottable) const; + int itemCount() const; + bool hasItem(QCPAbstractLegendItem *item) const; + bool hasItemWithPlottable(const QCPAbstractPlottable *plottable) const; + bool addItem(QCPAbstractLegendItem *item); + bool removeItem(int index); + bool removeItem(QCPAbstractLegendItem *item); + void clearItems(); + QList selectedItems() const; + +signals: + void selectionChanged(QCPLegend::SelectableParts parts); + void selectableChanged(QCPLegend::SelectableParts parts); + +protected: + // property members: + QPen mBorderPen, mIconBorderPen; + QBrush mBrush; + QFont mFont; + QColor mTextColor; + QSize mIconSize; + int mIconTextPadding; + SelectableParts mSelectedParts, mSelectableParts; + QPen mSelectedBorderPen, mSelectedIconBorderPen; + QBrush mSelectedBrush; + QFont mSelectedFont; + QColor mSelectedTextColor; + + // reimplemented virtual methods: + virtual void parentPlotInitialized(QCustomPlot *parentPlot); + virtual QCP::Interaction selectionCategory() const; + virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const; + virtual void draw(QCPPainter *painter); + // events: + virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged); + virtual void deselectEvent(bool *selectionStateChanged); + + // non-virtual methods: + QPen getBorderPen() const; + QBrush getBrush() const; + +private: + Q_DISABLE_COPY(QCPLegend) + + friend class QCustomPlot; + friend class QCPAbstractLegendItem; +}; +Q_DECLARE_OPERATORS_FOR_FLAGS(QCPLegend::SelectableParts) +Q_DECLARE_METATYPE(QCPLegend::SelectablePart) + + +class QCP_LIB_DECL QCPPlotTitle : public QCPLayoutElement +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QString text READ text WRITE setText) + Q_PROPERTY(QFont font READ font WRITE setFont) + Q_PROPERTY(QColor textColor READ textColor WRITE setTextColor) + Q_PROPERTY(QFont selectedFont READ selectedFont WRITE setSelectedFont) + Q_PROPERTY(QColor selectedTextColor READ selectedTextColor WRITE setSelectedTextColor) + Q_PROPERTY(bool selectable READ selectable WRITE setSelectable NOTIFY selectableChanged) + Q_PROPERTY(bool selected READ selected WRITE setSelected NOTIFY selectionChanged) + /// \endcond +public: + explicit QCPPlotTitle(QCustomPlot *parentPlot); + explicit QCPPlotTitle(QCustomPlot *parentPlot, const QString &text); + + // getters: + QString text() const { return mText; } + QFont font() const { return mFont; } + QColor textColor() const { return mTextColor; } + QFont selectedFont() const { return mSelectedFont; } + QColor selectedTextColor() const { return mSelectedTextColor; } + bool selectable() const { return mSelectable; } + bool selected() const { return mSelected; } + + // setters: + void setText(const QString &text); + void setFont(const QFont &font); + void setTextColor(const QColor &color); + void setSelectedFont(const QFont &font); + void setSelectedTextColor(const QColor &color); + Q_SLOT void setSelectable(bool selectable); + Q_SLOT void setSelected(bool selected); + + // reimplemented virtual methods: + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + +signals: + void selectionChanged(bool selected); + void selectableChanged(bool selectable); + +protected: + // property members: + QString mText; + QFont mFont; + QColor mTextColor; + QFont mSelectedFont; + QColor mSelectedTextColor; + QRect mTextBoundingRect; + bool mSelectable, mSelected; + + // reimplemented virtual methods: + virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const; + virtual void draw(QCPPainter *painter); + virtual QSize minimumSizeHint() const; + virtual QSize maximumSizeHint() const; + // events: + virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged); + virtual void deselectEvent(bool *selectionStateChanged); + + // non-virtual methods: + QFont mainFont() const; + QColor mainTextColor() const; + +private: + Q_DISABLE_COPY(QCPPlotTitle) +}; + + +class QCPColorScaleAxisRectPrivate : public QCPAxisRect +{ + Q_OBJECT +public: + explicit QCPColorScaleAxisRectPrivate(QCPColorScale *parentColorScale); +protected: + QCPColorScale *mParentColorScale; + QImage mGradientImage; + bool mGradientImageInvalidated; + // re-using some methods of QCPAxisRect to make them available to friend class QCPColorScale + using QCPAxisRect::calculateAutoMargin; + using QCPAxisRect::mousePressEvent; + using QCPAxisRect::mouseMoveEvent; + using QCPAxisRect::mouseReleaseEvent; + using QCPAxisRect::wheelEvent; + using QCPAxisRect::update; + virtual void draw(QCPPainter *painter); + void updateGradientImage(); + Q_SLOT void axisSelectionChanged(QCPAxis::SelectableParts selectedParts); + Q_SLOT void axisSelectableChanged(QCPAxis::SelectableParts selectableParts); + friend class QCPColorScale; +}; + + +class QCP_LIB_DECL QCPColorScale : public QCPLayoutElement +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QCPAxis::AxisType type READ type WRITE setType) + Q_PROPERTY(QCPRange dataRange READ dataRange WRITE setDataRange NOTIFY dataRangeChanged) + Q_PROPERTY(QCPAxis::ScaleType dataScaleType READ dataScaleType WRITE setDataScaleType NOTIFY dataScaleTypeChanged) + Q_PROPERTY(QCPColorGradient gradient READ gradient WRITE setGradient NOTIFY gradientChanged) + Q_PROPERTY(QString label READ label WRITE setLabel) + Q_PROPERTY(int barWidth READ barWidth WRITE setBarWidth) + Q_PROPERTY(bool rangeDrag READ rangeDrag WRITE setRangeDrag) + Q_PROPERTY(bool rangeZoom READ rangeZoom WRITE setRangeZoom) + /// \endcond +public: + explicit QCPColorScale(QCustomPlot *parentPlot); + virtual ~QCPColorScale(); + + // getters: + QCPAxis *axis() const { return mColorAxis.data(); } + QCPAxis::AxisType type() const { return mType; } + QCPRange dataRange() const { return mDataRange; } + QCPAxis::ScaleType dataScaleType() const { return mDataScaleType; } + QCPColorGradient gradient() const { return mGradient; } + QString label() const; + int barWidth () const { return mBarWidth; } + bool rangeDrag() const; + bool rangeZoom() const; + + // setters: + void setType(QCPAxis::AxisType type); + Q_SLOT void setDataRange(const QCPRange &dataRange); + Q_SLOT void setDataScaleType(QCPAxis::ScaleType scaleType); + Q_SLOT void setGradient(const QCPColorGradient &gradient); + void setLabel(const QString &str); + void setBarWidth(int width); + void setRangeDrag(bool enabled); + void setRangeZoom(bool enabled); + + // non-property methods: + QList colorMaps() const; + void rescaleDataRange(bool onlyVisibleMaps); + + // reimplemented virtual methods: + virtual void update(UpdatePhase phase); + +signals: + void dataRangeChanged(QCPRange newRange); + void dataScaleTypeChanged(QCPAxis::ScaleType scaleType); + void gradientChanged(QCPColorGradient newGradient); + +protected: + // property members: + QCPAxis::AxisType mType; + QCPRange mDataRange; + QCPAxis::ScaleType mDataScaleType; + QCPColorGradient mGradient; + int mBarWidth; + + // non-property members: + QPointer mAxisRect; + QPointer mColorAxis; + + // reimplemented virtual methods: + virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const; + // events: + virtual void mousePressEvent(QMouseEvent *event); + virtual void mouseMoveEvent(QMouseEvent *event); + virtual void mouseReleaseEvent(QMouseEvent *event); + virtual void wheelEvent(QWheelEvent *event); + +private: + Q_DISABLE_COPY(QCPColorScale) + + friend class QCPColorScaleAxisRectPrivate; +}; + + +/*! \file */ + + + +class QCP_LIB_DECL QCPData +{ +public: + QCPData(); + QCPData(double key, double value); + double key, value; + double keyErrorPlus, keyErrorMinus; + double valueErrorPlus, valueErrorMinus; +}; +Q_DECLARE_TYPEINFO(QCPData, Q_MOVABLE_TYPE); + +/*! \typedef QCPDataMap + Container for storing \ref QCPData items in a sorted fashion. The key of the map + is the key member of the QCPData instance. + + This is the container in which QCPGraph holds its data. + \see QCPData, QCPGraph::setData +*/ +typedef QMap QCPDataMap; +typedef QMapIterator QCPDataMapIterator; +typedef QMutableMapIterator QCPDataMutableMapIterator; + + +class QCP_LIB_DECL QCPGraph : public QCPAbstractPlottable +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(LineStyle lineStyle READ lineStyle WRITE setLineStyle) + Q_PROPERTY(QCPScatterStyle scatterStyle READ scatterStyle WRITE setScatterStyle) + Q_PROPERTY(ErrorType errorType READ errorType WRITE setErrorType) + Q_PROPERTY(QPen errorPen READ errorPen WRITE setErrorPen) + Q_PROPERTY(double errorBarSize READ errorBarSize WRITE setErrorBarSize) + Q_PROPERTY(bool errorBarSkipSymbol READ errorBarSkipSymbol WRITE setErrorBarSkipSymbol) + Q_PROPERTY(QCPGraph* channelFillGraph READ channelFillGraph WRITE setChannelFillGraph) + Q_PROPERTY(bool adaptiveSampling READ adaptiveSampling WRITE setAdaptiveSampling) + /// \endcond +public: + /*! + Defines how the graph's line is represented visually in the plot. The line is drawn with the + current pen of the graph (\ref setPen). + \see setLineStyle + */ + enum LineStyle { lsNone ///< data points are not connected with any lines (e.g. data only represented + ///< with symbols according to the scatter style, see \ref setScatterStyle) + ,lsLine ///< data points are connected by a straight line + ,lsStepLeft ///< line is drawn as steps where the step height is the value of the left data point + ,lsStepRight ///< line is drawn as steps where the step height is the value of the right data point + ,lsStepCenter ///< line is drawn as steps where the step is in between two data points + ,lsImpulse ///< each data point is represented by a line parallel to the value axis, which reaches from the data point to the zero-value-line + }; + Q_ENUMS(LineStyle) + /*! + Defines what kind of error bars are drawn for each data point + */ + enum ErrorType { etNone ///< No error bars are shown + ,etKey ///< Error bars for the key dimension of the data point are shown + ,etValue ///< Error bars for the value dimension of the data point are shown + ,etBoth ///< Error bars for both key and value dimensions of the data point are shown + }; + Q_ENUMS(ErrorType) + + explicit QCPGraph(QCPAxis *keyAxis, QCPAxis *valueAxis); + virtual ~QCPGraph(); + + // getters: + QCPDataMap *data() const { return mData; } + LineStyle lineStyle() const { return mLineStyle; } + QCPScatterStyle scatterStyle() const { return mScatterStyle; } + ErrorType errorType() const { return mErrorType; } + QPen errorPen() const { return mErrorPen; } + double errorBarSize() const { return mErrorBarSize; } + bool errorBarSkipSymbol() const { return mErrorBarSkipSymbol; } + QCPGraph *channelFillGraph() const { return mChannelFillGraph.data(); } + bool adaptiveSampling() const { return mAdaptiveSampling; } + + // setters: + void setData(QCPDataMap *data, bool copy=false); + void setData(const QVector &key, const QVector &value); + void setDataKeyError(const QVector &key, const QVector &value, const QVector &keyError); + void setDataKeyError(const QVector &key, const QVector &value, const QVector &keyErrorMinus, const QVector &keyErrorPlus); + void setDataValueError(const QVector &key, const QVector &value, const QVector &valueError); + void setDataValueError(const QVector &key, const QVector &value, const QVector &valueErrorMinus, const QVector &valueErrorPlus); + void setDataBothError(const QVector &key, const QVector &value, const QVector &keyError, const QVector &valueError); + void setDataBothError(const QVector &key, const QVector &value, const QVector &keyErrorMinus, const QVector &keyErrorPlus, const QVector &valueErrorMinus, const QVector &valueErrorPlus); + void setLineStyle(LineStyle ls); + void setScatterStyle(const QCPScatterStyle &style); + void setErrorType(ErrorType errorType); + void setErrorPen(const QPen &pen); + void setErrorBarSize(double size); + void setErrorBarSkipSymbol(bool enabled); + void setChannelFillGraph(QCPGraph *targetGraph); + void setAdaptiveSampling(bool enabled); + + // non-property methods: + void addData(const QCPDataMap &dataMap); + void addData(const QCPData &data); + void addData(double key, double value); + void addData(const QVector &keys, const QVector &values); + void removeDataBefore(double key); + void removeDataAfter(double key); + void removeData(double fromKey, double toKey); + void removeData(double key); + + // reimplemented virtual methods: + virtual void clearData(); + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + using QCPAbstractPlottable::rescaleAxes; + using QCPAbstractPlottable::rescaleKeyAxis; + using QCPAbstractPlottable::rescaleValueAxis; + void rescaleAxes(bool onlyEnlarge, bool includeErrorBars) const; // overloads base class interface + void rescaleKeyAxis(bool onlyEnlarge, bool includeErrorBars) const; // overloads base class interface + void rescaleValueAxis(bool onlyEnlarge, bool includeErrorBars) const; // overloads base class interface + +protected: + // property members: + QCPDataMap *mData; + QPen mErrorPen; + LineStyle mLineStyle; + QCPScatterStyle mScatterStyle; + ErrorType mErrorType; + double mErrorBarSize; + bool mErrorBarSkipSymbol; + QPointer mChannelFillGraph; + bool mAdaptiveSampling; + + // reimplemented virtual methods: + virtual void draw(QCPPainter *painter); + virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const; + virtual QCPRange getKeyRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const; + virtual QCPRange getValueRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const; + virtual QCPRange getKeyRange(bool &foundRange, SignDomain inSignDomain, bool includeErrors) const; // overloads base class interface + virtual QCPRange getValueRange(bool &foundRange, SignDomain inSignDomain, bool includeErrors) const; // overloads base class interface + + // introduced virtual methods: + virtual void drawFill(QCPPainter *painter, QVector *lineData) const; + virtual void drawScatterPlot(QCPPainter *painter, QVector *scatterData) const; + virtual void drawLinePlot(QCPPainter *painter, QVector *lineData) const; + virtual void drawImpulsePlot(QCPPainter *painter, QVector *lineData) const; + + // non-virtual methods: + void getPreparedData(QVector *lineData, QVector *scatterData) const; + void getPlotData(QVector *lineData, QVector *scatterData) const; + void getScatterPlotData(QVector *scatterData) const; + void getLinePlotData(QVector *linePixelData, QVector *scatterData) const; + void getStepLeftPlotData(QVector *linePixelData, QVector *scatterData) const; + void getStepRightPlotData(QVector *linePixelData, QVector *scatterData) const; + void getStepCenterPlotData(QVector *linePixelData, QVector *scatterData) const; + void getImpulsePlotData(QVector *linePixelData, QVector *scatterData) const; + void drawError(QCPPainter *painter, double x, double y, const QCPData &data) const; + void getVisibleDataBounds(QCPDataMap::const_iterator &lower, QCPDataMap::const_iterator &upper) const; + int countDataInBounds(const QCPDataMap::const_iterator &lower, const QCPDataMap::const_iterator &upper, int maxCount) const; + void addFillBasePoints(QVector *lineData) const; + void removeFillBasePoints(QVector *lineData) const; + QPointF lowerFillBasePoint(double lowerKey) const; + QPointF upperFillBasePoint(double upperKey) const; + const QPolygonF getChannelFillPolygon(const QVector *lineData) const; + int findIndexBelowX(const QVector *data, double x) const; + int findIndexAboveX(const QVector *data, double x) const; + int findIndexBelowY(const QVector *data, double y) const; + int findIndexAboveY(const QVector *data, double y) const; + double pointDistance(const QPointF &pixelPoint) const; + + friend class QCustomPlot; + friend class QCPLegend; +}; + + +/*! \file */ + + + +class QCP_LIB_DECL QCPCurveData +{ +public: + QCPCurveData(); + QCPCurveData(double t, double key, double value); + double t, key, value; +}; +Q_DECLARE_TYPEINFO(QCPCurveData, Q_MOVABLE_TYPE); + +/*! \typedef QCPCurveDataMap + Container for storing \ref QCPCurveData items in a sorted fashion. The key of the map + is the t member of the QCPCurveData instance. + + This is the container in which QCPCurve holds its data. + \see QCPCurveData, QCPCurve::setData +*/ + +typedef QMap QCPCurveDataMap; +typedef QMapIterator QCPCurveDataMapIterator; +typedef QMutableMapIterator QCPCurveDataMutableMapIterator; + + +class QCP_LIB_DECL QCPCurve : public QCPAbstractPlottable +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QCPScatterStyle scatterStyle READ scatterStyle WRITE setScatterStyle) + Q_PROPERTY(LineStyle lineStyle READ lineStyle WRITE setLineStyle) + /// \endcond +public: + /*! + Defines how the curve's line is represented visually in the plot. The line is drawn with the + current pen of the curve (\ref setPen). + \see setLineStyle + */ + enum LineStyle { lsNone ///< No line is drawn between data points (e.g. only scatters) + ,lsLine ///< Data points are connected with a straight line + }; + explicit QCPCurve(QCPAxis *keyAxis, QCPAxis *valueAxis); + virtual ~QCPCurve(); + + // getters: + QCPCurveDataMap *data() const { return mData; } + QCPScatterStyle scatterStyle() const { return mScatterStyle; } + LineStyle lineStyle() const { return mLineStyle; } + + // setters: + void setData(QCPCurveDataMap *data, bool copy=false); + void setData(const QVector &t, const QVector &key, const QVector &value); + void setData(const QVector &key, const QVector &value); + void setScatterStyle(const QCPScatterStyle &style); + void setLineStyle(LineStyle style); + + // non-property methods: + void addData(const QCPCurveDataMap &dataMap); + void addData(const QCPCurveData &data); + void addData(double t, double key, double value); + void addData(double key, double value); + void addData(const QVector &ts, const QVector &keys, const QVector &values); + void removeDataBefore(double t); + void removeDataAfter(double t); + void removeData(double fromt, double tot); + void removeData(double t); + + // reimplemented virtual methods: + virtual void clearData(); + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + +protected: + // property members: + QCPCurveDataMap *mData; + QCPScatterStyle mScatterStyle; + LineStyle mLineStyle; + + // reimplemented virtual methods: + virtual void draw(QCPPainter *painter); + virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const; + virtual QCPRange getKeyRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const; + virtual QCPRange getValueRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const; + + // introduced virtual methods: + virtual void drawScatterPlot(QCPPainter *painter, const QVector *pointData) const; + + // non-virtual methods: + void getCurveData(QVector *lineData) const; + int getRegion(double x, double y, double rectLeft, double rectTop, double rectRight, double rectBottom) const; + QPointF getOptimizedPoint(int prevRegion, double prevKey, double prevValue, double key, double value, double rectLeft, double rectTop, double rectRight, double rectBottom) const; + QVector getOptimizedCornerPoints(int prevRegion, int currentRegion, double prevKey, double prevValue, double key, double value, double rectLeft, double rectTop, double rectRight, double rectBottom) const; + bool mayTraverse(int prevRegion, int currentRegion) const; + bool getTraverse(double prevKey, double prevValue, double key, double value, double rectLeft, double rectTop, double rectRight, double rectBottom, QPointF &crossA, QPointF &crossB) const; + void getTraverseCornerPoints(int prevRegion, int currentRegion, double rectLeft, double rectTop, double rectRight, double rectBottom, QVector &beforeTraverse, QVector &afterTraverse) const; + double pointDistance(const QPointF &pixelPoint) const; + + friend class QCustomPlot; + friend class QCPLegend; +}; + + +/*! \file */ + + + +class QCP_LIB_DECL QCPBarsGroup : public QObject +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(SpacingType spacingType READ spacingType WRITE setSpacingType) + Q_PROPERTY(double spacing READ spacing WRITE setSpacing) + /// \endcond +public: + /*! + Defines the ways the spacing between bars in the group can be specified. Thus it defines what + the number passed to \ref setSpacing actually means. + + \see setSpacingType, setSpacing + */ + enum SpacingType { stAbsolute ///< Bar spacing is in absolute pixels + ,stAxisRectRatio ///< Bar spacing is given by a fraction of the axis rect size + ,stPlotCoords ///< Bar spacing is in key coordinates and thus scales with the key axis range + }; + QCPBarsGroup(QCustomPlot *parentPlot); + ~QCPBarsGroup(); + + // getters: + SpacingType spacingType() const { return mSpacingType; } + double spacing() const { return mSpacing; } + + // setters: + void setSpacingType(SpacingType spacingType); + void setSpacing(double spacing); + + // non-virtual methods: + QList bars() const { return mBars; } + QCPBars* bars(int index) const; + int size() const { return mBars.size(); } + bool isEmpty() const { return mBars.isEmpty(); } + void clear(); + bool contains(QCPBars *bars) const { return mBars.contains(bars); } + void append(QCPBars *bars); + void insert(int i, QCPBars *bars); + void remove(QCPBars *bars); + +protected: + // non-property members: + QCustomPlot *mParentPlot; + SpacingType mSpacingType; + double mSpacing; + QList mBars; + + // non-virtual methods: + void registerBars(QCPBars *bars); + void unregisterBars(QCPBars *bars); + + // virtual methods: + double keyPixelOffset(const QCPBars *bars, double keyCoord); + double getPixelSpacing(const QCPBars *bars, double keyCoord); + +private: + Q_DISABLE_COPY(QCPBarsGroup) + + friend class QCPBars; +}; + + +class QCP_LIB_DECL QCPBarData +{ +public: + QCPBarData(); + QCPBarData(double key, double value); + double key, value; +}; +Q_DECLARE_TYPEINFO(QCPBarData, Q_MOVABLE_TYPE); + +/*! \typedef QCPBarDataMap + Container for storing \ref QCPBarData items in a sorted fashion. The key of the map + is the key member of the QCPBarData instance. + + This is the container in which QCPBars holds its data. + \see QCPBarData, QCPBars::setData +*/ +typedef QMap QCPBarDataMap; +typedef QMapIterator QCPBarDataMapIterator; +typedef QMutableMapIterator QCPBarDataMutableMapIterator; + + +class QCP_LIB_DECL QCPBars : public QCPAbstractPlottable +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(double width READ width WRITE setWidth) + Q_PROPERTY(WidthType widthType READ widthType WRITE setWidthType) + Q_PROPERTY(QCPBarsGroup* barsGroup READ barsGroup WRITE setBarsGroup) + Q_PROPERTY(double baseValue READ baseValue WRITE setBaseValue) + Q_PROPERTY(QCPBars* barBelow READ barBelow) + Q_PROPERTY(QCPBars* barAbove READ barAbove) + /// \endcond +public: + /*! + Defines the ways the width of the bar can be specified. Thus it defines what the number passed + to \ref setWidth actually means. + + \see setWidthType, setWidth + */ + enum WidthType { wtAbsolute ///< Bar width is in absolute pixels + ,wtAxisRectRatio ///< Bar width is given by a fraction of the axis rect size + ,wtPlotCoords ///< Bar width is in key coordinates and thus scales with the key axis range + }; + Q_ENUMS(WidthType) + + explicit QCPBars(QCPAxis *keyAxis, QCPAxis *valueAxis); + virtual ~QCPBars(); + + // getters: + double width() const { return mWidth; } + WidthType widthType() const { return mWidthType; } + QCPBarsGroup *barsGroup() const { return mBarsGroup; } + double baseValue() const { return mBaseValue; } + QCPBars *barBelow() const { return mBarBelow.data(); } + QCPBars *barAbove() const { return mBarAbove.data(); } + QCPBarDataMap *data() const { return mData; } + + // setters: + void setWidth(double width); + void setWidthType(WidthType widthType); + void setBarsGroup(QCPBarsGroup *barsGroup); + void setBaseValue(double baseValue); + void setData(QCPBarDataMap *data, bool copy=false); + void setData(const QVector &key, const QVector &value); + + // non-property methods: + void moveBelow(QCPBars *bars); + void moveAbove(QCPBars *bars); + void addData(const QCPBarDataMap &dataMap); + void addData(const QCPBarData &data); + void addData(double key, double value); + void addData(const QVector &keys, const QVector &values); + void removeDataBefore(double key); + void removeDataAfter(double key); + void removeData(double fromKey, double toKey); + void removeData(double key); + + // reimplemented virtual methods: + virtual void clearData(); + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + +protected: + // property members: + QCPBarDataMap *mData; + double mWidth; + WidthType mWidthType; + QCPBarsGroup *mBarsGroup; + double mBaseValue; + QPointer mBarBelow, mBarAbove; + + // reimplemented virtual methods: + virtual void draw(QCPPainter *painter); + virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const; + virtual QCPRange getKeyRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const; + virtual QCPRange getValueRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const; + + // non-virtual methods: + void getVisibleDataBounds(QCPBarDataMap::const_iterator &lower, QCPBarDataMap::const_iterator &upperEnd) const; + QPolygonF getBarPolygon(double key, double value) const; + void getPixelWidth(double key, double &lower, double &upper) const; + double getStackedBaseValue(double key, bool positive) const; + static void connectBars(QCPBars* lower, QCPBars* upper); + + friend class QCustomPlot; + friend class QCPLegend; + friend class QCPBarsGroup; +}; + + +/*! \file */ + + + +class QCP_LIB_DECL QCPStatisticalBox : public QCPAbstractPlottable +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(double key READ key WRITE setKey) + Q_PROPERTY(double minimum READ minimum WRITE setMinimum) + Q_PROPERTY(double lowerQuartile READ lowerQuartile WRITE setLowerQuartile) + Q_PROPERTY(double median READ median WRITE setMedian) + Q_PROPERTY(double upperQuartile READ upperQuartile WRITE setUpperQuartile) + Q_PROPERTY(double maximum READ maximum WRITE setMaximum) + Q_PROPERTY(QVector outliers READ outliers WRITE setOutliers) + Q_PROPERTY(double width READ width WRITE setWidth) + Q_PROPERTY(double whiskerWidth READ whiskerWidth WRITE setWhiskerWidth) + Q_PROPERTY(QPen whiskerPen READ whiskerPen WRITE setWhiskerPen) + Q_PROPERTY(QPen whiskerBarPen READ whiskerBarPen WRITE setWhiskerBarPen) + Q_PROPERTY(QPen medianPen READ medianPen WRITE setMedianPen) + Q_PROPERTY(QCPScatterStyle outlierStyle READ outlierStyle WRITE setOutlierStyle) + /// \endcond +public: + explicit QCPStatisticalBox(QCPAxis *keyAxis, QCPAxis *valueAxis); + + // getters: + double key() const { return mKey; } + double minimum() const { return mMinimum; } + double lowerQuartile() const { return mLowerQuartile; } + double median() const { return mMedian; } + double upperQuartile() const { return mUpperQuartile; } + double maximum() const { return mMaximum; } + QVector outliers() const { return mOutliers; } + double width() const { return mWidth; } + double whiskerWidth() const { return mWhiskerWidth; } + QPen whiskerPen() const { return mWhiskerPen; } + QPen whiskerBarPen() const { return mWhiskerBarPen; } + QPen medianPen() const { return mMedianPen; } + QCPScatterStyle outlierStyle() const { return mOutlierStyle; } + + // setters: + void setKey(double key); + void setMinimum(double value); + void setLowerQuartile(double value); + void setMedian(double value); + void setUpperQuartile(double value); + void setMaximum(double value); + void setOutliers(const QVector &values); + void setData(double key, double minimum, double lowerQuartile, double median, double upperQuartile, double maximum); + void setWidth(double width); + void setWhiskerWidth(double width); + void setWhiskerPen(const QPen &pen); + void setWhiskerBarPen(const QPen &pen); + void setMedianPen(const QPen &pen); + void setOutlierStyle(const QCPScatterStyle &style); + + // non-property methods: + virtual void clearData(); + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + +protected: + // property members: + QVector mOutliers; + double mKey, mMinimum, mLowerQuartile, mMedian, mUpperQuartile, mMaximum; + double mWidth; + double mWhiskerWidth; + QPen mWhiskerPen, mWhiskerBarPen, mMedianPen; + QCPScatterStyle mOutlierStyle; + + // reimplemented virtual methods: + virtual void draw(QCPPainter *painter); + virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const; + virtual QCPRange getKeyRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const; + virtual QCPRange getValueRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const; + + // introduced virtual methods: + virtual void drawQuartileBox(QCPPainter *painter, QRectF *quartileBox=0) const; + virtual void drawMedian(QCPPainter *painter) const; + virtual void drawWhiskers(QCPPainter *painter) const; + virtual void drawOutliers(QCPPainter *painter) const; + + friend class QCustomPlot; + friend class QCPLegend; +}; + + +class QCP_LIB_DECL QCPColorMapData +{ +public: + QCPColorMapData(int keySize, int valueSize, const QCPRange &keyRange, const QCPRange &valueRange); + ~QCPColorMapData(); + QCPColorMapData(const QCPColorMapData &other); + QCPColorMapData &operator=(const QCPColorMapData &other); + + // getters: + int keySize() const { return mKeySize; } + int valueSize() const { return mValueSize; } + QCPRange keyRange() const { return mKeyRange; } + QCPRange valueRange() const { return mValueRange; } + QCPRange dataBounds() const { return mDataBounds; } + double data(double key, double value); + double cell(int keyIndex, int valueIndex); + + // setters: + void setSize(int keySize, int valueSize); + void setKeySize(int keySize); + void setValueSize(int valueSize); + void setRange(const QCPRange &keyRange, const QCPRange &valueRange); + void setKeyRange(const QCPRange &keyRange); + void setValueRange(const QCPRange &valueRange); + void setData(double key, double value, double z); + void setCell(int keyIndex, int valueIndex, double z); + + // non-property methods: + void recalculateDataBounds(); + void clear(); + void fill(double z); + bool isEmpty() const { return mIsEmpty; } + void coordToCell(double key, double value, int *keyIndex, int *valueIndex) const; + void cellToCoord(int keyIndex, int valueIndex, double *key, double *value) const; + +protected: + // property members: + int mKeySize, mValueSize; + QCPRange mKeyRange, mValueRange; + bool mIsEmpty; + // non-property members: + double *mData; + QCPRange mDataBounds; + bool mDataModified; + + friend class QCPColorMap; +}; + + +class QCP_LIB_DECL QCPColorMap : public QCPAbstractPlottable +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QCPRange dataRange READ dataRange WRITE setDataRange NOTIFY dataRangeChanged) + Q_PROPERTY(QCPAxis::ScaleType dataScaleType READ dataScaleType WRITE setDataScaleType NOTIFY dataScaleTypeChanged) + Q_PROPERTY(QCPColorGradient gradient READ gradient WRITE setGradient NOTIFY gradientChanged) + Q_PROPERTY(bool interpolate READ interpolate WRITE setInterpolate) + Q_PROPERTY(bool tightBoundary READ tightBoundary WRITE setTightBoundary) + Q_PROPERTY(QCPColorScale* colorScale READ colorScale WRITE setColorScale) + /// \endcond +public: + explicit QCPColorMap(QCPAxis *keyAxis, QCPAxis *valueAxis); + virtual ~QCPColorMap(); + + // getters: + QCPColorMapData *data() const { return mMapData; } + QCPRange dataRange() const { return mDataRange; } + QCPAxis::ScaleType dataScaleType() const { return mDataScaleType; } + bool interpolate() const { return mInterpolate; } + bool tightBoundary() const { return mTightBoundary; } + QCPColorGradient gradient() const { return mGradient; } + QCPColorScale *colorScale() const { return mColorScale.data(); } + + // setters: + void setData(QCPColorMapData *data, bool copy=false); + Q_SLOT void setDataRange(const QCPRange &dataRange); + Q_SLOT void setDataScaleType(QCPAxis::ScaleType scaleType); + Q_SLOT void setGradient(const QCPColorGradient &gradient); + void setInterpolate(bool enabled); + void setTightBoundary(bool enabled); + void setColorScale(QCPColorScale *colorScale); + + // non-property methods: + void rescaleDataRange(bool recalculateDataBounds=false); + Q_SLOT void updateLegendIcon(Qt::TransformationMode transformMode=Qt::SmoothTransformation, const QSize &thumbSize=QSize(32, 18)); + + // reimplemented virtual methods: + virtual void clearData(); + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + +signals: + void dataRangeChanged(QCPRange newRange); + void dataScaleTypeChanged(QCPAxis::ScaleType scaleType); + void gradientChanged(QCPColorGradient newGradient); + +protected: + // property members: + QCPRange mDataRange; + QCPAxis::ScaleType mDataScaleType; + QCPColorMapData *mMapData; + QCPColorGradient mGradient; + bool mInterpolate; + bool mTightBoundary; + QPointer mColorScale; + // non-property members: + QImage mMapImage, mUndersampledMapImage; + QPixmap mLegendIcon; + bool mMapImageInvalidated; + + // introduced virtual methods: + virtual void updateMapImage(); + + // reimplemented virtual methods: + virtual void draw(QCPPainter *painter); + virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const; + virtual QCPRange getKeyRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const; + virtual QCPRange getValueRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const; + + friend class QCustomPlot; + friend class QCPLegend; +}; + + +/*! \file */ + + + +class QCP_LIB_DECL QCPFinancialData +{ +public: + QCPFinancialData(); + QCPFinancialData(double key, double open, double high, double low, double close); + double key, open, high, low, close; +}; +Q_DECLARE_TYPEINFO(QCPFinancialData, Q_MOVABLE_TYPE); + +/*! \typedef QCPFinancialDataMap + Container for storing \ref QCPFinancialData items in a sorted fashion. The key of the map + is the key member of the QCPFinancialData instance. + + This is the container in which QCPFinancial holds its data. + \see QCPFinancial, QCPFinancial::setData +*/ +typedef QMap QCPFinancialDataMap; +typedef QMapIterator QCPFinancialDataMapIterator; +typedef QMutableMapIterator QCPFinancialDataMutableMapIterator; + + +class QCP_LIB_DECL QCPFinancial : public QCPAbstractPlottable +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(ChartStyle chartStyle READ chartStyle WRITE setChartStyle) + Q_PROPERTY(double width READ width WRITE setWidth) + Q_PROPERTY(bool twoColored READ twoColored WRITE setTwoColored) + Q_PROPERTY(QBrush brushPositive READ brushPositive WRITE setBrushPositive) + Q_PROPERTY(QBrush brushNegative READ brushNegative WRITE setBrushNegative) + Q_PROPERTY(QPen penPositive READ penPositive WRITE setPenPositive) + Q_PROPERTY(QPen penNegative READ penNegative WRITE setPenNegative) + /// \endcond +public: + /*! + Defines the possible representations of OHLC data in the plot. + + \see setChartStyle + */ + enum ChartStyle { csOhlc ///< Open-High-Low-Close bar representation + ,csCandlestick ///< Candlestick representation + }; + Q_ENUMS(ChartStyle) + + explicit QCPFinancial(QCPAxis *keyAxis, QCPAxis *valueAxis); + virtual ~QCPFinancial(); + + // getters: + QCPFinancialDataMap *data() const { return mData; } + ChartStyle chartStyle() const { return mChartStyle; } + double width() const { return mWidth; } + bool twoColored() const { return mTwoColored; } + QBrush brushPositive() const { return mBrushPositive; } + QBrush brushNegative() const { return mBrushNegative; } + QPen penPositive() const { return mPenPositive; } + QPen penNegative() const { return mPenNegative; } + + + // setters: + void setData(QCPFinancialDataMap *data, bool copy=false); + void setData(const QVector &key, const QVector &open, const QVector &high, const QVector &low, const QVector &close); + void setChartStyle(ChartStyle style); + void setWidth(double width); + void setTwoColored(bool twoColored); + void setBrushPositive(const QBrush &brush); + void setBrushNegative(const QBrush &brush); + void setPenPositive(const QPen &pen); + void setPenNegative(const QPen &pen); + + // non-property methods: + void addData(const QCPFinancialDataMap &dataMap); + void addData(const QCPFinancialData &data); + void addData(double key, double open, double high, double low, double close); + void addData(const QVector &key, const QVector &open, const QVector &high, const QVector &low, const QVector &close); + void removeDataBefore(double key); + void removeDataAfter(double key); + void removeData(double fromKey, double toKey); + void removeData(double key); + + // reimplemented virtual methods: + virtual void clearData(); + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + + // static methods: + static QCPFinancialDataMap timeSeriesToOhlc(const QVector &time, const QVector &value, double timeBinSize, double timeBinOffset = 0); + +protected: + // property members: + QCPFinancialDataMap *mData; + ChartStyle mChartStyle; + double mWidth; + bool mTwoColored; + QBrush mBrushPositive, mBrushNegative; + QPen mPenPositive, mPenNegative; + + // reimplemented virtual methods: + virtual void draw(QCPPainter *painter); + virtual void drawLegendIcon(QCPPainter *painter, const QRectF &rect) const; + virtual QCPRange getKeyRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const; + virtual QCPRange getValueRange(bool &foundRange, SignDomain inSignDomain=sdBoth) const; + + // non-virtual methods: + void drawOhlcPlot(QCPPainter *painter, const QCPFinancialDataMap::const_iterator &begin, const QCPFinancialDataMap::const_iterator &end); + void drawCandlestickPlot(QCPPainter *painter, const QCPFinancialDataMap::const_iterator &begin, const QCPFinancialDataMap::const_iterator &end); + double ohlcSelectTest(const QPointF &pos, const QCPFinancialDataMap::const_iterator &begin, const QCPFinancialDataMap::const_iterator &end) const; + double candlestickSelectTest(const QPointF &pos, const QCPFinancialDataMap::const_iterator &begin, const QCPFinancialDataMap::const_iterator &end) const; + void getVisibleDataBounds(QCPFinancialDataMap::const_iterator &lower, QCPFinancialDataMap::const_iterator &upper) const; + + friend class QCustomPlot; + friend class QCPLegend; +}; + + +class QCP_LIB_DECL QCPItemStraightLine : public QCPAbstractItem +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QPen pen READ pen WRITE setPen) + Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen) + /// \endcond +public: + QCPItemStraightLine(QCustomPlot *parentPlot); + virtual ~QCPItemStraightLine(); + + // getters: + QPen pen() const { return mPen; } + QPen selectedPen() const { return mSelectedPen; } + + // setters; + void setPen(const QPen &pen); + void setSelectedPen(const QPen &pen); + + // reimplemented virtual methods: + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + + QCPItemPosition * const point1; + QCPItemPosition * const point2; + +protected: + // property members: + QPen mPen, mSelectedPen; + + // reimplemented virtual methods: + virtual void draw(QCPPainter *painter); + + // non-virtual methods: + double distToStraightLine(const QVector2D &point1, const QVector2D &vec, const QVector2D &point) const; + QLineF getRectClippedStraightLine(const QVector2D &point1, const QVector2D &vec, const QRect &rect) const; + QPen mainPen() const; +}; + + +class QCP_LIB_DECL QCPItemLine : public QCPAbstractItem +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QPen pen READ pen WRITE setPen) + Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen) + Q_PROPERTY(QCPLineEnding head READ head WRITE setHead) + Q_PROPERTY(QCPLineEnding tail READ tail WRITE setTail) + /// \endcond +public: + QCPItemLine(QCustomPlot *parentPlot); + virtual ~QCPItemLine(); + + // getters: + QPen pen() const { return mPen; } + QPen selectedPen() const { return mSelectedPen; } + QCPLineEnding head() const { return mHead; } + QCPLineEnding tail() const { return mTail; } + + // setters; + void setPen(const QPen &pen); + void setSelectedPen(const QPen &pen); + void setHead(const QCPLineEnding &head); + void setTail(const QCPLineEnding &tail); + + // reimplemented virtual methods: + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + + QCPItemPosition * const start; + QCPItemPosition * const end; + +protected: + // property members: + QPen mPen, mSelectedPen; + QCPLineEnding mHead, mTail; + + // reimplemented virtual methods: + virtual void draw(QCPPainter *painter); + + // non-virtual methods: + QLineF getRectClippedLine(const QVector2D &start, const QVector2D &end, const QRect &rect) const; + QPen mainPen() const; +}; + + +class QCP_LIB_DECL QCPItemCurve : public QCPAbstractItem +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QPen pen READ pen WRITE setPen) + Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen) + Q_PROPERTY(QCPLineEnding head READ head WRITE setHead) + Q_PROPERTY(QCPLineEnding tail READ tail WRITE setTail) + /// \endcond +public: + QCPItemCurve(QCustomPlot *parentPlot); + virtual ~QCPItemCurve(); + + // getters: + QPen pen() const { return mPen; } + QPen selectedPen() const { return mSelectedPen; } + QCPLineEnding head() const { return mHead; } + QCPLineEnding tail() const { return mTail; } + + // setters; + void setPen(const QPen &pen); + void setSelectedPen(const QPen &pen); + void setHead(const QCPLineEnding &head); + void setTail(const QCPLineEnding &tail); + + // reimplemented virtual methods: + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + + QCPItemPosition * const start; + QCPItemPosition * const startDir; + QCPItemPosition * const endDir; + QCPItemPosition * const end; + +protected: + // property members: + QPen mPen, mSelectedPen; + QCPLineEnding mHead, mTail; + + // reimplemented virtual methods: + virtual void draw(QCPPainter *painter); + + // non-virtual methods: + QPen mainPen() const; +}; + + +class QCP_LIB_DECL QCPItemRect : public QCPAbstractItem +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QPen pen READ pen WRITE setPen) + Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen) + Q_PROPERTY(QBrush brush READ brush WRITE setBrush) + Q_PROPERTY(QBrush selectedBrush READ selectedBrush WRITE setSelectedBrush) + /// \endcond +public: + QCPItemRect(QCustomPlot *parentPlot); + virtual ~QCPItemRect(); + + // getters: + QPen pen() const { return mPen; } + QPen selectedPen() const { return mSelectedPen; } + QBrush brush() const { return mBrush; } + QBrush selectedBrush() const { return mSelectedBrush; } + + // setters; + void setPen(const QPen &pen); + void setSelectedPen(const QPen &pen); + void setBrush(const QBrush &brush); + void setSelectedBrush(const QBrush &brush); + + // reimplemented virtual methods: + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + + QCPItemPosition * const topLeft; + QCPItemPosition * const bottomRight; + QCPItemAnchor * const top; + QCPItemAnchor * const topRight; + QCPItemAnchor * const right; + QCPItemAnchor * const bottom; + QCPItemAnchor * const bottomLeft; + QCPItemAnchor * const left; + +protected: + enum AnchorIndex {aiTop, aiTopRight, aiRight, aiBottom, aiBottomLeft, aiLeft}; + + // property members: + QPen mPen, mSelectedPen; + QBrush mBrush, mSelectedBrush; + + // reimplemented virtual methods: + virtual void draw(QCPPainter *painter); + virtual QPointF anchorPixelPoint(int anchorId) const; + + // non-virtual methods: + QPen mainPen() const; + QBrush mainBrush() const; +}; + + +class QCP_LIB_DECL QCPItemText : public QCPAbstractItem +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QColor color READ color WRITE setColor) + Q_PROPERTY(QColor selectedColor READ selectedColor WRITE setSelectedColor) + Q_PROPERTY(QPen pen READ pen WRITE setPen) + Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen) + Q_PROPERTY(QBrush brush READ brush WRITE setBrush) + Q_PROPERTY(QBrush selectedBrush READ selectedBrush WRITE setSelectedBrush) + Q_PROPERTY(QFont font READ font WRITE setFont) + Q_PROPERTY(QFont selectedFont READ selectedFont WRITE setSelectedFont) + Q_PROPERTY(QString text READ text WRITE setText) + Q_PROPERTY(Qt::Alignment positionAlignment READ positionAlignment WRITE setPositionAlignment) + Q_PROPERTY(Qt::Alignment textAlignment READ textAlignment WRITE setTextAlignment) + Q_PROPERTY(double rotation READ rotation WRITE setRotation) + Q_PROPERTY(QMargins padding READ padding WRITE setPadding) + /// \endcond +public: + QCPItemText(QCustomPlot *parentPlot); + virtual ~QCPItemText(); + + // getters: + QColor color() const { return mColor; } + QColor selectedColor() const { return mSelectedColor; } + QPen pen() const { return mPen; } + QPen selectedPen() const { return mSelectedPen; } + QBrush brush() const { return mBrush; } + QBrush selectedBrush() const { return mSelectedBrush; } + QFont font() const { return mFont; } + QFont selectedFont() const { return mSelectedFont; } + QString text() const { return mText; } + Qt::Alignment positionAlignment() const { return mPositionAlignment; } + Qt::Alignment textAlignment() const { return mTextAlignment; } + double rotation() const { return mRotation; } + QMargins padding() const { return mPadding; } + + // setters; + void setColor(const QColor &color); + void setSelectedColor(const QColor &color); + void setPen(const QPen &pen); + void setSelectedPen(const QPen &pen); + void setBrush(const QBrush &brush); + void setSelectedBrush(const QBrush &brush); + void setFont(const QFont &font); + void setSelectedFont(const QFont &font); + void setText(const QString &text); + void setPositionAlignment(Qt::Alignment alignment); + void setTextAlignment(Qt::Alignment alignment); + void setRotation(double degrees); + void setPadding(const QMargins &padding); + + // reimplemented virtual methods: + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + + QCPItemPosition * const position; + QCPItemAnchor * const topLeft; + QCPItemAnchor * const top; + QCPItemAnchor * const topRight; + QCPItemAnchor * const right; + QCPItemAnchor * const bottomRight; + QCPItemAnchor * const bottom; + QCPItemAnchor * const bottomLeft; + QCPItemAnchor * const left; + +protected: + enum AnchorIndex {aiTopLeft, aiTop, aiTopRight, aiRight, aiBottomRight, aiBottom, aiBottomLeft, aiLeft}; + + // property members: + QColor mColor, mSelectedColor; + QPen mPen, mSelectedPen; + QBrush mBrush, mSelectedBrush; + QFont mFont, mSelectedFont; + QString mText; + Qt::Alignment mPositionAlignment; + Qt::Alignment mTextAlignment; + double mRotation; + QMargins mPadding; + + // reimplemented virtual methods: + virtual void draw(QCPPainter *painter); + virtual QPointF anchorPixelPoint(int anchorId) const; + + // non-virtual methods: + QPointF getTextDrawPoint(const QPointF &pos, const QRectF &rect, Qt::Alignment positionAlignment) const; + QFont mainFont() const; + QColor mainColor() const; + QPen mainPen() const; + QBrush mainBrush() const; +}; + + +class QCP_LIB_DECL QCPItemEllipse : public QCPAbstractItem +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QPen pen READ pen WRITE setPen) + Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen) + Q_PROPERTY(QBrush brush READ brush WRITE setBrush) + Q_PROPERTY(QBrush selectedBrush READ selectedBrush WRITE setSelectedBrush) + /// \endcond +public: + QCPItemEllipse(QCustomPlot *parentPlot); + virtual ~QCPItemEllipse(); + + // getters: + QPen pen() const { return mPen; } + QPen selectedPen() const { return mSelectedPen; } + QBrush brush() const { return mBrush; } + QBrush selectedBrush() const { return mSelectedBrush; } + + // setters; + void setPen(const QPen &pen); + void setSelectedPen(const QPen &pen); + void setBrush(const QBrush &brush); + void setSelectedBrush(const QBrush &brush); + + // reimplemented virtual methods: + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + + QCPItemPosition * const topLeft; + QCPItemPosition * const bottomRight; + QCPItemAnchor * const topLeftRim; + QCPItemAnchor * const top; + QCPItemAnchor * const topRightRim; + QCPItemAnchor * const right; + QCPItemAnchor * const bottomRightRim; + QCPItemAnchor * const bottom; + QCPItemAnchor * const bottomLeftRim; + QCPItemAnchor * const left; + QCPItemAnchor * const center; + +protected: + enum AnchorIndex {aiTopLeftRim, aiTop, aiTopRightRim, aiRight, aiBottomRightRim, aiBottom, aiBottomLeftRim, aiLeft, aiCenter}; + + // property members: + QPen mPen, mSelectedPen; + QBrush mBrush, mSelectedBrush; + + // reimplemented virtual methods: + virtual void draw(QCPPainter *painter); + virtual QPointF anchorPixelPoint(int anchorId) const; + + // non-virtual methods: + QPen mainPen() const; + QBrush mainBrush() const; +}; + + +class QCP_LIB_DECL QCPItemPixmap : public QCPAbstractItem +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QPixmap pixmap READ pixmap WRITE setPixmap) + Q_PROPERTY(bool scaled READ scaled WRITE setScaled) + Q_PROPERTY(Qt::AspectRatioMode aspectRatioMode READ aspectRatioMode) + Q_PROPERTY(Qt::TransformationMode transformationMode READ transformationMode) + Q_PROPERTY(QPen pen READ pen WRITE setPen) + Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen) + /// \endcond +public: + QCPItemPixmap(QCustomPlot *parentPlot); + virtual ~QCPItemPixmap(); + + // getters: + QPixmap pixmap() const { return mPixmap; } + bool scaled() const { return mScaled; } + Qt::AspectRatioMode aspectRatioMode() const { return mAspectRatioMode; } + Qt::TransformationMode transformationMode() const { return mTransformationMode; } + QPen pen() const { return mPen; } + QPen selectedPen() const { return mSelectedPen; } + + // setters; + void setPixmap(const QPixmap &pixmap); + void setScaled(bool scaled, Qt::AspectRatioMode aspectRatioMode=Qt::KeepAspectRatio, Qt::TransformationMode transformationMode=Qt::SmoothTransformation); + void setPen(const QPen &pen); + void setSelectedPen(const QPen &pen); + + // reimplemented virtual methods: + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + + QCPItemPosition * const topLeft; + QCPItemPosition * const bottomRight; + QCPItemAnchor * const top; + QCPItemAnchor * const topRight; + QCPItemAnchor * const right; + QCPItemAnchor * const bottom; + QCPItemAnchor * const bottomLeft; + QCPItemAnchor * const left; + +protected: + enum AnchorIndex {aiTop, aiTopRight, aiRight, aiBottom, aiBottomLeft, aiLeft}; + + // property members: + QPixmap mPixmap; + QPixmap mScaledPixmap; + bool mScaled; + bool mScaledPixmapInvalidated; + Qt::AspectRatioMode mAspectRatioMode; + Qt::TransformationMode mTransformationMode; + QPen mPen, mSelectedPen; + + // reimplemented virtual methods: + virtual void draw(QCPPainter *painter); + virtual QPointF anchorPixelPoint(int anchorId) const; + + // non-virtual methods: + void updateScaledPixmap(QRect finalRect=QRect(), bool flipHorz=false, bool flipVert=false); + QRect getFinalRect(bool *flippedHorz=0, bool *flippedVert=0) const; + QPen mainPen() const; +}; + + +class QCP_LIB_DECL QCPItemTracer : public QCPAbstractItem +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QPen pen READ pen WRITE setPen) + Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen) + Q_PROPERTY(QBrush brush READ brush WRITE setBrush) + Q_PROPERTY(QBrush selectedBrush READ selectedBrush WRITE setSelectedBrush) + Q_PROPERTY(double size READ size WRITE setSize) + Q_PROPERTY(TracerStyle style READ style WRITE setStyle) + Q_PROPERTY(QCPGraph* graph READ graph WRITE setGraph) + Q_PROPERTY(double graphKey READ graphKey WRITE setGraphKey) + Q_PROPERTY(bool interpolating READ interpolating WRITE setInterpolating) + /// \endcond +public: + /*! + The different visual appearances a tracer item can have. Some styles size may be controlled with \ref setSize. + + \see setStyle + */ + enum TracerStyle { tsNone ///< The tracer is not visible + ,tsPlus ///< A plus shaped crosshair with limited size + ,tsCrosshair ///< A plus shaped crosshair which spans the complete axis rect + ,tsCircle ///< A circle + ,tsSquare ///< A square + }; + Q_ENUMS(TracerStyle) + + QCPItemTracer(QCustomPlot *parentPlot); + virtual ~QCPItemTracer(); + + // getters: + QPen pen() const { return mPen; } + QPen selectedPen() const { return mSelectedPen; } + QBrush brush() const { return mBrush; } + QBrush selectedBrush() const { return mSelectedBrush; } + double size() const { return mSize; } + TracerStyle style() const { return mStyle; } + QCPGraph *graph() const { return mGraph; } + double graphKey() const { return mGraphKey; } + bool interpolating() const { return mInterpolating; } + + // setters; + void setPen(const QPen &pen); + void setSelectedPen(const QPen &pen); + void setBrush(const QBrush &brush); + void setSelectedBrush(const QBrush &brush); + void setSize(double size); + void setStyle(TracerStyle style); + void setGraph(QCPGraph *graph); + void setGraphKey(double key); + void setInterpolating(bool enabled); + + // reimplemented virtual methods: + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + + // non-virtual methods: + void updatePosition(); + + QCPItemPosition * const position; + +protected: + // property members: + QPen mPen, mSelectedPen; + QBrush mBrush, mSelectedBrush; + double mSize; + TracerStyle mStyle; + QCPGraph *mGraph; + double mGraphKey; + bool mInterpolating; + + // reimplemented virtual methods: + virtual void draw(QCPPainter *painter); + + // non-virtual methods: + QPen mainPen() const; + QBrush mainBrush() const; +}; + + +class QCP_LIB_DECL QCPItemBracket : public QCPAbstractItem +{ + Q_OBJECT + /// \cond INCLUDE_QPROPERTIES + Q_PROPERTY(QPen pen READ pen WRITE setPen) + Q_PROPERTY(QPen selectedPen READ selectedPen WRITE setSelectedPen) + Q_PROPERTY(double length READ length WRITE setLength) + Q_PROPERTY(BracketStyle style READ style WRITE setStyle) + /// \endcond +public: + enum BracketStyle { bsSquare ///< A brace with angled edges + ,bsRound ///< A brace with round edges + ,bsCurly ///< A curly brace + ,bsCalligraphic ///< A curly brace with varying stroke width giving a calligraphic impression + }; + + QCPItemBracket(QCustomPlot *parentPlot); + virtual ~QCPItemBracket(); + + // getters: + QPen pen() const { return mPen; } + QPen selectedPen() const { return mSelectedPen; } + double length() const { return mLength; } + BracketStyle style() const { return mStyle; } + + // setters; + void setPen(const QPen &pen); + void setSelectedPen(const QPen &pen); + void setLength(double length); + void setStyle(BracketStyle style); + + // reimplemented virtual methods: + virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const; + + QCPItemPosition * const left; + QCPItemPosition * const right; + QCPItemAnchor * const center; + +protected: + // property members: + enum AnchorIndex {aiCenter}; + QPen mPen, mSelectedPen; + double mLength; + BracketStyle mStyle; + + // reimplemented virtual methods: + virtual void draw(QCPPainter *painter); + virtual QPointF anchorPixelPoint(int anchorId) const; + + // non-virtual methods: + QPen mainPen() const; +}; + +#endif // QCUSTOMPLOT_H + diff --git a/Desktop Interface/resources.qrc b/Desktop Interface/resources.qrc new file mode 100644 index 00000000..67eec860 --- /dev/null +++ b/Desktop Interface/resources.qrc @@ -0,0 +1,7 @@ + + + buffer_0.bmp + buffer_1.bmp + buffer_2.bmp + + diff --git a/Desktop Interface/siPrint.cpp b/Desktop Interface/siPrint.cpp new file mode 100644 index 00000000..287ef3c9 --- /dev/null +++ b/Desktop Interface/siPrint.cpp @@ -0,0 +1,65 @@ +#include "siprint.h" + +siprint::siprint(char *unitsInit, double valInit) +{ + strncpy(units, unitsInit, 6); + value = valInit; +} + +char* siprint::printVal(){ + double tempValue = value; + bool negative = false; + + if (tempValue == 0){ + sprintf(printString, "0%s", units); + return printString; + } + if (value < 0){ + negative = true; + tempValue *= -1; + } + if (tempValue >= 1000000000000000000){ + sprintf(printString, "Inf %s", units); + return printString; + } + + + if (tempValue >= 1000000){ + sprintf(printString, "%c%.2fM%s", (negative ? '-':' '), tempValue/1000000, units); + return printString; + } + + if (tempValue >= 1000){ + sprintf(printString, "%c%.2fk%s", (negative ? '-':' '), tempValue/1000, units); + return printString; + } + + if (tempValue >= 1){ + sprintf(printString, "%c%.2f%s", (negative ? '-':' '), tempValue, units); + return printString; + } + + if (tempValue >= 0.001){ + sprintf(printString, "%c%.2fm%s", (negative ? '-' : ' '), tempValue*1000, units); + return printString; + } + + if (tempValue >= 0.000001){ + sprintf(printString, "%c%.2fu%s", (negative ? '-':' '), tempValue*1000000, units); + return printString; + } + + if (tempValue >= 0.000000001){ + sprintf(printString, "%c%.2fn%s", (negative ? '-':' '), tempValue*1000000000, units); + return printString; + } + + if (tempValue >= 0.000000000001){ + sprintf(printString, "%c%.2fp%s", (negative ? '-':' '), tempValue*1000000000000, units); + return printString; + } + + + sprintf(printString, "0%s", units); + return printString; +} diff --git a/Desktop Interface/siprint.h b/Desktop Interface/siprint.h new file mode 100644 index 00000000..3f49b2fd --- /dev/null +++ b/Desktop Interface/siprint.h @@ -0,0 +1,19 @@ +#ifndef SIPRINT_H +#define SIPRINT_H + +#include +#include + +class siprint +{ +public: + siprint(char *unitsInit, double valInit); + char* printVal(); + char units[6]; + double value; +private: + char printString[160]; + +}; + +#endif // SIPRINT_H diff --git a/Desktop Interface/timedtickbox.cpp b/Desktop Interface/timedtickbox.cpp new file mode 100644 index 00000000..76ad242f --- /dev/null +++ b/Desktop Interface/timedtickbox.cpp @@ -0,0 +1,24 @@ +#include "timedtickbox.h" + +timedTickBox::timedTickBox(QWidget *parent) : QCheckBox(parent) +{ + timer = new QTimer(); + timer->setTimerType(Qt::PreciseTimer); + timer->start(timerLength); + connect(timer, SIGNAL(timeout()), this, SLOT(timerTick())); + +} + +void timedTickBox::resetTimer(){ + timer->stop(); + if(timerEnabled) timer->start(timerLength); +} + +void timedTickBox::timerTick(){ + this->setChecked(true); + timer->stop(); +} + +void timedTickBox::enableTimer(bool enabled){ + timerEnabled = enabled; +} diff --git a/Desktop Interface/timedtickbox.h b/Desktop Interface/timedtickbox.h new file mode 100644 index 00000000..7fa52df0 --- /dev/null +++ b/Desktop Interface/timedtickbox.h @@ -0,0 +1,25 @@ +#ifndef TIMEDTICKBOX_H +#define TIMEDTICKBOX_H + +#include +#include +#include + +class timedTickBox : public QCheckBox +{ + Q_OBJECT +public: + explicit timedTickBox(QWidget *parent = 0); + bool timerEnabled = true; + int timerLength = 7500; + QTimer *timer = NULL; + +signals: + +public slots: + void resetTimer(); + void timerTick(); + void enableTimer(bool enabled); +}; + +#endif // TIMEDTICKBOX_H diff --git a/Desktop Interface/usbdriver.h b/Desktop Interface/usbdriver.h new file mode 100644 index 00000000..b1c250ac --- /dev/null +++ b/Desktop Interface/usbdriver.h @@ -0,0 +1,18 @@ +#ifndef USBDRIVER_H +#define USBDRIVER_H + +#include +#include + +class usbDriver : public QLabel +{ + Q_OBJECT +public: + explicit usbDriver(QLabel *parent = 0); + +signals: + +public slots: +}; + +#endif // USBDRIVER_H diff --git a/Desktop Interface/waveforms/Sawtooth.tlw b/Desktop Interface/waveforms/Sawtooth.tlw new file mode 100644 index 00000000..e989a81b --- /dev/null +++ b/Desktop Interface/waveforms/Sawtooth.tlw @@ -0,0 +1,3 @@ +128 +3 +0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 114 116 118 120 122 124 126 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189 191 193 195 197 199 201 203 205 207 209 211 213 215 217 219 221 223 225 227 229 231 233 235 237 239 241 243 245 247 249 251 253 255 diff --git a/Desktop Interface/waveforms/Sin.tlw b/Desktop Interface/waveforms/Sin.tlw new file mode 100644 index 00000000..e376c353 --- /dev/null +++ b/Desktop Interface/waveforms/Sin.tlw @@ -0,0 +1,3 @@ +128 +4 +128 134 140 146 153 159 165 171 177 182 188 194 199 204 209 214 218 223 227 230 234 237 240 243 246 248 250 251 253 254 255 255 255 255 254 253 252 251 249 247 245 242 239 236 232 229 225 220 216 211 206 201 196 191 185 180 174 168 162 156 149 143 137 131 124 118 112 106 99 93 87 81 75 70 64 59 54 49 44 39 35 30 26 23 19 16 13 10 8 6 4 3 2 1 0 0 0 0 1 2 4 5 7 9 12 15 18 21 25 28 32 37 41 46 51 56 61 67 73 78 84 90 96 102 109 115 121 127 \ No newline at end of file diff --git a/Desktop Interface/waveforms/Square.tlw b/Desktop Interface/waveforms/Square.tlw new file mode 100644 index 00000000..7bdd30be --- /dev/null +++ b/Desktop Interface/waveforms/Square.tlw @@ -0,0 +1,3 @@ +128 +5 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 diff --git a/Desktop Interface/waveforms/Triangle.tlw b/Desktop Interface/waveforms/Triangle.tlw new file mode 100644 index 00000000..420ac92c --- /dev/null +++ b/Desktop Interface/waveforms/Triangle.tlw @@ -0,0 +1,3 @@ +128 +4 +0 4 8 12 16 20 24 28 32 36 40 45 49 53 57 61 65 69 73 77 81 85 89 93 97 101 105 109 113 117 121 125 130 134 138 142 146 150 154 158 162 166 170 174 178 182 186 190 194 198 202 206 210 215 219 223 227 231 235 239 243 247 251 255 255 251 247 243 239 235 231 227 223 219 215 210 206 202 198 194 190 186 182 178 174 170 166 162 158 154 150 146 142 138 134 130 125 121 117 113 109 105 101 97 93 89 85 81 77 73 69 65 61 57 53 49 45 40 36 32 28 24 20 16 12 8 4 0 diff --git a/Desktop Interface/waveforms/_list.wfl b/Desktop Interface/waveforms/_list.wfl new file mode 100644 index 00000000..488a0133 --- /dev/null +++ b/Desktop Interface/waveforms/_list.wfl @@ -0,0 +1,4 @@ +Sin +Square +Triangle +Sawtooth \ No newline at end of file diff --git a/Desktop Interface/waveforms_OLD/Sawtooth.tlw b/Desktop Interface/waveforms_OLD/Sawtooth.tlw new file mode 100644 index 00000000..e989a81b --- /dev/null +++ b/Desktop Interface/waveforms_OLD/Sawtooth.tlw @@ -0,0 +1,3 @@ +128 +3 +0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102 104 106 108 110 112 114 116 118 120 122 124 126 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189 191 193 195 197 199 201 203 205 207 209 211 213 215 217 219 221 223 225 227 229 231 233 235 237 239 241 243 245 247 249 251 253 255 diff --git a/Desktop Interface/waveforms_OLD/Sin.tlw b/Desktop Interface/waveforms_OLD/Sin.tlw new file mode 100644 index 00000000..a971bdad --- /dev/null +++ b/Desktop Interface/waveforms_OLD/Sin.tlw @@ -0,0 +1,3 @@ +128 +4 +128 134 140 146 153 159 165 171 177 182 188 194 199 204 209 214 218 223 227 230 234 237 240 243 246 248 250 251 253 254 255 255 255 255 254 253 252 251 249 247 245 242 239 236 232 229 225 220 216 211 206 201 196 191 185 180 174 168 162 156 149 143 137 131 124 118 112 106 99 93 87 81 75 70 64 59 54 49 44 39 35 30 26 23 19 16 13 10 8 6 4 3 2 1 0 0 0 0 1 2 4 5 7 9 12 15 18 21 25 28 32 37 41 46 51 56 61 67 73 78 84 90 96 102 109 115 121 127 diff --git a/Desktop Interface/waveforms_OLD/Square.tlw b/Desktop Interface/waveforms_OLD/Square.tlw new file mode 100644 index 00000000..7bdd30be --- /dev/null +++ b/Desktop Interface/waveforms_OLD/Square.tlw @@ -0,0 +1,3 @@ +128 +5 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 diff --git a/Desktop Interface/waveforms_OLD/Triangle.tlw b/Desktop Interface/waveforms_OLD/Triangle.tlw new file mode 100644 index 00000000..420ac92c --- /dev/null +++ b/Desktop Interface/waveforms_OLD/Triangle.tlw @@ -0,0 +1,3 @@ +128 +4 +0 4 8 12 16 20 24 28 32 36 40 45 49 53 57 61 65 69 73 77 81 85 89 93 97 101 105 109 113 117 121 125 130 134 138 142 146 150 154 158 162 166 170 174 178 182 186 190 194 198 202 206 210 215 219 223 227 231 235 239 243 247 251 255 255 251 247 243 239 235 231 227 223 219 215 210 206 202 198 194 190 186 182 178 174 170 166 162 158 154 150 146 142 138 134 130 125 121 117 113 109 105 101 97 93 89 85 81 77 73 69 65 61 57 53 49 45 40 36 32 28 24 20 16 12 8 4 0 diff --git a/Desktop Interface/waveforms_OLD/_list.wfl b/Desktop Interface/waveforms_OLD/_list.wfl new file mode 100644 index 00000000..488a0133 --- /dev/null +++ b/Desktop Interface/waveforms_OLD/_list.wfl @@ -0,0 +1,4 @@ +Sin +Square +Triangle +Sawtooth \ No newline at end of file diff --git a/Desktop Interface/winusbdriver.cpp b/Desktop Interface/winusbdriver.cpp new file mode 100644 index 00000000..c6f81524 --- /dev/null +++ b/Desktop Interface/winusbdriver.cpp @@ -0,0 +1,512 @@ +#include "winusbdriver.h" + +winUsbDriver::winUsbDriver(QWidget *parent) : QLabel(parent) +{ + qDebug() << "Making USB Driver invisible!!"; + this->hide(); + //Load stack so that reset signal can be sent + firstConnect = usbInit(0x03eb, 0xa000); + if(firstConnect){ + setDeviceMode(deviceMode); + usbSendControl(0x40, 0xa7, 0, 0, 0, NULL); + //Stack will reinitialise TIMER_PERIOD seconds later, after first failed iso request + } + + psuTimer = new QTimer(); + psuTimer->setTimerType(Qt::PreciseTimer); + psuTimer->start(PSU_PERIOD); + connect(psuTimer, SIGNAL(timeout()), this, SLOT(psuTick())); +} + +unsigned char winUsbDriver::usbInit(ULONG VIDin, ULONG PIDin){ + unsigned char success; + + //qDebug() << "usbInit() entered"; + if (!LstK_Init(&deviceList, (KLST_FLAG) 0)) { + qDebug("Error initializing device list"); + return 0; + } //else qDebug() << "Device List initialised!"; + + LstK_Count(deviceList, &deviceCount); + if (!deviceCount) { + qDebug("Device list empty"); + LstK_Free(deviceList); // If LstK_Init returns TRUE, the list must be freed. + return 0; + } //else qDebug() << "Device Count initialised!"; + + //qDebug("Looking for device VID = %04X, PID = %04X\n", VIDin, PIDin); + + LstK_FindByVidPid(deviceList, VIDin, PIDin, &deviceInfo); + LstK_Free(deviceList); + if (deviceInfo){ + /*qDebug("Using %04X:%04X (%s): %s - %s\n", + deviceInfo->Common.Vid, + deviceInfo->Common.Pid, + deviceInfo->Common.InstanceID, + deviceInfo->DeviceDesc, + deviceInfo->Mfg); + Causes exceptions in debug mode!!!!*/ + } + else { + qDebug("Could not find device VID = %04X, PID = %04X", VIDin, PIDin); + return 0; + } + + success = UsbK_Init(&handle, deviceInfo); + if (!success){ + ec = GetLastError(); + qDebug("UsbK_Init failed. ErrorCode: %08Xh", ec); + } else qDebug("Device opened successfully!"); + + return success; +} + +void winUsbDriver::usbSendControl(int RequestType, int Request, int Value, int Index, int Length, unsigned char *LDATA){ + + ////////////////////////////////////////////////////////////////////////////////////////// + //IF YOU'RE SEEING AN ERROR, CHECK THAT REQUESTTYPE AND REQUEST ARE FORMATTED AS HEX + ////////////////////////////////////////////////////////////////////////////////////////// + + WINUSB_SETUP_PACKET setupPacket; + unsigned char controlSuccess; + UINT bytesTransferred = 0; + unsigned char *controlBuffer; + + if (handle==NULL){ + qDebug("Null handle error in usbSendControl"); + return; + } + setupPacket.RequestType = (UCHAR) RequestType; + setupPacket.Request = (UCHAR) Request; + setupPacket.Value = (USHORT) Value; + setupPacket.Index = (USHORT) Index; + setupPacket.Length = (USHORT) Length; + + //qDebug("RequestType = %x, Request = %x, Value = %u, Index = %u, Length = %u", setupPacket.RequestType, setupPacket.Request, setupPacket.Value, setupPacket.Index, setupPacket.Length); + + if (LDATA==NULL){ + controlBuffer = (unsigned char *) malloc(256); + } + else controlBuffer = LDATA; + + //qDebug() << controlBuffer; + //qDebug() << handle; + + //qDebug("SENDING CONTROL PACKET\n"); + controlSuccess = UsbK_ControlTransfer(handle, setupPacket, controlBuffer, setupPacket.Length, &bytesTransferred, NULL); + if (controlSuccess) { + qDebug("%d BYTES TRANSFERRED", bytesTransferred); + } + else qDebug("usbSendControl failed"); + + if(LDATA == NULL){ + free(controlBuffer); + } +} + +void winUsbDriver::setPsu(double voltage){ + + qDebug() << "New voltage =" << voltage; + currentPsuVoltage = voltage; + //if(deviceMode > 6) qFatal("setPsu is not configured for mode 7!!!"); + double vinp = voltage/11; + double vinn = 0; + //double vref = 1.65; + double gainPsu = 1; + + dutyPsu = (int) ((vinp - vinn)/vref * gainPsu * PSU_ADC_TOP); + + qDebug() << "Going to send value " << dutyPsu; +} + +void winUsbDriver::setFunctionGen(int channel, functionGenControl *fGenControl){ + //////////////////////////// + ////NO RESIZING (YET)!!!//// + //////////////////////////// + + ////////////////////////////////////// + //// CH1 is AUX!! CH2 is "MAIN"!!//// + ////////////////////////////////////// + + int length, maxLength, numDivides, maxDivides; + double freq, amplitude, offset; + unsigned char *samples; + + //For recalling on crash. + fGenChannel = channel; + if (channel == 0) fGenPtr_CH1 = fGenControl; + else fGenPtr_CH2 = fGenControl; + + //Reading in data + if (channel == 0){ + length = fGenControl->length_CH1; + freq = fGenControl->freq_CH1; + amplitude = fGenControl->amplitude_CH1; + offset = fGenControl->offset_CH1; + samples = (unsigned char *) malloc(length); + memcpy(samples, fGenControl->samples_CH1, (unsigned int) length); + numDivides = fGenControl->divisibility_CH1; + } + else if(channel == 1){ + length = fGenControl->length_CH2; + freq = fGenControl->freq_CH2; + amplitude = fGenControl->amplitude_CH2; + offset = fGenControl->offset_CH2; + samples = (unsigned char *) malloc(length); + memcpy(samples, fGenControl->samples_CH2, (unsigned int) length); + numDivides = fGenControl->divisibility_CH2; + } + + //Triple mode + if ((amplitude+offset) > FGEN_LIMIT){ + amplitude = amplitude / 3; + offset = offset / 3; + fGenTriple |= ((unsigned char) !channel + 1); + } + else fGenTriple &= ((unsigned char) (254 - !channel)); + + //qDebug() << "fGenTriple = " << fGenTriple << "fGenControl = " << fGenControl << "length = " << length << "freq = " << freq << "amplitude = " << amplitude << "offset = " << offset << "samples = " << samples; + + //Waveform scaling in V + double tempDouble; + amplitude = (amplitude * 255) / FGEN_LIMIT; + offset = (offset * 255) / FGEN_LIMIT; + if (offset5) + amplitude -= FGEN_OFFSET; + else + amplitude = 0; + offset = FGEN_OFFSET; + } + +#ifdef INVERT_TRIPLE + unsigned char fGenTemp = 0; + fGenTemp |= (fGenTriple & 0x01)<<1; + fGenTemp |= (fGenTriple & 0x02)>>1; + usbSendControl(0x40, 0xa4, fGenTemp, 0, 0, NULL); +#else + usbSendControl(0x40, 0xa4, fGenTriple, 0, 0, NULL); +#endif + + //Applying amplitude and offset to all samples. + for (int i=0;i DAC_SPS){ + loop_entered = true; + numDivides--; + if (numDivides==0){ + qDebug("numDivides = 0 - in T-stretching of winUsbDriver:: setFunctionGen"); + } + + int shiftTemp = (maxDivides - numDivides); + length = length >> 1; + + free(tempSamples); + tempSamples = (unsigned char *) malloc(length); + for (int i=0; i 2) sendClearBuffer(1,0,0); + setVisible_CH2(0); + checkXY(0); + break; + case 1: + if(oldMode > 2) sendClearBuffer(1,0,0); + sendClearBuffer(0,1,0); + setVisible_CH2(1); + checkXY(0); + break; + case 2: + if(oldMode > 2) sendClearBuffer(1,0,0); + sendClearBuffer(0,1,0); + setVisible_CH2(1); + break; + case 3: + if(oldMode != 4) sendClearBuffer(1,0,0); + sendClearBuffer(0,1,0); + setVisible_CH2(0); + checkXY(0); + break; + case 4: + if(oldMode != 3) sendClearBuffer(1,0,0); + sendClearBuffer(0,1,0); + setVisible_CH2(1); + checkXY(0); + break; + case 5: + setVisible_CH2(0); + checkXY(0); + break; + case 6: + sendClearBuffer(0,0,1); + setVisible_CH2(0); + checkXY(0); + break; + case 7: + sendClearBuffer(1,0,0); + enableMMTimer(); + checkXY(0); + break; + default: + qFatal("Error in winUsbDriver::setDeviceMode. Invalid device mode."); + } + +} + +void winUsbDriver::psuTick(){ + if(dutyTemp == dutyPsu) return; + + if (dutyTemp > dutyPsu){ + if((dutyTemp - dutyPsu)> PSU_STEP){ + dutyTemp -= PSU_STEP; + } else dutyTemp = dutyPsu; + } + + if (dutyTemp < dutyPsu){ + if((dutyPsu - dutyTemp)> PSU_STEP){ + dutyTemp += PSU_STEP; + } else dutyTemp = dutyPsu; + } + + if ((dutyTemp>113) || (dutyTemp<21)){ + qDebug("PSU DUTY CYCLE TOO LARGE (could underflow on SOF)!!! ABORTING!!!"); + } + usbSendControl(0x40, 0xa3, dutyTemp, 0, 0, NULL); +} + +void winUsbDriver::setGain(double newGain){ + if (newGain == scopeGain) return; //No update! + gainBuffers(scopeGain/newGain); + scopeGain = newGain; + if (newGain == 0.5){ + gainMask = 7<<2 | 7<<10; + } + else gainMask = (unsigned short)(log2(newGain))<<2 | (unsigned short)(log2(newGain))<<10; + qDebug("newGain = %f", newGain); + qDebug("gainMask = %d", gainMask); + usbSendControl(0x40, 0xa5, deviceMode, gainMask, 0, NULL); +} + +void winUsbDriver::reinitialise(bool forceAttempt){ + + /*if (!firstConnect){ + firstConnect = usbInit(0x03eb, 0xa000); + setDeviceMode(deviceMode); + usbIsoInit(); + //Reset!! + usbSendControl(0x40, 0xa7, 0, 0, 0, NULL); + //Stack will reinitialise TIMER_PERIOD seconds later, after first failed iso request + return; + }*/ + + if (!forceAttempt){ + if(recoveryInProcess == true) { + //qDebug() << "Cancelling reinitialise()"; + return; + } + } + + //qDebug() << "reinitialise() entered"; + + //if(forceAttempt) qFatal("Forcing attempt"); + + disableWindow(0); + + recoveryInProcess = true; + + unsigned char success; + DWORD errorCode = ERROR_SUCCESS; + + success = UsbK_Free(handle); + if (!success){ + errorCode = GetLastError(); + qDebug("UsbK_Free (reinit) failed. ErrorCode: %08Xh\n", errorCode); + } + //else qDebug() << "Handle freed successfully!"; + + if(forceAttempt){ + StmK_Free(stm_handle); + stm_handle = NULL; + } + UsbK_ResetDevice(handle); + unsigned char initSuccess = usbInit(0x03eb, 0xa000); + //qDebug() << "usbInit(0x03eb, 0xa000) returned" << initSuccess; + + if (!initSuccess){ + recoverySuccess = 0; + return; + } + + setDeviceMode(deviceMode); + //qDebug() << "setDeviceMode(deviceMode) returned" << deviceSuccess; + if (fGenPtr_CH1 != NULL) { + //qDebug() << "setFunctionGen(0, fGenPtr_CH1)"; + setFunctionGen(0, fGenPtr_CH1); + } + if (fGenPtr_CH2 != NULL){ + //qDebug() << "setFunctionGen(1, fGenPtr_CH2)"; + setFunctionGen(1, fGenPtr_CH2); + } + newDig(digitalPinState); + + + unsigned char isoInitSuccess = usbIsoInit(); + //qDebug() << "usbIsoInit() returned" << isoInitSuccess; + + recoverySuccess = initSuccess && isoInitSuccess; + + if(recoverySuccess){ + //qDebug() << "reinitialise() completed successfully"; + } + //else qDebug() << "reinitialise() completed with errors"; +} + +void winUsbDriver::avrDebug(void){ + usbSendControl(0x40, 0xa0, 0, 0, 0, NULL); +} diff --git a/Desktop Interface/winusbdriver.h b/Desktop Interface/winusbdriver.h new file mode 100644 index 00000000..86cdc0cb --- /dev/null +++ b/Desktop Interface/winusbdriver.h @@ -0,0 +1,78 @@ +#ifndef WINUSBDRIVER_H +#define WINUSBDRIVER_H + +#include +#include +#include +#include + +#include "functiongencontrol.h" +#include "xmega.h" +#include "desktop_settings.h" +#include "buffercontrol.h" + +//libusbK includes +#include +#include +#include +#include +#include "libusbk.h" + + + +class winUsbDriver : public QLabel +{ + Q_OBJECT +public: + explicit winUsbDriver(QWidget *parent = 0); + char *isoRead(int numSamples); + ~winUsbDriver(); + bool recoveryInProcess = false; + unsigned char recoverySuccess; + void reinitialise(bool secondStage); + int deviceMode = INIT_DEVICE_MODE; + void setBufferPtr(bufferControl *newPtr); + double scopeGain = 0.5; + int dutyTemp = 0; +private: + unsigned char fGenTriple=0; + KUSB_HANDLE handle = NULL; + unsigned short gainMask = 2056; + KSTM_HANDLE stm_handle = NULL; + unsigned char pipeID = 0x83; + unsigned char usbInit(ULONG VIDin, ULONG PIDin); + void usbSendControl(int RequestType, int Request, int Value, int Index, int Length, unsigned char *LDATA); + void xmegaBreak(void); + unsigned char usbIsoInit(void); + int fGenChannel; + functionGenControl *fGenPtr_CH1 = NULL, *fGenPtr_CH2 = NULL; + bufferControl *bufferPtr = NULL; + int dutyPsu = 0; + QTimer *psuTimer; + bool firstConnect = false; + double currentPsuVoltage; + KLST_DEVINFO_HANDLE deviceInfo = NULL; + WINUSB_PIPE_INFORMATION pipeInfo; + UINT deviceCount = 0; + UCHAR pipeIndex = 0; + DWORD ec = ERROR_SUCCESS; + KLST_HANDLE deviceList = NULL; + int digitalPinState = 0; +signals: + void sendClearBuffer(bool ch3751, bool ch3752, bool ch750); + void setVisible_CH2(bool visible); + void gainBuffers(double multiplier); + void disableWindow(bool enabled); + void enableMMTimer(); + void checkXY(bool); +public slots: + void setPsu(double voltage); + void setFunctionGen(int channel, functionGenControl *fGenControl); + void setDeviceMode(int mode); + void newDig(int digState); + void psuTick(void); + void setGain(double newGain); + void avrDebug(void); +}; + +#endif // WINUSBDRIVER_H diff --git a/Desktop Interface/xmega.h b/Desktop Interface/xmega.h new file mode 100644 index 00000000..256b1202 --- /dev/null +++ b/Desktop Interface/xmega.h @@ -0,0 +1,28 @@ +#ifndef XMEGA_H +#define XMEGA_H + + +#define FGEN_OFFSET 5 +#define FGEN_LIMIT (double) 3.2 +#define CLOCK_FREQ 24000000 +#define DAC_SPS 1000000 +#define ADC_SPS 750000 +#define ADC_SPF (ADC_SPS/1000) + +#define vcc (double)3.3 +#define vref ((double)(vcc/2)) +#define R4 (double)75000 +#define R3 (double)1000000 +#define R2 (double)1000 +#define R1 (double)1000 + +#define INIT_DEVICE_MODE 0 + +#define PSU_STEP 5 +#define PSU_PERIOD 100 +#define PSU_ADC_TOP 128 + +//#define INVERT_TRIPLE +//#define INVERT_MM + +#endif // XMEGA_H diff --git a/Old Matlab Interface/.svn/entries b/Old Matlab Interface/.svn/entries new file mode 100644 index 00000000..48082f72 --- /dev/null +++ b/Old Matlab Interface/.svn/entries @@ -0,0 +1 @@ +12 diff --git a/Old Matlab Interface/.svn/format b/Old Matlab Interface/.svn/format new file mode 100644 index 00000000..48082f72 --- /dev/null +++ b/Old Matlab Interface/.svn/format @@ -0,0 +1 @@ +12 diff --git a/Old Matlab Interface/.svn/pristine/00/000cd9de688114eca60ab3ed8f47af0cbec6bcbe.svn-base b/Old Matlab Interface/.svn/pristine/00/000cd9de688114eca60ab3ed8f47af0cbec6bcbe.svn-base new file mode 100644 index 00000000..9108f9cb Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/00/000cd9de688114eca60ab3ed8f47af0cbec6bcbe.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/01/018e814e444b6e657ced7f4e357f4b61e626deb6.svn-base b/Old Matlab Interface/.svn/pristine/01/018e814e444b6e657ced7f4e357f4b61e626deb6.svn-base new file mode 100644 index 00000000..1be234ab --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/01/018e814e444b6e657ced7f4e357f4b61e626deb6.svn-base @@ -0,0 +1,69 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// AssemblyInfo.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.Reflection; +using System.Runtime.InteropServices; + + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyTitle("Xfer.Sync")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Xfer.Sync")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("bd85bac8-7975-4bcd-8e0b-b0e84e558546")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/02/02959e28e6695fe91c27b1bdd0ca6444d7e30afa.svn-base b/Old Matlab Interface/.svn/pristine/02/02959e28e6695fe91c27b1bdd0ca6444d7e30afa.svn-base new file mode 100644 index 00000000..8b4645c7 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/02/02959e28e6695fe91c27b1bdd0ca6444d7e30afa.svn-base @@ -0,0 +1,12 @@ +%FIGSTATE State of the figure +% FIGSTATE(F) returns the state of the figure with handle F as +% {Maximized | Minimized | Normal} +% +% Example: +% If +% f = figure; +% surf(peaks); +% then +% state = figstate(f) returns the state = 'Normal' +% +% See also MAXFIG, MINFIG \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/03/034b6e7436daea3b23ae2bc025a1fc7e30abbde2.svn-base b/Old Matlab Interface/.svn/pristine/03/034b6e7436daea3b23ae2bc025a1fc7e30abbde2.svn-base new file mode 100644 index 00000000..1479c989 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/03/034b6e7436daea3b23ae2bc025a1fc7e30abbde2.svn-base @@ -0,0 +1,62 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {68CE8DCE-504B-4C73-B788-F6BB7911EDAA} + Exe + Properties + Xfer.Sync + Xfer.Sync + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + libusbK.cs + + + Common\BenchmarkTestDevice.cs + + + Common\HiPerfTimer.cs + + + Common\TestParameters.cs + + + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/04/0450c9a25a7b428bd340570efb1a7ffc4095bb68.svn-base b/Old Matlab Interface/.svn/pristine/04/0450c9a25a7b428bd340570efb1a7ffc4095bb68.svn-base new file mode 100644 index 00000000..69d31ae5 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/04/0450c9a25a7b428bd340570efb1a7ffc4095bb68.svn-base @@ -0,0 +1,12 @@ +%MAXFIG Maximize a figure +% MAXFIG(F,1) maximizes the figure window for the figure with handle F +% MAXFIG(F,0) restores figure F if F is maximized +% +% Example: +% If +% f = figure; +% surf(peaks) +% then +% maxfig(f,1) maximizes the figure +% +% See also MINFIG, FIGSTATE \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/04/04e63fc7fbe69172abc51b394d95cb2a5d9db039.svn-base b/Old Matlab Interface/.svn/pristine/04/04e63fc7fbe69172abc51b394d95cb2a5d9db039.svn-base new file mode 100644 index 00000000..b5a2f51b --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/04/04e63fc7fbe69172abc51b394d95cb2a5d9db039.svn-base @@ -0,0 +1,68 @@ +//MATLAB INCLUDES +#include +#include + +//LIBUSBK INCLUDES +#include +#include +#include +#include +#include "libusbk.h" + +#define DEBUG_SHOWCTRL 1 +#define MAX_TRANSFER_SIZE 1023 +#define MAX_PENDING_TRANSFERS 16384 +#define MAX_PENDING_IO 512 + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + //Vars: + //Imports + char* HANDLE_CHAR; + KUSB_HANDLE handle = NULL; + unsigned char pipeID = 0x83; + //Internals + unsigned char success; + unsigned int transferred; + DWORD errorCode = ERROR_SUCCESS; + KSTM_HANDLE stm_handle = NULL; + //Exports + char stm_handle_string[17]; + + + //Initialise Data + HANDLE_CHAR = mxArrayToString(prhs[0]); + sscanf(HANDLE_CHAR, "%16x", &handle); + + //Actual Function + success = StmK_Init( + &stm_handle, + handle, + pipeID, + MAX_TRANSFER_SIZE, + MAX_PENDING_TRANSFERS, + MAX_PENDING_IO, + NULL, + KSTM_FLAG_NONE); + if (!success){ + errorCode = GetLastError(); + printf("StmK_Init failed. ErrorCode: %08Xh\n", errorCode); + } + + success = StmK_Start(stm_handle); + if (!success){ + errorCode = GetLastError(); + printf("StmK_Start failed. ErrorCode: %08Xh\n", errorCode); + } + else printf("[Start Stream] successful!\n"); + printf("stm_handle is %d bytes long\n", sizeof(stm_handle)); + printf("Value of stm_handle is 0x%16x\n\n\n\n\n\n", stm_handle); + + + //Export Data + + sprintf(stm_handle_string, "%016x", stm_handle); + plhs[0] = mxCreateString(stm_handle_string); + + return; +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/05/05787edbc2f1e75f2606006c2c2263929603df87.svn-base b/Old Matlab Interface/.svn/pristine/05/05787edbc2f1e75f2606006c2c2263929603df87.svn-base new file mode 100644 index 00000000..7759e733 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/05/05787edbc2f1e75f2606006c2c2263929603df87.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/06/06807992cb300543c1acac3d136e5fad0b012b98.svn-base b/Old Matlab Interface/.svn/pristine/06/06807992cb300543c1acac3d136e5fad0b012b98.svn-base new file mode 100644 index 00000000..8efc6b0b Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/06/06807992cb300543c1acac3d136e5fad0b012b98.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/08/08980606867d71236732281e564c26aa234d0492.svn-base b/Old Matlab Interface/.svn/pristine/08/08980606867d71236732281e564c26aa234d0492.svn-base new file mode 100644 index 00000000..2a9d895a --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/08/08980606867d71236732281e564c26aa234d0492.svn-base @@ -0,0 +1,3 @@ +function [offset] = hexoffset(hexin) + decin = hex2dec(hexin); + offset = dec2hex(decin+750); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/08/08d40aedf477a62efb9c0ab6835396973e703d44.svn-base b/Old Matlab Interface/.svn/pristine/08/08d40aedf477a62efb9c0ab6835396973e703d44.svn-base new file mode 100644 index 00000000..7eeeaa55 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/08/08d40aedf477a62efb9c0ab6835396973e703d44.svn-base @@ -0,0 +1,87 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// BenchmarkTestDevice.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System; +using System.Runtime.InteropServices; +using libusbK; + + +// ReSharper disable CheckNamespace + +namespace Test.Devices +// ReSharper restore CheckNamespace +{ + public enum BM_COMMAND + { + SET_TEST = 0x0E, + GET_TEST = 0x0F, + }; + + public enum BM_TEST_TYPE + { + NONE = 0x00, + READ = 0x01, + WRITE = 0x02, + LOOP = READ | WRITE, + }; + + public static class Benchmark + { + //! Custom vendor requests that must be implemented in the benchmark firmware. + + + #region Public Members + public static bool Configure(UsbK usb, + BM_COMMAND command, + byte interfaceNumber, + ref BM_TEST_TYPE testType) + { + int transferred; + WINUSB_SETUP_PACKET pkt; + byte[] data = new byte[1]; + + pkt.RequestType = (1 << 7) | (2 << 5); + pkt.Request = (byte) command; + + pkt.Value = (ushort) testType; + pkt.Index = interfaceNumber; + pkt.Length = 1; + + bool success = usb.ControlTransfer(pkt, + Marshal.UnsafeAddrOfPinnedArrayElement(data, + 0), + 1, + out transferred, + IntPtr.Zero); + testType = (BM_TEST_TYPE) data[0]; + return success; + } + #endregion + } +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/09/09558fa38390ff5b9e448f4e133ecec897d3a6ed.svn-base b/Old Matlab Interface/.svn/pristine/09/09558fa38390ff5b9e448f4e133ecec897d3a6ed.svn-base new file mode 100644 index 00000000..d2faa355 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/09/09558fa38390ff5b9e448f4e133ecec897d3a6ed.svn-base @@ -0,0 +1,17 @@ +clear +clear global +clear functions +global num_lc +num_lc = 0 +set(0,'RecursionLimit',100000) +setscopewindowsize(1, 0, 5) +first_gui_test +pause(0.01) +max_n = 100000000; +setscopemode(0,0.5,0.5) +%setpsu(0,1000) +tiny_send_waveform(sin(linspace(0,2*pi, 128)),255,432) +%tiny_send_waveform(1:100, 255, 100)] +signal_trip(3); +mex_usb_iso_loop +%%plot(saved_waveform) \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/0a/0abcb49af2b00438c78205c594f66918aaed46be.svn-base b/Old Matlab Interface/.svn/pristine/0a/0abcb49af2b00438c78205c594f66918aaed46be.svn-base new file mode 100644 index 00000000..ddc00a05 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/0a/0abcb49af2b00438c78205c594f66918aaed46be.svn-base @@ -0,0 +1,69 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// AssemblyInfo.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.Reflection; +using System.Runtime.InteropServices; + + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyTitle("Xfer.Threaded.Stream")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Xfer.Threaded.Stream")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("e66b3bbf-a288-4a3e-9468-2f3bfd7303f6")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/0b/0bbebb77dacc40a9055f623a3fc40734d684599c.svn-base b/Old Matlab Interface/.svn/pristine/0b/0bbebb77dacc40a9055f623a3fc40734d684599c.svn-base new file mode 100644 index 00000000..c9287752 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/0b/0bbebb77dacc40a9055f623a3fc40734d684599c.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/0b/0bea3176a50a8b215a4230940af3da4df02e76e5.svn-base b/Old Matlab Interface/.svn/pristine/0b/0bea3176a50a8b215a4230940af3da4df02e76e5.svn-base new file mode 100644 index 00000000..b2be8047 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/0b/0bea3176a50a8b215a4230940af3da4df02e76e5.svn-base @@ -0,0 +1,198 @@ +namespace Handle.Test +{ + partial class fHandleTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.disposingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.createAndExplictlyDestroyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.createWithoutExplictDestroyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.runGarbageCollectorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.createToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.referenceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.derefrenceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.exhaustAllHandlesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.txtOutput = new System.Windows.Forms.TextBox(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.testListenerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.disposingToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(674, 24); + this.menuStrip1.TabIndex = 1; + this.menuStrip1.Text = "menuStrip1"; + // + // disposingToolStripMenuItem + // + this.disposingToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.createAndExplictlyDestroyToolStripMenuItem, + this.createWithoutExplictDestroyToolStripMenuItem, + this.toolStripSeparator1, + this.runGarbageCollectorToolStripMenuItem, + this.createToolStripMenuItem, + this.toolStripSeparator2, + this.exhaustAllHandlesToolStripMenuItem, + this.toolStripSeparator3, + this.testListenerToolStripMenuItem}); + this.disposingToolStripMenuItem.Name = "disposingToolStripMenuItem"; + this.disposingToolStripMenuItem.Size = new System.Drawing.Size(71, 20); + this.disposingToolStripMenuItem.Text = "Disposing"; + // + // createAndExplictlyDestroyToolStripMenuItem + // + this.createAndExplictlyDestroyToolStripMenuItem.Name = "createAndExplictlyDestroyToolStripMenuItem"; + this.createAndExplictlyDestroyToolStripMenuItem.Size = new System.Drawing.Size(234, 22); + this.createAndExplictlyDestroyToolStripMenuItem.Text = "Create and Explictly Destroy"; + this.createAndExplictlyDestroyToolStripMenuItem.Click += new System.EventHandler(this.createAndExplictlyDestroyToolStripMenuItem_Click); + // + // createWithoutExplictDestroyToolStripMenuItem + // + this.createWithoutExplictDestroyToolStripMenuItem.Name = "createWithoutExplictDestroyToolStripMenuItem"; + this.createWithoutExplictDestroyToolStripMenuItem.Size = new System.Drawing.Size(234, 22); + this.createWithoutExplictDestroyToolStripMenuItem.Text = "Create Without Explict Destroy"; + this.createWithoutExplictDestroyToolStripMenuItem.Click += new System.EventHandler(this.createWithoutExplictDestroyToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(231, 6); + // + // runGarbageCollectorToolStripMenuItem + // + this.runGarbageCollectorToolStripMenuItem.Name = "runGarbageCollectorToolStripMenuItem"; + this.runGarbageCollectorToolStripMenuItem.Size = new System.Drawing.Size(234, 22); + this.runGarbageCollectorToolStripMenuItem.Text = "Run Garbage Collector"; + this.runGarbageCollectorToolStripMenuItem.Click += new System.EventHandler(this.runGarbageCollectorToolStripMenuItem_Click); + // + // createToolStripMenuItem + // + this.createToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.referenceToolStripMenuItem, + this.derefrenceToolStripMenuItem}); + this.createToolStripMenuItem.Name = "createToolStripMenuItem"; + this.createToolStripMenuItem.Size = new System.Drawing.Size(234, 22); + this.createToolStripMenuItem.Text = "Create"; + // + // referenceToolStripMenuItem + // + this.referenceToolStripMenuItem.Name = "referenceToolStripMenuItem"; + this.referenceToolStripMenuItem.Size = new System.Drawing.Size(131, 22); + this.referenceToolStripMenuItem.Text = "Reference"; + this.referenceToolStripMenuItem.Click += new System.EventHandler(this.referenceToolStripMenuItem_Click); + // + // derefrenceToolStripMenuItem + // + this.derefrenceToolStripMenuItem.Name = "derefrenceToolStripMenuItem"; + this.derefrenceToolStripMenuItem.Size = new System.Drawing.Size(131, 22); + this.derefrenceToolStripMenuItem.Text = "Derefrence"; + this.derefrenceToolStripMenuItem.Click += new System.EventHandler(this.derefrenceToolStripMenuItem_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(231, 6); + // + // exhaustAllHandlesToolStripMenuItem + // + this.exhaustAllHandlesToolStripMenuItem.Name = "exhaustAllHandlesToolStripMenuItem"; + this.exhaustAllHandlesToolStripMenuItem.Size = new System.Drawing.Size(234, 22); + this.exhaustAllHandlesToolStripMenuItem.Text = "Exhaust All Handles"; + this.exhaustAllHandlesToolStripMenuItem.Click += new System.EventHandler(this.exhaustAllHandlesToolStripMenuItem_Click); + // + // txtOutput + // + this.txtOutput.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtOutput.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtOutput.Location = new System.Drawing.Point(0, 24); + this.txtOutput.MaxLength = 0; + this.txtOutput.Multiline = true; + this.txtOutput.Name = "txtOutput"; + this.txtOutput.ReadOnly = true; + this.txtOutput.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtOutput.Size = new System.Drawing.Size(674, 272); + this.txtOutput.TabIndex = 2; + this.txtOutput.WordWrap = false; + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(231, 6); + // + // testListenerToolStripMenuItem + // + this.testListenerToolStripMenuItem.Name = "testListenerToolStripMenuItem"; + this.testListenerToolStripMenuItem.Size = new System.Drawing.Size(234, 22); + this.testListenerToolStripMenuItem.Text = "Test Listener"; + this.testListenerToolStripMenuItem.Click += new System.EventHandler(this.testListenerToolStripMenuItem_Click); + // + // fHandleTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(674, 296); + this.Controls.Add(this.txtOutput); + this.Controls.Add(this.menuStrip1); + this.MainMenuStrip = this.menuStrip1; + this.Name = "fHandleTest"; + this.Text = "libusbK Handles Example"; + this.Load += new System.EventHandler(this.fHandleTest_Load); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.fHandleTest_FormClosed); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem disposingToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem createAndExplictlyDestroyToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem runGarbageCollectorToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem createWithoutExplictDestroyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem createToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem referenceToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem derefrenceToolStripMenuItem; + private System.Windows.Forms.TextBox txtOutput; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem exhaustAllHandlesToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem testListenerToolStripMenuItem; + } +} + diff --git a/Old Matlab Interface/.svn/pristine/0c/0c9396420176d71310c25719e16eab65ad651680.svn-base b/Old Matlab Interface/.svn/pristine/0c/0c9396420176d71310c25719e16eab65ad651680.svn-base new file mode 100644 index 00000000..9dfcb4d4 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/0c/0c9396420176d71310c25719e16eab65ad651680.svn-base @@ -0,0 +1,17 @@ +function [isoLog] = plotiso(mode) + +iso_incoming; + +load('isoLog.txt'); +window = 750; +switch (mode) + case 1 + for n=1:32:((length(isoLog))-window) + plot(isoLog(n:n+window)); + drawnow + pause(0.03); + end + otherwise + plot(isoLog); +end + diff --git a/Old Matlab Interface/.svn/pristine/0e/0ed0593721eb6952fb9d053197d6bf9b002875fd.svn-base b/Old Matlab Interface/.svn/pristine/0e/0ed0593721eb6952fb9d053197d6bf9b002875fd.svn-base new file mode 100644 index 00000000..7c5aff1a Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/0e/0ed0593721eb6952fb9d053197d6bf9b002875fd.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/0f/0f12a5f7cb26c94273fd8b33b99a2faba6d5722d.svn-base b/Old Matlab Interface/.svn/pristine/0f/0f12a5f7cb26c94273fd8b33b99a2faba6d5722d.svn-base new file mode 100644 index 00000000..47980eea --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/0f/0f12a5f7cb26c94273fd8b33b99a2faba6d5722d.svn-base @@ -0,0 +1,66 @@ +function [] = tiny_send_waveform(waveform, amplitude, frequency); + +global scope_mode +global gui_axes + +offset = 375; +waveform = tiny_wave_conv(waveform, amplitude); +waveform = uint8(waveform); +%waveform; + +wave_length = length(waveform); + +f_invalid = 1; + +valid_clock_div = [1,2,4,8,64,256,1024]; +f0=24e6; + +if(frequency*wave_length)>1e6 + error('Frequency is too high') +end + +for clk_setting = 1:length(valid_clock_div) + f_test = f0 / valid_clock_div(clk_setting); + if (f_test/frequency)<65535 + f_invalid = 0; + break + end +end + +if (f_invalid) + error('Frequency is too low!') +end + +tccper = round(f_test / frequency / wave_length); +tccper = uint16(tccper); + +clk_setting = uint16(clk_setting); +%clk_setting; + +%stairs(uint8(waveform)); + +% wavestring = []; +% for n=1:wave_length +% wavestring = [wavestring [sprintf('%3d, ', waveform(n)) ' ']]; +% end + +%%Exception for mode 5 +if (scope_mode ==5) + mex_usb_send_control('40', 'a1', dec2hex(tccper), dec2hex(clk_setting), dec2hex(wave_length), uint8(waveform)); + stairs(gui_axes, waveform, 'y') + set(gui_axes, 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + return +end + + +mex_usb_send_control('40', 'a1', dec2hex(tccper), dec2hex(clk_setting + 16*offset), dec2hex(min(375,wave_length)), uint8(waveform(1:min(375,wave_length)))); + +if(wave_length>375) + warning('\nWave Length > 375') + mex_usb_send_control('40', 'a1', dec2hex(tccper), dec2hex(clk_setting + 16*(offset+750) + 32768), dec2hex(wave_length-375), uint8(waveform(376:end))); +end + + +% driverLocation = 'c:\libusbk\examples\open-device\debug\win32'; +% command = [driverLocation '\open-device "03eb" "a000" "' command '" "' num2str(tccper) '" "' num2str(clk_setting) '" "' num2str(wave_length) '" "' wavestring '"'] +% system(command); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/0f/0ffe81cc039ff9bb68c4a763e940a3fd1ff33679.svn-base b/Old Matlab Interface/.svn/pristine/0f/0ffe81cc039ff9bb68c4a763e940a3fd1ff33679.svn-base new file mode 100644 index 00000000..335ce7f6 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/0f/0ffe81cc039ff9bb68c4a763e940a3fd1ff33679.svn-base @@ -0,0 +1,11 @@ +function [err] = verr(vex, r) + +if r<50 + error('R IS TOO LOW!!!') +end + +%%FOR THE BIG BOY BOARD, remove the +0.2 also +%r = (1/r + 1/250)^-1; +err = ((vex + 1.5)^4 / (80 * r)) + 0.2 + +%err = vex^3/512 - (r/68) * (vex^1.8/(20^1.8)) - (vex-10) / 10 +vex/20 \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/10/10de157f63173d022f4d6a0ed452a3c74574d9ca.svn-base b/Old Matlab Interface/.svn/pristine/10/10de157f63173d022f4d6a0ed452a3c74574d9ca.svn-base new file mode 100644 index 00000000..fd54ba80 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/10/10de157f63173d022f4d6a0ed452a3c74574d9ca.svn-base @@ -0,0 +1,11 @@ +function [] = printusb(inputstring); +if length(inputstring)>21 + error('String too long. Reduce to under 21 chars.') +end + +normalisedString=' '; +normalisedString(1:length(inputstring)) = inputstring; + +driverLocation = 'c:\libusbk\examples\open-device\debug\win32'; +command = [driverLocation '\open-device "' normalisedString '" "1" "03eb" "a000"'] +system(command); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/11/11873190b9aa35cf3c7da49845992102338d0d01.svn-base b/Old Matlab Interface/.svn/pristine/11/11873190b9aa35cf3c7da49845992102338d0d01.svn-base new file mode 100644 index 00000000..e2360958 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/11/11873190b9aa35cf3c7da49845992102338d0d01.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/12/12b094e22d62f48741be7b2ca0100de171ded2a6.svn-base b/Old Matlab Interface/.svn/pristine/12/12b094e22d62f48741be7b2ca0100de171ded2a6.svn-base new file mode 100644 index 00000000..fff68b83 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/12/12b094e22d62f48741be7b2ca0100de171ded2a6.svn-base @@ -0,0 +1,12 @@ +%MINFIG Minimize a figure +% MINFIG(F,1) minimizes the figure window for the figure with handle F +% MINFIG(F,0) restores figure F if F is minimized +% +% Example: +% If +% f = figure; +% surf(peaks); +% then +% minfig(f,1) minimizes the figure +% +% See also MAXFIG, FIGSTATE \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/14/1475a16f806ec250fcccd22d8e49fcf18ef6c240.svn-base b/Old Matlab Interface/.svn/pristine/14/1475a16f806ec250fcccd22d8e49fcf18ef6c240.svn-base new file mode 100644 index 00000000..2f390040 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/14/1475a16f806ec250fcccd22d8e49fcf18ef6c240.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/14/148866eba70db42d9fcbfb226f8c185367a019c7.svn-base b/Old Matlab Interface/.svn/pristine/14/148866eba70db42d9fcbfb226f8c185367a019c7.svn-base new file mode 100644 index 00000000..6ce771ae --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/14/148866eba70db42d9fcbfb226f8c185367a019c7.svn-base @@ -0,0 +1,7 @@ +function [] = lcdtoggle(onoff); + +mex_usb_send_control('40', 'a1', dec2hex(onoff), '0', '0', '0'); + +% driverLocation = 'c:\libusbk\examples\open-device\debug\win32'; +% command = [driverLocation '\open-device "03eb" "a000" "' command '" "' num2str(onoff) '" "NULL" "NULL" "NULL"'] +% system(command); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/15/153f1151c37be3e4bfa431d9db08559ad4629bf0.svn-base b/Old Matlab Interface/.svn/pristine/15/153f1151c37be3e4bfa431d9db08559ad4629bf0.svn-base new file mode 100644 index 00000000..0de7cfbb --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/15/153f1151c37be3e4bfa431d9db08559ad4629bf0.svn-base @@ -0,0 +1,49 @@ +global scope_window_time +global scope_window_max +global scope_window_min +global scope_mode +global gui_axes +global text_box_1 +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global gui_cursor_mode +global saved_waveform_ch1 +global saved_waveform_ch2 + +refreshrate_temp = refreshrate_temp - 1; + +tic +switch(scope_mode) + case 0 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + [taxis, cool_waveform] = conv_ana(saved_waveform_ch1, 375000*scope_window_time); + plotcursors + waveform_exists = 1; + else + if (waveform_exists) + set(text_box_1, 'String', sprintf(' ---------------------\n Vmin = %.2fV\n ---------------------\n Vmax = %.2f\n ---------------------\n Vmean = %.2f\n ---------------------\n Vrms = %.2f\n ---------------------\n ', min(cool_waveform), max(cool_waveform), mean(cool_waveform), rms(cool_waveform))); + %title(titlestring); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Voltage (V)') + drawnow + end + end + case 3 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + [taxis, temp_waveform] = conv_dig(saved_waveform_ch1, 375000*scope_window_time); + stairs(gui_axes, taxis, temp_waveform, 'y'); + else + set(gui_axes, 'Ylim', [-0.1, 1.1], 'Xlim', [-scope_window_time, 0], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + set(text_box_1, 'String', 'Scope in dig mode'); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Logic Value') + drawnow + end + otherwise + error('scope_mode invalid!') +end +toc \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/15/1547850f20be0023538e6f0c41009aa5f53fd630.svn-base b/Old Matlab Interface/.svn/pristine/15/1547850f20be0023538e6f0c41009aa5f53fd630.svn-base new file mode 100644 index 00000000..53654e97 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/15/1547850f20be0023538e6f0c41009aa5f53fd630.svn-base @@ -0,0 +1,160 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// TextBoxTraceListener.cs +// +// Created: 03.02.2012 +// Last Updated: 03.03.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; +using System.Windows.Forms; + + +namespace Handle.Test +{ + public class TestListener + { + #region Public Members + public TestListener(int threadCount) + { + mThreadCount = threadCount; + while (threadCount-- > 0) + mThreadList.Add(new Thread(DebugDumpProc)); + + threadCount = mThreadCount; + + foreach (Thread thread in mThreadList) + thread.Start((mThreadCount) - (threadCount--)); + + Thread.Sleep(0); + } + #endregion + + + #region Private Members + private static void DebugDumpProc(object state) + { + for (int iLine = 0; iLine < 64; iLine++) + Debug.Print("Debug test output. ThreadIndex:{0:000} Line:{1:000}", (int) state, iLine); + } + + private readonly int mThreadCount; + private readonly List mThreadList = new List(); + #endregion + } + + public class TextBoxTraceListener : TraceListener + { + #region Nested Delegates + private delegate void WriteDelegate(string message); + #endregion + + + #region Public Members + public TextBoxTraceListener(TextBox textBox, ThreadPriority priority) + { + mTraceLines = ArrayList.Synchronized(mTraceLinesUnsafe); + mTextBox = textBox; + writeInvokeCb = WriteInvoke; + mUiThread = new Thread(ListenerOutputProc); + mUiThread.Priority = priority; + + mUiThread.Start(this); + } + + /// Calls the dispose method. + public virtual void Free() + { + if (mUiThread != null) + mCancelEvent.Set(); + + mUiThread = null; + } + + public override void Write(string message) + { + ArrayList traceLines = mTraceLines; + traceLines.Add(message); + mOutputReadySemaphore.Release(); + } + + public override void WriteLine(string message) + { + Write(message + Environment.NewLine); + } + #endregion + + + #region Private Members + private static void ListenerOutputProc(object state) + { + TextBoxTraceListener listener = (TextBoxTraceListener) state; + + while (true) + { + int waitRet = WaitHandle.WaitAny(new WaitHandle[] {listener.mOutputReadySemaphore, listener.mCancelEvent}); + if (waitRet != 0) break; + + ArrayList traceLines = listener.mTraceLines; + String sLines = String.Empty; + DateTime dtNow = DateTime.Now; + while (true) + { + sLines += String.Format("[{0:00}:{1:00}:{2:00}:{3:000}] {4}", dtNow.Hour, dtNow.Minute, dtNow.Second, dtNow.Millisecond, traceLines[0] as string); + traceLines.RemoveAt(0); + + if (!listener.mOutputReadySemaphore.WaitOne(0)) break; + } + + try + { + listener.mTextBox.Invoke(listener.writeInvokeCb, new object[] {sLines}); + } + catch + { + break; + } + } + } + + private void WriteInvoke(string message) + { + mTextBox.AppendText(message); + } + + private readonly ManualResetEvent mCancelEvent = new ManualResetEvent(false); + + private readonly Semaphore mOutputReadySemaphore = new Semaphore(0, int.MaxValue); + private readonly TextBox mTextBox; + private readonly ArrayList mTraceLines; + private readonly ArrayList mTraceLinesUnsafe = new ArrayList(); + private Thread mUiThread; + private readonly WriteDelegate writeInvokeCb; + #endregion + } +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/16/16bc34a84f9aaded710f7d05ce5c5d9eafe673d7.svn-base b/Old Matlab Interface/.svn/pristine/16/16bc34a84f9aaded710f7d05ce5c5d9eafe673d7.svn-base new file mode 100644 index 00000000..906db7fc --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/16/16bc34a84f9aaded710f7d05ce5c5d9eafe673d7.svn-base @@ -0,0 +1,3513 @@ +#Region "Copyright (c) Travis Robinson" + +' Copyright (c) 2012 Travis Robinson +' All rights reserved. +' +' C# libusbK Bindings +' Auto-generated on: 04.28.2011 +' +' Redistribution and use in source and binary forms, with or without +' modification, are permitted provided that the following conditions are met: +' +' * Redistributions of source code must retain the above copyright +' notice, this list of conditions and the following disclaimer. +' +' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +' IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +' TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +' PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +' BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +' CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +' SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +' INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +' CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +' ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +' THE POSSIBILITY OF SUCH DAMAGE. + +#End Region + +Imports System +Imports System.Diagnostics +Imports System.Runtime.InteropServices + +' ReSharper disable InconsistentNaming +' ReSharper disable CheckNamespace +' ReSharper disable UnassignedReadonlyField + +Namespace libusbK + Public NotInheritable Class AllKOptions + Private Sub New() + End Sub + #Region "Public Members" + + ''' + ''' Alternate libusbK library to use. This must be assigned before any libusbK functions are called and it must be the full path and file name to a libusbK.dll. + ''' + Public Shared LIBUSBK_FULLPATH_TO_ALTERNATE_DLL As String + + #End Region + End Class + + Public NotInheritable Class AllKConstants + Private Sub New() + End Sub + #Region "Public Members" + + ''' + ''' Allocated length for all strings in a \ref KLST_DEVINFO structure. + ''' + Public Const KLST_STRING_MAX_LEN As Integer = 256 + + ''' + ''' libusbK library + ''' + Public Const LIBUSBK_DLL As String = "libusbK.dll" + + ''' + ''' Config power mask for the \c bmAttributes field of a \ref USB_CONFIGURATION_DESCRIPTOR + ''' + Public Const USB_CONFIG_POWERED_MASK As Byte = &Hc0 + + ''' + ''' Endpoint address mask for the \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR + ''' + Public Const USB_ENDPOINT_ADDRESS_MASK As Byte = &Hf + + ''' + ''' Endpoint direction mask for the \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR + ''' + Public Const USB_ENDPOINT_DIRECTION_MASK As Byte = &H80 + + #End Region + End Class + + Public Enum PipePolicyType + SHORT_PACKET_TERMINATE = &H1 + AUTO_CLEAR_STALL = &H2 + PIPE_TRANSFER_TIMEOUT = &H3 + IGNORE_SHORT_PACKETS = &H4 + ALLOW_PARTIAL_READS = &H5 + AUTO_FLUSH = &H6 + RAW_IO = &H7 + MAXIMUM_TRANSFER_SIZE = &H8 + RESET_PIPE_ON_RESUME = &H9 + + ISO_START_LATENCY = &H20 + ISO_ALWAYS_START_ASAP = &H21 + ISO_NUM_FIXED_PACKETS = &H22 + + SIMUL_PARALLEL_REQUESTS = &H30 + End Enum + + Public Enum PowerPolicyType + AUTO_SUSPEND = &H81 + SUSPEND_DELAY = &H83 + End Enum + + Public Enum DeviceInformationType + DEVICE_SPEED = &H1 + End Enum + + Public Enum EndpointType + ''' + ''' Indicates a control endpoint + ''' + CONTROL = &H0 + + ''' + ''' Indicates an isochronous endpoint + ''' + ISOCHRONOUS = &H1 + + ''' + ''' Indicates a bulk endpoint + ''' + BULK = &H2 + + ''' + ''' Indicates an interrupt endpoint + ''' + INTERRUPT = &H3 + + ''' + ''' Endpoint type mask for the \c bmAttributes field of a \ref USB_ENDPOINT_DESCRIPTOR + ''' + MASK = &H3 + End Enum + + Public NotInheritable Class ErrorCodes + Private Sub New() + End Sub + #Region "Public Members" + + ''' + ''' Access is denied. + ''' + Public Const AccessDenied As Integer = 5 + + ''' + ''' The requested resource is in use. + ''' + Public Const Busy As Integer = 170 + + ''' + ''' The operation was canceled by the user. + ''' + Public Const Cancelled As Integer = 1223 + + ''' + ''' The library, drive, or media pool is empty. + ''' + Public Const Empty As Integer = 4306 + + ''' + ''' The handle is invalid. + ''' + Public Const InvalidHandle As Integer = 6 + + ''' + ''' The parameter is incorrect. + ''' + Public Const InvalidParameter As Integer = 87 + + ''' + ''' Overlapped I/O event is not in a signaled state. + ''' + Public Const IoIncomplete As Integer = 996 + + ''' + ''' Overlapped I/O operation is in progress. + ''' + Public Const IoPending As Integer = 997 + + ''' + ''' More data is available. + ''' + Public Const MoreData As Integer = 234 + + ''' + ''' No more data is available. + ''' + Public Const NoMoreItems As Integer = 259 + + ''' + ''' Not enough storage is available to process this command. + ''' + Public Const NotEnoughMemory As Integer = 8 + + ''' + ''' Element not found. + ''' + Public Const NotFound As Integer = 1168 + + ''' + ''' The request is not supported. + ''' + Public Const NotSupported As Integer = 50 + + ''' + ''' The I/O operation has been aborted because of either a thread exit or an application request. + ''' + Public Const OperationAborted As Integer = 995 + + ''' + ''' The cluster resource is not available. + ''' + Public Const ResourceNotAvailable As Integer = 5006 + + ''' + ''' The cluster resource could not be found. + ''' + Public Const ResourceNotFound As Integer = 5007 + + ''' + ''' The semaphore timeout period has expired. + ''' + Public Const SemTimeout As Integer = 121 + + ''' + ''' The operation completed successfully. + ''' + Public Const Success As Integer = 0 + + ''' + ''' An attempt was made to operate on a thread within a specific process, but the thread specified is not in the process specified. + ''' + Public Const ThreadNotInProcess As Integer = 566 + + ''' + ''' A thread termination occurred while the thread was suspended. The thread was resumed, and termination proceeded. + ''' + Public Const ThreadWasSuspended As Integer = 699 + + ''' + ''' Too many dynamic-link modules are attached to this program or dynamic-link module. + ''' + Public Const TooManyModules As Integer = 214 + + #End Region + End Class + + Public Interface IKLIB_HANDLE + #Region "Public Members" + + Function GetContext() As IntPtr + ReadOnly Property HandleType() As KLIB_HANDLE_TYPE + ReadOnly Property Pointer() As IntPtr + Function SetCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean + Function SetContext(UserContext As IntPtr) As Boolean + + #End Region + End Interface + + #Region "Opaque library handles" + + Public Structure KLST_HANDLE + Implements IKLIB_HANDLE + #Region "IKLIB_HANDLE Members" + + Public ReadOnly Property Pointer() As IntPtr Implements IKLIB_HANDLE.Pointer + Get + Return mHandlePtr + End Get + End Property + + Public ReadOnly Property HandleType() As KLIB_HANDLE_TYPE Implements IKLIB_HANDLE.HandleType + Get + Return KLIB_HANDLE_TYPE.LSTK + End Get + End Property + + Public Function GetContext() As IntPtr Implements IKLIB_HANDLE.GetContext + Return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + End Function + + Public Function SetContext(UserContext As IntPtr) As Boolean Implements IKLIB_HANDLE.SetContext + Return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + End Function + + Public Function SetCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean Implements IKLIB_HANDLE.SetCleanupCallback + Return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + End Function + + #End Region + + #Region "Public Members" + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + #End Region + + #Region "Private Members" + + Private ReadOnly mHandlePtr As IntPtr + + #End Region + End Structure + + Public Structure KHOT_HANDLE + Implements IKLIB_HANDLE + #Region "IKLIB_HANDLE Members" + + Public ReadOnly Property Pointer() As IntPtr Implements IKLIB_HANDLE.Pointer + Get + Return mHandlePtr + End Get + End Property + + Public ReadOnly Property HandleType() As KLIB_HANDLE_TYPE Implements IKLIB_HANDLE.HandleType + Get + Return KLIB_HANDLE_TYPE.HOTK + End Get + End Property + + Public Function GetContext() As IntPtr Implements IKLIB_HANDLE.GetContext + Return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + End Function + + Public Function SetContext(UserContext As IntPtr) As Boolean Implements IKLIB_HANDLE.SetContext + Return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + End Function + + Public Function SetCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean Implements IKLIB_HANDLE.SetCleanupCallback + Return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + End Function + + #End Region + + #Region "Public Members" + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + #End Region + + #Region "Private Members" + + Private ReadOnly mHandlePtr As IntPtr + + #End Region + End Structure + + Public Structure KUSB_HANDLE + Implements IKLIB_HANDLE + #Region "IKLIB_HANDLE Members" + + Public ReadOnly Property Pointer() As IntPtr Implements IKLIB_HANDLE.Pointer + Get + Return mHandlePtr + End Get + End Property + + Public ReadOnly Property HandleType() As KLIB_HANDLE_TYPE Implements IKLIB_HANDLE.HandleType + Get + Return KLIB_HANDLE_TYPE.USBK + End Get + End Property + + Public Function GetContext() As IntPtr Implements IKLIB_HANDLE.GetContext + Return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + End Function + + Public Function SetContext(UserContext As IntPtr) As Boolean Implements IKLIB_HANDLE.SetContext + Return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + End Function + + Public Function SetCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean Implements IKLIB_HANDLE.SetCleanupCallback + Return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + End Function + + #End Region + + #Region "USB Shared Device Context" + + Public Function GetSharedContext() As IntPtr + Return AllKFunctions.LibK_GetContext(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK) + End Function + + Public Function SetSharedCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean + Return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK, CleanupCallback) + End Function + + Public Function SetSharedContext(UserContext As IntPtr) As Boolean + Return AllKFunctions.LibK_SetContext(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK, UserContext) + End Function + + #End Region + + #Region "Public Members" + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + #End Region + + #Region "Private Members" + + Private ReadOnly mHandlePtr As IntPtr + + #End Region + End Structure + + Public Structure KOVL_POOL_HANDLE + Implements IKLIB_HANDLE + #Region "IKLIB_HANDLE Members" + + Public ReadOnly Property Pointer() As IntPtr Implements IKLIB_HANDLE.Pointer + Get + Return mHandlePtr + End Get + End Property + + Public ReadOnly Property HandleType() As KLIB_HANDLE_TYPE Implements IKLIB_HANDLE.HandleType + Get + Return KLIB_HANDLE_TYPE.OVLPOOLK + End Get + End Property + + Public Function GetContext() As IntPtr Implements IKLIB_HANDLE.GetContext + Return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + End Function + + Public Function SetContext(UserContext As IntPtr) As Boolean Implements IKLIB_HANDLE.SetContext + Return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + End Function + + Public Function SetCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean Implements IKLIB_HANDLE.SetCleanupCallback + Return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + End Function + + #End Region + + #Region "Public Members" + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + #End Region + + #Region "Private Members" + + Private ReadOnly mHandlePtr As IntPtr + + #End Region + End Structure + + Public Structure KOVL_HANDLE + Implements IKLIB_HANDLE + #Region "IKLIB_HANDLE Members" + + Public ReadOnly Property Pointer() As IntPtr Implements IKLIB_HANDLE.Pointer + Get + Return mHandlePtr + End Get + End Property + + Public ReadOnly Property HandleType() As KLIB_HANDLE_TYPE Implements IKLIB_HANDLE.HandleType + Get + Return KLIB_HANDLE_TYPE.OVLK + End Get + End Property + + Public Function GetContext() As IntPtr Implements IKLIB_HANDLE.GetContext + Return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + End Function + + Public Function SetContext(UserContext As IntPtr) As Boolean Implements IKLIB_HANDLE.SetContext + Return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + End Function + + Public Function SetCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean Implements IKLIB_HANDLE.SetCleanupCallback + Return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + End Function + + #End Region + + #Region "Public Members" + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + #End Region + + #Region "Private Members" + + Private ReadOnly mHandlePtr As IntPtr + + #End Region + End Structure + + Public Structure KSTM_HANDLE + Implements IKLIB_HANDLE + #Region "IKLIB_HANDLE Members" + + Public ReadOnly Property Pointer() As IntPtr Implements IKLIB_HANDLE.Pointer + Get + Return mHandlePtr + End Get + End Property + + Public ReadOnly Property HandleType() As KLIB_HANDLE_TYPE Implements IKLIB_HANDLE.HandleType + Get + Return KLIB_HANDLE_TYPE.STMK + End Get + End Property + + Public Function GetContext() As IntPtr Implements IKLIB_HANDLE.GetContext + Return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + End Function + + Public Function SetContext(UserContext As IntPtr) As Boolean Implements IKLIB_HANDLE.SetContext + Return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + End Function + + Public Function SetCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean Implements IKLIB_HANDLE.SetCleanupCallback + Return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + End Function + + #End Region + + #Region "Public Members" + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + #End Region + + #Region "Private Members" + + Private ReadOnly mHandlePtr As IntPtr + + #End Region + End Structure + + #End Region + + #Region "Internal Function Imports" + + Friend NotInheritable Class AllKFunctions + Private Sub New() + End Sub + #Region "Delegates" + + _ + Public Delegate Sub HotK_FreeAllDelegate() + + _ + Public Delegate Function HotK_FreeDelegate(<[In]> Handle As KHOT_HANDLE) As Boolean + + _ + Public Delegate Function HotK_InitDelegate( ByRef Handle As KHOT_HANDLE, <[In], Out> ByRef InitParams As KHOT_PARAMS) As Boolean + + _ + Public Delegate Function IsoK_EnumPacketsDelegate(<[In]> IsoContext As KISO_CONTEXT, EnumPackets As KISO_ENUM_PACKETS_CB, StartPacketIndex As Integer, UserState As IntPtr) As Boolean + + _ + Public Delegate Function IsoK_FreeDelegate(<[In]> IsoContext As KISO_CONTEXT) As Boolean + + _ + Public Delegate Function IsoK_GetPacketDelegate(<[In]> IsoContext As KISO_CONTEXT, PacketIndex As Integer, ByRef IsoPacket As KISO_PACKET) As Boolean + + _ + Public Delegate Function IsoK_InitDelegate( ByRef IsoContext As KISO_CONTEXT, NumberOfPackets As Integer, StartFrame As Integer) As Boolean + + _ + Public Delegate Function IsoK_ReUseDelegate(<[In]> IsoContext As KISO_CONTEXT) As Boolean + + _ + Public Delegate Function IsoK_SetPacketDelegate(<[In]> IsoContext As KISO_CONTEXT, PacketIndex As Integer, <[In]> ByRef IsoPacket As KISO_PACKET) As Boolean + + _ + Public Delegate Function IsoK_SetPacketsDelegate(<[In]> IsoContext As KISO_CONTEXT, PacketSize As Integer) As Boolean + + _ + Public Delegate Sub LibK_Context_FreeDelegate() + + _ + Public Delegate Function LibK_Context_InitDelegate(Heap As IntPtr, Reserved As IntPtr) As Boolean + + _ + Public Delegate Function LibK_CopyDriverAPIDelegate( ByRef DriverAPI As KUSB_DRIVER_API, <[In]> UsbHandle As KUSB_HANDLE) As Boolean + + _ + Public Delegate Function LibK_GetContextDelegate(<[In]> Handle As IntPtr, HandleType As KLIB_HANDLE_TYPE) As IntPtr + + _ + Public Delegate Function LibK_GetDefaultContextDelegate(HandleType As KLIB_HANDLE_TYPE) As IntPtr + + _ + Public Delegate Function LibK_GetProcAddressDelegate(ProcAddress As IntPtr, DriverID As Integer, FunctionID As Integer) As Boolean + + _ + Public Delegate Sub LibK_GetVersionDelegate( ByRef Version As KLIB_VERSION) + + _ + Public Delegate Function LibK_LoadDriverAPIDelegate( ByRef DriverAPI As KUSB_DRIVER_API, DriverID As Integer) As Boolean + + _ + Public Delegate Function LibK_SetCleanupCallbackDelegate(<[In]> Handle As IntPtr, HandleType As KLIB_HANDLE_TYPE, CleanupCB As KLIB_HANDLE_CLEANUP_CB) As Boolean + + _ + Public Delegate Function LibK_SetContextDelegate(<[In]> Handle As IntPtr, HandleType As KLIB_HANDLE_TYPE, ContextValue As IntPtr) As Boolean + + _ + Public Delegate Function LibK_SetDefaultContextDelegate(HandleType As KLIB_HANDLE_TYPE, ContextValue As IntPtr) As Boolean + + _ + Public Delegate Function LstK_CountDelegate(<[In]> DeviceList As KLST_HANDLE, ByRef Count As Integer) As Boolean + + _ + Public Delegate Function LstK_CurrentDelegate(<[In]> DeviceList As KLST_HANDLE, ByRef DeviceInfo As KLST_DEVINFO_HANDLE) As Boolean + + _ + Public Delegate Function LstK_EnumerateDelegate(<[In]> DeviceList As KLST_HANDLE, EnumDevListCB As KLST_ENUM_DEVINFO_CB, Context As IntPtr) As Boolean + + _ + Public Delegate Function LstK_FindByVidPidDelegate(<[In]> DeviceList As KLST_HANDLE, Vid As Integer, Pid As Integer, ByRef DeviceInfo As KLST_DEVINFO_HANDLE) As Boolean + + _ + Public Delegate Function LstK_FreeDelegate(<[In]> DeviceList As KLST_HANDLE) As Boolean + + _ + Public Delegate Function LstK_InitDelegate( ByRef DeviceList As KLST_HANDLE, Flags As KLST_FLAG) As Boolean + + _ + Public Delegate Function LstK_InitExDelegate( ByRef DeviceList As KLST_HANDLE, Flags As KLST_FLAG, <[In]> ByRef PatternMatch As KLST_PATTERN_MATCH) As Boolean + + _ + Public Delegate Function LstK_MoveNextDelegate(<[In]> DeviceList As KLST_HANDLE, ByRef DeviceInfo As KLST_DEVINFO_HANDLE) As Boolean + + _ + Public Delegate Sub LstK_MoveResetDelegate(<[In]> DeviceList As KLST_HANDLE) + + _ + Public Delegate Function OvlK_AcquireDelegate( ByRef OverlappedK As KOVL_HANDLE, <[In]> PoolHandle As KOVL_POOL_HANDLE) As Boolean + + _ + Public Delegate Function OvlK_FreeDelegate(<[In]> PoolHandle As KOVL_POOL_HANDLE) As Boolean + + _ + Public Delegate Function OvlK_GetEventHandleDelegate(<[In]> OverlappedK As KOVL_HANDLE) As IntPtr + + _ + Public Delegate Function OvlK_InitDelegate( ByRef PoolHandle As KOVL_POOL_HANDLE, <[In]> UsbHandle As KUSB_HANDLE, MaxOverlappedCount As Integer, Flags As KOVL_POOL_FLAG) As Boolean + + _ + Public Delegate Function OvlK_IsCompleteDelegate(<[In]> OverlappedK As KOVL_HANDLE) As Boolean + + _ + Public Delegate Function OvlK_ReUseDelegate(<[In]> OverlappedK As KOVL_HANDLE) As Boolean + + _ + Public Delegate Function OvlK_ReleaseDelegate(<[In]> OverlappedK As KOVL_HANDLE) As Boolean + + _ + Public Delegate Function OvlK_WaitAndReleaseDelegate(<[In]> OverlappedK As KOVL_HANDLE, TimeoutMS As Integer, ByRef TransferredLength As Integer) As Boolean + + _ + Public Delegate Function OvlK_WaitDelegate(<[In]> OverlappedK As KOVL_HANDLE, TimeoutMS As Integer, WaitFlags As KOVL_WAIT_FLAG, ByRef TransferredLength As Integer) As Boolean + + _ + Public Delegate Function OvlK_WaitOldestDelegate(<[In]> PoolHandle As KOVL_POOL_HANDLE, ByRef OverlappedK As KOVL_HANDLE, TimeoutMS As Integer, WaitFlags As KOVL_WAIT_FLAG, ByRef TransferredLength As Integer) As Boolean + + _ + Public Delegate Function OvlK_WaitOrCancelDelegate(<[In]> OverlappedK As KOVL_HANDLE, TimeoutMS As Integer, ByRef TransferredLength As Integer) As Boolean + + _ + Public Delegate Function StmK_FreeDelegate(<[In]> StreamHandle As KSTM_HANDLE) As Boolean + + _ + Public Delegate Function StmK_InitDelegate( ByRef StreamHandle As KSTM_HANDLE, <[In]> UsbHandle As KUSB_HANDLE, PipeID As Byte, MaxTransferSize As Integer, MaxPendingTransfers As Integer, MaxPendingIO As Integer, _ + <[In]> ByRef Callbacks As KSTM_CALLBACK, Flags As KSTM_FLAG) As Boolean + + _ + Public Delegate Function StmK_ReadDelegate(<[In]> StreamHandle As KSTM_HANDLE, Buffer As IntPtr, Offset As Integer, Length As Integer, ByRef TransferredLength As Integer) As Boolean + + _ + Public Delegate Function StmK_StartDelegate(<[In]> StreamHandle As KSTM_HANDLE) As Boolean + + _ + Public Delegate Function StmK_StopDelegate(<[In]> StreamHandle As KSTM_HANDLE, TimeoutCancelMS As Integer) As Boolean + + _ + Public Delegate Function StmK_WriteDelegate(<[In]> StreamHandle As KSTM_HANDLE, Buffer As IntPtr, Offset As Integer, Length As Integer, ByRef TransferredLength As Integer) As Boolean + + _ + Public Delegate Function UsbK_FreeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE) As Boolean + + #End Region + + Shared Sub New() + If [String].IsNullOrEmpty(AllKOptions.LIBUSBK_FULLPATH_TO_ALTERNATE_DLL) Then + mModuleLibusbK = LoadLibraryEx(AllKConstants.LIBUSBK_DLL, IntPtr.Zero, LoadLibraryFlags.NONE) + Else + mModuleLibusbK = LoadLibraryEx(AllKOptions.LIBUSBK_FULLPATH_TO_ALTERNATE_DLL, IntPtr.Zero, LoadLibraryFlags.LOAD_WITH_ALTERED_SEARCH_PATH) + End If + + If mModuleLibusbK = IntPtr.Zero Then + Throw New DllNotFoundException("libusbK.dll not found. Please install drivers/applications and retry.") + End If + + LoadDynamicFunctions() + End Sub + + #Region "Nested Enumerations" + + _ + Private Enum LoadLibraryFlags + NONE = 0 + DONT_RESOLVE_DLL_REFERENCES = &H1 + LOAD_IGNORE_CODE_AUTHZ_LEVEL = &H10 + LOAD_LIBRARY_AS_DATAFILE = &H2 + LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = &H40 + LOAD_LIBRARY_AS_IMAGE_RESOURCE = &H20 + LOAD_WITH_ALTERED_SEARCH_PATH = &H8 + End Enum + + #End Region + + #Region "Public Members" + + Public Shared HotK_Free As HotK_FreeDelegate + Public Shared HotK_FreeAll As HotK_FreeAllDelegate + Public Shared HotK_Init As HotK_InitDelegate + Public Shared IsoK_EnumPackets As IsoK_EnumPacketsDelegate + Public Shared IsoK_Free As IsoK_FreeDelegate + Public Shared IsoK_GetPacket As IsoK_GetPacketDelegate + Public Shared IsoK_Init As IsoK_InitDelegate + Public Shared IsoK_ReUse As IsoK_ReUseDelegate + Public Shared IsoK_SetPacket As IsoK_SetPacketDelegate + Public Shared IsoK_SetPackets As IsoK_SetPacketsDelegate + Public Shared LibK_Context_Free As LibK_Context_FreeDelegate + Public Shared LibK_Context_Init As LibK_Context_InitDelegate + + Public Shared LibK_CopyDriverAPI As LibK_CopyDriverAPIDelegate + Public Shared LibK_GetContext As LibK_GetContextDelegate + Public Shared LibK_GetDefaultContext As LibK_GetDefaultContextDelegate + Public Shared LibK_GetProcAddress As LibK_GetProcAddressDelegate + Public Shared LibK_GetVersion As LibK_GetVersionDelegate + Public Shared LibK_LoadDriverAPI As LibK_LoadDriverAPIDelegate + Public Shared LibK_SetCleanupCallback As LibK_SetCleanupCallbackDelegate + Public Shared LibK_SetContext As LibK_SetContextDelegate + Public Shared LibK_SetDefaultContext As LibK_SetDefaultContextDelegate + Public Shared LstK_Count As LstK_CountDelegate + Public Shared LstK_Current As LstK_CurrentDelegate + Public Shared LstK_Enumerate As LstK_EnumerateDelegate + Public Shared LstK_FindByVidPid As LstK_FindByVidPidDelegate + Public Shared LstK_Free As LstK_FreeDelegate + Public Shared LstK_Init As LstK_InitDelegate + Public Shared LstK_InitEx As LstK_InitExDelegate + Public Shared LstK_MoveNext As LstK_MoveNextDelegate + Public Shared LstK_MoveReset As LstK_MoveResetDelegate + Public Shared OvlK_Acquire As OvlK_AcquireDelegate + Public Shared OvlK_Free As OvlK_FreeDelegate + Public Shared OvlK_GetEventHandle As OvlK_GetEventHandleDelegate + Public Shared OvlK_Init As OvlK_InitDelegate + Public Shared OvlK_IsComplete As OvlK_IsCompleteDelegate + Public Shared OvlK_ReUse As OvlK_ReUseDelegate + Public Shared OvlK_Release As OvlK_ReleaseDelegate + Public Shared OvlK_Wait As OvlK_WaitDelegate + Public Shared OvlK_WaitAndRelease As OvlK_WaitAndReleaseDelegate + Public Shared OvlK_WaitOldest As OvlK_WaitOldestDelegate + Public Shared OvlK_WaitOrCancel As OvlK_WaitOrCancelDelegate + Public Shared StmK_Free As StmK_FreeDelegate + Public Shared StmK_Init As StmK_InitDelegate + Public Shared StmK_Read As StmK_ReadDelegate + Public Shared StmK_Start As StmK_StartDelegate + Public Shared StmK_Stop As StmK_StopDelegate + Public Shared StmK_Write As StmK_WriteDelegate + Public Shared UsbK_Free As UsbK_FreeDelegate + + #End Region + + #Region "Private Members" + + Private Declare Ansi Function GetProcAddress Lib "kernel32.dll" (hModule As IntPtr, procName As String) As IntPtr + + Private Shared Sub LoadDynamicFunctions() + LibK_GetVersion = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_GetVersion"), GetType(LibK_GetVersionDelegate)), LibK_GetVersionDelegate) + LibK_GetContext = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_GetContext"), GetType(LibK_GetContextDelegate)), LibK_GetContextDelegate) + LibK_SetContext = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_SetContext"), GetType(LibK_SetContextDelegate)), LibK_SetContextDelegate) + LibK_SetCleanupCallback = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_SetCleanupCallback"), GetType(LibK_SetCleanupCallbackDelegate)), LibK_SetCleanupCallbackDelegate) + LibK_LoadDriverAPI = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_LoadDriverAPI"), GetType(LibK_LoadDriverAPIDelegate)), LibK_LoadDriverAPIDelegate) + LibK_CopyDriverAPI = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_CopyDriverAPI"), GetType(LibK_CopyDriverAPIDelegate)), LibK_CopyDriverAPIDelegate) + LibK_GetProcAddress = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_GetProcAddress"), GetType(LibK_GetProcAddressDelegate)), LibK_GetProcAddressDelegate) + LibK_SetDefaultContext = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_SetDefaultContext"), GetType(LibK_SetDefaultContextDelegate)), LibK_SetDefaultContextDelegate) + LibK_GetDefaultContext = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_GetDefaultContext"), GetType(LibK_GetDefaultContextDelegate)), LibK_GetDefaultContextDelegate) + LibK_Context_Init = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_Context_Init"), GetType(LibK_Context_InitDelegate)), LibK_Context_InitDelegate) + LibK_Context_Free = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_Context_Free"), GetType(LibK_Context_FreeDelegate)), LibK_Context_FreeDelegate) + UsbK_Free = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "UsbK_Free"), GetType(UsbK_FreeDelegate)), UsbK_FreeDelegate) + LstK_Init = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Init"), GetType(LstK_InitDelegate)), LstK_InitDelegate) + LstK_InitEx = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_InitEx"), GetType(LstK_InitExDelegate)), LstK_InitExDelegate) + LstK_Free = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Free"), GetType(LstK_FreeDelegate)), LstK_FreeDelegate) + LstK_Enumerate = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Enumerate"), GetType(LstK_EnumerateDelegate)), LstK_EnumerateDelegate) + LstK_Current = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Current"), GetType(LstK_CurrentDelegate)), LstK_CurrentDelegate) + LstK_MoveNext = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_MoveNext"), GetType(LstK_MoveNextDelegate)), LstK_MoveNextDelegate) + LstK_MoveReset = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_MoveReset"), GetType(LstK_MoveResetDelegate)), LstK_MoveResetDelegate) + LstK_FindByVidPid = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_FindByVidPid"), GetType(LstK_FindByVidPidDelegate)), LstK_FindByVidPidDelegate) + LstK_Count = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Count"), GetType(LstK_CountDelegate)), LstK_CountDelegate) + HotK_Init = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "HotK_Init"), GetType(HotK_InitDelegate)), HotK_InitDelegate) + HotK_Free = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "HotK_Free"), GetType(HotK_FreeDelegate)), HotK_FreeDelegate) + HotK_FreeAll = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "HotK_FreeAll"), GetType(HotK_FreeAllDelegate)), HotK_FreeAllDelegate) + OvlK_Acquire = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Acquire"), GetType(OvlK_AcquireDelegate)), OvlK_AcquireDelegate) + OvlK_Release = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Release"), GetType(OvlK_ReleaseDelegate)), OvlK_ReleaseDelegate) + OvlK_Init = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Init"), GetType(OvlK_InitDelegate)), OvlK_InitDelegate) + OvlK_Free = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Free"), GetType(OvlK_FreeDelegate)), OvlK_FreeDelegate) + OvlK_GetEventHandle = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_GetEventHandle"), GetType(OvlK_GetEventHandleDelegate)), OvlK_GetEventHandleDelegate) + OvlK_Wait = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Wait"), GetType(OvlK_WaitDelegate)), OvlK_WaitDelegate) + OvlK_WaitOldest = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_WaitOldest"), GetType(OvlK_WaitOldestDelegate)), OvlK_WaitOldestDelegate) + OvlK_WaitOrCancel = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_WaitOrCancel"), GetType(OvlK_WaitOrCancelDelegate)), OvlK_WaitOrCancelDelegate) + OvlK_WaitAndRelease = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_WaitAndRelease"), GetType(OvlK_WaitAndReleaseDelegate)), OvlK_WaitAndReleaseDelegate) + OvlK_IsComplete = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_IsComplete"), GetType(OvlK_IsCompleteDelegate)), OvlK_IsCompleteDelegate) + OvlK_ReUse = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_ReUse"), GetType(OvlK_ReUseDelegate)), OvlK_ReUseDelegate) + StmK_Init = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Init"), GetType(StmK_InitDelegate)), StmK_InitDelegate) + StmK_Free = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Free"), GetType(StmK_FreeDelegate)), StmK_FreeDelegate) + StmK_Start = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Start"), GetType(StmK_StartDelegate)), StmK_StartDelegate) + StmK_Stop = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Stop"), GetType(StmK_StopDelegate)), StmK_StopDelegate) + StmK_Read = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Read"), GetType(StmK_ReadDelegate)), StmK_ReadDelegate) + StmK_Write = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Write"), GetType(StmK_WriteDelegate)), StmK_WriteDelegate) + IsoK_Init = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_Init"), GetType(IsoK_InitDelegate)), IsoK_InitDelegate) + IsoK_Free = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_Free"), GetType(IsoK_FreeDelegate)), IsoK_FreeDelegate) + IsoK_SetPackets = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_SetPackets"), GetType(IsoK_SetPacketsDelegate)), IsoK_SetPacketsDelegate) + IsoK_SetPacket = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_SetPacket"), GetType(IsoK_SetPacketDelegate)), IsoK_SetPacketDelegate) + IsoK_GetPacket = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_GetPacket"), GetType(IsoK_GetPacketDelegate)), IsoK_GetPacketDelegate) + IsoK_EnumPackets = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_EnumPackets"), GetType(IsoK_EnumPacketsDelegate)), IsoK_EnumPacketsDelegate) + IsoK_ReUse = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_ReUse"), GetType(IsoK_ReUseDelegate)), IsoK_ReUseDelegate) + End Sub + + _ + Private Shared Function LoadLibraryEx(lpFileName As String, hReservedNull As IntPtr, dwFlags As LoadLibraryFlags) As IntPtr + End Function + + Private Shared ReadOnly mModuleLibusbK As IntPtr = IntPtr.Zero + + #End Region + End Class + + #End Region + + #Region "Enumerations" + + ''' Values used in the \c bmAttributes field of a \ref USB_ENDPOINT_DESCRIPTOR + Public Enum USBD_PIPE_TYPE + ''' Indicates a control endpoint + UsbdPipeTypeControl + + ''' Indicates an isochronous endpoint + UsbdPipeTypeIsochronous + + ''' Indicates a bulk endpoint + UsbdPipeTypeBulk + + ''' Indicates an interrupt endpoint + UsbdPipeTypeInterrupt + End Enum + + ''' Additional ISO transfer flags. + _ + Public Enum KISO_FLAG + NONE = 0 + + ''' Do not start the transfer immediately, instead use \ref KISO_CONTEXT::StartFrame. + SET_START_FRAME = &H1 + End Enum + + ''' Handle type enumeration. + Public Enum KLIB_HANDLE_TYPE + ''' Hot plug handle. \ref KHOT_HANDLE + HOTK + + ''' USB handle. \ref KUSB_HANDLE + USBK + + ''' Shared USB handle. \ref KUSB_HANDLE + USBSHAREDK + + ''' Device list handle. \ref KLST_HANDLE + LSTK + + ''' Device info handle. \ref KLST_DEVINFO_HANDLE + LSTINFOK + + ''' Overlapped handle. \ref KOVL_HANDLE + OVLK + + ''' Overlapped pool handle. \ref KOVL_POOL_HANDLE + OVLPOOLK + + ''' Pipe stream handle. \ref KSTM_HANDLE + STMK + + ''' Max handle type count. + COUNT + End Enum + + ''' Device list sync flags. + _ + Public Enum KLST_SYNC_FLAG + ''' Cleared/invalid state. + NONE = 0 + + ''' Unchanged state, + UNCHANGED = &H1 + + ''' Added (Arrival) state, + ADDED = &H2 + + ''' Removed (Unplugged) state, + REMOVED = &H4 + + ''' Connect changed state. + CONNECT_CHANGE = &H8 + + ''' All states. + MASK = &Hf + End Enum + + ''' Device list initialization flags. + _ + Public Enum KLST_FLAG + ''' No flags (or 0) + NONE = 0 + + ''' Enable listings for the raw device interface GUID \b only. {A5DCBF10-6530-11D2-901F-00C04FB951ED} + INCLUDE_RAWGUID = &H1 + + ''' List all libusbK devices including those not currently connected. + INCLUDE_DISCONNECT = &H2 + End Enum + + ''' bmRequest.Dir + Public Enum BMREQUEST_DIR + HOST_TO_DEVICE = 0 + DEVICE_TO_HOST = 1 + End Enum + + ''' bmRequest.Type + Public Enum BMREQUEST_TYPE + ''' Standard request. See \ref USB_REQUEST_ENUM + STANDARD = 0 + + ''' Class-specific request. + [CLASS] = 1 + + ''' Vendor-specific request + VENDOR = 2 + End Enum + + ''' bmRequest.Recipient + Public Enum BMREQUEST_RECIPIENT + ''' Request is for a device. + DEVICE = 0 + + ''' Request is for an interface of a device. + [INTERFACE] = 1 + + ''' Request is for an endpoint of a device. + ENDPOINT = 2 + + ''' Request is for a vendor-specific purpose. + OTHER = 3 + End Enum + + ''' Values for the bits returned by the \ref USB_REQUEST_GET_STATUS request. + Public Enum USB_GETSTATUS + ''' Device is self powered + SELF_POWERED = &H1 + + ''' Device can wake the system from a low power/sleeping state. + REMOTE_WAKEUP_ENABLED = &H2 + End Enum + + ''' Standard USB descriptor types. For more information, see section 9-5 of the USB 3.0 specifications. + Public Enum USB_DESCRIPTOR_TYPE + ''' Device descriptor type. + DEVICE = &H1 + + ''' Configuration descriptor type. + CONFIGURATION = &H2 + + ''' String descriptor type. + [STRING] = &H3 + + ''' Interface descriptor type. + [INTERFACE] = &H4 + + ''' Endpoint descriptor type. + ENDPOINT = &H5 + + ''' Device qualifier descriptor type. + DEVICE_QUALIFIER = &H6 + + ''' Config power descriptor type. + CONFIG_POWER = &H7 + + ''' Interface power descriptor type. + INTERFACE_POWER = &H8 + + ''' Interface association descriptor type. + INTERFACE_ASSOCIATION = &Hb + End Enum + + ''' Usb handle specific properties that can be retrieved with \ref UsbK_GetProperty. + Public Enum KUSB_PROPERTY + ''' Get the internal device file handle used for operations such as GetOverlappedResult or DeviceIoControl. + DEVICE_FILE_HANDLE + + COUNT + End Enum + + ''' Supported driver id enumeration. + Public Enum KUSB_DRVID + ''' libusbK.sys driver ID + LIBUSBK + + ''' libusb0.sys driver ID + LIBUSB0 + + ''' WinUSB.sys driver ID + WINUSB + + ''' libusb0.sys filter driver ID + LIBUSB0_FILTER + + ''' Supported driver count + COUNT + End Enum + + ''' Supported function id enumeration. + Public Enum KUSB_FNID + ''' \ref UsbK_Init dynamic driver function id. + Init + + ''' \ref UsbK_Free dynamic driver function id. + Free + + ''' \ref UsbK_ClaimInterface dynamic driver function id. + ClaimInterface + + ''' \ref UsbK_ReleaseInterface dynamic driver function id. + ReleaseInterface + + ''' \ref UsbK_SetAltInterface dynamic driver function id. + SetAltInterface + + ''' \ref UsbK_GetAltInterface dynamic driver function id. + GetAltInterface + + ''' \ref UsbK_GetDescriptor dynamic driver function id. + GetDescriptor + + ''' \ref UsbK_ControlTransfer dynamic driver function id. + ControlTransfer + + ''' \ref UsbK_SetPowerPolicy dynamic driver function id. + SetPowerPolicy + + ''' \ref UsbK_GetPowerPolicy dynamic driver function id. + GetPowerPolicy + + ''' \ref UsbK_SetConfiguration dynamic driver function id. + SetConfiguration + + ''' \ref UsbK_GetConfiguration dynamic driver function id. + GetConfiguration + + ''' \ref UsbK_ResetDevice dynamic driver function id. + ResetDevice + + ''' \ref UsbK_Initialize dynamic driver function id. + Initialize + + ''' \ref UsbK_SelectInterface dynamic driver function id. + SelectInterface + + ''' \ref UsbK_GetAssociatedInterface dynamic driver function id. + GetAssociatedInterface + + ''' \ref UsbK_Clone dynamic driver function id. + Clone + + ''' \ref UsbK_QueryInterfaceSettings dynamic driver function id. + QueryInterfaceSettings + + ''' \ref UsbK_QueryDeviceInformation dynamic driver function id. + QueryDeviceInformation + + ''' \ref UsbK_SetCurrentAlternateSetting dynamic driver function id. + SetCurrentAlternateSetting + + ''' \ref UsbK_GetCurrentAlternateSetting dynamic driver function id. + GetCurrentAlternateSetting + + ''' \ref UsbK_QueryPipe dynamic driver function id. + QueryPipe + + ''' \ref UsbK_SetPipePolicy dynamic driver function id. + SetPipePolicy + + ''' \ref UsbK_GetPipePolicy dynamic driver function id. + GetPipePolicy + + ''' \ref UsbK_ReadPipe dynamic driver function id. + ReadPipe + + ''' \ref UsbK_WritePipe dynamic driver function id. + WritePipe + + ''' \ref UsbK_ResetPipe dynamic driver function id. + ResetPipe + + ''' \ref UsbK_AbortPipe dynamic driver function id. + AbortPipe + + ''' \ref UsbK_FlushPipe dynamic driver function id. + FlushPipe + + ''' \ref UsbK_IsoReadPipe dynamic driver function id. + IsoReadPipe + + ''' \ref UsbK_IsoWritePipe dynamic driver function id. + IsoWritePipe + + ''' \ref UsbK_GetCurrentFrameNumber dynamic driver function id. + GetCurrentFrameNumber + + ''' \ref UsbK_GetOverlappedResult dynamic driver function id. + GetOverlappedResult + + ''' \ref UsbK_GetProperty dynamic driver function id. + GetProperty + + + ''' Supported function count + COUNT + End Enum + + ''' Hot plug config flags. + _ + Public Enum KHOT_FLAG + ''' No flags (or 0) + NONE + + ''' Notify all devices which match upon a succuessful call to \ref HotK_Init. + PLUG_ALL_ON_INIT = &H1 + + ''' Allow other \ref KHOT_HANDLE instances to consume this match. + PASS_DUPE_INSTANCE = &H2 + + ''' If a \c UserHwnd is specified, use \c PostMessage instead of \c SendMessage. + POST_USER_MESSAGE = &H4 + End Enum + + ''' \c WaitFlags used by \ref OvlK_Wait. + _ + Public Enum KOVL_WAIT_FLAG + ''' Do not perform any additional actions upon exiting \ref OvlK_Wait. + NONE = 0 + + ''' If the i/o operation completes successfully, release the OverlappedK back to it's pool. + RELEASE_ON_SUCCESS = &H1 + + ''' If the i/o operation fails, release the OverlappedK back to it's pool. + RELEASE_ON_FAIL = &H2 + + ''' If the i/o operation fails or completes successfully, release the OverlappedK back to its pool. Perform no actions if it times-out. + RELEASE_ON_SUCCESS_FAIL = &H3 + + ''' If the i/o operation times-out cancel it, but do not release the OverlappedK back to its pool. + CANCEL_ON_TIMEOUT = &H4 + + ''' If the i/o operation times-out, cancel it and release the OverlappedK back to its pool. + RELEASE_ON_TIMEOUT = &Hc + + ''' Always release the OverlappedK back to its pool. If the operation timed-out, cancel it before releasing back to its pool. + RELEASE_ALWAYS = &Hf + + ''' Uses alterable wait functions. See http://msdn.microsoft.com/en-us/library/windows/desktop/ms687036%28v=vs.85%29.aspx + ALERTABLE = &H10 + End Enum + + ''' \c Overlapped pool config flags. + _ + Public Enum KOVL_POOL_FLAG + NONE = 0 + End Enum + + ''' Stream config flags. + _ + Public Enum KSTM_FLAG As UInteger + ''' None + NONE = 0 + NO_PARTIAL_XFERS = &H100000 + USE_TIMEOUT = &H80000000UI + TIMEOUT_MASK = &H1ffff + End Enum + + ''' Stream config flags. + Public Enum KSTM_COMPLETE_RESULT + ''' Valid + VALID = 0 + + ''' Invalid + INVALID + End Enum + + #End Region + + #Region "Structs" + + ''' The \c WINUSB_PIPE_INFORMATION structure contains pipe information that the \ref UsbK_QueryPipe routine retrieves. + _ + Public Structure WINUSB_PIPE_INFORMATION + ''' A \c USBD_PIPE_TYPE enumeration value that specifies the pipe type + Public PipeType As USBD_PIPE_TYPE + + ''' The pipe identifier (ID) + Public PipeId As Byte + + ''' The maximum size, in bytes, of the packets that are transmitted on the pipe + Public MaximumPacketSize As UShort + + ''' The pipe interval + Public Interval As Byte + + + Public Overrides Function ToString() As String + Return String.Format("PipeType: {0}" & vbLf & "PipeId: {1}" & vbLf & "MaximumPacketSize: {2}" & vbLf & "Interval: {3}" & vbLf, PipeType, PipeId.ToString("X2") & "h", MaximumPacketSize, Interval.ToString("X2") & "h") + End Function + End Structure + + ''' The \c WINUSB_SETUP_PACKET structure describes a USB setup packet. + _ + Public Structure WINUSB_SETUP_PACKET + ''' The request type. The values that are assigned to this member are defined in Table 9.2 of section 9.3 of the Universal Serial Bus (USB) specification (www.usb.org). + Public RequestType As Byte + + ''' The device request. The values that are assigned to this member are defined in Table 9.3 of section 9.4 of the Universal Serial Bus (USB) specification. + Public Request As Byte + + ''' The meaning of this member varies according to the request. For an explanation of this member, see the Universal Serial Bus (USB) specification. + Public Value As UShort + + ''' The meaning of this member varies according to the request. For an explanation of this member, see the Universal Serial Bus (USB) specification. + Public Index As UShort + + ''' The number of bytes to transfer. (not including the \c WINUSB_SETUP_PACKET itself) + Public Length As UShort + + + Public Overrides Function ToString() As String + Return String.Format("RequestType: {0}" & vbLf & "Request: {1}" & vbLf & "Value: {2}" & vbLf & "Index: {3}" & vbLf & "Length: {4}" & vbLf, RequestType.ToString("X2") & "h", Request.ToString("X2") & "h", Value.ToString("X4") & "h", Index.ToString("X4") & "h", Length) + End Function + End Structure + + ''' Structure describing an isochronous transfer packet. + _ + Public Structure KISO_PACKET + ''' Specifies the offset, in bytes, of the buffer for this packet from the beginning of the entire isochronous transfer data buffer. + Public Offset As Integer + + ''' Set by the host controller to indicate the actual number of bytes received by the device for isochronous IN transfers. Length not used for isochronous OUT transfers. + Public Length As UShort + + ''' Contains the 16 least significant USBD status bits, on return from the host controller driver, of this transfer packet. + Public Status As UShort + + + Public Overrides Function ToString() As String + Return String.Format("Offset: {0}" & vbLf & "Length: {1}" & vbLf & "Status: {2}" & vbLf, Offset, Length, Status.ToString("X4") & "h") + End Function + End Structure + + _ + Public Structure KISO_CONTEXT + Private ReadOnly mHandlePtr As IntPtr + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + Public ReadOnly Property Pointer() As IntPtr + Get + Return mHandlePtr + End Get + End Property + + ''' KISO_CONTEXT_MAP is used for calculating field offsets only + _ + Private Structure KISO_CONTEXT_MAP + ''' Additional ISO transfer flags. See \ref KISO_FLAG. + Private ReadOnly Flags As KISO_FLAG + + ''' Specifies the frame number that the transfer should begin on (0 for ASAP). + Private ReadOnly StartFrame As Integer + + ''' Contains the number of packets that completed with an error condition on return from the host controller driver. + Private ReadOnly ErrorCount As Short + + ''' Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + Private ReadOnly NumberOfPackets As Short + + ''' Contains the URB Hdr.Status value on return from the host controller driver. + Private ReadOnly UrbHdrStatus As Integer + End Structure + + Private Shared ReadOnly ofsFlags As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "Flags").ToInt32() + Private Shared ReadOnly ofsStartFrame As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "StartFrame").ToInt32() + Private Shared ReadOnly ofsErrorCount As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "ErrorCount").ToInt32() + Private Shared ReadOnly ofsNumberOfPackets As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "NumberOfPackets").ToInt32() + Private Shared ReadOnly ofsUrbHdrStatus As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "UrbHdrStatus").ToInt32() + + + ''' Additional ISO transfer flags. See \ref KISO_FLAG. + Public ReadOnly Property Flags() As KISO_FLAG + Get + Return CType(Marshal.ReadInt32(mHandlePtr, ofsFlags), KISO_FLAG) + End Get + End Property + + + ''' Specifies the frame number that the transfer should begin on (0 for ASAP). + Public ReadOnly Property StartFrame() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsStartFrame) + End Get + End Property + + + ''' Contains the number of packets that completed with an error condition on return from the host controller driver. + Public ReadOnly Property ErrorCount() As Short + Get + Return Marshal.ReadInt16(mHandlePtr, ofsErrorCount) + End Get + End Property + + + ''' Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + Public ReadOnly Property NumberOfPackets() As Short + Get + Return Marshal.ReadInt16(mHandlePtr, ofsNumberOfPackets) + End Get + End Property + + + ''' Contains the URB Hdr.Status value on return from the host controller driver. + Public ReadOnly Property UrbHdrStatus() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsUrbHdrStatus) + End Get + End Property + + + Public Overrides Function ToString() As String + Return String.Format("Flags: {0}" & vbLf & "StartFrame: {1}" & vbLf & "ErrorCount: {2}" & vbLf & "NumberOfPackets: {3}" & vbLf & "UrbHdrStatus: {4}" & vbLf, Flags.ToString(), StartFrame, ErrorCount, NumberOfPackets, UrbHdrStatus.ToString("X8") & "h") + End Function + End Structure + + ''' libusbK verson information structure. + _ + Public Structure KLIB_VERSION + ''' Major version number. + Public Major As Integer + + ''' Minor version number. + Public Minor As Integer + + ''' Micro version number. + Public Micro As Integer + + ''' Nano version number. + Public Nano As Integer + + Public Overrides Function ToString() As String + Return String.Format("Major: {0}" & vbLf & "Minor: {1}" & vbLf & "Micro: {2}" & vbLf & "Nano: {3}" & vbLf, Major, Minor, Micro, Nano) + End Function + End Structure + + ''' Common usb device information structure + _ + Public Structure KLST_DEV_COMMON_INFO + ''' VendorID parsed from \ref KLST_DEVINFO::DeviceID + Public Vid As Integer + + ''' ProductID parsed from \ref KLST_DEVINFO::DeviceID + Public Pid As Integer + + ''' Composite interface number parsed from \ref KLST_DEVINFO::DeviceID. Set to \b -1 for devices that do not have the composite parent driver. + Public MI As Integer + + ' An ID that uniquely identifies a USB device. + _ + Public InstanceID As String + + + Public Overrides Function ToString() As String + Return String.Format("Vid: {0}" & vbLf & "Pid: {1}" & vbLf & "MI: {2}" & vbLf & "InstanceID: {3}" & vbLf, Vid.ToString("X4") & "h", Pid.ToString("X4") & "h", MI.ToString("X2") & "h", InstanceID) + End Function + End Structure + + _ + Public Structure KLST_DEVINFO_HANDLE + Implements IKLIB_HANDLE + Private ReadOnly mHandlePtr As IntPtr + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + Public ReadOnly Property Pointer() As IntPtr Implements IKLIB_HANDLE.Pointer + Get + Return mHandlePtr + End Get + End Property + + Public ReadOnly Property HandleType() As KLIB_HANDLE_TYPE Implements IKLIB_HANDLE.HandleType + Get + Return KLIB_HANDLE_TYPE.LSTINFOK + End Get + End Property + + Public Function GetContext() As IntPtr Implements IKLIB_HANDLE.GetContext + Return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + End Function + + Public Function SetContext(UserContext As IntPtr) As Boolean Implements IKLIB_HANDLE.SetContext + Return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + End Function + + Public Function SetCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean Implements IKLIB_HANDLE.SetCleanupCallback + Return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + End Function + + ''' KLST_DEVINFO_MAP is used for calculating field offsets only + _ + Private Structure KLST_DEVINFO_MAP + ''' Common usb device information + Private ReadOnly Common As KLST_DEV_COMMON_INFO + + ''' Driver id this device element is using + Private ReadOnly DriverID As Integer + + ''' Device interface GUID + _ + Private ReadOnly DeviceInterfaceGUID As String + + ''' Device instance ID. + _ + Private ReadOnly DeviceID As String + + ''' Class GUID. + _ + Private ReadOnly ClassGUID As String + + ''' Manufacturer name as specified in the INF file. + _ + Private ReadOnly Mfg As String + + ''' Device description as specified in the INF file. + _ + Private ReadOnly DeviceDesc As String + + ''' Driver service name. + _ + Private ReadOnly Service As String + + ''' Unique identifier. + _ + Private ReadOnly SymbolicLink As String + + ''' physical device filename used with the Windows \c CreateFile() + _ + Private ReadOnly DevicePath As String + + ''' libusb-win32 filter index id. + Private ReadOnly LUsb0FilterIndex As Integer + + ''' Indicates the devices connection state. + Private ReadOnly Connected As Boolean + + ''' Synchronization flags. (internal use only) + Private ReadOnly SyncFlags As KLST_SYNC_FLAG + + Private ReadOnly BusNumber As Integer + + Private ReadOnly DeviceAddress As Integer + + ''' If the the device is serialized, represents the string value of \ref USB_DEVICE_DESCRIPTOR::iSerialNumber. For Devices without a \b iSerialNumber, represents the unique \b InstanceID assigned by \b Windows. + _ + Private ReadOnly SerialNumber As String + End Structure + + Private Shared ReadOnly ofsCommon As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "Common").ToInt32() + Private Shared ReadOnly ofsDriverID As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "DriverID").ToInt32() + Private Shared ReadOnly ofsDeviceInterfaceGUID As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "DeviceInterfaceGUID").ToInt32() + Private Shared ReadOnly ofsDeviceID As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "DeviceID").ToInt32() + Private Shared ReadOnly ofsClassGUID As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "ClassGUID").ToInt32() + Private Shared ReadOnly ofsMfg As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "Mfg").ToInt32() + Private Shared ReadOnly ofsDeviceDesc As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "DeviceDesc").ToInt32() + Private Shared ReadOnly ofsService As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "Service").ToInt32() + Private Shared ReadOnly ofsSymbolicLink As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "SymbolicLink").ToInt32() + Private Shared ReadOnly ofsDevicePath As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "DevicePath").ToInt32() + Private Shared ReadOnly ofsLUsb0FilterIndex As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "LUsb0FilterIndex").ToInt32() + Private Shared ReadOnly ofsConnected As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "Connected").ToInt32() + Private Shared ReadOnly ofsSyncFlags As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "SyncFlags").ToInt32() + Private Shared ReadOnly ofsBusNumber As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "BusNumber").ToInt32() + Private Shared ReadOnly ofsDeviceAddress As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "DeviceAddress").ToInt32() + Private Shared ReadOnly ofsSerialNumber As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "SerialNumber").ToInt32() + + + ''' Common usb device information + Public ReadOnly Property Common() As KLST_DEV_COMMON_INFO + Get + Return CType(Marshal.PtrToStructure(New IntPtr(mHandlePtr.ToInt64() + ofsCommon), GetType(KLST_DEV_COMMON_INFO)), KLST_DEV_COMMON_INFO) + End Get + End Property + + + ''' Driver id this device element is using + Public ReadOnly Property DriverID() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsDriverID) + End Get + End Property + + + ''' Device interface GUID + Public ReadOnly Property DeviceInterfaceGUID() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsDeviceInterfaceGUID)) + End Get + End Property + + + ''' Device instance ID. + Public ReadOnly Property DeviceID() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsDeviceID)) + End Get + End Property + + + ''' Class GUID. + Public ReadOnly Property ClassGUID() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsClassGUID)) + End Get + End Property + + + ''' Manufacturer name as specified in the INF file. + Public ReadOnly Property Mfg() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsMfg)) + End Get + End Property + + + ''' Device description as specified in the INF file. + Public ReadOnly Property DeviceDesc() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsDeviceDesc)) + End Get + End Property + + + ''' Driver service name. + Public ReadOnly Property Service() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsService)) + End Get + End Property + + + ''' Unique identifier. + Public ReadOnly Property SymbolicLink() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsSymbolicLink)) + End Get + End Property + + + ''' physical device filename used with the Windows \c CreateFile() + Public ReadOnly Property DevicePath() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsDevicePath)) + End Get + End Property + + + ''' libusb-win32 filter index id. + Public ReadOnly Property LUsb0FilterIndex() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsLUsb0FilterIndex) + End Get + End Property + + + ''' Indicates the devices connection state. + Public ReadOnly Property Connected() As Boolean + Get + Return Marshal.ReadInt32(mHandlePtr, ofsConnected) <> 0 + End Get + End Property + + + ''' Synchronization flags. (internal use only) + Public ReadOnly Property SyncFlags() As KLST_SYNC_FLAG + Get + Return CType(Marshal.ReadInt32(mHandlePtr, ofsSyncFlags), KLST_SYNC_FLAG) + End Get + End Property + + + Public ReadOnly Property BusNumber() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsBusNumber) + End Get + End Property + + + Public ReadOnly Property DeviceAddress() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsDeviceAddress) + End Get + End Property + + + ''' If the the device is serialized, represents the string value of \ref USB_DEVICE_DESCRIPTOR::iSerialNumber. For Devices without a \b iSerialNumber, represents the unique \b InstanceID assigned by \b Windows. + Public ReadOnly Property SerialNumber() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsSerialNumber)) + End Get + End Property + + + Public Overrides Function ToString() As String + Return String.Format("DriverID: {0}" & vbLf & "DeviceInterfaceGUID: {1}" & vbLf & "DeviceID: {2}" & vbLf & "ClassGUID: {3}" & vbLf & "Mfg: {4}" & vbLf & "DeviceDesc: {5}" & vbLf & "Service: {6}" & vbLf & "SymbolicLink: {7}" & vbLf & "DevicePath: {8}" & vbLf & "LUsb0FilterIndex: {9}" & vbLf & "Connected: {10}" & vbLf & "SyncFlags: {11}" & vbLf & "BusNumber: {12}" & vbLf & "DeviceAddress: {13}" & vbLf & "SerialNumber: {14}" & vbLf, DriverID, DeviceInterfaceGUID, DeviceID, ClassGUID, Mfg, _ + DeviceDesc, Service, SymbolicLink, DevicePath, LUsb0FilterIndex, Connected, _ + SyncFlags.ToString(), BusNumber, DeviceAddress, SerialNumber) + End Function + End Structure + + ''' Device list/hot-plug pattern match structure. + _ + Public Structure KLST_PATTERN_MATCH + ''' Pattern match a device instance id. + _ + Public DeviceID As String + + ''' Pattern match a device interface guid. + _ + Public DeviceInterfaceGUID As String + + ''' Pattern match a symbolic link. + _ + Public ClassGUID As String + + + Public Overrides Function ToString() As String + Return String.Format("DeviceID: {0}" & vbLf & "DeviceInterfaceGUID: {1}" & vbLf & "ClassGUID: {2}" & vbLf, DeviceID, DeviceInterfaceGUID, ClassGUID) + End Function + End Structure + + ''' A structure representing the standard USB device descriptor. + _ + Public Structure USB_DEVICE_DESCRIPTOR + ''' Size of this descriptor (in bytes) + Public bLength As Byte + + ''' Descriptor type + Public bDescriptorType As Byte + + ''' USB specification release number in binary-coded decimal. + Public bcdUSB As UShort + + ''' USB-IF class code for the device + Public bDeviceClass As Byte + + ''' USB-IF subclass code for the device + Public bDeviceSubClass As Byte + + ''' USB-IF protocol code for the device + Public bDeviceProtocol As Byte + + ''' Maximum packet size for control endpoint 0 + Public bMaxPacketSize0 As Byte + + ''' USB-IF vendor ID + Public idVendor As UShort + + ''' USB-IF product ID + Public idProduct As UShort + + ''' Device release number in binary-coded decimal + Public bcdDevice As UShort + + ''' Index of string descriptor describing manufacturer + Public iManufacturer As Byte + + ''' Index of string descriptor describing product + Public iProduct As Byte + + ''' Index of string descriptor containing device serial number + Public iSerialNumber As Byte + + ''' Number of possible configurations + Public bNumConfigurations As Byte + + + Public Overrides Function ToString() As String + Return String.Format("bLength: {0}" & vbLf & "bDescriptorType: {1}" & vbLf & "bcdUSB: {2}" & vbLf & "bDeviceClass: {3}" & vbLf & "bDeviceSubClass: {4}" & vbLf & "bDeviceProtocol: {5}" & vbLf & "bMaxPacketSize0: {6}" & vbLf & "idVendor: {7}" & vbLf & "idProduct: {8}" & vbLf & "bcdDevice: {9}" & vbLf & "iManufacturer: {10}" & vbLf & "iProduct: {11}" & vbLf & "iSerialNumber: {12}" & vbLf & "bNumConfigurations: {13}" & vbLf, bLength, bDescriptorType.ToString("X2") & "h", bcdUSB.ToString("X4") & "h", bDeviceClass.ToString("X2") & "h", bDeviceSubClass.ToString("X2") & "h", _ + bDeviceProtocol.ToString("X2") & "h", bMaxPacketSize0, idVendor.ToString("X4") & "h", idProduct.ToString("X4") & "h", bcdDevice.ToString("X4") & "h", iManufacturer, _ + iProduct, iSerialNumber, bNumConfigurations) + End Function + End Structure + + ''' A structure representing the standard USB endpoint descriptor. + _ + Public Structure USB_ENDPOINT_DESCRIPTOR + ''' Size of this descriptor (in bytes) + Public bLength As Byte + + ''' Descriptor type + Public bDescriptorType As Byte + + ''' The address of the endpoint described by this descriptor. + Public bEndpointAddress As Byte + + ''' Attributes which apply to the endpoint when it is configured using the bConfigurationValue. + Public bmAttributes As Byte + + ''' Maximum packet size this endpoint is capable of sending/receiving. + Public wMaxPacketSize As UShort + + ''' Interval for polling endpoint for data transfers. + Public bInterval As Byte + + + Public Overrides Function ToString() As String + Return String.Format("bLength: {0}" & vbLf & "bDescriptorType: {1}" & vbLf & "bEndpointAddress: {2}" & vbLf & "bmAttributes: {3}" & vbLf & "wMaxPacketSize: {4}" & vbLf & "bInterval: {5}" & vbLf, bLength, bDescriptorType.ToString("X2") & "h", bEndpointAddress.ToString("X2") & "h", bmAttributes.ToString("X2") & "h", wMaxPacketSize, _ + bInterval) + End Function + End Structure + + ''' A structure representing the standard USB configuration descriptor. + _ + Public Structure USB_CONFIGURATION_DESCRIPTOR + ''' Size of this descriptor (in bytes) + Public bLength As Byte + + ''' Descriptor type + Public bDescriptorType As Byte + + ''' Total length of data returned for this configuration + Public wTotalLength As UShort + + ''' Number of interfaces supported by this configuration + Public bNumInterfaces As Byte + + ''' Identifier value for this configuration + Public bConfigurationValue As Byte + + ''' Index of string descriptor describing this configuration + Public iConfiguration As Byte + + ''' Configuration characteristics + Public bmAttributes As Byte + + ''' Maximum power consumption of the USB device from this bus in this configuration when the device is fully operation. + Public MaxPower As Byte + + Public Overrides Function ToString() As String + Return String.Format("bLength: {0}" & vbLf & "bDescriptorType: {1}" & vbLf & "wTotalLength: {2}" & vbLf & "bNumInterfaces: {3}" & vbLf & "bConfigurationValue: {4}" & vbLf & "iConfiguration: {5}" & vbLf & "bmAttributes: {6}" & vbLf & "MaxPower: {7}" & vbLf, bLength, bDescriptorType.ToString("X2") & "h", wTotalLength, bNumInterfaces, bConfigurationValue, _ + iConfiguration, bmAttributes.ToString("X2") & "h", MaxPower) + End Function + End Structure + + ''' A structure representing the standard USB interface descriptor. + _ + Public Structure USB_INTERFACE_DESCRIPTOR + ''' Size of this descriptor (in bytes) + Public bLength As Byte + + ''' Descriptor type + Public bDescriptorType As Byte + + ''' Number of this interface + Public bInterfaceNumber As Byte + + ''' Value used to select this alternate setting for this interface + Public bAlternateSetting As Byte + + ''' Number of endpoints used by this interface (excluding the control endpoint) + Public bNumEndpoints As Byte + + ''' USB-IF class code for this interface + Public bInterfaceClass As Byte + + ''' USB-IF subclass code for this interface + Public bInterfaceSubClass As Byte + + ''' USB-IF protocol code for this interface + Public bInterfaceProtocol As Byte + + ''' Index of string descriptor describing this interface + Public iInterface As Byte + + + Public Overrides Function ToString() As String + Return String.Format("bLength: {0}" & vbLf & "bDescriptorType: {1}" & vbLf & "bInterfaceNumber: {2}" & vbLf & "bAlternateSetting: {3}" & vbLf & "bNumEndpoints: {4}" & vbLf & "bInterfaceClass: {5}" & vbLf & "bInterfaceSubClass: {6}" & vbLf & "bInterfaceProtocol: {7}" & vbLf & "iInterface: {8}" & vbLf, bLength, bDescriptorType.ToString("X2") & "h", bInterfaceNumber, bAlternateSetting, bNumEndpoints, _ + bInterfaceClass.ToString("X2") & "h", bInterfaceSubClass.ToString("X2") & "h", bInterfaceProtocol.ToString("X2") & "h", iInterface) + End Function + End Structure + + ''' A structure representing the standard USB string descriptor. + _ + Public Structure USB_STRING_DESCRIPTOR + ''' Size of this descriptor (in bytes) + Public bLength As Byte + + ''' Descriptor type + Public bDescriptorType As Byte + + ''' Content of the string + _ + Public bString As String + + + Public Overrides Function ToString() As String + Return String.Format("bLength: {0}" & vbLf & "bDescriptorType: {1}" & vbLf & "bString: {2}" & vbLf, bLength, bDescriptorType.ToString("X2") & "h", bString) + End Function + End Structure + + ''' A structure representing the common USB descriptor. + _ + Public Structure USB_COMMON_DESCRIPTOR + ''' Size of this descriptor (in bytes) + Public bLength As Byte + + ''' Descriptor type + Public bDescriptorType As Byte + + + Public Overrides Function ToString() As String + Return String.Format("bLength: {0}" & vbLf & "bDescriptorType: {1}" & vbLf, bLength, bDescriptorType.ToString("X2") & "h") + End Function + End Structure + + ''' Allows hardware manufacturers to define groupings of interfaces. + _ + Public Structure USB_INTERFACE_ASSOCIATION_DESCRIPTOR + ''' Size of this descriptor (in bytes) + Public bLength As Byte + + ''' Descriptor type + Public bDescriptorType As Byte + + ''' First interface number of the set of interfaces that follow this descriptor + Public bFirstInterface As Byte + + ''' The Number of interfaces follow this descriptor that are considered "associated" + Public bInterfaceCount As Byte + + ''' \c bInterfaceClass used for this associated interfaces + Public bFunctionClass As Byte + + ''' \c bInterfaceSubClass used for the associated interfaces + Public bFunctionSubClass As Byte + + ''' \c bInterfaceProtocol used for the associated interfaces + Public bFunctionProtocol As Byte + + ''' Index of string descriptor describing the associated interfaces + Public iFunction As Byte + + + Public Overrides Function ToString() As String + Return String.Format("bLength: {0}" & vbLf & "bDescriptorType: {1}" & vbLf & "bFirstInterface: {2}" & vbLf & "bInterfaceCount: {3}" & vbLf & "bFunctionClass: {4}" & vbLf & "bFunctionSubClass: {5}" & vbLf & "bFunctionProtocol: {6}" & vbLf & "iFunction: {7}" & vbLf, bLength, bDescriptorType.ToString("X2") & "h", bFirstInterface, bInterfaceCount, bFunctionClass.ToString("X2") & "h", _ + bFunctionSubClass.ToString("X2") & "h", bFunctionProtocol.ToString("X2") & "h", iFunction) + End Function + End Structure + + ''' USB core driver API information structure. + _ + Public Structure KUSB_DRIVER_API_INFO + ''' \readonly Driver id of the driver api. + Public DriverID As Integer + + ''' \readonly Number of valid functions contained in the driver API. + Public FunctionCount As Integer + + + Public Overrides Function ToString() As String + Return String.Format("DriverID: {0}" & vbLf & "FunctionCount: {1}" & vbLf, DriverID, FunctionCount) + End Function + End Structure + + ''' Driver API function set structure. + _ + Public Structure KUSB_DRIVER_API + ''' Driver API information. + Public Info As KUSB_DRIVER_API_INFO + + + _ + Public Init As KUSB_InitDelegate + + + _ + Public Free As KUSB_FreeDelegate + + + _ + Public ClaimInterface As KUSB_ClaimInterfaceDelegate + + + _ + Public ReleaseInterface As KUSB_ReleaseInterfaceDelegate + + + _ + Public SetAltInterface As KUSB_SetAltInterfaceDelegate + + + _ + Public GetAltInterface As KUSB_GetAltInterfaceDelegate + + + _ + Public GetDescriptor As KUSB_GetDescriptorDelegate + + + _ + Public ControlTransfer As KUSB_ControlTransferDelegate + + + _ + Public SetPowerPolicy As KUSB_SetPowerPolicyDelegate + + + _ + Public GetPowerPolicy As KUSB_GetPowerPolicyDelegate + + + _ + Public SetConfiguration As KUSB_SetConfigurationDelegate + + + _ + Public GetConfiguration As KUSB_GetConfigurationDelegate + + + _ + Public ResetDevice As KUSB_ResetDeviceDelegate + + + _ + Public Initialize As KUSB_InitializeDelegate + + + _ + Public SelectInterface As KUSB_SelectInterfaceDelegate + + + _ + Public GetAssociatedInterface As KUSB_GetAssociatedInterfaceDelegate + + + _ + Public Clone As KUSB_CloneDelegate + + + _ + Public QueryInterfaceSettings As KUSB_QueryInterfaceSettingsDelegate + + + _ + Public QueryDeviceInformation As KUSB_QueryDeviceInformationDelegate + + + _ + Public SetCurrentAlternateSetting As KUSB_SetCurrentAlternateSettingDelegate + + + _ + Public GetCurrentAlternateSetting As KUSB_GetCurrentAlternateSettingDelegate + + + _ + Public QueryPipe As KUSB_QueryPipeDelegate + + + _ + Public SetPipePolicy As KUSB_SetPipePolicyDelegate + + + _ + Public GetPipePolicy As KUSB_GetPipePolicyDelegate + + + _ + Public ReadPipe As KUSB_ReadPipeDelegate + + + _ + Public WritePipe As KUSB_WritePipeDelegate + + + _ + Public ResetPipe As KUSB_ResetPipeDelegate + + + _ + Public AbortPipe As KUSB_AbortPipeDelegate + + + _ + Public FlushPipe As KUSB_FlushPipeDelegate + + + _ + Public IsoReadPipe As KUSB_IsoReadPipeDelegate + + + _ + Public IsoWritePipe As KUSB_IsoWritePipeDelegate + + + _ + Public GetCurrentFrameNumber As KUSB_GetCurrentFrameNumberDelegate + + + _ + Public GetOverlappedResult As KUSB_GetOverlappedResultDelegate + + + _ + Public GetProperty As KUSB_GetPropertyDelegate + End Structure + + ''' Hot plug parameter structure. + _ + Public Structure KHOT_PARAMS + ''' Hot plug event window handle to send/post messages when notifications occur. + Public UserHwnd As IntPtr + + ''' WM_USER message start offset used when sending/posting messages, See details. + Public UserMessage As Integer + + ''' Additional init/config parameters + Public Flags As KHOT_FLAG + + ''' File pattern matches for restricting notifcations to a single/group or all supported usb devices. + Public PatternMatch As KLST_PATTERN_MATCH + + ''' Hot plug event callback function invoked when notifications occur. + _ + Public OnHotPlug As KHOT_PLUG_CB + + + Public Overrides Function ToString() As String + Return String.Format("UserHwnd: {0}" & vbLf & "UserMessage: {1}" & vbLf & "Flags: {2}" & vbLf, UserHwnd.ToString("X16") & "h", UserMessage.ToString("X8") & "h", Flags.ToString()) + End Function + End Structure + + _ + Public Structure KSTM_XFER_CONTEXT + Private ReadOnly mHandlePtr As IntPtr + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + Public ReadOnly Property Pointer() As IntPtr + Get + Return mHandlePtr + End Get + End Property + + ''' KSTM_XFER_CONTEXT_MAP is used for calculating field offsets only + _ + Private Structure KSTM_XFER_CONTEXT_MAP + ''' Internal stream buffer. + Private ReadOnly Buffer As IntPtr + + ''' Size of internal stream buffer. + Private ReadOnly BufferSize As Integer + + ''' Number of bytes to write or number of bytes read. + Private ReadOnly TransferLength As Integer + + ''' User defined state. + Private ReadOnly UserState As IntPtr + End Structure + + Private Shared ReadOnly ofsBuffer As Integer = Marshal.OffsetOf(GetType(KSTM_XFER_CONTEXT_MAP), "Buffer").ToInt32() + Private Shared ReadOnly ofsBufferSize As Integer = Marshal.OffsetOf(GetType(KSTM_XFER_CONTEXT_MAP), "BufferSize").ToInt32() + Private Shared ReadOnly ofsTransferLength As Integer = Marshal.OffsetOf(GetType(KSTM_XFER_CONTEXT_MAP), "TransferLength").ToInt32() + Private Shared ReadOnly ofsUserState As Integer = Marshal.OffsetOf(GetType(KSTM_XFER_CONTEXT_MAP), "UserState").ToInt32() + + + ''' Internal stream buffer. + Public ReadOnly Property Buffer() As IntPtr + Get + Return Marshal.ReadIntPtr(mHandlePtr, ofsBuffer) + End Get + End Property + + + ''' Size of internal stream buffer. + Public ReadOnly Property BufferSize() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsBufferSize) + End Get + End Property + + + ''' Number of bytes to write or number of bytes read. + Public ReadOnly Property TransferLength() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsTransferLength) + End Get + End Property + + + ''' User defined state. + Public Property UserState() As IntPtr + Get + Return Marshal.ReadIntPtr(mHandlePtr, ofsUserState) + End Get + Set + Marshal.WriteIntPtr(mHandlePtr, ofsUserState, value) + End Set + End Property + + + Public Overrides Function ToString() As String + Return String.Format("Buffer: {0}" & vbLf & "BufferSize: {1}" & vbLf & "TransferLength: {2}" & vbLf & "UserState: {3}" & vbLf, Buffer.ToString("X16") & "h", BufferSize, TransferLength, UserState.ToString("X16") & "h") + End Function + End Structure + + _ + Public Structure KSTM_INFO + Private ReadOnly mHandlePtr As IntPtr + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + Public ReadOnly Property Pointer() As IntPtr + Get + Return mHandlePtr + End Get + End Property + + ''' KSTM_INFO_MAP is used for calculating field offsets only + _ + Private Structure KSTM_INFO_MAP + ''' \ref KUSB_HANDLE this stream uses. + Private ReadOnly UsbHandle As IntPtr + + ''' This parameter corresponds to the bEndpointAddress field in the endpoint descriptor. + Private ReadOnly PipeID As Byte + + ''' Maximum transfer read/write request allowed pending. + Private ReadOnly MaxPendingTransfers As Integer + + ''' Maximum transfer sage size. + Private ReadOnly MaxTransferSize As Integer + + ''' Maximum number of I/O request allowed pending. + Private ReadOnly MaxPendingIO As Integer + + ''' Populated with the endpoint descriptor for the specified \c PipeID. + Private ReadOnly EndpointDescriptor As USB_ENDPOINT_DESCRIPTOR + + ''' Populated with the driver api for the specified \c UsbHandle. + Private ReadOnly DriverAPI As KUSB_DRIVER_API + + ''' Populated with the device file handle for the specified \c UsbHandle. + Private ReadOnly DeviceHandle As IntPtr + + ''' Stream handle. + Private ReadOnly StreamHandle As IntPtr + + ''' Stream info user defined state. + Private ReadOnly UserState As IntPtr + End Structure + + Private Shared ReadOnly ofsUsbHandle As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "UsbHandle").ToInt32() + Private Shared ReadOnly ofsPipeID As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "PipeID").ToInt32() + Private Shared ReadOnly ofsMaxPendingTransfers As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "MaxPendingTransfers").ToInt32() + Private Shared ReadOnly ofsMaxTransferSize As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "MaxTransferSize").ToInt32() + Private Shared ReadOnly ofsMaxPendingIO As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "MaxPendingIO").ToInt32() + Private Shared ReadOnly ofsEndpointDescriptor As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "EndpointDescriptor").ToInt32() + Private Shared ReadOnly ofsDriverAPI As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "DriverAPI").ToInt32() + Private Shared ReadOnly ofsDeviceHandle As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "DeviceHandle").ToInt32() + Private Shared ReadOnly ofsStreamHandle As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "StreamHandle").ToInt32() + Private Shared ReadOnly ofsUserState As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "UserState").ToInt32() + + + ''' \ref KUSB_HANDLE this stream uses. + Public ReadOnly Property UsbHandle() As IntPtr + Get + Return Marshal.ReadIntPtr(mHandlePtr, ofsUsbHandle) + End Get + End Property + + + ''' This parameter corresponds to the bEndpointAddress field in the endpoint descriptor. + Public ReadOnly Property PipeID() As Byte + Get + Return Marshal.ReadByte(mHandlePtr, ofsPipeID) + End Get + End Property + + + ''' Maximum transfer read/write request allowed pending. + Public ReadOnly Property MaxPendingTransfers() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsMaxPendingTransfers) + End Get + End Property + + + ''' Maximum transfer sage size. + Public ReadOnly Property MaxTransferSize() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsMaxTransferSize) + End Get + End Property + + + ''' Maximum number of I/O request allowed pending. + Public ReadOnly Property MaxPendingIO() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsMaxPendingIO) + End Get + End Property + + + ''' Populated with the endpoint descriptor for the specified \c PipeID. + Public ReadOnly Property EndpointDescriptor() As USB_ENDPOINT_DESCRIPTOR + Get + Return CType(Marshal.PtrToStructure(New IntPtr(mHandlePtr.ToInt64() + ofsEndpointDescriptor), GetType(USB_ENDPOINT_DESCRIPTOR)), USB_ENDPOINT_DESCRIPTOR) + End Get + End Property + + + ''' Populated with the driver api for the specified \c UsbHandle. + Public ReadOnly Property DriverAPI() As KUSB_DRIVER_API + Get + Return CType(Marshal.PtrToStructure(New IntPtr(mHandlePtr.ToInt64() + ofsDriverAPI), GetType(KUSB_DRIVER_API)), KUSB_DRIVER_API) + End Get + End Property + + + ''' Populated with the device file handle for the specified \c UsbHandle. + Public ReadOnly Property DeviceHandle() As IntPtr + Get + Return Marshal.ReadIntPtr(mHandlePtr, ofsDeviceHandle) + End Get + End Property + + + ''' Stream handle. + Public ReadOnly Property StreamHandle() As IntPtr + Get + Return Marshal.ReadIntPtr(mHandlePtr, ofsStreamHandle) + End Get + End Property + + + ''' Stream info user defined state. + Public Property UserState() As IntPtr + Get + Return Marshal.ReadIntPtr(mHandlePtr, ofsUserState) + End Get + Set + Marshal.WriteIntPtr(mHandlePtr, ofsUserState, value) + End Set + End Property + + + Public Overrides Function ToString() As String + Return String.Format("UsbHandle: {0}" & vbLf & "PipeID: {1}" & vbLf & "MaxPendingTransfers: {2}" & vbLf & "MaxTransferSize: {3}" & vbLf & "MaxPendingIO: {4}" & vbLf & "DeviceHandle: {5}" & vbLf & "StreamHandle: {6}" & vbLf & "UserState: {7}" & vbLf, UsbHandle.ToString("X16") & "h", PipeID.ToString("X2") & "h", MaxPendingTransfers, MaxTransferSize, MaxPendingIO, _ + DeviceHandle.ToString("X16") & "h", StreamHandle.ToString("X16") & "h", UserState.ToString("X16") & "h") + End Function + End Structure + + ''' Stream callback structure. + _ + Public Structure KSTM_CALLBACK + ''' Executed when a transfer error occurs. + _ + Public [Error] As KSTM_ERROR_CB + + ''' Executed to submit a transfer. + _ + Public Submit As KSTM_SUBMIT_CB + + ''' Executed when a valid transfer completes. + _ + Public Complete As KSTM_COMPLETE_CB + + ''' Executed for every transfer context when the stream is started with \ref StmK_Start. + _ + Public Started As KSTM_STARTED_CB + + ''' Executed for every transfer context when the stream is stopped with \ref StmK_Stop. + _ + Public Stopped As KSTM_STOPPED_CB + + ''' Executed immediately after a transfer completes. + _ + Public BeforeComplete As KSTM_BEFORE_COMPLETE_CB + End Structure + + #End Region + + #Region "Delegates" + + _ + Public Delegate Function KLIB_HANDLE_CLEANUP_CB(<[In]> Handle As IntPtr, HandleType As KLIB_HANDLE_TYPE, UserContext As IntPtr) As Integer + + _ + Public Delegate Function KISO_ENUM_PACKETS_CB(PacketIndex As Integer, <[In]> ByRef IsoPacket As KISO_PACKET, UserState As IntPtr) As Boolean + + _ + Public Delegate Function KLST_ENUM_DEVINFO_CB(<[In]> DeviceList As KLST_HANDLE, <[In]> DeviceInfo As KLST_DEVINFO_HANDLE, Context As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_InitDelegate( ByRef InterfaceHandle As KUSB_HANDLE, <[In]> DevInfo As KLST_DEVINFO_HANDLE) As Boolean + + _ + Public Delegate Function KUSB_FreeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE) As Boolean + + _ + Public Delegate Function KUSB_ClaimInterfaceDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, NumberOrIndex As Byte, IsIndex As Boolean) As Boolean + + _ + Public Delegate Function KUSB_ReleaseInterfaceDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, NumberOrIndex As Byte, IsIndex As Boolean) As Boolean + + _ + Public Delegate Function KUSB_SetAltInterfaceDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, NumberOrIndex As Byte, IsIndex As Boolean, AltSettingNumber As Byte) As Boolean + + _ + Public Delegate Function KUSB_GetAltInterfaceDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, NumberOrIndex As Byte, IsIndex As Boolean, ByRef AltSettingNumber As Byte) As Boolean + + _ + Public Delegate Function KUSB_GetDescriptorDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, DescriptorType As Byte, Index As Byte, LanguageID As UShort, Buffer As IntPtr, BufferLength As Integer, _ + ByRef LengthTransferred As Integer) As Boolean + + _ + Public Delegate Function KUSB_ControlTransferDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, SetupPacket As WINUSB_SETUP_PACKET, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_SetPowerPolicyDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PolicyType As Integer, ValueLength As Integer, Value As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_GetPowerPolicyDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PolicyType As Integer, ByRef ValueLength As Integer, Value As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_SetConfigurationDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, ConfigurationNumber As Byte) As Boolean + + _ + Public Delegate Function KUSB_GetConfigurationDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, ByRef ConfigurationNumber As Byte) As Boolean + + _ + Public Delegate Function KUSB_ResetDeviceDelegate(<[In]> InterfaceHandle As KUSB_HANDLE) As Boolean + + _ + Public Delegate Function KUSB_InitializeDelegate(DeviceHandle As IntPtr, ByRef InterfaceHandle As KUSB_HANDLE) As Boolean + + _ + Public Delegate Function KUSB_SelectInterfaceDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, NumberOrIndex As Byte, IsIndex As Boolean) As Boolean + + _ + Public Delegate Function KUSB_GetAssociatedInterfaceDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, AssociatedInterfaceIndex As Byte, ByRef AssociatedInterfaceHandle As KUSB_HANDLE) As Boolean + + _ + Public Delegate Function KUSB_CloneDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, ByRef DstInterfaceHandle As KUSB_HANDLE) As Boolean + + _ + Public Delegate Function KUSB_QueryInterfaceSettingsDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, AltSettingIndex As Byte, ByRef UsbAltInterfaceDescriptor As USB_INTERFACE_DESCRIPTOR) As Boolean + + _ + Public Delegate Function KUSB_QueryDeviceInformationDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, InformationType As Integer, ByRef BufferLength As Integer, Buffer As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_SetCurrentAlternateSettingDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, AltSettingNumber As Byte) As Boolean + + _ + Public Delegate Function KUSB_GetCurrentAlternateSettingDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, ByRef AltSettingNumber As Byte) As Boolean + + _ + Public Delegate Function KUSB_QueryPipeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, AltSettingNumber As Byte, PipeIndex As Byte, ByRef PipeInformation As WINUSB_PIPE_INFORMATION) As Boolean + + _ + Public Delegate Function KUSB_SetPipePolicyDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte, PolicyType As Integer, ValueLength As Integer, Value As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_GetPipePolicyDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte, PolicyType As Integer, ByRef ValueLength As Integer, Value As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_ReadPipeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_WritePipeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_ResetPipeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte) As Boolean + + _ + Public Delegate Function KUSB_AbortPipeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte) As Boolean + + _ + Public Delegate Function KUSB_FlushPipeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte) As Boolean + + _ + Public Delegate Function KUSB_IsoReadPipeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, Overlapped As IntPtr, <[In]> IsoContext As KISO_CONTEXT) As Boolean + + _ + Public Delegate Function KUSB_IsoWritePipeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, Overlapped As IntPtr, <[In]> IsoContext As KISO_CONTEXT) As Boolean + + _ + Public Delegate Function KUSB_GetCurrentFrameNumberDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, ByRef FrameNumber As Integer) As Boolean + + _ + Public Delegate Function KUSB_GetOverlappedResultDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, Overlapped As IntPtr, ByRef lpNumberOfBytesTransferred As Integer, bWait As Boolean) As Boolean + + _ + Public Delegate Function KUSB_GetPropertyDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PropertyType As KUSB_PROPERTY, ByRef PropertySize As Integer, Value As IntPtr) As Boolean + + _ + Public Delegate Sub KHOT_PLUG_CB(<[In]> HotHandle As KHOT_HANDLE, <[In]> DeviceInfo As KLST_DEVINFO_HANDLE, PlugType As KLST_SYNC_FLAG) + + _ + Public Delegate Function KSTM_ERROR_CB(<[In]> StreamInfo As KSTM_INFO, <[In]> XferContext As KSTM_XFER_CONTEXT, XferContextIndex As Integer, ErrorCode As Integer) As Integer + + _ + Public Delegate Function KSTM_SUBMIT_CB(<[In]> StreamInfo As KSTM_INFO, <[In]> XferContext As KSTM_XFER_CONTEXT, XferContextIndex As Integer, Overlapped As IntPtr) As Integer + + _ + Public Delegate Function KSTM_STARTED_CB(<[In]> StreamInfo As KSTM_INFO, <[In]> XferContext As KSTM_XFER_CONTEXT, XferContextIndex As Integer) As Integer + + _ + Public Delegate Function KSTM_STOPPED_CB(<[In]> StreamInfo As KSTM_INFO, <[In]> XferContext As KSTM_XFER_CONTEXT, XferContextIndex As Integer) As Integer + + _ + Public Delegate Function KSTM_COMPLETE_CB(<[In]> StreamInfo As KSTM_INFO, <[In]> XferContext As KSTM_XFER_CONTEXT, XferContextIndex As Integer, ErrorCode As Integer) As Integer + + _ + Public Delegate Function KSTM_BEFORE_COMPLETE_CB(<[In]> StreamInfo As KSTM_INFO, <[In]> XferContext As KSTM_XFER_CONTEXT, XferContextIndex As Integer, ByRef ErrorCode As Integer) As KSTM_COMPLETE_RESULT + + #End Region + + Public Class LstK + Implements IDisposable + Protected mHandleStruct As KLST_HANDLE + Protected mbDisposed As Boolean + + Protected Sub New() + End Sub + + #Region "IDisposable Members" + + ''' Explicitly closes and frees the handle. + Public Overridable Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub + + #End Region + + Protected Overrides Sub Finalize() + Try + Dispose(False) + Finally + MyBase.Finalize() + End Try + End Sub + + Protected Overridable Sub Dispose(disposing As Boolean) + If Not mbDisposed Then + If mHandleStruct.Pointer <> IntPtr.Zero Then + AllKFunctions.LstK_Free(mHandleStruct) + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", [GetType]().Name, mHandleStruct.Pointer.ToInt64(), disposing) + Else + Debug.Print("{0} Dispose: [WARNING] Handle is null", [GetType]().Name) + End If + + mHandleStruct = New KLST_HANDLE(IntPtr.Zero) + mbDisposed = True + End If + End Sub + + ''' Initializes a new usb device list containing all supported devices. + Protected Function Init(Flags As KLST_FLAG) As Boolean + Dim success As Boolean = AllKFunctions.LstK_Init(mHandleStruct, Flags) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + Return True + End Function + + ''' Initializes a new usb device list containing only devices matching a specific class GUID. + Protected Function InitEx(Flags As KLST_FLAG, ByRef PatternMatch As KLST_PATTERN_MATCH) As Boolean + Dim success As Boolean = AllKFunctions.LstK_InitEx(mHandleStruct, Flags, PatternMatch) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + Return True + End Function + + #Region "Public Members" + + ''' Initializes a new usb device list containing all supported devices. + Public Sub New(Flags As KLST_FLAG) + Dim success As Boolean = AllKFunctions.LstK_Init(mHandleStruct, Flags) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + End Sub + + ''' Initializes a new usb device list containing only devices matching a specific class GUID. + Public Sub New(Flags As KLST_FLAG, ByRef PatternMatch As KLST_PATTERN_MATCH) + Dim success As Boolean = AllKFunctions.LstK_InitEx(mHandleStruct, Flags, PatternMatch) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + End Sub + + ''' Counts the number of device info elements in a device list. + Public Overridable Function Count(ByRef Count As Integer) As Boolean + Return AllKFunctions.LstK_Count(mHandleStruct, Count) + End Function + + ''' Gets the \ref KLST_DEVINFO element for the current position. + Public Overridable Function Current(ByRef DeviceInfo As KLST_DEVINFO_HANDLE) As Boolean + Return AllKFunctions.LstK_Current(mHandleStruct, DeviceInfo) + End Function + + ''' Enumerates \ref KLST_DEVINFO elements of a \ref KLST_HANDLE. + Public Overridable Function Enumerate(EnumDevListCB As KLST_ENUM_DEVINFO_CB, Context As IntPtr) As Boolean + Return AllKFunctions.LstK_Enumerate(mHandleStruct, EnumDevListCB, Context) + End Function + + ''' Find a device by vendor and product id + Public Overridable Function FindByVidPid(Vid As Integer, Pid As Integer, ByRef DeviceInfo As KLST_DEVINFO_HANDLE) As Boolean + Return AllKFunctions.LstK_FindByVidPid(mHandleStruct, Vid, Pid, DeviceInfo) + End Function + + ''' Calls the dispose method. + Public Overridable Sub Free() + Dispose() + End Sub + + ''' Gets the handle class structure. + Public ReadOnly Property Handle() As KLST_HANDLE + Get + Return mHandleStruct + End Get + End Property + + ''' Advances the device list current \ref KLST_DEVINFO position. + Public Overridable Function MoveNext(ByRef DeviceInfo As KLST_DEVINFO_HANDLE) As Boolean + Return AllKFunctions.LstK_MoveNext(mHandleStruct, DeviceInfo) + End Function + + ''' Sets the device list to its initial position, which is before the first element in the list. + Public Overridable Sub MoveReset() + AllKFunctions.LstK_MoveReset(mHandleStruct) + End Sub + + #End Region + End Class + + Public Class HotK + Implements IDisposable + Protected mHandleStruct As KHOT_HANDLE + Protected mbDisposed As Boolean + + Protected Sub New() + End Sub + + #Region "IDisposable Members" + + ''' Explicitly closes and frees the handle. + Public Overridable Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub + + #End Region + + Protected Overrides Sub Finalize() + Try + Dispose(False) + Finally + MyBase.Finalize() + End Try + End Sub + + Protected Overridable Sub Dispose(disposing As Boolean) + If Not mbDisposed Then + If mHandleStruct.Pointer <> IntPtr.Zero Then + AllKFunctions.HotK_Free(mHandleStruct) + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", [GetType]().Name, mHandleStruct.Pointer.ToInt64(), disposing) + Else + Debug.Print("{0} Dispose: [WARNING] Handle is null", [GetType]().Name) + End If + + mHandleStruct = New KHOT_HANDLE(IntPtr.Zero) + mbDisposed = True + End If + End Sub + + ''' Creates a new hot-plug handle for USB device arrival/removal event monitoring. + Protected Function Init(ByRef InitParams As KHOT_PARAMS) As Boolean + Dim success As Boolean = AllKFunctions.HotK_Init(mHandleStruct, InitParams) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + Return True + End Function + + #Region "Public Members" + + ''' Creates a new hot-plug handle for USB device arrival/removal event monitoring. + Public Sub New(ByRef InitParams As KHOT_PARAMS) + Dim success As Boolean = AllKFunctions.HotK_Init(mHandleStruct, InitParams) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + End Sub + + ''' Calls the dispose method. + Public Overridable Sub Free() + Dispose() + End Sub + + ''' Frees all hot-plug handles initialized with \ref HotK_Init. + Public Overridable Sub FreeAll() + AllKFunctions.HotK_FreeAll() + End Sub + + ''' Gets the handle class structure. + Public ReadOnly Property Handle() As KHOT_HANDLE + Get + Return mHandleStruct + End Get + End Property + + #End Region + End Class + + Public Class UsbK + Implements IDisposable + Protected driverAPI As KUSB_DRIVER_API + Protected mHandleStruct As KUSB_HANDLE + Protected mbDisposed As Boolean + + Protected Sub New() + End Sub + + #Region "IDisposable Members" + + ''' Explicitly closes and frees the handle. + Public Overridable Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub + + #End Region + + Protected Overrides Sub Finalize() + Try + Dispose(False) + Finally + MyBase.Finalize() + End Try + End Sub + + Protected Overridable Sub Dispose(disposing As Boolean) + If Not mbDisposed Then + If mHandleStruct.Pointer <> IntPtr.Zero Then + AllKFunctions.UsbK_Free(mHandleStruct) + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", [GetType]().Name, mHandleStruct.Pointer.ToInt64(), disposing) + Else + Debug.Print("{0} Dispose: [WARNING] Handle is null", [GetType]().Name) + End If + + mHandleStruct = New KUSB_HANDLE(IntPtr.Zero) + mbDisposed = True + End If + End Sub + + ''' Creates/opens a libusbK interface handle from the device list. This is a preferred method. + Protected Function Init(DevInfo As KLST_DEVINFO_HANDLE) As Boolean + Dim success As Boolean = AllKFunctions.LibK_LoadDriverAPI(driverAPI, DevInfo.DriverID) + + If Not success Then + Throw New Exception(String.Format("{0} failed loading Driver API. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + success = driverAPI.Init(mHandleStruct, DevInfo) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing usb device. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + Return True + End Function + + ''' Creates a libusbK handle for the device specified by a file handle. + Protected Function Initialize(DeviceHandle As IntPtr, driverID As KUSB_DRVID) As Boolean + Dim success As Boolean = AllKFunctions.LibK_LoadDriverAPI(driverAPI, CInt(driverID)) + + If Not success Then + Throw New Exception(String.Format("{0} failed loading Driver API. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + success = driverAPI.Initialize(DeviceHandle, mHandleStruct) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing usb device. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + Return True + End Function + + #Region "Public Members" + + ''' Creates/opens a libusbK interface handle from the device list. This is a preferred method. + Public Sub New(DevInfo As KLST_DEVINFO_HANDLE) + Dim success As Boolean = AllKFunctions.LibK_LoadDriverAPI(driverAPI, DevInfo.DriverID) + + If Not success Then + Throw New Exception(String.Format("{0} failed loading Driver API. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + success = driverAPI.Init(mHandleStruct, DevInfo) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing usb device. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + End Sub + + ''' Creates a libusbK handle for the device specified by a file handle. + Public Sub New(DeviceHandle As IntPtr, driverID As KUSB_DRVID) + Dim success As Boolean = AllKFunctions.LibK_LoadDriverAPI(driverAPI, CInt(driverID)) + + If Not success Then + Throw New Exception(String.Format("{0} failed loading Driver API. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + success = driverAPI.Initialize(DeviceHandle, mHandleStruct) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing usb device. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + End Sub + + ''' Aborts all of the pending transfers for a pipe. + Public Overridable Function AbortPipe(PipeID As Byte) As Boolean + Return driverAPI.AbortPipe(mHandleStruct, PipeID) + End Function + + ''' Claims the specified interface by number or index. + Public Overridable Function ClaimInterface(NumberOrIndex As Byte, IsIndex As Boolean) As Boolean + Return driverAPI.ClaimInterface(mHandleStruct, NumberOrIndex, IsIndex) + End Function + + ''' Clones the specified interface handle. + Public Overridable Function Clone(ByRef DstInterfaceHandle As KUSB_HANDLE) As Boolean + Return driverAPI.Clone(mHandleStruct, DstInterfaceHandle) + End Function + + ''' Transmits control data over a default control endpoint. + Public Overridable Function ControlTransfer(SetupPacket As WINUSB_SETUP_PACKET, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + Return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Buffer, BufferLength, LengthTransferred, Overlapped) + End Function + + ''' Transmits control data over a default control endpoint. + Public Overridable Function ControlTransfer(SetupPacket As WINUSB_SETUP_PACKET, Buffer As Array, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + Return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped) + End Function + + ''' Transmits control data over a default control endpoint. + Public Overridable Function ControlTransfer(SetupPacket As WINUSB_SETUP_PACKET, Buffer As Array, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As KOVL_HANDLE) As Boolean + Return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped.Pointer) + End Function + + ''' Transmits control data over a default control endpoint. + Public Overridable Function ControlTransfer(SetupPacket As WINUSB_SETUP_PACKET, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As KOVL_HANDLE) As Boolean + Return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Buffer, BufferLength, LengthTransferred, Overlapped.Pointer) + End Function + + ''' Discards any data that is cached in a pipe. + Public Overridable Function FlushPipe(PipeID As Byte) As Boolean + Return driverAPI.FlushPipe(mHandleStruct, PipeID) + End Function + + ''' Calls the dispose method. + Public Overridable Sub Free() + Dispose() + End Sub + + ''' Gets the alternate setting for the specified interface. + Public Overridable Function GetAltInterface(NumberOrIndex As Byte, IsIndex As Boolean, ByRef AltSettingNumber As Byte) As Boolean + Return driverAPI.GetAltInterface(mHandleStruct, NumberOrIndex, IsIndex, AltSettingNumber) + End Function + + ''' Retrieves a handle for an associated interface. + Public Overridable Function GetAssociatedInterface(AssociatedInterfaceIndex As Byte, ByRef AssociatedInterfaceHandle As KUSB_HANDLE) As Boolean + Return driverAPI.GetAssociatedInterface(mHandleStruct, AssociatedInterfaceIndex, AssociatedInterfaceHandle) + End Function + + ''' Gets the device current configuration number. + Public Overridable Function GetConfiguration(ByRef ConfigurationNumber As Byte) As Boolean + Return driverAPI.GetConfiguration(mHandleStruct, ConfigurationNumber) + End Function + + ''' Gets the current alternate interface setting for an interface. + Public Overridable Function GetCurrentAlternateSetting(ByRef AltSettingNumber As Byte) As Boolean + Return driverAPI.GetCurrentAlternateSetting(mHandleStruct, AltSettingNumber) + End Function + + ''' Retrieves the current USB frame number. + Public Overridable Function GetCurrentFrameNumber(ByRef FrameNumber As Integer) As Boolean + Return driverAPI.GetCurrentFrameNumber(mHandleStruct, FrameNumber) + End Function + + ''' Gets the requested descriptor. This is a synchronous operation. + Public Overridable Function GetDescriptor(DescriptorType As Byte, Index As Byte, LanguageID As Integer, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer) As Boolean + Return driverAPI.GetDescriptor(mHandleStruct, DescriptorType, Index, CUShort(LanguageID), Buffer, BufferLength, _ + LengthTransferred) + End Function + + ''' Gets the requested descriptor. This is a synchronous operation. + Public Overridable Function GetDescriptor(DescriptorType As Byte, Index As Byte, LanguageID As Integer, Buffer As Array, BufferLength As Integer, ByRef LengthTransferred As Integer) As Boolean + Return driverAPI.GetDescriptor(mHandleStruct, DescriptorType, Index, CUShort(LanguageID), Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, _ + LengthTransferred) + End Function + + ''' Retrieves the results of an overlapped operation on the specified libusbK handle. + Public Overridable Function GetOverlappedResult(Overlapped As IntPtr, ByRef lpNumberOfBytesTransferred As Integer, bWait As Boolean) As Boolean + Return driverAPI.GetOverlappedResult(mHandleStruct, Overlapped, lpNumberOfBytesTransferred, bWait) + End Function + + ''' Retrieves the results of an overlapped operation on the specified libusbK handle. + Public Overridable Function GetOverlappedResult(Overlapped As KOVL_HANDLE, ByRef lpNumberOfBytesTransferred As Integer, bWait As Boolean) As Boolean + Return driverAPI.GetOverlappedResult(mHandleStruct, Overlapped.Pointer, lpNumberOfBytesTransferred, bWait) + End Function + + ''' Gets the policy for a specific pipe (endpoint). + Public Overridable Function GetPipePolicy(PipeID As Byte, PolicyType As Integer, ByRef ValueLength As Integer, Value As IntPtr) As Boolean + Return driverAPI.GetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Value) + End Function + + ''' Gets the policy for a specific pipe (endpoint). + Public Overridable Function GetPipePolicy(PipeID As Byte, PolicyType As Integer, ByRef ValueLength As Integer, Value As Array) As Boolean + Return driverAPI.GetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + End Function + + ''' Gets the power policy for a device. + Public Overridable Function GetPowerPolicy(PolicyType As Integer, ByRef ValueLength As Integer, Value As IntPtr) As Boolean + Return driverAPI.GetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Value) + End Function + + ''' Gets the power policy for a device. + Public Overridable Function GetPowerPolicy(PolicyType As Integer, ByRef ValueLength As Integer, Value As Array) As Boolean + Return driverAPI.GetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + End Function + + ''' Gets a USB device (driver specific) property from usb handle. + Public Overridable Function GetProperty(PropertyType As KUSB_PROPERTY, ByRef PropertySize As Integer, Value As IntPtr) As Boolean + Return driverAPI.GetProperty(mHandleStruct, PropertyType, PropertySize, Value) + End Function + + ''' Gets a USB device (driver specific) property from usb handle. + Public Overridable Function GetProperty(PropertyType As KUSB_PROPERTY, ByRef PropertySize As Integer, Value As Array) As Boolean + Return driverAPI.GetProperty(mHandleStruct, PropertyType, PropertySize, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + End Function + + ''' Gets the handle class structure. + Public ReadOnly Property Handle() As KUSB_HANDLE + Get + Return mHandleStruct + End Get + End Property + + ''' Reads from an isochronous pipe. + Public Overridable Function IsoReadPipe(PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, Overlapped As IntPtr, IsoContext As KISO_CONTEXT) As Boolean + Return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped, IsoContext) + End Function + + ''' Reads from an isochronous pipe. + Public Overridable Function IsoReadPipe(PipeID As Byte, Buffer As Array, BufferLength As Integer, Overlapped As IntPtr, IsoContext As KISO_CONTEXT) As Boolean + Return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped, IsoContext) + End Function + + ''' Reads from an isochronous pipe. + Public Overridable Function IsoReadPipe(PipeID As Byte, Buffer As Array, BufferLength As Integer, Overlapped As KOVL_HANDLE, IsoContext As KISO_CONTEXT) As Boolean + Return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped.Pointer, IsoContext) + End Function + + ''' Reads from an isochronous pipe. + Public Overridable Function IsoReadPipe(PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, Overlapped As KOVL_HANDLE, IsoContext As KISO_CONTEXT) As Boolean + Return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped.Pointer, IsoContext) + End Function + + ''' Writes to an isochronous pipe. + Public Overridable Function IsoWritePipe(PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, Overlapped As IntPtr, IsoContext As KISO_CONTEXT) As Boolean + Return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped, IsoContext) + End Function + + ''' Writes to an isochronous pipe. + Public Overridable Function IsoWritePipe(PipeID As Byte, Buffer As Array, BufferLength As Integer, Overlapped As IntPtr, IsoContext As KISO_CONTEXT) As Boolean + Return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped, IsoContext) + End Function + + ''' Writes to an isochronous pipe. + Public Overridable Function IsoWritePipe(PipeID As Byte, Buffer As Array, BufferLength As Integer, Overlapped As KOVL_HANDLE, IsoContext As KISO_CONTEXT) As Boolean + Return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped.Pointer, IsoContext) + End Function + + ''' Writes to an isochronous pipe. + Public Overridable Function IsoWritePipe(PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, Overlapped As KOVL_HANDLE, IsoContext As KISO_CONTEXT) As Boolean + Return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped.Pointer, IsoContext) + End Function + + ''' Retrieves information about the physical device that is associated with a libusbK handle. + Public Overridable Function QueryDeviceInformation(InformationType As Integer, ByRef BufferLength As Integer, Buffer As IntPtr) As Boolean + Return driverAPI.QueryDeviceInformation(mHandleStruct, InformationType, BufferLength, Buffer) + End Function + + ''' Retrieves the interface descriptor for the specified alternate interface settings for a particular interface handle. + Public Overridable Function QueryInterfaceSettings(AltSettingIndex As Byte, ByRef UsbAltInterfaceDescriptor As USB_INTERFACE_DESCRIPTOR) As Boolean + Return driverAPI.QueryInterfaceSettings(mHandleStruct, AltSettingIndex, UsbAltInterfaceDescriptor) + End Function + + ''' Retrieves information about a pipe that is associated with an interface. + Public Overridable Function QueryPipe(AltSettingNumber As Byte, PipeIndex As Byte, ByRef PipeInformation As WINUSB_PIPE_INFORMATION) As Boolean + Return driverAPI.QueryPipe(mHandleStruct, AltSettingNumber, PipeIndex, PipeInformation) + End Function + + ''' Reads data from the specified pipe. + Public Overridable Function ReadPipe(PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + Return driverAPI.ReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped) + End Function + + ''' Reads data from the specified pipe. + Public Overridable Function ReadPipe(PipeID As Byte, Buffer As Array, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + Return driverAPI.ReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped) + End Function + + ''' Reads data from the specified pipe. + Public Overridable Function ReadPipe(PipeID As Byte, Buffer As Array, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As KOVL_HANDLE) As Boolean + Return driverAPI.ReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped.Pointer) + End Function + + ''' Reads data from the specified pipe. + Public Overridable Function ReadPipe(PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As KOVL_HANDLE) As Boolean + Return driverAPI.ReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped.Pointer) + End Function + + ''' Releases the specified interface by number or index. + Public Overridable Function ReleaseInterface(NumberOrIndex As Byte, IsIndex As Boolean) As Boolean + Return driverAPI.ReleaseInterface(mHandleStruct, NumberOrIndex, IsIndex) + End Function + + ''' Resets the usb device of the specified interface handle. (port cycle). + Public Overridable Function ResetDevice() As Boolean + Return driverAPI.ResetDevice(mHandleStruct) + End Function + + ''' Resets the data toggle and clears the stall condition on a pipe. + Public Overridable Function ResetPipe(PipeID As Byte) As Boolean + Return driverAPI.ResetPipe(mHandleStruct, PipeID) + End Function + + ''' Selects the specified interface by number or index as the current interface. + Public Overridable Function SelectInterface(NumberOrIndex As Byte, IsIndex As Boolean) As Boolean + Return driverAPI.SelectInterface(mHandleStruct, NumberOrIndex, IsIndex) + End Function + + ''' Sets the alternate setting of the specified interface. + Public Overridable Function SetAltInterface(NumberOrIndex As Byte, IsIndex As Boolean, AltSettingNumber As Byte) As Boolean + Return driverAPI.SetAltInterface(mHandleStruct, NumberOrIndex, IsIndex, AltSettingNumber) + End Function + + ''' Sets the device configuration number. + Public Overridable Function SetConfiguration(ConfigurationNumber As Byte) As Boolean + Return driverAPI.SetConfiguration(mHandleStruct, ConfigurationNumber) + End Function + + ''' Sets the alternate setting of an interface. + Public Overridable Function SetCurrentAlternateSetting(AltSettingNumber As Byte) As Boolean + Return driverAPI.SetCurrentAlternateSetting(mHandleStruct, AltSettingNumber) + End Function + + ''' Sets the policy for a specific pipe associated with an endpoint on the device. This is a synchronous operation. + Public Overridable Function SetPipePolicy(PipeID As Byte, PolicyType As Integer, ValueLength As Integer, Value As IntPtr) As Boolean + Return driverAPI.SetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Value) + End Function + + ''' Sets the policy for a specific pipe associated with an endpoint on the device. This is a synchronous operation. + Public Overridable Function SetPipePolicy(PipeID As Byte, PolicyType As Integer, ValueLength As Integer, Value As Array) As Boolean + Return driverAPI.SetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + End Function + + ''' Sets the power policy for a device. + Public Overridable Function SetPowerPolicy(PolicyType As Integer, ValueLength As Integer, Value As IntPtr) As Boolean + Return driverAPI.SetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Value) + End Function + + ''' Sets the power policy for a device. + Public Overridable Function SetPowerPolicy(PolicyType As Integer, ValueLength As Integer, Value As Array) As Boolean + Return driverAPI.SetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + End Function + + ''' Writes data to a pipe. + Public Overridable Function WritePipe(PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + Return driverAPI.WritePipe(mHandleStruct, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped) + End Function + + ''' Writes data to a pipe. + Public Overridable Function WritePipe(PipeID As Byte, Buffer As Array, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + Return driverAPI.WritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped) + End Function + + ''' Writes data to a pipe. + Public Overridable Function WritePipe(PipeID As Byte, Buffer As Array, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As KOVL_HANDLE) As Boolean + Return driverAPI.WritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped.Pointer) + End Function + + ''' Writes data to a pipe. + Public Overridable Function WritePipe(PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As KOVL_HANDLE) As Boolean + Return driverAPI.WritePipe(mHandleStruct, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped.Pointer) + End Function + + #End Region + End Class + + Public Class OvlK + Implements IDisposable + Protected mHandleStruct As KOVL_POOL_HANDLE + Protected mbDisposed As Boolean + + Protected Sub New() + End Sub + + #Region "IDisposable Members" + + ''' Explicitly closes and frees the handle. + Public Overridable Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub + + #End Region + + Protected Overrides Sub Finalize() + Try + Dispose(False) + Finally + MyBase.Finalize() + End Try + End Sub + + Protected Overridable Sub Dispose(disposing As Boolean) + If Not mbDisposed Then + If mHandleStruct.Pointer <> IntPtr.Zero Then + AllKFunctions.OvlK_Free(mHandleStruct) + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", [GetType]().Name, mHandleStruct.Pointer.ToInt64(), disposing) + Else + Debug.Print("{0} Dispose: [WARNING] Handle is null", [GetType]().Name) + End If + + mHandleStruct = New KOVL_POOL_HANDLE(IntPtr.Zero) + mbDisposed = True + End If + End Sub + + ''' Creates a new overlapped pool. + Protected Function Init(UsbHandle As KUSB_HANDLE, MaxOverlappedCount As Integer, Flags As KOVL_POOL_FLAG) As Boolean + Dim success As Boolean = AllKFunctions.OvlK_Init(mHandleStruct, UsbHandle, MaxOverlappedCount, Flags) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + Return True + End Function + + #Region "Public Members" + + ''' Creates a new overlapped pool. + Public Sub New(UsbHandle As KUSB_HANDLE, MaxOverlappedCount As Integer, Flags As KOVL_POOL_FLAG) + Dim success As Boolean = AllKFunctions.OvlK_Init(mHandleStruct, UsbHandle, MaxOverlappedCount, Flags) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + End Sub + + ''' Gets a preallocated \c OverlappedK structure from the specified/default pool. + Public Overridable Function Acquire(ByRef OverlappedK As KOVL_HANDLE) As Boolean + Return AllKFunctions.OvlK_Acquire(OverlappedK, mHandleStruct) + End Function + + ''' Calls the dispose method. + Public Overridable Sub Free() + Dispose() + End Sub + + ''' Returns the internal event handle used to signal IO operations. + Public Overridable Function GetEventHandle(OverlappedK As KOVL_HANDLE) As IntPtr + Return AllKFunctions.OvlK_GetEventHandle(OverlappedK) + End Function + + ''' Gets the handle class structure. + Public ReadOnly Property Handle() As KOVL_POOL_HANDLE + Get + Return mHandleStruct + End Get + End Property + + ''' Checks for i/o completion; returns immediately. (polling) + Public Overridable Function IsComplete(OverlappedK As KOVL_HANDLE) As Boolean + Return AllKFunctions.OvlK_IsComplete(OverlappedK) + End Function + + ''' Initializes an overlappedK for re-use. The overlappedK is not return to its pool. + Public Overridable Function ReUse(OverlappedK As KOVL_HANDLE) As Boolean + Return AllKFunctions.OvlK_ReUse(OverlappedK) + End Function + + ''' Returns an \c OverlappedK structure to it's pool. + Public Overridable Function Release(OverlappedK As KOVL_HANDLE) As Boolean + Return AllKFunctions.OvlK_Release(OverlappedK) + End Function + + ''' Waits for overlapped I/O completion, and performs actions specified in \c WaitFlags. + Public Overridable Function Wait(OverlappedK As KOVL_HANDLE, TimeoutMS As Integer, WaitFlags As KOVL_WAIT_FLAG, ByRef TransferredLength As Integer) As Boolean + Return AllKFunctions.OvlK_Wait(OverlappedK, TimeoutMS, WaitFlags, TransferredLength) + End Function + + ''' Waits for overlapped I/O completion, cancels on a timeout error and always releases the OvlK handle back to its pool. + Public Overridable Function WaitAndRelease(OverlappedK As KOVL_HANDLE, TimeoutMS As Integer, ByRef TransferredLength As Integer) As Boolean + Return AllKFunctions.OvlK_WaitAndRelease(OverlappedK, TimeoutMS, TransferredLength) + End Function + + ''' Waits for overlapped I/O completion on the oldest acquired OverlappedK handle and performs actions specified in \c WaitFlags. + Public Overridable Function WaitOldest(ByRef OverlappedK As KOVL_HANDLE, TimeoutMS As Integer, WaitFlags As KOVL_WAIT_FLAG, ByRef TransferredLength As Integer) As Boolean + Return AllKFunctions.OvlK_WaitOldest(mHandleStruct, OverlappedK, TimeoutMS, WaitFlags, TransferredLength) + End Function + + ''' Waits for overlapped I/O completion, cancels on a timeout error. + Public Overridable Function WaitOrCancel(OverlappedK As KOVL_HANDLE, TimeoutMS As Integer, ByRef TransferredLength As Integer) As Boolean + Return AllKFunctions.OvlK_WaitOrCancel(OverlappedK, TimeoutMS, TransferredLength) + End Function + + #End Region + End Class + + Public Class StmK + Implements IDisposable + Protected mHandleStruct As KSTM_HANDLE + Protected mbDisposed As Boolean + + Protected Sub New() + End Sub + + #Region "IDisposable Members" + + ''' Explicitly closes and frees the handle. + Public Overridable Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub + + #End Region + + Protected Overrides Sub Finalize() + Try + Dispose(False) + Finally + MyBase.Finalize() + End Try + End Sub + + Protected Overridable Sub Dispose(disposing As Boolean) + If Not mbDisposed Then + If mHandleStruct.Pointer <> IntPtr.Zero Then + AllKFunctions.StmK_Free(mHandleStruct) + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", [GetType]().Name, mHandleStruct.Pointer.ToInt64(), disposing) + Else + Debug.Print("{0} Dispose: [WARNING] Handle is null", [GetType]().Name) + End If + + mHandleStruct = New KSTM_HANDLE(IntPtr.Zero) + mbDisposed = True + End If + End Sub + + ''' Initializes a new uni-directional pipe stream. + Protected Function Init(UsbHandle As KUSB_HANDLE, PipeID As Byte, MaxTransferSize As Integer, MaxPendingTransfers As Integer, MaxPendingIO As Integer, ByRef Callbacks As KSTM_CALLBACK, _ + Flags As KSTM_FLAG) As Boolean + Dim success As Boolean = AllKFunctions.StmK_Init(mHandleStruct, UsbHandle, PipeID, MaxTransferSize, MaxPendingTransfers, MaxPendingIO, _ + Callbacks, Flags) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + Return True + End Function + + #Region "Public Members" + + ''' Initializes a new uni-directional pipe stream. + Public Sub New(UsbHandle As KUSB_HANDLE, PipeID As Byte, MaxTransferSize As Integer, MaxPendingTransfers As Integer, MaxPendingIO As Integer, ByRef Callbacks As KSTM_CALLBACK, _ + Flags As KSTM_FLAG) + Dim success As Boolean = AllKFunctions.StmK_Init(mHandleStruct, UsbHandle, PipeID, MaxTransferSize, MaxPendingTransfers, MaxPendingIO, _ + Callbacks, Flags) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + End Sub + + ''' Calls the dispose method. + Public Overridable Sub Free() + Dispose() + End Sub + + ''' Gets the handle class structure. + Public ReadOnly Property Handle() As KSTM_HANDLE + Get + Return mHandleStruct + End Get + End Property + + ''' Reads data from the stream buffer. + Public Overridable Function Read(Buffer As IntPtr, Offset As Integer, Length As Integer, ByRef TransferredLength As Integer) As Boolean + Return AllKFunctions.StmK_Read(mHandleStruct, Buffer, Offset, Length, TransferredLength) + End Function + + ''' Reads data from the stream buffer. + Public Overridable Function Read(Buffer As Array, Offset As Integer, Length As Integer, ByRef TransferredLength As Integer) As Boolean + Return AllKFunctions.StmK_Read(mHandleStruct, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), Offset, Length, TransferredLength) + End Function + + ''' Starts the internal stream thread. + Public Overridable Function Start() As Boolean + Return AllKFunctions.StmK_Start(mHandleStruct) + End Function + + ''' Stops the internal stream thread. + Public Overridable Function [Stop](TimeoutCancelMS As Integer) As Boolean + Return AllKFunctions.StmK_Stop(mHandleStruct, TimeoutCancelMS) + End Function + + ''' Writes data to the stream buffer. + Public Overridable Function Write(Buffer As IntPtr, Offset As Integer, Length As Integer, ByRef TransferredLength As Integer) As Boolean + Return AllKFunctions.StmK_Write(mHandleStruct, Buffer, Offset, Length, TransferredLength) + End Function + + ''' Writes data to the stream buffer. + Public Overridable Function Write(Buffer As Array, Offset As Integer, Length As Integer, ByRef TransferredLength As Integer) As Boolean + Return AllKFunctions.StmK_Write(mHandleStruct, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), Offset, Length, TransferredLength) + End Function + + #End Region + End Class + + Public Class IsoK + Implements IDisposable + Protected mHandleStruct As KISO_CONTEXT + Protected mbDisposed As Boolean + + Protected Sub New() + End Sub + + #Region "IDisposable Members" + + ''' Explicitly closes and frees the handle. + Public Overridable Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub + + #End Region + + Protected Overrides Sub Finalize() + Try + Dispose(False) + Finally + MyBase.Finalize() + End Try + End Sub + + Protected Overridable Sub Dispose(disposing As Boolean) + If Not mbDisposed Then + If mHandleStruct.Pointer <> IntPtr.Zero Then + AllKFunctions.IsoK_Free(mHandleStruct) + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", [GetType]().Name, mHandleStruct.Pointer.ToInt64(), disposing) + Else + Debug.Print("{0} Dispose: [WARNING] Handle is null", [GetType]().Name) + End If + + mHandleStruct = New KISO_CONTEXT(IntPtr.Zero) + mbDisposed = True + End If + End Sub + + ''' Creates a new isochronous transfer context. + Protected Function Init(NumberOfPackets As Integer, StartFrame As Integer) As Boolean + Dim success As Boolean = AllKFunctions.IsoK_Init(mHandleStruct, NumberOfPackets, StartFrame) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + Return True + End Function + + #Region "Nested Structs" + + _ + Private Structure KISO_CONTEXT_MAP + ''' Additional ISO transfer flags. See \ref KISO_FLAG. + Private ReadOnly Flags As KISO_FLAG + + ''' Specifies the frame number that the transfer should begin on (0 for ASAP). + Private ReadOnly StartFrame As Integer + + ''' Contains the number of packets that completed with an error condition on return from the host controller driver. + Private ReadOnly ErrorCount As Short + + ''' Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + Private ReadOnly NumberOfPackets As Short + + ''' Contains the URB Hdr.Status value on return from the host controller driver. + Private ReadOnly UrbHdrStatus As Integer + End Structure + + #End Region + + #Region "Public Members" + + ''' Creates a new isochronous transfer context. + Public Sub New(NumberOfPackets As Integer, StartFrame As Integer) + Dim success As Boolean = AllKFunctions.IsoK_Init(mHandleStruct, NumberOfPackets, StartFrame) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + End Sub + + ''' Convenience function for enumerating ISO packets of an isochronous transfer context. + Public Overridable Function EnumPackets(EnumPackets As KISO_ENUM_PACKETS_CB, StartPacketIndex As Integer, UserState As IntPtr) As Boolean + Return AllKFunctions.IsoK_EnumPackets(mHandleStruct, EnumPackets, StartPacketIndex, UserState) + End Function + + ''' Contains the number of packets that completed with an error condition on return from the host controller driver. + Public Property ErrorCount() As Short + Get + Return Marshal.ReadInt16(mHandleStruct.Pointer, ofsErrorCount) + End Get + Set + Marshal.WriteInt16(mHandleStruct.Pointer, ofsErrorCount, value) + End Set + End Property + + ''' Additional ISO transfer flags. See \ref KISO_FLAG. + Public Property Flags() As KISO_FLAG + Get + Return CType(Marshal.ReadInt32(mHandleStruct.Pointer, ofsFlags), KISO_FLAG) + End Get + Set + Marshal.WriteInt32(mHandleStruct.Pointer, ofsFlags, CInt(value)) + End Set + End Property + + ''' Calls the dispose method. + Public Overridable Sub Free() + Dispose() + End Sub + + ''' Convenience function for getting all fields of a \ref KISO_PACKET. + Public Overridable Function GetPacket(PacketIndex As Integer, ByRef IsoPacket As KISO_PACKET) As Boolean + Return AllKFunctions.IsoK_GetPacket(mHandleStruct, PacketIndex, IsoPacket) + End Function + + ''' Gets the handle class structure. + Public ReadOnly Property Handle() As KISO_CONTEXT + Get + Return mHandleStruct + End Get + End Property + + ''' Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + Public Property NumberOfPackets() As Short + Get + Return Marshal.ReadInt16(mHandleStruct.Pointer, ofsNumberOfPackets) + End Get + Set + Marshal.WriteInt16(mHandleStruct.Pointer, ofsNumberOfPackets, value) + End Set + End Property + + ''' Convenience function for re-using an isochronous transfer context in a subsequent request. + Public Overridable Function ReUse() As Boolean + Return AllKFunctions.IsoK_ReUse(mHandleStruct) + End Function + + ''' Convenience function for setting all fields of a \ref KISO_PACKET. + Public Overridable Function SetPacket(PacketIndex As Integer, ByRef IsoPacket As KISO_PACKET) As Boolean + Return AllKFunctions.IsoK_SetPacket(mHandleStruct, PacketIndex, IsoPacket) + End Function + + ''' Convenience function for setting the offset of all ISO packets of an isochronous transfer context. + Public Overridable Function SetPackets(PacketSize As Integer) As Boolean + Return AllKFunctions.IsoK_SetPackets(mHandleStruct, PacketSize) + End Function + + ''' Specifies the frame number that the transfer should begin on (0 for ASAP). + Public Property StartFrame() As Integer + Get + Return Marshal.ReadInt32(mHandleStruct.Pointer, ofsStartFrame) + End Get + Set + Marshal.WriteInt32(mHandleStruct.Pointer, ofsStartFrame, value) + End Set + End Property + + ''' Contains the URB Hdr.Status value on return from the host controller driver. + Public Property UrbHdrStatus() As Integer + Get + Return Marshal.ReadInt32(mHandleStruct.Pointer, ofsUrbHdrStatus) + End Get + Set + Marshal.WriteInt32(mHandleStruct.Pointer, ofsUrbHdrStatus, value) + End Set + End Property + + #End Region + + #Region "Private Members" + + Private Shared ReadOnly ofsErrorCount As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "ErrorCount").ToInt32() + Private Shared ReadOnly ofsFlags As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "Flags").ToInt32() + Private Shared ReadOnly ofsNumberOfPackets As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "NumberOfPackets").ToInt32() + Private Shared ReadOnly ofsStartFrame As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "StartFrame").ToInt32() + Private Shared ReadOnly ofsUrbHdrStatus As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "UrbHdrStatus").ToInt32() + + #End Region + End Class +End Namespace diff --git a/Old Matlab Interface/.svn/pristine/18/1878abed33b62f38495f26e323231de6640f0b3b.svn-base b/Old Matlab Interface/.svn/pristine/18/1878abed33b62f38495f26e323231de6640f0b3b.svn-base new file mode 100644 index 00000000..30bd56e2 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/18/1878abed33b62f38495f26e323231de6640f0b3b.svn-base @@ -0,0 +1,25 @@ +%vdrop = 0 + +% for in = 1:10 +% setpsu(in) +% pause(5) +% end + +% clear all +% clc +% +% ro=22; + +vout22 = [0.38 1.32 2.26 3.25 4.19 5.12 6.12 7.05 7.93 8.94]; +iout22 = vout22/22; + +vout220 = [0.36 1.32 2.25 3.24 4.18 5.12 6.12 7.05 8.00 8.99]; + +vout_oc = [0.41 1.37 2.30 3.29 4.23 5.17 6.16 7.10 8.04 9.04]; + +p_oc = polyfit(vout_oc, 1:10, 1); +polyval(p_oc, 1:10); + +vos_22 = vout_oc - vout22; +p_ios = polyfit(1:10, (22/ro) * vos_22, 1); +polyval(p_ios, 1:10); diff --git a/Old Matlab Interface/.svn/pristine/1b/1bc1bc5b7cd5d326b0581de8e57be48ed902a1bf.svn-base b/Old Matlab Interface/.svn/pristine/1b/1bc1bc5b7cd5d326b0581de8e57be48ed902a1bf.svn-base new file mode 100644 index 00000000..cf20bd79 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/1b/1bc1bc5b7cd5d326b0581de8e57be48ed902a1bf.svn-base @@ -0,0 +1,10 @@ +function [returnval] = seconds_recorded() + +global saved_waveform_ch1 +global scope_mode + +if scope_mode == 5 + returnval = (length(saved_waveform_ch1)-750)/750000 +else + returnval = (length(saved_waveform_ch1)-750)/375000 +end \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/1c/1c4358dca057b00006ed90c0ffca5a5971e2adcd.svn-base b/Old Matlab Interface/.svn/pristine/1c/1c4358dca057b00006ed90c0ffca5a5971e2adcd.svn-base new file mode 100644 index 00000000..f5b0ea0c --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/1c/1c4358dca057b00006ed90c0ffca5a5971e2adcd.svn-base @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/1d/1d1e0e7eb037bb37f68f7f6d3f68d1137f1fe193.svn-base b/Old Matlab Interface/.svn/pristine/1d/1d1e0e7eb037bb37f68f7f6d3f68d1137f1fe193.svn-base new file mode 100644 index 00000000..7d562888 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/1d/1d1e0e7eb037bb37f68f7f6d3f68d1137f1fe193.svn-base @@ -0,0 +1,375000 @@ +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +36 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +77 +76 +76 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +119 +126 +125 +130 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +158 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +178 +179 +183 +182 +183 +185 +185 +188 +188 +190 +191 +190 +194 +195 +197 +197 +196 +198 +198 +200 +200 +201 +201 +200 +202 +202 +202 +204 +205 +204 +204 +205 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +201 +201 +200 +200 +201 +198 +198 +196 +197 +194 +194 +195 +191 +191 +188 +189 +188 +184 +185 +185 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +146 +147 +143 +143 +139 +139 +140 +133 +133 +130 +129 +126 +125 +125 +119 +119 +116 +116 +115 +110 +109 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +77 +72 +72 +72 +68 +68 +65 +64 +65 +59 +58 +54 +55 +54 +51 +51 +46 +47 +47 +43 +43 +41 +41 +40 +37 +36 +33 +32 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +46 +50 +50 +54 +54 +54 +59 +58 +59 +58 +59 +65 +64 +68 +68 +69 +72 +72 +77 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +110 +109 +115 +116 +119 +119 +120 +125 +125 +129 +129 +132 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +168 +169 +173 +173 +175 +175 +178 +178 +178 +183 +183 +184 +184 +184 +188 +189 +191 +191 +191 +195 +194 +197 +196 +196 +199 +198 +200 +201 +201 +200 +200 +202 +202 +205 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +203 +202 +201 +200 +200 +201 +201 +198 +198 +198 +196 +196 +197 +196 +196 +194 +194 +191 +191 +190 +189 +189 +184 +184 +185 +182 +183 +178 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +126 +120 +119 +116 +115 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +65 +65 +58 +59 +55 +55 +55 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +46 +46 +47 +51 +51 +55 +54 +55 +58 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +91 +90 +96 +96 +96 +99 +100 +105 +106 +106 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +182 +182 +184 +185 +189 +188 +188 +190 +191 +194 +195 +195 +196 +196 +198 +198 +201 +200 +201 +200 +200 +203 +202 +203 +204 +204 +205 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +204 +205 +205 +205 +205 +202 +202 +202 +202 +202 +200 +201 +200 +200 +200 +198 +199 +197 +197 +195 +195 +195 +190 +190 +188 +189 +188 +185 +185 +183 +183 +182 +179 +179 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +164 +160 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +134 +129 +129 +125 +125 +126 +120 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +59 +58 +58 +55 +54 +51 +50 +50 +46 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +26 +27 +27 +31 +31 +30 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +44 +47 +46 +51 +50 +54 +54 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +83 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +120 +125 +125 +125 +130 +129 +133 +133 +133 +139 +138 +143 +143 +146 +147 +148 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +184 +189 +189 +189 +191 +190 +195 +195 +195 +196 +196 +198 +199 +199 +200 +200 +200 +200 +200 +203 +203 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +203 +203 +202 +200 +200 +200 +200 +198 +199 +198 +196 +196 +194 +194 +195 +190 +190 +191 +191 +190 +188 +188 +185 +184 +185 +183 +183 +178 +179 +175 +175 +174 +173 +173 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +132 +129 +129 +125 +126 +120 +119 +119 +116 +116 +110 +110 +109 +106 +106 +100 +100 +100 +97 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +51 +51 +51 +47 +47 +42 +42 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +59 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +100 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +129 +129 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +156 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +182 +183 +185 +185 +188 +189 +189 +191 +190 +194 +194 +196 +196 +197 +198 +198 +201 +201 +200 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +204 +204 +202 +203 +203 +200 +200 +200 +200 +199 +198 +199 +196 +197 +194 +194 +195 +190 +190 +188 +188 +188 +185 +185 +183 +183 +183 +179 +178 +175 +175 +175 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +130 +126 +125 +119 +120 +116 +115 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +65 +64 +58 +58 +54 +54 +54 +50 +50 +46 +46 +47 +43 +43 +41 +41 +40 +37 +37 +33 +32 +33 +31 +31 +27 +26 +25 +24 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +18 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +42 +46 +47 +47 +50 +50 +54 +54 +55 +58 +59 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +115 +116 +120 +120 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +158 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +180 +183 +183 +184 +185 +188 +189 +188 +191 +191 +195 +194 +195 +197 +196 +199 +198 +198 +200 +201 +201 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +199 +199 +197 +196 +195 +194 +195 +190 +191 +189 +189 +188 +185 +184 +182 +182 +183 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +150 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +125 +126 +120 +119 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +95 +96 +96 +90 +89 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +55 +54 +50 +51 +47 +46 +46 +43 +43 +41 +41 +42 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +50 +50 +55 +55 +58 +59 +59 +64 +64 +68 +68 +68 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +119 +120 +125 +126 +129 +129 +134 +133 +134 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +172 +173 +174 +175 +175 +179 +179 +182 +183 +182 +184 +184 +189 +188 +188 +190 +190 +194 +194 +194 +197 +197 +198 +198 +199 +201 +201 +200 +201 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +199 +196 +197 +195 +194 +195 +191 +191 +189 +188 +184 +185 +184 +182 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +125 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +55 +50 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +34 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +50 +50 +54 +54 +55 +58 +58 +64 +64 +69 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +119 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +178 +179 +178 +178 +179 +183 +183 +185 +184 +184 +188 +189 +191 +190 +192 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +202 +202 +204 +204 +204 +205 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +200 +201 +200 +201 +201 +198 +198 +196 +196 +194 +194 +194 +190 +190 +188 +188 +189 +185 +184 +183 +183 +182 +178 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +120 +119 +120 +115 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +58 +55 +55 +54 +50 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +15 +15 +15 +16 +17 +17 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +47 +46 +47 +51 +51 +55 +54 +54 +58 +58 +64 +65 +65 +68 +68 +73 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +120 +126 +126 +126 +129 +130 +133 +134 +133 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +185 +184 +184 +189 +188 +190 +190 +191 +194 +194 +195 +195 +195 +197 +196 +198 +198 +198 +200 +201 +200 +200 +201 +203 +203 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +201 +198 +198 +197 +197 +196 +194 +195 +190 +190 +191 +189 +188 +184 +184 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +164 +161 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +144 +143 +139 +140 +134 +133 +130 +129 +129 +125 +126 +120 +119 +120 +116 +116 +115 +116 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +59 +59 +59 +55 +55 +51 +50 +49 +47 +46 +43 +43 +40 +41 +41 +37 +37 +33 +32 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +26 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +54 +54 +59 +59 +59 +64 +64 +68 +68 +72 +72 +72 +76 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +99 +105 +106 +109 +109 +111 +115 +116 +120 +120 +125 +126 +126 +129 +129 +133 +134 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +156 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +179 +183 +182 +185 +185 +185 +188 +188 +191 +190 +194 +195 +195 +196 +196 +198 +198 +198 +201 +201 +200 +201 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +199 +197 +196 +195 +194 +190 +191 +190 +188 +189 +184 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +65 +64 +65 +58 +58 +54 +54 +51 +50 +51 +46 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +20 +19 +21 +21 +21 +25 +24 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +46 +47 +47 +51 +50 +55 +54 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +101 +106 +105 +109 +110 +110 +115 +116 +119 +119 +120 +126 +126 +126 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +172 +173 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +188 +189 +190 +190 +190 +194 +195 +196 +196 +196 +198 +198 +200 +201 +200 +200 +200 +202 +202 +203 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +205 +204 +204 +205 +204 +202 +203 +203 +200 +201 +200 +200 +198 +198 +198 +196 +196 +194 +195 +194 +190 +191 +189 +188 +189 +185 +184 +183 +182 +182 +179 +179 +174 +175 +175 +172 +173 +169 +169 +165 +164 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +59 +58 +54 +55 +55 +54 +55 +51 +51 +47 +46 +47 +43 +43 +41 +41 +39 +37 +37 +33 +33 +31 +31 +31 +28 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +51 +51 +55 +55 +58 +58 +58 +65 +64 +68 +68 +69 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +100 +105 +106 +106 +106 +106 +110 +110 +115 +116 +115 +120 +120 +126 +125 +126 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +174 +179 +178 +179 +183 +182 +184 +185 +185 +189 +189 +190 +190 +191 +194 +195 +196 +196 +197 +199 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +199 +198 +196 +197 +195 +194 +194 +190 +191 +188 +189 +189 +185 +184 +182 +183 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +130 +130 +125 +126 +126 +119 +119 +120 +119 +119 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +65 +64 +64 +58 +58 +55 +54 +53 +50 +50 +46 +47 +43 +43 +42 +41 +41 +37 +37 +37 +32 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +58 +59 +59 +65 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +116 +120 +120 +120 +125 +126 +129 +130 +129 +133 +133 +134 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +188 +189 +191 +190 +194 +194 +194 +196 +196 +198 +199 +198 +201 +201 +200 +200 +201 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +205 +205 +205 +202 +202 +202 +200 +200 +200 +201 +200 +198 +199 +196 +197 +195 +194 +194 +191 +191 +188 +189 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +156 +157 +157 +151 +151 +147 +147 +147 +144 +143 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +123 +120 +119 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +54 +51 +50 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +32 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +50 +51 +51 +54 +55 +58 +59 +58 +64 +65 +64 +64 +64 +69 +68 +73 +72 +72 +76 +76 +82 +82 +83 +86 +87 +90 +90 +95 +96 +96 +100 +100 +105 +106 +106 +110 +109 +109 +110 +110 +115 +116 +119 +120 +120 +125 +125 +130 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +174 +178 +179 +179 +182 +183 +185 +184 +184 +189 +189 +190 +191 +190 +195 +194 +196 +196 +197 +199 +198 +201 +200 +201 +200 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +205 +205 +204 +203 +202 +202 +200 +200 +200 +201 +200 +198 +198 +196 +197 +196 +195 +194 +191 +190 +191 +188 +189 +185 +185 +185 +183 +182 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +115 +116 +115 +115 +115 +110 +110 +106 +106 +106 +99 +100 +96 +96 +93 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +69 +64 +64 +59 +59 +58 +55 +54 +51 +50 +46 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +16 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +55 +59 +58 +64 +64 +68 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +120 +119 +125 +125 +130 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +183 +182 +184 +184 +188 +188 +189 +191 +191 +195 +194 +197 +197 +196 +198 +199 +200 +200 +201 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +207 +206 +207 +206 +206 +206 +207 +207 +206 +207 +206 +206 +204 +204 +204 +205 +204 +202 +202 +202 +200 +201 +200 +201 +201 +198 +199 +197 +197 +197 +195 +195 +190 +190 +188 +189 +189 +185 +184 +183 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +160 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +116 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +59 +59 +54 +54 +50 +50 +50 +46 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +18 +17 +14 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +58 +59 +59 +65 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +97 +95 +100 +100 +105 +106 +106 +109 +110 +116 +115 +116 +120 +119 +125 +126 +125 +129 +129 +134 +133 +134 +139 +139 +143 +143 +146 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +188 +188 +188 +191 +191 +194 +194 +194 +197 +197 +198 +198 +198 +200 +201 +200 +200 +200 +203 +202 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +205 +204 +204 +204 +202 +202 +201 +200 +201 +200 +201 +199 +198 +196 +196 +197 +195 +194 +190 +191 +190 +188 +189 +189 +189 +188 +184 +185 +183 +183 +182 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +131 +129 +129 +125 +125 +119 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +55 +54 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +28 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +46 +47 +47 +51 +51 +54 +54 +54 +59 +58 +58 +58 +59 +64 +65 +68 +68 +68 +73 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +116 +116 +119 +119 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +152 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +178 +182 +183 +184 +185 +184 +188 +188 +191 +191 +191 +195 +194 +197 +197 +196 +199 +198 +200 +200 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +200 +200 +199 +198 +199 +197 +197 +197 +196 +196 +195 +194 +190 +190 +191 +189 +188 +185 +185 +185 +182 +183 +178 +178 +179 +178 +179 +175 +175 +173 +172 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +134 +133 +130 +129 +129 +125 +125 +119 +119 +120 +115 +116 +109 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +69 +68 +65 +64 +58 +58 +59 +55 +55 +51 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +36 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +58 +58 +58 +64 +64 +69 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +109 +110 +116 +116 +120 +119 +119 +125 +125 +126 +126 +125 +129 +130 +134 +134 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +182 +182 +184 +185 +185 +188 +188 +191 +190 +195 +194 +194 +196 +196 +199 +199 +198 +201 +200 +200 +201 +200 +200 +201 +203 +202 +202 +205 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +197 +194 +195 +195 +190 +190 +189 +189 +188 +185 +185 +185 +184 +184 +183 +183 +179 +179 +178 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +119 +119 +115 +115 +110 +110 +109 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +17 +16 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +54 +58 +58 +64 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +95 +96 +99 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +126 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +183 +182 +183 +184 +185 +188 +188 +188 +191 +190 +195 +194 +194 +196 +196 +198 +198 +198 +200 +201 +200 +200 +201 +203 +203 +205 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +200 +200 +200 +201 +200 +198 +198 +198 +196 +196 +196 +196 +196 +194 +194 +190 +190 +191 +189 +188 +184 +184 +183 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +152 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +126 +120 +119 +119 +116 +115 +110 +109 +110 +105 +106 +100 +100 +100 +96 +96 +89 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +42 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +12 +15 +15 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +46 +47 +47 +50 +50 +55 +55 +55 +59 +58 +64 +65 +68 +69 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +189 +188 +189 +191 +190 +194 +195 +195 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +203 +202 +204 +204 +205 +204 +204 +204 +204 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +196 +195 +194 +195 +190 +191 +188 +188 +189 +185 +185 +183 +183 +183 +178 +179 +175 +174 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +120 +119 +120 +116 +115 +110 +110 +106 +106 +106 +100 +99 +96 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +64 +64 +58 +58 +55 +54 +54 +51 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +22 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +12 +16 +15 +16 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +36 +41 +41 +41 +43 +43 +47 +47 +48 +51 +51 +55 +55 +58 +59 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +120 +119 +125 +126 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +150 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +183 +185 +185 +188 +189 +190 +190 +190 +195 +194 +196 +196 +197 +198 +199 +199 +198 +198 +200 +201 +200 +201 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +197 +197 +194 +194 +194 +191 +191 +189 +188 +189 +185 +184 +183 +183 +183 +178 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +96 +96 +96 +96 +90 +89 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +68 +69 +64 +64 +64 +58 +58 +54 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +22 +21 +21 +21 +19 +20 +17 +18 +16 +15 +16 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +36 +36 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +55 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +188 +188 +189 +191 +191 +195 +194 +194 +196 +196 +198 +198 +199 +200 +201 +201 +200 +202 +203 +202 +204 +204 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +205 +205 +204 +204 +204 +203 +203 +201 +200 +201 +200 +201 +198 +198 +198 +197 +196 +194 +195 +194 +191 +190 +189 +189 +184 +184 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +126 +119 +120 +120 +115 +115 +110 +110 +110 +106 +106 +100 +99 +97 +96 +96 +90 +90 +86 +85 +86 +82 +82 +76 +77 +77 +72 +72 +68 +69 +68 +64 +64 +58 +58 +59 +55 +54 +51 +50 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +26 +26 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +58 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +95 +96 +100 +100 +106 +106 +111 +110 +110 +116 +115 +116 +116 +116 +120 +119 +125 +125 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +148 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +178 +178 +183 +183 +182 +184 +184 +189 +188 +190 +190 +190 +194 +194 +196 +196 +197 +198 +198 +200 +200 +201 +200 +201 +200 +201 +200 +202 +202 +205 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +204 +204 +204 +204 +205 +202 +202 +200 +200 +201 +200 +201 +199 +199 +197 +197 +197 +195 +194 +191 +190 +190 +188 +189 +185 +184 +184 +182 +182 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +119 +116 +115 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +65 +64 +64 +58 +58 +55 +54 +55 +51 +51 +51 +50 +50 +47 +46 +42 +43 +43 +41 +41 +37 +37 +35 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +18 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +18 +18 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +55 +55 +54 +54 +55 +59 +58 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +87 +86 +87 +90 +90 +96 +96 +96 +99 +100 +106 +105 +106 +110 +110 +115 +115 +115 +119 +119 +125 +126 +126 +129 +130 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +183 +182 +185 +184 +189 +188 +189 +191 +191 +191 +190 +191 +194 +194 +197 +196 +197 +198 +199 +201 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +205 +205 +202 +203 +200 +200 +200 +200 +200 +198 +198 +198 +197 +196 +195 +194 +194 +190 +191 +188 +189 +189 +185 +184 +182 +182 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +134 +133 +129 +129 +125 +125 +126 +120 +120 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +69 +64 +64 +58 +58 +59 +54 +55 +50 +50 +49 +47 +47 +42 +43 +41 +41 +41 +36 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +16 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +50 +51 +55 +54 +59 +58 +59 +64 +64 +69 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +115 +116 +119 +119 +120 +125 +125 +129 +129 +129 +133 +134 +134 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +174 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +188 +189 +190 +191 +195 +194 +197 +196 +197 +198 +198 +200 +201 +200 +201 +201 +202 +202 +202 +204 +204 +204 +205 +205 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +207 +206 +204 +204 +205 +204 +204 +202 +202 +202 +200 +201 +201 +200 +201 +198 +199 +196 +197 +194 +195 +195 +191 +191 +189 +188 +189 +185 +185 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +134 +133 +130 +129 +125 +125 +126 +120 +119 +116 +116 +109 +109 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +54 +55 +50 +51 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +47 +47 +47 +50 +51 +55 +54 +55 +58 +58 +64 +64 +64 +69 +68 +72 +72 +73 +77 +76 +82 +82 +82 +86 +86 +90 +90 +97 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +116 +119 +119 +125 +125 +125 +129 +130 +134 +133 +134 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +176 +179 +179 +182 +182 +184 +184 +185 +188 +189 +190 +191 +190 +194 +194 +197 +197 +197 +198 +198 +201 +200 +201 +200 +201 +202 +203 +204 +205 +205 +205 +205 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +207 +206 +204 +204 +204 +204 +205 +202 +202 +201 +201 +201 +200 +201 +199 +198 +198 +197 +196 +194 +195 +195 +190 +191 +188 +189 +188 +185 +184 +183 +182 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +157 +152 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +129 +129 +126 +125 +126 +120 +120 +115 +116 +115 +110 +109 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +77 +76 +72 +72 +69 +68 +68 +64 +65 +64 +65 +65 +58 +59 +55 +54 +55 +51 +50 +47 +47 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +38 +37 +37 +41 +40 +43 +43 +42 +47 +47 +50 +50 +51 +54 +55 +58 +59 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +99 +106 +106 +110 +110 +110 +116 +115 +119 +119 +122 +125 +125 +129 +130 +133 +133 +134 +140 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +183 +184 +185 +188 +189 +188 +191 +191 +194 +195 +195 +196 +197 +198 +198 +200 +201 +200 +200 +200 +202 +202 +202 +204 +204 +204 +205 +204 +207 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +202 +202 +202 +200 +200 +200 +201 +201 +199 +199 +197 +196 +196 +195 +195 +191 +191 +191 +188 +189 +185 +184 +183 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +129 +125 +125 +120 +119 +120 +116 +115 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +54 +51 +50 +51 +47 +46 +42 +42 +42 +41 +41 +37 +37 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +46 +47 +51 +51 +51 +55 +55 +59 +58 +59 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +112 +116 +115 +120 +119 +125 +125 +126 +129 +130 +133 +133 +134 +139 +139 +139 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +189 +191 +191 +194 +194 +196 +196 +196 +199 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +205 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +207 +206 +204 +204 +205 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +199 +199 +196 +197 +196 +195 +195 +191 +191 +189 +188 +189 +184 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +130 +130 +126 +125 +125 +120 +119 +115 +115 +113 +109 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +77 +77 +72 +72 +68 +69 +65 +64 +64 +58 +58 +55 +54 +55 +50 +50 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +32 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +20 +19 +21 +21 +21 +25 +24 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +47 +51 +50 +54 +55 +59 +58 +58 +64 +65 +68 +68 +69 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +106 +105 +110 +109 +115 +116 +116 +119 +120 +119 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +178 +183 +183 +184 +185 +184 +189 +189 +190 +190 +191 +195 +195 +197 +196 +196 +198 +198 +201 +201 +201 +200 +200 +203 +202 +202 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +202 +200 +201 +200 +201 +199 +199 +199 +196 +196 +194 +195 +194 +190 +190 +188 +188 +189 +184 +185 +182 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +139 +133 +133 +130 +130 +127 +125 +125 +119 +119 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +83 +83 +77 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +58 +54 +55 +50 +50 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +47 +47 +47 +50 +51 +55 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +109 +110 +110 +115 +115 +119 +119 +120 +126 +125 +129 +129 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +184 +185 +188 +189 +189 +190 +190 +195 +194 +194 +196 +197 +198 +199 +198 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +198 +198 +196 +197 +195 +195 +194 +191 +190 +188 +188 +189 +184 +185 +183 +183 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +130 +129 +125 +125 +126 +125 +126 +120 +119 +115 +116 +116 +110 +109 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +72 +69 +69 +64 +64 +65 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +56 +58 +59 +64 +64 +69 +68 +68 +72 +73 +76 +76 +76 +82 +82 +82 +82 +82 +86 +87 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +184 +189 +188 +191 +191 +194 +195 +194 +197 +197 +198 +198 +199 +201 +200 +201 +200 +200 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +201 +201 +201 +200 +198 +198 +200 +196 +196 +195 +194 +191 +191 +190 +188 +189 +185 +185 +185 +183 +183 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +168 +167 +165 +165 +160 +161 +157 +157 +157 +151 +151 +147 +148 +147 +143 +143 +143 +143 +143 +139 +139 +133 +134 +134 +129 +129 +125 +126 +121 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +69 +68 +68 +64 +65 +59 +59 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +14 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +20 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +42 +47 +46 +50 +51 +51 +55 +54 +58 +59 +59 +64 +65 +64 +65 +64 +69 +68 +72 +72 +72 +72 +72 +77 +77 +78 +82 +82 +87 +85 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +119 +120 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +178 +179 +183 +182 +184 +184 +184 +189 +189 +191 +190 +191 +195 +194 +196 +196 +196 +198 +199 +201 +200 +201 +201 +200 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +205 +205 +205 +204 +204 +203 +202 +200 +201 +200 +200 +200 +198 +198 +199 +197 +197 +195 +195 +195 +191 +190 +189 +189 +189 +185 +185 +182 +183 +183 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +59 +59 +58 +55 +54 +51 +50 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +42 +43 +47 +46 +47 +47 +47 +50 +51 +55 +55 +55 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +119 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +183 +185 +185 +189 +188 +188 +191 +191 +194 +194 +195 +196 +196 +198 +199 +201 +200 +201 +200 +200 +202 +203 +203 +204 +204 +204 +205 +204 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +204 +204 +206 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +195 +190 +191 +191 +188 +189 +185 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +170 +165 +165 +165 +161 +160 +157 +157 +151 +151 +151 +147 +147 +143 +143 +142 +139 +139 +134 +133 +133 +129 +129 +126 +126 +126 +120 +120 +116 +116 +116 +110 +110 +106 +106 +103 +100 +100 +97 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +65 +65 +65 +58 +58 +55 +54 +50 +50 +50 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +24 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +110 +109 +110 +116 +116 +120 +119 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +162 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +189 +188 +191 +191 +195 +194 +194 +196 +196 +198 +198 +198 +200 +200 +201 +200 +200 +203 +202 +205 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +198 +196 +196 +195 +194 +191 +190 +190 +188 +188 +184 +185 +185 +183 +183 +183 +182 +183 +178 +178 +175 +175 +175 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +120 +119 +115 +116 +110 +110 +107 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +69 +68 +65 +64 +65 +58 +58 +55 +55 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +15 +15 +17 +17 +19 +19 +19 +21 +20 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +47 +51 +51 +51 +55 +54 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +184 +185 +185 +188 +188 +190 +191 +191 +195 +195 +196 +196 +196 +198 +198 +201 +201 +200 +200 +201 +202 +202 +203 +204 +204 +204 +204 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +201 +201 +198 +198 +196 +196 +196 +194 +194 +195 +194 +195 +190 +190 +189 +189 +189 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +158 +158 +151 +151 +147 +147 +148 +143 +143 +139 +139 +135 +134 +133 +129 +129 +126 +126 +125 +119 +119 +115 +115 +115 +109 +109 +106 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +65 +64 +59 +59 +55 +55 +55 +50 +50 +47 +47 +47 +43 +43 +41 +40 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +12 +15 +15 +15 +17 +17 +17 +17 +17 +19 +18 +21 +21 +21 +25 +25 +27 +27 +30 +30 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +119 +120 +126 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +174 +179 +179 +179 +182 +183 +185 +185 +185 +188 +189 +191 +190 +190 +194 +194 +196 +196 +197 +198 +198 +200 +200 +200 +200 +201 +203 +202 +204 +205 +204 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +200 +200 +201 +200 +200 +200 +200 +198 +198 +199 +196 +196 +195 +195 +191 +190 +190 +188 +188 +185 +184 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +126 +119 +119 +115 +115 +116 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +55 +54 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +26 +27 +25 +25 +26 +21 +21 +19 +19 +17 +16 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +42 +46 +47 +51 +50 +54 +55 +54 +58 +58 +65 +64 +64 +69 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +106 +106 +106 +109 +110 +115 +115 +116 +119 +120 +125 +125 +125 +129 +129 +133 +134 +133 +139 +140 +144 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +178 +182 +183 +184 +185 +185 +189 +188 +190 +190 +194 +195 +195 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +196 +197 +194 +195 +190 +191 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +179 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +129 +129 +126 +126 +120 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +87 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +65 +58 +58 +59 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +55 +58 +58 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +95 +96 +100 +99 +106 +105 +106 +110 +109 +116 +115 +116 +119 +119 +125 +125 +125 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +182 +184 +184 +189 +189 +188 +190 +190 +191 +190 +190 +194 +194 +196 +196 +196 +198 +198 +200 +200 +201 +200 +201 +202 +202 +202 +202 +202 +205 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +199 +199 +198 +196 +197 +195 +194 +195 +191 +191 +189 +188 +184 +184 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +119 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +54 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +50 +54 +54 +59 +59 +65 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +116 +116 +116 +119 +120 +125 +126 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +185 +185 +185 +188 +189 +190 +190 +191 +194 +194 +197 +196 +198 +198 +198 +200 +200 +200 +200 +201 +203 +202 +203 +202 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +203 +203 +202 +201 +200 +200 +200 +201 +198 +198 +197 +197 +195 +195 +195 +190 +191 +188 +188 +189 +184 +184 +183 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +129 +125 +125 +119 +119 +119 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +59 +54 +54 +54 +51 +50 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +14 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +51 +51 +54 +55 +59 +59 +59 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +116 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +178 +179 +180 +183 +182 +185 +185 +188 +189 +189 +190 +190 +195 +195 +194 +197 +196 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +200 +200 +198 +199 +198 +196 +196 +195 +194 +194 +191 +190 +189 +189 +189 +184 +185 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +125 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +58 +59 +59 +58 +59 +55 +55 +50 +50 +51 +47 +47 +42 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +50 +55 +55 +59 +58 +58 +64 +64 +68 +68 +69 +72 +72 +77 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +116 +119 +120 +120 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +184 +185 +185 +184 +185 +188 +188 +190 +191 +191 +194 +194 +196 +196 +198 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +201 +200 +200 +200 +200 +199 +198 +199 +196 +196 +194 +194 +195 +190 +190 +189 +188 +184 +184 +185 +182 +183 +179 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +125 +119 +120 +116 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +73 +68 +68 +64 +64 +64 +58 +58 +54 +54 +55 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +47 +50 +50 +55 +55 +56 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +119 +119 +119 +125 +125 +130 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +175 +175 +175 +178 +179 +183 +183 +183 +185 +184 +188 +189 +190 +190 +190 +194 +194 +196 +196 +196 +199 +198 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +205 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +201 +198 +198 +196 +196 +195 +194 +194 +190 +191 +188 +188 +189 +185 +185 +183 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +168 +169 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +120 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +59 +58 +58 +54 +55 +50 +51 +51 +47 +46 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +42 +43 +47 +46 +51 +51 +50 +54 +55 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +115 +116 +116 +119 +120 +125 +125 +125 +129 +130 +133 +133 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +156 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +178 +179 +183 +182 +184 +185 +185 +188 +188 +190 +191 +190 +194 +194 +196 +197 +196 +198 +198 +201 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +196 +196 +195 +194 +194 +190 +190 +189 +188 +188 +185 +184 +182 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +130 +129 +126 +125 +126 +119 +119 +116 +115 +115 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +64 +65 +64 +58 +58 +54 +55 +55 +50 +51 +47 +47 +44 +43 +42 +41 +40 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +26 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +51 +51 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +73 +76 +76 +83 +82 +81 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +117 +119 +120 +125 +125 +130 +129 +130 +133 +134 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +182 +185 +185 +185 +188 +188 +190 +190 +191 +194 +195 +196 +196 +198 +198 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +195 +194 +195 +191 +190 +189 +188 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +140 +134 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +59 +55 +54 +54 +50 +51 +47 +47 +48 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +51 +50 +51 +54 +54 +58 +59 +65 +65 +64 +69 +69 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +89 +96 +96 +96 +100 +100 +105 +106 +109 +110 +110 +115 +116 +120 +119 +120 +125 +125 +126 +126 +125 +130 +130 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +174 +175 +178 +179 +178 +183 +183 +185 +184 +188 +188 +188 +190 +191 +194 +194 +194 +196 +196 +199 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +203 +202 +200 +200 +201 +200 +201 +198 +198 +197 +196 +197 +194 +195 +191 +190 +190 +188 +189 +185 +184 +184 +183 +182 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +130 +129 +127 +125 +125 +119 +119 +116 +115 +116 +109 +110 +106 +106 +105 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +31 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +55 +58 +59 +58 +59 +59 +65 +64 +68 +68 +68 +72 +72 +76 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +127 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +185 +184 +188 +188 +188 +190 +191 +195 +194 +195 +196 +196 +198 +198 +199 +200 +200 +200 +200 +202 +202 +202 +205 +205 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +203 +202 +203 +200 +201 +200 +200 +200 +198 +198 +198 +198 +198 +197 +196 +195 +195 +194 +191 +191 +188 +189 +189 +184 +184 +183 +183 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +156 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +126 +125 +125 +125 +120 +119 +116 +116 +116 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +64 +58 +58 +55 +54 +51 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +50 +54 +54 +59 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +109 +109 +110 +110 +116 +116 +119 +119 +119 +125 +126 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +174 +179 +179 +182 +183 +183 +185 +184 +188 +189 +188 +190 +191 +194 +194 +197 +197 +196 +199 +198 +201 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +205 +204 +203 +202 +202 +200 +200 +200 +200 +200 +199 +199 +196 +196 +197 +195 +194 +190 +190 +189 +188 +188 +185 +184 +182 +182 +183 +178 +179 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +143 +143 +139 +139 +139 +139 +139 +133 +134 +129 +129 +130 +126 +125 +119 +119 +117 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +55 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +47 +46 +51 +51 +55 +54 +54 +58 +58 +65 +64 +64 +68 +67 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +89 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +115 +119 +119 +120 +126 +125 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +174 +175 +179 +179 +183 +183 +185 +184 +185 +188 +189 +190 +191 +191 +194 +195 +194 +195 +194 +196 +196 +198 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +198 +196 +196 +197 +194 +195 +195 +195 +194 +191 +190 +189 +189 +189 +185 +184 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +119 +119 +115 +116 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +51 +50 +46 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +29 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +46 +47 +47 +51 +51 +55 +54 +55 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +119 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +182 +182 +184 +184 +188 +189 +188 +191 +190 +195 +195 +195 +196 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +200 +200 +201 +201 +198 +199 +199 +196 +196 +194 +194 +192 +190 +190 +189 +188 +184 +184 +185 +182 +182 +179 +178 +178 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +146 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +115 +110 +109 +108 +106 +106 +100 +100 +96 +96 +96 +89 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +54 +55 +54 +50 +50 +47 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +54 +55 +54 +58 +58 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +116 +115 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +185 +189 +188 +190 +190 +195 +194 +194 +196 +197 +198 +198 +198 +200 +200 +200 +199 +201 +202 +202 +204 +204 +205 +205 +204 +206 +206 +207 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +200 +196 +197 +194 +194 +190 +191 +190 +189 +188 +185 +185 +184 +182 +183 +183 +183 +182 +179 +178 +174 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +54 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +30 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +15 +15 +16 +17 +17 +19 +20 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +44 +47 +47 +51 +50 +54 +55 +54 +58 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +115 +115 +119 +119 +125 +126 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +184 +189 +188 +188 +191 +191 +195 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +197 +196 +194 +195 +194 +190 +191 +190 +191 +190 +189 +188 +185 +184 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +73 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +50 +52 +51 +47 +47 +43 +42 +44 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +55 +59 +59 +64 +64 +65 +68 +68 +72 +72 +75 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +120 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +175 +175 +175 +179 +179 +182 +182 +183 +185 +184 +185 +185 +184 +185 +185 +189 +189 +189 +191 +191 +194 +194 +195 +197 +196 +199 +198 +201 +200 +201 +200 +200 +202 +202 +203 +204 +204 +205 +204 +204 +204 +204 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +205 +204 +202 +202 +203 +202 +202 +200 +200 +201 +200 +201 +198 +199 +196 +195 +195 +194 +195 +191 +190 +188 +189 +189 +185 +185 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +170 +165 +165 +161 +160 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +126 +119 +120 +119 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +69 +68 +64 +64 +59 +59 +55 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +54 +54 +54 +59 +58 +64 +65 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +105 +110 +110 +116 +115 +115 +120 +120 +125 +126 +126 +129 +129 +133 +134 +133 +140 +140 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +176 +179 +178 +179 +183 +182 +185 +184 +185 +189 +188 +190 +191 +195 +194 +194 +197 +196 +198 +199 +198 +200 +200 +200 +200 +200 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +199 +198 +199 +196 +197 +194 +194 +194 +190 +190 +188 +188 +189 +185 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +116 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +65 +64 +65 +58 +59 +55 +55 +55 +51 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +15 +15 +17 +16 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +36 +41 +41 +43 +43 +43 +47 +46 +51 +51 +50 +55 +54 +58 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +120 +119 +120 +125 +125 +129 +129 +130 +133 +134 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +185 +184 +184 +189 +188 +191 +190 +190 +194 +194 +194 +194 +194 +197 +196 +198 +198 +198 +201 +201 +200 +200 +201 +202 +202 +204 +204 +205 +205 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +204 +204 +205 +203 +202 +200 +201 +201 +200 +200 +198 +198 +198 +197 +197 +194 +195 +194 +190 +191 +189 +189 +188 +184 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +164 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +83 +76 +76 +73 +72 +72 +69 +68 +64 +64 +64 +59 +59 +54 +54 +55 +51 +50 +46 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +14 +15 +15 +13 +13 +12 +12 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +54 +55 +58 +59 +64 +65 +64 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +109 +115 +116 +115 +119 +119 +125 +126 +130 +129 +130 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +148 +147 +151 +151 +151 +156 +157 +161 +161 +162 +166 +165 +169 +169 +172 +173 +173 +175 +175 +178 +178 +179 +183 +183 +185 +185 +185 +188 +189 +190 +191 +190 +195 +195 +196 +197 +196 +198 +199 +201 +200 +200 +200 +200 +203 +202 +205 +205 +204 +204 +204 +205 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +194 +190 +190 +189 +189 +189 +185 +185 +182 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +156 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +129 +125 +126 +125 +119 +119 +115 +115 +116 +110 +110 +106 +105 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +73 +68 +68 +64 +64 +65 +59 +58 +55 +55 +51 +50 +51 +47 +46 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +30 +31 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +47 +47 +50 +50 +55 +54 +59 +58 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +115 +115 +116 +116 +116 +120 +120 +125 +126 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +152 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +172 +175 +174 +178 +179 +179 +183 +183 +185 +184 +185 +189 +188 +191 +191 +195 +194 +194 +197 +197 +198 +199 +198 +201 +200 +200 +200 +201 +201 +200 +202 +202 +203 +205 +205 +205 +204 +206 +207 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +204 +204 +204 +204 +204 +202 +202 +203 +202 +203 +200 +200 +201 +201 +200 +199 +198 +197 +196 +196 +194 +195 +190 +190 +190 +189 +188 +185 +185 +184 +182 +182 +178 +179 +179 +175 +175 +173 +173 +170 +168 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +146 +143 +143 +143 +139 +139 +134 +133 +134 +130 +130 +125 +126 +120 +120 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +59 +59 +59 +54 +54 +50 +51 +51 +47 +47 +42 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +50 +54 +55 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +77 +76 +77 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +116 +115 +119 +119 +119 +126 +125 +129 +130 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +182 +182 +183 +184 +184 +189 +189 +188 +191 +191 +191 +190 +190 +194 +194 +197 +197 +197 +198 +199 +201 +201 +201 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +207 +204 +204 +204 +204 +205 +202 +202 +200 +200 +201 +200 +200 +198 +199 +198 +196 +196 +195 +194 +194 +190 +190 +189 +189 +189 +185 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +97 +90 +89 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +69 +68 +68 +64 +64 +58 +58 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +54 +55 +58 +59 +58 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +139 +139 +140 +144 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +179 +178 +179 +183 +183 +185 +184 +185 +189 +189 +191 +191 +194 +194 +195 +196 +197 +198 +198 +198 +200 +201 +200 +201 +201 +203 +203 +204 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +204 +205 +205 +204 +204 +202 +203 +201 +201 +200 +200 +200 +198 +199 +198 +196 +196 +195 +194 +191 +191 +191 +189 +189 +184 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +87 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +65 +59 +59 +55 +54 +54 +50 +50 +50 +51 +51 +47 +47 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +50 +50 +50 +54 +55 +59 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +101 +100 +100 +106 +106 +109 +110 +110 +116 +116 +120 +119 +120 +125 +126 +130 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +179 +182 +182 +183 +185 +185 +188 +188 +188 +190 +190 +194 +194 +194 +197 +196 +198 +198 +198 +200 +200 +200 +201 +201 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +204 +202 +202 +201 +201 +200 +200 +201 +198 +198 +196 +196 +197 +195 +194 +190 +191 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +156 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +130 +129 +126 +125 +119 +120 +119 +115 +116 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +58 +59 +59 +54 +55 +50 +51 +51 +47 +47 +43 +43 +42 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +14 +15 +15 +14 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +38 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +51 +55 +55 +58 +59 +58 +65 +64 +68 +68 +69 +73 +72 +77 +76 +81 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +115 +120 +119 +123 +125 +125 +129 +130 +134 +134 +134 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +167 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +184 +188 +188 +188 +191 +191 +194 +195 +195 +197 +197 +199 +199 +199 +200 +200 +200 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +203 +203 +202 +202 +200 +200 +201 +201 +200 +198 +198 +196 +196 +197 +195 +195 +190 +191 +189 +188 +188 +184 +185 +183 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +134 +133 +133 +129 +129 +125 +125 +126 +120 +120 +116 +116 +112 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +59 +54 +54 +55 +50 +51 +46 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +26 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +58 +59 +58 +64 +64 +68 +68 +69 +72 +72 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +116 +116 +119 +120 +119 +120 +119 +126 +125 +129 +129 +130 +133 +133 +139 +139 +142 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +185 +185 +185 +189 +189 +190 +191 +191 +195 +194 +196 +197 +196 +198 +198 +200 +200 +201 +201 +200 +202 +202 +202 +204 +205 +204 +204 +206 +207 +206 +207 +206 +207 +207 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +194 +190 +191 +190 +188 +189 +184 +184 +185 +183 +183 +178 +178 +179 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +137 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +95 +89 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +59 +54 +55 +50 +50 +51 +47 +47 +43 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +50 +50 +51 +54 +54 +58 +59 +58 +64 +65 +69 +68 +69 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +116 +117 +119 +120 +126 +126 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +178 +178 +183 +182 +183 +184 +185 +189 +189 +189 +190 +191 +195 +195 +195 +196 +197 +199 +199 +200 +200 +200 +200 +200 +202 +203 +202 +204 +204 +205 +205 +204 +207 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +205 +204 +205 +204 +204 +202 +202 +203 +201 +200 +200 +201 +201 +198 +199 +197 +196 +197 +194 +195 +191 +191 +192 +189 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +148 +144 +143 +143 +139 +139 +133 +133 +134 +129 +129 +130 +130 +130 +125 +125 +119 +120 +120 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +54 +55 +54 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +52 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +191 +191 +190 +195 +195 +196 +196 +196 +199 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +205 +204 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +205 +205 +202 +202 +202 +200 +200 +200 +201 +201 +198 +198 +197 +197 +194 +194 +194 +190 +190 +188 +188 +189 +185 +184 +185 +184 +184 +183 +183 +178 +179 +179 +175 +175 +173 +172 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +127 +125 +125 +120 +119 +115 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +55 +50 +50 +46 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +55 +55 +55 +55 +54 +58 +59 +64 +65 +64 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +125 +126 +129 +130 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +174 +178 +179 +183 +183 +183 +184 +184 +185 +185 +184 +188 +189 +191 +191 +190 +195 +195 +196 +197 +197 +199 +198 +200 +200 +201 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +205 +202 +202 +200 +201 +200 +200 +201 +201 +200 +200 +198 +198 +197 +196 +197 +195 +194 +190 +191 +189 +189 +189 +185 +185 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +120 +116 +116 +115 +110 +110 +105 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +55 +51 +50 +50 +46 +47 +43 +43 +43 +40 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +20 +19 +17 +18 +17 +15 +15 +15 +16 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +42 +43 +47 +46 +51 +51 +52 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +105 +110 +110 +116 +115 +116 +119 +119 +126 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +179 +183 +183 +184 +184 +185 +188 +189 +191 +190 +195 +194 +195 +196 +196 +198 +199 +199 +200 +201 +201 +200 +200 +202 +202 +204 +205 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +200 +198 +198 +196 +196 +197 +195 +195 +190 +190 +191 +188 +189 +189 +189 +188 +184 +185 +183 +182 +183 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +140 +134 +133 +129 +129 +125 +125 +125 +119 +119 +115 +115 +115 +110 +110 +110 +110 +111 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +72 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +55 +55 +51 +50 +47 +46 +47 +43 +43 +41 +40 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +24 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +47 +47 +50 +51 +54 +55 +55 +59 +58 +64 +64 +65 +69 +68 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +116 +115 +119 +119 +119 +126 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +184 +188 +188 +190 +190 +190 +194 +195 +196 +197 +196 +199 +198 +200 +201 +201 +201 +201 +202 +202 +204 +205 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +199 +196 +196 +197 +196 +196 +194 +194 +191 +191 +191 +188 +188 +185 +185 +183 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +134 +134 +129 +129 +129 +126 +125 +120 +120 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +58 +58 +55 +55 +51 +51 +51 +47 +47 +43 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +15 +16 +15 +17 +17 +17 +17 +18 +19 +19 +21 +21 +21 +25 +25 +27 +27 +29 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +55 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +126 +126 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +183 +183 +183 +184 +185 +189 +189 +189 +190 +191 +194 +194 +195 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +203 +202 +202 +200 +200 +201 +200 +200 +198 +199 +196 +196 +195 +194 +195 +190 +190 +189 +189 +189 +184 +184 +183 +183 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +129 +129 +129 +126 +125 +119 +119 +119 +115 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +69 +64 +64 +59 +59 +55 +55 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +20 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +46 +50 +51 +51 +54 +55 +59 +58 +59 +65 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +109 +115 +116 +120 +120 +119 +126 +125 +130 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +151 +151 +151 +157 +156 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +189 +188 +188 +191 +190 +194 +195 +195 +196 +196 +197 +197 +196 +199 +199 +200 +201 +201 +200 +201 +202 +203 +203 +204 +205 +205 +204 +207 +207 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +205 +203 +202 +203 +200 +201 +200 +200 +201 +198 +199 +197 +196 +196 +194 +194 +191 +190 +190 +188 +188 +185 +185 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +143 +139 +139 +134 +133 +130 +129 +129 +125 +125 +120 +120 +119 +115 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +81 +76 +76 +76 +72 +73 +68 +69 +69 +64 +65 +59 +58 +59 +55 +54 +50 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +26 +25 +25 +27 +27 +30 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +55 +54 +55 +58 +58 +64 +64 +64 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +97 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +144 +144 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +182 +183 +184 +184 +188 +188 +189 +190 +190 +195 +194 +195 +197 +196 +199 +198 +199 +200 +201 +201 +200 +202 +203 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +204 +205 +204 +205 +205 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +195 +195 +190 +191 +189 +188 +185 +184 +184 +183 +182 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +150 +151 +147 +147 +143 +144 +143 +139 +139 +133 +134 +133 +130 +129 +125 +125 +125 +120 +119 +115 +115 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +55 +51 +50 +47 +47 +42 +42 +42 +41 +41 +41 +41 +41 +36 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +40 +40 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +119 +126 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +188 +188 +189 +190 +191 +195 +194 +196 +196 +197 +198 +199 +201 +201 +200 +200 +200 +201 +200 +200 +202 +202 +205 +204 +205 +204 +205 +207 +206 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +200 +200 +201 +201 +201 +198 +198 +198 +196 +197 +195 +195 +190 +190 +190 +189 +189 +185 +184 +185 +182 +183 +179 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +119 +116 +116 +109 +109 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +59 +59 +58 +55 +54 +51 +50 +51 +47 +47 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +42 +47 +47 +47 +51 +50 +54 +54 +55 +59 +58 +65 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +119 +125 +125 +125 +129 +130 +133 +133 +134 +139 +139 +143 +144 +147 +147 +148 +151 +151 +157 +157 +157 +161 +161 +161 +160 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +175 +179 +179 +183 +183 +184 +185 +184 +188 +188 +190 +191 +191 +194 +194 +194 +194 +194 +197 +197 +198 +198 +199 +201 +201 +201 +201 +201 +202 +203 +204 +204 +204 +204 +205 +206 +206 +206 +207 +206 +206 +207 +207 +207 +206 +207 +206 +206 +206 +207 +204 +205 +204 +204 +202 +202 +203 +201 +200 +200 +200 +200 +198 +198 +197 +197 +196 +194 +195 +190 +190 +190 +188 +188 +184 +184 +184 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +116 +116 +109 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +55 +54 +51 +50 +50 +47 +46 +43 +43 +41 +40 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +12 +15 +15 +17 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +47 +47 +51 +50 +51 +54 +54 +58 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +117 +119 +120 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +178 +183 +182 +183 +183 +182 +184 +184 +189 +189 +189 +190 +191 +194 +194 +195 +196 +196 +198 +199 +200 +201 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +196 +195 +194 +190 +190 +189 +188 +188 +184 +184 +182 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +140 +139 +134 +134 +129 +129 +129 +125 +125 +120 +120 +120 +116 +115 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +59 +58 +59 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +36 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +50 +51 +55 +54 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +115 +115 +119 +119 +120 +125 +125 +125 +125 +125 +130 +130 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +174 +174 +179 +178 +183 +182 +184 +184 +185 +189 +188 +190 +190 +191 +194 +194 +197 +196 +196 +198 +198 +201 +201 +201 +201 +200 +203 +202 +203 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +203 +203 +200 +201 +200 +200 +198 +198 +199 +196 +196 +195 +194 +194 +190 +190 +189 +188 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +129 +130 +125 +125 +120 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +59 +54 +55 +55 +55 +55 +51 +51 +47 +47 +47 +47 +46 +42 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +42 +46 +47 +47 +51 +50 +50 +50 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +119 +119 +119 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +158 +160 +161 +165 +165 +169 +169 +169 +173 +173 +175 +176 +175 +178 +179 +183 +182 +183 +185 +184 +189 +188 +189 +191 +191 +195 +194 +195 +196 +196 +198 +198 +200 +201 +200 +200 +201 +202 +202 +203 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +200 +200 +199 +198 +198 +197 +197 +195 +195 +195 +191 +190 +189 +188 +185 +184 +185 +182 +183 +178 +178 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +130 +129 +129 +125 +125 +119 +119 +119 +116 +116 +110 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +61 +58 +58 +55 +54 +51 +50 +51 +47 +47 +43 +42 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +120 +119 +125 +125 +126 +125 +125 +129 +129 +133 +134 +134 +139 +140 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +179 +183 +183 +185 +185 +186 +188 +189 +191 +191 +194 +195 +195 +197 +196 +198 +198 +198 +200 +200 +201 +201 +200 +202 +203 +204 +204 +205 +204 +205 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +200 +201 +201 +200 +198 +198 +197 +196 +196 +194 +194 +190 +191 +191 +188 +188 +185 +184 +184 +183 +183 +178 +179 +179 +175 +175 +173 +172 +173 +169 +168 +165 +165 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +129 +130 +125 +125 +122 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +77 +73 +73 +72 +69 +68 +64 +65 +64 +58 +58 +54 +54 +54 +51 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +26 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +51 +51 +51 +55 +58 +58 +58 +58 +65 +64 +64 +64 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +115 +116 +120 +120 +119 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +148 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +178 +179 +183 +182 +185 +185 +185 +188 +189 +191 +190 +190 +195 +195 +197 +196 +196 +198 +199 +200 +200 +200 +201 +200 +203 +202 +205 +205 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +197 +196 +195 +194 +194 +191 +191 +188 +189 +189 +184 +184 +183 +182 +183 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +134 +134 +129 +129 +129 +125 +125 +119 +120 +119 +116 +116 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +55 +54 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +46 +51 +51 +55 +55 +54 +58 +59 +64 +64 +66 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +87 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +112 +116 +115 +120 +119 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +178 +182 +182 +185 +184 +185 +188 +189 +190 +190 +190 +195 +195 +197 +196 +199 +198 +198 +200 +200 +200 +200 +200 +202 +203 +203 +202 +202 +205 +205 +204 +205 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +203 +202 +201 +201 +200 +201 +200 +198 +199 +196 +197 +197 +195 +194 +191 +191 +188 +188 +189 +185 +184 +183 +183 +182 +179 +179 +179 +179 +179 +175 +175 +172 +173 +172 +169 +169 +165 +165 +164 +161 +161 +158 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +120 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +85 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +59 +55 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +14 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +12 +15 +15 +15 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +44 +47 +47 +51 +50 +54 +54 +55 +59 +59 +65 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +105 +109 +110 +110 +115 +115 +119 +119 +119 +125 +125 +129 +130 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +175 +178 +179 +183 +183 +185 +185 +185 +188 +188 +191 +191 +191 +195 +195 +196 +197 +196 +199 +198 +200 +200 +200 +200 +200 +202 +203 +203 +205 +205 +204 +205 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +205 +205 +204 +204 +204 +202 +202 +203 +201 +201 +200 +201 +198 +198 +198 +197 +197 +194 +194 +194 +190 +190 +191 +190 +190 +189 +188 +185 +184 +184 +183 +182 +179 +179 +178 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +134 +133 +129 +129 +125 +125 +126 +119 +119 +115 +116 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +89 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +73 +68 +68 +68 +65 +64 +58 +59 +58 +54 +54 +50 +50 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +26 +28 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +46 +47 +47 +47 +51 +51 +54 +54 +55 +59 +59 +65 +64 +66 +69 +68 +73 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +116 +115 +120 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +156 +157 +161 +161 +165 +166 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +182 +182 +185 +185 +184 +188 +188 +191 +191 +191 +195 +194 +196 +196 +199 +199 +199 +201 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +202 +202 +202 +200 +200 +200 +201 +200 +198 +199 +197 +197 +197 +194 +195 +191 +191 +188 +189 +188 +184 +184 +182 +183 +183 +179 +179 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +130 +129 +125 +125 +125 +120 +119 +115 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +59 +58 +59 +54 +54 +51 +51 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +30 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +44 +47 +46 +50 +51 +55 +55 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +99 +100 +106 +106 +106 +109 +110 +116 +115 +115 +120 +120 +126 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +184 +189 +188 +189 +191 +191 +195 +195 +194 +196 +196 +199 +198 +198 +200 +200 +200 +200 +200 +202 +203 +204 +204 +205 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +199 +200 +200 +201 +198 +199 +196 +196 +196 +194 +195 +191 +191 +190 +189 +188 +189 +189 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +125 +125 +126 +120 +119 +116 +116 +116 +109 +110 +106 +106 +106 +100 +100 +95 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +58 +55 +54 +55 +51 +51 +47 +47 +47 +42 +43 +40 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +22 +21 +21 +21 +25 +25 +27 +27 +26 +31 +31 +33 +33 +36 +37 +37 +41 +41 +42 +42 +43 +46 +47 +50 +51 +51 +54 +55 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +116 +120 +120 +119 +125 +125 +130 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +179 +178 +179 +182 +183 +184 +184 +185 +188 +188 +189 +189 +189 +190 +191 +194 +194 +194 +197 +197 +198 +198 +199 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +202 +202 +200 +201 +200 +201 +201 +198 +199 +199 +198 +198 +197 +196 +194 +194 +195 +190 +190 +188 +188 +185 +184 +185 +182 +182 +178 +179 +179 +174 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +134 +133 +130 +129 +125 +125 +125 +120 +119 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +64 +64 +59 +58 +55 +55 +55 +50 +50 +47 +46 +44 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +26 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +46 +51 +51 +51 +55 +54 +59 +58 +63 +64 +65 +69 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +87 +90 +89 +96 +96 +96 +99 +100 +106 +105 +110 +110 +110 +116 +116 +119 +119 +119 +125 +125 +125 +125 +126 +129 +129 +133 +133 +133 +140 +140 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +179 +183 +183 +185 +185 +185 +188 +189 +191 +190 +195 +195 +195 +197 +196 +198 +198 +198 +200 +200 +200 +200 +200 +201 +200 +203 +203 +202 +204 +204 +205 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +194 +194 +191 +190 +190 +188 +189 +185 +185 +184 +183 +183 +179 +179 +179 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +120 +120 +120 +115 +115 +110 +109 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +73 +69 +68 +68 +64 +64 +58 +58 +59 +54 +55 +50 +51 +50 +46 +47 +42 +43 +42 +41 +40 +37 +37 +38 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +12 +16 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +43 +43 +42 +47 +46 +51 +51 +51 +55 +54 +54 +54 +54 +58 +59 +64 +64 +65 +68 +68 +72 +72 +73 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +115 +115 +115 +119 +120 +126 +125 +125 +129 +130 +133 +134 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +174 +174 +178 +179 +183 +183 +183 +185 +185 +189 +188 +189 +191 +190 +191 +191 +191 +194 +194 +197 +196 +196 +199 +199 +200 +200 +201 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +207 +206 +205 +204 +205 +205 +205 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +197 +197 +197 +195 +195 +191 +190 +191 +189 +189 +185 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +129 +125 +125 +119 +119 +119 +116 +115 +109 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +55 +54 +50 +50 +51 +47 +47 +43 +43 +41 +41 +40 +37 +37 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +55 +55 +59 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +115 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +175 +175 +175 +179 +178 +182 +182 +182 +185 +185 +188 +189 +189 +190 +190 +195 +194 +197 +196 +197 +199 +198 +200 +200 +200 +200 +200 +200 +200 +200 +202 +202 +204 +205 +204 +204 +205 +206 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +204 +204 +204 +202 +202 +203 +201 +201 +201 +200 +198 +198 +199 +196 +196 +194 +194 +194 +190 +190 +188 +188 +188 +185 +184 +183 +183 +183 +179 +179 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +130 +129 +125 +125 +120 +120 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +73 +72 +68 +68 +69 +64 +64 +59 +58 +59 +55 +55 +54 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +40 +42 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +55 +59 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +83 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +170 +170 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +184 +189 +189 +189 +188 +188 +191 +190 +195 +194 +195 +197 +197 +198 +198 +200 +200 +201 +200 +201 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +205 +205 +204 +202 +203 +202 +200 +200 +200 +201 +200 +198 +199 +196 +197 +196 +194 +194 +190 +190 +191 +189 +189 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +140 +139 +134 +134 +130 +129 +129 +125 +125 +119 +119 +120 +115 +115 +110 +110 +109 +106 +106 +100 +100 +100 +95 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +69 +68 +64 +64 +65 +58 +58 +54 +54 +53 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +36 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +18 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +65 +65 +69 +69 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +109 +116 +116 +120 +119 +119 +125 +125 +129 +129 +130 +134 +134 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +174 +175 +175 +175 +175 +178 +179 +182 +183 +182 +185 +185 +189 +188 +190 +190 +191 +195 +195 +196 +196 +196 +198 +198 +200 +201 +200 +201 +201 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +198 +198 +196 +196 +195 +194 +194 +191 +190 +189 +188 +189 +185 +185 +185 +184 +185 +182 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +126 +125 +125 +120 +119 +115 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +77 +77 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +55 +54 +51 +51 +50 +51 +50 +47 +46 +43 +43 +43 +40 +41 +37 +37 +37 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +37 +41 +41 +42 +43 +48 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +64 +69 +69 +73 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +116 +119 +119 +119 +125 +125 +130 +130 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +184 +184 +189 +188 +189 +190 +191 +195 +194 +194 +196 +196 +198 +199 +199 +201 +201 +200 +200 +202 +203 +203 +204 +204 +204 +205 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +194 +194 +191 +191 +190 +188 +189 +184 +184 +184 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +160 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +126 +125 +119 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +73 +69 +69 +68 +64 +64 +64 +64 +64 +58 +58 +55 +55 +54 +50 +50 +47 +47 +47 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +24 +21 +21 +19 +19 +19 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +20 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +47 +47 +46 +47 +50 +51 +54 +55 +55 +59 +58 +64 +64 +65 +68 +68 +73 +72 +76 +76 +76 +83 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +112 +116 +116 +119 +120 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +174 +175 +179 +179 +183 +182 +183 +185 +185 +188 +188 +189 +191 +191 +195 +195 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +203 +203 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +205 +204 +202 +203 +203 +201 +201 +200 +200 +200 +199 +198 +196 +196 +196 +194 +195 +191 +191 +189 +189 +188 +184 +184 +183 +183 +183 +179 +178 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +119 +120 +120 +116 +116 +110 +110 +108 +105 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +61 +58 +58 +55 +54 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +54 +55 +59 +58 +65 +64 +64 +69 +68 +72 +72 +72 +76 +76 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +95 +96 +100 +99 +106 +106 +110 +110 +110 +115 +115 +119 +120 +119 +125 +125 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +184 +184 +184 +189 +188 +190 +190 +191 +194 +194 +197 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +203 +202 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +205 +204 +202 +202 +202 +201 +200 +200 +201 +199 +198 +199 +196 +196 +194 +195 +195 +191 +190 +188 +189 +189 +184 +184 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +134 +129 +129 +127 +125 +125 +120 +119 +115 +116 +116 +110 +109 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +89 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +32 +31 +31 +27 +27 +28 +25 +25 +21 +21 +21 +19 +19 +17 +18 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +38 +41 +40 +43 +43 +47 +47 +46 +50 +50 +54 +54 +55 +59 +58 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +105 +109 +109 +116 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +178 +182 +182 +183 +185 +185 +184 +185 +185 +188 +188 +191 +191 +191 +195 +194 +196 +196 +196 +198 +199 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +205 +205 +204 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +205 +205 +204 +205 +204 +202 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +197 +196 +195 +195 +190 +191 +191 +188 +189 +185 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +129 +125 +125 +125 +126 +125 +120 +119 +115 +115 +116 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +65 +58 +58 +54 +54 +50 +50 +51 +46 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +26 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +43 +43 +47 +46 +48 +50 +50 +54 +55 +58 +59 +58 +64 +65 +68 +69 +68 +72 +72 +72 +72 +73 +77 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +170 +169 +173 +173 +175 +174 +175 +179 +179 +183 +182 +185 +184 +185 +188 +188 +190 +191 +190 +195 +195 +197 +196 +196 +198 +198 +200 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +202 +202 +203 +201 +201 +201 +201 +198 +199 +199 +197 +197 +195 +194 +195 +191 +190 +189 +188 +188 +185 +184 +183 +183 +183 +179 +178 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +131 +130 +130 +125 +125 +119 +119 +119 +116 +115 +110 +109 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +69 +68 +64 +64 +59 +58 +59 +55 +54 +50 +50 +51 +47 +47 +43 +42 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +20 +25 +24 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +42 +47 +46 +47 +47 +46 +51 +50 +51 +50 +51 +55 +55 +59 +59 +58 +64 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +116 +119 +119 +124 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +185 +188 +188 +190 +190 +191 +195 +195 +196 +196 +196 +198 +199 +201 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +201 +200 +201 +198 +198 +196 +196 +197 +195 +195 +191 +190 +191 +189 +189 +184 +185 +182 +183 +183 +179 +179 +175 +175 +175 +172 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +119 +119 +116 +116 +116 +110 +109 +105 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +59 +55 +55 +51 +50 +50 +47 +46 +43 +42 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +24 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +46 +51 +50 +55 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +95 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +116 +119 +120 +126 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +184 +189 +189 +188 +191 +195 +195 +194 +194 +196 +196 +197 +196 +197 +199 +198 +201 +200 +201 +200 +200 +202 +203 +203 +205 +204 +205 +204 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +205 +205 +202 +202 +201 +200 +200 +200 +201 +198 +198 +198 +197 +197 +195 +195 +194 +191 +191 +190 +191 +191 +189 +189 +185 +185 +184 +182 +183 +179 +178 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +140 +139 +134 +134 +130 +129 +130 +125 +125 +119 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +59 +55 +54 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +30 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +59 +59 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +109 +116 +116 +120 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +173 +173 +173 +175 +175 +178 +179 +179 +182 +183 +185 +184 +185 +188 +189 +191 +190 +191 +195 +195 +197 +197 +196 +198 +199 +201 +201 +201 +201 +200 +202 +203 +204 +204 +205 +204 +205 +205 +204 +205 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +201 +201 +200 +200 +199 +199 +199 +197 +196 +194 +195 +193 +191 +191 +189 +188 +184 +185 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +125 +120 +120 +116 +115 +116 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +85 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +65 +65 +58 +59 +54 +54 +51 +51 +50 +46 +47 +43 +42 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +54 +54 +54 +58 +58 +64 +65 +65 +68 +68 +71 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +125 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +182 +183 +184 +184 +188 +189 +191 +190 +191 +194 +194 +196 +196 +197 +198 +198 +200 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +205 +205 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +201 +200 +201 +201 +198 +198 +196 +196 +197 +194 +194 +190 +190 +190 +188 +188 +184 +184 +185 +182 +183 +179 +178 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +130 +126 +125 +120 +120 +119 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +65 +64 +59 +58 +59 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +38 +33 +33 +31 +31 +28 +26 +27 +25 +25 +21 +22 +21 +19 +19 +17 +18 +17 +15 +15 +14 +16 +15 +13 +13 +12 +12 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +12 +15 +16 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +51 +51 +50 +55 +55 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +140 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +175 +179 +179 +183 +183 +185 +185 +185 +189 +189 +190 +190 +191 +194 +195 +195 +194 +194 +197 +197 +198 +198 +198 +200 +200 +201 +201 +201 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +195 +194 +195 +190 +191 +188 +189 +189 +185 +185 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +134 +130 +129 +126 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +105 +99 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +58 +58 +54 +54 +55 +51 +50 +46 +46 +48 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +54 +54 +55 +59 +59 +64 +65 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +105 +110 +110 +116 +115 +116 +120 +119 +126 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +183 +183 +185 +185 +185 +185 +185 +189 +189 +191 +190 +190 +194 +194 +196 +196 +196 +198 +199 +200 +201 +200 +200 +200 +202 +203 +205 +204 +204 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +200 +201 +201 +198 +199 +196 +196 +197 +194 +195 +190 +191 +188 +189 +189 +184 +185 +185 +184 +184 +182 +182 +179 +178 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +130 +129 +125 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +69 +69 +64 +65 +65 +59 +59 +54 +55 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +18 +21 +21 +25 +25 +25 +28 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +51 +55 +55 +55 +58 +59 +64 +65 +65 +68 +69 +73 +72 +72 +76 +76 +82 +82 +82 +86 +87 +90 +90 +90 +96 +95 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +120 +120 +119 +125 +126 +129 +129 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +188 +189 +189 +191 +191 +195 +194 +194 +197 +196 +196 +196 +197 +198 +198 +200 +200 +200 +200 +201 +202 +203 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +205 +205 +205 +203 +202 +200 +200 +200 +200 +200 +201 +200 +200 +199 +198 +197 +196 +197 +194 +194 +191 +191 +191 +188 +189 +185 +185 +184 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +130 +129 +129 +125 +126 +119 +120 +120 +115 +115 +110 +110 +109 +106 +105 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +65 +64 +65 +58 +58 +54 +54 +54 +51 +51 +47 +47 +48 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +46 +47 +50 +50 +54 +54 +54 +59 +58 +64 +65 +65 +68 +68 +72 +72 +73 +76 +76 +82 +83 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +115 +116 +119 +120 +125 +126 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +178 +178 +183 +183 +182 +182 +183 +184 +185 +188 +188 +189 +191 +190 +194 +194 +196 +196 +197 +199 +198 +201 +200 +201 +201 +200 +202 +202 +202 +204 +204 +204 +205 +205 +206 +206 +206 +206 +207 +207 +206 +207 +207 +206 +206 +207 +207 +206 +204 +204 +204 +204 +204 +203 +203 +202 +201 +200 +200 +200 +200 +199 +198 +197 +196 +197 +195 +194 +190 +190 +189 +188 +188 +184 +185 +182 +183 +183 +179 +179 +175 +174 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +115 +110 +109 +111 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +83 +82 +82 +76 +76 +72 +72 +72 +69 +68 +65 +64 +61 +59 +58 +55 +55 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +50 +55 +55 +59 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +116 +116 +115 +115 +116 +119 +120 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +152 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +182 +183 +183 +184 +185 +188 +188 +189 +191 +190 +195 +194 +195 +197 +196 +198 +198 +198 +200 +200 +200 +200 +201 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +205 +205 +204 +204 +205 +203 +203 +200 +200 +201 +201 +201 +198 +198 +197 +196 +196 +194 +194 +190 +190 +190 +189 +189 +185 +184 +185 +182 +183 +178 +179 +179 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +120 +119 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +77 +76 +73 +72 +68 +69 +69 +64 +64 +59 +58 +58 +55 +54 +54 +55 +54 +51 +51 +47 +47 +47 +43 +42 +41 +41 +39 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +20 +19 +19 +19 +19 +22 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +42 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +54 +58 +59 +64 +64 +64 +68 +69 +72 +72 +73 +76 +76 +82 +83 +86 +86 +85 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +120 +122 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +172 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +188 +191 +191 +195 +195 +195 +196 +197 +198 +198 +201 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +205 +204 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +205 +205 +204 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +201 +200 +198 +198 +198 +196 +196 +194 +195 +195 +190 +191 +188 +189 +185 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +144 +143 +143 +139 +140 +133 +133 +133 +129 +130 +130 +129 +130 +125 +125 +120 +119 +119 +116 +115 +109 +110 +110 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +62 +59 +59 +55 +55 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +36 +33 +33 +30 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +48 +50 +50 +55 +55 +58 +59 +58 +65 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +116 +115 +115 +115 +119 +120 +125 +126 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +185 +185 +189 +188 +189 +190 +190 +194 +194 +194 +197 +196 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +200 +200 +198 +198 +196 +196 +196 +194 +195 +190 +190 +191 +189 +189 +185 +185 +184 +182 +183 +179 +178 +178 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +136 +134 +133 +129 +129 +125 +126 +125 +120 +119 +116 +116 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +89 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +69 +64 +64 +59 +59 +59 +55 +55 +50 +51 +51 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +31 +31 +32 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +47 +47 +51 +50 +50 +50 +50 +55 +55 +58 +59 +59 +64 +65 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +125 +125 +126 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +174 +175 +179 +179 +179 +182 +183 +184 +184 +184 +188 +189 +191 +190 +191 +194 +194 +197 +196 +197 +199 +199 +200 +201 +201 +201 +201 +203 +202 +204 +205 +204 +205 +204 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +207 +207 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +199 +198 +196 +196 +194 +195 +195 +191 +191 +188 +188 +188 +185 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +133 +129 +130 +126 +125 +126 +119 +120 +119 +119 +119 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +65 +59 +59 +54 +54 +53 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +20 +21 +19 +19 +18 +16 +17 +15 +15 +15 +14 +15 +13 +13 +12 +12 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +12 +16 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +36 +41 +41 +40 +41 +40 +43 +43 +47 +47 +47 +51 +51 +54 +54 +55 +59 +58 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +105 +106 +105 +110 +109 +110 +110 +110 +115 +115 +119 +119 +119 +125 +126 +129 +129 +128 +133 +134 +139 +139 +139 +143 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +188 +191 +190 +191 +194 +194 +196 +196 +197 +199 +199 +201 +201 +201 +201 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +201 +200 +198 +198 +196 +196 +194 +195 +194 +191 +191 +189 +189 +189 +185 +185 +185 +185 +185 +183 +183 +178 +178 +178 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +127 +125 +125 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +77 +72 +72 +73 +68 +69 +64 +64 +64 +57 +58 +55 +55 +54 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +54 +55 +58 +58 +59 +59 +58 +64 +64 +68 +68 +69 +73 +73 +76 +76 +79 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +121 +125 +126 +129 +129 +132 +133 +133 +139 +139 +143 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +178 +178 +182 +182 +184 +184 +185 +189 +189 +188 +189 +189 +191 +191 +194 +194 +194 +196 +196 +198 +198 +198 +201 +201 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +200 +201 +200 +198 +199 +196 +196 +197 +194 +194 +191 +190 +189 +188 +189 +185 +185 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +160 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +134 +133 +129 +130 +130 +125 +125 +120 +120 +120 +116 +116 +110 +110 +107 +106 +106 +100 +100 +96 +96 +96 +89 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +55 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +42 +43 +43 +47 +46 +51 +51 +52 +54 +54 +59 +58 +64 +65 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +120 +119 +125 +125 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +185 +188 +189 +190 +191 +194 +195 +195 +197 +197 +198 +198 +198 +201 +200 +200 +201 +200 +203 +202 +205 +205 +204 +205 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +203 +200 +200 +201 +200 +200 +198 +199 +196 +196 +196 +195 +195 +190 +190 +190 +188 +188 +188 +188 +188 +185 +185 +183 +183 +183 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +140 +133 +134 +129 +129 +126 +126 +125 +120 +119 +115 +116 +116 +109 +110 +106 +106 +106 +99 +100 +96 +96 +96 +90 +90 +85 +86 +86 +82 +82 +76 +76 +72 +73 +72 +68 +68 +65 +65 +64 +58 +58 +55 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +55 +55 +59 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +119 +126 +126 +129 +129 +133 +134 +134 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +168 +169 +169 +172 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +185 +188 +188 +191 +191 +191 +194 +195 +197 +196 +197 +198 +198 +200 +200 +201 +200 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +207 +204 +205 +205 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +196 +197 +196 +196 +197 +195 +194 +191 +191 +190 +189 +188 +184 +185 +185 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +120 +119 +116 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +42 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +115 +115 +119 +119 +126 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +184 +185 +188 +188 +190 +190 +191 +194 +195 +196 +196 +199 +199 +199 +200 +200 +200 +200 +201 +202 +202 +203 +202 +203 +204 +204 +205 +204 +204 +207 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +205 +204 +205 +203 +203 +201 +201 +201 +200 +201 +198 +199 +199 +197 +197 +194 +195 +190 +191 +191 +188 +189 +185 +185 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +134 +133 +134 +129 +129 +125 +125 +126 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +73 +68 +68 +65 +64 +59 +59 +58 +55 +54 +50 +51 +51 +47 +47 +47 +47 +47 +42 +42 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +28 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +42 +43 +43 +47 +47 +50 +51 +50 +55 +54 +58 +58 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +87 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +115 +116 +119 +119 +120 +126 +125 +130 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +184 +185 +185 +189 +189 +191 +190 +191 +194 +194 +196 +196 +196 +199 +199 +200 +201 +201 +200 +200 +202 +202 +203 +205 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +204 +204 +205 +205 +202 +202 +200 +200 +200 +200 +200 +198 +199 +197 +196 +196 +194 +194 +190 +191 +190 +188 +189 +185 +185 +185 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +130 +129 +125 +125 +120 +119 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +59 +55 +55 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +18 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +55 +55 +58 +59 +64 +64 +64 +69 +68 +72 +72 +77 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +109 +110 +110 +116 +116 +120 +120 +126 +126 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +183 +183 +183 +183 +182 +185 +184 +188 +189 +188 +190 +190 +195 +194 +195 +196 +197 +198 +199 +200 +200 +201 +201 +200 +202 +202 +202 +204 +204 +205 +204 +204 +205 +204 +206 +207 +207 +206 +207 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +201 +201 +200 +198 +198 +199 +196 +197 +194 +194 +190 +191 +191 +189 +189 +185 +185 +185 +183 +182 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +130 +130 +126 +125 +125 +120 +119 +116 +115 +116 +110 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +65 +58 +59 +54 +55 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +30 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +42 +43 +42 +47 +47 +50 +50 +55 +55 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +184 +189 +188 +190 +190 +191 +195 +194 +196 +196 +196 +198 +199 +198 +199 +199 +200 +200 +200 +200 +200 +203 +203 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +207 +207 +204 +205 +205 +205 +205 +203 +203 +200 +200 +201 +200 +200 +199 +198 +196 +197 +196 +194 +195 +191 +191 +190 +188 +188 +185 +184 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +120 +120 +119 +116 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +54 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +20 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +54 +55 +59 +58 +64 +65 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +87 +86 +86 +90 +90 +96 +95 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +125 +125 +129 +129 +133 +133 +139 +140 +139 +143 +143 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +166 +165 +166 +169 +169 +173 +172 +175 +175 +175 +178 +178 +182 +183 +182 +185 +184 +185 +185 +184 +188 +189 +190 +191 +191 +194 +195 +196 +196 +198 +198 +199 +200 +201 +200 +200 +201 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +203 +203 +201 +200 +201 +200 +200 +198 +198 +199 +196 +197 +194 +194 +194 +191 +190 +189 +188 +185 +185 +184 +182 +182 +178 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +119 +115 +115 +115 +110 +110 +106 +106 +107 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +77 +77 +76 +76 +73 +72 +69 +69 +68 +65 +65 +59 +58 +59 +55 +54 +51 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +36 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +47 +46 +51 +51 +50 +54 +54 +58 +58 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +116 +119 +119 +125 +125 +126 +129 +129 +129 +129 +129 +134 +133 +140 +140 +140 +143 +143 +147 +147 +147 +151 +151 +156 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +173 +172 +173 +175 +175 +178 +179 +179 +182 +183 +185 +184 +188 +188 +189 +190 +191 +194 +195 +195 +197 +197 +198 +199 +199 +200 +200 +200 +201 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +201 +199 +198 +197 +196 +196 +195 +194 +190 +190 +190 +188 +188 +184 +184 +184 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +116 +115 +109 +110 +110 +105 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +54 +50 +51 +50 +51 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +28 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +12 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +37 +40 +41 +43 +42 +47 +46 +47 +51 +51 +55 +55 +55 +59 +58 +64 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +109 +110 +110 +110 +110 +116 +116 +119 +120 +120 +125 +125 +129 +130 +131 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +172 +174 +174 +175 +179 +179 +182 +182 +183 +185 +185 +189 +189 +189 +191 +191 +195 +194 +195 +197 +197 +198 +198 +199 +201 +201 +200 +200 +202 +202 +203 +205 +204 +205 +205 +205 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +207 +206 +206 +207 +204 +205 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +198 +196 +197 +196 +194 +195 +191 +190 +191 +188 +188 +185 +185 +185 +183 +183 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +158 +151 +151 +151 +147 +148 +143 +143 +144 +139 +140 +133 +133 +129 +130 +130 +125 +125 +119 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +64 +64 +64 +58 +58 +55 +55 +54 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +28 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +58 +58 +59 +64 +64 +69 +68 +69 +72 +72 +76 +77 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +117 +120 +120 +126 +126 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +147 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +185 +184 +185 +189 +189 +190 +191 +191 +195 +195 +196 +196 +198 +198 +198 +200 +201 +200 +200 +200 +202 +202 +205 +204 +204 +205 +205 +207 +206 +206 +206 +206 +207 +206 +207 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +201 +200 +200 +201 +198 +198 +198 +197 +196 +194 +195 +195 +190 +191 +189 +188 +185 +184 +184 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +140 +140 +133 +134 +134 +129 +129 +126 +126 +124 +120 +119 +116 +116 +116 +109 +110 +106 +105 +106 +100 +100 +96 +96 +89 +90 +90 +86 +86 +83 +82 +82 +76 +76 +77 +76 +76 +73 +72 +68 +69 +68 +64 +64 +59 +58 +55 +54 +54 +50 +50 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +24 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +24 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +59 +59 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +83 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +115 +116 +116 +120 +120 +125 +126 +125 +129 +129 +129 +129 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +189 +189 +190 +191 +190 +194 +194 +196 +196 +196 +199 +198 +200 +200 +200 +201 +200 +203 +202 +202 +204 +204 +204 +205 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +197 +195 +195 +194 +190 +190 +188 +188 +189 +184 +184 +182 +182 +182 +179 +178 +175 +174 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +144 +143 +139 +139 +133 +133 +134 +130 +129 +125 +125 +123 +120 +119 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +95 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +75 +72 +72 +68 +68 +65 +64 +64 +59 +59 +55 +55 +54 +50 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +18 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +55 +59 +59 +58 +59 +59 +65 +64 +69 +68 +68 +72 +72 +76 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +106 +106 +106 +110 +110 +115 +115 +115 +119 +120 +125 +125 +129 +130 +129 +134 +134 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +183 +182 +185 +185 +189 +189 +188 +190 +191 +195 +194 +195 +196 +196 +199 +199 +198 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +204 +205 +205 +205 +203 +203 +202 +201 +200 +200 +200 +201 +198 +199 +197 +197 +196 +195 +195 +191 +191 +191 +189 +189 +185 +185 +185 +183 +183 +179 +178 +175 +175 +175 +173 +169 +169 +169 +169 +165 +165 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +120 +119 +119 +120 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +65 +58 +59 +58 +55 +54 +50 +51 +46 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +30 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +37 +37 +42 +41 +41 +43 +43 +42 +43 +43 +48 +47 +51 +50 +51 +55 +54 +58 +59 +59 +65 +64 +68 +69 +72 +73 +72 +76 +76 +82 +82 +82 +87 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +116 +119 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +189 +188 +188 +190 +191 +194 +194 +196 +196 +196 +199 +198 +201 +201 +200 +200 +200 +202 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +205 +203 +202 +202 +201 +200 +201 +201 +201 +198 +198 +196 +196 +197 +194 +195 +190 +190 +188 +189 +189 +185 +185 +183 +183 +183 +178 +179 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +130 +130 +126 +125 +119 +119 +116 +115 +116 +110 +109 +105 +105 +105 +100 +100 +95 +96 +96 +90 +90 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +54 +55 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +14 +15 +15 +15 +15 +13 +13 +13 +12 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +24 +25 +25 +27 +28 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +51 +55 +54 +58 +58 +58 +64 +64 +64 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +126 +126 +126 +129 +130 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +182 +182 +185 +185 +189 +188 +189 +190 +191 +195 +194 +195 +196 +196 +199 +199 +198 +201 +201 +201 +200 +201 +202 +202 +204 +204 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +201 +200 +200 +201 +198 +198 +198 +196 +197 +197 +197 +197 +195 +194 +191 +191 +190 +189 +190 +184 +185 +184 +183 +182 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +164 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +148 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +126 +125 +120 +119 +116 +115 +115 +109 +110 +106 +105 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +65 +58 +58 +54 +54 +55 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +26 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +42 +43 +46 +47 +50 +51 +51 +54 +54 +58 +58 +60 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +146 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +182 +185 +185 +185 +189 +188 +190 +190 +190 +195 +194 +196 +196 +199 +199 +199 +200 +200 +200 +201 +201 +203 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +202 +202 +201 +200 +201 +201 +201 +199 +199 +197 +196 +195 +194 +195 +191 +191 +188 +189 +188 +185 +185 +183 +183 +182 +179 +179 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +126 +126 +125 +119 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +59 +59 +59 +55 +55 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +47 +46 +51 +51 +54 +54 +54 +58 +59 +64 +65 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +157 +161 +161 +165 +166 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +185 +185 +188 +189 +189 +191 +191 +194 +195 +194 +196 +197 +198 +198 +198 +201 +201 +200 +201 +200 +202 +202 +205 +205 +205 +204 +204 +206 +207 +207 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +201 +201 +200 +200 +199 +198 +199 +197 +196 +195 +195 +194 +191 +190 +191 +190 +191 +188 +188 +185 +184 +184 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +115 +116 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +58 +58 +55 +54 +51 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +36 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +55 +58 +58 +59 +64 +64 +68 +68 +69 +72 +71 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +119 +126 +125 +130 +129 +134 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +179 +179 +179 +182 +182 +184 +185 +185 +188 +188 +191 +191 +190 +194 +194 +197 +197 +197 +198 +198 +200 +200 +201 +201 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +205 +204 +202 +202 +202 +200 +201 +200 +200 +200 +198 +199 +198 +198 +199 +196 +196 +195 +194 +195 +191 +191 +188 +188 +187 +185 +185 +183 +183 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +130 +129 +126 +126 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +105 +100 +100 +96 +96 +89 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +55 +50 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +34 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +12 +15 +15 +15 +15 +15 +17 +18 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +50 +51 +54 +54 +55 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +120 +120 +120 +125 +125 +129 +129 +129 +133 +134 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +188 +189 +188 +190 +190 +195 +195 +195 +196 +196 +199 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +205 +205 +204 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +202 +203 +200 +201 +200 +200 +200 +198 +198 +196 +196 +195 +195 +194 +191 +191 +188 +188 +189 +185 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +150 +147 +147 +147 +144 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +119 +120 +116 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +69 +68 +68 +65 +64 +59 +58 +54 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +15 +15 +16 +17 +17 +20 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +50 +51 +50 +54 +55 +58 +59 +58 +65 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +174 +175 +174 +175 +178 +178 +183 +182 +183 +185 +185 +189 +189 +191 +191 +190 +194 +195 +196 +196 +196 +198 +198 +199 +198 +199 +200 +201 +200 +200 +201 +203 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +197 +197 +195 +195 +195 +190 +190 +188 +189 +188 +185 +185 +183 +183 +183 +179 +178 +175 +174 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +125 +125 +125 +120 +120 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +59 +58 +58 +55 +55 +51 +50 +50 +46 +46 +43 +42 +44 +41 +40 +37 +36 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +25 +25 +24 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +109 +110 +115 +116 +115 +120 +119 +126 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +164 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +183 +183 +185 +184 +185 +184 +185 +189 +189 +190 +191 +191 +195 +195 +196 +197 +197 +199 +199 +200 +200 +200 +200 +200 +202 +203 +205 +205 +205 +205 +204 +204 +205 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +207 +204 +205 +205 +205 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +197 +194 +194 +191 +191 +188 +189 +189 +184 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +126 +125 +120 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +59 +54 +55 +50 +51 +47 +46 +47 +43 +42 +41 +40 +41 +37 +37 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +42 +43 +47 +46 +50 +51 +51 +55 +55 +59 +58 +65 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +116 +115 +115 +119 +119 +125 +125 +125 +129 +130 +133 +133 +133 +139 +139 +142 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +166 +165 +165 +169 +169 +173 +173 +172 +175 +175 +175 +175 +175 +178 +179 +182 +183 +183 +185 +185 +188 +188 +189 +191 +191 +194 +194 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +201 +200 +201 +202 +202 +204 +205 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +198 +196 +196 +196 +194 +194 +190 +190 +190 +189 +188 +185 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +146 +143 +143 +143 +139 +140 +133 +133 +133 +129 +129 +125 +125 +125 +120 +119 +116 +116 +111 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +74 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +50 +51 +46 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +42 +47 +46 +47 +50 +50 +55 +55 +55 +58 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +182 +183 +184 +184 +184 +188 +189 +190 +190 +190 +195 +194 +194 +194 +194 +196 +196 +198 +198 +199 +200 +201 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +203 +203 +202 +200 +201 +200 +200 +200 +198 +198 +196 +196 +196 +195 +194 +190 +191 +190 +189 +188 +184 +184 +185 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +64 +64 +65 +58 +58 +54 +54 +54 +51 +50 +47 +46 +48 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +105 +110 +110 +116 +116 +115 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +172 +175 +175 +179 +179 +179 +182 +183 +183 +183 +183 +185 +184 +188 +189 +189 +190 +191 +195 +195 +197 +196 +197 +199 +198 +201 +200 +200 +200 +201 +202 +202 +202 +204 +204 +205 +204 +205 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +201 +200 +200 +200 +200 +198 +199 +198 +196 +197 +194 +194 +191 +190 +190 +188 +188 +185 +185 +184 +183 +183 +178 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +129 +130 +126 +125 +125 +119 +119 +115 +116 +116 +110 +109 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +65 +64 +58 +58 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +18 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +55 +54 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +95 +100 +100 +106 +106 +106 +110 +109 +116 +115 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +185 +185 +185 +189 +189 +191 +190 +190 +194 +194 +196 +197 +196 +198 +199 +200 +200 +200 +201 +200 +202 +202 +203 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +201 +199 +198 +199 +197 +196 +195 +195 +194 +190 +191 +189 +188 +188 +185 +185 +182 +183 +183 +178 +179 +175 +175 +175 +172 +173 +169 +169 +165 +164 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +130 +125 +125 +120 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +73 +72 +68 +68 +68 +65 +64 +58 +58 +58 +55 +55 +55 +55 +55 +51 +51 +46 +47 +47 +43 +42 +40 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +43 +42 +43 +47 +47 +50 +50 +51 +54 +54 +58 +58 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +100 +106 +106 +106 +105 +106 +110 +110 +115 +115 +115 +120 +120 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +174 +175 +178 +179 +179 +183 +183 +185 +184 +184 +188 +188 +191 +190 +190 +194 +195 +196 +197 +197 +199 +199 +200 +201 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +204 +205 +205 +204 +204 +202 +202 +201 +201 +200 +201 +200 +199 +198 +198 +196 +196 +195 +194 +194 +191 +191 +188 +188 +188 +185 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +126 +125 +125 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +72 +68 +69 +68 +68 +68 +64 +64 +59 +58 +59 +55 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +26 +26 +27 +31 +31 +34 +32 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +50 +54 +55 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +117 +119 +120 +125 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +162 +161 +163 +165 +165 +168 +169 +173 +173 +173 +175 +174 +179 +179 +179 +182 +183 +184 +185 +184 +189 +188 +191 +190 +191 +194 +195 +196 +197 +198 +198 +199 +200 +200 +200 +201 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +204 +204 +204 +204 +204 +203 +202 +202 +203 +203 +200 +200 +201 +200 +200 +198 +199 +196 +197 +197 +194 +194 +190 +190 +189 +188 +188 +185 +184 +183 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +140 +139 +133 +133 +133 +133 +133 +129 +129 +125 +126 +125 +120 +119 +116 +115 +113 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +67 +65 +64 +59 +58 +54 +54 +54 +51 +51 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +34 +31 +31 +28 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +58 +59 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +83 +82 +86 +86 +86 +89 +90 +96 +96 +97 +100 +100 +106 +106 +109 +110 +110 +115 +115 +119 +120 +119 +125 +125 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +188 +189 +189 +190 +190 +195 +195 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +201 +198 +198 +197 +197 +196 +194 +194 +191 +190 +191 +188 +189 +185 +185 +184 +183 +183 +179 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +130 +129 +128 +125 +125 +119 +119 +115 +115 +116 +110 +110 +106 +105 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +51 +50 +46 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +38 +41 +41 +42 +43 +47 +47 +47 +50 +50 +54 +54 +54 +58 +58 +59 +59 +59 +65 +65 +68 +68 +68 +72 +72 +76 +76 +79 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +109 +116 +116 +116 +119 +119 +125 +126 +127 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +182 +182 +185 +185 +189 +188 +188 +190 +190 +195 +195 +194 +197 +196 +198 +198 +198 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +203 +202 +202 +201 +200 +200 +201 +200 +198 +198 +196 +196 +196 +195 +194 +191 +190 +191 +188 +189 +184 +185 +185 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +164 +165 +165 +165 +165 +160 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +134 +133 +134 +129 +129 +125 +125 +125 +119 +119 +119 +119 +120 +115 +116 +109 +110 +110 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +58 +59 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +36 +37 +40 +41 +41 +42 +43 +47 +46 +46 +51 +51 +54 +54 +55 +58 +58 +65 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +112 +116 +116 +119 +119 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +151 +151 +157 +157 +160 +161 +160 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +183 +184 +184 +188 +188 +188 +191 +191 +194 +194 +197 +196 +196 +198 +199 +200 +200 +200 +200 +200 +203 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +201 +199 +199 +196 +196 +197 +194 +194 +190 +190 +189 +188 +189 +184 +185 +183 +183 +182 +178 +179 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +119 +116 +115 +116 +109 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +65 +58 +59 +54 +55 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +16 +17 +18 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +48 +51 +51 +54 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +120 +126 +125 +125 +129 +129 +133 +133 +134 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +182 +185 +185 +189 +189 +189 +191 +190 +194 +194 +195 +196 +197 +198 +198 +198 +200 +201 +201 +200 +200 +202 +203 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +196 +197 +194 +194 +190 +190 +191 +188 +188 +189 +189 +188 +185 +185 +182 +183 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +58 +54 +55 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +39 +41 +40 +43 +43 +47 +47 +47 +51 +50 +55 +55 +55 +58 +59 +59 +59 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +120 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +179 +182 +182 +184 +184 +184 +188 +189 +190 +191 +191 +194 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +207 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +199 +199 +196 +196 +197 +196 +196 +194 +194 +190 +190 +190 +188 +188 +185 +185 +183 +183 +183 +179 +178 +174 +175 +175 +172 +172 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +54 +54 +55 +51 +50 +47 +46 +43 +42 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +37 +37 +38 +41 +41 +43 +43 +43 +47 +47 +46 +47 +47 +51 +50 +54 +54 +54 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +115 +119 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +175 +178 +178 +182 +182 +182 +184 +185 +188 +189 +188 +190 +191 +194 +194 +195 +196 +197 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +205 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +197 +197 +194 +194 +190 +191 +191 +188 +189 +184 +184 +182 +183 +182 +178 +178 +175 +175 +175 +173 +173 +173 +172 +172 +169 +169 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +105 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +65 +58 +59 +54 +55 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +20 +21 +21 +23 +25 +25 +27 +27 +31 +31 +30 +33 +33 +37 +37 +37 +41 +41 +40 +41 +41 +42 +42 +47 +47 +47 +50 +50 +54 +55 +56 +59 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +109 +110 +110 +116 +115 +119 +120 +119 +125 +126 +130 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +183 +183 +184 +185 +188 +188 +189 +190 +190 +195 +194 +197 +196 +196 +198 +199 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +202 +201 +201 +200 +201 +201 +198 +198 +196 +197 +195 +194 +195 +190 +190 +188 +188 +189 +184 +185 +182 +183 +182 +179 +178 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +130 +129 +126 +125 +126 +119 +120 +115 +116 +109 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +58 +59 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +36 +36 +33 +33 +31 +31 +31 +26 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +12 +15 +15 +17 +16 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +50 +50 +54 +54 +59 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +184 +185 +188 +189 +191 +190 +190 +194 +194 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +200 +201 +200 +200 +201 +199 +198 +196 +196 +197 +194 +194 +190 +190 +190 +188 +188 +189 +188 +188 +184 +185 +183 +182 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +139 +140 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +116 +116 +110 +110 +110 +106 +106 +99 +100 +100 +96 +96 +89 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +55 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +16 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +15 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +59 +65 +64 +68 +68 +69 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +179 +179 +179 +183 +182 +185 +184 +185 +188 +188 +191 +190 +190 +194 +194 +196 +197 +196 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +197 +196 +196 +194 +195 +191 +190 +190 +189 +189 +185 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +126 +119 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +59 +55 +54 +51 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +33 +31 +32 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +26 +31 +31 +32 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +59 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +119 +120 +119 +125 +126 +129 +130 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +184 +184 +188 +188 +189 +190 +191 +194 +195 +195 +197 +196 +198 +198 +201 +200 +201 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +201 +202 +203 +202 +200 +200 +200 +200 +201 +198 +199 +196 +196 +195 +195 +195 +190 +191 +189 +188 +188 +185 +185 +182 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +119 +119 +120 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +69 +64 +64 +59 +59 +55 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +58 +59 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +178 +182 +182 +182 +184 +184 +189 +189 +189 +191 +190 +194 +194 +196 +196 +196 +199 +198 +200 +201 +200 +200 +201 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +202 +202 +203 +201 +200 +200 +200 +199 +198 +199 +196 +197 +194 +195 +195 +191 +191 +189 +188 +188 +184 +184 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +168 +169 +165 +164 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +59 +59 +55 +55 +54 +50 +51 +47 +47 +47 +43 +42 +41 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +42 +43 +42 +47 +47 +51 +51 +50 +55 +54 +59 +58 +59 +65 +64 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +119 +125 +125 +130 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +162 +161 +165 +165 +169 +168 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +184 +184 +184 +188 +189 +191 +191 +191 +195 +194 +195 +195 +194 +197 +196 +198 +199 +198 +201 +201 +200 +201 +202 +202 +203 +205 +204 +205 +205 +204 +207 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +207 +206 +207 +206 +206 +207 +204 +204 +205 +205 +205 +202 +202 +200 +200 +201 +201 +200 +199 +199 +199 +197 +197 +195 +194 +195 +191 +191 +189 +188 +188 +185 +185 +182 +183 +183 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +134 +129 +129 +125 +125 +126 +119 +120 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +87 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +24 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +55 +58 +58 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +120 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +184 +185 +185 +188 +188 +191 +190 +192 +195 +194 +197 +196 +198 +199 +199 +200 +200 +200 +200 +200 +202 +203 +203 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +207 +206 +204 +205 +204 +204 +204 +202 +202 +202 +200 +201 +201 +200 +200 +198 +199 +196 +197 +194 +194 +195 +190 +191 +188 +189 +189 +184 +185 +182 +183 +182 +179 +178 +175 +174 +175 +172 +172 +169 +168 +170 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +130 +126 +125 +120 +120 +119 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +43 +42 +43 +41 +41 +37 +37 +37 +34 +33 +31 +31 +32 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +51 +51 +51 +55 +55 +58 +58 +58 +64 +64 +64 +64 +64 +69 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +97 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +119 +126 +125 +125 +130 +130 +134 +133 +133 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +178 +179 +183 +183 +185 +184 +185 +188 +189 +191 +190 +190 +194 +194 +194 +195 +194 +196 +196 +199 +198 +199 +200 +200 +200 +201 +201 +203 +203 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +207 +204 +205 +205 +204 +203 +202 +202 +200 +200 +201 +200 +201 +199 +199 +197 +197 +196 +194 +194 +191 +190 +190 +189 +189 +184 +185 +185 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +152 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +120 +116 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +73 +73 +68 +68 +69 +64 +64 +64 +64 +64 +59 +58 +54 +55 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +15 +15 +15 +18 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +51 +51 +55 +54 +55 +59 +59 +65 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +116 +120 +120 +125 +125 +128 +129 +129 +133 +134 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +174 +175 +179 +178 +178 +183 +182 +183 +182 +182 +185 +185 +189 +188 +189 +190 +191 +195 +195 +195 +196 +197 +199 +198 +200 +200 +200 +201 +200 +202 +202 +203 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +201 +200 +198 +198 +196 +196 +196 +194 +195 +191 +190 +188 +189 +188 +185 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +115 +109 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +68 +65 +64 +59 +58 +59 +54 +55 +50 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +36 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +18 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +47 +51 +50 +55 +55 +59 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +120 +125 +125 +125 +125 +125 +129 +130 +133 +134 +133 +140 +139 +143 +143 +145 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +183 +183 +183 +184 +185 +189 +189 +190 +191 +191 +194 +195 +197 +197 +197 +199 +199 +201 +200 +200 +200 +200 +202 +202 +203 +204 +205 +204 +205 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +205 +204 +204 +205 +204 +203 +203 +203 +201 +201 +201 +200 +199 +199 +198 +197 +197 +194 +195 +194 +190 +191 +189 +189 +188 +185 +185 +183 +183 +183 +179 +178 +175 +174 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +130 +125 +126 +119 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +69 +69 +64 +64 +59 +59 +59 +55 +54 +54 +55 +55 +51 +51 +47 +46 +47 +42 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +16 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +43 +43 +43 +46 +47 +50 +51 +51 +54 +54 +58 +58 +58 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +115 +119 +120 +125 +125 +127 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +185 +189 +189 +191 +191 +191 +195 +194 +196 +196 +196 +198 +199 +200 +201 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +204 +205 +204 +204 +204 +203 +203 +200 +200 +200 +201 +201 +198 +198 +198 +197 +197 +195 +195 +194 +191 +190 +189 +189 +189 +185 +184 +183 +182 +179 +178 +179 +175 +175 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +150 +147 +147 +148 +143 +143 +139 +139 +134 +133 +133 +130 +130 +125 +125 +126 +120 +119 +120 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +65 +64 +64 +59 +59 +54 +54 +51 +51 +50 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +50 +54 +54 +59 +58 +61 +65 +65 +68 +68 +73 +73 +72 +76 +76 +82 +82 +82 +86 +86 +86 +85 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +115 +119 +119 +119 +125 +126 +130 +129 +129 +133 +133 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +154 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +188 +189 +190 +190 +194 +195 +195 +197 +196 +196 +197 +196 +199 +198 +200 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +207 +207 +206 +206 +206 +207 +206 +207 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +199 +199 +197 +196 +195 +194 +195 +190 +190 +189 +189 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +144 +143 +143 +139 +139 +133 +133 +133 +130 +130 +125 +125 +123 +120 +119 +116 +115 +109 +110 +110 +106 +105 +100 +100 +100 +96 +97 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +54 +50 +51 +46 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +14 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +32 +32 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +51 +50 +55 +55 +58 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +91 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +116 +116 +116 +120 +120 +125 +125 +125 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +152 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +182 +183 +184 +184 +189 +188 +189 +191 +191 +191 +191 +191 +194 +194 +197 +197 +196 +199 +199 +200 +200 +201 +201 +201 +202 +203 +204 +204 +205 +205 +204 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +205 +205 +202 +202 +201 +200 +200 +200 +200 +199 +199 +198 +197 +196 +196 +196 +196 +196 +196 +195 +194 +195 +190 +191 +188 +189 +189 +184 +184 +182 +183 +178 +179 +179 +175 +175 +173 +172 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +144 +143 +139 +139 +133 +134 +133 +129 +129 +125 +125 +125 +120 +119 +119 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +59 +59 +54 +53 +51 +51 +46 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +26 +21 +21 +21 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +40 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +56 +58 +58 +64 +64 +67 +68 +68 +72 +72 +76 +76 +77 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +109 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +148 +151 +151 +157 +157 +156 +161 +161 +165 +165 +166 +168 +169 +173 +173 +173 +174 +175 +179 +178 +179 +183 +183 +185 +184 +184 +188 +188 +190 +191 +195 +194 +194 +196 +196 +196 +197 +197 +198 +198 +201 +201 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +203 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +196 +194 +194 +195 +191 +190 +189 +188 +189 +185 +185 +182 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +157 +157 +156 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +126 +125 +120 +120 +120 +116 +116 +109 +109 +110 +105 +106 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +55 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +36 +41 +41 +42 +43 +43 +47 +46 +51 +50 +50 +54 +55 +54 +54 +55 +59 +59 +64 +64 +65 +68 +68 +72 +72 +74 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +185 +185 +185 +185 +184 +188 +188 +190 +190 +190 +194 +194 +196 +196 +197 +199 +198 +200 +201 +201 +201 +200 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +207 +205 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +201 +200 +200 +199 +199 +196 +197 +196 +195 +194 +191 +190 +191 +188 +189 +184 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +164 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +126 +120 +119 +115 +115 +116 +109 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +91 +86 +86 +82 +82 +82 +76 +77 +72 +72 +72 +68 +68 +64 +64 +65 +59 +59 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +48 +50 +50 +55 +54 +59 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +109 +116 +116 +120 +120 +119 +125 +126 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +181 +182 +182 +184 +185 +189 +188 +191 +191 +191 +195 +194 +196 +196 +196 +199 +199 +200 +200 +201 +200 +200 +203 +203 +202 +204 +205 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +201 +201 +199 +199 +196 +196 +194 +194 +194 +191 +190 +189 +188 +188 +185 +185 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +129 +129 +125 +125 +120 +119 +119 +116 +115 +109 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +73 +72 +69 +69 +69 +64 +65 +58 +58 +58 +55 +54 +51 +50 +50 +46 +47 +43 +42 +43 +41 +40 +37 +36 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +42 +47 +47 +47 +50 +51 +54 +54 +54 +58 +59 +65 +64 +64 +68 +68 +73 +72 +72 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +125 +130 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +182 +185 +185 +188 +189 +189 +191 +190 +195 +195 +194 +197 +197 +199 +198 +198 +201 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +204 +204 +205 +204 +205 +202 +203 +201 +200 +200 +201 +200 +198 +199 +197 +196 +196 +194 +195 +195 +195 +195 +191 +191 +189 +189 +188 +185 +185 +183 +182 +181 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +144 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +120 +119 +116 +116 +115 +110 +109 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +65 +58 +58 +54 +55 +55 +50 +50 +47 +47 +47 +43 +43 +40 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +58 +58 +64 +64 +69 +68 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +119 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +183 +182 +185 +185 +185 +189 +188 +190 +190 +190 +195 +195 +196 +196 +196 +199 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +201 +200 +200 +201 +201 +198 +198 +199 +196 +196 +195 +195 +191 +190 +191 +189 +189 +185 +185 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +119 +116 +115 +115 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +55 +54 +54 +51 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +20 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +46 +47 +51 +51 +54 +54 +54 +58 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +120 +125 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +182 +184 +184 +185 +188 +188 +191 +191 +191 +195 +194 +194 +195 +195 +197 +196 +198 +198 +198 +201 +200 +200 +200 +201 +202 +203 +204 +205 +204 +205 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +205 +205 +202 +203 +200 +201 +200 +201 +200 +198 +199 +199 +196 +196 +195 +194 +194 +191 +191 +188 +189 +189 +185 +185 +182 +183 +178 +179 +178 +175 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +120 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +64 +58 +58 +54 +54 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +16 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +32 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +58 +59 +64 +65 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +150 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +174 +179 +179 +178 +183 +183 +183 +183 +183 +184 +184 +189 +189 +189 +191 +191 +194 +195 +194 +196 +197 +198 +198 +200 +201 +200 +201 +200 +203 +202 +202 +204 +205 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +204 +204 +204 +205 +204 +202 +202 +200 +200 +200 +200 +200 +199 +199 +199 +196 +197 +194 +194 +190 +191 +191 +188 +188 +185 +184 +185 +183 +182 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +115 +116 +116 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +55 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +58 +58 +59 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +97 +96 +96 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +119 +126 +126 +129 +129 +129 +133 +133 +140 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +174 +175 +179 +178 +179 +183 +183 +184 +185 +184 +188 +189 +190 +191 +194 +194 +195 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +199 +198 +199 +196 +196 +194 +195 +195 +191 +190 +189 +188 +189 +185 +185 +183 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +130 +125 +126 +119 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +77 +73 +72 +69 +68 +64 +64 +64 +58 +59 +55 +55 +55 +51 +51 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +32 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +54 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +109 +109 +116 +116 +119 +120 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +184 +185 +184 +189 +189 +191 +191 +191 +195 +195 +194 +194 +194 +197 +197 +198 +198 +199 +200 +201 +200 +200 +201 +202 +202 +205 +204 +204 +205 +205 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +205 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +199 +198 +197 +196 +195 +194 +194 +191 +191 +188 +189 +188 +184 +185 +183 +183 +179 +179 +179 +175 +176 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +134 +133 +133 +130 +129 +125 +125 +125 +119 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +69 +68 +68 +69 +65 +64 +58 +58 +59 +55 +55 +51 +51 +48 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +32 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +50 +51 +50 +55 +54 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +100 +106 +106 +109 +110 +111 +116 +116 +119 +119 +126 +126 +126 +129 +129 +133 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +174 +175 +179 +179 +179 +179 +179 +183 +183 +185 +184 +185 +189 +189 +191 +190 +192 +195 +195 +197 +196 +198 +198 +198 +200 +200 +200 +200 +201 +203 +202 +204 +204 +204 +205 +204 +206 +207 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +201 +201 +200 +201 +201 +198 +199 +197 +197 +195 +194 +195 +190 +191 +189 +188 +189 +185 +185 +183 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +116 +109 +110 +105 +106 +105 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +59 +59 +58 +54 +55 +51 +50 +50 +47 +47 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +51 +51 +54 +55 +59 +58 +59 +65 +64 +68 +68 +69 +72 +72 +76 +77 +76 +82 +82 +86 +86 +87 +90 +90 +96 +95 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +116 +115 +115 +120 +120 +126 +125 +125 +129 +129 +133 +133 +135 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +160 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +179 +178 +179 +182 +183 +184 +185 +185 +189 +188 +191 +191 +190 +194 +194 +196 +197 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +204 +205 +204 +204 +205 +202 +203 +201 +201 +200 +200 +200 +198 +198 +198 +197 +197 +195 +194 +194 +191 +191 +188 +188 +189 +184 +185 +182 +183 +182 +179 +178 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +134 +133 +129 +130 +126 +125 +125 +119 +120 +116 +116 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +65 +64 +64 +65 +58 +59 +54 +54 +54 +51 +51 +46 +47 +45 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +26 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +47 +47 +51 +51 +51 +54 +54 +58 +59 +58 +65 +64 +69 +68 +68 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +122 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +160 +161 +165 +165 +168 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +182 +183 +185 +184 +189 +189 +189 +191 +190 +195 +194 +195 +197 +197 +199 +199 +200 +200 +201 +200 +200 +202 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +205 +205 +204 +204 +202 +202 +202 +201 +201 +201 +200 +200 +198 +198 +196 +197 +196 +194 +195 +191 +191 +191 +189 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +158 +151 +151 +152 +147 +147 +143 +143 +140 +139 +140 +134 +133 +130 +130 +130 +125 +126 +125 +125 +126 +120 +120 +116 +115 +115 +110 +109 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +61 +58 +58 +55 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +20 +25 +25 +26 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +42 +43 +42 +47 +46 +50 +51 +50 +54 +54 +58 +58 +64 +64 +64 +68 +69 +72 +72 +72 +76 +76 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +109 +110 +110 +116 +116 +119 +120 +119 +125 +126 +125 +125 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +188 +188 +188 +190 +191 +195 +195 +195 +196 +196 +199 +198 +198 +201 +201 +201 +200 +201 +203 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +197 +196 +196 +195 +195 +190 +190 +190 +188 +189 +185 +184 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +156 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +120 +120 +115 +115 +115 +110 +110 +106 +106 +105 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +77 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +55 +51 +50 +51 +47 +46 +43 +42 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +22 +21 +19 +19 +17 +17 +17 +15 +15 +15 +16 +15 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +46 +51 +51 +55 +55 +55 +59 +59 +65 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +97 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +130 +130 +133 +133 +139 +140 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +172 +175 +175 +178 +179 +178 +183 +183 +182 +182 +183 +184 +184 +189 +189 +188 +191 +191 +195 +194 +194 +196 +197 +199 +198 +198 +200 +201 +200 +201 +203 +202 +202 +204 +204 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +205 +204 +204 +204 +203 +202 +202 +200 +200 +200 +201 +200 +199 +198 +197 +196 +197 +194 +194 +191 +190 +191 +188 +189 +185 +185 +185 +183 +182 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +158 +157 +151 +151 +147 +148 +147 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +120 +119 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +59 +54 +54 +51 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +50 +50 +54 +54 +58 +58 +61 +64 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +107 +110 +110 +116 +116 +119 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +144 +147 +147 +148 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +183 +184 +184 +189 +188 +189 +191 +191 +194 +195 +196 +196 +196 +198 +198 +200 +201 +201 +201 +201 +203 +202 +202 +204 +204 +204 +205 +204 +206 +206 +207 +207 +207 +206 +207 +207 +206 +207 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +203 +202 +201 +201 +200 +200 +200 +198 +198 +197 +196 +197 +194 +195 +190 +191 +188 +188 +189 +185 +184 +183 +182 +182 +179 +179 +179 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +140 +139 +139 +133 +133 +129 +129 +130 +126 +125 +120 +120 +116 +115 +116 +110 +110 +106 +106 +106 +99 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +65 +65 +59 +58 +55 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +26 +25 +25 +20 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +30 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +47 +46 +51 +51 +54 +54 +54 +58 +59 +65 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +119 +125 +125 +129 +130 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +185 +185 +185 +188 +188 +190 +190 +190 +194 +195 +197 +196 +197 +198 +199 +200 +201 +200 +200 +200 +202 +202 +203 +205 +204 +204 +205 +207 +206 +206 +206 +207 +206 +206 +207 +206 +207 +207 +206 +206 +207 +206 +205 +205 +204 +204 +204 +203 +203 +203 +200 +201 +200 +200 +199 +198 +199 +196 +197 +195 +195 +195 +191 +191 +191 +191 +190 +188 +189 +185 +185 +184 +182 +183 +178 +179 +177 +175 +175 +173 +172 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +126 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +69 +68 +64 +65 +65 +59 +58 +55 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +46 +47 +47 +47 +47 +51 +51 +55 +54 +55 +58 +58 +64 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +109 +110 +115 +116 +119 +120 +119 +126 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +184 +189 +189 +188 +191 +191 +195 +194 +195 +197 +197 +199 +198 +201 +201 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +205 +204 +204 +204 +202 +202 +203 +200 +200 +200 +201 +200 +200 +201 +199 +199 +198 +196 +196 +194 +195 +195 +190 +191 +189 +189 +185 +185 +184 +183 +183 +179 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +115 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +54 +54 +54 +50 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +22 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +20 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +48 +51 +50 +54 +54 +59 +59 +59 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +119 +125 +126 +130 +130 +129 +133 +134 +139 +139 +139 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +161 +164 +164 +169 +169 +169 +173 +173 +174 +175 +175 +179 +178 +183 +183 +183 +184 +185 +188 +189 +191 +190 +190 +195 +195 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +203 +204 +204 +205 +204 +205 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +203 +202 +202 +200 +200 +200 +201 +199 +198 +199 +196 +197 +194 +194 +195 +191 +190 +188 +188 +189 +184 +185 +185 +185 +184 +183 +182 +179 +179 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +130 +125 +125 +120 +119 +120 +115 +115 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +75 +76 +72 +72 +69 +68 +68 +64 +64 +58 +59 +58 +55 +55 +51 +50 +50 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +51 +55 +54 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +109 +115 +116 +119 +120 +120 +125 +126 +129 +130 +134 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +179 +178 +178 +182 +183 +184 +185 +185 +188 +189 +191 +190 +190 +194 +194 +196 +196 +197 +198 +199 +200 +201 +201 +200 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +199 +198 +198 +198 +198 +196 +196 +194 +194 +195 +191 +191 +188 +188 +185 +184 +185 +183 +183 +179 +179 +178 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +126 +119 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +65 +58 +58 +59 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +38 +37 +41 +40 +43 +42 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +64 +64 +64 +68 +68 +73 +72 +72 +76 +77 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +116 +115 +115 +119 +119 +125 +126 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +189 +189 +190 +191 +191 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +201 +200 +202 +203 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +205 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +199 +197 +196 +197 +194 +194 +190 +191 +190 +188 +189 +189 +189 +189 +185 +185 +183 +183 +183 +179 +178 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +126 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +69 +64 +64 +65 +58 +58 +55 +55 +55 +51 +50 +46 +47 +47 +43 +42 +40 +41 +41 +37 +37 +33 +33 +34 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +20 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +43 +43 +43 +47 +46 +51 +51 +50 +54 +55 +59 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +83 +82 +87 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +119 +119 +126 +125 +130 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +185 +185 +185 +188 +188 +191 +191 +191 +195 +194 +194 +195 +195 +197 +196 +199 +199 +198 +200 +200 +200 +200 +201 +202 +203 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +207 +205 +204 +205 +205 +204 +203 +202 +200 +200 +200 +200 +200 +199 +198 +198 +196 +197 +194 +194 +194 +190 +190 +188 +188 +189 +185 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +134 +130 +129 +125 +125 +125 +119 +120 +116 +116 +116 +110 +109 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +54 +55 +55 +51 +50 +47 +47 +47 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +40 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +59 +58 +64 +65 +65 +68 +68 +72 +72 +77 +77 +76 +82 +82 +86 +85 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +126 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +176 +175 +175 +179 +178 +183 +182 +183 +184 +184 +184 +184 +184 +189 +189 +190 +191 +191 +195 +195 +196 +196 +196 +199 +198 +200 +201 +200 +201 +201 +202 +202 +202 +202 +203 +204 +204 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +201 +200 +200 +201 +200 +199 +199 +198 +197 +196 +194 +195 +191 +191 +191 +188 +189 +185 +184 +184 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +120 +115 +116 +110 +110 +106 +106 +106 +99 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +59 +54 +55 +55 +50 +50 +47 +47 +46 +43 +43 +43 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +29 +27 +27 +25 +24 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +58 +65 +64 +68 +69 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +184 +189 +188 +189 +191 +191 +194 +194 +194 +196 +196 +197 +196 +197 +199 +198 +200 +201 +201 +200 +200 +202 +202 +203 +205 +205 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +204 +202 +203 +200 +200 +201 +200 +200 +199 +198 +199 +197 +196 +194 +195 +194 +191 +191 +188 +189 +188 +184 +185 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +158 +157 +157 +151 +151 +146 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +126 +126 +126 +119 +120 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +72 +73 +73 +68 +69 +64 +64 +64 +59 +58 +58 +58 +58 +55 +54 +50 +50 +50 +46 +47 +43 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +20 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +55 +58 +59 +59 +64 +64 +69 +68 +68 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +99 +105 +106 +110 +110 +110 +115 +116 +119 +120 +120 +125 +126 +130 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +184 +184 +184 +185 +184 +188 +188 +190 +190 +191 +194 +194 +197 +197 +198 +198 +199 +200 +201 +200 +200 +200 +202 +203 +204 +204 +205 +204 +205 +207 +207 +206 +206 +207 +207 +207 +207 +207 +206 +207 +207 +206 +207 +206 +205 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +201 +198 +198 +198 +196 +197 +195 +195 +194 +190 +191 +189 +189 +185 +185 +185 +183 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +144 +142 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +120 +119 +116 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +56 +55 +55 +50 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +55 +58 +58 +65 +64 +65 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +89 +97 +96 +96 +100 +100 +106 +105 +109 +110 +110 +116 +115 +119 +120 +119 +125 +125 +126 +126 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +183 +185 +185 +188 +189 +190 +191 +191 +194 +195 +197 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +204 +205 +205 +205 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +205 +204 +204 +205 +204 +203 +202 +202 +201 +201 +200 +201 +199 +198 +198 +196 +197 +195 +194 +194 +190 +190 +189 +189 +188 +185 +185 +183 +182 +183 +178 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +116 +116 +116 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +81 +82 +82 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +59 +54 +54 +54 +54 +55 +50 +50 +46 +47 +47 +43 +43 +41 +40 +37 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +20 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +26 +31 +31 +33 +33 +33 +37 +37 +40 +40 +44 +43 +42 +47 +47 +51 +50 +51 +54 +55 +58 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +116 +116 +120 +120 +125 +125 +127 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +147 +147 +147 +151 +152 +157 +157 +157 +161 +161 +165 +165 +168 +169 +170 +173 +173 +175 +175 +175 +179 +178 +183 +182 +182 +185 +184 +189 +188 +189 +191 +191 +195 +194 +195 +196 +197 +198 +199 +201 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +201 +201 +200 +200 +199 +198 +196 +196 +196 +194 +195 +190 +190 +190 +188 +189 +184 +184 +183 +182 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +129 +129 +125 +125 +125 +126 +126 +119 +120 +116 +116 +116 +110 +110 +106 +106 +107 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +59 +57 +55 +54 +51 +51 +46 +46 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +42 +43 +46 +47 +47 +50 +50 +54 +55 +55 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +109 +110 +115 +115 +116 +119 +119 +125 +125 +125 +130 +129 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +162 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +188 +190 +191 +190 +195 +194 +196 +196 +197 +198 +198 +200 +200 +201 +201 +201 +202 +202 +202 +205 +204 +204 +205 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +205 +204 +204 +204 +202 +202 +202 +200 +201 +200 +201 +200 +199 +198 +196 +196 +195 +195 +195 +190 +190 +188 +189 +188 +185 +185 +183 +183 +183 +179 +179 +175 +174 +175 +173 +173 +169 +169 +170 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +144 +139 +139 +133 +133 +133 +129 +129 +126 +126 +126 +119 +119 +116 +115 +109 +110 +110 +105 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +86 +86 +82 +83 +79 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +59 +55 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +22 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +54 +55 +58 +59 +65 +65 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +117 +116 +120 +120 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +178 +179 +179 +183 +182 +185 +184 +185 +188 +189 +191 +190 +190 +195 +194 +197 +196 +197 +198 +198 +200 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +205 +204 +205 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +196 +196 +195 +194 +195 +190 +190 +189 +188 +189 +185 +185 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +133 +133 +129 +129 +129 +126 +126 +120 +119 +120 +116 +116 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +65 +58 +58 +54 +54 +55 +50 +50 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +38 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +59 +59 +64 +65 +68 +68 +67 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +117 +120 +120 +125 +125 +130 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +172 +174 +175 +174 +179 +178 +182 +183 +183 +184 +185 +189 +189 +189 +190 +191 +194 +194 +195 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +197 +195 +194 +190 +190 +189 +189 +189 +184 +184 +182 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +126 +126 +126 +120 +119 +115 +116 +116 +110 +110 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +56 +58 +58 +64 +64 +69 +69 +68 +73 +72 +76 +77 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +95 +96 +99 +100 +105 +106 +106 +110 +110 +115 +116 +116 +120 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +160 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +189 +188 +190 +190 +191 +195 +194 +196 +197 +197 +199 +199 +201 +200 +200 +200 +200 +202 +203 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +201 +200 +200 +200 +199 +198 +198 +196 +196 +195 +194 +194 +190 +190 +189 +188 +188 +184 +184 +184 +184 +184 +183 +183 +179 +179 +178 +175 +175 +173 +172 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +140 +140 +133 +133 +129 +129 +126 +125 +125 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +55 +54 +55 +51 +50 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +46 +46 +47 +50 +51 +54 +54 +55 +59 +59 +58 +58 +58 +64 +64 +69 +69 +68 +72 +72 +77 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +168 +169 +169 +173 +173 +174 +175 +179 +178 +178 +183 +183 +184 +184 +184 +188 +188 +191 +191 +190 +195 +194 +197 +197 +196 +198 +198 +200 +200 +201 +200 +201 +202 +203 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +205 +204 +205 +205 +204 +202 +203 +201 +201 +200 +200 +200 +198 +198 +198 +196 +196 +197 +196 +196 +195 +194 +190 +190 +191 +188 +189 +185 +184 +185 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +119 +116 +116 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +77 +76 +76 +73 +72 +68 +68 +69 +64 +64 +58 +58 +58 +55 +55 +51 +51 +47 +47 +46 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +46 +47 +46 +50 +50 +55 +54 +56 +59 +59 +64 +64 +68 +69 +69 +73 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +115 +115 +120 +120 +119 +125 +125 +129 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +184 +184 +188 +189 +188 +191 +191 +195 +195 +197 +196 +197 +199 +198 +200 +200 +200 +200 +201 +200 +201 +201 +202 +202 +204 +204 +204 +205 +205 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +204 +204 +204 +203 +202 +200 +200 +200 +201 +200 +198 +198 +198 +196 +197 +195 +194 +191 +190 +191 +189 +189 +185 +185 +184 +183 +183 +183 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +120 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +89 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +65 +64 +58 +59 +55 +54 +55 +51 +51 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +32 +34 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +42 +47 +47 +51 +50 +51 +54 +55 +58 +58 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +178 +179 +182 +183 +185 +185 +185 +189 +188 +191 +191 +190 +194 +194 +196 +197 +197 +198 +199 +201 +200 +201 +201 +200 +202 +202 +203 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +203 +202 +202 +200 +201 +200 +200 +200 +198 +198 +197 +196 +197 +194 +195 +195 +195 +194 +190 +190 +189 +189 +189 +184 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +134 +129 +130 +125 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +99 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +65 +58 +58 +55 +54 +55 +51 +50 +47 +46 +47 +43 +42 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +18 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +58 +59 +65 +64 +68 +68 +72 +72 +73 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +109 +115 +116 +120 +119 +125 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +174 +179 +178 +179 +183 +183 +185 +185 +184 +188 +188 +190 +191 +191 +194 +195 +196 +196 +196 +199 +198 +201 +201 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +205 +204 +204 +206 +207 +206 +207 +207 +206 +206 +206 +206 +207 +206 +207 +207 +206 +204 +204 +204 +204 +205 +202 +202 +202 +201 +201 +201 +201 +201 +200 +200 +198 +198 +198 +196 +197 +194 +195 +191 +190 +191 +189 +189 +185 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +126 +126 +126 +119 +119 +116 +115 +115 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +24 +25 +26 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +18 +18 +19 +21 +21 +25 +24 +25 +27 +27 +31 +32 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +50 +54 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +144 +147 +148 +151 +151 +158 +157 +157 +161 +161 +165 +164 +164 +169 +169 +169 +169 +168 +173 +173 +175 +175 +174 +179 +179 +182 +182 +183 +185 +185 +189 +188 +190 +190 +190 +194 +194 +196 +196 +196 +198 +198 +199 +199 +198 +201 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +205 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +201 +200 +201 +200 +201 +198 +198 +198 +196 +196 +194 +194 +194 +191 +190 +189 +189 +189 +184 +185 +182 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +126 +125 +119 +120 +115 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +65 +59 +58 +54 +55 +55 +51 +50 +47 +46 +47 +43 +43 +41 +40 +37 +37 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +26 +25 +28 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +55 +59 +58 +58 +65 +65 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +109 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +174 +175 +175 +178 +179 +183 +182 +182 +185 +185 +185 +185 +184 +188 +189 +191 +190 +191 +194 +194 +196 +196 +196 +199 +199 +200 +200 +200 +200 +200 +202 +202 +202 +202 +202 +204 +204 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +201 +201 +198 +198 +199 +196 +197 +194 +195 +190 +190 +191 +189 +188 +185 +184 +184 +183 +182 +179 +178 +178 +174 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +125 +119 +119 +115 +115 +116 +109 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +62 +59 +58 +54 +54 +50 +51 +50 +47 +47 +43 +43 +42 +41 +41 +41 +41 +41 +37 +37 +32 +33 +34 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +46 +50 +50 +51 +55 +55 +59 +59 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +120 +126 +126 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +164 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +188 +188 +189 +190 +190 +194 +194 +194 +197 +196 +196 +196 +196 +198 +198 +200 +200 +201 +200 +201 +203 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +205 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +199 +197 +196 +194 +194 +194 +190 +191 +189 +189 +189 +185 +185 +183 +183 +182 +179 +179 +175 +175 +173 +172 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +140 +133 +133 +129 +130 +126 +125 +125 +120 +120 +116 +115 +116 +110 +110 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +65 +64 +65 +65 +58 +58 +54 +54 +55 +50 +51 +46 +47 +45 +43 +42 +41 +41 +37 +37 +36 +32 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +54 +54 +55 +54 +59 +59 +65 +64 +64 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +89 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +111 +115 +115 +119 +120 +126 +126 +126 +129 +129 +133 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +162 +165 +165 +169 +169 +168 +173 +173 +175 +175 +174 +179 +179 +178 +179 +179 +183 +183 +185 +185 +185 +188 +188 +190 +190 +194 +195 +194 +196 +197 +199 +198 +199 +201 +200 +200 +200 +200 +202 +202 +205 +204 +205 +205 +204 +206 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +201 +199 +198 +199 +197 +196 +194 +195 +191 +190 +191 +188 +188 +185 +184 +185 +183 +183 +183 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +120 +115 +115 +109 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +69 +66 +64 +64 +58 +58 +54 +54 +55 +50 +51 +47 +47 +46 +43 +43 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +105 +106 +105 +110 +110 +115 +115 +115 +119 +119 +119 +120 +119 +126 +125 +129 +129 +130 +133 +133 +139 +140 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +168 +173 +173 +173 +175 +175 +178 +179 +182 +183 +183 +184 +184 +188 +188 +188 +191 +191 +191 +191 +191 +195 +194 +197 +197 +197 +198 +199 +201 +200 +201 +200 +201 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +201 +201 +200 +201 +199 +198 +198 +196 +196 +195 +194 +194 +191 +190 +188 +188 +189 +185 +185 +182 +182 +182 +179 +179 +175 +175 +173 +173 +172 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +126 +126 +125 +119 +119 +116 +115 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +68 +64 +64 +64 +64 +64 +58 +58 +55 +54 +55 +51 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +24 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +20 +25 +25 +27 +27 +27 +31 +31 +33 +33 +38 +37 +37 +41 +40 +43 +43 +43 +46 +47 +50 +51 +51 +54 +55 +58 +58 +59 +64 +64 +68 +68 +68 +72 +73 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +122 +125 +125 +129 +129 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +178 +182 +183 +183 +185 +185 +188 +188 +188 +191 +190 +194 +195 +195 +196 +196 +198 +198 +200 +200 +201 +200 +201 +202 +203 +203 +205 +204 +205 +205 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +200 +201 +201 +201 +201 +199 +198 +199 +196 +197 +194 +195 +194 +190 +191 +189 +189 +185 +185 +184 +183 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +77 +72 +72 +68 +69 +68 +65 +64 +58 +59 +58 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +55 +59 +59 +64 +64 +69 +69 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +130 +129 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +185 +189 +189 +190 +190 +191 +194 +194 +196 +196 +197 +198 +199 +201 +200 +200 +200 +201 +203 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +204 +205 +204 +205 +204 +202 +202 +202 +201 +201 +200 +200 +201 +198 +198 +196 +196 +195 +194 +194 +190 +191 +188 +188 +189 +185 +185 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +170 +164 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +130 +130 +125 +126 +123 +120 +119 +116 +116 +109 +110 +109 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +73 +69 +68 +64 +64 +64 +58 +59 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +38 +41 +41 +43 +43 +47 +47 +46 +51 +50 +55 +54 +55 +58 +59 +58 +58 +59 +64 +65 +68 +68 +68 +72 +72 +77 +76 +79 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +109 +110 +115 +116 +116 +120 +119 +126 +126 +129 +129 +130 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +182 +185 +185 +189 +189 +189 +190 +191 +194 +194 +194 +197 +196 +199 +198 +199 +200 +200 +201 +201 +203 +202 +202 +204 +204 +204 +204 +204 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +195 +194 +190 +190 +190 +189 +189 +185 +185 +185 +183 +183 +179 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +133 +130 +130 +126 +126 +126 +119 +120 +120 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +96 +95 +97 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +73 +68 +69 +69 +64 +64 +59 +59 +59 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +15 +14 +15 +17 +17 +19 +19 +19 +20 +22 +24 +25 +26 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +59 +58 +59 +64 +64 +68 +69 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +87 +86 +90 +90 +96 +95 +96 +100 +100 +106 +106 +107 +110 +109 +116 +116 +120 +120 +120 +125 +126 +129 +130 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +174 +179 +179 +183 +183 +183 +184 +185 +188 +188 +189 +191 +191 +194 +194 +196 +196 +197 +199 +199 +200 +201 +200 +201 +201 +202 +202 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +207 +207 +206 +207 +207 +206 +207 +206 +206 +204 +205 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +199 +199 +196 +196 +197 +195 +195 +191 +190 +188 +188 +188 +185 +185 +183 +182 +183 +178 +179 +179 +179 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +140 +139 +140 +133 +133 +129 +129 +129 +125 +126 +119 +119 +118 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +73 +68 +68 +64 +64 +64 +58 +58 +55 +54 +55 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +46 +47 +51 +50 +55 +55 +54 +59 +58 +64 +64 +64 +68 +68 +69 +69 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +115 +120 +119 +120 +124 +125 +129 +129 +130 +134 +133 +140 +139 +142 +143 +143 +147 +147 +151 +152 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +174 +179 +179 +182 +183 +184 +185 +185 +189 +189 +190 +191 +191 +195 +194 +194 +194 +194 +197 +196 +198 +199 +198 +200 +200 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +205 +203 +202 +201 +200 +200 +200 +200 +198 +198 +196 +196 +197 +195 +195 +195 +194 +195 +190 +190 +188 +189 +189 +185 +184 +183 +183 +181 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +140 +133 +133 +130 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +59 +54 +55 +51 +50 +51 +47 +47 +44 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +46 +47 +50 +50 +50 +55 +55 +58 +58 +61 +65 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +120 +119 +125 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +166 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +184 +185 +189 +189 +191 +190 +190 +194 +194 +196 +196 +198 +199 +198 +201 +201 +200 +200 +200 +202 +202 +204 +205 +205 +205 +204 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +197 +195 +194 +194 +191 +190 +188 +189 +189 +185 +184 +183 +183 +183 +178 +179 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +126 +120 +120 +115 +115 +111 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +65 +64 +59 +59 +59 +55 +55 +51 +51 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +46 +46 +50 +50 +54 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +91 +90 +95 +96 +96 +99 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +180 +179 +179 +183 +183 +184 +185 +189 +188 +188 +191 +190 +194 +194 +195 +196 +196 +199 +198 +198 +201 +201 +201 +201 +201 +202 +203 +204 +205 +204 +204 +205 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +207 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +199 +198 +196 +197 +197 +194 +194 +191 +191 +190 +188 +189 +189 +189 +188 +184 +184 +183 +183 +183 +179 +179 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +125 +125 +125 +119 +120 +115 +116 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +69 +68 +64 +64 +65 +58 +58 +55 +54 +54 +51 +51 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +35 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +59 +58 +64 +64 +68 +68 +69 +73 +71 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +120 +119 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +179 +179 +179 +183 +184 +184 +184 +184 +189 +188 +190 +191 +190 +194 +194 +196 +196 +197 +198 +198 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +205 +205 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +198 +197 +196 +197 +197 +197 +195 +194 +191 +191 +191 +189 +189 +185 +185 +184 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +143 +139 +139 +138 +133 +133 +129 +129 +130 +125 +125 +119 +120 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +99 +96 +96 +89 +90 +86 +86 +87 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +58 +54 +54 +51 +50 +51 +46 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +16 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +56 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +77 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +116 +116 +115 +120 +120 +125 +125 +125 +129 +130 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +182 +185 +185 +185 +189 +189 +191 +191 +191 +194 +194 +197 +196 +199 +198 +198 +200 +201 +200 +200 +200 +202 +203 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +204 +204 +204 +202 +203 +201 +200 +201 +200 +201 +198 +198 +198 +196 +197 +194 +195 +190 +190 +190 +189 +188 +185 +185 +185 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +126 +125 +126 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +58 +58 +55 +54 +51 +51 +50 +46 +46 +43 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +20 +19 +19 +17 +17 +17 +15 +15 +15 +16 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +37 +41 +41 +43 +42 +46 +46 +47 +50 +50 +55 +55 +55 +58 +58 +59 +59 +59 +64 +65 +68 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +144 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +183 +184 +185 +188 +189 +188 +191 +191 +194 +194 +195 +196 +196 +198 +199 +199 +201 +201 +200 +200 +201 +202 +203 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +205 +204 +204 +204 +205 +202 +202 +201 +200 +201 +200 +200 +198 +199 +198 +197 +197 +195 +194 +195 +190 +191 +188 +189 +189 +184 +185 +182 +182 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +148 +143 +143 +139 +139 +134 +134 +133 +129 +129 +126 +125 +125 +120 +120 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +65 +58 +58 +55 +54 +54 +50 +50 +47 +46 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +12 +13 +12 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +42 +43 +47 +47 +50 +51 +51 +54 +54 +59 +58 +59 +64 +64 +68 +69 +73 +72 +72 +76 +76 +82 +83 +82 +86 +87 +90 +90 +90 +96 +96 +100 +99 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +172 +173 +173 +175 +175 +179 +178 +179 +183 +183 +183 +183 +183 +185 +185 +189 +189 +188 +191 +191 +195 +194 +195 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +205 +205 +205 +204 +204 +202 +202 +201 +200 +201 +201 +201 +198 +198 +199 +196 +197 +195 +194 +190 +191 +190 +189 +188 +184 +185 +185 +182 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +119 +120 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +55 +55 +55 +50 +50 +47 +47 +47 +43 +42 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +40 +41 +43 +42 +47 +47 +50 +51 +50 +54 +54 +58 +58 +58 +64 +64 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +97 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +116 +115 +120 +120 +125 +125 +125 +130 +129 +133 +133 +132 +139 +139 +143 +143 +143 +143 +144 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +160 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +178 +182 +182 +183 +185 +184 +188 +189 +188 +190 +190 +190 +191 +190 +194 +194 +197 +196 +197 +198 +198 +201 +201 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +205 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +195 +195 +194 +190 +190 +189 +188 +188 +185 +185 +183 +183 +179 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +134 +133 +129 +130 +125 +125 +126 +120 +120 +115 +115 +116 +110 +110 +106 +105 +106 +100 +100 +96 +95 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +65 +64 +58 +58 +59 +55 +54 +51 +51 +49 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +40 +41 +43 +42 +47 +47 +46 +50 +51 +55 +55 +54 +59 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +89 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +115 +119 +119 +119 +125 +125 +129 +129 +130 +133 +134 +140 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +170 +169 +169 +173 +173 +174 +175 +175 +179 +179 +179 +179 +178 +183 +182 +185 +184 +185 +189 +189 +190 +190 +194 +194 +195 +196 +196 +198 +199 +198 +201 +200 +201 +200 +200 +202 +202 +204 +204 +204 +205 +204 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +199 +196 +196 +195 +195 +190 +190 +190 +189 +189 +184 +184 +184 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +134 +133 +129 +129 +125 +125 +125 +120 +119 +115 +115 +116 +109 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +65 +59 +59 +54 +54 +54 +51 +50 +47 +47 +47 +43 +43 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +16 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +59 +59 +64 +65 +64 +68 +68 +72 +73 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +107 +106 +106 +110 +110 +116 +115 +115 +119 +120 +119 +120 +119 +125 +125 +130 +129 +130 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +158 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +182 +184 +184 +185 +188 +188 +191 +190 +191 +194 +194 +196 +197 +196 +199 +198 +200 +201 +200 +200 +200 +203 +203 +202 +204 +204 +204 +205 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +203 +203 +200 +201 +201 +200 +198 +198 +199 +197 +196 +194 +194 +195 +190 +190 +188 +189 +189 +184 +185 +182 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +148 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +119 +119 +116 +116 +115 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +73 +72 +68 +68 +68 +65 +64 +58 +58 +58 +55 +54 +54 +54 +55 +51 +51 +47 +47 +47 +43 +42 +41 +41 +38 +37 +36 +33 +33 +31 +31 +31 +27 +27 +27 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +54 +54 +58 +59 +58 +65 +64 +68 +69 +69 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +117 +120 +119 +125 +125 +130 +129 +129 +134 +133 +133 +134 +133 +140 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +183 +182 +184 +185 +188 +189 +189 +190 +191 +194 +194 +197 +197 +196 +199 +199 +200 +200 +200 +200 +200 +203 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +207 +207 +206 +206 +207 +207 +206 +206 +206 +204 +204 +205 +204 +204 +203 +203 +202 +201 +200 +201 +201 +200 +199 +198 +197 +196 +196 +194 +195 +191 +190 +189 +189 +188 +185 +184 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +87 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +55 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +24 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +20 +19 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +42 +43 +47 +47 +50 +50 +55 +55 +55 +58 +58 +64 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +88 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +116 +116 +115 +116 +115 +120 +120 +125 +125 +125 +130 +129 +133 +134 +138 +139 +139 +143 +143 +147 +147 +147 +151 +152 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +182 +183 +182 +184 +185 +188 +189 +188 +190 +191 +195 +194 +194 +196 +196 +199 +199 +198 +200 +200 +200 +200 +200 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +201 +201 +200 +201 +198 +199 +196 +196 +196 +194 +194 +191 +191 +190 +188 +189 +185 +185 +185 +183 +183 +178 +179 +178 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +137 +134 +134 +129 +129 +125 +125 +125 +120 +120 +115 +115 +116 +110 +110 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +65 +65 +59 +59 +59 +55 +54 +51 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +51 +50 +51 +51 +55 +55 +58 +59 +58 +64 +64 +69 +68 +70 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +105 +105 +106 +110 +110 +115 +115 +119 +120 +120 +126 +126 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +152 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +183 +185 +184 +189 +188 +189 +190 +191 +194 +194 +195 +197 +196 +199 +198 +200 +200 +200 +201 +201 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +194 +195 +195 +190 +190 +188 +188 +184 +185 +184 +183 +182 +179 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +133 +133 +133 +130 +130 +125 +126 +125 +119 +119 +116 +115 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +73 +68 +68 +64 +64 +59 +58 +58 +54 +55 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +16 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +12 +15 +15 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +32 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +46 +50 +50 +54 +54 +54 +59 +58 +65 +64 +65 +68 +68 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +89 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +156 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +178 +183 +183 +184 +185 +189 +189 +188 +191 +190 +194 +194 +194 +196 +196 +198 +197 +198 +200 +200 +201 +200 +200 +202 +203 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +201 +200 +201 +201 +200 +198 +198 +196 +197 +196 +194 +194 +191 +191 +191 +188 +188 +188 +189 +189 +185 +185 +182 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +137 +133 +133 +130 +129 +126 +126 +126 +119 +120 +116 +116 +116 +110 +109 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +65 +64 +65 +58 +59 +54 +55 +55 +51 +51 +46 +47 +47 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +20 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +46 +47 +47 +50 +51 +54 +55 +55 +58 +58 +65 +65 +65 +69 +68 +72 +72 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +119 +119 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +175 +179 +178 +183 +183 +183 +184 +185 +189 +188 +188 +191 +191 +194 +194 +194 +197 +197 +198 +199 +201 +201 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +207 +204 +204 +204 +205 +204 +202 +203 +202 +201 +200 +201 +200 +200 +199 +199 +196 +197 +196 +195 +195 +191 +190 +189 +188 +188 +185 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +126 +125 +120 +119 +115 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +65 +59 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +53 +54 +54 +59 +59 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +105 +106 +106 +110 +110 +116 +115 +115 +120 +119 +125 +125 +125 +129 +129 +133 +134 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +184 +185 +188 +188 +191 +191 +190 +194 +194 +196 +196 +196 +198 +199 +201 +200 +200 +200 +201 +202 +202 +203 +204 +204 +204 +205 +205 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +204 +202 +202 +202 +200 +201 +200 +200 +199 +198 +199 +196 +196 +194 +194 +194 +190 +191 +189 +188 +189 +184 +184 +184 +184 +184 +182 +182 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +130 +129 +125 +125 +120 +120 +119 +116 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +91 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +58 +54 +55 +50 +51 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +32 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +24 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +51 +55 +54 +58 +59 +59 +64 +64 +69 +68 +68 +72 +72 +76 +76 +77 +82 +82 +87 +86 +89 +90 +90 +96 +96 +100 +99 +100 +106 +105 +110 +109 +110 +115 +115 +119 +119 +120 +125 +126 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +185 +184 +184 +188 +188 +191 +191 +191 +194 +195 +196 +196 +197 +198 +199 +200 +200 +201 +201 +201 +202 +202 +202 +205 +204 +204 +204 +207 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +199 +198 +199 +196 +196 +196 +197 +196 +194 +194 +191 +191 +191 +189 +188 +185 +184 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +139 +140 +139 +134 +133 +130 +129 +129 +125 +125 +119 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +95 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +59 +59 +59 +55 +54 +51 +50 +51 +47 +47 +43 +42 +41 +40 +41 +37 +37 +33 +33 +33 +31 +32 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +26 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +59 +58 +65 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +115 +116 +120 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +164 +169 +168 +169 +173 +173 +174 +175 +175 +179 +178 +179 +178 +178 +182 +183 +185 +184 +184 +188 +188 +190 +190 +191 +194 +195 +197 +197 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +205 +204 +205 +204 +204 +207 +206 +206 +206 +207 +206 +206 +207 +206 +207 +207 +207 +207 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +202 +202 +200 +200 +201 +200 +200 +198 +199 +197 +196 +196 +195 +194 +191 +191 +189 +188 +189 +185 +184 +183 +182 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +126 +126 +120 +119 +120 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +55 +54 +54 +50 +50 +47 +46 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +16 +17 +16 +19 +18 +21 +21 +21 +25 +26 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +50 +50 +55 +54 +58 +59 +59 +64 +64 +65 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +89 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +116 +120 +120 +125 +125 +125 +129 +129 +133 +134 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +166 +165 +165 +169 +169 +173 +173 +173 +173 +173 +175 +175 +175 +178 +179 +183 +182 +184 +185 +184 +189 +189 +191 +190 +190 +194 +194 +195 +194 +194 +197 +197 +199 +198 +198 +201 +201 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +205 +204 +202 +202 +200 +200 +201 +201 +200 +199 +198 +198 +196 +196 +194 +193 +195 +190 +190 +188 +188 +189 +184 +185 +182 +182 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +137 +133 +133 +129 +129 +125 +125 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +69 +68 +65 +65 +64 +58 +59 +55 +55 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +20 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +51 +51 +55 +54 +58 +58 +58 +64 +64 +68 +68 +73 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +120 +120 +126 +125 +125 +130 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +174 +173 +175 +175 +179 +178 +179 +183 +183 +183 +183 +183 +185 +185 +189 +188 +189 +191 +191 +194 +195 +195 +196 +197 +199 +198 +200 +201 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +201 +200 +201 +201 +200 +199 +198 +199 +196 +197 +194 +195 +191 +190 +191 +189 +189 +185 +185 +185 +182 +183 +178 +179 +179 +175 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +115 +116 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +55 +55 +54 +50 +50 +46 +47 +47 +43 +43 +43 +42 +42 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +22 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +55 +54 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +99 +106 +106 +105 +110 +110 +115 +115 +116 +119 +120 +120 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +185 +188 +189 +188 +191 +190 +194 +195 +195 +196 +196 +196 +196 +196 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +199 +197 +197 +194 +194 +194 +190 +191 +188 +189 +189 +184 +185 +183 +182 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +140 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +83 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +65 +65 +64 +58 +58 +55 +55 +55 +51 +50 +46 +47 +47 +43 +42 +41 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +55 +55 +59 +59 +59 +65 +64 +69 +68 +73 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +109 +111 +115 +116 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +160 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +183 +183 +183 +185 +185 +188 +188 +188 +190 +191 +194 +194 +195 +196 +196 +199 +198 +200 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +207 +207 +207 +207 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +203 +202 +202 +200 +201 +201 +200 +200 +198 +198 +197 +196 +197 +194 +195 +190 +190 +189 +188 +189 +184 +185 +183 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +130 +130 +129 +126 +125 +120 +119 +120 +115 +116 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +69 +64 +64 +59 +58 +56 +54 +54 +51 +50 +47 +46 +46 +43 +43 +40 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +50 +50 +51 +54 +55 +59 +59 +64 +64 +64 +69 +68 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +100 +106 +106 +110 +109 +116 +116 +116 +119 +119 +125 +126 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +160 +164 +165 +165 +169 +168 +173 +173 +173 +175 +175 +175 +174 +175 +178 +178 +183 +182 +183 +185 +185 +189 +188 +189 +191 +191 +195 +194 +196 +196 +196 +199 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +194 +194 +194 +190 +190 +188 +188 +189 +185 +184 +182 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +119 +119 +120 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +68 +68 +64 +64 +59 +58 +59 +54 +55 +51 +50 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +51 +50 +50 +56 +55 +58 +58 +58 +65 +65 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +101 +100 +100 +106 +106 +110 +110 +110 +116 +115 +115 +116 +116 +119 +120 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +174 +175 +176 +178 +179 +183 +182 +184 +185 +184 +189 +189 +191 +190 +191 +194 +194 +196 +197 +196 +198 +199 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +190 +188 +188 +188 +185 +185 +183 +182 +183 +179 +179 +175 +174 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +141 +133 +133 +129 +129 +126 +125 +125 +120 +120 +115 +115 +115 +110 +109 +110 +109 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +64 +64 +64 +58 +58 +54 +54 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +51 +55 +55 +59 +58 +58 +64 +64 +68 +68 +67 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +115 +119 +119 +120 +126 +125 +129 +130 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +183 +183 +185 +184 +188 +189 +189 +190 +190 +195 +194 +195 +197 +196 +199 +198 +199 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +196 +196 +195 +194 +190 +190 +191 +189 +189 +184 +184 +183 +182 +183 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +69 +68 +64 +64 +64 +59 +58 +54 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +47 +47 +51 +50 +50 +54 +54 +58 +58 +59 +65 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +87 +86 +86 +86 +90 +89 +96 +96 +96 +100 +100 +106 +106 +107 +109 +109 +116 +116 +120 +119 +119 +125 +126 +129 +129 +129 +133 +133 +134 +134 +134 +139 +140 +144 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +182 +183 +185 +185 +185 +188 +189 +190 +191 +194 +195 +195 +197 +197 +198 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +201 +199 +198 +199 +196 +197 +195 +194 +191 +191 +190 +188 +189 +185 +184 +184 +183 +182 +179 +178 +179 +174 +175 +172 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +134 +133 +129 +129 +129 +125 +125 +119 +119 +118 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +69 +68 +65 +65 +59 +58 +59 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +50 +55 +55 +54 +58 +59 +64 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +89 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +116 +115 +115 +120 +119 +125 +125 +126 +129 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +182 +182 +184 +184 +188 +189 +189 +190 +191 +194 +195 +195 +196 +196 +198 +199 +199 +200 +201 +200 +200 +201 +203 +203 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +201 +198 +199 +196 +196 +197 +194 +194 +191 +190 +190 +188 +188 +184 +185 +184 +182 +182 +179 +179 +178 +175 +175 +173 +173 +170 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +130 +129 +125 +125 +125 +119 +120 +116 +115 +116 +109 +110 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +89 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +59 +55 +54 +51 +50 +51 +47 +46 +43 +42 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +46 +46 +51 +50 +50 +51 +51 +55 +55 +58 +58 +59 +64 +64 +68 +68 +70 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +117 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +184 +185 +189 +189 +189 +190 +190 +195 +194 +194 +196 +197 +198 +198 +201 +200 +199 +200 +200 +203 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +197 +194 +195 +190 +191 +191 +189 +188 +184 +185 +183 +182 +183 +179 +179 +179 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +152 +147 +147 +147 +143 +142 +139 +139 +139 +133 +134 +134 +133 +133 +129 +129 +125 +125 +126 +119 +119 +116 +116 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +48 +51 +50 +55 +54 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +105 +106 +110 +109 +116 +115 +116 +120 +120 +125 +126 +125 +129 +129 +133 +133 +134 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +184 +184 +189 +189 +188 +190 +190 +194 +194 +194 +196 +196 +198 +199 +199 +200 +200 +201 +200 +201 +202 +202 +204 +204 +205 +204 +205 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +197 +196 +196 +195 +194 +191 +190 +191 +189 +188 +189 +189 +188 +185 +184 +182 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +119 +115 +116 +110 +110 +110 +106 +100 +100 +100 +100 +96 +96 +90 +90 +91 +86 +85 +82 +83 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +55 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +38 +41 +41 +43 +43 +47 +46 +47 +50 +50 +55 +54 +54 +58 +58 +58 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +116 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +184 +185 +188 +189 +188 +191 +190 +195 +194 +194 +196 +197 +198 +198 +199 +200 +200 +200 +200 +203 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +200 +200 +198 +198 +199 +199 +198 +196 +196 +194 +194 +195 +190 +190 +188 +189 +187 +184 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +172 +169 +169 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +129 +125 +125 +119 +119 +119 +116 +116 +110 +110 +110 +105 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +59 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +22 +22 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +20 +24 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +57 +58 +58 +64 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +116 +119 +120 +120 +125 +125 +130 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +186 +188 +188 +189 +191 +191 +195 +194 +197 +197 +197 +198 +198 +200 +200 +200 +200 +200 +203 +202 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +205 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +197 +195 +194 +190 +190 +191 +188 +188 +185 +184 +184 +182 +183 +183 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +119 +115 +116 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +54 +54 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +46 +47 +47 +51 +51 +55 +55 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +115 +115 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +178 +179 +178 +182 +183 +185 +184 +188 +188 +189 +191 +190 +194 +195 +195 +197 +197 +198 +198 +199 +200 +200 +200 +200 +201 +203 +203 +204 +204 +204 +204 +205 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +205 +204 +205 +204 +204 +202 +202 +203 +200 +201 +200 +200 +198 +198 +199 +196 +197 +194 +195 +194 +191 +190 +190 +190 +190 +189 +188 +185 +185 +185 +183 +183 +178 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +126 +125 +120 +119 +119 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +59 +54 +54 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +16 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +46 +51 +50 +51 +54 +54 +58 +58 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +101 +100 +100 +106 +106 +110 +110 +109 +115 +116 +119 +120 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +160 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +179 +178 +179 +183 +183 +185 +184 +185 +188 +188 +191 +190 +191 +194 +194 +197 +196 +196 +198 +199 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +207 +204 +205 +205 +204 +202 +202 +202 +200 +200 +200 +200 +200 +199 +199 +198 +199 +198 +197 +197 +195 +194 +194 +190 +191 +188 +189 +189 +184 +184 +183 +183 +179 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +126 +119 +119 +115 +115 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +65 +64 +64 +58 +58 +55 +55 +55 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +24 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +54 +54 +55 +59 +58 +64 +65 +68 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +120 +119 +120 +126 +126 +129 +129 +129 +133 +134 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +178 +178 +182 +183 +183 +185 +185 +188 +189 +188 +190 +190 +195 +195 +196 +197 +198 +198 +200 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +200 +200 +200 +200 +200 +198 +198 +199 +196 +197 +194 +194 +193 +190 +191 +189 +188 +184 +184 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +144 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +126 +120 +119 +116 +116 +116 +110 +110 +105 +106 +101 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +55 +54 +51 +50 +51 +46 +48 +42 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +50 +51 +51 +54 +54 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +101 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +119 +125 +125 +130 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +152 +151 +151 +157 +157 +162 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +183 +185 +185 +188 +189 +191 +190 +191 +194 +194 +197 +196 +197 +198 +198 +198 +198 +198 +200 +201 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +205 +204 +202 +202 +201 +200 +201 +200 +201 +198 +198 +198 +196 +197 +194 +195 +195 +190 +190 +189 +189 +188 +184 +185 +183 +183 +183 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +140 +139 +133 +133 +129 +129 +126 +125 +125 +119 +119 +116 +116 +115 +109 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +69 +68 +65 +64 +64 +59 +58 +54 +55 +55 +50 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +172 +174 +175 +175 +179 +179 +182 +183 +182 +184 +185 +189 +188 +189 +190 +190 +191 +191 +190 +195 +194 +197 +196 +196 +199 +198 +200 +201 +200 +200 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +205 +204 +205 +204 +205 +203 +202 +202 +200 +201 +200 +200 +200 +199 +198 +197 +196 +196 +194 +195 +191 +190 +191 +188 +189 +185 +185 +183 +182 +182 +179 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +50 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +59 +59 +65 +64 +68 +68 +72 +72 +71 +76 +76 +82 +82 +83 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +174 +175 +179 +178 +183 +183 +182 +184 +185 +188 +188 +188 +191 +190 +195 +194 +195 +196 +197 +198 +199 +200 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +204 +204 +205 +204 +204 +202 +203 +201 +200 +200 +200 +200 +198 +198 +199 +196 +197 +194 +195 +190 +190 +191 +189 +189 +185 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +115 +117 +110 +110 +106 +106 +101 +100 +100 +96 +96 +91 +90 +90 +86 +86 +81 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +46 +51 +51 +55 +54 +54 +58 +58 +65 +64 +65 +69 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +116 +116 +119 +120 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +175 +175 +179 +178 +180 +183 +183 +185 +184 +188 +188 +189 +191 +191 +194 +194 +194 +197 +196 +196 +196 +197 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +204 +204 +205 +205 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +194 +194 +190 +191 +188 +188 +188 +185 +185 +183 +183 +183 +179 +178 +175 +175 +173 +173 +174 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +129 +126 +126 +125 +119 +119 +116 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +59 +59 +55 +55 +54 +51 +50 +46 +47 +47 +43 +43 +41 +41 +39 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +36 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +109 +110 +115 +115 +115 +119 +120 +125 +125 +125 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +178 +178 +179 +183 +182 +184 +185 +184 +189 +188 +189 +189 +188 +190 +190 +195 +194 +195 +196 +197 +198 +198 +200 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +204 +204 +205 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +198 +196 +197 +196 +194 +194 +190 +191 +191 +188 +189 +185 +184 +182 +182 +182 +179 +178 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +140 +133 +133 +130 +129 +129 +125 +125 +119 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +58 +55 +54 +51 +51 +49 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +20 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +58 +59 +59 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +100 +100 +106 +106 +107 +110 +110 +115 +116 +120 +119 +119 +125 +125 +129 +129 +129 +134 +133 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +174 +179 +178 +182 +183 +182 +185 +185 +188 +189 +189 +191 +191 +194 +195 +196 +196 +196 +198 +199 +200 +200 +200 +200 +201 +202 +202 +203 +204 +205 +204 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +205 +205 +202 +202 +202 +200 +200 +200 +200 +201 +198 +199 +196 +196 +195 +194 +195 +191 +191 +188 +189 +189 +184 +185 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +116 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +70 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +50 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +51 +51 +50 +55 +54 +58 +59 +59 +64 +65 +68 +69 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +110 +116 +115 +115 +115 +116 +120 +120 +126 +125 +125 +129 +129 +133 +133 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +158 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +174 +176 +178 +179 +183 +183 +184 +185 +185 +188 +188 +190 +190 +190 +194 +194 +197 +197 +196 +199 +199 +200 +201 +201 +200 +200 +202 +202 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +207 +207 +206 +207 +205 +204 +205 +205 +204 +202 +202 +201 +201 +200 +201 +200 +198 +199 +198 +197 +196 +194 +194 +194 +190 +191 +189 +188 +188 +185 +185 +183 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +130 +129 +126 +125 +126 +119 +119 +115 +115 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +87 +86 +82 +82 +76 +76 +72 +72 +73 +68 +68 +65 +64 +64 +58 +59 +55 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +39 +37 +36 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +43 +43 +43 +47 +47 +51 +50 +50 +55 +55 +58 +59 +59 +64 +64 +68 +68 +68 +72 +73 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +160 +161 +165 +165 +169 +169 +172 +173 +173 +175 +174 +178 +179 +179 +183 +182 +185 +185 +184 +189 +188 +191 +190 +191 +195 +194 +197 +196 +197 +199 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +205 +204 +205 +204 +202 +202 +202 +202 +202 +200 +200 +201 +201 +201 +198 +198 +196 +196 +196 +194 +195 +191 +190 +190 +188 +188 +184 +184 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +128 +125 +126 +126 +125 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +89 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +56 +55 +54 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +46 +47 +46 +51 +50 +55 +55 +55 +58 +59 +64 +64 +68 +69 +68 +72 +72 +76 +77 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +109 +116 +115 +116 +119 +119 +126 +125 +125 +129 +129 +130 +129 +129 +133 +133 +140 +140 +139 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +189 +188 +190 +190 +190 +194 +195 +197 +197 +197 +198 +199 +200 +200 +200 +200 +200 +202 +203 +202 +205 +204 +204 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +200 +201 +199 +198 +196 +197 +195 +194 +195 +190 +190 +188 +189 +188 +184 +184 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +123 +120 +120 +116 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +54 +50 +50 +46 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +34 +32 +30 +31 +27 +27 +25 +25 +25 +21 +20 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +46 +46 +50 +51 +50 +54 +55 +59 +58 +58 +65 +65 +68 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +110 +115 +116 +116 +115 +116 +120 +120 +125 +125 +125 +129 +129 +133 +133 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +182 +182 +185 +185 +188 +188 +188 +191 +190 +195 +194 +195 +196 +196 +199 +199 +198 +200 +200 +200 +201 +201 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +201 +200 +198 +199 +196 +196 +196 +194 +194 +190 +190 +191 +189 +189 +185 +185 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +164 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +131 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +105 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +58 +54 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +42 +40 +41 +42 +43 +46 +47 +47 +51 +50 +50 +50 +50 +55 +54 +58 +58 +59 +65 +64 +69 +69 +68 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +99 +106 +105 +106 +110 +110 +116 +116 +118 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +182 +185 +185 +188 +189 +189 +190 +191 +195 +194 +194 +196 +196 +198 +198 +200 +201 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +199 +199 +197 +196 +197 +194 +195 +191 +191 +191 +189 +189 +185 +185 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +126 +125 +125 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +64 +59 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +12 +15 +14 +17 +17 +16 +19 +19 +21 +21 +22 +25 +24 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +57 +59 +59 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +116 +120 +119 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +168 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +188 +189 +191 +190 +190 +194 +194 +196 +196 +197 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +201 +200 +201 +198 +199 +196 +196 +196 +194 +194 +190 +190 +191 +189 +189 +188 +188 +189 +185 +185 +182 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +58 +54 +54 +51 +50 +50 +46 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +46 +50 +51 +55 +55 +54 +58 +58 +64 +64 +66 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +116 +119 +120 +119 +125 +125 +129 +129 +129 +133 +133 +140 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +178 +178 +183 +182 +182 +184 +185 +188 +188 +189 +191 +191 +194 +194 +194 +196 +197 +199 +199 +200 +201 +201 +200 +200 +202 +202 +202 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +205 +205 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +201 +200 +200 +198 +198 +198 +197 +197 +194 +194 +193 +191 +190 +188 +188 +184 +184 +185 +183 +182 +183 +183 +182 +179 +179 +179 +179 +178 +175 +175 +173 +173 +173 +168 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +126 +126 +119 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +67 +68 +64 +64 +59 +58 +58 +54 +54 +51 +51 +51 +46 +47 +43 +42 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +15 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +36 +37 +41 +40 +43 +43 +44 +47 +46 +50 +51 +54 +54 +54 +58 +59 +65 +65 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +89 +90 +95 +95 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +189 +188 +189 +191 +191 +194 +195 +194 +196 +196 +198 +199 +198 +200 +201 +201 +201 +201 +203 +202 +204 +205 +204 +205 +204 +206 +207 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +204 +205 +205 +204 +205 +202 +202 +200 +200 +201 +200 +201 +198 +199 +196 +196 +196 +194 +195 +191 +190 +191 +189 +188 +188 +188 +189 +184 +184 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +125 +125 +120 +120 +116 +115 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +69 +65 +64 +64 +59 +59 +54 +55 +55 +50 +50 +47 +47 +47 +43 +42 +41 +41 +40 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +38 +37 +37 +41 +41 +43 +42 +43 +47 +46 +51 +51 +51 +55 +55 +58 +58 +58 +65 +64 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +120 +119 +125 +125 +129 +130 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +184 +185 +188 +189 +191 +191 +190 +194 +194 +196 +197 +197 +198 +198 +201 +201 +201 +200 +200 +203 +202 +204 +204 +204 +205 +205 +206 +207 +207 +206 +207 +206 +206 +206 +207 +207 +207 +206 +207 +206 +206 +205 +204 +205 +204 +204 +202 +203 +200 +201 +200 +201 +200 +198 +198 +198 +197 +196 +196 +196 +196 +194 +195 +190 +191 +191 +188 +189 +185 +184 +183 +183 +183 +178 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +152 +151 +151 +148 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +126 +125 +120 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +51 +50 +51 +47 +46 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +30 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +55 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +116 +120 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +182 +185 +185 +189 +188 +189 +191 +191 +195 +195 +195 +196 +197 +198 +198 +200 +201 +200 +200 +200 +202 +202 +202 +204 +204 +204 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +207 +206 +204 +204 +204 +204 +204 +203 +202 +202 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +196 +195 +195 +195 +191 +190 +188 +188 +189 +184 +185 +183 +183 +183 +178 +179 +175 +175 +175 +175 +176 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +58 +58 +58 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +20 +25 +25 +25 +25 +26 +27 +27 +31 +31 +32 +33 +33 +37 +37 +37 +41 +40 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +58 +58 +65 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +125 +130 +130 +133 +134 +133 +139 +139 +143 +144 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +188 +189 +188 +191 +190 +195 +194 +194 +196 +197 +196 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +203 +203 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +198 +199 +196 +197 +194 +194 +195 +191 +191 +189 +188 +189 +185 +185 +183 +183 +179 +179 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +129 +129 +129 +126 +125 +120 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +81 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +58 +58 +58 +55 +54 +51 +50 +51 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +47 +47 +50 +50 +50 +54 +55 +58 +59 +58 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +152 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +178 +178 +183 +182 +183 +183 +183 +185 +185 +189 +188 +188 +190 +191 +195 +194 +195 +196 +197 +198 +198 +200 +200 +200 +201 +201 +202 +202 +203 +205 +204 +205 +205 +205 +204 +205 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +207 +204 +204 +204 +204 +204 +202 +202 +201 +201 +201 +200 +200 +199 +198 +199 +196 +197 +195 +194 +190 +191 +191 +188 +189 +185 +184 +185 +182 +182 +183 +183 +183 +179 +179 +175 +175 +175 +173 +172 +169 +169 +168 +164 +165 +161 +161 +157 +157 +157 +151 +151 +146 +147 +147 +143 +143 +139 +139 +139 +134 +133 +130 +129 +129 +125 +126 +120 +120 +120 +116 +116 +109 +110 +107 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +69 +64 +64 +58 +58 +54 +54 +54 +50 +51 +46 +46 +47 +43 +42 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +28 +27 +31 +31 +32 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +46 +49 +51 +50 +54 +54 +59 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +189 +189 +189 +190 +191 +194 +194 +194 +197 +197 +196 +197 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +203 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +200 +200 +200 +200 +201 +199 +198 +198 +196 +196 +194 +195 +195 +190 +191 +188 +188 +188 +185 +184 +182 +183 +183 +179 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +126 +125 +125 +120 +119 +115 +115 +116 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +59 +58 +59 +59 +58 +54 +54 +50 +50 +50 +47 +47 +43 +43 +42 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +37 +37 +37 +41 +40 +43 +42 +43 +47 +47 +51 +51 +51 +54 +55 +58 +58 +58 +65 +64 +68 +68 +69 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +95 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +179 +182 +182 +183 +183 +183 +185 +184 +188 +188 +189 +190 +191 +195 +195 +196 +196 +196 +199 +198 +200 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +205 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +204 +205 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +199 +196 +196 +194 +195 +191 +190 +191 +189 +188 +184 +185 +184 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +126 +125 +119 +120 +116 +116 +116 +109 +109 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +61 +58 +58 +54 +55 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +34 +33 +37 +37 +41 +41 +40 +43 +43 +47 +46 +47 +51 +51 +54 +55 +59 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +109 +116 +116 +119 +119 +119 +125 +125 +126 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +183 +183 +185 +185 +189 +188 +190 +191 +191 +194 +194 +196 +196 +197 +199 +199 +200 +201 +201 +200 +200 +202 +203 +203 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +205 +202 +203 +201 +201 +200 +200 +200 +199 +199 +196 +196 +196 +194 +194 +191 +190 +190 +188 +189 +185 +185 +184 +183 +183 +179 +178 +179 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +150 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +119 +120 +120 +115 +116 +109 +110 +110 +106 +106 +106 +105 +106 +100 +99 +96 +96 +96 +90 +90 +87 +86 +84 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +64 +58 +58 +58 +58 +58 +54 +54 +50 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +18 +19 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +40 +41 +42 +43 +47 +47 +47 +50 +51 +54 +55 +54 +58 +58 +64 +64 +64 +68 +69 +72 +72 +73 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +101 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +119 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +184 +185 +189 +188 +188 +190 +191 +195 +195 +195 +196 +197 +199 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +204 +202 +202 +203 +201 +201 +200 +201 +200 +198 +199 +196 +196 +196 +194 +195 +191 +191 +190 +189 +189 +184 +185 +182 +183 +183 +178 +178 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +160 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +126 +120 +120 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +65 +64 +65 +58 +58 +54 +54 +52 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +20 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +24 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +59 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +81 +86 +86 +90 +90 +89 +96 +96 +100 +100 +100 +106 +106 +110 +110 +112 +115 +115 +119 +120 +125 +126 +125 +129 +130 +133 +134 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +182 +183 +185 +185 +188 +189 +189 +190 +191 +194 +195 +196 +196 +197 +198 +198 +200 +201 +200 +201 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +207 +207 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +200 +200 +200 +199 +198 +199 +196 +196 +194 +195 +191 +191 +191 +188 +189 +184 +184 +184 +183 +183 +179 +179 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +120 +119 +120 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +95 +96 +90 +90 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +69 +65 +64 +58 +58 +59 +54 +55 +50 +51 +50 +46 +47 +42 +42 +43 +41 +40 +36 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +28 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +42 +44 +47 +47 +51 +50 +55 +54 +54 +59 +58 +64 +65 +65 +68 +68 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +115 +116 +116 +115 +119 +120 +125 +125 +125 +130 +129 +133 +133 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +182 +182 +184 +185 +188 +189 +189 +190 +191 +195 +194 +194 +196 +196 +199 +198 +198 +201 +200 +201 +200 +201 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +205 +205 +204 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +198 +196 +197 +196 +194 +194 +190 +191 +190 +188 +189 +185 +185 +184 +182 +183 +179 +179 +179 +175 +174 +173 +173 +168 +169 +169 +164 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +139 +139 +139 +137 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +58 +55 +54 +50 +50 +51 +46 +47 +43 +43 +42 +41 +41 +37 +37 +33 +32 +33 +30 +31 +27 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +18 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +50 +51 +54 +55 +55 +58 +59 +64 +64 +64 +69 +68 +72 +72 +74 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +105 +106 +109 +109 +110 +115 +116 +120 +120 +124 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +172 +175 +175 +178 +179 +179 +183 +182 +185 +184 +184 +188 +189 +191 +190 +190 +194 +194 +196 +196 +196 +198 +199 +200 +200 +201 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +205 +205 +204 +204 +202 +202 +200 +200 +200 +200 +201 +199 +198 +199 +196 +196 +194 +194 +194 +190 +190 +189 +188 +189 +184 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +120 +119 +119 +116 +115 +110 +110 +110 +105 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +59 +55 +54 +51 +50 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +46 +50 +50 +51 +54 +55 +58 +59 +59 +65 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +185 +184 +185 +188 +188 +191 +190 +195 +195 +195 +196 +196 +199 +199 +198 +200 +200 +201 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +207 +207 +206 +206 +207 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +200 +199 +198 +200 +196 +197 +194 +194 +190 +191 +191 +189 +188 +184 +184 +185 +183 +182 +183 +182 +183 +178 +178 +175 +175 +175 +172 +173 +169 +169 +169 +164 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +120 +120 +119 +116 +116 +110 +109 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +77 +76 +72 +72 +69 +68 +68 +64 +64 +58 +59 +58 +55 +54 +51 +51 +51 +47 +46 +42 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +28 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +34 +33 +37 +36 +37 +41 +41 +42 +43 +43 +47 +47 +50 +50 +55 +55 +54 +59 +58 +64 +64 +64 +68 +68 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +87 +86 +88 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +115 +119 +120 +125 +125 +126 +129 +130 +133 +133 +138 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +172 +173 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +189 +191 +191 +194 +195 +195 +196 +197 +198 +198 +198 +200 +201 +201 +200 +201 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +198 +196 +197 +196 +195 +194 +194 +194 +194 +191 +190 +188 +189 +188 +185 +185 +183 +182 +181 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +160 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +85 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +46 +46 +50 +50 +54 +55 +54 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +89 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +120 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +182 +182 +184 +184 +189 +188 +188 +190 +191 +195 +194 +195 +196 +197 +198 +199 +201 +201 +201 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +205 +204 +204 +205 +204 +202 +202 +202 +200 +200 +201 +200 +200 +201 +200 +197 +198 +198 +196 +196 +195 +194 +195 +191 +191 +189 +188 +184 +184 +184 +182 +182 +179 +179 +179 +175 +174 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +130 +125 +125 +120 +119 +120 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +95 +90 +90 +86 +86 +87 +82 +82 +76 +77 +77 +72 +72 +68 +69 +69 +64 +64 +58 +58 +54 +55 +55 +51 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +20 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +46 +46 +50 +50 +50 +54 +54 +58 +59 +59 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +188 +188 +191 +191 +191 +194 +194 +197 +197 +196 +199 +198 +200 +200 +200 +200 +200 +202 +202 +202 +205 +205 +204 +205 +205 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +200 +198 +199 +196 +197 +194 +194 +194 +191 +190 +188 +189 +189 +185 +185 +185 +185 +184 +182 +183 +179 +179 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +160 +157 +158 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +130 +129 +125 +125 +120 +119 +119 +116 +115 +109 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +55 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +40 +42 +43 +47 +46 +47 +50 +50 +54 +54 +55 +59 +59 +65 +65 +64 +68 +69 +72 +73 +73 +77 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +179 +179 +179 +183 +183 +184 +184 +185 +189 +188 +190 +190 +190 +194 +195 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +207 +207 +206 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +203 +201 +200 +200 +200 +201 +198 +198 +198 +198 +198 +197 +197 +195 +195 +195 +191 +191 +189 +189 +185 +184 +184 +183 +183 +178 +179 +179 +175 +174 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +146 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +115 +115 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +90 +90 +89 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +59 +55 +54 +55 +50 +51 +47 +46 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +18 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +41 +43 +43 +46 +46 +47 +50 +50 +54 +55 +55 +58 +58 +65 +64 +68 +69 +69 +73 +73 +76 +76 +76 +82 +82 +86 +87 +86 +90 +89 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +120 +119 +119 +126 +126 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +182 +184 +185 +189 +188 +189 +190 +191 +195 +194 +195 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +207 +204 +204 +205 +204 +204 +203 +202 +202 +202 +203 +201 +200 +200 +201 +200 +198 +199 +196 +196 +195 +194 +195 +190 +190 +188 +188 +188 +184 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +129 +129 +129 +125 +125 +120 +120 +119 +115 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +69 +65 +64 +58 +59 +55 +54 +54 +51 +51 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +30 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +43 +47 +47 +50 +50 +51 +55 +55 +58 +58 +58 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +109 +110 +110 +116 +116 +120 +119 +120 +125 +125 +129 +129 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +188 +189 +191 +191 +191 +195 +195 +196 +197 +197 +199 +199 +201 +200 +201 +200 +201 +202 +203 +203 +205 +205 +204 +205 +205 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +201 +200 +201 +199 +198 +196 +196 +196 +195 +194 +191 +191 +190 +188 +189 +185 +184 +185 +183 +183 +178 +179 +179 +175 +175 +173 +174 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +143 +139 +139 +133 +133 +133 +130 +129 +125 +126 +120 +119 +119 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +69 +68 +64 +64 +59 +59 +59 +55 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +54 +55 +58 +59 +64 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +120 +119 +126 +126 +126 +130 +129 +133 +134 +140 +140 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +185 +184 +188 +189 +188 +190 +191 +191 +191 +191 +195 +194 +197 +196 +197 +198 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +205 +204 +205 +207 +207 +207 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +197 +197 +195 +195 +191 +190 +191 +189 +189 +184 +185 +183 +183 +183 +179 +179 +174 +175 +175 +173 +173 +168 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +126 +126 +120 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +73 +72 +68 +68 +68 +65 +64 +58 +58 +59 +54 +55 +50 +51 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +20 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +46 +47 +47 +51 +51 +54 +54 +54 +58 +59 +65 +65 +69 +68 +69 +73 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +106 +110 +110 +115 +116 +120 +120 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +182 +183 +185 +185 +188 +188 +189 +190 +191 +194 +194 +195 +196 +197 +199 +198 +200 +200 +200 +201 +200 +202 +202 +202 +204 +204 +205 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +204 +205 +205 +204 +203 +202 +201 +201 +200 +200 +200 +199 +199 +199 +196 +197 +194 +195 +190 +191 +191 +188 +188 +184 +184 +185 +182 +183 +179 +179 +179 +175 +176 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +148 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +95 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +77 +76 +76 +72 +72 +69 +68 +69 +64 +64 +58 +58 +55 +55 +54 +50 +50 +47 +46 +47 +42 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +32 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +47 +47 +51 +50 +54 +54 +54 +58 +58 +65 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +109 +116 +116 +120 +119 +120 +126 +126 +130 +130 +129 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +160 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +182 +185 +184 +189 +189 +188 +191 +191 +191 +191 +191 +195 +195 +197 +196 +197 +199 +198 +200 +201 +200 +201 +201 +203 +202 +204 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +204 +205 +203 +202 +200 +200 +200 +201 +201 +198 +198 +198 +196 +196 +195 +194 +195 +190 +190 +188 +188 +188 +184 +185 +183 +183 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +134 +133 +129 +129 +126 +125 +125 +120 +120 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +69 +69 +68 +64 +64 +59 +58 +58 +54 +55 +51 +50 +51 +47 +46 +43 +43 +40 +41 +41 +37 +36 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +24 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +40 +41 +43 +43 +43 +46 +47 +51 +51 +50 +54 +55 +58 +58 +59 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +115 +116 +119 +120 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +183 +183 +183 +185 +185 +189 +189 +189 +191 +190 +194 +195 +195 +197 +197 +198 +199 +200 +201 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +204 +204 +204 +205 +204 +203 +202 +203 +200 +200 +201 +201 +200 +198 +198 +197 +196 +196 +195 +195 +190 +190 +188 +189 +188 +185 +184 +182 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +116 +110 +110 +108 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +61 +59 +58 +55 +55 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +20 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +15 +15 +15 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +59 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +81 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +120 +126 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +149 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +184 +186 +188 +189 +191 +191 +194 +194 +195 +196 +196 +198 +198 +199 +201 +201 +200 +200 +201 +203 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +205 +205 +204 +203 +202 +200 +200 +200 +200 +201 +198 +199 +197 +196 +196 +195 +194 +190 +191 +190 +189 +188 +185 +184 +184 +182 +182 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +138 +133 +133 +133 +129 +128 +125 +125 +126 +119 +119 +116 +115 +110 +109 +110 +106 +106 +100 +99 +100 +96 +95 +96 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +54 +51 +50 +51 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +55 +54 +58 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +105 +106 +105 +106 +110 +110 +115 +116 +115 +120 +120 +125 +126 +127 +129 +129 +134 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +178 +179 +183 +183 +184 +185 +185 +188 +188 +191 +191 +191 +195 +195 +196 +197 +197 +198 +199 +200 +200 +200 +201 +201 +203 +203 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +204 +204 +205 +204 +205 +202 +202 +201 +200 +200 +200 +200 +201 +200 +200 +199 +198 +197 +196 +196 +194 +194 +191 +191 +190 +188 +189 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +126 +125 +125 +120 +119 +116 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +77 +76 +77 +72 +72 +68 +68 +68 +64 +65 +59 +59 +56 +54 +54 +50 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +38 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +55 +55 +58 +59 +64 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +91 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +125 +129 +129 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +149 +151 +151 +157 +157 +160 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +174 +178 +179 +182 +183 +183 +185 +185 +189 +189 +190 +191 +190 +195 +194 +196 +196 +196 +198 +199 +201 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +201 +198 +198 +197 +197 +197 +195 +195 +191 +191 +191 +188 +188 +185 +184 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +140 +139 +139 +134 +134 +129 +129 +127 +125 +125 +119 +119 +116 +116 +115 +109 +109 +106 +106 +106 +100 +100 +100 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +73 +72 +68 +68 +69 +65 +64 +59 +59 +59 +55 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +30 +31 +27 +27 +28 +25 +25 +21 +21 +21 +19 +19 +17 +16 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +42 +43 +46 +47 +51 +51 +51 +55 +54 +54 +54 +55 +58 +59 +64 +64 +64 +68 +69 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +95 +100 +100 +100 +100 +100 +106 +106 +109 +109 +110 +115 +115 +120 +119 +122 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +178 +179 +182 +183 +185 +184 +184 +189 +188 +191 +191 +191 +194 +195 +196 +196 +196 +198 +198 +200 +201 +200 +200 +200 +202 +203 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +207 +207 +206 +207 +206 +206 +206 +206 +206 +207 +205 +204 +205 +204 +204 +202 +202 +202 +203 +202 +200 +200 +200 +201 +200 +199 +198 +196 +197 +196 +195 +194 +190 +190 +191 +188 +188 +185 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +125 +119 +119 +120 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +69 +64 +64 +58 +58 +54 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +50 +52 +54 +55 +58 +58 +64 +64 +65 +68 +69 +72 +72 +72 +76 +77 +76 +76 +76 +82 +82 +86 +87 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +109 +110 +110 +116 +115 +120 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +140 +139 +144 +143 +147 +147 +149 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +185 +189 +189 +189 +191 +190 +194 +195 +195 +196 +196 +198 +198 +198 +200 +200 +201 +200 +200 +202 +203 +205 +205 +204 +204 +204 +206 +206 +207 +206 +206 +207 +207 +206 +206 +207 +207 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +199 +196 +197 +197 +195 +195 +190 +191 +190 +188 +189 +189 +188 +189 +184 +185 +183 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +69 +68 +68 +65 +64 +59 +58 +58 +54 +54 +50 +50 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +50 +50 +51 +51 +54 +55 +59 +59 +58 +64 +65 +68 +68 +70 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +124 +126 +125 +129 +129 +133 +134 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +182 +183 +184 +184 +185 +188 +189 +191 +191 +190 +195 +194 +196 +196 +197 +199 +198 +200 +201 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +201 +201 +200 +201 +200 +198 +198 +199 +196 +196 +195 +194 +192 +190 +190 +188 +188 +184 +185 +185 +183 +182 +179 +179 +178 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +120 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +55 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +30 +27 +27 +27 +25 +25 +21 +21 +20 +20 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +40 +41 +43 +42 +47 +47 +48 +50 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +73 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +109 +110 +110 +115 +115 +120 +119 +119 +125 +126 +129 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +184 +185 +188 +188 +190 +191 +190 +195 +194 +196 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +203 +202 +204 +205 +205 +204 +205 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +205 +204 +204 +205 +204 +202 +202 +200 +200 +200 +201 +200 +199 +198 +197 +197 +196 +194 +194 +190 +190 +190 +188 +188 +188 +188 +188 +184 +185 +183 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +129 +129 +127 +125 +126 +120 +120 +116 +116 +116 +110 +110 +106 +105 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +65 +64 +58 +59 +54 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +26 +25 +27 +27 +27 +31 +31 +33 +33 +35 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +50 +50 +54 +55 +59 +58 +59 +64 +65 +68 +68 +69 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +119 +120 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +183 +184 +185 +189 +188 +189 +191 +191 +195 +194 +195 +197 +197 +199 +199 +199 +200 +200 +201 +200 +202 +202 +203 +204 +204 +204 +205 +205 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +200 +200 +201 +201 +198 +199 +196 +196 +197 +194 +194 +190 +190 +190 +188 +189 +185 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +150 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +130 +125 +126 +119 +119 +119 +115 +116 +110 +110 +109 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +65 +64 +58 +59 +58 +55 +54 +51 +50 +48 +47 +47 +42 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +24 +21 +21 +21 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +50 +50 +54 +54 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +119 +120 +125 +125 +130 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +162 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +184 +185 +188 +189 +189 +191 +191 +194 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +201 +200 +200 +202 +202 +204 +205 +204 +204 +204 +206 +207 +207 +207 +207 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +201 +201 +201 +200 +198 +199 +197 +196 +197 +194 +194 +190 +190 +191 +188 +189 +184 +184 +185 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +126 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +58 +59 +55 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +40 +43 +43 +46 +47 +47 +50 +51 +55 +55 +54 +59 +59 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +172 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +188 +188 +188 +190 +191 +195 +194 +194 +197 +197 +197 +196 +196 +198 +198 +200 +201 +201 +200 +200 +202 +202 +203 +205 +205 +204 +204 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +203 +203 +200 +201 +200 +200 +200 +198 +199 +197 +196 +197 +195 +195 +191 +191 +191 +188 +189 +184 +185 +185 +183 +183 +179 +179 +175 +175 +174 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +130 +129 +129 +125 +126 +120 +120 +119 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +89 +86 +86 +83 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +58 +58 +54 +54 +50 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +58 +58 +58 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +115 +119 +120 +126 +126 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +178 +179 +182 +183 +183 +183 +182 +185 +185 +189 +188 +189 +191 +190 +194 +194 +195 +197 +197 +198 +198 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +205 +204 +204 +205 +204 +206 +206 +207 +206 +207 +206 +207 +206 +206 +207 +207 +206 +206 +207 +206 +204 +205 +204 +205 +204 +202 +202 +200 +200 +201 +200 +200 +198 +199 +198 +197 +197 +194 +194 +190 +191 +191 +188 +188 +184 +185 +185 +183 +182 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +97 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +73 +72 +72 +69 +68 +65 +64 +65 +59 +58 +54 +54 +50 +50 +51 +47 +46 +43 +42 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +24 +21 +21 +19 +19 +19 +17 +17 +15 +14 +15 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +12 +15 +15 +18 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +37 +41 +40 +43 +42 +43 +47 +46 +51 +51 +52 +54 +54 +58 +58 +65 +64 +64 +68 +69 +72 +73 +72 +76 +76 +82 +82 +82 +87 +86 +90 +90 +91 +96 +96 +99 +100 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +120 +120 +126 +125 +129 +129 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +166 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +180 +183 +183 +185 +184 +188 +189 +188 +190 +190 +194 +194 +195 +196 +197 +196 +197 +196 +199 +198 +200 +200 +201 +201 +200 +202 +202 +203 +205 +205 +205 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +207 +205 +204 +205 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +198 +198 +197 +196 +195 +195 +194 +190 +190 +189 +189 +189 +184 +185 +183 +183 +183 +179 +178 +175 +175 +173 +172 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +130 +126 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +64 +59 +59 +54 +54 +54 +50 +51 +46 +46 +47 +43 +43 +41 +41 +39 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +24 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +12 +12 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +46 +46 +47 +50 +50 +54 +54 +54 +59 +58 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +81 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +109 +110 +116 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +178 +179 +179 +182 +182 +185 +185 +184 +188 +188 +189 +189 +189 +190 +190 +195 +195 +195 +197 +197 +199 +198 +199 +201 +201 +200 +200 +202 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +198 +198 +197 +196 +197 +195 +195 +190 +190 +190 +190 +189 +185 +184 +183 +183 +183 +178 +178 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +139 +139 +139 +133 +133 +129 +129 +130 +126 +126 +120 +119 +120 +116 +116 +110 +109 +110 +105 +105 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +50 +51 +49 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +15 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +55 +54 +58 +59 +59 +65 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +85 +86 +90 +90 +90 +96 +96 +100 +99 +100 +106 +107 +110 +110 +110 +116 +116 +120 +119 +126 +125 +125 +130 +129 +133 +133 +133 +139 +140 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +174 +175 +179 +178 +179 +179 +179 +182 +182 +184 +184 +185 +188 +189 +190 +190 +193 +194 +195 +196 +197 +199 +198 +198 +200 +200 +200 +201 +200 +203 +202 +204 +204 +204 +205 +204 +207 +206 +206 +207 +207 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +201 +200 +200 +200 +201 +198 +198 +198 +197 +197 +195 +195 +194 +194 +195 +191 +190 +189 +188 +188 +185 +185 +183 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +120 +116 +116 +109 +109 +106 +106 +106 +100 +100 +96 +95 +96 +89 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +64 +64 +58 +58 +54 +54 +54 +50 +51 +47 +47 +47 +43 +43 +43 +42 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +18 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +44 +43 +43 +47 +47 +50 +50 +55 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +116 +120 +120 +119 +119 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +178 +182 +183 +183 +184 +184 +188 +188 +188 +190 +191 +194 +194 +194 +197 +197 +198 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +205 +204 +205 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +203 +200 +200 +200 +201 +200 +198 +198 +197 +196 +197 +194 +195 +190 +190 +190 +189 +189 +185 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +72 +73 +72 +69 +68 +64 +64 +64 +59 +58 +58 +58 +59 +55 +54 +50 +50 +51 +47 +46 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +20 +21 +21 +20 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +54 +54 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +115 +115 +117 +119 +120 +125 +125 +129 +130 +130 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +168 +172 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +184 +185 +189 +188 +190 +190 +191 +195 +195 +197 +196 +197 +197 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +203 +202 +203 +200 +200 +201 +201 +200 +199 +199 +197 +196 +197 +195 +194 +190 +190 +189 +188 +189 +185 +185 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +140 +140 +133 +134 +129 +129 +129 +125 +126 +120 +119 +120 +116 +116 +110 +109 +111 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +59 +59 +58 +55 +54 +50 +51 +50 +46 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +50 +51 +55 +55 +59 +59 +64 +65 +64 +68 +69 +72 +73 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +110 +110 +110 +116 +115 +119 +120 +120 +125 +125 +126 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +188 +188 +189 +190 +191 +195 +195 +195 +196 +196 +198 +198 +198 +201 +201 +201 +200 +201 +202 +203 +204 +204 +205 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +200 +201 +200 +201 +199 +198 +197 +196 +196 +194 +194 +190 +191 +191 +188 +188 +185 +184 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +140 +139 +139 +134 +133 +130 +129 +127 +126 +126 +120 +119 +116 +116 +116 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +50 +50 +51 +47 +46 +42 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +14 +15 +15 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +48 +47 +46 +51 +50 +54 +54 +54 +58 +58 +65 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +110 +110 +110 +110 +115 +116 +119 +120 +120 +125 +125 +129 +129 +131 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +178 +179 +179 +183 +183 +184 +185 +185 +188 +189 +191 +190 +191 +195 +195 +196 +197 +196 +198 +199 +200 +200 +201 +201 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +204 +205 +204 +205 +204 +203 +203 +201 +200 +200 +201 +200 +198 +199 +198 +197 +197 +195 +194 +195 +190 +191 +189 +188 +189 +185 +185 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +150 +151 +147 +147 +143 +144 +141 +139 +139 +134 +133 +129 +130 +129 +125 +125 +120 +120 +120 +115 +115 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +65 +64 +58 +58 +54 +55 +55 +51 +51 +47 +46 +43 +43 +42 +41 +41 +37 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +50 +50 +54 +55 +55 +58 +59 +65 +64 +66 +69 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +116 +119 +120 +120 +125 +125 +129 +129 +129 +133 +134 +140 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +185 +184 +188 +189 +188 +190 +191 +194 +194 +197 +196 +196 +198 +198 +200 +200 +200 +201 +201 +203 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +202 +202 +200 +200 +201 +201 +200 +198 +198 +196 +196 +197 +194 +194 +191 +191 +188 +189 +189 +185 +184 +183 +183 +182 +179 +178 +178 +178 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +118 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +65 +65 +59 +58 +55 +54 +54 +50 +50 +46 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +22 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +12 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +47 +47 +50 +51 +54 +54 +55 +59 +59 +65 +65 +64 +68 +68 +68 +68 +68 +72 +72 +76 +77 +77 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +99 +105 +106 +110 +110 +110 +115 +116 +119 +120 +120 +125 +126 +129 +129 +130 +133 +133 +139 +139 +142 +143 +143 +147 +148 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +185 +185 +185 +189 +189 +191 +191 +191 +195 +194 +196 +196 +196 +199 +199 +200 +201 +200 +200 +201 +203 +202 +203 +205 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +203 +200 +200 +200 +201 +198 +198 +198 +197 +196 +194 +195 +195 +190 +190 +191 +191 +191 +189 +188 +184 +184 +185 +182 +183 +179 +179 +177 +175 +175 +172 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +137 +133 +133 +129 +129 +126 +125 +125 +119 +119 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +55 +51 +50 +47 +46 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +15 +15 +15 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +42 +43 +43 +47 +47 +50 +51 +51 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +116 +116 +120 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +184 +185 +184 +189 +189 +191 +191 +190 +194 +195 +196 +197 +199 +198 +198 +201 +201 +200 +201 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +207 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +200 +198 +198 +197 +196 +197 +194 +194 +191 +191 +191 +189 +189 +185 +185 +182 +183 +183 +179 +179 +175 +174 +174 +172 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +119 +119 +115 +115 +116 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +73 +68 +68 +64 +65 +65 +59 +59 +55 +55 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +50 +51 +50 +54 +54 +58 +58 +59 +65 +65 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +140 +139 +139 +143 +143 +146 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +174 +179 +178 +183 +183 +183 +185 +185 +189 +189 +191 +191 +190 +194 +194 +196 +196 +197 +198 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +200 +201 +200 +200 +201 +198 +198 +196 +196 +196 +195 +194 +191 +190 +190 +188 +189 +188 +188 +189 +185 +184 +183 +183 +183 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +126 +125 +125 +119 +120 +115 +116 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +55 +50 +50 +46 +46 +46 +43 +43 +41 +41 +41 +36 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +58 +64 +64 +68 +69 +69 +72 +72 +76 +76 +81 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +134 +134 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +162 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +179 +179 +179 +183 +182 +185 +184 +185 +188 +188 +190 +191 +191 +194 +195 +197 +196 +196 +198 +199 +200 +201 +201 +201 +200 +202 +203 +205 +205 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +202 +203 +200 +201 +200 +201 +200 +199 +198 +198 +197 +196 +197 +196 +196 +194 +195 +190 +191 +191 +188 +189 +185 +185 +184 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +134 +133 +129 +129 +130 +125 +125 +120 +120 +119 +116 +115 +110 +110 +110 +105 +106 +99 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +55 +55 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +15 +15 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +55 +54 +59 +58 +65 +65 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +115 +120 +119 +119 +125 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +184 +185 +189 +189 +188 +191 +190 +195 +195 +195 +196 +197 +198 +198 +200 +200 +201 +201 +201 +202 +202 +202 +204 +204 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +207 +207 +206 +206 +206 +204 +204 +205 +205 +204 +202 +202 +203 +202 +203 +200 +200 +200 +201 +201 +199 +199 +197 +197 +195 +194 +194 +190 +190 +188 +188 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +168 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +130 +125 +125 +120 +119 +119 +115 +115 +109 +110 +106 +106 +106 +99 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +58 +59 +55 +55 +55 +51 +51 +46 +46 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +42 +42 +43 +47 +46 +50 +51 +51 +55 +55 +58 +59 +58 +65 +65 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +97 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +125 +129 +130 +133 +133 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +184 +188 +188 +188 +190 +191 +195 +194 +194 +196 +197 +197 +197 +197 +199 +199 +201 +200 +200 +200 +200 +203 +202 +203 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +203 +202 +203 +201 +201 +200 +200 +200 +199 +199 +196 +196 +197 +194 +195 +191 +190 +190 +189 +189 +185 +185 +185 +183 +183 +179 +178 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +152 +151 +151 +147 +148 +144 +143 +143 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +85 +86 +82 +82 +80 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +58 +55 +55 +51 +50 +50 +46 +47 +43 +42 +43 +41 +40 +37 +36 +33 +33 +33 +32 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +12 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +37 +37 +41 +41 +41 +41 +40 +43 +43 +42 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +58 +58 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +95 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +120 +120 +119 +126 +126 +129 +130 +129 +133 +134 +140 +139 +140 +144 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +179 +183 +182 +185 +185 +185 +189 +189 +191 +191 +192 +195 +194 +197 +197 +198 +199 +199 +200 +201 +200 +201 +201 +202 +202 +202 +202 +202 +204 +204 +204 +205 +205 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +201 +200 +200 +200 +201 +198 +199 +196 +197 +194 +195 +194 +191 +190 +188 +188 +189 +184 +185 +183 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +126 +125 +120 +120 +120 +115 +115 +110 +109 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +73 +72 +68 +68 +69 +65 +64 +58 +58 +55 +54 +54 +51 +50 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +26 +24 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +37 +36 +41 +41 +40 +43 +43 +46 +47 +51 +50 +51 +55 +55 +58 +59 +59 +64 +65 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +89 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +115 +119 +120 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +180 +182 +183 +185 +185 +188 +188 +188 +190 +190 +195 +195 +194 +196 +196 +196 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +203 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +201 +201 +200 +200 +198 +198 +199 +196 +196 +195 +194 +194 +191 +190 +188 +189 +188 +185 +185 +183 +183 +182 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +140 +133 +133 +130 +129 +126 +126 +126 +120 +120 +115 +115 +115 +109 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +55 +51 +51 +47 +47 +46 +43 +43 +41 +41 +39 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +64 +64 +69 +69 +72 +73 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +126 +129 +130 +133 +133 +139 +139 +140 +143 +144 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +162 +161 +161 +165 +165 +169 +169 +171 +173 +173 +175 +175 +179 +178 +179 +183 +183 +184 +185 +184 +189 +188 +189 +188 +189 +190 +190 +194 +195 +195 +197 +197 +198 +198 +200 +200 +201 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +207 +204 +204 +204 +204 +204 +203 +202 +203 +200 +200 +201 +201 +201 +199 +198 +197 +197 +197 +195 +194 +190 +191 +190 +189 +188 +185 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +160 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +130 +130 +130 +126 +126 +120 +120 +119 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +69 +69 +64 +64 +64 +58 +58 +54 +55 +55 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +18 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +47 +47 +46 +51 +51 +55 +54 +55 +58 +58 +64 +64 +69 +69 +68 +72 +72 +76 +76 +76 +82 +83 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +119 +119 +120 +126 +125 +129 +129 +129 +133 +133 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +153 +156 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +173 +174 +173 +174 +175 +179 +179 +179 +182 +183 +184 +184 +188 +189 +189 +190 +190 +194 +195 +194 +196 +197 +198 +198 +198 +200 +201 +200 +200 +200 +202 +203 +205 +204 +205 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +201 +200 +200 +201 +198 +198 +197 +197 +196 +194 +195 +190 +191 +191 +188 +188 +188 +188 +189 +184 +185 +183 +183 +183 +178 +179 +174 +175 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +130 +129 +130 +125 +125 +119 +119 +115 +115 +116 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +69 +69 +64 +64 +58 +59 +59 +55 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +40 +43 +43 +47 +47 +47 +50 +51 +54 +55 +55 +59 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +105 +106 +110 +110 +110 +109 +110 +116 +116 +120 +119 +119 +126 +125 +130 +130 +131 +134 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +184 +185 +189 +188 +188 +190 +190 +195 +195 +194 +196 +196 +198 +198 +199 +201 +200 +200 +201 +202 +202 +203 +205 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +205 +205 +202 +202 +202 +200 +201 +200 +201 +201 +198 +198 +196 +196 +196 +194 +195 +191 +191 +190 +189 +189 +185 +185 +185 +183 +183 +179 +178 +175 +175 +174 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +134 +130 +129 +129 +125 +125 +126 +125 +125 +119 +120 +119 +119 +119 +115 +115 +110 +110 +110 +110 +109 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +73 +68 +68 +68 +64 +64 +58 +58 +55 +55 +54 +51 +50 +47 +47 +47 +42 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +30 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +47 +46 +51 +51 +52 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +120 +119 +125 +125 +125 +125 +126 +129 +129 +133 +133 +134 +140 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +179 +183 +183 +184 +184 +188 +188 +189 +190 +191 +195 +195 +194 +196 +197 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +201 +201 +199 +198 +197 +196 +196 +195 +194 +190 +191 +190 +188 +189 +185 +184 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +129 +129 +130 +126 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +73 +69 +68 +68 +64 +64 +58 +59 +59 +54 +55 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +55 +55 +54 +55 +54 +58 +58 +64 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +109 +110 +116 +116 +120 +120 +122 +125 +126 +129 +129 +133 +133 +133 +139 +140 +144 +144 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +172 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +188 +189 +191 +190 +190 +194 +195 +196 +196 +196 +199 +198 +201 +200 +201 +200 +201 +202 +203 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +205 +205 +205 +205 +204 +203 +202 +201 +200 +200 +200 +201 +198 +198 +198 +196 +197 +195 +195 +194 +195 +195 +191 +191 +191 +189 +189 +185 +185 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +156 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +129 +129 +129 +125 +125 +120 +120 +119 +115 +115 +109 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +65 +59 +58 +57 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +26 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +50 +52 +55 +55 +59 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +76 +77 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +109 +110 +116 +115 +119 +120 +119 +126 +125 +129 +129 +129 +134 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +183 +184 +184 +188 +188 +190 +191 +191 +195 +194 +196 +196 +196 +198 +198 +201 +200 +201 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +205 +204 +205 +204 +204 +202 +202 +202 +200 +201 +200 +200 +201 +198 +199 +197 +197 +195 +195 +194 +190 +191 +188 +189 +189 +185 +185 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +128 +125 +125 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +72 +73 +69 +68 +64 +64 +64 +58 +58 +55 +54 +55 +50 +50 +46 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +31 +31 +30 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +22 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +35 +37 +37 +41 +41 +43 +43 +42 +47 +47 +51 +50 +51 +54 +55 +55 +55 +55 +58 +58 +65 +64 +65 +68 +68 +72 +72 +74 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +109 +115 +116 +116 +120 +119 +126 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +183 +183 +185 +184 +189 +189 +188 +190 +191 +194 +194 +194 +196 +196 +198 +199 +199 +201 +200 +200 +201 +203 +202 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +203 +200 +200 +201 +201 +201 +201 +200 +200 +198 +198 +197 +196 +197 +194 +194 +191 +190 +189 +189 +189 +184 +185 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +152 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +115 +115 +116 +110 +109 +106 +106 +101 +100 +100 +96 +96 +91 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +54 +51 +51 +51 +46 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +49 +50 +50 +54 +55 +58 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +119 +125 +126 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +178 +183 +183 +183 +185 +185 +189 +189 +191 +191 +190 +195 +195 +196 +197 +196 +199 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +200 +200 +201 +200 +199 +198 +199 +197 +196 +194 +194 +194 +190 +191 +189 +188 +188 +185 +184 +185 +185 +185 +182 +183 +178 +178 +178 +175 +175 +173 +173 +170 +169 +169 +165 +166 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +120 +119 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +58 +55 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +16 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +40 +43 +42 +47 +47 +47 +51 +51 +54 +54 +55 +58 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +125 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +150 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +184 +185 +188 +188 +190 +191 +190 +194 +195 +196 +196 +197 +198 +198 +200 +200 +201 +200 +200 +202 +203 +204 +204 +204 +205 +204 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +205 +204 +205 +204 +204 +202 +203 +202 +200 +200 +200 +201 +201 +198 +198 +199 +198 +198 +196 +197 +194 +194 +194 +191 +191 +188 +189 +187 +185 +185 +183 +182 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +158 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +132 +133 +134 +129 +129 +126 +126 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +54 +55 +50 +51 +47 +46 +44 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +16 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +41 +41 +42 +43 +47 +46 +47 +50 +50 +54 +54 +55 +58 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +109 +116 +116 +119 +120 +120 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +174 +175 +179 +178 +183 +183 +183 +184 +185 +189 +188 +189 +191 +191 +194 +195 +195 +197 +197 +198 +198 +201 +201 +201 +200 +200 +202 +202 +202 +204 +204 +204 +205 +204 +205 +204 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +207 +206 +207 +205 +204 +204 +204 +204 +202 +203 +203 +202 +203 +200 +201 +200 +200 +201 +199 +199 +196 +196 +196 +195 +195 +190 +191 +188 +189 +188 +184 +184 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +120 +120 +119 +115 +116 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +87 +86 +83 +83 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +55 +54 +54 +50 +51 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +16 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +42 +46 +47 +50 +51 +51 +55 +55 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +85 +86 +86 +90 +90 +95 +96 +100 +100 +100 +105 +106 +110 +109 +109 +115 +115 +120 +119 +120 +125 +125 +129 +130 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +161 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +183 +185 +185 +188 +188 +190 +191 +190 +194 +194 +197 +197 +197 +199 +198 +198 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +204 +205 +205 +204 +204 +203 +202 +203 +200 +201 +200 +200 +198 +198 +198 +196 +196 +194 +195 +195 +190 +191 +189 +188 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +162 +161 +157 +157 +157 +151 +151 +148 +147 +147 +144 +143 +139 +139 +140 +134 +133 +130 +129 +126 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +55 +51 +50 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +51 +50 +55 +55 +59 +59 +58 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +139 +139 +139 +144 +143 +147 +147 +147 +151 +151 +157 +157 +158 +160 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +179 +179 +178 +182 +183 +185 +185 +185 +188 +189 +190 +191 +192 +194 +194 +196 +197 +198 +198 +198 +200 +201 +200 +200 +201 +200 +200 +201 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +201 +201 +201 +200 +201 +198 +198 +196 +196 +196 +195 +194 +191 +191 +191 +188 +189 +184 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +99 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +73 +72 +69 +68 +65 +64 +64 +59 +58 +55 +55 +55 +50 +51 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +35 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +58 +58 +59 +64 +65 +68 +68 +68 +73 +72 +76 +76 +77 +82 +82 +86 +86 +91 +90 +90 +95 +96 +100 +100 +100 +105 +106 +110 +110 +109 +116 +116 +120 +120 +120 +125 +125 +129 +129 +130 +133 +134 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +168 +172 +173 +173 +175 +175 +179 +179 +182 +182 +183 +185 +185 +189 +189 +188 +190 +191 +191 +191 +190 +194 +195 +196 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +205 +202 +203 +200 +201 +200 +200 +200 +198 +198 +198 +197 +197 +195 +195 +194 +191 +190 +188 +188 +188 +185 +185 +183 +183 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +134 +133 +129 +130 +129 +126 +126 +120 +120 +120 +116 +116 +110 +110 +110 +105 +106 +100 +100 +99 +96 +96 +90 +90 +87 +86 +87 +82 +82 +76 +76 +76 +72 +73 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +55 +54 +55 +51 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +24 +21 +21 +20 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +55 +55 +59 +58 +65 +64 +69 +68 +69 +72 +72 +76 +76 +76 +82 +82 +82 +83 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +116 +115 +120 +119 +125 +125 +125 +130 +129 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +184 +188 +188 +189 +191 +190 +194 +195 +194 +196 +196 +198 +198 +198 +200 +201 +201 +200 +200 +203 +202 +204 +205 +205 +205 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +201 +198 +198 +197 +197 +196 +195 +194 +191 +191 +191 +189 +188 +184 +185 +185 +182 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +130 +129 +126 +126 +126 +119 +119 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +73 +72 +68 +68 +64 +65 +65 +58 +58 +55 +54 +55 +51 +51 +51 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +32 +33 +37 +37 +36 +41 +40 +43 +43 +47 +47 +47 +50 +50 +54 +55 +55 +58 +58 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +77 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +105 +106 +106 +109 +110 +116 +116 +116 +119 +120 +125 +125 +127 +130 +129 +134 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +148 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +178 +179 +179 +179 +182 +182 +184 +184 +185 +188 +189 +190 +190 +191 +195 +195 +197 +197 +198 +198 +199 +201 +200 +201 +201 +200 +203 +202 +205 +204 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +204 +204 +202 +202 +201 +201 +201 +200 +200 +198 +199 +198 +197 +196 +195 +195 +195 +190 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +130 +129 +129 +125 +125 +120 +120 +119 +115 +116 +110 +109 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +65 +65 +59 +59 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +65 +64 +65 +68 +68 +72 +73 +73 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +110 +110 +110 +115 +116 +119 +120 +120 +125 +125 +125 +125 +125 +130 +130 +134 +133 +133 +139 +139 +143 +143 +147 +147 +146 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +188 +188 +188 +191 +191 +194 +194 +194 +196 +196 +199 +198 +198 +200 +200 +201 +200 +200 +202 +203 +204 +204 +205 +204 +205 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +204 +204 +204 +204 +203 +203 +201 +200 +201 +200 +200 +199 +198 +197 +197 +197 +194 +194 +190 +190 +190 +189 +188 +189 +188 +188 +185 +185 +183 +183 +183 +178 +178 +175 +174 +176 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +131 +129 +129 +125 +125 +119 +120 +119 +116 +116 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +51 +51 +55 +55 +55 +55 +55 +58 +58 +64 +65 +64 +68 +68 +73 +72 +74 +76 +76 +82 +82 +87 +86 +86 +89 +90 +96 +96 +96 +99 +100 +100 +100 +100 +106 +106 +110 +109 +110 +115 +116 +120 +119 +123 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +174 +179 +179 +179 +182 +183 +185 +184 +184 +188 +188 +190 +191 +190 +194 +195 +197 +196 +197 +199 +198 +201 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +205 +204 +204 +203 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +197 +195 +195 +190 +191 +191 +189 +189 +185 +184 +183 +183 +183 +178 +178 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +152 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +129 +129 +129 +125 +125 +120 +120 +120 +115 +115 +110 +110 +107 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +59 +58 +54 +55 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +28 +27 +25 +25 +21 +21 +18 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +52 +55 +54 +59 +58 +64 +64 +68 +68 +68 +72 +72 +73 +76 +77 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +115 +115 +120 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +176 +175 +174 +179 +179 +183 +182 +183 +185 +184 +190 +188 +191 +191 +190 +194 +194 +196 +196 +196 +199 +198 +200 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +200 +201 +201 +201 +201 +198 +198 +196 +196 +195 +194 +195 +190 +190 +188 +188 +189 +184 +185 +185 +185 +184 +182 +183 +179 +179 +179 +175 +175 +172 +173 +171 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +140 +139 +139 +134 +134 +129 +129 +126 +126 +125 +119 +120 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +58 +59 +55 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +39 +41 +41 +43 +42 +47 +47 +47 +51 +50 +54 +55 +55 +58 +59 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +109 +110 +116 +115 +119 +119 +120 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +179 +178 +179 +182 +182 +184 +184 +185 +189 +189 +190 +191 +191 +194 +195 +196 +196 +196 +198 +199 +200 +200 +201 +200 +200 +202 +202 +205 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +203 +201 +200 +200 +200 +201 +198 +198 +199 +196 +196 +196 +197 +196 +195 +194 +191 +190 +191 +188 +189 +184 +184 +185 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +164 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +146 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +120 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +72 +68 +69 +64 +65 +64 +58 +59 +54 +54 +55 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +46 +47 +50 +51 +51 +54 +54 +59 +59 +61 +64 +64 +69 +69 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +178 +178 +183 +182 +184 +185 +184 +188 +188 +190 +191 +191 +194 +194 +197 +196 +199 +198 +199 +200 +200 +200 +200 +200 +202 +203 +205 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +201 +198 +198 +197 +197 +196 +194 +194 +190 +190 +190 +188 +189 +185 +184 +184 +182 +183 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +168 +168 +165 +165 +161 +161 +156 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +131 +126 +125 +120 +119 +117 +115 +116 +110 +109 +105 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +55 +54 +50 +50 +47 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +16 +15 +15 +17 +18 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +58 +58 +59 +65 +65 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +109 +110 +115 +116 +119 +120 +120 +125 +125 +129 +129 +129 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +185 +184 +185 +188 +189 +190 +191 +190 +194 +194 +197 +196 +196 +199 +198 +200 +200 +201 +200 +200 +202 +202 +203 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +203 +202 +203 +200 +200 +200 +200 +200 +198 +198 +196 +196 +196 +194 +195 +194 +194 +194 +191 +190 +189 +188 +189 +185 +185 +183 +183 +181 +178 +179 +175 +175 +172 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +160 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +115 +109 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +58 +58 +55 +54 +51 +51 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +15 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +55 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +119 +120 +120 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +185 +185 +188 +188 +188 +190 +191 +194 +194 +195 +196 +196 +198 +198 +200 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +203 +203 +202 +202 +200 +200 +200 +200 +201 +198 +199 +196 +196 +195 +194 +194 +190 +191 +188 +188 +189 +184 +184 +183 +183 +183 +179 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +116 +116 +110 +110 +106 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +58 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +50 +50 +54 +54 +58 +59 +59 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +115 +116 +115 +119 +119 +126 +125 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +179 +183 +182 +184 +184 +189 +189 +189 +190 +191 +195 +195 +194 +197 +196 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +202 +203 +200 +200 +200 +200 +200 +198 +198 +197 +196 +197 +194 +194 +190 +191 +191 +188 +188 +184 +185 +185 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +59 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +44 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +22 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +42 +47 +46 +47 +51 +50 +54 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +73 +77 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +120 +120 +125 +125 +130 +130 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +182 +182 +184 +185 +185 +184 +184 +189 +188 +191 +191 +191 +196 +194 +197 +196 +197 +199 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +197 +196 +197 +194 +194 +190 +191 +188 +188 +189 +185 +185 +182 +183 +182 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +126 +125 +120 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +59 +55 +55 +51 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +54 +59 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +109 +110 +115 +116 +120 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +172 +175 +175 +178 +178 +179 +182 +182 +184 +184 +185 +189 +189 +190 +190 +194 +194 +194 +196 +196 +198 +198 +198 +201 +200 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +203 +200 +200 +200 +200 +198 +198 +199 +196 +196 +194 +194 +194 +190 +190 +188 +189 +188 +184 +185 +183 +182 +182 +179 +178 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +129 +129 +130 +125 +126 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +64 +64 +58 +59 +55 +54 +54 +51 +51 +46 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +46 +51 +50 +55 +54 +55 +58 +58 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +109 +110 +115 +115 +115 +119 +119 +126 +125 +125 +129 +129 +134 +133 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +184 +184 +185 +189 +188 +191 +190 +191 +195 +194 +194 +195 +194 +196 +197 +198 +198 +199 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +205 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +204 +204 +204 +204 +203 +203 +202 +200 +200 +201 +200 +200 +198 +199 +196 +196 +197 +194 +194 +191 +191 +191 +189 +189 +185 +184 +185 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +144 +143 +144 +139 +140 +133 +133 +130 +130 +130 +125 +126 +120 +119 +120 +115 +115 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +50 +51 +49 +46 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +55 +54 +58 +59 +59 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +115 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +140 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +179 +179 +179 +182 +183 +184 +184 +185 +189 +189 +191 +191 +191 +194 +195 +197 +196 +198 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +201 +200 +200 +200 +200 +198 +198 +198 +197 +196 +194 +194 +190 +190 +191 +189 +188 +185 +185 +184 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +120 +120 +115 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +59 +54 +55 +55 +50 +51 +47 +47 +47 +42 +43 +43 +43 +43 +41 +41 +37 +36 +37 +33 +32 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +16 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +55 +54 +54 +58 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +109 +109 +115 +115 +115 +119 +119 +120 +119 +119 +125 +126 +129 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +182 +183 +185 +185 +188 +188 +189 +190 +191 +194 +194 +194 +197 +196 +198 +198 +198 +200 +200 +200 +201 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +197 +196 +194 +195 +191 +190 +190 +189 +188 +185 +184 +184 +182 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +134 +129 +129 +125 +126 +120 +119 +119 +116 +115 +110 +110 +110 +106 +106 +106 +106 +105 +100 +100 +96 +95 +96 +90 +90 +86 +86 +84 +82 +82 +76 +77 +72 +72 +72 +68 +69 +64 +64 +64 +58 +58 +59 +58 +59 +54 +54 +50 +51 +51 +47 +47 +43 +42 +43 +41 +40 +37 +37 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +16 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +54 +59 +58 +64 +64 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +122 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +182 +184 +185 +189 +189 +188 +191 +191 +195 +194 +195 +196 +197 +198 +198 +200 +200 +201 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +199 +198 +197 +196 +196 +194 +195 +190 +190 +191 +188 +189 +185 +184 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +126 +125 +125 +125 +125 +119 +120 +116 +116 +115 +115 +116 +110 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +81 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +60 +59 +58 +54 +54 +50 +50 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +50 +51 +54 +54 +59 +58 +65 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +87 +86 +90 +90 +90 +95 +96 +100 +100 +101 +106 +106 +109 +110 +115 +116 +115 +120 +120 +126 +125 +126 +129 +130 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +185 +188 +189 +191 +190 +191 +194 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +205 +205 +205 +202 +202 +202 +200 +201 +200 +200 +200 +198 +199 +197 +197 +195 +194 +194 +191 +190 +188 +188 +188 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +123 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +73 +72 +68 +68 +65 +64 +64 +58 +59 +55 +55 +55 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +36 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +50 +54 +54 +58 +58 +58 +64 +64 +64 +64 +64 +68 +68 +72 +72 +72 +75 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +116 +119 +120 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +178 +182 +183 +184 +185 +184 +189 +188 +190 +190 +190 +194 +194 +197 +196 +197 +199 +199 +200 +201 +201 +200 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +206 +207 +205 +204 +205 +204 +204 +202 +202 +201 +201 +200 +200 +200 +198 +198 +198 +197 +196 +194 +194 +194 +190 +190 +188 +189 +189 +184 +185 +182 +183 +183 +179 +178 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +129 +130 +125 +125 +125 +119 +120 +116 +116 +116 +110 +110 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +65 +59 +59 +59 +54 +55 +50 +50 +51 +47 +46 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +55 +55 +59 +58 +64 +64 +65 +69 +68 +72 +72 +74 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +99 +100 +100 +100 +100 +106 +106 +109 +110 +110 +116 +116 +119 +119 +123 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +174 +179 +178 +179 +182 +183 +185 +184 +184 +188 +188 +191 +191 +190 +195 +195 +196 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +207 +207 +206 +205 +204 +205 +204 +204 +204 +204 +202 +203 +202 +200 +200 +200 +200 +200 +198 +198 +196 +197 +196 +195 +195 +191 +190 +191 +188 +188 +184 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +125 +119 +119 +120 +115 +115 +109 +110 +106 +106 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +55 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +115 +119 +119 +120 +125 +125 +130 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +172 +175 +175 +175 +179 +179 +183 +182 +183 +184 +184 +189 +189 +190 +190 +190 +195 +195 +196 +197 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +203 +200 +201 +200 +200 +201 +198 +199 +196 +197 +195 +195 +194 +190 +190 +188 +189 +188 +185 +185 +184 +185 +184 +182 +182 +179 +179 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +129 +126 +125 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +58 +58 +55 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +16 +15 +13 +13 +13 +12 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +17 +16 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +32 +33 +37 +37 +39 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +56 +54 +58 +58 +59 +58 +59 +65 +64 +68 +69 +68 +73 +72 +77 +77 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +107 +110 +109 +110 +115 +115 +119 +120 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +178 +183 +183 +185 +185 +185 +188 +188 +190 +191 +191 +194 +194 +197 +197 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +205 +205 +205 +204 +205 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +199 +198 +196 +196 +197 +197 +197 +194 +194 +190 +191 +191 +188 +189 +185 +184 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +168 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +119 +119 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +64 +64 +59 +58 +54 +55 +55 +51 +50 +47 +46 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +42 +43 +43 +43 +43 +46 +47 +50 +51 +50 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +182 +183 +185 +184 +185 +189 +189 +191 +191 +191 +194 +195 +197 +196 +199 +199 +198 +200 +200 +200 +200 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +205 +205 +204 +204 +202 +203 +200 +200 +200 +201 +200 +199 +199 +198 +197 +197 +194 +194 +190 +191 +190 +188 +189 +185 +185 +184 +183 +182 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +130 +130 +125 +125 +120 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +65 +65 +58 +58 +55 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +12 +15 +16 +17 +17 +19 +20 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +32 +33 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +50 +55 +54 +58 +58 +59 +65 +65 +68 +69 +68 +72 +72 +76 +76 +76 +83 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +116 +119 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +183 +185 +184 +185 +189 +189 +190 +191 +190 +194 +194 +196 +197 +196 +198 +199 +201 +201 +200 +200 +201 +202 +203 +203 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +197 +197 +194 +194 +194 +190 +190 +191 +191 +191 +189 +189 +185 +185 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +168 +169 +169 +164 +165 +161 +161 +161 +158 +157 +151 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +134 +130 +130 +129 +125 +126 +119 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +77 +77 +72 +72 +72 +72 +72 +69 +69 +64 +64 +64 +59 +59 +55 +55 +55 +51 +50 +47 +46 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +46 +51 +51 +54 +54 +55 +59 +58 +64 +65 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +116 +119 +119 +126 +125 +130 +129 +130 +133 +133 +139 +140 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +156 +157 +161 +161 +161 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +178 +179 +183 +183 +185 +184 +184 +188 +188 +191 +190 +190 +194 +195 +196 +196 +197 +198 +198 +201 +200 +201 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +201 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +190 +190 +189 +188 +189 +184 +184 +183 +182 +182 +178 +178 +175 +174 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +126 +126 +120 +120 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +65 +65 +59 +59 +59 +55 +55 +51 +50 +47 +46 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +58 +59 +58 +65 +64 +68 +68 +69 +72 +73 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +110 +110 +110 +116 +115 +120 +120 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +178 +179 +183 +183 +183 +185 +184 +189 +189 +189 +191 +191 +194 +194 +196 +197 +197 +199 +198 +200 +200 +200 +201 +201 +200 +201 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +205 +204 +203 +202 +202 +201 +200 +200 +200 +198 +199 +198 +197 +196 +194 +195 +195 +190 +191 +189 +188 +188 +185 +185 +183 +182 +183 +178 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +134 +133 +130 +129 +129 +125 +125 +120 +120 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +25 +26 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +37 +37 +41 +41 +43 +43 +42 +47 +47 +50 +50 +51 +55 +55 +59 +58 +59 +65 +64 +68 +68 +69 +73 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +116 +116 +119 +120 +120 +126 +126 +129 +130 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +182 +185 +185 +185 +188 +188 +190 +191 +191 +195 +194 +195 +194 +195 +196 +197 +199 +198 +198 +201 +200 +200 +201 +201 +202 +202 +205 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +204 +204 +205 +204 +205 +202 +202 +200 +200 +200 +201 +200 +199 +198 +199 +196 +196 +195 +194 +194 +191 +190 +188 +189 +189 +185 +185 +183 +183 +179 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +134 +130 +129 +125 +126 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +65 +58 +58 +54 +55 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +50 +50 +54 +55 +59 +59 +58 +65 +65 +69 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +115 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +162 +161 +165 +165 +168 +169 +173 +173 +172 +174 +175 +178 +178 +179 +183 +182 +183 +183 +182 +185 +184 +189 +189 +189 +190 +190 +195 +194 +195 +197 +197 +198 +198 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +201 +198 +199 +199 +196 +196 +194 +195 +190 +190 +190 +188 +188 +188 +188 +189 +184 +184 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +150 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +69 +65 +64 +58 +58 +55 +55 +54 +51 +50 +47 +47 +47 +43 +43 +43 +42 +43 +41 +41 +37 +37 +36 +33 +33 +31 +31 +29 +27 +27 +25 +25 +20 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +16 +15 +16 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +51 +50 +51 +55 +54 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +95 +101 +100 +100 +106 +106 +110 +109 +110 +115 +116 +119 +120 +120 +126 +126 +129 +129 +129 +133 +133 +139 +140 +140 +144 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +178 +179 +182 +182 +183 +184 +185 +188 +189 +190 +190 +191 +195 +195 +196 +196 +197 +198 +198 +199 +198 +198 +201 +201 +200 +200 +200 +202 +203 +204 +204 +205 +204 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +201 +200 +200 +200 +198 +199 +196 +196 +197 +195 +194 +190 +190 +190 +189 +188 +185 +184 +185 +182 +183 +179 +179 +178 +174 +175 +172 +173 +169 +168 +169 +165 +165 +161 +160 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +126 +120 +119 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +64 +65 +59 +58 +58 +54 +54 +54 +54 +55 +50 +50 +47 +47 +47 +42 +43 +41 +41 +39 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +120 +119 +125 +125 +126 +130 +129 +133 +133 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +174 +178 +179 +178 +183 +183 +185 +185 +185 +189 +188 +189 +188 +188 +190 +190 +194 +195 +195 +197 +197 +199 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +204 +204 +205 +205 +204 +202 +203 +202 +201 +201 +201 +200 +200 +198 +198 +196 +196 +196 +194 +194 +191 +190 +191 +188 +188 +184 +184 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +120 +120 +116 +116 +110 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +54 +50 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +59 +58 +65 +64 +65 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +115 +115 +115 +120 +119 +125 +125 +126 +129 +130 +129 +129 +129 +134 +133 +139 +140 +139 +143 +143 +147 +147 +148 +151 +151 +157 +156 +161 +160 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +184 +185 +188 +189 +188 +190 +190 +194 +195 +195 +196 +196 +199 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +205 +204 +203 +203 +200 +200 +201 +201 +200 +198 +198 +197 +197 +196 +194 +195 +190 +191 +191 +188 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +116 +115 +109 +110 +109 +106 +106 +100 +100 +100 +96 +96 +96 +97 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +75 +72 +72 +69 +69 +65 +64 +64 +58 +58 +55 +55 +55 +51 +50 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +26 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +14 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +44 +43 +48 +46 +47 +50 +51 +54 +54 +54 +59 +58 +65 +64 +65 +68 +68 +72 +72 +72 +77 +77 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +115 +116 +119 +120 +119 +125 +125 +129 +130 +131 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +172 +173 +174 +175 +175 +179 +179 +183 +183 +183 +185 +184 +188 +189 +188 +190 +190 +195 +195 +195 +196 +197 +198 +198 +199 +200 +201 +200 +200 +202 +202 +202 +204 +205 +204 +205 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +204 +205 +205 +204 +202 +202 +202 +200 +200 +201 +200 +200 +198 +199 +197 +196 +196 +194 +194 +191 +190 +190 +188 +188 +184 +185 +184 +183 +183 +178 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +148 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +115 +116 +116 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +69 +65 +64 +58 +58 +58 +54 +54 +50 +50 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +46 +47 +50 +50 +54 +54 +55 +59 +59 +64 +65 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +99 +105 +106 +106 +110 +109 +115 +115 +117 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +185 +184 +185 +189 +188 +190 +190 +191 +195 +195 +196 +196 +198 +198 +199 +200 +200 +200 +200 +200 +201 +200 +203 +202 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +201 +200 +198 +198 +196 +196 +197 +195 +195 +191 +190 +189 +188 +189 +184 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +129 +126 +125 +126 +119 +119 +115 +116 +113 +110 +110 +106 +106 +100 +99 +100 +96 +96 +90 +91 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +59 +54 +54 +55 +51 +50 +47 +47 +47 +43 +42 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +18 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +12 +15 +15 +18 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +30 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +47 +46 +50 +50 +55 +55 +55 +59 +58 +64 +64 +64 +68 +69 +73 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +119 +120 +119 +119 +125 +125 +129 +130 +130 +133 +133 +139 +139 +142 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +178 +179 +183 +182 +183 +185 +185 +188 +189 +191 +191 +191 +194 +194 +197 +196 +197 +198 +198 +200 +200 +201 +201 +200 +202 +202 +203 +204 +204 +204 +204 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +204 +202 +202 +203 +200 +201 +200 +201 +199 +198 +198 +196 +196 +194 +195 +194 +190 +190 +189 +188 +188 +185 +185 +183 +182 +182 +179 +179 +175 +175 +176 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +127 +126 +125 +119 +119 +115 +116 +115 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +77 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +59 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +16 +17 +17 +15 +15 +15 +15 +15 +12 +13 +12 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +31 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +129 +132 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +176 +178 +179 +183 +183 +184 +184 +185 +188 +189 +190 +191 +190 +194 +195 +197 +196 +196 +198 +199 +201 +200 +200 +201 +201 +202 +203 +205 +205 +205 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +199 +198 +197 +196 +196 +196 +196 +195 +195 +191 +190 +191 +189 +189 +185 +184 +185 +183 +183 +178 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +134 +134 +130 +129 +130 +125 +126 +120 +120 +119 +116 +115 +116 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +91 +90 +89 +86 +86 +82 +82 +83 +76 +76 +72 +72 +73 +68 +68 +64 +65 +65 +58 +58 +54 +55 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +58 +59 +61 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +119 +119 +120 +125 +126 +129 +130 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +182 +183 +184 +185 +189 +189 +189 +190 +191 +194 +194 +196 +196 +196 +198 +198 +200 +201 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +207 +207 +207 +206 +207 +206 +206 +206 +206 +207 +207 +206 +204 +205 +204 +204 +204 +203 +202 +201 +200 +200 +201 +200 +198 +198 +200 +196 +196 +194 +195 +191 +191 +191 +189 +188 +185 +185 +184 +182 +183 +183 +182 +182 +179 +178 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +144 +133 +133 +129 +129 +130 +125 +125 +119 +120 +117 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +59 +58 +55 +54 +54 +51 +50 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +18 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +44 +47 +47 +51 +51 +54 +54 +54 +58 +59 +58 +58 +59 +64 +64 +64 +64 +65 +69 +69 +72 +72 +72 +77 +76 +82 +83 +86 +87 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +126 +129 +129 +134 +133 +138 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +182 +185 +185 +188 +188 +188 +190 +190 +190 +190 +191 +194 +195 +197 +197 +196 +198 +198 +201 +200 +201 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +199 +196 +196 +195 +194 +194 +190 +191 +188 +189 +188 +184 +185 +183 +182 +181 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +160 +158 +157 +151 +151 +152 +147 +147 +143 +143 +141 +139 +139 +134 +133 +129 +129 +129 +125 +126 +120 +120 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +69 +68 +64 +64 +58 +58 +58 +54 +55 +50 +50 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +40 +43 +43 +42 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +58 +63 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +115 +115 +116 +119 +119 +125 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +184 +185 +184 +188 +189 +191 +190 +191 +194 +194 +197 +197 +199 +198 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +205 +207 +207 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +202 +202 +200 +200 +200 +201 +199 +198 +196 +196 +197 +194 +194 +190 +191 +189 +188 +188 +185 +184 +182 +183 +183 +178 +179 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +130 +125 +126 +125 +119 +120 +115 +116 +110 +109 +109 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +65 +64 +59 +59 +59 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +36 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +16 +16 +15 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +47 +46 +50 +50 +50 +51 +51 +54 +54 +59 +59 +59 +64 +65 +68 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +183 +185 +184 +185 +189 +189 +191 +190 +190 +195 +195 +196 +196 +197 +198 +199 +201 +201 +201 +201 +201 +202 +202 +203 +204 +204 +205 +204 +206 +207 +207 +206 +206 +206 +206 +206 +206 +207 +207 +207 +207 +206 +206 +207 +206 +206 +204 +205 +204 +204 +203 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +197 +197 +195 +194 +195 +194 +194 +190 +190 +188 +189 +189 +185 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +137 +133 +133 +130 +130 +126 +125 +126 +120 +120 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +69 +68 +68 +65 +64 +58 +58 +59 +55 +55 +50 +51 +51 +47 +47 +42 +42 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +14 +15 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +116 +116 +119 +120 +125 +125 +125 +129 +129 +134 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +185 +184 +189 +189 +191 +191 +191 +194 +194 +196 +196 +199 +198 +198 +200 +200 +200 +200 +200 +203 +203 +203 +202 +202 +205 +205 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +205 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +196 +197 +197 +194 +195 +191 +191 +190 +189 +188 +184 +185 +184 +182 +182 +179 +178 +178 +175 +174 +173 +172 +173 +169 +169 +165 +165 +160 +161 +160 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +130 +125 +125 +125 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +59 +59 +59 +55 +54 +55 +54 +54 +50 +51 +51 +51 +50 +47 +47 +43 +42 +43 +41 +40 +37 +37 +38 +33 +33 +31 +30 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +40 +41 +41 +43 +43 +47 +47 +46 +50 +51 +54 +54 +55 +59 +59 +65 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +85 +86 +86 +90 +89 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +126 +126 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +183 +183 +184 +184 +188 +188 +188 +190 +190 +191 +191 +190 +194 +194 +196 +197 +197 +199 +198 +200 +200 +200 +201 +200 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +197 +196 +195 +194 +190 +190 +191 +188 +189 +184 +185 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +125 +126 +125 +119 +120 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +55 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +105 +109 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +172 +173 +175 +175 +175 +179 +179 +183 +182 +183 +184 +185 +189 +188 +190 +190 +191 +194 +194 +196 +196 +197 +198 +199 +200 +200 +200 +200 +201 +200 +201 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +201 +201 +199 +198 +196 +196 +197 +194 +194 +190 +190 +191 +189 +189 +184 +184 +184 +183 +182 +179 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +162 +161 +161 +158 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +134 +133 +130 +129 +126 +125 +125 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +69 +64 +64 +58 +58 +58 +54 +55 +51 +51 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +18 +17 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +47 +46 +47 +51 +51 +54 +54 +55 +58 +58 +65 +64 +65 +68 +69 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +115 +116 +116 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +160 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +176 +179 +179 +183 +183 +185 +184 +185 +188 +188 +190 +191 +191 +195 +194 +195 +195 +194 +196 +196 +199 +199 +198 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +199 +199 +198 +196 +196 +195 +194 +194 +190 +190 +189 +188 +188 +189 +189 +185 +185 +183 +182 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +140 +139 +139 +133 +134 +129 +129 +130 +125 +126 +120 +120 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +67 +68 +64 +64 +64 +59 +59 +54 +54 +52 +50 +51 +46 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +20 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +40 +40 +43 +43 +47 +47 +47 +50 +50 +54 +54 +55 +58 +58 +65 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +110 +116 +115 +119 +120 +119 +125 +126 +129 +129 +130 +133 +133 +140 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +156 +158 +161 +161 +165 +164 +168 +169 +169 +173 +172 +175 +175 +175 +179 +179 +178 +178 +179 +183 +183 +184 +185 +185 +189 +189 +190 +190 +194 +195 +195 +196 +196 +198 +199 +198 +200 +200 +201 +200 +200 +202 +203 +205 +204 +204 +204 +204 +206 +207 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +204 +204 +204 +202 +202 +201 +200 +201 +201 +200 +199 +198 +199 +197 +197 +194 +195 +191 +190 +191 +189 +189 +185 +185 +184 +183 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +144 +143 +143 +139 +139 +134 +134 +134 +129 +129 +126 +125 +126 +119 +120 +116 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +66 +64 +64 +59 +59 +54 +55 +54 +50 +50 +47 +46 +47 +43 +43 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +20 +21 +19 +19 +17 +17 +17 +15 +15 +14 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +64 +64 +68 +69 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +116 +119 +120 +120 +120 +119 +126 +126 +129 +129 +130 +133 +134 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +182 +183 +185 +185 +188 +188 +189 +191 +190 +194 +194 +194 +196 +197 +198 +198 +198 +201 +201 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +205 +204 +202 +203 +201 +201 +200 +200 +200 +198 +199 +199 +196 +196 +195 +195 +194 +190 +190 +189 +189 +189 +184 +184 +183 +183 +182 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +83 +77 +76 +76 +72 +72 +72 +72 +72 +68 +68 +69 +68 +69 +64 +64 +58 +58 +59 +54 +55 +51 +50 +48 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +55 +59 +59 +65 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +95 +96 +100 +100 +106 +106 +107 +109 +110 +116 +115 +119 +119 +119 +126 +126 +129 +129 +130 +133 +133 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +185 +189 +189 +191 +191 +194 +195 +194 +196 +197 +198 +199 +198 +200 +201 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +201 +198 +198 +199 +196 +196 +194 +195 +191 +191 +190 +189 +188 +185 +185 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +119 +117 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +68 +68 +65 +64 +58 +59 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +50 +55 +55 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +73 +76 +77 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +116 +119 +119 +119 +120 +120 +126 +125 +129 +129 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +182 +184 +185 +184 +188 +189 +190 +190 +191 +194 +195 +197 +197 +196 +198 +199 +200 +200 +200 +201 +200 +202 +202 +202 +204 +205 +204 +204 +207 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +205 +202 +202 +202 +200 +200 +200 +201 +199 +198 +198 +196 +197 +195 +195 +195 +190 +191 +189 +189 +188 +184 +185 +183 +182 +182 +179 +179 +175 +175 +174 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +131 +129 +129 +125 +126 +119 +120 +120 +116 +116 +116 +116 +115 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +59 +55 +54 +51 +50 +51 +47 +46 +43 +43 +40 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +16 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +15 +16 +15 +18 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +46 +47 +51 +50 +50 +51 +51 +55 +55 +58 +58 +58 +65 +64 +68 +68 +69 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +119 +119 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +172 +175 +175 +175 +178 +178 +183 +183 +183 +185 +184 +189 +189 +188 +191 +190 +194 +194 +195 +196 +197 +198 +199 +200 +201 +200 +201 +200 +202 +203 +203 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +201 +200 +200 +200 +200 +198 +198 +198 +197 +197 +195 +194 +195 +190 +191 +189 +188 +185 +184 +184 +183 +182 +179 +179 +178 +174 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +134 +133 +129 +129 +125 +125 +125 +120 +119 +115 +116 +111 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +58 +58 +59 +55 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +32 +31 +30 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +51 +50 +55 +54 +58 +58 +59 +64 +64 +68 +68 +69 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +105 +109 +110 +115 +115 +115 +119 +120 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +179 +183 +183 +184 +184 +189 +188 +189 +191 +190 +194 +194 +194 +196 +196 +198 +199 +199 +200 +201 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +207 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +201 +201 +201 +200 +200 +198 +198 +196 +197 +196 +194 +194 +190 +191 +190 +189 +188 +189 +188 +188 +185 +185 +183 +182 +182 +178 +179 +175 +175 +175 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +144 +143 +139 +139 +133 +133 +130 +129 +129 +125 +126 +120 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +69 +68 +65 +65 +58 +59 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +34 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +55 +54 +54 +55 +55 +59 +58 +64 +64 +65 +68 +68 +72 +72 +75 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +120 +126 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +152 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +178 +182 +182 +183 +185 +185 +189 +188 +189 +191 +191 +195 +194 +194 +196 +196 +198 +198 +199 +200 +200 +200 +201 +203 +202 +202 +204 +204 +204 +205 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +205 +204 +205 +202 +202 +202 +201 +200 +200 +201 +200 +198 +198 +198 +199 +198 +196 +196 +194 +194 +195 +190 +191 +189 +189 +186 +184 +184 +182 +182 +179 +179 +179 +175 +175 +173 +173 +172 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +125 +125 +119 +120 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +59 +58 +58 +54 +54 +51 +51 +46 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +12 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +54 +54 +55 +59 +59 +64 +65 +65 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +116 +116 +120 +120 +125 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +144 +143 +147 +148 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +172 +175 +175 +179 +178 +179 +182 +183 +185 +185 +184 +189 +188 +190 +190 +195 +194 +194 +196 +196 +198 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +204 +205 +202 +202 +203 +201 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +191 +188 +188 +188 +185 +184 +185 +185 +185 +183 +183 +179 +178 +179 +175 +175 +173 +172 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +125 +125 +126 +119 +119 +116 +116 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +64 +64 +58 +58 +58 +54 +55 +50 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +20 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +58 +58 +59 +64 +65 +69 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +120 +119 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +179 +178 +179 +183 +182 +185 +185 +185 +189 +189 +191 +191 +191 +195 +195 +196 +197 +197 +198 +198 +200 +200 +201 +201 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +205 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +198 +198 +196 +196 +195 +194 +195 +190 +191 +188 +188 +188 +185 +184 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +134 +133 +130 +129 +125 +125 +125 +120 +120 +116 +116 +115 +110 +109 +106 +105 +106 +100 +100 +95 +96 +91 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +58 +54 +54 +51 +51 +47 +47 +46 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +16 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +42 +47 +46 +47 +50 +50 +54 +54 +58 +59 +59 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +109 +110 +115 +115 +120 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +162 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +183 +184 +185 +188 +188 +189 +191 +191 +194 +194 +197 +197 +196 +198 +198 +200 +200 +200 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +205 +204 +207 +207 +207 +206 +206 +206 +207 +206 +207 +207 +206 +206 +206 +206 +207 +204 +204 +204 +205 +204 +204 +204 +202 +202 +203 +200 +201 +200 +200 +199 +198 +199 +197 +196 +194 +195 +194 +190 +190 +188 +188 +188 +185 +184 +183 +183 +183 +179 +178 +175 +174 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +120 +119 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +85 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +65 +65 +59 +58 +55 +55 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +36 +32 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +40 +41 +43 +43 +43 +47 +47 +50 +51 +50 +55 +55 +59 +58 +58 +64 +65 +68 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +120 +126 +125 +130 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +185 +185 +185 +188 +189 +190 +191 +191 +195 +195 +195 +194 +194 +197 +196 +199 +198 +198 +201 +201 +200 +200 +201 +203 +203 +205 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +204 +204 +205 +203 +202 +200 +201 +200 +201 +200 +199 +198 +199 +197 +197 +195 +195 +194 +191 +191 +189 +189 +189 +185 +185 +183 +183 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +130 +126 +126 +119 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +51 +51 +47 +47 +42 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +32 +31 +27 +27 +25 +24 +25 +21 +21 +19 +18 +20 +17 +17 +15 +14 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +51 +51 +55 +55 +58 +59 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +105 +106 +110 +110 +117 +116 +116 +120 +119 +125 +125 +125 +129 +129 +130 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +186 +189 +189 +191 +191 +194 +195 +194 +196 +196 +196 +196 +196 +199 +198 +198 +199 +199 +200 +201 +200 +200 +201 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +202 +203 +200 +200 +201 +200 +200 +198 +199 +196 +197 +196 +194 +194 +191 +191 +191 +189 +189 +185 +185 +185 +183 +183 +178 +179 +178 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +68 +68 +68 +65 +65 +58 +58 +59 +54 +55 +51 +50 +50 +47 +47 +43 +44 +43 +40 +41 +37 +37 +35 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +18 +20 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +14 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +42 +47 +47 +51 +51 +50 +54 +54 +58 +58 +58 +64 +64 +68 +68 +67 +72 +72 +76 +76 +77 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +109 +116 +116 +116 +120 +119 +125 +126 +126 +130 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +184 +185 +189 +188 +189 +191 +190 +190 +191 +190 +194 +195 +196 +196 +197 +199 +198 +201 +200 +200 +201 +201 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +204 +205 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +197 +196 +195 +194 +194 +190 +190 +189 +189 +188 +184 +185 +183 +183 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +156 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +130 +129 +125 +125 +126 +119 +119 +119 +120 +120 +115 +116 +109 +110 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +85 +86 +86 +82 +82 +76 +76 +76 +72 +73 +72 +73 +72 +68 +68 +64 +64 +65 +58 +58 +54 +54 +53 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +14 +13 +12 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +38 +38 +41 +41 +41 +43 +44 +46 +47 +47 +50 +51 +54 +55 +55 +58 +58 +64 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +120 +119 +120 +126 +125 +129 +129 +129 +133 +133 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +156 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +189 +188 +189 +190 +191 +194 +194 +196 +196 +196 +199 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +205 +204 +204 +204 +205 +202 +202 +203 +200 +201 +200 +200 +200 +198 +199 +196 +197 +194 +194 +195 +191 +191 +188 +189 +188 +185 +185 +183 +183 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +129 +125 +125 +120 +119 +120 +115 +116 +109 +110 +107 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +66 +64 +64 +59 +58 +55 +54 +54 +50 +50 +46 +47 +46 +43 +43 +43 +43 +43 +41 +41 +36 +36 +37 +33 +33 +31 +31 +29 +27 +27 +26 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +28 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +42 +47 +47 +51 +51 +50 +54 +54 +59 +59 +59 +64 +65 +68 +69 +69 +72 +72 +76 +77 +77 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +115 +115 +116 +119 +119 +125 +126 +125 +129 +129 +133 +133 +135 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +177 +178 +179 +182 +183 +184 +185 +184 +189 +188 +190 +191 +191 +195 +195 +196 +196 +196 +199 +198 +200 +201 +200 +200 +200 +203 +202 +204 +205 +205 +204 +204 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +203 +201 +200 +200 +200 +200 +198 +198 +198 +196 +197 +195 +194 +195 +191 +190 +189 +189 +188 +185 +185 +183 +183 +183 +178 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +130 +130 +125 +126 +125 +120 +119 +116 +115 +115 +110 +110 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +76 +76 +76 +72 +72 +67 +68 +69 +64 +65 +64 +64 +65 +58 +59 +55 +55 +54 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +16 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +32 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +58 +59 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +100 +106 +110 +110 +109 +110 +116 +116 +119 +119 +122 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +172 +173 +174 +175 +175 +179 +179 +182 +183 +183 +185 +184 +189 +189 +189 +191 +191 +194 +194 +194 +197 +196 +198 +199 +199 +200 +201 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +207 +206 +207 +206 +207 +207 +207 +207 +206 +206 +207 +206 +206 +207 +204 +205 +204 +204 +205 +202 +202 +202 +200 +201 +200 +200 +200 +198 +199 +197 +196 +197 +194 +195 +191 +191 +190 +188 +189 +185 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +126 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +56 +54 +54 +51 +51 +47 +46 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +46 +47 +47 +50 +50 +54 +55 +55 +59 +58 +64 +64 +69 +69 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +126 +125 +129 +130 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +148 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +183 +183 +185 +185 +188 +190 +190 +190 +191 +195 +194 +194 +195 +194 +196 +196 +199 +199 +198 +200 +200 +201 +200 +200 +203 +203 +204 +204 +205 +204 +204 +206 +207 +207 +207 +206 +206 +206 +206 +207 +207 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +201 +201 +200 +200 +198 +198 +197 +197 +196 +194 +194 +190 +191 +191 +189 +188 +185 +184 +184 +182 +183 +179 +178 +178 +174 +174 +172 +173 +173 +169 +169 +165 +164 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +134 +134 +134 +130 +129 +125 +126 +125 +120 +119 +115 +116 +109 +110 +110 +106 +105 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +73 +73 +72 +68 +68 +64 +64 +64 +58 +59 +55 +55 +55 +51 +51 +47 +47 +46 +42 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +51 +50 +50 +54 +54 +58 +58 +59 +65 +65 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +109 +116 +115 +119 +119 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +174 +175 +179 +179 +179 +183 +183 +185 +184 +184 +189 +188 +190 +190 +190 +194 +194 +196 +196 +196 +199 +199 +201 +200 +201 +201 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +197 +197 +197 +197 +196 +195 +194 +190 +190 +190 +188 +189 +184 +185 +185 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +134 +133 +134 +129 +129 +125 +125 +125 +119 +120 +119 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +69 +68 +68 +64 +64 +58 +59 +59 +54 +54 +50 +51 +47 +46 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +59 +58 +61 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +101 +106 +105 +109 +110 +110 +116 +116 +119 +120 +119 +126 +125 +130 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +189 +189 +188 +190 +191 +194 +194 +197 +197 +196 +199 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +201 +198 +198 +197 +196 +197 +194 +195 +190 +191 +188 +189 +188 +185 +184 +183 +182 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +134 +133 +133 +129 +129 +126 +125 +126 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +58 +58 +59 +54 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +38 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +12 +15 +15 +17 +17 +18 +19 +19 +22 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +54 +58 +58 +58 +64 +64 +72 +72 +72 +76 +76 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +109 +115 +116 +120 +120 +119 +125 +125 +129 +129 +129 +134 +133 +139 +140 +140 +143 +143 +147 +147 +151 +152 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +174 +179 +178 +183 +182 +183 +184 +185 +189 +189 +191 +190 +191 +195 +194 +196 +196 +197 +198 +198 +200 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +205 +205 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +201 +198 +198 +197 +196 +194 +194 +195 +191 +191 +188 +188 +188 +185 +184 +185 +185 +185 +183 +183 +179 +179 +178 +175 +175 +173 +173 +174 +169 +169 +165 +165 +161 +161 +161 +156 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +127 +125 +125 +120 +120 +115 +116 +115 +110 +109 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +58 +59 +55 +54 +55 +51 +51 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +32 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +22 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +51 +50 +54 +54 +58 +59 +59 +65 +64 +64 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +87 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +115 +119 +119 +126 +125 +125 +129 +129 +133 +133 +135 +139 +139 +143 +143 +146 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +183 +182 +182 +185 +184 +188 +188 +188 +191 +190 +191 +190 +190 +194 +194 +197 +196 +196 +198 +199 +200 +200 +201 +200 +200 +202 +202 +205 +204 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +200 +200 +200 +198 +199 +199 +196 +196 +196 +197 +196 +194 +194 +191 +190 +191 +188 +188 +184 +185 +185 +183 +183 +179 +178 +174 +175 +174 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +140 +133 +134 +134 +129 +129 +125 +125 +125 +120 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +83 +83 +82 +76 +76 +73 +73 +73 +68 +68 +64 +64 +64 +59 +59 +55 +54 +54 +50 +50 +47 +47 +44 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +12 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +42 +43 +47 +47 +51 +51 +51 +55 +55 +59 +59 +61 +65 +64 +68 +68 +72 +72 +72 +76 +77 +82 +83 +83 +86 +86 +90 +90 +91 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +125 +129 +129 +134 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +184 +188 +188 +191 +191 +190 +195 +194 +196 +196 +199 +198 +199 +201 +201 +200 +200 +200 +202 +202 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +202 +202 +203 +202 +202 +201 +200 +200 +200 +200 +198 +199 +196 +197 +197 +194 +194 +190 +191 +188 +189 +188 +185 +185 +183 +183 +182 +178 +179 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +119 +116 +116 +110 +110 +109 +106 +105 +100 +100 +101 +96 +96 +90 +90 +91 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +50 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +50 +55 +54 +58 +58 +58 +64 +64 +68 +69 +69 +72 +72 +76 +76 +76 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +120 +126 +125 +129 +130 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +170 +169 +169 +172 +173 +175 +175 +175 +179 +178 +182 +183 +182 +184 +185 +189 +189 +191 +190 +190 +195 +195 +196 +196 +197 +198 +198 +200 +201 +201 +200 +200 +202 +202 +203 +204 +204 +204 +205 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +204 +205 +204 +204 +202 +202 +202 +200 +201 +200 +201 +200 +199 +198 +197 +197 +195 +194 +194 +191 +190 +189 +188 +188 +185 +184 +185 +185 +185 +183 +183 +178 +179 +179 +174 +175 +173 +173 +173 +169 +170 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +119 +119 +115 +116 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +65 +59 +58 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +54 +54 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +110 +116 +115 +119 +120 +119 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +148 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +175 +175 +179 +179 +182 +182 +183 +185 +185 +185 +184 +184 +189 +189 +190 +191 +190 +194 +194 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +200 +200 +200 +201 +198 +198 +199 +196 +196 +195 +195 +192 +190 +191 +189 +189 +184 +185 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +134 +129 +129 +126 +126 +126 +120 +119 +116 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +64 +64 +58 +58 +55 +54 +55 +51 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +54 +55 +55 +59 +58 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +120 +126 +125 +125 +130 +129 +133 +134 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +158 +157 +157 +161 +161 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +182 +183 +183 +184 +185 +189 +188 +191 +191 +191 +194 +195 +197 +197 +196 +199 +199 +199 +198 +199 +200 +200 +201 +200 +200 +202 +203 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +201 +200 +201 +201 +200 +198 +199 +198 +196 +196 +194 +195 +195 +191 +190 +188 +188 +188 +184 +184 +183 +183 +183 +178 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +129 +125 +125 +125 +119 +120 +115 +116 +115 +110 +109 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +69 +65 +64 +58 +59 +58 +55 +55 +51 +50 +50 +47 +47 +43 +44 +43 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +14 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +54 +58 +59 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +184 +185 +185 +185 +185 +188 +189 +190 +191 +190 +194 +194 +196 +197 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +204 +205 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +201 +201 +200 +200 +198 +199 +199 +196 +197 +194 +194 +191 +191 +191 +188 +188 +185 +185 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +119 +115 +116 +116 +110 +110 +105 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +65 +59 +58 +54 +54 +50 +50 +51 +47 +47 +43 +42 +43 +40 +41 +37 +37 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +51 +54 +54 +58 +59 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +119 +119 +125 +125 +130 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +174 +175 +174 +179 +179 +183 +182 +183 +185 +184 +189 +188 +189 +191 +191 +195 +194 +196 +196 +196 +199 +198 +200 +200 +201 +200 +200 +200 +200 +200 +203 +202 +204 +204 +205 +204 +205 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +200 +201 +200 +200 +201 +198 +198 +196 +196 +197 +194 +195 +190 +190 +190 +188 +188 +185 +184 +184 +183 +183 +179 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +134 +134 +133 +129 +130 +125 +125 +126 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +91 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +74 +69 +69 +64 +58 +58 +58 +55 +55 +51 +50 +51 +47 +47 +47 +47 +46 +43 +42 +41 +41 +41 +37 +36 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +47 +50 +50 +55 +54 +55 +58 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +97 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +109 +115 +116 +120 +120 +119 +125 +125 +130 +130 +130 +133 +133 +140 +140 +143 +143 +143 +147 +147 +151 +151 +151 +156 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +174 +175 +175 +179 +178 +182 +182 +183 +185 +184 +188 +189 +189 +190 +191 +191 +190 +190 +194 +194 +196 +196 +197 +198 +199 +201 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +207 +204 +205 +204 +204 +204 +203 +202 +200 +200 +200 +201 +200 +199 +198 +198 +196 +196 +195 +194 +195 +191 +191 +189 +188 +189 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +126 +126 +119 +119 +116 +116 +115 +110 +110 +105 +106 +106 +99 +100 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +65 +64 +58 +58 +58 +54 +54 +51 +51 +48 +47 +47 +43 +43 +41 +41 +41 +36 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +51 +50 +54 +54 +58 +58 +59 +65 +64 +69 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +120 +126 +125 +125 +130 +130 +133 +133 +133 +139 +140 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +175 +179 +178 +178 +178 +179 +182 +182 +185 +185 +185 +188 +189 +190 +190 +194 +194 +194 +196 +196 +198 +198 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +200 +200 +200 +200 +200 +199 +198 +198 +196 +197 +195 +195 +191 +190 +190 +188 +188 +184 +184 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +146 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +119 +120 +116 +116 +116 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +87 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +64 +64 +58 +58 +54 +55 +55 +51 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +28 +27 +27 +25 +25 +21 +22 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +50 +55 +54 +55 +59 +59 +65 +65 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +120 +120 +120 +120 +125 +125 +129 +130 +129 +134 +133 +139 +139 +141 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +181 +183 +183 +185 +185 +188 +188 +188 +190 +191 +194 +195 +194 +197 +196 +198 +198 +198 +200 +200 +200 +201 +201 +203 +203 +204 +204 +205 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +195 +195 +190 +190 +190 +188 +188 +185 +185 +184 +182 +183 +179 +179 +179 +174 +175 +173 +173 +170 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +134 +129 +129 +125 +125 +119 +119 +119 +116 +115 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +59 +58 +59 +54 +55 +50 +51 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +12 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +51 +54 +54 +54 +59 +58 +64 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +121 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +182 +184 +184 +189 +189 +189 +190 +190 +195 +194 +195 +196 +196 +198 +198 +199 +201 +201 +201 +200 +202 +202 +203 +205 +204 +205 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +205 +204 +202 +203 +203 +201 +201 +201 +200 +200 +198 +199 +197 +196 +196 +194 +194 +191 +190 +190 +188 +189 +185 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +138 +139 +140 +134 +133 +129 +129 +129 +125 +125 +126 +125 +125 +119 +119 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +55 +55 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +42 +43 +47 +47 +47 +50 +50 +55 +54 +55 +59 +59 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +109 +115 +116 +116 +119 +120 +126 +125 +125 +129 +129 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +178 +179 +182 +182 +183 +185 +185 +188 +188 +190 +191 +190 +195 +194 +196 +197 +196 +198 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +202 +200 +201 +201 +201 +200 +198 +199 +196 +197 +195 +195 +194 +191 +191 +189 +189 +189 +184 +185 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +130 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +68 +69 +68 +65 +64 +58 +58 +59 +55 +54 +50 +50 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +16 +15 +15 +18 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +48 +47 +46 +50 +51 +55 +54 +54 +58 +58 +58 +58 +59 +64 +64 +68 +69 +68 +72 +72 +76 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +115 +120 +119 +125 +126 +127 +130 +129 +133 +133 +139 +139 +139 +144 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +174 +175 +175 +178 +179 +183 +182 +183 +185 +185 +189 +189 +188 +190 +190 +194 +194 +194 +196 +197 +199 +198 +198 +200 +201 +201 +200 +202 +202 +202 +205 +204 +204 +204 +204 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +205 +204 +204 +203 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +190 +190 +189 +189 +189 +184 +185 +185 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +126 +126 +125 +126 +120 +119 +115 +115 +116 +110 +110 +105 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +54 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +15 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +50 +51 +55 +55 +59 +58 +61 +64 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +115 +115 +120 +119 +119 +126 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +178 +183 +183 +183 +184 +185 +188 +189 +188 +190 +191 +195 +194 +197 +196 +196 +198 +198 +200 +200 +200 +201 +201 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +207 +207 +206 +206 +207 +206 +207 +206 +207 +207 +207 +204 +205 +204 +204 +205 +202 +202 +202 +200 +201 +201 +200 +200 +199 +199 +196 +197 +197 +194 +194 +190 +190 +189 +189 +189 +185 +185 +183 +183 +183 +179 +178 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +140 +139 +139 +133 +133 +129 +129 +130 +125 +126 +120 +119 +116 +115 +110 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +77 +72 +72 +69 +69 +65 +64 +64 +58 +58 +54 +55 +55 +50 +50 +46 +47 +46 +43 +43 +40 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +55 +59 +58 +58 +64 +64 +69 +68 +68 +73 +72 +71 +72 +72 +77 +76 +82 +82 +83 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +115 +115 +120 +119 +120 +126 +125 +129 +129 +130 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +185 +185 +185 +189 +188 +191 +191 +191 +195 +194 +196 +197 +196 +198 +198 +200 +201 +200 +200 +201 +202 +202 +203 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +200 +200 +201 +200 +200 +198 +198 +196 +197 +197 +194 +195 +195 +194 +195 +191 +191 +189 +189 +189 +184 +184 +182 +182 +181 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +140 +139 +133 +133 +129 +129 +129 +126 +126 +119 +119 +119 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +59 +59 +59 +54 +55 +51 +51 +51 +47 +47 +42 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +27 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +20 +25 +25 +27 +27 +29 +31 +30 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +46 +47 +47 +47 +51 +50 +55 +54 +55 +59 +58 +65 +64 +67 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +117 +120 +120 +125 +125 +129 +129 +130 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +182 +185 +184 +189 +188 +188 +190 +191 +194 +195 +195 +196 +196 +199 +198 +201 +200 +200 +201 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +201 +201 +200 +200 +200 +198 +198 +198 +197 +197 +194 +194 +192 +190 +191 +188 +189 +184 +184 +185 +183 +182 +178 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +129 +125 +125 +119 +120 +120 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +55 +54 +55 +51 +51 +47 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +50 +50 +50 +55 +54 +58 +58 +59 +64 +64 +69 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +115 +119 +119 +120 +125 +125 +129 +129 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +156 +157 +161 +161 +161 +166 +165 +169 +169 +169 +172 +173 +175 +175 +175 +178 +179 +183 +183 +182 +184 +185 +188 +188 +190 +191 +191 +195 +195 +196 +196 +196 +198 +198 +198 +198 +198 +200 +200 +201 +200 +200 +202 +203 +204 +204 +205 +205 +204 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +202 +203 +201 +201 +201 +200 +200 +198 +198 +198 +196 +197 +195 +195 +195 +190 +191 +189 +188 +188 +184 +184 +183 +183 +183 +178 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +158 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +125 +125 +125 +120 +120 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +65 +64 +58 +59 +54 +55 +55 +50 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +32 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +50 +51 +54 +54 +55 +58 +58 +64 +65 +65 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +120 +126 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +152 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +174 +175 +175 +179 +178 +183 +183 +183 +185 +185 +185 +184 +184 +189 +189 +190 +190 +190 +194 +194 +197 +196 +196 +199 +198 +200 +200 +201 +201 +200 +203 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +207 +206 +206 +206 +207 +207 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +203 +201 +200 +201 +200 +200 +200 +201 +199 +198 +198 +196 +197 +194 +194 +193 +191 +190 +188 +189 +184 +185 +184 +183 +182 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +168 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +125 +126 +120 +119 +120 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +73 +68 +68 +64 +64 +59 +58 +58 +54 +55 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +55 +58 +58 +59 +58 +59 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +119 +120 +125 +125 +130 +130 +130 +134 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +161 +161 +161 +161 +164 +165 +169 +169 +169 +174 +173 +175 +175 +175 +178 +179 +182 +182 +185 +185 +185 +188 +189 +190 +190 +190 +194 +195 +196 +197 +196 +198 +198 +200 +201 +200 +200 +201 +202 +202 +203 +204 +204 +205 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +205 +204 +202 +203 +200 +200 +200 +200 +200 +198 +199 +196 +197 +197 +195 +194 +191 +190 +191 +189 +188 +184 +184 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +158 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +120 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +50 +51 +50 +47 +47 +43 +43 +44 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +42 +43 +47 +47 +51 +51 +51 +55 +54 +58 +59 +59 +65 +64 +69 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +126 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +183 +183 +182 +184 +184 +188 +188 +188 +191 +190 +194 +194 +195 +196 +197 +198 +198 +200 +200 +200 +201 +200 +202 +202 +202 +204 +204 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +205 +205 +204 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +199 +199 +196 +196 +194 +195 +191 +190 +190 +189 +188 +185 +184 +185 +182 +182 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +126 +125 +125 +119 +120 +116 +115 +116 +109 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +55 +54 +52 +51 +51 +47 +46 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +30 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +24 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +51 +51 +55 +54 +55 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +116 +119 +119 +126 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +191 +191 +190 +195 +194 +196 +196 +197 +198 +199 +198 +199 +198 +201 +201 +201 +200 +201 +202 +202 +205 +205 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +207 +204 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +200 +198 +198 +196 +197 +196 +194 +194 +191 +190 +190 +189 +189 +184 +184 +184 +182 +183 +179 +178 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +126 +125 +126 +120 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +73 +73 +68 +68 +64 +64 +64 +58 +58 +54 +54 +54 +50 +51 +47 +47 +47 +43 +43 +40 +41 +39 +37 +36 +33 +32 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +18 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +55 +58 +58 +65 +64 +65 +68 +68 +72 +72 +72 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +105 +106 +110 +110 +116 +116 +115 +119 +119 +125 +126 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +152 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +182 +183 +183 +185 +185 +188 +188 +188 +191 +190 +191 +190 +191 +194 +194 +197 +197 +196 +198 +198 +200 +200 +201 +201 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +199 +198 +196 +197 +195 +195 +194 +190 +191 +189 +188 +189 +184 +185 +183 +182 +179 +179 +179 +175 +174 +173 +173 +172 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +126 +126 +119 +119 +116 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +51 +51 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +30 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +55 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +87 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +105 +106 +110 +109 +116 +116 +120 +119 +119 +126 +126 +129 +130 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +178 +179 +178 +183 +182 +184 +184 +184 +189 +189 +190 +190 +192 +194 +195 +196 +197 +198 +198 +198 +200 +200 +200 +200 +200 +202 +203 +205 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +199 +196 +196 +194 +194 +190 +190 +191 +188 +189 +184 +184 +185 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +129 +130 +125 +125 +126 +119 +120 +115 +115 +116 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +69 +66 +64 +64 +58 +58 +55 +54 +54 +50 +50 +47 +47 +47 +43 +43 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +16 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +56 +55 +55 +58 +59 +65 +65 +65 +68 +68 +72 +72 +73 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +107 +106 +106 +110 +110 +116 +116 +115 +120 +120 +125 +125 +126 +130 +129 +134 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +169 +169 +169 +172 +173 +175 +175 +175 +179 +179 +183 +182 +184 +184 +185 +189 +189 +190 +191 +191 +194 +195 +197 +197 +197 +198 +198 +200 +200 +200 +201 +200 +202 +203 +203 +204 +205 +205 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +202 +200 +201 +200 +200 +199 +198 +198 +197 +197 +195 +194 +195 +190 +191 +189 +188 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +130 +125 +125 +119 +119 +120 +115 +116 +109 +109 +110 +106 +106 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +58 +59 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +15 +16 +15 +17 +17 +19 +19 +19 +21 +22 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +42 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +58 +58 +64 +64 +64 +69 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +120 +126 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +158 +157 +161 +161 +161 +164 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +184 +184 +185 +188 +189 +191 +191 +190 +194 +195 +197 +196 +197 +198 +199 +200 +200 +200 +200 +201 +202 +203 +204 +205 +204 +204 +204 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +198 +198 +199 +196 +196 +195 +195 +194 +191 +191 +188 +189 +189 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +134 +129 +129 +126 +125 +126 +120 +119 +119 +119 +120 +115 +116 +109 +110 +109 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +51 +50 +50 +47 +47 +43 +43 +42 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +14 +12 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +59 +59 +65 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +111 +115 +116 +119 +119 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +184 +185 +188 +188 +189 +190 +191 +194 +194 +196 +196 +197 +198 +198 +199 +201 +200 +201 +200 +202 +202 +202 +205 +205 +204 +204 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +203 +200 +201 +201 +200 +200 +198 +198 +196 +196 +196 +194 +195 +190 +191 +188 +189 +188 +185 +185 +182 +183 +183 +179 +178 +175 +174 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +152 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +134 +130 +130 +125 +125 +126 +119 +119 +115 +115 +116 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +55 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +58 +58 +59 +64 +65 +68 +69 +68 +72 +72 +72 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +120 +119 +120 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +184 +185 +185 +188 +188 +190 +190 +190 +194 +195 +197 +196 +197 +199 +199 +201 +200 +200 +200 +200 +202 +203 +204 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +199 +198 +198 +197 +197 +194 +195 +194 +190 +191 +188 +188 +188 +185 +185 +183 +182 +182 +179 +179 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +150 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +130 +129 +125 +125 +119 +120 +115 +116 +115 +109 +110 +106 +106 +106 +100 +100 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +69 +68 +64 +65 +58 +58 +58 +54 +54 +50 +51 +51 +46 +46 +42 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +30 +27 +27 +27 +25 +25 +21 +21 +21 +20 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +55 +55 +59 +58 +59 +59 +59 +64 +64 +68 +69 +68 +72 +72 +76 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +105 +110 +110 +116 +116 +116 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +174 +175 +179 +178 +182 +183 +182 +185 +184 +189 +189 +189 +190 +190 +194 +194 +195 +196 +197 +198 +198 +198 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +203 +202 +202 +200 +201 +200 +200 +200 +198 +199 +196 +197 +197 +195 +194 +190 +190 +190 +188 +189 +185 +185 +185 +183 +183 +178 +179 +175 +174 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +144 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +119 +120 +115 +116 +116 +116 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +87 +83 +82 +82 +76 +77 +72 +72 +73 +68 +68 +64 +65 +65 +58 +59 +54 +55 +55 +51 +51 +47 +47 +45 +43 +43 +41 +41 +37 +37 +37 +33 +32 +33 +33 +33 +31 +31 +26 +27 +28 +25 +25 +21 +21 +22 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +47 +50 +51 +54 +54 +55 +59 +58 +64 +64 +66 +68 +68 +72 +72 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +99 +100 +106 +106 +110 +110 +115 +116 +115 +120 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +182 +185 +185 +185 +189 +189 +191 +191 +190 +195 +195 +197 +196 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +207 +207 +207 +205 +205 +204 +205 +205 +202 +202 +203 +203 +202 +200 +200 +200 +200 +201 +199 +199 +196 +196 +197 +195 +195 +191 +190 +188 +188 +189 +184 +185 +183 +183 +183 +179 +179 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +130 +129 +131 +125 +125 +119 +119 +115 +115 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +65 +64 +64 +58 +58 +54 +55 +55 +51 +50 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +50 +55 +55 +55 +59 +59 +65 +64 +64 +69 +68 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +88 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +116 +116 +119 +120 +125 +126 +126 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +189 +189 +190 +190 +195 +195 +195 +197 +197 +199 +198 +198 +200 +201 +200 +200 +200 +202 +203 +205 +205 +205 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +194 +190 +191 +191 +189 +188 +185 +185 +184 +183 +182 +178 +178 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +140 +134 +133 +134 +130 +130 +126 +125 +126 +120 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +20 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +32 +32 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +51 +50 +51 +51 +55 +55 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +85 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +124 +125 +125 +130 +129 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +178 +183 +182 +185 +185 +185 +188 +189 +190 +191 +191 +194 +195 +196 +197 +197 +198 +198 +200 +201 +201 +200 +200 +202 +202 +204 +204 +204 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +207 +206 +204 +204 +204 +204 +205 +203 +202 +202 +200 +200 +200 +201 +200 +200 +200 +198 +198 +199 +196 +196 +194 +194 +193 +190 +190 +188 +189 +184 +184 +184 +183 +183 +179 +179 +179 +175 +175 +175 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +144 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +126 +126 +120 +120 +115 +115 +111 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +59 +59 +58 +55 +55 +51 +51 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +12 +15 +15 +17 +17 +17 +20 +19 +21 +21 +21 +25 +26 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +54 +55 +58 +59 +64 +65 +65 +69 +68 +72 +72 +72 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +109 +110 +115 +115 +115 +119 +119 +125 +126 +126 +129 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +156 +157 +161 +161 +165 +165 +165 +169 +168 +173 +172 +173 +175 +175 +179 +179 +183 +182 +183 +184 +185 +189 +188 +188 +191 +191 +195 +194 +195 +196 +196 +199 +198 +198 +200 +201 +200 +201 +201 +202 +203 +204 +204 +205 +204 +205 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +205 +206 +204 +204 +205 +204 +205 +203 +203 +200 +201 +200 +200 +200 +198 +198 +199 +197 +196 +197 +197 +196 +195 +194 +190 +191 +191 +188 +188 +184 +185 +183 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +143 +140 +140 +139 +133 +133 +130 +130 +129 +126 +125 +120 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +65 +59 +58 +58 +55 +54 +50 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +55 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +120 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +183 +182 +183 +185 +184 +188 +188 +189 +190 +191 +194 +194 +195 +197 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +203 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +194 +195 +190 +190 +188 +188 +189 +184 +185 +183 +183 +182 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +115 +116 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +59 +58 +58 +54 +55 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +51 +51 +55 +54 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +115 +115 +119 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +174 +179 +179 +182 +182 +183 +184 +185 +189 +189 +190 +190 +190 +194 +195 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +203 +203 +202 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +201 +200 +201 +198 +199 +197 +197 +196 +194 +194 +190 +190 +190 +188 +189 +184 +184 +184 +182 +182 +178 +179 +179 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +119 +119 +119 +115 +116 +109 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +89 +86 +86 +82 +82 +83 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +59 +59 +54 +55 +51 +51 +51 +47 +47 +42 +43 +43 +43 +42 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +18 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +58 +58 +59 +64 +64 +68 +69 +68 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +120 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +174 +179 +178 +179 +182 +183 +184 +184 +184 +189 +188 +189 +188 +188 +190 +191 +194 +194 +195 +196 +196 +198 +198 +199 +201 +201 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +195 +195 +190 +191 +188 +188 +184 +184 +184 +183 +183 +179 +179 +179 +174 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +119 +119 +116 +116 +116 +110 +109 +105 +105 +106 +100 +100 +96 +96 +90 +90 +90 +87 +86 +82 +82 +82 +76 +77 +72 +72 +72 +69 +68 +64 +65 +65 +59 +59 +54 +54 +55 +50 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +51 +50 +54 +54 +59 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +116 +115 +115 +120 +120 +125 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +160 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +174 +175 +178 +179 +183 +183 +183 +184 +185 +189 +188 +189 +190 +191 +194 +194 +196 +197 +196 +198 +198 +200 +200 +200 +200 +201 +200 +200 +200 +202 +202 +204 +204 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +200 +201 +201 +200 +201 +198 +199 +196 +197 +196 +194 +195 +190 +190 +190 +188 +188 +184 +185 +185 +182 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +126 +126 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +75 +69 +68 +64 +65 +58 +58 +58 +55 +55 +51 +51 +51 +47 +47 +47 +48 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +31 +31 +31 +32 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +115 +116 +120 +120 +119 +126 +126 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +183 +182 +184 +185 +188 +188 +188 +191 +190 +191 +190 +190 +195 +194 +196 +196 +197 +198 +199 +200 +200 +200 +201 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +201 +200 +200 +200 +198 +199 +198 +196 +196 +195 +194 +195 +190 +190 +188 +188 +188 +185 +184 +183 +183 +179 +179 +179 +175 +175 +172 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +58 +58 +58 +54 +51 +51 +50 +51 +47 +47 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +14 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +55 +54 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +95 +99 +100 +106 +106 +106 +110 +110 +115 +115 +120 +119 +120 +126 +125 +125 +125 +126 +129 +129 +129 +129 +129 +134 +133 +140 +139 +139 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +184 +185 +185 +188 +189 +191 +190 +191 +194 +194 +196 +196 +196 +198 +198 +201 +200 +201 +200 +201 +202 +202 +203 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +203 +201 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +195 +190 +191 +189 +188 +188 +184 +185 +183 +182 +183 +178 +179 +175 +174 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +65 +59 +59 +54 +54 +54 +50 +50 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +36 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +40 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +55 +59 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +99 +106 +106 +106 +106 +106 +110 +109 +115 +115 +115 +119 +119 +125 +125 +128 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +171 +173 +173 +175 +174 +179 +179 +178 +183 +183 +184 +184 +185 +188 +189 +191 +190 +190 +194 +195 +196 +196 +196 +199 +199 +200 +200 +200 +200 +200 +202 +203 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +198 +198 +196 +196 +194 +195 +195 +191 +190 +188 +188 +188 +185 +185 +183 +182 +179 +178 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +133 +130 +129 +126 +125 +125 +119 +120 +120 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +99 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +54 +55 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +50 +51 +50 +54 +54 +59 +59 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +91 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +116 +119 +120 +120 +125 +125 +129 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +178 +182 +183 +184 +184 +185 +188 +188 +190 +191 +195 +195 +194 +196 +196 +199 +198 +198 +200 +201 +200 +200 +200 +202 +203 +204 +204 +204 +204 +205 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +201 +198 +198 +199 +197 +197 +194 +194 +191 +190 +190 +188 +189 +185 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +139 +140 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +118 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +59 +59 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +55 +55 +54 +58 +59 +64 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +116 +116 +115 +115 +116 +119 +120 +125 +126 +126 +129 +129 +133 +133 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +182 +182 +185 +184 +188 +188 +188 +190 +190 +194 +194 +194 +197 +196 +199 +198 +199 +200 +200 +200 +200 +200 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +194 +194 +190 +191 +190 +189 +188 +184 +185 +184 +183 +183 +179 +178 +179 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +137 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +50 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +40 +43 +43 +47 +47 +47 +51 +51 +54 +55 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +81 +82 +86 +86 +86 +91 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +125 +125 +125 +130 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +178 +179 +183 +182 +185 +185 +184 +188 +188 +191 +190 +190 +195 +194 +197 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +204 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +205 +204 +205 +203 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +195 +194 +194 +190 +191 +188 +188 +189 +185 +185 +183 +183 +179 +178 +178 +175 +175 +172 +173 +173 +169 +169 +169 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +129 +125 +125 +125 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +107 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +52 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +16 +15 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +42 +46 +47 +50 +51 +52 +55 +55 +59 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +178 +179 +183 +183 +183 +184 +184 +188 +189 +191 +190 +190 +194 +194 +196 +196 +196 +198 +199 +201 +201 +200 +200 +201 +203 +203 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +201 +198 +199 +197 +196 +195 +194 +195 +190 +190 +189 +188 +188 +185 +184 +185 +185 +182 +183 +179 +179 +178 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +129 +126 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +65 +59 +58 +55 +55 +55 +51 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +15 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +39 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +55 +54 +59 +58 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +185 +184 +189 +188 +191 +190 +190 +194 +194 +196 +196 +196 +198 +199 +200 +201 +201 +200 +201 +202 +202 +205 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +200 +200 +201 +199 +198 +199 +196 +197 +195 +195 +194 +191 +191 +189 +188 +188 +184 +184 +183 +182 +181 +178 +179 +175 +175 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +133 +133 +129 +130 +129 +125 +125 +120 +120 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +90 +89 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +58 +54 +55 +54 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +58 +58 +62 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +89 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +119 +120 +125 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +156 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +174 +175 +178 +178 +179 +182 +182 +184 +184 +184 +188 +189 +190 +191 +191 +195 +195 +197 +196 +199 +199 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +197 +195 +195 +190 +190 +189 +189 +189 +184 +184 +182 +183 +183 +179 +178 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +164 +164 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +125 +119 +119 +116 +115 +110 +109 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +65 +65 +58 +59 +58 +55 +55 +51 +50 +50 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +46 +49 +50 +50 +55 +54 +59 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +109 +110 +110 +115 +116 +120 +119 +119 +126 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +183 +183 +184 +184 +188 +188 +189 +189 +188 +190 +190 +194 +194 +194 +197 +197 +199 +198 +198 +200 +201 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +194 +194 +190 +191 +190 +191 +190 +188 +188 +185 +184 +185 +182 +183 +178 +178 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +120 +120 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +73 +72 +68 +68 +68 +64 +64 +57 +58 +58 +55 +54 +51 +50 +51 +46 +47 +42 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +18 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +55 +55 +59 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +176 +174 +175 +179 +178 +182 +183 +183 +184 +184 +188 +188 +188 +190 +190 +195 +195 +195 +196 +196 +198 +198 +198 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +199 +198 +198 +198 +198 +196 +196 +194 +194 +195 +190 +191 +188 +189 +185 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +140 +139 +133 +133 +133 +129 +129 +126 +125 +125 +120 +119 +115 +116 +117 +109 +110 +105 +106 +105 +100 +100 +96 +95 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +55 +51 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +15 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +116 +116 +116 +119 +120 +125 +126 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +160 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +182 +185 +185 +185 +188 +189 +190 +190 +191 +195 +194 +196 +196 +199 +198 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +207 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +203 +202 +203 +203 +202 +201 +200 +201 +201 +201 +198 +198 +196 +196 +197 +194 +194 +190 +190 +189 +189 +189 +185 +185 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +130 +130 +129 +125 +126 +120 +119 +120 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +76 +72 +72 +69 +68 +69 +65 +64 +58 +59 +55 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +46 +51 +50 +55 +54 +54 +58 +59 +65 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +119 +125 +125 +125 +130 +129 +134 +134 +133 +139 +139 +143 +143 +144 +147 +147 +152 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +183 +183 +184 +185 +185 +189 +188 +190 +190 +194 +195 +194 +197 +197 +198 +198 +198 +200 +200 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +201 +200 +200 +200 +200 +198 +199 +196 +197 +196 +194 +195 +191 +191 +191 +189 +188 +185 +184 +185 +183 +183 +179 +178 +179 +175 +174 +172 +173 +168 +169 +168 +165 +164 +161 +161 +162 +157 +157 +157 +157 +158 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +125 +125 +126 +120 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +55 +54 +54 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +51 +50 +54 +55 +58 +58 +58 +65 +64 +68 +68 +69 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +116 +119 +120 +120 +125 +125 +130 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +156 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +184 +185 +188 +188 +191 +190 +190 +194 +194 +197 +197 +196 +198 +198 +200 +201 +200 +200 +201 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +204 +204 +204 +205 +205 +202 +203 +202 +200 +200 +201 +200 +200 +198 +199 +196 +197 +195 +194 +190 +190 +191 +188 +189 +185 +185 +182 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +55 +50 +51 +46 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +26 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +87 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +120 +120 +120 +125 +126 +129 +129 +130 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +183 +183 +184 +184 +188 +189 +189 +191 +190 +194 +195 +195 +196 +196 +198 +198 +200 +200 +200 +201 +201 +202 +202 +202 +204 +205 +205 +204 +204 +205 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +201 +199 +198 +199 +196 +197 +194 +194 +191 +191 +191 +188 +189 +184 +185 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +130 +130 +126 +126 +125 +120 +119 +116 +116 +115 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +65 +65 +59 +58 +55 +54 +50 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +26 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +30 +31 +33 +33 +32 +37 +37 +41 +41 +41 +43 +42 +47 +47 +47 +51 +51 +54 +54 +58 +58 +58 +65 +64 +69 +68 +69 +73 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +109 +109 +116 +115 +119 +120 +119 +125 +125 +129 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +178 +179 +179 +182 +182 +184 +185 +186 +189 +189 +190 +190 +194 +194 +194 +197 +197 +198 +198 +198 +200 +200 +200 +201 +200 +200 +200 +203 +202 +203 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +205 +204 +204 +204 +204 +202 +202 +203 +201 +201 +200 +200 +198 +198 +199 +196 +196 +194 +194 +195 +190 +190 +188 +188 +188 +184 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +168 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +65 +64 +59 +58 +54 +54 +55 +51 +51 +51 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +38 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +119 +125 +125 +129 +130 +130 +133 +133 +138 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +178 +178 +179 +183 +183 +184 +184 +185 +188 +188 +189 +189 +188 +190 +191 +195 +194 +195 +196 +197 +198 +198 +199 +201 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +201 +201 +198 +199 +196 +196 +196 +195 +195 +190 +190 +190 +189 +189 +185 +184 +183 +182 +183 +178 +178 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +158 +157 +151 +151 +151 +147 +147 +143 +143 +140 +140 +139 +133 +134 +129 +129 +130 +126 +126 +120 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +55 +54 +52 +50 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +32 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +115 +119 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +179 +178 +178 +183 +182 +184 +185 +184 +189 +189 +191 +190 +191 +195 +195 +196 +197 +199 +199 +198 +200 +200 +200 +201 +201 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +204 +204 +203 +203 +202 +200 +200 +200 +200 +200 +199 +199 +196 +196 +195 +195 +194 +190 +191 +189 +189 +188 +185 +185 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +140 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +116 +109 +110 +110 +106 +106 +99 +100 +100 +96 +96 +96 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +65 +64 +59 +58 +55 +55 +55 +50 +50 +50 +50 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +16 +15 +16 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +54 +58 +58 +64 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +105 +106 +110 +109 +110 +110 +110 +116 +115 +119 +120 +119 +126 +125 +129 +129 +131 +134 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +174 +175 +175 +178 +179 +183 +182 +183 +185 +184 +189 +189 +189 +190 +190 +195 +195 +194 +197 +197 +198 +198 +199 +201 +200 +201 +201 +202 +202 +203 +204 +204 +204 +204 +204 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +205 +204 +204 +205 +203 +202 +202 +200 +200 +200 +200 +200 +199 +198 +196 +196 +196 +195 +194 +191 +190 +191 +188 +188 +184 +185 +184 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +120 +120 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +73 +72 +69 +68 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +51 +47 +47 +46 +43 +42 +41 +41 +41 +37 +37 +33 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +54 +58 +58 +64 +64 +65 +68 +69 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +112 +115 +116 +120 +119 +125 +125 +125 +129 +129 +133 +134 +134 +139 +139 +139 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +174 +175 +178 +179 +183 +183 +182 +185 +184 +188 +188 +189 +190 +191 +195 +195 +196 +197 +196 +198 +199 +200 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +204 +203 +202 +202 +200 +200 +201 +200 +200 +199 +198 +197 +197 +196 +195 +194 +190 +190 +188 +189 +189 +185 +185 +183 +182 +183 +179 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +146 +147 +144 +143 +139 +140 +139 +133 +133 +130 +129 +130 +126 +125 +120 +120 +119 +115 +115 +109 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +65 +64 +59 +59 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +34 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +51 +54 +54 +58 +58 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +110 +109 +116 +115 +119 +120 +120 +125 +125 +125 +125 +126 +129 +129 +133 +133 +133 +140 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +184 +188 +188 +189 +190 +190 +194 +194 +195 +197 +196 +199 +199 +199 +200 +200 +200 +200 +200 +202 +203 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +201 +201 +200 +200 +198 +198 +197 +196 +196 +195 +195 +190 +191 +190 +189 +189 +185 +184 +184 +182 +183 +179 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +127 +125 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +55 +51 +51 +51 +46 +47 +42 +43 +43 +41 +41 +37 +36 +36 +34 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +50 +54 +55 +55 +54 +54 +59 +58 +64 +65 +64 +68 +68 +72 +72 +73 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +144 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +178 +183 +183 +184 +184 +184 +188 +188 +191 +190 +190 +195 +194 +196 +196 +197 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +200 +199 +198 +196 +196 +196 +195 +194 +190 +191 +191 +188 +188 +184 +184 +183 +182 +182 +178 +179 +175 +175 +174 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +150 +150 +147 +147 +144 +144 +139 +139 +139 +133 +133 +129 +130 +129 +126 +125 +125 +125 +124 +120 +119 +116 +115 +116 +110 +110 +106 +106 +102 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +55 +51 +50 +50 +46 +46 +43 +43 +43 +40 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +16 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +55 +54 +56 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +87 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +115 +115 +115 +119 +120 +125 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +172 +175 +174 +178 +179 +179 +182 +182 +185 +185 +184 +189 +188 +190 +190 +194 +194 +194 +197 +196 +199 +198 +198 +200 +200 +200 +200 +201 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +203 +202 +202 +200 +201 +200 +201 +201 +198 +199 +197 +196 +194 +194 +194 +190 +190 +189 +188 +188 +185 +184 +185 +185 +184 +183 +183 +178 +178 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +127 +125 +126 +120 +119 +116 +115 +116 +109 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +73 +72 +72 +68 +68 +65 +64 +64 +58 +58 +59 +59 +58 +55 +54 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +18 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +42 +41 +40 +43 +43 +47 +46 +47 +50 +51 +51 +51 +51 +54 +55 +58 +59 +58 +64 +64 +68 +69 +67 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +119 +125 +125 +125 +129 +129 +130 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +156 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +182 +184 +184 +188 +188 +188 +190 +191 +194 +195 +195 +197 +196 +198 +199 +201 +200 +201 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +200 +200 +198 +199 +198 +197 +196 +194 +194 +193 +190 +190 +188 +189 +185 +184 +185 +182 +183 +179 +178 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +119 +120 +120 +115 +115 +109 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +59 +55 +54 +54 +51 +50 +47 +46 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +16 +15 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +49 +50 +50 +55 +54 +58 +58 +58 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +99 +100 +106 +106 +110 +109 +110 +116 +115 +120 +120 +119 +125 +125 +129 +129 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +188 +189 +191 +190 +190 +194 +195 +196 +196 +196 +198 +198 +198 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +205 +205 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +200 +201 +200 +200 +198 +199 +199 +196 +196 +195 +194 +194 +190 +191 +190 +191 +190 +188 +188 +185 +184 +184 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +160 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +116 +116 +110 +110 +110 +106 +106 +100 +99 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +77 +76 +77 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +40 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +26 +25 +21 +21 +21 +18 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +16 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +32 +31 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +54 +59 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +95 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +115 +119 +119 +126 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +144 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +174 +175 +179 +178 +182 +183 +183 +185 +185 +189 +188 +189 +190 +191 +194 +195 +195 +196 +196 +198 +198 +199 +200 +200 +200 +201 +203 +202 +202 +205 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +200 +200 +200 +198 +198 +197 +197 +197 +195 +195 +191 +190 +189 +188 +189 +185 +184 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +115 +116 +110 +110 +109 +106 +106 +100 +100 +96 +96 +96 +91 +90 +85 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +51 +51 +48 +46 +47 +42 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +26 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +46 +50 +50 +54 +54 +54 +59 +58 +64 +64 +64 +68 +68 +69 +69 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +91 +90 +96 +96 +99 +100 +100 +106 +106 +109 +110 +110 +115 +116 +116 +116 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +160 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +178 +179 +183 +183 +185 +185 +185 +189 +188 +191 +191 +190 +195 +194 +196 +196 +197 +198 +198 +200 +200 +201 +200 +200 +203 +202 +203 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +207 +204 +204 +204 +205 +204 +202 +202 +201 +200 +200 +201 +200 +198 +198 +197 +196 +197 +194 +194 +190 +190 +191 +189 +188 +185 +185 +185 +183 +182 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +126 +119 +119 +120 +116 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +59 +58 +55 +55 +51 +50 +50 +47 +47 +43 +43 +44 +41 +41 +37 +37 +33 +33 +33 +30 +31 +27 +27 +27 +24 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +16 +15 +15 +16 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +55 +58 +59 +64 +65 +64 +68 +68 +72 +73 +77 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +116 +120 +120 +125 +125 +130 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +185 +185 +185 +189 +189 +190 +191 +190 +195 +194 +197 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +201 +201 +201 +199 +199 +196 +197 +197 +195 +194 +191 +191 +189 +189 +189 +185 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +134 +133 +129 +129 +126 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +83 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +54 +54 +50 +51 +51 +46 +46 +47 +47 +47 +43 +43 +42 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +51 +50 +51 +55 +54 +59 +58 +59 +64 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +116 +119 +119 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +146 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +184 +185 +189 +189 +190 +191 +191 +194 +195 +196 +196 +196 +198 +199 +198 +198 +198 +201 +200 +200 +201 +201 +202 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +203 +202 +200 +200 +200 +200 +201 +199 +198 +196 +196 +197 +194 +195 +191 +190 +190 +188 +189 +184 +184 +185 +183 +182 +178 +178 +178 +175 +175 +173 +173 +169 +169 +169 +165 +165 +160 +161 +161 +157 +157 +150 +151 +151 +147 +147 +144 +143 +143 +139 +139 +134 +133 +134 +129 +130 +126 +125 +120 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +83 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +59 +59 +59 +55 +54 +51 +51 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +20 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +50 +55 +54 +58 +58 +58 +65 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +105 +106 +106 +110 +110 +115 +116 +115 +120 +119 +126 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +152 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +184 +184 +189 +188 +189 +189 +188 +190 +191 +195 +194 +195 +196 +197 +198 +198 +198 +200 +201 +201 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +198 +198 +197 +197 +196 +195 +195 +190 +191 +190 +188 +188 +185 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +130 +130 +130 +125 +126 +120 +119 +119 +116 +116 +109 +110 +110 +106 +105 +100 +100 +101 +96 +96 +90 +90 +85 +86 +86 +83 +82 +76 +77 +76 +72 +72 +72 +72 +72 +68 +69 +65 +65 +64 +58 +58 +55 +54 +55 +51 +51 +46 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +59 +59 +65 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +116 +115 +115 +119 +120 +125 +125 +125 +129 +130 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +174 +175 +175 +179 +179 +183 +182 +183 +184 +185 +189 +189 +190 +191 +191 +194 +195 +196 +196 +196 +199 +198 +200 +201 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +203 +200 +200 +201 +201 +200 +198 +199 +196 +196 +195 +195 +194 +190 +190 +188 +189 +188 +185 +184 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +170 +165 +165 +161 +161 +158 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +126 +120 +119 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +73 +72 +68 +68 +64 +64 +64 +59 +58 +55 +55 +55 +50 +50 +51 +50 +50 +48 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +40 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +59 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +77 +82 +83 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +115 +120 +120 +125 +126 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +183 +182 +185 +185 +189 +189 +188 +190 +190 +194 +194 +194 +196 +196 +198 +199 +199 +201 +201 +201 +200 +202 +202 +203 +205 +204 +204 +205 +204 +206 +206 +207 +206 +207 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +204 +203 +202 +202 +200 +201 +201 +200 +200 +198 +198 +197 +196 +197 +194 +195 +190 +190 +190 +189 +189 +184 +185 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +150 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +120 +115 +116 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +81 +82 +82 +76 +76 +72 +72 +73 +69 +68 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +51 +51 +48 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +26 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +16 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +59 +59 +65 +65 +65 +68 +68 +72 +73 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +116 +116 +119 +119 +125 +125 +130 +130 +129 +133 +134 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +150 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +184 +188 +188 +190 +191 +191 +195 +194 +196 +196 +195 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +207 +206 +206 +205 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +195 +195 +191 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +178 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +129 +126 +126 +126 +120 +120 +116 +116 +113 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +64 +65 +58 +58 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +24 +21 +22 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +46 +47 +50 +50 +55 +55 +58 +58 +58 +64 +68 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +105 +110 +109 +110 +115 +116 +119 +120 +120 +125 +125 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +187 +188 +188 +190 +190 +194 +195 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +204 +202 +202 +200 +200 +201 +201 +200 +198 +198 +197 +197 +196 +195 +194 +190 +190 +191 +188 +188 +185 +185 +184 +183 +183 +178 +178 +179 +175 +175 +173 +173 +174 +169 +169 +165 +165 +161 +161 +161 +156 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +130 +125 +125 +119 +120 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +100 +99 +100 +96 +96 +90 +90 +90 +85 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +50 +51 +51 +47 +47 +42 +42 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +55 +55 +58 +59 +64 +64 +65 +68 +69 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +109 +110 +110 +116 +116 +119 +119 +120 +125 +125 +129 +129 +131 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +174 +175 +178 +179 +178 +183 +183 +185 +184 +185 +189 +189 +191 +190 +190 +194 +194 +196 +196 +196 +198 +198 +200 +200 +201 +201 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +205 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +201 +200 +200 +198 +198 +198 +196 +197 +194 +194 +195 +190 +190 +188 +189 +188 +184 +185 +183 +183 +183 +179 +179 +175 +175 +172 +172 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +160 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +119 +116 +116 +116 +116 +116 +109 +109 +105 +106 +106 +100 +99 +96 +96 +91 +90 +90 +86 +86 +82 +82 +81 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +54 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +46 +47 +46 +51 +50 +55 +54 +55 +58 +58 +64 +64 +66 +69 +68 +72 +72 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +115 +116 +116 +120 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +188 +188 +189 +191 +191 +194 +194 +196 +196 +197 +198 +199 +200 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +200 +200 +199 +198 +200 +196 +196 +194 +195 +190 +190 +190 +189 +189 +184 +185 +185 +183 +182 +183 +183 +183 +178 +178 +175 +174 +175 +173 +173 +169 +168 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +144 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +123 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +71 +68 +69 +64 +64 +59 +58 +58 +55 +55 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +42 +46 +46 +51 +51 +50 +54 +54 +59 +58 +58 +65 +65 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +126 +130 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +183 +183 +182 +185 +185 +184 +184 +185 +189 +188 +191 +190 +191 +194 +195 +197 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +202 +203 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +197 +197 +197 +194 +194 +191 +190 +190 +188 +188 +185 +184 +184 +183 +183 +179 +178 +174 +174 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +145 +143 +144 +139 +139 +133 +133 +133 +129 +130 +126 +125 +125 +120 +119 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +87 +86 +82 +82 +82 +76 +76 +72 +72 +73 +69 +68 +64 +65 +65 +58 +58 +55 +54 +54 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +36 +33 +33 +31 +31 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +12 +15 +16 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +43 +43 +43 +46 +47 +50 +50 +51 +55 +55 +58 +59 +64 +64 +64 +68 +69 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +115 +116 +116 +119 +119 +125 +125 +125 +129 +129 +134 +134 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +178 +183 +183 +185 +185 +184 +188 +188 +190 +191 +191 +194 +194 +196 +196 +199 +198 +198 +201 +200 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +207 +206 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +202 +202 +200 +201 +200 +201 +200 +199 +198 +197 +197 +198 +195 +194 +190 +191 +188 +189 +189 +185 +185 +182 +183 +183 +179 +179 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +126 +126 +119 +119 +116 +115 +111 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +58 +58 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +32 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +42 +47 +46 +51 +51 +55 +54 +55 +58 +58 +64 +64 +64 +68 +69 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +91 +95 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +115 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +133 +139 +140 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +189 +188 +188 +190 +190 +195 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +203 +203 +204 +205 +205 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +204 +205 +204 +205 +204 +202 +202 +200 +200 +200 +200 +200 +199 +198 +196 +197 +196 +194 +194 +191 +191 +191 +189 +188 +189 +188 +188 +184 +184 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +127 +126 +125 +119 +120 +115 +115 +115 +109 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +12 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +42 +46 +47 +47 +51 +50 +55 +55 +55 +59 +58 +64 +64 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +105 +110 +110 +115 +115 +116 +120 +119 +125 +125 +126 +129 +129 +133 +133 +136 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +183 +182 +183 +184 +185 +188 +189 +188 +190 +191 +195 +195 +194 +196 +196 +198 +198 +199 +200 +201 +200 +200 +201 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +198 +198 +197 +196 +197 +196 +196 +195 +194 +190 +190 +190 +189 +189 +184 +184 +183 +182 +183 +179 +179 +174 +175 +175 +172 +173 +168 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +119 +119 +119 +116 +116 +110 +110 +110 +106 +105 +100 +100 +100 +96 +95 +90 +90 +87 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +59 +55 +54 +51 +51 +51 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +55 +59 +58 +65 +64 +68 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +101 +100 +106 +106 +106 +109 +110 +116 +116 +120 +120 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +188 +188 +188 +190 +191 +195 +194 +194 +196 +196 +198 +198 +201 +201 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +204 +204 +206 +207 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +196 +195 +194 +195 +190 +191 +190 +191 +190 +189 +189 +185 +185 +184 +182 +182 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +119 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +59 +59 +55 +54 +55 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +36 +36 +41 +40 +42 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +110 +109 +115 +116 +120 +120 +120 +126 +126 +130 +129 +129 +134 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +184 +184 +185 +189 +188 +190 +191 +190 +194 +194 +194 +195 +194 +196 +196 +198 +198 +199 +200 +200 +200 +200 +201 +202 +203 +204 +205 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +196 +196 +194 +194 +194 +191 +191 +188 +188 +189 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +126 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +83 +82 +82 +76 +76 +76 +76 +77 +72 +73 +68 +68 +69 +64 +64 +58 +59 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +40 +40 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +55 +55 +58 +58 +58 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +126 +125 +126 +129 +129 +133 +134 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +182 +182 +182 +182 +183 +185 +185 +189 +188 +188 +190 +191 +194 +195 +195 +196 +197 +198 +199 +200 +200 +201 +200 +201 +202 +203 +202 +205 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +201 +200 +199 +198 +199 +197 +197 +194 +194 +191 +191 +191 +189 +188 +184 +185 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +140 +134 +133 +133 +129 +130 +126 +126 +125 +119 +119 +115 +115 +116 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +81 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +55 +54 +54 +51 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +12 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +51 +51 +51 +55 +55 +59 +58 +58 +64 +64 +64 +64 +65 +69 +69 +72 +72 +72 +76 +76 +82 +83 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +126 +125 +125 +129 +130 +134 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +176 +178 +179 +182 +183 +184 +184 +184 +188 +189 +190 +191 +190 +194 +194 +194 +195 +194 +196 +196 +198 +199 +199 +200 +201 +200 +200 +201 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +205 +204 +204 +203 +202 +202 +200 +200 +200 +200 +200 +199 +198 +199 +199 +199 +196 +196 +195 +195 +195 +190 +191 +188 +188 +188 +185 +184 +182 +183 +179 +178 +179 +175 +174 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +134 +133 +129 +129 +129 +125 +125 +120 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +73 +72 +72 +68 +68 +65 +65 +65 +59 +58 +54 +54 +53 +51 +51 +47 +47 +42 +43 +43 +41 +41 +38 +37 +37 +33 +33 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +20 +19 +19 +21 +22 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +55 +59 +59 +65 +64 +69 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +115 +119 +119 +120 +126 +125 +129 +129 +129 +134 +133 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +172 +172 +175 +175 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +188 +188 +190 +190 +191 +194 +194 +196 +196 +197 +198 +198 +201 +200 +200 +200 +201 +203 +202 +202 +204 +205 +204 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +201 +200 +198 +198 +196 +196 +195 +194 +194 +190 +191 +188 +188 +188 +184 +185 +183 +183 +182 +178 +179 +175 +174 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +130 +130 +129 +129 +125 +126 +119 +119 +120 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +74 +69 +68 +65 +65 +58 +59 +59 +54 +55 +50 +51 +51 +47 +46 +47 +47 +47 +43 +43 +41 +40 +41 +36 +37 +33 +33 +34 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +51 +51 +50 +55 +54 +59 +59 +58 +65 +64 +64 +64 +65 +69 +68 +72 +72 +72 +76 +76 +82 +82 +83 +85 +86 +90 +90 +95 +96 +95 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +115 +116 +119 +119 +119 +125 +125 +129 +130 +130 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +182 +182 +184 +185 +188 +189 +188 +190 +190 +195 +194 +194 +196 +197 +199 +198 +198 +200 +201 +200 +200 +202 +202 +203 +204 +204 +204 +205 +204 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +201 +199 +199 +198 +196 +196 +194 +194 +194 +190 +191 +189 +189 +189 +185 +185 +183 +183 +179 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +120 +120 +115 +116 +115 +110 +110 +107 +106 +106 +100 +100 +97 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +69 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +50 +51 +51 +47 +46 +43 +42 +40 +41 +41 +36 +37 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +46 +51 +51 +55 +55 +55 +59 +58 +64 +65 +65 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +112 +116 +116 +120 +119 +126 +125 +126 +129 +130 +133 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +185 +189 +189 +190 +190 +194 +194 +195 +196 +197 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +201 +200 +200 +200 +198 +198 +198 +196 +196 +194 +194 +191 +190 +191 +188 +189 +184 +185 +184 +182 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +140 +139 +134 +133 +129 +129 +129 +125 +125 +119 +119 +117 +116 +116 +110 +110 +105 +106 +106 +101 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +69 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +50 +54 +55 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +109 +110 +116 +115 +116 +115 +116 +119 +119 +125 +125 +125 +128 +129 +133 +133 +136 +139 +139 +143 +143 +146 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +183 +183 +185 +185 +189 +188 +188 +191 +190 +195 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +200 +201 +200 +200 +198 +198 +196 +197 +197 +195 +195 +191 +190 +191 +189 +189 +185 +185 +184 +183 +183 +178 +179 +178 +175 +175 +172 +173 +169 +169 +169 +165 +165 +160 +161 +161 +157 +157 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +137 +133 +133 +130 +130 +125 +125 +125 +119 +119 +116 +115 +115 +109 +110 +109 +110 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +59 +59 +54 +55 +51 +51 +51 +47 +46 +43 +43 +41 +41 +42 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +47 +51 +50 +50 +51 +51 +54 +58 +59 +59 +64 +65 +68 +68 +69 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +119 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +160 +164 +165 +168 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +183 +184 +185 +188 +189 +189 +191 +191 +194 +194 +195 +196 +197 +199 +198 +200 +201 +200 +201 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +195 +194 +190 +190 +191 +189 +188 +184 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +160 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +116 +109 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +77 +72 +72 +73 +68 +68 +64 +65 +65 +59 +58 +55 +54 +51 +50 +50 +46 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +42 +47 +47 +51 +51 +51 +54 +54 +58 +59 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +109 +116 +115 +119 +119 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +144 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +174 +175 +179 +179 +183 +183 +183 +184 +185 +189 +189 +188 +191 +191 +194 +194 +196 +197 +196 +198 +198 +200 +200 +200 +200 +200 +203 +202 +202 +204 +205 +204 +204 +204 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +203 +202 +202 +201 +200 +200 +200 +200 +199 +199 +197 +197 +197 +194 +195 +191 +191 +189 +188 +189 +184 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +148 +143 +143 +140 +139 +139 +133 +133 +133 +133 +134 +129 +130 +125 +125 +125 +119 +119 +116 +116 +113 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +58 +58 +59 +54 +55 +51 +51 +51 +47 +47 +47 +46 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +46 +47 +51 +50 +54 +54 +55 +58 +59 +65 +64 +65 +68 +68 +68 +69 +68 +73 +72 +75 +76 +76 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +129 +130 +134 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +182 +184 +184 +184 +189 +189 +190 +191 +190 +195 +195 +197 +197 +196 +198 +198 +200 +200 +201 +201 +200 +202 +202 +203 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +207 +204 +204 +204 +204 +204 +202 +202 +203 +200 +201 +200 +201 +198 +199 +199 +196 +196 +195 +194 +194 +191 +191 +188 +188 +188 +184 +184 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +168 +166 +165 +165 +161 +161 +157 +157 +157 +151 +152 +151 +152 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +131 +129 +129 +125 +125 +119 +120 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +80 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +50 +51 +55 +55 +55 +59 +58 +64 +64 +66 +69 +68 +73 +72 +76 +77 +76 +82 +81 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +119 +120 +119 +125 +126 +129 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +188 +189 +189 +191 +190 +195 +195 +194 +196 +197 +198 +199 +201 +200 +201 +201 +200 +202 +203 +202 +205 +204 +205 +205 +205 +207 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +206 +205 +204 +204 +204 +205 +202 +202 +202 +201 +201 +200 +200 +200 +200 +200 +199 +198 +199 +197 +197 +195 +194 +192 +191 +191 +188 +189 +184 +184 +184 +183 +183 +178 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +160 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +120 +120 +116 +116 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +69 +64 +64 +59 +58 +55 +54 +54 +51 +50 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +26 +27 +25 +24 +21 +21 +19 +19 +19 +17 +17 +15 +16 +15 +15 +15 +15 +15 +15 +14 +13 +12 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +46 +48 +50 +51 +54 +54 +59 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +158 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +188 +189 +191 +191 +191 +194 +195 +196 +197 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +205 +205 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +201 +201 +198 +198 +196 +196 +196 +195 +195 +190 +191 +191 +189 +189 +188 +189 +189 +184 +185 +183 +182 +182 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +116 +109 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +83 +76 +76 +73 +73 +72 +68 +69 +64 +64 +64 +59 +58 +58 +58 +58 +55 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +14 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +51 +54 +55 +54 +58 +59 +64 +64 +65 +68 +69 +72 +72 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +116 +116 +120 +119 +125 +125 +125 +130 +129 +134 +134 +134 +140 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +185 +185 +188 +188 +191 +191 +190 +194 +195 +196 +197 +196 +199 +198 +201 +201 +201 +200 +200 +203 +202 +205 +204 +204 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +203 +202 +200 +200 +200 +200 +200 +200 +200 +199 +199 +199 +196 +197 +195 +194 +191 +191 +190 +188 +188 +185 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +160 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +55 +55 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +51 +53 +54 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +73 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +120 +120 +126 +126 +126 +130 +129 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +185 +188 +189 +191 +191 +194 +194 +194 +196 +196 +199 +198 +198 +201 +201 +201 +200 +200 +200 +200 +203 +202 +202 +204 +205 +204 +204 +205 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +203 +203 +200 +201 +200 +201 +201 +198 +199 +196 +196 +196 +194 +195 +191 +191 +191 +188 +189 +185 +184 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +152 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +130 +130 +125 +126 +120 +120 +120 +116 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +69 +68 +68 +65 +64 +58 +58 +58 +54 +55 +51 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +20 +19 +19 +19 +17 +18 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +58 +58 +59 +64 +65 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +99 +106 +106 +110 +109 +109 +116 +116 +120 +119 +119 +126 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +152 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +182 +184 +184 +184 +185 +184 +188 +189 +190 +191 +190 +195 +195 +197 +197 +198 +199 +198 +201 +200 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +205 +204 +205 +206 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +196 +197 +194 +195 +191 +190 +188 +188 +188 +185 +184 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +170 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +120 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +59 +54 +55 +51 +51 +48 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +15 +15 +17 +18 +17 +19 +19 +22 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +54 +54 +58 +58 +65 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +115 +115 +119 +119 +125 +126 +125 +129 +129 +129 +130 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +173 +173 +173 +174 +174 +178 +179 +179 +183 +183 +184 +184 +186 +189 +189 +190 +191 +194 +194 +195 +196 +196 +197 +197 +196 +198 +199 +198 +199 +198 +200 +200 +200 +200 +201 +203 +203 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +207 +206 +206 +207 +206 +206 +207 +207 +207 +205 +205 +204 +205 +205 +202 +202 +201 +201 +201 +201 +200 +199 +199 +196 +197 +197 +194 +195 +191 +191 +190 +189 +188 +184 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +120 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +58 +54 +54 +55 +55 +54 +50 +50 +46 +46 +46 +42 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +87 +86 +86 +90 +89 +96 +95 +96 +100 +100 +105 +106 +106 +109 +109 +116 +116 +116 +120 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +178 +179 +182 +183 +183 +183 +183 +185 +185 +184 +185 +184 +189 +188 +191 +190 +191 +195 +195 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +200 +199 +199 +198 +196 +196 +194 +194 +195 +191 +190 +189 +188 +185 +185 +185 +183 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +125 +125 +119 +120 +115 +115 +116 +110 +109 +106 +106 +103 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +55 +51 +50 +47 +46 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +24 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +58 +65 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +109 +116 +115 +115 +120 +119 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +189 +188 +191 +191 +191 +195 +195 +196 +196 +196 +199 +198 +200 +201 +200 +201 +200 +202 +202 +202 +204 +204 +204 +205 +205 +207 +207 +206 +206 +207 +207 +206 +207 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +202 +202 +200 +201 +201 +201 +200 +198 +199 +196 +196 +195 +194 +195 +191 +190 +188 +188 +189 +185 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +152 +147 +147 +147 +143 +143 +140 +140 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +120 +116 +116 +110 +110 +107 +106 +105 +100 +100 +96 +96 +95 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +58 +58 +58 +54 +55 +50 +51 +51 +47 +47 +47 +47 +47 +43 +43 +40 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +22 +19 +20 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +51 +51 +54 +54 +59 +59 +59 +64 +65 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +99 +100 +100 +105 +105 +110 +110 +110 +115 +116 +116 +116 +115 +120 +120 +125 +125 +126 +129 +130 +133 +134 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +176 +178 +179 +183 +183 +185 +185 +185 +188 +189 +190 +190 +191 +195 +194 +196 +197 +196 +199 +198 +200 +201 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +199 +197 +196 +196 +196 +197 +195 +194 +191 +190 +190 +189 +188 +185 +184 +184 +182 +183 +178 +178 +175 +175 +175 +173 +172 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +120 +119 +115 +116 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +68 +68 +68 +65 +64 +59 +59 +59 +54 +54 +51 +51 +49 +47 +46 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +37 +36 +41 +41 +40 +43 +43 +47 +47 +47 +51 +50 +55 +55 +54 +59 +58 +64 +65 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +112 +116 +116 +119 +120 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +182 +184 +185 +189 +189 +189 +191 +191 +194 +195 +196 +196 +196 +198 +198 +200 +200 +200 +201 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +204 +204 +205 +204 +204 +203 +203 +200 +200 +200 +200 +200 +198 +199 +198 +196 +196 +194 +194 +191 +191 +190 +188 +188 +185 +185 +184 +182 +183 +178 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +150 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +126 +125 +119 +120 +116 +115 +113 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +65 +64 +64 +58 +58 +55 +55 +54 +51 +51 +47 +47 +46 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +26 +25 +27 +26 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +55 +59 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +109 +115 +116 +120 +120 +120 +125 +125 +125 +125 +125 +130 +130 +133 +133 +134 +139 +139 +143 +143 +146 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +184 +188 +188 +188 +190 +190 +195 +195 +195 +197 +197 +198 +199 +198 +201 +200 +200 +200 +200 +202 +202 +204 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +201 +201 +200 +200 +200 +198 +198 +197 +196 +196 +194 +195 +190 +191 +191 +188 +189 +189 +188 +189 +185 +185 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +134 +131 +129 +129 +126 +125 +119 +120 +120 +116 +116 +109 +110 +110 +106 +105 +106 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +54 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +28 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +54 +55 +59 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +78 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +116 +119 +119 +125 +126 +127 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +182 +183 +184 +185 +189 +188 +188 +190 +190 +195 +194 +195 +197 +196 +198 +199 +199 +201 +201 +200 +200 +203 +202 +202 +205 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +204 +204 +204 +204 +203 +202 +202 +200 +201 +200 +200 +200 +199 +199 +198 +198 +198 +196 +196 +194 +194 +194 +190 +190 +188 +189 +189 +185 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +168 +169 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +133 +133 +134 +130 +129 +125 +125 +125 +119 +119 +119 +119 +120 +115 +116 +109 +110 +110 +105 +106 +99 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +69 +64 +64 +59 +59 +59 +55 +54 +50 +51 +48 +47 +47 +43 +43 +41 +41 +41 +37 +37 +38 +37 +37 +33 +34 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +20 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +59 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +116 +116 +116 +120 +120 +125 +125 +126 +129 +129 +133 +133 +134 +139 +140 +143 +143 +144 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +185 +185 +188 +189 +191 +190 +195 +194 +195 +197 +197 +198 +198 +199 +200 +201 +201 +201 +201 +202 +202 +204 +205 +204 +204 +205 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +204 +205 +204 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +199 +199 +196 +196 +194 +194 +191 +191 +190 +189 +189 +184 +185 +185 +183 +182 +182 +183 +183 +179 +178 +174 +175 +175 +173 +173 +168 +169 +167 +165 +165 +161 +161 +156 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +134 +134 +134 +130 +129 +126 +125 +122 +120 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +58 +59 +55 +55 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +51 +54 +55 +59 +59 +59 +65 +64 +64 +65 +65 +68 +68 +72 +73 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +115 +115 +116 +119 +119 +125 +125 +126 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +174 +179 +178 +183 +183 +183 +184 +184 +188 +188 +188 +190 +191 +194 +194 +195 +197 +197 +198 +198 +198 +200 +201 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +203 +202 +201 +201 +200 +200 +200 +198 +198 +197 +197 +196 +194 +194 +195 +194 +194 +190 +190 +189 +189 +188 +184 +185 +182 +182 +180 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +164 +161 +161 +161 +161 +161 +157 +157 +152 +151 +152 +147 +147 +143 +143 +141 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +85 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +59 +58 +54 +54 +55 +51 +50 +46 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +12 +12 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +20 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +32 +37 +36 +41 +41 +41 +42 +43 +42 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +115 +115 +115 +119 +120 +125 +126 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +182 +182 +185 +185 +184 +189 +189 +190 +190 +191 +194 +195 +196 +196 +199 +198 +198 +200 +200 +200 +201 +200 +202 +202 +205 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +205 +204 +202 +203 +203 +202 +202 +200 +200 +200 +201 +200 +198 +198 +196 +196 +197 +195 +194 +191 +191 +188 +188 +189 +185 +184 +183 +183 +183 +179 +179 +179 +179 +179 +174 +174 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +126 +120 +119 +115 +116 +109 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +89 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +58 +58 +54 +54 +50 +51 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +31 +27 +27 +26 +24 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +51 +54 +55 +59 +59 +59 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +185 +185 +185 +189 +189 +190 +191 +191 +194 +195 +197 +196 +196 +198 +198 +201 +200 +201 +200 +200 +202 +202 +203 +204 +204 +204 +205 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +201 +200 +200 +201 +201 +198 +198 +198 +197 +197 +194 +194 +194 +190 +190 +190 +190 +191 +189 +188 +184 +184 +185 +183 +182 +179 +176 +176 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +130 +130 +126 +125 +119 +119 +119 +116 +115 +110 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +87 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +58 +59 +58 +55 +54 +51 +50 +50 +47 +46 +43 +42 +43 +41 +41 +37 +36 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +42 +43 +47 +47 +47 +51 +51 +54 +55 +54 +58 +58 +64 +64 +65 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +115 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +140 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +182 +182 +183 +185 +185 +188 +189 +188 +191 +190 +194 +194 +195 +196 +197 +198 +199 +200 +200 +200 +201 +201 +202 +203 +202 +204 +204 +204 +205 +204 +204 +204 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +205 +205 +204 +204 +204 +203 +202 +203 +202 +203 +200 +200 +200 +200 +200 +199 +199 +197 +196 +195 +194 +195 +191 +191 +188 +189 +188 +185 +185 +182 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +129 +126 +125 +119 +120 +119 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +83 +77 +76 +72 +72 +72 +68 +68 +64 +64 +59 +58 +58 +54 +55 +51 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +24 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +54 +55 +59 +58 +64 +65 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +185 +188 +189 +189 +191 +190 +194 +194 +194 +196 +196 +196 +196 +196 +199 +199 +201 +200 +200 +200 +201 +202 +202 +203 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +207 +206 +206 +205 +204 +205 +204 +205 +202 +203 +200 +200 +200 +200 +200 +198 +198 +198 +197 +197 +195 +194 +194 +191 +191 +188 +189 +189 +185 +185 +183 +183 +180 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +125 +120 +120 +116 +116 +116 +109 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +59 +58 +55 +55 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +15 +15 +18 +17 +18 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +55 +59 +59 +59 +64 +64 +69 +69 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +109 +110 +116 +116 +119 +119 +126 +125 +126 +129 +129 +133 +134 +134 +140 +139 +143 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +183 +182 +183 +185 +185 +189 +189 +189 +190 +190 +194 +194 +195 +196 +196 +198 +198 +200 +200 +201 +201 +201 +203 +203 +202 +204 +204 +204 +205 +204 +205 +205 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +199 +198 +199 +197 +196 +195 +194 +190 +191 +191 +188 +188 +184 +184 +185 +182 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +126 +125 +120 +120 +116 +116 +115 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +65 +58 +59 +54 +55 +50 +50 +50 +46 +47 +43 +43 +43 +41 +40 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +28 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +15 +15 +17 +18 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +54 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +73 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +105 +110 +110 +116 +115 +116 +120 +120 +126 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +182 +185 +184 +185 +188 +189 +190 +190 +195 +194 +194 +197 +196 +198 +199 +198 +200 +201 +201 +201 +200 +200 +200 +202 +202 +202 +204 +204 +204 +205 +205 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +201 +200 +200 +198 +198 +198 +197 +196 +196 +197 +197 +194 +195 +191 +190 +191 +189 +188 +184 +185 +185 +182 +183 +179 +179 +178 +174 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +120 +120 +116 +115 +110 +110 +109 +106 +106 +100 +100 +99 +95 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +73 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +54 +54 +55 +50 +50 +47 +46 +47 +43 +43 +41 +41 +42 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +22 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +50 +51 +55 +54 +54 +59 +59 +64 +64 +64 +69 +68 +72 +72 +73 +76 +77 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +120 +125 +125 +126 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +184 +189 +189 +189 +189 +189 +191 +190 +195 +194 +194 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +203 +204 +204 +204 +204 +204 +207 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +207 +206 +205 +204 +204 +205 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +198 +196 +196 +196 +195 +194 +190 +190 +191 +189 +189 +184 +184 +183 +182 +183 +179 +179 +175 +175 +175 +172 +173 +169 +168 +169 +166 +165 +161 +161 +160 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +138 +139 +133 +133 +129 +130 +129 +125 +126 +119 +120 +120 +116 +116 +110 +109 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +73 +72 +72 +68 +68 +65 +64 +65 +59 +59 +55 +55 +52 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +18 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +58 +58 +64 +65 +69 +68 +68 +72 +73 +77 +77 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +119 +120 +119 +126 +125 +129 +129 +130 +133 +132 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +174 +175 +179 +179 +183 +183 +183 +185 +184 +188 +189 +189 +191 +190 +195 +194 +196 +196 +196 +198 +198 +198 +198 +198 +200 +200 +200 +200 +201 +203 +202 +204 +204 +204 +205 +204 +207 +206 +205 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +204 +205 +204 +204 +204 +203 +203 +200 +200 +201 +201 +201 +199 +199 +197 +197 +197 +195 +195 +191 +191 +190 +189 +188 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +152 +150 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +134 +129 +130 +125 +125 +126 +120 +119 +116 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +64 +59 +58 +55 +55 +54 +51 +51 +51 +51 +50 +47 +47 +42 +43 +43 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +59 +58 +65 +65 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +110 +110 +110 +115 +116 +120 +119 +119 +125 +126 +129 +130 +130 +133 +133 +139 +139 +143 +144 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +160 +165 +165 +165 +169 +169 +173 +173 +175 +175 +176 +179 +179 +182 +182 +182 +185 +184 +188 +189 +188 +190 +190 +194 +194 +194 +196 +197 +199 +199 +199 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +203 +203 +202 +200 +201 +200 +200 +200 +198 +199 +196 +196 +197 +194 +194 +191 +191 +191 +188 +188 +185 +184 +185 +182 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +133 +133 +130 +129 +126 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +69 +68 +68 +68 +65 +64 +59 +58 +59 +54 +54 +51 +51 +50 +47 +46 +43 +42 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +46 +51 +51 +55 +54 +55 +58 +58 +64 +64 +65 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +95 +100 +100 +100 +106 +105 +110 +110 +112 +116 +115 +119 +119 +125 +126 +125 +130 +129 +133 +133 +133 +140 +140 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +162 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +178 +183 +183 +183 +184 +185 +189 +188 +189 +190 +191 +194 +195 +196 +196 +196 +199 +198 +200 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +202 +202 +201 +201 +200 +200 +200 +198 +198 +196 +197 +197 +194 +194 +190 +190 +189 +189 +189 +184 +185 +182 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +116 +110 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +65 +65 +59 +58 +58 +55 +55 +50 +51 +50 +47 +46 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +46 +50 +50 +51 +55 +54 +58 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +110 +109 +115 +116 +119 +119 +119 +125 +125 +126 +126 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +162 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +184 +185 +188 +189 +188 +191 +191 +194 +195 +195 +196 +196 +199 +198 +198 +200 +200 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +207 +207 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +204 +203 +202 +200 +200 +201 +200 +200 +199 +198 +197 +197 +197 +195 +195 +190 +190 +190 +189 +189 +185 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +174 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +130 +129 +127 +125 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +87 +82 +82 +77 +76 +76 +73 +73 +68 +68 +68 +64 +64 +58 +59 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +16 +15 +15 +17 +18 +19 +19 +20 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +38 +41 +41 +43 +43 +46 +46 +46 +51 +50 +54 +55 +54 +58 +59 +58 +58 +59 +65 +64 +69 +68 +69 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +126 +126 +127 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +178 +183 +182 +183 +185 +184 +189 +188 +188 +191 +191 +194 +194 +194 +197 +196 +198 +198 +198 +200 +201 +200 +200 +203 +203 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +203 +202 +203 +200 +200 +200 +201 +201 +199 +198 +196 +197 +196 +195 +195 +190 +191 +191 +188 +189 +185 +184 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +140 +140 +133 +133 +130 +130 +129 +126 +126 +119 +119 +119 +116 +116 +116 +115 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +54 +54 +55 +51 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +16 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +46 +47 +51 +51 +55 +55 +55 +58 +59 +64 +64 +65 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +115 +116 +116 +119 +120 +125 +125 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +148 +147 +151 +151 +152 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +189 +189 +190 +190 +191 +195 +195 +196 +197 +198 +198 +199 +201 +201 +200 +200 +201 +203 +203 +205 +204 +205 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +204 +204 +204 +205 +205 +202 +203 +201 +200 +200 +200 +200 +199 +198 +199 +197 +197 +195 +195 +195 +190 +190 +189 +188 +184 +185 +185 +182 +182 +179 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +134 +133 +133 +129 +129 +125 +126 +125 +120 +120 +115 +115 +111 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +59 +59 +59 +54 +54 +51 +51 +50 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +32 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +58 +59 +58 +64 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +120 +120 +125 +126 +130 +129 +130 +134 +133 +139 +139 +140 +144 +144 +147 +147 +151 +151 +152 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +182 +184 +185 +188 +189 +190 +190 +191 +195 +195 +196 +196 +197 +198 +199 +199 +199 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +205 +203 +202 +201 +200 +201 +200 +201 +198 +198 +197 +196 +197 +195 +194 +190 +191 +190 +188 +189 +188 +188 +188 +185 +185 +182 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +144 +139 +140 +133 +133 +131 +130 +129 +126 +126 +119 +119 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +69 +64 +65 +59 +59 +58 +55 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +36 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +54 +55 +55 +55 +54 +58 +59 +65 +64 +64 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +105 +110 +110 +115 +116 +116 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +188 +188 +189 +190 +190 +195 +194 +195 +196 +197 +199 +199 +199 +201 +200 +200 +201 +203 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +200 +200 +198 +199 +198 +199 +198 +196 +196 +194 +194 +195 +190 +191 +188 +188 +188 +185 +185 +182 +183 +178 +179 +179 +175 +174 +173 +173 +172 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +126 +126 +119 +120 +120 +116 +116 +110 +110 +110 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +50 +51 +51 +54 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +126 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +168 +173 +173 +172 +175 +175 +179 +179 +179 +183 +182 +185 +185 +184 +188 +189 +190 +191 +190 +194 +194 +197 +197 +199 +198 +199 +200 +201 +200 +200 +200 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +203 +203 +202 +200 +200 +201 +200 +201 +198 +198 +196 +196 +195 +194 +195 +190 +190 +188 +188 +189 +185 +185 +183 +183 +182 +179 +178 +179 +178 +179 +174 +175 +173 +173 +173 +169 +170 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +126 +126 +119 +119 +115 +116 +110 +109 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +87 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +69 +65 +65 +58 +58 +59 +55 +55 +50 +50 +51 +46 +47 +43 +42 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +16 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +39 +41 +41 +42 +42 +47 +47 +47 +51 +51 +55 +54 +55 +58 +58 +64 +65 +65 +68 +68 +72 +73 +72 +75 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +126 +125 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +174 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +188 +190 +190 +191 +190 +191 +194 +194 +196 +196 +196 +198 +198 +200 +200 +201 +200 +201 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +205 +205 +204 +204 +202 +202 +202 +200 +201 +200 +200 +201 +198 +198 +199 +198 +199 +196 +197 +195 +195 +195 +190 +190 +188 +188 +185 +184 +185 +183 +182 +178 +178 +178 +175 +173 +173 +173 +168 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +115 +110 +109 +110 +106 +106 +100 +100 +97 +96 +95 +89 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +51 +47 +47 +47 +42 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +18 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +46 +47 +50 +51 +51 +55 +54 +59 +59 +64 +65 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +115 +115 +115 +120 +119 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +174 +179 +178 +179 +182 +183 +184 +184 +185 +189 +189 +191 +190 +191 +194 +194 +196 +196 +198 +198 +198 +200 +201 +200 +200 +200 +202 +202 +203 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +205 +204 +204 +202 +202 +200 +200 +201 +200 +200 +199 +198 +198 +196 +196 +194 +194 +190 +190 +190 +189 +189 +185 +184 +184 +183 +183 +178 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +126 +126 +120 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +75 +72 +73 +72 +72 +72 +68 +68 +65 +64 +64 +59 +59 +54 +55 +54 +51 +51 +47 +47 +46 +43 +43 +40 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +24 +25 +27 +27 +27 +31 +31 +32 +33 +34 +38 +36 +41 +41 +42 +43 +42 +47 +47 +51 +51 +51 +55 +55 +55 +54 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +120 +120 +125 +125 +126 +129 +129 +133 +134 +140 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +166 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +182 +183 +183 +184 +184 +188 +189 +189 +191 +190 +191 +191 +191 +194 +195 +197 +197 +197 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +197 +194 +195 +190 +191 +191 +189 +189 +184 +185 +182 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +142 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +120 +119 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +68 +65 +64 +58 +59 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +16 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +55 +55 +59 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +115 +120 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +175 +179 +179 +179 +179 +179 +183 +183 +185 +185 +185 +189 +188 +191 +190 +191 +194 +195 +197 +196 +198 +198 +199 +201 +200 +200 +200 +200 +203 +202 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +207 +205 +205 +204 +204 +205 +202 +202 +202 +200 +201 +200 +200 +201 +198 +199 +196 +196 +194 +194 +195 +191 +190 +188 +188 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +126 +125 +120 +119 +120 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +69 +65 +64 +59 +59 +54 +55 +55 +51 +51 +47 +47 +46 +43 +43 +42 +42 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +50 +50 +55 +54 +59 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +120 +126 +126 +129 +129 +129 +134 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +172 +173 +173 +175 +174 +179 +179 +178 +182 +183 +185 +184 +188 +188 +188 +190 +191 +194 +195 +194 +196 +196 +196 +196 +196 +198 +199 +200 +200 +201 +200 +200 +202 +202 +203 +204 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +207 +204 +204 +205 +204 +205 +202 +202 +200 +201 +201 +200 +200 +199 +198 +199 +197 +197 +195 +194 +195 +190 +190 +189 +189 +188 +185 +185 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +130 +126 +125 +125 +120 +118 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +77 +72 +72 +72 +69 +68 +64 +64 +65 +58 +59 +58 +58 +59 +54 +54 +50 +51 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +55 +54 +59 +58 +64 +65 +65 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +116 +115 +117 +119 +119 +126 +126 +130 +130 +129 +133 +133 +140 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +174 +175 +179 +178 +179 +182 +183 +183 +183 +182 +185 +185 +188 +189 +188 +191 +190 +195 +195 +196 +197 +197 +198 +198 +201 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +205 +206 +206 +207 +207 +207 +206 +207 +206 +207 +206 +206 +207 +206 +206 +204 +205 +204 +204 +205 +202 +202 +202 +201 +201 +201 +200 +200 +199 +199 +197 +196 +196 +194 +195 +190 +191 +189 +188 +188 +185 +185 +183 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +65 +58 +59 +59 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +26 +24 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +58 +59 +65 +64 +65 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +91 +90 +96 +96 +100 +100 +101 +106 +105 +110 +110 +115 +116 +115 +120 +119 +126 +125 +125 +129 +129 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +149 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +188 +189 +189 +191 +191 +194 +195 +195 +197 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +201 +201 +200 +201 +198 +199 +196 +196 +197 +194 +194 +190 +191 +190 +189 +189 +185 +185 +185 +183 +182 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +140 +133 +134 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +110 +110 +110 +106 +105 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +65 +64 +65 +58 +58 +55 +55 +55 +51 +51 +51 +50 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +35 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +115 +115 +119 +119 +119 +125 +125 +130 +130 +131 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +189 +188 +190 +191 +195 +195 +195 +196 +197 +198 +198 +199 +201 +201 +200 +201 +202 +202 +202 +205 +204 +204 +204 +204 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +203 +202 +203 +200 +201 +200 +200 +200 +198 +199 +199 +199 +199 +197 +197 +194 +194 +194 +191 +191 +189 +189 +189 +184 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +126 +125 +119 +120 +119 +120 +119 +116 +115 +109 +109 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +77 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +55 +55 +53 +51 +50 +47 +46 +43 +43 +42 +41 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +26 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +46 +47 +51 +51 +51 +55 +54 +58 +58 +60 +65 +64 +68 +68 +73 +72 +72 +76 +77 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +164 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +184 +185 +188 +189 +191 +190 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +194 +191 +191 +191 +189 +188 +184 +185 +184 +182 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +115 +116 +109 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +59 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +20 +19 +19 +22 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +54 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +93 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +120 +119 +120 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +184 +185 +185 +189 +189 +190 +190 +191 +195 +194 +197 +197 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +198 +198 +198 +196 +196 +195 +195 +195 +190 +190 +189 +188 +188 +185 +185 +183 +183 +183 +178 +179 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +127 +125 +125 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +99 +100 +100 +96 +96 +90 +90 +90 +86 +85 +82 +82 +79 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +51 +54 +54 +54 +54 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +99 +99 +100 +106 +105 +110 +110 +110 +115 +116 +119 +119 +120 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +172 +175 +175 +179 +179 +179 +182 +183 +184 +184 +184 +189 +188 +190 +190 +191 +194 +194 +197 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +200 +201 +200 +199 +198 +198 +196 +196 +195 +194 +195 +191 +191 +188 +188 +189 +184 +185 +182 +182 +179 +178 +179 +175 +175 +173 +173 +173 +168 +168 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +126 +125 +125 +120 +120 +115 +116 +116 +110 +110 +106 +105 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +55 +51 +50 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +52 +55 +54 +59 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +109 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +174 +175 +178 +179 +182 +183 +183 +185 +184 +188 +189 +191 +190 +190 +194 +194 +196 +197 +196 +198 +198 +200 +200 +200 +201 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +197 +194 +194 +190 +190 +191 +188 +189 +188 +188 +188 +184 +185 +183 +182 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +131 +129 +129 +125 +125 +119 +119 +119 +116 +116 +110 +109 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +51 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +35 +36 +36 +41 +41 +43 +44 +43 +47 +47 +51 +51 +51 +54 +54 +55 +54 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +172 +173 +174 +175 +174 +178 +179 +182 +183 +182 +185 +185 +188 +188 +189 +190 +191 +194 +194 +194 +197 +197 +198 +198 +198 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +204 +204 +205 +204 +202 +202 +202 +200 +200 +200 +201 +200 +198 +198 +198 +198 +198 +196 +196 +194 +194 +194 +190 +191 +188 +188 +187 +184 +185 +182 +183 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +50 +50 +47 +47 +46 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +40 +41 +43 +43 +47 +46 +47 +51 +50 +54 +54 +58 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +81 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +109 +110 +110 +115 +116 +120 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +162 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +189 +189 +189 +190 +191 +194 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +202 +204 +204 +205 +204 +204 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +199 +196 +197 +196 +194 +195 +190 +191 +189 +189 +189 +184 +185 +183 +182 +182 +179 +179 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +119 +119 +116 +115 +113 +110 +109 +105 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +71 +72 +72 +68 +68 +65 +64 +58 +58 +59 +55 +54 +51 +50 +51 +46 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +44 +47 +47 +51 +51 +55 +54 +54 +58 +58 +64 +64 +65 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +95 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +125 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +184 +189 +188 +189 +191 +190 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +201 +202 +202 +205 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +203 +200 +201 +200 +200 +198 +198 +198 +196 +196 +194 +194 +194 +190 +191 +191 +190 +190 +188 +188 +184 +184 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +130 +129 +129 +125 +125 +119 +120 +119 +115 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +83 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +54 +54 +50 +50 +51 +46 +47 +43 +42 +43 +41 +40 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +55 +58 +58 +59 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +182 +182 +185 +184 +185 +188 +188 +191 +190 +191 +195 +195 +197 +196 +196 +199 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +204 +204 +204 +205 +205 +202 +202 +200 +200 +200 +200 +200 +200 +200 +200 +198 +199 +196 +196 +196 +195 +195 +191 +190 +189 +188 +189 +184 +185 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +160 +161 +157 +158 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +120 +115 +115 +109 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +55 +55 +51 +51 +47 +47 +47 +43 +43 +40 +40 +41 +36 +37 +33 +33 +33 +30 +31 +27 +27 +27 +25 +24 +21 +21 +22 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +54 +54 +55 +58 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +116 +119 +120 +126 +126 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +185 +185 +188 +188 +190 +191 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +202 +202 +202 +201 +201 +200 +200 +199 +198 +198 +196 +197 +194 +195 +194 +190 +190 +188 +188 +188 +184 +185 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +120 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +65 +65 +58 +59 +54 +55 +54 +50 +50 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +19 +18 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +40 +43 +43 +46 +47 +47 +51 +50 +55 +55 +55 +58 +58 +65 +64 +65 +68 +68 +72 +72 +72 +77 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +116 +119 +120 +125 +126 +125 +129 +129 +133 +134 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +179 +182 +182 +184 +184 +188 +189 +188 +191 +190 +195 +194 +194 +196 +196 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +205 +204 +204 +203 +203 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +194 +191 +191 +190 +189 +189 +184 +184 +185 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +119 +116 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +59 +58 +55 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +36 +33 +33 +33 +30 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +55 +58 +58 +64 +65 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +116 +120 +120 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +182 +183 +184 +184 +185 +185 +184 +189 +189 +191 +191 +191 +195 +194 +196 +196 +197 +198 +198 +200 +200 +200 +200 +200 +203 +202 +202 +202 +202 +204 +204 +205 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +198 +199 +196 +197 +195 +194 +191 +190 +190 +189 +188 +184 +184 +185 +182 +182 +179 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +134 +130 +129 +125 +125 +125 +120 +120 +115 +115 +116 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +54 +51 +51 +51 +46 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +32 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +55 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +126 +130 +130 +133 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +183 +184 +185 +188 +188 +191 +190 +191 +195 +194 +196 +196 +196 +198 +199 +199 +198 +198 +201 +200 +200 +200 +200 +202 +203 +205 +204 +204 +204 +205 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +194 +195 +190 +190 +190 +188 +188 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +129 +129 +126 +126 +120 +119 +120 +115 +116 +110 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +59 +58 +54 +54 +50 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +55 +59 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +91 +89 +90 +96 +96 +100 +100 +100 +106 +105 +110 +109 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +182 +182 +184 +185 +184 +189 +188 +191 +191 +191 +194 +195 +194 +194 +194 +196 +196 +199 +199 +198 +200 +201 +199 +201 +201 +202 +202 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +204 +203 +203 +202 +200 +201 +200 +200 +200 +199 +198 +196 +196 +196 +194 +194 +191 +190 +190 +188 +189 +184 +184 +184 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +126 +125 +119 +119 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +69 +64 +64 +64 +64 +64 +58 +58 +55 +54 +55 +50 +50 +47 +47 +45 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +14 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +12 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +55 +55 +59 +58 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +101 +105 +106 +106 +110 +109 +115 +115 +116 +120 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +138 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +175 +179 +178 +183 +182 +183 +185 +185 +185 +184 +185 +188 +188 +191 +191 +191 +194 +194 +196 +196 +197 +198 +199 +200 +201 +200 +200 +200 +202 +202 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +205 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +198 +196 +196 +194 +194 +194 +190 +190 +188 +188 +184 +184 +185 +182 +183 +178 +179 +178 +174 +175 +173 +172 +172 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +65 +59 +58 +55 +55 +55 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +16 +13 +13 +12 +12 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +46 +47 +50 +51 +51 +54 +54 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +109 +116 +115 +116 +119 +120 +125 +125 +125 +129 +129 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +173 +173 +173 +175 +175 +178 +179 +179 +183 +182 +184 +184 +188 +188 +189 +190 +190 +195 +195 +194 +197 +196 +198 +199 +198 +200 +200 +201 +201 +200 +202 +202 +204 +204 +205 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +201 +200 +198 +198 +196 +196 +196 +194 +194 +190 +190 +190 +188 +189 +185 +185 +184 +182 +182 +179 +178 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +69 +68 +64 +64 +58 +58 +58 +54 +54 +51 +50 +51 +47 +47 +47 +46 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +15 +15 +18 +17 +17 +19 +18 +21 +21 +21 +25 +25 +27 +27 +27 +30 +31 +33 +33 +33 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +54 +55 +59 +59 +58 +59 +58 +65 +64 +69 +69 +69 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +126 +127 +130 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +171 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +185 +188 +188 +190 +191 +190 +195 +195 +197 +196 +197 +199 +199 +200 +200 +200 +200 +200 +202 +202 +205 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +207 +207 +204 +204 +205 +204 +204 +203 +202 +200 +200 +200 +200 +200 +198 +198 +198 +197 +196 +195 +194 +194 +191 +191 +189 +189 +189 +184 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +130 +130 +125 +126 +125 +120 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +69 +68 +69 +64 +64 +59 +58 +59 +54 +54 +51 +50 +52 +47 +47 +43 +43 +41 +41 +41 +37 +37 +32 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +20 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +55 +55 +59 +58 +65 +64 +64 +68 +69 +72 +73 +77 +76 +77 +82 +83 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +117 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +168 +169 +173 +173 +173 +175 +175 +178 +178 +179 +183 +182 +184 +185 +184 +189 +189 +191 +190 +191 +195 +195 +197 +196 +198 +198 +198 +200 +201 +200 +201 +200 +202 +202 +204 +204 +205 +204 +204 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +201 +200 +199 +198 +198 +197 +196 +194 +195 +194 +190 +190 +188 +188 +185 +184 +185 +183 +183 +179 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +116 +116 +110 +110 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +69 +64 +65 +59 +59 +55 +54 +54 +50 +50 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +24 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +42 +43 +47 +46 +47 +50 +51 +54 +54 +56 +58 +58 +65 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +81 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +100 +106 +105 +110 +110 +116 +115 +116 +120 +120 +125 +126 +126 +129 +129 +130 +129 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +149 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +184 +185 +188 +189 +190 +191 +190 +194 +194 +197 +196 +197 +198 +198 +198 +198 +198 +200 +201 +200 +200 +201 +202 +203 +204 +205 +205 +205 +205 +207 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +195 +195 +190 +191 +191 +188 +189 +185 +185 +184 +183 +183 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +130 +126 +125 +126 +120 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +74 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +42 +37 +36 +33 +33 +31 +31 +31 +26 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +51 +55 +55 +59 +59 +58 +65 +64 +65 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +109 +109 +109 +115 +116 +119 +119 +120 +125 +125 +129 +129 +131 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +177 +179 +179 +182 +182 +184 +185 +185 +188 +188 +190 +190 +190 +194 +195 +196 +196 +197 +199 +198 +200 +201 +200 +201 +201 +203 +202 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +200 +200 +201 +201 +200 +198 +198 +198 +197 +197 +194 +195 +194 +191 +190 +189 +188 +189 +185 +185 +183 +182 +183 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +116 +116 +116 +116 +116 +109 +109 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +58 +59 +54 +55 +55 +50 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +20 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +40 +41 +43 +43 +43 +47 +47 +47 +47 +46 +50 +50 +54 +55 +55 +58 +59 +64 +65 +66 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +164 +168 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +185 +189 +188 +190 +191 +190 +194 +194 +197 +197 +197 +199 +198 +200 +200 +200 +201 +200 +203 +203 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +205 +205 +205 +204 +204 +202 +202 +201 +201 +200 +200 +201 +199 +198 +199 +197 +196 +194 +195 +194 +190 +191 +189 +189 +184 +184 +185 +182 +183 +179 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +129 +125 +126 +126 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +73 +73 +68 +68 +64 +65 +59 +58 +58 +55 +55 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +46 +48 +50 +52 +54 +54 +58 +58 +58 +64 +65 +68 +68 +69 +73 +72 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +126 +126 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +178 +179 +179 +182 +183 +184 +185 +188 +188 +188 +190 +191 +194 +194 +195 +196 +197 +198 +198 +201 +201 +200 +200 +201 +200 +203 +202 +205 +204 +204 +204 +204 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +203 +200 +201 +200 +200 +198 +198 +198 +196 +196 +195 +194 +194 +191 +190 +191 +191 +191 +189 +188 +185 +185 +185 +182 +183 +178 +178 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +160 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +138 +133 +133 +129 +129 +126 +125 +125 +119 +119 +115 +116 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +58 +58 +54 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +12 +15 +16 +17 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +32 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +47 +47 +46 +46 +47 +51 +51 +55 +55 +54 +58 +58 +64 +65 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +174 +175 +179 +178 +183 +183 +183 +184 +185 +189 +189 +188 +191 +190 +194 +194 +195 +197 +196 +198 +198 +200 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +197 +194 +190 +190 +191 +189 +188 +189 +184 +185 +182 +182 +183 +179 +178 +175 +175 +174 +173 +173 +172 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +126 +125 +119 +119 +115 +115 +116 +110 +110 +106 +106 +101 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +64 +65 +58 +58 +54 +55 +51 +50 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +54 +54 +54 +58 +59 +64 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +109 +110 +116 +115 +116 +120 +119 +126 +125 +125 +130 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +183 +183 +184 +184 +185 +188 +188 +190 +190 +195 +194 +194 +196 +197 +198 +198 +198 +200 +200 +201 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +200 +198 +199 +196 +196 +196 +194 +194 +195 +195 +194 +190 +190 +191 +191 +190 +188 +189 +184 +185 +185 +183 +182 +179 +179 +175 +175 +175 +173 +173 +168 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +130 +125 +119 +119 +119 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +83 +77 +76 +76 +72 +73 +68 +69 +68 +64 +64 +58 +59 +58 +55 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +20 +20 +21 +21 +25 +25 +25 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +40 +40 +43 +43 +47 +47 +46 +51 +50 +54 +55 +54 +58 +59 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +109 +110 +115 +116 +115 +119 +119 +125 +125 +129 +130 +130 +133 +133 +139 +140 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +174 +175 +179 +178 +183 +183 +183 +185 +184 +185 +185 +185 +188 +188 +191 +190 +190 +195 +194 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +200 +200 +198 +198 +198 +197 +197 +195 +195 +191 +190 +191 +188 +189 +185 +184 +185 +183 +183 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +126 +125 +125 +119 +119 +115 +115 +115 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +72 +68 +69 +65 +64 +65 +58 +59 +55 +55 +51 +51 +51 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +46 +50 +51 +54 +54 +55 +59 +58 +64 +65 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +106 +106 +105 +109 +110 +115 +116 +116 +120 +120 +126 +126 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +184 +185 +189 +189 +190 +191 +190 +195 +194 +196 +196 +196 +199 +198 +198 +198 +198 +200 +200 +200 +200 +200 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +200 +201 +201 +200 +198 +198 +198 +196 +196 +195 +195 +195 +191 +191 +189 +189 +188 +184 +185 +183 +182 +183 +179 +179 +175 +175 +174 +173 +172 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +140 +140 +133 +133 +129 +129 +126 +126 +125 +120 +119 +120 +119 +119 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +69 +68 +68 +64 +64 +64 +64 +65 +58 +58 +55 +55 +55 +51 +50 +47 +46 +48 +43 +43 +40 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +55 +59 +59 +64 +64 +64 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +105 +110 +110 +116 +115 +117 +119 +120 +126 +125 +129 +129 +129 +133 +133 +139 +140 +139 +143 +143 +148 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +183 +185 +184 +185 +185 +185 +188 +189 +191 +190 +191 +194 +194 +196 +197 +196 +198 +199 +201 +200 +201 +200 +200 +203 +202 +204 +204 +204 +204 +204 +205 +205 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +204 +205 +204 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +199 +196 +197 +195 +195 +190 +190 +191 +189 +189 +185 +185 +184 +182 +183 +178 +178 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +158 +158 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +133 +130 +129 +125 +126 +125 +119 +120 +116 +116 +116 +110 +110 +106 +105 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +50 +55 +55 +55 +59 +65 +64 +64 +68 +68 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +101 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +160 +165 +165 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +178 +180 +182 +183 +185 +185 +189 +188 +188 +191 +190 +195 +194 +194 +196 +196 +197 +196 +197 +198 +198 +201 +200 +200 +200 +200 +203 +203 +203 +205 +205 +204 +204 +206 +207 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +203 +202 +200 +200 +200 +201 +200 +198 +198 +199 +196 +196 +194 +194 +194 +190 +190 +189 +188 +189 +185 +185 +182 +182 +182 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +160 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +126 +125 +125 +119 +119 +115 +116 +115 +109 +110 +106 +105 +105 +100 +100 +96 +95 +96 +90 +91 +86 +86 +86 +82 +82 +77 +76 +72 +73 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +54 +50 +50 +47 +47 +47 +43 +42 +41 +41 +39 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +30 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +105 +105 +109 +110 +109 +115 +116 +120 +120 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +179 +182 +183 +182 +183 +183 +184 +185 +189 +188 +189 +191 +190 +195 +194 +196 +196 +197 +199 +199 +201 +201 +201 +200 +201 +202 +202 +202 +204 +205 +205 +204 +204 +207 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +204 +205 +204 +204 +204 +202 +202 +203 +201 +201 +201 +201 +201 +199 +198 +196 +197 +197 +194 +195 +191 +191 +189 +189 +188 +185 +184 +183 +182 +183 +179 +178 +178 +178 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +126 +126 +126 +120 +119 +116 +115 +116 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +87 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +66 +64 +64 +59 +59 +54 +55 +55 +51 +51 +47 +46 +46 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +42 +43 +43 +47 +47 +50 +51 +55 +54 +54 +58 +59 +64 +64 +64 +68 +68 +68 +68 +68 +73 +72 +76 +77 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +115 +115 +116 +120 +120 +126 +125 +125 +129 +129 +133 +133 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +182 +183 +184 +185 +185 +188 +189 +190 +191 +190 +194 +194 +196 +197 +197 +198 +200 +200 +201 +200 +200 +202 +202 +203 +204 +204 +205 +204 +204 +204 +205 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +204 +204 +204 +204 +202 +203 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +196 +194 +194 +191 +191 +191 +189 +189 +185 +185 +185 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +152 +151 +147 +147 +143 +143 +144 +139 +139 +134 +133 +130 +129 +129 +125 +126 +119 +120 +120 +116 +115 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +69 +68 +68 +64 +65 +58 +59 +58 +54 +54 +50 +50 +49 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +65 +64 +64 +69 +68 +73 +72 +72 +76 +76 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +105 +106 +110 +110 +110 +115 +116 +120 +120 +120 +125 +125 +126 +125 +125 +130 +129 +133 +133 +133 +140 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +170 +173 +173 +173 +175 +174 +179 +179 +179 +182 +183 +185 +185 +188 +189 +188 +191 +190 +194 +194 +194 +196 +196 +198 +199 +199 +200 +201 +201 +200 +200 +203 +203 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +205 +204 +203 +202 +201 +200 +201 +201 +200 +198 +198 +197 +196 +197 +194 +190 +190 +190 +190 +188 +189 +189 +189 +189 +184 +184 +183 +182 +182 +179 +179 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +144 +140 +139 +133 +133 +134 +129 +129 +126 +125 +120 +119 +120 +116 +116 +109 +110 +110 +106 +106 +106 +106 +105 +100 +100 +96 +96 +96 +90 +89 +86 +86 +85 +82 +82 +76 +76 +73 +72 +72 +69 +68 +64 +64 +65 +58 +58 +54 +55 +54 +51 +50 +47 +47 +47 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +18 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +50 +50 +54 +55 +58 +59 +59 +64 +65 +68 +68 +68 +72 +72 +76 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +109 +115 +115 +116 +119 +119 +126 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +170 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +184 +188 +189 +189 +191 +191 +195 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +205 +206 +207 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +203 +203 +203 +201 +200 +200 +200 +200 +199 +198 +197 +196 +196 +195 +195 +191 +191 +190 +188 +189 +185 +185 +185 +183 +183 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +141 +139 +139 +134 +133 +129 +130 +129 +125 +125 +119 +119 +120 +115 +115 +116 +116 +110 +110 +106 +106 +106 +106 +105 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +18 +19 +21 +21 +25 +24 +26 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +46 +47 +51 +51 +50 +54 +55 +59 +58 +59 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +144 +143 +147 +147 +148 +151 +151 +157 +157 +160 +161 +162 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +184 +188 +189 +189 +190 +191 +194 +195 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +206 +207 +206 +206 +207 +206 +207 +207 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +197 +196 +197 +195 +194 +191 +190 +188 +188 +188 +185 +185 +182 +183 +183 +179 +178 +178 +178 +179 +175 +175 +173 +173 +173 +169 +170 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +119 +118 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +54 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +27 +27 +27 +25 +26 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +50 +51 +50 +54 +54 +58 +57 +58 +64 +64 +64 +64 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +126 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +178 +182 +182 +183 +184 +184 +188 +189 +189 +191 +191 +194 +195 +194 +197 +197 +198 +199 +198 +200 +200 +200 +200 +201 +202 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +201 +200 +201 +200 +200 +198 +198 +197 +196 +196 +194 +194 +194 +195 +194 +191 +190 +188 +189 +189 +185 +185 +183 +183 +181 +179 +179 +175 +175 +172 +173 +172 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +119 +120 +115 +115 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +83 +82 +82 +82 +76 +76 +73 +72 +72 +68 +69 +64 +64 +64 +58 +58 +54 +55 +55 +51 +51 +47 +46 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +24 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +46 +47 +47 +51 +51 +54 +54 +54 +58 +58 +64 +64 +68 +68 +68 +72 +72 +72 +72 +72 +75 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +115 +115 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +178 +179 +183 +182 +185 +185 +185 +189 +188 +190 +190 +191 +195 +195 +196 +196 +199 +198 +199 +200 +200 +200 +201 +200 +203 +202 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +195 +194 +192 +191 +191 +189 +188 +184 +185 +185 +182 +182 +178 +178 +178 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +162 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +129 +129 +129 +125 +125 +119 +119 +120 +115 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +59 +55 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +50 +50 +54 +55 +59 +58 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +105 +110 +110 +109 +115 +116 +120 +119 +120 +125 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +182 +184 +185 +188 +189 +190 +190 +190 +194 +195 +196 +197 +197 +199 +198 +201 +201 +200 +201 +200 +202 +202 +202 +205 +205 +204 +204 +205 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +203 +203 +200 +201 +200 +200 +200 +199 +198 +196 +197 +195 +194 +195 +190 +191 +188 +188 +188 +185 +184 +184 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +172 +174 +169 +169 +165 +165 +161 +161 +161 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +129 +125 +125 +119 +119 +115 +116 +116 +109 +110 +106 +107 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +65 +64 +58 +59 +54 +55 +55 +50 +50 +46 +46 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +55 +54 +59 +59 +58 +64 +64 +68 +68 +68 +72 +73 +76 +76 +77 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +115 +120 +119 +120 +125 +125 +129 +130 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +160 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +183 +182 +182 +185 +184 +188 +189 +188 +191 +190 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +205 +204 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +205 +205 +202 +202 +200 +200 +200 +201 +201 +199 +199 +197 +196 +197 +194 +194 +195 +195 +194 +191 +190 +189 +188 +188 +184 +184 +182 +183 +181 +179 +179 +175 +175 +172 +173 +174 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +72 +69 +68 +64 +64 +64 +59 +58 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +32 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +59 +58 +64 +64 +65 +69 +68 +72 +72 +76 +76 +76 +82 +83 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +109 +110 +115 +116 +115 +119 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +183 +183 +184 +184 +184 +184 +185 +189 +189 +190 +190 +191 +194 +195 +197 +197 +196 +198 +198 +200 +200 +200 +200 +200 +203 +202 +204 +205 +205 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +205 +204 +205 +205 +204 +204 +204 +202 +202 +202 +202 +203 +201 +200 +200 +200 +201 +199 +198 +196 +197 +195 +194 +195 +190 +191 +188 +188 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +129 +125 +126 +119 +120 +119 +115 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +55 +55 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +15 +15 +17 +17 +17 +18 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +51 +50 +55 +55 +58 +58 +59 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +101 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +184 +184 +188 +189 +189 +190 +191 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +205 +204 +205 +204 +204 +202 +202 +201 +200 +201 +201 +201 +198 +199 +198 +197 +196 +194 +194 +194 +190 +191 +188 +188 +188 +184 +185 +183 +183 +183 +179 +179 +175 +174 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +130 +129 +126 +125 +125 +120 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +69 +68 +68 +68 +68 +64 +64 +58 +58 +59 +55 +55 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +30 +31 +27 +27 +27 +25 +25 +25 +25 +25 +22 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +15 +16 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +55 +59 +58 +65 +64 +64 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +95 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +116 +120 +119 +126 +125 +130 +130 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +178 +179 +182 +183 +183 +182 +183 +185 +185 +188 +188 +189 +191 +190 +195 +194 +195 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +204 +205 +204 +204 +204 +204 +204 +207 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +199 +197 +196 +194 +194 +191 +191 +190 +189 +189 +184 +185 +184 +183 +182 +178 +178 +178 +174 +175 +174 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +134 +134 +130 +129 +125 +125 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +65 +59 +59 +54 +54 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +15 +15 +16 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +51 +54 +54 +55 +58 +58 +64 +64 +64 +69 +69 +72 +72 +72 +76 +76 +82 +82 +82 +87 +86 +90 +90 +90 +95 +96 +100 +100 +106 +105 +105 +110 +110 +116 +116 +116 +119 +119 +126 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +145 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +174 +179 +179 +178 +183 +183 +185 +184 +186 +189 +189 +191 +190 +194 +194 +194 +196 +196 +199 +199 +198 +200 +200 +200 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +205 +205 +204 +204 +202 +202 +202 +200 +201 +201 +201 +198 +198 +199 +196 +196 +195 +194 +195 +190 +190 +189 +189 +188 +184 +185 +182 +183 +183 +179 +178 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +156 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +129 +125 +126 +119 +120 +116 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +55 +50 +50 +51 +51 +51 +47 +47 +42 +42 +43 +41 +41 +37 +37 +35 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +54 +54 +59 +58 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +109 +110 +116 +116 +115 +119 +120 +125 +125 +126 +129 +129 +133 +134 +140 +139 +139 +143 +143 +147 +146 +147 +151 +151 +157 +158 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +182 +182 +183 +184 +184 +189 +188 +188 +191 +191 +190 +190 +191 +194 +194 +197 +196 +196 +198 +199 +200 +200 +200 +200 +201 +202 +202 +202 +202 +202 +204 +204 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +199 +196 +196 +196 +195 +195 +190 +191 +191 +188 +188 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +140 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +115 +115 +110 +110 +110 +106 +106 +99 +100 +101 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +72 +72 +72 +69 +68 +65 +64 +65 +58 +58 +54 +55 +52 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +26 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +38 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +55 +55 +58 +58 +65 +64 +65 +68 +69 +73 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +101 +106 +106 +110 +110 +116 +116 +116 +120 +120 +125 +125 +126 +129 +129 +129 +129 +129 +134 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +172 +175 +175 +179 +179 +179 +183 +182 +185 +184 +188 +189 +189 +190 +190 +195 +194 +195 +197 +197 +198 +198 +198 +200 +201 +200 +201 +201 +202 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +200 +200 +201 +200 +201 +198 +198 +197 +197 +196 +194 +195 +190 +190 +190 +188 +188 +189 +189 +189 +184 +185 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +130 +125 +125 +119 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +77 +76 +73 +73 +68 +69 +68 +65 +64 +58 +58 +58 +55 +54 +54 +55 +54 +51 +50 +47 +46 +47 +43 +43 +41 +41 +39 +37 +37 +33 +33 +31 +31 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +73 +72 +76 +76 +77 +82 +82 +87 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +105 +106 +106 +110 +110 +116 +116 +116 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +178 +183 +182 +184 +185 +184 +189 +189 +191 +190 +191 +195 +195 +196 +197 +197 +198 +199 +200 +201 +200 +201 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +201 +201 +200 +198 +199 +198 +196 +196 +194 +194 +195 +190 +191 +189 +188 +189 +184 +185 +182 +183 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +140 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +119 +120 +120 +119 +116 +115 +110 +110 +110 +106 +105 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +81 +82 +76 +76 +76 +72 +72 +72 +72 +73 +68 +69 +64 +65 +65 +59 +58 +55 +54 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +20 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +42 +43 +47 +47 +51 +50 +51 +55 +54 +59 +58 +59 +64 +64 +69 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +115 +116 +119 +119 +120 +125 +125 +129 +130 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +153 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +178 +183 +182 +184 +184 +185 +188 +189 +191 +191 +194 +195 +195 +196 +196 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +200 +200 +201 +198 +198 +199 +197 +196 +194 +194 +191 +191 +191 +188 +188 +185 +185 +185 +183 +183 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +134 +133 +133 +130 +130 +125 +125 +123 +120 +119 +115 +116 +110 +109 +110 +106 +105 +100 +100 +99 +96 +95 +96 +96 +96 +90 +89 +86 +86 +86 +82 +82 +76 +76 +75 +72 +72 +68 +69 +64 +64 +64 +58 +58 +55 +55 +55 +50 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +20 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +42 +46 +47 +51 +51 +51 +55 +55 +55 +55 +55 +59 +58 +65 +64 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +109 +109 +110 +115 +116 +120 +120 +125 +125 +126 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +146 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +172 +174 +175 +179 +179 +179 +182 +182 +185 +184 +185 +188 +188 +191 +191 +190 +194 +195 +197 +197 +196 +199 +199 +201 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +201 +201 +201 +201 +200 +198 +198 +196 +196 +196 +194 +195 +191 +191 +191 +188 +189 +185 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +125 +120 +120 +120 +115 +116 +110 +110 +108 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +69 +65 +65 +59 +58 +55 +55 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +36 +37 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +16 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +30 +33 +33 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +48 +51 +51 +54 +54 +58 +59 +59 +64 +64 +68 +68 +69 +72 +72 +72 +73 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +120 +126 +126 +125 +130 +130 +134 +134 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +178 +178 +179 +183 +183 +184 +184 +189 +188 +189 +191 +190 +194 +194 +194 +196 +196 +198 +198 +198 +201 +201 +200 +200 +200 +202 +202 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +201 +201 +198 +199 +197 +197 +197 +195 +195 +191 +190 +190 +189 +189 +185 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +126 +126 +126 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +55 +55 +51 +51 +47 +47 +47 +43 +42 +41 +41 +40 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +22 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +37 +41 +41 +43 +43 +47 +46 +46 +50 +50 +54 +54 +55 +58 +58 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +77 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +115 +116 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +144 +147 +147 +147 +151 +151 +157 +157 +157 +160 +161 +165 +165 +165 +169 +169 +173 +172 +175 +175 +175 +178 +179 +182 +183 +182 +184 +184 +188 +188 +188 +191 +190 +195 +194 +194 +196 +197 +199 +198 +199 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +201 +200 +200 +200 +201 +200 +200 +198 +199 +196 +196 +197 +194 +194 +191 +190 +191 +189 +188 +184 +184 +182 +182 +183 +179 +179 +175 +175 +174 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +129 +130 +126 +125 +126 +120 +120 +116 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +58 +58 +55 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +40 +41 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +51 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +116 +119 +120 +120 +125 +126 +130 +130 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +183 +185 +185 +188 +189 +191 +191 +191 +194 +194 +196 +197 +196 +198 +199 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +207 +207 +207 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +198 +197 +197 +196 +195 +195 +191 +191 +191 +189 +189 +188 +189 +188 +185 +184 +182 +183 +182 +179 +179 +174 +174 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +126 +125 +125 +119 +120 +116 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +73 +72 +68 +68 +64 +65 +64 +58 +59 +55 +55 +55 +51 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +19 +21 +21 +21 +22 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +36 +36 +36 +41 +41 +42 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +59 +59 +64 +64 +69 +69 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +120 +125 +125 +130 +130 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +182 +184 +185 +184 +188 +188 +191 +190 +190 +195 +194 +197 +196 +197 +199 +198 +200 +201 +200 +201 +201 +203 +202 +204 +205 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +204 +204 +202 +203 +202 +201 +200 +200 +200 +200 +198 +198 +199 +198 +198 +197 +197 +194 +194 +195 +190 +191 +189 +188 +185 +184 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +119 +120 +116 +116 +116 +110 +110 +106 +106 +105 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +65 +64 +64 +58 +58 +55 +54 +55 +50 +51 +46 +47 +44 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +12 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +26 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +51 +51 +54 +54 +58 +64 +64 +65 +64 +68 +68 +72 +72 +73 +77 +76 +82 +82 +82 +87 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +115 +115 +119 +119 +125 +125 +125 +129 +130 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +178 +179 +183 +183 +185 +184 +184 +188 +189 +190 +190 +191 +195 +195 +196 +196 +198 +198 +199 +201 +200 +200 +200 +200 +203 +203 +203 +202 +202 +205 +204 +204 +205 +204 +207 +207 +206 +207 +207 +207 +207 +206 +207 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +204 +204 +205 +202 +202 +201 +200 +201 +200 +200 +198 +199 +197 +196 +197 +194 +195 +190 +191 +190 +188 +188 +188 +189 +188 +185 +185 +183 +182 +183 +178 +179 +175 +174 +175 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +120 +116 +115 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +65 +65 +64 +59 +58 +54 +55 +55 +51 +50 +46 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +55 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +130 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +178 +179 +183 +182 +184 +185 +185 +188 +188 +191 +190 +190 +194 +194 +197 +196 +196 +199 +198 +200 +200 +200 +200 +200 +202 +204 +203 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +197 +195 +195 +191 +191 +190 +189 +188 +185 +184 +185 +183 +183 +178 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +81 +82 +77 +76 +76 +72 +72 +68 +68 +69 +65 +65 +59 +59 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +51 +54 +55 +55 +59 +59 +65 +64 +64 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +120 +126 +125 +130 +130 +129 +134 +133 +139 +139 +139 +142 +143 +147 +147 +147 +152 +151 +157 +157 +157 +160 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +183 +184 +184 +184 +185 +184 +188 +188 +190 +190 +190 +194 +194 +196 +197 +197 +198 +198 +200 +201 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +205 +204 +202 +203 +202 +200 +201 +201 +200 +201 +199 +198 +196 +196 +197 +195 +195 +190 +191 +188 +189 +188 +185 +184 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +115 +115 +110 +109 +110 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +77 +72 +72 +72 +68 +68 +64 +65 +65 +59 +58 +54 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +36 +32 +32 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +55 +55 +54 +59 +58 +64 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +120 +126 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +182 +183 +184 +185 +188 +188 +190 +190 +191 +194 +194 +196 +196 +196 +199 +198 +199 +198 +198 +201 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +204 +204 +204 +204 +205 +202 +203 +200 +201 +200 +200 +200 +198 +199 +196 +196 +196 +194 +194 +190 +191 +190 +188 +189 +184 +185 +185 +183 +183 +179 +178 +178 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +134 +133 +129 +130 +125 +125 +120 +119 +120 +116 +116 +110 +110 +110 +106 +105 +100 +100 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +54 +55 +55 +54 +55 +51 +50 +47 +47 +47 +43 +42 +41 +41 +41 +37 +36 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +20 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +36 +42 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +83 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +120 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +185 +184 +188 +188 +188 +190 +190 +191 +190 +191 +195 +195 +196 +197 +196 +198 +198 +200 +200 +200 +200 +200 +203 +202 +204 +204 +205 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +207 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +195 +194 +194 +190 +190 +188 +189 +189 +185 +185 +183 +183 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +134 +134 +133 +129 +129 +126 +126 +126 +120 +120 +116 +115 +115 +110 +110 +106 +105 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +59 +59 +54 +54 +54 +50 +51 +47 +47 +45 +43 +43 +41 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +12 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +30 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +109 +115 +115 +116 +119 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +166 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +184 +184 +184 +184 +184 +188 +188 +190 +190 +191 +194 +195 +196 +196 +198 +198 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +201 +198 +198 +198 +197 +197 +194 +195 +194 +191 +191 +188 +188 +185 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +130 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +64 +62 +58 +58 +55 +55 +50 +50 +51 +47 +46 +42 +43 +43 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +12 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +58 +59 +58 +64 +64 +68 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +110 +110 +110 +116 +116 +119 +120 +120 +125 +125 +129 +129 +130 +133 +133 +139 +140 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +185 +188 +188 +188 +190 +191 +194 +195 +194 +196 +196 +198 +199 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +205 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +201 +199 +198 +197 +196 +197 +194 +194 +191 +191 +190 +189 +188 +184 +184 +185 +182 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +119 +115 +116 +115 +110 +109 +106 +106 +106 +100 +99 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +59 +54 +55 +55 +54 +55 +51 +51 +47 +46 +47 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +41 +41 +41 +43 +43 +43 +47 +47 +51 +50 +50 +54 +55 +54 +54 +55 +59 +59 +64 +65 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +87 +86 +85 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +119 +119 +120 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +148 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +167 +169 +169 +173 +173 +175 +175 +176 +178 +179 +183 +182 +182 +185 +185 +188 +188 +188 +190 +190 +194 +195 +195 +196 +197 +198 +199 +200 +201 +200 +200 +201 +202 +202 +202 +205 +204 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +201 +199 +198 +196 +196 +196 +195 +195 +190 +191 +191 +189 +189 +184 +185 +183 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +130 +125 +125 +119 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +98 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +65 +65 +58 +58 +54 +55 +51 +50 +50 +46 +46 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +46 +50 +51 +51 +54 +55 +58 +58 +59 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +97 +96 +100 +100 +100 +106 +106 +110 +110 +112 +115 +116 +120 +119 +125 +125 +125 +130 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +163 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +184 +185 +185 +189 +189 +190 +190 +191 +194 +195 +197 +196 +198 +199 +199 +200 +200 +201 +201 +201 +202 +203 +204 +204 +204 +204 +204 +206 +207 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +205 +207 +204 +205 +205 +204 +204 +203 +202 +200 +200 +200 +200 +201 +199 +199 +198 +196 +196 +194 +194 +194 +190 +191 +189 +189 +185 +185 +185 +183 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +130 +130 +130 +129 +129 +125 +126 +119 +119 +120 +115 +115 +109 +110 +108 +106 +106 +100 +100 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +73 +73 +68 +68 +65 +64 +59 +58 +59 +55 +55 +50 +50 +51 +47 +47 +42 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +77 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +109 +109 +115 +115 +119 +119 +119 +125 +126 +125 +125 +126 +129 +129 +133 +134 +133 +139 +139 +143 +143 +147 +147 +147 +151 +150 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +182 +183 +185 +185 +188 +188 +189 +191 +190 +194 +194 +194 +197 +197 +198 +199 +198 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +204 +205 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +199 +197 +196 +196 +194 +194 +190 +190 +190 +188 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +164 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +126 +126 +119 +120 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +69 +68 +68 +64 +65 +59 +59 +59 +54 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +54 +58 +58 +58 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +126 +125 +127 +130 +129 +133 +133 +139 +139 +139 +143 +144 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +174 +179 +179 +183 +183 +183 +185 +185 +189 +188 +188 +191 +190 +194 +195 +195 +196 +196 +199 +198 +199 +201 +200 +201 +200 +202 +202 +203 +205 +204 +204 +205 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +202 +202 +202 +201 +200 +200 +201 +200 +198 +198 +196 +197 +196 +194 +195 +191 +190 +191 +188 +188 +185 +185 +185 +182 +182 +179 +179 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +133 +130 +129 +129 +125 +125 +125 +125 +125 +119 +120 +116 +115 +115 +110 +110 +106 +106 +107 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +73 +72 +69 +68 +64 +64 +65 +58 +58 +55 +54 +50 +50 +50 +47 +47 +43 +42 +42 +41 +40 +37 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +26 +21 +21 +19 +19 +17 +17 +17 +15 +15 +14 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +46 +51 +50 +55 +55 +56 +58 +58 +64 +64 +68 +69 +68 +72 +72 +72 +72 +72 +76 +77 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +115 +115 +119 +120 +120 +125 +126 +129 +129 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +184 +184 +189 +188 +188 +191 +191 +194 +194 +194 +196 +196 +198 +198 +198 +200 +201 +201 +201 +200 +203 +203 +204 +205 +204 +205 +204 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +205 +204 +204 +205 +204 +203 +203 +200 +201 +201 +200 +200 +199 +198 +197 +197 +197 +194 +194 +190 +190 +190 +188 +189 +188 +189 +189 +185 +185 +182 +183 +183 +179 +179 +174 +175 +174 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +140 +140 +133 +133 +131 +129 +129 +125 +125 +119 +119 +119 +115 +116 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +89 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +65 +64 +64 +59 +59 +55 +54 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +22 +21 +25 +25 +25 +27 +26 +31 +31 +32 +33 +33 +37 +36 +41 +41 +41 +42 +43 +46 +47 +47 +51 +51 +51 +51 +51 +54 +54 +58 +58 +59 +64 +64 +69 +68 +70 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +100 +106 +105 +110 +110 +110 +115 +115 +120 +119 +125 +126 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +172 +175 +174 +178 +179 +179 +182 +182 +185 +184 +184 +188 +189 +191 +191 +191 +195 +194 +196 +196 +197 +198 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +200 +200 +201 +201 +200 +200 +198 +198 +196 +196 +196 +194 +195 +191 +190 +189 +188 +189 +185 +184 +182 +183 +183 +179 +178 +175 +175 +174 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +130 +125 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +73 +72 +68 +68 +64 +64 +64 +59 +58 +55 +54 +50 +50 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +18 +20 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +51 +51 +52 +54 +54 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +116 +116 +120 +119 +126 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +152 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +184 +185 +189 +189 +191 +191 +194 +195 +194 +196 +196 +198 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +205 +204 +202 +202 +202 +200 +200 +200 +200 +199 +198 +198 +197 +196 +194 +194 +194 +190 +190 +189 +189 +188 +185 +185 +185 +184 +184 +183 +183 +178 +179 +179 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +126 +120 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +59 +54 +55 +51 +51 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +42 +47 +46 +51 +50 +50 +55 +55 +59 +58 +58 +65 +64 +68 +68 +69 +73 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +95 +99 +99 +100 +106 +106 +110 +110 +110 +115 +115 +120 +119 +120 +126 +125 +129 +129 +130 +133 +133 +139 +139 +142 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +183 +182 +184 +185 +185 +188 +188 +190 +191 +191 +194 +194 +197 +197 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +203 +205 +204 +204 +204 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +203 +202 +203 +200 +200 +200 +201 +200 +198 +198 +196 +196 +196 +194 +194 +194 +195 +194 +190 +190 +189 +188 +189 +184 +184 +183 +183 +181 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +134 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +89 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +69 +68 +68 +65 +65 +58 +58 +59 +55 +54 +50 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +12 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +55 +58 +58 +64 +65 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +89 +96 +96 +96 +100 +100 +106 +105 +106 +109 +109 +116 +116 +120 +119 +120 +125 +125 +125 +125 +125 +129 +130 +134 +133 +134 +139 +139 +143 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +185 +189 +188 +191 +191 +191 +195 +195 +196 +196 +199 +199 +198 +201 +201 +201 +201 +201 +202 +202 +202 +202 +203 +205 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +204 +204 +204 +205 +204 +205 +205 +204 +202 +202 +200 +200 +201 +200 +200 +199 +198 +200 +196 +197 +194 +194 +190 +191 +191 +188 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +120 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +51 +50 +55 +55 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +120 +119 +125 +125 +125 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +185 +185 +188 +189 +188 +190 +191 +195 +195 +194 +196 +196 +198 +199 +198 +201 +200 +200 +201 +201 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +196 +196 +194 +195 +194 +190 +190 +188 +188 +189 +184 +184 +182 +183 +179 +178 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +144 +143 +139 +139 +134 +134 +133 +130 +129 +125 +125 +125 +119 +119 +116 +116 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +54 +59 +58 +65 +64 +64 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +176 +174 +179 +179 +179 +183 +182 +183 +183 +182 +184 +185 +189 +188 +188 +190 +190 +194 +194 +195 +197 +197 +198 +198 +200 +201 +201 +201 +200 +202 +202 +203 +204 +204 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +201 +200 +200 +201 +201 +198 +199 +199 +196 +197 +194 +195 +190 +190 +190 +188 +189 +185 +184 +184 +183 +182 +183 +182 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +130 +129 +129 +125 +126 +120 +119 +119 +116 +115 +110 +109 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +55 +54 +54 +51 +50 +47 +47 +46 +43 +43 +43 +43 +42 +40 +41 +36 +37 +36 +33 +32 +31 +31 +29 +27 +27 +25 +25 +20 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +47 +50 +50 +51 +54 +54 +58 +58 +58 +64 +64 +68 +68 +68 +73 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +119 +120 +125 +126 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +180 +183 +183 +185 +185 +188 +189 +188 +190 +190 +194 +194 +194 +196 +196 +196 +197 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +204 +205 +204 +204 +204 +203 +203 +201 +200 +200 +201 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +191 +189 +189 +188 +184 +184 +183 +182 +182 +179 +179 +175 +174 +172 +173 +173 +168 +169 +165 +165 +161 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +125 +126 +120 +120 +115 +116 +115 +110 +110 +106 +106 +105 +100 +100 +96 +95 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +59 +59 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +40 +41 +37 +36 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +25 +24 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +24 +25 +27 +27 +27 +31 +31 +32 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +55 +54 +58 +59 +64 +64 +65 +68 +68 +72 +72 +77 +77 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +99 +100 +106 +105 +110 +110 +110 +115 +116 +120 +119 +125 +126 +126 +129 +129 +133 +133 +133 +139 +139 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +179 +183 +182 +185 +185 +185 +189 +189 +190 +190 +192 +194 +195 +196 +197 +198 +199 +199 +200 +200 +200 +200 +201 +203 +203 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +201 +200 +200 +200 +200 +198 +199 +198 +196 +196 +195 +195 +191 +191 +190 +189 +188 +184 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +126 +120 +120 +115 +116 +116 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +76 +76 +76 +76 +72 +72 +68 +69 +66 +64 +65 +58 +58 +55 +54 +55 +50 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +12 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +26 +25 +24 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +51 +51 +55 +54 +54 +59 +58 +64 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +119 +119 +119 +126 +125 +129 +129 +130 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +168 +173 +173 +173 +175 +175 +178 +179 +182 +183 +183 +185 +184 +188 +189 +188 +191 +190 +194 +194 +195 +197 +196 +198 +198 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +205 +205 +204 +204 +204 +203 +202 +200 +200 +200 +201 +201 +198 +198 +198 +197 +197 +195 +194 +195 +190 +190 +189 +189 +188 +185 +185 +183 +182 +182 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +142 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +115 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +64 +64 +65 +58 +58 +54 +55 +54 +51 +50 +47 +46 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +22 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +20 +20 +21 +21 +21 +26 +25 +27 +27 +27 +31 +31 +33 +33 +38 +36 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +50 +54 +54 +58 +58 +58 +64 +64 +69 +68 +69 +73 +73 +77 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +95 +99 +100 +106 +106 +106 +110 +109 +115 +116 +117 +119 +120 +125 +125 +129 +130 +130 +134 +133 +140 +139 +140 +143 +143 +143 +144 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +163 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +178 +183 +182 +184 +185 +184 +188 +188 +190 +191 +191 +194 +195 +197 +197 +198 +199 +198 +200 +200 +200 +200 +201 +202 +202 +205 +204 +205 +205 +204 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +205 +202 +202 +200 +201 +200 +200 +200 +199 +198 +199 +196 +197 +194 +195 +195 +190 +190 +188 +188 +185 +184 +185 +183 +183 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +148 +144 +143 +143 +139 +139 +133 +134 +133 +130 +130 +129 +129 +130 +125 +125 +120 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +59 +58 +58 +54 +55 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +33 +33 +33 +33 +33 +36 +37 +41 +40 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +58 +58 +59 +65 +65 +68 +69 +68 +73 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +99 +100 +107 +106 +106 +110 +109 +115 +116 +116 +119 +120 +125 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +165 +169 +169 +173 +173 +173 +175 +174 +179 +179 +179 +182 +183 +185 +184 +189 +188 +189 +190 +190 +194 +194 +195 +196 +196 +198 +198 +198 +200 +201 +201 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +207 +207 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +205 +204 +202 +203 +203 +200 +200 +200 +201 +199 +198 +199 +197 +196 +194 +195 +195 +191 +190 +189 +189 +189 +185 +184 +183 +183 +182 +179 +179 +175 +174 +175 +172 +173 +169 +169 +164 +165 +165 +162 +161 +157 +156 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +134 +129 +129 +126 +126 +119 +120 +120 +116 +115 +110 +109 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +54 +51 +51 +47 +47 +47 +43 +42 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +55 +58 +59 +59 +64 +64 +69 +68 +68 +72 +72 +76 +76 +79 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +116 +115 +116 +116 +120 +120 +122 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +160 +161 +165 +165 +169 +169 +172 +172 +173 +175 +175 +179 +178 +179 +182 +182 +185 +185 +184 +188 +188 +191 +191 +190 +195 +195 +196 +196 +196 +198 +198 +200 +200 +201 +201 +201 +202 +202 +204 +205 +204 +204 +205 +206 +206 +207 +206 +207 +207 +206 +206 +207 +206 +206 +207 +207 +207 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +200 +201 +201 +198 +198 +196 +196 +196 +195 +194 +191 +191 +191 +189 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +125 +125 +125 +126 +126 +120 +120 +116 +116 +115 +110 +110 +106 +106 +101 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +83 +82 +76 +77 +72 +72 +72 +69 +68 +65 +64 +65 +58 +58 +55 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +42 +47 +47 +47 +50 +51 +55 +55 +56 +59 +58 +64 +64 +68 +68 +68 +73 +73 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +179 +179 +182 +182 +185 +185 +185 +189 +189 +190 +191 +195 +194 +194 +197 +196 +198 +198 +198 +200 +201 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +207 +207 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +202 +202 +201 +200 +200 +200 +201 +199 +198 +199 +196 +197 +195 +195 +191 +191 +191 +189 +189 +184 +184 +185 +182 +182 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +144 +143 +139 +139 +133 +134 +134 +130 +129 +125 +125 +123 +119 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +65 +59 +59 +58 +54 +54 +55 +54 +55 +51 +50 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +38 +41 +41 +42 +43 +47 +47 +47 +51 +51 +55 +55 +55 +59 +58 +59 +58 +59 +64 +65 +68 +68 +69 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +115 +116 +120 +120 +120 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +185 +189 +189 +190 +190 +191 +194 +194 +196 +196 +196 +198 +199 +200 +200 +200 +200 +201 +203 +202 +205 +205 +205 +205 +205 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +205 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +197 +197 +196 +195 +195 +190 +191 +191 +188 +189 +184 +184 +185 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +134 +133 +133 +130 +130 +125 +125 +125 +119 +119 +116 +115 +116 +110 +109 +106 +105 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +59 +58 +55 +54 +55 +50 +51 +47 +47 +43 +43 +42 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +24 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +42 +43 +47 +47 +51 +51 +51 +54 +54 +58 +59 +64 +65 +64 +69 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +116 +116 +116 +119 +120 +125 +125 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +166 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +184 +189 +189 +190 +191 +191 +195 +195 +197 +197 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +202 +202 +204 +204 +204 +204 +204 +207 +206 +206 +207 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +197 +196 +194 +195 +190 +190 +191 +189 +189 +185 +184 +185 +183 +182 +182 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +120 +115 +115 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +69 +65 +64 +64 +59 +58 +55 +55 +55 +50 +51 +47 +47 +47 +43 +44 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +51 +51 +50 +54 +54 +58 +58 +58 +64 +65 +68 +69 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +134 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +185 +185 +185 +189 +188 +190 +190 +190 +194 +195 +195 +194 +194 +196 +196 +198 +198 +199 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +205 +205 +202 +202 +200 +201 +201 +201 +200 +198 +198 +198 +196 +196 +196 +197 +196 +194 +195 +190 +191 +191 +189 +189 +185 +184 +184 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +130 +129 +125 +125 +120 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +89 +86 +86 +86 +82 +81 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +58 +55 +55 +50 +50 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +32 +33 +33 +37 +36 +41 +41 +41 +42 +43 +47 +46 +47 +50 +50 +54 +55 +55 +59 +59 +64 +64 +68 +69 +68 +72 +73 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +115 +120 +120 +119 +125 +125 +130 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +170 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +188 +189 +189 +190 +190 +195 +195 +195 +196 +197 +198 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +202 +202 +200 +200 +200 +201 +201 +199 +198 +196 +197 +195 +195 +195 +190 +190 +188 +188 +188 +184 +185 +183 +182 +183 +179 +179 +174 +175 +174 +173 +173 +169 +169 +169 +164 +165 +161 +161 +157 +156 +157 +151 +151 +147 +148 +147 +143 +143 +139 +140 +139 +134 +133 +129 +129 +129 +126 +125 +119 +120 +120 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +59 +55 +54 +54 +51 +50 +46 +47 +47 +43 +43 +40 +41 +41 +37 +37 +32 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +20 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +47 +51 +50 +54 +54 +56 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +110 +110 +109 +115 +115 +120 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +160 +165 +165 +169 +169 +169 +173 +172 +175 +175 +175 +178 +179 +183 +182 +182 +185 +185 +189 +189 +188 +190 +190 +195 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +204 +204 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +201 +200 +198 +198 +196 +196 +195 +194 +194 +190 +190 +189 +188 +188 +184 +185 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +59 +55 +55 +55 +50 +51 +47 +47 +46 +42 +43 +40 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +24 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +40 +43 +42 +47 +47 +47 +50 +50 +55 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +85 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +109 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +182 +183 +185 +184 +188 +189 +188 +190 +191 +194 +194 +195 +196 +196 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +205 +204 +204 +203 +203 +202 +200 +200 +200 +200 +198 +198 +198 +197 +196 +194 +195 +195 +191 +190 +188 +188 +188 +184 +185 +182 +182 +183 +179 +178 +175 +174 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +125 +126 +125 +120 +120 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +68 +69 +64 +64 +64 +59 +58 +54 +55 +54 +51 +50 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +77 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +120 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +182 +185 +184 +185 +189 +189 +189 +188 +188 +191 +190 +194 +194 +194 +196 +196 +198 +199 +199 +200 +201 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +201 +200 +199 +199 +198 +196 +196 +194 +194 +195 +191 +191 +189 +188 +185 +184 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +59 +58 +58 +55 +55 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +37 +37 +40 +40 +41 +43 +43 +46 +46 +47 +50 +51 +54 +55 +59 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +110 +110 +110 +115 +115 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +184 +186 +188 +189 +190 +191 +194 +194 +195 +196 +196 +198 +199 +199 +200 +200 +201 +201 +200 +200 +200 +203 +202 +203 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +204 +205 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +198 +198 +198 +197 +196 +194 +194 +194 +191 +190 +188 +188 +188 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +138 +139 +139 +133 +133 +129 +129 +130 +125 +126 +119 +120 +116 +115 +115 +109 +110 +106 +106 +106 +100 +99 +96 +96 +96 +91 +90 +86 +86 +86 +82 +82 +76 +76 +77 +73 +72 +69 +69 +65 +64 +64 +58 +59 +55 +55 +55 +51 +50 +50 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +32 +30 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +18 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +50 +51 +54 +55 +58 +59 +59 +65 +65 +68 +68 +68 +73 +72 +76 +76 +77 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +119 +126 +125 +130 +130 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +182 +184 +184 +188 +188 +188 +191 +191 +191 +191 +190 +194 +194 +197 +196 +197 +198 +199 +200 +200 +200 +201 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +207 +206 +207 +204 +204 +204 +204 +205 +203 +202 +200 +200 +200 +200 +200 +201 +201 +201 +198 +198 +197 +196 +196 +194 +194 +191 +190 +191 +188 +189 +184 +185 +183 +183 +182 +178 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +130 +129 +125 +125 +125 +126 +126 +119 +119 +115 +115 +115 +110 +110 +106 +106 +106 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +73 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +51 +51 +47 +47 +47 +42 +42 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +24 +21 +21 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +26 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +51 +51 +55 +54 +59 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +126 +129 +130 +133 +133 +134 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +188 +190 +191 +191 +194 +195 +196 +196 +197 +198 +198 +200 +201 +200 +200 +201 +203 +203 +203 +204 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +205 +204 +202 +202 +202 +200 +201 +201 +200 +200 +198 +199 +196 +196 +195 +195 +194 +191 +190 +188 +188 +189 +185 +184 +183 +183 +183 +178 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +130 +129 +125 +125 +126 +119 +119 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +73 +69 +69 +68 +64 +64 +64 +64 +64 +58 +58 +59 +55 +55 +54 +54 +55 +50 +50 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +100 +100 +100 +106 +106 +109 +110 +110 +115 +115 +119 +119 +122 +125 +125 +129 +129 +133 +134 +134 +139 +139 +143 +144 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +160 +161 +164 +164 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +184 +189 +189 +188 +190 +191 +194 +194 +195 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +202 +201 +201 +200 +201 +200 +198 +198 +196 +196 +196 +195 +194 +190 +190 +191 +188 +188 +185 +185 +183 +182 +183 +178 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +125 +120 +119 +120 +116 +116 +110 +109 +108 +106 +106 +100 +99 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +83 +77 +76 +72 +72 +73 +68 +68 +64 +64 +59 +58 +59 +55 +54 +50 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +51 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +116 +116 +116 +119 +119 +125 +125 +126 +129 +129 +130 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +189 +189 +190 +191 +190 +194 +195 +196 +196 +197 +198 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +202 +200 +201 +200 +200 +200 +198 +198 +196 +197 +195 +195 +195 +190 +190 +188 +189 +188 +185 +184 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +144 +143 +139 +139 +133 +134 +134 +129 +129 +125 +126 +126 +119 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +74 +72 +72 +68 +68 +64 +65 +64 +58 +59 +54 +54 +54 +50 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +22 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +51 +50 +50 +54 +54 +58 +58 +58 +64 +65 +64 +64 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +95 +96 +96 +100 +99 +106 +106 +106 +109 +109 +110 +110 +110 +115 +115 +120 +119 +119 +125 +126 +129 +130 +132 +133 +133 +139 +139 +142 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +160 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +185 +184 +189 +188 +191 +191 +190 +194 +194 +197 +196 +197 +198 +199 +201 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +207 +206 +204 +204 +205 +204 +204 +202 +203 +203 +200 +200 +200 +201 +198 +198 +199 +196 +196 +195 +195 +195 +190 +191 +188 +188 +188 +185 +185 +183 +183 +183 +178 +179 +174 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +134 +133 +129 +130 +129 +125 +126 +119 +119 +120 +116 +115 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +87 +86 +82 +83 +82 +76 +76 +72 +73 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +40 +41 +43 +43 +43 +47 +47 +47 +47 +47 +50 +50 +54 +54 +54 +59 +58 +64 +64 +66 +68 +68 +73 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +115 +116 +115 +120 +120 +119 +120 +120 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +189 +189 +191 +190 +195 +195 +195 +196 +197 +199 +198 +198 +201 +200 +200 +201 +200 +203 +203 +205 +204 +204 +204 +204 +206 +207 +207 +206 +206 +206 +207 +206 +207 +207 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +201 +200 +200 +200 +198 +198 +199 +196 +196 +194 +194 +190 +190 +190 +189 +188 +185 +185 +185 +183 +183 +182 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +140 +140 +133 +133 +134 +129 +130 +125 +125 +120 +119 +119 +116 +115 +109 +110 +109 +105 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +65 +64 +58 +59 +60 +54 +54 +51 +50 +50 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +50 +50 +54 +54 +59 +59 +59 +65 +64 +65 +64 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +178 +179 +182 +183 +183 +184 +184 +188 +189 +189 +190 +190 +191 +191 +190 +194 +194 +196 +197 +196 +199 +198 +200 +200 +200 +201 +201 +203 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +199 +197 +196 +197 +196 +197 +194 +195 +190 +190 +191 +189 +189 +185 +185 +185 +182 +183 +178 +179 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +156 +157 +151 +151 +147 +147 +146 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +126 +125 +120 +119 +115 +116 +116 +110 +109 +105 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +65 +58 +59 +55 +54 +55 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +47 +47 +47 +50 +51 +54 +54 +55 +58 +58 +64 +64 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +109 +109 +115 +115 +119 +119 +120 +125 +126 +129 +129 +129 +134 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +185 +189 +189 +188 +190 +190 +194 +194 +195 +196 +197 +198 +199 +201 +200 +200 +201 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +207 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +201 +201 +201 +200 +200 +200 +200 +198 +198 +198 +196 +196 +194 +195 +195 +190 +190 +188 +189 +184 +184 +184 +183 +182 +179 +178 +179 +175 +175 +175 +174 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +115 +116 +110 +109 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +69 +65 +64 +58 +58 +55 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +12 +15 +15 +17 +18 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +50 +50 +54 +55 +59 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +109 +115 +115 +119 +119 +120 +125 +125 +129 +130 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +184 +189 +189 +191 +190 +190 +194 +194 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +205 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +199 +199 +199 +196 +197 +194 +195 +194 +190 +191 +188 +188 +189 +184 +184 +184 +185 +185 +183 +182 +178 +179 +179 +175 +175 +172 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +119 +120 +120 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +69 +68 +68 +64 +65 +58 +58 +58 +55 +54 +51 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +39 +41 +40 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +58 +59 +64 +65 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +183 +182 +183 +184 +184 +188 +189 +188 +190 +190 +194 +194 +194 +197 +196 +198 +199 +198 +200 +201 +201 +200 +201 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +204 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +194 +194 +194 +191 +191 +189 +189 +189 +184 +185 +183 +182 +179 +179 +179 +175 +175 +172 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +120 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +64 +59 +58 +55 +54 +55 +51 +50 +47 +47 +47 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +50 +55 +55 +55 +58 +58 +64 +65 +65 +69 +68 +72 +72 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +178 +178 +179 +179 +179 +182 +182 +184 +185 +185 +189 +188 +191 +190 +190 +194 +195 +197 +197 +196 +198 +198 +200 +200 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +200 +200 +201 +200 +200 +200 +201 +199 +198 +199 +196 +197 +194 +194 +191 +190 +191 +189 +188 +184 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +119 +119 +115 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +58 +54 +54 +51 +50 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +51 +50 +54 +55 +54 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +99 +105 +106 +106 +109 +110 +116 +115 +115 +119 +119 +126 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +166 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +182 +183 +185 +184 +185 +188 +188 +190 +191 +195 +194 +194 +196 +196 +198 +198 +198 +200 +201 +201 +200 +200 +200 +201 +202 +203 +203 +204 +204 +204 +204 +205 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +203 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +194 +194 +191 +191 +190 +188 +189 +185 +184 +184 +182 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +126 +126 +120 +120 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +58 +55 +55 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +26 +31 +31 +33 +33 +34 +37 +36 +41 +41 +42 +43 +43 +47 +47 +51 +51 +51 +54 +54 +59 +59 +59 +64 +64 +68 +68 +69 +72 +72 +77 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +109 +110 +110 +115 +115 +119 +120 +119 +126 +125 +130 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +168 +172 +173 +174 +175 +176 +178 +178 +183 +183 +185 +184 +185 +188 +188 +191 +190 +191 +194 +194 +194 +195 +194 +196 +196 +198 +198 +199 +200 +200 +200 +201 +201 +202 +203 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +201 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +191 +191 +188 +188 +189 +185 +184 +182 +182 +178 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +126 +125 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +58 +58 +59 +65 +64 +69 +68 +73 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +182 +182 +183 +182 +183 +184 +185 +188 +189 +189 +190 +190 +194 +194 +195 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +201 +200 +200 +200 +201 +198 +198 +199 +196 +197 +194 +194 +191 +190 +191 +189 +188 +184 +185 +184 +182 +183 +179 +179 +178 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +120 +120 +116 +115 +116 +110 +110 +106 +105 +100 +100 +100 +96 +96 +89 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +72 +69 +68 +65 +64 +65 +58 +58 +55 +55 +51 +51 +51 +47 +47 +47 +47 +47 +43 +43 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +30 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +51 +51 +54 +55 +59 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +109 +110 +116 +116 +120 +120 +119 +125 +126 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +148 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +174 +178 +179 +179 +183 +183 +185 +184 +188 +188 +189 +190 +190 +194 +195 +194 +197 +196 +197 +196 +197 +198 +198 +200 +200 +201 +200 +200 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +201 +200 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +190 +189 +189 +189 +185 +185 +182 +183 +183 +179 +178 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +129 +126 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +58 +58 +58 +54 +54 +50 +51 +50 +46 +47 +43 +43 +42 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +20 +19 +19 +19 +17 +18 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +55 +58 +59 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +116 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +158 +157 +161 +161 +161 +164 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +182 +183 +182 +183 +184 +185 +188 +189 +189 +190 +191 +195 +194 +196 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +203 +202 +202 +200 +200 +200 +200 +201 +198 +199 +197 +196 +196 +194 +195 +191 +190 +188 +189 +189 +185 +185 +182 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +119 +120 +119 +116 +116 +110 +110 +111 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +61 +59 +59 +55 +54 +50 +50 +50 +46 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +59 +58 +58 +65 +64 +68 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +109 +116 +116 +120 +119 +119 +125 +125 +125 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +168 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +183 +185 +185 +189 +188 +190 +191 +191 +195 +194 +197 +196 +196 +198 +199 +200 +200 +200 +201 +201 +202 +203 +203 +204 +205 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +199 +198 +198 +197 +196 +195 +194 +194 +190 +191 +189 +189 +188 +185 +184 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +144 +143 +139 +139 +139 +133 +133 +129 +130 +130 +125 +125 +119 +119 +116 +115 +116 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +54 +54 +54 +51 +51 +46 +46 +47 +43 +42 +40 +41 +38 +36 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +26 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +42 +43 +47 +46 +51 +50 +51 +54 +54 +58 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +119 +119 +126 +125 +130 +129 +130 +133 +133 +140 +139 +143 +143 +143 +148 +147 +151 +150 +151 +157 +157 +157 +157 +157 +161 +160 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +178 +183 +183 +183 +184 +185 +188 +189 +188 +190 +190 +195 +194 +195 +197 +197 +198 +198 +199 +200 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +203 +202 +202 +200 +200 +200 +200 +200 +199 +198 +196 +196 +196 +194 +194 +191 +190 +190 +188 +189 +184 +184 +185 +182 +182 +179 +178 +176 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +130 +129 +125 +125 +120 +119 +119 +115 +115 +115 +115 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +58 +58 +59 +55 +54 +51 +51 +47 +47 +46 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +47 +46 +51 +50 +54 +54 +54 +58 +58 +64 +65 +65 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +105 +109 +110 +115 +115 +118 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +163 +165 +165 +169 +169 +173 +172 +173 +175 +174 +179 +179 +179 +182 +182 +185 +184 +185 +189 +189 +190 +190 +191 +194 +194 +196 +197 +197 +199 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +205 +204 +204 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +190 +188 +189 +185 +184 +184 +183 +182 +179 +179 +179 +174 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +126 +126 +119 +119 +120 +116 +115 +109 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +73 +73 +68 +68 +64 +64 +61 +59 +58 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +58 +64 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +95 +97 +100 +100 +106 +106 +109 +110 +109 +116 +115 +120 +120 +119 +125 +125 +126 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +174 +175 +179 +178 +179 +183 +183 +185 +185 +188 +188 +189 +191 +190 +194 +195 +194 +197 +196 +199 +198 +199 +201 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +205 +205 +205 +204 +203 +203 +200 +201 +201 +201 +201 +199 +198 +197 +197 +196 +194 +195 +191 +191 +191 +189 +189 +185 +185 +185 +183 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +50 +50 +54 +54 +59 +58 +59 +64 +64 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +109 +110 +110 +110 +110 +115 +115 +120 +120 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +178 +178 +179 +183 +183 +184 +184 +185 +188 +188 +191 +190 +191 +195 +194 +197 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +207 +206 +207 +206 +204 +204 +204 +205 +205 +202 +202 +201 +200 +201 +201 +201 +198 +199 +199 +196 +196 +195 +194 +195 +191 +191 +188 +188 +189 +185 +184 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +129 +129 +125 +125 +120 +120 +119 +115 +115 +115 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +91 +90 +89 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +55 +54 +55 +50 +51 +46 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +15 +14 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +32 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +51 +50 +54 +55 +54 +59 +58 +64 +64 +66 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +120 +119 +125 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +164 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +184 +184 +185 +188 +188 +190 +191 +191 +194 +194 +197 +196 +199 +198 +198 +200 +201 +200 +200 +200 +202 +202 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +197 +197 +194 +194 +195 +190 +190 +188 +188 +184 +184 +185 +182 +182 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +130 +129 +129 +130 +129 +125 +125 +119 +120 +120 +115 +115 +110 +109 +106 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +55 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +58 +58 +64 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +116 +115 +120 +119 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +168 +173 +172 +172 +175 +175 +178 +179 +178 +182 +183 +184 +185 +184 +188 +189 +190 +190 +195 +194 +194 +196 +196 +198 +199 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +201 +198 +198 +200 +196 +196 +194 +194 +190 +190 +191 +188 +188 +185 +184 +184 +183 +182 +183 +183 +183 +179 +178 +175 +175 +175 +173 +173 +168 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +123 +120 +119 +116 +115 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +69 +68 +64 +64 +59 +58 +58 +55 +54 +51 +50 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +50 +50 +55 +55 +58 +58 +59 +64 +64 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +120 +120 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +182 +183 +184 +184 +188 +188 +188 +190 +190 +195 +194 +195 +196 +197 +198 +198 +198 +200 +201 +200 +200 +201 +202 +202 +204 +204 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +198 +197 +196 +196 +194 +194 +191 +191 +190 +188 +188 +185 +184 +184 +183 +183 +179 +178 +177 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +137 +133 +133 +129 +130 +125 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +89 +86 +86 +82 +82 +82 +76 +77 +72 +72 +72 +69 +69 +64 +65 +65 +59 +58 +55 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +15 +16 +17 +17 +17 +19 +19 +19 +19 +19 +20 +21 +25 +25 +25 +27 +26 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +51 +50 +51 +54 +54 +59 +59 +59 +64 +64 +68 +68 +71 +73 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +115 +120 +120 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +178 +179 +183 +183 +185 +184 +185 +188 +188 +191 +191 +191 +194 +194 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +204 +204 +204 +205 +204 +202 +202 +200 +200 +200 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +194 +190 +190 +190 +188 +189 +184 +185 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +119 +116 +115 +116 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +26 +31 +31 +33 +33 +33 +37 +37 +37 +37 +36 +41 +41 +43 +43 +43 +47 +46 +50 +50 +53 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +104 +105 +106 +109 +109 +115 +116 +115 +119 +119 +125 +125 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +158 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +179 +179 +183 +183 +184 +185 +184 +189 +189 +191 +191 +194 +194 +194 +196 +196 +198 +199 +198 +200 +200 +201 +200 +200 +200 +200 +202 +202 +203 +204 +205 +205 +205 +205 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +201 +198 +198 +197 +196 +197 +194 +194 +190 +190 +190 +189 +189 +189 +188 +189 +184 +185 +182 +183 +183 +179 +178 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +65 +64 +58 +58 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +36 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +55 +55 +58 +59 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +116 +119 +119 +125 +125 +126 +129 +129 +133 +134 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +171 +173 +173 +175 +175 +178 +179 +182 +183 +183 +185 +185 +188 +188 +189 +190 +190 +194 +195 +194 +197 +196 +199 +198 +198 +201 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +200 +200 +201 +201 +198 +198 +198 +197 +197 +196 +197 +197 +194 +195 +190 +190 +191 +188 +189 +184 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +144 +139 +139 +140 +133 +133 +129 +129 +130 +126 +126 +120 +119 +120 +115 +116 +110 +109 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +55 +54 +51 +50 +51 +46 +46 +43 +42 +41 +41 +41 +37 +37 +33 +34 +33 +31 +30 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +30 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +46 +47 +51 +51 +50 +55 +54 +58 +58 +59 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +89 +96 +96 +100 +99 +100 +106 +106 +110 +110 +109 +116 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +160 +161 +165 +165 +169 +169 +173 +172 +173 +175 +174 +179 +178 +178 +182 +183 +184 +184 +185 +188 +188 +191 +190 +191 +194 +194 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +205 +205 +205 +204 +204 +205 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +201 +200 +200 +200 +201 +200 +200 +199 +199 +198 +196 +197 +195 +195 +193 +191 +191 +189 +189 +184 +184 +185 +183 +183 +178 +179 +178 +175 +174 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +140 +139 +138 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +120 +119 +115 +115 +109 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +69 +64 +64 +58 +59 +55 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +16 +15 +15 +15 +15 +15 +15 +15 +15 +14 +13 +12 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +20 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +50 +51 +51 +55 +55 +59 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +99 +106 +106 +110 +110 +109 +115 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +188 +188 +189 +191 +190 +194 +195 +195 +196 +196 +196 +197 +196 +198 +198 +200 +200 +200 +201 +202 +202 +203 +205 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +204 +205 +204 +204 +203 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +197 +196 +195 +195 +191 +190 +191 +188 +189 +185 +184 +184 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +120 +120 +115 +116 +110 +109 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +58 +54 +54 +50 +50 +50 +47 +46 +43 +43 +43 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +36 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +54 +59 +59 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +120 +125 +126 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +185 +184 +188 +188 +189 +191 +191 +194 +194 +194 +196 +197 +198 +198 +199 +200 +201 +201 +200 +202 +202 +202 +204 +204 +204 +205 +204 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +200 +199 +198 +199 +197 +196 +194 +194 +194 +190 +191 +188 +188 +184 +185 +185 +183 +183 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +134 +129 +129 +126 +126 +125 +120 +119 +115 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +64 +58 +58 +55 +54 +55 +50 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +50 +51 +55 +55 +59 +59 +65 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +115 +115 +120 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +148 +147 +151 +151 +151 +157 +157 +161 +161 +165 +164 +165 +169 +169 +173 +172 +173 +175 +175 +175 +174 +174 +179 +179 +183 +183 +183 +184 +184 +188 +188 +189 +190 +190 +195 +194 +196 +196 +196 +198 +198 +200 +201 +200 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +198 +196 +196 +197 +194 +194 +190 +191 +190 +188 +189 +185 +184 +184 +183 +183 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +164 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +126 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +75 +68 +68 +64 +64 +58 +59 +58 +54 +55 +51 +50 +50 +47 +47 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +12 +15 +15 +17 +17 +19 +19 +19 +21 +20 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +46 +50 +50 +54 +55 +55 +59 +58 +64 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +115 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +156 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +180 +182 +183 +184 +185 +188 +188 +188 +191 +191 +194 +195 +194 +197 +197 +196 +197 +196 +198 +198 +201 +201 +201 +200 +200 +203 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +199 +198 +196 +196 +195 +195 +194 +191 +191 +189 +188 +189 +185 +184 +183 +182 +182 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +126 +125 +126 +119 +120 +116 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +73 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +39 +37 +37 +33 +33 +31 +31 +30 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +47 +46 +51 +51 +51 +51 +51 +55 +54 +59 +58 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +120 +120 +126 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +178 +183 +183 +185 +184 +184 +189 +188 +189 +189 +188 +190 +190 +195 +194 +195 +197 +197 +198 +198 +200 +201 +201 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +204 +204 +205 +204 +204 +202 +202 +202 +201 +201 +200 +200 +200 +198 +198 +197 +197 +197 +195 +195 +190 +190 +191 +189 +189 +184 +185 +183 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +144 +143 +140 +139 +139 +133 +133 +129 +130 +130 +125 +125 +126 +125 +126 +120 +120 +116 +115 +116 +110 +110 +105 +105 +106 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +59 +59 +59 +55 +54 +51 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +12 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +32 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +50 +51 +55 +55 +59 +58 +65 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +99 +100 +106 +106 +110 +110 +116 +115 +116 +120 +119 +125 +125 +125 +129 +129 +130 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +173 +173 +173 +175 +175 +179 +179 +178 +183 +182 +184 +185 +185 +188 +189 +191 +190 +194 +195 +195 +196 +197 +199 +198 +198 +200 +201 +200 +201 +200 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +201 +200 +200 +200 +198 +199 +197 +196 +197 +195 +195 +190 +190 +190 +189 +188 +185 +184 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +120 +115 +116 +116 +110 +109 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +73 +72 +68 +68 +68 +65 +64 +65 +65 +64 +58 +58 +58 +59 +59 +54 +55 +50 +50 +51 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +50 +54 +55 +55 +59 +59 +65 +64 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +99 +106 +106 +109 +110 +110 +116 +115 +119 +119 +120 +125 +125 +130 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +170 +173 +173 +175 +174 +175 +178 +178 +183 +183 +182 +185 +185 +188 +188 +189 +191 +190 +195 +195 +195 +196 +196 +198 +199 +200 +200 +201 +200 +201 +202 +202 +202 +204 +205 +205 +204 +204 +207 +207 +206 +206 +206 +206 +207 +207 +206 +207 +206 +207 +207 +206 +204 +204 +205 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +199 +197 +196 +196 +194 +194 +190 +190 +191 +188 +189 +185 +185 +183 +182 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +129 +130 +126 +125 +125 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +77 +72 +72 +68 +68 +69 +65 +65 +58 +59 +55 +54 +54 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +20 +21 +19 +19 +19 +16 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +46 +51 +51 +51 +54 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +72 +77 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +120 +120 +125 +125 +125 +125 +125 +129 +129 +133 +133 +134 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +179 +182 +183 +185 +185 +188 +188 +188 +191 +191 +194 +195 +194 +196 +196 +199 +198 +199 +200 +200 +201 +200 +200 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +201 +201 +198 +199 +197 +197 +196 +194 +195 +190 +190 +190 +188 +189 +185 +185 +184 +183 +183 +179 +178 +179 +175 +175 +173 +173 +171 +169 +169 +164 +164 +161 +161 +161 +157 +158 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +128 +125 +125 +120 +119 +116 +115 +116 +110 +109 +106 +106 +105 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +80 +76 +76 +72 +73 +69 +68 +68 +64 +64 +59 +58 +59 +55 +54 +50 +51 +51 +47 +46 +43 +43 +43 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +36 +37 +38 +41 +41 +43 +43 +48 +47 +47 +51 +51 +55 +54 +54 +58 +59 +59 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +77 +82 +81 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +105 +106 +105 +110 +109 +116 +115 +116 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +168 +172 +173 +174 +175 +175 +179 +179 +182 +183 +183 +185 +184 +189 +188 +188 +190 +190 +195 +195 +194 +197 +196 +199 +199 +198 +201 +200 +201 +200 +203 +202 +203 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +203 +202 +202 +201 +201 +201 +201 +200 +198 +198 +197 +196 +196 +195 +195 +191 +191 +190 +188 +188 +185 +185 +185 +182 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +140 +139 +133 +133 +133 +129 +129 +126 +125 +125 +120 +119 +120 +119 +120 +116 +115 +110 +109 +110 +106 +106 +100 +100 +98 +96 +95 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +55 +55 +51 +50 +47 +47 +46 +43 +42 +41 +41 +41 +37 +36 +33 +33 +33 +30 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +46 +47 +50 +51 +54 +55 +56 +59 +59 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +105 +106 +105 +110 +110 +116 +115 +116 +120 +119 +126 +126 +126 +130 +130 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +178 +182 +182 +184 +185 +185 +188 +189 +190 +191 +195 +194 +194 +197 +197 +198 +198 +199 +200 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +205 +206 +207 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +201 +200 +201 +199 +198 +199 +196 +196 +195 +195 +191 +191 +191 +189 +188 +184 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +144 +143 +143 +139 +139 +139 +139 +133 +134 +130 +129 +129 +125 +125 +120 +119 +117 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +69 +64 +64 +65 +59 +59 +54 +54 +55 +51 +51 +47 +46 +47 +43 +43 +40 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +15 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +46 +47 +51 +51 +54 +54 +54 +59 +58 +65 +64 +65 +69 +68 +68 +69 +68 +72 +73 +76 +76 +77 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +119 +125 +125 +130 +129 +130 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +160 +165 +165 +170 +169 +169 +173 +173 +174 +175 +176 +179 +179 +183 +183 +185 +185 +184 +188 +189 +190 +190 +190 +194 +195 +196 +196 +197 +198 +199 +200 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +207 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +201 +199 +199 +196 +197 +197 +194 +194 +195 +194 +194 +190 +190 +188 +189 +189 +184 +184 +183 +183 +183 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +130 +129 +129 +126 +126 +120 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +73 +68 +68 +68 +64 +65 +59 +58 +59 +54 +54 +50 +51 +50 +47 +47 +43 +43 +41 +41 +41 +37 +37 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +20 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +46 +50 +50 +51 +55 +55 +59 +59 +62 +65 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +120 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +174 +179 +179 +182 +182 +182 +185 +185 +189 +188 +189 +190 +190 +195 +195 +197 +196 +197 +199 +199 +200 +200 +200 +200 +200 +203 +202 +202 +205 +204 +204 +204 +204 +207 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +197 +196 +197 +194 +194 +190 +191 +191 +189 +188 +185 +185 +184 +183 +183 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +130 +130 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +55 +55 +50 +50 +47 +46 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +30 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +45 +47 +47 +50 +50 +55 +55 +54 +58 +59 +64 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +144 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +168 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +184 +188 +189 +188 +190 +190 +194 +195 +195 +197 +196 +198 +198 +198 +201 +201 +200 +200 +200 +202 +203 +205 +204 +205 +204 +205 +207 +207 +206 +207 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +201 +201 +198 +199 +199 +196 +196 +194 +194 +194 +190 +190 +190 +191 +191 +188 +188 +184 +185 +185 +182 +183 +179 +178 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +130 +130 +125 +125 +120 +120 +119 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +69 +68 +64 +65 +59 +58 +58 +55 +54 +50 +50 +50 +47 +47 +42 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +16 +17 +17 +16 +15 +15 +15 +16 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +20 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +58 +58 +65 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +126 +126 +126 +129 +129 +134 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +172 +175 +175 +178 +179 +179 +183 +182 +185 +185 +184 +188 +189 +190 +191 +190 +194 +195 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +205 +204 +207 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +207 +207 +206 +206 +204 +205 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +200 +200 +201 +199 +198 +197 +197 +196 +195 +194 +191 +191 +189 +188 +189 +184 +185 +182 +183 +182 +178 +179 +174 +175 +175 +172 +172 +169 +169 +169 +165 +164 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +22 +21 +22 +19 +19 +18 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +20 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +47 +50 +50 +54 +54 +58 +58 +58 +64 +64 +69 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +109 +115 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +185 +189 +189 +189 +191 +190 +195 +194 +196 +196 +196 +199 +199 +200 +200 +201 +201 +200 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +207 +206 +207 +206 +206 +206 +207 +207 +207 +207 +207 +206 +206 +206 +206 +204 +204 +204 +205 +204 +204 +204 +203 +202 +202 +201 +200 +200 +200 +201 +199 +199 +196 +196 +194 +195 +194 +190 +190 +189 +189 +189 +185 +184 +183 +183 +182 +178 +179 +175 +174 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +115 +116 +116 +110 +110 +105 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +69 +68 +64 +64 +58 +58 +58 +55 +54 +51 +51 +50 +47 +47 +43 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +24 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +54 +58 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +184 +184 +185 +189 +188 +190 +191 +191 +195 +194 +195 +194 +194 +197 +196 +198 +199 +199 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +198 +198 +196 +196 +194 +195 +194 +191 +191 +188 +188 +189 +184 +185 +183 +183 +179 +178 +179 +175 +175 +173 +174 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +120 +120 +115 +115 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +68 +68 +69 +64 +64 +59 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +55 +54 +59 +59 +58 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +126 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +184 +185 +185 +188 +189 +190 +191 +191 +194 +195 +197 +197 +196 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +201 +200 +200 +199 +198 +196 +197 +197 +195 +195 +190 +190 +188 +189 +188 +184 +185 +182 +183 +183 +179 +179 +175 +175 +175 +172 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +152 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +130 +130 +129 +125 +126 +119 +119 +119 +116 +116 +109 +110 +110 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +55 +50 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +24 +22 +21 +20 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +22 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +42 +43 +47 +47 +50 +51 +54 +54 +54 +59 +58 +65 +64 +64 +69 +68 +72 +73 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +120 +120 +126 +126 +126 +129 +130 +133 +133 +133 +140 +140 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +186 +189 +189 +191 +190 +194 +194 +194 +196 +196 +198 +199 +199 +200 +201 +201 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +203 +201 +200 +200 +200 +198 +198 +199 +197 +196 +194 +194 +195 +191 +190 +188 +188 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +144 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +73 +68 +68 +64 +64 +65 +58 +58 +55 +55 +55 +51 +50 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +35 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +42 +43 +43 +47 +47 +51 +51 +50 +54 +54 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +119 +125 +125 +130 +129 +130 +133 +133 +139 +140 +143 +144 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +184 +185 +184 +189 +188 +190 +190 +190 +194 +194 +194 +194 +195 +197 +196 +198 +198 +199 +201 +200 +200 +201 +201 +202 +203 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +201 +200 +201 +200 +201 +198 +199 +197 +196 +196 +195 +195 +191 +191 +190 +189 +188 +184 +184 +185 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +143 +139 +140 +134 +134 +130 +129 +129 +125 +125 +120 +120 +120 +115 +116 +110 +110 +109 +105 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +64 +64 +65 +58 +59 +54 +55 +54 +51 +50 +47 +47 +45 +43 +43 +41 +41 +36 +37 +36 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +55 +59 +58 +64 +64 +64 +69 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +109 +115 +116 +116 +120 +119 +126 +126 +130 +129 +130 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +183 +183 +182 +184 +184 +189 +188 +189 +190 +190 +194 +194 +196 +196 +197 +198 +199 +200 +201 +200 +200 +200 +202 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +207 +207 +206 +207 +207 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +202 +200 +200 +200 +201 +201 +198 +198 +196 +197 +196 +194 +194 +190 +190 +188 +188 +188 +185 +184 +182 +183 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +134 +133 +134 +133 +129 +129 +126 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +105 +99 +100 +99 +96 +96 +90 +90 +90 +86 +86 +86 +86 +85 +82 +82 +76 +77 +76 +72 +72 +68 +68 +67 +64 +64 +58 +58 +54 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +41 +41 +43 +43 +43 +47 +46 +51 +50 +55 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +109 +110 +116 +116 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +168 +173 +172 +175 +175 +175 +179 +179 +183 +183 +184 +184 +185 +189 +189 +190 +190 +191 +194 +194 +197 +196 +196 +198 +198 +201 +200 +200 +201 +201 +202 +202 +202 +205 +204 +205 +204 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +203 +203 +200 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +190 +190 +190 +190 +189 +189 +185 +185 +184 +183 +183 +178 +179 +178 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +141 +133 +133 +130 +129 +126 +126 +125 +120 +119 +115 +115 +116 +110 +110 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +65 +65 +64 +65 +64 +59 +58 +55 +55 +55 +50 +50 +47 +47 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +20 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +26 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +42 +41 +43 +43 +43 +46 +47 +50 +51 +51 +54 +55 +59 +58 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +99 +100 +106 +106 +106 +110 +109 +116 +115 +117 +119 +120 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +185 +184 +184 +188 +189 +190 +190 +191 +194 +194 +196 +197 +198 +198 +199 +200 +201 +200 +201 +200 +203 +202 +204 +204 +204 +205 +205 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +201 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +191 +188 +189 +184 +185 +185 +183 +182 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +130 +125 +126 +119 +119 +120 +116 +116 +110 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +60 +58 +58 +55 +55 +51 +51 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +73 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +126 +126 +130 +130 +130 +129 +130 +133 +133 +140 +139 +139 +143 +143 +147 +147 +149 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +174 +179 +178 +183 +182 +183 +184 +185 +188 +188 +190 +191 +190 +195 +196 +196 +196 +197 +198 +198 +198 +198 +198 +201 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +201 +201 +201 +199 +198 +196 +197 +196 +194 +194 +191 +190 +190 +188 +189 +185 +185 +185 +183 +183 +178 +179 +178 +175 +174 +173 +172 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +130 +130 +130 +126 +125 +119 +120 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +58 +55 +55 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +46 +51 +51 +55 +55 +55 +58 +59 +65 +65 +64 +69 +68 +72 +72 +72 +76 +76 +83 +82 +82 +86 +85 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +116 +119 +119 +120 +125 +125 +130 +129 +131 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +174 +178 +179 +179 +183 +183 +185 +185 +184 +189 +188 +190 +191 +191 +195 +194 +197 +196 +196 +199 +198 +200 +200 +201 +201 +201 +203 +202 +204 +204 +204 +205 +205 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +201 +200 +200 +200 +200 +198 +199 +198 +196 +196 +194 +194 +191 +190 +189 +189 +189 +184 +184 +183 +182 +183 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +134 +129 +129 +129 +126 +125 +119 +120 +119 +115 +116 +116 +115 +115 +110 +109 +105 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +69 +64 +65 +59 +58 +59 +55 +54 +51 +50 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +34 +34 +33 +37 +37 +41 +41 +41 +43 +42 +47 +46 +47 +51 +51 +54 +54 +54 +59 +58 +64 +64 +66 +69 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +112 +115 +115 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +174 +175 +175 +175 +175 +179 +179 +183 +183 +182 +185 +185 +189 +189 +188 +191 +190 +194 +194 +196 +196 +196 +199 +198 +200 +200 +200 +200 +201 +203 +202 +202 +204 +205 +205 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +202 +200 +200 +200 +201 +201 +198 +199 +197 +197 +197 +194 +195 +190 +190 +188 +189 +189 +185 +185 +183 +183 +183 +179 +179 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +134 +133 +129 +129 +130 +125 +125 +120 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +73 +72 +68 +68 +65 +64 +64 +58 +59 +54 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +37 +37 +41 +41 +40 +42 +43 +46 +47 +46 +51 +50 +55 +54 +59 +59 +59 +64 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +77 +82 +82 +83 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +126 +125 +125 +129 +130 +133 +133 +134 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +185 +185 +189 +189 +188 +190 +190 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +201 +201 +200 +202 +202 +204 +204 +205 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +201 +200 +200 +198 +199 +196 +196 +196 +194 +195 +190 +190 +190 +188 +188 +185 +184 +184 +182 +182 +179 +178 +178 +175 +174 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +126 +126 +126 +119 +120 +115 +116 +116 +110 +110 +106 +105 +106 +100 +101 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +55 +54 +55 +50 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +16 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +55 +54 +54 +55 +55 +59 +58 +65 +64 +65 +68 +68 +72 +72 +74 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +125 +125 +127 +130 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +184 +184 +189 +188 +188 +190 +190 +194 +194 +194 +196 +197 +199 +198 +199 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +205 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +198 +198 +199 +198 +198 +197 +196 +195 +195 +194 +191 +191 +189 +188 +187 +185 +185 +183 +183 +178 +179 +179 +174 +175 +173 +173 +173 +168 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +120 +120 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +59 +58 +59 +54 +54 +51 +51 +47 +46 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +30 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +40 +40 +41 +42 +43 +47 +47 +47 +51 +51 +54 +55 +58 +58 +58 +65 +65 +68 +68 +68 +72 +73 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +104 +105 +106 +109 +110 +115 +116 +116 +119 +120 +126 +125 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +183 +185 +184 +189 +189 +191 +191 +190 +194 +195 +196 +196 +197 +198 +198 +200 +200 +200 +200 +201 +203 +202 +203 +204 +205 +204 +205 +205 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +205 +204 +205 +204 +205 +202 +202 +200 +200 +200 +201 +201 +198 +199 +196 +196 +196 +194 +195 +190 +191 +190 +189 +188 +189 +188 +188 +185 +184 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +129 +125 +126 +125 +120 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +89 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +55 +54 +50 +51 +46 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +55 +55 +59 +58 +64 +64 +65 +69 +69 +72 +72 +75 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +185 +188 +188 +189 +190 +191 +195 +194 +194 +197 +197 +198 +198 +199 +201 +200 +200 +201 +202 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +203 +202 +201 +200 +200 +201 +201 +199 +198 +199 +199 +198 +196 +196 +195 +194 +195 +190 +191 +189 +189 +189 +184 +185 +182 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +126 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +55 +51 +50 +47 +46 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +22 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +109 +115 +116 +115 +119 +120 +126 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +168 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +189 +189 +191 +190 +191 +194 +195 +196 +197 +198 +198 +198 +201 +200 +200 +200 +200 +202 +202 +204 +204 +204 +205 +205 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +203 +203 +202 +202 +200 +201 +200 +200 +200 +198 +199 +196 +196 +197 +194 +195 +191 +190 +188 +189 +189 +184 +184 +182 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +152 +151 +147 +147 +147 +142 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +116 +116 +110 +110 +106 +106 +106 +99 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +59 +58 +58 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +20 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +12 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +32 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +50 +50 +54 +54 +59 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +101 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +174 +174 +179 +179 +183 +182 +183 +185 +185 +189 +189 +191 +191 +191 +195 +195 +196 +197 +196 +198 +198 +198 +198 +199 +200 +200 +200 +200 +201 +202 +204 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +203 +202 +201 +200 +200 +200 +201 +198 +199 +198 +196 +197 +194 +195 +195 +190 +191 +189 +189 +188 +185 +185 +183 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +126 +125 +125 +120 +119 +115 +116 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +55 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +42 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +59 +58 +59 +65 +64 +68 +68 +68 +72 +73 +76 +77 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +119 +120 +120 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +178 +179 +182 +183 +184 +184 +184 +188 +189 +188 +188 +189 +191 +190 +194 +195 +194 +196 +196 +198 +198 +199 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +203 +201 +201 +201 +200 +200 +198 +198 +199 +197 +197 +194 +194 +195 +191 +191 +189 +189 +184 +185 +185 +183 +182 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +156 +157 +151 +151 +147 +147 +144 +143 +143 +139 +140 +133 +133 +134 +129 +129 +125 +125 +126 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +64 +58 +58 +54 +55 +55 +51 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +34 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +22 +25 +25 +25 +26 +27 +31 +32 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +59 +64 +65 +65 +68 +68 +73 +72 +72 +76 +76 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +109 +110 +116 +115 +119 +119 +120 +125 +125 +129 +130 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +162 +161 +161 +165 +165 +169 +169 +169 +173 +172 +173 +173 +173 +175 +176 +179 +179 +179 +182 +182 +184 +185 +185 +189 +189 +190 +190 +194 +195 +195 +196 +197 +198 +199 +198 +200 +201 +201 +201 +200 +200 +200 +202 +203 +203 +204 +204 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +205 +202 +203 +203 +201 +201 +200 +200 +198 +198 +199 +197 +196 +195 +195 +195 +191 +191 +189 +189 +188 +184 +185 +182 +182 +183 +178 +178 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +54 +55 +51 +51 +46 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +32 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +54 +54 +58 +58 +64 +65 +65 +69 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +95 +96 +100 +100 +106 +105 +106 +110 +110 +110 +110 +110 +116 +115 +119 +119 +119 +125 +125 +129 +129 +130 +134 +133 +139 +139 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +170 +173 +173 +175 +175 +179 +179 +179 +183 +182 +183 +183 +182 +185 +185 +185 +185 +185 +188 +188 +191 +190 +191 +194 +195 +197 +197 +198 +198 +198 +201 +200 +200 +200 +200 +203 +203 +204 +204 +204 +205 +204 +207 +206 +206 +206 +206 +206 +207 +207 +207 +206 +207 +206 +206 +207 +206 +204 +204 +205 +204 +204 +205 +204 +203 +202 +202 +200 +200 +201 +200 +200 +199 +199 +197 +196 +196 +194 +194 +190 +190 +188 +189 +188 +185 +184 +182 +183 +182 +179 +178 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +115 +115 +110 +110 +110 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +83 +82 +82 +82 +76 +77 +72 +72 +72 +69 +68 +64 +64 +61 +58 +59 +55 +55 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +16 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +20 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +59 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +109 +115 +115 +120 +119 +120 +126 +125 +130 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +178 +179 +178 +182 +182 +184 +185 +188 +189 +189 +190 +190 +194 +195 +195 +197 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +207 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +199 +197 +196 +196 +195 +194 +190 +191 +190 +189 +189 +185 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +132 +133 +129 +130 +126 +126 +126 +119 +119 +116 +116 +110 +109 +110 +106 +105 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +74 +72 +72 +68 +69 +64 +65 +64 +58 +58 +55 +54 +55 +51 +51 +50 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +55 +58 +59 +58 +59 +59 +64 +64 +68 +68 +68 +73 +72 +77 +76 +77 +82 +83 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +105 +110 +110 +115 +116 +116 +119 +120 +125 +125 +127 +130 +130 +133 +133 +139 +139 +139 +143 +144 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +174 +178 +179 +179 +182 +183 +183 +183 +183 +185 +185 +189 +188 +189 +191 +191 +195 +195 +195 +197 +197 +199 +199 +200 +201 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +205 +205 +205 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +196 +194 +194 +191 +190 +190 +188 +189 +184 +185 +183 +182 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +133 +130 +129 +130 +125 +125 +125 +125 +126 +120 +119 +116 +116 +115 +110 +110 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +81 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +55 +55 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +55 +55 +58 +58 +64 +64 +69 +68 +68 +73 +72 +76 +76 +76 +82 +82 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +115 +116 +120 +120 +119 +125 +125 +125 +129 +130 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +188 +189 +189 +190 +190 +194 +194 +194 +197 +196 +199 +199 +198 +200 +200 +201 +201 +200 +202 +203 +204 +205 +205 +205 +205 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +204 +204 +205 +204 +202 +203 +200 +200 +201 +201 +200 +199 +198 +197 +197 +197 +195 +194 +190 +191 +191 +188 +188 +185 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +127 +125 +125 +119 +120 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +85 +82 +82 +79 +76 +77 +72 +72 +68 +69 +68 +64 +64 +59 +58 +59 +54 +54 +51 +50 +50 +47 +46 +43 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +30 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +12 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +55 +55 +58 +59 +59 +58 +59 +65 +65 +68 +68 +68 +72 +72 +76 +76 +79 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +125 +125 +127 +130 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +178 +183 +182 +185 +185 +185 +189 +191 +191 +190 +190 +194 +194 +194 +195 +194 +197 +197 +199 +199 +200 +201 +201 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +205 +204 +204 +205 +204 +202 +202 +202 +201 +200 +201 +201 +200 +198 +198 +196 +196 +197 +194 +195 +190 +190 +191 +189 +189 +185 +185 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +148 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +130 +126 +126 +119 +120 +120 +115 +115 +109 +110 +107 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +69 +64 +64 +58 +58 +54 +54 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +20 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +12 +15 +15 +17 +16 +17 +19 +19 +21 +21 +26 +25 +24 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +36 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +97 +100 +100 +106 +106 +106 +109 +110 +115 +115 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +133 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +158 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +184 +184 +189 +188 +189 +190 +190 +194 +195 +194 +196 +197 +198 +198 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +205 +204 +204 +204 +203 +202 +200 +201 +201 +200 +200 +199 +199 +197 +196 +196 +194 +195 +190 +191 +190 +189 +189 +189 +189 +188 +185 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +158 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +132 +130 +129 +125 +126 +119 +120 +119 +115 +115 +109 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +59 +54 +55 +51 +50 +50 +46 +46 +42 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +20 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +40 +41 +43 +43 +43 +47 +47 +50 +51 +51 +54 +54 +54 +54 +55 +58 +58 +64 +64 +64 +69 +68 +72 +72 +74 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +116 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +178 +183 +183 +182 +185 +185 +189 +189 +189 +190 +190 +194 +195 +194 +196 +197 +198 +198 +199 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +205 +206 +206 +206 +207 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +197 +196 +194 +194 +191 +190 +191 +189 +189 +185 +185 +183 +182 +183 +178 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +130 +129 +129 +129 +130 +126 +125 +119 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +50 +50 +47 +46 +46 +43 +43 +41 +41 +41 +36 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +38 +41 +41 +43 +43 +43 +47 +46 +51 +51 +54 +55 +54 +58 +59 +64 +64 +64 +68 +69 +72 +73 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +105 +106 +106 +109 +110 +116 +115 +115 +120 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +165 +169 +169 +173 +173 +173 +174 +174 +179 +179 +178 +182 +183 +185 +184 +185 +188 +189 +191 +191 +195 +194 +194 +196 +197 +198 +198 +198 +200 +200 +200 +200 +200 +202 +203 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +200 +201 +199 +198 +199 +196 +197 +194 +195 +194 +190 +191 +189 +188 +188 +184 +184 +184 +185 +184 +183 +182 +179 +179 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +130 +130 +125 +125 +120 +120 +119 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +59 +55 +55 +51 +50 +51 +47 +47 +42 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +36 +40 +40 +43 +42 +47 +46 +47 +51 +50 +54 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +109 +116 +116 +116 +120 +119 +125 +125 +126 +130 +129 +133 +133 +140 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +156 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +183 +183 +183 +185 +185 +188 +188 +189 +191 +191 +194 +194 +195 +197 +197 +198 +198 +199 +200 +201 +200 +200 +201 +202 +202 +205 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +201 +200 +199 +198 +198 +196 +197 +197 +197 +196 +195 +195 +190 +190 +191 +188 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +126 +119 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +65 +59 +58 +54 +55 +55 +51 +51 +46 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +15 +15 +16 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +36 +37 +37 +41 +41 +43 +42 +43 +47 +46 +51 +51 +51 +54 +54 +59 +59 +64 +65 +65 +68 +68 +73 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +116 +116 +115 +119 +119 +125 +126 +126 +130 +129 +133 +134 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +184 +189 +189 +190 +191 +191 +195 +194 +197 +197 +197 +199 +199 +200 +201 +201 +200 +200 +200 +201 +201 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +207 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +204 +205 +202 +202 +203 +200 +200 +200 +200 +199 +198 +199 +197 +197 +194 +194 +194 +190 +191 +189 +188 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +134 +133 +129 +129 +129 +125 +125 +119 +120 +116 +116 +115 +109 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +73 +72 +68 +68 +65 +64 +65 +59 +58 +55 +55 +55 +50 +50 +47 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +26 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +54 +54 +58 +59 +58 +64 +64 +68 +68 +69 +72 +73 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +119 +125 +125 +129 +129 +129 +133 +134 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +160 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +185 +184 +184 +189 +188 +190 +191 +191 +194 +194 +195 +195 +194 +197 +196 +199 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +200 +201 +201 +200 +200 +199 +199 +199 +197 +196 +195 +194 +194 +190 +190 +188 +188 +189 +184 +184 +182 +183 +178 +179 +179 +174 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +125 +126 +120 +119 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +77 +72 +72 +72 +68 +68 +65 +65 +64 +59 +59 +54 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +40 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +14 +13 +12 +12 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +105 +110 +110 +115 +116 +116 +120 +119 +125 +125 +130 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +185 +184 +185 +185 +185 +189 +188 +191 +191 +190 +194 +194 +196 +196 +197 +199 +199 +200 +200 +200 +201 +200 +202 +203 +205 +204 +204 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +207 +204 +204 +204 +205 +204 +202 +202 +202 +201 +201 +201 +200 +201 +198 +199 +197 +197 +197 +194 +194 +191 +190 +189 +189 +189 +185 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +130 +125 +125 +120 +120 +120 +116 +115 +110 +109 +110 +106 +106 +100 +100 +96 +96 +95 +90 +91 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +59 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +22 +21 +20 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +77 +82 +83 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +116 +116 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +184 +189 +188 +190 +190 +192 +194 +195 +196 +196 +198 +199 +198 +200 +200 +200 +201 +201 +202 +202 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +203 +201 +200 +200 +200 +201 +199 +199 +196 +197 +194 +194 +195 +190 +190 +188 +189 +188 +184 +184 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +125 +125 +120 +119 +119 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +55 +54 +55 +50 +51 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +16 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +54 +54 +54 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +106 +106 +106 +109 +110 +116 +115 +116 +119 +120 +125 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +156 +157 +157 +161 +160 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +189 +190 +190 +190 +194 +194 +196 +197 +196 +198 +198 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +203 +203 +200 +200 +201 +201 +201 +198 +198 +197 +196 +196 +194 +195 +190 +191 +190 +189 +189 +184 +185 +185 +182 +182 +179 +178 +179 +174 +175 +172 +173 +170 +169 +169 +166 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +120 +119 +119 +116 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +69 +69 +68 +64 +64 +58 +58 +59 +54 +54 +54 +54 +55 +51 +51 +46 +46 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +22 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +46 +50 +51 +55 +54 +55 +58 +58 +64 +65 +64 +68 +69 +72 +72 +72 +76 +77 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +109 +116 +115 +116 +120 +120 +125 +125 +126 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +179 +178 +183 +183 +185 +184 +184 +189 +189 +189 +189 +189 +190 +191 +194 +195 +195 +197 +197 +198 +199 +199 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +207 +207 +206 +207 +206 +207 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +200 +198 +198 +197 +196 +196 +195 +194 +190 +191 +190 +189 +189 +185 +185 +182 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +130 +130 +126 +125 +119 +119 +119 +116 +115 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +83 +76 +76 +76 +72 +72 +72 +73 +72 +68 +68 +64 +64 +65 +58 +58 +54 +55 +52 +51 +50 +46 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +26 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +51 +51 +54 +54 +55 +59 +59 +64 +65 +69 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +115 +120 +120 +120 +125 +125 +130 +129 +129 +134 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +152 +152 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +179 +179 +182 +183 +183 +185 +184 +188 +188 +189 +190 +190 +195 +195 +196 +196 +196 +198 +199 +200 +200 +200 +200 +200 +203 +203 +202 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +200 +200 +197 +199 +196 +197 +195 +194 +195 +190 +191 +189 +188 +188 +184 +185 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +144 +140 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +119 +120 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +77 +77 +72 +72 +75 +68 +68 +64 +64 +58 +58 +59 +54 +55 +50 +50 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +36 +37 +41 +41 +41 +43 +43 +47 +46 +52 +51 +50 +54 +55 +58 +59 +59 +64 +64 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +110 +109 +110 +116 +116 +120 +119 +120 +125 +125 +129 +130 +130 +133 +133 +140 +140 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +178 +179 +182 +182 +183 +185 +184 +185 +184 +185 +189 +189 +191 +190 +190 +195 +194 +196 +196 +196 +196 +196 +198 +199 +200 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +200 +200 +201 +201 +201 +198 +198 +196 +196 +196 +194 +194 +190 +191 +191 +188 +189 +184 +185 +183 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +140 +140 +133 +133 +129 +129 +129 +126 +125 +125 +125 +125 +119 +119 +115 +116 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +83 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +56 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +55 +55 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +109 +115 +116 +116 +120 +119 +125 +125 +126 +129 +130 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +149 +151 +151 +157 +157 +161 +161 +160 +165 +165 +169 +168 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +183 +184 +185 +188 +189 +190 +190 +191 +195 +194 +196 +196 +196 +198 +198 +200 +200 +200 +201 +200 +202 +203 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +202 +201 +201 +200 +200 +200 +198 +199 +196 +196 +195 +194 +194 +190 +190 +188 +188 +189 +185 +184 +184 +185 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +130 +127 +125 +125 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +99 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +54 +55 +50 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +20 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +37 +41 +41 +43 +43 +48 +47 +46 +51 +51 +54 +54 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +75 +76 +82 +82 +83 +85 +86 +90 +90 +96 +96 +95 +100 +100 +105 +106 +106 +110 +110 +110 +110 +110 +116 +116 +120 +119 +119 +119 +119 +126 +125 +127 +129 +129 +133 +134 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +185 +188 +189 +188 +191 +190 +195 +195 +194 +196 +196 +199 +198 +199 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +202 +202 +202 +200 +201 +200 +200 +201 +198 +198 +199 +199 +199 +196 +197 +195 +194 +194 +191 +191 +188 +188 +188 +184 +185 +183 +183 +179 +179 +179 +175 +175 +174 +173 +173 +169 +169 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +126 +126 +125 +119 +120 +116 +116 +116 +110 +110 +106 +105 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +65 +65 +65 +58 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +50 +50 +55 +55 +58 +58 +59 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +89 +90 +90 +96 +96 +99 +100 +105 +106 +106 +110 +109 +115 +116 +116 +119 +119 +125 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +174 +175 +175 +175 +178 +178 +183 +183 +183 +184 +185 +189 +189 +191 +190 +190 +194 +194 +196 +196 +196 +198 +199 +201 +201 +201 +201 +201 +202 +202 +202 +204 +205 +204 +204 +205 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +201 +201 +200 +201 +200 +199 +199 +196 +197 +194 +194 +194 +191 +190 +189 +189 +189 +184 +184 +185 +184 +184 +183 +182 +178 +179 +178 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +129 +129 +126 +125 +125 +120 +120 +115 +116 +116 +110 +109 +106 +105 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +72 +73 +72 +68 +69 +64 +64 +65 +58 +58 +54 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +51 +55 +55 +58 +58 +58 +64 +64 +65 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +120 +120 +125 +125 +126 +130 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +182 +183 +183 +185 +185 +189 +189 +189 +191 +191 +195 +195 +194 +196 +196 +199 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +205 +205 +205 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +202 +203 +201 +201 +200 +200 +200 +199 +197 +197 +196 +196 +194 +194 +190 +190 +190 +188 +189 +185 +184 +185 +182 +183 +178 +178 +179 +175 +175 +173 +173 +168 +169 +168 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +134 +133 +133 +130 +130 +125 +126 +126 +119 +119 +115 +116 +115 +109 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +69 +68 +68 +68 +68 +64 +64 +58 +58 +58 +55 +54 +51 +51 +51 +46 +46 +43 +42 +41 +41 +41 +36 +37 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +16 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +51 +50 +54 +54 +54 +59 +58 +64 +64 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +119 +119 +119 +125 +126 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +170 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +184 +189 +189 +188 +190 +191 +194 +194 +194 +197 +196 +199 +199 +201 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +203 +202 +200 +200 +200 +200 +200 +200 +201 +199 +198 +199 +197 +197 +195 +195 +193 +191 +190 +188 +188 +184 +185 +185 +183 +182 +179 +178 +178 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +125 +126 +119 +119 +120 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +65 +58 +58 +55 +55 +55 +51 +50 +51 +51 +50 +47 +47 +43 +42 +43 +41 +41 +36 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +22 +20 +21 +19 +18 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +46 +51 +50 +55 +55 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +99 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +119 +125 +126 +129 +129 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +184 +189 +189 +191 +190 +190 +195 +194 +197 +196 +197 +199 +199 +200 +200 +201 +200 +201 +203 +202 +202 +204 +204 +204 +204 +205 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +205 +202 +202 +200 +201 +200 +200 +201 +199 +198 +196 +196 +196 +195 +194 +191 +191 +190 +188 +189 +189 +188 +188 +185 +185 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +134 +133 +129 +129 +125 +126 +125 +119 +120 +115 +116 +116 +110 +110 +106 +106 +106 +101 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +73 +72 +72 +68 +68 +65 +64 +64 +58 +58 +55 +54 +55 +50 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +16 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +36 +41 +41 +41 +42 +43 +47 +46 +47 +50 +50 +54 +55 +55 +58 +58 +64 +64 +64 +68 +68 +73 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +120 +126 +126 +130 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +146 +147 +151 +151 +157 +156 +157 +161 +161 +165 +164 +165 +169 +169 +173 +173 +175 +174 +175 +178 +179 +183 +182 +183 +185 +185 +189 +189 +189 +191 +190 +194 +194 +195 +196 +197 +198 +198 +199 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +201 +200 +200 +200 +200 +198 +199 +196 +197 +196 +194 +195 +190 +191 +189 +188 +189 +185 +184 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +115 +116 +109 +109 +109 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +59 +59 +59 +54 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +50 +54 +55 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +81 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +178 +179 +183 +182 +183 +184 +185 +188 +188 +188 +191 +190 +194 +195 +196 +196 +197 +198 +199 +200 +201 +200 +201 +201 +200 +200 +200 +203 +202 +204 +205 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +204 +204 +203 +202 +203 +200 +200 +200 +200 +198 +198 +199 +196 +197 +194 +194 +195 +190 +190 +188 +188 +188 +185 +185 +183 +182 +182 +178 +179 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +130 +129 +125 +125 +120 +119 +116 +116 +116 +110 +110 +106 +106 +106 +99 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +55 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +18 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +58 +59 +64 +65 +68 +68 +69 +72 +72 +76 +77 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +116 +119 +120 +119 +125 +125 +130 +129 +129 +134 +133 +140 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +189 +191 +191 +190 +190 +191 +194 +195 +196 +197 +196 +199 +198 +200 +200 +201 +200 +200 +202 +202 +205 +205 +204 +205 +204 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +205 +204 +205 +205 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +198 +197 +196 +197 +194 +195 +191 +191 +191 +189 +188 +184 +184 +182 +183 +183 +178 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +120 +116 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +73 +69 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +16 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +51 +55 +54 +59 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +81 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +116 +115 +116 +119 +119 +125 +125 +126 +129 +130 +134 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +178 +179 +182 +183 +183 +185 +185 +189 +189 +189 +191 +191 +194 +195 +196 +197 +196 +198 +198 +200 +200 +200 +200 +201 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +198 +197 +196 +196 +195 +195 +190 +190 +191 +188 +189 +184 +184 +185 +183 +182 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +130 +125 +125 +125 +119 +120 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +16 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +46 +50 +50 +55 +54 +55 +58 +59 +64 +65 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +83 +86 +85 +90 +90 +97 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +115 +115 +119 +119 +125 +125 +126 +129 +130 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +180 +183 +183 +184 +184 +189 +189 +188 +191 +190 +195 +195 +195 +197 +196 +196 +197 +196 +199 +198 +200 +201 +200 +200 +200 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +204 +204 +205 +205 +205 +203 +202 +200 +201 +200 +200 +200 +198 +198 +198 +196 +197 +194 +194 +194 +190 +190 +189 +189 +189 +184 +185 +183 +183 +182 +179 +178 +175 +175 +173 +173 +173 +169 +169 +166 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +126 +125 +125 +120 +120 +116 +116 +115 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +31 +31 +32 +28 +27 +25 +25 +25 +21 +21 +21 +21 +20 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +40 +41 +43 +42 +47 +47 +47 +51 +51 +55 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +126 +125 +126 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +168 +170 +173 +172 +175 +175 +178 +178 +179 +183 +182 +185 +185 +185 +189 +189 +189 +189 +188 +191 +190 +194 +194 +195 +196 +196 +198 +198 +200 +200 +201 +200 +201 +202 +202 +203 +205 +205 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +205 +205 +205 +204 +204 +202 +203 +202 +200 +200 +201 +200 +200 +198 +198 +196 +197 +196 +194 +194 +190 +190 +191 +188 +189 +185 +184 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +140 +133 +133 +130 +129 +130 +125 +126 +120 +120 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +72 +72 +72 +69 +68 +64 +64 +64 +58 +59 +55 +55 +55 +51 +50 +46 +47 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +51 +54 +55 +59 +58 +65 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +175 +175 +175 +178 +179 +182 +183 +182 +184 +185 +188 +189 +190 +190 +191 +195 +194 +196 +196 +196 +198 +199 +201 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +205 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +203 +203 +202 +201 +200 +201 +200 +201 +198 +198 +196 +196 +194 +194 +194 +190 +191 +188 +188 +188 +185 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +129 +125 +125 +119 +120 +120 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +51 +51 +51 +47 +47 +46 +47 +47 +42 +43 +41 +41 +41 +37 +36 +33 +32 +31 +31 +31 +27 +27 +25 +25 +24 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +50 +51 +50 +54 +54 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +105 +106 +109 +110 +110 +115 +115 +116 +116 +116 +120 +119 +125 +126 +125 +129 +130 +133 +133 +132 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +170 +172 +173 +175 +175 +178 +179 +179 +183 +183 +185 +185 +185 +188 +189 +190 +190 +191 +195 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +201 +200 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +190 +189 +188 +188 +184 +185 +183 +182 +183 +178 +179 +174 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +134 +129 +129 +125 +125 +126 +119 +120 +116 +115 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +65 +64 +64 +59 +58 +55 +55 +54 +51 +50 +46 +47 +45 +43 +43 +41 +40 +36 +37 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +36 +36 +41 +41 +43 +43 +43 +46 +46 +50 +51 +51 +55 +54 +58 +58 +58 +64 +64 +69 +68 +67 +72 +72 +77 +76 +83 +81 +82 +86 +86 +90 +90 +90 +96 +96 +99 +99 +100 +105 +106 +110 +110 +110 +115 +115 +119 +119 +120 +126 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +185 +184 +189 +189 +189 +190 +190 +194 +194 +195 +196 +197 +199 +198 +200 +200 +200 +201 +201 +201 +200 +200 +203 +202 +205 +204 +204 +204 +204 +207 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +200 +200 +201 +201 +200 +199 +199 +199 +197 +197 +194 +194 +195 +191 +191 +189 +189 +185 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +152 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +119 +120 +115 +115 +116 +110 +110 +106 +106 +103 +100 +100 +96 +96 +90 +90 +89 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +55 +54 +54 +50 +50 +47 +46 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +19 +18 +19 +17 +16 +15 +15 +15 +15 +16 +13 +13 +13 +12 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +55 +55 +58 +59 +65 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +87 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +119 +120 +120 +126 +125 +130 +129 +130 +133 +133 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +154 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +184 +188 +188 +191 +191 +194 +195 +195 +197 +197 +198 +199 +198 +201 +200 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +207 +206 +207 +207 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +200 +200 +200 +200 +199 +198 +199 +197 +196 +194 +195 +191 +191 +190 +189 +189 +185 +185 +184 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +152 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +134 +129 +129 +126 +126 +125 +119 +120 +116 +115 +113 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +65 +65 +58 +59 +54 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +48 +51 +51 +55 +54 +59 +59 +58 +65 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +120 +119 +120 +126 +125 +129 +129 +130 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +184 +185 +185 +189 +188 +189 +189 +189 +190 +190 +195 +194 +195 +196 +196 +198 +199 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +205 +202 +202 +201 +200 +200 +200 +200 +200 +200 +200 +198 +199 +197 +196 +197 +194 +195 +190 +190 +191 +189 +189 +184 +184 +185 +183 +182 +179 +179 +175 +175 +176 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +129 +129 +129 +125 +125 +125 +125 +125 +119 +120 +115 +116 +116 +109 +109 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +65 +58 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +34 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +55 +56 +59 +58 +64 +65 +68 +68 +68 +72 +72 +77 +76 +76 +83 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +109 +116 +116 +116 +119 +120 +126 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +174 +175 +179 +179 +178 +183 +183 +184 +185 +185 +189 +189 +191 +191 +194 +195 +194 +196 +196 +198 +198 +199 +200 +201 +200 +200 +201 +202 +203 +204 +204 +204 +205 +205 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +201 +200 +198 +199 +199 +196 +197 +195 +194 +190 +191 +190 +189 +189 +185 +184 +184 +183 +183 +183 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +170 +165 +165 +161 +161 +157 +156 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +91 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +71 +68 +68 +65 +64 +58 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +16 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +55 +58 +58 +59 +64 +65 +64 +65 +65 +69 +68 +73 +72 +73 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +105 +110 +110 +116 +116 +116 +119 +119 +125 +126 +126 +130 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +168 +169 +173 +173 +173 +175 +175 +178 +178 +182 +182 +182 +184 +185 +189 +189 +188 +190 +190 +195 +194 +194 +197 +196 +198 +198 +198 +201 +200 +200 +200 +201 +202 +203 +205 +205 +205 +204 +204 +206 +206 +206 +207 +207 +206 +206 +207 +207 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +205 +203 +202 +201 +200 +200 +200 +201 +199 +198 +196 +197 +197 +195 +195 +195 +195 +194 +191 +189 +189 +188 +189 +185 +185 +183 +182 +181 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +146 +147 +143 +143 +140 +139 +139 +133 +134 +129 +130 +129 +125 +126 +119 +120 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +69 +68 +64 +64 +58 +59 +59 +54 +55 +51 +50 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +14 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +15 +15 +16 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +51 +51 +55 +54 +55 +58 +58 +64 +64 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +119 +120 +120 +126 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +150 +151 +157 +157 +157 +161 +161 +165 +165 +169 +170 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +188 +189 +188 +191 +191 +194 +194 +195 +196 +197 +198 +199 +201 +200 +201 +201 +201 +202 +202 +202 +204 +204 +205 +204 +204 +207 +206 +206 +206 +207 +206 +207 +206 +207 +207 +207 +206 +206 +206 +204 +204 +204 +205 +204 +203 +202 +202 +200 +201 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +194 +195 +190 +190 +188 +189 +184 +184 +185 +183 +182 +178 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +156 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +126 +125 +119 +120 +120 +116 +115 +110 +106 +106 +106 +106 +100 +100 +95 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +59 +58 +55 +55 +54 +51 +51 +46 +47 +47 +42 +43 +41 +40 +41 +37 +36 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +40 +41 +43 +43 +43 +47 +47 +50 +50 +54 +54 +55 +59 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +179 +179 +183 +183 +185 +185 +185 +189 +189 +191 +191 +195 +194 +194 +196 +197 +198 +198 +199 +200 +201 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +207 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +197 +196 +197 +195 +194 +191 +191 +190 +189 +188 +185 +185 +185 +182 +182 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +166 +165 +165 +160 +161 +157 +157 +158 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +130 +125 +125 +120 +120 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +73 +72 +69 +69 +65 +64 +64 +58 +59 +54 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +16 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +26 +27 +27 +27 +31 +31 +32 +33 +32 +37 +37 +41 +41 +42 +43 +42 +47 +46 +51 +51 +50 +55 +54 +59 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +88 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +116 +120 +120 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +185 +184 +189 +189 +188 +190 +190 +194 +194 +195 +196 +196 +198 +198 +199 +201 +201 +200 +201 +201 +202 +202 +204 +205 +205 +204 +204 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +201 +201 +200 +201 +198 +198 +198 +196 +197 +195 +194 +194 +190 +191 +191 +190 +190 +188 +189 +185 +184 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +69 +69 +64 +64 +59 +58 +58 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +16 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +30 +31 +33 +33 +32 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +51 +54 +55 +55 +59 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +178 +182 +183 +183 +185 +185 +189 +188 +189 +191 +190 +194 +194 +195 +196 +196 +198 +198 +199 +200 +200 +200 +201 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +207 +205 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +200 +200 +200 +198 +198 +197 +197 +196 +194 +195 +190 +190 +189 +188 +189 +184 +184 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +109 +110 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +58 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +38 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +54 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +110 +110 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +182 +182 +185 +185 +188 +189 +189 +190 +191 +194 +194 +197 +196 +197 +198 +198 +200 +201 +200 +200 +200 +201 +200 +200 +202 +202 +204 +205 +204 +204 +205 +206 +206 +207 +206 +207 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +202 +202 +203 +200 +201 +200 +200 +199 +198 +199 +196 +196 +194 +194 +194 +191 +191 +188 +189 +188 +184 +185 +182 +183 +183 +178 +179 +175 +174 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +59 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +42 +43 +47 +46 +51 +51 +51 +55 +54 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +178 +178 +182 +183 +185 +184 +185 +188 +188 +190 +190 +195 +195 +194 +195 +194 +196 +196 +198 +198 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +203 +202 +200 +201 +200 +201 +200 +199 +198 +198 +197 +197 +195 +194 +195 +190 +190 +188 +189 +189 +184 +185 +183 +183 +179 +178 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +85 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +59 +59 +55 +55 +55 +50 +50 +47 +47 +47 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +55 +54 +58 +59 +59 +64 +64 +68 +68 +73 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +120 +126 +125 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +183 +183 +182 +185 +185 +188 +189 +189 +190 +190 +194 +195 +195 +196 +197 +198 +198 +200 +200 +201 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +201 +200 +200 +200 +201 +199 +198 +198 +199 +198 +196 +196 +194 +194 +194 +191 +190 +189 +189 +188 +184 +185 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +119 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +68 +65 +64 +59 +58 +54 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +189 +188 +191 +191 +191 +194 +195 +196 +197 +196 +198 +198 +199 +198 +198 +200 +201 +200 +200 +201 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +204 +205 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +196 +195 +194 +191 +191 +190 +189 +188 +185 +184 +184 +182 +182 +179 +178 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +134 +129 +129 +125 +125 +120 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +55 +55 +54 +55 +55 +50 +51 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +20 +25 +25 +25 +27 +26 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +51 +51 +54 +54 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +178 +179 +183 +182 +184 +185 +184 +188 +189 +189 +189 +188 +191 +190 +194 +195 +195 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +190 +191 +190 +188 +188 +185 +184 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +156 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +52 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +12 +15 +15 +15 +17 +17 +19 +19 +19 +20 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +46 +47 +46 +50 +51 +55 +55 +54 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +115 +120 +119 +119 +125 +126 +129 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +172 +173 +174 +175 +175 +175 +175 +178 +179 +183 +182 +182 +184 +185 +189 +188 +189 +191 +191 +194 +194 +196 +197 +196 +198 +198 +200 +200 +201 +200 +200 +203 +202 +202 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +204 +202 +202 +203 +200 +201 +200 +201 +200 +199 +199 +196 +196 +195 +195 +195 +191 +190 +188 +189 +188 +184 +184 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +89 +90 +90 +90 +90 +85 +86 +82 +82 +82 +76 +76 +72 +72 +71 +68 +68 +64 +64 +58 +58 +59 +54 +55 +50 +51 +50 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +50 +54 +55 +58 +58 +58 +64 +64 +69 +69 +69 +73 +72 +76 +76 +76 +82 +82 +86 +86 +87 +89 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +115 +115 +115 +120 +120 +125 +125 +126 +129 +129 +133 +133 +132 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +160 +161 +161 +161 +165 +164 +169 +169 +168 +173 +173 +174 +174 +177 +178 +179 +183 +183 +184 +184 +185 +188 +188 +190 +191 +190 +194 +195 +196 +196 +196 +198 +198 +200 +200 +201 +201 +200 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +205 +205 +204 +204 +203 +202 +201 +200 +201 +200 +200 +198 +198 +199 +197 +197 +195 +194 +194 +190 +191 +188 +188 +188 +184 +185 +182 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +130 +130 +125 +125 +125 +120 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +59 +58 +59 +54 +55 +50 +51 +51 +47 +46 +43 +43 +41 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +40 +43 +42 +47 +47 +47 +50 +50 +54 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +105 +110 +110 +110 +115 +115 +119 +120 +122 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +168 +173 +172 +174 +175 +175 +179 +178 +183 +183 +182 +184 +185 +189 +188 +188 +190 +190 +195 +195 +195 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +201 +200 +200 +198 +198 +196 +197 +196 +194 +195 +191 +191 +190 +188 +188 +184 +184 +184 +182 +182 +179 +179 +175 +175 +175 +172 +173 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +120 +116 +115 +116 +110 +110 +106 +105 +106 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +55 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +46 +51 +50 +54 +55 +55 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +81 +82 +86 +86 +90 +91 +90 +96 +96 +100 +99 +102 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +125 +129 +129 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +160 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +183 +183 +184 +185 +188 +188 +191 +191 +190 +194 +194 +196 +197 +197 +198 +198 +200 +201 +200 +200 +200 +203 +202 +202 +204 +205 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +202 +200 +201 +200 +200 +200 +198 +199 +196 +196 +194 +195 +194 +190 +190 +188 +189 +189 +184 +185 +183 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +119 +116 +115 +110 +110 +109 +106 +106 +100 +100 +99 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +54 +50 +51 +46 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +42 +43 +43 +47 +47 +50 +51 +50 +54 +54 +59 +59 +58 +64 +65 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +83 +83 +86 +86 +90 +90 +96 +95 +96 +99 +100 +106 +106 +106 +110 +110 +110 +110 +110 +115 +115 +119 +120 +120 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +175 +178 +179 +179 +183 +182 +184 +184 +184 +188 +188 +191 +191 +190 +195 +194 +196 +196 +196 +198 +198 +200 +200 +201 +200 +201 +202 +202 +205 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +204 +204 +204 +205 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +196 +197 +194 +194 +194 +191 +190 +189 +188 +189 +184 +185 +182 +183 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +142 +139 +139 +133 +133 +130 +129 +129 +125 +125 +120 +120 +120 +115 +115 +116 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +94 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +54 +55 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +32 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +50 +50 +55 +54 +58 +59 +61 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +115 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +160 +165 +165 +169 +169 +168 +173 +173 +174 +175 +175 +179 +178 +183 +183 +182 +185 +184 +189 +188 +188 +190 +191 +195 +194 +197 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +197 +194 +194 +191 +190 +189 +188 +189 +184 +184 +183 +182 +182 +179 +178 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +150 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +130 +129 +130 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +54 +51 +50 +47 +46 +47 +43 +43 +41 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +54 +55 +55 +59 +59 +64 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +119 +119 +119 +125 +125 +129 +130 +130 +133 +133 +139 +139 +143 +144 +143 +147 +147 +151 +151 +150 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +184 +185 +185 +189 +189 +190 +190 +191 +194 +194 +196 +196 +196 +198 +198 +201 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +201 +200 +201 +198 +198 +198 +197 +197 +194 +194 +194 +190 +190 +190 +191 +190 +188 +189 +185 +184 +184 +182 +182 +179 +179 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +137 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +59 +55 +55 +55 +51 +50 +47 +46 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +51 +50 +51 +55 +55 +59 +59 +59 +64 +64 +68 +68 +67 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +178 +183 +182 +185 +184 +185 +189 +188 +190 +190 +191 +195 +195 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +203 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +201 +200 +200 +200 +200 +199 +198 +196 +196 +196 +195 +195 +190 +190 +189 +188 +189 +185 +184 +182 +182 +182 +178 +179 +175 +175 +175 +172 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +126 +120 +120 +115 +115 +116 +109 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +52 +51 +50 +47 +46 +43 +42 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +54 +55 +54 +58 +58 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +116 +119 +120 +126 +125 +125 +129 +129 +134 +134 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +182 +185 +184 +185 +189 +189 +190 +190 +194 +195 +194 +196 +196 +198 +198 +198 +200 +200 +201 +201 +200 +202 +203 +205 +204 +205 +204 +204 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +201 +198 +199 +196 +196 +194 +194 +194 +190 +190 +188 +189 +188 +185 +184 +185 +185 +184 +182 +182 +179 +179 +179 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +130 +129 +126 +125 +119 +120 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +58 +55 +54 +50 +50 +50 +46 +47 +42 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +115 +116 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +183 +182 +182 +185 +184 +189 +189 +188 +190 +190 +195 +194 +194 +196 +196 +199 +198 +198 +200 +201 +200 +200 +201 +202 +203 +205 +204 +205 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +197 +196 +196 +197 +196 +194 +194 +190 +191 +191 +188 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +116 +115 +110 +109 +110 +106 +106 +100 +100 +99 +96 +95 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +58 +59 +58 +54 +55 +51 +50 +51 +47 +47 +43 +42 +41 +42 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +20 +24 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +51 +51 +54 +55 +55 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +182 +183 +184 +185 +188 +189 +188 +191 +190 +194 +194 +195 +196 +196 +199 +198 +200 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +202 +202 +200 +200 +200 +201 +200 +198 +199 +196 +197 +196 +194 +195 +191 +190 +189 +188 +188 +185 +184 +183 +182 +183 +179 +178 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +69 +68 +65 +64 +59 +58 +58 +54 +55 +50 +50 +51 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +46 +47 +50 +50 +55 +55 +54 +58 +59 +64 +64 +64 +68 +68 +72 +73 +72 +76 +77 +82 +82 +82 +86 +85 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +120 +120 +126 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +178 +179 +180 +182 +183 +185 +184 +188 +188 +188 +190 +190 +194 +194 +194 +197 +196 +197 +196 +196 +199 +198 +201 +201 +201 +201 +203 +202 +203 +204 +204 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +205 +203 +202 +203 +201 +201 +200 +200 +200 +200 +200 +199 +198 +198 +196 +197 +194 +194 +195 +191 +190 +188 +189 +189 +184 +185 +182 +183 +179 +179 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +134 +129 +129 +125 +125 +125 +119 +119 +115 +115 +115 +109 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +58 +60 +58 +54 +54 +51 +51 +51 +46 +47 +43 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +22 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +50 +54 +54 +55 +59 +58 +64 +64 +69 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +168 +168 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +178 +182 +182 +184 +184 +184 +189 +188 +190 +191 +191 +195 +194 +196 +196 +198 +198 +199 +201 +201 +201 +200 +201 +202 +202 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +201 +201 +200 +200 +201 +199 +198 +197 +196 +195 +194 +194 +190 +190 +188 +188 +189 +185 +185 +183 +183 +182 +179 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +148 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +120 +120 +119 +115 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +87 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +69 +64 +65 +58 +58 +55 +55 +55 +50 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +16 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +55 +54 +58 +58 +64 +64 +65 +68 +68 +72 +73 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +120 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +178 +179 +183 +183 +185 +185 +185 +188 +188 +191 +190 +191 +194 +194 +194 +194 +195 +196 +196 +198 +198 +199 +200 +200 +200 +201 +201 +202 +203 +205 +204 +204 +204 +204 +206 +206 +207 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +207 +205 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +199 +199 +197 +197 +196 +194 +194 +190 +191 +190 +188 +189 +184 +184 +184 +182 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +156 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +134 +133 +130 +129 +130 +126 +125 +120 +119 +119 +115 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +73 +72 +68 +68 +68 +64 +64 +64 +65 +65 +59 +59 +54 +55 +54 +50 +50 +47 +47 +45 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +22 +21 +25 +25 +25 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +46 +47 +51 +50 +54 +55 +55 +59 +59 +64 +65 +64 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +125 +129 +129 +129 +133 +132 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +183 +183 +183 +185 +185 +189 +188 +189 +190 +190 +194 +195 +195 +197 +197 +198 +199 +200 +201 +200 +200 +200 +202 +202 +202 +204 +204 +204 +205 +205 +207 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +206 +207 +206 +205 +204 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +197 +196 +196 +194 +194 +190 +190 +189 +188 +188 +185 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +134 +133 +133 +133 +129 +129 +125 +126 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +61 +58 +58 +54 +55 +50 +50 +50 +46 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +20 +19 +19 +20 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +46 +47 +51 +50 +55 +55 +55 +58 +59 +64 +64 +64 +69 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +115 +120 +120 +120 +119 +120 +125 +126 +130 +130 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +180 +183 +183 +185 +185 +188 +189 +188 +191 +191 +194 +194 +194 +196 +197 +198 +198 +199 +200 +200 +200 +200 +201 +202 +203 +204 +204 +205 +204 +204 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +203 +200 +201 +200 +200 +200 +199 +198 +196 +197 +196 +194 +195 +191 +190 +190 +188 +189 +185 +185 +185 +183 +183 +178 +179 +179 +175 +174 +173 +173 +169 +169 +169 +164 +165 +160 +161 +161 +157 +156 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +134 +129 +130 +125 +125 +120 +119 +119 +115 +116 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +58 +58 +59 +54 +55 +50 +51 +51 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +14 +15 +15 +13 +12 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +15 +16 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +58 +59 +58 +64 +64 +68 +69 +67 +73 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +109 +116 +115 +120 +119 +120 +125 +125 +129 +129 +133 +134 +133 +139 +140 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +156 +157 +161 +161 +165 +165 +166 +169 +168 +173 +173 +175 +175 +175 +178 +178 +183 +182 +182 +184 +185 +188 +189 +188 +191 +190 +195 +195 +195 +196 +196 +198 +198 +200 +200 +201 +200 +201 +203 +202 +202 +205 +204 +204 +205 +204 +207 +207 +206 +207 +206 +206 +207 +207 +206 +206 +207 +206 +206 +206 +205 +205 +204 +204 +205 +203 +202 +202 +200 +200 +200 +200 +201 +199 +198 +197 +196 +196 +194 +194 +190 +190 +191 +189 +189 +185 +185 +183 +182 +182 +178 +178 +175 +175 +175 +173 +173 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +129 +129 +129 +125 +125 +119 +119 +120 +116 +116 +109 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +59 +58 +58 +54 +54 +50 +50 +51 +46 +47 +43 +43 +43 +40 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +22 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +64 +65 +64 +68 +68 +72 +73 +72 +76 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +100 +105 +106 +109 +109 +115 +115 +115 +119 +119 +125 +125 +125 +129 +129 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +183 +185 +184 +189 +188 +189 +190 +190 +195 +194 +196 +197 +196 +198 +199 +200 +201 +200 +201 +200 +203 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +200 +198 +198 +197 +196 +195 +194 +194 +190 +191 +188 +189 +189 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +126 +122 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +99 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +54 +55 +51 +50 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +42 +43 +43 +47 +47 +50 +50 +51 +55 +55 +58 +59 +59 +64 +64 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +109 +116 +116 +120 +119 +119 +126 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +175 +175 +178 +179 +179 +182 +182 +185 +185 +184 +188 +189 +190 +191 +191 +195 +195 +197 +196 +196 +198 +198 +201 +200 +200 +201 +200 +202 +202 +205 +204 +205 +204 +204 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +201 +200 +200 +201 +200 +198 +198 +199 +196 +196 +195 +194 +194 +190 +190 +189 +188 +188 +185 +185 +182 +182 +182 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +156 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +134 +133 +129 +130 +130 +125 +125 +119 +119 +120 +115 +115 +115 +116 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +83 +82 +82 +76 +77 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +55 +55 +51 +50 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +38 +37 +37 +40 +41 +43 +43 +43 +47 +47 +47 +46 +47 +50 +51 +54 +54 +54 +59 +58 +64 +64 +66 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +115 +115 +115 +119 +119 +125 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +158 +161 +161 +164 +164 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +185 +189 +189 +190 +190 +191 +195 +195 +196 +196 +199 +198 +198 +201 +201 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +207 +207 +204 +204 +204 +205 +205 +202 +203 +200 +201 +200 +200 +200 +199 +198 +199 +196 +196 +194 +194 +195 +190 +191 +188 +189 +185 +184 +184 +183 +183 +179 +179 +178 +175 +175 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +129 +125 +126 +119 +119 +119 +116 +116 +110 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +69 +65 +64 +58 +58 +55 +55 +55 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +18 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +56 +59 +59 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +87 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +109 +115 +116 +116 +120 +120 +126 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +182 +185 +185 +185 +188 +189 +190 +191 +195 +194 +194 +197 +196 +198 +198 +199 +200 +200 +200 +200 +200 +202 +203 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +203 +202 +202 +200 +201 +200 +200 +201 +198 +199 +197 +197 +194 +194 +194 +191 +191 +189 +188 +188 +185 +184 +184 +184 +184 +182 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +160 +161 +161 +157 +157 +157 +157 +157 +151 +152 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +130 +129 +126 +126 +119 +120 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +65 +58 +59 +59 +54 +55 +50 +51 +50 +47 +47 +43 +43 +43 +40 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +39 +41 +41 +43 +43 +48 +47 +47 +50 +50 +51 +50 +51 +54 +55 +54 +54 +54 +58 +58 +64 +65 +64 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +115 +116 +119 +120 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +160 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +185 +188 +188 +188 +190 +190 +195 +195 +194 +197 +196 +198 +198 +199 +200 +201 +200 +200 +203 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +207 +204 +205 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +198 +198 +196 +196 +196 +195 +195 +190 +190 +190 +188 +189 +185 +185 +184 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +125 +120 +119 +115 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +55 +54 +54 +50 +51 +47 +47 +43 +43 +43 +40 +41 +37 +36 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +58 +62 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +83 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +111 +112 +115 +115 +120 +119 +119 +119 +119 +125 +125 +129 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +182 +185 +184 +188 +189 +189 +191 +191 +194 +195 +197 +196 +196 +199 +198 +200 +201 +200 +200 +200 +202 +202 +202 +205 +205 +205 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +201 +198 +198 +197 +196 +196 +194 +195 +190 +190 +190 +189 +189 +184 +184 +185 +183 +183 +182 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +167 +164 +165 +161 +161 +156 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +130 +130 +125 +126 +119 +119 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +69 +65 +64 +65 +58 +58 +54 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +40 +36 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +18 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +51 +51 +54 +55 +58 +58 +59 +64 +64 +69 +69 +69 +72 +72 +76 +75 +76 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +100 +106 +106 +109 +110 +109 +115 +116 +120 +119 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +175 +174 +179 +178 +183 +182 +185 +184 +185 +189 +189 +190 +191 +190 +194 +194 +196 +196 +196 +198 +198 +200 +201 +200 +200 +200 +202 +202 +203 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +203 +204 +204 +203 +202 +201 +201 +201 +201 +201 +198 +198 +199 +196 +196 +195 +195 +194 +191 +190 +191 +190 +191 +188 +188 +185 +185 +185 +183 +183 +179 +179 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +59 +58 +59 +54 +54 +51 +50 +50 +46 +46 +43 +43 +43 +41 +40 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +36 +37 +37 +41 +40 +43 +43 +43 +46 +47 +51 +51 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +110 +115 +116 +120 +119 +120 +126 +125 +129 +129 +133 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +168 +169 +173 +173 +175 +175 +178 +178 +178 +183 +182 +184 +184 +185 +188 +189 +190 +190 +191 +194 +194 +197 +197 +196 +198 +198 +200 +201 +200 +200 +200 +202 +202 +204 +204 +203 +204 +204 +206 +206 +207 +207 +207 +207 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +204 +204 +202 +203 +202 +201 +201 +200 +200 +201 +198 +198 +199 +198 +198 +196 +196 +194 +195 +195 +190 +191 +189 +189 +185 +185 +185 +182 +183 +178 +179 +179 +175 +175 +172 +172 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +65 +58 +58 +55 +55 +55 +50 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +46 +47 +47 +50 +50 +54 +54 +58 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +95 +99 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +164 +165 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +186 +189 +189 +190 +191 +194 +194 +195 +196 +196 +198 +199 +198 +200 +201 +200 +200 +201 +200 +201 +203 +202 +202 +204 +204 +204 +205 +205 +206 +207 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +205 +205 +204 +202 +202 +200 +200 +200 +201 +201 +198 +199 +197 +196 +197 +195 +194 +191 +190 +190 +188 +188 +185 +184 +184 +182 +183 +179 +178 +179 +175 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +126 +119 +119 +120 +116 +116 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +73 +72 +68 +68 +64 +64 +64 +59 +59 +54 +54 +54 +50 +50 +47 +46 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +58 +58 +59 +65 +64 +68 +68 +68 +72 +73 +76 +76 +82 +83 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +120 +119 +126 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +178 +179 +183 +182 +185 +184 +185 +189 +189 +188 +189 +188 +190 +191 +194 +194 +195 +196 +197 +198 +199 +199 +201 +201 +200 +200 +202 +203 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +207 +207 +207 +204 +204 +204 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +199 +197 +197 +195 +195 +195 +191 +191 +189 +189 +187 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +130 +126 +125 +125 +120 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +72 +68 +69 +65 +64 +64 +59 +58 +55 +55 +54 +51 +50 +47 +46 +43 +42 +42 +40 +40 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +24 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +42 +43 +47 +47 +51 +51 +51 +55 +54 +58 +58 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +116 +116 +119 +120 +125 +125 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +152 +151 +157 +157 +161 +160 +166 +165 +165 +169 +169 +173 +173 +173 +175 +174 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +189 +189 +189 +191 +191 +195 +195 +196 +196 +196 +198 +199 +200 +201 +200 +200 +201 +201 +200 +200 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +197 +194 +194 +190 +191 +191 +189 +189 +185 +185 +184 +183 +183 +179 +178 +179 +175 +175 +173 +172 +173 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +69 +69 +65 +64 +59 +58 +58 +55 +55 +50 +51 +50 +47 +47 +46 +47 +47 +43 +42 +40 +41 +41 +37 +36 +33 +32 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +12 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +16 +15 +16 +17 +17 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +87 +87 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +125 +126 +130 +129 +134 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +184 +185 +189 +188 +189 +191 +190 +191 +191 +190 +194 +194 +196 +196 +197 +198 +199 +200 +200 +201 +201 +200 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +204 +205 +204 +204 +205 +202 +202 +200 +200 +201 +200 +200 +199 +199 +198 +197 +197 +195 +194 +195 +191 +191 +189 +189 +188 +185 +184 +182 +183 +179 +179 +178 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +134 +133 +134 +129 +130 +125 +125 +125 +120 +120 +115 +116 +116 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +65 +65 +58 +59 +59 +54 +55 +51 +50 +49 +47 +47 +42 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +46 +46 +50 +50 +51 +55 +54 +58 +59 +58 +64 +64 +68 +68 +71 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +111 +116 +115 +120 +119 +125 +125 +126 +129 +129 +133 +134 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +178 +182 +182 +184 +184 +184 +188 +189 +190 +190 +194 +194 +195 +196 +197 +198 +198 +198 +200 +200 +200 +201 +200 +202 +202 +205 +204 +204 +205 +205 +207 +206 +207 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +205 +204 +204 +205 +204 +202 +202 +201 +201 +200 +200 +200 +199 +198 +199 +196 +197 +195 +194 +190 +190 +191 +188 +188 +185 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +65 +59 +58 +54 +54 +50 +50 +51 +47 +47 +42 +43 +43 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +20 +20 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +18 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +40 +41 +41 +43 +43 +46 +47 +47 +50 +50 +54 +54 +59 +58 +59 +64 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +119 +126 +125 +125 +126 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +184 +185 +184 +189 +188 +190 +191 +190 +194 +194 +196 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +203 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +202 +200 +201 +201 +201 +199 +198 +198 +197 +197 +194 +194 +194 +191 +190 +189 +188 +189 +185 +185 +183 +183 +183 +179 +178 +175 +174 +175 +173 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +130 +125 +126 +119 +119 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +83 +83 +76 +76 +72 +73 +68 +68 +69 +64 +65 +58 +58 +59 +54 +55 +55 +54 +55 +51 +51 +47 +47 +46 +43 +42 +41 +41 +39 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +27 +27 +31 +31 +31 +33 +33 +36 +37 +41 +41 +41 +42 +43 +46 +47 +47 +51 +51 +55 +55 +54 +58 +58 +65 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +116 +115 +119 +119 +126 +125 +125 +129 +129 +133 +134 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +158 +157 +161 +160 +162 +165 +165 +169 +169 +170 +172 +174 +175 +175 +178 +179 +179 +183 +183 +185 +185 +184 +188 +189 +190 +191 +191 +195 +195 +196 +196 +197 +198 +198 +200 +201 +201 +200 +201 +202 +202 +204 +205 +204 +204 +204 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +204 +205 +205 +205 +203 +202 +200 +201 +201 +200 +200 +198 +199 +198 +196 +196 +195 +194 +195 +191 +191 +189 +189 +189 +185 +185 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +130 +126 +125 +125 +119 +119 +120 +120 +120 +115 +116 +110 +110 +110 +105 +106 +100 +100 +98 +96 +95 +90 +90 +86 +86 +86 +82 +83 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +55 +55 +52 +51 +51 +46 +46 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +16 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +55 +58 +59 +65 +64 +69 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +109 +110 +115 +116 +119 +119 +119 +125 +125 +130 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +174 +175 +179 +179 +179 +182 +183 +184 +185 +184 +189 +189 +190 +190 +194 +194 +195 +196 +197 +198 +198 +199 +200 +200 +200 +201 +200 +200 +200 +203 +202 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +200 +201 +200 +198 +198 +196 +197 +197 +195 +195 +191 +190 +190 +189 +189 +185 +185 +184 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +152 +147 +147 +147 +147 +148 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +119 +115 +115 +115 +110 +110 +105 +105 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +69 +69 +64 +64 +59 +58 +58 +55 +55 +51 +51 +50 +46 +47 +43 +43 +43 +41 +40 +36 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +55 +55 +58 +58 +58 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +79 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +175 +175 +175 +178 +182 +182 +183 +183 +185 +185 +188 +189 +188 +190 +191 +195 +195 +195 +196 +197 +198 +198 +199 +201 +200 +200 +201 +202 +202 +202 +204 +204 +205 +204 +204 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +205 +204 +205 +205 +203 +203 +203 +200 +200 +200 +200 +200 +198 +200 +196 +196 +196 +195 +194 +190 +191 +190 +189 +189 +185 +184 +185 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +143 +140 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +119 +116 +116 +116 +115 +116 +109 +110 +106 +106 +106 +99 +100 +96 +96 +93 +90 +90 +86 +86 +83 +82 +82 +77 +76 +72 +73 +73 +68 +68 +64 +65 +64 +58 +58 +54 +54 +55 +51 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +61 +65 +64 +68 +68 +72 +72 +73 +77 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +109 +110 +110 +115 +116 +120 +119 +120 +125 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +184 +184 +188 +189 +191 +190 +194 +194 +195 +197 +196 +198 +198 +198 +201 +201 +201 +201 +200 +202 +202 +205 +204 +204 +205 +204 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +202 +201 +200 +201 +200 +200 +198 +198 +200 +197 +197 +195 +194 +190 +190 +191 +189 +189 +185 +185 +184 +183 +182 +183 +183 +182 +179 +179 +174 +175 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +144 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +123 +120 +119 +115 +116 +109 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +69 +68 +68 +65 +64 +59 +59 +58 +55 +55 +50 +51 +50 +46 +46 +43 +43 +43 +40 +41 +37 +37 +38 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +46 +51 +50 +50 +54 +55 +58 +59 +59 +64 +65 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +99 +100 +106 +106 +106 +110 +109 +116 +115 +116 +119 +120 +125 +125 +126 +129 +130 +133 +133 +139 +139 +139 +144 +143 +147 +148 +147 +150 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +174 +175 +179 +178 +183 +183 +183 +185 +184 +188 +188 +188 +190 +191 +195 +194 +195 +196 +196 +198 +198 +198 +201 +200 +200 +201 +201 +202 +202 +205 +204 +205 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +195 +194 +194 +194 +194 +190 +190 +188 +188 +188 +184 +184 +183 +182 +181 +178 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +148 +148 +143 +143 +141 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +115 +115 +110 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +55 +50 +50 +51 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +34 +33 +31 +31 +27 +27 +27 +25 +25 +21 +22 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +47 +47 +47 +50 +50 +54 +55 +55 +58 +58 +64 +64 +68 +68 +68 +72 +72 +77 +76 +76 +82 +83 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +115 +119 +119 +119 +126 +126 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +183 +185 +185 +189 +188 +188 +191 +190 +194 +195 +195 +196 +196 +199 +199 +201 +201 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +204 +204 +205 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +200 +201 +198 +199 +198 +196 +196 +194 +194 +193 +190 +191 +188 +188 +184 +185 +185 +183 +183 +179 +179 +178 +175 +175 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +129 +125 +125 +119 +119 +120 +115 +115 +110 +109 +107 +106 +106 +101 +100 +96 +96 +96 +89 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +69 +68 +69 +64 +64 +58 +58 +55 +55 +54 +50 +50 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +48 +50 +50 +55 +54 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +77 +76 +82 +82 +86 +86 +87 +89 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +119 +125 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +149 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +183 +184 +184 +188 +189 +191 +190 +191 +195 +195 +197 +196 +196 +198 +198 +200 +201 +200 +200 +200 +202 +202 +203 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +203 +200 +200 +200 +201 +200 +199 +199 +196 +196 +197 +194 +194 +190 +190 +191 +189 +189 +189 +188 +189 +185 +184 +183 +183 +182 +179 +179 +175 +175 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +125 +125 +126 +120 +119 +115 +115 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +58 +59 +58 +55 +54 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +32 +33 +33 +38 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +54 +59 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +115 +119 +119 +125 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +172 +173 +175 +175 +175 +179 +178 +183 +182 +183 +184 +185 +189 +188 +188 +190 +190 +195 +194 +194 +196 +197 +198 +199 +199 +200 +200 +200 +200 +202 +202 +203 +204 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +203 +203 +200 +201 +200 +200 +201 +201 +200 +200 +198 +199 +197 +196 +196 +194 +194 +191 +191 +189 +188 +189 +185 +185 +183 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +59 +58 +59 +55 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +30 +31 +26 +27 +27 +25 +26 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +50 +50 +55 +54 +58 +59 +58 +65 +64 +68 +68 +69 +72 +72 +77 +76 +77 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +178 +179 +183 +182 +183 +184 +185 +188 +188 +189 +191 +190 +194 +194 +196 +196 +197 +199 +198 +200 +201 +201 +200 +201 +200 +200 +200 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +198 +198 +198 +196 +196 +194 +195 +194 +191 +191 +188 +188 +188 +185 +184 +182 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +144 +143 +140 +140 +140 +134 +133 +129 +129 +130 +125 +126 +119 +119 +115 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +55 +55 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +40 +37 +36 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +28 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +47 +47 +47 +50 +51 +54 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +77 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +116 +116 +119 +120 +125 +125 +125 +129 +130 +133 +134 +133 +139 +139 +143 +143 +148 +146 +147 +151 +151 +157 +156 +157 +161 +161 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +184 +185 +184 +189 +189 +190 +190 +191 +194 +195 +196 +196 +196 +199 +199 +201 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +205 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +207 +206 +205 +205 +204 +204 +204 +203 +202 +200 +200 +201 +200 +200 +198 +198 +196 +197 +196 +195 +194 +191 +191 +190 +188 +189 +184 +184 +184 +182 +182 +179 +179 +179 +174 +175 +173 +172 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +134 +133 +130 +129 +129 +125 +125 +119 +120 +119 +116 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +58 +59 +58 +55 +54 +50 +51 +51 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +50 +51 +51 +55 +54 +58 +58 +59 +64 +65 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +115 +119 +120 +126 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +178 +179 +183 +183 +184 +185 +184 +188 +189 +190 +190 +191 +194 +194 +196 +196 +196 +199 +199 +200 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +201 +198 +199 +198 +196 +196 +195 +194 +195 +191 +190 +188 +188 +184 +184 +185 +183 +182 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +134 +134 +129 +130 +125 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +73 +68 +69 +64 +65 +65 +58 +59 +55 +54 +55 +51 +50 +46 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +16 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +50 +50 +51 +55 +55 +58 +59 +65 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +116 +116 +115 +120 +119 +125 +125 +125 +129 +130 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +184 +184 +186 +188 +189 +190 +190 +194 +195 +195 +196 +196 +198 +198 +199 +200 +201 +201 +200 +200 +200 +200 +202 +202 +203 +204 +204 +205 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +205 +204 +205 +202 +202 +203 +200 +201 +201 +201 +199 +199 +198 +196 +197 +194 +195 +195 +190 +190 +188 +189 +188 +185 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +156 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +120 +116 +115 +116 +110 +110 +106 +105 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +59 +59 +54 +55 +55 +51 +51 +47 +47 +47 +42 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +12 +12 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +110 +110 +110 +115 +115 +120 +120 +120 +126 +125 +130 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +182 +183 +183 +184 +184 +188 +189 +188 +190 +191 +190 +191 +190 +195 +194 +197 +196 +197 +198 +199 +200 +200 +200 +201 +201 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +202 +202 +203 +201 +200 +200 +200 +200 +198 +199 +197 +197 +196 +194 +194 +191 +190 +191 +188 +189 +184 +184 +183 +183 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +146 +143 +144 +140 +139 +139 +133 +133 +129 +129 +129 +125 +126 +119 +119 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +77 +72 +72 +69 +68 +68 +65 +64 +58 +58 +59 +54 +55 +50 +51 +48 +46 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +20 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +15 +15 +17 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +55 +59 +59 +58 +64 +64 +69 +68 +73 +72 +72 +76 +77 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +109 +110 +115 +116 +119 +119 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +178 +179 +178 +183 +182 +184 +184 +185 +189 +188 +191 +190 +192 +194 +195 +196 +197 +198 +198 +198 +200 +200 +201 +200 +200 +202 +202 +205 +204 +205 +204 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +201 +200 +200 +201 +198 +198 +198 +196 +196 +195 +194 +191 +190 +190 +188 +188 +184 +184 +184 +182 +183 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +160 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +130 +129 +125 +125 +126 +120 +120 +116 +115 +116 +110 +109 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +61 +58 +59 +54 +55 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +40 +41 +43 +43 +47 +47 +46 +50 +50 +54 +54 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +110 +110 +109 +116 +115 +119 +119 +119 +125 +125 +126 +125 +125 +129 +130 +134 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +169 +169 +169 +173 +172 +175 +175 +175 +179 +178 +182 +182 +184 +185 +185 +188 +188 +194 +194 +194 +196 +197 +196 +197 +196 +198 +198 +200 +201 +200 +200 +200 +203 +202 +203 +204 +205 +204 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +203 +203 +200 +201 +201 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +190 +189 +188 +189 +184 +185 +183 +182 +182 +179 +178 +175 +175 +175 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +130 +125 +125 +119 +119 +115 +115 +115 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +69 +69 +65 +64 +59 +58 +58 +55 +55 +54 +54 +54 +51 +51 +47 +46 +47 +43 +43 +41 +40 +39 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +18 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +59 +59 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +125 +127 +129 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +171 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +185 +185 +188 +188 +190 +190 +191 +194 +194 +197 +197 +196 +199 +199 +200 +200 +201 +201 +200 +202 +203 +205 +205 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +201 +198 +198 +198 +196 +196 +194 +195 +194 +190 +191 +189 +189 +188 +184 +185 +183 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +144 +143 +139 +139 +133 +133 +133 +129 +129 +126 +126 +126 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +68 +68 +68 +64 +65 +59 +58 +58 +55 +54 +50 +50 +48 +47 +47 +43 +43 +41 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +58 +58 +59 +64 +65 +68 +69 +72 +73 +72 +76 +77 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +115 +115 +119 +120 +120 +125 +125 +130 +129 +129 +133 +133 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +174 +175 +179 +179 +179 +183 +183 +184 +184 +185 +189 +189 +190 +190 +193 +194 +194 +196 +196 +199 +199 +199 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +207 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +199 +198 +198 +196 +197 +195 +194 +191 +190 +190 +189 +188 +184 +185 +185 +183 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +156 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +139 +139 +139 +133 +134 +129 +130 +130 +125 +126 +119 +119 +118 +116 +115 +110 +109 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +69 +68 +68 +64 +64 +58 +58 +59 +54 +54 +50 +50 +50 +46 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +20 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +55 +55 +54 +58 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +87 +86 +90 +90 +90 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +116 +115 +120 +119 +119 +120 +120 +125 +126 +129 +130 +129 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +170 +173 +173 +175 +175 +175 +179 +179 +183 +183 +185 +185 +184 +189 +188 +191 +191 +191 +195 +194 +197 +197 +196 +198 +198 +200 +200 +201 +201 +200 +202 +203 +202 +204 +205 +204 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +204 +205 +204 +204 +204 +202 +203 +203 +201 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +191 +189 +188 +188 +185 +185 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +168 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +125 +119 +119 +119 +115 +116 +109 +110 +110 +106 +106 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +83 +83 +76 +76 +72 +72 +72 +68 +68 +65 +65 +64 +58 +59 +54 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +20 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +58 +59 +58 +64 +64 +68 +68 +69 +72 +73 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +105 +106 +106 +109 +109 +116 +115 +119 +120 +119 +125 +125 +129 +130 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +162 +165 +165 +168 +169 +169 +173 +172 +175 +175 +175 +179 +178 +183 +183 +183 +185 +184 +189 +189 +188 +191 +191 +194 +194 +195 +196 +197 +198 +199 +200 +201 +200 +200 +200 +202 +202 +202 +204 +204 +205 +205 +205 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +202 +201 +200 +201 +200 +200 +198 +198 +196 +197 +196 +194 +195 +191 +191 +189 +189 +185 +185 +182 +182 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +130 +125 +125 +126 +126 +126 +119 +120 +116 +115 +116 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +65 +65 +59 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +37 +36 +37 +40 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +116 +115 +115 +119 +120 +126 +125 +125 +130 +129 +133 +133 +133 +139 +140 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +185 +189 +189 +191 +191 +195 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +201 +201 +201 +200 +199 +198 +200 +197 +197 +194 +194 +190 +190 +190 +189 +188 +185 +185 +185 +182 +182 +183 +183 +183 +179 +179 +174 +175 +175 +173 +172 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +148 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +126 +126 +119 +120 +115 +115 +115 +110 +110 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +59 +54 +54 +50 +51 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +51 +50 +50 +54 +54 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +116 +120 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +172 +173 +175 +175 +178 +179 +179 +183 +183 +185 +185 +184 +188 +188 +190 +190 +191 +195 +195 +197 +196 +197 +198 +199 +200 +200 +201 +200 +201 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +205 +204 +202 +202 +200 +200 +200 +201 +200 +200 +201 +200 +198 +198 +197 +196 +196 +195 +195 +191 +191 +189 +189 +189 +184 +185 +182 +183 +182 +179 +179 +179 +179 +178 +175 +175 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +130 +129 +125 +125 +120 +119 +120 +115 +115 +110 +109 +106 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +73 +68 +68 +68 +64 +64 +58 +59 +54 +54 +55 +51 +50 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +16 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +51 +51 +50 +55 +55 +58 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +99 +100 +100 +106 +105 +109 +110 +110 +116 +116 +120 +119 +119 +125 +124 +129 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +178 +179 +183 +183 +184 +184 +189 +189 +188 +190 +191 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +205 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +201 +201 +200 +200 +200 +198 +198 +198 +196 +197 +194 +194 +194 +191 +190 +190 +191 +190 +188 +188 +185 +184 +185 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +77 +72 +72 +68 +69 +68 +64 +65 +59 +59 +59 +54 +54 +51 +50 +50 +47 +47 +42 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +22 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +47 +47 +50 +50 +50 +54 +54 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +78 +81 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +100 +106 +105 +110 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +179 +179 +178 +182 +183 +184 +184 +185 +189 +188 +188 +188 +189 +190 +191 +195 +194 +194 +197 +196 +199 +198 +198 +200 +201 +201 +200 +203 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +205 +204 +202 +202 +202 +200 +200 +200 +200 +201 +200 +201 +199 +199 +198 +197 +197 +194 +195 +191 +190 +191 +189 +188 +184 +184 +184 +183 +182 +179 +178 +178 +174 +175 +173 +173 +172 +168 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +120 +116 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +81 +76 +76 +72 +73 +72 +68 +68 +64 +64 +64 +58 +58 +55 +54 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +54 +54 +55 +59 +58 +65 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +89 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +152 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +184 +185 +185 +189 +188 +190 +191 +195 +195 +194 +197 +197 +196 +197 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +205 +203 +203 +200 +201 +201 +201 +200 +199 +199 +196 +196 +196 +194 +194 +191 +190 +190 +189 +188 +185 +184 +184 +182 +182 +179 +178 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +126 +119 +119 +119 +115 +115 +110 +109 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +65 +59 +59 +59 +54 +54 +50 +50 +50 +47 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +42 +43 +46 +47 +50 +51 +51 +55 +55 +59 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +184 +184 +189 +189 +188 +190 +190 +190 +190 +190 +194 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +205 +205 +205 +204 +202 +202 +203 +201 +201 +200 +200 +200 +199 +199 +197 +197 +196 +194 +194 +190 +191 +190 +188 +188 +185 +185 +182 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +126 +125 +120 +120 +120 +116 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +69 +64 +64 +58 +58 +58 +55 +55 +50 +51 +49 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +47 +51 +50 +54 +54 +55 +58 +59 +65 +64 +69 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +120 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +174 +179 +179 +178 +179 +179 +183 +183 +185 +185 +185 +189 +189 +191 +191 +192 +195 +194 +197 +197 +198 +198 +199 +201 +200 +201 +201 +201 +202 +202 +203 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +201 +198 +199 +196 +197 +195 +194 +194 +190 +191 +188 +188 +188 +184 +184 +182 +182 +182 +179 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +116 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +65 +65 +59 +58 +58 +55 +54 +51 +51 +50 +46 +46 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +42 +47 +46 +47 +50 +51 +54 +55 +55 +59 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +109 +109 +115 +115 +115 +119 +120 +125 +126 +126 +129 +129 +133 +133 +134 +140 +140 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +176 +178 +178 +183 +182 +184 +184 +184 +189 +188 +191 +190 +190 +194 +195 +194 +195 +194 +196 +197 +198 +198 +198 +201 +201 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +198 +198 +196 +196 +196 +195 +195 +190 +190 +191 +188 +189 +184 +184 +185 +182 +183 +179 +178 +175 +174 +175 +173 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +130 +129 +129 +125 +125 +119 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +69 +68 +64 +64 +59 +59 +59 +54 +54 +50 +50 +51 +47 +47 +43 +43 +42 +41 +41 +37 +36 +33 +32 +33 +31 +31 +31 +31 +31 +27 +26 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +31 +31 +33 +33 +38 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +58 +59 +58 +65 +64 +68 +68 +69 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +115 +119 +120 +120 +126 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +185 +184 +184 +185 +185 +189 +188 +191 +191 +191 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +201 +200 +203 +202 +204 +204 +204 +205 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +204 +203 +203 +200 +200 +200 +201 +200 +199 +199 +199 +196 +196 +195 +195 +194 +190 +190 +188 +188 +185 +184 +185 +183 +183 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +126 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +83 +82 +76 +76 +76 +76 +76 +73 +72 +68 +68 +68 +65 +65 +59 +58 +56 +55 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +64 +65 +65 +68 +68 +73 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +125 +125 +130 +129 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +184 +188 +189 +188 +190 +190 +194 +195 +194 +197 +196 +199 +198 +199 +200 +200 +200 +200 +200 +202 +202 +204 +205 +205 +204 +205 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +203 +202 +201 +200 +201 +201 +200 +199 +199 +197 +196 +197 +195 +195 +190 +190 +190 +189 +188 +185 +185 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +148 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +126 +120 +119 +116 +116 +110 +110 +109 +105 +106 +100 +100 +100 +96 +96 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +65 +64 +58 +59 +54 +54 +54 +50 +50 +51 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +48 +46 +47 +50 +51 +55 +54 +55 +58 +58 +64 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +94 +96 +99 +99 +106 +106 +106 +110 +109 +110 +109 +109 +116 +116 +120 +119 +119 +125 +125 +130 +130 +130 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +160 +161 +164 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +182 +183 +184 +184 +189 +189 +189 +191 +191 +195 +194 +194 +196 +197 +198 +198 +199 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +203 +203 +203 +200 +200 +200 +201 +200 +198 +198 +197 +196 +196 +194 +194 +190 +190 +190 +189 +188 +184 +185 +185 +183 +182 +179 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +119 +119 +116 +116 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +69 +64 +65 +59 +58 +59 +55 +54 +51 +50 +47 +47 +47 +43 +43 +41 +40 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +16 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +32 +37 +37 +37 +41 +41 +42 +43 +43 +46 +46 +50 +50 +50 +54 +54 +59 +59 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +100 +106 +106 +110 +110 +112 +116 +116 +120 +119 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +184 +185 +189 +189 +189 +190 +191 +195 +195 +196 +196 +197 +199 +198 +200 +201 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +207 +206 +207 +207 +206 +206 +207 +207 +204 +204 +205 +205 +204 +202 +203 +202 +200 +201 +201 +201 +200 +199 +198 +197 +197 +196 +194 +195 +191 +191 +189 +189 +189 +184 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +140 +133 +133 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +113 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +66 +64 +64 +59 +59 +54 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +46 +47 +51 +51 +54 +54 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +120 +120 +120 +120 +120 +125 +125 +129 +129 +129 +134 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +182 +184 +185 +184 +189 +188 +190 +191 +190 +194 +194 +197 +197 +196 +198 +198 +201 +200 +201 +200 +200 +202 +202 +202 +204 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +201 +201 +199 +198 +198 +197 +196 +195 +194 +194 +190 +191 +189 +188 +189 +184 +185 +183 +182 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +131 +129 +129 +126 +125 +119 +120 +120 +115 +116 +110 +110 +110 +106 +105 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +69 +68 +65 +64 +65 +59 +58 +54 +54 +55 +51 +51 +47 +47 +47 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +30 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +46 +47 +51 +50 +50 +50 +50 +55 +55 +58 +59 +58 +64 +65 +68 +69 +67 +73 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +119 +119 +120 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +184 +185 +189 +189 +188 +190 +190 +195 +194 +194 +196 +196 +198 +198 +201 +201 +200 +200 +201 +202 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +205 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +196 +197 +194 +195 +190 +191 +190 +188 +189 +185 +184 +183 +183 +183 +179 +179 +175 +174 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +160 +157 +157 +157 +151 +151 +147 +147 +143 +144 +143 +139 +139 +133 +133 +134 +130 +129 +129 +129 +130 +125 +126 +119 +119 +120 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +69 +64 +65 +58 +59 +55 +54 +54 +51 +50 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +20 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +48 +50 +50 +54 +54 +58 +59 +59 +65 +64 +68 +69 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +92 +96 +96 +100 +100 +105 +105 +106 +110 +110 +115 +115 +115 +120 +119 +125 +125 +126 +129 +130 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +182 +182 +185 +185 +189 +188 +188 +191 +191 +195 +195 +194 +196 +196 +198 +198 +198 +200 +201 +200 +200 +200 +203 +202 +204 +204 +204 +204 +205 +206 +207 +207 +207 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +201 +201 +200 +201 +199 +198 +197 +196 +197 +194 +194 +190 +191 +190 +189 +189 +184 +185 +184 +183 +183 +179 +179 +179 +175 +174 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +129 +130 +125 +125 +120 +120 +115 +116 +116 +109 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +83 +76 +76 +75 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +55 +51 +51 +46 +47 +47 +43 +42 +40 +41 +41 +37 +36 +34 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +42 +43 +47 +46 +50 +51 +51 +55 +55 +58 +58 +58 +64 +64 +64 +64 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +116 +119 +119 +126 +125 +126 +129 +129 +133 +133 +138 +139 +139 +143 +143 +147 +147 +147 +151 +151 +152 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +178 +179 +183 +182 +184 +184 +185 +188 +188 +191 +191 +190 +195 +194 +197 +196 +197 +198 +199 +201 +201 +201 +201 +200 +203 +203 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +203 +202 +200 +200 +201 +200 +201 +199 +198 +198 +196 +196 +197 +197 +197 +195 +195 +190 +191 +190 +189 +188 +184 +185 +184 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +133 +130 +130 +125 +125 +125 +120 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +54 +55 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +43 +43 +43 +46 +47 +51 +51 +51 +54 +55 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +116 +119 +120 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +185 +188 +189 +190 +191 +191 +195 +195 +197 +196 +199 +198 +199 +200 +200 +200 +201 +200 +203 +202 +205 +204 +204 +205 +204 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +204 +202 +202 +202 +202 +202 +200 +201 +200 +200 +200 +198 +199 +196 +196 +196 +194 +195 +191 +190 +188 +189 +188 +185 +185 +183 +182 +183 +179 +179 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +126 +119 +119 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +64 +59 +59 +59 +55 +55 +51 +51 +51 +46 +47 +43 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +36 +37 +41 +40 +43 +43 +43 +47 +47 +51 +50 +54 +54 +55 +58 +59 +65 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +95 +95 +100 +100 +106 +106 +106 +109 +109 +116 +116 +116 +119 +119 +125 +126 +126 +129 +129 +134 +133 +133 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +178 +179 +178 +182 +183 +184 +184 +188 +188 +188 +191 +190 +194 +194 +194 +196 +197 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +204 +205 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +197 +196 +197 +194 +194 +195 +191 +191 +190 +191 +191 +189 +189 +185 +184 +185 +183 +183 +179 +178 +177 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +134 +129 +129 +129 +126 +126 +119 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +65 +64 +59 +59 +59 +54 +54 +50 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +20 +19 +17 +18 +17 +15 +15 +15 +15 +16 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +51 +51 +54 +54 +58 +58 +59 +64 +65 +69 +68 +72 +73 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +126 +126 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +179 +183 +182 +185 +185 +185 +188 +188 +190 +191 +191 +194 +194 +197 +197 +196 +198 +199 +201 +200 +201 +201 +200 +203 +202 +204 +204 +204 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +202 +202 +202 +200 +200 +200 +201 +200 +200 +201 +198 +198 +199 +196 +197 +195 +195 +191 +190 +191 +189 +188 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +120 +116 +115 +115 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +69 +68 +64 +64 +59 +58 +55 +55 +55 +50 +51 +47 +47 +47 +42 +43 +40 +41 +41 +36 +36 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +46 +50 +51 +50 +54 +55 +58 +58 +58 +64 +64 +68 +68 +69 +72 +76 +76 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +120 +120 +126 +126 +129 +129 +129 +134 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +183 +183 +183 +185 +184 +188 +188 +191 +190 +190 +195 +194 +196 +197 +197 +199 +198 +198 +198 +198 +201 +201 +200 +200 +201 +203 +202 +205 +205 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +198 +198 +199 +196 +196 +194 +195 +194 +191 +190 +188 +188 +189 +185 +184 +183 +183 +183 +178 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +129 +129 +125 +125 +120 +119 +119 +116 +115 +109 +110 +109 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +55 +54 +51 +50 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +32 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +50 +51 +55 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +120 +126 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +162 +162 +165 +165 +169 +169 +172 +172 +173 +175 +175 +179 +179 +179 +183 +183 +183 +183 +182 +185 +185 +189 +188 +188 +191 +191 +194 +194 +195 +196 +197 +199 +198 +200 +200 +201 +200 +200 +202 +202 +202 +204 +205 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +201 +200 +200 +201 +200 +199 +198 +199 +196 +196 +194 +194 +191 +190 +191 +188 +188 +184 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +150 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +120 +120 +116 +115 +116 +109 +110 +105 +105 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +64 +65 +59 +58 +54 +54 +50 +50 +50 +46 +46 +42 +43 +43 +41 +41 +41 +41 +40 +36 +37 +33 +33 +33 +31 +30 +27 +27 +26 +26 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +54 +54 +54 +58 +58 +64 +64 +64 +68 +69 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +115 +116 +120 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +186 +188 +189 +191 +191 +194 +194 +194 +196 +196 +199 +198 +198 +200 +200 +200 +200 +201 +200 +201 +202 +202 +203 +204 +205 +204 +204 +206 +207 +207 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +205 +204 +204 +204 +205 +203 +202 +203 +200 +201 +200 +200 +198 +198 +198 +196 +196 +194 +194 +195 +190 +191 +189 +188 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +119 +116 +116 +116 +110 +109 +106 +106 +106 +99 +100 +95 +96 +96 +90 +90 +87 +86 +86 +82 +82 +77 +76 +77 +72 +72 +68 +69 +65 +64 +64 +58 +59 +54 +55 +55 +50 +50 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +55 +54 +58 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +109 +116 +115 +115 +119 +120 +126 +126 +125 +129 +130 +133 +133 +133 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +166 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +184 +185 +184 +188 +189 +191 +191 +191 +194 +194 +195 +195 +195 +197 +197 +198 +198 +198 +200 +201 +200 +200 +201 +202 +203 +204 +204 +204 +204 +205 +206 +206 +207 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +204 +205 +204 +204 +204 +203 +203 +200 +200 +200 +200 +200 +198 +199 +198 +196 +196 +194 +194 +195 +190 +191 +189 +189 +188 +185 +184 +182 +182 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +148 +143 +143 +139 +139 +134 +133 +133 +130 +129 +125 +126 +126 +119 +119 +120 +119 +120 +115 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +73 +72 +72 +68 +68 +64 +64 +64 +58 +59 +54 +54 +53 +51 +50 +47 +47 +43 +43 +42 +41 +40 +37 +37 +37 +33 +32 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +18 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +51 +50 +54 +54 +59 +58 +65 +65 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +105 +110 +109 +116 +115 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +179 +179 +182 +183 +183 +185 +185 +189 +189 +191 +191 +190 +195 +194 +197 +196 +196 +199 +198 +201 +201 +200 +200 +200 +203 +202 +202 +204 +204 +204 +205 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +195 +194 +194 +190 +190 +188 +188 +189 +185 +185 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +170 +165 +165 +160 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +115 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +74 +68 +68 +64 +65 +58 +59 +59 +55 +54 +51 +51 +51 +47 +46 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +31 +31 +30 +27 +27 +25 +25 +25 +20 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +50 +51 +55 +55 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +87 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +109 +116 +116 +116 +115 +116 +119 +119 +125 +125 +125 +130 +129 +133 +134 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +178 +182 +183 +185 +185 +185 +188 +189 +191 +191 +191 +195 +195 +196 +197 +196 +198 +199 +200 +201 +201 +201 +201 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +200 +200 +200 +200 +199 +198 +199 +197 +196 +194 +194 +194 +190 +190 +189 +188 +188 +185 +184 +183 +183 +183 +179 +179 +174 +174 +173 +172 +173 +169 +169 +165 +165 +165 +160 +161 +161 +160 +161 +157 +157 +151 +151 +151 +148 +147 +143 +144 +143 +139 +139 +133 +133 +129 +129 +130 +125 +126 +119 +119 +120 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +65 +65 +64 +64 +65 +58 +58 +55 +55 +54 +50 +51 +46 +47 +43 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +15 +16 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +59 +58 +65 +65 +65 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +89 +90 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +112 +116 +116 +119 +120 +125 +126 +125 +129 +129 +133 +133 +133 +140 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +182 +183 +184 +185 +188 +189 +189 +191 +191 +194 +194 +196 +197 +197 +198 +199 +200 +200 +200 +201 +201 +203 +202 +202 +204 +204 +205 +205 +205 +207 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +205 +203 +202 +202 +200 +200 +200 +201 +200 +198 +199 +196 +197 +197 +195 +194 +191 +190 +189 +189 +188 +185 +185 +183 +182 +183 +179 +179 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +119 +120 +118 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +91 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +68 +68 +64 +65 +58 +58 +58 +54 +54 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +38 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +54 +54 +54 +59 +58 +64 +64 +65 +68 +68 +69 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +88 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +115 +116 +116 +119 +120 +126 +125 +125 +129 +130 +133 +133 +136 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +182 +182 +185 +185 +188 +188 +189 +191 +191 +194 +195 +194 +196 +196 +199 +199 +198 +200 +201 +201 +200 +200 +202 +202 +204 +204 +205 +205 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +201 +200 +198 +199 +196 +196 +196 +195 +194 +195 +195 +195 +190 +191 +188 +189 +188 +184 +185 +182 +182 +183 +178 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +119 +119 +116 +115 +115 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +95 +91 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +73 +73 +68 +68 +64 +64 +65 +58 +58 +54 +54 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +18 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +47 +51 +50 +55 +55 +54 +58 +58 +64 +65 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +111 +116 +115 +120 +120 +125 +125 +125 +130 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +164 +169 +168 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +189 +188 +191 +191 +191 +195 +195 +197 +196 +197 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +207 +206 +207 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +199 +199 +197 +196 +195 +194 +195 +191 +190 +189 +188 +185 +184 +185 +183 +182 +178 +179 +179 +174 +175 +173 +173 +173 +169 +170 +165 +165 +166 +161 +161 +157 +157 +158 +151 +151 +147 +147 +144 +143 +143 +139 +139 +139 +139 +139 +133 +133 +133 +133 +133 +129 +129 +125 +126 +125 +126 +125 +120 +120 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +64 +64 +59 +58 +55 +55 +54 +51 +51 +47 +46 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +47 +47 +51 +51 +54 +54 +55 +58 +58 +64 +65 +65 +68 +69 +69 +68 +68 +72 +73 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +120 +120 +125 +125 +130 +129 +130 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +185 +185 +184 +188 +189 +190 +190 +190 +195 +195 +197 +197 +197 +198 +198 +200 +200 +200 +201 +200 +203 +202 +203 +204 +205 +204 +204 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +204 +204 +205 +204 +205 +202 +203 +203 +201 +200 +200 +200 +199 +199 +199 +196 +197 +194 +195 +194 +190 +191 +189 +189 +188 +184 +184 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +132 +129 +129 +125 +126 +119 +119 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +83 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +65 +59 +58 +59 +54 +54 +50 +51 +51 +46 +47 +42 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +28 +27 +25 +25 +21 +21 +21 +19 +19 +16 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +34 +37 +38 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +54 +55 +55 +58 +58 +65 +65 +65 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +116 +116 +120 +120 +125 +126 +129 +130 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +170 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +185 +189 +189 +188 +190 +190 +195 +194 +194 +197 +197 +198 +198 +198 +201 +200 +200 +201 +203 +202 +203 +204 +205 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +207 +205 +205 +204 +205 +203 +202 +203 +201 +200 +200 +200 +200 +198 +198 +197 +196 +194 +194 +195 +190 +191 +190 +189 +189 +184 +185 +185 +183 +183 +178 +179 +174 +174 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +95 +94 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +59 +59 +54 +55 +55 +51 +50 +47 +46 +43 +42 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +50 +51 +55 +55 +58 +59 +61 +65 +65 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +115 +115 +116 +119 +120 +125 +126 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +182 +183 +185 +185 +185 +189 +188 +190 +191 +191 +195 +194 +196 +196 +199 +198 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +203 +203 +201 +201 +200 +201 +200 +198 +198 +197 +196 +197 +195 +195 +191 +190 +188 +189 +189 +185 +185 +183 +182 +182 +179 +179 +179 +178 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +126 +119 +115 +116 +112 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +59 +59 +58 +54 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +16 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +47 +51 +50 +54 +54 +54 +58 +58 +65 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +119 +125 +125 +126 +130 +130 +134 +133 +133 +139 +139 +144 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +184 +185 +189 +189 +189 +191 +190 +194 +194 +194 +196 +196 +199 +198 +199 +201 +200 +200 +201 +200 +203 +203 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +200 +201 +200 +201 +198 +199 +198 +197 +196 +195 +195 +194 +190 +191 +191 +191 +190 +189 +188 +186 +185 +185 +183 +183 +178 +179 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +130 +130 +126 +126 +119 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +16 +16 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +24 +27 +27 +27 +31 +31 +33 +33 +36 +37 +36 +41 +40 +42 +43 +43 +47 +47 +51 +51 +50 +55 +55 +59 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +81 +82 +82 +86 +85 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +116 +119 +120 +120 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +156 +157 +161 +161 +161 +164 +165 +169 +169 +169 +172 +173 +175 +175 +178 +178 +179 +183 +183 +185 +184 +185 +188 +188 +190 +190 +190 +194 +194 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +198 +199 +198 +198 +196 +196 +194 +194 +195 +190 +191 +188 +188 +186 +184 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +116 +115 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +55 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +16 +15 +15 +13 +14 +12 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +16 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +50 +51 +55 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +109 +110 +115 +115 +116 +119 +120 +125 +125 +126 +130 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +174 +175 +179 +179 +178 +182 +183 +185 +184 +184 +189 +189 +191 +190 +191 +194 +194 +197 +197 +199 +199 +198 +200 +201 +201 +200 +200 +202 +202 +202 +202 +203 +204 +204 +204 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +204 +204 +204 +204 +204 +202 +202 +201 +201 +201 +201 +200 +198 +199 +197 +197 +196 +194 +194 +190 +190 +190 +188 +189 +184 +185 +184 +182 +182 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +73 +68 +68 +64 +64 +59 +59 +58 +54 +55 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +46 +50 +50 +55 +54 +55 +58 +58 +64 +64 +65 +68 +68 +73 +73 +72 +77 +76 +83 +82 +82 +86 +89 +89 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +120 +120 +125 +125 +125 +129 +130 +133 +133 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +182 +184 +185 +189 +189 +189 +190 +191 +194 +194 +194 +196 +197 +197 +197 +196 +198 +198 +201 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +204 +204 +205 +204 +205 +203 +203 +200 +200 +200 +200 +200 +199 +199 +196 +196 +197 +195 +194 +191 +190 +190 +189 +188 +185 +184 +185 +183 +183 +178 +179 +175 +175 +175 +173 +172 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +143 +143 +143 +144 +139 +139 +134 +133 +134 +129 +130 +125 +126 +125 +120 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +51 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +126 +126 +125 +129 +129 +134 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +173 +173 +173 +175 +179 +179 +178 +182 +183 +183 +182 +182 +185 +185 +188 +188 +188 +190 +191 +195 +195 +195 +197 +196 +199 +198 +200 +200 +200 +201 +200 +203 +203 +203 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +199 +197 +197 +194 +194 +191 +190 +190 +189 +188 +184 +184 +184 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +119 +120 +115 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +65 +64 +65 +58 +58 +54 +54 +51 +51 +51 +46 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +32 +30 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +51 +51 +55 +55 +55 +59 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +125 +130 +130 +134 +133 +133 +139 +140 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +168 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +183 +183 +184 +185 +189 +188 +190 +190 +191 +194 +194 +196 +196 +196 +198 +198 +199 +198 +199 +200 +200 +200 +200 +201 +203 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +205 +204 +205 +204 +205 +202 +203 +201 +200 +200 +200 +200 +198 +198 +199 +196 +196 +194 +194 +194 +191 +190 +189 +188 +188 +184 +185 +182 +182 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +130 +129 +126 +125 +125 +119 +120 +116 +115 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +73 +72 +68 +69 +64 +64 +64 +58 +58 +58 +58 +58 +55 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +46 +51 +50 +50 +54 +55 +58 +58 +59 +64 +64 +69 +68 +69 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +148 +147 +151 +151 +151 +158 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +179 +179 +182 +183 +184 +184 +184 +188 +189 +189 +189 +189 +190 +190 +195 +194 +194 +196 +197 +198 +198 +199 +201 +200 +201 +200 +202 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +195 +195 +190 +191 +190 +189 +189 +184 +185 +183 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +143 +143 +143 +139 +139 +140 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +58 +59 +54 +54 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +24 +24 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +50 +50 +55 +55 +58 +58 +65 +64 +64 +68 +68 +73 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +149 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +186 +188 +189 +190 +190 +194 +194 +195 +196 +196 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +201 +198 +198 +197 +196 +196 +195 +194 +190 +190 +191 +188 +188 +184 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +174 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +126 +119 +119 +116 +115 +110 +109 +110 +105 +105 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +74 +72 +72 +68 +68 +64 +64 +64 +58 +55 +54 +55 +51 +51 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +47 +46 +47 +51 +50 +55 +55 +55 +58 +58 +64 +65 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +109 +110 +110 +116 +116 +119 +119 +119 +125 +126 +130 +129 +131 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +172 +174 +175 +175 +179 +178 +182 +182 +183 +185 +185 +189 +188 +188 +191 +190 +195 +194 +195 +196 +196 +198 +198 +199 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +199 +198 +196 +196 +196 +194 +194 +190 +190 +190 +189 +189 +184 +185 +185 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +168 +165 +164 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +119 +119 +115 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +64 +64 +64 +59 +58 +55 +55 +54 +50 +50 +47 +47 +45 +43 +42 +41 +41 +37 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +59 +58 +59 +65 +64 +68 +68 +68 +72 +73 +77 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +118 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +163 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +182 +185 +184 +185 +189 +189 +191 +190 +191 +195 +195 +196 +196 +198 +198 +198 +201 +200 +201 +200 +200 +203 +202 +205 +204 +204 +205 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +199 +198 +197 +196 +194 +195 +195 +191 +190 +188 +188 +184 +185 +185 +183 +183 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +130 +129 +125 +125 +125 +119 +120 +115 +116 +116 +110 +109 +106 +105 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +55 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +55 +59 +64 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +109 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +184 +185 +185 +189 +189 +190 +190 +194 +194 +195 +197 +196 +198 +199 +198 +200 +201 +201 +200 +200 +202 +202 +205 +205 +205 +205 +204 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +201 +200 +201 +201 +200 +198 +198 +199 +196 +197 +195 +194 +191 +191 +190 +188 +189 +185 +184 +185 +183 +183 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +119 +120 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +95 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +59 +59 +58 +55 +54 +51 +50 +51 +47 +47 +42 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +51 +51 +55 +54 +55 +59 +59 +65 +64 +64 +68 +69 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +88 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +116 +116 +115 +116 +119 +119 +125 +125 +126 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +184 +185 +189 +188 +190 +190 +190 +194 +194 +197 +196 +197 +198 +198 +200 +201 +201 +200 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +201 +200 +200 +200 +200 +198 +199 +198 +196 +197 +194 +194 +195 +191 +190 +188 +189 +189 +184 +185 +183 +182 +183 +178 +179 +175 +174 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +119 +119 +116 +115 +116 +115 +116 +110 +109 +106 +105 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +64 +58 +58 +54 +54 +55 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +14 +13 +12 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +47 +47 +46 +51 +50 +54 +54 +55 +58 +58 +64 +65 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +178 +183 +182 +184 +184 +185 +188 +189 +190 +190 +190 +194 +194 +196 +196 +199 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +197 +195 +194 +190 +191 +188 +189 +189 +184 +185 +183 +182 +182 +179 +178 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +65 +64 +58 +58 +55 +55 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +34 +31 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +45 +47 +46 +51 +51 +55 +55 +54 +58 +59 +64 +65 +64 +68 +68 +69 +69 +69 +72 +72 +77 +77 +76 +82 +82 +86 +86 +89 +90 +89 +96 +95 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +185 +184 +185 +188 +189 +190 +190 +191 +195 +195 +197 +197 +197 +198 +198 +200 +201 +201 +200 +200 +202 +202 +203 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +201 +201 +200 +198 +198 +199 +196 +197 +194 +195 +194 +191 +190 +189 +188 +188 +184 +185 +182 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +140 +140 +133 +133 +131 +129 +129 +125 +125 +119 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +51 +50 +46 +47 +42 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +35 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +54 +55 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +74 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +120 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +182 +182 +185 +185 +188 +188 +188 +190 +190 +195 +195 +194 +196 +197 +198 +198 +199 +200 +201 +200 +200 +203 +202 +202 +205 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +204 +204 +205 +204 +203 +202 +203 +200 +200 +201 +201 +200 +198 +198 +198 +199 +198 +196 +197 +195 +194 +194 +191 +190 +188 +188 +187 +185 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +172 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +148 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +120 +115 +116 +109 +110 +110 +105 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +76 +76 +76 +76 +73 +73 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +16 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +40 +41 +41 +41 +41 +43 +43 +46 +47 +47 +50 +51 +54 +54 +57 +59 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +183 +185 +185 +188 +188 +189 +191 +190 +195 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +205 +206 +207 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +205 +204 +204 +202 +203 +200 +200 +200 +200 +201 +198 +199 +197 +196 +197 +195 +194 +190 +190 +191 +189 +188 +185 +185 +185 +182 +183 +183 +183 +183 +178 +178 +174 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +54 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +25 +25 +26 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +15 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +42 +43 +43 +46 +47 +50 +50 +50 +54 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +120 +125 +125 +129 +129 +130 +134 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +174 +175 +178 +179 +183 +183 +183 +182 +183 +185 +184 +188 +189 +188 +191 +191 +194 +195 +194 +196 +197 +199 +198 +198 +200 +201 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +201 +199 +198 +198 +196 +196 +197 +196 +196 +194 +194 +191 +191 +191 +189 +188 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +129 +129 +125 +126 +120 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +58 +55 +55 +51 +50 +51 +47 +47 +42 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +54 +54 +58 +59 +59 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +109 +110 +110 +116 +116 +119 +120 +125 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +174 +173 +173 +175 +175 +179 +179 +178 +182 +183 +185 +184 +185 +189 +189 +190 +190 +191 +194 +195 +196 +196 +196 +199 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +205 +205 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +205 +202 +202 +201 +200 +200 +200 +200 +200 +201 +200 +198 +199 +196 +196 +196 +194 +194 +190 +190 +189 +189 +189 +184 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +116 +115 +109 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +58 +54 +54 +50 +51 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +15 +15 +15 +16 +17 +19 +19 +20 +21 +20 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +50 +50 +54 +55 +59 +59 +59 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +110 +110 +110 +115 +115 +120 +120 +119 +125 +125 +130 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +174 +179 +179 +183 +182 +183 +184 +185 +188 +189 +189 +191 +191 +195 +194 +197 +196 +196 +198 +199 +201 +200 +200 +200 +200 +200 +200 +200 +202 +202 +205 +204 +205 +205 +204 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +204 +204 +205 +202 +202 +203 +201 +201 +200 +200 +200 +198 +199 +196 +196 +194 +195 +194 +190 +191 +188 +189 +188 +185 +185 +183 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +120 +116 +115 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +59 +59 +54 +55 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +42 +43 +43 +47 +47 +51 +51 +50 +54 +54 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +95 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +168 +169 +169 +172 +173 +175 +175 +175 +178 +179 +183 +183 +184 +185 +185 +189 +189 +191 +190 +190 +194 +195 +195 +194 +194 +197 +196 +199 +199 +199 +200 +201 +201 +200 +201 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +198 +198 +198 +197 +196 +194 +194 +195 +190 +190 +189 +189 +189 +184 +185 +183 +183 +179 +179 +178 +175 +175 +172 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +134 +129 +129 +125 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +73 +73 +68 +68 +64 +65 +65 +58 +59 +55 +54 +55 +51 +50 +47 +47 +48 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +24 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +46 +51 +50 +51 +55 +54 +58 +58 +58 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +110 +110 +116 +115 +120 +120 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +182 +182 +183 +182 +184 +184 +188 +189 +189 +191 +190 +195 +195 +195 +196 +197 +198 +198 +200 +200 +200 +200 +201 +202 +203 +202 +204 +204 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +201 +200 +200 +200 +200 +199 +198 +199 +196 +197 +194 +194 +190 +190 +190 +189 +189 +185 +185 +185 +183 +182 +179 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +125 +125 +119 +120 +115 +116 +115 +109 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +58 +55 +54 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +41 +40 +40 +37 +37 +33 +33 +33 +31 +31 +26 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +40 +41 +42 +43 +43 +47 +47 +51 +50 +56 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +125 +130 +130 +134 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +184 +185 +189 +188 +190 +191 +190 +194 +194 +197 +196 +197 +198 +199 +199 +198 +198 +200 +200 +200 +201 +201 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +201 +199 +198 +196 +197 +197 +194 +194 +191 +191 +190 +188 +188 +185 +184 +184 +183 +182 +178 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +129 +130 +126 +125 +120 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +100 +100 +96 +96 +97 +90 +90 +86 +86 +86 +81 +82 +76 +76 +72 +73 +72 +68 +68 +65 +64 +64 +58 +58 +58 +59 +59 +55 +54 +51 +51 +51 +47 +47 +43 +43 +42 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +15 +16 +17 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +54 +54 +58 +59 +58 +65 +64 +68 +68 +68 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +116 +115 +119 +119 +120 +125 +125 +130 +129 +134 +134 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +183 +183 +184 +185 +184 +184 +184 +188 +189 +190 +190 +191 +195 +195 +197 +197 +197 +199 +199 +200 +200 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +207 +207 +206 +206 +205 +204 +204 +205 +204 +202 +202 +201 +200 +200 +200 +200 +199 +198 +198 +197 +196 +194 +195 +194 +191 +190 +189 +188 +185 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +89 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +72 +68 +69 +64 +64 +64 +59 +58 +55 +55 +53 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +27 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +46 +50 +51 +54 +54 +55 +58 +59 +64 +64 +69 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +87 +90 +90 +95 +96 +96 +100 +100 +105 +105 +106 +110 +110 +116 +116 +121 +119 +119 +125 +126 +130 +130 +129 +134 +133 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +160 +165 +165 +165 +169 +169 +173 +173 +173 +175 +174 +175 +175 +175 +179 +178 +182 +183 +183 +184 +185 +188 +189 +189 +191 +190 +194 +195 +196 +196 +196 +199 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +205 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +201 +201 +200 +201 +200 +198 +198 +196 +196 +195 +194 +194 +190 +190 +189 +189 +189 +185 +184 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +130 +126 +125 +120 +120 +120 +115 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +69 +66 +64 +64 +59 +58 +55 +54 +55 +50 +50 +47 +46 +47 +43 +43 +43 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +14 +12 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +12 +15 +15 +17 +19 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +51 +50 +50 +54 +54 +58 +58 +59 +64 +64 +68 +69 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +85 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +115 +120 +120 +119 +125 +126 +130 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +178 +179 +182 +183 +183 +185 +185 +188 +189 +188 +191 +190 +195 +194 +194 +197 +197 +199 +198 +198 +200 +201 +200 +201 +201 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +205 +204 +204 +205 +204 +202 +202 +201 +201 +201 +200 +201 +199 +199 +196 +196 +197 +195 +195 +190 +190 +190 +188 +189 +185 +185 +185 +183 +182 +179 +179 +179 +174 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +134 +134 +134 +130 +129 +125 +125 +119 +120 +119 +116 +116 +109 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +69 +68 +65 +64 +59 +58 +58 +54 +55 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +40 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +26 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +44 +43 +43 +47 +46 +50 +50 +50 +54 +54 +59 +59 +59 +64 +64 +68 +68 +68 +73 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +116 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +179 +183 +182 +184 +185 +185 +188 +188 +191 +190 +190 +194 +194 +197 +197 +196 +198 +198 +201 +200 +200 +201 +200 +202 +202 +205 +204 +204 +204 +204 +207 +207 +207 +207 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +205 +202 +202 +200 +201 +200 +200 +200 +198 +198 +198 +197 +196 +195 +195 +195 +190 +190 +188 +188 +189 +185 +185 +182 +183 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +126 +119 +120 +115 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +73 +68 +68 +68 +68 +68 +65 +64 +59 +58 +59 +55 +54 +51 +51 +49 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +16 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +50 +50 +54 +55 +55 +59 +59 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +120 +126 +125 +129 +130 +129 +134 +134 +140 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +185 +185 +185 +188 +189 +190 +191 +190 +191 +190 +195 +194 +196 +196 +196 +198 +198 +201 +200 +201 +200 +201 +203 +202 +202 +204 +204 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +201 +200 +200 +198 +198 +196 +196 +197 +194 +195 +190 +191 +189 +188 +188 +185 +184 +183 +183 +183 +179 +179 +175 +174 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +134 +133 +133 +133 +133 +129 +129 +125 +125 +125 +120 +119 +116 +116 +116 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +68 +65 +64 +58 +58 +54 +54 +55 +50 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +18 +22 +21 +20 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +40 +41 +43 +43 +47 +47 +47 +50 +51 +55 +55 +59 +59 +58 +64 +64 +69 +68 +68 +72 +73 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +115 +116 +119 +119 +119 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +178 +182 +183 +185 +185 +184 +189 +188 +190 +191 +190 +195 +195 +196 +197 +197 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +205 +205 +204 +204 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +205 +204 +205 +205 +203 +202 +200 +200 +201 +200 +200 +199 +198 +197 +196 +196 +194 +194 +191 +191 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +144 +139 +139 +137 +133 +133 +129 +129 +125 +125 +125 +120 +120 +115 +115 +115 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +77 +72 +73 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +50 +51 +51 +46 +47 +42 +42 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +16 +17 +15 +15 +16 +15 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +22 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +51 +51 +54 +54 +55 +58 +59 +64 +64 +66 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +99 +100 +100 +105 +106 +109 +110 +112 +115 +116 +120 +120 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +184 +189 +189 +191 +190 +191 +194 +195 +197 +197 +199 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +202 +202 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +205 +203 +202 +202 +202 +201 +200 +201 +200 +200 +198 +199 +196 +196 +197 +194 +195 +191 +191 +189 +189 +189 +184 +184 +183 +183 +182 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +140 +133 +133 +133 +134 +133 +129 +129 +126 +126 +126 +120 +119 +116 +116 +111 +110 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +58 +58 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +21 +21 +21 +19 +19 +16 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +50 +55 +54 +59 +59 +59 +64 +64 +68 +69 +68 +72 +73 +72 +72 +72 +76 +76 +82 +82 +83 +85 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +119 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +179 +183 +182 +185 +184 +189 +189 +189 +191 +190 +194 +194 +194 +196 +197 +199 +198 +199 +200 +201 +201 +200 +200 +202 +202 +205 +204 +205 +204 +204 +206 +206 +207 +207 +207 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +201 +200 +200 +199 +199 +197 +197 +196 +194 +194 +190 +190 +191 +188 +188 +188 +188 +188 +185 +184 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +131 +129 +130 +125 +125 +119 +120 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +69 +68 +64 +64 +59 +58 +58 +55 +55 +51 +51 +51 +46 +46 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +16 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +47 +50 +50 +51 +51 +51 +54 +54 +58 +59 +59 +64 +64 +68 +68 +71 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +116 +120 +119 +124 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +172 +173 +175 +175 +178 +179 +179 +182 +183 +184 +184 +184 +188 +188 +191 +190 +190 +194 +194 +196 +196 +196 +198 +199 +200 +201 +201 +200 +200 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +207 +207 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +200 +200 +200 +200 +200 +200 +198 +199 +196 +197 +197 +195 +194 +190 +190 +189 +189 +189 +185 +185 +184 +184 +184 +183 +183 +179 +178 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +69 +64 +64 +59 +58 +55 +55 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +40 +43 +42 +47 +47 +47 +51 +50 +55 +54 +58 +58 +59 +64 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +109 +110 +115 +116 +119 +120 +119 +126 +126 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +183 +182 +185 +185 +188 +188 +191 +190 +191 +195 +194 +196 +196 +197 +198 +199 +200 +200 +201 +200 +200 +202 +202 +202 +205 +204 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +201 +201 +200 +200 +198 +198 +199 +196 +196 +194 +194 +195 +191 +191 +191 +190 +190 +189 +188 +184 +184 +185 +183 +183 +179 +179 +176 +175 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +126 +120 +120 +119 +115 +116 +110 +110 +110 +105 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +36 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +46 +46 +47 +50 +50 +55 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +119 +125 +125 +130 +129 +129 +133 +133 +133 +134 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +182 +184 +185 +184 +189 +188 +190 +190 +190 +194 +195 +196 +197 +196 +198 +199 +201 +200 +200 +200 +200 +203 +202 +204 +204 +204 +204 +205 +204 +204 +205 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +201 +201 +201 +201 +199 +198 +199 +196 +196 +194 +195 +191 +190 +190 +189 +188 +185 +184 +184 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +158 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +130 +129 +125 +125 +126 +120 +120 +116 +116 +116 +110 +110 +105 +105 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +59 +58 +55 +55 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +54 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +110 +110 +110 +115 +115 +119 +120 +119 +126 +125 +129 +130 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +183 +183 +183 +185 +185 +189 +189 +190 +191 +191 +195 +194 +196 +196 +196 +198 +199 +201 +200 +201 +201 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +204 +205 +204 +205 +205 +203 +202 +200 +201 +200 +200 +201 +198 +199 +196 +197 +196 +195 +195 +191 +190 +190 +189 +189 +185 +185 +184 +183 +183 +179 +178 +179 +175 +175 +173 +173 +169 +169 +169 +165 +164 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +116 +110 +110 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +85 +86 +82 +82 +77 +76 +76 +72 +73 +68 +68 +69 +64 +64 +59 +59 +59 +55 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +32 +33 +32 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +54 +59 +58 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +116 +120 +119 +125 +125 +130 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +178 +179 +183 +182 +183 +185 +185 +185 +185 +184 +189 +189 +191 +190 +191 +194 +195 +197 +196 +196 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +201 +201 +200 +198 +199 +196 +197 +197 +195 +195 +191 +190 +190 +188 +189 +185 +184 +182 +183 +183 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +129 +130 +126 +125 +120 +119 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +54 +54 +51 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +46 +47 +50 +50 +55 +55 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +119 +120 +126 +126 +129 +130 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +162 +161 +161 +165 +164 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +184 +184 +186 +189 +189 +191 +191 +194 +195 +195 +197 +197 +198 +199 +199 +201 +200 +201 +200 +200 +200 +200 +202 +202 +203 +204 +205 +205 +205 +205 +206 +207 +207 +207 +206 +207 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +201 +201 +200 +201 +201 +198 +198 +196 +197 +196 +194 +194 +191 +191 +190 +188 +189 +185 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +170 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +129 +130 +125 +126 +120 +120 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +69 +68 +68 +64 +64 +58 +58 +58 +54 +55 +55 +55 +55 +51 +51 +47 +47 +46 +42 +43 +40 +41 +41 +37 +37 +33 +33 +31 +32 +31 +27 +27 +25 +25 +24 +21 +21 +21 +21 +21 +19 +19 +17 +18 +18 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +46 +47 +46 +50 +50 +54 +54 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +126 +125 +126 +129 +129 +133 +134 +140 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +178 +182 +183 +183 +185 +184 +189 +189 +189 +190 +191 +190 +190 +191 +194 +194 +196 +196 +196 +198 +199 +201 +201 +200 +200 +200 +203 +202 +204 +204 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +205 +205 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +196 +196 +195 +195 +194 +191 +190 +189 +189 +189 +185 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +130 +130 +125 +126 +126 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +68 +68 +68 +64 +64 +58 +59 +58 +55 +55 +51 +50 +49 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +30 +31 +31 +31 +27 +28 +25 +25 +25 +21 +21 +19 +20 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +32 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +55 +59 +59 +58 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +111 +116 +115 +120 +120 +125 +125 +126 +129 +130 +133 +134 +134 +139 +139 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +179 +183 +183 +185 +185 +185 +189 +188 +190 +191 +194 +195 +195 +197 +196 +198 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +199 +199 +196 +196 +194 +195 +191 +191 +190 +188 +188 +184 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +139 +139 +140 +134 +133 +129 +129 +129 +126 +126 +119 +119 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +74 +68 +68 +65 +64 +58 +58 +59 +54 +54 +51 +51 +50 +47 +47 +47 +46 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +31 +30 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +34 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +50 +50 +55 +54 +58 +58 +59 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +116 +115 +115 +119 +119 +125 +125 +126 +130 +129 +133 +134 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +178 +179 +179 +183 +183 +184 +185 +184 +188 +188 +190 +190 +191 +195 +195 +197 +196 +196 +198 +199 +200 +200 +201 +201 +201 +202 +202 +204 +204 +204 +205 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +198 +198 +197 +196 +196 +195 +194 +190 +191 +191 +188 +189 +184 +185 +185 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +156 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +134 +129 +130 +129 +125 +125 +120 +119 +120 +115 +116 +115 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +68 +68 +69 +64 +64 +58 +59 +58 +54 +54 +51 +50 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +42 +47 +47 +50 +50 +50 +54 +54 +59 +59 +59 +64 +65 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +105 +106 +110 +110 +116 +115 +120 +119 +119 +126 +126 +129 +129 +129 +133 +133 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +154 +157 +156 +161 +161 +164 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +183 +182 +185 +184 +185 +189 +188 +190 +191 +192 +194 +194 +196 +196 +198 +199 +199 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +207 +206 +204 +205 +204 +204 +204 +202 +202 +201 +200 +200 +201 +201 +199 +198 +199 +197 +197 +195 +195 +191 +191 +190 +188 +189 +184 +184 +184 +183 +182 +178 +178 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +119 +120 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +59 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +47 +50 +51 +55 +54 +54 +58 +59 +64 +65 +64 +68 +68 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +115 +119 +120 +120 +126 +126 +130 +129 +131 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +160 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +184 +184 +189 +189 +191 +190 +191 +194 +194 +197 +197 +196 +198 +199 +200 +200 +201 +200 +201 +203 +203 +204 +205 +205 +204 +204 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +196 +196 +195 +194 +194 +191 +191 +189 +188 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +172 +173 +173 +169 +169 +169 +169 +169 +165 +165 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +126 +119 +119 +120 +119 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +51 +51 +47 +47 +46 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +37 +36 +37 +37 +37 +41 +41 +42 +43 +43 +46 +47 +50 +51 +51 +54 +54 +59 +59 +59 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +109 +110 +110 +115 +116 +120 +119 +119 +125 +125 +129 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +189 +188 +189 +190 +191 +194 +194 +196 +196 +197 +199 +198 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +204 +205 +205 +205 +204 +203 +202 +202 +200 +201 +200 +200 +200 +199 +198 +196 +197 +196 +195 +194 +190 +190 +189 +189 +189 +185 +185 +183 +182 +183 +178 +179 +178 +178 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +140 +139 +139 +133 +133 +129 +130 +130 +125 +126 +120 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +91 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +65 +64 +59 +59 +54 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +33 +31 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +48 +50 +51 +54 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +115 +116 +119 +120 +126 +125 +125 +129 +130 +134 +134 +133 +139 +139 +143 +143 +146 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +174 +178 +179 +178 +183 +182 +185 +184 +189 +188 +189 +190 +190 +194 +195 +195 +196 +197 +198 +199 +198 +200 +200 +200 +200 +200 +203 +203 +204 +204 +204 +204 +204 +206 +207 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +204 +204 +204 +205 +204 +202 +202 +203 +200 +200 +200 +200 +199 +198 +198 +196 +197 +194 +194 +194 +190 +190 +190 +190 +191 +188 +189 +185 +185 +184 +183 +182 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +125 +125 +125 +120 +119 +116 +115 +115 +110 +109 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +54 +50 +50 +47 +46 +47 +43 +42 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +22 +19 +20 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +36 +41 +41 +43 +43 +43 +47 +47 +47 +47 +46 +51 +51 +55 +54 +55 +58 +58 +65 +65 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +184 +185 +189 +188 +188 +190 +190 +194 +194 +195 +196 +197 +198 +199 +201 +201 +201 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +201 +201 +200 +201 +201 +198 +198 +199 +196 +196 +194 +195 +192 +191 +190 +189 +188 +184 +185 +185 +183 +182 +179 +178 +178 +175 +174 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +130 +130 +125 +126 +119 +119 +120 +115 +115 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +76 +72 +72 +69 +68 +69 +64 +64 +58 +58 +55 +54 +55 +50 +50 +46 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +46 +51 +51 +54 +55 +55 +58 +58 +64 +64 +64 +69 +68 +72 +72 +73 +77 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +156 +157 +161 +161 +165 +164 +165 +169 +169 +173 +172 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +189 +189 +188 +191 +191 +195 +194 +194 +196 +197 +197 +197 +197 +198 +198 +200 +200 +200 +200 +200 +203 +202 +203 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +203 +202 +202 +200 +201 +200 +200 +200 +198 +198 +196 +197 +197 +194 +194 +195 +194 +194 +190 +190 +189 +188 +188 +184 +184 +182 +182 +179 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +156 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +99 +100 +96 +96 +95 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +55 +54 +51 +51 +46 +47 +47 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +12 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +50 +50 +54 +54 +58 +58 +59 +65 +64 +68 +68 +71 +73 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +109 +110 +116 +116 +120 +119 +126 +126 +125 +130 +129 +133 +134 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +160 +161 +164 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +179 +179 +183 +183 +182 +185 +184 +188 +188 +188 +191 +191 +194 +194 +195 +197 +196 +198 +198 +201 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +202 +200 +200 +201 +201 +201 +201 +200 +198 +198 +198 +197 +197 +195 +194 +191 +190 +191 +189 +189 +184 +184 +184 +182 +183 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +115 +116 +109 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +69 +64 +64 +64 +59 +58 +54 +54 +51 +50 +51 +47 +46 +43 +43 +43 +41 +41 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +50 +50 +55 +54 +59 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +101 +100 +100 +106 +106 +109 +109 +110 +115 +116 +119 +119 +120 +126 +125 +129 +130 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +169 +172 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +188 +190 +190 +190 +195 +194 +194 +194 +194 +196 +196 +199 +199 +198 +200 +201 +201 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +201 +201 +198 +198 +198 +198 +198 +196 +197 +194 +195 +194 +190 +191 +188 +188 +188 +185 +185 +183 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +129 +129 +126 +125 +125 +120 +119 +116 +116 +115 +110 +110 +106 +105 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +55 +55 +50 +50 +46 +47 +47 +43 +43 +41 +40 +42 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +36 +37 +40 +40 +43 +43 +43 +47 +47 +50 +50 +50 +54 +55 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +77 +83 +82 +82 +86 +85 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +109 +116 +115 +119 +120 +119 +125 +126 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +148 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +185 +189 +189 +191 +191 +191 +194 +194 +197 +197 +196 +198 +198 +200 +201 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +207 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +205 +205 +205 +205 +203 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +197 +196 +195 +195 +190 +191 +191 +189 +189 +185 +184 +183 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +120 +120 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +77 +77 +72 +72 +68 +68 +68 +64 +64 +59 +59 +58 +54 +55 +51 +51 +51 +46 +47 +42 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +16 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +42 +43 +47 +46 +47 +51 +50 +54 +54 +55 +59 +59 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +105 +106 +109 +110 +115 +119 +119 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +179 +183 +184 +184 +185 +184 +189 +189 +191 +191 +191 +194 +195 +197 +196 +199 +199 +199 +200 +200 +200 +201 +200 +202 +203 +203 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +203 +202 +202 +201 +200 +201 +200 +201 +198 +198 +196 +196 +196 +194 +195 +190 +191 +189 +189 +189 +185 +184 +182 +182 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +160 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +54 +54 +54 +50 +50 +47 +46 +47 +43 +43 +43 +42 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +51 +51 +51 +54 +55 +59 +59 +59 +64 +64 +69 +68 +69 +73 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +119 +125 +126 +130 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +174 +179 +179 +182 +182 +183 +185 +185 +188 +189 +190 +191 +191 +194 +194 +197 +196 +196 +199 +198 +199 +198 +198 +200 +201 +200 +200 +201 +202 +203 +204 +204 +204 +204 +205 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +204 +205 +202 +203 +200 +201 +200 +200 +200 +199 +199 +197 +197 +196 +194 +195 +190 +190 +190 +189 +188 +185 +185 +185 +183 +183 +179 +178 +179 +175 +175 +173 +172 +170 +169 +168 +165 +165 +161 +161 +161 +157 +156 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +134 +133 +129 +129 +125 +125 +120 +120 +119 +116 +117 +110 +110 +110 +106 +105 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +81 +82 +76 +76 +73 +72 +72 +68 +68 +64 +65 +64 +58 +59 +58 +58 +59 +55 +55 +51 +51 +51 +46 +47 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +50 +50 +54 +54 +58 +59 +59 +65 +64 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +109 +109 +115 +116 +119 +119 +120 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +184 +185 +185 +184 +185 +188 +188 +190 +190 +191 +195 +194 +196 +196 +198 +198 +198 +200 +200 +200 +201 +200 +202 +202 +205 +204 +205 +204 +205 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +199 +201 +198 +198 +198 +196 +194 +195 +194 +191 +190 +189 +188 +185 +185 +185 +182 +183 +179 +179 +178 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +129 +125 +125 +119 +119 +119 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +100 +100 +95 +96 +89 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +69 +68 +64 +64 +58 +59 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +40 +40 +43 +43 +43 +47 +47 +50 +51 +55 +55 +54 +59 +58 +59 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +83 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +116 +115 +120 +120 +125 +126 +125 +129 +129 +133 +133 +135 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +184 +185 +189 +189 +191 +191 +190 +195 +194 +196 +196 +197 +198 +199 +200 +200 +201 +200 +201 +203 +202 +204 +205 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +205 +205 +202 +202 +201 +200 +200 +201 +200 +198 +199 +198 +196 +197 +195 +194 +194 +191 +190 +188 +188 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +137 +133 +133 +130 +129 +125 +125 +125 +120 +119 +115 +116 +116 +110 +110 +110 +110 +109 +106 +106 +100 +100 +99 +96 +96 +90 +90 +87 +87 +86 +82 +82 +76 +76 +76 +73 +73 +68 +69 +68 +64 +65 +64 +64 +64 +58 +58 +54 +54 +55 +51 +50 +46 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +47 +47 +47 +51 +51 +54 +54 +54 +58 +58 +65 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +117 +120 +119 +126 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +143 +144 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +185 +184 +184 +189 +188 +190 +191 +191 +194 +195 +197 +196 +198 +198 +199 +200 +200 +200 +200 +200 +202 +202 +204 +205 +204 +204 +204 +207 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +194 +195 +195 +190 +191 +188 +189 +185 +185 +185 +182 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +140 +134 +133 +133 +130 +130 +129 +130 +130 +125 +125 +120 +120 +120 +115 +116 +110 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +77 +76 +72 +72 +73 +68 +68 +64 +64 +59 +58 +58 +55 +55 +50 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +20 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +46 +47 +50 +50 +51 +54 +54 +58 +59 +65 +65 +64 +68 +69 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +103 +106 +106 +110 +110 +116 +116 +116 +119 +119 +125 +125 +125 +130 +129 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +175 +179 +178 +183 +182 +183 +184 +185 +189 +189 +190 +190 +190 +194 +195 +196 +197 +196 +198 +199 +200 +200 +201 +200 +200 +202 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +201 +200 +200 +200 +200 +198 +198 +196 +197 +195 +195 +194 +190 +190 +188 +188 +189 +185 +184 +183 +182 +182 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +122 +119 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +74 +72 +72 +68 +68 +64 +65 +64 +58 +59 +55 +55 +55 +51 +50 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +51 +50 +50 +55 +55 +59 +59 +58 +64 +64 +64 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +110 +109 +109 +115 +115 +119 +120 +119 +125 +125 +129 +129 +132 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +176 +179 +179 +182 +182 +184 +184 +184 +189 +189 +191 +191 +191 +194 +194 +197 +197 +197 +199 +199 +200 +200 +200 +200 +200 +202 +202 +205 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +201 +201 +200 +200 +201 +198 +198 +198 +196 +196 +195 +194 +195 +191 +191 +188 +188 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +146 +143 +143 +141 +139 +139 +134 +133 +129 +129 +129 +125 +125 +119 +120 +119 +116 +115 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +55 +50 +50 +46 +47 +43 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +24 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +41 +40 +43 +43 +43 +47 +46 +50 +51 +50 +54 +54 +58 +58 +58 +65 +64 +69 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +183 +182 +184 +185 +189 +188 +189 +190 +191 +194 +195 +194 +197 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +205 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +201 +200 +198 +198 +196 +196 +196 +194 +194 +191 +191 +191 +189 +189 +184 +185 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +173 +173 +172 +169 +169 +165 +165 +166 +161 +161 +157 +157 +157 +157 +157 +151 +151 +146 +147 +147 +143 +143 +139 +140 +139 +133 +133 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +112 +110 +109 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +81 +82 +82 +76 +76 +73 +72 +73 +68 +68 +64 +64 +58 +58 +58 +55 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +48 +51 +50 +54 +55 +58 +58 +58 +64 +64 +68 +68 +68 +73 +72 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +105 +106 +110 +109 +115 +116 +116 +120 +119 +125 +125 +125 +130 +129 +134 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +174 +178 +179 +178 +183 +183 +184 +184 +189 +189 +188 +190 +190 +194 +194 +194 +196 +197 +199 +198 +198 +201 +201 +200 +200 +200 +202 +203 +204 +204 +205 +205 +204 +206 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +205 +204 +204 +204 +205 +202 +202 +201 +200 +201 +201 +201 +199 +198 +197 +197 +197 +194 +194 +190 +190 +191 +188 +188 +185 +184 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +168 +169 +165 +165 +161 +161 +161 +156 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +130 +125 +126 +120 +119 +115 +115 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +73 +72 +68 +68 +65 +64 +64 +59 +58 +55 +55 +55 +51 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +38 +37 +41 +40 +43 +43 +47 +47 +47 +51 +51 +54 +55 +54 +59 +58 +59 +58 +58 +64 +64 +68 +68 +68 +73 +72 +76 +76 +79 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +120 +119 +120 +125 +125 +129 +129 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +182 +184 +184 +184 +188 +188 +190 +191 +191 +194 +194 +197 +197 +197 +199 +199 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +204 +205 +205 +204 +204 +205 +205 +203 +202 +203 +200 +200 +200 +200 +200 +199 +198 +197 +196 +196 +195 +194 +191 +190 +191 +188 +189 +184 +184 +184 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +146 +147 +145 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +115 +116 +109 +109 +106 +105 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +55 +54 +51 +50 +46 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +15 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +24 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +56 +58 +58 +64 +65 +69 +69 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +109 +110 +110 +116 +115 +119 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +188 +188 +190 +191 +194 +194 +197 +196 +197 +198 +198 +200 +201 +200 +201 +201 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +207 +206 +205 +204 +204 +204 +205 +204 +204 +204 +202 +202 +200 +201 +201 +200 +201 +199 +199 +200 +196 +196 +194 +194 +190 +191 +191 +188 +188 +185 +185 +184 +182 +182 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +144 +143 +139 +139 +140 +133 +133 +129 +129 +130 +126 +126 +120 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +65 +64 +64 +59 +58 +54 +55 +55 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +12 +13 +13 +14 +13 +14 +15 +15 +16 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +26 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +44 +47 +47 +51 +50 +54 +54 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +85 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +126 +125 +125 +130 +129 +133 +133 +133 +140 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +160 +160 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +185 +189 +189 +189 +190 +190 +194 +194 +195 +196 +196 +198 +199 +199 +200 +200 +200 +200 +200 +202 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +203 +201 +200 +200 +200 +200 +199 +198 +199 +196 +197 +195 +194 +194 +190 +191 +191 +190 +190 +189 +188 +184 +185 +185 +183 +183 +179 +179 +175 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +129 +129 +125 +126 +120 +120 +120 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +77 +76 +72 +72 +68 +68 +68 +64 +58 +58 +58 +58 +54 +55 +50 +51 +50 +46 +47 +43 +42 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +35 +37 +36 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +59 +59 +65 +64 +68 +68 +68 +72 +72 +77 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +109 +110 +115 +116 +119 +119 +119 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +185 +185 +188 +188 +191 +190 +190 +194 +195 +196 +197 +196 +198 +198 +200 +200 +201 +200 +200 +202 +203 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +205 +204 +205 +202 +202 +203 +200 +200 +200 +201 +200 +199 +198 +198 +198 +198 +196 +196 +194 +194 +195 +191 +191 +188 +188 +185 +185 +185 +183 +182 +178 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +126 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +65 +64 +59 +58 +54 +54 +55 +50 +51 +47 +46 +43 +42 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +14 +15 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +54 +58 +59 +65 +64 +68 +69 +69 +73 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +116 +120 +120 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +183 +185 +185 +189 +189 +188 +190 +190 +195 +194 +195 +196 +197 +198 +198 +199 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +205 +204 +204 +204 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +203 +202 +202 +200 +200 +200 +200 +201 +199 +198 +196 +197 +195 +194 +195 +190 +190 +189 +189 +188 +185 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +125 +125 +119 +119 +120 +115 +115 +109 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +55 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +26 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +46 +47 +50 +51 +51 +54 +54 +55 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +115 +119 +120 +125 +125 +125 +130 +129 +133 +133 +134 +140 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +184 +189 +188 +189 +191 +190 +194 +195 +195 +196 +196 +197 +196 +197 +198 +199 +201 +200 +200 +200 +201 +202 +202 +203 +204 +205 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +205 +204 +204 +202 +203 +200 +200 +200 +200 +200 +198 +198 +196 +196 +197 +195 +195 +191 +191 +190 +188 +189 +184 +185 +185 +182 +183 +179 +178 +175 +175 +174 +173 +172 +168 +169 +170 +165 +165 +161 +160 +162 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +120 +120 +120 +116 +115 +110 +110 +110 +106 +105 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +59 +55 +55 +50 +50 +51 +47 +47 +42 +42 +44 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +54 +58 +58 +58 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +116 +115 +119 +119 +126 +125 +125 +129 +130 +134 +133 +133 +139 +139 +140 +139 +139 +144 +144 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +178 +179 +179 +179 +179 +183 +182 +184 +184 +185 +188 +188 +191 +190 +191 +194 +195 +197 +196 +198 +199 +198 +200 +200 +200 +200 +200 +202 +202 +202 +202 +202 +204 +205 +204 +204 +205 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +200 +201 +201 +198 +198 +196 +197 +195 +195 +194 +190 +190 +189 +188 +189 +184 +184 +183 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +120 +120 +115 +115 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +83 +77 +76 +72 +72 +73 +68 +68 +64 +64 +58 +58 +59 +55 +55 +51 +51 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +54 +55 +58 +59 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +120 +125 +125 +126 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +179 +179 +182 +182 +185 +184 +185 +188 +189 +189 +189 +189 +191 +191 +195 +195 +195 +197 +196 +199 +198 +200 +200 +201 +200 +200 +202 +202 +203 +204 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +205 +204 +204 +205 +204 +202 +203 +202 +200 +200 +200 +200 +201 +199 +199 +196 +196 +197 +194 +194 +191 +190 +191 +189 +188 +184 +185 +183 +182 +183 +178 +179 +175 +175 +175 +172 +173 +169 +168 +168 +165 +165 +161 +160 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +130 +125 +125 +119 +120 +119 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +64 +65 +58 +59 +59 +55 +54 +51 +51 +51 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +20 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +40 +40 +43 +43 +42 +47 +47 +51 +51 +51 +54 +54 +58 +58 +59 +64 +64 +68 +68 +73 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +111 +116 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +164 +165 +168 +169 +169 +173 +173 +175 +175 +175 +178 +179 +179 +178 +179 +183 +182 +185 +184 +185 +189 +189 +191 +191 +192 +195 +195 +197 +197 +198 +198 +198 +200 +201 +200 +200 +200 +202 +203 +205 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +196 +196 +194 +194 +190 +190 +190 +189 +189 +184 +185 +185 +183 +183 +179 +178 +178 +174 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +116 +115 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +64 +64 +58 +58 +54 +54 +55 +51 +51 +46 +46 +46 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +29 +27 +27 +25 +25 +21 +20 +21 +19 +19 +17 +17 +17 +15 +15 +15 +14 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +34 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +52 +51 +51 +55 +55 +59 +58 +59 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +91 +96 +96 +101 +100 +100 +106 +106 +110 +110 +110 +116 +116 +115 +115 +116 +119 +120 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +146 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +175 +178 +178 +179 +182 +183 +185 +185 +185 +189 +189 +190 +190 +191 +195 +194 +197 +196 +196 +198 +199 +199 +200 +201 +201 +200 +202 +202 +204 +204 +205 +204 +204 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +205 +205 +204 +205 +202 +202 +201 +200 +200 +201 +200 +198 +198 +198 +196 +197 +195 +195 +194 +191 +191 +189 +188 +188 +185 +184 +183 +183 +183 +179 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +129 +129 +125 +126 +126 +119 +120 +116 +115 +115 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +65 +64 +65 +58 +58 +54 +54 +55 +51 +51 +46 +47 +43 +43 +42 +41 +41 +42 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +55 +54 +58 +58 +58 +64 +64 +68 +68 +67 +72 +72 +76 +77 +83 +82 +82 +86 +86 +90 +91 +90 +95 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +117 +119 +120 +125 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +185 +189 +189 +191 +191 +191 +195 +195 +196 +196 +198 +198 +199 +200 +200 +200 +200 +201 +202 +203 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +205 +205 +204 +204 +203 +202 +201 +201 +200 +200 +201 +198 +198 +198 +196 +197 +194 +195 +194 +190 +190 +188 +189 +185 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +126 +119 +120 +120 +115 +115 +110 +109 +111 +106 +106 +99 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +61 +58 +58 +54 +54 +50 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +51 +54 +54 +59 +58 +64 +64 +64 +69 +68 +72 +72 +72 +76 +77 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +110 +110 +116 +116 +115 +115 +115 +119 +120 +120 +120 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +142 +143 +144 +148 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +188 +190 +191 +191 +195 +194 +197 +196 +196 +199 +198 +200 +200 +200 +200 +201 +202 +202 +203 +204 +204 +205 +204 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +203 +200 +201 +201 +200 +199 +198 +199 +196 +196 +194 +195 +194 +190 +190 +189 +188 +189 +184 +184 +182 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +131 +129 +129 +125 +125 +119 +119 +119 +116 +116 +110 +109 +110 +106 +106 +105 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +73 +72 +72 +68 +68 +69 +68 +68 +64 +64 +58 +58 +59 +54 +54 +50 +51 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +16 +15 +14 +13 +13 +12 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +50 +50 +51 +55 +54 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +105 +110 +109 +115 +115 +118 +119 +120 +125 +126 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +167 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +189 +188 +188 +190 +190 +194 +194 +195 +196 +197 +199 +198 +200 +200 +201 +200 +201 +202 +202 +202 +204 +205 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +205 +204 +204 +204 +204 +204 +205 +205 +202 +203 +200 +200 +200 +201 +201 +198 +199 +198 +196 +197 +194 +194 +195 +190 +190 +188 +189 +184 +184 +184 +183 +183 +179 +179 +179 +175 +174 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +125 +120 +119 +119 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +59 +55 +55 +55 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +52 +54 +54 +58 +58 +65 +65 +64 +68 +68 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +105 +110 +110 +110 +116 +115 +119 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +140 +144 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +188 +189 +190 +190 +191 +195 +194 +196 +196 +196 +198 +198 +201 +200 +200 +200 +201 +202 +203 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +203 +201 +200 +201 +200 +201 +198 +199 +196 +196 +194 +194 +194 +191 +190 +189 +188 +188 +185 +185 +185 +185 +185 +183 +182 +179 +179 +179 +174 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +134 +133 +131 +129 +129 +126 +125 +120 +120 +119 +115 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +55 +50 +50 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +54 +59 +58 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +116 +116 +119 +120 +120 +125 +125 +129 +130 +134 +133 +133 +139 +139 +143 +144 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +179 +178 +179 +183 +183 +184 +185 +185 +188 +189 +191 +191 +190 +194 +195 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +203 +201 +201 +200 +200 +201 +198 +198 +198 +196 +196 +195 +195 +194 +191 +191 +188 +188 +189 +184 +184 +182 +182 +183 +178 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +140 +139 +133 +133 +130 +129 +130 +126 +126 +120 +120 +120 +115 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +59 +55 +55 +51 +51 +50 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +20 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +51 +55 +55 +58 +58 +59 +65 +64 +69 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +87 +90 +90 +91 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +125 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +150 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +185 +188 +188 +191 +190 +191 +194 +194 +196 +197 +197 +199 +199 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +204 +203 +203 +200 +200 +200 +200 +200 +199 +198 +198 +196 +197 +195 +194 +195 +191 +190 +188 +189 +186 +185 +185 +183 +182 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +150 +147 +147 +144 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +119 +119 +116 +115 +109 +110 +110 +106 +106 +100 +99 +99 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +58 +58 +55 +54 +51 +51 +47 +46 +46 +43 +43 +40 +41 +40 +37 +37 +33 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +20 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +46 +46 +51 +51 +55 +54 +55 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +81 +86 +86 +86 +90 +89 +96 +96 +96 +100 +100 +106 +105 +110 +109 +110 +116 +116 +119 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +185 +188 +188 +188 +191 +191 +194 +195 +197 +197 +197 +198 +198 +200 +200 +201 +201 +201 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +202 +200 +201 +201 +200 +200 +199 +199 +196 +197 +195 +194 +195 +190 +190 +188 +189 +188 +184 +184 +183 +183 +183 +179 +179 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +59 +58 +58 +54 +54 +50 +50 +51 +46 +47 +43 +43 +42 +41 +41 +36 +38 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +12 +16 +15 +17 +16 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +33 +33 +33 +37 +37 +40 +41 +40 +43 +43 +47 +47 +48 +51 +50 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +126 +125 +126 +129 +130 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +184 +188 +189 +191 +191 +195 +194 +195 +196 +197 +198 +198 +198 +200 +200 +200 +200 +200 +200 +201 +203 +202 +202 +204 +205 +205 +204 +205 +207 +207 +206 +207 +207 +207 +207 +206 +206 +206 +206 +206 +207 +206 +205 +204 +204 +205 +204 +202 +202 +202 +201 +201 +200 +201 +199 +199 +199 +197 +196 +194 +195 +194 +190 +190 +189 +189 +188 +185 +185 +185 +185 +185 +183 +183 +179 +178 +179 +175 +174 +172 +173 +171 +169 +169 +165 +165 +161 +160 +161 +157 +157 +151 +150 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +130 +125 +125 +119 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +69 +68 +64 +65 +59 +58 +58 +54 +55 +50 +50 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +42 +47 +47 +47 +50 +50 +55 +54 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +87 +85 +89 +90 +96 +95 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +119 +125 +126 +125 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +183 +184 +184 +188 +189 +188 +190 +190 +194 +195 +194 +196 +196 +198 +198 +199 +201 +201 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +204 +205 +204 +205 +202 +202 +200 +200 +201 +200 +201 +198 +198 +198 +196 +196 +197 +197 +197 +194 +194 +190 +190 +191 +189 +188 +184 +185 +184 +183 +182 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +160 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +140 +134 +133 +129 +129 +129 +125 +125 +119 +119 +120 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +91 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +69 +64 +64 +58 +59 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +26 +31 +31 +31 +32 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +51 +55 +54 +58 +58 +63 +64 +64 +68 +68 +72 +72 +72 +76 +76 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +109 +109 +110 +116 +116 +119 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +188 +189 +189 +190 +190 +195 +195 +197 +197 +197 +198 +198 +200 +201 +200 +201 +201 +201 +201 +200 +202 +202 +205 +205 +204 +204 +205 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +197 +196 +195 +195 +190 +190 +190 +188 +188 +185 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +130 +125 +126 +119 +120 +119 +116 +116 +109 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +58 +54 +55 +55 +55 +55 +50 +50 +46 +47 +47 +43 +43 +41 +41 +42 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +26 +27 +27 +31 +31 +32 +33 +36 +37 +37 +40 +41 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +55 +54 +58 +59 +64 +65 +64 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +111 +116 +116 +115 +119 +119 +126 +126 +130 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +175 +175 +175 +179 +179 +182 +183 +183 +185 +184 +185 +184 +185 +188 +189 +191 +191 +191 +195 +195 +197 +196 +197 +199 +199 +200 +200 +200 +201 +201 +202 +203 +204 +205 +204 +204 +205 +205 +204 +205 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +207 +207 +206 +205 +205 +204 +204 +204 +202 +202 +202 +200 +201 +201 +200 +200 +199 +198 +196 +197 +197 +194 +195 +190 +190 +188 +189 +189 +185 +185 +182 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +148 +143 +143 +139 +139 +140 +134 +133 +129 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +59 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +40 +38 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +20 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +54 +59 +59 +59 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +119 +126 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +189 +189 +189 +190 +191 +194 +194 +196 +197 +197 +198 +199 +200 +200 +200 +200 +200 +200 +201 +201 +202 +202 +204 +204 +205 +204 +204 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +205 +204 +202 +202 +200 +200 +201 +201 +201 +199 +198 +197 +196 +196 +195 +195 +190 +190 +191 +188 +189 +185 +184 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +126 +119 +120 +116 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +77 +72 +72 +68 +68 +65 +65 +64 +59 +58 +54 +55 +54 +50 +51 +51 +51 +51 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +58 +58 +58 +65 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +119 +125 +126 +129 +130 +130 +133 +133 +139 +138 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +174 +176 +178 +179 +182 +183 +184 +184 +184 +188 +189 +191 +190 +191 +194 +194 +195 +194 +194 +196 +197 +198 +198 +199 +200 +201 +200 +201 +202 +202 +203 +204 +204 +204 +205 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +205 +205 +205 +203 +203 +203 +200 +201 +200 +200 +200 +199 +198 +197 +196 +196 +195 +195 +191 +190 +191 +188 +189 +185 +185 +185 +182 +182 +178 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +134 +133 +130 +129 +129 +125 +125 +120 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +64 +64 +65 +58 +58 +54 +54 +55 +51 +51 +47 +47 +47 +42 +43 +41 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +51 +51 +55 +55 +54 +59 +58 +64 +65 +65 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +168 +169 +172 +173 +173 +175 +175 +179 +179 +178 +182 +182 +183 +183 +182 +184 +185 +188 +189 +189 +190 +191 +195 +194 +196 +196 +197 +198 +198 +200 +201 +201 +201 +200 +203 +202 +202 +204 +204 +204 +205 +204 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +207 +205 +204 +205 +204 +204 +205 +205 +204 +202 +202 +200 +201 +200 +200 +200 +198 +199 +199 +196 +197 +194 +195 +191 +191 +190 +189 +189 +185 +185 +184 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +130 +125 +126 +125 +119 +119 +115 +115 +116 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +65 +58 +58 +55 +55 +54 +51 +50 +47 +48 +46 +43 +42 +43 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +30 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +34 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +55 +55 +55 +58 +59 +64 +64 +64 +69 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +120 +120 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +182 +182 +183 +184 +185 +188 +188 +189 +190 +190 +194 +194 +194 +196 +197 +198 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +205 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +204 +204 +204 +204 +204 +202 +203 +201 +201 +200 +201 +200 +198 +198 +198 +199 +199 +196 +196 +195 +195 +194 +190 +190 +188 +188 +188 +184 +184 +183 +183 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +125 +125 +125 +120 +119 +115 +115 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +68 +68 +69 +64 +64 +58 +58 +59 +54 +54 +51 +51 +47 +47 +47 +43 +42 +41 +40 +41 +37 +38 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +20 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +64 +64 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +116 +119 +120 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +156 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +185 +185 +189 +189 +189 +191 +191 +194 +194 +196 +196 +197 +198 +198 +200 +201 +201 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +207 +207 +207 +206 +206 +207 +204 +204 +204 +205 +204 +203 +203 +202 +200 +200 +201 +200 +200 +199 +199 +196 +196 +197 +194 +194 +190 +191 +189 +189 +188 +185 +184 +183 +183 +183 +179 +178 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +133 +133 +133 +129 +130 +126 +126 +126 +119 +119 +116 +116 +113 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +65 +64 +59 +59 +54 +54 +54 +50 +50 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +54 +59 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +101 +100 +106 +106 +110 +110 +109 +116 +116 +119 +119 +120 +126 +125 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +188 +189 +188 +190 +191 +194 +194 +194 +196 +197 +198 +198 +199 +200 +200 +200 +200 +200 +202 +203 +204 +204 +205 +204 +204 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +205 +204 +204 +202 +202 +200 +200 +200 +201 +200 +198 +198 +197 +197 +197 +194 +194 +190 +191 +190 +188 +189 +185 +184 +184 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +144 +139 +139 +139 +133 +133 +129 +129 +130 +126 +126 +119 +119 +115 +115 +115 +110 +110 +106 +105 +106 +100 +99 +100 +100 +100 +96 +96 +90 +90 +90 +86 +85 +82 +82 +77 +76 +76 +72 +73 +68 +68 +68 +64 +64 +59 +59 +58 +55 +55 +51 +50 +50 +47 +47 +43 +43 +43 +40 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +24 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +42 +47 +47 +47 +51 +50 +54 +54 +55 +58 +59 +64 +65 +65 +68 +68 +72 +72 +72 +76 +77 +82 +82 +84 +86 +85 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +109 +110 +110 +109 +115 +115 +120 +119 +120 +125 +125 +129 +129 +132 +133 +133 +140 +140 +143 +143 +143 +148 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +177 +179 +178 +182 +182 +185 +184 +185 +188 +189 +190 +191 +191 +194 +194 +196 +197 +196 +198 +199 +201 +200 +201 +200 +201 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +207 +205 +205 +204 +204 +205 +202 +202 +201 +200 +200 +200 +200 +198 +198 +199 +197 +197 +194 +195 +194 +190 +190 +189 +188 +189 +185 +185 +183 +183 +183 +178 +179 +175 +175 +172 +172 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +133 +133 +129 +129 +130 +126 +125 +120 +120 +119 +116 +115 +115 +115 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +65 +58 +58 +54 +54 +54 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +12 +15 +16 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +46 +47 +50 +51 +51 +54 +55 +58 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +115 +119 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +182 +185 +185 +189 +189 +188 +191 +191 +194 +194 +195 +197 +196 +199 +199 +200 +200 +201 +201 +200 +203 +203 +202 +205 +204 +204 +204 +204 +206 +206 +207 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +202 +200 +201 +200 +200 +200 +198 +198 +196 +196 +197 +194 +195 +190 +191 +190 +189 +188 +184 +185 +182 +183 +182 +179 +179 +175 +174 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +125 +126 +125 +126 +125 +120 +120 +115 +115 +116 +109 +110 +106 +106 +101 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +65 +59 +58 +55 +54 +50 +51 +51 +46 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +32 +31 +31 +32 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +58 +59 +60 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +109 +110 +110 +115 +116 +120 +119 +119 +125 +125 +130 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +160 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +183 +185 +185 +188 +188 +189 +190 +191 +195 +195 +197 +197 +197 +198 +198 +200 +200 +200 +200 +200 +203 +203 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +206 +204 +205 +204 +205 +205 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +197 +196 +197 +195 +195 +191 +191 +188 +189 +188 +185 +185 +183 +183 +183 +179 +179 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +152 +151 +151 +148 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +130 +129 +125 +126 +119 +119 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +65 +64 +64 +59 +59 +55 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +46 +51 +51 +50 +54 +54 +58 +58 +59 +64 +65 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +106 +110 +109 +115 +116 +116 +120 +120 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +184 +183 +183 +185 +185 +189 +189 +188 +190 +190 +195 +194 +195 +197 +197 +199 +198 +198 +200 +200 +200 +200 +201 +203 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +201 +201 +201 +199 +199 +196 +197 +196 +194 +194 +195 +194 +195 +190 +190 +188 +189 +188 +185 +185 +183 +183 +180 +179 +179 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +133 +134 +133 +129 +129 +126 +126 +125 +119 +119 +115 +115 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +90 +89 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +73 +69 +69 +64 +65 +65 +59 +58 +54 +54 +55 +50 +50 +47 +46 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +30 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +119 +125 +126 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +189 +190 +191 +194 +194 +197 +196 +197 +198 +198 +201 +200 +201 +200 +200 +202 +203 +202 +205 +205 +204 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +204 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +200 +200 +198 +199 +197 +196 +195 +195 +194 +191 +190 +188 +189 +189 +184 +184 +183 +182 +182 +178 +179 +179 +178 +179 +175 +175 +173 +172 +173 +169 +169 +164 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +134 +133 +129 +129 +125 +126 +120 +119 +115 +115 +109 +110 +109 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +64 +59 +58 +59 +55 +55 +50 +50 +51 +46 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +30 +31 +31 +27 +27 +24 +24 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +18 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +42 +43 +43 +46 +47 +51 +51 +51 +54 +54 +59 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +109 +115 +115 +119 +120 +120 +125 +126 +129 +129 +129 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +172 +173 +175 +175 +175 +179 +178 +183 +182 +185 +184 +184 +189 +189 +190 +190 +190 +195 +194 +196 +197 +197 +199 +199 +200 +200 +200 +200 +200 +203 +202 +203 +204 +204 +204 +204 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +205 +204 +204 +205 +204 +202 +202 +201 +200 +201 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +191 +190 +190 +190 +189 +189 +185 +184 +185 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +73 +68 +68 +68 +64 +65 +58 +58 +58 +54 +55 +50 +50 +50 +47 +46 +43 +42 +43 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +32 +35 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +50 +54 +54 +59 +58 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +120 +125 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +180 +179 +178 +182 +183 +184 +185 +184 +189 +189 +191 +190 +191 +194 +194 +197 +196 +197 +199 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +205 +205 +204 +202 +202 +202 +200 +201 +200 +201 +200 +198 +198 +199 +198 +198 +196 +196 +194 +195 +195 +190 +191 +188 +189 +186 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +119 +119 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +54 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +51 +54 +54 +55 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +105 +106 +106 +109 +110 +116 +115 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +189 +189 +188 +190 +191 +194 +194 +195 +197 +197 +199 +199 +200 +200 +200 +200 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +204 +207 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +197 +197 +197 +194 +194 +190 +191 +190 +188 +189 +184 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +119 +115 +115 +110 +110 +109 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +59 +58 +58 +54 +54 +51 +51 +51 +47 +47 +42 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +14 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +19 +18 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +46 +47 +51 +51 +54 +55 +55 +59 +58 +64 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +95 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +120 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +179 +182 +182 +184 +185 +189 +188 +188 +190 +191 +194 +194 +194 +196 +196 +197 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +203 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +203 +200 +200 +200 +200 +200 +198 +198 +196 +197 +196 +194 +195 +190 +190 +191 +188 +188 +185 +185 +185 +183 +183 +179 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +120 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +87 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +55 +54 +50 +50 +47 +46 +47 +43 +43 +41 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +20 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +40 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +54 +58 +58 +59 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +109 +110 +116 +116 +119 +120 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +183 +183 +183 +185 +184 +188 +189 +189 +190 +190 +194 +194 +195 +196 +197 +198 +198 +200 +201 +200 +201 +200 +203 +203 +202 +205 +204 +205 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +205 +204 +204 +205 +204 +202 +202 +201 +200 +200 +200 +201 +198 +198 +198 +196 +197 +194 +194 +190 +191 +191 +188 +188 +184 +185 +184 +183 +183 +179 +178 +179 +175 +174 +173 +173 +172 +169 +170 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +133 +130 +130 +125 +125 +125 +119 +120 +116 +116 +115 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +42 +41 +41 +40 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +12 +15 +14 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +51 +54 +55 +55 +59 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +106 +106 +106 +110 +109 +116 +115 +115 +119 +119 +119 +120 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +164 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +178 +180 +182 +182 +185 +184 +188 +188 +188 +190 +190 +194 +195 +195 +196 +196 +197 +196 +196 +198 +198 +200 +200 +201 +201 +200 +202 +202 +204 +205 +205 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +205 +204 +204 +204 +205 +202 +202 +200 +200 +201 +200 +200 +198 +198 +198 +197 +196 +194 +195 +194 +190 +190 +189 +188 +188 +185 +184 +182 +182 +182 +178 +179 +175 +175 +173 +173 +172 +169 +168 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +125 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +95 +96 +96 +90 +90 +87 +86 +87 +82 +82 +76 +76 +73 +72 +73 +68 +69 +64 +65 +64 +58 +58 +54 +54 +54 +51 +50 +46 +47 +47 +43 +43 +41 +42 +41 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +20 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +51 +50 +55 +55 +55 +58 +58 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +109 +115 +116 +115 +119 +120 +125 +125 +126 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +174 +175 +178 +178 +179 +183 +183 +184 +185 +185 +189 +189 +189 +189 +189 +191 +191 +194 +194 +195 +197 +196 +199 +199 +199 +200 +201 +201 +200 +202 +202 +202 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +202 +200 +201 +200 +200 +201 +199 +198 +197 +196 +196 +195 +195 +190 +191 +190 +188 +189 +185 +185 +182 +182 +182 +179 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +152 +152 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +120 +120 +116 +115 +109 +110 +110 +106 +105 +100 +100 +101 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +72 +73 +72 +68 +68 +64 +64 +65 +58 +58 +55 +54 +55 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +26 +25 +21 +20 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +115 +115 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +179 +178 +182 +183 +182 +184 +185 +188 +188 +190 +190 +191 +194 +194 +196 +196 +197 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +205 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +195 +195 +194 +191 +190 +188 +188 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +126 +125 +119 +120 +120 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +69 +68 +65 +58 +58 +58 +58 +54 +55 +51 +51 +51 +47 +47 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +51 +51 +51 +55 +54 +58 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +85 +86 +87 +90 +89 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +116 +116 +116 +115 +120 +120 +125 +125 +126 +129 +129 +133 +133 +132 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +184 +185 +189 +189 +191 +190 +190 +195 +194 +197 +196 +196 +198 +199 +200 +200 +201 +201 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +198 +197 +196 +194 +195 +194 +190 +190 +189 +188 +188 +185 +185 +183 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +134 +129 +129 +125 +125 +125 +119 +120 +116 +116 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +77 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +58 +58 +58 +55 +54 +50 +51 +51 +47 +46 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +46 +50 +50 +54 +55 +55 +59 +58 +64 +64 +64 +69 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +120 +120 +125 +125 +128 +129 +129 +134 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +171 +173 +172 +175 +174 +179 +178 +178 +183 +182 +185 +185 +185 +189 +188 +191 +191 +191 +195 +195 +196 +196 +197 +199 +199 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +198 +196 +196 +194 +194 +194 +190 +191 +188 +189 +189 +185 +184 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +125 +119 +119 +116 +116 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +65 +64 +59 +58 +58 +54 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +54 +54 +54 +58 +58 +64 +64 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +89 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +112 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +159 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +183 +183 +182 +185 +185 +189 +188 +189 +191 +191 +194 +194 +196 +197 +197 +198 +198 +200 +200 +200 +200 +200 +202 +203 +203 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +197 +194 +194 +190 +190 +189 +188 +189 +184 +184 +182 +182 +183 +178 +179 +179 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +118 +115 +115 +110 +110 +106 +105 +106 +100 +100 +96 +95 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +65 +64 +58 +58 +58 +54 +55 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +12 +13 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +42 +43 +46 +47 +51 +51 +54 +54 +55 +59 +59 +64 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +115 +116 +119 +120 +119 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +174 +175 +179 +179 +182 +182 +184 +184 +184 +188 +188 +191 +191 +191 +194 +194 +196 +197 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +205 +205 +205 +206 +207 +207 +205 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +201 +201 +201 +200 +199 +198 +199 +196 +196 +194 +195 +195 +190 +191 +189 +189 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +168 +165 +164 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +126 +125 +120 +120 +119 +115 +115 +110 +109 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +83 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +55 +50 +50 +46 +47 +47 +43 +43 +41 +40 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +54 +54 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +182 +183 +184 +185 +189 +188 +188 +190 +190 +195 +194 +195 +196 +196 +198 +198 +198 +200 +200 +200 +200 +203 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +205 +204 +204 +203 +202 +202 +201 +200 +201 +200 +200 +198 +198 +197 +196 +196 +194 +195 +191 +191 +191 +189 +189 +185 +185 +185 +182 +183 +179 +179 +174 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +134 +133 +129 +129 +130 +125 +125 +119 +119 +120 +116 +115 +115 +116 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +54 +54 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +16 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +46 +47 +46 +47 +47 +51 +50 +54 +54 +54 +58 +58 +64 +65 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +112 +115 +116 +119 +119 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +185 +185 +189 +189 +191 +190 +191 +194 +195 +197 +197 +199 +198 +199 +201 +200 +200 +200 +200 +202 +202 +205 +205 +204 +204 +204 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +200 +201 +200 +198 +198 +199 +196 +197 +194 +194 +195 +191 +191 +188 +188 +185 +185 +184 +182 +183 +179 +178 +179 +175 +175 +175 +175 +175 +172 +173 +169 +169 +166 +166 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +134 +133 +129 +129 +125 +125 +126 +119 +119 +115 +115 +111 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +65 +64 +62 +58 +58 +54 +55 +51 +51 +51 +46 +47 +42 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +20 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +46 +47 +48 +50 +51 +55 +54 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +115 +115 +115 +120 +119 +125 +125 +126 +129 +129 +133 +133 +134 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +179 +179 +183 +182 +185 +184 +189 +188 +189 +190 +190 +194 +194 +195 +196 +197 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +198 +196 +196 +197 +195 +194 +190 +191 +190 +189 +188 +185 +185 +184 +182 +183 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +125 +125 +119 +119 +116 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +73 +68 +68 +68 +65 +64 +65 +64 +65 +58 +59 +58 +54 +54 +50 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +35 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +50 +55 +55 +55 +55 +54 +58 +58 +65 +65 +64 +69 +68 +72 +72 +75 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +189 +188 +189 +190 +190 +194 +194 +195 +196 +196 +198 +199 +199 +200 +201 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +207 +207 +204 +205 +205 +204 +202 +202 +203 +201 +200 +200 +200 +200 +198 +198 +196 +196 +196 +195 +195 +190 +190 +190 +188 +188 +185 +184 +184 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +134 +134 +133 +129 +129 +125 +125 +125 +119 +120 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +55 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +57 +59 +59 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +105 +109 +110 +110 +116 +116 +119 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +174 +179 +178 +183 +182 +182 +184 +184 +188 +188 +189 +190 +191 +195 +194 +197 +196 +196 +199 +199 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +205 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +199 +198 +196 +197 +194 +194 +190 +190 +190 +188 +189 +184 +184 +185 +182 +183 +182 +182 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +120 +115 +116 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +75 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +54 +50 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +46 +51 +50 +50 +54 +54 +59 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +100 +105 +106 +110 +110 +110 +116 +116 +119 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +184 +185 +185 +188 +188 +191 +190 +190 +195 +194 +196 +197 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +207 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +205 +204 +204 +203 +203 +201 +200 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +195 +194 +194 +190 +190 +188 +188 +189 +185 +185 +182 +183 +180 +178 +179 +175 +175 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +54 +50 +50 +47 +46 +47 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +51 +51 +54 +55 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +115 +120 +119 +125 +125 +129 +129 +133 +134 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +178 +183 +182 +185 +185 +185 +189 +189 +190 +190 +191 +195 +194 +197 +196 +197 +198 +198 +200 +200 +201 +201 +201 +202 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +190 +190 +189 +188 +189 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +144 +143 +139 +139 +139 +133 +133 +130 +130 +129 +125 +125 +119 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +59 +59 +54 +54 +50 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +175 +179 +178 +182 +182 +183 +185 +185 +188 +189 +189 +190 +191 +195 +194 +197 +196 +197 +198 +198 +200 +201 +200 +200 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +199 +199 +199 +196 +196 +194 +194 +194 +190 +191 +189 +189 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +120 +120 +115 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +69 +68 +65 +64 +64 +59 +59 +55 +54 +54 +50 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +51 +51 +54 +54 +54 +58 +58 +64 +65 +64 +69 +68 +72 +72 +72 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +178 +182 +182 +182 +184 +184 +189 +189 +189 +191 +191 +190 +190 +190 +194 +195 +197 +197 +197 +198 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +202 +201 +201 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +190 +191 +191 +188 +189 +184 +185 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +134 +133 +129 +130 +129 +126 +125 +120 +119 +120 +116 +115 +109 +110 +110 +106 +106 +99 +100 +100 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +50 +50 +50 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +55 +59 +58 +58 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +126 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +174 +175 +179 +178 +178 +183 +182 +183 +183 +183 +184 +184 +189 +189 +189 +190 +191 +194 +194 +195 +196 +197 +198 +199 +200 +200 +201 +200 +200 +203 +202 +202 +204 +204 +204 +204 +205 +204 +204 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +199 +196 +196 +195 +194 +190 +190 +190 +188 +189 +184 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +126 +119 +119 +116 +116 +116 +110 +110 +106 +106 +100 +101 +101 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +65 +58 +58 +55 +54 +51 +51 +51 +46 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +16 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +54 +55 +54 +58 +59 +65 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +168 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +184 +189 +189 +191 +190 +191 +194 +194 +196 +196 +197 +199 +198 +199 +198 +198 +201 +200 +201 +201 +201 +202 +202 +204 +205 +204 +205 +205 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +203 +200 +200 +201 +200 +200 +199 +198 +196 +196 +197 +194 +195 +191 +190 +190 +189 +189 +185 +184 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +134 +134 +129 +129 +125 +126 +120 +119 +120 +116 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +59 +59 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +18 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +33 +33 +37 +36 +41 +41 +42 +43 +43 +47 +47 +50 +51 +51 +55 +55 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +115 +119 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +150 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +183 +183 +183 +184 +185 +188 +188 +188 +191 +191 +191 +191 +190 +194 +194 +197 +196 +197 +198 +199 +200 +200 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +199 +198 +196 +196 +194 +194 +195 +191 +190 +188 +188 +188 +184 +185 +183 +183 +179 +178 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +150 +151 +147 +147 +148 +143 +143 +139 +139 +134 +134 +133 +129 +129 +125 +125 +125 +119 +120 +115 +116 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +50 +49 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +58 +59 +59 +64 +65 +69 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +120 +120 +125 +126 +125 +130 +129 +133 +134 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +174 +174 +178 +179 +178 +179 +179 +182 +183 +185 +185 +184 +188 +188 +190 +190 +191 +194 +194 +196 +196 +198 +198 +198 +201 +200 +200 +201 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +207 +207 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +198 +197 +196 +194 +195 +191 +191 +190 +189 +188 +184 +185 +184 +183 +183 +183 +183 +183 +178 +179 +175 +174 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +130 +126 +126 +120 +120 +120 +115 +115 +110 +110 +106 +106 +105 +100 +100 +100 +100 +99 +96 +96 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +74 +72 +72 +68 +68 +64 +64 +65 +59 +58 +55 +54 +55 +51 +50 +51 +51 +51 +47 +47 +42 +43 +43 +41 +40 +37 +37 +35 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +42 +47 +47 +47 +50 +51 +55 +55 +55 +59 +59 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +83 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +110 +110 +110 +116 +115 +120 +120 +119 +125 +125 +129 +129 +131 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +172 +174 +175 +175 +178 +179 +182 +183 +183 +185 +184 +188 +189 +188 +190 +191 +195 +194 +194 +197 +196 +198 +198 +198 +201 +201 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +205 +205 +204 +204 +202 +203 +203 +201 +200 +200 +200 +200 +198 +198 +196 +196 +197 +194 +194 +191 +191 +191 +189 +188 +185 +185 +185 +182 +183 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +164 +161 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +144 +144 +139 +139 +133 +133 +129 +129 +129 +125 +126 +120 +119 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +55 +55 +51 +51 +50 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +32 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +47 +50 +51 +54 +54 +54 +59 +58 +65 +65 +64 +68 +68 +72 +73 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +122 +125 +125 +129 +129 +133 +133 +134 +140 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +183 +184 +184 +189 +189 +189 +191 +190 +194 +194 +195 +196 +196 +198 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +203 +201 +200 +201 +200 +201 +198 +198 +197 +197 +196 +195 +195 +190 +191 +191 +189 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +133 +128 +129 +130 +125 +126 +125 +126 +126 +119 +119 +115 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +77 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +55 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +24 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +47 +50 +50 +54 +55 +55 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +115 +116 +119 +120 +120 +125 +125 +129 +129 +129 +133 +133 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +182 +182 +185 +184 +185 +189 +189 +191 +190 +194 +195 +195 +197 +197 +198 +199 +198 +201 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +205 +207 +206 +207 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +199 +198 +196 +197 +195 +195 +191 +190 +190 +188 +189 +184 +184 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +130 +129 +129 +126 +126 +119 +119 +118 +116 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +90 +91 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +71 +68 +68 +64 +65 +58 +59 +59 +54 +55 +50 +51 +51 +47 +47 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +54 +54 +54 +58 +58 +64 +64 +65 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +119 +120 +119 +120 +125 +126 +129 +129 +130 +134 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +185 +185 +185 +188 +188 +190 +190 +191 +194 +194 +196 +197 +196 +199 +198 +200 +200 +200 +200 +201 +202 +202 +202 +204 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +205 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +201 +199 +199 +198 +196 +196 +194 +194 +194 +190 +191 +188 +188 +189 +185 +185 +183 +183 +183 +179 +179 +174 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +160 +157 +157 +157 +151 +151 +147 +147 +147 +143 +144 +140 +139 +139 +133 +133 +129 +129 +130 +126 +125 +120 +120 +115 +115 +115 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +73 +69 +68 +69 +64 +64 +58 +59 +59 +55 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +20 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +30 +31 +31 +33 +32 +37 +37 +37 +41 +40 +43 +43 +47 +47 +46 +50 +50 +54 +54 +54 +58 +58 +59 +59 +58 +64 +65 +68 +68 +68 +73 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +105 +110 +110 +116 +116 +116 +120 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +185 +184 +189 +189 +189 +191 +190 +195 +194 +194 +197 +197 +198 +198 +198 +201 +201 +200 +201 +203 +203 +202 +204 +204 +204 +205 +204 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +207 +204 +204 +205 +204 +203 +202 +202 +201 +201 +200 +201 +200 +198 +198 +197 +196 +196 +195 +195 +191 +191 +191 +188 +189 +184 +185 +186 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +140 +133 +133 +134 +129 +129 +125 +125 +125 +120 +120 +120 +119 +119 +116 +115 +110 +109 +110 +106 +106 +100 +100 +98 +96 +96 +91 +90 +86 +86 +86 +82 +82 +76 +77 +76 +73 +73 +68 +68 +68 +64 +64 +58 +58 +59 +54 +55 +50 +50 +47 +47 +47 +42 +43 +41 +41 +41 +36 +37 +33 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +24 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +51 +50 +55 +54 +59 +58 +61 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +108 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +188 +188 +188 +191 +190 +194 +195 +196 +196 +196 +198 +199 +200 +200 +200 +201 +200 +202 +203 +202 +204 +205 +204 +204 +204 +206 +207 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +201 +200 +200 +199 +198 +200 +196 +197 +195 +194 +190 +191 +190 +188 +188 +185 +184 +184 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +150 +147 +147 +143 +143 +143 +139 +139 +139 +139 +140 +133 +133 +129 +129 +129 +126 +125 +119 +119 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +50 +55 +55 +58 +58 +59 +65 +64 +64 +63 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +109 +115 +116 +116 +120 +120 +126 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +160 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +183 +182 +183 +184 +184 +188 +188 +189 +190 +190 +195 +194 +195 +196 +196 +199 +198 +198 +200 +201 +200 +200 +200 +202 +202 +204 +204 +205 +205 +204 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +198 +198 +196 +197 +196 +194 +194 +191 +191 +190 +189 +189 +184 +184 +184 +183 +183 +179 +178 +176 +174 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +134 +133 +134 +129 +129 +125 +125 +125 +119 +119 +115 +115 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +59 +54 +54 +54 +50 +51 +47 +47 +47 +42 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +12 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +20 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +50 +51 +51 +54 +54 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +178 +179 +183 +182 +184 +185 +185 +189 +189 +191 +190 +190 +195 +195 +196 +197 +196 +198 +199 +201 +200 +200 +200 +201 +203 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +205 +204 +203 +202 +201 +200 +200 +200 +201 +201 +200 +200 +198 +199 +196 +197 +196 +194 +194 +191 +190 +189 +188 +189 +184 +185 +183 +182 +182 +179 +179 +174 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +67 +68 +64 +64 +65 +58 +58 +55 +54 +51 +51 +51 +47 +47 +43 +42 +43 +41 +41 +37 +36 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +20 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +48 +50 +50 +54 +55 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +106 +106 +106 +109 +110 +116 +116 +115 +120 +119 +126 +125 +125 +129 +130 +134 +133 +133 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +178 +183 +182 +185 +184 +189 +188 +189 +191 +190 +194 +195 +195 +196 +197 +198 +198 +198 +200 +201 +200 +200 +200 +202 +202 +205 +204 +205 +204 +205 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +207 +204 +204 +205 +205 +205 +203 +203 +203 +201 +200 +200 +200 +198 +198 +198 +197 +197 +194 +194 +195 +191 +191 +188 +188 +188 +184 +186 +183 +182 +183 +179 +178 +175 +175 +174 +172 +173 +169 +169 +165 +165 +165 +160 +160 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +140 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +55 +55 +50 +50 +46 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +59 +58 +59 +64 +64 +68 +68 +69 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +119 +120 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +185 +189 +189 +190 +191 +190 +195 +194 +196 +196 +196 +198 +199 +201 +200 +201 +200 +201 +203 +202 +205 +204 +204 +204 +204 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +203 +203 +200 +200 +201 +200 +200 +198 +198 +198 +197 +196 +197 +197 +196 +195 +194 +190 +191 +191 +189 +189 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +119 +120 +116 +115 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +69 +65 +65 +58 +58 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +46 +47 +51 +51 +55 +54 +55 +59 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +119 +119 +120 +125 +126 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +182 +183 +184 +185 +189 +189 +189 +191 +190 +194 +195 +195 +197 +197 +199 +198 +200 +200 +201 +201 +200 +202 +203 +203 +204 +204 +204 +204 +204 +206 +207 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +200 +200 +200 +198 +198 +199 +196 +196 +194 +194 +193 +190 +191 +188 +189 +185 +185 +185 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +130 +129 +125 +125 +125 +119 +119 +115 +115 +115 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +51 +50 +51 +47 +46 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +54 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +144 +148 +147 +151 +151 +158 +158 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +184 +185 +189 +189 +190 +191 +195 +194 +194 +197 +196 +198 +199 +199 +201 +200 +201 +200 +200 +201 +201 +202 +203 +203 +204 +204 +204 +205 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +203 +201 +201 +201 +200 +201 +198 +198 +196 +196 +196 +195 +194 +191 +191 +190 +189 +188 +184 +184 +185 +182 +183 +178 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +120 +119 +119 +115 +116 +109 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +69 +69 +64 +64 +59 +59 +59 +55 +54 +54 +54 +54 +51 +51 +47 +46 +46 +43 +43 +41 +41 +41 +37 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +27 +31 +31 +33 +32 +35 +37 +37 +41 +42 +43 +43 +43 +46 +46 +51 +50 +51 +54 +55 +59 +58 +58 +65 +64 +68 +69 +69 +72 +72 +77 +76 +81 +82 +82 +87 +86 +90 +90 +89 +96 +95 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +120 +125 +126 +130 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +178 +179 +179 +183 +183 +185 +185 +184 +189 +188 +191 +191 +191 +194 +195 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +203 +202 +204 +204 +204 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +201 +198 +199 +196 +196 +197 +195 +194 +190 +191 +191 +189 +189 +185 +185 +182 +183 +183 +179 +178 +175 +175 +175 +172 +173 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +134 +134 +130 +129 +129 +125 +125 +120 +119 +119 +115 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +73 +73 +72 +68 +68 +65 +64 +64 +59 +59 +55 +55 +55 +50 +50 +47 +47 +43 +43 +43 +40 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +20 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +41 +41 +43 +44 +47 +47 +47 +50 +51 +55 +55 +59 +59 +59 +65 +65 +68 +68 +69 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +120 +119 +125 +126 +130 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +166 +169 +169 +169 +173 +173 +173 +173 +172 +175 +175 +179 +178 +179 +183 +183 +185 +185 +186 +189 +189 +191 +191 +190 +190 +190 +195 +194 +196 +196 +197 +199 +198 +199 +199 +198 +200 +201 +201 +201 +200 +202 +202 +205 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +197 +194 +194 +191 +191 +190 +189 +189 +185 +185 +185 +183 +182 +178 +179 +178 +175 +175 +173 +173 +170 +169 +169 +165 +165 +161 +161 +160 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +120 +119 +120 +116 +115 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +85 +82 +82 +79 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +59 +58 +54 +55 +54 +54 +54 +51 +50 +47 +46 +47 +43 +43 +41 +40 +39 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +14 +13 +12 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +51 +51 +55 +55 +54 +58 +58 +64 +65 +64 +68 +68 +72 +72 +73 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +115 +115 +116 +120 +119 +125 +125 +124 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +164 +165 +165 +169 +169 +172 +173 +173 +174 +175 +179 +178 +183 +183 +183 +184 +184 +189 +189 +188 +190 +190 +191 +190 +191 +194 +195 +197 +197 +197 +198 +198 +200 +200 +201 +201 +200 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +207 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +204 +202 +202 +200 +201 +201 +201 +201 +198 +199 +198 +196 +197 +194 +194 +195 +190 +191 +188 +189 +188 +185 +185 +182 +183 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +120 +120 +115 +115 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +73 +68 +68 +65 +64 +64 +58 +58 +55 +54 +54 +51 +50 +46 +47 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +46 +47 +51 +50 +54 +55 +54 +59 +58 +64 +64 +65 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +105 +110 +110 +115 +116 +116 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +144 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +182 +182 +183 +184 +185 +189 +189 +188 +191 +191 +194 +194 +196 +196 +197 +199 +198 +200 +200 +201 +201 +200 +203 +203 +203 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +207 +206 +206 +204 +204 +205 +204 +204 +202 +203 +203 +200 +201 +201 +200 +200 +199 +198 +196 +196 +196 +195 +195 +190 +190 +189 +188 +189 +185 +184 +183 +182 +182 +179 +178 +179 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +134 +130 +130 +129 +125 +125 +119 +119 +119 +115 +115 +110 +110 +105 +106 +105 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +74 +68 +68 +64 +64 +58 +58 +59 +54 +55 +51 +51 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +51 +51 +51 +55 +55 +59 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +115 +115 +115 +119 +119 +125 +126 +126 +129 +130 +133 +133 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +182 +182 +184 +184 +185 +189 +189 +190 +191 +191 +194 +195 +197 +197 +196 +198 +199 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +201 +200 +201 +200 +201 +198 +199 +198 +196 +197 +195 +194 +194 +190 +191 +188 +189 +188 +185 +184 +183 +183 +182 +178 +178 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +115 +116 +110 +110 +109 +109 +110 +106 +106 +99 +100 +100 +96 +96 +89 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +65 +65 +64 +65 +58 +58 +54 +54 +54 +50 +51 +46 +46 +45 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +51 +50 +54 +55 +59 +59 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +117 +119 +120 +125 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +184 +185 +188 +189 +190 +191 +191 +194 +195 +197 +197 +198 +198 +198 +201 +201 +201 +200 +201 +202 +202 +204 +204 +205 +204 +204 +207 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +201 +200 +201 +200 +198 +199 +198 +196 +197 +194 +194 +195 +191 +190 +188 +188 +185 +184 +184 +182 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +156 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +130 +130 +129 +129 +129 +125 +126 +120 +120 +119 +115 +116 +110 +110 +108 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +73 +72 +73 +68 +68 +64 +64 +62 +59 +58 +55 +54 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +77 +82 +83 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +105 +106 +110 +110 +110 +115 +115 +120 +119 +120 +125 +126 +125 +126 +126 +129 +129 +134 +133 +134 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +184 +188 +188 +189 +190 +190 +194 +194 +195 +196 +197 +199 +199 +198 +200 +200 +200 +201 +200 +203 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +203 +200 +201 +200 +200 +199 +198 +198 +196 +197 +195 +195 +194 +191 +191 +189 +189 +189 +185 +184 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +131 +129 +130 +126 +126 +119 +120 +120 +115 +115 +110 +110 +109 +106 +106 +106 +105 +106 +100 +100 +96 +96 +96 +90 +89 +86 +86 +83 +82 +82 +76 +77 +72 +73 +73 +68 +68 +65 +64 +64 +58 +58 +54 +54 +54 +50 +50 +47 +46 +47 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +15 +15 +17 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +42 +42 +46 +47 +51 +50 +51 +54 +54 +54 +54 +54 +59 +58 +64 +64 +64 +69 +68 +72 +72 +73 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +107 +110 +110 +110 +115 +115 +120 +119 +125 +125 +125 +129 +130 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +185 +184 +188 +188 +191 +190 +191 +195 +194 +196 +197 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +207 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +201 +199 +199 +198 +197 +197 +194 +195 +195 +190 +191 +188 +189 +189 +185 +184 +183 +182 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +126 +125 +126 +119 +119 +115 +115 +116 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +89 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +65 +58 +58 +55 +55 +50 +51 +50 +47 +47 +43 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +30 +31 +26 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +20 +25 +25 +28 +27 +27 +30 +31 +33 +33 +33 +37 +36 +40 +41 +41 +43 +43 +46 +46 +47 +51 +51 +54 +55 +54 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +77 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +105 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +125 +130 +129 +133 +133 +133 +139 +140 +144 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +174 +175 +179 +179 +178 +182 +182 +185 +184 +185 +188 +189 +190 +190 +195 +194 +195 +197 +197 +198 +199 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +204 +205 +204 +204 +205 +202 +203 +200 +200 +200 +200 +200 +199 +198 +200 +196 +197 +194 +195 +191 +191 +191 +189 +189 +184 +185 +184 +182 +183 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +158 +157 +151 +151 +147 +148 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +120 +120 +120 +116 +116 +109 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +42 +43 +47 +47 +47 +51 +50 +54 +54 +55 +59 +58 +58 +59 +59 +64 +64 +68 +68 +68 +73 +72 +76 +77 +79 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +99 +100 +105 +106 +110 +110 +109 +115 +115 +119 +119 +119 +125 +125 +129 +130 +132 +133 +133 +139 +139 +143 +144 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +185 +184 +188 +188 +188 +191 +190 +195 +195 +194 +196 +197 +198 +198 +198 +201 +201 +200 +200 +203 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +204 +204 +204 +204 +204 +203 +203 +202 +202 +202 +200 +200 +200 +200 +200 +200 +200 +199 +199 +198 +197 +196 +194 +194 +193 +191 +190 +188 +188 +185 +185 +185 +183 +182 +179 +179 +179 +175 +175 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +144 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +119 +119 +115 +116 +110 +109 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +69 +64 +65 +59 +58 +55 +55 +54 +51 +50 +47 +46 +47 +42 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +26 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +37 +37 +37 +40 +41 +43 +43 +43 +47 +47 +51 +51 +54 +55 +55 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +109 +109 +116 +116 +115 +120 +120 +125 +125 +126 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +185 +184 +188 +189 +190 +191 +194 +194 +195 +197 +196 +199 +199 +198 +201 +200 +200 +200 +200 +202 +203 +205 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +205 +204 +204 +202 +202 +203 +201 +201 +200 +200 +200 +199 +198 +196 +197 +194 +194 +195 +191 +190 +188 +189 +188 +185 +184 +185 +184 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +144 +143 +144 +140 +140 +133 +133 +134 +129 +129 +126 +126 +120 +119 +119 +116 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +59 +55 +55 +51 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +28 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +182 +183 +184 +184 +188 +189 +188 +190 +191 +195 +194 +194 +197 +196 +198 +198 +198 +201 +200 +200 +200 +201 +202 +203 +204 +205 +203 +204 +205 +206 +206 +206 +207 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +205 +205 +204 +202 +202 +201 +200 +200 +200 +200 +198 +199 +198 +197 +196 +197 +196 +196 +195 +195 +191 +190 +191 +188 +188 +185 +185 +184 +182 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +129 +125 +126 +119 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +55 +51 +50 +46 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +51 +51 +55 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +185 +184 +184 +189 +189 +191 +191 +191 +194 +194 +196 +196 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +203 +204 +204 +204 +204 +205 +202 +202 +200 +201 +200 +200 +200 +198 +198 +197 +196 +197 +194 +194 +190 +191 +191 +188 +189 +185 +184 +184 +183 +183 +179 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +134 +130 +129 +125 +125 +126 +119 +119 +116 +115 +110 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +59 +58 +58 +55 +55 +51 +51 +50 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +55 +55 +58 +59 +59 +59 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +116 +119 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +174 +175 +175 +179 +178 +183 +183 +184 +185 +184 +189 +188 +190 +190 +191 +194 +194 +197 +196 +197 +198 +198 +201 +201 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +207 +206 +206 +206 +207 +206 +207 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +201 +201 +199 +198 +197 +197 +196 +194 +194 +191 +190 +191 +189 +189 +184 +184 +185 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +126 +125 +119 +119 +119 +116 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +58 +54 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +130 +130 +129 +133 +133 +139 +140 +140 +143 +143 +147 +147 +147 +151 +151 +157 +156 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +178 +178 +182 +183 +183 +184 +184 +184 +184 +185 +188 +189 +190 +191 +191 +195 +194 +196 +196 +196 +198 +199 +200 +200 +200 +200 +200 +202 +203 +204 +204 +204 +204 +204 +205 +204 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +204 +205 +205 +205 +204 +202 +203 +202 +200 +200 +201 +201 +201 +198 +199 +196 +197 +196 +195 +195 +191 +190 +189 +188 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +83 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +44 +42 +42 +47 +47 +50 +51 +51 +55 +55 +58 +59 +64 +64 +65 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +116 +115 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +174 +179 +179 +179 +182 +183 +185 +184 +184 +188 +189 +191 +191 +192 +194 +195 +197 +196 +198 +199 +198 +200 +200 +200 +200 +200 +202 +202 +202 +202 +203 +204 +204 +204 +204 +205 +206 +207 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +201 +200 +200 +200 +201 +198 +199 +196 +197 +194 +194 +194 +191 +190 +188 +188 +189 +185 +185 +185 +184 +185 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +126 +119 +120 +116 +116 +110 +109 +109 +106 +106 +100 +100 +100 +95 +95 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +73 +69 +68 +64 +65 +58 +58 +58 +54 +55 +50 +50 +51 +46 +47 +47 +47 +47 +43 +43 +41 +40 +40 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +46 +51 +51 +54 +55 +55 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +120 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +160 +161 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +183 +185 +185 +185 +189 +188 +190 +190 +191 +194 +194 +195 +194 +195 +196 +196 +199 +198 +199 +200 +201 +201 +201 +201 +202 +203 +204 +204 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +207 +204 +204 +204 +204 +203 +202 +202 +200 +201 +200 +201 +200 +199 +198 +196 +196 +197 +195 +195 +191 +190 +190 +188 +189 +185 +185 +184 +183 +183 +179 +178 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +120 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +64 +64 +64 +59 +59 +54 +54 +54 +50 +50 +46 +46 +45 +43 +43 +41 +41 +37 +38 +37 +33 +33 +31 +32 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +14 +13 +12 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +26 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +59 +59 +59 +64 +64 +68 +68 +73 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +111 +115 +115 +120 +120 +126 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +178 +179 +182 +183 +183 +183 +183 +185 +184 +189 +188 +189 +191 +190 +194 +194 +196 +197 +197 +198 +199 +200 +201 +200 +200 +201 +203 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +205 +205 +204 +204 +202 +203 +202 +200 +200 +200 +201 +201 +198 +199 +196 +196 +196 +195 +194 +191 +191 +189 +189 +189 +185 +185 +182 +183 +182 +178 +178 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +87 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +61 +59 +59 +55 +55 +50 +50 +50 +47 +47 +43 +43 +42 +41 +41 +41 +41 +40 +37 +37 +33 +33 +33 +31 +30 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +18 +15 +16 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +46 +47 +50 +51 +54 +54 +59 +58 +58 +64 +64 +68 +68 +67 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +95 +97 +100 +100 +106 +106 +111 +110 +109 +115 +115 +119 +119 +119 +125 +125 +125 +125 +126 +130 +129 +133 +134 +133 +139 +139 +143 +143 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +180 +183 +183 +185 +184 +188 +189 +189 +190 +191 +194 +195 +195 +196 +196 +199 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +205 +205 +204 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +205 +205 +204 +205 +205 +202 +203 +200 +200 +201 +200 +201 +198 +198 +197 +196 +197 +195 +195 +191 +191 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +143 +143 +140 +139 +133 +133 +134 +130 +129 +126 +125 +120 +120 +120 +115 +115 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +58 +58 +59 +54 +54 +50 +51 +51 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +42 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +87 +86 +86 +90 +91 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +176 +175 +178 +179 +179 +183 +182 +184 +185 +185 +188 +189 +190 +191 +191 +194 +194 +197 +196 +197 +198 +198 +201 +200 +200 +201 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +195 +195 +194 +190 +191 +189 +188 +188 +185 +185 +183 +183 +179 +178 +178 +175 +175 +173 +173 +172 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +119 +119 +120 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +65 +65 +59 +58 +54 +54 +53 +51 +50 +47 +47 +43 +43 +42 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +40 +43 +43 +47 +47 +47 +51 +51 +54 +55 +55 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +87 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +120 +120 +120 +125 +126 +129 +130 +129 +134 +133 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +182 +182 +185 +184 +185 +189 +189 +190 +190 +194 +194 +194 +197 +196 +198 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +199 +196 +196 +194 +195 +191 +191 +191 +188 +189 +184 +184 +185 +182 +182 +183 +183 +183 +179 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +122 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +75 +72 +71 +68 +68 +65 +64 +64 +59 +58 +55 +54 +55 +50 +50 +47 +47 +47 +43 +42 +41 +41 +41 +37 +36 +33 +32 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +40 +41 +43 +42 +46 +46 +47 +50 +51 +54 +54 +54 +59 +59 +58 +58 +59 +64 +65 +68 +68 +68 +72 +72 +76 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +146 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +182 +182 +184 +184 +188 +188 +189 +190 +191 +194 +194 +195 +197 +196 +199 +198 +198 +201 +201 +200 +200 +203 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +203 +202 +202 +201 +200 +200 +201 +200 +198 +198 +197 +196 +197 +194 +195 +190 +191 +190 +188 +189 +185 +185 +185 +183 +182 +179 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +129 +129 +130 +125 +125 +119 +119 +119 +116 +116 +116 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +95 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +59 +58 +55 +55 +55 +50 +50 +47 +46 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +14 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +38 +37 +37 +40 +41 +43 +43 +43 +46 +47 +47 +47 +47 +51 +51 +55 +55 +55 +58 +59 +64 +65 +64 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +112 +115 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +182 +185 +184 +185 +188 +189 +191 +191 +191 +195 +194 +197 +197 +199 +199 +198 +200 +200 +200 +200 +201 +203 +202 +205 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +204 +205 +204 +204 +204 +203 +202 +201 +200 +200 +201 +200 +199 +199 +199 +196 +196 +195 +194 +195 +190 +190 +189 +188 +184 +185 +184 +183 +183 +178 +179 +179 +176 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +126 +126 +120 +120 +120 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +85 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +59 +55 +54 +54 +51 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +18 +17 +19 +19 +21 +21 +25 +25 +25 +26 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +50 +54 +54 +59 +59 +59 +64 +64 +68 +68 +68 +72 +73 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +116 +115 +115 +119 +120 +126 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +178 +183 +183 +185 +185 +188 +189 +188 +191 +191 +194 +194 +194 +197 +196 +199 +199 +198 +201 +200 +200 +200 +200 +203 +203 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +205 +205 +205 +204 +205 +203 +203 +200 +201 +200 +200 +200 +198 +198 +196 +197 +197 +195 +194 +191 +191 +191 +188 +189 +189 +189 +188 +185 +185 +183 +183 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +131 +129 +129 +125 +126 +119 +119 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +59 +54 +55 +51 +51 +51 +47 +47 +43 +42 +43 +40 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +14 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +55 +55 +54 +58 +58 +64 +64 +65 +68 +68 +72 +73 +74 +77 +76 +82 +81 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +115 +116 +119 +120 +126 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +182 +182 +185 +184 +188 +189 +188 +190 +190 +195 +194 +194 +197 +196 +198 +198 +199 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +205 +204 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +204 +204 +204 +204 +205 +202 +202 +200 +200 +201 +200 +200 +199 +199 +198 +196 +197 +194 +195 +194 +190 +191 +189 +189 +186 +184 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +58 +59 +55 +54 +51 +50 +47 +46 +48 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +42 +43 +43 +43 +47 +47 +50 +51 +51 +54 +54 +59 +59 +64 +65 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +125 +125 +129 +130 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +182 +185 +184 +185 +189 +188 +190 +190 +190 +195 +194 +196 +196 +199 +198 +198 +200 +200 +200 +201 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +204 +204 +203 +202 +203 +202 +202 +200 +201 +200 +200 +201 +198 +199 +196 +196 +196 +195 +195 +190 +191 +189 +188 +189 +184 +184 +183 +182 +182 +179 +179 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +126 +126 +120 +120 +116 +116 +109 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +58 +58 +58 +55 +55 +50 +50 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +12 +15 +15 +18 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +46 +47 +50 +51 +50 +54 +54 +58 +58 +59 +65 +65 +68 +68 +69 +73 +73 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +116 +120 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +185 +189 +189 +190 +190 +190 +195 +194 +196 +197 +196 +198 +198 +198 +198 +198 +201 +200 +201 +200 +200 +202 +202 +204 +205 +205 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +203 +201 +201 +200 +201 +198 +198 +199 +197 +196 +194 +195 +195 +191 +190 +191 +190 +190 +189 +188 +184 +185 +185 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +144 +143 +144 +140 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +64 +64 +65 +58 +58 +55 +54 +54 +50 +50 +46 +47 +47 +43 +42 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +55 +55 +59 +59 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +109 +115 +115 +119 +120 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +184 +184 +184 +188 +188 +191 +191 +191 +194 +195 +196 +196 +196 +199 +198 +200 +200 +201 +201 +201 +202 +202 +204 +204 +204 +204 +204 +207 +207 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +207 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +201 +200 +201 +200 +199 +198 +197 +197 +197 +195 +195 +191 +191 +189 +188 +189 +185 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +130 +130 +129 +125 +126 +119 +120 +120 +116 +115 +110 +110 +110 +106 +107 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +59 +54 +54 +51 +50 +47 +47 +46 +42 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +26 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +47 +51 +50 +54 +54 +58 +58 +58 +64 +64 +68 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +110 +110 +110 +116 +115 +119 +119 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +185 +188 +189 +191 +191 +194 +194 +195 +196 +197 +198 +199 +198 +201 +200 +201 +201 +200 +200 +200 +203 +202 +202 +204 +204 +205 +204 +205 +207 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +205 +205 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +198 +196 +196 +195 +194 +195 +191 +190 +189 +189 +189 +184 +184 +182 +182 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +129 +129 +126 +125 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +59 +59 +55 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +42 +37 +36 +33 +32 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +15 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +20 +20 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +47 +50 +50 +50 +51 +50 +54 +55 +59 +59 +58 +64 +64 +69 +69 +68 +73 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +109 +116 +115 +120 +119 +120 +126 +126 +129 +129 +134 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +178 +179 +183 +183 +185 +184 +184 +188 +188 +189 +188 +189 +191 +191 +195 +195 +195 +197 +197 +199 +198 +199 +200 +201 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +205 +202 +202 +201 +200 +200 +201 +201 +198 +198 +198 +197 +197 +194 +194 +195 +190 +191 +189 +188 +184 +184 +185 +183 +183 +179 +179 +179 +174 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +156 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +130 +129 +125 +125 +125 +119 +120 +115 +115 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +54 +55 +55 +51 +50 +47 +46 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +55 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +100 +107 +106 +110 +109 +116 +116 +116 +119 +120 +125 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +185 +185 +185 +189 +188 +191 +191 +192 +194 +195 +196 +196 +198 +198 +198 +201 +201 +200 +201 +200 +202 +203 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +204 +202 +203 +203 +200 +201 +201 +200 +201 +199 +199 +197 +196 +195 +195 +194 +191 +191 +188 +189 +189 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +140 +133 +133 +129 +129 +129 +126 +125 +119 +120 +120 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +69 +69 +64 +65 +58 +58 +54 +55 +54 +51 +51 +47 +47 +47 +42 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +16 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +15 +15 +17 +17 +16 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +46 +46 +51 +51 +50 +54 +55 +59 +58 +58 +64 +65 +68 +69 +69 +73 +72 +76 +76 +76 +82 +83 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +179 +179 +180 +183 +183 +185 +185 +189 +188 +189 +190 +191 +195 +195 +194 +197 +197 +196 +196 +196 +198 +198 +200 +200 +200 +200 +201 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +204 +205 +205 +205 +204 +202 +202 +201 +200 +200 +200 +200 +198 +199 +198 +196 +196 +194 +195 +194 +191 +190 +189 +188 +189 +185 +185 +183 +182 +182 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +126 +125 +125 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +54 +54 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +42 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +12 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +126 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +168 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +184 +185 +188 +188 +189 +188 +188 +191 +190 +194 +195 +195 +196 +196 +199 +198 +200 +201 +201 +200 +201 +202 +202 +203 +205 +204 +204 +205 +205 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +204 +205 +205 +204 +205 +202 +202 +202 +201 +201 +201 +200 +200 +199 +199 +197 +197 +196 +194 +195 +190 +190 +191 +189 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +129 +129 +126 +125 +120 +120 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +65 +65 +59 +58 +55 +55 +55 +51 +51 +47 +46 +42 +42 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +24 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +24 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +50 +51 +54 +54 +54 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +105 +106 +110 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +179 +179 +183 +183 +183 +184 +184 +189 +189 +190 +190 +191 +194 +194 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +205 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +204 +202 +202 +202 +200 +200 +201 +200 +201 +198 +199 +196 +197 +195 +194 +194 +190 +190 +188 +188 +188 +184 +184 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +168 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +91 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +69 +68 +64 +65 +58 +58 +58 +55 +54 +51 +51 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +20 +21 +25 +25 +27 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +51 +51 +51 +54 +55 +58 +59 +58 +65 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +101 +100 +100 +106 +105 +110 +109 +109 +115 +115 +115 +115 +115 +120 +120 +125 +126 +125 +130 +129 +133 +133 +138 +139 +139 +144 +144 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +184 +184 +185 +188 +189 +191 +190 +190 +195 +195 +197 +197 +197 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +198 +196 +197 +195 +194 +194 +190 +191 +189 +188 +188 +185 +185 +183 +182 +183 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +134 +130 +129 +126 +125 +125 +119 +120 +116 +115 +115 +109 +109 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +65 +65 +65 +58 +58 +54 +54 +54 +51 +51 +47 +46 +46 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +38 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +51 +50 +54 +54 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +75 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +112 +116 +116 +119 +119 +125 +125 +126 +129 +130 +134 +134 +134 +139 +139 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +184 +185 +185 +189 +189 +190 +191 +194 +194 +194 +197 +197 +199 +198 +199 +201 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +204 +205 +204 +204 +203 +202 +202 +201 +201 +200 +200 +201 +198 +198 +196 +196 +195 +194 +194 +191 +191 +188 +188 +189 +185 +185 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +170 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +148 +147 +147 +143 +143 +139 +140 +139 +133 +134 +129 +129 +127 +125 +125 +119 +120 +115 +116 +115 +109 +110 +106 +106 +105 +100 +100 +100 +100 +99 +96 +95 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +65 +59 +58 +58 +54 +54 +51 +51 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +46 +50 +51 +54 +54 +55 +58 +58 +59 +58 +59 +64 +64 +68 +68 +68 +72 +71 +77 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +115 +116 +120 +119 +125 +125 +129 +129 +129 +133 +133 +140 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +174 +174 +175 +178 +179 +183 +183 +183 +185 +185 +188 +189 +188 +191 +191 +195 +195 +194 +196 +196 +198 +198 +198 +200 +201 +200 +201 +203 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +204 +205 +204 +204 +203 +202 +202 +201 +200 +200 +201 +200 +198 +198 +199 +199 +198 +196 +197 +195 +195 +194 +191 +190 +188 +189 +189 +184 +184 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +125 +125 +125 +119 +119 +115 +116 +116 +109 +110 +105 +106 +103 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +69 +68 +64 +64 +65 +58 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +41 +41 +41 +43 +43 +47 +46 +47 +51 +50 +55 +55 +55 +58 +58 +64 +64 +69 +68 +68 +72 +73 +76 +76 +76 +82 +82 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +184 +185 +185 +189 +188 +190 +191 +194 +194 +194 +196 +196 +198 +198 +199 +200 +201 +201 +200 +201 +202 +203 +205 +205 +205 +204 +204 +206 +206 +207 +207 +207 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +205 +205 +202 +202 +200 +200 +200 +200 +200 +198 +199 +200 +197 +197 +195 +195 +190 +190 +190 +189 +188 +185 +185 +184 +182 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +138 +139 +139 +133 +133 +128 +130 +130 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +105 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +64 +64 +64 +58 +58 +55 +55 +54 +50 +50 +47 +46 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +27 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +51 +51 +50 +54 +54 +59 +59 +58 +65 +64 +64 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +120 +125 +125 +125 +129 +129 +133 +134 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +156 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +172 +175 +175 +178 +179 +183 +183 +182 +184 +185 +188 +189 +189 +190 +190 +195 +194 +195 +197 +196 +198 +199 +199 +201 +201 +201 +200 +201 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +204 +205 +205 +204 +205 +202 +202 +200 +201 +200 +200 +201 +198 +198 +196 +196 +196 +194 +194 +191 +191 +191 +188 +189 +185 +185 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +126 +125 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +54 +55 +54 +51 +50 +47 +47 +47 +42 +42 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +46 +47 +50 +50 +51 +51 +50 +55 +55 +58 +59 +59 +65 +65 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +99 +100 +106 +106 +110 +110 +110 +116 +116 +119 +120 +126 +126 +125 +129 +129 +134 +133 +134 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +185 +189 +189 +191 +191 +190 +195 +195 +196 +196 +196 +198 +198 +200 +201 +201 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +207 +207 +206 +207 +206 +207 +206 +206 +207 +207 +206 +205 +205 +204 +204 +204 +202 +203 +200 +200 +200 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +194 +190 +191 +189 +189 +189 +184 +184 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +73 +68 +68 +64 +64 +65 +59 +58 +54 +55 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +38 +41 +41 +41 +43 +43 +47 +47 +50 +50 +51 +55 +55 +58 +58 +58 +64 +65 +68 +69 +68 +73 +72 +76 +76 +76 +82 +81 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +120 +125 +125 +129 +130 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +174 +175 +175 +179 +179 +182 +183 +183 +185 +185 +189 +188 +191 +190 +191 +195 +195 +196 +196 +196 +198 +198 +200 +201 +201 +200 +201 +202 +202 +203 +204 +204 +204 +204 +205 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +200 +201 +201 +200 +201 +199 +198 +197 +196 +196 +195 +194 +191 +191 +190 +189 +188 +188 +188 +188 +185 +185 +183 +183 +182 +178 +178 +175 +174 +173 +173 +173 +169 +168 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +125 +125 +125 +120 +119 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +59 +58 +55 +55 +55 +51 +50 +47 +47 +46 +43 +43 +40 +41 +41 +37 +37 +33 +33 +32 +31 +31 +26 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +59 +59 +59 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +116 +120 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +158 +157 +161 +161 +161 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +182 +183 +182 +183 +184 +185 +188 +189 +188 +190 +191 +195 +194 +195 +196 +197 +198 +199 +200 +200 +200 +200 +200 +202 +202 +202 +205 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +207 +207 +204 +205 +204 +204 +205 +203 +202 +202 +200 +200 +200 +201 +201 +201 +200 +199 +198 +198 +196 +196 +194 +195 +193 +190 +191 +189 +189 +184 +184 +184 +183 +182 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +125 +119 +119 +116 +115 +115 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +65 +59 +58 +55 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +26 +21 +20 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +50 +54 +54 +55 +58 +59 +65 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +126 +126 +125 +129 +129 +133 +134 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +185 +189 +188 +190 +190 +194 +195 +194 +196 +197 +198 +198 +199 +200 +200 +201 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +203 +201 +200 +200 +200 +200 +198 +198 +196 +197 +196 +195 +194 +190 +191 +190 +189 +188 +185 +184 +185 +182 +182 +179 +178 +179 +175 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +129 +130 +125 +125 +123 +119 +120 +116 +116 +109 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +50 +50 +50 +47 +47 +43 +42 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +14 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +34 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +46 +50 +50 +54 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +85 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +115 +119 +119 +125 +125 +126 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +185 +184 +189 +188 +188 +191 +190 +195 +194 +194 +196 +197 +198 +198 +199 +201 +200 +200 +200 +201 +202 +203 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +204 +205 +204 +205 +203 +203 +203 +201 +200 +200 +200 +201 +198 +198 +196 +197 +196 +195 +195 +191 +190 +190 +189 +189 +185 +185 +185 +182 +183 +179 +179 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +130 +129 +125 +126 +119 +119 +119 +115 +116 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +73 +68 +69 +68 +65 +64 +58 +58 +58 +54 +54 +50 +50 +51 +47 +46 +43 +43 +43 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +16 +18 +19 +20 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +46 +47 +51 +50 +51 +55 +55 +58 +58 +59 +64 +64 +69 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +116 +120 +120 +119 +125 +126 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +179 +179 +179 +183 +182 +184 +185 +184 +188 +189 +191 +191 +191 +195 +194 +196 +197 +197 +198 +198 +200 +200 +201 +200 +200 +203 +202 +204 +204 +205 +205 +205 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +202 +201 +200 +201 +200 +200 +198 +198 +197 +196 +197 +194 +195 +190 +190 +191 +188 +189 +184 +185 +183 +182 +183 +178 +178 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +166 +161 +160 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +130 +126 +126 +126 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +54 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +47 +46 +50 +51 +51 +55 +55 +57 +59 +64 +64 +65 +69 +68 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +100 +105 +106 +110 +109 +116 +115 +116 +119 +120 +126 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +178 +178 +183 +182 +183 +185 +185 +188 +188 +189 +191 +190 +194 +194 +196 +196 +197 +198 +199 +200 +201 +200 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +200 +200 +199 +199 +196 +196 +196 +195 +194 +190 +190 +190 +188 +188 +185 +185 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +164 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +134 +133 +133 +130 +129 +126 +125 +126 +119 +120 +115 +115 +110 +109 +109 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +74 +68 +68 +64 +65 +58 +59 +58 +55 +55 +50 +50 +50 +46 +47 +46 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +48 +47 +47 +51 +51 +54 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +105 +106 +110 +109 +115 +115 +116 +119 +120 +126 +126 +125 +130 +129 +133 +133 +133 +140 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +184 +189 +188 +188 +190 +191 +194 +194 +194 +196 +196 +197 +197 +197 +198 +198 +201 +200 +201 +200 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +205 +205 +205 +202 +202 +201 +200 +200 +200 +200 +199 +198 +198 +196 +197 +194 +194 +194 +190 +190 +189 +189 +189 +184 +184 +183 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +166 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +144 +139 +139 +140 +133 +133 +129 +129 +126 +125 +125 +119 +119 +115 +115 +115 +109 +109 +106 +106 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +54 +54 +51 +50 +47 +47 +47 +43 +42 +41 +41 +39 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +87 +86 +86 +90 +91 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +184 +184 +188 +188 +188 +188 +188 +190 +190 +194 +195 +194 +197 +197 +198 +199 +200 +201 +200 +200 +200 +203 +202 +202 +204 +204 +204 +205 +204 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +202 +201 +201 +201 +200 +200 +199 +199 +197 +196 +196 +194 +194 +191 +191 +191 +188 +189 +184 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +151 +151 +147 +148 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +115 +116 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +56 +55 +54 +50 +50 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +65 +65 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +126 +125 +129 +129 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +148 +148 +151 +152 +157 +156 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +173 +173 +173 +175 +175 +178 +178 +179 +183 +183 +185 +184 +186 +188 +189 +191 +191 +194 +194 +195 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +203 +205 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +201 +200 +201 +198 +198 +197 +197 +197 +195 +195 +190 +190 +191 +189 +189 +185 +185 +184 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +51 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +18 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +40 +41 +43 +43 +47 +47 +51 +51 +51 +55 +55 +59 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +119 +126 +125 +130 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +178 +182 +183 +183 +184 +185 +188 +189 +189 +191 +190 +195 +194 +195 +196 +196 +198 +199 +199 +200 +201 +201 +201 +201 +203 +203 +204 +205 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +200 +200 +201 +201 +200 +199 +198 +196 +196 +196 +195 +194 +190 +190 +190 +188 +189 +184 +184 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +148 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +119 +120 +119 +116 +116 +110 +110 +110 +106 +106 +105 +106 +106 +100 +99 +96 +96 +96 +90 +90 +87 +87 +87 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +65 +65 +59 +59 +55 +55 +54 +51 +51 +46 +46 +47 +43 +43 +41 +42 +37 +37 +37 +33 +34 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +41 +44 +43 +43 +46 +47 +47 +46 +47 +51 +51 +54 +55 +55 +58 +58 +65 +64 +64 +68 +68 +72 +72 +73 +77 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +120 +122 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +152 +152 +157 +157 +157 +161 +161 +164 +165 +166 +169 +169 +173 +173 +175 +175 +174 +179 +178 +182 +183 +183 +185 +184 +189 +188 +189 +191 +190 +194 +194 +195 +196 +197 +198 +198 +200 +201 +201 +200 +200 +203 +202 +202 +204 +205 +205 +205 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +205 +205 +205 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +196 +195 +195 +190 +191 +191 +189 +189 +185 +185 +183 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +148 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +55 +53 +50 +50 +47 +47 +43 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +55 +54 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +120 +125 +125 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +184 +185 +188 +188 +189 +190 +190 +194 +194 +194 +197 +197 +198 +199 +198 +200 +201 +200 +200 +200 +203 +202 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +201 +201 +201 +201 +200 +198 +198 +197 +197 +196 +195 +195 +191 +191 +190 +189 +188 +185 +184 +184 +182 +182 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +148 +147 +148 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +59 +54 +54 +50 +50 +51 +46 +47 +43 +43 +43 +41 +41 +37 +36 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +101 +106 +106 +106 +110 +110 +109 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +129 +131 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +178 +179 +182 +183 +185 +184 +185 +188 +189 +191 +191 +191 +194 +195 +196 +197 +197 +198 +199 +201 +200 +201 +200 +201 +202 +202 +205 +205 +204 +204 +205 +206 +207 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +205 +202 +202 +201 +200 +200 +200 +201 +198 +198 +198 +196 +196 +195 +194 +195 +191 +191 +189 +188 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +160 +161 +157 +157 +151 +151 +151 +148 +147 +143 +143 +141 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +115 +115 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +54 +54 +55 +50 +50 +47 +47 +43 +43 +42 +41 +40 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +22 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +43 +43 +43 +46 +47 +51 +51 +50 +54 +55 +58 +59 +59 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +108 +109 +110 +116 +115 +120 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +174 +175 +179 +179 +183 +183 +182 +185 +184 +189 +188 +188 +190 +190 +194 +194 +197 +197 +196 +199 +198 +200 +200 +200 +200 +201 +200 +200 +200 +202 +202 +204 +204 +204 +205 +204 +206 +207 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +203 +200 +200 +201 +201 +201 +198 +198 +199 +196 +196 +194 +194 +190 +190 +191 +188 +189 +184 +185 +185 +183 +183 +183 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +157 +157 +156 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +120 +119 +116 +115 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +91 +90 +86 +86 +86 +82 +81 +76 +77 +76 +73 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +55 +51 +51 +47 +46 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +16 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +48 +50 +50 +54 +55 +58 +59 +58 +64 +64 +64 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +115 +120 +120 +120 +125 +126 +129 +129 +130 +133 +134 +139 +139 +142 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +185 +184 +185 +189 +188 +190 +191 +191 +194 +195 +196 +196 +196 +198 +199 +200 +201 +201 +200 +200 +203 +202 +202 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +198 +198 +199 +196 +196 +195 +194 +194 +190 +191 +190 +190 +191 +188 +188 +184 +185 +184 +183 +183 +179 +179 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +144 +140 +139 +134 +134 +133 +130 +129 +125 +125 +126 +119 +120 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +64 +58 +58 +55 +55 +55 +51 +51 +47 +47 +47 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +28 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +42 +47 +47 +50 +51 +50 +55 +54 +54 +54 +54 +59 +58 +64 +65 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +115 +116 +119 +120 +126 +125 +129 +130 +129 +133 +133 +139 +139 +140 +143 +143 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +160 +165 +165 +169 +169 +173 +173 +173 +175 +174 +178 +178 +179 +182 +183 +185 +185 +184 +189 +189 +190 +191 +190 +194 +195 +196 +197 +197 +198 +198 +200 +200 +201 +201 +200 +203 +203 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +200 +200 +200 +198 +199 +197 +196 +196 +195 +195 +190 +191 +190 +188 +189 +184 +185 +183 +183 +183 +179 +178 +174 +175 +175 +173 +173 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +155 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +134 +134 +129 +129 +125 +125 +125 +120 +120 +116 +115 +116 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +54 +55 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +36 +41 +41 +43 +43 +43 +47 +47 +50 +51 +52 +55 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +115 +119 +119 +125 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +185 +189 +188 +190 +190 +195 +194 +194 +197 +197 +198 +199 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +200 +199 +198 +197 +196 +197 +194 +194 +190 +190 +190 +188 +189 +185 +185 +185 +183 +182 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +168 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +146 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +120 +116 +115 +116 +110 +110 +105 +106 +106 +100 +101 +96 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +77 +72 +72 +68 +69 +65 +64 +64 +58 +59 +55 +55 +55 +50 +51 +47 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +39 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +55 +59 +59 +65 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +120 +119 +125 +125 +126 +130 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +183 +183 +182 +184 +185 +188 +189 +189 +190 +190 +195 +195 +194 +196 +196 +198 +198 +199 +200 +200 +201 +201 +201 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +207 +207 +207 +206 +205 +204 +204 +204 +203 +202 +203 +201 +200 +200 +201 +200 +198 +198 +196 +196 +197 +194 +194 +194 +194 +194 +191 +191 +189 +189 +189 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +134 +133 +129 +129 +125 +125 +125 +120 +120 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +73 +69 +68 +64 +65 +64 +59 +59 +54 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +24 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +120 +126 +126 +125 +129 +130 +134 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +158 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +184 +188 +189 +191 +190 +190 +194 +195 +196 +196 +197 +198 +199 +200 +200 +200 +200 +200 +202 +203 +204 +204 +205 +204 +204 +205 +204 +204 +206 +206 +206 +207 +207 +206 +207 +207 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +203 +202 +200 +201 +201 +200 +200 +201 +201 +198 +199 +199 +196 +197 +194 +195 +193 +190 +191 +188 +188 +185 +185 +185 +183 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +164 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +126 +126 +119 +119 +115 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +55 +54 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +26 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +28 +27 +31 +31 +31 +32 +33 +37 +37 +37 +42 +41 +43 +42 +43 +47 +46 +50 +51 +53 +55 +55 +58 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +120 +126 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +185 +188 +188 +190 +191 +195 +194 +194 +196 +197 +198 +198 +198 +200 +201 +200 +200 +200 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +204 +204 +205 +205 +205 +204 +204 +202 +202 +203 +200 +200 +201 +201 +199 +199 +199 +196 +196 +194 +194 +195 +191 +191 +189 +189 +188 +185 +184 +183 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +129 +125 +126 +120 +119 +116 +116 +116 +110 +111 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +65 +64 +59 +59 +54 +54 +55 +51 +51 +47 +46 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +42 +43 +47 +47 +50 +51 +51 +54 +55 +58 +58 +58 +64 +64 +68 +68 +69 +72 +73 +76 +76 +77 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +115 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +184 +185 +185 +188 +189 +190 +190 +190 +194 +194 +195 +195 +194 +195 +194 +196 +196 +197 +199 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +205 +207 +206 +207 +206 +206 +206 +205 +204 +205 +205 +204 +202 +202 +202 +200 +201 +200 +201 +200 +198 +198 +197 +197 +196 +195 +195 +190 +191 +191 +188 +189 +185 +184 +182 +183 +182 +178 +179 +175 +175 +175 +173 +173 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +134 +129 +129 +126 +125 +125 +119 +120 +116 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +55 +54 +55 +50 +50 +46 +46 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +16 +14 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +54 +59 +59 +65 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +116 +115 +115 +120 +119 +125 +125 +125 +129 +130 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +189 +190 +191 +194 +195 +197 +196 +197 +199 +198 +200 +200 +200 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +207 +206 +206 +207 +206 +206 +207 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +200 +200 +200 +198 +198 +196 +196 +197 +194 +194 +191 +191 +191 +189 +189 +185 +185 +184 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +130 +129 +125 +125 +126 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +65 +64 +58 +58 +58 +55 +55 +51 +50 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +48 +47 +47 +51 +50 +54 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +109 +110 +110 +110 +115 +115 +119 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +178 +179 +182 +183 +184 +184 +185 +189 +188 +191 +191 +190 +194 +194 +195 +194 +195 +197 +196 +199 +198 +198 +200 +201 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +205 +204 +204 +203 +203 +203 +200 +201 +200 +200 +200 +198 +198 +197 +197 +196 +195 +195 +191 +190 +190 +188 +189 +185 +184 +185 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +144 +139 +139 +133 +133 +129 +130 +130 +125 +125 +119 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +83 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +64 +64 +65 +58 +58 +54 +54 +54 +51 +50 +47 +47 +45 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +54 +59 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +85 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +119 +126 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +174 +175 +175 +179 +179 +183 +183 +182 +185 +184 +184 +185 +184 +188 +189 +191 +191 +191 +194 +195 +197 +196 +197 +198 +199 +201 +200 +200 +201 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +201 +198 +199 +198 +196 +196 +195 +194 +195 +190 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +130 +125 +125 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +36 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +24 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +51 +50 +54 +54 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +126 +129 +129 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +188 +189 +188 +191 +190 +194 +194 +194 +197 +196 +198 +199 +198 +201 +200 +201 +200 +200 +202 +202 +204 +204 +205 +205 +205 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +201 +200 +198 +198 +199 +199 +199 +197 +197 +194 +195 +194 +190 +191 +189 +189 +189 +184 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +55 +55 +54 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +24 +25 +21 +21 +19 +18 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +40 +41 +43 +43 +46 +47 +47 +50 +51 +54 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +109 +110 +115 +116 +120 +119 +122 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +174 +175 +175 +178 +178 +183 +183 +183 +185 +185 +189 +188 +189 +190 +191 +194 +195 +195 +197 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +201 +200 +198 +198 +196 +196 +197 +194 +194 +190 +190 +191 +189 +188 +184 +185 +183 +182 +183 +178 +178 +175 +175 +174 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +152 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +125 +126 +125 +119 +119 +115 +115 +116 +109 +110 +106 +106 +103 +100 +100 +96 +96 +89 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +58 +55 +54 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +46 +47 +50 +50 +55 +55 +55 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +109 +109 +116 +115 +116 +119 +119 +126 +125 +125 +129 +129 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +189 +188 +190 +190 +191 +195 +194 +196 +196 +197 +199 +199 +201 +200 +200 +200 +201 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +203 +202 +200 +201 +200 +201 +201 +198 +198 +196 +196 +195 +194 +194 +190 +190 +188 +189 +189 +184 +185 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +119 +118 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +69 +68 +65 +64 +58 +58 +58 +55 +54 +51 +50 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +55 +55 +54 +58 +58 +64 +64 +65 +68 +68 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +116 +115 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +132 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +182 +182 +182 +185 +184 +188 +188 +188 +190 +190 +195 +194 +195 +197 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +203 +204 +204 +205 +204 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +198 +197 +196 +196 +194 +194 +191 +190 +190 +188 +188 +185 +185 +185 +182 +183 +179 +179 +179 +175 +174 +173 +173 +170 +169 +169 +165 +165 +161 +161 +161 +157 +157 +156 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +137 +133 +133 +129 +129 +125 +125 +126 +120 +119 +115 +116 +115 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +51 +51 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +50 +51 +51 +55 +55 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +105 +105 +106 +110 +110 +115 +116 +119 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +160 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +182 +184 +185 +189 +189 +188 +191 +190 +194 +194 +195 +196 +197 +198 +198 +201 +201 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +195 +190 +190 +191 +189 +188 +184 +184 +183 +183 +183 +178 +178 +175 +175 +175 +172 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +130 +129 +129 +125 +125 +119 +119 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +58 +54 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +56 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +107 +110 +110 +116 +116 +119 +120 +120 +125 +125 +130 +130 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +160 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +184 +184 +188 +188 +189 +190 +190 +195 +194 +197 +197 +197 +198 +199 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +199 +198 +196 +197 +197 +195 +195 +190 +191 +188 +189 +189 +185 +184 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +130 +125 +125 +126 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +58 +58 +59 +54 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +17 +16 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +52 +54 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +110 +109 +109 +116 +115 +120 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +183 +183 +184 +185 +188 +188 +189 +190 +191 +194 +194 +194 +197 +196 +198 +198 +198 +200 +201 +200 +200 +200 +202 +203 +204 +204 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +197 +197 +194 +194 +191 +191 +190 +188 +189 +184 +185 +185 +182 +183 +179 +179 +179 +175 +174 +173 +173 +174 +169 +169 +165 +165 +161 +161 +160 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +126 +126 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +59 +58 +54 +55 +55 +51 +50 +47 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +32 +31 +31 +26 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +58 +59 +58 +58 +58 +64 +65 +68 +68 +69 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +109 +115 +116 +120 +120 +120 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +178 +179 +183 +183 +184 +184 +184 +188 +189 +191 +190 +190 +194 +194 +196 +197 +196 +198 +198 +200 +200 +200 +201 +200 +202 +202 +205 +205 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +205 +204 +204 +203 +202 +200 +201 +201 +200 +200 +198 +199 +198 +196 +196 +195 +194 +195 +190 +191 +189 +188 +188 +185 +184 +183 +182 +183 +179 +179 +174 +175 +172 +173 +173 +169 +168 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +142 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +89 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +59 +59 +55 +55 +50 +50 +51 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +32 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +50 +51 +51 +54 +54 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +119 +125 +125 +125 +130 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +184 +185 +188 +188 +191 +190 +190 +194 +195 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +200 +201 +200 +199 +198 +196 +196 +196 +194 +195 +191 +190 +189 +189 +188 +185 +184 +182 +182 +183 +179 +178 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +133 +133 +133 +133 +129 +130 +125 +125 +125 +120 +119 +116 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +54 +54 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +58 +58 +58 +64 +64 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +184 +185 +188 +189 +190 +190 +195 +194 +195 +196 +197 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +201 +200 +198 +198 +197 +196 +196 +194 +194 +190 +191 +190 +189 +188 +184 +184 +184 +182 +183 +183 +183 +182 +178 +178 +175 +175 +174 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +115 +115 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +55 +54 +55 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +15 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +43 +43 +43 +46 +47 +50 +51 +50 +54 +54 +59 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +109 +110 +115 +115 +120 +120 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +172 +174 +175 +178 +178 +183 +182 +183 +185 +184 +189 +188 +188 +190 +190 +194 +194 +194 +196 +196 +198 +198 +198 +200 +201 +200 +200 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +196 +197 +196 +194 +194 +191 +190 +191 +188 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +58 +58 +55 +55 +50 +51 +51 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +12 +15 +15 +15 +15 +15 +17 +16 +19 +19 +19 +21 +21 +25 +25 +27 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +47 +50 +50 +54 +54 +55 +58 +58 +64 +65 +68 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +120 +119 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +178 +178 +183 +182 +183 +185 +185 +189 +188 +189 +190 +191 +194 +195 +195 +197 +197 +198 +198 +201 +200 +201 +201 +200 +202 +203 +202 +205 +204 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +205 +205 +205 +204 +204 +202 +202 +202 +203 +202 +200 +200 +201 +200 +200 +199 +199 +196 +196 +195 +194 +194 +190 +191 +188 +189 +188 +185 +185 +182 +182 +182 +178 +178 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +59 +55 +55 +54 +50 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +32 +31 +33 +32 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +50 +51 +51 +54 +55 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +172 +173 +175 +175 +175 +179 +179 +182 +182 +183 +184 +185 +189 +188 +191 +190 +191 +194 +194 +196 +197 +196 +198 +198 +198 +198 +198 +201 +200 +200 +200 +200 +202 +203 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +201 +200 +198 +198 +198 +196 +196 +194 +194 +194 +191 +190 +189 +189 +188 +185 +185 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +126 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +59 +55 +54 +55 +50 +50 +46 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +18 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +58 +59 +59 +64 +65 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +110 +115 +116 +119 +119 +120 +126 +125 +129 +129 +134 +133 +133 +139 +139 +143 +144 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +179 +178 +179 +182 +183 +185 +184 +184 +189 +189 +189 +189 +188 +190 +190 +194 +194 +194 +196 +197 +198 +199 +199 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +205 +204 +204 +204 +205 +203 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +195 +194 +195 +190 +191 +189 +188 +184 +184 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +58 +58 +54 +55 +55 +51 +50 +47 +46 +43 +43 +42 +40 +41 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +55 +54 +54 +58 +58 +64 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +116 +119 +120 +120 +125 +125 +129 +129 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +180 +183 +183 +185 +184 +188 +188 +189 +191 +191 +195 +195 +195 +197 +197 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +203 +203 +204 +205 +204 +204 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +205 +204 +205 +203 +202 +201 +201 +200 +200 +201 +198 +198 +199 +196 +197 +194 +194 +194 +191 +190 +188 +188 +188 +184 +185 +183 +183 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +134 +129 +129 +126 +125 +125 +119 +120 +115 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +69 +68 +64 +64 +65 +58 +58 +55 +55 +55 +50 +50 +46 +47 +46 +43 +43 +40 +40 +39 +37 +37 +33 +33 +31 +31 +30 +27 +26 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +40 +40 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +120 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +185 +184 +184 +189 +188 +191 +190 +191 +194 +195 +196 +196 +198 +198 +199 +200 +200 +200 +200 +200 +202 +202 +205 +204 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +199 +199 +198 +197 +196 +195 +194 +195 +190 +191 +189 +189 +185 +184 +184 +183 +183 +179 +179 +178 +175 +175 +175 +175 +174 +173 +173 +169 +169 +170 +165 +165 +161 +161 +160 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +126 +125 +119 +119 +120 +115 +116 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +77 +76 +72 +72 +72 +68 +69 +64 +64 +65 +59 +58 +55 +54 +51 +50 +51 +47 +47 +43 +43 +43 +40 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +30 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +51 +51 +54 +55 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +120 +125 +125 +125 +126 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +182 +183 +183 +185 +185 +188 +188 +188 +191 +190 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +201 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +196 +196 +195 +194 +195 +191 +191 +188 +188 +189 +184 +184 +182 +183 +182 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +141 +133 +133 +130 +130 +126 +125 +126 +119 +119 +115 +115 +115 +109 +109 +110 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +64 +64 +64 +59 +58 +54 +55 +55 +50 +50 +47 +47 +45 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +26 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +47 +46 +47 +47 +46 +50 +50 +54 +54 +54 +58 +58 +65 +64 +65 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +182 +184 +185 +188 +188 +189 +191 +191 +194 +194 +196 +196 +197 +199 +198 +200 +200 +201 +200 +200 +202 +202 +202 +205 +204 +205 +204 +204 +206 +206 +206 +207 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +197 +197 +195 +194 +190 +191 +189 +188 +188 +185 +184 +182 +183 +183 +178 +178 +174 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +133 +133 +133 +129 +129 +125 +125 +125 +120 +120 +115 +116 +113 +110 +110 +105 +106 +99 +100 +100 +95 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +64 +64 +58 +58 +54 +55 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +15 +14 +15 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +59 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +115 +115 +120 +119 +119 +126 +125 +126 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +144 +147 +147 +151 +150 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +184 +185 +185 +188 +188 +190 +191 +191 +195 +195 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +202 +200 +200 +201 +201 +199 +198 +199 +196 +196 +194 +195 +194 +190 +191 +188 +189 +188 +185 +184 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +130 +125 +126 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +55 +50 +50 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +34 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +46 +47 +50 +51 +55 +54 +54 +58 +58 +59 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +79 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +105 +105 +106 +106 +106 +109 +110 +115 +115 +116 +120 +119 +125 +125 +128 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +182 +185 +185 +188 +188 +189 +190 +191 +195 +194 +194 +196 +197 +198 +198 +199 +200 +201 +201 +200 +202 +203 +203 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +203 +202 +203 +201 +200 +200 +200 +200 +199 +198 +196 +197 +197 +195 +195 +190 +190 +191 +188 +188 +185 +184 +185 +183 +183 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +134 +133 +129 +129 +129 +126 +125 +119 +120 +119 +115 +115 +117 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +55 +55 +55 +51 +50 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +18 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +38 +37 +37 +41 +41 +43 +43 +43 +47 +47 +46 +47 +47 +51 +51 +55 +55 +55 +59 +59 +65 +64 +66 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +115 +115 +116 +120 +119 +125 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +148 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +189 +188 +190 +191 +191 +195 +194 +196 +197 +198 +198 +199 +201 +200 +201 +201 +200 +203 +202 +204 +205 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +207 +206 +204 +204 +204 +204 +205 +202 +203 +201 +201 +201 +201 +200 +199 +198 +199 +197 +196 +194 +194 +195 +190 +191 +189 +188 +184 +184 +185 +183 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +130 +130 +126 +126 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +65 +58 +58 +55 +55 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +55 +56 +58 +59 +65 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +115 +115 +115 +120 +120 +126 +126 +125 +130 +129 +134 +134 +133 +139 +139 +143 +143 +144 +147 +147 +152 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +185 +184 +189 +188 +190 +190 +195 +194 +195 +197 +196 +198 +198 +198 +200 +200 +201 +201 +200 +202 +202 +204 +204 +204 +205 +205 +206 +206 +207 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +205 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +197 +197 +195 +194 +191 +190 +190 +189 +189 +185 +185 +184 +183 +183 +182 +182 +183 +179 +178 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +144 +143 +139 +139 +134 +133 +134 +129 +129 +126 +125 +120 +120 +119 +116 +115 +109 +109 +110 +105 +106 +100 +100 +100 +95 +96 +89 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +69 +69 +68 +64 +65 +58 +58 +59 +55 +55 +50 +51 +50 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +43 +46 +47 +50 +50 +51 +54 +55 +59 +59 +58 +64 +64 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +126 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +178 +179 +183 +183 +182 +184 +185 +189 +189 +188 +190 +190 +194 +194 +194 +196 +197 +198 +198 +198 +200 +200 +200 +200 +200 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +200 +201 +200 +198 +198 +197 +197 +196 +195 +195 +191 +190 +190 +188 +188 +185 +184 +185 +182 +183 +178 +179 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +136 +134 +133 +129 +129 +125 +126 +126 +120 +119 +115 +116 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +85 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +59 +54 +54 +55 +50 +51 +47 +46 +46 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +51 +51 +51 +55 +54 +58 +58 +59 +64 +64 +69 +68 +70 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +115 +115 +119 +120 +125 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +183 +182 +184 +185 +185 +188 +188 +190 +190 +190 +195 +194 +196 +197 +197 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +205 +204 +205 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +206 +204 +205 +204 +204 +204 +202 +202 +200 +201 +200 +200 +200 +201 +201 +200 +198 +198 +196 +196 +197 +194 +195 +190 +191 +189 +188 +189 +185 +185 +182 +182 +183 +178 +178 +175 +175 +174 +173 +172 +173 +173 +173 +168 +168 +165 +164 +165 +161 +160 +157 +157 +152 +150 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +129 +129 +125 +125 +120 +120 +119 +115 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +58 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +30 +31 +33 +32 +37 +36 +37 +41 +41 +41 +40 +41 +43 +42 +46 +46 +47 +51 +51 +55 +54 +55 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +129 +134 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +182 +184 +185 +189 +188 +189 +191 +190 +194 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +207 +205 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +205 +204 +202 +203 +202 +200 +200 +200 +200 +198 +199 +198 +197 +196 +194 +194 +195 +190 +191 +189 +188 +188 +185 +185 +185 +185 +184 +183 +182 +178 +178 +179 +174 +175 +173 +172 +171 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +126 +126 +119 +119 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +65 +65 +58 +58 +58 +55 +54 +51 +51 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +36 +33 +31 +31 +31 +27 +27 +27 +28 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +39 +41 +40 +42 +43 +46 +46 +47 +51 +50 +54 +55 +55 +58 +58 +64 +64 +65 +68 +68 +73 +72 +73 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +119 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +144 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +184 +189 +188 +191 +190 +190 +194 +195 +196 +197 +197 +199 +198 +200 +200 +201 +200 +200 +202 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +201 +200 +200 +200 +201 +198 +198 +198 +199 +198 +196 +196 +194 +194 +195 +190 +191 +188 +188 +187 +184 +185 +183 +182 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +134 +134 +129 +129 +125 +125 +125 +119 +120 +116 +115 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +55 +55 +55 +50 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +20 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +47 +51 +51 +54 +55 +55 +59 +59 +64 +64 +68 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +91 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +168 +168 +173 +173 +175 +175 +175 +178 +179 +183 +182 +183 +185 +185 +188 +188 +189 +190 +191 +195 +195 +194 +196 +196 +198 +198 +201 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +205 +204 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +207 +205 +205 +204 +204 +204 +203 +202 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +197 +195 +194 +195 +191 +191 +188 +189 +188 +185 +185 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +130 +129 +125 +126 +119 +120 +119 +116 +115 +110 +109 +105 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +55 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +16 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +50 +51 +51 +54 +55 +59 +59 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +91 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +182 +183 +185 +185 +189 +189 +191 +191 +191 +194 +194 +196 +197 +196 +198 +199 +200 +200 +201 +201 +201 +203 +202 +202 +205 +205 +205 +204 +205 +206 +206 +206 +206 +207 +206 +207 +207 +206 +207 +207 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +201 +200 +200 +201 +198 +198 +196 +197 +196 +194 +195 +191 +191 +191 +189 +189 +184 +185 +184 +183 +183 +179 +179 +179 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +129 +126 +125 +119 +119 +115 +116 +116 +110 +109 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +54 +55 +50 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +24 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +42 +43 +43 +46 +47 +51 +51 +51 +54 +55 +58 +59 +59 +64 +65 +68 +68 +68 +73 +72 +76 +76 +77 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +116 +116 +120 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +184 +185 +185 +188 +189 +190 +190 +191 +195 +194 +195 +194 +194 +196 +197 +199 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +204 +205 +205 +204 +204 +203 +203 +201 +200 +201 +200 +201 +200 +200 +200 +198 +198 +196 +196 +197 +194 +195 +191 +191 +191 +188 +189 +184 +185 +185 +183 +183 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +116 +115 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +65 +64 +58 +58 +59 +54 +54 +51 +51 +51 +47 +47 +43 +43 +40 +41 +40 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +64 +69 +69 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +115 +115 +120 +119 +120 +126 +125 +129 +130 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +175 +179 +179 +179 +179 +179 +183 +183 +185 +185 +185 +189 +188 +190 +190 +192 +195 +194 +197 +196 +196 +196 +197 +198 +198 +201 +200 +200 +200 +200 +200 +201 +201 +202 +202 +204 +205 +204 +204 +205 +206 +206 +207 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +207 +205 +205 +204 +204 +205 +203 +202 +203 +200 +201 +201 +201 +199 +198 +198 +197 +197 +195 +195 +194 +190 +190 +188 +188 +188 +185 +185 +183 +182 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +105 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +83 +76 +76 +77 +72 +72 +68 +69 +64 +64 +64 +58 +58 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +40 +41 +41 +37 +37 +32 +33 +32 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +38 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +51 +54 +54 +58 +58 +58 +64 +64 +68 +68 +68 +73 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +125 +127 +129 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +185 +185 +189 +189 +189 +189 +189 +190 +191 +194 +195 +195 +197 +196 +198 +199 +200 +201 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +205 +204 +205 +205 +205 +203 +202 +202 +200 +201 +200 +200 +200 +198 +199 +197 +197 +196 +194 +195 +190 +190 +191 +188 +188 +185 +184 +183 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +134 +133 +129 +130 +130 +126 +126 +120 +120 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +58 +59 +54 +55 +51 +51 +51 +46 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +119 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +178 +182 +182 +185 +185 +184 +189 +189 +190 +190 +192 +194 +195 +197 +197 +199 +199 +198 +200 +201 +201 +200 +200 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +199 +199 +197 +196 +195 +195 +190 +191 +190 +188 +188 +185 +185 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +134 +133 +129 +129 +125 +125 +125 +119 +119 +115 +115 +116 +110 +110 +105 +105 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +65 +65 +61 +58 +58 +55 +54 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +30 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +20 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +50 +55 +54 +59 +58 +58 +65 +65 +68 +69 +69 +72 +72 +77 +76 +76 +82 +82 +86 +87 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +110 +109 +116 +115 +119 +120 +119 +125 +126 +126 +126 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +183 +185 +185 +189 +189 +190 +191 +190 +194 +195 +196 +197 +196 +198 +198 +200 +200 +201 +201 +200 +202 +202 +203 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +203 +201 +201 +201 +200 +198 +198 +198 +196 +197 +194 +194 +195 +190 +191 +188 +188 +189 +185 +185 +182 +183 +183 +179 +179 +175 +175 +175 +174 +173 +169 +169 +165 +164 +165 +161 +161 +157 +158 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +130 +126 +125 +119 +119 +116 +116 +115 +110 +109 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +83 +83 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +40 +37 +37 +36 +33 +33 +31 +31 +31 +26 +27 +25 +25 +25 +21 +21 +19 +19 +19 +16 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +42 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +54 +58 +58 +64 +64 +65 +69 +69 +72 +72 +73 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +115 +115 +116 +119 +120 +126 +126 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +171 +173 +173 +175 +175 +178 +179 +179 +183 +182 +185 +185 +185 +188 +189 +191 +191 +191 +194 +195 +196 +196 +197 +199 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +207 +207 +206 +206 +207 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +200 +198 +199 +198 +196 +196 +194 +194 +194 +190 +190 +188 +188 +189 +184 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +148 +148 +143 +143 +139 +140 +134 +133 +133 +129 +129 +125 +125 +125 +120 +119 +120 +120 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +46 +51 +51 +51 +55 +55 +58 +59 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +112 +115 +115 +119 +120 +125 +126 +126 +129 +130 +133 +133 +133 +140 +139 +139 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +182 +185 +185 +188 +189 +189 +190 +191 +194 +195 +196 +197 +197 +198 +198 +200 +200 +200 +201 +201 +202 +202 +202 +205 +204 +205 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +207 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +199 +198 +196 +196 +196 +195 +195 +190 +190 +189 +189 +188 +185 +185 +183 +183 +182 +178 +178 +174 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +130 +125 +125 +125 +119 +119 +115 +116 +112 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +64 +64 +59 +59 +54 +55 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +55 +58 +58 +58 +65 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +119 +125 +125 +125 +125 +126 +129 +130 +134 +133 +134 +139 +139 +143 +144 +148 +148 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +182 +185 +185 +188 +189 +189 +190 +190 +194 +195 +194 +196 +196 +198 +198 +198 +200 +200 +201 +201 +201 +202 +202 +204 +205 +205 +204 +204 +206 +207 +206 +207 +206 +207 +206 +206 +207 +206 +207 +207 +206 +207 +206 +205 +205 +204 +205 +204 +203 +202 +201 +200 +201 +201 +201 +199 +199 +197 +196 +196 +194 +194 +190 +191 +191 +188 +189 +185 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +156 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +116 +116 +115 +109 +109 +106 +106 +105 +100 +99 +100 +100 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +69 +69 +64 +64 +59 +58 +59 +55 +55 +50 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +26 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +20 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +44 +43 +43 +47 +47 +51 +50 +50 +54 +54 +58 +59 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +81 +82 +81 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +115 +116 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +182 +184 +185 +189 +189 +189 +190 +190 +194 +195 +195 +196 +196 +199 +198 +198 +200 +200 +200 +201 +203 +202 +202 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +204 +204 +205 +204 +204 +203 +202 +200 +200 +200 +200 +200 +198 +198 +199 +196 +197 +194 +195 +195 +190 +191 +188 +189 +189 +185 +184 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +170 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +152 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +125 +125 +125 +119 +119 +115 +115 +115 +109 +110 +106 +106 +103 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +72 +68 +68 +65 +64 +65 +58 +58 +55 +54 +50 +50 +50 +47 +46 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +28 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +36 +37 +37 +37 +41 +41 +42 +42 +43 +47 +47 +51 +51 +52 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +87 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +183 +182 +185 +185 +189 +188 +191 +191 +190 +194 +194 +197 +196 +196 +199 +199 +200 +200 +201 +201 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +200 +201 +201 +199 +199 +196 +196 +194 +195 +194 +190 +191 +188 +188 +188 +184 +185 +185 +184 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +129 +130 +126 +125 +126 +120 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +73 +73 +68 +68 +64 +64 +65 +59 +59 +54 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +24 +24 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +55 +54 +54 +59 +59 +65 +64 +64 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +115 +116 +119 +119 +125 +126 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +183 +184 +184 +189 +188 +188 +190 +190 +195 +195 +194 +197 +196 +198 +198 +198 +200 +200 +200 +200 +203 +202 +202 +204 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +201 +199 +198 +198 +198 +198 +196 +196 +194 +195 +194 +191 +191 +188 +188 +186 +184 +184 +183 +182 +178 +178 +178 +175 +175 +173 +173 +173 +169 +169 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +129 +125 +125 +119 +120 +119 +116 +116 +110 +110 +110 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +59 +55 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +24 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +42 +46 +47 +47 +51 +51 +55 +54 +56 +59 +59 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +109 +115 +115 +119 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +178 +179 +183 +183 +182 +185 +184 +188 +188 +189 +191 +190 +194 +195 +197 +196 +197 +198 +198 +200 +200 +200 +200 +201 +202 +203 +203 +204 +204 +205 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +205 +205 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +200 +196 +196 +195 +194 +190 +190 +191 +188 +188 +184 +184 +185 +183 +182 +182 +182 +183 +178 +179 +175 +174 +175 +173 +173 +169 +169 +166 +164 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +130 +125 +125 +119 +120 +116 +116 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +91 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +64 +65 +59 +58 +55 +55 +55 +51 +50 +47 +46 +47 +42 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +26 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +40 +40 +42 +43 +45 +47 +46 +50 +51 +54 +54 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +105 +110 +110 +116 +115 +116 +119 +119 +125 +125 +126 +130 +130 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +168 +173 +173 +173 +174 +175 +179 +179 +179 +182 +183 +184 +184 +189 +188 +188 +191 +191 +195 +195 +194 +196 +197 +199 +198 +198 +200 +201 +201 +201 +200 +202 +202 +204 +204 +205 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +204 +202 +202 +203 +200 +201 +200 +200 +198 +198 +199 +196 +196 +195 +194 +194 +190 +190 +191 +190 +190 +189 +188 +184 +184 +185 +183 +183 +178 +178 +175 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +134 +133 +129 +129 +129 +126 +125 +119 +120 +120 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +69 +69 +68 +64 +64 +58 +58 +58 +55 +54 +50 +51 +50 +47 +47 +43 +43 +43 +41 +40 +37 +36 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +31 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +54 +59 +59 +64 +65 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +99 +106 +105 +106 +110 +110 +116 +116 +115 +119 +119 +125 +126 +126 +129 +129 +133 +133 +138 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +183 +184 +185 +188 +188 +188 +190 +190 +194 +195 +195 +196 +196 +199 +198 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +205 +205 +202 +202 +200 +200 +200 +201 +200 +198 +199 +198 +196 +197 +196 +197 +196 +194 +194 +191 +190 +191 +188 +188 +184 +185 +183 +183 +183 +179 +178 +174 +174 +175 +172 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +120 +119 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +95 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +58 +54 +55 +51 +50 +51 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +26 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +16 +15 +14 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +54 +54 +55 +58 +58 +64 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +119 +119 +119 +119 +125 +126 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +179 +179 +179 +183 +182 +185 +184 +184 +189 +189 +191 +190 +191 +195 +194 +197 +196 +199 +198 +198 +201 +201 +200 +200 +200 +202 +203 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +207 +207 +207 +207 +206 +206 +206 +206 +206 +205 +205 +204 +204 +205 +203 +202 +203 +202 +202 +200 +200 +201 +200 +201 +198 +198 +196 +196 +197 +195 +194 +191 +190 +188 +189 +189 +185 +185 +183 +182 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +129 +125 +125 +119 +120 +119 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +71 +68 +68 +68 +64 +64 +58 +58 +55 +54 +55 +51 +50 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +18 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +18 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +40 +41 +41 +43 +43 +47 +47 +50 +50 +51 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +120 +125 +125 +130 +129 +129 +134 +133 +139 +139 +140 +143 +144 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +185 +189 +188 +189 +190 +190 +194 +195 +196 +197 +197 +197 +197 +198 +198 +200 +200 +201 +201 +201 +202 +202 +203 +205 +205 +204 +204 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +204 +205 +203 +203 +202 +201 +201 +200 +201 +200 +199 +198 +196 +196 +196 +194 +195 +190 +191 +191 +189 +188 +184 +184 +184 +183 +182 +178 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +130 +129 +129 +125 +125 +119 +119 +119 +115 +115 +110 +110 +109 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +33 +33 +31 +31 +32 +27 +27 +25 +24 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +36 +36 +37 +41 +40 +43 +43 +43 +47 +47 +47 +46 +46 +51 +50 +55 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +73 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +115 +116 +120 +120 +125 +126 +130 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +176 +175 +175 +179 +179 +182 +183 +183 +184 +185 +185 +185 +184 +188 +188 +190 +191 +191 +194 +194 +196 +197 +197 +198 +199 +201 +200 +200 +200 +201 +203 +202 +205 +204 +205 +205 +204 +205 +204 +204 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +207 +204 +204 +205 +205 +205 +202 +202 +202 +201 +200 +200 +200 +201 +198 +199 +196 +197 +197 +196 +196 +195 +194 +190 +190 +191 +189 +188 +184 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +162 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +126 +120 +119 +115 +116 +116 +110 +110 +105 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +73 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +14 +13 +12 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +12 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +59 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +109 +115 +116 +119 +119 +120 +125 +125 +130 +130 +130 +133 +133 +139 +140 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +186 +188 +189 +191 +191 +194 +194 +195 +196 +196 +199 +198 +198 +200 +200 +200 +201 +200 +200 +200 +202 +203 +202 +204 +205 +205 +205 +205 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +198 +198 +198 +197 +196 +194 +194 +195 +190 +191 +189 +188 +189 +185 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +119 +120 +115 +116 +117 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +69 +68 +64 +64 +59 +59 +58 +54 +55 +55 +54 +54 +50 +50 +46 +47 +46 +43 +42 +41 +40 +39 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +22 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +105 +110 +110 +116 +115 +116 +119 +119 +125 +125 +126 +129 +130 +134 +134 +139 +139 +139 +143 +144 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +179 +179 +182 +183 +185 +184 +184 +188 +189 +189 +189 +188 +190 +190 +194 +195 +195 +196 +196 +198 +198 +199 +201 +201 +201 +200 +203 +202 +202 +205 +204 +205 +204 +204 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +195 +191 +191 +190 +189 +189 +185 +185 +183 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +133 +130 +129 +129 +126 +125 +119 +119 +120 +116 +115 +109 +109 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +54 +52 +50 +50 +47 +48 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +51 +51 +55 +54 +55 +58 +59 +64 +64 +69 +68 +68 +72 +72 +76 +76 +77 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +125 +130 +130 +133 +134 +134 +139 +140 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +164 +165 +169 +169 +173 +172 +173 +175 +175 +174 +175 +174 +179 +178 +182 +182 +182 +185 +185 +188 +188 +190 +191 +191 +195 +194 +196 +197 +197 +198 +198 +200 +200 +201 +200 +201 +203 +203 +203 +204 +204 +204 +204 +204 +206 +207 +207 +206 +207 +207 +207 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +201 +200 +200 +201 +200 +199 +198 +196 +196 +195 +194 +195 +191 +191 +188 +188 +188 +185 +184 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +126 +126 +120 +119 +120 +116 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +66 +64 +65 +58 +58 +54 +55 +55 +51 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +46 +46 +51 +50 +55 +54 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +115 +120 +119 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +178 +179 +180 +182 +183 +185 +185 +188 +188 +189 +190 +190 +194 +194 +195 +196 +196 +198 +198 +198 +200 +200 +200 +201 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +200 +200 +199 +198 +196 +197 +196 +194 +194 +191 +191 +190 +188 +189 +184 +184 +184 +183 +183 +179 +179 +178 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +119 +119 +119 +115 +116 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +58 +58 +58 +58 +59 +55 +55 +50 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +16 +13 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +32 +33 +37 +36 +41 +41 +41 +43 +43 +47 +46 +47 +51 +50 +54 +54 +55 +59 +59 +64 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +109 +110 +116 +116 +119 +119 +122 +126 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +167 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +184 +185 +189 +188 +189 +191 +190 +194 +194 +195 +196 +197 +198 +198 +199 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +199 +199 +196 +196 +196 +194 +195 +191 +191 +190 +188 +189 +184 +184 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +130 +130 +129 +125 +125 +120 +120 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +72 +72 +72 +68 +68 +64 +64 +65 +59 +59 +54 +54 +51 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +16 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +26 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +55 +54 +58 +59 +60 +65 +64 +68 +68 +72 +72 +72 +76 +76 +83 +82 +82 +86 +86 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +120 +119 +120 +125 +125 +129 +129 +130 +133 +134 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +185 +188 +189 +190 +191 +194 +195 +195 +197 +196 +199 +198 +198 +200 +200 +200 +200 +200 +202 +203 +204 +204 +204 +205 +205 +206 +207 +207 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +205 +205 +204 +204 +204 +203 +202 +200 +201 +201 +200 +200 +198 +198 +199 +197 +196 +195 +195 +191 +191 +191 +189 +188 +185 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +113 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +54 +50 +51 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +16 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +55 +58 +58 +58 +65 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +116 +119 +120 +120 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +148 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +184 +185 +185 +189 +189 +190 +191 +191 +195 +195 +197 +196 +197 +199 +199 +201 +200 +201 +201 +201 +202 +202 +203 +204 +204 +205 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +203 +201 +200 +200 +200 +199 +198 +199 +197 +196 +195 +194 +194 +191 +191 +188 +188 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +126 +120 +119 +119 +116 +116 +110 +110 +110 +106 +105 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +59 +58 +54 +54 +55 +50 +51 +47 +47 +47 +43 +43 +40 +41 +40 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +26 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +55 +54 +54 +55 +55 +59 +58 +64 +64 +65 +68 +69 +72 +73 +74 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +109 +110 +115 +115 +120 +120 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +172 +173 +173 +175 +175 +179 +178 +179 +182 +182 +184 +185 +184 +189 +188 +191 +191 +191 +194 +194 +196 +197 +196 +199 +199 +201 +200 +201 +200 +201 +203 +202 +204 +205 +204 +205 +204 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +200 +198 +199 +199 +196 +197 +195 +194 +195 +190 +191 +189 +188 +189 +184 +184 +183 +183 +182 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +143 +143 +143 +139 +140 +139 +140 +139 +133 +133 +133 +129 +129 +130 +129 +129 +125 +125 +119 +119 +120 +115 +115 +109 +110 +106 +106 +106 +101 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +59 +56 +54 +54 +50 +50 +47 +47 +46 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +50 +50 +50 +54 +54 +58 +58 +58 +65 +64 +68 +68 +69 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +95 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +156 +157 +161 +161 +161 +161 +161 +165 +164 +169 +168 +169 +173 +173 +174 +175 +175 +179 +179 +183 +183 +184 +185 +185 +189 +188 +191 +190 +190 +195 +195 +197 +196 +196 +198 +198 +200 +200 +200 +201 +201 +202 +203 +202 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +201 +201 +198 +198 +198 +196 +197 +194 +194 +195 +191 +190 +191 +191 +191 +188 +189 +184 +184 +184 +183 +182 +179 +179 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +95 +96 +90 +90 +86 +85 +82 +82 +82 +76 +76 +72 +72 +72 +68 +64 +64 +64 +65 +59 +58 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +46 +46 +47 +50 +51 +55 +55 +55 +58 +58 +64 +65 +66 +68 +68 +73 +73 +76 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +119 +120 +119 +125 +126 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +189 +189 +189 +191 +191 +194 +194 +195 +196 +197 +198 +198 +201 +200 +201 +201 +200 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +207 +207 +206 +206 +205 +205 +204 +204 +204 +203 +203 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +197 +197 +195 +194 +191 +190 +188 +189 +188 +184 +185 +183 +183 +183 +178 +179 +179 +179 +179 +174 +175 +172 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +126 +126 +119 +119 +116 +116 +109 +110 +110 +105 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +58 +58 +59 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +40 +41 +37 +38 +37 +33 +33 +31 +31 +31 +27 +27 +25 +24 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +32 +33 +37 +37 +37 +41 +40 +43 +43 +44 +47 +47 +50 +50 +54 +55 +54 +59 +59 +64 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +134 +140 +139 +143 +142 +146 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +185 +188 +188 +188 +190 +191 +195 +195 +194 +196 +196 +199 +198 +198 +201 +200 +201 +201 +200 +202 +202 +204 +204 +205 +204 +204 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +205 +205 +204 +205 +202 +202 +203 +200 +201 +200 +200 +198 +198 +198 +196 +197 +194 +194 +194 +190 +190 +190 +191 +190 +189 +188 +184 +185 +185 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +129 +129 +129 +126 +125 +119 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +73 +68 +68 +68 +65 +64 +58 +59 +58 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +20 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +40 +41 +40 +43 +43 +47 +47 +47 +51 +51 +54 +54 +55 +59 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +116 +119 +120 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +174 +175 +175 +179 +179 +182 +183 +182 +185 +184 +189 +188 +188 +191 +191 +194 +194 +195 +197 +197 +198 +199 +199 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +207 +206 +207 +207 +206 +207 +207 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +205 +202 +202 +200 +201 +200 +200 +200 +200 +201 +200 +198 +198 +196 +196 +197 +195 +195 +190 +190 +189 +188 +189 +185 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +125 +125 +120 +120 +119 +116 +116 +110 +110 +110 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +76 +73 +72 +68 +69 +68 +65 +64 +58 +58 +59 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +24 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +18 +19 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +54 +54 +55 +59 +58 +59 +58 +58 +65 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +115 +115 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +189 +188 +189 +191 +190 +194 +194 +195 +197 +197 +198 +198 +198 +200 +200 +200 +201 +201 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +205 +202 +203 +201 +201 +200 +201 +200 +198 +198 +198 +196 +197 +195 +195 +194 +191 +190 +189 +189 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +173 +172 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +126 +126 +126 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +73 +72 +72 +68 +68 +64 +65 +65 +59 +58 +58 +58 +58 +55 +54 +51 +51 +51 +47 +46 +43 +43 +44 +41 +41 +37 +38 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +59 +59 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +120 +119 +126 +126 +130 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +176 +175 +175 +178 +179 +183 +182 +182 +184 +184 +185 +185 +185 +189 +188 +190 +190 +194 +194 +196 +197 +196 +198 +199 +201 +200 +200 +200 +200 +203 +202 +204 +205 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +205 +204 +204 +202 +203 +202 +201 +200 +200 +200 +201 +198 +198 +197 +197 +197 +195 +195 +190 +190 +190 +188 +189 +185 +184 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +120 +119 +116 +116 +110 +110 +109 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +64 +64 +59 +58 +59 +55 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +36 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +58 +58 +59 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +173 +173 +173 +175 +176 +179 +178 +179 +182 +182 +184 +185 +185 +188 +188 +191 +190 +194 +194 +194 +196 +196 +198 +199 +198 +200 +200 +201 +201 +200 +200 +201 +202 +202 +202 +204 +204 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +204 +204 +204 +205 +204 +202 +202 +203 +201 +201 +200 +200 +199 +199 +199 +196 +196 +194 +195 +194 +190 +190 +189 +189 +189 +185 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +130 +125 +125 +119 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +91 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +69 +69 +65 +65 +65 +59 +59 +55 +55 +55 +51 +50 +50 +51 +51 +47 +46 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +59 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +183 +185 +184 +189 +189 +188 +190 +191 +191 +190 +191 +195 +194 +197 +197 +197 +198 +198 +201 +200 +201 +201 +201 +202 +202 +204 +204 +205 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +198 +199 +197 +196 +197 +194 +195 +190 +190 +190 +189 +189 +184 +185 +182 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +134 +130 +129 +129 +125 +125 +126 +125 +126 +120 +120 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +59 +59 +58 +54 +55 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +40 +41 +41 +43 +43 +47 +46 +47 +50 +50 +54 +55 +59 +59 +59 +64 +64 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +115 +119 +120 +119 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +180 +182 +183 +184 +184 +188 +188 +189 +191 +190 +194 +194 +194 +196 +197 +199 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +205 +204 +207 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +203 +202 +200 +200 +201 +201 +201 +198 +198 +198 +198 +198 +197 +197 +195 +194 +195 +190 +191 +189 +188 +188 +184 +185 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +141 +133 +133 +130 +129 +125 +125 +125 +120 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +77 +72 +72 +72 +68 +69 +64 +64 +65 +58 +58 +58 +58 +59 +54 +54 +50 +50 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +24 +25 +25 +27 +28 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +53 +58 +58 +65 +64 +65 +68 +69 +73 +73 +72 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +105 +106 +110 +110 +115 +115 +116 +119 +119 +125 +126 +126 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +174 +175 +179 +178 +179 +183 +183 +185 +185 +185 +189 +188 +190 +190 +190 +195 +195 +197 +196 +197 +198 +199 +201 +201 +201 +200 +200 +203 +202 +204 +204 +205 +205 +204 +206 +206 +207 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +205 +204 +202 +202 +200 +200 +201 +200 +200 +198 +199 +198 +196 +196 +195 +194 +194 +191 +191 +188 +188 +188 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +134 +130 +129 +125 +126 +126 +120 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +59 +59 +59 +55 +55 +51 +51 +47 +46 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +24 +26 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +47 +47 +50 +51 +55 +54 +54 +58 +58 +64 +64 +66 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +91 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +117 +119 +120 +126 +126 +130 +129 +130 +134 +134 +139 +140 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +163 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +184 +189 +189 +190 +191 +191 +195 +195 +196 +196 +197 +199 +199 +200 +201 +200 +201 +200 +202 +203 +204 +204 +204 +205 +205 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +200 +201 +201 +200 +200 +198 +199 +198 +196 +197 +195 +194 +195 +190 +191 +189 +189 +185 +185 +185 +183 +183 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +130 +130 +126 +125 +119 +119 +120 +116 +115 +110 +110 +108 +105 +106 +100 +100 +96 +96 +96 +89 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +73 +69 +68 +64 +64 +61 +58 +59 +55 +54 +50 +50 +50 +46 +47 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +30 +33 +33 +37 +37 +37 +40 +40 +43 +43 +43 +47 +47 +50 +51 +51 +54 +54 +59 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +109 +110 +110 +116 +116 +120 +120 +119 +125 +125 +125 +125 +125 +130 +129 +134 +134 +134 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +156 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +182 +182 +185 +185 +186 +189 +188 +191 +190 +194 +194 +194 +197 +196 +199 +199 +198 +200 +200 +200 +200 +200 +202 +203 +204 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +205 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +201 +199 +198 +197 +196 +196 +194 +194 +191 +190 +190 +188 +188 +185 +184 +184 +182 +183 +178 +179 +179 +175 +175 +173 +173 +174 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +130 +129 +127 +125 +126 +120 +120 +115 +116 +116 +109 +109 +106 +106 +107 +100 +100 +100 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +68 +69 +64 +65 +58 +59 +59 +55 +55 +51 +51 +50 +47 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +38 +41 +41 +43 +43 +48 +47 +46 +51 +50 +54 +54 +54 +59 +59 +59 +59 +59 +64 +64 +68 +68 +68 +73 +72 +77 +77 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +116 +116 +119 +119 +125 +125 +129 +129 +130 +133 +133 +138 +139 +139 +143 +143 +147 +147 +147 +151 +151 +156 +157 +157 +161 +165 +165 +165 +165 +169 +169 +172 +173 +175 +175 +175 +178 +178 +183 +182 +183 +185 +185 +189 +188 +189 +190 +190 +194 +194 +195 +196 +196 +198 +198 +198 +200 +200 +201 +201 +203 +202 +202 +205 +205 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +206 +205 +204 +204 +203 +204 +202 +201 +201 +200 +200 +200 +198 +199 +197 +197 +197 +195 +195 +191 +190 +191 +188 +189 +185 +185 +184 +182 +183 +178 +179 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +152 +151 +147 +147 +145 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +119 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +65 +65 +59 +59 +59 +55 +55 +50 +50 +47 +46 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +12 +16 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +40 +41 +41 +41 +43 +42 +47 +47 +47 +51 +51 +55 +55 +55 +59 +59 +65 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +115 +116 +116 +119 +120 +125 +125 +125 +130 +129 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +184 +184 +188 +188 +191 +190 +194 +194 +195 +197 +197 +198 +198 +199 +201 +201 +200 +201 +200 +202 +202 +204 +205 +204 +204 +204 +206 +206 +207 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +199 +200 +196 +196 +195 +194 +190 +191 +190 +189 +189 +185 +185 +184 +183 +183 +183 +183 +182 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +120 +119 +120 +116 +115 +109 +110 +109 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +69 +68 +65 +64 +58 +58 +59 +54 +55 +51 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +12 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +46 +50 +50 +51 +55 +55 +58 +58 +58 +64 +64 +64 +64 +64 +68 +69 +72 +72 +73 +76 +77 +82 +82 +86 +86 +85 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +116 +116 +116 +119 +120 +125 +125 +126 +129 +130 +133 +133 +139 +139 +139 +144 +143 +147 +147 +148 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +182 +184 +184 +188 +188 +188 +191 +190 +195 +195 +194 +196 +197 +198 +199 +198 +200 +201 +200 +201 +201 +202 +203 +204 +205 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +207 +207 +204 +204 +204 +204 +204 +202 +202 +200 +201 +200 +201 +200 +198 +198 +197 +196 +196 +194 +194 +194 +194 +194 +190 +191 +188 +188 +189 +184 +184 +183 +183 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +126 +126 +119 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +59 +58 +55 +54 +50 +50 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +33 +31 +30 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +26 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +85 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +116 +119 +119 +119 +125 +126 +130 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +168 +173 +173 +174 +174 +175 +179 +179 +183 +183 +183 +185 +184 +189 +188 +188 +191 +191 +194 +195 +195 +196 +196 +199 +198 +201 +201 +201 +200 +200 +202 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +201 +201 +198 +198 +198 +196 +196 +194 +195 +192 +191 +190 +188 +188 +185 +184 +184 +183 +183 +179 +178 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +129 +125 +126 +120 +119 +120 +115 +115 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +69 +68 +64 +64 +59 +59 +59 +54 +54 +50 +50 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +19 +19 +19 +17 +17 +14 +16 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +46 +47 +46 +50 +51 +54 +55 +54 +58 +59 +64 +64 +65 +69 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +115 +115 +119 +120 +126 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +185 +189 +189 +189 +190 +190 +194 +195 +194 +196 +196 +198 +198 +199 +200 +200 +201 +200 +201 +202 +202 +204 +205 +205 +204 +205 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +205 +204 +205 +205 +205 +202 +203 +203 +200 +200 +201 +200 +198 +198 +198 +196 +196 +194 +194 +195 +190 +190 +191 +191 +190 +189 +189 +185 +185 +185 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +134 +133 +129 +129 +129 +126 +125 +119 +119 +120 +116 +115 +110 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +58 +54 +55 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +20 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +17 +18 +17 +19 +19 +21 +21 +21 +25 +25 +26 +27 +28 +31 +30 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +55 +58 +58 +58 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +172 +172 +173 +175 +175 +178 +178 +179 +183 +182 +185 +185 +184 +189 +189 +190 +191 +191 +194 +195 +197 +196 +196 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +204 +204 +205 +205 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +205 +205 +204 +204 +202 +202 +202 +200 +200 +200 +201 +200 +200 +200 +199 +198 +198 +196 +197 +194 +194 +192 +190 +191 +188 +188 +184 +185 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +162 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +120 +115 +116 +115 +110 +109 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +69 +69 +64 +64 +65 +58 +58 +54 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +50 +50 +54 +54 +58 +58 +58 +64 +64 +68 +68 +69 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +119 +119 +125 +126 +130 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +188 +191 +190 +191 +195 +194 +197 +196 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +201 +201 +201 +201 +201 +199 +198 +196 +196 +197 +194 +194 +191 +189 +190 +188 +189 +185 +184 +184 +182 +182 +178 +179 +179 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +120 +120 +119 +115 +116 +115 +115 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +59 +54 +55 +55 +51 +50 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +58 +59 +58 +65 +64 +68 +68 +68 +72 +73 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +120 +120 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +184 +188 +188 +189 +188 +189 +190 +191 +194 +194 +194 +197 +197 +199 +198 +200 +201 +200 +200 +201 +203 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +203 +202 +200 +201 +201 +200 +201 +199 +198 +199 +197 +197 +195 +195 +195 +191 +191 +189 +189 +185 +185 +185 +182 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +160 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +119 +116 +116 +116 +110 +110 +106 +105 +107 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +36 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +16 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +42 +47 +47 +51 +51 +51 +55 +55 +58 +59 +64 +64 +65 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +116 +115 +119 +120 +125 +126 +125 +130 +129 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +183 +185 +185 +188 +189 +189 +191 +191 +195 +195 +196 +197 +196 +199 +199 +200 +201 +201 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +201 +200 +201 +198 +198 +197 +196 +197 +195 +194 +190 +190 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +120 +120 +115 +115 +109 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +89 +86 +86 +82 +82 +82 +76 +76 +72 +72 +75 +68 +68 +64 +64 +58 +58 +58 +55 +55 +51 +51 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +48 +47 +47 +51 +50 +55 +55 +55 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +120 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +184 +188 +189 +189 +190 +191 +195 +194 +194 +196 +196 +196 +197 +196 +198 +198 +201 +200 +201 +200 +200 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +205 +205 +202 +202 +201 +201 +200 +201 +201 +200 +200 +200 +199 +198 +196 +196 +196 +194 +194 +190 +191 +190 +189 +189 +185 +185 +184 +182 +183 +178 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +140 +139 +133 +133 +130 +129 +129 +125 +125 +120 +119 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +91 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +69 +69 +65 +64 +65 +64 +64 +58 +58 +55 +55 +54 +50 +51 +47 +46 +45 +43 +43 +41 +41 +36 +37 +37 +33 +33 +32 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +40 +41 +43 +43 +47 +46 +47 +50 +50 +54 +54 +54 +58 +58 +64 +65 +65 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +125 +126 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +168 +169 +172 +173 +173 +175 +175 +179 +179 +179 +183 +183 +183 +183 +183 +185 +185 +188 +189 +189 +191 +190 +194 +194 +196 +196 +197 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +199 +198 +196 +196 +196 +194 +195 +190 +190 +188 +188 +189 +185 +185 +182 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +162 +157 +157 +151 +151 +148 +147 +147 +143 +144 +139 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +120 +115 +115 +109 +110 +110 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +65 +61 +58 +59 +55 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +22 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +58 +58 +59 +64 +65 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +149 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +185 +189 +189 +189 +191 +191 +194 +194 +194 +197 +196 +198 +198 +198 +200 +201 +201 +200 +200 +202 +203 +204 +204 +205 +205 +205 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +205 +205 +203 +202 +200 +200 +201 +201 +200 +198 +198 +197 +197 +197 +195 +195 +190 +191 +190 +189 +188 +185 +184 +184 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +130 +125 +126 +127 +120 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +74 +72 +72 +68 +68 +64 +64 +65 +58 +59 +55 +54 +55 +51 +51 +50 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +35 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +24 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +54 +59 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +97 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +115 +119 +120 +125 +126 +125 +129 +129 +133 +134 +136 +140 +140 +143 +144 +148 +147 +147 +151 +151 +157 +157 +158 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +174 +175 +175 +179 +179 +182 +183 +182 +185 +185 +188 +189 +189 +190 +191 +195 +194 +195 +196 +197 +198 +198 +199 +201 +201 +200 +201 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +205 +203 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +195 +194 +191 +191 +191 +189 +188 +184 +185 +185 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +119 +119 +116 +115 +115 +115 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +58 +59 +58 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +51 +51 +54 +54 +58 +59 +59 +65 +65 +68 +69 +73 +72 +72 +76 +76 +82 +82 +82 +86 +87 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +115 +119 +120 +120 +126 +126 +129 +130 +130 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +154 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +189 +189 +191 +190 +193 +195 +195 +197 +197 +198 +198 +199 +201 +200 +201 +200 +200 +202 +203 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +205 +204 +203 +203 +200 +200 +201 +201 +201 +199 +199 +198 +197 +197 +194 +195 +191 +191 +190 +188 +189 +184 +184 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +140 +139 +133 +133 +129 +130 +130 +126 +126 +119 +119 +117 +115 +115 +110 +110 +106 +106 +106 +99 +100 +95 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +50 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +54 +55 +54 +58 +59 +64 +64 +64 +68 +68 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +116 +120 +119 +119 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +182 +184 +185 +185 +189 +189 +191 +191 +190 +194 +194 +197 +197 +196 +199 +199 +201 +201 +201 +200 +200 +203 +202 +204 +205 +205 +204 +205 +206 +206 +207 +206 +207 +207 +207 +206 +207 +206 +206 +207 +206 +206 +207 +204 +204 +204 +205 +205 +203 +203 +201 +201 +201 +201 +200 +199 +198 +199 +197 +197 +195 +194 +195 +190 +191 +189 +189 +188 +185 +185 +183 +183 +182 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +164 +161 +161 +161 +161 +161 +157 +157 +151 +152 +151 +147 +147 +143 +143 +141 +139 +139 +133 +134 +129 +129 +129 +125 +125 +120 +119 +119 +115 +115 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +65 +65 +59 +58 +54 +55 +55 +51 +50 +46 +47 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +50 +51 +55 +55 +54 +58 +58 +64 +64 +66 +68 +68 +73 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +120 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +175 +178 +179 +183 +182 +182 +184 +185 +188 +188 +189 +190 +190 +195 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +201 +203 +203 +203 +204 +204 +204 +204 +204 +207 +206 +207 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +205 +204 +205 +204 +204 +202 +203 +200 +200 +200 +201 +201 +198 +198 +200 +196 +197 +194 +194 +191 +191 +190 +189 +188 +185 +184 +184 +183 +182 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +130 +130 +130 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +55 +55 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +24 +25 +21 +21 +21 +19 +18 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +34 +37 +37 +40 +41 +42 +43 +43 +47 +47 +51 +51 +51 +54 +55 +54 +55 +55 +59 +58 +64 +64 +64 +68 +68 +72 +72 +74 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +120 +119 +126 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +175 +175 +175 +179 +178 +182 +183 +183 +185 +184 +189 +189 +189 +190 +191 +195 +195 +195 +196 +197 +199 +199 +199 +200 +201 +200 +200 +203 +202 +203 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +207 +206 +206 +204 +204 +205 +204 +205 +202 +202 +200 +201 +201 +200 +201 +198 +198 +199 +197 +197 +195 +194 +194 +190 +190 +188 +188 +189 +185 +185 +182 +183 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +120 +119 +119 +116 +115 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +65 +58 +58 +59 +54 +54 +50 +51 +47 +47 +47 +42 +43 +41 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +32 +33 +32 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +59 +58 +64 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +83 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +166 +165 +165 +169 +169 +172 +173 +173 +175 +175 +175 +175 +175 +179 +178 +182 +183 +183 +185 +185 +189 +189 +189 +191 +190 +195 +194 +197 +197 +196 +199 +198 +201 +200 +200 +200 +200 +200 +200 +200 +202 +202 +204 +205 +205 +205 +204 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +205 +204 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +201 +198 +199 +196 +197 +195 +195 +194 +191 +191 +189 +188 +188 +185 +184 +183 +182 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +156 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +130 +129 +130 +125 +125 +120 +119 +115 +116 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +85 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +64 +64 +65 +59 +58 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +22 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +34 +33 +37 +37 +41 +40 +43 +43 +42 +47 +47 +50 +51 +50 +54 +54 +59 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +119 +125 +125 +129 +130 +130 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +182 +183 +184 +185 +188 +189 +189 +190 +190 +195 +194 +194 +196 +196 +199 +198 +199 +200 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +207 +207 +207 +206 +204 +204 +204 +204 +205 +202 +202 +200 +201 +201 +201 +200 +198 +199 +198 +196 +196 +197 +197 +196 +194 +194 +190 +191 +191 +188 +188 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +130 +130 +125 +126 +119 +119 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +87 +86 +82 +82 +76 +77 +76 +72 +72 +72 +72 +72 +69 +68 +64 +65 +65 +58 +59 +55 +54 +55 +51 +51 +47 +46 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +24 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +16 +16 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +55 +55 +59 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +105 +105 +106 +110 +110 +115 +116 +120 +119 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +183 +184 +185 +189 +189 +189 +190 +191 +194 +194 +195 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +202 +204 +204 +205 +205 +204 +204 +204 +207 +207 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +202 +202 +203 +200 +200 +200 +200 +200 +198 +198 +196 +197 +195 +194 +195 +191 +190 +188 +188 +188 +184 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +144 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +58 +58 +54 +54 +55 +54 +55 +51 +51 +47 +47 +47 +43 +42 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +42 +47 +47 +50 +51 +51 +55 +54 +58 +58 +59 +64 +64 +68 +69 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +119 +120 +125 +125 +129 +129 +130 +133 +134 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +176 +175 +175 +179 +178 +183 +183 +184 +189 +189 +190 +190 +190 +190 +191 +194 +195 +197 +196 +196 +198 +199 +200 +201 +200 +200 +201 +203 +203 +203 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +207 +206 +207 +206 +206 +206 +204 +204 +204 +205 +203 +202 +202 +201 +201 +200 +201 +200 +198 +198 +196 +196 +196 +195 +195 +190 +190 +191 +189 +189 +185 +184 +185 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +130 +130 +130 +125 +126 +120 +119 +119 +116 +116 +109 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +58 +55 +55 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +30 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +42 +47 +47 +50 +50 +51 +54 +54 +58 +59 +58 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +174 +172 +173 +175 +175 +178 +178 +179 +182 +182 +183 +183 +183 +185 +185 +188 +189 +189 +191 +190 +195 +195 +195 +196 +197 +199 +198 +200 +201 +201 +201 +201 +202 +202 +202 +204 +204 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +199 +199 +197 +196 +195 +195 +191 +190 +191 +189 +189 +185 +185 +185 +183 +183 +183 +183 +183 +179 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +160 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +129 +129 +125 +125 +119 +120 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +69 +69 +64 +64 +58 +58 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +42 +37 +36 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +51 +50 +51 +55 +55 +59 +59 +59 +64 +64 +68 +69 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +91 +96 +96 +101 +99 +99 +106 +106 +109 +110 +109 +116 +116 +115 +115 +115 +120 +120 +126 +126 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +174 +175 +178 +179 +183 +183 +184 +185 +185 +189 +188 +191 +190 +190 +194 +195 +195 +194 +194 +196 +197 +198 +198 +199 +200 +200 +200 +200 +201 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +205 +205 +204 +204 +202 +202 +203 +201 +200 +200 +200 +200 +198 +199 +197 +196 +196 +195 +194 +191 +191 +191 +188 +189 +185 +185 +185 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +97 +90 +90 +86 +87 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +65 +64 +58 +59 +54 +54 +55 +51 +51 +47 +47 +45 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +40 +43 +43 +47 +47 +47 +51 +51 +55 +54 +54 +58 +58 +64 +65 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +116 +116 +120 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +178 +183 +183 +183 +182 +183 +184 +185 +189 +189 +189 +190 +191 +194 +194 +196 +196 +196 +198 +198 +200 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +201 +198 +199 +196 +196 +197 +195 +194 +191 +190 +189 +188 +188 +184 +184 +182 +183 +182 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +164 +161 +161 +160 +156 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +130 +129 +125 +125 +120 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +61 +59 +58 +54 +54 +50 +51 +50 +47 +47 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +46 +51 +51 +55 +54 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +119 +120 +120 +125 +126 +129 +129 +129 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +182 +182 +183 +185 +185 +189 +188 +189 +190 +190 +194 +195 +194 +196 +197 +199 +198 +199 +200 +200 +200 +200 +201 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +201 +200 +201 +200 +198 +198 +196 +196 +196 +194 +195 +190 +191 +190 +188 +188 +184 +184 +184 +182 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +120 +119 +119 +116 +116 +110 +110 +110 +105 +106 +106 +106 +106 +99 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +77 +76 +72 +72 +73 +68 +68 +65 +64 +64 +58 +58 +59 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +42 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +18 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +55 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +73 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +99 +100 +105 +106 +110 +110 +110 +115 +115 +119 +120 +120 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +184 +184 +188 +188 +189 +190 +190 +194 +194 +195 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +201 +200 +201 +200 +200 +198 +198 +196 +196 +196 +194 +195 +190 +191 +190 +189 +189 +185 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +133 +133 +129 +130 +129 +125 +126 +125 +125 +125 +119 +119 +115 +115 +116 +110 +110 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +55 +54 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +24 +20 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +54 +55 +59 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +107 +109 +110 +116 +115 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +183 +183 +184 +184 +185 +189 +189 +190 +190 +194 +194 +195 +196 +196 +198 +199 +199 +200 +200 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +201 +200 +201 +201 +198 +198 +199 +197 +197 +195 +195 +191 +190 +191 +188 +188 +185 +184 +185 +182 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +164 +164 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +140 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +120 +117 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +65 +64 +58 +58 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +32 +33 +31 +31 +27 +27 +27 +25 +24 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +55 +55 +55 +58 +59 +64 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +88 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +116 +115 +116 +119 +119 +125 +125 +126 +130 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +178 +183 +183 +185 +185 +185 +189 +188 +191 +190 +190 +194 +194 +197 +196 +197 +198 +199 +200 +200 +201 +201 +200 +203 +202 +205 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +207 +207 +207 +206 +206 +206 +206 +206 +207 +204 +204 +205 +205 +204 +202 +202 +201 +200 +201 +201 +201 +198 +198 +198 +197 +197 +195 +194 +195 +191 +191 +189 +188 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +129 +129 +125 +125 +125 +119 +120 +115 +116 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +58 +59 +55 +55 +51 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +16 +15 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +59 +59 +64 +64 +65 +69 +68 +72 +72 +73 +76 +76 +83 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +105 +106 +110 +110 +110 +116 +116 +119 +120 +122 +126 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +171 +173 +173 +175 +175 +179 +179 +178 +183 +182 +185 +185 +184 +188 +189 +191 +191 +191 +194 +195 +196 +196 +196 +199 +199 +200 +201 +200 +201 +201 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +194 +194 +195 +190 +191 +189 +189 +189 +184 +185 +183 +183 +178 +178 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +160 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +125 +120 +120 +119 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +59 +59 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +42 +43 +43 +47 +47 +50 +50 +51 +54 +55 +58 +59 +61 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +115 +119 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +160 +165 +165 +169 +169 +168 +173 +173 +175 +175 +175 +178 +179 +183 +182 +182 +184 +185 +189 +188 +188 +191 +190 +195 +195 +197 +196 +197 +199 +198 +200 +200 +201 +200 +201 +203 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +203 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +196 +194 +194 +190 +191 +189 +188 +189 +184 +184 +183 +182 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +134 +133 +133 +129 +130 +125 +126 +126 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +59 +58 +59 +54 +54 +50 +51 +51 +47 +47 +43 +42 +43 +41 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +46 +50 +51 +52 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +175 +175 +175 +179 +179 +179 +183 +183 +184 +184 +189 +189 +188 +190 +190 +195 +195 +195 +196 +197 +198 +198 +199 +200 +200 +201 +200 +200 +202 +202 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +205 +202 +202 +200 +200 +201 +200 +200 +199 +198 +197 +197 +196 +194 +194 +191 +190 +191 +189 +189 +185 +185 +185 +182 +183 +179 +178 +178 +175 +175 +173 +173 +172 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +128 +125 +126 +119 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +75 +72 +72 +68 +69 +65 +64 +64 +58 +59 +55 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +51 +51 +54 +54 +58 +58 +58 +64 +64 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +183 +182 +183 +184 +184 +188 +188 +188 +191 +190 +195 +195 +194 +196 +197 +198 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +191 +191 +191 +188 +189 +185 +185 +184 +183 +183 +179 +179 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +130 +129 +125 +125 +126 +120 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +59 +58 +54 +54 +54 +50 +51 +46 +47 +47 +43 +43 +41 +41 +37 +36 +37 +33 +34 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +17 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +30 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +47 +47 +46 +51 +51 +55 +54 +55 +58 +58 +65 +64 +66 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +119 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +182 +184 +185 +189 +188 +188 +190 +191 +194 +194 +195 +197 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +200 +200 +199 +198 +199 +196 +196 +194 +195 +192 +190 +191 +189 +188 +184 +184 +185 +183 +183 +178 +179 +178 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +144 +144 +139 +139 +139 +133 +133 +129 +129 +129 +126 +126 +119 +120 +120 +116 +116 +110 +110 +107 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +55 +54 +54 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +34 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +48 +51 +51 +55 +54 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +120 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +156 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +188 +191 +190 +190 +194 +194 +196 +197 +196 +198 +198 +200 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +197 +196 +197 +194 +195 +191 +190 +190 +189 +188 +188 +189 +188 +184 +185 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +129 +129 +126 +125 +125 +119 +119 +116 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +55 +54 +54 +51 +50 +47 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +32 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +47 +46 +51 +50 +55 +55 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +116 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +178 +178 +183 +183 +183 +184 +185 +189 +189 +188 +191 +190 +194 +194 +194 +196 +196 +199 +198 +199 +200 +201 +200 +200 +201 +202 +202 +204 +205 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +198 +196 +196 +196 +195 +195 +194 +194 +195 +190 +191 +188 +189 +189 +185 +185 +182 +182 +179 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +119 +120 +116 +115 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +77 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +59 +58 +64 +64 +68 +69 +72 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +125 +125 +125 +129 +130 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +184 +185 +185 +188 +188 +191 +190 +190 +194 +195 +197 +196 +196 +198 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +205 +204 +204 +204 +204 +205 +207 +206 +206 +206 +207 +207 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +200 +200 +198 +198 +199 +196 +197 +194 +194 +191 +190 +191 +188 +189 +184 +185 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +126 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +28 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +46 +51 +51 +54 +55 +55 +58 +58 +64 +65 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +120 +126 +126 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +185 +184 +189 +188 +190 +190 +195 +194 +194 +196 +197 +199 +198 +198 +200 +200 +201 +201 +200 +201 +201 +202 +202 +202 +204 +205 +204 +205 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +204 +202 +202 +200 +200 +200 +201 +201 +199 +199 +196 +196 +197 +195 +194 +191 +190 +190 +188 +189 +185 +185 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +125 +125 +125 +120 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +54 +51 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +58 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +115 +119 +120 +120 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +168 +169 +173 +173 +175 +175 +178 +178 +179 +182 +182 +185 +184 +185 +188 +188 +189 +188 +188 +191 +190 +194 +194 +194 +197 +197 +198 +199 +199 +201 +200 +201 +200 +202 +202 +203 +204 +204 +205 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +207 +206 +206 +207 +206 +205 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +199 +198 +198 +196 +196 +195 +194 +195 +190 +190 +189 +189 +185 +185 +184 +183 +182 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +140 +139 +134 +134 +133 +129 +129 +126 +125 +126 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +65 +58 +58 +54 +55 +55 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +54 +59 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +109 +110 +116 +116 +116 +119 +119 +125 +125 +126 +130 +129 +133 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +166 +165 +165 +169 +169 +172 +173 +173 +175 +175 +175 +174 +175 +178 +179 +182 +183 +183 +184 +184 +189 +189 +189 +191 +191 +195 +194 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +200 +200 +200 +203 +202 +204 +204 +205 +205 +204 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +201 +200 +201 +201 +198 +199 +198 +196 +196 +194 +194 +195 +190 +190 +188 +188 +189 +184 +184 +183 +182 +182 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +116 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +73 +68 +68 +65 +64 +64 +58 +58 +54 +55 +54 +51 +51 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +35 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +18 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +73 +76 +76 +77 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +110 +110 +115 +115 +120 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +182 +183 +184 +184 +184 +189 +188 +191 +190 +190 +194 +194 +194 +195 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +205 +204 +204 +202 +202 +203 +201 +200 +200 +200 +200 +198 +198 +197 +196 +196 +195 +195 +190 +190 +190 +188 +189 +185 +184 +184 +182 +183 +178 +179 +175 +175 +175 +173 +172 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +156 +157 +151 +150 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +126 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +69 +68 +68 +64 +64 +58 +59 +58 +55 +55 +50 +50 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +30 +31 +31 +31 +31 +27 +27 +24 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +12 +15 +15 +17 +17 +17 +19 +19 +25 +25 +25 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +46 +51 +51 +55 +54 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +125 +129 +129 +129 +133 +133 +140 +140 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +158 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +182 +183 +183 +182 +183 +185 +185 +188 +189 +189 +191 +191 +194 +195 +197 +197 +197 +198 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +202 +200 +200 +201 +200 +200 +198 +198 +196 +197 +197 +195 +194 +191 +191 +189 +188 +188 +185 +184 +182 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +140 +139 +133 +133 +133 +133 +133 +129 +130 +126 +125 +125 +120 +119 +116 +116 +116 +110 +110 +106 +105 +100 +101 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +67 +64 +64 +59 +59 +54 +55 +54 +50 +50 +47 +47 +47 +43 +43 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +20 +21 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +50 +51 +55 +54 +54 +58 +58 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +105 +110 +110 +116 +115 +115 +120 +119 +120 +120 +119 +126 +126 +129 +129 +129 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +180 +183 +183 +185 +185 +188 +188 +189 +191 +190 +194 +195 +194 +196 +196 +199 +198 +198 +200 +200 +200 +201 +201 +203 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +204 +205 +204 +204 +204 +202 +203 +200 +201 +201 +200 +201 +199 +199 +196 +196 +196 +194 +195 +191 +191 +190 +189 +189 +185 +185 +184 +182 +183 +178 +179 +179 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +140 +133 +133 +134 +129 +129 +126 +125 +119 +119 +119 +115 +116 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +59 +58 +59 +59 +55 +54 +50 +51 +51 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +20 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +26 +28 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +42 +47 +47 +51 +51 +51 +55 +54 +59 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +120 +125 +125 +130 +130 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +183 +183 +184 +185 +189 +189 +189 +190 +191 +194 +194 +195 +197 +197 +198 +198 +200 +200 +201 +201 +200 +202 +203 +202 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +204 +204 +204 +204 +204 +203 +202 +203 +201 +201 +201 +201 +200 +198 +198 +196 +197 +196 +195 +194 +191 +191 +191 +188 +189 +184 +185 +183 +182 +182 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +134 +134 +129 +130 +129 +125 +125 +119 +120 +119 +116 +116 +110 +110 +110 +106 +105 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +73 +68 +68 +64 +64 +65 +59 +59 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +101 +100 +106 +106 +107 +110 +110 +115 +115 +120 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +140 +139 +144 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +172 +173 +175 +175 +175 +179 +179 +183 +182 +182 +184 +185 +188 +188 +189 +190 +191 +195 +194 +196 +196 +196 +198 +198 +200 +201 +200 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +205 +204 +207 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +203 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +197 +196 +195 +194 +191 +190 +190 +188 +189 +184 +184 +184 +182 +183 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +151 +151 +151 +148 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +117 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +51 +50 +46 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +54 +54 +54 +58 +58 +65 +64 +64 +68 +69 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +92 +95 +97 +100 +100 +106 +106 +106 +110 +109 +116 +116 +116 +119 +119 +119 +119 +120 +126 +125 +129 +129 +129 +133 +134 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +182 +184 +184 +185 +188 +188 +190 +191 +190 +194 +194 +196 +196 +196 +198 +198 +200 +200 +201 +201 +200 +202 +203 +202 +204 +205 +204 +204 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +205 +205 +202 +202 +203 +200 +200 +200 +200 +199 +198 +198 +196 +197 +195 +195 +194 +190 +191 +189 +188 +189 +184 +185 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +150 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +119 +115 +115 +110 +109 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +69 +69 +64 +64 +58 +58 +59 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +38 +41 +41 +42 +43 +46 +47 +47 +50 +51 +55 +55 +54 +58 +58 +59 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +105 +106 +106 +106 +109 +110 +116 +116 +115 +119 +120 +126 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +174 +175 +175 +179 +178 +182 +182 +182 +184 +184 +188 +189 +189 +190 +190 +194 +194 +195 +197 +196 +199 +199 +198 +200 +200 +201 +200 +203 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +207 +206 +206 +207 +204 +204 +204 +204 +203 +203 +202 +200 +201 +200 +200 +200 +199 +198 +197 +197 +197 +194 +195 +191 +190 +190 +188 +188 +184 +185 +184 +183 +183 +178 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +133 +133 +133 +129 +129 +125 +125 +126 +120 +119 +119 +120 +120 +116 +115 +109 +110 +110 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +59 +55 +54 +51 +50 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +18 +17 +16 +16 +15 +16 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +42 +43 +43 +46 +47 +51 +51 +51 +54 +55 +59 +58 +59 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +85 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +107 +109 +110 +116 +115 +119 +119 +119 +125 +126 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +183 +182 +183 +185 +185 +189 +189 +189 +191 +190 +194 +194 +197 +197 +197 +198 +199 +200 +201 +201 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +205 +204 +205 +205 +202 +202 +202 +201 +200 +200 +200 +201 +199 +198 +197 +196 +197 +194 +194 +190 +190 +188 +188 +188 +185 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +144 +143 +140 +139 +139 +133 +133 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +115 +115 +113 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +73 +68 +69 +64 +64 +59 +59 +58 +55 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +36 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +16 +17 +17 +16 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +40 +41 +41 +42 +42 +47 +46 +47 +50 +51 +55 +55 +58 +58 +58 +65 +64 +68 +68 +68 +72 +72 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +126 +125 +129 +130 +133 +134 +134 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +188 +189 +188 +191 +190 +194 +194 +194 +196 +196 +197 +196 +196 +198 +199 +200 +200 +200 +200 +201 +202 +203 +203 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +204 +204 +204 +205 +205 +203 +203 +201 +201 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +195 +195 +194 +190 +191 +189 +188 +189 +185 +184 +183 +183 +180 +179 +179 +175 +175 +173 +173 +172 +169 +169 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +158 +157 +151 +151 +147 +148 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +116 +116 +115 +110 +109 +106 +105 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +55 +55 +55 +51 +51 +47 +47 +44 +43 +42 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +12 +15 +15 +15 +15 +15 +18 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +42 +43 +43 +47 +47 +51 +51 +51 +54 +54 +59 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +130 +130 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +166 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +185 +184 +184 +189 +188 +190 +190 +191 +195 +195 +196 +197 +199 +198 +198 +200 +200 +201 +201 +200 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +202 +202 +201 +201 +200 +201 +200 +199 +198 +196 +196 +195 +194 +195 +190 +190 +188 +189 +189 +185 +185 +185 +185 +185 +183 +183 +183 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +130 +126 +125 +119 +120 +115 +116 +116 +110 +109 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +81 +76 +76 +72 +72 +69 +68 +69 +64 +64 +58 +58 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +14 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +40 +41 +43 +43 +47 +47 +47 +50 +51 +55 +55 +55 +59 +59 +64 +65 +64 +69 +68 +72 +72 +72 +76 +77 +82 +83 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +115 +115 +119 +120 +126 +126 +125 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +178 +179 +183 +183 +182 +184 +185 +188 +189 +189 +191 +191 +195 +195 +194 +196 +196 +198 +198 +198 +200 +201 +200 +200 +201 +202 +203 +205 +204 +204 +204 +204 +206 +206 +206 +207 +206 +207 +207 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +201 +200 +201 +199 +198 +198 +196 +196 +196 +196 +196 +195 +194 +191 +191 +191 +189 +189 +184 +185 +184 +183 +183 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +126 +125 +120 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +87 +86 +86 +83 +82 +76 +77 +76 +72 +72 +68 +69 +68 +64 +64 +58 +59 +58 +55 +54 +50 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +12 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +55 +59 +58 +64 +65 +68 +69 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +105 +106 +110 +110 +116 +116 +119 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +179 +179 +178 +182 +183 +184 +184 +185 +189 +189 +191 +190 +191 +195 +195 +197 +196 +198 +198 +199 +200 +200 +200 +201 +200 +203 +202 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +204 +205 +204 +205 +202 +202 +200 +200 +200 +201 +201 +198 +198 +197 +196 +197 +195 +195 +190 +191 +191 +189 +188 +185 +185 +184 +183 +183 +179 +179 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +140 +133 +133 +133 +130 +129 +125 +125 +125 +119 +119 +116 +116 +109 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +58 +58 +55 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +14 +13 +12 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +51 +51 +51 +55 +55 +58 +58 +59 +65 +64 +69 +69 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +116 +120 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +176 +175 +174 +179 +179 +183 +183 +183 +185 +185 +188 +188 +190 +191 +190 +195 +194 +196 +197 +197 +198 +198 +198 +198 +198 +200 +200 +200 +201 +200 +202 +203 +204 +205 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +207 +206 +206 +206 +206 +204 +205 +205 +205 +205 +202 +202 +203 +201 +201 +200 +200 +198 +199 +198 +196 +196 +194 +194 +194 +190 +190 +189 +188 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +126 +125 +125 +120 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +89 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +65 +64 +58 +59 +54 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +35 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +54 +55 +59 +59 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +116 +119 +119 +120 +126 +125 +130 +129 +134 +134 +134 +139 +139 +143 +144 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +182 +183 +184 +184 +184 +184 +185 +188 +189 +191 +190 +191 +194 +194 +196 +196 +197 +198 +198 +200 +201 +200 +200 +200 +203 +202 +204 +204 +204 +205 +205 +204 +205 +204 +206 +206 +206 +207 +207 +207 +206 +206 +206 +207 +206 +207 +207 +207 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +198 +199 +196 +196 +197 +194 +194 +191 +191 +188 +188 +189 +185 +184 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +130 +130 +125 +125 +119 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +69 +69 +68 +64 +64 +59 +58 +59 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +73 +73 +72 +73 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +120 +120 +126 +125 +125 +129 +129 +133 +134 +134 +140 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +168 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +188 +188 +190 +190 +190 +195 +194 +196 +196 +196 +198 +198 +198 +199 +198 +201 +201 +200 +200 +201 +202 +203 +204 +204 +204 +204 +205 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +198 +196 +197 +197 +194 +195 +190 +190 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +120 +119 +116 +116 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +69 +68 +64 +64 +58 +58 +59 +55 +55 +55 +54 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +18 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +20 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +55 +59 +58 +64 +65 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +116 +120 +119 +125 +125 +126 +129 +129 +133 +133 +139 +140 +140 +143 +144 +147 +147 +147 +151 +151 +157 +157 +157 +160 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +185 +185 +189 +189 +188 +190 +190 +191 +191 +191 +194 +194 +196 +196 +197 +199 +199 +201 +200 +200 +200 +201 +203 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +207 +207 +207 +206 +207 +207 +207 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +200 +198 +198 +198 +196 +196 +195 +195 +194 +191 +190 +188 +188 +188 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +164 +160 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +134 +129 +129 +126 +125 +126 +120 +120 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +87 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +64 +58 +58 +55 +55 +55 +50 +50 +47 +47 +45 +43 +43 +41 +40 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +17 +15 +15 +15 +16 +13 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +50 +50 +54 +55 +54 +59 +59 +64 +64 +64 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +120 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +160 +165 +165 +166 +169 +169 +173 +173 +174 +175 +174 +179 +178 +183 +183 +183 +185 +184 +185 +185 +185 +188 +189 +190 +191 +191 +195 +194 +196 +197 +198 +199 +199 +200 +201 +200 +200 +200 +202 +202 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +201 +200 +200 +200 +200 +199 +199 +198 +197 +196 +195 +195 +194 +191 +191 +189 +189 +185 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +77 +76 +77 +76 +76 +73 +72 +68 +69 +68 +65 +64 +58 +59 +59 +54 +54 +51 +50 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +20 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +36 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +51 +54 +54 +59 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +119 +120 +120 +125 +126 +125 +126 +126 +129 +130 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +164 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +185 +185 +185 +189 +188 +191 +191 +190 +195 +194 +196 +196 +196 +199 +198 +201 +200 +200 +200 +201 +202 +203 +203 +205 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +202 +201 +201 +201 +200 +198 +199 +198 +196 +196 +195 +194 +194 +191 +190 +189 +188 +188 +184 +185 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +158 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +134 +134 +129 +129 +130 +125 +125 +119 +120 +116 +116 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +65 +59 +59 +55 +55 +54 +51 +51 +51 +51 +51 +47 +47 +43 +43 +43 +40 +40 +37 +36 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +12 +12 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +54 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +85 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +120 +126 +125 +126 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +174 +175 +178 +179 +178 +182 +183 +184 +185 +184 +189 +188 +190 +191 +190 +194 +195 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +205 +206 +207 +206 +206 +203 +204 +204 +205 +204 +202 +202 +200 +200 +200 +201 +200 +198 +198 +198 +197 +196 +194 +194 +194 +191 +191 +189 +188 +188 +184 +184 +183 +182 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +125 +120 +119 +120 +120 +119 +116 +116 +109 +109 +109 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +73 +68 +69 +64 +64 +65 +59 +59 +55 +55 +55 +50 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +59 +59 +64 +65 +68 +69 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +109 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +133 +134 +133 +139 +139 +143 +143 +144 +147 +148 +151 +151 +154 +157 +156 +161 +161 +164 +165 +165 +169 +169 +173 +173 +172 +175 +175 +178 +179 +178 +183 +183 +184 +185 +185 +189 +189 +191 +191 +193 +194 +195 +196 +196 +198 +198 +198 +201 +200 +201 +200 +201 +202 +203 +205 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +201 +201 +198 +198 +199 +196 +196 +194 +195 +191 +190 +190 +188 +188 +188 +189 +188 +185 +184 +185 +184 +185 +181 +182 +179 +179 +179 +175 +175 +173 +173 +174 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +127 +126 +125 +119 +120 +115 +116 +115 +110 +109 +106 +106 +105 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +65 +58 +58 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +38 +41 +41 +43 +42 +47 +47 +46 +51 +50 +55 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +129 +133 +134 +134 +139 +139 +143 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +172 +175 +175 +178 +179 +178 +182 +182 +184 +184 +185 +189 +189 +190 +191 +190 +195 +194 +197 +197 +196 +198 +199 +201 +200 +200 +201 +200 +202 +203 +204 +204 +204 +205 +205 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +204 +204 +205 +205 +205 +202 +202 +201 +200 +200 +201 +200 +198 +198 +198 +196 +196 +195 +195 +195 +191 +190 +189 +189 +189 +185 +185 +183 +182 +183 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +160 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +129 +129 +129 +125 +125 +126 +125 +126 +119 +120 +119 +119 +120 +115 +115 +110 +110 +110 +106 +105 +100 +100 +98 +96 +96 +90 +91 +86 +86 +86 +82 +82 +76 +76 +77 +73 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +50 +51 +51 +54 +55 +58 +59 +61 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +116 +120 +119 +119 +125 +125 +129 +129 +130 +134 +134 +139 +139 +140 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +189 +188 +188 +190 +191 +194 +194 +197 +196 +196 +199 +198 +200 +201 +200 +201 +200 +202 +202 +202 +205 +205 +204 +204 +204 +206 +207 +206 +206 +206 +206 +207 +206 +207 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +200 +198 +199 +196 +196 +197 +194 +194 +191 +191 +189 +188 +188 +184 +185 +184 +185 +184 +183 +182 +179 +178 +179 +175 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +140 +139 +139 +139 +134 +133 +129 +129 +129 +126 +125 +120 +120 +120 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +89 +86 +86 +87 +82 +82 +76 +76 +77 +72 +72 +68 +68 +67 +64 +64 +58 +58 +55 +54 +55 +50 +51 +47 +46 +47 +43 +43 +40 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +48 +51 +51 +54 +55 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +119 +125 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +189 +188 +191 +190 +190 +195 +195 +196 +196 +196 +199 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +205 +204 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +201 +199 +198 +197 +196 +195 +195 +195 +191 +190 +188 +189 +188 +184 +184 +184 +185 +185 +183 +183 +178 +179 +178 +175 +175 +172 +173 +171 +169 +169 +165 +165 +160 +161 +161 +157 +157 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +130 +129 +130 +126 +126 +119 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +91 +86 +85 +82 +82 +77 +76 +77 +72 +72 +68 +68 +68 +65 +64 +58 +59 +59 +55 +55 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +54 +54 +54 +59 +59 +64 +64 +65 +68 +68 +72 +72 +74 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +144 +144 +143 +143 +147 +147 +151 +152 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +182 +183 +185 +185 +185 +188 +188 +191 +190 +191 +195 +194 +196 +197 +197 +199 +199 +200 +201 +201 +201 +201 +202 +202 +204 +205 +204 +204 +204 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +204 +204 +204 +204 +204 +203 +203 +201 +201 +200 +200 +200 +200 +201 +200 +198 +198 +196 +196 +197 +194 +194 +191 +191 +191 +188 +189 +184 +184 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +162 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +120 +119 +116 +116 +115 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +59 +55 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +53 +54 +54 +59 +58 +65 +64 +64 +69 +68 +72 +72 +73 +76 +76 +82 +82 +82 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +116 +116 +116 +119 +119 +125 +126 +125 +130 +129 +133 +133 +133 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +189 +188 +189 +191 +190 +190 +190 +190 +194 +194 +196 +196 +196 +198 +198 +201 +200 +200 +201 +201 +202 +202 +203 +204 +205 +204 +204 +207 +207 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +205 +204 +205 +204 +205 +203 +203 +200 +200 +200 +200 +201 +198 +198 +197 +197 +196 +194 +194 +195 +195 +194 +190 +190 +189 +189 +189 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +120 +120 +115 +115 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +73 +68 +69 +64 +64 +64 +58 +59 +55 +55 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +20 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +55 +58 +58 +64 +65 +65 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +109 +109 +116 +116 +116 +120 +120 +125 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +174 +175 +179 +179 +178 +182 +183 +185 +184 +185 +188 +188 +191 +191 +191 +195 +195 +196 +197 +196 +198 +199 +201 +201 +200 +201 +200 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +207 +204 +204 +204 +205 +205 +202 +202 +200 +200 +201 +201 +201 +201 +201 +200 +199 +198 +196 +196 +197 +195 +195 +191 +190 +189 +189 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +126 +120 +120 +120 +116 +115 +109 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +50 +50 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +30 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +58 +59 +58 +64 +64 +68 +68 +69 +73 +72 +76 +76 +77 +82 +83 +86 +86 +87 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +116 +116 +120 +120 +120 +125 +125 +125 +125 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +179 +182 +183 +184 +184 +185 +189 +188 +190 +191 +194 +194 +195 +197 +196 +198 +199 +198 +200 +201 +201 +200 +201 +203 +202 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +205 +205 +204 +204 +204 +204 +203 +202 +203 +200 +200 +200 +201 +199 +198 +199 +197 +197 +194 +195 +195 +191 +191 +188 +189 +188 +184 +184 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +69 +68 +65 +64 +64 +58 +58 +54 +54 +55 +50 +50 +46 +46 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +42 +46 +47 +51 +50 +51 +55 +54 +58 +58 +58 +64 +64 +68 +69 +69 +72 +73 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +115 +115 +119 +119 +119 +126 +126 +130 +129 +129 +134 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +175 +178 +178 +182 +182 +185 +184 +185 +189 +188 +190 +191 +191 +194 +195 +196 +197 +197 +198 +199 +201 +201 +201 +200 +200 +202 +202 +203 +205 +204 +205 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +204 +204 +205 +204 +203 +202 +203 +201 +200 +200 +201 +200 +199 +199 +196 +196 +197 +194 +194 +191 +191 +190 +188 +188 +184 +184 +185 +183 +183 +178 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +130 +130 +125 +126 +120 +120 +120 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +69 +64 +65 +58 +59 +58 +54 +55 +51 +50 +51 +47 +47 +43 +43 +44 +41 +40 +37 +37 +32 +32 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +16 +16 +13 +13 +12 +12 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +18 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +77 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +105 +110 +110 +115 +115 +115 +119 +120 +126 +125 +130 +129 +130 +133 +133 +140 +140 +140 +144 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +174 +174 +175 +175 +179 +179 +183 +183 +183 +185 +184 +185 +185 +184 +188 +189 +190 +191 +190 +195 +194 +196 +197 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +205 +204 +204 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +200 +200 +198 +199 +197 +197 +196 +194 +195 +191 +191 +189 +189 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +125 +125 +119 +120 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +28 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +54 +54 +54 +59 +59 +65 +65 +64 +69 +69 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +116 +119 +119 +119 +119 +119 +125 +126 +129 +129 +129 +134 +133 +140 +139 +140 +143 +143 +148 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +174 +178 +178 +180 +183 +183 +184 +185 +188 +188 +189 +191 +191 +195 +194 +194 +196 +196 +197 +196 +197 +198 +199 +200 +201 +201 +200 +200 +202 +203 +205 +205 +204 +204 +205 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +207 +207 +207 +206 +205 +204 +205 +205 +205 +203 +202 +200 +200 +201 +200 +200 +198 +199 +198 +196 +197 +195 +194 +194 +191 +190 +189 +188 +189 +184 +185 +182 +182 +182 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +125 +125 +120 +119 +115 +116 +116 +110 +109 +106 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +65 +64 +59 +59 +59 +58 +59 +55 +55 +50 +50 +51 +47 +47 +43 +42 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +22 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +12 +15 +16 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +55 +59 +59 +58 +64 +64 +69 +69 +69 +73 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +120 +125 +126 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +179 +179 +182 +183 +185 +185 +184 +188 +189 +189 +188 +189 +190 +191 +194 +194 +194 +197 +196 +199 +198 +200 +201 +201 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +199 +197 +197 +197 +195 +194 +190 +190 +190 +189 +189 +184 +185 +182 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +120 +120 +116 +116 +110 +110 +110 +106 +105 +100 +100 +101 +96 +96 +90 +90 +86 +87 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +69 +69 +64 +65 +64 +58 +59 +55 +55 +54 +50 +51 +47 +47 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +46 +47 +51 +51 +51 +54 +55 +58 +59 +59 +64 +64 +69 +68 +72 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +100 +106 +105 +110 +110 +110 +116 +116 +119 +120 +125 +126 +126 +129 +129 +133 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +179 +182 +183 +184 +185 +185 +188 +189 +190 +190 +194 +195 +195 +197 +196 +198 +198 +198 +201 +201 +200 +200 +201 +202 +202 +205 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +201 +201 +201 +200 +198 +198 +198 +197 +197 +195 +195 +191 +191 +190 +189 +188 +184 +184 +184 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +143 +139 +139 +133 +133 +134 +130 +129 +126 +125 +126 +119 +119 +116 +116 +116 +110 +109 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +64 +64 +59 +59 +55 +54 +55 +51 +51 +47 +46 +47 +43 +43 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +34 +37 +36 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +55 +54 +55 +58 +58 +65 +64 +65 +68 +68 +72 +73 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +116 +119 +120 +119 +119 +119 +125 +126 +129 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +160 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +180 +183 +183 +185 +184 +188 +189 +188 +191 +190 +194 +195 +195 +196 +197 +198 +198 +198 +200 +200 +200 +201 +201 +203 +203 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +205 +205 +204 +204 +204 +202 +203 +200 +200 +200 +200 +200 +199 +198 +196 +196 +196 +195 +195 +191 +190 +190 +189 +189 +185 +185 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +148 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +119 +120 +119 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +77 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +55 +54 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +14 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +42 +43 +47 +47 +51 +50 +50 +54 +54 +58 +59 +59 +65 +64 +67 +68 +68 +72 +72 +77 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +126 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +178 +183 +182 +184 +184 +185 +188 +188 +191 +190 +190 +194 +194 +197 +196 +197 +198 +199 +200 +200 +200 +200 +200 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +201 +199 +198 +198 +196 +196 +195 +194 +194 +190 +191 +189 +189 +189 +185 +185 +182 +183 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +140 +139 +133 +133 +133 +129 +130 +126 +125 +126 +120 +119 +120 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +72 +72 +73 +68 +68 +64 +65 +64 +58 +58 +55 +55 +52 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +26 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +17 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +47 +47 +50 +50 +51 +54 +54 +59 +59 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +129 +129 +130 +134 +134 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +185 +185 +189 +189 +190 +190 +191 +195 +194 +196 +196 +196 +198 +199 +200 +200 +201 +200 +200 +202 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +204 +205 +204 +204 +205 +203 +202 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +194 +195 +195 +191 +191 +188 +189 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +129 +129 +126 +126 +123 +120 +119 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +77 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +54 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +15 +16 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +46 +47 +51 +50 +51 +55 +54 +59 +58 +59 +65 +64 +64 +64 +64 +69 +69 +72 +72 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +106 +110 +110 +110 +109 +110 +116 +115 +120 +119 +119 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +178 +179 +183 +183 +185 +184 +184 +189 +188 +190 +191 +191 +194 +194 +197 +196 +197 +198 +198 +201 +200 +201 +201 +201 +203 +202 +204 +204 +205 +205 +205 +206 +206 +207 +207 +206 +206 +207 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +203 +202 +203 +201 +200 +200 +200 +200 +198 +199 +197 +196 +196 +194 +194 +191 +190 +191 +188 +189 +184 +185 +185 +183 +183 +178 +178 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +148 +148 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +126 +125 +120 +119 +119 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +24 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +55 +59 +58 +61 +65 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +183 +185 +185 +189 +188 +189 +190 +191 +194 +195 +196 +196 +196 +198 +199 +200 +201 +200 +200 +200 +200 +201 +200 +201 +203 +205 +204 +204 +205 +205 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +203 +200 +201 +200 +200 +201 +198 +198 +199 +196 +196 +194 +195 +190 +190 +190 +188 +188 +184 +184 +185 +183 +183 +183 +182 +183 +178 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +140 +133 +133 +134 +129 +129 +125 +125 +120 +120 +120 +115 +115 +110 +109 +110 +106 +105 +100 +100 +100 +96 +95 +90 +90 +90 +86 +87 +82 +83 +83 +76 +76 +72 +72 +69 +68 +68 +65 +64 +58 +58 +59 +54 +55 +50 +50 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +28 +25 +25 +21 +21 +21 +21 +21 +20 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +51 +51 +50 +54 +54 +58 +59 +59 +65 +64 +64 +65 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +119 +125 +125 +126 +129 +130 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +185 +184 +188 +189 +188 +191 +190 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +204 +205 +204 +204 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +196 +194 +195 +195 +195 +194 +191 +190 +189 +188 +188 +185 +184 +183 +182 +181 +178 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +133 +133 +129 +130 +129 +125 +126 +119 +119 +119 +115 +116 +109 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +87 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +65 +59 +58 +58 +55 +54 +50 +51 +51 +47 +46 +42 +43 +42 +42 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +51 +50 +54 +55 +54 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +119 +119 +119 +125 +125 +129 +129 +130 +134 +134 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +174 +175 +175 +178 +179 +182 +182 +183 +185 +185 +189 +189 +188 +190 +191 +194 +194 +195 +197 +197 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +207 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +207 +204 +204 +205 +204 +205 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +196 +196 +194 +195 +191 +191 +189 +188 +188 +184 +185 +182 +182 +183 +178 +178 +174 +175 +174 +172 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +115 +116 +110 +110 +105 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +54 +51 +51 +51 +47 +48 +42 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +18 +16 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +32 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +53 +54 +55 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +101 +100 +105 +106 +106 +110 +109 +116 +115 +116 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +140 +140 +144 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +172 +175 +175 +179 +179 +179 +183 +183 +184 +185 +185 +189 +189 +191 +190 +195 +195 +195 +197 +197 +198 +198 +199 +200 +200 +200 +200 +200 +203 +202 +204 +204 +204 +204 +205 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +204 +205 +202 +202 +202 +201 +200 +200 +200 +201 +198 +198 +196 +197 +194 +194 +194 +191 +190 +188 +188 +188 +184 +185 +185 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +172 +170 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +120 +120 +116 +115 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +73 +69 +68 +68 +64 +64 +59 +58 +59 +54 +54 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +26 +27 +31 +31 +31 +33 +33 +37 +36 +39 +41 +40 +43 +43 +46 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +125 +125 +126 +129 +129 +133 +133 +138 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +183 +182 +182 +185 +185 +184 +184 +185 +189 +188 +191 +191 +190 +194 +194 +196 +197 +196 +198 +199 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +207 +207 +204 +205 +204 +204 +202 +203 +202 +200 +200 +200 +200 +200 +199 +198 +199 +198 +198 +196 +196 +194 +194 +195 +190 +191 +189 +188 +186 +185 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +156 +157 +157 +151 +151 +147 +147 +144 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +116 +116 +109 +109 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +55 +55 +55 +51 +51 +47 +46 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +28 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +51 +51 +51 +55 +54 +59 +59 +64 +65 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +109 +115 +116 +116 +120 +120 +125 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +185 +189 +189 +191 +191 +191 +194 +195 +197 +197 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +202 +202 +200 +201 +201 +201 +200 +198 +199 +196 +197 +195 +194 +195 +191 +190 +188 +189 +189 +185 +185 +183 +183 +182 +179 +179 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +120 +120 +119 +115 +116 +110 +109 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +83 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +55 +55 +54 +51 +50 +47 +47 +46 +43 +43 +41 +40 +41 +37 +36 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +22 +25 +25 +26 +28 +27 +31 +31 +31 +34 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +54 +55 +55 +59 +59 +65 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +105 +106 +109 +110 +115 +116 +116 +119 +119 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +184 +184 +184 +188 +189 +191 +191 +195 +194 +195 +196 +196 +198 +199 +198 +200 +201 +201 +200 +200 +200 +200 +202 +202 +202 +205 +205 +204 +204 +205 +206 +205 +206 +206 +207 +206 +207 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +205 +203 +203 +200 +200 +200 +201 +201 +198 +198 +197 +196 +197 +195 +195 +190 +190 +191 +189 +188 +185 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +126 +120 +119 +119 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +97 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +77 +72 +72 +69 +68 +68 +65 +65 +58 +58 +59 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +38 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +115 +120 +120 +126 +125 +125 +129 +130 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +174 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +189 +189 +191 +190 +194 +195 +194 +196 +196 +198 +199 +198 +201 +200 +201 +201 +201 +203 +203 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +204 +204 +205 +204 +205 +203 +202 +201 +200 +200 +200 +200 +198 +198 +198 +197 +196 +195 +194 +194 +190 +191 +189 +188 +189 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +168 +169 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +144 +139 +139 +134 +133 +133 +129 +129 +126 +125 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +54 +54 +54 +51 +50 +47 +46 +48 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +16 +15 +15 +15 +14 +13 +12 +12 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +55 +58 +59 +64 +64 +64 +68 +68 +73 +72 +77 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +126 +130 +129 +129 +133 +133 +139 +139 +139 +143 +144 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +168 +169 +173 +173 +174 +175 +175 +179 +179 +182 +183 +182 +184 +185 +185 +184 +185 +189 +189 +191 +191 +191 +195 +194 +196 +197 +197 +198 +199 +200 +200 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +205 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +204 +203 +202 +203 +200 +200 +200 +201 +200 +199 +197 +197 +196 +197 +195 +194 +191 +191 +188 +188 +189 +184 +184 +183 +182 +183 +178 +179 +175 +175 +175 +172 +172 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +73 +72 +68 +68 +69 +64 +64 +59 +59 +59 +55 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +42 +47 +47 +47 +51 +50 +54 +54 +58 +58 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +110 +110 +110 +115 +116 +120 +120 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +178 +179 +183 +182 +182 +185 +185 +189 +189 +189 +191 +191 +194 +194 +196 +196 +196 +199 +198 +200 +200 +201 +200 +201 +201 +201 +201 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +203 +203 +201 +201 +201 +200 +200 +198 +198 +196 +196 +197 +194 +194 +190 +190 +190 +189 +189 +185 +185 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +134 +129 +129 +126 +125 +126 +119 +120 +116 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +74 +68 +68 +64 +64 +59 +59 +58 +54 +54 +50 +51 +51 +47 +46 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +14 +15 +13 +13 +12 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +43 +43 +42 +47 +46 +51 +51 +51 +54 +55 +54 +54 +55 +58 +58 +65 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +105 +110 +110 +115 +116 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +162 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +179 +179 +183 +182 +185 +185 +185 +189 +189 +189 +188 +188 +190 +190 +194 +195 +195 +196 +197 +199 +199 +200 +200 +201 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +203 +202 +202 +200 +200 +200 +201 +200 +198 +199 +197 +197 +196 +194 +195 +191 +191 +191 +189 +189 +184 +184 +182 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +126 +125 +120 +119 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +69 +68 +64 +64 +64 +59 +58 +54 +55 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +20 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +55 +59 +58 +64 +64 +69 +68 +69 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +120 +119 +120 +126 +125 +129 +130 +129 +134 +134 +133 +134 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +172 +173 +175 +175 +175 +175 +174 +179 +179 +183 +183 +182 +185 +185 +189 +188 +189 +190 +191 +195 +194 +196 +196 +197 +198 +198 +201 +201 +200 +201 +200 +203 +202 +203 +204 +204 +204 +204 +205 +206 +207 +206 +207 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +205 +205 +204 +205 +204 +202 +203 +203 +200 +200 +201 +201 +200 +198 +198 +197 +196 +195 +195 +194 +191 +190 +189 +189 +188 +185 +185 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +129 +125 +125 +119 +120 +120 +115 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +68 +69 +64 +65 +59 +59 +59 +55 +55 +51 +51 +50 +47 +46 +47 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +31 +31 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +42 +47 +46 +51 +51 +50 +54 +55 +58 +58 +59 +64 +65 +68 +68 +68 +72 +72 +77 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +101 +100 +100 +106 +106 +110 +110 +110 +116 +115 +115 +116 +116 +119 +119 +125 +125 +125 +129 +130 +134 +133 +132 +139 +139 +143 +144 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +184 +184 +184 +189 +188 +190 +191 +191 +195 +195 +197 +197 +197 +198 +199 +201 +201 +201 +201 +201 +203 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +205 +204 +204 +202 +202 +201 +201 +200 +201 +200 +198 +198 +198 +197 +196 +194 +194 +195 +190 +190 +189 +188 +188 +185 +185 +183 +182 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +116 +115 +109 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +69 +64 +64 +64 +64 +64 +58 +58 +55 +54 +54 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +47 +51 +51 +54 +55 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +117 +120 +120 +125 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +152 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +185 +184 +189 +189 +191 +191 +190 +194 +194 +196 +197 +198 +198 +198 +200 +200 +200 +200 +200 +203 +203 +205 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +203 +204 +202 +202 +200 +201 +200 +200 +201 +199 +198 +198 +196 +197 +194 +195 +194 +190 +191 +189 +188 +184 +185 +185 +183 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +148 +147 +143 +143 +143 +140 +139 +134 +133 +133 +129 +129 +129 +129 +130 +125 +125 +119 +120 +119 +115 +115 +110 +110 +108 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +83 +83 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +61 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +28 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +46 +47 +50 +50 +51 +54 +55 +58 +59 +65 +65 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +102 +106 +105 +110 +110 +115 +116 +116 +120 +120 +125 +125 +126 +129 +129 +129 +129 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +176 +174 +175 +179 +179 +183 +183 +183 +185 +185 +189 +188 +190 +190 +190 +195 +194 +196 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +204 +204 +204 +205 +203 +202 +202 +201 +200 +200 +201 +201 +198 +199 +196 +197 +195 +194 +195 +191 +190 +188 +189 +189 +185 +184 +183 +182 +183 +178 +179 +175 +175 +174 +172 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +125 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +54 +50 +50 +47 +47 +46 +43 +42 +41 +41 +41 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +26 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +38 +40 +41 +43 +43 +47 +47 +46 +50 +50 +54 +55 +54 +58 +58 +59 +59 +59 +65 +64 +68 +68 +68 +72 +72 +77 +77 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +105 +106 +106 +110 +110 +116 +115 +116 +119 +120 +125 +126 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +176 +175 +175 +179 +178 +183 +183 +183 +185 +185 +189 +189 +188 +191 +191 +195 +194 +194 +196 +196 +198 +198 +198 +201 +200 +201 +200 +203 +203 +203 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +205 +205 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +199 +198 +196 +197 +194 +195 +195 +190 +191 +189 +188 +189 +185 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +134 +133 +130 +129 +129 +126 +125 +126 +126 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +87 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +58 +55 +54 +51 +50 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +12 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +24 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +42 +47 +46 +46 +50 +50 +54 +54 +56 +58 +58 +65 +65 +68 +69 +69 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +109 +115 +116 +116 +120 +121 +126 +126 +125 +129 +130 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +183 +182 +184 +185 +185 +189 +189 +191 +191 +195 +194 +195 +197 +196 +198 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +205 +204 +205 +205 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +201 +201 +201 +200 +201 +198 +199 +200 +196 +196 +195 +195 +191 +190 +190 +188 +189 +185 +185 +185 +183 +183 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +144 +144 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +119 +119 +116 +115 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +65 +59 +59 +59 +55 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +20 +19 +19 +22 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +50 +50 +54 +54 +59 +58 +59 +64 +64 +64 +64 +64 +69 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +111 +115 +115 +116 +120 +120 +125 +126 +126 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +160 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +182 +182 +183 +185 +184 +188 +188 +188 +191 +190 +195 +194 +194 +196 +196 +199 +199 +198 +200 +200 +201 +200 +201 +202 +203 +204 +204 +205 +204 +204 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +204 +204 +205 +205 +205 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +196 +197 +195 +195 +191 +190 +190 +188 +189 +185 +184 +185 +182 +183 +179 +179 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +130 +125 +125 +126 +119 +119 +116 +116 +116 +110 +110 +106 +106 +105 +100 +100 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +65 +58 +58 +58 +54 +55 +51 +50 +51 +47 +47 +43 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +18 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +51 +51 +51 +50 +54 +55 +58 +58 +59 +65 +65 +68 +68 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +125 +125 +126 +130 +129 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +182 +184 +184 +188 +189 +188 +190 +191 +194 +195 +194 +196 +196 +199 +199 +201 +200 +200 +201 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +205 +204 +204 +205 +204 +203 +202 +202 +200 +201 +201 +200 +200 +199 +199 +196 +196 +197 +194 +194 +190 +191 +189 +189 +189 +184 +184 +182 +182 +183 +178 +178 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +116 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +72 +68 +69 +64 +65 +64 +58 +59 +55 +54 +51 +51 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +38 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +40 +41 +40 +43 +43 +47 +47 +49 +50 +50 +55 +55 +58 +59 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +97 +99 +100 +100 +106 +106 +110 +109 +110 +116 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +172 +174 +175 +178 +179 +179 +183 +182 +185 +185 +185 +184 +185 +189 +188 +190 +190 +190 +195 +195 +196 +196 +196 +198 +198 +200 +200 +200 +201 +201 +202 +202 +203 +205 +204 +204 +204 +207 +207 +207 +207 +206 +206 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +204 +204 +204 +204 +205 +203 +203 +200 +201 +200 +200 +200 +198 +199 +196 +196 +196 +194 +194 +195 +195 +194 +190 +191 +188 +188 +189 +185 +185 +182 +183 +181 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +134 +134 +129 +129 +125 +125 +126 +119 +119 +116 +116 +115 +109 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +54 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +40 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +22 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +15 +16 +15 +17 +17 +17 +17 +17 +18 +19 +21 +21 +21 +24 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +55 +55 +59 +59 +59 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +109 +115 +115 +120 +119 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +178 +179 +182 +182 +185 +185 +184 +189 +188 +190 +190 +190 +194 +195 +196 +196 +196 +199 +199 +200 +201 +201 +201 +200 +202 +202 +204 +204 +205 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +201 +200 +201 +200 +200 +198 +198 +198 +197 +196 +194 +194 +191 +190 +191 +188 +188 +185 +184 +185 +182 +183 +183 +183 +182 +178 +178 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +115 +115 +110 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +69 +69 +64 +64 +59 +59 +58 +54 +55 +51 +50 +51 +47 +46 +47 +47 +46 +43 +43 +40 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +54 +54 +59 +58 +58 +64 +64 +68 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +87 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +130 +130 +133 +134 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +182 +182 +185 +185 +188 +189 +189 +191 +190 +195 +195 +195 +196 +197 +198 +198 +198 +200 +201 +200 +200 +201 +202 +203 +205 +204 +205 +204 +205 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +198 +198 +196 +197 +195 +194 +195 +190 +191 +189 +188 +189 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +95 +96 +96 +91 +90 +86 +86 +83 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +59 +55 +55 +51 +51 +51 +47 +47 +43 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +46 +46 +47 +50 +51 +54 +55 +55 +59 +58 +64 +64 +69 +69 +69 +72 +72 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +120 +119 +119 +125 +125 +129 +130 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +178 +179 +179 +182 +183 +184 +184 +185 +188 +189 +190 +191 +192 +194 +195 +197 +196 +198 +198 +199 +200 +199 +200 +200 +200 +202 +202 +203 +203 +203 +205 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +205 +204 +204 +204 +205 +203 +202 +202 +201 +200 +200 +201 +201 +198 +199 +197 +197 +195 +195 +195 +191 +190 +189 +188 +189 +185 +184 +182 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +152 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +130 +129 +125 +125 +120 +120 +120 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +69 +64 +64 +59 +58 +54 +54 +55 +51 +50 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +50 +51 +51 +54 +55 +59 +59 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +95 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +189 +189 +188 +191 +191 +194 +194 +194 +196 +196 +196 +196 +196 +198 +198 +201 +200 +201 +201 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +203 +200 +200 +201 +200 +201 +198 +198 +199 +196 +197 +195 +195 +194 +190 +190 +189 +188 +188 +185 +185 +182 +183 +182 +178 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +129 +129 +126 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +73 +72 +72 +68 +68 +68 +69 +68 +64 +64 +58 +59 +58 +54 +54 +50 +51 +51 +47 +47 +43 +42 +43 +41 +40 +37 +37 +32 +33 +32 +31 +30 +27 +27 +27 +25 +25 +25 +24 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +38 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +54 +54 +58 +59 +59 +65 +64 +68 +69 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +115 +115 +119 +119 +120 +126 +125 +129 +130 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +174 +179 +178 +182 +183 +182 +184 +184 +185 +184 +185 +188 +188 +190 +191 +190 +194 +195 +196 +196 +198 +198 +199 +201 +200 +200 +200 +200 +202 +203 +204 +205 +204 +204 +204 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +204 +205 +204 +204 +204 +203 +202 +201 +201 +200 +200 +200 +198 +199 +198 +196 +197 +195 +194 +195 +190 +191 +189 +189 +185 +185 +184 +183 +183 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +116 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +87 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +67 +64 +64 +58 +59 +55 +55 +55 +50 +50 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +55 +55 +55 +59 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +109 +109 +116 +116 +116 +120 +120 +120 +120 +119 +126 +125 +129 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +180 +183 +183 +185 +184 +188 +188 +188 +190 +191 +195 +194 +194 +196 +197 +199 +198 +199 +200 +201 +200 +201 +201 +203 +203 +204 +204 +204 +204 +205 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +200 +201 +199 +199 +196 +196 +196 +195 +195 +191 +191 +190 +189 +189 +185 +185 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +59 +59 +59 +54 +54 +51 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +42 +41 +41 +43 +43 +46 +47 +46 +51 +50 +51 +51 +50 +54 +54 +58 +59 +59 +65 +64 +69 +68 +68 +73 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +118 +120 +119 +125 +125 +130 +129 +130 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +184 +184 +188 +188 +190 +191 +191 +195 +195 +196 +197 +198 +198 +198 +200 +200 +200 +200 +201 +203 +202 +204 +204 +204 +204 +204 +207 +207 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +194 +194 +191 +190 +188 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +89 +90 +86 +86 +82 +82 +82 +76 +77 +76 +76 +76 +72 +72 +68 +69 +69 +64 +64 +58 +58 +55 +54 +54 +51 +50 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +22 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +54 +58 +58 +64 +65 +69 +69 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +116 +116 +120 +119 +125 +125 +125 +129 +130 +130 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +175 +179 +178 +183 +183 +183 +185 +185 +189 +188 +190 +191 +191 +194 +194 +196 +196 +197 +199 +199 +198 +198 +198 +200 +200 +200 +200 +200 +202 +203 +204 +205 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +205 +205 +204 +202 +202 +200 +201 +201 +200 +201 +199 +198 +197 +197 +197 +194 +195 +190 +191 +190 +189 +189 +185 +185 +184 +182 +183 +179 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +160 +161 +161 +158 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +122 +119 +120 +116 +116 +109 +109 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +55 +55 +50 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +32 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +14 +13 +12 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +40 +43 +43 +47 +47 +46 +50 +51 +54 +55 +55 +59 +58 +58 +59 +58 +64 +65 +68 +68 +68 +72 +72 +76 +77 +79 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +105 +105 +106 +110 +110 +116 +115 +115 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +166 +169 +169 +173 +172 +174 +175 +175 +179 +179 +183 +182 +182 +184 +184 +188 +189 +188 +190 +190 +195 +195 +195 +196 +196 +198 +198 +199 +200 +200 +200 +200 +202 +203 +202 +204 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +199 +198 +196 +197 +195 +195 +194 +190 +190 +188 +189 +189 +184 +184 +182 +182 +178 +178 +179 +175 +175 +172 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +129 +125 +125 +125 +125 +126 +120 +119 +116 +116 +115 +110 +110 +105 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +67 +68 +64 +64 +64 +59 +58 +55 +54 +51 +51 +51 +47 +46 +43 +43 +42 +41 +41 +37 +36 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +20 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +46 +50 +50 +55 +54 +56 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +105 +106 +106 +110 +110 +115 +115 +115 +120 +119 +125 +125 +125 +129 +129 +133 +134 +133 +140 +140 +143 +143 +144 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +172 +175 +174 +179 +179 +179 +182 +183 +185 +184 +184 +189 +188 +190 +190 +195 +194 +194 +197 +196 +198 +198 +199 +200 +200 +200 +201 +201 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +207 +207 +206 +207 +207 +206 +206 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +201 +201 +200 +200 +200 +198 +198 +200 +197 +196 +195 +194 +191 +190 +191 +189 +188 +184 +185 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +168 +169 +165 +164 +165 +161 +161 +157 +157 +153 +151 +151 +147 +147 +143 +144 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +120 +117 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +65 +65 +59 +58 +54 +54 +54 +50 +50 +47 +47 +46 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +26 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +47 +47 +50 +50 +55 +54 +54 +58 +58 +65 +64 +64 +68 +68 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +87 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +119 +119 +119 +126 +125 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +174 +179 +179 +183 +182 +185 +185 +185 +189 +189 +190 +190 +191 +194 +194 +197 +196 +197 +198 +199 +200 +201 +201 +201 +200 +202 +203 +203 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +202 +202 +203 +201 +201 +200 +200 +198 +198 +198 +196 +197 +195 +194 +194 +191 +190 +189 +189 +188 +184 +185 +183 +183 +183 +179 +178 +175 +175 +175 +173 +172 +169 +169 +164 +165 +164 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +132 +129 +130 +126 +126 +120 +119 +119 +116 +116 +109 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +80 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +59 +54 +54 +50 +50 +51 +46 +47 +42 +43 +43 +41 +41 +37 +37 +33 +33 +32 +31 +30 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +20 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +54 +55 +54 +58 +59 +65 +64 +65 +68 +68 +72 +72 +74 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +120 +125 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +174 +179 +178 +182 +183 +182 +185 +185 +188 +189 +188 +190 +190 +195 +195 +195 +196 +197 +198 +198 +198 +200 +200 +200 +200 +203 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +203 +202 +200 +200 +200 +200 +200 +198 +198 +198 +198 +198 +196 +196 +194 +195 +194 +190 +190 +189 +189 +187 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +54 +55 +51 +50 +47 +47 +44 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +24 +25 +25 +21 +21 +19 +19 +19 +17 +16 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +58 +59 +64 +65 +64 +69 +69 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +89 +96 +96 +100 +100 +100 +106 +106 +110 +110 +112 +116 +116 +119 +120 +125 +126 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +185 +184 +189 +189 +190 +190 +190 +195 +194 +196 +197 +199 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +203 +202 +202 +201 +201 +200 +201 +201 +198 +198 +197 +197 +195 +194 +195 +191 +190 +188 +189 +189 +185 +185 +183 +183 +183 +179 +179 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +126 +126 +120 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +72 +72 +68 +69 +64 +64 +64 +58 +58 +55 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +22 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +50 +54 +54 +58 +58 +59 +65 +65 +68 +68 +68 +72 +72 +76 +77 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +120 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +185 +185 +185 +188 +188 +191 +191 +190 +194 +194 +197 +196 +197 +198 +199 +200 +200 +201 +201 +201 +202 +203 +203 +204 +205 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +205 +204 +203 +203 +203 +201 +200 +200 +200 +198 +198 +198 +197 +196 +195 +194 +195 +191 +191 +190 +191 +190 +189 +188 +184 +185 +184 +183 +183 +179 +178 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +143 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +120 +119 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +83 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +40 +41 +42 +43 +43 +47 +47 +50 +50 +50 +54 +55 +58 +58 +58 +64 +64 +68 +68 +69 +73 +72 +77 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +99 +105 +106 +109 +109 +110 +115 +116 +119 +119 +120 +126 +126 +129 +129 +133 +134 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +170 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +184 +188 +188 +191 +190 +191 +194 +194 +197 +196 +197 +198 +199 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +205 +205 +205 +204 +204 +202 +202 +202 +200 +201 +200 +201 +201 +198 +199 +199 +198 +199 +197 +196 +194 +195 +195 +191 +191 +188 +188 +185 +185 +185 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +125 +125 +120 +119 +116 +116 +115 +109 +110 +106 +106 +105 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +73 +73 +68 +68 +68 +64 +64 +58 +58 +58 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +16 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +28 +27 +31 +32 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +54 +58 +58 +58 +64 +65 +69 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +110 +110 +109 +116 +116 +120 +119 +119 +125 +126 +126 +125 +126 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +156 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +184 +185 +185 +189 +188 +190 +191 +195 +194 +194 +196 +196 +198 +198 +199 +200 +200 +200 +200 +200 +200 +201 +202 +203 +203 +204 +205 +204 +204 +205 +206 +207 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +200 +201 +200 +201 +200 +198 +198 +196 +196 +197 +195 +195 +190 +190 +190 +189 +189 +185 +184 +185 +183 +183 +179 +178 +179 +175 +175 +173 +172 +170 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +120 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +59 +58 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +42 +47 +47 +50 +50 +50 +54 +54 +55 +55 +54 +59 +59 +64 +65 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +126 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +183 +183 +184 +185 +188 +189 +189 +190 +191 +194 +195 +194 +197 +197 +198 +198 +198 +200 +200 +201 +200 +201 +202 +203 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +207 +206 +206 +207 +204 +205 +204 +204 +205 +202 +202 +200 +201 +201 +200 +200 +198 +198 +199 +196 +196 +195 +195 +195 +191 +191 +189 +188 +189 +185 +184 +183 +183 +181 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +134 +133 +133 +129 +129 +125 +126 +125 +120 +120 +115 +116 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +77 +72 +72 +72 +69 +68 +65 +64 +64 +59 +58 +55 +55 +55 +51 +51 +46 +46 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +26 +21 +21 +21 +19 +19 +17 +17 +18 +15 +14 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +50 +51 +54 +54 +59 +58 +59 +64 +64 +68 +69 +73 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +126 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +179 +179 +182 +183 +182 +182 +183 +185 +184 +189 +188 +189 +191 +191 +194 +195 +195 +197 +197 +198 +198 +200 +201 +200 +200 +200 +203 +203 +202 +204 +204 +205 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +205 +204 +204 +204 +204 +203 +202 +200 +200 +201 +200 +201 +198 +199 +199 +196 +197 +194 +195 +191 +191 +190 +189 +188 +184 +185 +185 +183 +182 +178 +179 +178 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +143 +139 +139 +133 +134 +133 +129 +129 +125 +126 +125 +120 +120 +115 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +69 +69 +64 +64 +59 +58 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +51 +51 +51 +54 +55 +59 +58 +58 +64 +64 +68 +69 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +116 +116 +120 +119 +119 +126 +125 +129 +129 +129 +133 +133 +140 +139 +140 +143 +143 +147 +147 +151 +151 +151 +156 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +185 +188 +189 +188 +191 +191 +195 +194 +194 +197 +197 +196 +196 +197 +199 +198 +200 +200 +201 +201 +200 +203 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +199 +197 +197 +197 +196 +197 +194 +195 +191 +190 +191 +188 +189 +184 +184 +184 +183 +183 +179 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +126 +120 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +65 +64 +65 +59 +58 +54 +54 +55 +51 +50 +47 +46 +47 +43 +42 +40 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +14 +16 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +55 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +115 +116 +119 +120 +125 +126 +129 +129 +129 +134 +133 +139 +140 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +182 +182 +182 +185 +184 +188 +189 +188 +190 +190 +194 +194 +196 +197 +197 +198 +198 +200 +201 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +205 +202 +202 +202 +200 +201 +200 +201 +200 +199 +198 +196 +196 +196 +194 +195 +190 +191 +189 +189 +189 +184 +184 +183 +182 +183 +178 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +144 +143 +139 +139 +139 +134 +133 +130 +129 +129 +126 +126 +119 +119 +120 +116 +116 +109 +110 +111 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +62 +58 +58 +55 +55 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +16 +13 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +12 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +54 +59 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +109 +110 +115 +115 +121 +119 +119 +125 +125 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +172 +175 +175 +175 +179 +179 +183 +182 +184 +185 +185 +188 +188 +191 +190 +191 +194 +194 +196 +196 +196 +199 +198 +200 +200 +200 +200 +201 +202 +203 +203 +205 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +199 +198 +198 +196 +197 +194 +195 +195 +190 +191 +188 +188 +188 +184 +184 +183 +183 +183 +178 +179 +175 +174 +175 +173 +172 +169 +169 +165 +164 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +116 +115 +116 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +54 +54 +54 +51 +50 +47 +47 +47 +43 +42 +41 +40 +42 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +12 +15 +14 +17 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +58 +59 +59 +64 +64 +68 +69 +69 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +119 +119 +126 +126 +130 +129 +131 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +183 +183 +184 +185 +189 +189 +189 +190 +191 +195 +194 +194 +196 +196 +198 +198 +199 +200 +200 +201 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +203 +202 +202 +201 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +194 +190 +190 +190 +188 +189 +185 +184 +185 +183 +183 +179 +178 +175 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +126 +119 +119 +120 +116 +115 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +69 +68 +69 +64 +64 +58 +58 +59 +55 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +51 +54 +54 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +118 +120 +120 +126 +126 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +163 +165 +165 +169 +169 +173 +173 +173 +174 +174 +179 +178 +178 +182 +182 +185 +184 +185 +189 +189 +190 +190 +191 +195 +195 +197 +196 +197 +198 +199 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +194 +195 +190 +190 +188 +188 +185 +185 +184 +182 +183 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +115 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +77 +72 +72 +68 +68 +69 +64 +64 +59 +59 +55 +54 +54 +50 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +54 +55 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +102 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +126 +125 +129 +129 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +183 +185 +185 +189 +188 +191 +190 +191 +194 +195 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +202 +204 +205 +205 +204 +205 +206 +207 +206 +206 +206 +206 +207 +205 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +201 +200 +200 +200 +201 +199 +198 +196 +196 +195 +194 +194 +190 +190 +188 +188 +189 +184 +184 +183 +183 +182 +179 +179 +175 +175 +175 +172 +172 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +123 +119 +120 +115 +116 +110 +110 +109 +106 +106 +100 +99 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +74 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +54 +54 +51 +51 +47 +47 +47 +43 +42 +41 +41 +41 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +50 +54 +54 +59 +59 +58 +65 +64 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +115 +119 +119 +120 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +162 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +184 +185 +188 +189 +191 +191 +191 +194 +194 +197 +197 +197 +198 +198 +200 +200 +200 +201 +201 +202 +203 +205 +204 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +201 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +191 +190 +189 +189 +188 +184 +185 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +140 +141 +133 +133 +129 +129 +125 +126 +125 +120 +120 +115 +116 +116 +110 +110 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +76 +76 +76 +72 +71 +68 +68 +68 +64 +64 +58 +59 +58 +55 +54 +51 +51 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +51 +51 +51 +55 +54 +58 +59 +58 +64 +64 +68 +68 +70 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +117 +120 +120 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +184 +189 +188 +188 +190 +190 +194 +194 +194 +196 +197 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +205 +204 +205 +204 +204 +202 +202 +202 +200 +200 +200 +201 +200 +198 +199 +196 +196 +197 +195 +195 +191 +191 +191 +188 +189 +184 +185 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +130 +130 +129 +130 +129 +125 +125 +120 +119 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +67 +69 +65 +64 +58 +58 +55 +54 +55 +50 +51 +46 +46 +47 +43 +42 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +50 +50 +55 +54 +56 +58 +58 +65 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +105 +110 +110 +115 +115 +115 +119 +119 +126 +125 +125 +130 +129 +133 +134 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +185 +189 +189 +190 +190 +195 +194 +195 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +205 +205 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +201 +198 +198 +199 +196 +196 +194 +195 +190 +191 +191 +188 +188 +185 +185 +185 +183 +183 +182 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +134 +130 +129 +125 +125 +123 +120 +120 +116 +115 +109 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +89 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +54 +54 +50 +51 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +36 +36 +41 +41 +41 +43 +43 +47 +47 +51 +51 +51 +55 +54 +59 +58 +58 +64 +65 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +126 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +183 +182 +182 +184 +184 +189 +188 +188 +190 +191 +194 +195 +194 +196 +197 +198 +198 +198 +200 +201 +200 +200 +201 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +201 +198 +199 +197 +196 +197 +194 +194 +194 +194 +194 +190 +191 +189 +189 +189 +184 +185 +182 +183 +181 +178 +178 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +126 +120 +119 +119 +116 +116 +110 +109 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +59 +58 +59 +54 +55 +51 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +15 +13 +13 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +29 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +46 +46 +47 +51 +50 +54 +54 +54 +59 +58 +65 +64 +67 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +119 +119 +119 +125 +125 +129 +130 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +174 +175 +178 +178 +183 +182 +183 +185 +185 +189 +188 +189 +190 +190 +195 +194 +194 +197 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +203 +204 +205 +204 +204 +204 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +201 +200 +200 +200 +198 +198 +198 +196 +196 +194 +195 +192 +191 +191 +189 +189 +185 +185 +185 +182 +182 +179 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +119 +120 +116 +116 +110 +110 +105 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +55 +55 +54 +51 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +42 +43 +47 +46 +50 +51 +54 +54 +54 +58 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +109 +116 +116 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +174 +179 +179 +179 +183 +183 +184 +185 +185 +188 +189 +191 +190 +195 +194 +194 +196 +196 +198 +198 +198 +200 +201 +201 +200 +200 +203 +202 +204 +204 +205 +205 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +199 +198 +196 +196 +196 +195 +195 +190 +190 +191 +188 +189 +188 +188 +188 +184 +185 +183 +182 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +134 +133 +130 +129 +126 +125 +125 +120 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +41 +42 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +59 +58 +59 +65 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +165 +169 +169 +173 +173 +174 +175 +175 +178 +179 +182 +183 +183 +185 +185 +188 +189 +188 +190 +191 +195 +195 +195 +197 +197 +198 +198 +198 +200 +200 +201 +201 +203 +202 +202 +204 +204 +204 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +207 +207 +207 +204 +204 +204 +205 +204 +202 +202 +200 +200 +200 +200 +200 +200 +201 +200 +198 +198 +197 +196 +197 +195 +195 +190 +190 +189 +188 +189 +184 +185 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +129 +130 +129 +125 +126 +119 +120 +120 +115 +115 +110 +109 +110 +106 +106 +100 +99 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +59 +59 +55 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +54 +55 +58 +58 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +115 +115 +119 +119 +126 +125 +126 +129 +129 +134 +133 +133 +139 +139 +143 +144 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +174 +175 +179 +179 +178 +182 +183 +184 +185 +185 +188 +188 +191 +191 +192 +194 +194 +197 +196 +198 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +202 +202 +205 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +205 +204 +204 +204 +202 +202 +201 +201 +201 +201 +200 +199 +198 +197 +196 +196 +194 +195 +190 +190 +191 +188 +188 +185 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +150 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +130 +125 +126 +126 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +59 +59 +58 +55 +55 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +46 +47 +47 +50 +50 +54 +55 +54 +59 +59 +65 +64 +65 +68 +69 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +106 +109 +110 +116 +116 +115 +119 +119 +126 +126 +125 +129 +129 +133 +133 +134 +139 +140 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +185 +185 +188 +188 +189 +191 +190 +195 +194 +195 +196 +196 +198 +198 +199 +200 +201 +200 +200 +200 +203 +202 +204 +205 +204 +204 +205 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +203 +203 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +195 +191 +190 +190 +189 +189 +184 +184 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +129 +130 +125 +125 +120 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +77 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +55 +55 +50 +50 +51 +47 +46 +42 +43 +43 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +22 +21 +19 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +64 +64 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +109 +110 +115 +115 +116 +120 +119 +126 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +184 +185 +185 +184 +185 +189 +188 +190 +191 +191 +194 +194 +196 +197 +197 +199 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +203 +202 +202 +200 +200 +201 +200 +200 +198 +199 +197 +197 +197 +195 +195 +191 +190 +188 +188 +189 +185 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +58 +55 +55 +51 +50 +48 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +26 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +50 +55 +54 +54 +59 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +115 +116 +119 +120 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +183 +185 +184 +188 +189 +190 +190 +191 +194 +194 +197 +197 +196 +198 +198 +198 +199 +199 +200 +200 +201 +201 +201 +202 +202 +204 +204 +204 +205 +205 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +204 +204 +204 +204 +205 +203 +202 +200 +200 +200 +200 +200 +199 +198 +196 +196 +196 +194 +195 +191 +190 +190 +188 +188 +185 +185 +185 +183 +183 +178 +179 +179 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +55 +54 +55 +54 +54 +51 +51 +46 +47 +47 +43 +43 +41 +41 +39 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +48 +47 +51 +50 +55 +55 +55 +58 +58 +64 +64 +65 +68 +68 +72 +71 +73 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +105 +105 +110 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +168 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +183 +185 +185 +185 +185 +185 +189 +188 +190 +190 +191 +195 +195 +196 +196 +197 +198 +199 +200 +200 +200 +200 +201 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +197 +196 +194 +195 +194 +191 +191 +188 +188 +185 +185 +184 +183 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +125 +125 +120 +119 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +56 +54 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +28 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +54 +55 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +109 +116 +116 +116 +119 +119 +125 +125 +125 +129 +129 +130 +130 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +149 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +178 +179 +182 +182 +185 +185 +188 +189 +189 +191 +190 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +205 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +205 +204 +202 +202 +200 +200 +200 +200 +201 +198 +199 +197 +196 +197 +194 +195 +191 +191 +190 +188 +188 +185 +185 +184 +183 +183 +179 +179 +178 +175 +174 +173 +172 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +134 +133 +133 +129 +129 +125 +125 +126 +120 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +74 +68 +68 +65 +65 +59 +58 +58 +54 +55 +51 +50 +50 +47 +46 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +46 +51 +51 +50 +55 +55 +58 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +116 +116 +119 +119 +120 +126 +125 +129 +129 +129 +133 +133 +139 +140 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +172 +172 +173 +175 +175 +179 +178 +181 +182 +183 +185 +185 +188 +188 +188 +190 +191 +194 +195 +195 +196 +196 +199 +198 +198 +200 +201 +200 +200 +201 +202 +202 +204 +204 +204 +205 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +205 +205 +204 +204 +202 +202 +200 +200 +201 +201 +200 +199 +199 +196 +196 +197 +194 +194 +195 +195 +195 +191 +191 +189 +188 +189 +185 +184 +183 +183 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +130 +129 +125 +125 +126 +119 +119 +116 +116 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +77 +72 +72 +69 +69 +69 +64 +64 +64 +64 +64 +59 +58 +55 +55 +55 +51 +51 +47 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +20 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +20 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +120 +120 +126 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +188 +189 +189 +191 +191 +194 +194 +195 +197 +197 +198 +198 +200 +201 +200 +200 +200 +203 +202 +203 +204 +204 +205 +204 +205 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +205 +205 +205 +204 +204 +202 +202 +202 +201 +201 +200 +200 +201 +198 +198 +197 +196 +196 +195 +195 +191 +190 +191 +188 +189 +185 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +140 +134 +133 +130 +129 +129 +126 +125 +125 +126 +126 +120 +119 +115 +116 +116 +115 +115 +110 +109 +110 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +73 +73 +69 +68 +64 +65 +59 +58 +58 +55 +54 +50 +51 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +46 +46 +47 +51 +50 +55 +55 +58 +59 +58 +65 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +105 +106 +110 +109 +115 +116 +116 +119 +120 +119 +120 +120 +126 +125 +129 +129 +130 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +175 +179 +179 +183 +183 +184 +184 +184 +189 +189 +188 +189 +189 +190 +191 +191 +191 +191 +195 +195 +197 +196 +197 +199 +198 +200 +200 +200 +200 +201 +202 +202 +205 +204 +204 +205 +204 +206 +206 +207 +206 +206 +207 +206 +205 +207 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +200 +200 +200 +199 +199 +198 +196 +196 +195 +194 +194 +190 +191 +189 +188 +188 +184 +184 +183 +183 +182 +179 +178 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +141 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +116 +109 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +65 +58 +58 +59 +54 +54 +51 +51 +50 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +32 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +47 +46 +47 +50 +51 +55 +55 +55 +59 +59 +64 +64 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +116 +119 +120 +119 +125 +125 +129 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +185 +185 +188 +189 +188 +191 +191 +195 +194 +197 +196 +197 +199 +199 +200 +200 +201 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +207 +204 +204 +204 +205 +204 +202 +203 +202 +201 +200 +200 +200 +201 +198 +198 +197 +196 +197 +195 +194 +190 +191 +188 +189 +189 +184 +185 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +144 +139 +139 +139 +133 +133 +133 +133 +134 +129 +129 +125 +126 +125 +120 +120 +116 +116 +116 +109 +109 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +61 +57 +58 +54 +54 +50 +50 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +48 +51 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +115 +120 +119 +125 +126 +126 +129 +129 +133 +134 +133 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +189 +189 +188 +191 +191 +194 +194 +194 +196 +196 +199 +199 +199 +201 +200 +201 +200 +200 +203 +202 +204 +204 +205 +204 +205 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +205 +205 +205 +204 +204 +203 +203 +201 +200 +201 +200 +200 +198 +198 +196 +197 +197 +195 +194 +191 +190 +190 +188 +188 +189 +189 +188 +184 +185 +182 +183 +183 +178 +179 +175 +175 +176 +173 +173 +169 +168 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +134 +130 +129 +130 +125 +125 +119 +119 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +65 +59 +59 +59 +55 +54 +51 +51 +51 +47 +46 +43 +43 +43 +41 +40 +37 +36 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +16 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +50 +55 +54 +54 +55 +55 +58 +58 +65 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +115 +116 +116 +119 +120 +126 +126 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +178 +182 +183 +183 +184 +185 +189 +188 +189 +190 +191 +194 +195 +194 +196 +196 +199 +199 +198 +201 +200 +201 +200 +203 +202 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +203 +202 +201 +200 +200 +200 +201 +198 +198 +198 +198 +198 +196 +197 +194 +194 +194 +190 +190 +188 +188 +186 +185 +185 +183 +183 +178 +179 +178 +175 +175 +172 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +130 +129 +125 +126 +120 +120 +119 +116 +116 +110 +110 +111 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +83 +76 +76 +73 +72 +72 +68 +68 +64 +64 +65 +58 +58 +54 +55 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +54 +54 +54 +58 +59 +64 +65 +64 +69 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +106 +105 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +126 +129 +130 +134 +133 +133 +140 +139 +143 +143 +144 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +184 +188 +189 +191 +190 +195 +194 +194 +197 +196 +198 +198 +198 +200 +200 +201 +200 +201 +202 +202 +205 +204 +204 +205 +205 +206 +207 +207 +207 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +201 +200 +201 +200 +198 +197 +200 +197 +197 +194 +194 +190 +190 +191 +189 +189 +185 +185 +185 +183 +183 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +126 +126 +120 +119 +115 +116 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +65 +64 +64 +58 +58 +55 +55 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +15 +16 +15 +17 +16 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +47 +47 +46 +51 +51 +54 +55 +54 +59 +59 +64 +64 +64 +69 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +93 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +116 +115 +119 +120 +125 +125 +126 +129 +130 +134 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +185 +188 +188 +189 +190 +191 +194 +195 +195 +197 +197 +199 +198 +198 +200 +200 +201 +201 +200 +202 +203 +204 +204 +205 +204 +204 +206 +207 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +207 +205 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +197 +197 +194 +194 +191 +191 +191 +188 +189 +189 +188 +189 +185 +184 +182 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +125 +126 +126 +120 +119 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +89 +86 +86 +86 +82 +82 +76 +77 +73 +72 +73 +68 +68 +64 +64 +64 +59 +59 +55 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +32 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +50 +51 +54 +54 +58 +58 +59 +65 +65 +69 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +116 +116 +119 +119 +120 +125 +125 +129 +129 +134 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +182 +183 +185 +184 +184 +189 +189 +190 +191 +190 +195 +195 +196 +197 +196 +198 +199 +200 +201 +201 +201 +200 +202 +203 +205 +204 +205 +204 +204 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +205 +202 +203 +202 +200 +201 +200 +200 +200 +198 +199 +199 +199 +199 +196 +197 +195 +194 +194 +191 +190 +189 +188 +184 +185 +185 +183 +183 +178 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +164 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +134 +133 +129 +129 +125 +125 +125 +119 +120 +115 +116 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +64 +59 +58 +54 +55 +55 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +58 +58 +64 +64 +64 +68 +69 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +100 +105 +106 +110 +110 +116 +116 +115 +119 +119 +125 +126 +125 +129 +129 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 diff --git a/Old Matlab Interface/.svn/pristine/21/210ff8921909a8810c7ea800fbf3a98550ceb291.svn-base b/Old Matlab Interface/.svn/pristine/21/210ff8921909a8810c7ea800fbf3a98550ceb291.svn-base new file mode 100644 index 00000000..2ccdc10d --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/21/210ff8921909a8810c7ea800fbf3a98550ceb291.svn-base @@ -0,0 +1,1043 @@ +function varargout = first_gui(varargin) +% FIRST_GUI MATLAB code for first_gui.fig +% FIRST_GUI, by itself, creates a new FIRST_GUI or raises the existing +% singleton*. +% +% H = FIRST_GUI returns the handle to a new FIRST_GUI or the handle to +% the existing singleton*. +% +% FIRST_GUI('CALLBACK',hObject,eventData,handles,...) calls the local +% function named CALLBACK in FIRST_GUI.M with the given input arguments. +% +% FIRST_GUI('Property','Value',...) creates a new FIRST_GUI or raises the +% existing singleton*. Starting from the left, property value pairs are +% applied to the GUI before first_gui_OpeningFcn gets called. An +% unrecognized property name or invalid value makes property application +% stop. All inputs are passed to first_gui_OpeningFcn via varargin. +% +% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one +% instance to run (singleton)". +% +% See also: GUIDE, GUIDATA, GUIHANDLES + +% Edit the above text to modify the response to help first_gui + +% Last Modified by GUIDE v2.5 03-Dec-2015 11:38:11 + +% Begin initialization code - DO NOT EDIT +gui_Singleton = 1; +gui_State = struct('gui_Name', mfilename, ... + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @first_gui_OpeningFcn, ... + 'gui_OutputFcn', @first_gui_OutputFcn, ... + 'gui_LayoutFcn', [] , ... + 'gui_Callback', []); +if nargin && ischar(varargin{1}) + gui_State.gui_Callback = str2func(varargin{1}); +end + +if nargout + [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); +else + gui_mainfcn(gui_State, varargin{:}); +end +% End initialization code - DO NOT EDIT + + +% --- Executes just before first_gui is made visible. +function first_gui_OpeningFcn(hObject, eventdata, handles, varargin) +% This function has no output args, see OutputFcn. +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +% varargin command line arguments to first_gui (see VARARGIN) + +% Choose default command line output for first_gui +handles.output = hObject; + +handles + +global gui_axes +global gui_delay +global text_box_1 +global text_box_2 +global gui_scope_running +global gui_cursor_mode +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global scope_window_min +global gui_awg_waveform +global gui_awg_amplitude +global gui_awg_frequency +global gui_vo +global gui_ro +global gui_static_text_scope +global CH1_AC +global CH2_AC + + +gui_delay = handles.slider6 +gui_axes = handles.axes1; +text_box_1 = handles.edit1; +text_box_2 = handles.text9 +gui_static_text_scope = handles.text10; +gui_scope_running = 1; +gui_cursor_mode = 1; + +gui_vert_cursor_a_pos = 0; +gui_vert_cursor_b_pos = 0; +gui_hori_cursor_a_pos = scope_window_min; +gui_hori_cursor_b_pos = scope_window_min; + +gui_awg_waveform = 'sin(linspace(0,2*pi,128))'; +gui_awg_amplitude = '255'; +gui_awg_frequency = '50' + +gui_vo = 0; +gui_ro = 1000; + +CH1_AC = 0; +CH2_AC = 0; + + +%get(handles.axes1) + +% Update handles structure +guidata(hObject, handles); + +% UIWAIT makes first_gui wait for user response (see UIRESUME) +% uiwait(handles.figure1); + + +% --- Outputs from this function are returned to the command line. +function varargout = first_gui_OutputFcn(hObject, eventdata, handles) +% varargout cell array for returning output args (see VARARGOUT); +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Get default command line output from handles structure +varargout{1} = handles.output; + + + +function edit1_Callback(hObject, eventdata, handles) +% hObject handle to edit1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit1 as text +% str2double(get(hObject,'String')) returns contents of edit1 as a double + + +% --- Executes during object creation, after setting all properties. +function edit1_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit2_Callback(hObject, eventdata, handles) +% hObject handle to edit2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit2 as text +% str2double(get(hObject,'String')) returns contents of edit2 as a double + + +% --- Executes during object creation, after setting all properties. +function edit2_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit3_Callback(hObject, eventdata, handles) +% hObject handle to edit3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit3 as text +% str2double(get(hObject,'String')) returns contents of edit3 as a double + + +% --- Executes during object creation, after setting all properties. +function edit3_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit4_Callback(hObject, eventdata, handles) +% hObject handle to edit4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit4 as text +% str2double(get(hObject,'String')) returns contents of edit4 as a double + + +% --- Executes during object creation, after setting all properties. +function edit4_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider1_Callback(hObject, eventdata, handles) +global scope_window_time +global gui_delay +% hObject handle to slider1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +scope_window_time = 10^(-get(hObject, 'value')) +set(gui_delay, 'SliderStep', [scope_window_time/100, scope_window_time/10]); +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider1_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + + +function edit5_Callback(hObject, eventdata, handles) +% hObject handle to edit5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit5 as text +% str2double(get(hObject,'String')) returns contents of edit5 as a double + + +% --- Executes during object creation, after setting all properties. +function edit5_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton1. +function pushbutton1_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + + +% --- Executes on slider movement. +function slider2_Callback(hObject, eventdata, handles) +% hObject handle to slider2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_hori_cursor_a_pos +global scope_window_max +global scope_window_min +global text_box_2 +global gui_cursor_mode + +gui_hori_cursor_a_pos = scope_window_min + (scope_window_max - scope_window_min) * get(hObject,'Value'); + +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider2_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on selection change in popupmenu1. +function popupmenu1_Callback(hObject, eventdata, handles) +% hObject handle to popupmenu1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_cursor_mode +gui_cursor_mode = get(hObject,'Value') + +% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array +% contents{get(hObject,'Value')} returns selected item from popupmenu1 + + +% --- Executes during object creation, after setting all properties. +function popupmenu1_CreateFcn(hObject, eventdata, handles) +% hObject handle to popupmenu1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: popupmenu controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider3_Callback(hObject, eventdata, handles) +% hObject handle to slider3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_hori_cursor_b_pos +global scope_window_max +global scope_window_min +global text_box_2 +global gui_cursor_mode + +gui_hori_cursor_b_pos = scope_window_min + (scope_window_max - scope_window_min) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider3_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + + +function edit6_Callback(hObject, eventdata, handles) +% hObject handle to edit6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_waveform +gui_awg_waveform = get(hObject,'String'); + + +% Hints: get(hObject,'String') returns contents of edit6 as text +% str2double(get(hObject,'String')) returns contents of edit6 as a double + + +% --- Executes during object creation, after setting all properties. +function edit6_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton3. +function pushbutton3_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_awg_waveform +global gui_awg_amplitude +global gui_awg_frequency +global scope_mode + +gui_awg_waveform +gui_awg_amplitude +gui_awg_frequency +if scope_mode == 0 | scope_mode == 3 | scope_mode == 5 + tiny_send_waveform(eval(gui_awg_waveform), str2num(gui_awg_amplitude), str2num(gui_awg_frequency)); + fprintf('\nStandard\n') +else + tiny_send_auxwf(eval(gui_awg_waveform), str2num(gui_awg_amplitude), str2num(gui_awg_frequency)); + fprintf('\nAux\n') +end + + +function edit7_Callback(hObject, eventdata, handles) +% hObject handle to edit7 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_amplitude +gui_awg_amplitude = get(hObject,'String'); + +% Hints: get(hObject,'String') returns contents of edit7 as text +% str2double(get(hObject,'String')) returns contents of edit7 as a double + + +% --- Executes during object creation, after setting all properties. +function edit7_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit7 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit8_Callback(hObject, eventdata, handles) +% hObject handle to edit8 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_frequency +gui_awg_frequency = get(hObject,'String'); +% Hints: get(hObject,'String') returns contents of edit8 as text +% str2double(get(hObject,'String')) returns contents of edit8 as a double + + +% --- Executes during object creation, after setting all properties. +function edit8_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit8 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. + +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton4. +function pushbutton4_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_scope_running +gui_scope_running = ~gui_scope_running + + + +function edit9_Callback(hObject, eventdata, handles) +% hObject handle to edit9 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vo; +gui_vo = str2num(get(hObject, 'String')); + +% Hints: get(hObject,'String') returns contents of edit9 as text +% str2double(get(hObject,'String')) returns contents of edit9 as a double + + +% --- Executes during object creation, after setting all properties. +function edit9_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit9 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit10_Callback(hObject, eventdata, handles) +% hObject handle to edit10 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_ro; +gui_ro = str2num(get(hObject, 'String')); +% Hints: get(hObject,'String') returns contents of edit10 as text +% str2double(get(hObject,'String')) returns contents of edit10 as a double + + +% --- Executes during object creation, after setting all properties. +function edit10_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit10 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton5. +function pushbutton5_Callback(hObject, eventdata, handles) +global gui_vo +global gui_ro +setpsu_boost(gui_vo, 5, gui_ro); +% hObject handle to pushbutton5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + + +% --- Executes on slider movement. +function slider4_Callback(hObject, eventdata, handles) +% hObject handle to slider4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vert_cursor_a_pos +global scope_window_time +global text_box_2 +global gui_cursor_mode + +gui_vert_cursor_a_pos = -scope_window_time + (scope_window_time) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider4_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on slider movement. +function slider5_Callback(hObject, eventdata, handles) +% hObject handle to slider5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vert_cursor_b_pos +global scope_window_time +global text_box_2 +global gui_cursor_mode +gui_vert_cursor_b_pos = -scope_window_time + (scope_window_time) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider5_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on selection change in popupmenu2. +function popupmenu2_Callback(hObject, eventdata, handles) +% hObject handle to popupmenu2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global scope_mode +global scope_gain_0 +global scope_gain_1 +global refreshrate +global refreshrate_temp +global waveform_exists +global saved_waveform_ch1 +global saved_waveform_ch2 +global gui_delay + +refreshrate_temp = refreshrate; +waveform_exists = 0 + +contents = cellstr(get(hObject,'String')); +tempstring = contents{get(hObject,'Value')}; + +mode = str2num(tempstring(6)); +setscopemode(mode, scope_gain_0, scope_gain_1) + +saved_waveform_ch1 = []; +saved_waveform_ch2 = []; +set(gui_delay, 'Value', get(gui_delay, 'Max')) + +% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu2 contents as cell array +% contents{get(hObject,'Value')} returns selected item from popupmenu2 + + +% --- Executes during object creation, after setting all properties. +function popupmenu2_CreateFcn(hObject, eventdata, handles) +% hObject handle to popupmenu2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: popupmenu controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider6_Callback(hObject, eventdata, handles) +% hObject handle to slider6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider6_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end +set(hObject,'Value', 1); + + + +function edit11_Callback(hObject, eventdata, handles) +% hObject handle to edit11 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_delay + +boxvar = str2num(get(hObject,'String')); +if boxvar +#include + +//LIBUSBK INCLUDES +#include +#include +#include +#include +#include "libusbk.h" + +#define DEBUG_SHOWCTRL 1 +#define ISO_PACKETS_TO_READ 30 +#define ISO_PACKET_SIZE 375 +#define HALFBUFFER_SIZE (ISO_PACKETS_TO_READ*ISO_PACKET_SIZE) + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + //Vars: + //Imports + char* HANDLE_CHAR; + KUSB_HANDLE handle = NULL; + unsigned char pipeID = 0x83; + //Internals + unsigned char success; + unsigned int transferred; + DWORD errorCode = ERROR_SUCCESS; + PKISO_CONTEXT isoCtx[2] = { NULL, NULL }; + KOVL_HANDLE ovlkHandle[2] = { NULL, NULL }; + KOVL_POOL_HANDLE ovlPool = NULL; + char *isoBuffer; + //Exports + char isoCtx0_string[17]; + char isoCtx1_string[17]; + char ovlkHandle0_string[17]; + char ovlkHandle1_string[17]; + char ovlPool_string[17]; + char isoBuffer_string[17]; + + + //Initialise Data + HANDLE_CHAR = mxArrayToString(prhs[0]); + sscanf(HANDLE_CHAR, "%16x", &handle); + + isoBuffer = malloc(2*HALFBUFFER_SIZE); + + //Actual Function + success = UsbK_ResetPipe(handle, pipeID); + if (~success){ + errorCode = GetLastError(); + if (errorCode != 0x3E5){ + printf("UsbK_ResetPipe failed. ErrorCode: %08Xh\n", errorCode); + } + } + + //Define Iso Context + IsoK_Init(&isoCtx[0], ISO_PACKETS_TO_READ, 0); + IsoK_SetPackets(isoCtx[0], ISO_PACKET_SIZE); + + IsoK_Init(&isoCtx[1], ISO_PACKETS_TO_READ, ISO_PACKETS_TO_READ); + IsoK_SetPackets(isoCtx[1], ISO_PACKET_SIZE); + + //What is this overlapped pool? Virtual Addresses for I/O? Black magic? The source of my errors. + OvlK_Init(&ovlPool, handle, 4, 0); + printf("OvlPool = %d", ovlPool); + + OvlK_Acquire(&ovlkHandle[0], ovlPool); + + OvlK_Acquire(&ovlkHandle[1], ovlPool); + + //Set up iso pipe for n reads. + UsbK_IsoReadPipe(handle, pipeID, isoBuffer, HALFBUFFER_SIZE, ovlkHandle[0], isoCtx[0]); + UsbK_IsoReadPipe(handle, pipeID, (isoBuffer+HALFBUFFER_SIZE), HALFBUFFER_SIZE, ovlkHandle[1], isoCtx[1]); + + //Export Data + + sprintf(isoCtx0_string, "%016x", isoCtx[0]); + plhs[0] = mxCreateString(isoCtx0_string); + + sprintf(isoCtx1_string, "%016x", isoCtx[1]); + plhs[1] = mxCreateString(isoCtx1_string); + + sprintf(ovlkHandle0_string, "%016x", ovlkHandle[0]); + plhs[2] = mxCreateString(ovlkHandle0_string); + + sprintf(ovlkHandle1_string, "%016x", ovlkHandle[1]); + plhs[3] = mxCreateString(ovlkHandle1_string); + + sprintf(ovlPool_string, "%016x", ovlPool); + plhs[4] = mxCreateString(ovlPool_string); + + sprintf(isoBuffer_string, "%016x", isoBuffer); + plhs[5] = mxCreateString(isoBuffer_string); + + + return; +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/23/23880a000a15dd9a71984f677ace3f759b3d176c.svn-base b/Old Matlab Interface/.svn/pristine/23/23880a000a15dd9a71984f677ace3f759b3d176c.svn-base new file mode 100644 index 00000000..52da3e38 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/23/23880a000a15dd9a71984f677ace3f759b3d176c.svn-base @@ -0,0 +1,52 @@ +function [] = tiny_send_waveform(waveform, amplitude, frequency); + +waveform = tiny_wave_conv(waveform, amplitude); +waveform = uint8(waveform); + +wave_length = length(waveform); + +f_invalid = 1; + +%%ALWAYS SEND THE DMA FLAG +dma_flag = 1; +% dma_flag = 0; +% if(frequency>500) +% dma_flag = 1; +% end + +valid_clock_div = [1,2,4,8,64,256,1024]; +f0=24e6; + +if(frequency*wave_length)>1e6 + error('Frequency is too high') +end + +for clk_setting = 1:length(valid_clock_div) + f_test = f0 / valid_clock_div(clk_setting); + if (f_test/frequency)<65535 + f_invalid = 0; + break + end +end + +if (f_invalid) + error('Frequency is too low!') +end + +tccper = round(f_test / frequency / wave_length); +tccper = uint16(tccper); + +clk_setting = uint16(clk_setting); + +%stairs(uint8(waveform)); + +wavestring = []; +for n=1:wave_length + wavestring = [wavestring [sprintf('%3d, ', waveform(n)) ' ']]; +end + +mex_usb_send_control('40', 'a1', dec2hex(tccper), dec2hex(clk_setting + 32768*dma_flag), dec2hex(wave_length), uint8(waveform)); + +% driverLocation = 'c:\libusbk\examples\open-device\debug\win32'; +% command = [driverLocation '\open-device "03eb" "a000" "' command '" "' num2str(tccper) '" "' num2str(clk_setting) '" "' num2str(wave_length) '" "' wavestring '"'] +% system(command); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/24/24252c4f32cacda1c505e6fc27fbc7ba69f5aa71.svn-base b/Old Matlab Interface/.svn/pristine/24/24252c4f32cacda1c505e6fc27fbc7ba69f5aa71.svn-base new file mode 100644 index 00000000..f959ea5e --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/24/24252c4f32cacda1c505e6fc27fbc7ba69f5aa71.svn-base @@ -0,0 +1,56 @@ +function [] = displaypacket(new_packets) + +global saved_waveform_ch1 +global saved_waveform_ch2 +global scope_mode +global gui_scope_running + + +%Keep the arrays small(ish) +if length(saved_waveform_ch1)>10e6 + saved_waveform_ch1 = saved_waveform_ch1(length(saved_waveform_ch1)-1e6:end); +end +if length(saved_waveform_ch2)>10e6 + saved_waveform_ch2 = saved_waveform_ch2(length(saved_waveform_ch2)-1e6:end); +end + + +%%Insta-return if scope is paused +if(~gui_scope_running) + return +end + +%%Exception for mode 6 +if scope_mode == 6 + transfer_contents_temp = []; + for tempovar = 0:length(new_packets)/750 - 1 + transfer_contents_temp = [transfer_contents_temp new_packets((tempovar*750+1):(tempovar*750+748))]; + end + saved_waveform_ch1 = [saved_waveform_ch1 transfer_contents_temp]; + return +end + +%%Pull out CH1 data +if scope_mode < 5 + transfer_contents_temp = []; + for tempovar = 0:length(new_packets)/750 - 1 + transfer_contents_temp = [transfer_contents_temp new_packets((tempovar*750+1):(tempovar*750+374))]; + end + saved_waveform_ch1 = [saved_waveform_ch1 transfer_contents_temp]; +end + +%%Pull out CH2 data for relevant states +if (scope_mode == 1 | scope_mode == 2 | scope_mode == 4) + transfer_contents_temp = []; + for tempovar = 0:length(new_packets)/750 - 1 + transfer_contents_temp = [transfer_contents_temp new_packets((tempovar*750+376):(tempovar*750+749))]; + end + saved_waveform_ch2 = [saved_waveform_ch2 transfer_contents_temp]; +end + +% transfer_contents_whole = [transfer_contents_0 transfer_contents_1] +% transfer_contents_temp = []; +% for tempovar = 0:length(transfer_contents_whole)/750 - 1 +% transfer_contents_temp = [transfer_contents_temp transfer_contents_whole((tempovar*750+1):(tempovar*750+748))]; +% end +% plot(transfer_contents_temp) diff --git a/Old Matlab Interface/.svn/pristine/28/2829ca960562d879bb9bc425ae0f4d356f78aaf9.svn-base b/Old Matlab Interface/.svn/pristine/28/2829ca960562d879bb9bc425ae0f4d356f78aaf9.svn-base new file mode 100644 index 00000000..9cd8f040 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/28/2829ca960562d879bb9bc425ae0f4d356f78aaf9.svn-base @@ -0,0 +1,40 @@ +function [] = setscopemode(mode, gain0, gain1); %Mode zero for single channel analog, 1 for single digital, 2 for 2ch analog, 3 for 2ch digital +global scope_mode +scope_mode = mode; + +if(gain0~=0.5 & gain0~=1 & gain0~=2 & gain0~=4 & gain0~=8 & gain0~=16 & gain0~=32 & gain0~=64) + error('Valid values of gain are 0.5, 1, 2, 4, 8, 16, 32, 64'); +end + +if(gain1~=0.5 & gain1~=1 & gain1~=2 & gain1~=4 & gain1~=8 & gain1~=16 & gain1~=32 & gain1~=64) + error('Valid values of gain are 0.5, 1, 2, 4, 8, 16, 32, 64'); +end + + +global scope_gain +scope_gain = gain0; + +gain_mask_0 = uint16([]); + +if (gain0 == 1/2) + gain_mask_0 = 7*4; +else + gain_mask_0 = log2(gain0) * 4; +end + +gain_mask_1 = uint16([]); + +if (gain1 == 1/2) + gain_mask_1 = 7*4; +else + gain_mask_1 = log2(gain1) * 4; +end + +gain_mask = gain_mask_0 + 256*gain_mask_1; + + +mex_usb_send_control('40', 'a5', dec2hex(mode), dec2hex(gain_mask), '0', '0'); + +% driverLocation = 'c:\libusbk\examples\open-device\debug\win32'; +% command = [driverLocation '\open-device "03eb" "a000" "' command '" "' num2str(onoff) '" "NULL" "NULL" "NULL"'] +% system(command); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/28/28a638cd51e648387350a4716cb2c2182b540d87.svn-base b/Old Matlab Interface/.svn/pristine/28/28a638cd51e648387350a4716cb2c2182b540d87.svn-base new file mode 100644 index 00000000..bf017c32 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/28/28a638cd51e648387350a4716cb2c2182b540d87.svn-base @@ -0,0 +1,622 @@ +function varargout = first_gui(varargin) +% FIRST_GUI MATLAB code for first_gui.fig +% FIRST_GUI, by itself, creates a new FIRST_GUI or raises the existing +% singleton*. +% +% H = FIRST_GUI returns the handle to a new FIRST_GUI or the handle to +% the existing singleton*. +% +% FIRST_GUI('CALLBACK',hObject,eventData,handles,...) calls the local +% function named CALLBACK in FIRST_GUI.M with the given input arguments. +% +% FIRST_GUI('Property','Value',...) creates a new FIRST_GUI or raises the +% existing singleton*. Starting from the left, property value pairs are +% applied to the GUI before first_gui_OpeningFcn gets called. An +% unrecognized property name or invalid value makes property application +% stop. All inputs are passed to first_gui_OpeningFcn via varargin. +% +% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one +% instance to run (singleton)". +% +% See also: GUIDE, GUIDATA, GUIHANDLES + +% Edit the above text to modify the response to help first_gui + +% Last Modified by GUIDE v2.5 05-Aug-2015 16:20:06 + +% Begin initialization code - DO NOT EDIT +gui_Singleton = 1; +gui_State = struct('gui_Name', mfilename, ... + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @first_gui_OpeningFcn, ... + 'gui_OutputFcn', @first_gui_OutputFcn, ... + 'gui_LayoutFcn', [] , ... + 'gui_Callback', []); +if nargin && ischar(varargin{1}) + gui_State.gui_Callback = str2func(varargin{1}); +end + +if nargout + [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); +else + gui_mainfcn(gui_State, varargin{:}); +end +% End initialization code - DO NOT EDIT + + +% --- Executes just before first_gui is made visible. +function first_gui_OpeningFcn(hObject, eventdata, handles, varargin) +% This function has no output args, see OutputFcn. +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +% varargin command line arguments to first_gui (see VARARGIN) + +% Choose default command line output for first_gui +handles.output = hObject; + +handles + +global gui_axes +global text_box_1 +global text_box_2 +global gui_scope_running +global gui_cursor_mode +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global scope_window_min +global gui_awg_waveform +global gui_awg_amplitude +global gui_awg_frequency +global gui_vo +global gui_ro + +gui_axes = handles.axes1; +text_box_1 = handles.edit1; +text_box_2 = handles.text9 +gui_scope_running = 1; +gui_cursor_mode = 1; + +gui_vert_cursor_a_pos = 0; +gui_vert_cursor_b_pos = 0; +gui_hori_cursor_a_pos = scope_window_min; +gui_hori_cursor_b_pos = scope_window_min; + +gui_awg_waveform = 'sin(linspace(0,2*pi,128))'; +gui_awg_amplitude = '255'; +gui_awg_frequency = '50' + +gui_vo = 0; +gui_ro = 1000; + + +%get(handles.axes1) + +% Update handles structure +guidata(hObject, handles); + +% UIWAIT makes first_gui wait for user response (see UIRESUME) +% uiwait(handles.figure1); + + +% --- Outputs from this function are returned to the command line. +function varargout = first_gui_OutputFcn(hObject, eventdata, handles) +% varargout cell array for returning output args (see VARARGOUT); +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Get default command line output from handles structure +varargout{1} = handles.output; + + + +function edit1_Callback(hObject, eventdata, handles) +% hObject handle to edit1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit1 as text +% str2double(get(hObject,'String')) returns contents of edit1 as a double + + +% --- Executes during object creation, after setting all properties. +function edit1_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit2_Callback(hObject, eventdata, handles) +% hObject handle to edit2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit2 as text +% str2double(get(hObject,'String')) returns contents of edit2 as a double + + +% --- Executes during object creation, after setting all properties. +function edit2_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit3_Callback(hObject, eventdata, handles) +% hObject handle to edit3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit3 as text +% str2double(get(hObject,'String')) returns contents of edit3 as a double + + +% --- Executes during object creation, after setting all properties. +function edit3_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit4_Callback(hObject, eventdata, handles) +% hObject handle to edit4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit4 as text +% str2double(get(hObject,'String')) returns contents of edit4 as a double + + +% --- Executes during object creation, after setting all properties. +function edit4_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider1_Callback(hObject, eventdata, handles) +global scope_window_time +% hObject handle to slider1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +scope_window_time = 10^(-get(hObject, 'value')) +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider1_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + + +function edit5_Callback(hObject, eventdata, handles) +% hObject handle to edit5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit5 as text +% str2double(get(hObject,'String')) returns contents of edit5 as a double + + +% --- Executes during object creation, after setting all properties. +function edit5_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton1. +function pushbutton1_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + + +% --- Executes on slider movement. +function slider2_Callback(hObject, eventdata, handles) +% hObject handle to slider2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_hori_cursor_a_pos +global scope_window_max +global scope_window_min +global text_box_2 +global gui_cursor_mode + +gui_hori_cursor_a_pos = scope_window_min + (scope_window_max - scope_window_min) * get(hObject,'Value'); + +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider2_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on selection change in popupmenu1. +function popupmenu1_Callback(hObject, eventdata, handles) +% hObject handle to popupmenu1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_cursor_mode +gui_cursor_mode = get(hObject,'Value') + +% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array +% contents{get(hObject,'Value')} returns selected item from popupmenu1 + + +% --- Executes during object creation, after setting all properties. +function popupmenu1_CreateFcn(hObject, eventdata, handles) +% hObject handle to popupmenu1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: popupmenu controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider3_Callback(hObject, eventdata, handles) +% hObject handle to slider3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_hori_cursor_b_pos +global scope_window_max +global scope_window_min +global text_box_2 +global gui_cursor_mode + +gui_hori_cursor_b_pos = scope_window_min + (scope_window_max - scope_window_min) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider3_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + + +function edit6_Callback(hObject, eventdata, handles) +% hObject handle to edit6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_waveform +gui_awg_waveform = get(hObject,'String'); + + +% Hints: get(hObject,'String') returns contents of edit6 as text +% str2double(get(hObject,'String')) returns contents of edit6 as a double + + +% --- Executes during object creation, after setting all properties. +function edit6_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton3. +function pushbutton3_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_awg_waveform +global gui_awg_amplitude +global gui_awg_frequency +gui_awg_waveform +gui_awg_amplitude +gui_awg_frequency +tiny_send_waveform(eval(gui_awg_waveform), str2num(gui_awg_amplitude), str2num(gui_awg_frequency)); + + +function edit7_Callback(hObject, eventdata, handles) +% hObject handle to edit7 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_amplitude +gui_awg_amplitude = get(hObject,'String'); + +% Hints: get(hObject,'String') returns contents of edit7 as text +% str2double(get(hObject,'String')) returns contents of edit7 as a double + + +% --- Executes during object creation, after setting all properties. +function edit7_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit7 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit8_Callback(hObject, eventdata, handles) +% hObject handle to edit8 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_frequency +gui_awg_frequency = get(hObject,'String'); +% Hints: get(hObject,'String') returns contents of edit8 as text +% str2double(get(hObject,'String')) returns contents of edit8 as a double + + +% --- Executes during object creation, after setting all properties. +function edit8_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit8 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. + +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton4. +function pushbutton4_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_scope_running +gui_scope_running = ~gui_scope_running + + + +function edit9_Callback(hObject, eventdata, handles) +% hObject handle to edit9 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vo; +gui_vo = str2num(get(hObject, 'String')); + +% Hints: get(hObject,'String') returns contents of edit9 as text +% str2double(get(hObject,'String')) returns contents of edit9 as a double + + +% --- Executes during object creation, after setting all properties. +function edit9_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit9 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit10_Callback(hObject, eventdata, handles) +% hObject handle to edit10 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_ro; +gui_ro = str2num(get(hObject, 'String')); +% Hints: get(hObject,'String') returns contents of edit10 as text +% str2double(get(hObject,'String')) returns contents of edit10 as a double + + +% --- Executes during object creation, after setting all properties. +function edit10_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit10 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton5. +function pushbutton5_Callback(hObject, eventdata, handles) +global gui_vo +global gui_ro +setpsu(gui_vo, gui_ro); +% hObject handle to pushbutton5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + + +% --- Executes on slider movement. +function slider4_Callback(hObject, eventdata, handles) +% hObject handle to slider4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vert_cursor_a_pos +global scope_window_time +global text_box_2 +global gui_cursor_mode + +gui_vert_cursor_a_pos = -scope_window_time + (scope_window_time) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider4_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on slider movement. +function slider5_Callback(hObject, eventdata, handles) +% hObject handle to slider5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vert_cursor_b_pos +global scope_window_time +global text_box_2 +global gui_cursor_mode +gui_vert_cursor_b_pos = -scope_window_time + (scope_window_time) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider5_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end diff --git a/Old Matlab Interface/.svn/pristine/29/290c7bf876399b9cac7f5c4ed4285c05b25cd206.svn-base b/Old Matlab Interface/.svn/pristine/29/290c7bf876399b9cac7f5c4ed4285c05b25cd206.svn-base new file mode 100644 index 00000000..541af56e --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/29/290c7bf876399b9cac7f5c4ed4285c05b25cd206.svn-base @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/29/29c64fec6e69ca22f81ebf30fba87a8a76bf64b6.svn-base b/Old Matlab Interface/.svn/pristine/29/29c64fec6e69ca22f81ebf30fba87a8a76bf64b6.svn-base new file mode 100644 index 00000000..f6623d60 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/29/29c64fec6e69ca22f81ebf30fba87a8a76bf64b6.svn-base @@ -0,0 +1,130 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// fHandleTest.cs +// +// Created: 03.02.2012 +// Last Updated: 03.03.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; +using System.Windows.Forms; +using libusbK; + + +namespace Handle.Test +{ + public partial class fHandleTest : Form + { + private LstK LstKField; + private List LstKList = new List(); + + private TextBoxTraceListener mListener; + + public fHandleTest() + { + InitializeComponent(); + } + + ~fHandleTest() + { + } + + private void createAndExplictlyDestroyToolStripMenuItem_Click(object sender, EventArgs e) + { + LstK lstTemp = new LstK(KLST_FLAG.NONE); + lstTemp.Dispose(); + } + + private void runGarbageCollectorToolStripMenuItem_Click(object sender, EventArgs e) + { + GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); + } + + private void referenceToolStripMenuItem_Click(object sender, EventArgs e) + { + LstK lstTemp = new LstK(KLST_FLAG.NONE); + LstKList.Add(lstTemp); + LstKField = lstTemp; + } + + private void derefrenceToolStripMenuItem_Click(object sender, EventArgs e) + { + if (LstKList.Count > 0) + { + LstKList.Clear(); + } + else + { + LstKField = null; + } + } + + private void createWithoutExplictDestroyToolStripMenuItem_Click(object sender, EventArgs e) + { + LstK lstTemp = new LstK(KLST_FLAG.NONE); + int count = 0; + lstTemp.Count(ref count); + } + + private void fHandleTest_Load(object sender, EventArgs e) + { + mListener = new TextBoxTraceListener(txtOutput, ThreadPriority.Lowest); + Debug.Listeners.Add(mListener); + } + + private void fHandleTest_FormClosed(object sender, FormClosedEventArgs e) + { + Debug.Listeners.Remove(mListener); + mListener.Free(); + } + + private void exhaustAllHandlesToolStripMenuItem_Click(object sender, EventArgs e) + { + LstKList.Clear(); + LstKField = null; + int count = 0; + try + { + while (true) + { + new LstK(KLST_FLAG.NONE); + count++; + } + } + catch + { + } + + Debug.Print("All handles exhausted. Count:{0}", count); + } + + private void testListenerToolStripMenuItem_Click(object sender, EventArgs e) + { + new TestListener(64); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/2b/2b3e861ba0c928f44218c33b357ee225b210861d.svn-base b/Old Matlab Interface/.svn/pristine/2b/2b3e861ba0c928f44218c33b357ee225b210861d.svn-base new file mode 100644 index 00000000..b1a4e14a --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/2b/2b3e861ba0c928f44218c33b357ee225b210861d.svn-base @@ -0,0 +1,11252 @@ +BEGIN PACKET 0 +182 +182 +182 +182 +182 +183 +183 +182 +183 +183 +183 +182 +182 +183 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +181 +12 +11 +10 +11 +11 +11 +10 +182 +182 +183 +183 +182 +183 +182 +182 +182 +182 +183 +182 +182 +182 +181 +182 +183 +182 +183 +183 +182 +182 +182 +182 +182 +10 +9 +10 +11 +11 +11 +12 +182 +182 +182 +182 +182 +182 +182 +182 +182 +185 +183 +182 +183 +183 +180 +182 +179 +181 +181 +183 +183 +182 +182 +182 +182 +181 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +184 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +12 +10 +10 +11 +11 +11 +10 +182 +182 +182 +182 +183 +182 +183 +182 +182 +183 +182 +182 +182 +182 +182 +179 +182 +182 +182 +182 +182 +182 +182 +182 +182 +12 +11 +11 +11 +11 +10 +11 +182 +182 +182 +181 +182 +182 +180 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +183 +13 +11 +10 +11 +11 +11 +11 +182 +182 +182 +182 +182 +182 +182 +183 +181 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +182 +12 +11 +11 +11 +11 +10 +10 +182 +182 +182 +182 +182 +182 +182 +184 +183 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +181 +182 +182 +11 +11 +11 +11 +11 +10 +11 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +182 +181 +182 +183 +182 +182 +182 +11 +11 +11 +11 +10 +11 +11 +183 +182 +182 +183 +182 +183 +182 +176 +182 +183 +182 +182 +183 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +12 +11 +11 +11 +11 +10 +11 +182 +183 +182 +182 +183 +182 +182 +182 +182 +184 +182 +182 +182 +182 +184 +183 +182 +183 +182 +184 +182 +182 +182 +182 +185 +12 +11 +11 +11 +13 +10 +11 +182 +182 +180 +182 +182 +182 +182 +180 +182 +182 +183 +180 +179 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +182 +12 +11 +11 +11 +11 +10 +10 +183 +182 +12 +8 +11 +11 +11 +11 +11 +182 +182 +182 +182 +182 +182 +182 +183 +183 +183 +182 +182 +182 +184 +183 +182 +182 +182 +181 +183 +182 +182 +182 +183 +182 +12 +11 +11 +6 +11 +11 +11 +182 +181 +182 +182 +183 +182 +183 +182 +182 +182 +182 +181 +182 +182 +182 +183 +181 +182 +182 +183 +182 +183 +182 +182 +182 +12 +11 +10 +9 +11 +10 +10 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +181 +183 +182 +183 +183 +13 +11 +11 +11 +10 +11 +11 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +183 +182 +183 +183 +182 +180 +182 +182 +182 +182 +183 +182 +12 +10 +10 +11 +11 +11 +10 +182 +182 +182 +182 +183 +183 +182 +182 +182 +181 +182 +182 +183 +182 +183 +183 +182 +182 +184 +182 +183 +183 +181 +182 +182 +12 +10 +10 +10 +11 +10 +10 +181 +182 +182 +182 +172 +182 +183 +182 +182 +182 +182 +182 +185 +182 +182 +183 +182 +182 +182 +183 +182 +182 +182 +182 +182 +12 +11 +11 +11 +12 +10 +10 +182 +182 +182 +182 +182 +182 +182 +183 +181 +182 +182 +182 +182 +182 +182 +183 +182 +183 +182 +183 +183 +183 +182 +182 +182 +12 +11 +10 +12 +11 +10 +11 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +183 +182 +183 +182 +183 +182 +182 +182 +12 +11 +11 +12 +10 +11 +11 +182 +182 +183 +182 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +12 +11 +11 +11 +10 +10 +10 +183 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +182 +182 +182 +180 +183 +182 +182 +182 +188 +183 +182 +182 +12 +12 +11 +11 +11 +11 +8 +182 +182 +182 +182 +183 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +179 +183 +12 +11 +11 +10 +10 +10 +10 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +183 +183 +182 +182 +181 +182 +182 +182 +183 +183 +182 +182 +184 +183 +184 +11 +11 +9 +9 +9 +12 +11 +182 +183 +183 +180 +182 +182 +183 +181 +183 +182 +181 +182 +183 +183 +182 +181 +182 +182 +181 +181 +182 +182 +183 +183 +182 +12 +11 +10 +11 +10 +10 +5 +183 +183 +184 +181 +183 +182 +181 +182 +181 +182 +183 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +181 +183 +11 +11 +10 +11 +12 +11 +9 +180 +181 +180 +183 +183 +182 +182 +183 +183 +182 +182 +181 +182 +181 +182 +182 +12 +10 +11 +11 +11 +11 +11 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +183 +183 +182 +183 +182 +182 +181 +182 +182 +182 +182 +182 +182 +181 +183 +11 +10 +11 +11 +10 +9 +10 +183 +183 +183 +183 +182 +182 +182 +182 +181 +182 +182 +182 +182 +183 +181 +183 +182 +182 +182 +182 +182 +182 +181 +182 +182 +12 +10 +11 +10 +11 +11 +10 +182 +182 +181 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +12 +11 +11 +11 +10 +11 +11 +182 +182 +183 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +181 +183 +180 +183 +182 +182 +183 +182 +11 +11 +10 +11 +11 +11 +11 +182 +182 +182 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +182 +12 +10 +10 +11 +11 +11 +10 +182 +182 +183 +181 +183 +182 +183 +182 +184 +182 +182 +183 +183 +180 +182 +182 +182 +183 +182 +182 +182 +183 +182 +186 +182 +12 +12 +10 +12 +11 +11 +11 +182 +188 +181 +183 +182 +182 +179 +182 +183 +183 +182 +189 +182 +182 +182 +182 +181 +182 +183 +182 +183 +183 +181 +180 +182 +10 +9 +10 +11 +11 +11 +9 +182 +181 +181 +183 +181 +183 +183 +182 +183 +181 +182 +182 +181 +182 +183 +183 +184 +182 +182 +182 +181 +182 +181 +182 +182 +12 +11 +11 +10 +10 +10 +10 +182 +183 +183 +180 +182 +182 +180 +181 +182 +182 +183 +183 +182 +182 +183 +183 +183 +183 +182 +182 +182 +182 +181 +181 +183 +181 +182 +181 +183 +182 +183 +182 +182 +182 +11 +10 +11 +11 +11 +10 +11 +182 +184 +183 +184 +182 +183 +181 +183 +183 +180 +182 +181 +182 +182 +182 +182 +180 +180 +182 +181 +182 +181 +182 +183 +184 +13 +11 +10 +10 +10 +10 +10 +181 +183 +182 +186 +184 +183 +181 +183 +182 +182 +182 +182 +182 +182 +183 +179 +182 +182 +183 +182 +182 +182 +182 +183 +182 +10 +10 +11 +11 +183 +182 +182 +182 +180 +181 +183 +182 +182 +183 +182 +182 +182 +181 +182 +185 +183 +183 +182 +12 +10 +10 +10 +9 +11 +11 +183 +183 +182 +183 +182 +182 +180 +182 +182 +183 +182 +180 +182 +181 +181 +184 +182 +183 +183 +181 +182 +183 +181 +184 +183 +12 +14 +10 +12 +9 +9 +11 +183 +183 +183 +181 +183 +181 +181 +183 +182 +183 +183 +181 +181 +181 +182 +182 +183 +183 +182 +182 +182 +182 +183 +181 +182 +12 +12 +12 +12 +11 +11 +10 +181 +182 +183 +183 +184 +182 +182 +181 +182 +181 +183 +183 +182 +182 +178 +182 +183 +182 +180 +181 +181 +182 +183 +182 +184 +13 +9 +10 +10 +13 +12 +12 +182 +182 +183 +182 +183 +182 +181 +183 +182 +182 +183 +182 +183 +182 +182 +183 +183 +182 +181 +182 +181 +182 +182 +185 +183 +14 +10 +11 +9 +9 +10 +10 +183 +183 +183 +183 +182 +183 +182 +182 +183 +182 +182 +181 +181 +182 +183 +182 +182 +182 +182 +183 +181 +182 +183 +183 +181 +12 +11 +10 +11 +11 +10 +10 +183 +182 +181 +183 +182 +183 +183 +183 +183 +184 +182 +182 +182 +182 +182 +181 +183 +183 +182 +183 +182 +183 +182 +182 +182 +13 +10 +11 +11 +11 +11 +10 +182 +182 +182 +183 +184 +183 +184 +182 +185 +183 +182 +182 +181 +182 +181 +182 +183 +182 +181 +182 +183 +183 +183 +182 +182 +11 +11 +11 +10 +8 +8 +10 +182 +182 +183 +183 +183 +182 +182 +182 +182 +182 +182 +181 +182 +185 +182 +182 +182 +182 +182 +182 +184 +182 +182 +182 +182 +13 +10 +11 +12 +10 +10 +11 +181 +182 +182 +183 +183 +11 +12 +10 +11 +183 +182 +182 +182 +182 +183 +183 +183 +183 +182 +182 +183 +183 +182 +182 +182 +181 +181 +182 +182 +181 +184 +182 +182 +182 +12 +11 +11 +11 +11 +11 +10 +182 +181 +182 +184 +183 +182 +181 +182 +183 +183 +183 +184 +182 +182 +182 +182 +182 +183 +182 +183 +183 +183 +182 +182 +183 +13 +11 +11 +11 +10 +10 +11 +183 +182 +181 +182 +182 +181 +182 +182 +182 +182 +183 +183 +183 +182 +182 +182 +183 +183 +181 +182 +181 +11 +10 +180 +181 +182 +181 +183 +182 +182 +182 +182 +183 +182 +182 +182 +181 +182 +182 +180 +180 +182 +181 +182 +182 +183 +182 +182 +12 +10 +11 +10 +10 +11 +11 +182 +183 +183 +182 +183 +181 +183 +182 +181 +182 +181 +181 +183 +182 +182 +182 +182 +182 +182 +183 +183 +183 +182 +183 +181 +10 +11 +9 +11 +10 +10 +10 +183 +182 +182 +183 +183 +182 +182 +181 +182 +183 +182 +182 +181 +183 +182 +181 +182 +182 +182 +182 +183 +185 +184 +183 +184 +9 +11 +9 +10 +10 +11 +10 +182 +182 +182 +182 +183 +182 +183 +182 +182 +183 +184 +182 +182 +183 +181 +181 +182 +181 +181 +182 +182 +183 +182 +182 +182 +12 +10 +7 +10 +8 +10 +10 +181 +181 +182 +182 +180 +183 +183 +183 +183 +182 +182 +182 +181 +180 +182 +182 +182 +184 +182 +183 +182 +183 +182 +183 +183 +12 +11 +7 +9 +10 +10 +8 +181 +182 +182 +183 +184 +186 +182 +181 +179 +182 +186 +182 +182 +183 +182 +186 +182 +182 +182 +182 +185 +181 +182 +183 +184 +12 +11 +12 +10 +10 +9 +11 +182 +182 +181 +181 +181 +182 +181 +182 +182 +182 +184 +183 +182 +182 +183 +182 +182 +182 +178 +183 +181 +182 +182 +182 +182 +12 +11 +11 +11 +11 +10 +11 +182 +183 +181 +183 +182 +182 +181 +181 +183 +181 +183 +182 +183 +183 +182 +182 +182 +182 +184 +183 +183 +182 +182 +182 +181 +12 +10 +11 +11 +11 +12 +10 +183 +182 +182 +182 +182 +182 +182 +182 +185 +183 +181 +182 +182 +182 +181 +182 +183 +184 +183 +184 +182 +183 +182 +182 +182 +11 +10 +10 +186 +182 +182 +183 +182 +182 +12 +10 +10 +11 +11 +11 +11 +182 +181 +181 +183 +184 +182 +182 +183 +182 +183 +183 +178 +182 +181 +182 +182 +186 +183 +184 +182 +182 +182 +186 +182 +182 +11 +12 +12 +10 +10 +10 +11 +183 +184 +182 +181 +183 +182 +183 +183 +182 +181 +181 +183 +182 +181 +182 +183 +183 +182 +180 +182 +182 +182 +183 +181 +182 +11 +10 +11 +11 +11 +8 +10 +182 +182 +183 +183 +182 +181 +183 +183 +182 +182 +182 +181 +182 +184 +183 +182 +11 +10 +11 +11 +12 +11 +11 +182 +181 +183 +182 +183 +181 +182 +182 +181 +183 +184 +181 +182 +182 +180 +182 +183 +183 +183 +181 +183 +182 +182 +181 +183 +11 +11 +12 +12 +10 +9 +10 +181 +183 +183 +181 +180 +182 +182 +184 +183 +182 +182 +182 +183 +183 +182 +181 +182 +182 +181 +181 +182 +183 +184 +182 +185 +11 +10 +10 +11 +11 +10 +11 +182 +182 +182 +182 +182 +183 +182 +182 +182 +184 +182 +183 +182 +181 +183 +182 +182 +183 +186 +181 +182 +181 +182 +183 +181 +11 +9 +12 +11 +11 +11 +7 +182 +182 +181 +183 +181 +181 +182 +183 +182 +180 +183 +182 +183 +183 +182 +182 +182 +182 +182 +183 +182 +183 +182 +182 +182 +10 +10 +11 +12 +11 +11 +11 +182 +181 +183 +182 +182 +181 +181 +182 +183 +183 +183 +183 +182 +182 +182 +183 +183 +181 +182 +182 +182 +183 +182 +181 +183 +11 +11 +11 +9 +11 +9 +11 +182 +181 +182 +182 +182 +182 +182 +183 +181 +183 +183 +182 +183 +181 +182 +182 +183 +183 +182 +183 +181 +184 +183 +184 +182 +11 +11 +11 +11 +12 +11 +11 +181 +182 +182 +182 +182 +183 +183 +182 +182 +183 +181 +181 +183 +182 +182 +182 +182 +181 +183 +180 +180 +182 +182 +183 +182 +13 +10 +11 +11 +10 +11 +9 +183 +182 +181 +183 +182 +183 +182 +181 +182 +182 +184 +183 +182 +182 +182 +182 +183 +183 +182 +182 +181 +183 +183 +184 +182 +12 +10 +11 +12 +11 +11 +10 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +180 +182 +182 +183 +182 +182 +182 +183 +183 +181 +182 +183 +184 +182 +183 +182 +181 +183 +184 +182 +182 +182 +181 +183 +13 +9 +8 +11 +11 +11 +11 +184 +184 +182 +183 +183 +182 +182 +182 +183 +183 +182 +182 +181 +184 +182 +182 +181 +182 +182 +183 +184 +182 +182 +182 +182 +12 +11 +11 +9 +10 +10 +11 +183 +183 +182 +181 +183 +183 +182 +182 +182 +183 +182 +181 +183 +182 +182 +182 +183 +182 +182 +182 +183 +181 +182 +182 +182 +12 +10 +10 +10 +12 +10 +12 +182 +181 +182 +179 +181 +182 +181 +182 +181 +183 +182 +184 +183 +184 +181 +177 +12 +11 +11 +10 +11 +11 +11 +182 +182 +182 +183 +182 +182 +183 +182 +182 +182 +183 +182 +182 +182 +182 +182 +183 +182 +184 +182 +182 +182 +182 +182 +182 +11 +10 +11 +11 +15 +10 +10 +182 +182 +183 +183 +183 +181 +182 +182 +183 +182 +180 +180 +182 +183 +183 +183 +183 +181 +183 +182 +182 +181 +182 +185 +182 +12 +10 +11 +11 +10 +10 +9 +181 +183 +182 +182 +182 +183 +182 +183 +183 +183 +181 +181 +182 +182 +183 +182 +182 +182 +182 +183 +182 +181 +183 +183 +182 +12 +11 +10 +15 +11 +12 +11 +182 +182 +183 +180 +181 +182 +183 +183 +182 +182 +181 +182 +183 +184 +182 +183 +181 +182 +182 +183 +183 +183 +185 +182 +183 +12 +9 +11 +11 +11 +11 +9 +181 +183 +182 +183 +182 +182 +182 +184 +182 +184 +182 +181 +182 +182 +181 +182 +182 +182 +184 +182 +183 +182 +182 +182 +181 +12 +11 +10 +10 +11 +12 +11 +183 +180 +184 +184 +180 +182 +182 +183 +182 +181 +182 +183 +183 +182 +182 +181 +183 +183 +184 +182 +181 +183 +182 +183 +183 +11 +9 +11 +11 +11 +10 +9 +182 +183 +183 +182 +182 +182 +182 +182 +183 +182 +180 +182 +182 +183 +183 +182 +181 +182 +182 +183 +182 +183 +182 +182 +182 +10 +10 +11 +12 +11 +10 +10 +182 +183 +185 +182 +182 +181 +181 +182 +183 +181 +181 +182 +183 +182 +183 +182 +182 +183 +182 +180 +182 +182 +182 +182 +182 +11 +11 +9 +11 +11 +11 +10 +182 +184 +184 +182 +183 +182 +182 +182 +182 +182 +184 +181 +182 +182 +182 +182 +182 +180 +183 +182 +183 +183 +181 +182 +182 +183 +183 +184 +182 +182 +183 +182 +182 +181 +12 +11 +11 +12 +11 +10 +10 +183 +183 +181 +180 +182 +184 +182 +182 +182 +182 +182 +182 +182 +181 +182 +183 +183 +179 +181 +182 +182 +182 +182 +182 +181 +11 +11 +11 +11 +9 +10 +11 +184 +185 +182 +182 +183 +183 +182 +183 +183 +183 +182 +182 +181 +181 +181 +182 +182 +182 +179 +182 +183 +181 +182 +183 +181 +183 +183 +183 +182 +182 +183 +182 +182 +181 +181 +183 +181 +181 +180 +184 +181 +180 +182 +183 +185 +181 +182 +182 +14 +12 +12 +10 +11 +11 +11 +182 +183 +182 +183 +182 +183 +184 +182 +181 +181 +182 +184 +183 +182 +181 +182 +184 +183 +183 +182 +179 +182 +182 +182 +181 +10 +12 +11 +10 +10 +10 +8 +182 +183 +182 +181 +182 +181 +181 +182 +182 +184 +183 +181 +182 +181 +183 +182 +180 +182 +183 +183 +182 +182 +181 +182 +183 +12 +10 +9 +11 +10 +11 +11 +181 +181 +183 +184 +182 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +183 +184 +182 +181 +182 +181 +182 +182 +180 +180 +12 +11 +11 +10 +10 +11 +10 +182 +183 +182 +182 +182 +182 +183 +183 +182 +182 +181 +184 +184 +183 +183 +181 +181 +182 +183 +182 +183 +182 +182 +182 +182 +10 +10 +11 +11 +11 +10 +11 +182 +182 +184 +183 +183 +181 +182 +181 +182 +183 +181 +182 +181 +183 +182 +182 +183 +182 +182 +183 +182 +183 +183 +182 +181 +12 +11 +13 +11 +12 +10 +9 +182 +181 +182 +182 +181 +182 +182 +182 +182 +182 +182 +177 +184 +182 +181 +183 +182 +183 +183 +181 +181 +183 +182 +183 +181 +12 +11 +11 +11 +9 +11 +11 +182 +182 +182 +182 +182 +183 +182 +182 +182 +182 +182 +183 +183 +183 +185 +182 +182 +182 +183 +183 +183 +183 +183 +182 +181 +11 +10 +11 +11 +12 +10 +10 +182 +184 +183 +182 +182 +182 +183 +182 +182 +182 +181 +182 +182 +181 +182 +183 +182 +182 +182 +182 +182 +183 +183 +182 +182 +11 +12 +11 +10 +10 +10 +11 +182 +183 +13 +11 +11 +10 +10 +12 +12 +182 +184 +182 +181 +182 +182 +182 +182 +181 +184 +184 +182 +184 +182 +183 +183 +183 +182 +182 +183 +181 +182 +182 +181 +183 +11 +9 +11 +11 +10 +11 +10 +182 +183 +182 +182 +181 +181 +183 +183 +182 +182 +181 +182 +183 +183 +182 +181 +182 +183 +184 +182 +182 +183 +182 +182 +183 +12 +11 +12 +10 +11 +7 +10 +182 +181 +182 +180 +182 +183 +181 +181 +183 +183 +181 +182 +182 +182 +181 +182 +12 +11 +10 +9 +10 +10 +12 +181 +182 +181 +182 +183 +181 +182 +182 +183 +182 +181 +182 +183 +183 +185 +181 +182 +182 +183 +183 +182 +182 +183 +182 +182 +11 +10 +10 +12 +10 +11 +11 +183 +182 +184 +185 +181 +181 +182 +183 +181 +181 +182 +182 +181 +182 +183 +182 +181 +183 +182 +181 +180 +181 +182 +183 +180 +12 +11 +9 +9 +11 +12 +10 +181 +183 +182 +182 +183 +183 +182 +182 +182 +183 +181 +182 +182 +183 +181 +183 +187 +183 +182 +182 +182 +183 +184 +182 +184 +11 +10 +11 +12 +11 +11 +10 +182 +182 +182 +182 +183 +182 +183 +182 +180 +183 +183 +182 +181 +182 +182 +184 +182 +184 +182 +181 +182 +182 +182 +182 +181 +12 +12 +12 +11 +11 +11 +11 +181 +183 +183 +183 +182 +181 +182 +182 +183 +183 +182 +182 +183 +183 +181 +181 +182 +182 +183 +181 +181 +182 +182 +182 +181 +12 +10 +11 +10 +11 +11 +10 +182 +181 +182 +182 +182 +182 +183 +184 +182 +182 +182 +182 +182 +182 +182 +182 +181 +183 +183 +181 +181 +182 +183 +182 +181 +12 +9 +11 +12 +10 +10 +8 +182 +183 +183 +183 +181 +183 +182 +182 +182 +183 +184 +183 +182 +182 +183 +183 +182 +183 +182 +182 +182 +182 +183 +182 +181 +12 +11 +11 +11 +11 +11 +10 +182 +182 +181 +181 +183 +177 +181 +182 +181 +184 +182 +182 +181 +183 +183 +184 +184 +181 +181 +182 +182 +182 +182 +182 +184 +11 +10 +10 +10 +11 +15 +10 +182 +183 +183 +182 +182 +183 +182 +183 +182 +181 +183 +181 +182 +183 +182 +182 +182 +182 +180 +183 +183 +181 +180 +182 +182 +183 +181 +182 +182 +183 +184 +182 +181 +182 +11 +12 +11 +11 +10 +11 +12 +183 +181 +181 +182 +182 +182 +182 +182 +182 +182 +182 +184 +182 +181 +182 +182 +182 +183 +181 +182 +183 +186 +183 +182 +182 +11 +11 +11 +10 +10 +11 +11 +181 +183 +183 +182 +182 +182 +182 +182 +183 +181 +180 +183 +182 +184 +182 +182 +181 +182 +183 +181 +183 +182 +183 +180 +183 +12 +10 +10 +11 +12 +10 +10 +181 +182 +183 +184 +183 +181 +182 +183 +182 +181 +182 +182 +181 +182 +179 +180 +12 +11 +11 +10 +11 +10 +13 +182 +181 +181 +181 +181 +182 +182 +182 +182 +182 +183 +181 +182 +182 +179 +182 +182 +183 +184 +180 +181 +182 +183 +182 +184 +11 +10 +10 +10 +10 +10 +10 +182 +182 +182 +182 +182 +183 +182 +180 +182 +183 +182 +181 +181 +181 +181 +183 +183 +181 +182 +182 +182 +181 +181 +182 +181 +10 +10 +10 +9 +11 +10 +10 +182 +182 +182 +181 +183 +184 +182 +182 +184 +183 +182 +180 +182 +182 +182 +183 +184 +182 +181 +183 +185 +183 +183 +182 +184 +12 +10 +11 +11 +11 +11 +11 +181 +182 +183 +182 +183 +182 +183 +181 +183 +182 +183 +182 +182 +182 +182 +182 +181 +182 +183 +183 +183 +182 +181 +182 +181 +13 +12 +8 +10 +10 +11 +10 +183 +184 +182 +183 +182 +182 +183 +183 +182 +182 +181 +181 +183 +183 +182 +181 +182 +182 +183 +183 +182 +182 +183 +182 +182 +12 +11 +11 +11 +10 +11 +10 +181 +182 +182 +181 +182 +186 +183 +183 +181 +181 +183 +183 +182 +182 +182 +181 +182 +182 +182 +183 +184 +183 +182 +177 +181 +13 +11 +10 +10 +10 +11 +11 +182 +182 +181 +182 +183 +182 +183 +182 +182 +182 +182 +180 +182 +182 +182 +181 +183 +182 +183 +184 +182 +179 +182 +182 +185 +11 +12 +10 +11 +10 +11 +10 +182 +181 +182 +182 +182 +182 +183 +183 +182 +182 +183 +182 +183 +183 +182 +181 +183 +183 +182 +180 +182 +183 +182 +183 +182 +13 +11 +10 +11 +10 +11 +11 +181 +181 +183 +184 +182 +182 +183 +183 +184 +183 +182 +182 +182 +182 +182 +182 +182 +181 +183 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +184 +182 +183 +181 +182 +12 +12 +10 +10 +10 +10 +12 +182 +183 +183 +184 +185 +182 +182 +182 +179 +182 +182 +181 +182 +181 +182 +182 +184 +182 +184 +181 +181 +182 +181 +182 +184 +12 +10 +11 +11 +11 +11 +11 +182 +182 +182 +183 +181 +181 +183 +183 +181 +182 +182 +182 +182 +182 +176 +181 +182 +182 +184 +182 +182 +181 +182 +182 +182 +11 +9 +10 +181 +182 +183 +182 +183 +181 +182 +183 +182 +182 +183 +183 +188 +183 +182 +181 +183 +186 +182 +183 +12 +11 +12 +10 +11 +10 +11 +182 +180 +183 +183 +182 +182 +183 +182 +182 +183 +182 +183 +185 +183 +184 +183 +181 +182 +183 +181 +181 +183 +181 +181 +180 +12 +10 +11 +11 +10 +10 +10 +182 +182 +181 +181 +182 +182 +183 +183 +182 +182 +182 +182 +184 +182 +182 +181 +180 +183 +182 +180 +182 +181 +181 +182 +182 +12 +11 +10 +11 +10 +12 +11 +182 +181 +182 +183 +182 +182 +182 +181 +182 +182 +183 +183 +182 +182 +183 +182 +181 +182 +181 +183 +183 +184 +182 +183 +183 +11 +10 +10 +10 +11 +10 +10 +182 +182 +182 +182 +182 +182 +182 +183 +183 +182 +182 +182 +185 +183 +179 +183 +182 +181 +182 +183 +184 +182 +182 +182 +181 +13 +12 +10 +11 +11 +11 +10 +181 +183 +181 +183 +183 +182 +181 +181 +183 +182 +183 +181 +181 +183 +183 +183 +183 +185 +183 +183 +182 +182 +182 +182 +182 +13 +12 +10 +10 +10 +11 +11 +182 +183 +181 +181 +183 +183 +181 +181 +183 +182 +183 +182 +182 +179 +182 +183 +184 +181 +181 +182 +182 +183 +183 +182 +181 +12 +11 +10 +10 +10 +11 +10 +182 +182 +182 +183 +182 +182 +182 +181 +182 +183 +180 +182 +183 +182 +183 +181 +179 +180 +183 +183 +184 +182 +182 +183 +182 +12 +11 +11 +10 +11 +11 +11 +182 +181 +182 +182 +183 +185 +182 +182 +183 +183 +183 +183 +185 +182 +182 +183 +182 +182 +184 +182 +182 +182 +182 +183 +183 +12 +12 +10 +11 +10 +11 +12 +181 +181 +182 +182 +182 +182 +10 +10 +9 +182 +183 +181 +180 +182 +182 +183 +182 +182 +181 +183 +182 +185 +182 +184 +182 +182 +178 +183 +182 +182 +182 +184 +185 +182 +12 +10 +9 +11 +12 +11 +10 +182 +182 +182 +180 +182 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +181 +183 +182 +183 +12 +10 +10 +10 +11 +10 +11 +183 +180 +183 +182 +182 +183 +185 +181 +181 +182 +184 +182 +183 +182 +182 +183 +181 +182 +10 +10 +12 +10 +10 +181 +181 +183 +183 +182 +181 +182 +182 +183 +183 +180 +180 +182 +182 +182 +181 +182 +181 +181 +181 +181 +182 +183 +182 +182 +11 +10 +10 +10 +10 +10 +11 +181 +181 +182 +182 +182 +181 +182 +179 +181 +181 +183 +183 +182 +179 +182 +183 +183 +181 +180 +181 +181 +182 +183 +181 +181 +11 +11 +10 +10 +10 +10 +12 +182 +181 +182 +181 +182 +181 +182 +182 +182 +182 +183 +183 +182 +181 +182 +181 +182 +184 +185 +182 +179 +182 +182 +183 +182 +12 +10 +13 +12 +13 +10 +8 +186 +182 +182 +183 +182 +178 +182 +182 +181 +183 +184 +182 +181 +182 +183 +183 +182 +182 +182 +183 +183 +182 +182 +183 +182 +11 +11 +10 +10 +10 +10 +10 +182 +183 +181 +182 +181 +182 +183 +182 +182 +183 +184 +182 +183 +182 +181 +183 +184 +181 +181 +182 +182 +182 +181 +182 +181 +12 +11 +11 +10 +10 +12 +12 +181 +181 +182 +182 +184 +182 +182 +182 +182 +181 +182 +182 +182 +181 +182 +183 +183 +182 +182 +181 +184 +182 +182 +182 +181 +11 +11 +12 +11 +11 +10 +9 +182 +184 +182 +181 +182 +183 +183 +181 +182 +182 +184 +182 +183 +182 +182 +183 +183 +181 +180 +182 +182 +182 +182 +181 +182 +12 +10 +10 +12 +12 +11 +11 +182 +181 +182 +183 +183 +182 +182 +184 +184 +182 +183 +182 +182 +183 +184 +181 +181 +182 +182 +182 +181 +182 +180 +183 +183 +12 +10 +9 +10 +10 +11 +10 +182 +182 +182 +182 +182 +182 +183 +181 +182 +181 +182 +183 +181 +182 +182 +183 +179 +182 +181 +182 +182 +182 +181 +183 +182 +11 +11 +10 +10 +182 +182 +182 +183 +183 +12 +11 +10 +9 +12 +11 +9 +181 +181 +183 +183 +184 +181 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +184 +183 +183 +181 +181 +182 +182 +12 +11 +11 +10 +10 +12 +11 +183 +182 +182 +182 +182 +182 +182 +182 +183 +180 +182 +182 +184 +182 +183 +182 +181 +183 +183 +186 +182 +182 +181 +182 +185 +11 +10 +12 +10 +10 +10 +10 +182 +181 +182 +182 +182 +182 +181 +182 +183 +182 +183 +182 +181 +183 +181 +181 +12 +11 +12 +10 +11 +10 +9 +184 +183 +183 +182 +183 +182 +183 +182 +181 +182 +183 +182 +182 +182 +182 +183 +182 +182 +182 +182 +183 +182 +182 +183 +182 +11 +11 +12 +9 +8 +8 +11 +183 +181 +182 +182 +183 +182 +180 +180 +181 +182 +183 +183 +181 +182 +182 +184 +182 +182 +182 +182 +183 +183 +182 +181 +182 +11 +11 +10 +10 +11 +12 +10 +174 +182 +182 +181 +184 +181 +181 +182 +182 +181 +179 +183 +182 +182 +182 +183 +183 +181 +183 +184 +182 +182 +182 +181 +182 +11 +10 +10 +8 +11 +11 +10 +181 +182 +183 +182 +184 +181 +181 +183 +184 +181 +182 +183 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +12 +8 +10 +12 +11 +10 +9 +182 +182 +184 +182 +182 +183 +182 +181 +182 +182 +181 +182 +181 +185 +182 +182 +182 +186 +183 +183 +182 +181 +180 +183 +182 +12 +9 +8 +11 +11 +11 +11 +182 +182 +182 +183 +182 +182 +179 +182 +183 +182 +182 +182 +183 +183 +182 +183 +182 +181 +183 +182 +183 +182 +183 +182 +182 +12 +11 +12 +12 +10 +9 +11 +182 +180 +183 +182 +181 +182 +183 +181 +180 +182 +182 +183 +182 +182 +182 +183 +184 +182 +182 +184 +182 +180 +183 +183 +183 +11 +10 +11 +11 +10 +10 +11 +184 +181 +181 +182 +182 +182 +182 +181 +181 +182 +183 +182 +182 +181 +182 +183 +185 +182 +182 +182 +182 +183 +183 +182 +182 +12 +11 +11 +11 +10 +11 +11 +182 +181 +182 +183 +184 +182 +181 +182 +183 +182 +183 +182 +182 +183 +183 +182 +181 +181 +183 +182 +182 +181 +182 +183 +184 +182 +180 +182 +182 +182 +181 +182 +183 +184 +11 +11 +11 +11 +11 +11 +10 +182 +182 +182 +181 +182 +182 +184 +181 +182 +182 +183 +181 +182 +183 +181 +182 +183 +185 +181 +182 +182 +183 +182 +183 +182 +11 +11 +12 +11 +10 +11 +12 +182 +182 +182 +182 +182 +182 +180 +182 +183 +183 +181 +182 +182 +184 +181 +182 +181 +182 +182 +183 +182 +182 +181 +181 +183 +13 +10 +11 +7 +10 +13 +183 +183 +182 +180 +182 +181 +184 +183 +182 +180 +182 +182 +182 +183 +182 +181 +183 +13 +12 +10 +10 +10 +11 +10 +182 +182 +181 +181 +183 +183 +181 +182 +181 +183 +182 +182 +182 +183 +182 +182 +183 +183 +182 +182 +183 +181 +182 +180 +184 +12 +10 +9 +11 +11 +11 +11 +181 +182 +182 +182 +182 +182 +181 +183 +184 +183 +182 +182 +180 +183 +183 +183 +182 +182 +183 +183 +182 +183 +182 +182 +181 +12 +11 +11 +10 +10 +10 +11 +182 +181 +182 +181 +182 +183 +182 +181 +181 +183 +183 +182 +181 +181 +182 +182 +181 +182 +182 +182 +182 +183 +183 +180 +182 +13 +9 +10 +10 +10 +10 +11 +182 +182 +179 +182 +183 +182 +182 +182 +183 +182 +183 +181 +182 +182 +181 +183 +182 +182 +183 +182 +181 +182 +183 +183 +182 +10 +10 +10 +11 +11 +10 +11 +182 +183 +183 +182 +182 +182 +182 +181 +184 +183 +182 +182 +181 +182 +183 +182 +183 +181 +182 +182 +183 +182 +182 +182 +182 +12 +11 +10 +10 +11 +10 +12 +182 +183 +183 +183 +184 +182 +182 +182 +182 +179 +183 +183 +182 +183 +182 +182 +182 +183 +182 +183 +182 +181 +182 +182 +183 +10 +8 +10 +11 +11 +10 +11 +181 +182 +183 +182 +182 +182 +183 +182 +182 +181 +183 +182 +183 +182 +180 +183 +182 +182 +182 +183 +181 +183 +182 +180 +181 +11 +11 +9 +10 +11 +11 +12 +181 +181 +179 +183 +182 +182 +182 +182 +185 +182 +181 +182 +181 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +181 +12 +11 +11 +9 +12 +11 +10 +182 +182 +182 +182 +182 +182 +180 +183 +182 +183 +181 +184 +182 +182 +182 +183 +184 +182 +181 +183 +183 +181 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +11 +11 +11 +11 +11 +11 +10 +180 +179 +182 +182 +182 +183 +182 +183 +182 +181 +182 +183 +182 +182 +181 +182 +182 +182 +183 +183 +182 +182 +182 +180 +180 +12 +10 +12 +12 +11 +11 +11 +181 +183 +182 +182 +182 +184 +182 +182 +182 +183 +182 +181 +182 +181 +182 +183 +182 +183 +181 +182 +181 +13 +9 +181 +181 +186 +182 +182 +182 +184 +183 +181 +182 +180 +184 +183 +182 +182 +182 +183 +186 +182 +182 +182 +182 +183 +181 +181 +12 +13 +11 +10 +10 +10 +10 +183 +182 +181 +182 +182 +181 +181 +182 +182 +182 +182 +181 +182 +182 +183 +184 +181 +181 +183 +183 +182 +181 +185 +182 +183 +12 +10 +8 +10 +10 +10 +10 +180 +183 +182 +182 +181 +183 +181 +181 +182 +183 +181 +181 +182 +183 +182 +182 +182 +183 +181 +181 +183 +183 +183 +181 +182 +12 +11 +10 +10 +10 +11 +11 +181 +182 +183 +182 +182 +182 +182 +183 +182 +182 +182 +183 +181 +181 +183 +183 +184 +181 +182 +182 +182 +182 +182 +181 +182 +12 +10 +10 +10 +11 +10 +8 +180 +182 +183 +182 +181 +182 +183 +184 +182 +181 +182 +182 +183 +181 +181 +183 +185 +182 +183 +183 +182 +183 +183 +182 +181 +12 +11 +9 +9 +10 +11 +11 +181 +182 +182 +182 +182 +179 +180 +182 +182 +182 +183 +182 +182 +182 +182 +181 +182 +183 +184 +182 +182 +182 +182 +182 +183 +11 +11 +11 +10 +11 +12 +13 +181 +182 +182 +184 +182 +183 +182 +181 +184 +183 +182 +182 +182 +182 +182 +182 +181 +181 +183 +183 +182 +183 +183 +182 +182 +12 +10 +11 +11 +12 +12 +11 +182 +182 +182 +183 +182 +181 +183 +183 +182 +181 +182 +182 +182 +182 +182 +183 +182 +182 +182 +183 +183 +181 +181 +182 +183 +12 +9 +10 +11 +13 +10 +10 +182 +183 +184 +183 +182 +181 +182 +183 +182 +182 +182 +182 +183 +183 +182 +182 +182 +184 +180 +181 +182 +184 +182 +181 +182 +13 +11 +11 +11 +11 +10 +10 +181 +184 +14 +11 +11 +11 +10 +10 +11 +183 +182 +182 +182 +181 +183 +182 +183 +183 +183 +183 +182 +182 +182 +182 +182 +177 +183 +182 +182 +182 +182 +182 +182 +182 +12 +10 +11 +11 +11 +12 +11 +182 +182 +181 +183 +182 +183 +183 +182 +183 +180 +182 +183 +182 +181 +182 +184 +182 +181 +182 +180 +182 +182 +182 +183 +181 +11 +10 +11 +10 +10 +11 +11 +182 +180 +182 +182 +182 +181 +182 +180 +179 +181 +182 +183 +180 +182 +182 +182 +11 +11 +11 +10 +11 +10 +11 +182 +183 +182 +181 +181 +182 +182 +183 +184 +182 +182 +182 +181 +182 +182 +183 +184 +184 +183 +182 +183 +182 +183 +182 +182 +12 +11 +10 +9 +8 +13 +10 +183 +184 +182 +183 +182 +180 +182 +182 +183 +185 +182 +182 +182 +182 +182 +180 +180 +181 +182 +183 +183 +182 +182 +184 +181 +13 +11 +13 +11 +12 +10 +9 +182 +181 +182 +182 +182 +182 +183 +182 +183 +183 +182 +182 +181 +181 +183 +182 +185 +183 +184 +182 +182 +185 +182 +183 +181 +13 +9 +11 +10 +11 +10 +11 +183 +182 +182 +183 +183 +182 +181 +183 +182 +182 +182 +182 +183 +183 +183 +182 +176 +183 +182 +183 +182 +182 +182 +182 +183 +11 +10 +11 +12 +10 +10 +12 +181 +182 +183 +182 +182 +184 +182 +182 +182 +182 +182 +182 +182 +183 +183 +183 +182 +182 +182 +182 +182 +183 +182 +182 +182 +11 +9 +11 +12 +10 +12 +10 +182 +182 +181 +182 +182 +182 +182 +182 +183 +182 +182 +181 +182 +183 +183 +184 +183 +182 +182 +181 +181 +182 +182 +185 +184 +13 +10 +11 +11 +9 +12 +11 +182 +183 +181 +180 +182 +182 +183 +184 +182 +183 +181 +181 +182 +182 +182 +182 +183 +182 +182 +182 +182 +182 +183 +182 +180 +12 +10 +11 +12 +11 +11 +10 +181 +182 +182 +182 +183 +184 +182 +184 +181 +182 +183 +182 +182 +183 +183 +182 +182 +182 +181 +181 +182 +185 +183 +183 +185 +12 +11 +10 +10 +11 +11 +11 +182 +183 +182 +182 +182 +182 +180 +182 +183 +183 +181 +180 +181 +182 +183 +183 +183 +182 +182 +181 +182 +183 +183 +184 +183 +182 +182 +181 +180 +180 +183 +183 +183 +183 +12 +11 +11 +11 +12 +11 +12 +182 +182 +181 +182 +183 +182 +183 +182 +182 +184 +183 +183 +183 +181 +182 +181 +182 +183 +182 +181 +182 +182 +182 +182 +184 +13 +12 +10 +11 +9 +8 +11 +182 +183 +183 +182 +183 +182 +181 +182 +182 +183 +182 +182 +182 +182 +182 +184 +180 +181 +182 +183 +183 +182 +182 +182 +183 +13 +10 +10 +10 +9 +11 +10 +182 +182 +183 +182 +182 +182 +181 +180 +176 +183 +182 +182 +183 +181 +183 +183 +11 +11 +10 +11 +10 +10 +12 +183 +182 +182 +182 +180 +183 +181 +182 +184 +183 +179 +182 +181 +183 +183 +183 +182 +183 +182 +183 +182 +182 +180 +182 +182 +11 +10 +10 +11 +13 +11 +10 +183 +181 +182 +182 +183 +183 +182 +183 +185 +182 +183 +183 +183 +182 +182 +181 +179 +182 +182 +184 +183 +181 +183 +184 +180 +13 +9 +9 +10 +11 +10 +9 +182 +181 +182 +182 +184 +182 +183 +181 +183 +182 +181 +181 +181 +183 +184 +183 +183 +182 +181 +182 +182 +182 +183 +181 +182 +14 +10 +10 +8 +10 +10 +10 +181 +180 +183 +182 +183 +184 +182 +183 +182 +182 +181 +183 +183 +183 +182 +182 +182 +182 +182 +182 +178 +181 +182 +183 +181 +11 +11 +10 +10 +10 +10 +12 +183 +182 +182 +182 +181 +181 +182 +182 +184 +183 +182 +182 +182 +183 +183 +182 +182 +182 +181 +180 +180 +182 +182 +182 +182 +11 +10 +11 +11 +10 +9 +10 +182 +183 +182 +182 +182 +182 +182 +182 +180 +183 +182 +183 +183 +182 +182 +183 +182 +180 +182 +182 +183 +183 +184 +183 +184 +11 +10 +10 +10 +10 +10 +12 +183 +182 +183 +182 +181 +182 +182 +181 +182 +182 +182 +182 +183 +181 +182 +183 +182 +186 +184 +182 +183 +182 +185 +183 +182 +10 +10 +9 +10 +10 +11 +12 +183 +183 +182 +182 +181 +181 +182 +183 +185 +183 +182 +182 +183 +182 +183 +180 +181 +182 +182 +183 +182 +182 +182 +181 +182 +12 +11 +11 +9 +8 +10 +10 +182 +184 +182 +182 +182 +182 +182 +183 +183 +182 +182 +182 +181 +182 +182 +183 +183 +183 +183 +183 +182 +181 +182 +182 +180 +182 +183 +183 +184 +183 +183 +182 +182 +181 +12 +10 +11 +11 +10 +10 +11 +183 +182 +179 +183 +181 +182 +183 +181 +183 +182 +182 +182 +182 +182 +181 +182 +182 +182 +183 +182 +182 +182 +183 +184 +179 +13 +10 +10 +11 +10 +11 +10 +182 +182 +181 +182 +182 +182 +183 +182 +183 +183 +182 +182 +183 +183 +182 +182 +182 +182 +182 +181 +183 +181 +183 +183 +181 +10 +10 +10 +182 +183 +182 +183 +181 +182 +187 +182 +183 +183 +182 +181 +182 +181 +182 +182 +183 +183 +182 +182 +10 +11 +11 +10 +10 +10 +11 +182 +182 +182 +182 +183 +182 +182 +181 +181 +183 +183 +183 +182 +180 +180 +180 +182 +182 +182 +182 +182 +183 +184 +182 +183 +10 +9 +9 +10 +10 +12 +11 +183 +183 +181 +182 +181 +182 +182 +182 +182 +182 +183 +182 +182 +184 +182 +182 +182 +182 +182 +182 +182 +182 +181 +181 +182 +11 +10 +10 +11 +11 +10 +10 +182 +182 +182 +182 +182 +181 +181 +183 +182 +183 +183 +182 +181 +182 +182 +182 +181 +180 +182 +182 +183 +181 +181 +181 +183 +12 +11 +10 +11 +10 +11 +11 +182 +182 +183 +182 +182 +183 +181 +182 +182 +181 +182 +182 +183 +183 +182 +183 +177 +183 +182 +182 +181 +182 +182 +182 +183 +12 +10 +11 +10 +10 +12 +11 +186 +183 +183 +183 +185 +183 +186 +182 +181 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +182 +183 +181 +182 +182 +182 +13 +13 +11 +11 +12 +10 +12 +181 +182 +182 +182 +182 +181 +181 +182 +182 +183 +182 +183 +184 +182 +184 +182 +182 +182 +183 +183 +184 +182 +181 +182 +182 +12 +10 +11 +11 +11 +10 +10 +182 +181 +181 +182 +182 +183 +184 +184 +182 +184 +181 +182 +182 +182 +183 +182 +182 +183 +182 +182 +182 +183 +182 +183 +182 +11 +11 +10 +10 +11 +10 +11 +184 +183 +184 +182 +182 +181 +181 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +183 +182 +183 +184 +184 +182 +179 +11 +10 +9 +12 +10 +11 +11 +184 +182 +182 +182 +183 +182 +181 +11 +9 +182 +183 +184 +183 +182 +182 +182 +183 +184 +182 +184 +182 +183 +182 +182 +183 +182 +183 +183 +182 +182 +182 +182 +182 +182 +13 +10 +10 +12 +10 +11 +12 +183 +182 +182 +182 +181 +182 +182 +182 +184 +184 +184 +183 +183 +181 +182 +182 +181 +182 +181 +182 +182 +183 +183 +183 +182 +11 +7 +9 +9 +10 +10 +11 +183 +183 +182 +182 +183 +183 +182 +184 +182 +181 +182 +183 +182 +181 +182 +182 +183 +182 +183 +9 +11 +11 +11 +183 +182 +182 +182 +182 +182 +184 +182 +179 +182 +182 +181 +182 +182 +183 +184 +182 +181 +182 +178 +181 +183 +182 +184 +182 +12 +11 +11 +10 +11 +11 +11 +182 +183 +182 +182 +179 +181 +183 +188 +183 +183 +182 +182 +181 +181 +182 +182 +184 +184 +184 +182 +181 +182 +183 +182 +181 +11 +9 +10 +9 +12 +11 +13 +183 +183 +181 +182 +182 +181 +182 +182 +181 +183 +182 +181 +181 +182 +182 +183 +182 +181 +182 +182 +183 +183 +182 +179 +182 +11 +11 +11 +10 +12 +12 +11 +184 +182 +182 +182 +182 +182 +183 +182 +181 +180 +182 +182 +182 +183 +182 +184 +183 +182 +182 +181 +182 +182 +182 +182 +182 +12 +10 +10 +10 +10 +11 +10 +182 +181 +182 +181 +182 +182 +182 +183 +183 +183 +183 +182 +180 +180 +182 +183 +183 +182 +182 +182 +182 +182 +181 +183 +183 +13 +12 +10 +9 +10 +10 +9 +181 +182 +182 +183 +185 +182 +182 +178 +182 +182 +181 +182 +182 +182 +182 +182 +183 +184 +182 +182 +182 +181 +182 +182 +182 +13 +11 +11 +13 +10 +12 +10 +182 +183 +181 +182 +183 +182 +178 +180 +182 +183 +183 +180 +182 +182 +181 +182 +181 +183 +182 +184 +182 +182 +182 +182 +182 +12 +9 +11 +10 +11 +11 +12 +182 +180 +182 +181 +182 +183 +182 +183 +183 +179 +182 +182 +182 +182 +183 +183 +185 +183 +183 +182 +183 +182 +182 +182 +184 +12 +12 +11 +10 +10 +10 +9 +183 +182 +183 +182 +182 +181 +182 +181 +182 +182 +184 +183 +182 +182 +182 +181 +183 +182 +182 +181 +181 +183 +181 +183 +183 +13 +10 +10 +10 +10 +183 +184 +183 +183 +11 +12 +10 +9 +10 +9 +9 +182 +183 +183 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +182 +182 +181 +182 +183 +183 +182 +182 +183 +182 +180 +183 +11 +10 +10 +10 +10 +10 +11 +182 +183 +179 +181 +181 +182 +181 +176 +183 +183 +183 +183 +181 +182 +182 +182 +181 +184 +182 +182 +183 +183 +185 +182 +182 +12 +11 +10 +10 +10 +11 +9 +181 +182 +182 +185 +183 +183 +182 +180 +182 +182 +182 +181 +182 +182 +183 +184 +13 +11 +15 +12 +10 +11 +10 +181 +182 +183 +182 +183 +182 +183 +183 +183 +183 +182 +182 +182 +181 +183 +183 +183 +182 +182 +182 +182 +182 +183 +183 +182 +11 +11 +11 +10 +11 +11 +11 +184 +181 +183 +182 +182 +182 +183 +182 +183 +182 +183 +180 +180 +182 +182 +183 +186 +182 +181 +182 +182 +187 +182 +181 +182 +11 +14 +12 +10 +10 +11 +10 +182 +182 +182 +182 +183 +182 +183 +183 +182 +182 +180 +182 +182 +182 +182 +182 +184 +182 +183 +183 +182 +182 +182 +182 +183 +12 +10 +10 +10 +10 +9 +10 +182 +181 +180 +182 +183 +182 +182 +183 +182 +182 +184 +182 +183 +182 +181 +181 +183 +182 +182 +182 +183 +183 +181 +180 +181 +14 +9 +11 +11 +11 +13 +11 +183 +182 +184 +182 +182 +182 +180 +182 +182 +183 +183 +182 +182 +180 +182 +183 +182 +183 +183 +182 +182 +182 +182 +181 +182 +10 +11 +12 +11 +11 +10 +11 +182 +182 +183 +184 +182 +185 +184 +182 +182 +181 +183 +182 +182 +182 +182 +182 +181 +183 +182 +183 +183 +183 +183 +182 +182 +11 +10 +11 +10 +11 +11 +11 +184 +182 +184 +182 +182 +182 +181 +181 +181 +182 +182 +182 +182 +183 +182 +183 +183 +183 +183 +182 +182 +182 +180 +180 +182 +13 +12 +11 +11 +11 +12 +9 +182 +181 +182 +182 +182 +183 +182 +182 +183 +182 +183 +181 +181 +182 +181 +182 +182 +182 +181 +182 +186 +183 +181 +183 +182 +12 +11 +10 +11 +11 +11 +11 +182 +183 +182 +183 +182 +181 +182 +182 +180 +181 +182 +181 +181 +182 +183 +182 +183 +183 +182 +182 +181 +183 +182 +182 +182 +182 +183 +183 +182 +184 +182 +183 +182 +181 +12 +11 +10 +12 +10 +11 +11 +182 +183 +183 +180 +183 +182 +182 +182 +182 +183 +182 +182 +181 +182 +182 +182 +184 +183 +184 +183 +183 +181 +182 +182 +180 +12 +9 +11 +11 +11 +11 +10 +183 +182 +182 +180 +180 +182 +183 +184 +183 +182 +183 +181 +180 +182 +182 +182 +182 +182 +182 +183 +180 +181 +181 +183 +183 +11 +11 +10 +10 +10 +9 +11 +182 +183 +183 +182 +181 +182 +181 +183 +181 +183 +182 +183 +183 +184 +182 +184 +12 +9 +11 +9 +10 +11 +12 +182 +182 +181 +182 +182 +181 +181 +182 +183 +183 +183 +182 +183 +182 +181 +182 +183 +182 +181 +181 +182 +182 +181 +180 +181 +11 +10 +11 +10 +11 +13 +10 +182 +182 +183 +183 +183 +181 +181 +182 +180 +181 +181 +182 +184 +184 +183 +183 +182 +182 +181 +182 +183 +182 +183 +183 +183 +12 +10 +12 +11 +10 +11 +11 +182 +183 +182 +181 +182 +180 +180 +182 +182 +183 +184 +182 +181 +182 +182 +182 +183 +181 +183 +183 +182 +182 +184 +182 +182 +12 +11 +13 +11 +10 +10 +9 +181 +182 +182 +182 +182 +184 +182 +182 +182 +182 +183 +181 +182 +181 +183 +182 +183 +183 +182 +182 +184 +182 +181 +181 +182 +12 +11 +10 +11 +10 +10 +10 +182 +182 +182 +182 +183 +182 +184 +182 +181 +182 +181 +182 +183 +182 +183 +182 +183 +180 +180 +182 +183 +182 +182 +182 +181 +9 +11 +11 +10 +10 +10 +11 +182 +182 +183 +182 +182 +183 +181 +181 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +181 +182 +182 +182 +183 +183 +183 +10 +8 +11 +10 +11 +12 +11 +183 +183 +182 +182 +181 +182 +182 +182 +182 +182 +183 +183 +183 +184 +182 +185 +182 +181 +182 +182 +183 +183 +184 +182 +183 +11 +10 +10 +11 +11 +10 +8 +180 +183 +183 +183 +183 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +183 +182 +12 +11 +11 +11 +11 +8 +9 +183 +182 +182 +182 +182 +181 +182 +182 +181 +183 +183 +183 +184 +183 +183 +185 +182 +181 +181 +182 +183 +182 +182 +182 +183 +180 +182 +181 +183 +182 +182 +183 +182 +182 +12 +10 +11 +10 +10 +11 +11 +182 +183 +182 +182 +182 +182 +182 +182 +182 +183 +184 +182 +184 +181 +182 +182 +181 +183 +182 +183 +184 +182 +182 +182 +181 +11 +10 +11 +11 +11 +10 +9 +182 +182 +182 +182 +182 +182 +183 +182 +182 +181 +182 +182 +182 +182 +181 +181 +181 +182 +183 +181 +182 +183 +182 +182 +181 +12 +183 +185 +182 +181 +182 +181 +182 +183 +183 +183 +183 +182 +181 +183 +183 +182 +184 +183 +183 +182 +182 +183 +12 +11 +11 +11 +12 +9 +11 +182 +183 +179 +183 +182 +183 +182 +184 +184 +183 +183 +182 +181 +183 +182 +182 +184 +183 +185 +181 +182 +182 +183 +185 +182 +11 +11 +11 +14 +11 +11 +10 +182 +185 +183 +181 +184 +182 +182 +181 +181 +182 +182 +182 +184 +182 +182 +183 +183 +183 +183 +182 +182 +183 +182 +182 +181 +11 +10 +11 +12 +12 +11 +10 +182 +181 +182 +182 +182 +183 +182 +183 +182 +181 +183 +182 +183 +182 +182 +182 +182 +182 +182 +180 +181 +182 +182 +184 +183 +12 +12 +11 +11 +10 +11 +10 +182 +182 +181 +182 +183 +183 +182 +184 +184 +183 +182 +181 +181 +181 +183 +182 +183 +179 +182 +184 +183 +180 +182 +181 +181 +13 +11 +11 +10 +10 +9 +11 +182 +182 +183 +181 +183 +182 +181 +182 +184 +182 +183 +182 +182 +184 +182 +182 +181 +184 +183 +184 +183 +182 +182 +182 +182 +11 +10 +10 +10 +10 +11 +10 +184 +183 +182 +182 +181 +181 +182 +182 +183 +183 +184 +182 +182 +182 +183 +182 +182 +182 +181 +181 +181 +183 +183 +183 +183 +12 +10 +10 +10 +11 +10 +12 +182 +184 +181 +182 +182 +182 +182 +183 +181 +179 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +183 +183 +183 +184 +12 +12 +11 +10 +11 +11 +11 +183 +182 +182 +183 +182 +182 +180 +182 +183 +183 +182 +181 +182 +182 +183 +182 +181 +183 +182 +183 +182 +183 +183 +182 +183 +12 +11 +11 +10 +10 +10 +10 +182 +182 +182 +11 +10 +8 +11 +10 +10 +183 +182 +183 +183 +183 +182 +182 +181 +181 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +11 +9 +10 +11 +12 +12 +11 +183 +182 +182 +182 +184 +182 +182 +182 +182 +182 +181 +182 +182 +180 +186 +182 +183 +183 +183 +181 +182 +181 +182 +182 +181 +14 +10 +12 +11 +14 +11 +10 +182 +182 +182 +180 +182 +181 +180 +182 +182 +183 +182 +182 +182 +181 +182 +183 +183 +11 +11 +11 +10 +10 +10 +183 +182 +182 +181 +183 +184 +181 +182 +181 +182 +184 +182 +182 +181 +182 +179 +182 +181 +179 +182 +187 +182 +181 +182 +182 +8 +10 +9 +11 +10 +10 +9 +182 +182 +185 +182 +181 +181 +181 +183 +182 +183 +182 +183 +183 +180 +179 +182 +181 +182 +182 +183 +182 +183 +182 +182 +182 +12 +11 +11 +10 +10 +10 +10 +179 +179 +181 +182 +182 +181 +182 +182 +183 +184 +184 +184 +183 +182 +182 +181 +182 +181 +182 +183 +182 +182 +183 +182 +182 +11 +9 +11 +11 +10 +12 +11 +182 +182 +181 +181 +182 +182 +182 +181 +182 +182 +184 +184 +182 +182 +182 +182 +180 +182 +182 +182 +182 +182 +182 +182 +183 +11 +10 +9 +11 +11 +11 +12 +183 +183 +181 +181 +182 +183 +182 +182 +181 +181 +182 +182 +182 +183 +182 +184 +183 +182 +181 +182 +180 +181 +181 +182 +183 +14 +12 +10 +10 +11 +10 +12 +183 +183 +182 +182 +182 +183 +182 +182 +183 +183 +181 +180 +182 +182 +182 +183 +183 +183 +183 +181 +183 +182 +182 +182 +183 +11 +10 +10 +10 +11 +10 +10 +183 +183 +181 +183 +182 +180 +181 +182 +182 +183 +183 +182 +182 +182 +182 +183 +183 +182 +182 +183 +182 +182 +183 +182 +181 +11 +9 +10 +11 +11 +12 +12 +182 +182 +181 +181 +183 +182 +182 +183 +181 +181 +181 +182 +183 +183 +183 +182 +182 +181 +183 +182 +182 +183 +183 +182 +183 +12 +10 +11 +11 +11 +11 +10 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +184 +183 +184 +183 +182 +182 +181 +183 +182 +12 +182 +182 +183 +182 +182 +182 +183 +183 +11 +11 +11 +9 +11 +10 +11 +181 +180 +182 +181 +181 +183 +182 +182 +182 +183 +182 +182 +182 +182 +182 +181 +183 +182 +183 +182 +182 +182 +182 +183 +183 +13 +11 +10 +10 +8 +9 +11 +182 +183 +183 +182 +182 +183 +182 +181 +182 +181 +182 +183 +183 +183 +182 +182 +181 +182 +182 +182 +183 +179 +183 +183 +182 +12 +10 +10 +10 +10 +10 +10 +182 +182 +182 +182 +183 +181 +182 +182 +182 +185 +182 +182 +183 +182 +183 +183 +13 +12 +10 +11 +10 +9 +11 +182 +183 +184 +184 +182 +183 +182 +183 +181 +182 +183 +183 +182 +182 +183 +183 +182 +182 +183 +181 +182 +182 +181 +182 +183 +12 +12 +10 +12 +11 +10 +11 +181 +183 +183 +183 +184 +182 +183 +184 +182 +184 +181 +181 +182 +182 +183 +181 +183 +184 +182 +182 +182 +182 +183 +181 +182 +11 +12 +11 +11 +10 +20 +9 +182 +182 +182 +182 +183 +182 +182 +182 +186 +181 +182 +182 +181 +180 +182 +183 +182 +181 +183 +182 +182 +182 +182 +181 +181 +11 +11 +14 +11 +13 +11 +11 +182 +181 +183 +183 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +185 +183 +181 +180 +182 +182 +11 +12 +10 +11 +11 +10 +10 +182 +183 +183 +183 +182 +182 +182 +182 +182 +183 +182 +182 +180 +181 +183 +182 +184 +183 +182 +182 +181 +181 +182 +182 +183 +12 +11 +11 +11 +11 +11 +7 +182 +182 +183 +182 +182 +183 +183 +183 +183 +182 +181 +182 +181 +182 +183 +184 +182 +183 +182 +182 +182 +182 +182 +180 +182 +10 +10 +10 +9 +12 +10 +11 +183 +183 +182 +183 +182 +181 +182 +182 +182 +181 +183 +183 +182 +182 +182 +182 +183 +183 +180 +182 +182 +182 +182 +182 +182 +12 +8 +10 +10 +10 +11 +10 +183 +184 +183 +184 +182 +183 +183 +180 +183 +183 +182 +181 +180 +180 +182 +182 +184 +184 +182 +182 +180 +182 +182 +182 +182 +10 +11 +11 +11 +10 +9 +10 +182 +181 +180 +185 +182 +181 +182 +182 +181 +183 +183 +182 +182 +182 +181 +182 +182 +183 +182 +181 +180 +180 +182 +183 +184 +182 +183 +182 +182 +183 +182 +182 +182 +182 +11 +11 +11 +11 +11 +11 +10 +182 +182 +182 +182 +182 +182 +181 +182 +182 +182 +183 +182 +182 +182 +182 +183 +183 +184 +183 +184 +182 +183 +181 +182 +181 +10 +11 +10 +8 +13 +11 +11 +182 +181 +181 +181 +182 +182 +182 +183 +181 +182 +182 +182 +180 +183 +182 +182 +183 +184 +181 +182 +182 +182 +180 +183 +182 +13 +12 +11 +10 +13 +10 +11 +181 +184 +183 +182 +183 +182 +181 +180 +179 +182 +182 +184 +182 +182 +181 +183 +13 +10 +10 +10 +11 +8 +12 +182 +182 +182 +182 +182 +182 +182 +182 +181 +182 +182 +181 +182 +182 +182 +182 +183 +181 +181 +183 +182 +183 +183 +182 +182 +17 +10 +12 +10 +9 +10 +11 +182 +183 +181 +182 +182 +182 +182 +182 +182 +183 +184 +182 +183 +181 +181 +183 +182 +183 +183 +183 +183 +182 +182 +182 +182 +12 +9 +11 +11 +10 +10 +10 +182 +183 +183 +184 +182 +180 +182 +182 +183 +181 +183 +182 +183 +184 +182 +182 +182 +182 +183 +182 +182 +182 +182 +181 +183 +12 +11 +11 +10 +11 +10 +11 +183 +182 +182 +182 +182 +182 +182 +183 +181 +182 +183 +182 +182 +182 +183 +182 +182 +183 +184 +182 +182 +182 +181 +182 +183 +12 +11 +12 +10 +12 +10 +11 +182 +181 +183 +182 +182 +182 +182 +183 +181 +181 +182 +182 +183 +182 +184 +182 +183 +182 +182 +184 +182 +182 +182 +183 +183 +12 +12 +9 +11 +11 +11 +14 +182 +184 +184 +182 +182 +181 +181 +182 +182 +183 +184 +184 +183 +183 +181 +183 +182 +181 +183 +181 +183 +182 +182 +183 +182 +11 +11 +11 +12 +12 +10 +10 +182 +182 +183 +182 +183 +182 +181 +182 +181 +183 +183 +182 +180 +181 +182 +182 +183 +184 +182 +184 +182 +182 +179 +181 +182 +12 +12 +11 +11 +11 +10 +10 +181 +181 +183 +182 +182 +182 +182 +182 +184 +182 +183 +182 +180 +182 +182 +183 +182 +182 +182 +182 +182 +181 +181 +182 +181 +12 +14 +12 +11 +11 +11 +11 +182 +182 +182 +183 +181 +182 +178 +182 +10 +182 +185 +182 +183 +183 +181 +183 +182 +182 +183 +182 +181 +183 +182 +181 +182 +181 +182 +184 +183 +182 +182 +182 +182 +182 +12 +11 +11 +10 +10 +11 +10 +181 +186 +181 +183 +185 +183 +183 +182 +180 +182 +182 +181 +182 +182 +181 +182 +183 +183 +182 +182 +182 +181 +181 +181 +183 +13 +11 +11 +10 +11 +9 +8 +182 +181 +182 +184 +183 +182 +182 +182 +182 +182 +182 +182 +182 +181 +179 +182 +182 +179 +182 +182 +181 +182 +184 +181 +182 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +183 +182 +183 +183 +184 +183 +182 +182 +182 +182 +13 +10 +10 +11 +10 +10 +10 +182 +183 +184 +182 +183 +181 +181 +182 +181 +183 +182 +182 +183 +183 +182 +183 +182 +181 +183 +181 +182 +183 +182 +184 +182 +12 +11 +10 +10 +9 +11 +10 +182 +184 +181 +180 +182 +182 +181 +182 +181 +182 +182 +183 +183 +182 +182 +182 +183 +182 +183 +182 +183 +182 +182 +182 +181 +10 +11 +11 +10 +11 +11 +11 +182 +181 +183 +182 +183 +182 +182 +183 +182 +182 +182 +182 +183 +182 +182 +181 +180 +182 +181 +182 +182 +181 +182 +182 +183 +12 +11 +10 +10 +10 +11 +10 +181 +182 +181 +182 +182 +183 +183 +182 +183 +183 +182 +181 +182 +182 +182 +185 +183 +184 +183 +183 +182 +182 +180 +183 +182 +11 +11 +10 +11 +12 +11 +10 +182 +181 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +183 +182 +184 +181 +182 +182 +181 +183 +182 +184 +183 +180 +183 +11 +11 +11 +9 +11 +10 +13 +183 +182 +181 +181 +179 +182 +183 +183 +183 +179 +182 +184 +182 +181 +183 +181 +183 +183 +183 +177 +183 +182 +182 +183 +184 +12 +11 +11 +10 +13 +10 +12 +182 +183 +181 +181 +184 +182 +181 +185 +181 +183 +183 +183 +181 +182 +182 +183 +183 +187 +181 +182 +183 +182 +186 +182 +183 +13 +10 +7 +10 +12 +11 +8 +178 +183 +182 +184 +183 +181 +182 +182 +182 +178 +182 +183 +182 +183 +182 +182 +182 +181 +183 +181 +184 +183 +182 +182 +182 +12 +9 +10 +9 +10 +11 +183 +183 +185 +13 +9 +8 +11 +6 +11 +11 +184 +183 +180 +182 +182 +182 +182 +183 +182 +183 +183 +179 +182 +182 +182 +182 +182 +182 +182 +183 +183 +181 +182 +183 +178 +10 +9 +11 +11 +12 +12 +10 +183 +181 +181 +183 +182 +184 +183 +184 +184 +182 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +183 +183 +182 +181 +182 +11 +10 +11 +9 +11 +11 +10 +182 +182 +183 +181 +183 +182 +182 +183 +182 +182 +182 +182 +183 +183 +183 +182 +11 +10 +11 +11 +11 +11 +11 +182 +183 +181 +182 +182 +181 +181 +182 +181 +183 +183 +183 +182 +182 +182 +184 +183 +182 +182 +183 +182 +182 +182 +182 +182 +11 +10 +12 +11 +10 +9 +10 +182 +183 +183 +181 +182 +182 +182 +182 +183 +182 +185 +182 +184 +183 +182 +182 +182 +181 +181 +182 +182 +183 +183 +184 +183 +13 +9 +10 +10 +10 +11 +11 +181 +183 +183 +182 +189 +182 +183 +182 +182 +182 +183 +182 +182 +183 +183 +183 +181 +181 +183 +182 +182 +183 +182 +182 +182 +12 +10 +10 +11 +10 +10 +10 +185 +182 +183 +183 +182 +186 +181 +180 +182 +181 +180 +184 +182 +183 +182 +184 +182 +182 +182 +182 +184 +183 +182 +182 +182 +11 +11 +11 +11 +12 +10 +12 +182 +182 +181 +181 +183 +183 +183 +183 +182 +183 +181 +181 +183 +182 +182 +182 +184 +183 +184 +183 +184 +183 +184 +182 +181 +12 +9 +11 +12 +11 +10 +8 +182 +183 +183 +183 +184 +182 +182 +182 +181 +183 +183 +182 +183 +183 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +183 +12 +10 +11 +11 +8 +11 +10 +181 +181 +182 +183 +182 +183 +183 +183 +182 +181 +182 +183 +183 +183 +182 +182 +182 +182 +182 +181 +181 +183 +182 +182 +181 +13 +10 +11 +10 +9 +11 +10 +183 +183 +182 +183 +182 +182 +182 +182 +182 +182 +183 +183 +183 +182 +182 +182 +182 +184 +182 +182 +184 +182 +184 +182 +181 +11 +11 +11 +10 +11 +11 +10 +182 +183 +182 +184 +182 +182 +182 +182 +181 +180 +183 +183 +183 +183 +183 +182 +182 +182 +181 +179 +182 +182 +183 +182 +182 +182 +181 +182 +182 +182 +183 +184 +183 +184 +12 +10 +10 +10 +10 +10 +10 +181 +182 +182 +182 +182 +182 +182 +182 +183 +184 +180 +183 +181 +181 +182 +182 +183 +183 +182 +182 +181 +182 +182 +181 +182 +11 +10 +10 +11 +11 +12 +10 +184 +182 +181 +181 +181 +182 +184 +183 +183 +182 +182 +181 +182 +183 +182 +182 +184 +184 +183 +182 +182 +181 +182 +182 +182 +11 +11 +11 +11 +12 +11 +9 +183 +181 +182 +182 +183 +182 +185 +183 +183 +182 +181 +182 +182 +183 +183 +182 +12 +9 +10 +11 +11 +11 +12 +183 +182 +180 +183 +183 +183 +183 +182 +182 +181 +182 +182 +182 +182 +182 +183 +182 +179 +183 +182 +182 +182 +182 +182 +184 +12 +11 +12 +11 +12 +10 +11 +183 +182 +183 +183 +182 +182 +182 +183 +180 +183 +180 +185 +182 +183 +182 +182 +183 +182 +183 +182 +183 +183 +185 +183 +184 +12 +10 +10 +10 +11 +11 +12 +183 +182 +182 +181 +182 +181 +183 +182 +182 +182 +184 +180 +182 +182 +183 +183 +182 +183 +181 +181 +183 +182 +183 +182 +180 +12 +10 +8 +9 +11 +11 +11 +183 +181 +182 +181 +183 +183 +182 +183 +182 +182 +183 +182 +183 +183 +182 +182 +183 +184 +183 +184 +181 +183 +182 +182 +183 +12 +10 +9 +10 +10 +10 +12 +183 +183 +183 +181 +181 +181 +182 +183 +183 +183 +185 +182 +183 +182 +182 +182 +183 +181 +180 +182 +182 +181 +182 +182 +182 +12 +11 +10 +11 +11 +11 +12 +182 +183 +182 +182 +182 +182 +182 +182 +183 +182 +181 +182 +184 +182 +183 +181 +181 +182 +180 +183 +183 +183 +183 +182 +183 +9 +8 +11 +10 +11 +10 +11 +182 +181 +182 +182 +183 +182 +183 +182 +182 +182 +183 +184 +182 +182 +182 +182 +182 +181 +182 +182 +184 +182 +182 +182 +183 +13 +12 +11 +10 +10 +11 +10 +185 +183 +184 +183 +184 +182 +184 +182 +182 +182 +181 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +182 +182 +12 +11 +11 +12 +11 +11 +10 +182 +182 +182 +182 +183 +182 +182 +182 +182 +180 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +184 +183 +184 +185 +183 +184 +182 +181 +181 +181 +183 +12 +11 +10 +12 +11 +10 +10 +182 +182 +181 +182 +182 +182 +181 +185 +182 +182 +183 +182 +183 +182 +182 +182 +181 +180 +182 +182 +183 +182 +183 +183 +182 +14 +10 +11 +10 +9 +11 +10 +182 +183 +183 +183 +182 +181 +183 +182 +182 +182 +182 +183 +182 +182 +182 +181 +182 +182 +182 +182 +181 +182 +183 +183 +183 +11 +10 +9 +9 +182 +183 +183 +181 +181 +183 +182 +182 +183 +183 +183 +183 +182 +182 +181 +182 +182 +182 +182 +12 +11 +10 +8 +10 +10 +10 +183 +182 +182 +182 +183 +182 +182 +182 +183 +182 +183 +186 +181 +184 +182 +181 +181 +181 +183 +183 +183 +182 +183 +182 +182 +12 +11 +10 +11 +11 +10 +10 +180 +183 +183 +181 +181 +182 +182 +182 +181 +182 +183 +183 +184 +183 +183 +182 +182 +183 +182 +182 +182 +182 +182 +182 +182 +12 +10 +11 +8 +9 +11 +11 +182 +184 +182 +183 +185 +182 +182 +182 +182 +179 +181 +183 +182 +183 +182 +183 +182 +182 +181 +183 +182 +183 +183 +183 +183 +11 +10 +8 +8 +10 +10 +11 +182 +183 +183 +182 +181 +181 +182 +182 +183 +181 +184 +183 +183 +183 +182 +182 +174 +180 +182 +182 +183 +183 +183 +183 +183 +11 +10 +11 +10 +10 +11 +10 +181 +182 +182 +183 +182 +182 +183 +181 +181 +182 +182 +182 +183 +183 +182 +182 +182 +181 +182 +181 +182 +181 +183 +183 +183 +12 +11 +10 +9 +11 +11 +11 +183 +183 +182 +181 +181 +182 +182 +183 +182 +182 +183 +183 +183 +182 +182 +181 +182 +182 +181 +182 +180 +183 +183 +181 +181 +12 +10 +10 +10 +10 +10 +11 +182 +183 +182 +183 +182 +182 +181 +181 +182 +183 +183 +183 +183 +182 +183 +183 +181 +182 +182 +183 +183 +182 +182 +182 +182 +12 +11 +11 +11 +11 +9 +11 +182 +183 +183 +185 +183 +184 +182 +181 +184 +181 +183 +183 +182 +183 +182 +182 +183 +182 +184 +182 +182 +183 +182 +183 +185 +12 +12 +10 +11 +11 +9 +11 +181 +183 +186 +183 +10 +11 +11 +11 +11 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +180 +180 +182 +182 +186 +183 +182 +182 +182 +182 +183 +182 +182 +182 +183 +11 +9 +10 +9 +10 +10 +11 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +181 +182 +183 +182 +183 +182 +179 +182 +181 +181 +183 +182 +181 +182 +12 +11 +10 +9 +10 +10 +11 +182 +182 +182 +182 +183 +182 +183 +183 +182 +180 +182 +182 +184 +183 +183 +182 +183 +181 +181 +183 +11 +11 +12 +183 +182 +182 +181 +181 +183 +183 +182 +182 +179 +183 +183 +181 +183 +182 +182 +182 +182 +183 +184 +185 +185 +184 +182 +181 +12 +11 +11 +11 +11 +10 +10 +181 +183 +181 +180 +182 +182 +183 +184 +182 +183 +182 +181 +183 +181 +182 +184 +183 +182 +183 +181 +183 +183 +183 +182 +182 +13 +13 +11 +11 +11 +9 +10 +182 +182 +184 +182 +183 +184 +182 +183 +182 +182 +182 +185 +182 +183 +182 +182 +182 +182 +182 +180 +179 +182 +183 +184 +183 +12 +11 +10 +10 +11 +11 +10 +183 +184 +182 +183 +181 +182 +183 +182 +182 +183 +182 +183 +181 +181 +182 +181 +183 +182 +182 +183 +181 +180 +181 +182 +182 +12 +11 +10 +9 +11 +11 +10 +182 +184 +182 +183 +181 +182 +182 +182 +181 +182 +181 +185 +182 +182 +183 +184 +180 +184 +182 +181 +182 +183 +183 +183 +182 +11 +11 +11 +11 +14 +10 +11 +182 +181 +182 +180 +183 +182 +183 +182 +182 +182 +182 +183 +183 +183 +182 +183 +182 +181 +182 +182 +184 +184 +183 +185 +181 +11 +9 +9 +12 +11 +11 +12 +182 +183 +182 +182 +183 +181 +182 +182 +182 +182 +185 +182 +183 +181 +180 +183 +182 +183 +183 +182 +181 +182 +185 +182 +182 +14 +12 +11 +11 +10 +8 +11 +183 +182 +183 +183 +181 +182 +182 +181 +182 +183 +183 +184 +182 +182 +182 +182 +183 +182 +183 +183 +182 +182 +182 +181 +182 +12 +13 +12 +12 +10 +9 +11 +183 +182 +183 +182 +182 +182 +183 +182 +182 +182 +183 +183 +183 +182 +183 +184 +182 +182 +181 +183 +182 +182 +183 +181 +180 +12 +10 +END PACKET 0 diff --git a/Old Matlab Interface/.svn/pristine/2c/2c2cac302b7f1cdf9fa687082d023d2095c94195.svn-base b/Old Matlab Interface/.svn/pristine/2c/2c2cac302b7f1cdf9fa687082d023d2095c94195.svn-base new file mode 100644 index 00000000..84b1c5d3 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/2c/2c2cac302b7f1cdf9fa687082d023d2095c94195.svn-base @@ -0,0 +1,62 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {AB79B52F-49BA-4424-8DD3-CC61489EFC1E} + Exe + Properties + Xfer.Stm + Xfer.Stm + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + libusbK.cs + + + Common\BenchmarkTestDevice.cs + + + Common\HiPerfTimer.cs + + + Common\TestParameters.cs + + + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/2e/2edbf56631bf8c322ab56509a78f197f01786957.svn-base b/Old Matlab Interface/.svn/pristine/2e/2edbf56631bf8c322ab56509a78f197f01786957.svn-base new file mode 100644 index 00000000..400c2b7c --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/2e/2edbf56631bf8c322ab56509a78f197f01786957.svn-base @@ -0,0 +1 @@ +mex_usb_send_control('40', 'a0', '0', '0', '0', '0'); diff --git a/Old Matlab Interface/.svn/pristine/2f/2feca4ba5ed6b3d0dedf490a9063cb7ab9430790.svn-base b/Old Matlab Interface/.svn/pristine/2f/2feca4ba5ed6b3d0dedf490a9063cb7ab9430790.svn-base new file mode 100644 index 00000000..d81057dd --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/2f/2feca4ba5ed6b3d0dedf490a9063cb7ab9430790.svn-base @@ -0,0 +1,126 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// HiPerfTimer.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.ComponentModel; +using System.Runtime.InteropServices; + + +namespace Win32 +{ + internal class HiPerfTimer + { + #region Public Members + public HiPerfTimer() + { + startTime = 0; + stopTime = 0; + length = 0; + + if (QueryPerformanceFrequency(out freq) == false) + { + // high-performance counter not supported + throw new Win32Exception(); + } + } + + /// + /// Gets the bytes per second + /// + public double Bps + { + get + { + double duration = Duration; + if (duration.Equals(0.0)) return 0.0; + return length/duration; + } + } + + /// + /// Gets the duration of the timer (in seconds) + /// + public double Duration + { + get + { + return (stopTime - startTime)/(double) freq; + } + } + + /// + /// Gets the duration of the timer (in seconds) + /// + public long Ticks + { + get + { + long tDiff = stopTime - startTime; + tDiff = (tDiff*10000000)/freq; + + return tDiff; + } + } + /// + /// Start the timer + /// + public void Start() + { + length = 0; + QueryPerformanceCounter(out startTime); + } + + /// + /// Stop the timer + /// + public void Stop() + { + QueryPerformanceCounter(out stopTime); + } + + public void Stop(int addLength) + { + QueryPerformanceCounter(out stopTime); + length += addLength; + } + #endregion + + + #region Private Members + [DllImport("Kernel32.dll")] + private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); + + [DllImport("Kernel32.dll")] + private static extern bool QueryPerformanceFrequency(out long lpFrequency); + + private readonly long freq; + private long length; + private long startTime, stopTime; + #endregion + } +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/32/32ba5d36cb2ab8663296ce2e48e64fb66bb09f3a.svn-base b/Old Matlab Interface/.svn/pristine/32/32ba5d36cb2ab8663296ce2e48e64fb66bb09f3a.svn-base new file mode 100644 index 00000000..6447face Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/32/32ba5d36cb2ab8663296ce2e48e64fb66bb09f3a.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/33/338975c9c725c4146ae2eee3933f4a85f9c2f115.svn-base b/Old Matlab Interface/.svn/pristine/33/338975c9c725c4146ae2eee3933f4a85f9c2f115.svn-base new file mode 100644 index 00000000..1d49bc93 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/33/338975c9c725c4146ae2eee3933f4a85f9c2f115.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/36/361d39f794648a08cb9406c83d158220c347bb09.svn-base b/Old Matlab Interface/.svn/pristine/36/361d39f794648a08cb9406c83d158220c347bb09.svn-base new file mode 100644 index 00000000..c03221f1 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/36/361d39f794648a08cb9406c83d158220c347bb09.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/36/364d01a33894c1318342a60513444fea9f79f626.svn-base b/Old Matlab Interface/.svn/pristine/36/364d01a33894c1318342a60513444fea9f79f626.svn-base new file mode 100644 index 00000000..5178aa52 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/36/364d01a33894c1318342a60513444fea9f79f626.svn-base @@ -0,0 +1,5 @@ +cool=1; +cool = 'cock'; + +mex helloworld.cpp +[a, b, c, d] = helloworld(cool); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/37/3760526ebf9920e390f38d721bd4effaecc3265c.svn-base b/Old Matlab Interface/.svn/pristine/37/3760526ebf9920e390f38d721bd4effaecc3265c.svn-base new file mode 100644 index 00000000..cf30a774 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/37/3760526ebf9920e390f38d721bd4effaecc3265c.svn-base @@ -0,0 +1,5 @@ +function [] = mex_usb_init(VID, PID) + +global usb_handle + +usb_handle = USB_INIT(VID, PID); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/3a/3a88715c2d02f41769b36f97cc570d5770a32ccc.svn-base b/Old Matlab Interface/.svn/pristine/3a/3a88715c2d02f41769b36f97cc570d5770a32ccc.svn-base new file mode 100644 index 00000000..8e4e5e9a --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/3a/3a88715c2d02f41769b36f97cc570d5770a32ccc.svn-base @@ -0,0 +1,11 @@ +clear all +setscopewindowsize(1, 0, 5) +first_gui_test +pause(0.01) +max_n = 10000; +setscopemode(2,8,8) +setpsu(0,1000) +tiny_send_waveform(sin(linspace(0,2*pi, 128)),255,432) +%tiny_send_waveform(1:100, 255, 100) +mex_usb_iso_loop +%%plot(saved_waveform) \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/3a/3aff65596faed59f9ea33ee9452d0e153ae9d3d5.svn-base b/Old Matlab Interface/.svn/pristine/3a/3aff65596faed59f9ea33ee9452d0e153ae9d3d5.svn-base new file mode 100644 index 00000000..e4d69f15 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/3a/3aff65596faed59f9ea33ee9452d0e153ae9d3d5.svn-base @@ -0,0 +1,14 @@ +clear all + +compile + +global usb_handle +if ~length(usb_handle) + warning('USB Handle not initialised. Initialising!') + mex_usb_init('03eb', 'a000') +end + +%mex USB_ISO_INIT.c -Iincludes -llibusbK -Lbin\lib\amd64 +%USB_ISO_INIT(usb_handle) +[stm_handle] = USB_ISO_INIT(usb_handle) +%USB_ISO_LOOP(usb_handle, isoCtx, ovlkHandle, ovlPool, isoBuffer, uint8(0)) \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/3c/3cc215bf1d754958f357d474d049774db8f3b9e5.svn-base b/Old Matlab Interface/.svn/pristine/3c/3cc215bf1d754958f357d474d049774db8f3b9e5.svn-base new file mode 100644 index 00000000..b8bdd816 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/3c/3cc215bf1d754958f357d474d049774db8f3b9e5.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/3e/3e3d3ac6346a8cafb643956eb1e4e90c54adeff0.svn-base b/Old Matlab Interface/.svn/pristine/3e/3e3d3ac6346a8cafb643956eb1e4e90c54adeff0.svn-base new file mode 100644 index 00000000..1dd9f7ce --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/3e/3e3d3ac6346a8cafb643956eb1e4e90c54adeff0.svn-base @@ -0,0 +1,105 @@ +%mex USB_ISO_LOOP.c -Iincludes -llibusbK -Lbin\lib\amd64 +%clear all + +global usb_handle +global scope_gain_0 +global scope_gain_1 +global scope_window_time +global scope_window_max +global scope_window_min +global scope_mode +global gui_scope_running + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global gui_cursor_mode +global saved_waveform_ch1 +global saved_waveform_ch2 + +global refreshrate +global refreshrate_temp +global waveform_exists + +global trigger + +trigger = struct('l', 0, 'h', 0, 'state', 0, 'begin', 1, 'enabled', 0); + +dotheplot + +if ~length(usb_handle) + warning('USB Handle not initialised. Initialising!') + mex_usb_init('03eb', 'a000') +end + +[stm_handle] = USB_ISO_INIT(usb_handle) + +refreshrate = 4; +refreshrate_temp = refreshrate; + +if(isempty(max_n)) + max_n = 10 +end +saved_waveform_ch1 = int8([]); + +if isempty(scope_mode) + error('You didn''t set the scope mode!'); +end + +if isempty(scope_window_time) + error('You didn''t set the window time (x) value!'); +end + +if (scope_window_time < 1/375000) + error('Scope window size is too small!'); +end + +if(scope_mode==0) + if isempty(scope_gain_0) || isempty(scope_gain_1) + error('You didn''t set the gain!'); + end + + if isempty(scope_window_min) + error('You didn''t set the minimum window voltage value!'); + end + + if isempty(scope_window_max) + error('You didn''t set the maximum window voltage value!'); + end +end + +dropped_packets = 0; +if(isempty(waveform_exists)) + waveform_exists = 0; +end + +sem_avail = 0; +timer_30ms = timer ('TimerFcn', 'sem_avail = sem_avail + 1;', 'Period', 30e-3, 'ExecutionMode', 'fixedRate'); +start(timer_30ms); + +for n=1:max_n + %[transfer_contents_0] = USB_ISO_LOOP(usb_handle, isoCtx_0, ovlkHandle_0, ovlPool, isoBuffer, uint8(0)); + + while(sem_avail==0) + pause(0.001); + end + sem_avail = sem_avail - 1; + [transfer_contents_0, libk_error] = USB_ISO_LOOP(usb_handle, stm_handle); + keep_in_sync + displaypacket(transfer_contents_0) + updatescopeaxes + + %[transfer_contents_1] = USB_ISO_LOOP(usb_handle, isoCtx_1, ovlkHandle_1, ovlPool, isoBuffer, uint8(1)); + + while(sem_avail==0) + pause(0.001); + end + sem_avail = sem_avail - 1; + [transfer_contents_1, libk_error] = USB_ISO_LOOP(usb_handle, stm_handle); + keep_in_sync + displaypacket(transfer_contents_1) + updatescopeaxes +end + +crash_recover \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/3e/3eabd99f8e0f3fab49d501dac0f56cb63904bbcd.svn-base b/Old Matlab Interface/.svn/pristine/3e/3eabd99f8e0f3fab49d501dac0f56cb63904bbcd.svn-base new file mode 100644 index 00000000..462e7ecd --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/3e/3eabd99f8e0f3fab49d501dac0f56cb63904bbcd.svn-base @@ -0,0 +1,540 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// TestParameters.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System; +using System.Globalization; +using System.IO; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; +using Win32; + + +namespace libusbK.Examples +{ + internal abstract class TestParameters + { + protected TestParameters(int vid, + int pid, + int altInterfaceId, + int pipeId, + int maxTransfersTotal, + string logFilename) + { + MI = -1; + ; + Vid = vid; + Pid = pid; + PipeId = pipeId; + AltInterfaceId = altInterfaceId; + MaxTransfersTotal = maxTransfersTotal; + LogFilename = logFilename; + } + + + #region Public Members + public int AltInterfaceId; + + public bool ConfigureDevice(out WINUSB_PIPE_INFORMATION pipeInfo, + out UsbK usb, + out USB_INTERFACE_DESCRIPTOR interfaceDescriptor) + { + bool success; + Console.WriteLine("Finding usb device by VID/PID.. ({0:X4}h / {1:X4}h)", + Vid, + Pid); + + // Use a patttern match to include only matching devices. + // NOTE: You can use the '*' and '?' chars as wildcards for all chars or a single char (respectively). + KLST_PATTERN_MATCH patternMatch = new KLST_PATTERN_MATCH(); + if (MI != -1) + patternMatch.DeviceID = String.Format("USB\\VID_{0:X4}&PID_{1:X4}&MI_{2:X2}*", + Vid, + Pid, + MI); + else + patternMatch.DeviceID = String.Format("USB\\VID_{0:X4}&PID_{1:X4}*", + Vid, + Pid); + + LstK deviceList = new LstK(KLST_FLAG.NONE, + ref patternMatch); + KLST_DEVINFO_HANDLE deviceInfo; + interfaceDescriptor = new USB_INTERFACE_DESCRIPTOR(); + pipeInfo = new WINUSB_PIPE_INFORMATION(); + usb = null; + + // Iterate the devices looking for a matching alt-interface and endpoint id. + while (deviceList.MoveNext(out deviceInfo)) + { + // libusbK class contructors can throw exceptions; For instance, if the device is + // using the WinUsb driver and already in-use by another application. + Console.WriteLine("Opening usb device.."); + usb = new UsbK(deviceInfo); + + Console.WriteLine("Finding interface and endpoint by PipeId.."); + success = FindPipeAndInterface(usb, + out interfaceDescriptor, + out pipeInfo); + if (success) break; + + Console.WriteLine("PipeId {0:X2}h not found on this device.", + PipeId); + usb.Free(); + usb = null; + } + if (ReferenceEquals(usb, + null)) + { + Console.WriteLine("Usb device not found: {0}", + patternMatch.DeviceID); + success = false; + goto Done; + } + + MI = interfaceDescriptor.bInterfaceNumber; + AltInterfaceId = interfaceDescriptor.bAlternateSetting; + PipeId = pipeInfo.PipeId; + + // Set interface alt setting. + Console.WriteLine("Setting interface #{0} to bAlternateSetting #{1}..", + interfaceDescriptor.bInterfaceNumber, + interfaceDescriptor.bAlternateSetting); + success = usb.SetAltInterface(interfaceDescriptor.bInterfaceNumber, + false, + interfaceDescriptor.bAlternateSetting); + if (!success) + { + Console.WriteLine("SetAltInterface failed. ErrorCode={0:X8}h", + Marshal.GetLastWin32Error()); + Console.WriteLine(interfaceDescriptor.ToString()); + } + + Done: + deviceList.Free(); + + return success; + } + + public HiPerfTimer Dcs = new HiPerfTimer(); + + public void FillFromCommandLine(string commandLine) + { + commandLine = Regex.Replace(commandLine, + "^(\".+?\"|\\S+)\\s*", + ""); + string exp = String.Empty; + exp += makeArgExpression("Vid", + NumberStyles.HexNumber) + "|"; + exp += makeArgExpression("Pid", + NumberStyles.HexNumber) + "|"; + exp += makeArgExpression("PipeId", + NumberStyles.HexNumber) + "|"; + exp += makeArgExpression("AltId", + NumberStyles.Integer) + "|"; + exp += makeArgExpression("MI", + NumberStyles.Integer) + "|"; + exp += makeArgExpression("Log", + NumberStyles.None); + + m_CommandArguments = Regex.Matches(commandLine, + exp, + RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase | + RegexOptions.IgnorePatternWhitespace); + + foreach (Match m in m_CommandArguments) + { + Group gVid = m.Groups["Vid"]; + Group gPid = m.Groups["Pid"]; + Group gMI = m.Groups["MI"]; + Group gPipeId = m.Groups["PipeId"]; + Group gAltId = m.Groups["AltId"]; + Group gLog = m.Groups["Log"]; + Group gIsHex = m.Groups["IsHex"]; + + if (gVid.Success) + Vid = gIsHex.Success + ? UInt16.Parse(gVid.Value, + NumberStyles.HexNumber) + : UInt16.Parse(gVid.Value); + else if (gPid.Success) + Pid = gIsHex.Success + ? UInt16.Parse(gPid.Value, + NumberStyles.HexNumber) + : UInt16.Parse(gPid.Value); + else if (gMI.Success) + MI = gIsHex.Success + ? UInt16.Parse(gMI.Value, + NumberStyles.HexNumber) + : UInt16.Parse(gMI.Value); + else if (gPipeId.Success) + PipeId = gIsHex.Success + ? Byte.Parse(gPipeId.Value, + NumberStyles.HexNumber) + : Byte.Parse(gPipeId.Value); + else if (gAltId.Success) + AltInterfaceId = gIsHex.Success + ? Byte.Parse(gAltId.Value, + NumberStyles.HexNumber) + : Byte.Parse(gAltId.Value); + else if (gLog.Success) + LogFilename = gLog.Value; + else + { + throw new Exception("Invalid argument:" + m.Value); + } + } + } + + public bool FindPipeAndInterface(UsbK usb, + out USB_INTERFACE_DESCRIPTOR interfaceDescriptor, + out WINUSB_PIPE_INFORMATION pipeInfo) + { + if (FindPipeAndInterface(usb, + out interfaceDescriptor, + out pipeInfo, + AltInterfaceId, + PipeId)) + { + AltInterfaceId = interfaceDescriptor.bAlternateSetting; + PipeId = pipeInfo.PipeId; + + return true; + } + return false; + } + + public static bool FindPipeAndInterface(UsbK usb, + out USB_INTERFACE_DESCRIPTOR interfaceDescriptor, + out WINUSB_PIPE_INFORMATION pipeInfo, + int altInterfaceId, + int pipeId) + { + byte interfaceIndex = 0; + interfaceDescriptor = new USB_INTERFACE_DESCRIPTOR(); + pipeInfo = new WINUSB_PIPE_INFORMATION(); + while (usb.SelectInterface(interfaceIndex, + true)) + { + byte altSettingNumber = 0; + while (usb.QueryInterfaceSettings(altSettingNumber, + out interfaceDescriptor)) + { + if (altInterfaceId == -1 || altInterfaceId == altSettingNumber) + { + byte pipeIndex = 0; + while (usb.QueryPipe(altSettingNumber, + pipeIndex++, + out pipeInfo)) + { + if ((pipeInfo.MaximumPacketSize > 0) && + pipeId == -1 || pipeInfo.PipeId == pipeId || + ((pipeId & 0xF) == 0 && ((pipeId & 0x80) == (pipeInfo.PipeId & 0x80)))) + { + goto FindInterfaceDone; + } + pipeInfo.PipeId = 0; + } + } + altSettingNumber++; + } + interfaceIndex++; + } + + FindInterfaceDone: + return pipeInfo.PipeId != 0; + } + + public void Free() + { + if (fileLoggingEnabled && logStream != null) + { + logStream.Flush(); + logStream.Close(); + logStream = null; + } + } + + public void Init() + { + if (!String.IsNullOrEmpty(LogFilename)) + { + logStream = new StreamWriter(LogFilename); + fileLoggingEnabled = true; + } + } + + public void Log(String text) + { + if (fileLoggingEnabled) logStream.Write(text); + else Console.Write(text); + } + + public void Log(String format, + params object[] args) + { + if (fileLoggingEnabled) + logStream.Write(format, + args); + else + Console.Write(format, + args); + } + + public string LogFilename; + + public void LogLn(String text) + { + if (fileLoggingEnabled) logStream.WriteLine(text); + else Console.WriteLine(text); + } + + public void LogLn(String format, + params object[] args) + { + if (fileLoggingEnabled) + logStream.WriteLine(format, + args); + else + Console.WriteLine(format, + args); + } + + public int MI; + public int MaxTransfersTotal; + public int Pid; + public int PipeId; + + public bool ShowTestReady() + { + while (Console.KeyAvailable) + Console.ReadKey(true); + + Console.WriteLine("Test ready:"); + Console.Write(ToString()); + + if (!String.IsNullOrEmpty(LogFilename)) + Console.WriteLine("Logging output to file: {0}", + LogFilename); + + Console.WriteLine("Press 'Q' to abort or any other key to continue.."); + ConsoleKeyInfo key = Console.ReadKey(true); + if (key.KeyChar == 'q' || key.KeyChar == 'Q') return false; + + Console.WriteLine(); + Console.WriteLine("Starting test.."); + Console.WriteLine(); + + return true; + } + + public override string ToString() + { + return + String.Format( + "Vid: {0:X4}h\nPid: {1:X4}h\nMI: {2:X2}h\nPipeId: {3:X2}h\nMaxTransfersTotal: {4}\n\nLogFilename: {5}\n", + Vid, + Pid, + MI, + PipeId, + MaxTransfersTotal, + LogFilename); + } + + public int Vid; + #endregion + + + #region Private Members + private bool fileLoggingEnabled; + + private StreamWriter logStream; + private MatchCollection m_CommandArguments; + + private string makeArgExpression(string argName, + NumberStyles argType) + { + const string argsep = @"\W\s*"; + + switch (argType) + { + case NumberStyles.None: + return String.Format(@"(({0}{1}(?<{0}>{2}))\s*)", + argName, + argsep, + "(\".+?\"|\\S+)"); + case NumberStyles.Integer: + case NumberStyles.HexNumber: + return String.Format(@"(({0}{1}(?0x)?(?<{0}>[0-9A-F]+))(?h)?\s*)", + argName, + argsep); + default: + throw new Exception(); + } + } + #endregion + } + + internal class IsoTestParameters : TestParameters + { + #region Public Members + public IsoTestParameters(int vid, + int pid, + int altInterfaceId, + int pipeId, + int maxOutstandingTransfers, + int maxTransfersTotal, + string logFilename, + int isoPacketsPerTransfer) + : base(vid, + pid, + altInterfaceId, + pipeId, + maxTransfersTotal, + logFilename) + { + IsoPacketsPerTransfer = isoPacketsPerTransfer; + MaxOutstandingTransfers = maxOutstandingTransfers; + + FillFromCommandLine(Environment.CommandLine); + Init(); + } + + public int IsoPacketsPerTransfer; + public int MaxOutstandingTransfers; + + public override string ToString() + { + string fmt = String.Empty; + fmt += "IsoPacketsPerTransfer: {0}\n"; + fmt += "MaxOutstandingTransfers: {1}\n"; + + object[] args = new object[] + { + IsoPacketsPerTransfer, MaxOutstandingTransfers + }; + return base.ToString() + string.Format(fmt, + args); + } + #endregion + } + + internal class StmTestParameters : TestParameters + { + #region Public Members + public StmTestParameters(int vid, + int pid, + int altInterfaceId, + byte pipeId, + int maxTransfersTotal, + string logFilename, + int transferBufferSize, + int maxPendingIO, + int maxPendingTransfers) + : base(vid, + pid, + altInterfaceId, + pipeId, + maxTransfersTotal, + logFilename) + { + TransferBufferSize = transferBufferSize; + MaxPendingIO = maxPendingIO; + MaxPendingTransfers = maxPendingTransfers; + + FillFromCommandLine(Environment.CommandLine); + Init(); + } + + public int MaxPendingIO; + public int MaxPendingTransfers; + + public override string ToString() + { + string fmt = String.Empty; + fmt += "TransferBufferSize: {0}\n"; + fmt += "MaxPendingIO: {1}\n"; + fmt += "MaxPendingTransfers: {2}\n"; + + object[] args = new object[] + { + TransferBufferSize, MaxPendingIO, MaxPendingTransfers + }; + return base.ToString() + string.Format(fmt, + args); + } + + public int TransferBufferSize; + #endregion + } + + internal class AsyncTestParameters : TestParameters + { + #region Public Members + public AsyncTestParameters(int vid, + int pid, + int altInterfaceId, + byte pipeId, + int maxTransfersTotal, + string logFilename, + int transferBufferSize, + int maxPendingIO) + : base(vid, + pid, + altInterfaceId, + pipeId, + maxTransfersTotal, + logFilename) + { + TransferBufferSize = transferBufferSize; + MaxPendingIO = maxPendingIO; + + FillFromCommandLine(Environment.CommandLine); + Init(); + } + + public int MaxPendingIO; + + public override string ToString() + { + string fmt = String.Empty; + fmt += "TransferBufferSize: {0}\n"; + fmt += "MaxPendingIO: {1}\n"; + + object[] args = new object[] + { + TransferBufferSize, MaxPendingIO + }; + return base.ToString() + string.Format(fmt, + args); + } + + public int TransferBufferSize; + #endregion + } +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/3f/3f2ffe70410dd117d147aa7c9feb072a8f3d1c80.svn-base b/Old Matlab Interface/.svn/pristine/3f/3f2ffe70410dd117d147aa7c9feb072a8f3d1c80.svn-base new file mode 100644 index 00000000..9f980ed9 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/3f/3f2ffe70410dd117d147aa7c9feb072a8f3d1c80.svn-base @@ -0,0 +1,29 @@ +global scope_window_time +global gui_delay +global trigger + +pause(0.001) +%Will be buggy with delay +delay_sec = get(gui_delay, 'Max') - get(gui_delay, 'Value'); +delay_sample = delay_sec*(samplestoshow/scope_window_time); + +first + +if (length(buffer)>samplestoshow) & ((length(buffer) - first) > (floor(samplestoshow/2))) + if (samplestoshow>500) + temp_waveform = buffer((first - floor(samplestoshow/2)) : (samplestoshow/500) : (first + floor(samplestoshow/2))); + else + temp_waveform = buffer((first - floor(samplestoshow/2)) : (first + floor(samplestoshow/2))); + end + trigger.begin = length(buffer) + trigger.state = 0; + update_enable = 1 + cool_waveform = undofrontend(temp_waveform, channel); + taxis = linspace(-scope_window_time-delay_sec,-delay_sec,length(cool_waveform)); + return +end + +update_enable = 0 +taxis = [] +cool_waveform = [] +pause(0.001) \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/3f/3fad4e091d61f24c210253e31673d3f211b79fe6.svn-base b/Old Matlab Interface/.svn/pristine/3f/3fad4e091d61f24c210253e31673d3f211b79fe6.svn-base new file mode 100644 index 00000000..cbcd7962 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/3f/3fad4e091d61f24c210253e31673d3f211b79fe6.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/40/405594dae0acbcf5943de3d37764a402bd7ab863.svn-base b/Old Matlab Interface/.svn/pristine/40/405594dae0acbcf5943de3d37764a402bd7ab863.svn-base new file mode 100644 index 00000000..2906160b --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/40/405594dae0acbcf5943de3d37764a402bd7ab863.svn-base @@ -0,0 +1,8 @@ +global gui_axes + +tic +for n = 1:10 + plot(gui_axes, 1, 1) + drawnow +end +toc \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/42/42d93a134c140d54d42b87e62b2bd7f4d1725dcb.svn-base b/Old Matlab Interface/.svn/pristine/42/42d93a134c140d54d42b87e62b2bd7f4d1725dcb.svn-base new file mode 100644 index 00000000..cdb959ec --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/42/42d93a134c140d54d42b87e62b2bd7f4d1725dcb.svn-base @@ -0,0 +1,62 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {67C87F34-0DD6-41DB-B95B-0BFF24D8C4E8} + Exe + Properties + Xfer.Async + Xfer.Async + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + libusbK.cs + + + Common\BenchmarkTestDevice.cs + + + Common\HiPerfTimer.cs + + + Common\TestParameters.cs + + + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/44/44bc75aeccf2b62e28cc9c5e8625165149f06afc.svn-base b/Old Matlab Interface/.svn/pristine/44/44bc75aeccf2b62e28cc9c5e8625165149f06afc.svn-base new file mode 100644 index 00000000..20ca2cfe --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/44/44bc75aeccf2b62e28cc9c5e8625165149f06afc.svn-base @@ -0,0 +1,83 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {CFB108D9-5489-48D4-AAFD-5FBCB3C00582} + WinExe + Properties + Hot.Plug.Detect.GUI + Hot.Plug.Detect.GUI + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + libusbK.cs + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/45/45b1a4617d02872cdb3cf169cda0dafbc514c065.svn-base b/Old Matlab Interface/.svn/pristine/45/45b1a4617d02872cdb3cf169cda0dafbc514c065.svn-base new file mode 100644 index 00000000..de609355 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/45/45b1a4617d02872cdb3cf169cda0dafbc514c065.svn-base @@ -0,0 +1,91 @@ +%mex USB_ISO_LOOP.c -Iincludes -llibusbK -Lbin\lib\amd64 +%clear all + +global usb_handle +global scope_gain_0 +global scope_gain_1 +global scope_window_time +global scope_window_max +global scope_window_min +global scope_mode +global gui_scope_running + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global gui_cursor_mode +global saved_waveform_ch1 +global saved_waveform_ch2 + +global refreshrate +global refreshrate_temp +global waveform_exists + +global trigger + +trigger = struct('l', 0, 'h', 0, 'state', 0, 'begin', 1, 'enabled', 0); + +dotheplot + +if ~length(usb_handle) + warning('USB Handle not initialised. Initialising!') + mex_usb_init('03eb', 'a000') +end + +[isoCtx_0, isoCtx_1, ovlkHandle_0, ovlkHandle_1, ovlPool, isoBuffer] = USB_ISO_INIT(usb_handle) + +refreshrate = 4; +refreshrate_temp = refreshrate; + +if(isempty(max_n)) + max_n = 10 +end +saved_waveform_ch1 = int8([]); + +if isempty(scope_mode) + error('You didn''t set the scope mode!'); +end + +if isempty(scope_window_time) + error('You didn''t set the window time (x) value!'); +end + +if (scope_window_time < 1/375000) + error('Scope window size is too small!'); +end + +if(scope_mode==0) + if isempty(scope_gain_0) || isempty(scope_gain_1) + error('You didn''t set the gain!'); + end + + if isempty(scope_window_min) + error('You didn''t set the minimum window voltage value!'); + end + + if isempty(scope_window_max) + error('You didn''t set the maximum window voltage value!'); + end +end + +dropped_packets = 0; +if(isempty(waveform_exists)) + waveform_exists = 0; +end + +for n=1:max_n + %[transfer_contents_0] = USB_ISO_LOOP(usb_handle, isoCtx_0, ovlkHandle_0, ovlPool, isoBuffer, uint8(0)); + [transfer_contents_0, libk_error] = USB_ISO_LOOP(usb_handle, isoCtx_0, ovlkHandle_0, ovlPool, isoBuffer, uint8(0)); + keep_in_sync + displaypacket(transfer_contents_0) + updatescopeaxes + + %[transfer_contents_1] = USB_ISO_LOOP(usb_handle, isoCtx_1, ovlkHandle_1, ovlPool, isoBuffer, uint8(1)); + [transfer_contents_1, libk_error] = USB_ISO_LOOP(usb_handle, isoCtx_1, ovlkHandle_1, ovlPool, isoBuffer, uint8(1)); + keep_in_sync + displaypacket(transfer_contents_1) + updatescopeaxes +end + +crash_recover \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/46/464dd4dd02051c93fe0a923037104d7466493cc4.svn-base b/Old Matlab Interface/.svn/pristine/46/464dd4dd02051c93fe0a923037104d7466493cc4.svn-base new file mode 100644 index 00000000..02a976c5 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/46/464dd4dd02051c93fe0a923037104d7466493cc4.svn-base @@ -0,0 +1,109 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2011-2012 Travis Robinson +// All rights reserved. +// +// Xfer.Sync +// +// Last Updated: 03.08.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +#define BMFW + +using System; +using System.Runtime.InteropServices; +using Test.Devices; +using libusbK; +using libusbK.Examples; + +// ReSharper disable InconsistentNaming + +namespace Xfer.Sync +{ + internal class Program + { + #region TODO USER: Set the test parameters for your device. + + public static StmTestParameters Test = new StmTestParameters(0x04d8, 0xfa2e, 0, 0x01, 1024, null, -1, 4, 64); + + #endregion + + private static void Main() + { + bool success; + WINUSB_PIPE_INFORMATION pipeInfo; + UsbK usb; + USB_INTERFACE_DESCRIPTOR interfaceDescriptor; + + // Find and configure the device. + if (!Test.ConfigureDevice(out pipeInfo, out usb, out interfaceDescriptor)) return; + if (Test.TransferBufferSize == -1) + Test.TransferBufferSize = pipeInfo.MaximumPacketSize*64; + +#if BMFW + // TODO FOR USER: Remove this block if not using benchmark firmware. + // This configures devices running benchmark firmware for streaming DeviceToHost transfers. + Console.WriteLine("Configuring for benchmark device.."); + BM_TEST_TYPE testType = ((Test.PipeId & 0x80) > 0) ? BM_TEST_TYPE.READ : BM_TEST_TYPE.WRITE; + success = Benchmark.Configure(usb, BM_COMMAND.SET_TEST, interfaceDescriptor.bInterfaceNumber, ref testType); + if (!success) + { + Console.WriteLine("Bench_Configure failed."); + } +#endif + if (!Test.ShowTestReady()) goto Done; + + // In most cases, you should to set the pipe timeout policy before using synchronous I/O. + // By default, sync transfers wait infinitely for a transfer to complete. + + // Set the pipe timeout policy to 3000ms + int[] pipeTimeoutMS = new[] {3000}; + usb.SetPipePolicy( + (byte) Test.PipeId, + (int) PipePolicyType.PIPE_TRANSFER_TIMEOUT, + Marshal.SizeOf(typeof (int)), + pipeTimeoutMS); + + int totalTransfers = 0; + success = true; + byte[] tempBuffer = new byte[Test.TransferBufferSize]; + while (success && totalTransfers++ < Test.MaxTransfersTotal) + { + int transferred; + if ((Test.PipeId & 0x80) > 0) + success = usb.ReadPipe((byte) Test.PipeId, tempBuffer, tempBuffer.Length, out transferred, IntPtr.Zero); + else + success = usb.WritePipe((byte) Test.PipeId, tempBuffer, tempBuffer.Length, out transferred, IntPtr.Zero); + + Console.WriteLine("#{0:0000} Transferred {1} bytes.", totalTransfers, transferred); + } + + if (!success) + { + Console.WriteLine("An error occured transferring data. ErrorCode: {0:X8}h", Marshal.GetLastWin32Error()); + } + + Done: + usb.Free(); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/46/46a1ec401c74e36b3e78d64c045fe1e8c73479ed.svn-base b/Old Matlab Interface/.svn/pristine/46/46a1ec401c74e36b3e78d64c045fe1e8c73479ed.svn-base new file mode 100644 index 00000000..1dbe9cea Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/46/46a1ec401c74e36b3e78d64c045fe1e8c73479ed.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/47/47b15748ecc8e952c5935170090db7c269ce4b4f.svn-base b/Old Matlab Interface/.svn/pristine/47/47b15748ecc8e952c5935170090db7c269ce4b4f.svn-base new file mode 100644 index 00000000..af7dbebb --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/47/47b15748ecc8e952c5935170090db7c269ce4b4f.svn-base @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/48/48aaf1da9402bb0414597607011113f2852d4dc2.svn-base b/Old Matlab Interface/.svn/pristine/48/48aaf1da9402bb0414597607011113f2852d4dc2.svn-base new file mode 100644 index 00000000..717244d5 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/48/48aaf1da9402bb0414597607011113f2852d4dc2.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/4d/4d006a3643aedd8782c700ef93c1dd03fe8d4d6b.svn-base b/Old Matlab Interface/.svn/pristine/4d/4d006a3643aedd8782c700ef93c1dd03fe8d4d6b.svn-base new file mode 100644 index 00000000..f75aa2cd --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/4d/4d006a3643aedd8782c700ef93c1dd03fe8d4d6b.svn-base @@ -0,0 +1,11 @@ +clear all +setscopewindowsize(1, 0, 5) +first_gui_test +pause(0.01) +max_n = 10000; +setscopemode(0,8,8) +setpsu(0,1000) +tiny_send_waveform(sin(linspace(0,2*pi, 750)),255,432) +%tiny_send_waveform(1:100, 255, 100) +mex_usb_iso_loop +%%plot(saved_waveform) \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/4f/4f3af4a617fd58cd7638129886ba749e38d74fd0.svn-base b/Old Matlab Interface/.svn/pristine/4f/4f3af4a617fd58cd7638129886ba749e38d74fd0.svn-base new file mode 100644 index 00000000..aeb17d6a --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/4f/4f3af4a617fd58cd7638129886ba749e38d74fd0.svn-base @@ -0,0 +1,97 @@ +//MATLAB INCLUDES +#include +#include + +//LIBUSBK INCLUDES +#include +#include +#include +#include +#include "libusbk.h" + +#define DEBUG_SHOWCTRL 1 +#define ISO_PACKETS_TO_READ 30 +#define ISO_PACKET_SIZE 750 +#define HALFBUFFER_SIZE (ISO_PACKETS_TO_READ*ISO_PACKET_SIZE) + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + //Vars: + //Imports + char* HANDLE_CHAR; + KUSB_HANDLE handle = NULL; + unsigned char pipeID = 0x83; + //Internals + unsigned char success; + unsigned int transferred; + DWORD errorCode = ERROR_SUCCESS; + PKISO_CONTEXT isoCtx[2] = { NULL, NULL }; + KOVL_HANDLE ovlkHandle[2] = { NULL, NULL }; + KOVL_POOL_HANDLE ovlPool = NULL; + char *isoBuffer; + //Exports + char isoCtx0_string[17]; + char isoCtx1_string[17]; + char ovlkHandle0_string[17]; + char ovlkHandle1_string[17]; + char ovlPool_string[17]; + char isoBuffer_string[17]; + + + //Initialise Data + HANDLE_CHAR = mxArrayToString(prhs[0]); + sscanf(HANDLE_CHAR, "%16x", &handle); + + isoBuffer = malloc(2*HALFBUFFER_SIZE); + + //Actual Function + success = UsbK_ResetPipe(handle, pipeID); + if (~success){ + errorCode = GetLastError(); + if (errorCode != 0x3E5){ + printf("UsbK_ResetPipe failed. ErrorCode: %08Xh\n", errorCode); + } + } + + //Define Iso Context + IsoK_Init(&isoCtx[0], ISO_PACKETS_TO_READ, 0); + IsoK_SetPackets(isoCtx[0], ISO_PACKET_SIZE); + + IsoK_Init(&isoCtx[1], ISO_PACKETS_TO_READ, ISO_PACKETS_TO_READ); + IsoK_SetPackets(isoCtx[1], ISO_PACKET_SIZE); + + //What is this overlapped pool? Virtual Addresses for I/O? Black magic? The source of my errors. + OvlK_Init(&ovlPool, handle, 4, 0); + printf("OvlPool = %d", ovlPool); + + OvlK_Acquire(&ovlkHandle[0], ovlPool); + + OvlK_Acquire(&ovlkHandle[1], ovlPool); + + //Set up iso pipe for n reads. + UsbK_IsoReadPipe(handle, pipeID, isoBuffer, HALFBUFFER_SIZE, ovlkHandle[0], isoCtx[0]); + UsbK_IsoReadPipe(handle, pipeID, (isoBuffer+HALFBUFFER_SIZE), HALFBUFFER_SIZE, ovlkHandle[1], isoCtx[1]); + + //Export Data + + sprintf(isoCtx0_string, "%016x", isoCtx[0]); + plhs[0] = mxCreateString(isoCtx0_string); + + sprintf(isoCtx1_string, "%016x", isoCtx[1]); + plhs[1] = mxCreateString(isoCtx1_string); + + sprintf(ovlkHandle0_string, "%016x", ovlkHandle[0]); + plhs[2] = mxCreateString(ovlkHandle0_string); + + sprintf(ovlkHandle1_string, "%016x", ovlkHandle[1]); + plhs[3] = mxCreateString(ovlkHandle1_string); + + sprintf(ovlPool_string, "%016x", ovlPool); + plhs[4] = mxCreateString(ovlPool_string); + + sprintf(isoBuffer_string, "%016x", isoBuffer); + plhs[5] = mxCreateString(isoBuffer_string); + + + return; +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/4f/4fb1d6240092ae6c3b97164efd0529b27e935af1.svn-base b/Old Matlab Interface/.svn/pristine/4f/4fb1d6240092ae6c3b97164efd0529b27e935af1.svn-base new file mode 100644 index 00000000..de01e97f --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/4f/4fb1d6240092ae6c3b97164efd0529b27e935af1.svn-base @@ -0,0 +1,96 @@ +//MATLAB INCLUDES +#include +#include + +//LIBUSBK INCLUDES +#include +#include +#include +#include +#include "libusbk.h" + +//MISC INCLUDES +#include +#include + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + //Interals + KLST_HANDLE deviceList = NULL; + KLST_DEVINFO_HANDLE deviceInfo = NULL; + DWORD ec = ERROR_SUCCESS; + UCHAR pipeIndex = 0; + WINUSB_PIPE_INFORMATION pipeInfo; + ULONG VIDin, PIDin; + ULONG deviceCount = 0; + //To export: + KUSB_HANDLE handle = NULL; + char handle_string[17]; + + char *VID_CHAR, *PID_CHAR; + + VID_CHAR = mxArrayToString(prhs[0]); + PID_CHAR = mxArrayToString(prhs[1]); + + printf("VID=%s\n", VID_CHAR); + printf("PID=%s\n", PID_CHAR); + + sscanf(VID_CHAR, "%4x", &VIDin); + sscanf(PID_CHAR, "%04x", &PIDin); + + //Init device list! + if (!LstK_Init(&deviceList, 0)) { + mexPrintf("Error initializing device list.\n"); + return; + } + + //Check if device list is empty + LstK_Count(deviceList, &deviceCount); + if (!deviceCount) { + mexPrintf("Device list empty.\n"); + LstK_Free(deviceList); // If LstK_Init returns TRUE, the list must be freed. + return; + } + + mexPrintf("Looking for device vid/pid %04X/%04X..\n", VIDin, PIDin); + + //Set device info to the info specified by the INF that belongs to said VID/PID pair + LstK_FindByVidPid(deviceList, VIDin, PIDin, &deviceInfo); + if (deviceInfo){ + mexPrintf("Using %04X:%04X (%s): %s - %s\n", + deviceInfo->Common.Vid, + deviceInfo->Common.Pid, + deviceInfo->Common.InstanceID, + deviceInfo->DeviceDesc, + deviceInfo->Mfg); + } + else { + mexPrintf("Yeah nah kent couldn't find the device aye\n"); + return; + } + + // Initialize the device + if (!UsbK_Init(&handle, deviceInfo)){ + ec = GetLastError(); + mexPrintf("Usb.Init failed. ErrorCode: %08Xh\n", ec); + } + mexPrintf("Device opened successfully!\n"); + + mexPrintf("Pipe Information:\n"); + while (UsbK_QueryPipe(handle, 0, pipeIndex++, &pipeInfo)){ + mexPrintf(" PipeId=0x%02X PipeType=0x%02X Interval=%u MaximumPacketSize=%u\n", + pipeInfo.PipeId, pipeInfo.PipeType, pipeInfo.Interval, pipeInfo.MaximumPacketSize); + } + + + mexPrintf("Handle is %d bytes long\n", sizeof(handle)); + mexPrintf("Handle data is 0x%16x\n\n\n\n\n", handle); + + sprintf(handle_string, "%016x", handle); + + plhs[0] = mxCreateString(handle_string); + + LstK_Free(deviceList); + + return; +} diff --git a/Old Matlab Interface/.svn/pristine/51/515fab57bd8558f7621bbd33ab04891cb2b8811a.svn-base b/Old Matlab Interface/.svn/pristine/51/515fab57bd8558f7621bbd33ab04891cb2b8811a.svn-base new file mode 100644 index 00000000..09b12375 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/51/515fab57bd8558f7621bbd33ab04891cb2b8811a.svn-base @@ -0,0 +1,31 @@ +function [taxis, temp_waveform] = conv_dig(buffer, samplestoshow) +global scope_window_time + +if length(buffer)>samplestoshow + if (scope_window_time>(500/375000)) + temp_waveform = buffer((length(buffer) - samplestoshow):samplestoshow/500: length(buffer)); + temp_waveform = typecast(temp_waveform, 'uint8'); + temp_waveform = logical(bitand(temp_waveform,16)); + else + throwaway = round((ceil(samplestoshow)-samplestoshow)*8); + dig_samples = buffer((length(buffer) - samplestoshow) : length(buffer)); + dig_samples = typecast(dig_samples, 'uint8'); + temp_waveform = false(1,length(dig_samples)*8); + temp_waveform(1:8:length(temp_waveform)) = bitand(dig_samples,128); + temp_waveform(2:8:length(temp_waveform)) = bitand(dig_samples,64); + temp_waveform(3:8:length(temp_waveform)) = bitand(dig_samples,32); + temp_waveform(4:8:length(temp_waveform)) = bitand(dig_samples,16); + temp_waveform(5:8:length(temp_waveform)) = bitand(dig_samples,8); + temp_waveform(6:8:length(temp_waveform)) = bitand(dig_samples,4); + temp_waveform(7:8:length(temp_waveform)) = bitand(dig_samples,2); + temp_waveform(8:8:length(temp_waveform)) = bitand(dig_samples,1); + + temp_waveform = temp_waveform((throwaway+1):end); + temp_waveform = temp_waveform(1:length(temp_waveform)/500:end); + end + taxis = linspace(-scope_window_time,0,length(temp_waveform)); + return +end + +taxis = []; +temp_waveform = []; \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/52/52199dbf885e9ec1c33e31cde43d2a282dbd5a39.svn-base b/Old Matlab Interface/.svn/pristine/52/52199dbf885e9ec1c33e31cde43d2a282dbd5a39.svn-base new file mode 100644 index 00000000..9a908ffa --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/52/52199dbf885e9ec1c33e31cde43d2a282dbd5a39.svn-base @@ -0,0 +1,24 @@ +function [] = displaypacket(new_packets) + +global saved_waveform_ch1 +global saved_waveform_ch2 +global scope_mode + + +%%Pull out CH1 data +if scope_mode < 5 + transfer_contents_temp = []; + for tempovar = 0:length(new_packets)/750 - 1 + transfer_contents_temp = [transfer_contents_temp new_packets((tempovar*750+1):(tempovar*750+374))]; + end + saved_waveform_ch1 = [saved_waveform_ch1 transfer_contents_temp]; +end + +%%Pull out CH2 data for relevant states +if (scope_mode == 1 | scope_mode == 2 | scope_mode == 4) + transfer_contents_temp = []; + for tempovar = 0:length(new_packets)/750 - 1 + transfer_contents_temp = [transfer_contents_temp new_packets((tempovar*750+376):(tempovar*750+749))]; + end + saved_waveform_ch2 = [saved_waveform_ch2 transfer_contents_temp]; +end \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/56/56fd215b6b3d0436eae86a247d4b0dc543e49390.svn-base b/Old Matlab Interface/.svn/pristine/56/56fd215b6b3d0436eae86a247d4b0dc543e49390.svn-base new file mode 100644 index 00000000..e2437114 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/56/56fd215b6b3d0436eae86a247d4b0dc543e49390.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/57/571c8f6ab65e01badee44f72848f6375c4712600.svn-base b/Old Matlab Interface/.svn/pristine/57/571c8f6ab65e01badee44f72848f6375c4712600.svn-base new file mode 100644 index 00000000..9beca6a8 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/57/571c8f6ab65e01badee44f72848f6375c4712600.svn-base @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4959 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Handle.Test.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Old Matlab Interface/.svn/pristine/57/572bf27dfedabdb5a9d3c7981b098e71dca49f0f.svn-base b/Old Matlab Interface/.svn/pristine/57/572bf27dfedabdb5a9d3c7981b098e71dca49f0f.svn-base new file mode 100644 index 00000000..276ddd0a --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/57/572bf27dfedabdb5a9d3c7981b098e71dca49f0f.svn-base @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4959 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Hot.Plug.Detect.GUI.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Old Matlab Interface/.svn/pristine/58/5813b6b7f9eb3d89e58a3a4b26364d7e1062255e.svn-base b/Old Matlab Interface/.svn/pristine/58/5813b6b7f9eb3d89e58a3a4b26364d7e1062255e.svn-base new file mode 100644 index 00000000..910ca72b --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/58/5813b6b7f9eb3d89e58a3a4b26364d7e1062255e.svn-base @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4959 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Hot.Plug.Detect.GUI.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Hot.Plug.Detect.GUI.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Old Matlab Interface/.svn/pristine/58/58218339f1e12918006f36e0cfd826fc23983e57.svn-base b/Old Matlab Interface/.svn/pristine/58/58218339f1e12918006f36e0cfd826fc23983e57.svn-base new file mode 100644 index 00000000..00e349c8 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/58/58218339f1e12918006f36e0cfd826fc23983e57.svn-base @@ -0,0 +1,148 @@ +global scope_window_time +global scope_window_max +global scope_window_min +global scope_mode +global gui_axes +global text_box_1 +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global gui_cursor_mode +global saved_waveform_ch1 +global saved_waveform_ch2 +global gui_scope_running + +global refreshrate_temp +global refreshrate + +global waveform_exists +global gui_delay + +refreshrate_temp = refreshrate_temp - 1; + +tic +delay_sec = get(gui_delay, 'Max') - get(gui_delay, 'Value'); +switch(scope_mode) + case 0 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + %if(gui_scope_running) + [taxis, cool_waveform, update_enable] = conv_ana(saved_waveform_ch1, 375000*scope_window_time, 0); + %end + plotcursors + waveform_exists = 1; + else + if (waveform_exists & update_enable) + set(text_box_1, 'String', sprintf(' ---------------------\n Vmin = %.2fV\n ---------------------\n Vmax = %.2f\n ---------------------\n Vmean = %.2f\n ---------------------\n Vrms = %.2f\n ---------------------\n ', min(cool_waveform), max(cool_waveform), mean(cool_waveform), rms(cool_waveform))); + %title(titlestring); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Voltage (V)') + drawnow + end + end + case 1 + if ~(refreshrate == 4) + error('Refreshrate assumed to be 4 for Mode 1') + end + switch(refreshrate_temp) + case 3 + %if(gui_scope_running) + [taxis, cool_waveform, update_enable] = conv_ana(saved_waveform_ch1, 375000*scope_window_time, 0); + [taxis_ch2, temp_waveform_ch2] = conv_dig(saved_waveform_ch2, 375000*scope_window_time); + temp_waveform_ch2 = (scope_window_max - (0.05*(scope_window_max - scope_window_min)) - scope_window_min) * temp_waveform_ch2 + scope_window_min + (0.025*(scope_window_max - scope_window_min)); + % end + case 2 + stairs(gui_axes, taxis_ch2, temp_waveform_ch2, 'c'); + hold(gui_axes, 'on') + case 1 + plotcursors + hold(gui_axes, 'off') + case 0 + if(update_enable) + set(text_box_1, 'String', sprintf(' ---------------------\n Vmin = %.2fV\n ---------------------\n Vmax = %.2f\n ---------------------\n Vmean = %.2f\n ---------------------\n Vrms = %.2f\n ---------------------\n ', min(cool_waveform), max(cool_waveform), mean(cool_waveform), rms(cool_waveform))); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Voltage (V)') + refreshrate_temp = refreshrate; + drawnow + end + end + case 2 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + % if(gui_scope_running) + [taxis_ch1, cool_waveform_ch1, update_enable] = conv_ana(saved_waveform_ch1, 375000*scope_window_time, 0); + [taxis_ch2, cool_waveform_ch2] = conv_ana(saved_waveform_ch2, 375000*scope_window_time, 1); + %end + plotcursors + waveform_exists = 1; + else + if (waveform_exists & update_enable) + set(text_box_1, 'String', sprintf(' ---------------------\n Vmin = %.2fV\n ---------------------\n Vmax = %.2f\n ---------------------\n Vmean = %.2f\n ---------------------\n Vrms = %.2f\n ---------------------\n ', min(cool_waveform_ch1), max(cool_waveform_ch1), mean(cool_waveform_ch1), rms(cool_waveform_ch1))); + %title(titlestring); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Voltage (V)') + drawnow + end + end + case 3 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + %if(gui_scope_running) + [taxis, temp_waveform] = conv_dig(saved_waveform_ch1, 375000*scope_window_time); + % end + stairs(gui_axes, taxis, temp_waveform, 'y'); + else + set(gui_axes, 'Ylim', [-0.1, 1.1], 'Xlim', [-scope_window_time-delay_sec, 0-delay_sec], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + set(text_box_1, 'String', 'Scope in dig mode'); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Logic Value') + drawnow + end + case 4 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + % if(gui_scope_running) + [taxis_ch1, temp_waveform_ch1] = conv_dig(saved_waveform_ch1, 375000*scope_window_time); + [taxis_ch2, temp_waveform_ch2] = conv_dig(saved_waveform_ch2, 375000*scope_window_time); + %end + waveform_exists = 1 + stairs(gui_axes, taxis_ch1, temp_waveform_ch1, 'y'); + hold(gui_axes, 'off') + elseif (refreshrate_temp == 1) && (waveform_exists) + stairs(gui_axes, taxis_ch2, temp_waveform_ch2, 'c'); + hold(gui_axes, 'on') + else + set(gui_axes, 'Ylim', [-0.1, 1.1], 'Xlim', [-scope_window_time-delay_sec, 0-delay_sec], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + set(text_box_1, 'String', 'Scope in dig mode'); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Logic Value') + drawnow + end + case 5 + set(text_box_1, 'String', 'Scope disabled'); + xlabel(gui_axes, '') + ylabel(gui_axes, '') + drawnow + pause(0.001) + case 6 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + %if(gui_scope_running) + [taxis, cool_waveform, update_enable] = conv_ana(saved_waveform_ch1, 750000*scope_window_time, 0); + %end + plotcursors + waveform_exists = 1; + else + if (waveform_exists & update_enable) + set(text_box_1, 'String', sprintf(' ---------------------\n Vmin = %.2fV\n ---------------------\n Vmax = %.2f\n ---------------------\n Vmean = %.2f\n ---------------------\n Vrms = %.2f\n ---------------------\n ', min(cool_waveform), max(cool_waveform), mean(cool_waveform), rms(cool_waveform))); + %title(titlestring); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Voltage (V)') + drawnow + end + end + otherwise + error('scope_mode invalid!') +end +toc \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/59/595f27fe648f1942abb804c8fbb9342ecf345a4e.svn-base b/Old Matlab Interface/.svn/pristine/59/595f27fe648f1942abb804c8fbb9342ecf345a4e.svn-base new file mode 100644 index 00000000..a36eca48 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/59/595f27fe648f1942abb804c8fbb9342ecf345a4e.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/59/59a310c93c725583f6365f711ff3ba6f6d022b13.svn-base b/Old Matlab Interface/.svn/pristine/59/59a310c93c725583f6365f711ff3ba6f6d022b13.svn-base new file mode 100644 index 00000000..6dbbd773 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/59/59a310c93c725583f6365f711ff3ba6f6d022b13.svn-base @@ -0,0 +1,118 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// Hot.Plug.Detect +// +// Last Updated: 04.28.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +using System; +using libusbK; + +namespace Hot.Plug.Detect +{ + internal class Program + { + // ReSharper disable InconsistentNaming + + #region For Window Applications + private const int WM_USER = 0x400; + private const int WM_USER_HOT_BASE = WM_USER; + private const int WM_USER_HOT_REMOVAL = WM_USER_HOT_BASE; + private const int WM_USER_HOT_ARRIVAL = WM_USER_HOT_BASE + 1; + #endregion + + private static void Main() + { + KHOT_PARAMS hotInitParams = new KHOT_PARAMS(); + + // In the real world, you would want to filter for only *your* device(s). + hotInitParams.PatternMatch.DeviceInterfaceGUID = "*"; + + // The PLUG_ALL_ON_INIT flag will force plug events for matching devices that are already connected. + hotInitParams.Flags = KHOT_FLAG.PLUG_ALL_ON_INIT; + + hotInitParams.OnHotPlug = OnHotPlug; + + /* Instead of a callback you can send/post messages directly to a window handle. + hotInitParams.UserHwnd = MyForm.Handle; + hotInitParams.UserMessage = WM_USER_HOT_BASE; + */ + + Console.WriteLine("Monitoring libusbK arrival/removal events."); + Console.WriteLine("[PatternMatch]"); + Console.WriteLine(hotInitParams.PatternMatch.ToString()); + Console.WriteLine("Press [ENTER] to exit.."); + + while (Console.KeyAvailable) Console.ReadKey(true); + + // You may set your initial hot handle user context like this. + // This example is using it to count connected devices and detect the first OnHotPlug event (Int32.MaxValue). + AllKFunctions.LibK_SetDefaultContext(KLIB_HANDLE_TYPE.HOTK, new IntPtr(Int32.MaxValue)); + + // Start hot-plug detection. + HotK hot = new HotK(ref hotInitParams); + + Console.ReadLine(); + + hot.Free(); + } + + private static void OnHotPlug(KHOT_HANDLE hotHandle, + KLST_DEVINFO_HANDLE deviceInfo, + KLST_SYNC_FLAG plugType) + { + string plugText; + + int totalPluggedDeviceCount = (int) hotHandle.GetContext().ToInt64(); + if (totalPluggedDeviceCount == int.MaxValue) + { + Console.WriteLine("OnHotPlug is being called for the first time on handle:{0}", hotHandle.Pointer); + totalPluggedDeviceCount = 0; + } + + switch (plugType) + { + case KLST_SYNC_FLAG.ADDED: + plugText = "Arrival"; + totalPluggedDeviceCount++; + break; + case KLST_SYNC_FLAG.REMOVED: + plugText = "Removal"; + totalPluggedDeviceCount--; + break; + default: + throw new ArgumentOutOfRangeException("plugType"); + } + + hotHandle.SetContext(new IntPtr(totalPluggedDeviceCount)); + + Console.WriteLine("\n[OnHotPlug] Device {0}:{1} \n", + plugText, + deviceInfo); + Console.WriteLine("Total Plugged Device Count: {0}", + totalPluggedDeviceCount); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/5a/5a04bd49ab8afaf758cd327491fedb96f3865d3e.svn-base b/Old Matlab Interface/.svn/pristine/5a/5a04bd49ab8afaf758cd327491fedb96f3865d3e.svn-base new file mode 100644 index 00000000..bde5de18 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/5a/5a04bd49ab8afaf758cd327491fedb96f3865d3e.svn-base @@ -0,0 +1,624 @@ +function varargout = first_gui(varargin) +% FIRST_GUI MATLAB code for first_gui.fig +% FIRST_GUI, by itself, creates a new FIRST_GUI or raises the existing +% singleton*. +% +% H = FIRST_GUI returns the handle to a new FIRST_GUI or the handle to +% the existing singleton*. +% +% FIRST_GUI('CALLBACK',hObject,eventData,handles,...) calls the local +% function named CALLBACK in FIRST_GUI.M with the given input arguments. +% +% FIRST_GUI('Property','Value',...) creates a new FIRST_GUI or raises the +% existing singleton*. Starting from the left, property value pairs are +% applied to the GUI before first_gui_OpeningFcn gets called. An +% unrecognized property name or invalid value makes property application +% stop. All inputs are passed to first_gui_OpeningFcn via varargin. +% +% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one +% instance to run (singleton)". +% +% See also: GUIDE, GUIDATA, GUIHANDLES + +% Edit the above text to modify the response to help first_gui + +% Last Modified by GUIDE v2.5 05-Aug-2015 16:20:06 + +% Begin initialization code - DO NOT EDIT +gui_Singleton = 1; +gui_State = struct('gui_Name', mfilename, ... + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @first_gui_OpeningFcn, ... + 'gui_OutputFcn', @first_gui_OutputFcn, ... + 'gui_LayoutFcn', [] , ... + 'gui_Callback', []); +if nargin && ischar(varargin{1}) + gui_State.gui_Callback = str2func(varargin{1}); +end + +if nargout + [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); +else + gui_mainfcn(gui_State, varargin{:}); +end +% End initialization code - DO NOT EDIT + + +% --- Executes just before first_gui is made visible. +function first_gui_OpeningFcn(hObject, eventdata, handles, varargin) +% This function has no output args, see OutputFcn. +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +% varargin command line arguments to first_gui (see VARARGIN) + +% Choose default command line output for first_gui +handles.output = hObject; + +handles + +global gui_axes +global text_box_1 +global text_box_2 +global gui_scope_running +global gui_cursor_mode +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global scope_window_min +global gui_awg_waveform +global gui_awg_amplitude +global gui_awg_frequency +global gui_vo +global gui_ro + +gui_axes = handles.axes1; +text_box_1 = handles.edit1; +text_box_2 = handles.text9 +gui_scope_running = 1; +gui_cursor_mode = 1; + +setscopewindowsize(1, -12, 12) + +gui_vert_cursor_a_pos = 0; +gui_vert_cursor_b_pos = 0; +gui_hori_cursor_a_pos = scope_window_min; +gui_hori_cursor_b_pos = scope_window_min; + +gui_awg_waveform = 'sin(linspace(0,2*pi,128))'; +gui_awg_amplitude = '255'; +gui_awg_frequency = '50' + +gui_vo = 0; +gui_ro = 1000; + + +%get(handles.axes1) + +% Update handles structure +guidata(hObject, handles); + +% UIWAIT makes first_gui wait for user response (see UIRESUME) +% uiwait(handles.figure1); + + +% --- Outputs from this function are returned to the command line. +function varargout = first_gui_OutputFcn(hObject, eventdata, handles) +% varargout cell array for returning output args (see VARARGOUT); +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Get default command line output from handles structure +varargout{1} = handles.output; + + + +function edit1_Callback(hObject, eventdata, handles) +% hObject handle to edit1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit1 as text +% str2double(get(hObject,'String')) returns contents of edit1 as a double + + +% --- Executes during object creation, after setting all properties. +function edit1_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit2_Callback(hObject, eventdata, handles) +% hObject handle to edit2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit2 as text +% str2double(get(hObject,'String')) returns contents of edit2 as a double + + +% --- Executes during object creation, after setting all properties. +function edit2_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit3_Callback(hObject, eventdata, handles) +% hObject handle to edit3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit3 as text +% str2double(get(hObject,'String')) returns contents of edit3 as a double + + +% --- Executes during object creation, after setting all properties. +function edit3_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit4_Callback(hObject, eventdata, handles) +% hObject handle to edit4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit4 as text +% str2double(get(hObject,'String')) returns contents of edit4 as a double + + +% --- Executes during object creation, after setting all properties. +function edit4_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider1_Callback(hObject, eventdata, handles) +global scope_window_time +% hObject handle to slider1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +scope_window_time = 10^(-get(hObject, 'value')) +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider1_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + + +function edit5_Callback(hObject, eventdata, handles) +% hObject handle to edit5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit5 as text +% str2double(get(hObject,'String')) returns contents of edit5 as a double + + +% --- Executes during object creation, after setting all properties. +function edit5_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton1. +function pushbutton1_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + + +% --- Executes on slider movement. +function slider2_Callback(hObject, eventdata, handles) +% hObject handle to slider2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_hori_cursor_a_pos +global scope_window_max +global scope_window_min +global text_box_2 +global gui_cursor_mode + +gui_hori_cursor_a_pos = scope_window_min + (scope_window_max - scope_window_min) * get(hObject,'Value'); + +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %.3f\n V2 = %.3f\n DeltaV = %.3f\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %.3f\n T2 = %.3f\n DeltaT = %.3f\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %.3f\n T2 = %.3f\n DeltaT = %.3f\n \n V1 = %.3f\n V2 = %.3f\n DeltaV = %.3f\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider2_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on selection change in popupmenu1. +function popupmenu1_Callback(hObject, eventdata, handles) +% hObject handle to popupmenu1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_cursor_mode +gui_cursor_mode = get(hObject,'Value') + +% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array +% contents{get(hObject,'Value')} returns selected item from popupmenu1 + + +% --- Executes during object creation, after setting all properties. +function popupmenu1_CreateFcn(hObject, eventdata, handles) +% hObject handle to popupmenu1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: popupmenu controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider3_Callback(hObject, eventdata, handles) +% hObject handle to slider3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_hori_cursor_b_pos +global scope_window_max +global scope_window_min +global text_box_2 +global gui_cursor_mode + +gui_hori_cursor_b_pos = scope_window_min + (scope_window_max - scope_window_min) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %.3f\n V2 = %.3f\n DeltaV = %.3f\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %.3f\n T2 = %.3f\n DeltaT = %.3f\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %.3f\n T2 = %.3f\n DeltaT = %.3f\n \n V1 = %.3f\n V2 = %.3f\n DeltaV = %.3f\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider3_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + + +function edit6_Callback(hObject, eventdata, handles) +% hObject handle to edit6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_waveform +gui_awg_waveform = get(hObject,'String'); + + +% Hints: get(hObject,'String') returns contents of edit6 as text +% str2double(get(hObject,'String')) returns contents of edit6 as a double + + +% --- Executes during object creation, after setting all properties. +function edit6_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton3. +function pushbutton3_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_awg_waveform +global gui_awg_amplitude +global gui_awg_frequency +gui_awg_waveform +gui_awg_amplitude +gui_awg_frequency +tiny_send_waveform(eval(gui_awg_waveform), str2num(gui_awg_amplitude), str2num(gui_awg_frequency)); + + +function edit7_Callback(hObject, eventdata, handles) +% hObject handle to edit7 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_amplitude +gui_awg_amplitude = get(hObject,'String'); + +% Hints: get(hObject,'String') returns contents of edit7 as text +% str2double(get(hObject,'String')) returns contents of edit7 as a double + + +% --- Executes during object creation, after setting all properties. +function edit7_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit7 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit8_Callback(hObject, eventdata, handles) +% hObject handle to edit8 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_frequency +gui_awg_frequency = get(hObject,'String'); +% Hints: get(hObject,'String') returns contents of edit8 as text +% str2double(get(hObject,'String')) returns contents of edit8 as a double + + +% --- Executes during object creation, after setting all properties. +function edit8_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit8 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. + +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton4. +function pushbutton4_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_scope_running +gui_scope_running = ~gui_scope_running + + + +function edit9_Callback(hObject, eventdata, handles) +% hObject handle to edit9 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vo; +gui_vo = str2num(get(hObject, 'String')); + +% Hints: get(hObject,'String') returns contents of edit9 as text +% str2double(get(hObject,'String')) returns contents of edit9 as a double + + +% --- Executes during object creation, after setting all properties. +function edit9_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit9 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit10_Callback(hObject, eventdata, handles) +% hObject handle to edit10 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_ro; +gui_ro = str2num(get(hObject, 'String')); +% Hints: get(hObject,'String') returns contents of edit10 as text +% str2double(get(hObject,'String')) returns contents of edit10 as a double + + +% --- Executes during object creation, after setting all properties. +function edit10_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit10 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton5. +function pushbutton5_Callback(hObject, eventdata, handles) +global gui_vo +global gui_ro +setpsu(gui_vo, gui_ro); +% hObject handle to pushbutton5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + + +% --- Executes on slider movement. +function slider4_Callback(hObject, eventdata, handles) +% hObject handle to slider4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vert_cursor_a_pos +global scope_window_time +global text_box_2 +global gui_cursor_mode + +gui_vert_cursor_a_pos = -scope_window_time + (scope_window_time) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %.3f\n V2 = %.3f\n DeltaV = %.3f\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %.3f\n T2 = %.3f\n DeltaT = %.3f\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %.3f\n T2 = %.3f\n DeltaT = %.3f\n \n V1 = %.3f\n V2 = %.3f\n DeltaV = %.3f\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider4_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on slider movement. +function slider5_Callback(hObject, eventdata, handles) +% hObject handle to slider5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vert_cursor_b_pos +global scope_window_time +global text_box_2 +global gui_cursor_mode +gui_vert_cursor_b_pos = -scope_window_time + (scope_window_time) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %.3f\n V2 = %.3f\n DeltaV = %.3f\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %.3f\n T2 = %.3f\n DeltaT = %.3f\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %.3f\n T2 = %.3f\n DeltaT = %.3f\n \n V1 = %.3f\n V2 = %.3f\n DeltaV = %.3f\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider5_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end diff --git a/Old Matlab Interface/.svn/pristine/5d/5d281d1e5368816eaa425ac9a876e265bdeb0f1b.svn-base b/Old Matlab Interface/.svn/pristine/5d/5d281d1e5368816eaa425ac9a876e265bdeb0f1b.svn-base new file mode 100644 index 00000000..6f1e8d30 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/5d/5d281d1e5368816eaa425ac9a876e265bdeb0f1b.svn-base @@ -0,0 +1,66 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {97DB9A34-994D-470E-A415-AC54ACD96713} + Exe + Properties + Read.Isochronous + Read.Isochronous + v2.0 + 512 + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + libusbK.cs + + + Common\BenchmarkTestDevice.cs + + + Common\HiPerfTimer.cs + + + Common\TestParameters.cs + + + + + + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/5e/5e1d04de66ffcc5dfd813530ab6992e6daaae417.svn-base b/Old Matlab Interface/.svn/pristine/5e/5e1d04de66ffcc5dfd813530ab6992e6daaae417.svn-base new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/5e/5e1d04de66ffcc5dfd813530ab6992e6daaae417.svn-base @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Old Matlab Interface/.svn/pristine/5e/5e58d8a07a334d81a70b361ad73b5e8a5e447688.svn-base b/Old Matlab Interface/.svn/pristine/5e/5e58d8a07a334d81a70b361ad73b5e8a5e447688.svn-base new file mode 100644 index 00000000..ab0f6183 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/5e/5e58d8a07a334d81a70b361ad73b5e8a5e447688.svn-base @@ -0,0 +1,12 @@ +clear all + +global usb_handle +if ~length(usb_handle) + warning('USB Handle not initialised. Initialising!') + mex_usb_init('03eb', 'a000') +end + +%mex USB_ISO_INIT.c -Iincludes -llibusbK -Lbin\lib\amd64 +%USB_ISO_INIT(usb_handle) +[isoCtx_0, isoCtx_1, ovlkHandle_0, ovlkHandle_1, ovlPool, isoBuffer] = USB_ISO_INIT(usb_handle) +%USB_ISO_LOOP(usb_handle, isoCtx, ovlkHandle, ovlPool, isoBuffer, uint8(0)) \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/5f/5f04c8e98522ce9584f2216a606b11301e8e357a.svn-base b/Old Matlab Interface/.svn/pristine/5f/5f04c8e98522ce9584f2216a606b11301e8e357a.svn-base new file mode 100644 index 00000000..8a3093e0 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/5f/5f04c8e98522ce9584f2216a606b11301e8e357a.svn-base @@ -0,0 +1,3 @@ +function [] = vexconv(vex, r) + +r = (1/r + 1/250)^-1; diff --git a/Old Matlab Interface/.svn/pristine/5f/5f4e17dea5e6b15424f9d7af77a70beb8bcdf153.svn-base b/Old Matlab Interface/.svn/pristine/5f/5f4e17dea5e6b15424f9d7af77a70beb8bcdf153.svn-base new file mode 100644 index 00000000..035f0468 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/5f/5f4e17dea5e6b15424f9d7af77a70beb8bcdf153.svn-base @@ -0,0 +1,27 @@ +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global scope_window_time +global scope_window_max +global scope_window_min + +global gui_cursor_mode +global gui_axes + + +switch(gui_cursor_mode) + case 1 + plot(gui_axes, taxis, cool_waveform, 'y'); + case 2 + plot(gui_axes, taxis, cool_waveform, 'y', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + case 3 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:'); + case 4 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + + otherwise + error('Gui_axes is in an invalid state'); +end +set(gui_axes, 'Ylim', [scope_window_min, scope_window_max], 'Xlim', [-scope_window_time, 0], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + diff --git a/Old Matlab Interface/.svn/pristine/62/625d155c06d982dcf6562f7b33f057c2000f7a35.svn-base b/Old Matlab Interface/.svn/pristine/62/625d155c06d982dcf6562f7b33f057c2000f7a35.svn-base new file mode 100644 index 00000000..dca059f2 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/62/625d155c06d982dcf6562f7b33f057c2000f7a35.svn-base @@ -0,0 +1,96 @@ +//MATLAB INCLUDES +#include +#include + +//LIBUSBK INCLUDES +#include +#include +#include +#include +#include "libusbk.h" + +//MISC INCLUDES +#include +#include + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + //Interals + KLST_HANDLE deviceList = NULL; + KLST_DEVINFO_HANDLE deviceInfo = NULL; + DWORD ec = ERROR_SUCCESS; + UCHAR pipeIndex = 0; + WINUSB_PIPE_INFORMATION pipeInfo; + ULONG VIDin, PIDin; + ULONG deviceCount = 0; + //To export: + KUSB_HANDLE handle = NULL; + char handle_string[17]; + + char *VID_CHAR, *PID_CHAR; + + VID_CHAR = mxArrayToString(prhs[0]); + PID_CHAR = mxArrayToString(prhs[1]); + + printf("VID=%s\n", VID_CHAR); + printf("PID=%s\n", PID_CHAR); + + sscanf(VID_CHAR, "%4x", &VIDin); + sscanf(PID_CHAR, "%04x", &PIDin); + + //Init device list! + if (!LstK_Init(&deviceList, 0)) { + mexPrintf("Error initializing device list.\n"); + return; + } + + //Check if device list is empty + LstK_Count(deviceList, &deviceCount); + if (!deviceCount) { + mexPrintf("Device list empty.\n"); + LstK_Free(deviceList); // If LstK_Init returns TRUE, the list must be freed. + return; + } + + mexPrintf("Looking for device vid/pid %04X/%04X..\n", VIDin, PIDin); + + //Set device info to the info specified by the INF that belongs to said VID/PID pair + LstK_FindByVidPid(deviceList, VIDin, PIDin, &deviceInfo); + if (deviceInfo){ + mexPrintf("Using %04X:%04X (%s): %s - %s\n", + deviceInfo->Common.Vid, + deviceInfo->Common.Pid, + deviceInfo->Common.InstanceID, + deviceInfo->DeviceDesc, + deviceInfo->Mfg); + } + else { + mexPrintf("Yeah nah kent couldn't find the device aye\n"); + return; + } + + // Initialize the device + if (!UsbK_Init(&handle, deviceInfo)){ + ec = GetLastError(); + mexPrintf("Usb.Init failed. ErrorCode: %08Xh\n", ec); + } + mexPrintf("Device opened successfully!\n"); + + mexPrintf("Pipe Information:\n"); + while (UsbK_QueryPipe(handle, 0, pipeIndex++, &pipeInfo)){ + mexPrintf(" PipeId=0x%02X PipeType=0x%02X Interval=%u MaximumPacketSize=%u\n", + pipeInfo.PipeId, pipeInfo.PipeType, pipeInfo.Interval, pipeInfo.MaximumPacketSize); + } + + + mexPrintf("Handle is %d bytes long\n", sizeof(handle)); + mexPrintf("Handle data is 0x%16x\n\n\n\n\n", handle); + + sprintf(handle_string, "%016x", handle); + + plhs[0] = mxCreateString(handle_string); + + LstK_Free(deviceList); + + return; +} diff --git a/Old Matlab Interface/.svn/pristine/66/668a6732f464095a0d6f139f3b99925ffb4003f2.svn-base b/Old Matlab Interface/.svn/pristine/66/668a6732f464095a0d6f139f3b99925ffb4003f2.svn-base new file mode 100644 index 00000000..4f3d52aa --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/66/668a6732f464095a0d6f139f3b99925ffb4003f2.svn-base @@ -0,0 +1,17 @@ +function [taxis, cool_waveform] = conv_ana(buffer, samplestoshow) + + global scope_window_time + + if length(buffer)>samplestoshow + if (samplestoshow>500) + temp_waveform = buffer((length(buffer) - samplestoshow):samplestoshow/500: length(buffer)); + else + temp_waveform = buffer((length(buffer) - samplestoshow): length(buffer)); + end + undofrontend; + taxis = linspace(-scope_window_time,0,length(cool_waveform)); + return + end + + taxis = []; + cool_waveform = []; \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/66/668cfaa1a816b8698bcfe18181d4964d1dc45605.svn-base b/Old Matlab Interface/.svn/pristine/66/668cfaa1a816b8698bcfe18181d4964d1dc45605.svn-base new file mode 100644 index 00000000..10eb9f0c Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/66/668cfaa1a816b8698bcfe18181d4964d1dc45605.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/67/670da6e74eb825895d78773d5fb7e693456cbfaa.svn-base b/Old Matlab Interface/.svn/pristine/67/670da6e74eb825895d78773d5fb7e693456cbfaa.svn-base new file mode 100644 index 00000000..9adaca83 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/67/670da6e74eb825895d78773d5fb7e693456cbfaa.svn-base @@ -0,0 +1,125 @@ +%mex USB_ISO_LOOP.c -Iincludes -llibusbK -Lbin\lib\amd64 +%clear all + +global usb_handle +global scope_gain +global scope_window_time +global scope_window_max +global scope_window_min +global scope_mode +global gui_scope_running + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global gui_cursor_mode + +dotheplot + +if ~length(usb_handle) + warning('USB Handle not initialised. Initialising!') + mex_usb_init('03eb', 'a000') +end + +[isoCtx_0, isoCtx_1, ovlkHandle_0, ovlkHandle_1, ovlPool, isoBuffer] = USB_ISO_INIT(usb_handle) + +refreshrate = 4; +refreshrate_temp = refreshrate; + +if(isempty(max_n)) + max_n = 10 +end +saved_waveform = int8([]); + +if isempty(scope_mode) + error('You didn''t set the scope mode!'); +end + +if isempty(scope_window_time) + error('You didn''t set the window time (x) value!'); +end + +if (scope_window_time < 1/375000) + error('Scope window size is too small!'); +end + +if(scope_mode==0) + if isempty(scope_gain) + error('You didn''t set the gain!'); + end + + if isempty(scope_window_min) + error('You didn''t set the minimum window voltage value!'); + end + + if isempty(scope_window_max) + error('You didn''t set the maximum window voltage value!'); + end +end + +dropped_packets = 0; +waveform_exists = 0; + +for n=1:max_n + %[transfer_contents_0] = USB_ISO_LOOP(usb_handle, isoCtx_0, ovlkHandle_0, ovlPool, isoBuffer, uint8(0)); + [transfer_contents_0, libk_error] = USB_ISO_LOOP(usb_handle, isoCtx_0, ovlkHandle_0, ovlPool, isoBuffer, uint8(0)); + keep_in_sync + transfer_contents_temp = []; + for tempovar = 0:length(transfer_contents_0)/750 - 1 + transfer_contents_temp = [transfer_contents_temp transfer_contents_0((tempovar*750+1):(tempovar*750+374))]; + end + saved_waveform = [saved_waveform transfer_contents_temp]; + if(gui_scope_running) + updatescopeaxes + else + switch(gui_cursor_mode) + case 1 + plot(gui_axes, taxis, cool_waveform, 'y'); + case 2 + plot(gui_axes, taxis, cool_waveform, 'y', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + case 3 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:'); + case 4 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + + otherwise + error('Gui_axes is in an invalid state'); + end + set(gui_axes, 'Ylim', [scope_window_min, scope_window_max], 'Xlim', [-scope_window_time, 0], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + drawnow + end + + %[transfer_contents_1] = USB_ISO_LOOP(usb_handle, isoCtx_1, ovlkHandle_1, ovlPool, isoBuffer, uint8(1)); + [transfer_contents_1, libk_error] = USB_ISO_LOOP(usb_handle, isoCtx_1, ovlkHandle_1, ovlPool, isoBuffer, uint8(1)); + keep_in_sync + + transfer_contents_temp = []; + for tempovar = 0:length(transfer_contents_1)/750 - 1 + transfer_contents_temp = [transfer_contents_temp transfer_contents_1((tempovar*750+1):(tempovar*750+374))]; + end + saved_waveform = [saved_waveform transfer_contents_temp]; + if(gui_scope_running) + updatescopeaxes + else + switch(gui_cursor_mode) + case 1 + plot(gui_axes, taxis, cool_waveform, 'y'); + case 2 + plot(gui_axes, taxis, cool_waveform, 'y', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + case 3 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:'); + case 4 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + + otherwise + error('Gui_axes is in an invalid state'); + end + set(gui_axes, 'Ylim', [scope_window_min, scope_window_max], 'Xlim', [-scope_window_time, 0], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + drawnow + end +end + +clear all +max_n = 2000 +mex_usb_iso_loop \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/68/68b6ca4c477007e9b1bc0d43b4a14c3bc1a3aad5.svn-base b/Old Matlab Interface/.svn/pristine/68/68b6ca4c477007e9b1bc0d43b4a14c3bc1a3aad5.svn-base new file mode 100644 index 00000000..c8358a40 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/68/68b6ca4c477007e9b1bc0d43b4a14c3bc1a3aad5.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/69/697b5fbc6357cededb5ebe4e63254276d07daea9.svn-base b/Old Matlab Interface/.svn/pristine/69/697b5fbc6357cededb5ebe4e63254276d07daea9.svn-base new file mode 100644 index 00000000..3b414327 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/69/697b5fbc6357cededb5ebe4e63254276d07daea9.svn-base @@ -0,0 +1,1915 @@ +/*!******************************************************************** +libusbK - Multi-driver USB library. +Copyright (C) 2012 Travis Lee Robinson. All Rights Reserved. +libusb-win32.sourceforge.net + +Development : Travis Lee Robinson (libusbdotnet@gmail.com) +Testing : Xiaofan Chen (xiaofanc@gmail.com) + +At the discretion of the user of this library, this software may be +licensed under the terms of the GNU Public License v3 or a BSD-Style +license as outlined in the following files: +* LICENSE-gpl3.txt +* LICENSE-bsd.txt + +License files are located in a license folder at the root of source and +binary distributions. +********************************************************************!*/ + +#include +#include "libusbk.h" + +#define mLoadLibraryExA LoadLibraryExA +#define mFreeLibrary FreeLibrary + +HMODULE mLibusbK_ModuleHandle = NULL; + +VOID LibusbK_DynApi_Free(VOID); +INT LibusbK_DynApi_Init(_inopt LPCSTR DllFullPathName); + +// Function typedefs: + +typedef VOID KUSB_API LibK_GetVersion_T(_out PKLIB_VERSION Version); + +typedef KLIB_USER_CONTEXT KUSB_API LibK_GetContext_T( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType); + +typedef BOOL KUSB_API LibK_SetContext_T( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue); + +typedef BOOL KUSB_API LibK_SetCleanupCallback_T( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_HANDLE_CLEANUP_CB* CleanupCB); + +typedef BOOL KUSB_API LibK_LoadDriverAPI_T( + _out PKUSB_DRIVER_API DriverAPI, + _in INT DriverID); + +typedef BOOL KUSB_API LibK_CopyDriverAPI_T( + _out PKUSB_DRIVER_API DriverAPI, + _in KUSB_HANDLE UsbHandle); + +typedef BOOL KUSB_API LibK_GetProcAddress_T( + _out KPROC* ProcAddress, + _in INT DriverID, + _in INT FunctionID); + +typedef BOOL KUSB_API LibK_SetDefaultContext_T( + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue); + +typedef KLIB_USER_CONTEXT KUSB_API LibK_GetDefaultContext_T( + _in KLIB_HANDLE_TYPE HandleType); + +typedef BOOL KUSB_API LibK_Context_Init_T( + _inopt HANDLE Heap, + _in PVOID Reserved); + +typedef VOID KUSB_API LibK_Context_Free_T(VOID); + +typedef BOOL KUSB_API UsbK_Init_T ( + _out KUSB_HANDLE* InterfaceHandle, + _in KLST_DEVINFO_HANDLE DevInfo); + +typedef BOOL KUSB_API UsbK_Free_T ( + _in KUSB_HANDLE InterfaceHandle); + +typedef BOOL KUSB_API UsbK_ClaimInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API UsbK_ReleaseInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API UsbK_SetAltInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _in UCHAR AltSettingNumber); + +typedef BOOL KUSB_API UsbK_GetAltInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _out PUCHAR AltSettingNumber); + +typedef BOOL KUSB_API UsbK_GetDescriptor_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR DescriptorType, + _in UCHAR Index, + _in USHORT LanguageID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred); + +typedef BOOL KUSB_API UsbK_ControlTransfer_T ( + _in KUSB_HANDLE InterfaceHandle, + _in WINUSB_SETUP_PACKET SetupPacket, + _refopt PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API UsbK_SetPowerPolicy_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +typedef BOOL KUSB_API UsbK_GetPowerPolicy_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +typedef BOOL KUSB_API UsbK_SetConfiguration_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR ConfigurationNumber); + +typedef BOOL KUSB_API UsbK_GetConfiguration_T ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR ConfigurationNumber); + +typedef BOOL KUSB_API UsbK_ResetDevice_T ( + _in KUSB_HANDLE InterfaceHandle); + +typedef BOOL KUSB_API UsbK_Initialize_T ( + _in HANDLE DeviceHandle, + _out KUSB_HANDLE* InterfaceHandle); + +typedef BOOL KUSB_API UsbK_SelectInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API UsbK_GetAssociatedInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AssociatedInterfaceIndex, + _out KUSB_HANDLE* AssociatedInterfaceHandle); + +typedef BOOL KUSB_API UsbK_Clone_T ( + _in KUSB_HANDLE InterfaceHandle, + _out KUSB_HANDLE* DstInterfaceHandle); + +typedef BOOL KUSB_API UsbK_QueryInterfaceSettings_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingIndex, + _out PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor); + +typedef BOOL KUSB_API UsbK_QueryDeviceInformation_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT InformationType, + _ref PUINT BufferLength, + _ref PVOID Buffer); + +typedef BOOL KUSB_API UsbK_SetCurrentAlternateSetting_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber); + +typedef BOOL KUSB_API UsbK_GetCurrentAlternateSetting_T ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR AltSettingNumber); + +typedef BOOL KUSB_API UsbK_QueryPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber, + _in UCHAR PipeIndex, + _out PWINUSB_PIPE_INFORMATION PipeInformation); + +typedef BOOL KUSB_API UsbK_SetPipePolicy_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +typedef BOOL KUSB_API UsbK_GetPipePolicy_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +typedef BOOL KUSB_API UsbK_ReadPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API UsbK_WritePipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API UsbK_ResetPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API UsbK_AbortPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API UsbK_FlushPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API UsbK_IsoReadPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +typedef BOOL KUSB_API UsbK_IsoWritePipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +typedef BOOL KUSB_API UsbK_GetCurrentFrameNumber_T ( + _in KUSB_HANDLE InterfaceHandle, + _out PUINT FrameNumber); + +typedef BOOL KUSB_API UsbK_GetOverlappedResult_T ( + _in KUSB_HANDLE InterfaceHandle, + _in LPOVERLAPPED Overlapped, + _out PUINT lpNumberOfBytesTransferred, + _in BOOL bWait); + +typedef BOOL KUSB_API UsbK_GetProperty_T ( + _in KUSB_HANDLE InterfaceHandle, + _in KUSB_PROPERTY PropertyType, + _ref PUINT PropertySize, + _out PVOID Value); + +typedef BOOL KUSB_API LstK_Init_T( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags); + +typedef BOOL KUSB_API LstK_InitEx_T( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags, + _in PKLST_PATTERN_MATCH PatternMatch); + +typedef BOOL KUSB_API LstK_Free_T( + _in KLST_HANDLE DeviceList); + +typedef BOOL KUSB_API LstK_Enumerate_T( + _in KLST_HANDLE DeviceList, + _in KLST_ENUM_DEVINFO_CB* EnumDevListCB, + _inopt PVOID Context); + +typedef BOOL KUSB_API LstK_Current_T( + _in KLST_HANDLE DeviceList, + _out KLST_DEVINFO_HANDLE* DeviceInfo); + +typedef BOOL KUSB_API LstK_MoveNext_T( + _in KLST_HANDLE DeviceList, + _outopt KLST_DEVINFO_HANDLE* DeviceInfo); + +typedef VOID KUSB_API LstK_MoveReset_T( + _in KLST_HANDLE DeviceList); + +typedef BOOL KUSB_API LstK_FindByVidPid_T( + _in KLST_HANDLE DeviceList, + _in INT Vid, + _in INT Pid, + _out KLST_DEVINFO_HANDLE* DeviceInfo); + +typedef BOOL KUSB_API LstK_Count_T( + _in KLST_HANDLE DeviceList, + _ref PUINT Count); + +typedef BOOL KUSB_API HotK_Init_T( + _out KHOT_HANDLE* Handle, + _ref PKHOT_PARAMS InitParams); + +typedef BOOL KUSB_API HotK_Free_T( + _in KHOT_HANDLE Handle); + +typedef VOID KUSB_API HotK_FreeAll_T(VOID); + +typedef BOOL KUSB_API OvlK_Acquire_T( + _out KOVL_HANDLE* OverlappedK, + _in KOVL_POOL_HANDLE PoolHandle); + +typedef BOOL KUSB_API OvlK_Release_T( + _in KOVL_HANDLE OverlappedK); + +typedef BOOL KUSB_API OvlK_Init_T ( + _out KOVL_POOL_HANDLE* PoolHandle, + _in KUSB_HANDLE UsbHandle, + _in INT MaxOverlappedCount, + _inopt KOVL_POOL_FLAG Flags); + +typedef BOOL KUSB_API OvlK_Free_T( + _in KOVL_POOL_HANDLE PoolHandle); + +typedef HANDLE KUSB_API OvlK_GetEventHandle_T( + _in KOVL_HANDLE OverlappedK); + +typedef BOOL KUSB_API OvlK_Wait_T( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API OvlK_WaitOldest_T( + _in KOVL_POOL_HANDLE PoolHandle, + _outopt KOVL_HANDLE* OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API OvlK_WaitOrCancel_T( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API OvlK_WaitAndRelease_T( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API OvlK_IsComplete_T( + _in KOVL_HANDLE OverlappedK); + +typedef BOOL KUSB_API OvlK_ReUse_T( + _in KOVL_HANDLE OverlappedK); + +typedef BOOL KUSB_API StmK_Init_T( + _out KSTM_HANDLE* StreamHandle, + _in KUSB_HANDLE UsbHandle, + _in UCHAR PipeID, + _in INT MaxTransferSize, + _in INT MaxPendingTransfers, + _in INT MaxPendingIO, + _inopt PKSTM_CALLBACK Callbacks, + _inopt KSTM_FLAG Flags); + +typedef BOOL KUSB_API StmK_Free_T( + _in KSTM_HANDLE StreamHandle); + +typedef BOOL KUSB_API StmK_Start_T( + _in KSTM_HANDLE StreamHandle); + +typedef BOOL KUSB_API StmK_Stop_T( + _in KSTM_HANDLE StreamHandle, + _in INT TimeoutCancelMS); + +typedef BOOL KUSB_API StmK_Read_T( + _in KSTM_HANDLE StreamHandle, + _out PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API StmK_Write_T( + _in KSTM_HANDLE StreamHandle, + _in PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API IsoK_Init_T( + _out PKISO_CONTEXT* IsoContext, + _in INT NumberOfPackets, + _inopt INT StartFrame); + +typedef BOOL KUSB_API IsoK_Free_T( + _in PKISO_CONTEXT IsoContext); + +typedef BOOL KUSB_API IsoK_SetPackets_T( + _in PKISO_CONTEXT IsoContext, + _in INT PacketSize); + +typedef BOOL KUSB_API IsoK_SetPacket_T( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _in PKISO_PACKET IsoPacket); + +typedef BOOL KUSB_API IsoK_GetPacket_T( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _out PKISO_PACKET IsoPacket); + +typedef BOOL KUSB_API IsoK_EnumPackets_T( + _in PKISO_CONTEXT IsoContext, + _in KISO_ENUM_PACKETS_CB* EnumPackets, + _inopt INT StartPacketIndex, + _inopt PVOID UserState); + +typedef BOOL KUSB_API IsoK_ReUse_T( + _ref PKISO_CONTEXT IsoContext); + + + +/////////////////////////////////////////////////////////////////////// + +// Function pointers: + +static LibK_GetVersion_T* pLibK_GetVersion = NULL; + +static LibK_GetContext_T* pLibK_GetContext = NULL; + +static LibK_SetContext_T* pLibK_SetContext = NULL; + +static LibK_SetCleanupCallback_T* pLibK_SetCleanupCallback = NULL; + +static LibK_LoadDriverAPI_T* pLibK_LoadDriverAPI = NULL; + +static LibK_CopyDriverAPI_T* pLibK_CopyDriverAPI = NULL; + +static LibK_GetProcAddress_T* pLibK_GetProcAddress = NULL; + +static LibK_SetDefaultContext_T* pLibK_SetDefaultContext = NULL; + +static LibK_GetDefaultContext_T* pLibK_GetDefaultContext = NULL; + +static LibK_Context_Init_T* pLibK_Context_Init = NULL; + +static LibK_Context_Free_T* pLibK_Context_Free = NULL; + +static UsbK_Init_T* pUsbK_Init = NULL; + +static UsbK_Free_T* pUsbK_Free = NULL; + +static UsbK_ClaimInterface_T* pUsbK_ClaimInterface = NULL; + +static UsbK_ReleaseInterface_T* pUsbK_ReleaseInterface = NULL; + +static UsbK_SetAltInterface_T* pUsbK_SetAltInterface = NULL; + +static UsbK_GetAltInterface_T* pUsbK_GetAltInterface = NULL; + +static UsbK_GetDescriptor_T* pUsbK_GetDescriptor = NULL; + +static UsbK_ControlTransfer_T* pUsbK_ControlTransfer = NULL; + +static UsbK_SetPowerPolicy_T* pUsbK_SetPowerPolicy = NULL; + +static UsbK_GetPowerPolicy_T* pUsbK_GetPowerPolicy = NULL; + +static UsbK_SetConfiguration_T* pUsbK_SetConfiguration = NULL; + +static UsbK_GetConfiguration_T* pUsbK_GetConfiguration = NULL; + +static UsbK_ResetDevice_T* pUsbK_ResetDevice = NULL; + +static UsbK_Initialize_T* pUsbK_Initialize = NULL; + +static UsbK_SelectInterface_T* pUsbK_SelectInterface = NULL; + +static UsbK_GetAssociatedInterface_T* pUsbK_GetAssociatedInterface = NULL; + +static UsbK_Clone_T* pUsbK_Clone = NULL; + +static UsbK_QueryInterfaceSettings_T* pUsbK_QueryInterfaceSettings = NULL; + +static UsbK_QueryDeviceInformation_T* pUsbK_QueryDeviceInformation = NULL; + +static UsbK_SetCurrentAlternateSetting_T* pUsbK_SetCurrentAlternateSetting = NULL; + +static UsbK_GetCurrentAlternateSetting_T* pUsbK_GetCurrentAlternateSetting = NULL; + +static UsbK_QueryPipe_T* pUsbK_QueryPipe = NULL; + +static UsbK_SetPipePolicy_T* pUsbK_SetPipePolicy = NULL; + +static UsbK_GetPipePolicy_T* pUsbK_GetPipePolicy = NULL; + +static UsbK_ReadPipe_T* pUsbK_ReadPipe = NULL; + +static UsbK_WritePipe_T* pUsbK_WritePipe = NULL; + +static UsbK_ResetPipe_T* pUsbK_ResetPipe = NULL; + +static UsbK_AbortPipe_T* pUsbK_AbortPipe = NULL; + +static UsbK_FlushPipe_T* pUsbK_FlushPipe = NULL; + +static UsbK_IsoReadPipe_T* pUsbK_IsoReadPipe = NULL; + +static UsbK_IsoWritePipe_T* pUsbK_IsoWritePipe = NULL; + +static UsbK_GetCurrentFrameNumber_T* pUsbK_GetCurrentFrameNumber = NULL; + +static UsbK_GetOverlappedResult_T* pUsbK_GetOverlappedResult = NULL; + +static UsbK_GetProperty_T* pUsbK_GetProperty = NULL; + +static LstK_Init_T* pLstK_Init = NULL; + +static LstK_InitEx_T* pLstK_InitEx = NULL; + +static LstK_Free_T* pLstK_Free = NULL; + +static LstK_Enumerate_T* pLstK_Enumerate = NULL; + +static LstK_Current_T* pLstK_Current = NULL; + +static LstK_MoveNext_T* pLstK_MoveNext = NULL; + +static LstK_MoveReset_T* pLstK_MoveReset = NULL; + +static LstK_FindByVidPid_T* pLstK_FindByVidPid = NULL; + +static LstK_Count_T* pLstK_Count = NULL; + +static HotK_Init_T* pHotK_Init = NULL; + +static HotK_Free_T* pHotK_Free = NULL; + +static HotK_FreeAll_T* pHotK_FreeAll = NULL; + +static OvlK_Acquire_T* pOvlK_Acquire = NULL; + +static OvlK_Release_T* pOvlK_Release = NULL; + +static OvlK_Init_T* pOvlK_Init = NULL; + +static OvlK_Free_T* pOvlK_Free = NULL; + +static OvlK_GetEventHandle_T* pOvlK_GetEventHandle = NULL; + +static OvlK_Wait_T* pOvlK_Wait = NULL; + +static OvlK_WaitOldest_T* pOvlK_WaitOldest = NULL; + +static OvlK_WaitOrCancel_T* pOvlK_WaitOrCancel = NULL; + +static OvlK_WaitAndRelease_T* pOvlK_WaitAndRelease = NULL; + +static OvlK_IsComplete_T* pOvlK_IsComplete = NULL; + +static OvlK_ReUse_T* pOvlK_ReUse = NULL; + +static StmK_Init_T* pStmK_Init = NULL; + +static StmK_Free_T* pStmK_Free = NULL; + +static StmK_Start_T* pStmK_Start = NULL; + +static StmK_Stop_T* pStmK_Stop = NULL; + +static StmK_Read_T* pStmK_Read = NULL; + +static StmK_Write_T* pStmK_Write = NULL; + +static IsoK_Init_T* pIsoK_Init = NULL; + +static IsoK_Free_T* pIsoK_Free = NULL; + +static IsoK_SetPackets_T* pIsoK_SetPackets = NULL; + +static IsoK_SetPacket_T* pIsoK_SetPacket = NULL; + +static IsoK_GetPacket_T* pIsoK_GetPacket = NULL; + +static IsoK_EnumPackets_T* pIsoK_EnumPackets = NULL; + +static IsoK_ReUse_T* pIsoK_ReUse = NULL; + + + +/////////////////////////////////////////////////////////////////////// + + +VOID LibusbK_DynApi_Free(VOID) +{ + if (mLibusbK_ModuleHandle) + { + mFreeLibrary(mLibusbK_ModuleHandle); + mLibusbK_ModuleHandle = NULL; + + // Set all function pointers to null: + + pLibK_GetVersion = NULL; + + pLibK_GetContext = NULL; + + pLibK_SetContext = NULL; + + pLibK_SetCleanupCallback = NULL; + + pLibK_LoadDriverAPI = NULL; + + pLibK_CopyDriverAPI = NULL; + + pLibK_GetProcAddress = NULL; + + pLibK_SetDefaultContext = NULL; + + pLibK_GetDefaultContext = NULL; + + pLibK_Context_Init = NULL; + + pLibK_Context_Free = NULL; + + pUsbK_Init = NULL; + + pUsbK_Free = NULL; + + pUsbK_ClaimInterface = NULL; + + pUsbK_ReleaseInterface = NULL; + + pUsbK_SetAltInterface = NULL; + + pUsbK_GetAltInterface = NULL; + + pUsbK_GetDescriptor = NULL; + + pUsbK_ControlTransfer = NULL; + + pUsbK_SetPowerPolicy = NULL; + + pUsbK_GetPowerPolicy = NULL; + + pUsbK_SetConfiguration = NULL; + + pUsbK_GetConfiguration = NULL; + + pUsbK_ResetDevice = NULL; + + pUsbK_Initialize = NULL; + + pUsbK_SelectInterface = NULL; + + pUsbK_GetAssociatedInterface = NULL; + + pUsbK_Clone = NULL; + + pUsbK_QueryInterfaceSettings = NULL; + + pUsbK_QueryDeviceInformation = NULL; + + pUsbK_SetCurrentAlternateSetting = NULL; + + pUsbK_GetCurrentAlternateSetting = NULL; + + pUsbK_QueryPipe = NULL; + + pUsbK_SetPipePolicy = NULL; + + pUsbK_GetPipePolicy = NULL; + + pUsbK_ReadPipe = NULL; + + pUsbK_WritePipe = NULL; + + pUsbK_ResetPipe = NULL; + + pUsbK_AbortPipe = NULL; + + pUsbK_FlushPipe = NULL; + + pUsbK_IsoReadPipe = NULL; + + pUsbK_IsoWritePipe = NULL; + + pUsbK_GetCurrentFrameNumber = NULL; + + pUsbK_GetOverlappedResult = NULL; + + pUsbK_GetProperty = NULL; + + pLstK_Init = NULL; + + pLstK_InitEx = NULL; + + pLstK_Free = NULL; + + pLstK_Enumerate = NULL; + + pLstK_Current = NULL; + + pLstK_MoveNext = NULL; + + pLstK_MoveReset = NULL; + + pLstK_FindByVidPid = NULL; + + pLstK_Count = NULL; + + pHotK_Init = NULL; + + pHotK_Free = NULL; + + pHotK_FreeAll = NULL; + + pOvlK_Acquire = NULL; + + pOvlK_Release = NULL; + + pOvlK_Init = NULL; + + pOvlK_Free = NULL; + + pOvlK_GetEventHandle = NULL; + + pOvlK_Wait = NULL; + + pOvlK_WaitOldest = NULL; + + pOvlK_WaitOrCancel = NULL; + + pOvlK_WaitAndRelease = NULL; + + pOvlK_IsComplete = NULL; + + pOvlK_ReUse = NULL; + + pStmK_Init = NULL; + + pStmK_Free = NULL; + + pStmK_Start = NULL; + + pStmK_Stop = NULL; + + pStmK_Read = NULL; + + pStmK_Write = NULL; + + pIsoK_Init = NULL; + + pIsoK_Free = NULL; + + pIsoK_SetPackets = NULL; + + pIsoK_SetPacket = NULL; + + pIsoK_GetPacket = NULL; + + pIsoK_EnumPackets = NULL; + + pIsoK_ReUse = NULL; + + + + /////////////////////////////////////////////////////////////////////// + } +} + +INT LibusbK_DynApi_Init(_inopt LPCSTR DllFullPathName) +{ + LPCSTR dllFullPathName = (DllFullPathName == NULL) ? "libusbK.dll" : DllFullPathName; + INT funcLoadFailCount = 0; + + if (mLibusbK_ModuleHandle) LibusbK_DynApi_Free(); + + if (DllFullPathName) + mLibusbK_ModuleHandle = mLoadLibraryExA(dllFullPathName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); + else + mLibusbK_ModuleHandle = mLoadLibraryExA(dllFullPathName, NULL, 0); + + if (mLibusbK_ModuleHandle == NULL) return -1; + + + // Function loads: + + if ((pLibK_GetVersion = (LibK_GetVersion_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_GetVersion")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_GetVersion.\n"); + } + + if ((pLibK_GetContext = (LibK_GetContext_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_GetContext")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_GetContext.\n"); + } + + if ((pLibK_SetContext = (LibK_SetContext_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_SetContext")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_SetContext.\n"); + } + + if ((pLibK_SetCleanupCallback = (LibK_SetCleanupCallback_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_SetCleanupCallback")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_SetCleanupCallback.\n"); + } + + if ((pLibK_LoadDriverAPI = (LibK_LoadDriverAPI_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_LoadDriverAPI")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_LoadDriverAPI.\n"); + } + + if ((pLibK_CopyDriverAPI = (LibK_CopyDriverAPI_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_CopyDriverAPI")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_CopyDriverAPI.\n"); + } + + if ((pLibK_GetProcAddress = (LibK_GetProcAddress_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_GetProcAddress")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_GetProcAddress.\n"); + } + + if ((pLibK_SetDefaultContext = (LibK_SetDefaultContext_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_SetDefaultContext")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_SetDefaultContext.\n"); + } + + if ((pLibK_GetDefaultContext = (LibK_GetDefaultContext_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_GetDefaultContext")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_GetDefaultContext.\n"); + } + + if ((pLibK_Context_Init = (LibK_Context_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_Context_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_Context_Init.\n"); + } + + if ((pLibK_Context_Free = (LibK_Context_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_Context_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_Context_Free.\n"); + } + + if ((pUsbK_Init = (UsbK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_Init.\n"); + } + + if ((pUsbK_Free = (UsbK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_Free.\n"); + } + + if ((pUsbK_ClaimInterface = (UsbK_ClaimInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ClaimInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ClaimInterface.\n"); + } + + if ((pUsbK_ReleaseInterface = (UsbK_ReleaseInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ReleaseInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ReleaseInterface.\n"); + } + + if ((pUsbK_SetAltInterface = (UsbK_SetAltInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SetAltInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SetAltInterface.\n"); + } + + if ((pUsbK_GetAltInterface = (UsbK_GetAltInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetAltInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetAltInterface.\n"); + } + + if ((pUsbK_GetDescriptor = (UsbK_GetDescriptor_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetDescriptor")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetDescriptor.\n"); + } + + if ((pUsbK_ControlTransfer = (UsbK_ControlTransfer_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ControlTransfer")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ControlTransfer.\n"); + } + + if ((pUsbK_SetPowerPolicy = (UsbK_SetPowerPolicy_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SetPowerPolicy")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SetPowerPolicy.\n"); + } + + if ((pUsbK_GetPowerPolicy = (UsbK_GetPowerPolicy_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetPowerPolicy")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetPowerPolicy.\n"); + } + + if ((pUsbK_SetConfiguration = (UsbK_SetConfiguration_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SetConfiguration")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SetConfiguration.\n"); + } + + if ((pUsbK_GetConfiguration = (UsbK_GetConfiguration_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetConfiguration")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetConfiguration.\n"); + } + + if ((pUsbK_ResetDevice = (UsbK_ResetDevice_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ResetDevice")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ResetDevice.\n"); + } + + if ((pUsbK_Initialize = (UsbK_Initialize_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_Initialize")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_Initialize.\n"); + } + + if ((pUsbK_SelectInterface = (UsbK_SelectInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SelectInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SelectInterface.\n"); + } + + if ((pUsbK_GetAssociatedInterface = (UsbK_GetAssociatedInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetAssociatedInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetAssociatedInterface.\n"); + } + + if ((pUsbK_Clone = (UsbK_Clone_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_Clone")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_Clone.\n"); + } + + if ((pUsbK_QueryInterfaceSettings = (UsbK_QueryInterfaceSettings_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_QueryInterfaceSettings")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_QueryInterfaceSettings.\n"); + } + + if ((pUsbK_QueryDeviceInformation = (UsbK_QueryDeviceInformation_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_QueryDeviceInformation")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_QueryDeviceInformation.\n"); + } + + if ((pUsbK_SetCurrentAlternateSetting = (UsbK_SetCurrentAlternateSetting_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SetCurrentAlternateSetting")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SetCurrentAlternateSetting.\n"); + } + + if ((pUsbK_GetCurrentAlternateSetting = (UsbK_GetCurrentAlternateSetting_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetCurrentAlternateSetting")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetCurrentAlternateSetting.\n"); + } + + if ((pUsbK_QueryPipe = (UsbK_QueryPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_QueryPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_QueryPipe.\n"); + } + + if ((pUsbK_SetPipePolicy = (UsbK_SetPipePolicy_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SetPipePolicy")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SetPipePolicy.\n"); + } + + if ((pUsbK_GetPipePolicy = (UsbK_GetPipePolicy_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetPipePolicy")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetPipePolicy.\n"); + } + + if ((pUsbK_ReadPipe = (UsbK_ReadPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ReadPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ReadPipe.\n"); + } + + if ((pUsbK_WritePipe = (UsbK_WritePipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_WritePipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_WritePipe.\n"); + } + + if ((pUsbK_ResetPipe = (UsbK_ResetPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ResetPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ResetPipe.\n"); + } + + if ((pUsbK_AbortPipe = (UsbK_AbortPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_AbortPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_AbortPipe.\n"); + } + + if ((pUsbK_FlushPipe = (UsbK_FlushPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_FlushPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_FlushPipe.\n"); + } + + if ((pUsbK_IsoReadPipe = (UsbK_IsoReadPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_IsoReadPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_IsoReadPipe.\n"); + } + + if ((pUsbK_IsoWritePipe = (UsbK_IsoWritePipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_IsoWritePipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_IsoWritePipe.\n"); + } + + if ((pUsbK_GetCurrentFrameNumber = (UsbK_GetCurrentFrameNumber_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetCurrentFrameNumber")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetCurrentFrameNumber.\n"); + } + + if ((pUsbK_GetOverlappedResult = (UsbK_GetOverlappedResult_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetOverlappedResult")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetOverlappedResult.\n"); + } + + if ((pUsbK_GetProperty = (UsbK_GetProperty_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetProperty")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetProperty.\n"); + } + + if ((pLstK_Init = (LstK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_Init.\n"); + } + + if ((pLstK_InitEx = (LstK_InitEx_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_InitEx")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_InitEx.\n"); + } + + if ((pLstK_Free = (LstK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_Free.\n"); + } + + if ((pLstK_Enumerate = (LstK_Enumerate_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_Enumerate")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_Enumerate.\n"); + } + + if ((pLstK_Current = (LstK_Current_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_Current")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_Current.\n"); + } + + if ((pLstK_MoveNext = (LstK_MoveNext_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_MoveNext")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_MoveNext.\n"); + } + + if ((pLstK_MoveReset = (LstK_MoveReset_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_MoveReset")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_MoveReset.\n"); + } + + if ((pLstK_FindByVidPid = (LstK_FindByVidPid_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_FindByVidPid")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_FindByVidPid.\n"); + } + + if ((pLstK_Count = (LstK_Count_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_Count")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_Count.\n"); + } + + if ((pHotK_Init = (HotK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "HotK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function HotK_Init.\n"); + } + + if ((pHotK_Free = (HotK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "HotK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function HotK_Free.\n"); + } + + if ((pHotK_FreeAll = (HotK_FreeAll_T*)GetProcAddress(mLibusbK_ModuleHandle, "HotK_FreeAll")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function HotK_FreeAll.\n"); + } + + if ((pOvlK_Acquire = (OvlK_Acquire_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_Acquire")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_Acquire.\n"); + } + + if ((pOvlK_Release = (OvlK_Release_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_Release")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_Release.\n"); + } + + if ((pOvlK_Init = (OvlK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_Init.\n"); + } + + if ((pOvlK_Free = (OvlK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_Free.\n"); + } + + if ((pOvlK_GetEventHandle = (OvlK_GetEventHandle_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_GetEventHandle")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_GetEventHandle.\n"); + } + + if ((pOvlK_Wait = (OvlK_Wait_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_Wait")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_Wait.\n"); + } + + if ((pOvlK_WaitOldest = (OvlK_WaitOldest_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_WaitOldest")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_WaitOldest.\n"); + } + + if ((pOvlK_WaitOrCancel = (OvlK_WaitOrCancel_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_WaitOrCancel")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_WaitOrCancel.\n"); + } + + if ((pOvlK_WaitAndRelease = (OvlK_WaitAndRelease_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_WaitAndRelease")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_WaitAndRelease.\n"); + } + + if ((pOvlK_IsComplete = (OvlK_IsComplete_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_IsComplete")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_IsComplete.\n"); + } + + if ((pOvlK_ReUse = (OvlK_ReUse_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_ReUse")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_ReUse.\n"); + } + + if ((pStmK_Init = (StmK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Init.\n"); + } + + if ((pStmK_Free = (StmK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Free.\n"); + } + + if ((pStmK_Start = (StmK_Start_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Start")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Start.\n"); + } + + if ((pStmK_Stop = (StmK_Stop_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Stop")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Stop.\n"); + } + + if ((pStmK_Read = (StmK_Read_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Read")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Read.\n"); + } + + if ((pStmK_Write = (StmK_Write_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Write")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Write.\n"); + } + + if ((pIsoK_Init = (IsoK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_Init.\n"); + } + + if ((pIsoK_Free = (IsoK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_Free.\n"); + } + + if ((pIsoK_SetPackets = (IsoK_SetPackets_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_SetPackets")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_SetPackets.\n"); + } + + if ((pIsoK_SetPacket = (IsoK_SetPacket_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_SetPacket")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_SetPacket.\n"); + } + + if ((pIsoK_GetPacket = (IsoK_GetPacket_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_GetPacket")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_GetPacket.\n"); + } + + if ((pIsoK_EnumPackets = (IsoK_EnumPackets_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_EnumPackets")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_EnumPackets.\n"); + } + + if ((pIsoK_ReUse = (IsoK_ReUse_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_ReUse")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_ReUse.\n"); + } + + + + /////////////////////////////////////////////////////////////////////// + + return funcLoadFailCount; +} + +// Function wrappers: + +KUSB_EXP VOID KUSB_API LibK_GetVersion(_out PKLIB_VERSION Version) +{ + pLibK_GetVersion(Version); +} + +KUSB_EXP KLIB_USER_CONTEXT KUSB_API LibK_GetContext( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType) +{ + return pLibK_GetContext(Handle, HandleType); +} + +KUSB_EXP BOOL KUSB_API LibK_SetContext( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue) +{ + return pLibK_SetContext(Handle, HandleType, ContextValue); +} + +KUSB_EXP BOOL KUSB_API LibK_SetCleanupCallback( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_HANDLE_CLEANUP_CB* CleanupCB) +{ + return pLibK_SetCleanupCallback(Handle, HandleType, CleanupCB); +} + +KUSB_EXP BOOL KUSB_API LibK_LoadDriverAPI( + _out PKUSB_DRIVER_API DriverAPI, + _in INT DriverID) +{ + return pLibK_LoadDriverAPI(DriverAPI, DriverID); +} + +KUSB_EXP BOOL KUSB_API LibK_CopyDriverAPI( + _out PKUSB_DRIVER_API DriverAPI, + _in KUSB_HANDLE UsbHandle) +{ + return pLibK_CopyDriverAPI(DriverAPI, UsbHandle); +} + +KUSB_EXP BOOL KUSB_API LibK_GetProcAddress( + _out KPROC* ProcAddress, + _in INT DriverID, + _in INT FunctionID) +{ + return pLibK_GetProcAddress(ProcAddress, DriverID, FunctionID); +} + +KUSB_EXP BOOL KUSB_API LibK_SetDefaultContext( + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue) +{ + return pLibK_SetDefaultContext(HandleType, ContextValue); +} + +KUSB_EXP KLIB_USER_CONTEXT KUSB_API LibK_GetDefaultContext( + _in KLIB_HANDLE_TYPE HandleType) +{ + return pLibK_GetDefaultContext(HandleType); +} + +KUSB_EXP BOOL KUSB_API LibK_Context_Init( + _inopt HANDLE Heap, + _in PVOID Reserved) +{ + return pLibK_Context_Init(Heap, Reserved); +} + +KUSB_EXP VOID KUSB_API LibK_Context_Free(VOID) +{ + pLibK_Context_Free(); +} + +KUSB_EXP BOOL KUSB_API UsbK_Init ( + _out KUSB_HANDLE* InterfaceHandle, + _in KLST_DEVINFO_HANDLE DevInfo) +{ + return pUsbK_Init(InterfaceHandle, DevInfo); +} + +KUSB_EXP BOOL KUSB_API UsbK_Free ( + _in KUSB_HANDLE InterfaceHandle) +{ + return pUsbK_Free(InterfaceHandle); +} + +KUSB_EXP BOOL KUSB_API UsbK_ClaimInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex) +{ + return pUsbK_ClaimInterface(InterfaceHandle, NumberOrIndex, IsIndex); +} + +KUSB_EXP BOOL KUSB_API UsbK_ReleaseInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex) +{ + return pUsbK_ReleaseInterface(InterfaceHandle, NumberOrIndex, IsIndex); +} + +KUSB_EXP BOOL KUSB_API UsbK_SetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _in UCHAR AltSettingNumber) +{ + return pUsbK_SetAltInterface(InterfaceHandle, NumberOrIndex, IsIndex, AltSettingNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _out PUCHAR AltSettingNumber) +{ + return pUsbK_GetAltInterface(InterfaceHandle, NumberOrIndex, IsIndex, AltSettingNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetDescriptor ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR DescriptorType, + _in UCHAR Index, + _in USHORT LanguageID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred) +{ + return pUsbK_GetDescriptor(InterfaceHandle, DescriptorType, Index, LanguageID, Buffer, BufferLength, LengthTransferred); +} + +KUSB_EXP BOOL KUSB_API UsbK_ControlTransfer ( + _in KUSB_HANDLE InterfaceHandle, + _in WINUSB_SETUP_PACKET SetupPacket, + _refopt PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped) +{ + return pUsbK_ControlTransfer(InterfaceHandle, SetupPacket, Buffer, BufferLength, LengthTransferred, Overlapped); +} + +KUSB_EXP BOOL KUSB_API UsbK_SetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value) +{ + return pUsbK_SetPowerPolicy(InterfaceHandle, PolicyType, ValueLength, Value); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value) +{ + return pUsbK_GetPowerPolicy(InterfaceHandle, PolicyType, ValueLength, Value); +} + +KUSB_EXP BOOL KUSB_API UsbK_SetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR ConfigurationNumber) +{ + return pUsbK_SetConfiguration(InterfaceHandle, ConfigurationNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR ConfigurationNumber) +{ + return pUsbK_GetConfiguration(InterfaceHandle, ConfigurationNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_ResetDevice ( + _in KUSB_HANDLE InterfaceHandle) +{ + return pUsbK_ResetDevice(InterfaceHandle); +} + +KUSB_EXP BOOL KUSB_API UsbK_Initialize ( + _in HANDLE DeviceHandle, + _out KUSB_HANDLE* InterfaceHandle) +{ + return pUsbK_Initialize(DeviceHandle, InterfaceHandle); +} + +KUSB_EXP BOOL KUSB_API UsbK_SelectInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex) +{ + return pUsbK_SelectInterface(InterfaceHandle, NumberOrIndex, IsIndex); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetAssociatedInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AssociatedInterfaceIndex, + _out KUSB_HANDLE* AssociatedInterfaceHandle) +{ + return pUsbK_GetAssociatedInterface(InterfaceHandle, AssociatedInterfaceIndex, AssociatedInterfaceHandle); +} + +KUSB_EXP BOOL KUSB_API UsbK_Clone ( + _in KUSB_HANDLE InterfaceHandle, + _out KUSB_HANDLE* DstInterfaceHandle) +{ + return pUsbK_Clone(InterfaceHandle, DstInterfaceHandle); +} + +KUSB_EXP BOOL KUSB_API UsbK_QueryInterfaceSettings ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingIndex, + _out PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor) +{ + return pUsbK_QueryInterfaceSettings(InterfaceHandle, AltSettingIndex, UsbAltInterfaceDescriptor); +} + +KUSB_EXP BOOL KUSB_API UsbK_QueryDeviceInformation ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT InformationType, + _ref PUINT BufferLength, + _ref PVOID Buffer) +{ + return pUsbK_QueryDeviceInformation(InterfaceHandle, InformationType, BufferLength, Buffer); +} + +KUSB_EXP BOOL KUSB_API UsbK_SetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber) +{ + return pUsbK_SetCurrentAlternateSetting(InterfaceHandle, AltSettingNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR AltSettingNumber) +{ + return pUsbK_GetCurrentAlternateSetting(InterfaceHandle, AltSettingNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_QueryPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber, + _in UCHAR PipeIndex, + _out PWINUSB_PIPE_INFORMATION PipeInformation) +{ + return pUsbK_QueryPipe(InterfaceHandle, AltSettingNumber, PipeIndex, PipeInformation); +} + +KUSB_EXP BOOL KUSB_API UsbK_SetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value) +{ + return pUsbK_SetPipePolicy(InterfaceHandle, PipeID, PolicyType, ValueLength, Value); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value) +{ + return pUsbK_GetPipePolicy(InterfaceHandle, PipeID, PolicyType, ValueLength, Value); +} + +KUSB_EXP BOOL KUSB_API UsbK_ReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped) +{ + return pUsbK_ReadPipe(InterfaceHandle, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped); +} + +KUSB_EXP BOOL KUSB_API UsbK_WritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped) +{ + return pUsbK_WritePipe(InterfaceHandle, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped); +} + +KUSB_EXP BOOL KUSB_API UsbK_ResetPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID) +{ + return pUsbK_ResetPipe(InterfaceHandle, PipeID); +} + +KUSB_EXP BOOL KUSB_API UsbK_AbortPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID) +{ + return pUsbK_AbortPipe(InterfaceHandle, PipeID); +} + +KUSB_EXP BOOL KUSB_API UsbK_FlushPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID) +{ + return pUsbK_FlushPipe(InterfaceHandle, PipeID); +} + +KUSB_EXP BOOL KUSB_API UsbK_IsoReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext) +{ + return pUsbK_IsoReadPipe(InterfaceHandle, PipeID, Buffer, BufferLength, Overlapped, IsoContext); +} + +KUSB_EXP BOOL KUSB_API UsbK_IsoWritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext) +{ + return pUsbK_IsoWritePipe(InterfaceHandle, PipeID, Buffer, BufferLength, Overlapped, IsoContext); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetCurrentFrameNumber ( + _in KUSB_HANDLE InterfaceHandle, + _out PUINT FrameNumber) +{ + return pUsbK_GetCurrentFrameNumber(InterfaceHandle, FrameNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetOverlappedResult ( + _in KUSB_HANDLE InterfaceHandle, + _in LPOVERLAPPED Overlapped, + _out PUINT lpNumberOfBytesTransferred, + _in BOOL bWait) +{ + return pUsbK_GetOverlappedResult(InterfaceHandle, Overlapped, lpNumberOfBytesTransferred, bWait); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetProperty ( + _in KUSB_HANDLE InterfaceHandle, + _in KUSB_PROPERTY PropertyType, + _ref PUINT PropertySize, + _out PVOID Value) +{ + return pUsbK_GetProperty(InterfaceHandle, PropertyType, PropertySize, Value); +} + +KUSB_EXP BOOL KUSB_API LstK_Init( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags) +{ + return pLstK_Init(DeviceList, Flags); +} + +KUSB_EXP BOOL KUSB_API LstK_InitEx( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags, + _in PKLST_PATTERN_MATCH PatternMatch) +{ + return pLstK_InitEx(DeviceList, Flags, PatternMatch); +} + +KUSB_EXP BOOL KUSB_API LstK_Free( + _in KLST_HANDLE DeviceList) +{ + return pLstK_Free(DeviceList); +} + +KUSB_EXP BOOL KUSB_API LstK_Enumerate( + _in KLST_HANDLE DeviceList, + _in KLST_ENUM_DEVINFO_CB* EnumDevListCB, + _inopt PVOID Context) +{ + return pLstK_Enumerate(DeviceList, EnumDevListCB, Context); +} + +KUSB_EXP BOOL KUSB_API LstK_Current( + _in KLST_HANDLE DeviceList, + _out KLST_DEVINFO_HANDLE* DeviceInfo) +{ + return pLstK_Current(DeviceList, DeviceInfo); +} + +KUSB_EXP BOOL KUSB_API LstK_MoveNext( + _in KLST_HANDLE DeviceList, + _outopt KLST_DEVINFO_HANDLE* DeviceInfo) +{ + return pLstK_MoveNext(DeviceList, DeviceInfo); +} + +KUSB_EXP VOID KUSB_API LstK_MoveReset( + _in KLST_HANDLE DeviceList) +{ + pLstK_MoveReset(DeviceList); +} + +KUSB_EXP BOOL KUSB_API LstK_FindByVidPid( + _in KLST_HANDLE DeviceList, + _in INT Vid, + _in INT Pid, + _out KLST_DEVINFO_HANDLE* DeviceInfo) +{ + return pLstK_FindByVidPid(DeviceList, Vid, Pid, DeviceInfo); +} + +KUSB_EXP BOOL KUSB_API LstK_Count( + _in KLST_HANDLE DeviceList, + _ref PUINT Count) +{ + return pLstK_Count(DeviceList, Count); +} + +KUSB_EXP BOOL KUSB_API HotK_Init( + _out KHOT_HANDLE* Handle, + _ref PKHOT_PARAMS InitParams) +{ + return pHotK_Init(Handle, InitParams); +} + +KUSB_EXP BOOL KUSB_API HotK_Free( + _in KHOT_HANDLE Handle) +{ + return pHotK_Free(Handle); +} + +KUSB_EXP VOID KUSB_API HotK_FreeAll(VOID) +{ + pHotK_FreeAll(); +} + +KUSB_EXP BOOL KUSB_API OvlK_Acquire( + _out KOVL_HANDLE* OverlappedK, + _in KOVL_POOL_HANDLE PoolHandle) +{ + return pOvlK_Acquire(OverlappedK, PoolHandle); +} + +KUSB_EXP BOOL KUSB_API OvlK_Release( + _in KOVL_HANDLE OverlappedK) +{ + return pOvlK_Release(OverlappedK); +} + +KUSB_EXP BOOL KUSB_API OvlK_Init ( + _out KOVL_POOL_HANDLE* PoolHandle, + _in KUSB_HANDLE UsbHandle, + _in INT MaxOverlappedCount, + _inopt KOVL_POOL_FLAG Flags) +{ + return pOvlK_Init(PoolHandle, UsbHandle, MaxOverlappedCount, Flags); +} + +KUSB_EXP BOOL KUSB_API OvlK_Free( + _in KOVL_POOL_HANDLE PoolHandle) +{ + return pOvlK_Free(PoolHandle); +} + +KUSB_EXP HANDLE KUSB_API OvlK_GetEventHandle( + _in KOVL_HANDLE OverlappedK) +{ + return pOvlK_GetEventHandle(OverlappedK); +} + +KUSB_EXP BOOL KUSB_API OvlK_Wait( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength) +{ + return pOvlK_Wait(OverlappedK, TimeoutMS, WaitFlags, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API OvlK_WaitOldest( + _in KOVL_POOL_HANDLE PoolHandle, + _outopt KOVL_HANDLE* OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength) +{ + return pOvlK_WaitOldest(PoolHandle, OverlappedK, TimeoutMS, WaitFlags, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API OvlK_WaitOrCancel( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength) +{ + return pOvlK_WaitOrCancel(OverlappedK, TimeoutMS, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API OvlK_WaitAndRelease( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength) +{ + return pOvlK_WaitAndRelease(OverlappedK, TimeoutMS, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API OvlK_IsComplete( + _in KOVL_HANDLE OverlappedK) +{ + return pOvlK_IsComplete(OverlappedK); +} + +KUSB_EXP BOOL KUSB_API OvlK_ReUse( + _in KOVL_HANDLE OverlappedK) +{ + return pOvlK_ReUse(OverlappedK); +} + +KUSB_EXP BOOL KUSB_API StmK_Init( + _out KSTM_HANDLE* StreamHandle, + _in KUSB_HANDLE UsbHandle, + _in UCHAR PipeID, + _in INT MaxTransferSize, + _in INT MaxPendingTransfers, + _in INT MaxPendingIO, + _inopt PKSTM_CALLBACK Callbacks, + _inopt KSTM_FLAG Flags) +{ + return pStmK_Init(StreamHandle, UsbHandle, PipeID, MaxTransferSize, MaxPendingTransfers, MaxPendingIO, Callbacks, Flags); +} + +KUSB_EXP BOOL KUSB_API StmK_Free( + _in KSTM_HANDLE StreamHandle) +{ + return pStmK_Free(StreamHandle); +} + +KUSB_EXP BOOL KUSB_API StmK_Start( + _in KSTM_HANDLE StreamHandle) +{ + return pStmK_Start(StreamHandle); +} + +KUSB_EXP BOOL KUSB_API StmK_Stop( + _in KSTM_HANDLE StreamHandle, + _in INT TimeoutCancelMS) +{ + return pStmK_Stop(StreamHandle, TimeoutCancelMS); +} + +KUSB_EXP BOOL KUSB_API StmK_Read( + _in KSTM_HANDLE StreamHandle, + _out PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength) +{ + return pStmK_Read(StreamHandle, Buffer, Offset, Length, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API StmK_Write( + _in KSTM_HANDLE StreamHandle, + _in PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength) +{ + return pStmK_Write(StreamHandle, Buffer, Offset, Length, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API IsoK_Init( + _out PKISO_CONTEXT* IsoContext, + _in INT NumberOfPackets, + _inopt INT StartFrame) +{ + return pIsoK_Init(IsoContext, NumberOfPackets, StartFrame); +} + +KUSB_EXP BOOL KUSB_API IsoK_Free( + _in PKISO_CONTEXT IsoContext) +{ + return pIsoK_Free(IsoContext); +} + +KUSB_EXP BOOL KUSB_API IsoK_SetPackets( + _in PKISO_CONTEXT IsoContext, + _in INT PacketSize) +{ + return pIsoK_SetPackets(IsoContext, PacketSize); +} + +KUSB_EXP BOOL KUSB_API IsoK_SetPacket( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _in PKISO_PACKET IsoPacket) +{ + return pIsoK_SetPacket(IsoContext, PacketIndex, IsoPacket); +} + +KUSB_EXP BOOL KUSB_API IsoK_GetPacket( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _out PKISO_PACKET IsoPacket) +{ + return pIsoK_GetPacket(IsoContext, PacketIndex, IsoPacket); +} + +KUSB_EXP BOOL KUSB_API IsoK_EnumPackets( + _in PKISO_CONTEXT IsoContext, + _in KISO_ENUM_PACKETS_CB* EnumPackets, + _inopt INT StartPacketIndex, + _inopt PVOID UserState) +{ + return pIsoK_EnumPackets(IsoContext, EnumPackets, StartPacketIndex, UserState); +} + +KUSB_EXP BOOL KUSB_API IsoK_ReUse( + _ref PKISO_CONTEXT IsoContext) +{ + return pIsoK_ReUse(IsoContext); +} + + + +/////////////////////////////////////////////////////////////////////// diff --git a/Old Matlab Interface/.svn/pristine/6b/6b54b54984147f1b32fe68dbaa766f3b2000c508.svn-base b/Old Matlab Interface/.svn/pristine/6b/6b54b54984147f1b32fe68dbaa766f3b2000c508.svn-base new file mode 100644 index 00000000..0c8f63cc Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/6b/6b54b54984147f1b32fe68dbaa766f3b2000c508.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/6b/6bcb7516b24c37fa7330dcd3d4d2ccb53905f22d.svn-base b/Old Matlab Interface/.svn/pristine/6b/6bcb7516b24c37fa7330dcd3d4d2ccb53905f22d.svn-base new file mode 100644 index 00000000..7e23f28d --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/6b/6bcb7516b24c37fa7330dcd3d4d2ccb53905f22d.svn-base @@ -0,0 +1,48 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2011-2012 Travis Robinson +// All rights reserved. +// +// Hot.Plug.Detect.GUI +// +// Last Updated: 03.08.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +using System; +using System.Windows.Forms; + +namespace Hot.Plug.Detect.GUI +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + private static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/6c/6c378d3e96a933397f034cbb46862b36c3159642.svn-base b/Old Matlab Interface/.svn/pristine/6c/6c378d3e96a933397f034cbb46862b36c3159642.svn-base new file mode 100644 index 00000000..fc136d65 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/6c/6c378d3e96a933397f034cbb46862b36c3159642.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/6c/6c6a73ab3cbe75c885f6d1dd673ae5fab0179fd4.svn-base b/Old Matlab Interface/.svn/pristine/6c/6c6a73ab3cbe75c885f6d1dd673ae5fab0179fd4.svn-base new file mode 100644 index 00000000..77a9c0fe --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/6c/6c6a73ab3cbe75c885f6d1dd673ae5fab0179fd4.svn-base @@ -0,0 +1,8 @@ +function [OUT] = mex_usb_send_control( RequestType, Request, Value, Index, Length, LDATA) + +global usb_handle +if ~length(usb_handle) + warning('USB Handle not initialised. Initialising!') + mex_usb_init('03eb', 'a000') +end +OUT = USB_CTRL_SEND(usb_handle, RequestType, Request, Value, Index, Length, LDATA); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/6c/6c902550934daa388a7f4bd6b7d3a5e821ab7b79.svn-base b/Old Matlab Interface/.svn/pristine/6c/6c902550934daa388a7f4bd6b7d3a5e821ab7b79.svn-base new file mode 100644 index 00000000..000f42e6 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/6c/6c902550934daa388a7f4bd6b7d3a5e821ab7b79.svn-base @@ -0,0 +1,2 @@ +function returnval = returnempty() + returnval = []; \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/6d/6d7787be02fc4a01b9a562c5c015699be31a2269.svn-base b/Old Matlab Interface/.svn/pristine/6d/6d7787be02fc4a01b9a562c5c015699be31a2269.svn-base new file mode 100644 index 00000000..5a34b871 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/6d/6d7787be02fc4a01b9a562c5c015699be31a2269.svn-base @@ -0,0 +1,46 @@ +//MATLAB INCLUDES +#include +#include + +//LIBUSBK INCLUDES +#include +#include +#include +#include +#include "libusbk.h" + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + //Vars: + //Imports + char* POOL_CHAR; + char* icx0, icx1; + char* HANDLE_CHAR; + KUSB_HANDLE handle = NULL; + PKISO_CONTEXT isoCtx_zero; + PKISO_CONTEXT isoCtx_one; + KOVL_POOL_HANDLE ovlPool = NULL; + + + + //Initialise Data + POOL_CHAR = mxArrayToString(prhs[0]); + sscanf(POOL_CHAR, "%16x", &ovlPool); + + icx0 = mxArrayToString(prhs[1]); + sscanf(icx0, "%16x", &isoCtx_zero); + + icx1 = mxArrayToString(prhs[2]); + sscanf(icx1, "%16x", &isoCtx_one); + + POOL_CHAR = mxArrayToString(prhs[3]); + sscanf(POOL_CHAR, "%16x", &ovlPool); + + + //Actual Function + UsbK_Free(handle); + IsoK_Free(isoCtx_zero); + IsoK_Free(isoCtx_one); + OvlK_Free(ovlPool); + return; +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/6e/6e7927959ad433000d17dce5491f498151cf36a1.svn-base b/Old Matlab Interface/.svn/pristine/6e/6e7927959ad433000d17dce5491f498151cf36a1.svn-base new file mode 100644 index 00000000..00ca0be2 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/6e/6e7927959ad433000d17dce5491f498151cf36a1.svn-base @@ -0,0 +1,35 @@ +function [] = tiny_send_auxwf(waveform, amplitude, frequency); + +waveform = tiny_wave_conv_aux(waveform, amplitude); +waveform = uint8(waveform); + +wave_length = length(waveform); + +f_invalid = 1; + +valid_clock_div = [1,2,4,8,64,256,1024]; +f0=24e6; + +if(frequency*wave_length)>1e6 + error('Frequency is too high') +end + +for clk_setting = 1:length(valid_clock_div) + f_test = f0 / valid_clock_div(clk_setting); + if (f_test/frequency)<65535 + f_invalid = 0; + break + end +end + +if (f_invalid) + error('Frequency is too low!') +end + +tccper = round(f_test / frequency / wave_length); +tccper = uint16(tccper); + +clk_setting = uint16(clk_setting); + +mex_usb_send_control('40', 'a2', dec2hex(tccper), dec2hex(clk_setting), dec2hex(wave_length), waveform); + diff --git a/Old Matlab Interface/.svn/pristine/74/749166eff8c546e24e0c1bd4db17cf7b85af8cf2.svn-base b/Old Matlab Interface/.svn/pristine/74/749166eff8c546e24e0c1bd4db17cf7b85af8cf2.svn-base new file mode 100644 index 00000000..b391df84 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/74/749166eff8c546e24e0c1bd4db17cf7b85af8cf2.svn-base @@ -0,0 +1,22 @@ +clear all +clc +vex = [5 8 10 12 15]; + +v68 = vex - [4.4 6.75 8.05 9.12 10.29]; +v220 = vex - [4.53 7.14 8.74 10.11 11.97]; +vinf = vex - [4.59 8.40 9.92 10.82 12.98]; + +r68 = (1/68 + 1/250)^-1; +r220 = (1/220 + 1/250)^-1; +rinf = 250; + +magic = 1.5; +mag_exponent = 4; + +c68 = mean(v68./((vex+magic).^mag_exponent)); +c220 = mean(v220./((vex+magic).^mag_exponent)); +cinf = mean(vinf./((vex+magic).^mag_exponent)); + +c68*r68 +c220*r220 +cinf*rinf \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/74/74ab792fd8b045e2ac5e42386036bd8a784d7a83.svn-base b/Old Matlab Interface/.svn/pristine/74/74ab792fd8b045e2ac5e42386036bd8a784d7a83.svn-base new file mode 100644 index 00000000..6008fdd5 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/74/74ab792fd8b045e2ac5e42386036bd8a784d7a83.svn-base @@ -0,0 +1,16 @@ +function [] = setscopewindowsize(time,vmin,vmax) +global scope_window_time +global scope_window_min +global scope_window_max + +if (vmaxsamplestoshow + if (samplestoshow>500) + temp_waveform = buffer((length(buffer) - samplestoshow - delay_sample):samplestoshow/500: (length(buffer) - delay_sample)); + else + temp_waveform = buffer((length(buffer) - samplestoshow - delay_sample): (length(buffer) - delay_sample)); + end + cool_waveform = undofrontend(temp_waveform, channel); + taxis = linspace(-scope_window_time-delay_sec,-delay_sec,length(cool_waveform)); + return + end + + taxis = []; + cool_waveform = []; diff --git a/Old Matlab Interface/.svn/pristine/81/8155cab5fb6d2b6bf6bacf3ed8168a4020ffdd34.svn-base b/Old Matlab Interface/.svn/pristine/81/8155cab5fb6d2b6bf6bacf3ed8168a4020ffdd34.svn-base new file mode 100644 index 00000000..f98c5112 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/81/8155cab5fb6d2b6bf6bacf3ed8168a4020ffdd34.svn-base @@ -0,0 +1,7 @@ +function [err] = verr(vex, r) + +if r<50 + error('R IS TOO LOW!!!') +end +r = (1/r + 1/250)^-1; +err = ((vex + 1.5)^4 / (80 * r)) \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/81/8161bdf39d77246e52a863a09a61cb13dd66d475.svn-base b/Old Matlab Interface/.svn/pristine/81/8161bdf39d77246e52a863a09a61cb13dd66d475.svn-base new file mode 100644 index 00000000..9f1d5321 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/81/8161bdf39d77246e52a863a09a61cb13dd66d475.svn-base @@ -0,0 +1,17 @@ +% hAxes = figure() +% for n=1:1000 +% tic +% %plot(sin(a(n:n+1000))) +% plot(transfer_contents(n:n+100)) +% drawnow +% toc +% end + +hold on +tic +for n=1:10:100000 + plot((n:n+100),(n:n+100).^2); + drawnow + pause(0.01) +end +toc \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/83/83fdb95bddd831f110af1c74760c826cebb32320.svn-base b/Old Matlab Interface/.svn/pristine/83/83fdb95bddd831f110af1c74760c826cebb32320.svn-base new file mode 100644 index 00000000..db99e100 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/83/83fdb95bddd831f110af1c74760c826cebb32320.svn-base @@ -0,0 +1,54 @@ +function [] = tiny_send_waveform(waveform, amplitude, frequency); + +offset = 375; +waveform = tiny_wave_conv(waveform, amplitude); +waveform = uint8(waveform); +waveform; + +wave_length = length(waveform); + +f_invalid = 1; + +valid_clock_div = [1,2,4,8,64,256,1024]; +f0=24e6; + +if(frequency*wave_length)>1e6 + error('Frequency is too high') +end + +for clk_setting = 1:length(valid_clock_div) + f_test = f0 / valid_clock_div(clk_setting); + if (f_test/frequency)<65535 + f_invalid = 0; + break + end +end + +if (f_invalid) + error('Frequency is too low!') +end + +tccper = round(f_test / frequency / wave_length); +tccper = uint16(tccper); + +clk_setting = uint16(clk_setting); +clk_setting; + +%stairs(uint8(waveform)); + +wavestring = []; +for n=1:wave_length + wavestring = [wavestring [sprintf('%3d, ', waveform(n)) ' ']]; +end + +mex_usb_send_control('40', 'a1', dec2hex(tccper), dec2hex(clk_setting + 16*offset), dec2hex(min(375,wave_length)), uint8(waveform(1:min(375,wave_length)))); + +if(wave_length>375) + warning('\nWave Length > 375') + mex_usb_send_control('40', 'a1', dec2hex(tccper), dec2hex(clk_setting + 16*(offset+750) + 32768), dec2hex(wave_length-375), uint8(waveform(376:end))); +end + + +% driverLocation = 'c:\libusbk\examples\open-device\debug\win32'; +% command = [driverLocation '\open-device "03eb" "a000" "' command '" "' num2str(tccper) '" "' num2str(clk_setting) '" "' num2str(wave_length) '" "' wavestring '"'] +% system(command); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/84/84effe1a1f62eb33ba16625a6129c21f32c80689.svn-base b/Old Matlab Interface/.svn/pristine/84/84effe1a1f62eb33ba16625a6129c21f32c80689.svn-base new file mode 100644 index 00000000..252ebda4 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/84/84effe1a1f62eb33ba16625a6129c21f32c80689.svn-base @@ -0,0 +1,69 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// AssemblyInfo.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.Reflection; +using System.Runtime.InteropServices; + + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyTitle("Hot.Plug.Detect")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Hot.Plug.Detect")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("f58e935c-8222-42fa-9ccb-2bec7a9eae8d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/85/854e53ad0c1c900867bb3e38b74b8aaf39b05517.svn-base b/Old Matlab Interface/.svn/pristine/85/854e53ad0c1c900867bb3e38b74b8aaf39b05517.svn-base new file mode 100644 index 00000000..25fbf807 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/85/854e53ad0c1c900867bb3e38b74b8aaf39b05517.svn-base @@ -0,0 +1,99 @@ +program enumerate; + +{$APPTYPE CONSOLE} +uses + SysUtils, + libusbK in '..\libusbK.pas'; + +procedure EnumerateAttachedDevices; +var + deviceCount : Cardinal; + lDeviceList : KLST_HANDLE; + lDeviceInfo : KLST_DEVINFO_HANDLE; + i : Integer; +begin + deviceCount := 0; + lDeviceList := Nil; + lDeviceInfo := Nil; + // Get the device list + if (not LstK_Init(lDeviceList, 0)) then + begin + WriteLn('Error in LstK_Init!'); + Exit; + end; + try // make sure list is freed under all circumstances + LstK_Count(lDeviceList, deviceCount); + if (deviceCount = 0) then + begin + WriteLn('No devices found!'); + Exit; // lDeviceList is freed in finally + end; + i := -1; + while LstK_MoveNext(lDeviceList, lDeviceInfo) do + begin + Inc(i); + if Assigned(lDeviceInfo) then + begin + WriteLn('Device ',i,' ---------------------------------'); + WriteLn('VID: ',lDeviceInfo.Common.Vid); + WriteLn('PID: ',lDeviceInfo.Common.Pid); + WriteLn('MI: ',lDeviceInfo.Common.MI); + WriteLn('InstanceID: ',lDeviceInfo.Common.InstanceID); + WriteLn('DriverID: ',lDeviceInfo.DriverID); + WriteLn('DeviceInterfaceGUID: ',lDeviceInfo.DeviceInterfaceGUID); + WriteLn('InstanceID: ',lDeviceInfo.InstanceID); + WriteLn('ClassGUID: ',lDeviceInfo.ClassGUID); + WriteLn('Mfg: ',lDeviceInfo.Mfg); + WriteLn('DeviceDesc: ',lDeviceInfo.DeviceDesc); + WriteLn('Service: ',lDeviceInfo.Service); + WriteLn('SymbolicLink: ',lDeviceInfo.SymbolicLink); + WriteLn('DevicePath: ',lDeviceInfo.DevicePath); + WriteLn('LUsb0FilterIndex: ',lDeviceInfo.LUsb0FilterIndex); + if lDeviceInfo.Connected then + WriteLn('Connected: True') + else + WriteLn('Connected: False'); + WriteLn('SyncFlags: '+Format('%x',[lDeviceInfo.SyncFlags])); + end; + end; + finally + if Assigned(lDeviceList) then + LstK_Free(lDeviceList); + end; +end; + + +begin + WriteLn('libusbK Device enumeration demo'); + if not libusbK.DllAvailable then + begin + WriteLn('Error: '+libusbK.LIBUSBK_DLL+' not available!'); + Halt(1); + end; + EnumerateAttachedDevices; + WriteLn('libusbK Device enumeration done'); + +(* Example output +libusbK Device enumeration demo +Device 0 --------------------------------- +VID: 1204 +PID: 34323 +MI: -1 +InstanceID: 6&564E695&0&1 +DriverID: 0 +DeviceInterfaceGUID: {53373f62-b5e4-d526-b292-f86533b3e7df} +InstanceID: USB\Vid_04b4&Pid_8613\6&564e695&0&1 +ClassGUID: {ECFB0CFD-74C4-4F52-BBF7-343461CD72AC} +Mfg: Cypress Semiconductor Corp. +DeviceDesc: Cypress Generic USB Device (LibUSB) +Service: libusbK +SymbolicLink: \\?\USB#Vid_04b4&Pid_8613#6&564e695&0&1#{53373f62-b5e4-d526-b292-f86533b3e7df} +DevicePath: \\?\USB#Vid_04b4&Pid_8613#6&564e695&0&1#{53373f62-b5e4-d526-b292-f86533b3e7df} +LUsb0FilterIndex: -1 +Connected: True +SyncFlags: 0 +libusbK Device enumeration done +*) + + +end. diff --git a/Old Matlab Interface/.svn/pristine/86/86eb39f23878c96ac9ca0a3c0171051d4449cbd5.svn-base b/Old Matlab Interface/.svn/pristine/86/86eb39f23878c96ac9ca0a3c0171051d4449cbd5.svn-base new file mode 100644 index 00000000..9705f823 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/86/86eb39f23878c96ac9ca0a3c0171051d4449cbd5.svn-base @@ -0,0 +1,5 @@ +command = '3'; + +driverLocation = 'c:\libusbk\examples\open-device\debug\win32'; +command = [driverLocation '\open-device "03eb" "a000" "' command '" "NULL" "NULL" "NULL" "NULL"'] +system(command); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/87/8772b8f072c56c428c182689f088a4190f73110d.svn-base b/Old Matlab Interface/.svn/pristine/87/8772b8f072c56c428c182689f088a4190f73110d.svn-base new file mode 100644 index 00000000..c361e69d --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/87/8772b8f072c56c428c182689f088a4190f73110d.svn-base @@ -0,0 +1,49 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// Program.cs +// +// Created: 03.02.2012 +// Last Updated: 03.03.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System; +using System.Windows.Forms; + + +namespace Handle.Test +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + private static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new fHandleTest()); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/87/87c12e93d8d3b7b0509c2b191a294c488a14da87.svn-base b/Old Matlab Interface/.svn/pristine/87/87c12e93d8d3b7b0509c2b191a294c488a14da87.svn-base new file mode 100644 index 00000000..18ba5118 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/87/87c12e93d8d3b7b0509c2b191a294c488a14da87.svn-base @@ -0,0 +1,14 @@ +function [wave] = tiny_wave_conv_aux(wave, amplitude); + +if length(wave)>128 + wave=imresize(wave,128/length(wave)); + warning('Vector length is greater than max_length. It has been scaled down.') +end + +if (amplitude>255 | amplitude<0 | amplitude ~= round(amplitude)) + error('Amplitude must be an integer between 0 and 255 for an 8 bit waveform!') +end + +wave = wave - min(wave); +wave = wave * amplitude / max(wave); +wave = round(wave); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/87/87e4a5b01caf2064c8cfbba9838e98683da95ed3.svn-base b/Old Matlab Interface/.svn/pristine/87/87e4a5b01caf2064c8cfbba9838e98683da95ed3.svn-base new file mode 100644 index 00000000..65b7fa05 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/87/87e4a5b01caf2064c8cfbba9838e98683da95ed3.svn-base @@ -0,0 +1,7 @@ +function [] = signal_trip(toggle) + +if toggle ~= 0 && toggle~= 1 && toggle~=2 && toggle~=3 + error('INVALID SIGNAL_TRIP INPUT') +end + +mex_usb_send_control('40', 'a4', dec2hex(toggle), '0', '0', '0'); diff --git a/Old Matlab Interface/.svn/pristine/89/89196469f0ff6239dde91a79ecea47656acdda7f.svn-base b/Old Matlab Interface/.svn/pristine/89/89196469f0ff6239dde91a79ecea47656acdda7f.svn-base new file mode 100644 index 00000000..7c3080c9 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/89/89196469f0ff6239dde91a79ecea47656acdda7f.svn-base @@ -0,0 +1,19 @@ +#include +#include +#include + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + unsigned char n; + char *garen; + + garen = mxArrayToString(prhs[0]); + + mexPrintf("nlhs = %d\n", nlhs); + mexPrintf("nrhs = %d\n", nrhs); + mexPrintf("STRING = %s\n", garen); + + + + return; +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/89/891c79cc3525c8953dc38d3952360b1c6a6fc91f.svn-base b/Old Matlab Interface/.svn/pristine/89/891c79cc3525c8953dc38d3952360b1c6a6fc91f.svn-base new file mode 100644 index 00000000..f5ccfdfb Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/89/891c79cc3525c8953dc38d3952360b1c6a6fc91f.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/89/891f6ae35ed50d8ee116d5081d309a2139cb1f55.svn-base b/Old Matlab Interface/.svn/pristine/89/891f6ae35ed50d8ee116d5081d309a2139cb1f55.svn-base new file mode 100644 index 00000000..ad31dc65 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/89/891f6ae35ed50d8ee116d5081d309a2139cb1f55.svn-base @@ -0,0 +1,37 @@ +function [taxis, cool_waveform, update_enable] = conv_ana(buffer, samplestoshow, channel) + + global scope_window_time + global gui_delay + global trigger + + if trigger.enabled==0 + conv_ana_notrig; + else + lo = dofrontend(trigger.l, channel) + hi = dofrontend(trigger.h, channel) + state = trigger.state + begin = max(trigger.begin, ceil(samplestoshow/2)) + + if state==0 %looking to fall + first = find(buffer(begin:end)hi, 1, 'first') + begin + if ~isempty(first) + draw_triggered; + else + taxis = [] + cool_waveform = [] + update_enable = 0 + pause(0.001) + end + end + end + return + + + diff --git a/Old Matlab Interface/.svn/pristine/8a/8a3d6b9a31578b2614976a87b55da6b1305c5407.svn-base b/Old Matlab Interface/.svn/pristine/8a/8a3d6b9a31578b2614976a87b55da6b1305c5407.svn-base new file mode 100644 index 00000000..4c4d34fc --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/8a/8a3d6b9a31578b2614976a87b55da6b1305c5407.svn-base @@ -0,0 +1,88 @@ +//MATLAB INCLUDES +#include +#include + +//LIBUSBK INCLUDES +#include +#include +#include +#include +#include "libusbk.h" + +#define DEBUG_SHOWCTRL 1 +#define ISO_PACKETS_TO_READ 30 +#define ISO_PACKET_SIZE 375 +#define HALFBUFFER_SIZE (ISO_PACKETS_TO_READ*ISO_PACKET_SIZE) + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + + //Vars: + //Imports + char *HANDLE_CHAR; + char *ISOCTX_CHAR; + char *OVLKHANDLE_CHAR; + char *OVLPOOL_CHAR; + char *ISOBUFFER_CHAR; + KUSB_HANDLE handle = NULL; + unsigned char pipeID = 0x83; + unsigned char *mode_ptr; + unsigned int offset; + //Internals + PKISO_CONTEXT isoCtx; + KOVL_HANDLE ovlkHandle; + KOVL_POOL_HANDLE ovlPool; + char *isoBuffer; + unsigned char success; + unsigned int transferred; + DWORD errorCode = ERROR_SUCCESS; + unsigned int n; + //Exports + char *transfer_contents; + unsigned int *error_export; + + //Initialise Data + HANDLE_CHAR = mxArrayToString(prhs[0]); + sscanf(HANDLE_CHAR, "%16x", &handle); + + ISOCTX_CHAR = mxArrayToString(prhs[1]); + sscanf(ISOCTX_CHAR, "%16x", &isoCtx); + + OVLKHANDLE_CHAR = mxArrayToString(prhs[2]); + sscanf(OVLKHANDLE_CHAR, "%16x", &ovlkHandle); + + OVLPOOL_CHAR = mxArrayToString(prhs[3]); + sscanf(OVLPOOL_CHAR, "%16x", &ovlPool); + + ISOBUFFER_CHAR = mxArrayToString(prhs[4]); + sscanf(ISOBUFFER_CHAR, "%16x", &isoBuffer); + + mode_ptr = mxGetData(prhs[5]); + offset = (*mode_ptr) * HALFBUFFER_SIZE; + + //Actual Function + success = OvlK_WaitAndRelease(ovlkHandle, 1000, &transferred); + if (!success) { + errorCode = GetLastError(); + printf("IsoReadPipe failed. ErrorCode: %08Xh\n", errorCode); + } + + IsoK_Init(&isoCtx, ISO_PACKETS_TO_READ, ISO_PACKETS_TO_READ); + IsoK_SetPackets(isoCtx, ISO_PACKET_SIZE); + OvlK_Acquire(&ovlkHandle, ovlPool); + UsbK_IsoReadPipe(handle, pipeID, (isoBuffer+offset), HALFBUFFER_SIZE, ovlkHandle, isoCtx); + + //Export Data + transfer_contents = mxMalloc(HALFBUFFER_SIZE); + for (n=0;n0.75 +% error('PSU DUTY CYCLE TOO LARGE!!! ABORTING!!!') +% end +% D = uint16(D*255) + D = expected_adc(vo) + if D>113 | D<21 + error('PSU DUTY CYCLE TOO LARGE (could underflow on SOF)!!! ABORTING!!!') + end + mex_usb_send_control('40', 'a3', dec2hex(D), '0', '0', '0'); diff --git a/Old Matlab Interface/.svn/pristine/8c/8cd1937ea79bdfed87f7af58afb69e3246c362f3.svn-base b/Old Matlab Interface/.svn/pristine/8c/8cd1937ea79bdfed87f7af58afb69e3246c362f3.svn-base new file mode 100644 index 00000000..49b1b909 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/8c/8cd1937ea79bdfed87f7af58afb69e3246c362f3.svn-base @@ -0,0 +1,2 @@ +clear all +avrbreak \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/8d/8d91434d05e3b1d6e19cffdb2a684e984f2f5991.svn-base b/Old Matlab Interface/.svn/pristine/8d/8d91434d05e3b1d6e19cffdb2a684e984f2f5991.svn-base new file mode 100644 index 00000000..4280bc3c --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/8d/8d91434d05e3b1d6e19cffdb2a684e984f2f5991.svn-base @@ -0,0 +1,258 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// UsbStream.cs +// +// Created: 03.05.2012 +// Last Updated: 03.07.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +using System; +using System.Diagnostics; +using System.IO; +using System.Runtime.InteropServices; +using libusbK; + +namespace Xfer.UsbStream +{ + // ReSharper disable InconsistentNaming + + public class UsbStream : Stream + { + public static bool UseCallbacks = true; + + private readonly KSTM_CALLBACK mCallbacks; + protected readonly byte mPipeId; + protected StmK mStm; + protected UsbK mUsb; + private bool mbDisposed; + + public UsbStream(UsbK usb, + byte pipeId, + int maxTransferSize, + int maxPendingTransfers, + int maxPendingIo, + bool useTimeout, + UInt16 timeout) + { + mUsb = usb; + mPipeId = pipeId; + + if (UseCallbacks) + { + mCallbacks.Complete = StmComplete; + if (((mPipeId & AllKConstants.USB_ENDPOINT_DIRECTION_MASK) > 0)) + { + mCallbacks.Submit = StmSubmitRead; + } + else + { + mCallbacks.Submit = StmSubmitWrite; + } + } + KSTM_FLAG flags = useTimeout ? KSTM_FLAG.USE_TIMEOUT | (KSTM_FLAG) timeout : KSTM_FLAG.NONE; + + mStm = new StmK(mUsb.Handle, + pipeId, + maxTransferSize, + maxPendingTransfers, + maxPendingIo, + ref mCallbacks, + flags); + } + + public override bool CanRead + { + get + { + return ((mPipeId & AllKConstants.USB_ENDPOINT_DIRECTION_MASK) > 0); + } + } + + public override bool CanSeek + { + get + { + return false; + } + } + + public override bool CanWrite + { + get + { + return ((mPipeId & AllKConstants.USB_ENDPOINT_DIRECTION_MASK) == 0); + } + } + + protected override void Dispose(bool disposing) + { + if (!mbDisposed) + { + mStm.Dispose(); + mStm = null; + mUsb = null; + mbDisposed = true; + } + base.Dispose(disposing); + } + + public override int Read(byte[] buffer, int offset, int count) + { + int transferred; + bool success = mStm.Read(buffer, offset, count, out transferred); + + Debug.WriteLineIf(!success, + String.Format("Failed reading from usb stream. ErrorCode={0:X8}h", + Marshal.GetLastWin32Error()), + "ERROR"); + + return !success ? 0 : transferred; + } + + public bool Start() + { + return mStm.Start(); + } + + public bool Stop(int timeoutCancelMs) + { + return mStm.Stop(timeoutCancelMs); + } + + public override void Write(byte[] buffer, int offset, int count) + { + int transferred; + + bool success = mStm.Write(buffer, offset, count, out transferred); + if (!success) + { + // This is caused by a lack of 'PendingTransfer' slots. + Debug.WriteLine( + String.Format("Failed writing to usb stream. ErrorCode={0:X8}h", + Marshal.GetLastWin32Error()), + "ERROR"); + return; + } + + // If the KSTM_FLAG.NO_PARTIAL_XFERS is *not* set, StmK will transfer as many bytes as it can and return true. + Debug.WriteLineIf(transferred != count, + String.Format("Not all bytes were written. Expected:{0} Transferred:{1}", + count, + transferred), + "ERROR"); + } + + public override void Flush() + { + } + + private int StmComplete(KSTM_INFO stmInfo, KSTM_XFER_CONTEXT xferContext, int stmXferContextIndex, int errorCode) + { + Debug.WriteLineIf(errorCode != ErrorCodes.Success, + String.Format("Failed completing transfer. PipeID:{0:X2}h ErrorCode:{1:X8}h", + mPipeId, + errorCode), + "ERROR"); + return errorCode; + } + + private int StmSubmitRead(KSTM_INFO info, + KSTM_XFER_CONTEXT xferContext, + int xferContextIndex, + IntPtr nativeOverlapped) + { + int notUsedForAsync; + int bufferSize = xferContext.BufferSize; + + bool success = mUsb.ReadPipe(mPipeId, xferContext.Buffer, bufferSize, out notUsedForAsync, nativeOverlapped); + int errorCode = Marshal.GetLastWin32Error(); + + if (!success && errorCode == ErrorCodes.IoPending) return ErrorCodes.Success; + + Debug.WriteLine( + String.Format("Failed submitting transfer. PipeID:{0:X2}h ErrorCode:{1:X8}h", + mPipeId, + errorCode), + "ERROR"); + return errorCode; + } + + private int StmSubmitWrite(KSTM_INFO info, + KSTM_XFER_CONTEXT xferContext, + int xferContextIndex, + IntPtr nativeOverlapped) + { + int notUsedForAsync; + int bufferSize = xferContext.TransferLength; + + bool success = mUsb.WritePipe(mPipeId, xferContext.Buffer, bufferSize, out notUsedForAsync, nativeOverlapped); + int errorCode = Marshal.GetLastWin32Error(); + + if (!success && errorCode == ErrorCodes.IoPending) return ErrorCodes.Success; + + Debug.WriteLine( + String.Format("Failed submitting transfer. PipeID:{0:X2}h ErrorCode:{1:X8}h", + mPipeId, + errorCode), + "ERROR"); + + return errorCode; + } + + #region Not Supported + + public override long Length + { + get + { + throw new NotSupportedException(); + } + } + + public override long Position + { + get + { + throw new NotSupportedException(); + } + set + { + throw new NotSupportedException(); + } + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + #endregion + } +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/8d/8dff77fcaf116493419ad088b481af6a4fc10114.svn-base b/Old Matlab Interface/.svn/pristine/8d/8dff77fcaf116493419ad088b481af6a4fc10114.svn-base new file mode 100644 index 00000000..5ee45658 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/8d/8dff77fcaf116493419ad088b481af6a4fc10114.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/8f/8f1132ee0db0983091d41e2f856bf5bf0af3b2f5.svn-base b/Old Matlab Interface/.svn/pristine/8f/8f1132ee0db0983091d41e2f856bf5bf0af3b2f5.svn-base new file mode 100644 index 00000000..6e1586a0 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/8f/8f1132ee0db0983091d41e2f856bf5bf0af3b2f5.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/8f/8f3b546183f36253bc8c454c70e9b8fbefb922ff.svn-base b/Old Matlab Interface/.svn/pristine/8f/8f3b546183f36253bc8c454c70e9b8fbefb922ff.svn-base new file mode 100644 index 00000000..65ae7152 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/8f/8f3b546183f36253bc8c454c70e9b8fbefb922ff.svn-base @@ -0,0 +1,28 @@ +//MATLAB INCLUDES +#include +#include + +//LIBUSBK INCLUDES +#include +#include +#include +#include +#include "libusbk.h" + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + //Vars: + //Imports + char* POOL_CHAR; + KOVL_POOL_HANDLE ovlPool = NULL; + + + + //Initialise Data + POOL_CHAR = mxArrayToString(prhs[0]); + sscanf(POOL_CHAR, "%16x", &ovlPool); + + //Actual Function + OvlK_Free(ovlPool); + return; +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/90/90d475a7054803e545ad8a4f6e6868f608f55f6d.svn-base b/Old Matlab Interface/.svn/pristine/90/90d475a7054803e545ad8a4f6e6868f608f55f6d.svn-base new file mode 100644 index 00000000..05ad2639 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/90/90d475a7054803e545ad8a4f6e6868f608f55f6d.svn-base @@ -0,0 +1,7 @@ + transfer_contents_temp = []; + for tempovar = 0:length(transfer_contents_0)/750 - 1 + transfer_contents_temp = [transfer_contents_temp transfer_contents_0((tempovar*750+1):(tempovar*750+375))]; + transfer_contents_temp = [transfer_contents_temp transfer_contents_1((tempovar*750+1):(tempovar*750+375))]; + end + + plot(transfer_contents_temp) \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/91/912bf56237775ea922c9d891e7cc8f1cd019d308.svn-base b/Old Matlab Interface/.svn/pristine/91/912bf56237775ea922c9d891e7cc8f1cd019d308.svn-base new file mode 100644 index 00000000..acc8fef1 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/91/912bf56237775ea922c9d891e7cc8f1cd019d308.svn-base @@ -0,0 +1,84 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {204628C0-DFA7-4DA8-BF4A-3AFB81E74F89} + WinExe + Properties + Handle.Test + Handle.Test + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + libusbK.cs + + + Form + + + fHandleTest.cs + + + + + fHandleTest.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/94/94015317cc0c78f6e1899a1f7eba73bcec65b371.svn-base b/Old Matlab Interface/.svn/pristine/94/94015317cc0c78f6e1899a1f7eba73bcec65b371.svn-base new file mode 100644 index 00000000..993ca4ad Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/94/94015317cc0c78f6e1899a1f7eba73bcec65b371.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/94/94a348c0208e96952918834c70333658f876cde9.svn-base b/Old Matlab Interface/.svn/pristine/94/94a348c0208e96952918834c70333658f876cde9.svn-base new file mode 100644 index 00000000..2acea442 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/94/94a348c0208e96952918834c70333658f876cde9.svn-base @@ -0,0 +1,1035 @@ +function varargout = first_gui(varargin) +% FIRST_GUI MATLAB code for first_gui.fig +% FIRST_GUI, by itself, creates a new FIRST_GUI or raises the existing +% singleton*. +% +% H = FIRST_GUI returns the handle to a new FIRST_GUI or the handle to +% the existing singleton*. +% +% FIRST_GUI('CALLBACK',hObject,eventData,handles,...) calls the local +% function named CALLBACK in FIRST_GUI.M with the given input arguments. +% +% FIRST_GUI('Property','Value',...) creates a new FIRST_GUI or raises the +% existing singleton*. Starting from the left, property value pairs are +% applied to the GUI before first_gui_OpeningFcn gets called. An +% unrecognized property name or invalid value makes property application +% stop. All inputs are passed to first_gui_OpeningFcn via varargin. +% +% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one +% instance to run (singleton)". +% +% See also: GUIDE, GUIDATA, GUIHANDLES + +% Edit the above text to modify the response to help first_gui + +% Last Modified by GUIDE v2.5 03-Dec-2015 11:38:11 + +% Begin initialization code - DO NOT EDIT +gui_Singleton = 1; +gui_State = struct('gui_Name', mfilename, ... + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @first_gui_OpeningFcn, ... + 'gui_OutputFcn', @first_gui_OutputFcn, ... + 'gui_LayoutFcn', [] , ... + 'gui_Callback', []); +if nargin && ischar(varargin{1}) + gui_State.gui_Callback = str2func(varargin{1}); +end + +if nargout + [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); +else + gui_mainfcn(gui_State, varargin{:}); +end +% End initialization code - DO NOT EDIT + + +% --- Executes just before first_gui is made visible. +function first_gui_OpeningFcn(hObject, eventdata, handles, varargin) +% This function has no output args, see OutputFcn. +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +% varargin command line arguments to first_gui (see VARARGIN) + +% Choose default command line output for first_gui +handles.output = hObject; + +handles + +global gui_axes +global gui_delay +global text_box_1 +global text_box_2 +global gui_scope_running +global gui_cursor_mode +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global scope_window_min +global gui_awg_waveform +global gui_awg_amplitude +global gui_awg_frequency +global gui_vo +global gui_ro +global gui_static_text_scope +global CH1_AC +global CH2_AC + + +gui_delay = handles.slider6 +gui_axes = handles.axes1; +text_box_1 = handles.edit1; +text_box_2 = handles.text9 +gui_static_text_scope = handles.text10; +gui_scope_running = 1; +gui_cursor_mode = 1; + +gui_vert_cursor_a_pos = 0; +gui_vert_cursor_b_pos = 0; +gui_hori_cursor_a_pos = scope_window_min; +gui_hori_cursor_b_pos = scope_window_min; + +gui_awg_waveform = 'sin(linspace(0,2*pi,128))'; +gui_awg_amplitude = '255'; +gui_awg_frequency = '50' + +gui_vo = 0; +gui_ro = 1000; + +CH1_AC = 0; +CH2_AC = 0; + + +%get(handles.axes1) + +% Update handles structure +guidata(hObject, handles); + +% UIWAIT makes first_gui wait for user response (see UIRESUME) +% uiwait(handles.figure1); + + +% --- Outputs from this function are returned to the command line. +function varargout = first_gui_OutputFcn(hObject, eventdata, handles) +% varargout cell array for returning output args (see VARARGOUT); +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Get default command line output from handles structure +varargout{1} = handles.output; + + + +function edit1_Callback(hObject, eventdata, handles) +% hObject handle to edit1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit1 as text +% str2double(get(hObject,'String')) returns contents of edit1 as a double + + +% --- Executes during object creation, after setting all properties. +function edit1_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit2_Callback(hObject, eventdata, handles) +% hObject handle to edit2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit2 as text +% str2double(get(hObject,'String')) returns contents of edit2 as a double + + +% --- Executes during object creation, after setting all properties. +function edit2_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit3_Callback(hObject, eventdata, handles) +% hObject handle to edit3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit3 as text +% str2double(get(hObject,'String')) returns contents of edit3 as a double + + +% --- Executes during object creation, after setting all properties. +function edit3_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit4_Callback(hObject, eventdata, handles) +% hObject handle to edit4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit4 as text +% str2double(get(hObject,'String')) returns contents of edit4 as a double + + +% --- Executes during object creation, after setting all properties. +function edit4_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider1_Callback(hObject, eventdata, handles) +global scope_window_time +global gui_delay +% hObject handle to slider1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +scope_window_time = 10^(-get(hObject, 'value')) +set(gui_delay, 'SliderStep', [scope_window_time/100, scope_window_time/10]); +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider1_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + + +function edit5_Callback(hObject, eventdata, handles) +% hObject handle to edit5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit5 as text +% str2double(get(hObject,'String')) returns contents of edit5 as a double + + +% --- Executes during object creation, after setting all properties. +function edit5_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton1. +function pushbutton1_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + + +% --- Executes on slider movement. +function slider2_Callback(hObject, eventdata, handles) +% hObject handle to slider2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_hori_cursor_a_pos +global scope_window_max +global scope_window_min +global text_box_2 +global gui_cursor_mode + +gui_hori_cursor_a_pos = scope_window_min + (scope_window_max - scope_window_min) * get(hObject,'Value'); + +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider2_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on selection change in popupmenu1. +function popupmenu1_Callback(hObject, eventdata, handles) +% hObject handle to popupmenu1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_cursor_mode +gui_cursor_mode = get(hObject,'Value') + +% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array +% contents{get(hObject,'Value')} returns selected item from popupmenu1 + + +% --- Executes during object creation, after setting all properties. +function popupmenu1_CreateFcn(hObject, eventdata, handles) +% hObject handle to popupmenu1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: popupmenu controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider3_Callback(hObject, eventdata, handles) +% hObject handle to slider3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_hori_cursor_b_pos +global scope_window_max +global scope_window_min +global text_box_2 +global gui_cursor_mode + +gui_hori_cursor_b_pos = scope_window_min + (scope_window_max - scope_window_min) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider3_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + + +function edit6_Callback(hObject, eventdata, handles) +% hObject handle to edit6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_waveform +gui_awg_waveform = get(hObject,'String'); + + +% Hints: get(hObject,'String') returns contents of edit6 as text +% str2double(get(hObject,'String')) returns contents of edit6 as a double + + +% --- Executes during object creation, after setting all properties. +function edit6_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton3. +function pushbutton3_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_awg_waveform +global gui_awg_amplitude +global gui_awg_frequency +gui_awg_waveform +gui_awg_amplitude +gui_awg_frequency +tiny_send_waveform(eval(gui_awg_waveform), str2num(gui_awg_amplitude), str2num(gui_awg_frequency)); + + +function edit7_Callback(hObject, eventdata, handles) +% hObject handle to edit7 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_amplitude +gui_awg_amplitude = get(hObject,'String'); + +% Hints: get(hObject,'String') returns contents of edit7 as text +% str2double(get(hObject,'String')) returns contents of edit7 as a double + + +% --- Executes during object creation, after setting all properties. +function edit7_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit7 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit8_Callback(hObject, eventdata, handles) +% hObject handle to edit8 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_frequency +gui_awg_frequency = get(hObject,'String'); +% Hints: get(hObject,'String') returns contents of edit8 as text +% str2double(get(hObject,'String')) returns contents of edit8 as a double + + +% --- Executes during object creation, after setting all properties. +function edit8_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit8 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. + +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton4. +function pushbutton4_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_scope_running +gui_scope_running = ~gui_scope_running + + + +function edit9_Callback(hObject, eventdata, handles) +% hObject handle to edit9 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vo; +gui_vo = str2num(get(hObject, 'String')); + +% Hints: get(hObject,'String') returns contents of edit9 as text +% str2double(get(hObject,'String')) returns contents of edit9 as a double + + +% --- Executes during object creation, after setting all properties. +function edit9_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit9 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit10_Callback(hObject, eventdata, handles) +% hObject handle to edit10 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_ro; +gui_ro = str2num(get(hObject, 'String')); +% Hints: get(hObject,'String') returns contents of edit10 as text +% str2double(get(hObject,'String')) returns contents of edit10 as a double + + +% --- Executes during object creation, after setting all properties. +function edit10_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit10 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton5. +function pushbutton5_Callback(hObject, eventdata, handles) +global gui_vo +global gui_ro +setpsu_boost(gui_vo, 5, gui_ro); +% hObject handle to pushbutton5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + + +% --- Executes on slider movement. +function slider4_Callback(hObject, eventdata, handles) +% hObject handle to slider4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vert_cursor_a_pos +global scope_window_time +global text_box_2 +global gui_cursor_mode + +gui_vert_cursor_a_pos = -scope_window_time + (scope_window_time) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider4_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on slider movement. +function slider5_Callback(hObject, eventdata, handles) +% hObject handle to slider5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vert_cursor_b_pos +global scope_window_time +global text_box_2 +global gui_cursor_mode +gui_vert_cursor_b_pos = -scope_window_time + (scope_window_time) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider5_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on selection change in popupmenu2. +function popupmenu2_Callback(hObject, eventdata, handles) +% hObject handle to popupmenu2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global scope_mode +global scope_gain_0 +global scope_gain_1 +global refreshrate +global refreshrate_temp +global waveform_exists +global saved_waveform_ch1 +global saved_waveform_ch2 +global gui_delay + +refreshrate_temp = refreshrate; +waveform_exists = 0 + +contents = cellstr(get(hObject,'String')); +tempstring = contents{get(hObject,'Value')}; + +mode = str2num(tempstring(6)); +setscopemode(mode, scope_gain_0, scope_gain_1) + +saved_waveform_ch1 = []; +saved_waveform_ch2 = []; +set(gui_delay, 'Value', get(gui_delay, 'Max')) + +% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu2 contents as cell array +% contents{get(hObject,'Value')} returns selected item from popupmenu2 + + +% --- Executes during object creation, after setting all properties. +function popupmenu2_CreateFcn(hObject, eventdata, handles) +% hObject handle to popupmenu2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: popupmenu controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider6_Callback(hObject, eventdata, handles) +% hObject handle to slider6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider6_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end +set(hObject,'Value', 1); + + + +function edit11_Callback(hObject, eventdata, handles) +% hObject handle to edit11 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_delay + +boxvar = str2num(get(hObject,'String')); +if boxvar= AIsoContext.NumberOfPackets) then + Result:= Nil + else + Result:= @PKISO_PACKET_ARRAY(@AIsoContext.IsoPackets)^[AIndex]; + // isoCtx.IsoPackets[posPacket]; + end; + + function UsbK_InitFromDevicePath(const ADevicePath: String; + var InterfaceHandle: KUSB_HANDLE): Boolean; + var + deviceCount: Cardinal; + lDeviceList: KLST_HANDLE; + lDeviceInfo: KLST_DEVINFO_HANDLE; + begin + Result:= False; + if not DllAvailable then + Exit; + InterfaceHandle:= Nil; + deviceCount:= 0; + lDeviceList:= Nil; + lDeviceInfo:= Nil; + // Get the device list + if (not LstK_Init(lDeviceList, 0)) then + Exit; + try + LstK_Count(lDeviceList, deviceCount); + if (deviceCount = 0) then + Exit; // List is freed in finally + while LstK_MoveNext(lDeviceList, lDeviceInfo) do + begin + if Assigned(lDeviceInfo) then + begin + if ADevicePath = lDeviceInfo.DevicePath then + begin + if UsbK_Init(InterfaceHandle, lDeviceInfo) then + begin + Result:= True; + Exit; + end; + InterfaceHandle:= Nil; + end; + end; + end; + finally + // If lDeviceList is still assigned than free + if Assigned(lDeviceList) then + LstK_Free(lDeviceList); + end; + end; + + function USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX(const DescriptorType: Byte; + const Index: Byte): Word; + begin + Result:= (Word(DescriptorType) shl 8) or Index; + end; + + function InitDllImport: Boolean; + begin + Result:= False; + {$IFDEF DynamicLink} + HLIBUSBKDll:= LoadLibrary(LIBUSBK_DLL); + if HLIBUSBKDll >= 32 then { success } + begin + HotK_Init:= GetProcAddress(HLIBUSBKDll, 'HotK_Init'); + HotK_Free:= GetProcAddress(HLIBUSBKDll, 'HotK_Free'); + HotK_FreeAll:= GetProcAddress(HLIBUSBKDll, 'HotK_FreeAll'); + IsoK_EnumPackets:= GetProcAddress(HLIBUSBKDll, 'IsoK_EnumPackets'); + IsoK_Free:= GetProcAddress(HLIBUSBKDll, 'IsoK_Free'); + IsoK_GetPacket:= GetProcAddress(HLIBUSBKDll, 'IsoK_GetPacket'); + IsoK_Init:= GetProcAddress(HLIBUSBKDll, 'IsoK_Init'); + IsoK_ReUse:= GetProcAddress(HLIBUSBKDll, 'IsoK_ReUse'); + IsoK_SetPacket:= GetProcAddress(HLIBUSBKDll, 'IsoK_SetPacket'); + IsoK_SetPackets:= GetProcAddress(HLIBUSBKDll, 'IsoK_SetPackets'); + LibK_CopyDriverAPI:= GetProcAddress(HLIBUSBKDll, 'LibK_CopyDriverAPI'); + LibK_GetContext:= GetProcAddress(HLIBUSBKDll, 'LibK_GetContext'); + LibK_GetProcAddress:= GetProcAddress(HLIBUSBKDll, 'LibK_GetProcAddress'); + LibK_GetVersion:= GetProcAddress(HLIBUSBKDll, 'LibK_GetVersion'); + LibK_LoadDriverAPI:= GetProcAddress(HLIBUSBKDll, 'LibK_LoadDriverAPI'); + LibK_SetCleanupCallback:= GetProcAddress(HLIBUSBKDll, + 'LibK_SetCleanupCallback'); + LibK_SetContext:= GetProcAddress(HLIBUSBKDll, 'LibK_SetContext'); + LibK_SetDefaultContext:= GetProcAddress(HLIBUSBKDll, + 'LibK_SetDefaultContext'); + LibK_GetDefaultContext:= GetProcAddress(HLIBUSBKDll, + 'LibK_GetDefaultContext'); + LstK_AttachInfo:= GetProcAddress(HLIBUSBKDll, 'LstK_AttachInfo'); + LstK_Clone:= GetProcAddress(HLIBUSBKDll, 'LstK_Clone'); + LstK_CloneInfo:= GetProcAddress(HLIBUSBKDll, 'LstK_CloneInfo'); + LstK_Count:= GetProcAddress(HLIBUSBKDll, 'LstK_Count'); + LstK_Current:= GetProcAddress(HLIBUSBKDll, 'LstK_Current'); + LstK_DetachInfo:= GetProcAddress(HLIBUSBKDll, 'LstK_DetachInfo'); + LstK_Enumerate:= GetProcAddress(HLIBUSBKDll, 'LstK_Enumerate'); + LstK_FindByVidPid:= GetProcAddress(HLIBUSBKDll, 'LstK_FindByVidPid'); + LstK_Free:= GetProcAddress(HLIBUSBKDll, 'LstK_Free'); + LstK_FreeInfo:= GetProcAddress(HLIBUSBKDll, 'LstK_FreeInfo'); + LstK_Init:= GetProcAddress(HLIBUSBKDll, 'LstK_Init'); + LstK_InitEx:= GetProcAddress(HLIBUSBKDll, 'LstK_InitEx'); + LstK_MoveNext:= GetProcAddress(HLIBUSBKDll, 'LstK_MoveNext'); + LstK_MoveReset:= GetProcAddress(HLIBUSBKDll, 'LstK_MoveReset'); + LstK_Sync:= GetProcAddress(HLIBUSBKDll, 'LstK_Sync'); + OvlK_Acquire:= GetProcAddress(HLIBUSBKDll, 'OvlK_Acquire'); + OvlK_Free:= GetProcAddress(HLIBUSBKDll, 'OvlK_Free'); + OvlK_GetEventHandle:= GetProcAddress(HLIBUSBKDll, 'OvlK_GetEventHandle'); + OvlK_Init:= GetProcAddress(HLIBUSBKDll, 'OvlK_Init'); + OvlK_IsComplete:= GetProcAddress(HLIBUSBKDll, 'OvlK_IsComplete'); + OvlK_ReUse:= GetProcAddress(HLIBUSBKDll, 'OvlK_ReUse'); + OvlK_Release:= GetProcAddress(HLIBUSBKDll, 'OvlK_Release'); + OvlK_Wait:= GetProcAddress(HLIBUSBKDll, 'OvlK_Wait'); + OvlK_WaitOldest:= GetProcAddress(HLIBUSBKDll, 'OvlK_WaitOldest'); + OvlK_WaitAndRelease:= GetProcAddress(HLIBUSBKDll, 'OvlK_WaitAndRelease'); + OvlK_WaitOrCancel:= GetProcAddress(HLIBUSBKDll, 'OvlK_WaitOrCancel'); + StmK_Free:= GetProcAddress(HLIBUSBKDll, 'StmK_Free'); + StmK_Init:= GetProcAddress(HLIBUSBKDll, 'StmK_Init'); + StmK_Read:= GetProcAddress(HLIBUSBKDll, 'StmK_Read'); + StmK_Start:= GetProcAddress(HLIBUSBKDll, 'StmK_Start'); + StmK_Stop:= GetProcAddress(HLIBUSBKDll, 'StmK_Stop'); + StmK_Write:= GetProcAddress(HLIBUSBKDll, 'StmK_Write'); + UsbK_AbortPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_AbortPipe'); + UsbK_ClaimInterface:= GetProcAddress(HLIBUSBKDll, 'UsbK_ClaimInterface'); + UsbK_Clone:= GetProcAddress(HLIBUSBKDll, 'UsbK_Clone'); + UsbK_ControlTransfer:= GetProcAddress(HLIBUSBKDll, + 'UsbK_ControlTransfer'); + UsbK_FlushPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_FlushPipe'); + UsbK_Free:= GetProcAddress(HLIBUSBKDll, 'UsbK_Free'); + UsbK_GetAltInterface:= GetProcAddress(HLIBUSBKDll, + 'UsbK_GetAltInterface'); + UsbK_GetAssociatedInterface:= GetProcAddress(HLIBUSBKDll, + 'UsbK_GetAssociatedInterface'); + UsbK_GetConfiguration:= GetProcAddress(HLIBUSBKDll, + 'UsbK_GetConfiguration'); + UsbK_GetCurrentAlternateSetting:= GetProcAddress(HLIBUSBKDll, + 'UsbK_GetCurrentAlternateSetting'); + UsbK_GetCurrentFrameNumber:= GetProcAddress(HLIBUSBKDll, + 'UsbK_GetCurrentFrameNumber'); + UsbK_GetDescriptor:= GetProcAddress(HLIBUSBKDll, 'UsbK_GetDescriptor'); + UsbK_GetOverlappedResult:= GetProcAddress(HLIBUSBKDll, + 'UsbK_GetOverlappedResult'); + UsbK_GetPipePolicy:= GetProcAddress(HLIBUSBKDll, 'UsbK_GetPipePolicy'); + UsbK_GetPowerPolicy:= GetProcAddress(HLIBUSBKDll, 'UsbK_GetPowerPolicy'); + UsbK_GetProperty:= GetProcAddress(HLIBUSBKDll, 'UsbK_GetProperty'); + UsbK_Init:= GetProcAddress(HLIBUSBKDll, 'UsbK_Init'); + UsbK_Initialize:= GetProcAddress(HLIBUSBKDll, 'UsbK_Initialize'); + UsbK_IsoReadPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_IsoReadPipe'); + UsbK_IsoWritePipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_IsoWritePipe'); + UsbK_QueryDeviceInformation:= GetProcAddress(HLIBUSBKDll, + 'UsbK_QueryDeviceInformation'); + UsbK_QueryInterfaceSettings:= GetProcAddress(HLIBUSBKDll, + 'UsbK_QueryInterfaceSettings'); + UsbK_QueryPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_QueryPipe'); + UsbK_ReadPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_ReadPipe'); + UsbK_ReleaseInterface:= GetProcAddress(HLIBUSBKDll, + 'UsbK_ReleaseInterface'); + UsbK_ResetDevice:= GetProcAddress(HLIBUSBKDll, 'UsbK_ResetDevice'); + UsbK_ResetPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_ResetPipe'); + UsbK_SelectInterface:= GetProcAddress(HLIBUSBKDll, + 'UsbK_SelectInterface'); + UsbK_SetAltInterface:= GetProcAddress(HLIBUSBKDll, + 'UsbK_SetAltInterface'); + UsbK_SetConfiguration:= GetProcAddress(HLIBUSBKDll, + 'UsbK_SetConfiguration'); + UsbK_SetCurrentAlternateSetting:= GetProcAddress(HLIBUSBKDll, + 'UsbK_SetCurrentAlternateSetting'); + UsbK_SetPipePolicy:= GetProcAddress(HLIBUSBKDll, 'UsbK_SetPipePolicy'); + UsbK_SetPowerPolicy:= GetProcAddress(HLIBUSBKDll, 'UsbK_SetPowerPolicy'); + UsbK_WritePipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_WritePipe'); + WinUsb_AbortPipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_AbortPipe'); + WinUsb_ControlTransfer:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_ControlTransfer'); + WinUsb_FlushPipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_FlushPipe'); + WinUsb_Free:= GetProcAddress(HLIBUSBKDll, 'WinUsb_Free'); + WinUsb_GetAssociatedInterface:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_GetAssociatedInterface'); + WinUsb_GetCurrentAlternateSetting:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_GetCurrentAlternateSetting'); + WinUsb_GetDescriptor:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_GetDescriptor'); + WinUsb_GetOverlappedResult:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_GetOverlappedResult'); + WinUsb_GetPipePolicy:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_GetPipePolicy'); + WinUsb_GetPowerPolicy:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_GetPowerPolicy'); + WinUsb_Initialize:= GetProcAddress(HLIBUSBKDll, 'WinUsb_Initialize'); + WinUsb_QueryDeviceInformation:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_QueryDeviceInformation'); + WinUsb_QueryInterfaceSettings:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_QueryInterfaceSettings'); + WinUsb_QueryPipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_QueryPipe'); + WinUsb_ReadPipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_ReadPipe'); + WinUsb_ResetPipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_ResetPipe'); + WinUsb_SetCurrentAlternateSetting:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_SetCurrentAlternateSetting'); + WinUsb_SetPipePolicy:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_SetPipePolicy'); + WinUsb_SetPowerPolicy:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_SetPowerPolicy'); + WinUsb_WritePipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_WritePipe'); + Result:= True; + Result:= Result and Assigned(HotK_Init); + Result:= Result and Assigned(HotK_Free); + Result:= Result and Assigned(HotK_FreeAll); + Result:= Result and Assigned(IsoK_EnumPackets); + Result:= Result and Assigned(IsoK_Free); + Result:= Result and Assigned(IsoK_GetPacket); + Result:= Result and Assigned(IsoK_Init); + Result:= Result and Assigned(IsoK_ReUse); + Result:= Result and Assigned(IsoK_SetPacket); + Result:= Result and Assigned(IsoK_SetPackets); + Result:= Result and Assigned(LibK_CopyDriverAPI); + Result:= Result and Assigned(LibK_GetContext); + Result:= Result and Assigned(LibK_GetProcAddress); + Result:= Result and Assigned(LibK_GetVersion); + Result:= Result and Assigned(LibK_LoadDriverAPI); + Result:= Result and Assigned(LibK_SetCleanupCallback); + Result:= Result and Assigned(LibK_SetContext); + Result:= Result and Assigned(LibK_SetDefaultContext); + Result:= Result and Assigned(LibK_GetDefaultContext); + Result:= Result and Assigned(LstK_AttachInfo); + Result:= Result and Assigned(LstK_Clone); + Result:= Result and Assigned(LstK_CloneInfo); + Result:= Result and Assigned(LstK_Count); + Result:= Result and Assigned(LstK_Current); + Result:= Result and Assigned(LstK_DetachInfo); + Result:= Result and Assigned(LstK_Enumerate); + Result:= Result and Assigned(LstK_FindByVidPid); + Result:= Result and Assigned(LstK_Free); + Result:= Result and Assigned(LstK_FreeInfo); + Result:= Result and Assigned(LstK_Init); + Result:= Result and Assigned(LstK_InitEx); + Result:= Result and Assigned(LstK_MoveNext); + Result:= Result and Assigned(LstK_MoveReset); + Result:= Result and Assigned(LstK_Sync); + Result:= Result and Assigned(OvlK_Acquire); + Result:= Result and Assigned(OvlK_Free); + Result:= Result and Assigned(OvlK_GetEventHandle); + Result:= Result and Assigned(OvlK_Init); + Result:= Result and Assigned(OvlK_IsComplete); + Result:= Result and Assigned(OvlK_ReUse); + Result:= Result and Assigned(OvlK_Release); + Result:= Result and Assigned(OvlK_Wait); + Result:= Result and Assigned(OvlK_WaitOldest); + Result:= Result and Assigned(OvlK_WaitAndRelease); + Result:= Result and Assigned(OvlK_WaitOrCancel); + Result:= Result and Assigned(StmK_Free); + Result:= Result and Assigned(StmK_Init); + Result:= Result and Assigned(StmK_Read); + Result:= Result and Assigned(StmK_Start); + Result:= Result and Assigned(StmK_Stop); + Result:= Result and Assigned(StmK_Write); + Result:= Result and Assigned(UsbK_AbortPipe); + Result:= Result and Assigned(UsbK_ClaimInterface); + Result:= Result and Assigned(UsbK_Clone); + Result:= Result and Assigned(UsbK_ControlTransfer); + Result:= Result and Assigned(UsbK_FlushPipe); + Result:= Result and Assigned(UsbK_Free); + Result:= Result and Assigned(UsbK_GetAltInterface); + Result:= Result and Assigned(UsbK_GetAssociatedInterface); + Result:= Result and Assigned(UsbK_GetConfiguration); + Result:= Result and Assigned(UsbK_GetCurrentAlternateSetting); + Result:= Result and Assigned(UsbK_GetCurrentFrameNumber); + Result:= Result and Assigned(UsbK_GetDescriptor); + Result:= Result and Assigned(UsbK_GetOverlappedResult); + Result:= Result and Assigned(UsbK_GetPipePolicy); + Result:= Result and Assigned(UsbK_GetPowerPolicy); + Result:= Result and Assigned(UsbK_GetProperty); + Result:= Result and Assigned(UsbK_Init); + Result:= Result and Assigned(UsbK_Initialize); + Result:= Result and Assigned(UsbK_IsoReadPipe); + Result:= Result and Assigned(UsbK_IsoWritePipe); + Result:= Result and Assigned(UsbK_QueryDeviceInformation); + Result:= Result and Assigned(UsbK_QueryInterfaceSettings); + Result:= Result and Assigned(UsbK_QueryPipe); + Result:= Result and Assigned(UsbK_ReadPipe); + Result:= Result and Assigned(UsbK_ReleaseInterface); + Result:= Result and Assigned(UsbK_ResetDevice); + Result:= Result and Assigned(UsbK_ResetPipe); + Result:= Result and Assigned(UsbK_SelectInterface); + Result:= Result and Assigned(UsbK_SetAltInterface); + Result:= Result and Assigned(UsbK_SetConfiguration); + Result:= Result and Assigned(UsbK_SetCurrentAlternateSetting); + Result:= Result and Assigned(UsbK_SetPipePolicy); + Result:= Result and Assigned(UsbK_SetPowerPolicy); + Result:= Result and Assigned(UsbK_WritePipe); + Result:= Result and Assigned(WinUsb_AbortPipe); + Result:= Result and Assigned(WinUsb_ControlTransfer); + Result:= Result and Assigned(WinUsb_FlushPipe); + Result:= Result and Assigned(WinUsb_Free); + Result:= Result and Assigned(WinUsb_GetAssociatedInterface); + Result:= Result and Assigned(WinUsb_GetCurrentAlternateSetting); + Result:= Result and Assigned(WinUsb_GetDescriptor); + Result:= Result and Assigned(WinUsb_GetOverlappedResult); + Result:= Result and Assigned(WinUsb_GetPipePolicy); + Result:= Result and Assigned(WinUsb_GetPowerPolicy); + Result:= Result and Assigned(WinUsb_Initialize); + Result:= Result and Assigned(WinUsb_QueryDeviceInformation); + Result:= Result and Assigned(WinUsb_QueryInterfaceSettings); + Result:= Result and Assigned(WinUsb_QueryPipe); + Result:= Result and Assigned(WinUsb_ReadPipe); + Result:= Result and Assigned(WinUsb_ResetPipe); + Result:= Result and Assigned(WinUsb_SetCurrentAlternateSetting); + Result:= Result and Assigned(WinUsb_SetPipePolicy); + Result:= Result and Assigned(WinUsb_SetPowerPolicy); + Result:= Result and Assigned(WinUsb_WritePipe); + end + else + begin + HotK_Init:= Nil; + HotK_Free:= Nil; + HotK_FreeAll:= Nil; + IsoK_EnumPackets:= Nil; + IsoK_Free:= Nil; + IsoK_GetPacket:= Nil; + IsoK_Init:= Nil; + IsoK_ReUse:= Nil; + IsoK_SetPacket:= Nil; + IsoK_SetPackets:= Nil; + LibK_CopyDriverAPI:= Nil; + LibK_GetContext:= Nil; + LibK_GetProcAddress:= Nil; + LibK_GetVersion:= Nil; + LibK_LoadDriverAPI:= Nil; + LibK_SetCleanupCallback:= Nil; + LibK_SetContext:= Nil; + LibK_SetDefaultContext:= Nil; + LibK_GetDefaultContext:= Nil; + LstK_AttachInfo:= Nil; + LstK_Clone:= Nil; + LstK_CloneInfo:= Nil; + LstK_Count:= Nil; + LstK_Current:= Nil; + LstK_DetachInfo:= Nil; + LstK_Enumerate:= Nil; + LstK_FindByVidPid:= Nil; + LstK_Free:= Nil; + LstK_FreeInfo:= Nil; + LstK_Init:= Nil; + LstK_InitEx:= Nil; + LstK_MoveNext:= Nil; + LstK_MoveReset:= Nil; + LstK_Sync:= Nil; + OvlK_Acquire:= Nil; + OvlK_Free:= Nil; + OvlK_GetEventHandle:= Nil; + OvlK_Init:= Nil; + OvlK_IsComplete:= Nil; + OvlK_ReUse:= Nil; + OvlK_Release:= Nil; + OvlK_Wait:= Nil; + OvlK_WaitOldest:= Nil; + OvlK_WaitAndRelease:= Nil; + OvlK_WaitOrCancel:= Nil; + StmK_Free:= Nil; + StmK_Init:= Nil; + StmK_Read:= Nil; + StmK_Start:= Nil; + StmK_Stop:= Nil; + StmK_Write:= Nil; + UsbK_AbortPipe:= Nil; + UsbK_ClaimInterface:= Nil; + UsbK_Clone:= Nil; + UsbK_ControlTransfer:= Nil; + UsbK_FlushPipe:= Nil; + UsbK_Free:= Nil; + UsbK_GetAltInterface:= Nil; + UsbK_GetAssociatedInterface:= Nil; + UsbK_GetConfiguration:= Nil; + UsbK_GetCurrentAlternateSetting:= Nil; + UsbK_GetCurrentFrameNumber:= Nil; + UsbK_GetDescriptor:= Nil; + UsbK_GetOverlappedResult:= Nil; + UsbK_GetPipePolicy:= Nil; + UsbK_GetPowerPolicy:= Nil; + UsbK_GetProperty:= Nil; + UsbK_Init:= Nil; + UsbK_Initialize:= Nil; + UsbK_IsoReadPipe:= Nil; + UsbK_IsoWritePipe:= Nil; + UsbK_QueryDeviceInformation:= Nil; + UsbK_QueryInterfaceSettings:= Nil; + UsbK_QueryPipe:= Nil; + UsbK_ReadPipe:= Nil; + UsbK_ReleaseInterface:= Nil; + UsbK_ResetDevice:= Nil; + UsbK_ResetPipe:= Nil; + UsbK_SelectInterface:= Nil; + UsbK_SetAltInterface:= Nil; + UsbK_SetConfiguration:= Nil; + UsbK_SetCurrentAlternateSetting:= Nil; + UsbK_SetPipePolicy:= Nil; + UsbK_SetPowerPolicy:= Nil; + UsbK_WritePipe:= Nil; + WinUsb_AbortPipe:= Nil; + WinUsb_ControlTransfer:= Nil; + WinUsb_FlushPipe:= Nil; + WinUsb_Free:= Nil; + WinUsb_GetAssociatedInterface:= Nil; + WinUsb_GetCurrentAlternateSetting:= Nil; + WinUsb_GetDescriptor:= Nil; + WinUsb_GetOverlappedResult:= Nil; + WinUsb_GetPipePolicy:= Nil; + WinUsb_GetPowerPolicy:= Nil; + WinUsb_Initialize:= Nil; + WinUsb_QueryDeviceInformation:= Nil; + WinUsb_QueryInterfaceSettings:= Nil; + WinUsb_QueryPipe:= Nil; + WinUsb_ReadPipe:= Nil; + WinUsb_ResetPipe:= Nil; + WinUsb_SetCurrentAlternateSetting:= Nil; + WinUsb_SetPipePolicy:= Nil; + WinUsb_SetPowerPolicy:= Nil; + WinUsb_WritePipe:= Nil; + end; + {$ELSE} + Result:= True; + {$ENDIF} + end; + + procedure DoneDllImport; + begin + {$IFDEF DynamicLink} + if DllAvailable then + FreeLibrary(HLIBUSBKDll); + {$ENDIF} + end; + +initialization + + {$IFDEF DynamicLink} + DllAvailable:= InitDllImport; + {$ELSE} + // Anyway the program will not start if the DLL is not available + DllAvailable:= True; + {$ENDIF} + // Delphi will show a Breakpoint if Assert violates, if no violation is + // detected by the compiler, the linker will eliminate the calls + Assert((SizeOf(WINUSB_PIPE_INFORMATION) = 12), + 'WINUSB_PIPE_INFORMATION size violation'); + Assert((SizeOf(WINUSB_SETUP_PACKET) = 8), + 'WINUSB_SETUP_PACKET size violation'); + Assert((SizeOf(KISO_CONTEXT) = 16), 'KISO_CONTEXT size violation'); + Assert((SizeOf(KUSB_DRIVER_API) = 512), 'KUSB_DRIVER_API size violation'); + Assert((SizeOf(KSTM_CALLBACK) = 64), 'KSTM_CALLBACK size violation'); + Assert((SizeOf(KLST_PATTERN_MATCH) = 1024), + 'KLST_PATTERN_MATCH size violation'); + Assert((SizeOf(KHOT_PARAMS) = 2048), 'KHOT_PARAMS size violation'); + +finalization + + {$IFDEF DynamicLink} + DoneDllImport; + {$ENDIF} + +end. diff --git a/Old Matlab Interface/.svn/pristine/99/99db985423ee055b8fb4316d524a91bc22870f17.svn-base b/Old Matlab Interface/.svn/pristine/99/99db985423ee055b8fb4316d524a91bc22870f17.svn-base new file mode 100644 index 00000000..0ba38030 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/99/99db985423ee055b8fb4316d524a91bc22870f17.svn-base @@ -0,0 +1,210 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2011-2012 Travis Robinson +// All rights reserved. +// +// Xfer.Async +// +// Last Updated: 03.09.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +#define BMFW + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Runtime.InteropServices; +using Test.Devices; +using libusbK; +using libusbK.Examples; + +// ReSharper disable InconsistentNaming + +namespace Xfer.Async +{ + internal class Program + { + #region TODO USER: Set the test parameters for your device. + + public static AsyncTestParameters Test = new AsyncTestParameters(0x04d8, 0xfa2e, 0, 0x81, 9, null, -1, 3); + + #endregion + + private static void Main() + { + bool success; + + WINUSB_PIPE_INFORMATION pipeInfo; + UsbK usb; + USB_INTERFACE_DESCRIPTOR interfaceDescriptor; + + // Find and configure the device. + if (!Test.ConfigureDevice(out pipeInfo, out usb, out interfaceDescriptor)) return; + if (Test.TransferBufferSize == -1) + Test.TransferBufferSize = pipeInfo.MaximumPacketSize * 64; + +#if BMFW + // TODO FOR USER: Remove this block if not using benchmark firmware. + // This configures devices running benchmark firmware for streaming DeviceToHost transfers. + Console.WriteLine("Configuring for benchmark device.."); + BM_TEST_TYPE testType = ((Test.PipeId & 0x80) > 0) ? BM_TEST_TYPE.READ : BM_TEST_TYPE.WRITE; + success = Benchmark.Configure(usb, BM_COMMAND.SET_TEST, interfaceDescriptor.bInterfaceNumber, ref testType); + if (!success) + { + Console.WriteLine("Bench_Configure failed."); + } +#endif + if (!Test.ShowTestReady()) goto Done; + + /* In most cases, you should clear the pipe timeout policy before using asynchronous I/O. (INFINITE) + * This decreases overhead in the driver and generally we managed the timeout ourselves from user code. + * + * Set the PIPE_TRANSFER_TIMEOUT policy to INFINITE: + */ + int[] pipeTimeoutMS = new[] {0}; + usb.SetPipePolicy((byte) Test.PipeId, + (int) PipePolicyType.PIPE_TRANSFER_TIMEOUT, + Marshal.SizeOf(typeof (int)), + pipeTimeoutMS); + + + /* In some cases, you may want to set the RAW_IO pipe policy. This will impose more restrictions on the + * allowable transfer buffer sizes but will improve performance. (See documentation for restrictions) + * + * Set the RAW_IO policy to TRUE: + */ + int[] useRawIO = new[] {1}; + usb.SetPipePolicy((byte)Test.PipeId, + (int)PipePolicyType.RAW_IO, + Marshal.SizeOf(typeof(int)), + useRawIO); + + int totalSubmittedTransfers = 0; + int totalCompletedTransfers = 0; + + /* We need a different buffer for each MaxPendingIO slot because they will all be submitted to the driver + * (outstanding) at the same time. + */ + byte[][] transferBuffers = new byte[Test.MaxPendingIO][]; + + OvlK ovlPool = new OvlK(usb.Handle, Test.MaxPendingIO, KOVL_POOL_FLAG.NONE); + List transferBufferGCList = new List(Test.MaxPendingIO); + success = true; + + // Start transferring data synchronously; one transfer at a time until the test limit (MaxTransfersTotal) is hit. + while (success && totalCompletedTransfers < Test.MaxTransfersTotal) + { + KOVL_HANDLE ovlHandle; + int transferred; + while (success && totalSubmittedTransfers < Test.MaxTransfersTotal) + { + // Get the next KOVL_HANDLE + if (!ovlPool.Acquire(out ovlHandle)) + { + // This example expects a failure of NoMoreItems when the pool has no more handles to acquire. This is + // our indication that it is time to begin waiting for a completion. + Debug.Assert(Marshal.GetLastWin32Error() == ErrorCodes.NoMoreItems); + break; + } + + // Get the next transfer buffer + int transferBufferIndex = totalSubmittedTransfers % Test.MaxPendingIO; + if (transferBuffers[transferBufferIndex] == null) + { + /* This index has not been allocated yet. We need a different buffer for each MaxPendingIO + * slot because they will all be submitted to the driver (outstanding) at the same time. + */ + + Console.WriteLine("Allocating transfer buffer at index:{0}", transferBufferIndex); + transferBuffers[transferBufferIndex] = new byte[Test.TransferBufferSize]; + + // Transfer buffers should be pinned so the garbage collector cannot move the memory. + transferBufferGCList.Add(GCHandle.Alloc(transferBuffers[transferBufferIndex], GCHandleType.Pinned)); + } + + byte[] transferBuffer = transferBuffers[transferBufferIndex]; + + int not_used_for_async; + if ((Test.PipeId & AllKConstants.USB_ENDPOINT_DIRECTION_MASK) > 0) + { + success = usb.ReadPipe((byte) Test.PipeId, transferBuffer, transferBuffer.Length, out not_used_for_async, ovlHandle); + } + else + { + FillMyBufferForWrite(transferBuffer, out transferred); + success = usb.WritePipe((byte)Test.PipeId, transferBuffer, transferred, out not_used_for_async, ovlHandle); + } + + if (Marshal.GetLastWin32Error() == ErrorCodes.IoPending) + { + success = true; + totalSubmittedTransfers++; + Console.WriteLine("Pending #{0:0000} {1} bytes.", totalSubmittedTransfers, transferBuffer.Length); + } + else + Console.WriteLine("Pending #{0:0000} failed. ErrorCode={1:X8}h", totalSubmittedTransfers, Marshal.GetLastWin32Error()); + } + if (!success) break; + + // Wait for the oldest transfer to complete and release the ovlHandle to the pool so it can be re-acquired. + success = ovlPool.WaitOldest(out ovlHandle, 1000, KOVL_WAIT_FLAG.RELEASE_ALWAYS, out transferred); + totalCompletedTransfers++; + + if (success) + { + if ((Test.PipeId & AllKConstants.USB_ENDPOINT_DIRECTION_MASK) > 0) + { + ProcessMyBufferFromRead(transferBuffers[(totalCompletedTransfers-1) % Test.MaxPendingIO], transferred); + } + Console.WriteLine("Complete #{0:0000} {1} bytes.", totalCompletedTransfers, transferred); + } + else + Console.WriteLine("Complete #{0:0000} Wait failed. ErrorCode={1:X8}h", totalCompletedTransfers, Marshal.GetLastWin32Error()); + } + + if (!success) + Console.WriteLine("An error occured transferring data. ErrorCode: {0:X8}h", Marshal.GetLastWin32Error()); + + ovlPool.Free(); + + // Free the GC handles allocated for the transfer buffers + foreach (GCHandle gcHandle in transferBufferGCList) + gcHandle.Free(); + + Done: + usb.Free(); + } + + #region TODO USER: Use these functions to process and fill the transfer buffers + + private static void ProcessMyBufferFromRead(byte[] transferBuffer, int transferred) + { + } + + private static void FillMyBufferForWrite(byte[] transferBuffer, out int length) + { + length = transferBuffer.Length; + } + + #endregion + } +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/9a/9a889ec32d482cfe17903fdcc469511a417950b0.svn-base b/Old Matlab Interface/.svn/pristine/9a/9a889ec32d482cfe17903fdcc469511a417950b0.svn-base new file mode 100644 index 00000000..bbca8d48 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/9a/9a889ec32d482cfe17903fdcc469511a417950b0.svn-base @@ -0,0 +1,52 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {4FA292D2-945A-48B5-B040-3AF7E482AB31} + Exe + Properties + List.Devices + List.Devices + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + libusbK.cs + + + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/9b/9b08e8cee2d7f7bedff6fa2bfbe2c6df5b15e349.svn-base b/Old Matlab Interface/.svn/pristine/9b/9b08e8cee2d7f7bedff6fa2bfbe2c6df5b15e349.svn-base new file mode 100644 index 00000000..fe233674 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/9b/9b08e8cee2d7f7bedff6fa2bfbe2c6df5b15e349.svn-base @@ -0,0 +1,88 @@ +//MATLAB INCLUDES +#include +#include + +//LIBUSBK INCLUDES +#include +#include +#include +#include +#include "libusbk.h" + +#define DEBUG_SHOWCTRL 1 +#define ISO_PACKETS_TO_READ 30 +#define ISO_PACKET_SIZE 750 +#define HALFBUFFER_SIZE (ISO_PACKETS_TO_READ*ISO_PACKET_SIZE) + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + + //Vars: + //Imports + char *HANDLE_CHAR; + char *ISOCTX_CHAR; + char *OVLKHANDLE_CHAR; + char *OVLPOOL_CHAR; + char *ISOBUFFER_CHAR; + KUSB_HANDLE handle = NULL; + unsigned char pipeID = 0x83; + unsigned char *mode_ptr; + unsigned int offset; + //Internals + PKISO_CONTEXT isoCtx; + KOVL_HANDLE ovlkHandle; + KOVL_POOL_HANDLE ovlPool; + char *isoBuffer; + unsigned char success; + unsigned int transferred; + DWORD errorCode = ERROR_SUCCESS; + unsigned int n; + //Exports + char *transfer_contents; + unsigned int *error_export; + + //Initialise Data + HANDLE_CHAR = mxArrayToString(prhs[0]); + sscanf(HANDLE_CHAR, "%16x", &handle); + + ISOCTX_CHAR = mxArrayToString(prhs[1]); + sscanf(ISOCTX_CHAR, "%16x", &isoCtx); + + OVLKHANDLE_CHAR = mxArrayToString(prhs[2]); + sscanf(OVLKHANDLE_CHAR, "%16x", &ovlkHandle); + + OVLPOOL_CHAR = mxArrayToString(prhs[3]); + sscanf(OVLPOOL_CHAR, "%16x", &ovlPool); + + ISOBUFFER_CHAR = mxArrayToString(prhs[4]); + sscanf(ISOBUFFER_CHAR, "%16x", &isoBuffer); + + mode_ptr = mxGetData(prhs[5]); + offset = (*mode_ptr) * HALFBUFFER_SIZE; + + //Actual Function + success = OvlK_WaitAndRelease(ovlkHandle, 1000, &transferred); + if (!success) { + errorCode = GetLastError(); + printf("IsoReadPipe failed. ErrorCode: %08Xh\n", errorCode); + } + + IsoK_Init(&isoCtx, ISO_PACKETS_TO_READ, ISO_PACKETS_TO_READ); + IsoK_SetPackets(isoCtx, ISO_PACKET_SIZE); + OvlK_Acquire(&ovlkHandle, ovlPool); + UsbK_IsoReadPipe(handle, pipeID, (isoBuffer+offset), HALFBUFFER_SIZE, ovlkHandle, isoCtx); + + //Export Data + transfer_contents = mxMalloc(HALFBUFFER_SIZE); + for (n=0;n +#include + +//LIBUSBK INCLUDES +#include +#include +#include +#include +#include "libusbk.h" + +//MISC INCLUDES +#include +#include + +#define BUFFERSIZE 256 + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + //Internals + WINUSB_SETUP_PACKET setupPacket; + KUSB_HANDLE handle; + char *HANDLE_CHAR; + char *RequestType_CHAR; + char *Request_CHAR; + char *Value_CHAR; + char *Index_CHAR; + char *Length_CHAR; + unsigned char controlSuccess; + UINT bytesTransferred = 0; + unsigned int n; + + //To Export + unsigned char *controlBuffer; + int dims[2] = {1,BUFFERSIZE}; + unsigned char *out_ptr; + + //Actual functions: + HANDLE_CHAR = mxArrayToString(prhs[0]); + sscanf(HANDLE_CHAR, "%16x", &handle); + + RequestType_CHAR = mxArrayToString(prhs[1]); + sscanf(RequestType_CHAR, "%2x", &setupPacket.RequestType); + + Request_CHAR = mxArrayToString(prhs[2]); + sscanf(Request_CHAR, "%2x", &setupPacket.Request); + + Value_CHAR = mxArrayToString(prhs[3]); + sscanf(Value_CHAR, "%4x", &setupPacket.Value); + + Index_CHAR = mxArrayToString(prhs[4]); + sscanf(Index_CHAR, "%4x", &setupPacket.Index); + + Length_CHAR = mxArrayToString(prhs[5]); + sscanf(Length_CHAR, "%4x", &setupPacket.Length); + + mexPrintf("Value = %d\n", setupPacket.Value); + mexPrintf("Index = %d\n", setupPacket.Index); + mexPrintf("Length = %d\n", setupPacket.Length); + + controlBuffer = mxGetData(prhs[6]); + + mexPrintf("SENDING CONTROL PACKET\n"); + controlSuccess = UsbK_ControlTransfer(handle, setupPacket, controlBuffer, setupPacket.Length, &bytesTransferred, NULL); + if (controlSuccess) mexPrintf("%d BYTES TRANSFERRED", bytesTransferred); + else mexPrintf("ERROR"); + + out_ptr = mxMalloc(BUFFERSIZE); + for (n=0;n +// All rights reserved. +// +// Xfer.UsbStream +// +// Last Updated: 03.08.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +#define BMFW + +using System; +using System.Diagnostics; +using System.IO; +using System.Threading; +using Test.Devices; +using libusbK; +using libusbK.Examples; + +namespace Xfer.UsbStream +{ + internal class Program + { + #region TODO USER: Set the test parameters for your device. + + public static StmTestParameters Test = new StmTestParameters(0x04d8, 0xfa2e, 0, 0x81, 1024, null, -1, 4, 64); + + #endregion + + private static bool FormatBrokenStrings(int fixedLength, string preAdd, ref string sPartialRead, ref string sRead) + { + if (sRead.Length != fixedLength) + { + // partial read. + if (!String.IsNullOrEmpty(sPartialRead)) + { + sPartialRead += sRead; + if (sPartialRead.Length != fixedLength) + return false; + + sRead = sPartialRead; + sPartialRead = String.Empty; + } + else + { + sPartialRead = sRead; + return false; + } + } + sRead = preAdd + sRead.Substring(preAdd.Length); + return true; + } + + private static void Main() + { + bool success; + UsbK usb; + WINUSB_PIPE_INFORMATION pipeInfoRead; + USB_INTERFACE_DESCRIPTOR interfaceDescriptorRead; + + WINUSB_PIPE_INFORMATION pipeInfoWrite; + USB_INTERFACE_DESCRIPTOR interfaceDescriptorWrite; + + // Find the IN endpoint and configure the device. + Test.PipeId = Test.PipeId | AllKConstants.USB_ENDPOINT_DIRECTION_MASK; + if (!Test.ConfigureDevice(out pipeInfoRead, out usb, out interfaceDescriptorRead)) return; + + // Find the OUT endpoint. + Test.PipeId = Test.PipeId & ~AllKConstants.USB_ENDPOINT_DIRECTION_MASK; + if (!Test.FindPipeAndInterface(usb, out interfaceDescriptorWrite, out pipeInfoWrite)) return; + + Debug.Assert( + interfaceDescriptorRead.bInterfaceNumber == interfaceDescriptorWrite.bInterfaceNumber, + "This example requires the IN and OUT endpoints have the same bInterfaceNumber."); + + Debug.Assert( + pipeInfoRead.MaximumPacketSize > 0 && + pipeInfoRead.MaximumPacketSize == pipeInfoWrite.MaximumPacketSize, + "This example requires the IN and OUT endpoints have the same MaximumPacketSize."); + + // We will keep the buffer >= 1024. + // To satisfy StmK it must also be an interval of MaximumPacketSize + if (Test.TransferBufferSize == -1) + Test.TransferBufferSize = pipeInfoWrite.MaximumPacketSize * ((1024 + pipeInfoWrite.MaximumPacketSize-1) / pipeInfoWrite.MaximumPacketSize); + +#if BMFW + // TODO FOR USER: Remove this block if not using benchmark firmware. + // This configures devices running benchmark firmware for streaming DeviceToHost transfers. + Console.WriteLine("Configuring for benchmark device.."); + BM_TEST_TYPE testType = BM_TEST_TYPE.LOOP; + success = Benchmark.Configure(usb, BM_COMMAND.SET_TEST, interfaceDescriptorRead.bInterfaceNumber, ref testType); + if (!success) + { + Console.WriteLine("Bench_Configure failed."); + } +#endif + if (!Test.ShowTestReady()) goto Done; + + UsbStream stmRead = new UsbStream(usb, + pipeInfoRead.PipeId, + Test.TransferBufferSize, + Test.MaxPendingTransfers, + Test.MaxPendingIO, + true, + 1); + UsbStream stmWrite = new UsbStream(usb, + pipeInfoWrite.PipeId, + Test.TransferBufferSize, + Test.MaxPendingTransfers, + Test.MaxPendingIO, + true, + 3000); + + StreamReader stmReader = new StreamReader(stmRead); + StreamWriter stmWriter = new StreamWriter(stmWrite); + + stmRead.Start(); + stmWrite.Start(); + + Char[] chTemp = new char[Test.TransferBufferSize]; + while (stmReader.Read(chTemp, 0, chTemp.Length) > 0) + { + Console.WriteLine("Flushing packets.."); + } + string sWrite = String.Empty; + string sPartialRead = String.Empty; + string sRead; + const string lineFormat = "Tx#{0:000000} This string is being looped through endpoints {1:X2}h and {2:X2}h"; + int lineLength = String.Format(lineFormat, 0, 0, 0).Length; + + // This is a counter/timer used only for statistics gathering. + Thread.Sleep(0); + Test.Dcs.Start(); + + for (int iTransfers = 0; iTransfers < Test.MaxTransfersTotal; iTransfers++) + { + sWrite = String.Format(lineFormat, iTransfers, pipeInfoWrite.PipeId, pipeInfoRead.PipeId); + stmWriter.WriteLine(sWrite); + Console.WriteLine(sWrite); + + if ((iTransfers & 8) > 0) stmWriter.Flush(); + if (iTransfers <= 16 || (String.IsNullOrEmpty((sRead = stmReader.ReadLine())))) + continue; + + if (!FormatBrokenStrings(lineLength, "Rx", ref sPartialRead, ref sRead)) continue; + Console.WriteLine(sRead); + } + + stmWriter.Flush(); + while (!(String.IsNullOrEmpty((sRead = stmReader.ReadLine())))) + { + if (!FormatBrokenStrings(lineLength, "Rx", ref sPartialRead, ref sRead)) continue; + Console.WriteLine(sRead); + } + + Test.Dcs.Stop(); + TimeSpan ts = new TimeSpan(Test.Dcs.Ticks); + Console.WriteLine("Elapsed Time:\n\t{0} mins\n\t{1} secs\n\t{2} msecs", Math.Floor(ts.TotalMinutes), ts.Seconds, ts.Milliseconds); + + stmWriter.Dispose(); + stmReader.Dispose(); + + Done: + usb.Free(); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/a0/a020241393e5c9788f977eaf9de0b0d8d9c66ff5.svn-base b/Old Matlab Interface/.svn/pristine/a0/a020241393e5c9788f977eaf9de0b0d8d9c66ff5.svn-base new file mode 100644 index 00000000..db614fd8 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/a0/a020241393e5c9788f977eaf9de0b0d8d9c66ff5.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/a3/a3023fbcec1c59bde87572af9b5c3486e515080a.svn-base b/Old Matlab Interface/.svn/pristine/a3/a3023fbcec1c59bde87572af9b5c3486e515080a.svn-base new file mode 100644 index 00000000..0a21e192 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/a3/a3023fbcec1c59bde87572af9b5c3486e515080a.svn-base @@ -0,0 +1,9 @@ +function [res] = expected_adc(vout) + +vinp = vout/11; +vinn = 0; +vref = 1.65; +gain = 1; +top = 128; + +res = int16((vinp - vinn)/vref * gain * top); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/a3/a3c8e67f1bd40c0642728d94c5415ee8a96e5eaa.svn-base b/Old Matlab Interface/.svn/pristine/a3/a3c8e67f1bd40c0642728d94c5415ee8a96e5eaa.svn-base new file mode 100644 index 00000000..cc9f9b4c Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/a3/a3c8e67f1bd40c0642728d94c5415ee8a96e5eaa.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/a3/a3ede89335933964727b486c8f69eb99abc78601.svn-base b/Old Matlab Interface/.svn/pristine/a3/a3ede89335933964727b486c8f69eb99abc78601.svn-base new file mode 100644 index 00000000..083c5514 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/a3/a3ede89335933964727b486c8f69eb99abc78601.svn-base @@ -0,0 +1,11 @@ +if libk_error + dropped_packets = dropped_packets + 1; + if (dropped_packets > 10) + break + %resynchronise + %dropped_packets = 0; + %waveform_exists = 0; + end +else + dropped_packets = 4*dropped_packets/5; +end \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/a4/a41cc954b085ad5a93e71bdfbdb675e99e173ecd.svn-base b/Old Matlab Interface/.svn/pristine/a4/a41cc954b085ad5a93e71bdfbdb675e99e173ecd.svn-base new file mode 100644 index 00000000..ddfa3fa9 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/a4/a41cc954b085ad5a93e71bdfbdb675e99e173ecd.svn-base @@ -0,0 +1,309 @@ +/*! \file lusbk_shared.h +* \brief Types and defines shared with the driver. +*/ + +#ifndef __LUSBK_SHARED_H_ +#define __LUSBK_SHARED_H_ + +#ifndef __USB_H__ + +//! Values used in the \c bmAttributes field of a \ref USB_ENDPOINT_DESCRIPTOR +typedef enum _USBD_PIPE_TYPE +{ + //! Indicates a control endpoint + UsbdPipeTypeControl, + + //! Indicates an isochronous endpoint + UsbdPipeTypeIsochronous, + + //! Indicates a bulk endpoint + UsbdPipeTypeBulk, + + //! Indicates an interrupt endpoint + UsbdPipeTypeInterrupt, +} USBD_PIPE_TYPE; + +#endif + +#if !defined(__WINUSB_COMPAT_IO_H__) && !defined(__WUSBIO_H__) + +// pipe policy types /////////////// +#define SHORT_PACKET_TERMINATE 0x01 +#define AUTO_CLEAR_STALL 0x02 +#define PIPE_TRANSFER_TIMEOUT 0x03 +#define IGNORE_SHORT_PACKETS 0x04 +#define ALLOW_PARTIAL_READS 0x05 +#define AUTO_FLUSH 0x06 +#define RAW_IO 0x07 +#define MAXIMUM_TRANSFER_SIZE 0x08 +#define RESET_PIPE_ON_RESUME 0x09 + +// libusbK ISO pipe policy types /// +#define ISO_START_LATENCY 0x20 +#define ISO_ALWAYS_START_ASAP 0x21 +#define ISO_NUM_FIXED_PACKETS 0x22 + +// http://msdn.microsoft.com/en-us/library/windows/hardware/ff552359%28v=vs.85%29.aspx +// Settings.Parallel.NumberOfPresentedRequests +// Maximum number of transfers that can be asynchronously delivered at a +// time. Available in version 1.9 and later versions of KMDF. +#define SIMUL_PARALLEL_REQUESTS 0x30 + +// Power policy types ////////////// +#define AUTO_SUSPEND 0x81 +#define SUSPEND_DELAY 0x83 + +// Device Information types //////// +#define DEVICE_SPEED 0x01 + +// Device Speeds +#define LowSpeed 0x01 +#define FullSpeed 0x02 +#define HighSpeed 0x03 + +//! The \c WINUSB_PIPE_INFORMATION structure contains pipe information that the \ref UsbK_QueryPipe routine retrieves. +typedef struct _WINUSB_PIPE_INFORMATION +{ + //! A \c USBD_PIPE_TYPE enumeration value that specifies the pipe type + USBD_PIPE_TYPE PipeType; + + //! The pipe identifier (ID) + UCHAR PipeId; + + //! The maximum size, in bytes, of the packets that are transmitted on the pipe + USHORT MaximumPacketSize; + + //! The pipe interval + UCHAR Interval; + +} WINUSB_PIPE_INFORMATION; +//! Pointer to a \ref WINUSB_PIPE_INFORMATION structure +typedef WINUSB_PIPE_INFORMATION* PWINUSB_PIPE_INFORMATION; +C_ASSERT(sizeof(WINUSB_PIPE_INFORMATION) == 12); + +#include + +//! The \c WINUSB_SETUP_PACKET structure describes a USB setup packet. +/*! +* It is often more convient to use this structure in combination with a \ref KUSB_SETUP_PACKET. +* For example: +* \code + +* \endcode +*/ +typedef struct _WINUSB_SETUP_PACKET +{ + //! The request type. The values that are assigned to this member are defined in Table 9.2 of section 9.3 of the Universal Serial Bus (USB) specification (www.usb.org). + UCHAR RequestType; + + //! The device request. The values that are assigned to this member are defined in Table 9.3 of section 9.4 of the Universal Serial Bus (USB) specification. + UCHAR Request; + + //! The meaning of this member varies according to the request. For an explanation of this member, see the Universal Serial Bus (USB) specification. + USHORT Value; + + //! The meaning of this member varies according to the request. For an explanation of this member, see the Universal Serial Bus (USB) specification. + USHORT Index; + + //! The number of bytes to transfer. (not including the \c WINUSB_SETUP_PACKET itself) + USHORT Length; + +} WINUSB_SETUP_PACKET; +//! pointer to a \c WINUSB_SETUP_PACKET structure +typedef WINUSB_SETUP_PACKET* PWINUSB_SETUP_PACKET; +C_ASSERT(sizeof(WINUSB_SETUP_PACKET) == 8); + +#include + +#endif // __WUSBIO_H__ __WINUSB_COMPAT_IO_H__ + +#include + +/*! \addtogroup isok +* @{ +*/ + +//! Structure describing an isochronous transfer packet. +typedef struct _KISO_PACKET +{ + //! Specifies the offset, in bytes, of the buffer for this packet from the beginning of the entire isochronous transfer data buffer. + /*! + * \c Offset represents an absolute data offset from the start of the \c Buffer parameter \ref UsbK_IsoReadPipe or \ref UsbK_IsoWritePipe. + * + * \note This field is assigned by the user application only and used by the driver upon transfer submission and completion. + */ + UINT Offset; + + //! Set by the host controller to indicate the actual number of bytes received by the device for isochronous IN transfers. Length not used for isochronous OUT transfers. + /*! + * \note This field is is not user assignable and is updated by the driver upon transfer completion. + */ + USHORT Length; + + //! Contains the 16 least significant USBD status bits, on return from the host controller driver, of this transfer packet. + /*! + * See MSDN for USBD status codes: USBD status code reference + * + * \note This field is is not user assignable and is updated by the driver upon transfer completion. + */ + USHORT Status; + +} KISO_PACKET; +//! pointer to a \c KISO_PACKET structure +typedef KISO_PACKET* PKISO_PACKET; + +#pragma warning(disable:4200) + +//! Additional ISO transfer flags. +typedef enum _KISO_FLAG +{ + KISO_FLAG_NONE = 0, + + //! Do not start the transfer immediately, instead use \ref KISO_CONTEXT::StartFrame. + /*! + * By default, isochronous transfers start on the next frame and \ref KISO_CONTEXT::StartFrame is + * ignored. If this flag is specified, the transfer is postponed until the current usb frame number + * equals that specified by \ref KISO_CONTEXT::StartFrame. + * + * Under certain circumstances, the driver can specify 0 for \ref KISO_CONTEXT::StartFrame, and the bus + * driver will begin the transaction in the next available frame. + * + * Specifing \b 0 for \ref KISO_CONTEXT::StartFrame (start transfer ASAP) is restricted to the first + * transaction on a newly opened or reset pipe. Furthermore, the USB stack contains a bug in Microsoft + * Windows Server 2003 and Windows XP that limits the use of this to an isochronous context with 255 or fewer + * packets. + * + * For more information about resetting pipes, see \ref UsbK_ResetPipe. + */ + KISO_FLAG_SET_START_FRAME = 0x00000001, +} KISO_FLAG; + +//! Structure describing a user defined isochronous transfer. +/*! +* +* \fixedstruct{16} +* +* The \ref KISO_CONTEXT::StartFrame member of the \ref KISO_CONTEXT specifies the starting USB frame number +* for the transaction. The driver can use \ref UsbK_GetCurrentFrameNumber to request the current frame +* number. +* +* In full-speed transmissions, the frame number for any particular packet will be the sum of the start frame +* number and the packet index. For instance, the fourth packet in the \ref KISO_CONTEXT has an index of 3, so +* its frame number will be StartFrame + 3. In a write transfer, the port driver loads this frame with the +* buffer data at the data buffer offset specified by IsoPacket[3].Offset. +* +* When the driver processes the \ref KISO_CONTEXT, it discards all packets in the \ref KISO_CONTEXT whose +* frame numbers are lower than the current frame number. The port driver sets the Status member of the packet +* descriptor for each discarded packet to USBD_STATUS_ISO_NA_LATE_USBPORT, USBD_STATUS_ISO_NOT_ACCESSED_BY_HW +* or USBD_STATUS_ISO_NOT_ACCESSED_LATE. Even if it discards some packets, the port driver attempts to +* transmit those packets in the \ref KISO_CONTEXT whose frame numbers are higher than the current frame +* number. +* +* The check for a valid StartFrame member is slightly more complicated in high-speed transmissions because +* the port driver loads each packet into a high-speed microframe; however, the value in StartFrame refers to +* the 1 millisecond (full-speed) frame number, not the microframe. For example, if the StartFrame value +* recorded in the \ref KISO_CONTEXT is one less than the current frame, the port driver will discard as many +* as eight packets. The exact number of packets that the port driver discards depends on the period +* associated with the isochronous pipe. +* +* High-speed isochronous pipes can have periods of 1, 2, 4, or 8. The period number specifies the frequency +* with which the port driver inserts packets into the data stream. If the period is 2, for example, the port +* driver will insert a packet into the data stream every two microframes. This means that it will only use +* four of the eight microframes available within each 1-millisecond frame for isochronous data transmission. +* +* In general, the higher the period, the fewer packets the port driver will discard when a \ref KISO_CONTEXT +* arrives late. Assume the period on an isochronous pipe is 2. With a period of 2, each 1-millisecond speed +* frame will carry four packets of isochronous data for that pipe. So, for example, if CurrentFrame - +* StartFrame = 3, the port driver will discard 3 * 4 = 12 packets. On the other hand, if the period is 4, +* each 1-millisecond frame carries only two packets of isochronous data for the pipe. Therefore, if the +* \ref KISO_CONTEXT arrives three 1-millisecond frames late, as in the previous example, the port driver will +* discard 3 * 2 = 6 packets, instead of 12 packets. +* +* For all types of isochronous pipe, the distance between the current frame and the StartFrame value +* specified in the \ref KISO_CONTEXT must be less than USBD_ISO_START_FRAME_RANGE. If StartFrame is not +* within the proper range, the driver sets the Status member of the \ref KISO_PACKET +* \c USBD_STATUS_BAD_START_FRAME and discards the entire \ref KISO_CONTEXT. The following code example shows +* the precise check that the port driver does on the \ref KISO_CONTEXT start frame: +* \code +* if (abs((CurrentFrame - StartFrame)) > USBD_ISO_START_FRAME_RANGE) +* { +* // discard the KISO_CONTEXT +* } +* \endcode +* +*/ +typedef struct _KISO_CONTEXT +{ + //! Additional ISO transfer flags. See \ref KISO_FLAG. + KISO_FLAG Flags; + + //! Specifies the frame number that the transfer should begin on (0 for ASAP). + /*! + * This variable must be within a system-defined range of the current frame. The range is specified by the + * constant \ref USBD_ISO_START_FRAME_RANGE. + * + * If /ref KISO_FLAG_SET_START_FRAME was specified, this member contains the frame number that the transfer should begin on. + * When the request is returned by the host controller driver, this member is updated to reflect the frame number this transfer + * did begin on. + * + * \note This field may be assigned by the user application and is updated by the driver upon transfer + * completion. + */ + UINT StartFrame; + + //! Contains the number of packets that completed with an error condition on return from the host controller driver. + /*! + * \note This field is is not user assignable and is updated by the driver upon transfer completion. + */ + SHORT ErrorCount; + + //! Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + /* + * \note This field is assigned by the user application only and used by the driver upon transfer submission + * and completion. + */ + SHORT NumberOfPackets; + + //! Contains the URB Hdr.Status value on return from the host controller driver. + /*! + * \note This field is is not user assignable and is updated by the driver upon transfer completion. + * + * The USB bus driver always returns a value of USBD_STATUS_SUCCESS in + * Hdr.Status, unless every packet in the transfer generated an error or + * the request was not well-formed and could not be executed at all. The + * following table includes possible error codes returned in Hdr.Status: + * - USBD_STATUS_ISOCH_REQUEST_FAILED + * Indicates that every packet of an isochronous request was completed with + * errors. + * - USBD_STATUS_BAD_START_FRAME + * Indicates that the requested start frame is not within + * USBD_ISO_START_FRAME_RANGE of the current USB frame. + * - USBD_ISO_NOT_ACCESSED_LATE + * Indicates that every packet was submitted too late for the packet to be + * sent, based on the requested start frame. + * - USBD_STATUS_INVALID_PARAMETER + * Indicates that one of the URB parameters was incorrect. + */ + UINT UrbHdrStatus; + + //! Contains a variable-length array of \c KISO_PACKET structures that describe the isochronous transfer packets to be transferred on the USB bus. + /* + * \note This field is assigned by the user application, used by the driver upon transfer submission, and + * updated by the driver upon transfer completion. + */ + KISO_PACKET IsoPackets[0]; + +} KISO_CONTEXT; +C_ASSERT(sizeof(KISO_CONTEXT) == 16); + +//! pointer to a \c KISO_CONTEXT structure +typedef KISO_CONTEXT* PKISO_CONTEXT; + +/*! @} */ + +#pragma warning(default:4200) + +#include + +#endif // __LUSBK_SHARED_H_ + diff --git a/Old Matlab Interface/.svn/pristine/a4/a4d7e09e485d3552853c661f4cd30ca35a42f08d.svn-base b/Old Matlab Interface/.svn/pristine/a4/a4d7e09e485d3552853c661f4cd30ca35a42f08d.svn-base new file mode 100644 index 00000000..9409e06c --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/a4/a4d7e09e485d3552853c661f4cd30ca35a42f08d.svn-base @@ -0,0 +1,4 @@ +first_gui + +%global gui_axes +%plot(gui_axes, linspace(0,2*pi,1000), sin(linspace(0,2*pi,1000))) \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/a5/a519965b93dc0b1921febca0183228564d9eee72.svn-base b/Old Matlab Interface/.svn/pristine/a5/a519965b93dc0b1921febca0183228564d9eee72.svn-base new file mode 100644 index 00000000..80402b0e --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/a5/a519965b93dc0b1921febca0183228564d9eee72.svn-base @@ -0,0 +1,3836 @@ +#region Copyright (c) Travis Robinson + +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// C# libusbK Bindings +// Auto-generated on: 04.28.2011 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +// ReSharper disable InconsistentNaming +// ReSharper disable CheckNamespace +// ReSharper disable UnassignedReadonlyField + +namespace libusbK +{ + public static class AllKOptions + { + #region Public Members + + /// + /// Alternate libusbK library to use. This must be assigned before any libusbK functions are called and it must be the full path and file name to a libusbK.dll. + /// + public static string LIBUSBK_FULLPATH_TO_ALTERNATE_DLL; + + #endregion + } + + public static class AllKConstants + { + #region Public Members + + /// + /// Allocated length for all strings in a \ref KLST_DEVINFO structure. + /// + public const int KLST_STRING_MAX_LEN = 256; + + /// + /// libusbK library + /// + public const string LIBUSBK_DLL = "libusbK.dll"; + + /// + /// Config power mask for the \c bmAttributes field of a \ref USB_CONFIGURATION_DESCRIPTOR + /// + public const byte USB_CONFIG_POWERED_MASK = 0xC0; + + /// + /// Endpoint address mask for the \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR + /// + public const byte USB_ENDPOINT_ADDRESS_MASK = 0x0F; + + /// + /// Endpoint direction mask for the \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR + /// + public const byte USB_ENDPOINT_DIRECTION_MASK = 0x80; + + #endregion + } + + public enum PipePolicyType + { + SHORT_PACKET_TERMINATE = 0x01, + AUTO_CLEAR_STALL = 0x02, + PIPE_TRANSFER_TIMEOUT = 0x03, + IGNORE_SHORT_PACKETS = 0x04, + ALLOW_PARTIAL_READS = 0x05, + AUTO_FLUSH = 0x06, + RAW_IO = 0x07, + MAXIMUM_TRANSFER_SIZE = 0x08, + RESET_PIPE_ON_RESUME = 0x09, + + ISO_START_LATENCY = 0x20, + ISO_ALWAYS_START_ASAP = 0x21, + ISO_NUM_FIXED_PACKETS = 0x22, + + SIMUL_PARALLEL_REQUESTS = 0x30, + } + + public enum PowerPolicyType + { + AUTO_SUSPEND = 0x81, + SUSPEND_DELAY = 0x83, + } + + public enum DeviceInformationType + { + DEVICE_SPEED = 0x01, + } + + public enum EndpointType + { + /// + /// Indicates a control endpoint + /// + CONTROL = 0x00, + + /// + /// Indicates an isochronous endpoint + /// + ISOCHRONOUS = 0x01, + + /// + /// Indicates a bulk endpoint + /// + BULK = 0x02, + + /// + /// Indicates an interrupt endpoint + /// + INTERRUPT = 0x03, + + /// + /// Endpoint type mask for the \c bmAttributes field of a \ref USB_ENDPOINT_DESCRIPTOR + /// + MASK = 0x03, + } + + public static class ErrorCodes + { + #region Public Members + + /// + /// Access is denied. + /// + public const int AccessDenied = 5; + + /// + /// The requested resource is in use. + /// + public const int Busy = 170; + + /// + /// The operation was canceled by the user. + /// + public const int Cancelled = 1223; + + /// + /// The library, drive, or media pool is empty. + /// + public const int Empty = 4306; + + /// + /// The handle is invalid. + /// + public const int InvalidHandle = 6; + + /// + /// The parameter is incorrect. + /// + public const int InvalidParameter = 87; + + /// + /// Overlapped I/O event is not in a signaled state. + /// + public const int IoIncomplete = 996; + + /// + /// Overlapped I/O operation is in progress. + /// + public const int IoPending = 997; + + /// + /// More data is available. + /// + public const int MoreData = 234; + + /// + /// No more data is available. + /// + public const int NoMoreItems = 259; + + /// + /// Not enough storage is available to process this command. + /// + public const int NotEnoughMemory = 8; + + /// + /// Element not found. + /// + public const int NotFound = 1168; + + /// + /// The request is not supported. + /// + public const int NotSupported = 50; + + /// + /// The I/O operation has been aborted because of either a thread exit or an application request. + /// + public const int OperationAborted = 995; + + /// + /// The cluster resource is not available. + /// + public const int ResourceNotAvailable = 5006; + + /// + /// The cluster resource could not be found. + /// + public const int ResourceNotFound = 5007; + + /// + /// The semaphore timeout period has expired. + /// + public const int SemTimeout = 121; + + /// + /// The operation completed successfully. + /// + public const int Success = 0; + + /// + /// An attempt was made to operate on a thread within a specific process, but the thread specified is not in the process specified. + /// + public const int ThreadNotInProcess = 566; + + /// + /// A thread termination occurred while the thread was suspended. The thread was resumed, and termination proceeded. + /// + public const int ThreadWasSuspended = 699; + + /// + /// Too many dynamic-link modules are attached to this program or dynamic-link module. + /// + public const int TooManyModules = 214; + + #endregion + } + + public interface IKLIB_HANDLE + { + #region Public Members + + IntPtr GetContext(); + KLIB_HANDLE_TYPE HandleType { get; } + IntPtr Pointer { get; } + bool SetCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback); + bool SetContext(IntPtr UserContext); + + #endregion + } + + #region Opaque library handles + + public struct KLST_HANDLE : IKLIB_HANDLE + { + #region IKLIB_HANDLE Members + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + public KLIB_HANDLE_TYPE HandleType + { + get + { + return KLIB_HANDLE_TYPE.LSTK; + } + } + + public IntPtr GetContext() + { + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType); + } + + public bool SetContext(IntPtr UserContext) + { + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext); + } + + public bool SetCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback) + { + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback); + } + + #endregion + + #region Public Members + + public KLST_HANDLE(IntPtr Handle) + { + mHandlePtr = Handle; + } + + #endregion + + #region Private Members + + private readonly IntPtr mHandlePtr; + + #endregion + } + + public struct KHOT_HANDLE : IKLIB_HANDLE + { + #region IKLIB_HANDLE Members + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + public KLIB_HANDLE_TYPE HandleType + { + get + { + return KLIB_HANDLE_TYPE.HOTK; + } + } + + public IntPtr GetContext() + { + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType); + } + + public bool SetContext(IntPtr UserContext) + { + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext); + } + + public bool SetCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback) + { + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback); + } + + #endregion + + #region Public Members + + public KHOT_HANDLE(IntPtr Handle) + { + mHandlePtr = Handle; + } + + #endregion + + #region Private Members + + private readonly IntPtr mHandlePtr; + + #endregion + } + + public struct KUSB_HANDLE : IKLIB_HANDLE + { + #region IKLIB_HANDLE Members + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + public KLIB_HANDLE_TYPE HandleType + { + get + { + return KLIB_HANDLE_TYPE.USBK; + } + } + + public IntPtr GetContext() + { + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType); + } + + public bool SetContext(IntPtr UserContext) + { + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext); + } + + public bool SetCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback) + { + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback); + } + + #endregion + + #region USB Shared Device Context + + public IntPtr GetSharedContext() + { + return AllKFunctions.LibK_GetContext(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK); + } + + public bool SetSharedCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback) + { + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK, CleanupCallback); + } + + public bool SetSharedContext(IntPtr UserContext) + { + return AllKFunctions.LibK_SetContext(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK, UserContext); + } + + #endregion + + #region Public Members + + public KUSB_HANDLE(IntPtr Handle) + { + mHandlePtr = Handle; + } + + #endregion + + #region Private Members + + private readonly IntPtr mHandlePtr; + + #endregion + } + + public struct KOVL_POOL_HANDLE : IKLIB_HANDLE + { + #region IKLIB_HANDLE Members + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + public KLIB_HANDLE_TYPE HandleType + { + get + { + return KLIB_HANDLE_TYPE.OVLPOOLK; + } + } + + public IntPtr GetContext() + { + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType); + } + + public bool SetContext(IntPtr UserContext) + { + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext); + } + + public bool SetCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback) + { + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback); + } + + #endregion + + #region Public Members + + public KOVL_POOL_HANDLE(IntPtr Handle) + { + mHandlePtr = Handle; + } + + #endregion + + #region Private Members + + private readonly IntPtr mHandlePtr; + + #endregion + } + + public struct KOVL_HANDLE : IKLIB_HANDLE + { + #region IKLIB_HANDLE Members + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + public KLIB_HANDLE_TYPE HandleType + { + get + { + return KLIB_HANDLE_TYPE.OVLK; + } + } + + public IntPtr GetContext() + { + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType); + } + + public bool SetContext(IntPtr UserContext) + { + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext); + } + + public bool SetCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback) + { + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback); + } + + #endregion + + #region Public Members + + public KOVL_HANDLE(IntPtr Handle) + { + mHandlePtr = Handle; + } + + #endregion + + #region Private Members + + private readonly IntPtr mHandlePtr; + + #endregion + } + + public struct KSTM_HANDLE : IKLIB_HANDLE + { + #region IKLIB_HANDLE Members + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + public KLIB_HANDLE_TYPE HandleType + { + get + { + return KLIB_HANDLE_TYPE.STMK; + } + } + + public IntPtr GetContext() + { + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType); + } + + public bool SetContext(IntPtr UserContext) + { + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext); + } + + public bool SetCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback) + { + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback); + } + + #endregion + + #region Public Members + + public KSTM_HANDLE(IntPtr Handle) + { + mHandlePtr = Handle; + } + + #endregion + + #region Private Members + + private readonly IntPtr mHandlePtr; + + #endregion + } + + #endregion + + #region Internal Function Imports + + internal static class AllKFunctions + { + #region Delegates + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate void HotK_FreeAllDelegate(); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool HotK_FreeDelegate([In] KHOT_HANDLE Handle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool HotK_InitDelegate([Out] out KHOT_HANDLE Handle, [In, Out] ref KHOT_PARAMS InitParams); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool IsoK_EnumPacketsDelegate([In] KISO_CONTEXT IsoContext, KISO_ENUM_PACKETS_CB EnumPackets, int StartPacketIndex, IntPtr UserState); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool IsoK_FreeDelegate([In] KISO_CONTEXT IsoContext); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool IsoK_GetPacketDelegate([In] KISO_CONTEXT IsoContext, int PacketIndex, [Out] out KISO_PACKET IsoPacket); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool IsoK_InitDelegate([Out] out KISO_CONTEXT IsoContext, int NumberOfPackets, int StartFrame); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool IsoK_ReUseDelegate([In] KISO_CONTEXT IsoContext); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool IsoK_SetPacketDelegate([In] KISO_CONTEXT IsoContext, int PacketIndex, [In] ref KISO_PACKET IsoPacket); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool IsoK_SetPacketsDelegate([In] KISO_CONTEXT IsoContext, int PacketSize); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate void LibK_Context_FreeDelegate(); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LibK_Context_InitDelegate(IntPtr Heap, IntPtr Reserved); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LibK_CopyDriverAPIDelegate([Out] out KUSB_DRIVER_API DriverAPI, [In] KUSB_HANDLE UsbHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate IntPtr LibK_GetContextDelegate([In] IntPtr Handle, KLIB_HANDLE_TYPE HandleType); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate IntPtr LibK_GetDefaultContextDelegate(KLIB_HANDLE_TYPE HandleType); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LibK_GetProcAddressDelegate(IntPtr ProcAddress, int DriverID, int FunctionID); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate void LibK_GetVersionDelegate([Out] out KLIB_VERSION Version); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LibK_LoadDriverAPIDelegate([Out] out KUSB_DRIVER_API DriverAPI, int DriverID); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LibK_SetCleanupCallbackDelegate([In] IntPtr Handle, KLIB_HANDLE_TYPE HandleType, KLIB_HANDLE_CLEANUP_CB CleanupCB); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LibK_SetContextDelegate([In] IntPtr Handle, KLIB_HANDLE_TYPE HandleType, IntPtr ContextValue); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LibK_SetDefaultContextDelegate(KLIB_HANDLE_TYPE HandleType, IntPtr ContextValue); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LstK_CountDelegate([In] KLST_HANDLE DeviceList, ref int Count); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LstK_CurrentDelegate([In] KLST_HANDLE DeviceList, [Out] out KLST_DEVINFO_HANDLE DeviceInfo); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LstK_EnumerateDelegate([In] KLST_HANDLE DeviceList, KLST_ENUM_DEVINFO_CB EnumDevListCB, IntPtr Context); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LstK_FindByVidPidDelegate([In] KLST_HANDLE DeviceList, int Vid, int Pid, [Out] out KLST_DEVINFO_HANDLE DeviceInfo); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LstK_FreeDelegate([In] KLST_HANDLE DeviceList); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LstK_InitDelegate([Out] out KLST_HANDLE DeviceList, KLST_FLAG Flags); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LstK_InitExDelegate([Out] out KLST_HANDLE DeviceList, KLST_FLAG Flags, [In] ref KLST_PATTERN_MATCH PatternMatch); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LstK_MoveNextDelegate([In] KLST_HANDLE DeviceList, [Out] out KLST_DEVINFO_HANDLE DeviceInfo); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate void LstK_MoveResetDelegate([In] KLST_HANDLE DeviceList); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_AcquireDelegate([Out] out KOVL_HANDLE OverlappedK, [In] KOVL_POOL_HANDLE PoolHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_FreeDelegate([In] KOVL_POOL_HANDLE PoolHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate IntPtr OvlK_GetEventHandleDelegate([In] KOVL_HANDLE OverlappedK); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_InitDelegate([Out] out KOVL_POOL_HANDLE PoolHandle, [In] KUSB_HANDLE UsbHandle, int MaxOverlappedCount, KOVL_POOL_FLAG Flags); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_IsCompleteDelegate([In] KOVL_HANDLE OverlappedK); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_ReUseDelegate([In] KOVL_HANDLE OverlappedK); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_ReleaseDelegate([In] KOVL_HANDLE OverlappedK); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_WaitAndReleaseDelegate([In] KOVL_HANDLE OverlappedK, int TimeoutMS, out int TransferredLength); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_WaitDelegate([In] KOVL_HANDLE OverlappedK, int TimeoutMS, KOVL_WAIT_FLAG WaitFlags, out int TransferredLength); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_WaitOldestDelegate([In] KOVL_POOL_HANDLE PoolHandle, [Out] out KOVL_HANDLE OverlappedK, int TimeoutMS, KOVL_WAIT_FLAG WaitFlags, out int TransferredLength); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_WaitOrCancelDelegate([In] KOVL_HANDLE OverlappedK, int TimeoutMS, out int TransferredLength); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool StmK_FreeDelegate([In] KSTM_HANDLE StreamHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool StmK_InitDelegate( + [Out] out KSTM_HANDLE StreamHandle, [In] KUSB_HANDLE UsbHandle, byte PipeID, int MaxTransferSize, int MaxPendingTransfers, int MaxPendingIO, [In] ref KSTM_CALLBACK Callbacks, KSTM_FLAG Flags); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool StmK_ReadDelegate([In] KSTM_HANDLE StreamHandle, IntPtr Buffer, int Offset, int Length, out int TransferredLength); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool StmK_StartDelegate([In] KSTM_HANDLE StreamHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool StmK_StopDelegate([In] KSTM_HANDLE StreamHandle, int TimeoutCancelMS); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool StmK_WriteDelegate([In] KSTM_HANDLE StreamHandle, IntPtr Buffer, int Offset, int Length, out int TransferredLength); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool UsbK_FreeDelegate([In] KUSB_HANDLE InterfaceHandle); + + #endregion + + static AllKFunctions() + { + if (String.IsNullOrEmpty(AllKOptions.LIBUSBK_FULLPATH_TO_ALTERNATE_DLL)) + mModuleLibusbK = LoadLibraryEx(AllKConstants.LIBUSBK_DLL, IntPtr.Zero, LoadLibraryFlags.NONE); + else + mModuleLibusbK = LoadLibraryEx(AllKOptions.LIBUSBK_FULLPATH_TO_ALTERNATE_DLL, IntPtr.Zero, LoadLibraryFlags.LOAD_WITH_ALTERED_SEARCH_PATH); + + if (mModuleLibusbK == IntPtr.Zero) + throw new DllNotFoundException("libusbK.dll not found. Please install drivers/applications and retry."); + + LoadDynamicFunctions(); + } + + #region Nested Enumerations + + [Flags] + private enum LoadLibraryFlags + { + NONE = 0, + DONT_RESOLVE_DLL_REFERENCES = 0x00000001, + LOAD_IGNORE_CODE_AUTHZ_LEVEL = 0x00000010, + LOAD_LIBRARY_AS_DATAFILE = 0x00000002, + LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 0x00000040, + LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x00000020, + LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008 + } + + #endregion + + #region Public Members + + public static HotK_FreeDelegate HotK_Free; + public static HotK_FreeAllDelegate HotK_FreeAll; + public static HotK_InitDelegate HotK_Init; + public static IsoK_EnumPacketsDelegate IsoK_EnumPackets; + public static IsoK_FreeDelegate IsoK_Free; + public static IsoK_GetPacketDelegate IsoK_GetPacket; + public static IsoK_InitDelegate IsoK_Init; + public static IsoK_ReUseDelegate IsoK_ReUse; + public static IsoK_SetPacketDelegate IsoK_SetPacket; + public static IsoK_SetPacketsDelegate IsoK_SetPackets; + public static LibK_Context_FreeDelegate LibK_Context_Free; + public static LibK_Context_InitDelegate LibK_Context_Init; + + public static LibK_CopyDriverAPIDelegate LibK_CopyDriverAPI; + public static LibK_GetContextDelegate LibK_GetContext; + public static LibK_GetDefaultContextDelegate LibK_GetDefaultContext; + public static LibK_GetProcAddressDelegate LibK_GetProcAddress; + public static LibK_GetVersionDelegate LibK_GetVersion; + public static LibK_LoadDriverAPIDelegate LibK_LoadDriverAPI; + public static LibK_SetCleanupCallbackDelegate LibK_SetCleanupCallback; + public static LibK_SetContextDelegate LibK_SetContext; + public static LibK_SetDefaultContextDelegate LibK_SetDefaultContext; + public static LstK_CountDelegate LstK_Count; + public static LstK_CurrentDelegate LstK_Current; + public static LstK_EnumerateDelegate LstK_Enumerate; + public static LstK_FindByVidPidDelegate LstK_FindByVidPid; + public static LstK_FreeDelegate LstK_Free; + public static LstK_InitDelegate LstK_Init; + public static LstK_InitExDelegate LstK_InitEx; + public static LstK_MoveNextDelegate LstK_MoveNext; + public static LstK_MoveResetDelegate LstK_MoveReset; + public static OvlK_AcquireDelegate OvlK_Acquire; + public static OvlK_FreeDelegate OvlK_Free; + public static OvlK_GetEventHandleDelegate OvlK_GetEventHandle; + public static OvlK_InitDelegate OvlK_Init; + public static OvlK_IsCompleteDelegate OvlK_IsComplete; + public static OvlK_ReUseDelegate OvlK_ReUse; + public static OvlK_ReleaseDelegate OvlK_Release; + public static OvlK_WaitDelegate OvlK_Wait; + public static OvlK_WaitAndReleaseDelegate OvlK_WaitAndRelease; + public static OvlK_WaitOldestDelegate OvlK_WaitOldest; + public static OvlK_WaitOrCancelDelegate OvlK_WaitOrCancel; + public static StmK_FreeDelegate StmK_Free; + public static StmK_InitDelegate StmK_Init; + public static StmK_ReadDelegate StmK_Read; + public static StmK_StartDelegate StmK_Start; + public static StmK_StopDelegate StmK_Stop; + public static StmK_WriteDelegate StmK_Write; + public static UsbK_FreeDelegate UsbK_Free; + + #endregion + + #region Private Members + + [DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)] + private static extern IntPtr GetProcAddress(IntPtr hModule, string procName); + + private static void LoadDynamicFunctions() + { + LibK_GetVersion = (LibK_GetVersionDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_GetVersion"), typeof (LibK_GetVersionDelegate)); + LibK_GetContext = (LibK_GetContextDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_GetContext"), typeof (LibK_GetContextDelegate)); + LibK_SetContext = (LibK_SetContextDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_SetContext"), typeof (LibK_SetContextDelegate)); + LibK_SetCleanupCallback = (LibK_SetCleanupCallbackDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_SetCleanupCallback"), typeof (LibK_SetCleanupCallbackDelegate)); + LibK_LoadDriverAPI = (LibK_LoadDriverAPIDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_LoadDriverAPI"), typeof (LibK_LoadDriverAPIDelegate)); + LibK_CopyDriverAPI = (LibK_CopyDriverAPIDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_CopyDriverAPI"), typeof (LibK_CopyDriverAPIDelegate)); + LibK_GetProcAddress = (LibK_GetProcAddressDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_GetProcAddress"), typeof (LibK_GetProcAddressDelegate)); + LibK_SetDefaultContext = (LibK_SetDefaultContextDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_SetDefaultContext"), typeof (LibK_SetDefaultContextDelegate)); + LibK_GetDefaultContext = (LibK_GetDefaultContextDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_GetDefaultContext"), typeof (LibK_GetDefaultContextDelegate)); + LibK_Context_Init = (LibK_Context_InitDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_Context_Init"), typeof (LibK_Context_InitDelegate)); + LibK_Context_Free = (LibK_Context_FreeDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_Context_Free"), typeof (LibK_Context_FreeDelegate)); + UsbK_Free = (UsbK_FreeDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "UsbK_Free"), typeof (UsbK_FreeDelegate)); + LstK_Init = (LstK_InitDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Init"), typeof (LstK_InitDelegate)); + LstK_InitEx = (LstK_InitExDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_InitEx"), typeof (LstK_InitExDelegate)); + LstK_Free = (LstK_FreeDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Free"), typeof (LstK_FreeDelegate)); + LstK_Enumerate = (LstK_EnumerateDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Enumerate"), typeof (LstK_EnumerateDelegate)); + LstK_Current = (LstK_CurrentDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Current"), typeof (LstK_CurrentDelegate)); + LstK_MoveNext = (LstK_MoveNextDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_MoveNext"), typeof (LstK_MoveNextDelegate)); + LstK_MoveReset = (LstK_MoveResetDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_MoveReset"), typeof (LstK_MoveResetDelegate)); + LstK_FindByVidPid = (LstK_FindByVidPidDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_FindByVidPid"), typeof (LstK_FindByVidPidDelegate)); + LstK_Count = (LstK_CountDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Count"), typeof (LstK_CountDelegate)); + HotK_Init = (HotK_InitDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "HotK_Init"), typeof (HotK_InitDelegate)); + HotK_Free = (HotK_FreeDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "HotK_Free"), typeof (HotK_FreeDelegate)); + HotK_FreeAll = (HotK_FreeAllDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "HotK_FreeAll"), typeof (HotK_FreeAllDelegate)); + OvlK_Acquire = (OvlK_AcquireDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Acquire"), typeof (OvlK_AcquireDelegate)); + OvlK_Release = (OvlK_ReleaseDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Release"), typeof (OvlK_ReleaseDelegate)); + OvlK_Init = (OvlK_InitDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Init"), typeof (OvlK_InitDelegate)); + OvlK_Free = (OvlK_FreeDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Free"), typeof (OvlK_FreeDelegate)); + OvlK_GetEventHandle = (OvlK_GetEventHandleDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_GetEventHandle"), typeof (OvlK_GetEventHandleDelegate)); + OvlK_Wait = (OvlK_WaitDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Wait"), typeof (OvlK_WaitDelegate)); + OvlK_WaitOldest = (OvlK_WaitOldestDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_WaitOldest"), typeof (OvlK_WaitOldestDelegate)); + OvlK_WaitOrCancel = (OvlK_WaitOrCancelDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_WaitOrCancel"), typeof (OvlK_WaitOrCancelDelegate)); + OvlK_WaitAndRelease = (OvlK_WaitAndReleaseDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_WaitAndRelease"), typeof (OvlK_WaitAndReleaseDelegate)); + OvlK_IsComplete = (OvlK_IsCompleteDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_IsComplete"), typeof (OvlK_IsCompleteDelegate)); + OvlK_ReUse = (OvlK_ReUseDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_ReUse"), typeof (OvlK_ReUseDelegate)); + StmK_Init = (StmK_InitDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Init"), typeof (StmK_InitDelegate)); + StmK_Free = (StmK_FreeDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Free"), typeof (StmK_FreeDelegate)); + StmK_Start = (StmK_StartDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Start"), typeof (StmK_StartDelegate)); + StmK_Stop = (StmK_StopDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Stop"), typeof (StmK_StopDelegate)); + StmK_Read = (StmK_ReadDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Read"), typeof (StmK_ReadDelegate)); + StmK_Write = (StmK_WriteDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Write"), typeof (StmK_WriteDelegate)); + IsoK_Init = (IsoK_InitDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_Init"), typeof (IsoK_InitDelegate)); + IsoK_Free = (IsoK_FreeDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_Free"), typeof (IsoK_FreeDelegate)); + IsoK_SetPackets = (IsoK_SetPacketsDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_SetPackets"), typeof (IsoK_SetPacketsDelegate)); + IsoK_SetPacket = (IsoK_SetPacketDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_SetPacket"), typeof (IsoK_SetPacketDelegate)); + IsoK_GetPacket = (IsoK_GetPacketDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_GetPacket"), typeof (IsoK_GetPacketDelegate)); + IsoK_EnumPackets = (IsoK_EnumPacketsDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_EnumPackets"), typeof (IsoK_EnumPacketsDelegate)); + IsoK_ReUse = (IsoK_ReUseDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_ReUse"), typeof (IsoK_ReUseDelegate)); + } + + [DllImport("kernel32.dll")] + private static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hReservedNull, LoadLibraryFlags dwFlags); + + private static readonly IntPtr mModuleLibusbK = IntPtr.Zero; + + #endregion + } + + #endregion + + #region Enumerations + + /// Values used in the \c bmAttributes field of a \ref USB_ENDPOINT_DESCRIPTOR + public enum USBD_PIPE_TYPE + { + /// Indicates a control endpoint + UsbdPipeTypeControl, + + /// Indicates an isochronous endpoint + UsbdPipeTypeIsochronous, + + /// Indicates a bulk endpoint + UsbdPipeTypeBulk, + + /// Indicates an interrupt endpoint + UsbdPipeTypeInterrupt, + } + + /// Additional ISO transfer flags. + [Flags] + public enum KISO_FLAG + { + NONE = 0, + + /// Do not start the transfer immediately, instead use \ref KISO_CONTEXT::StartFrame. + SET_START_FRAME = 0x00000001, + } + + /// Handle type enumeration. + public enum KLIB_HANDLE_TYPE + { + /// Hot plug handle. \ref KHOT_HANDLE + HOTK, + + /// USB handle. \ref KUSB_HANDLE + USBK, + + /// Shared USB handle. \ref KUSB_HANDLE + USBSHAREDK, + + /// Device list handle. \ref KLST_HANDLE + LSTK, + + /// Device info handle. \ref KLST_DEVINFO_HANDLE + LSTINFOK, + + /// Overlapped handle. \ref KOVL_HANDLE + OVLK, + + /// Overlapped pool handle. \ref KOVL_POOL_HANDLE + OVLPOOLK, + + /// Pipe stream handle. \ref KSTM_HANDLE + STMK, + + /// Max handle type count. + COUNT + } + + /// Device list sync flags. + [Flags] + public enum KLST_SYNC_FLAG + { + /// Cleared/invalid state. + NONE = 0, + + /// Unchanged state, + UNCHANGED = 0x0001, + + /// Added (Arrival) state, + ADDED = 0x0002, + + /// Removed (Unplugged) state, + REMOVED = 0x0004, + + /// Connect changed state. + CONNECT_CHANGE = 0x0008, + + /// All states. + MASK = 0x000F, + } + + /// Device list initialization flags. + [Flags] + public enum KLST_FLAG + { + /// No flags (or 0) + NONE = 0, + + /// Enable listings for the raw device interface GUID \b only. {A5DCBF10-6530-11D2-901F-00C04FB951ED} + INCLUDE_RAWGUID = 0x0001, + + /// List all libusbK devices including those not currently connected. + INCLUDE_DISCONNECT = 0x0002, + } + + /// bmRequest.Dir + public enum BMREQUEST_DIR + { + HOST_TO_DEVICE = 0, + DEVICE_TO_HOST = 1, + } + + /// bmRequest.Type + public enum BMREQUEST_TYPE + { + /// Standard request. See \ref USB_REQUEST_ENUM + STANDARD = 0, + + /// Class-specific request. + CLASS = 1, + + /// Vendor-specific request + VENDOR = 2, + } + + /// bmRequest.Recipient + public enum BMREQUEST_RECIPIENT + { + /// Request is for a device. + DEVICE = 0, + + /// Request is for an interface of a device. + INTERFACE = 1, + + /// Request is for an endpoint of a device. + ENDPOINT = 2, + + /// Request is for a vendor-specific purpose. + OTHER = 3, + } + + /// Values for the bits returned by the \ref USB_REQUEST_GET_STATUS request. + public enum USB_GETSTATUS + { + /// Device is self powered + SELF_POWERED = 0x01, + + /// Device can wake the system from a low power/sleeping state. + REMOTE_WAKEUP_ENABLED = 0x02 + } + + /// Standard USB descriptor types. For more information, see section 9-5 of the USB 3.0 specifications. + public enum USB_DESCRIPTOR_TYPE + { + /// Device descriptor type. + DEVICE = 0x01, + + /// Configuration descriptor type. + CONFIGURATION = 0x02, + + /// String descriptor type. + STRING = 0x03, + + /// Interface descriptor type. + INTERFACE = 0x04, + + /// Endpoint descriptor type. + ENDPOINT = 0x05, + + /// Device qualifier descriptor type. + DEVICE_QUALIFIER = 0x06, + + /// Config power descriptor type. + CONFIG_POWER = 0x07, + + /// Interface power descriptor type. + INTERFACE_POWER = 0x08, + + /// Interface association descriptor type. + INTERFACE_ASSOCIATION = 0x0B, + } + + /// Usb handle specific properties that can be retrieved with \ref UsbK_GetProperty. + public enum KUSB_PROPERTY + { + /// Get the internal device file handle used for operations such as GetOverlappedResult or DeviceIoControl. + DEVICE_FILE_HANDLE, + + COUNT + } + + /// Supported driver id enumeration. + public enum KUSB_DRVID + { + /// libusbK.sys driver ID + LIBUSBK, + + /// libusb0.sys driver ID + LIBUSB0, + + /// WinUSB.sys driver ID + WINUSB, + + /// libusb0.sys filter driver ID + LIBUSB0_FILTER, + + /// Supported driver count + COUNT + } + + /// Supported function id enumeration. + public enum KUSB_FNID + { + /// \ref UsbK_Init dynamic driver function id. + Init, + + /// \ref UsbK_Free dynamic driver function id. + Free, + + /// \ref UsbK_ClaimInterface dynamic driver function id. + ClaimInterface, + + /// \ref UsbK_ReleaseInterface dynamic driver function id. + ReleaseInterface, + + /// \ref UsbK_SetAltInterface dynamic driver function id. + SetAltInterface, + + /// \ref UsbK_GetAltInterface dynamic driver function id. + GetAltInterface, + + /// \ref UsbK_GetDescriptor dynamic driver function id. + GetDescriptor, + + /// \ref UsbK_ControlTransfer dynamic driver function id. + ControlTransfer, + + /// \ref UsbK_SetPowerPolicy dynamic driver function id. + SetPowerPolicy, + + /// \ref UsbK_GetPowerPolicy dynamic driver function id. + GetPowerPolicy, + + /// \ref UsbK_SetConfiguration dynamic driver function id. + SetConfiguration, + + /// \ref UsbK_GetConfiguration dynamic driver function id. + GetConfiguration, + + /// \ref UsbK_ResetDevice dynamic driver function id. + ResetDevice, + + /// \ref UsbK_Initialize dynamic driver function id. + Initialize, + + /// \ref UsbK_SelectInterface dynamic driver function id. + SelectInterface, + + /// \ref UsbK_GetAssociatedInterface dynamic driver function id. + GetAssociatedInterface, + + /// \ref UsbK_Clone dynamic driver function id. + Clone, + + /// \ref UsbK_QueryInterfaceSettings dynamic driver function id. + QueryInterfaceSettings, + + /// \ref UsbK_QueryDeviceInformation dynamic driver function id. + QueryDeviceInformation, + + /// \ref UsbK_SetCurrentAlternateSetting dynamic driver function id. + SetCurrentAlternateSetting, + + /// \ref UsbK_GetCurrentAlternateSetting dynamic driver function id. + GetCurrentAlternateSetting, + + /// \ref UsbK_QueryPipe dynamic driver function id. + QueryPipe, + + /// \ref UsbK_SetPipePolicy dynamic driver function id. + SetPipePolicy, + + /// \ref UsbK_GetPipePolicy dynamic driver function id. + GetPipePolicy, + + /// \ref UsbK_ReadPipe dynamic driver function id. + ReadPipe, + + /// \ref UsbK_WritePipe dynamic driver function id. + WritePipe, + + /// \ref UsbK_ResetPipe dynamic driver function id. + ResetPipe, + + /// \ref UsbK_AbortPipe dynamic driver function id. + AbortPipe, + + /// \ref UsbK_FlushPipe dynamic driver function id. + FlushPipe, + + /// \ref UsbK_IsoReadPipe dynamic driver function id. + IsoReadPipe, + + /// \ref UsbK_IsoWritePipe dynamic driver function id. + IsoWritePipe, + + /// \ref UsbK_GetCurrentFrameNumber dynamic driver function id. + GetCurrentFrameNumber, + + /// \ref UsbK_GetOverlappedResult dynamic driver function id. + GetOverlappedResult, + + /// \ref UsbK_GetProperty dynamic driver function id. + GetProperty, + + + /// Supported function count + COUNT, + } + + /// Hot plug config flags. + [Flags] + public enum KHOT_FLAG + { + /// No flags (or 0) + NONE, + + /// Notify all devices which match upon a succuessful call to \ref HotK_Init. + PLUG_ALL_ON_INIT = 0x0001, + + /// Allow other \ref KHOT_HANDLE instances to consume this match. + PASS_DUPE_INSTANCE = 0x0002, + + /// If a \c UserHwnd is specified, use \c PostMessage instead of \c SendMessage. + POST_USER_MESSAGE = 0x0004, + } + + /// \c WaitFlags used by \ref OvlK_Wait. + [Flags] + public enum KOVL_WAIT_FLAG + { + /// Do not perform any additional actions upon exiting \ref OvlK_Wait. + NONE = 0, + + /// If the i/o operation completes successfully, release the OverlappedK back to it's pool. + RELEASE_ON_SUCCESS = 0x0001, + + /// If the i/o operation fails, release the OverlappedK back to it's pool. + RELEASE_ON_FAIL = 0x0002, + + /// If the i/o operation fails or completes successfully, release the OverlappedK back to its pool. Perform no actions if it times-out. + RELEASE_ON_SUCCESS_FAIL = 0x0003, + + /// If the i/o operation times-out cancel it, but do not release the OverlappedK back to its pool. + CANCEL_ON_TIMEOUT = 0x0004, + + /// If the i/o operation times-out, cancel it and release the OverlappedK back to its pool. + RELEASE_ON_TIMEOUT = 0x000C, + + /// Always release the OverlappedK back to its pool. If the operation timed-out, cancel it before releasing back to its pool. + RELEASE_ALWAYS = 0x000F, + + /// Uses alterable wait functions. See http://msdn.microsoft.com/en-us/library/windows/desktop/ms687036%28v=vs.85%29.aspx + ALERTABLE = 0x0010, + } + + /// \c Overlapped pool config flags. + [Flags] + public enum KOVL_POOL_FLAG + { + NONE = 0, + } + + /// Stream config flags. + [Flags] + public enum KSTM_FLAG : uint + { + /// None + NONE = 0, + NO_PARTIAL_XFERS = 0x00100000, + USE_TIMEOUT = 0x80000000, + TIMEOUT_MASK = 0x0001FFFF + } + + /// Stream config flags. + public enum KSTM_COMPLETE_RESULT + { + /// Valid + VALID = 0, + + /// Invalid + INVALID, + } + + #endregion + + #region Structs + + /// The \c WINUSB_PIPE_INFORMATION structure contains pipe information that the \ref UsbK_QueryPipe routine retrieves. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + public struct WINUSB_PIPE_INFORMATION + { + /// A \c USBD_PIPE_TYPE enumeration value that specifies the pipe type + public USBD_PIPE_TYPE PipeType; + + /// The pipe identifier (ID) + public byte PipeId; + + /// The maximum size, in bytes, of the packets that are transmitted on the pipe + public ushort MaximumPacketSize; + + /// The pipe interval + public byte Interval; + + + public override string ToString() + { + return string.Format("PipeType: {0}\nPipeId: {1}\nMaximumPacketSize: {2}\nInterval: {3}\n", PipeType, PipeId.ToString("X2") + "h", MaximumPacketSize, Interval.ToString("X2") + "h"); + } + }; + + /// The \c WINUSB_SETUP_PACKET structure describes a USB setup packet. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct WINUSB_SETUP_PACKET + { + /// The request type. The values that are assigned to this member are defined in Table 9.2 of section 9.3 of the Universal Serial Bus (USB) specification (www.usb.org). + public byte RequestType; + + /// The device request. The values that are assigned to this member are defined in Table 9.3 of section 9.4 of the Universal Serial Bus (USB) specification. + public byte Request; + + /// The meaning of this member varies according to the request. For an explanation of this member, see the Universal Serial Bus (USB) specification. + public ushort Value; + + /// The meaning of this member varies according to the request. For an explanation of this member, see the Universal Serial Bus (USB) specification. + public ushort Index; + + /// The number of bytes to transfer. (not including the \c WINUSB_SETUP_PACKET itself) + public ushort Length; + + + public override string ToString() + { + return string.Format("RequestType: {0}\nRequest: {1}\nValue: {2}\nIndex: {3}\nLength: {4}\n", + RequestType.ToString("X2") + "h", + Request.ToString("X2") + "h", + Value.ToString("X4") + "h", + Index.ToString("X4") + "h", + Length); + } + }; + + /// Structure describing an isochronous transfer packet. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct KISO_PACKET + { + /// Specifies the offset, in bytes, of the buffer for this packet from the beginning of the entire isochronous transfer data buffer. + public int Offset; + + /// Set by the host controller to indicate the actual number of bytes received by the device for isochronous IN transfers. Length not used for isochronous OUT transfers. + public ushort Length; + + /// Contains the 16 least significant USBD status bits, on return from the host controller driver, of this transfer packet. + public ushort Status; + + + public override string ToString() + { + return string.Format("Offset: {0}\nLength: {1}\nStatus: {2}\n", Offset, Length, Status.ToString("X4") + "h"); + } + }; + + [StructLayout(LayoutKind.Sequential)] + public struct KISO_CONTEXT + { + private readonly IntPtr mHandlePtr; + + public KISO_CONTEXT(IntPtr Handle) + { + mHandlePtr = Handle; + } + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + /// KISO_CONTEXT_MAP is used for calculating field offsets only + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + private struct KISO_CONTEXT_MAP + { + /// Additional ISO transfer flags. See \ref KISO_FLAG. + private readonly KISO_FLAG Flags; + + /// Specifies the frame number that the transfer should begin on (0 for ASAP). + private readonly int StartFrame; + + /// Contains the number of packets that completed with an error condition on return from the host controller driver. + private readonly short ErrorCount; + + /// Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + private readonly short NumberOfPackets; + + /// Contains the URB Hdr.Status value on return from the host controller driver. + private readonly int UrbHdrStatus; + }; + + private static readonly int ofsFlags = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "Flags").ToInt32(); + private static readonly int ofsStartFrame = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "StartFrame").ToInt32(); + private static readonly int ofsErrorCount = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "ErrorCount").ToInt32(); + private static readonly int ofsNumberOfPackets = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "NumberOfPackets").ToInt32(); + private static readonly int ofsUrbHdrStatus = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "UrbHdrStatus").ToInt32(); + + + /// Additional ISO transfer flags. See \ref KISO_FLAG. + public KISO_FLAG Flags + { + get + { + return (KISO_FLAG) Marshal.ReadInt32(mHandlePtr, ofsFlags); + } + } + + + /// Specifies the frame number that the transfer should begin on (0 for ASAP). + public int StartFrame + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsStartFrame); + } + } + + + /// Contains the number of packets that completed with an error condition on return from the host controller driver. + public short ErrorCount + { + get + { + return Marshal.ReadInt16(mHandlePtr, ofsErrorCount); + } + } + + + /// Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + public short NumberOfPackets + { + get + { + return Marshal.ReadInt16(mHandlePtr, ofsNumberOfPackets); + } + } + + + /// Contains the URB Hdr.Status value on return from the host controller driver. + public int UrbHdrStatus + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsUrbHdrStatus); + } + } + + + public override string ToString() + { + return string.Format("Flags: {0}\nStartFrame: {1}\nErrorCount: {2}\nNumberOfPackets: {3}\nUrbHdrStatus: {4}\n", + Flags.ToString(), + StartFrame, + ErrorCount, + NumberOfPackets, + UrbHdrStatus.ToString("X8") + "h"); + } + } + + /// libusbK verson information structure. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + public struct KLIB_VERSION + { + /// Major version number. + public int Major; + + /// Minor version number. + public int Minor; + + /// Micro version number. + public int Micro; + + /// Nano version number. + public int Nano; + + public override string ToString() + { + return string.Format("Major: {0}\nMinor: {1}\nMicro: {2}\nNano: {3}\n", Major, Minor, Micro, Nano); + } + }; + + /// Common usb device information structure + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + public struct KLST_DEV_COMMON_INFO + { + /// VendorID parsed from \ref KLST_DEVINFO::DeviceID + public int Vid; + + /// ProductID parsed from \ref KLST_DEVINFO::DeviceID + public int Pid; + + /// Composite interface number parsed from \ref KLST_DEVINFO::DeviceID. Set to \b -1 for devices that do not have the composite parent driver. + public int MI; + + // An ID that uniquely identifies a USB device. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] public string InstanceID; + + + public override string ToString() + { + return string.Format("Vid: {0}\nPid: {1}\nMI: {2}\nInstanceID: {3}\n", Vid.ToString("X4") + "h", Pid.ToString("X4") + "h", MI.ToString("X2") + "h", InstanceID); + } + }; + + [StructLayout(LayoutKind.Sequential)] + public struct KLST_DEVINFO_HANDLE : IKLIB_HANDLE + { + private readonly IntPtr mHandlePtr; + + public KLST_DEVINFO_HANDLE(IntPtr Handle) + { + mHandlePtr = Handle; + } + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + public KLIB_HANDLE_TYPE HandleType + { + get + { + return KLIB_HANDLE_TYPE.LSTINFOK; + } + } + + public IntPtr GetContext() + { + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType); + } + + public bool SetContext(IntPtr UserContext) + { + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext); + } + + public bool SetCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback) + { + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback); + } + + /// KLST_DEVINFO_MAP is used for calculating field offsets only + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + private struct KLST_DEVINFO_MAP + { + /// Common usb device information + private readonly KLST_DEV_COMMON_INFO Common; + + /// Driver id this device element is using + private readonly int DriverID; + + /// Device interface GUID + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string DeviceInterfaceGUID; + + /// Device instance ID. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string DeviceID; + + /// Class GUID. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string ClassGUID; + + /// Manufacturer name as specified in the INF file. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string Mfg; + + /// Device description as specified in the INF file. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string DeviceDesc; + + /// Driver service name. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string Service; + + /// Unique identifier. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string SymbolicLink; + + /// physical device filename used with the Windows \c CreateFile() + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string DevicePath; + + /// libusb-win32 filter index id. + private readonly int LUsb0FilterIndex; + + /// Indicates the devices connection state. + private readonly bool Connected; + + /// Synchronization flags. (internal use only) + private readonly KLST_SYNC_FLAG SyncFlags; + + private readonly int BusNumber; + + private readonly int DeviceAddress; + + /// If the the device is serialized, represents the string value of \ref USB_DEVICE_DESCRIPTOR::iSerialNumber. For Devices without a \b iSerialNumber, represents the unique \b InstanceID assigned by \b Windows. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string SerialNumber; + }; + + private static readonly int ofsCommon = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "Common").ToInt32(); + private static readonly int ofsDriverID = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "DriverID").ToInt32(); + private static readonly int ofsDeviceInterfaceGUID = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "DeviceInterfaceGUID").ToInt32(); + private static readonly int ofsDeviceID = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "DeviceID").ToInt32(); + private static readonly int ofsClassGUID = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "ClassGUID").ToInt32(); + private static readonly int ofsMfg = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "Mfg").ToInt32(); + private static readonly int ofsDeviceDesc = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "DeviceDesc").ToInt32(); + private static readonly int ofsService = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "Service").ToInt32(); + private static readonly int ofsSymbolicLink = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "SymbolicLink").ToInt32(); + private static readonly int ofsDevicePath = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "DevicePath").ToInt32(); + private static readonly int ofsLUsb0FilterIndex = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "LUsb0FilterIndex").ToInt32(); + private static readonly int ofsConnected = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "Connected").ToInt32(); + private static readonly int ofsSyncFlags = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "SyncFlags").ToInt32(); + private static readonly int ofsBusNumber = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "BusNumber").ToInt32(); + private static readonly int ofsDeviceAddress = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "DeviceAddress").ToInt32(); + private static readonly int ofsSerialNumber = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "SerialNumber").ToInt32(); + + + /// Common usb device information + public KLST_DEV_COMMON_INFO Common + { + get + { + return (KLST_DEV_COMMON_INFO) Marshal.PtrToStructure(new IntPtr(mHandlePtr.ToInt64() + ofsCommon), typeof (KLST_DEV_COMMON_INFO)); + } + } + + + /// Driver id this device element is using + public int DriverID + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsDriverID); + } + } + + + /// Device interface GUID + public string DeviceInterfaceGUID + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsDeviceInterfaceGUID)); + } + } + + + /// Device instance ID. + public string DeviceID + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsDeviceID)); + } + } + + + /// Class GUID. + public string ClassGUID + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsClassGUID)); + } + } + + + /// Manufacturer name as specified in the INF file. + public string Mfg + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsMfg)); + } + } + + + /// Device description as specified in the INF file. + public string DeviceDesc + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsDeviceDesc)); + } + } + + + /// Driver service name. + public string Service + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsService)); + } + } + + + /// Unique identifier. + public string SymbolicLink + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsSymbolicLink)); + } + } + + + /// physical device filename used with the Windows \c CreateFile() + public string DevicePath + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsDevicePath)); + } + } + + + /// libusb-win32 filter index id. + public int LUsb0FilterIndex + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsLUsb0FilterIndex); + } + } + + + /// Indicates the devices connection state. + public bool Connected + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsConnected) != 0; + } + } + + + /// Synchronization flags. (internal use only) + public KLST_SYNC_FLAG SyncFlags + { + get + { + return (KLST_SYNC_FLAG) Marshal.ReadInt32(mHandlePtr, ofsSyncFlags); + } + } + + + public int BusNumber + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsBusNumber); + } + } + + + public int DeviceAddress + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsDeviceAddress); + } + } + + + /// If the the device is serialized, represents the string value of \ref USB_DEVICE_DESCRIPTOR::iSerialNumber. For Devices without a \b iSerialNumber, represents the unique \b InstanceID assigned by \b Windows. + public string SerialNumber + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsSerialNumber)); + } + } + + + public override string ToString() + { + return + string.Format( + "DriverID: {0}\nDeviceInterfaceGUID: {1}\nDeviceID: {2}\nClassGUID: {3}\nMfg: {4}\nDeviceDesc: {5}\nService: {6}\nSymbolicLink: {7}\nDevicePath: {8}\nLUsb0FilterIndex: {9}\nConnected: {10}\nSyncFlags: {11}\nBusNumber: {12}\nDeviceAddress: {13}\nSerialNumber: {14}\n", + DriverID, + DeviceInterfaceGUID, + DeviceID, + ClassGUID, + Mfg, + DeviceDesc, + Service, + SymbolicLink, + DevicePath, + LUsb0FilterIndex, + Connected, + SyncFlags.ToString(), + BusNumber, + DeviceAddress, + SerialNumber); + } + } + + /// Device list/hot-plug pattern match structure. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Size = 1024)] + public struct KLST_PATTERN_MATCH + { + /// Pattern match a device instance id. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] public string DeviceID; + + /// Pattern match a device interface guid. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] public string DeviceInterfaceGUID; + + /// Pattern match a symbolic link. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] public string ClassGUID; + + + public override string ToString() + { + return string.Format("DeviceID: {0}\nDeviceInterfaceGUID: {1}\nClassGUID: {2}\n", DeviceID, DeviceInterfaceGUID, ClassGUID); + } + }; + + /// A structure representing the standard USB device descriptor. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct USB_DEVICE_DESCRIPTOR + { + /// Size of this descriptor (in bytes) + public byte bLength; + + /// Descriptor type + public byte bDescriptorType; + + /// USB specification release number in binary-coded decimal. + public ushort bcdUSB; + + /// USB-IF class code for the device + public byte bDeviceClass; + + /// USB-IF subclass code for the device + public byte bDeviceSubClass; + + /// USB-IF protocol code for the device + public byte bDeviceProtocol; + + /// Maximum packet size for control endpoint 0 + public byte bMaxPacketSize0; + + /// USB-IF vendor ID + public ushort idVendor; + + /// USB-IF product ID + public ushort idProduct; + + /// Device release number in binary-coded decimal + public ushort bcdDevice; + + /// Index of string descriptor describing manufacturer + public byte iManufacturer; + + /// Index of string descriptor describing product + public byte iProduct; + + /// Index of string descriptor containing device serial number + public byte iSerialNumber; + + /// Number of possible configurations + public byte bNumConfigurations; + + + public override string ToString() + { + return + string.Format( + "bLength: {0}\nbDescriptorType: {1}\nbcdUSB: {2}\nbDeviceClass: {3}\nbDeviceSubClass: {4}\nbDeviceProtocol: {5}\nbMaxPacketSize0: {6}\nidVendor: {7}\nidProduct: {8}\nbcdDevice: {9}\niManufacturer: {10}\niProduct: {11}\niSerialNumber: {12}\nbNumConfigurations: {13}\n", + bLength, + bDescriptorType.ToString("X2") + "h", + bcdUSB.ToString("X4") + "h", + bDeviceClass.ToString("X2") + "h", + bDeviceSubClass.ToString("X2") + "h", + bDeviceProtocol.ToString("X2") + "h", + bMaxPacketSize0, + idVendor.ToString("X4") + "h", + idProduct.ToString("X4") + "h", + bcdDevice.ToString("X4") + "h", + iManufacturer, + iProduct, + iSerialNumber, + bNumConfigurations); + } + }; + + /// A structure representing the standard USB endpoint descriptor. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct USB_ENDPOINT_DESCRIPTOR + { + /// Size of this descriptor (in bytes) + public byte bLength; + + /// Descriptor type + public byte bDescriptorType; + + /// The address of the endpoint described by this descriptor. + public byte bEndpointAddress; + + /// Attributes which apply to the endpoint when it is configured using the bConfigurationValue. + public byte bmAttributes; + + /// Maximum packet size this endpoint is capable of sending/receiving. + public ushort wMaxPacketSize; + + /// Interval for polling endpoint for data transfers. + public byte bInterval; + + + public override string ToString() + { + return string.Format("bLength: {0}\nbDescriptorType: {1}\nbEndpointAddress: {2}\nbmAttributes: {3}\nwMaxPacketSize: {4}\nbInterval: {5}\n", + bLength, + bDescriptorType.ToString("X2") + "h", + bEndpointAddress.ToString("X2") + "h", + bmAttributes.ToString("X2") + "h", + wMaxPacketSize, + bInterval); + } + }; + + /// A structure representing the standard USB configuration descriptor. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct USB_CONFIGURATION_DESCRIPTOR + { + /// Size of this descriptor (in bytes) + public byte bLength; + + /// Descriptor type + public byte bDescriptorType; + + /// Total length of data returned for this configuration + public ushort wTotalLength; + + /// Number of interfaces supported by this configuration + public byte bNumInterfaces; + + /// Identifier value for this configuration + public byte bConfigurationValue; + + /// Index of string descriptor describing this configuration + public byte iConfiguration; + + /// Configuration characteristics + public byte bmAttributes; + + /// Maximum power consumption of the USB device from this bus in this configuration when the device is fully operation. + public byte MaxPower; + + public override string ToString() + { + return string.Format("bLength: {0}\nbDescriptorType: {1}\nwTotalLength: {2}\nbNumInterfaces: {3}\nbConfigurationValue: {4}\niConfiguration: {5}\nbmAttributes: {6}\nMaxPower: {7}\n", + bLength, + bDescriptorType.ToString("X2") + "h", + wTotalLength, + bNumInterfaces, + bConfigurationValue, + iConfiguration, + bmAttributes.ToString("X2") + "h", + MaxPower); + } + }; + + /// A structure representing the standard USB interface descriptor. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct USB_INTERFACE_DESCRIPTOR + { + /// Size of this descriptor (in bytes) + public byte bLength; + + /// Descriptor type + public byte bDescriptorType; + + /// Number of this interface + public byte bInterfaceNumber; + + /// Value used to select this alternate setting for this interface + public byte bAlternateSetting; + + /// Number of endpoints used by this interface (excluding the control endpoint) + public byte bNumEndpoints; + + /// USB-IF class code for this interface + public byte bInterfaceClass; + + /// USB-IF subclass code for this interface + public byte bInterfaceSubClass; + + /// USB-IF protocol code for this interface + public byte bInterfaceProtocol; + + /// Index of string descriptor describing this interface + public byte iInterface; + + + public override string ToString() + { + return + string.Format( + "bLength: {0}\nbDescriptorType: {1}\nbInterfaceNumber: {2}\nbAlternateSetting: {3}\nbNumEndpoints: {4}\nbInterfaceClass: {5}\nbInterfaceSubClass: {6}\nbInterfaceProtocol: {7}\niInterface: {8}\n", + bLength, + bDescriptorType.ToString("X2") + "h", + bInterfaceNumber, + bAlternateSetting, + bNumEndpoints, + bInterfaceClass.ToString("X2") + "h", + bInterfaceSubClass.ToString("X2") + "h", + bInterfaceProtocol.ToString("X2") + "h", + iInterface); + } + }; + + /// A structure representing the standard USB string descriptor. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)] + public struct USB_STRING_DESCRIPTOR + { + /// Size of this descriptor (in bytes) + public byte bLength; + + /// Descriptor type + public byte bDescriptorType; + + /// Content of the string + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] public string bString; + + + public override string ToString() + { + return string.Format("bLength: {0}\nbDescriptorType: {1}\nbString: {2}\n", bLength, bDescriptorType.ToString("X2") + "h", bString); + } + }; + + /// A structure representing the common USB descriptor. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct USB_COMMON_DESCRIPTOR + { + /// Size of this descriptor (in bytes) + public byte bLength; + + /// Descriptor type + public byte bDescriptorType; + + + public override string ToString() + { + return string.Format("bLength: {0}\nbDescriptorType: {1}\n", bLength, bDescriptorType.ToString("X2") + "h"); + } + }; + + /// Allows hardware manufacturers to define groupings of interfaces. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct USB_INTERFACE_ASSOCIATION_DESCRIPTOR + { + /// Size of this descriptor (in bytes) + public byte bLength; + + /// Descriptor type + public byte bDescriptorType; + + /// First interface number of the set of interfaces that follow this descriptor + public byte bFirstInterface; + + /// The Number of interfaces follow this descriptor that are considered "associated" + public byte bInterfaceCount; + + /// \c bInterfaceClass used for this associated interfaces + public byte bFunctionClass; + + /// \c bInterfaceSubClass used for the associated interfaces + public byte bFunctionSubClass; + + /// \c bInterfaceProtocol used for the associated interfaces + public byte bFunctionProtocol; + + /// Index of string descriptor describing the associated interfaces + public byte iFunction; + + + public override string ToString() + { + return string.Format("bLength: {0}\nbDescriptorType: {1}\nbFirstInterface: {2}\nbInterfaceCount: {3}\nbFunctionClass: {4}\nbFunctionSubClass: {5}\nbFunctionProtocol: {6}\niFunction: {7}\n", + bLength, + bDescriptorType.ToString("X2") + "h", + bFirstInterface, + bInterfaceCount, + bFunctionClass.ToString("X2") + "h", + bFunctionSubClass.ToString("X2") + "h", + bFunctionProtocol.ToString("X2") + "h", + iFunction); + } + }; + + /// USB core driver API information structure. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + public struct KUSB_DRIVER_API_INFO + { + /// \readonly Driver id of the driver api. + public int DriverID; + + /// \readonly Number of valid functions contained in the driver API. + public int FunctionCount; + + + public override string ToString() + { + return string.Format("DriverID: {0}\nFunctionCount: {1}\n", DriverID, FunctionCount); + } + }; + + /// Driver API function set structure. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Size = 512)] + public struct KUSB_DRIVER_API + { + /// Driver API information. + public KUSB_DRIVER_API_INFO Info; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_InitDelegate Init; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_FreeDelegate Free; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_ClaimInterfaceDelegate ClaimInterface; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_ReleaseInterfaceDelegate ReleaseInterface; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_SetAltInterfaceDelegate SetAltInterface; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetAltInterfaceDelegate GetAltInterface; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetDescriptorDelegate GetDescriptor; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_ControlTransferDelegate ControlTransfer; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_SetPowerPolicyDelegate SetPowerPolicy; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetPowerPolicyDelegate GetPowerPolicy; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_SetConfigurationDelegate SetConfiguration; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetConfigurationDelegate GetConfiguration; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_ResetDeviceDelegate ResetDevice; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_InitializeDelegate Initialize; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_SelectInterfaceDelegate SelectInterface; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetAssociatedInterfaceDelegate GetAssociatedInterface; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_CloneDelegate Clone; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_QueryInterfaceSettingsDelegate QueryInterfaceSettings; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_QueryDeviceInformationDelegate QueryDeviceInformation; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_SetCurrentAlternateSettingDelegate SetCurrentAlternateSetting; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetCurrentAlternateSettingDelegate GetCurrentAlternateSetting; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_QueryPipeDelegate QueryPipe; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_SetPipePolicyDelegate SetPipePolicy; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetPipePolicyDelegate GetPipePolicy; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_ReadPipeDelegate ReadPipe; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_WritePipeDelegate WritePipe; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_ResetPipeDelegate ResetPipe; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_AbortPipeDelegate AbortPipe; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_FlushPipeDelegate FlushPipe; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_IsoReadPipeDelegate IsoReadPipe; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_IsoWritePipeDelegate IsoWritePipe; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetCurrentFrameNumberDelegate GetCurrentFrameNumber; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetOverlappedResultDelegate GetOverlappedResult; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetPropertyDelegate GetProperty; + }; + + /// Hot plug parameter structure. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Size = 2048)] + public struct KHOT_PARAMS + { + /// Hot plug event window handle to send/post messages when notifications occur. + public IntPtr UserHwnd; + + /// WM_USER message start offset used when sending/posting messages, See details. + public int UserMessage; + + /// Additional init/config parameters + public KHOT_FLAG Flags; + + /// File pattern matches for restricting notifcations to a single/group or all supported usb devices. + public KLST_PATTERN_MATCH PatternMatch; + + /// Hot plug event callback function invoked when notifications occur. + [MarshalAs(UnmanagedType.FunctionPtr)] public KHOT_PLUG_CB OnHotPlug; + + + public override string ToString() + { + return string.Format("UserHwnd: {0}\nUserMessage: {1}\nFlags: {2}\n", UserHwnd.ToString("X16") + "h", UserMessage.ToString("X8") + "h", Flags.ToString()); + } + }; + + [StructLayout(LayoutKind.Sequential)] + public struct KSTM_XFER_CONTEXT + { + private readonly IntPtr mHandlePtr; + + public KSTM_XFER_CONTEXT(IntPtr Handle) + { + mHandlePtr = Handle; + } + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + /// KSTM_XFER_CONTEXT_MAP is used for calculating field offsets only + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + private struct KSTM_XFER_CONTEXT_MAP + { + /// Internal stream buffer. + private readonly IntPtr Buffer; + + /// Size of internal stream buffer. + private readonly int BufferSize; + + /// Number of bytes to write or number of bytes read. + private readonly int TransferLength; + + /// User defined state. + private readonly IntPtr UserState; + }; + + private static readonly int ofsBuffer = Marshal.OffsetOf(typeof (KSTM_XFER_CONTEXT_MAP), "Buffer").ToInt32(); + private static readonly int ofsBufferSize = Marshal.OffsetOf(typeof (KSTM_XFER_CONTEXT_MAP), "BufferSize").ToInt32(); + private static readonly int ofsTransferLength = Marshal.OffsetOf(typeof (KSTM_XFER_CONTEXT_MAP), "TransferLength").ToInt32(); + private static readonly int ofsUserState = Marshal.OffsetOf(typeof (KSTM_XFER_CONTEXT_MAP), "UserState").ToInt32(); + + + /// Internal stream buffer. + public IntPtr Buffer + { + get + { + return Marshal.ReadIntPtr(mHandlePtr, ofsBuffer); + } + } + + + /// Size of internal stream buffer. + public int BufferSize + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsBufferSize); + } + } + + + /// Number of bytes to write or number of bytes read. + public int TransferLength + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsTransferLength); + } + } + + + /// User defined state. + public IntPtr UserState + { + get + { + return Marshal.ReadIntPtr(mHandlePtr, ofsUserState); + } + set + { + Marshal.WriteIntPtr(mHandlePtr, ofsUserState, value); + } + } + + + public override string ToString() + { + return string.Format("Buffer: {0}\nBufferSize: {1}\nTransferLength: {2}\nUserState: {3}\n", Buffer.ToString("X16") + "h", BufferSize, TransferLength, UserState.ToString("X16") + "h"); + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct KSTM_INFO + { + private readonly IntPtr mHandlePtr; + + public KSTM_INFO(IntPtr Handle) + { + mHandlePtr = Handle; + } + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + /// KSTM_INFO_MAP is used for calculating field offsets only + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + private struct KSTM_INFO_MAP + { + /// \ref KUSB_HANDLE this stream uses. + private readonly IntPtr UsbHandle; + + /// This parameter corresponds to the bEndpointAddress field in the endpoint descriptor. + private readonly byte PipeID; + + /// Maximum transfer read/write request allowed pending. + private readonly int MaxPendingTransfers; + + /// Maximum transfer sage size. + private readonly int MaxTransferSize; + + /// Maximum number of I/O request allowed pending. + private readonly int MaxPendingIO; + + /// Populated with the endpoint descriptor for the specified \c PipeID. + private readonly USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; + + /// Populated with the driver api for the specified \c UsbHandle. + private readonly KUSB_DRIVER_API DriverAPI; + + /// Populated with the device file handle for the specified \c UsbHandle. + private readonly IntPtr DeviceHandle; + + /// Stream handle. + private readonly IntPtr StreamHandle; + + /// Stream info user defined state. + private readonly IntPtr UserState; + }; + + private static readonly int ofsUsbHandle = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "UsbHandle").ToInt32(); + private static readonly int ofsPipeID = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "PipeID").ToInt32(); + private static readonly int ofsMaxPendingTransfers = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "MaxPendingTransfers").ToInt32(); + private static readonly int ofsMaxTransferSize = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "MaxTransferSize").ToInt32(); + private static readonly int ofsMaxPendingIO = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "MaxPendingIO").ToInt32(); + private static readonly int ofsEndpointDescriptor = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "EndpointDescriptor").ToInt32(); + private static readonly int ofsDriverAPI = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "DriverAPI").ToInt32(); + private static readonly int ofsDeviceHandle = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "DeviceHandle").ToInt32(); + private static readonly int ofsStreamHandle = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "StreamHandle").ToInt32(); + private static readonly int ofsUserState = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "UserState").ToInt32(); + + + /// \ref KUSB_HANDLE this stream uses. + public IntPtr UsbHandle + { + get + { + return Marshal.ReadIntPtr(mHandlePtr, ofsUsbHandle); + } + } + + + /// This parameter corresponds to the bEndpointAddress field in the endpoint descriptor. + public byte PipeID + { + get + { + return Marshal.ReadByte(mHandlePtr, ofsPipeID); + } + } + + + /// Maximum transfer read/write request allowed pending. + public int MaxPendingTransfers + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsMaxPendingTransfers); + } + } + + + /// Maximum transfer sage size. + public int MaxTransferSize + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsMaxTransferSize); + } + } + + + /// Maximum number of I/O request allowed pending. + public int MaxPendingIO + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsMaxPendingIO); + } + } + + + /// Populated with the endpoint descriptor for the specified \c PipeID. + public USB_ENDPOINT_DESCRIPTOR EndpointDescriptor + { + get + { + return (USB_ENDPOINT_DESCRIPTOR) Marshal.PtrToStructure(new IntPtr(mHandlePtr.ToInt64() + ofsEndpointDescriptor), typeof (USB_ENDPOINT_DESCRIPTOR)); + } + } + + + /// Populated with the driver api for the specified \c UsbHandle. + public KUSB_DRIVER_API DriverAPI + { + get + { + return (KUSB_DRIVER_API) Marshal.PtrToStructure(new IntPtr(mHandlePtr.ToInt64() + ofsDriverAPI), typeof (KUSB_DRIVER_API)); + } + } + + + /// Populated with the device file handle for the specified \c UsbHandle. + public IntPtr DeviceHandle + { + get + { + return Marshal.ReadIntPtr(mHandlePtr, ofsDeviceHandle); + } + } + + + /// Stream handle. + public IntPtr StreamHandle + { + get + { + return Marshal.ReadIntPtr(mHandlePtr, ofsStreamHandle); + } + } + + + /// Stream info user defined state. + public IntPtr UserState + { + get + { + return Marshal.ReadIntPtr(mHandlePtr, ofsUserState); + } + set + { + Marshal.WriteIntPtr(mHandlePtr, ofsUserState, value); + } + } + + + public override string ToString() + { + return string.Format("UsbHandle: {0}\nPipeID: {1}\nMaxPendingTransfers: {2}\nMaxTransferSize: {3}\nMaxPendingIO: {4}\nDeviceHandle: {5}\nStreamHandle: {6}\nUserState: {7}\n", + UsbHandle.ToString("X16") + "h", + PipeID.ToString("X2") + "h", + MaxPendingTransfers, + MaxTransferSize, + MaxPendingIO, + DeviceHandle.ToString("X16") + "h", + StreamHandle.ToString("X16") + "h", + UserState.ToString("X16") + "h"); + } + } + + /// Stream callback structure. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Size = 64)] + public struct KSTM_CALLBACK + { + /// Executed when a transfer error occurs. + [MarshalAs(UnmanagedType.FunctionPtr)] public KSTM_ERROR_CB Error; + + /// Executed to submit a transfer. + [MarshalAs(UnmanagedType.FunctionPtr)] public KSTM_SUBMIT_CB Submit; + + /// Executed when a valid transfer completes. + [MarshalAs(UnmanagedType.FunctionPtr)] public KSTM_COMPLETE_CB Complete; + + /// Executed for every transfer context when the stream is started with \ref StmK_Start. + [MarshalAs(UnmanagedType.FunctionPtr)] public KSTM_STARTED_CB Started; + + /// Executed for every transfer context when the stream is stopped with \ref StmK_Stop. + [MarshalAs(UnmanagedType.FunctionPtr)] public KSTM_STOPPED_CB Stopped; + + /// Executed immediately after a transfer completes. + [MarshalAs(UnmanagedType.FunctionPtr)] public KSTM_BEFORE_COMPLETE_CB BeforeComplete; + }; + + #endregion + + #region Delegates + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate int KLIB_HANDLE_CLEANUP_CB([In] IntPtr Handle, KLIB_HANDLE_TYPE HandleType, IntPtr UserContext); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KISO_ENUM_PACKETS_CB(int PacketIndex, [In] ref KISO_PACKET IsoPacket, IntPtr UserState); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KLST_ENUM_DEVINFO_CB([In] KLST_HANDLE DeviceList, [In] KLST_DEVINFO_HANDLE DeviceInfo, IntPtr Context); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_InitDelegate([Out] out KUSB_HANDLE InterfaceHandle, [In] KLST_DEVINFO_HANDLE DevInfo); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_FreeDelegate([In] KUSB_HANDLE InterfaceHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_ClaimInterfaceDelegate([In] KUSB_HANDLE InterfaceHandle, byte NumberOrIndex, bool IsIndex); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_ReleaseInterfaceDelegate([In] KUSB_HANDLE InterfaceHandle, byte NumberOrIndex, bool IsIndex); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_SetAltInterfaceDelegate([In] KUSB_HANDLE InterfaceHandle, byte NumberOrIndex, bool IsIndex, byte AltSettingNumber); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetAltInterfaceDelegate([In] KUSB_HANDLE InterfaceHandle, byte NumberOrIndex, bool IsIndex, out byte AltSettingNumber); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetDescriptorDelegate([In] KUSB_HANDLE InterfaceHandle, byte DescriptorType, byte Index, ushort LanguageID, IntPtr Buffer, int BufferLength, out int LengthTransferred); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_ControlTransferDelegate([In] KUSB_HANDLE InterfaceHandle, WINUSB_SETUP_PACKET SetupPacket, IntPtr Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_SetPowerPolicyDelegate([In] KUSB_HANDLE InterfaceHandle, int PolicyType, int ValueLength, IntPtr Value); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetPowerPolicyDelegate([In] KUSB_HANDLE InterfaceHandle, int PolicyType, ref int ValueLength, IntPtr Value); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_SetConfigurationDelegate([In] KUSB_HANDLE InterfaceHandle, byte ConfigurationNumber); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetConfigurationDelegate([In] KUSB_HANDLE InterfaceHandle, out byte ConfigurationNumber); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_ResetDeviceDelegate([In] KUSB_HANDLE InterfaceHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_InitializeDelegate(IntPtr DeviceHandle, [Out] out KUSB_HANDLE InterfaceHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_SelectInterfaceDelegate([In] KUSB_HANDLE InterfaceHandle, byte NumberOrIndex, bool IsIndex); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetAssociatedInterfaceDelegate([In] KUSB_HANDLE InterfaceHandle, byte AssociatedInterfaceIndex, [Out] out KUSB_HANDLE AssociatedInterfaceHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_CloneDelegate([In] KUSB_HANDLE InterfaceHandle, [Out] out KUSB_HANDLE DstInterfaceHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_QueryInterfaceSettingsDelegate([In] KUSB_HANDLE InterfaceHandle, byte AltSettingIndex, [Out] out USB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_QueryDeviceInformationDelegate([In] KUSB_HANDLE InterfaceHandle, int InformationType, ref int BufferLength, IntPtr Buffer); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_SetCurrentAlternateSettingDelegate([In] KUSB_HANDLE InterfaceHandle, byte AltSettingNumber); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetCurrentAlternateSettingDelegate([In] KUSB_HANDLE InterfaceHandle, out byte AltSettingNumber); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_QueryPipeDelegate([In] KUSB_HANDLE InterfaceHandle, byte AltSettingNumber, byte PipeIndex, [Out] out WINUSB_PIPE_INFORMATION PipeInformation); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_SetPipePolicyDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID, int PolicyType, int ValueLength, IntPtr Value); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetPipePolicyDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID, int PolicyType, ref int ValueLength, IntPtr Value); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_ReadPipeDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID, IntPtr Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_WritePipeDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID, IntPtr Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_ResetPipeDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_AbortPipeDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_FlushPipeDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_IsoReadPipeDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID, IntPtr Buffer, int BufferLength, IntPtr Overlapped, [In] KISO_CONTEXT IsoContext); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_IsoWritePipeDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID, IntPtr Buffer, int BufferLength, IntPtr Overlapped, [In] KISO_CONTEXT IsoContext); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetCurrentFrameNumberDelegate([In] KUSB_HANDLE InterfaceHandle, out int FrameNumber); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetOverlappedResultDelegate([In] KUSB_HANDLE InterfaceHandle, IntPtr Overlapped, out int lpNumberOfBytesTransferred, bool bWait); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetPropertyDelegate([In] KUSB_HANDLE InterfaceHandle, KUSB_PROPERTY PropertyType, ref int PropertySize, IntPtr Value); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate void KHOT_PLUG_CB([In] KHOT_HANDLE HotHandle, [In] KLST_DEVINFO_HANDLE DeviceInfo, KLST_SYNC_FLAG PlugType); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate int KSTM_ERROR_CB([In] KSTM_INFO StreamInfo, [In] KSTM_XFER_CONTEXT XferContext, int XferContextIndex, int ErrorCode); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate int KSTM_SUBMIT_CB([In] KSTM_INFO StreamInfo, [In] KSTM_XFER_CONTEXT XferContext, int XferContextIndex, IntPtr Overlapped); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate int KSTM_STARTED_CB([In] KSTM_INFO StreamInfo, [In] KSTM_XFER_CONTEXT XferContext, int XferContextIndex); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate int KSTM_STOPPED_CB([In] KSTM_INFO StreamInfo, [In] KSTM_XFER_CONTEXT XferContext, int XferContextIndex); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate int KSTM_COMPLETE_CB([In] KSTM_INFO StreamInfo, [In] KSTM_XFER_CONTEXT XferContext, int XferContextIndex, int ErrorCode); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate KSTM_COMPLETE_RESULT KSTM_BEFORE_COMPLETE_CB([In] KSTM_INFO StreamInfo, [In] KSTM_XFER_CONTEXT XferContext, int XferContextIndex, ref int ErrorCode); + + #endregion + + public class LstK : IDisposable + { + protected KLST_HANDLE mHandleStruct; + protected bool mbDisposed; + + protected LstK() + { + } + + #region IDisposable Members + + /// Explicitly closes and frees the handle. + public virtual void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + ~LstK() + { + Dispose(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!mbDisposed) + { + if (mHandleStruct.Pointer != IntPtr.Zero) + { + AllKFunctions.LstK_Free(mHandleStruct); + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing); + } + else + Debug.Print("{0} Dispose: [WARNING] Handle is null", GetType().Name); + + mHandleStruct = new KLST_HANDLE(IntPtr.Zero); + mbDisposed = true; + } + } + + /// Initializes a new usb device list containing all supported devices. + protected bool Init(KLST_FLAG Flags) + { + bool success = AllKFunctions.LstK_Init(out mHandleStruct, Flags); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + return true; + } + + /// Initializes a new usb device list containing only devices matching a specific class GUID. + protected bool InitEx(KLST_FLAG Flags, ref KLST_PATTERN_MATCH PatternMatch) + { + bool success = AllKFunctions.LstK_InitEx(out mHandleStruct, Flags, ref PatternMatch); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + return true; + } + + #region Public Members + + /// Initializes a new usb device list containing all supported devices. + public LstK(KLST_FLAG Flags) + { + bool success = AllKFunctions.LstK_Init(out mHandleStruct, Flags); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + } + + /// Initializes a new usb device list containing only devices matching a specific class GUID. + public LstK(KLST_FLAG Flags, ref KLST_PATTERN_MATCH PatternMatch) + { + bool success = AllKFunctions.LstK_InitEx(out mHandleStruct, Flags, ref PatternMatch); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + } + + /// Counts the number of device info elements in a device list. + public virtual bool Count(ref int Count) + { + return AllKFunctions.LstK_Count(mHandleStruct, ref Count); + } + + /// Gets the \ref KLST_DEVINFO element for the current position. + public virtual bool Current(out KLST_DEVINFO_HANDLE DeviceInfo) + { + return AllKFunctions.LstK_Current(mHandleStruct, out DeviceInfo); + } + + /// Enumerates \ref KLST_DEVINFO elements of a \ref KLST_HANDLE. + public virtual bool Enumerate(KLST_ENUM_DEVINFO_CB EnumDevListCB, IntPtr Context) + { + return AllKFunctions.LstK_Enumerate(mHandleStruct, EnumDevListCB, Context); + } + + /// Find a device by vendor and product id + public virtual bool FindByVidPid(int Vid, int Pid, out KLST_DEVINFO_HANDLE DeviceInfo) + { + return AllKFunctions.LstK_FindByVidPid(mHandleStruct, Vid, Pid, out DeviceInfo); + } + + /// Calls the dispose method. + public virtual void Free() + { + Dispose(); + } + + /// Gets the handle class structure. + public KLST_HANDLE Handle + { + get + { + return mHandleStruct; + } + } + + /// Advances the device list current \ref KLST_DEVINFO position. + public virtual bool MoveNext(out KLST_DEVINFO_HANDLE DeviceInfo) + { + return AllKFunctions.LstK_MoveNext(mHandleStruct, out DeviceInfo); + } + + /// Sets the device list to its initial position, which is before the first element in the list. + public virtual void MoveReset() + { + AllKFunctions.LstK_MoveReset(mHandleStruct); + } + + #endregion + } + + public class HotK : IDisposable + { + protected KHOT_HANDLE mHandleStruct; + protected bool mbDisposed; + + protected HotK() + { + } + + #region IDisposable Members + + /// Explicitly closes and frees the handle. + public virtual void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + ~HotK() + { + Dispose(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!mbDisposed) + { + if (mHandleStruct.Pointer != IntPtr.Zero) + { + AllKFunctions.HotK_Free(mHandleStruct); + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing); + } + else + Debug.Print("{0} Dispose: [WARNING] Handle is null", GetType().Name); + + mHandleStruct = new KHOT_HANDLE(IntPtr.Zero); + mbDisposed = true; + } + } + + /// Creates a new hot-plug handle for USB device arrival/removal event monitoring. + protected bool Init(ref KHOT_PARAMS InitParams) + { + bool success = AllKFunctions.HotK_Init(out mHandleStruct, ref InitParams); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + return true; + } + + #region Public Members + + /// Creates a new hot-plug handle for USB device arrival/removal event monitoring. + public HotK(ref KHOT_PARAMS InitParams) + { + bool success = AllKFunctions.HotK_Init(out mHandleStruct, ref InitParams); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + } + + /// Calls the dispose method. + public virtual void Free() + { + Dispose(); + } + + /// Frees all hot-plug handles initialized with \ref HotK_Init. + public virtual void FreeAll() + { + AllKFunctions.HotK_FreeAll(); + } + + /// Gets the handle class structure. + public KHOT_HANDLE Handle + { + get + { + return mHandleStruct; + } + } + + #endregion + } + + public class UsbK : IDisposable + { + protected KUSB_DRIVER_API driverAPI; + protected KUSB_HANDLE mHandleStruct; + protected bool mbDisposed; + + protected UsbK() + { + } + + #region IDisposable Members + + /// Explicitly closes and frees the handle. + public virtual void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + ~UsbK() + { + Dispose(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!mbDisposed) + { + if (mHandleStruct.Pointer != IntPtr.Zero) + { + AllKFunctions.UsbK_Free(mHandleStruct); + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing); + } + else + Debug.Print("{0} Dispose: [WARNING] Handle is null", GetType().Name); + + mHandleStruct = new KUSB_HANDLE(IntPtr.Zero); + mbDisposed = true; + } + } + + /// Creates/opens a libusbK interface handle from the device list. This is a preferred method. + protected bool Init(KLST_DEVINFO_HANDLE DevInfo) + { + bool success = AllKFunctions.LibK_LoadDriverAPI(out driverAPI, DevInfo.DriverID); + + if (!success) throw new Exception(string.Format("{0} failed loading Driver API. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + success = driverAPI.Init(out mHandleStruct, DevInfo); + + if (!success) + throw new Exception(string.Format("{0} failed initializing usb device. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + return true; + } + + /// Creates a libusbK handle for the device specified by a file handle. + protected bool Initialize(IntPtr DeviceHandle, KUSB_DRVID driverID) + { + bool success = AllKFunctions.LibK_LoadDriverAPI(out driverAPI, (int) driverID); + + if (!success) throw new Exception(string.Format("{0} failed loading Driver API. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + success = driverAPI.Initialize(DeviceHandle, out mHandleStruct); + + if (!success) + throw new Exception(string.Format("{0} failed initializing usb device. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + return true; + } + + #region Public Members + + /// Creates/opens a libusbK interface handle from the device list. This is a preferred method. + public UsbK(KLST_DEVINFO_HANDLE DevInfo) + { + bool success = AllKFunctions.LibK_LoadDriverAPI(out driverAPI, DevInfo.DriverID); + + if (!success) throw new Exception(string.Format("{0} failed loading Driver API. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + success = driverAPI.Init(out mHandleStruct, DevInfo); + + if (!success) + throw new Exception(string.Format("{0} failed initializing usb device. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + } + + /// Creates a libusbK handle for the device specified by a file handle. + public UsbK(IntPtr DeviceHandle, KUSB_DRVID driverID) + { + bool success = AllKFunctions.LibK_LoadDriverAPI(out driverAPI, (int) driverID); + + if (!success) throw new Exception(string.Format("{0} failed loading Driver API. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + success = driverAPI.Initialize(DeviceHandle, out mHandleStruct); + + if (!success) + throw new Exception(string.Format("{0} failed initializing usb device. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + } + + /// Aborts all of the pending transfers for a pipe. + public virtual bool AbortPipe(byte PipeID) + { + return driverAPI.AbortPipe(mHandleStruct, PipeID); + } + + /// Claims the specified interface by number or index. + public virtual bool ClaimInterface(byte NumberOrIndex, bool IsIndex) + { + return driverAPI.ClaimInterface(mHandleStruct, NumberOrIndex, IsIndex); + } + + /// Clones the specified interface handle. + public virtual bool Clone(out KUSB_HANDLE DstInterfaceHandle) + { + return driverAPI.Clone(mHandleStruct, out DstInterfaceHandle); + } + + /// Transmits control data over a default control endpoint. + public virtual bool ControlTransfer(WINUSB_SETUP_PACKET SetupPacket, IntPtr Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped) + { + return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Buffer, BufferLength, out LengthTransferred, Overlapped); + } + + /// Transmits control data over a default control endpoint. + public virtual bool ControlTransfer(WINUSB_SETUP_PACKET SetupPacket, Array Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped) + { + return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, out LengthTransferred, Overlapped); + } + + /// Transmits control data over a default control endpoint. + public virtual bool ControlTransfer(WINUSB_SETUP_PACKET SetupPacket, Array Buffer, int BufferLength, out int LengthTransferred, KOVL_HANDLE Overlapped) + { + return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, out LengthTransferred, Overlapped.Pointer); + } + + /// Transmits control data over a default control endpoint. + public virtual bool ControlTransfer(WINUSB_SETUP_PACKET SetupPacket, IntPtr Buffer, int BufferLength, out int LengthTransferred, KOVL_HANDLE Overlapped) + { + return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Buffer, BufferLength, out LengthTransferred, Overlapped.Pointer); + } + + /// Discards any data that is cached in a pipe. + public virtual bool FlushPipe(byte PipeID) + { + return driverAPI.FlushPipe(mHandleStruct, PipeID); + } + + /// Calls the dispose method. + public virtual void Free() + { + Dispose(); + } + + /// Gets the alternate setting for the specified interface. + public virtual bool GetAltInterface(byte NumberOrIndex, bool IsIndex, out byte AltSettingNumber) + { + return driverAPI.GetAltInterface(mHandleStruct, NumberOrIndex, IsIndex, out AltSettingNumber); + } + + /// Retrieves a handle for an associated interface. + public virtual bool GetAssociatedInterface(byte AssociatedInterfaceIndex, out KUSB_HANDLE AssociatedInterfaceHandle) + { + return driverAPI.GetAssociatedInterface(mHandleStruct, AssociatedInterfaceIndex, out AssociatedInterfaceHandle); + } + + /// Gets the device current configuration number. + public virtual bool GetConfiguration(out byte ConfigurationNumber) + { + return driverAPI.GetConfiguration(mHandleStruct, out ConfigurationNumber); + } + + /// Gets the current alternate interface setting for an interface. + public virtual bool GetCurrentAlternateSetting(out byte AltSettingNumber) + { + return driverAPI.GetCurrentAlternateSetting(mHandleStruct, out AltSettingNumber); + } + + /// Retrieves the current USB frame number. + public virtual bool GetCurrentFrameNumber(out int FrameNumber) + { + return driverAPI.GetCurrentFrameNumber(mHandleStruct, out FrameNumber); + } + + /// Gets the requested descriptor. This is a synchronous operation. + public virtual bool GetDescriptor(byte DescriptorType, byte Index, int LanguageID, IntPtr Buffer, int BufferLength, out int LengthTransferred) + { + return driverAPI.GetDescriptor(mHandleStruct, DescriptorType, Index, (ushort) LanguageID, Buffer, BufferLength, out LengthTransferred); + } + + /// Gets the requested descriptor. This is a synchronous operation. + public virtual bool GetDescriptor(byte DescriptorType, byte Index, int LanguageID, Array Buffer, int BufferLength, out int LengthTransferred) + { + return driverAPI.GetDescriptor(mHandleStruct, DescriptorType, Index, (ushort) LanguageID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, out LengthTransferred); + } + + /// Retrieves the results of an overlapped operation on the specified libusbK handle. + public virtual bool GetOverlappedResult(IntPtr Overlapped, out int lpNumberOfBytesTransferred, bool bWait) + { + return driverAPI.GetOverlappedResult(mHandleStruct, Overlapped, out lpNumberOfBytesTransferred, bWait); + } + + /// Retrieves the results of an overlapped operation on the specified libusbK handle. + public virtual bool GetOverlappedResult(KOVL_HANDLE Overlapped, out int lpNumberOfBytesTransferred, bool bWait) + { + return driverAPI.GetOverlappedResult(mHandleStruct, Overlapped.Pointer, out lpNumberOfBytesTransferred, bWait); + } + + /// Gets the policy for a specific pipe (endpoint). + public virtual bool GetPipePolicy(byte PipeID, int PolicyType, ref int ValueLength, IntPtr Value) + { + return driverAPI.GetPipePolicy(mHandleStruct, PipeID, PolicyType, ref ValueLength, Value); + } + + /// Gets the policy for a specific pipe (endpoint). + public virtual bool GetPipePolicy(byte PipeID, int PolicyType, ref int ValueLength, Array Value) + { + return driverAPI.GetPipePolicy(mHandleStruct, PipeID, PolicyType, ref ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)); + } + + /// Gets the power policy for a device. + public virtual bool GetPowerPolicy(int PolicyType, ref int ValueLength, IntPtr Value) + { + return driverAPI.GetPowerPolicy(mHandleStruct, PolicyType, ref ValueLength, Value); + } + + /// Gets the power policy for a device. + public virtual bool GetPowerPolicy(int PolicyType, ref int ValueLength, Array Value) + { + return driverAPI.GetPowerPolicy(mHandleStruct, PolicyType, ref ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)); + } + + /// Gets a USB device (driver specific) property from usb handle. + public virtual bool GetProperty(KUSB_PROPERTY PropertyType, ref int PropertySize, IntPtr Value) + { + return driverAPI.GetProperty(mHandleStruct, PropertyType, ref PropertySize, Value); + } + + /// Gets a USB device (driver specific) property from usb handle. + public virtual bool GetProperty(KUSB_PROPERTY PropertyType, ref int PropertySize, Array Value) + { + return driverAPI.GetProperty(mHandleStruct, PropertyType, ref PropertySize, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)); + } + + /// Gets the handle class structure. + public KUSB_HANDLE Handle + { + get + { + return mHandleStruct; + } + } + + /// Reads from an isochronous pipe. + public virtual bool IsoReadPipe(byte PipeID, IntPtr Buffer, int BufferLength, IntPtr Overlapped, KISO_CONTEXT IsoContext) + { + return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped, IsoContext); + } + + /// Reads from an isochronous pipe. + public virtual bool IsoReadPipe(byte PipeID, Array Buffer, int BufferLength, IntPtr Overlapped, KISO_CONTEXT IsoContext) + { + return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped, IsoContext); + } + + /// Reads from an isochronous pipe. + public virtual bool IsoReadPipe(byte PipeID, Array Buffer, int BufferLength, KOVL_HANDLE Overlapped, KISO_CONTEXT IsoContext) + { + return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped.Pointer, IsoContext); + } + + /// Reads from an isochronous pipe. + public virtual bool IsoReadPipe(byte PipeID, IntPtr Buffer, int BufferLength, KOVL_HANDLE Overlapped, KISO_CONTEXT IsoContext) + { + return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped.Pointer, IsoContext); + } + + /// Writes to an isochronous pipe. + public virtual bool IsoWritePipe(byte PipeID, IntPtr Buffer, int BufferLength, IntPtr Overlapped, KISO_CONTEXT IsoContext) + { + return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped, IsoContext); + } + + /// Writes to an isochronous pipe. + public virtual bool IsoWritePipe(byte PipeID, Array Buffer, int BufferLength, IntPtr Overlapped, KISO_CONTEXT IsoContext) + { + return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped, IsoContext); + } + + /// Writes to an isochronous pipe. + public virtual bool IsoWritePipe(byte PipeID, Array Buffer, int BufferLength, KOVL_HANDLE Overlapped, KISO_CONTEXT IsoContext) + { + return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped.Pointer, IsoContext); + } + + /// Writes to an isochronous pipe. + public virtual bool IsoWritePipe(byte PipeID, IntPtr Buffer, int BufferLength, KOVL_HANDLE Overlapped, KISO_CONTEXT IsoContext) + { + return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped.Pointer, IsoContext); + } + + /// Retrieves information about the physical device that is associated with a libusbK handle. + public virtual bool QueryDeviceInformation(int InformationType, ref int BufferLength, IntPtr Buffer) + { + return driverAPI.QueryDeviceInformation(mHandleStruct, InformationType, ref BufferLength, Buffer); + } + + /// Retrieves the interface descriptor for the specified alternate interface settings for a particular interface handle. + public virtual bool QueryInterfaceSettings(byte AltSettingIndex, out USB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor) + { + return driverAPI.QueryInterfaceSettings(mHandleStruct, AltSettingIndex, out UsbAltInterfaceDescriptor); + } + + /// Retrieves information about a pipe that is associated with an interface. + public virtual bool QueryPipe(byte AltSettingNumber, byte PipeIndex, out WINUSB_PIPE_INFORMATION PipeInformation) + { + return driverAPI.QueryPipe(mHandleStruct, AltSettingNumber, PipeIndex, out PipeInformation); + } + + /// Reads data from the specified pipe. + public virtual bool ReadPipe(byte PipeID, IntPtr Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped) + { + return driverAPI.ReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, out LengthTransferred, Overlapped); + } + + /// Reads data from the specified pipe. + public virtual bool ReadPipe(byte PipeID, Array Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped) + { + return driverAPI.ReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, out LengthTransferred, Overlapped); + } + + /// Reads data from the specified pipe. + public virtual bool ReadPipe(byte PipeID, Array Buffer, int BufferLength, out int LengthTransferred, KOVL_HANDLE Overlapped) + { + return driverAPI.ReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, out LengthTransferred, Overlapped.Pointer); + } + + /// Reads data from the specified pipe. + public virtual bool ReadPipe(byte PipeID, IntPtr Buffer, int BufferLength, out int LengthTransferred, KOVL_HANDLE Overlapped) + { + return driverAPI.ReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, out LengthTransferred, Overlapped.Pointer); + } + + /// Releases the specified interface by number or index. + public virtual bool ReleaseInterface(byte NumberOrIndex, bool IsIndex) + { + return driverAPI.ReleaseInterface(mHandleStruct, NumberOrIndex, IsIndex); + } + + /// Resets the usb device of the specified interface handle. (port cycle). + public virtual bool ResetDevice() + { + return driverAPI.ResetDevice(mHandleStruct); + } + + /// Resets the data toggle and clears the stall condition on a pipe. + public virtual bool ResetPipe(byte PipeID) + { + return driverAPI.ResetPipe(mHandleStruct, PipeID); + } + + /// Selects the specified interface by number or index as the current interface. + public virtual bool SelectInterface(byte NumberOrIndex, bool IsIndex) + { + return driverAPI.SelectInterface(mHandleStruct, NumberOrIndex, IsIndex); + } + + /// Sets the alternate setting of the specified interface. + public virtual bool SetAltInterface(byte NumberOrIndex, bool IsIndex, byte AltSettingNumber) + { + return driverAPI.SetAltInterface(mHandleStruct, NumberOrIndex, IsIndex, AltSettingNumber); + } + + /// Sets the device configuration number. + public virtual bool SetConfiguration(byte ConfigurationNumber) + { + return driverAPI.SetConfiguration(mHandleStruct, ConfigurationNumber); + } + + /// Sets the alternate setting of an interface. + public virtual bool SetCurrentAlternateSetting(byte AltSettingNumber) + { + return driverAPI.SetCurrentAlternateSetting(mHandleStruct, AltSettingNumber); + } + + /// Sets the policy for a specific pipe associated with an endpoint on the device. This is a synchronous operation. + public virtual bool SetPipePolicy(byte PipeID, int PolicyType, int ValueLength, IntPtr Value) + { + return driverAPI.SetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Value); + } + + /// Sets the policy for a specific pipe associated with an endpoint on the device. This is a synchronous operation. + public virtual bool SetPipePolicy(byte PipeID, int PolicyType, int ValueLength, Array Value) + { + return driverAPI.SetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)); + } + + /// Sets the power policy for a device. + public virtual bool SetPowerPolicy(int PolicyType, int ValueLength, IntPtr Value) + { + return driverAPI.SetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Value); + } + + /// Sets the power policy for a device. + public virtual bool SetPowerPolicy(int PolicyType, int ValueLength, Array Value) + { + return driverAPI.SetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)); + } + + /// Writes data to a pipe. + public virtual bool WritePipe(byte PipeID, IntPtr Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped) + { + return driverAPI.WritePipe(mHandleStruct, PipeID, Buffer, BufferLength, out LengthTransferred, Overlapped); + } + + /// Writes data to a pipe. + public virtual bool WritePipe(byte PipeID, Array Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped) + { + return driverAPI.WritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, out LengthTransferred, Overlapped); + } + + /// Writes data to a pipe. + public virtual bool WritePipe(byte PipeID, Array Buffer, int BufferLength, out int LengthTransferred, KOVL_HANDLE Overlapped) + { + return driverAPI.WritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, out LengthTransferred, Overlapped.Pointer); + } + + /// Writes data to a pipe. + public virtual bool WritePipe(byte PipeID, IntPtr Buffer, int BufferLength, out int LengthTransferred, KOVL_HANDLE Overlapped) + { + return driverAPI.WritePipe(mHandleStruct, PipeID, Buffer, BufferLength, out LengthTransferred, Overlapped.Pointer); + } + + #endregion + } + + public class OvlK : IDisposable + { + protected KOVL_POOL_HANDLE mHandleStruct; + protected bool mbDisposed; + + protected OvlK() + { + } + + #region IDisposable Members + + /// Explicitly closes and frees the handle. + public virtual void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + ~OvlK() + { + Dispose(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!mbDisposed) + { + if (mHandleStruct.Pointer != IntPtr.Zero) + { + AllKFunctions.OvlK_Free(mHandleStruct); + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing); + } + else + Debug.Print("{0} Dispose: [WARNING] Handle is null", GetType().Name); + + mHandleStruct = new KOVL_POOL_HANDLE(IntPtr.Zero); + mbDisposed = true; + } + } + + /// Creates a new overlapped pool. + protected bool Init(KUSB_HANDLE UsbHandle, int MaxOverlappedCount, KOVL_POOL_FLAG Flags) + { + bool success = AllKFunctions.OvlK_Init(out mHandleStruct, UsbHandle, MaxOverlappedCount, Flags); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + return true; + } + + #region Public Members + + /// Creates a new overlapped pool. + public OvlK(KUSB_HANDLE UsbHandle, int MaxOverlappedCount, KOVL_POOL_FLAG Flags) + { + bool success = AllKFunctions.OvlK_Init(out mHandleStruct, UsbHandle, MaxOverlappedCount, Flags); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + } + + /// Gets a preallocated \c OverlappedK structure from the specified/default pool. + public virtual bool Acquire(out KOVL_HANDLE OverlappedK) + { + return AllKFunctions.OvlK_Acquire(out OverlappedK, mHandleStruct); + } + + /// Calls the dispose method. + public virtual void Free() + { + Dispose(); + } + + /// Returns the internal event handle used to signal IO operations. + public virtual IntPtr GetEventHandle(KOVL_HANDLE OverlappedK) + { + return AllKFunctions.OvlK_GetEventHandle(OverlappedK); + } + + /// Gets the handle class structure. + public KOVL_POOL_HANDLE Handle + { + get + { + return mHandleStruct; + } + } + + /// Checks for i/o completion; returns immediately. (polling) + public virtual bool IsComplete(KOVL_HANDLE OverlappedK) + { + return AllKFunctions.OvlK_IsComplete(OverlappedK); + } + + /// Initializes an overlappedK for re-use. The overlappedK is not return to its pool. + public virtual bool ReUse(KOVL_HANDLE OverlappedK) + { + return AllKFunctions.OvlK_ReUse(OverlappedK); + } + + /// Returns an \c OverlappedK structure to it's pool. + public virtual bool Release(KOVL_HANDLE OverlappedK) + { + return AllKFunctions.OvlK_Release(OverlappedK); + } + + /// Waits for overlapped I/O completion, and performs actions specified in \c WaitFlags. + public virtual bool Wait(KOVL_HANDLE OverlappedK, int TimeoutMS, KOVL_WAIT_FLAG WaitFlags, out int TransferredLength) + { + return AllKFunctions.OvlK_Wait(OverlappedK, TimeoutMS, WaitFlags, out TransferredLength); + } + + /// Waits for overlapped I/O completion, cancels on a timeout error and always releases the OvlK handle back to its pool. + public virtual bool WaitAndRelease(KOVL_HANDLE OverlappedK, int TimeoutMS, out int TransferredLength) + { + return AllKFunctions.OvlK_WaitAndRelease(OverlappedK, TimeoutMS, out TransferredLength); + } + + /// Waits for overlapped I/O completion on the oldest acquired OverlappedK handle and performs actions specified in \c WaitFlags. + public virtual bool WaitOldest(out KOVL_HANDLE OverlappedK, int TimeoutMS, KOVL_WAIT_FLAG WaitFlags, out int TransferredLength) + { + return AllKFunctions.OvlK_WaitOldest(mHandleStruct, out OverlappedK, TimeoutMS, WaitFlags, out TransferredLength); + } + + /// Waits for overlapped I/O completion, cancels on a timeout error. + public virtual bool WaitOrCancel(KOVL_HANDLE OverlappedK, int TimeoutMS, out int TransferredLength) + { + return AllKFunctions.OvlK_WaitOrCancel(OverlappedK, TimeoutMS, out TransferredLength); + } + + #endregion + } + + public class StmK : IDisposable + { + protected KSTM_HANDLE mHandleStruct; + protected bool mbDisposed; + + protected StmK() + { + } + + #region IDisposable Members + + /// Explicitly closes and frees the handle. + public virtual void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + ~StmK() + { + Dispose(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!mbDisposed) + { + if (mHandleStruct.Pointer != IntPtr.Zero) + { + AllKFunctions.StmK_Free(mHandleStruct); + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing); + } + else + Debug.Print("{0} Dispose: [WARNING] Handle is null", GetType().Name); + + mHandleStruct = new KSTM_HANDLE(IntPtr.Zero); + mbDisposed = true; + } + } + + /// Initializes a new uni-directional pipe stream. + protected bool Init(KUSB_HANDLE UsbHandle, byte PipeID, int MaxTransferSize, int MaxPendingTransfers, int MaxPendingIO, ref KSTM_CALLBACK Callbacks, KSTM_FLAG Flags) + { + bool success = AllKFunctions.StmK_Init(out mHandleStruct, UsbHandle, PipeID, MaxTransferSize, MaxPendingTransfers, MaxPendingIO, ref Callbacks, Flags); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + return true; + } + + #region Public Members + + /// Initializes a new uni-directional pipe stream. + public StmK(KUSB_HANDLE UsbHandle, byte PipeID, int MaxTransferSize, int MaxPendingTransfers, int MaxPendingIO, ref KSTM_CALLBACK Callbacks, KSTM_FLAG Flags) + { + bool success = AllKFunctions.StmK_Init(out mHandleStruct, UsbHandle, PipeID, MaxTransferSize, MaxPendingTransfers, MaxPendingIO, ref Callbacks, Flags); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + } + + /// Calls the dispose method. + public virtual void Free() + { + Dispose(); + } + + /// Gets the handle class structure. + public KSTM_HANDLE Handle + { + get + { + return mHandleStruct; + } + } + + /// Reads data from the stream buffer. + public virtual bool Read(IntPtr Buffer, int Offset, int Length, out int TransferredLength) + { + return AllKFunctions.StmK_Read(mHandleStruct, Buffer, Offset, Length, out TransferredLength); + } + + /// Reads data from the stream buffer. + public virtual bool Read(Array Buffer, int Offset, int Length, out int TransferredLength) + { + return AllKFunctions.StmK_Read(mHandleStruct, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), Offset, Length, out TransferredLength); + } + + /// Starts the internal stream thread. + public virtual bool Start() + { + return AllKFunctions.StmK_Start(mHandleStruct); + } + + /// Stops the internal stream thread. + public virtual bool Stop(int TimeoutCancelMS) + { + return AllKFunctions.StmK_Stop(mHandleStruct, TimeoutCancelMS); + } + + /// Writes data to the stream buffer. + public virtual bool Write(IntPtr Buffer, int Offset, int Length, out int TransferredLength) + { + return AllKFunctions.StmK_Write(mHandleStruct, Buffer, Offset, Length, out TransferredLength); + } + + /// Writes data to the stream buffer. + public virtual bool Write(Array Buffer, int Offset, int Length, out int TransferredLength) + { + return AllKFunctions.StmK_Write(mHandleStruct, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), Offset, Length, out TransferredLength); + } + + #endregion + } + + public class IsoK : IDisposable + { + protected KISO_CONTEXT mHandleStruct; + protected bool mbDisposed; + + protected IsoK() + { + } + + #region IDisposable Members + + /// Explicitly closes and frees the handle. + public virtual void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + ~IsoK() + { + Dispose(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!mbDisposed) + { + if (mHandleStruct.Pointer != IntPtr.Zero) + { + AllKFunctions.IsoK_Free(mHandleStruct); + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing); + } + else + Debug.Print("{0} Dispose: [WARNING] Handle is null", GetType().Name); + + mHandleStruct = new KISO_CONTEXT(IntPtr.Zero); + mbDisposed = true; + } + } + + /// Creates a new isochronous transfer context. + protected bool Init(int NumberOfPackets, int StartFrame) + { + bool success = AllKFunctions.IsoK_Init(out mHandleStruct, NumberOfPackets, StartFrame); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + return true; + } + + #region Nested Structs + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + private struct KISO_CONTEXT_MAP + { + /// Additional ISO transfer flags. See \ref KISO_FLAG. + private readonly KISO_FLAG Flags; + + /// Specifies the frame number that the transfer should begin on (0 for ASAP). + private readonly int StartFrame; + + /// Contains the number of packets that completed with an error condition on return from the host controller driver. + private readonly short ErrorCount; + + /// Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + private readonly short NumberOfPackets; + + /// Contains the URB Hdr.Status value on return from the host controller driver. + private readonly int UrbHdrStatus; + }; + + #endregion + + #region Public Members + + /// Creates a new isochronous transfer context. + public IsoK(int NumberOfPackets, int StartFrame) + { + bool success = AllKFunctions.IsoK_Init(out mHandleStruct, NumberOfPackets, StartFrame); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + } + + /// Convenience function for enumerating ISO packets of an isochronous transfer context. + public virtual bool EnumPackets(KISO_ENUM_PACKETS_CB EnumPackets, int StartPacketIndex, IntPtr UserState) + { + return AllKFunctions.IsoK_EnumPackets(mHandleStruct, EnumPackets, StartPacketIndex, UserState); + } + + /// Contains the number of packets that completed with an error condition on return from the host controller driver. + public short ErrorCount + { + get + { + return Marshal.ReadInt16(mHandleStruct.Pointer, ofsErrorCount); + } + set + { + Marshal.WriteInt16(mHandleStruct.Pointer, ofsErrorCount, value); + } + } + + /// Additional ISO transfer flags. See \ref KISO_FLAG. + public KISO_FLAG Flags + { + get + { + return (KISO_FLAG) Marshal.ReadInt32(mHandleStruct.Pointer, ofsFlags); + } + set + { + Marshal.WriteInt32(mHandleStruct.Pointer, ofsFlags, (int) value); + } + } + + /// Calls the dispose method. + public virtual void Free() + { + Dispose(); + } + + /// Convenience function for getting all fields of a \ref KISO_PACKET. + public virtual bool GetPacket(int PacketIndex, out KISO_PACKET IsoPacket) + { + return AllKFunctions.IsoK_GetPacket(mHandleStruct, PacketIndex, out IsoPacket); + } + + /// Gets the handle class structure. + public KISO_CONTEXT Handle + { + get + { + return mHandleStruct; + } + } + + /// Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + public short NumberOfPackets + { + get + { + return Marshal.ReadInt16(mHandleStruct.Pointer, ofsNumberOfPackets); + } + set + { + Marshal.WriteInt16(mHandleStruct.Pointer, ofsNumberOfPackets, value); + } + } + + /// Convenience function for re-using an isochronous transfer context in a subsequent request. + public virtual bool ReUse() + { + return AllKFunctions.IsoK_ReUse(mHandleStruct); + } + + /// Convenience function for setting all fields of a \ref KISO_PACKET. + public virtual bool SetPacket(int PacketIndex, ref KISO_PACKET IsoPacket) + { + return AllKFunctions.IsoK_SetPacket(mHandleStruct, PacketIndex, ref IsoPacket); + } + + /// Convenience function for setting the offset of all ISO packets of an isochronous transfer context. + public virtual bool SetPackets(int PacketSize) + { + return AllKFunctions.IsoK_SetPackets(mHandleStruct, PacketSize); + } + + /// Specifies the frame number that the transfer should begin on (0 for ASAP). + public int StartFrame + { + get + { + return Marshal.ReadInt32(mHandleStruct.Pointer, ofsStartFrame); + } + set + { + Marshal.WriteInt32(mHandleStruct.Pointer, ofsStartFrame, value); + } + } + + /// Contains the URB Hdr.Status value on return from the host controller driver. + public int UrbHdrStatus + { + get + { + return Marshal.ReadInt32(mHandleStruct.Pointer, ofsUrbHdrStatus); + } + set + { + Marshal.WriteInt32(mHandleStruct.Pointer, ofsUrbHdrStatus, value); + } + } + + #endregion + + #region Private Members + + private static readonly int ofsErrorCount = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "ErrorCount").ToInt32(); + private static readonly int ofsFlags = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "Flags").ToInt32(); + private static readonly int ofsNumberOfPackets = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "NumberOfPackets").ToInt32(); + private static readonly int ofsStartFrame = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "StartFrame").ToInt32(); + private static readonly int ofsUrbHdrStatus = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "UrbHdrStatus").ToInt32(); + + #endregion + } +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/a5/a58a71ed80434868fb8810b5a3027e0bf5223c40.svn-base b/Old Matlab Interface/.svn/pristine/a5/a58a71ed80434868fb8810b5a3027e0bf5223c40.svn-base new file mode 100644 index 00000000..339bc805 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/a5/a58a71ed80434868fb8810b5a3027e0bf5223c40.svn-base @@ -0,0 +1,116 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2011-2012 Travis Robinson +// All rights reserved. +// +// Hot.Plug.Detect.GUI +// +// Last Updated: 03.08.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +using System; +using System.Windows.Forms; +using libusbK; + +namespace Hot.Plug.Detect.GUI +{ + public partial class Form1 : Form + { + private const int WM_USER = 0x400; + + private const int WM_USER_HOT_BASE = WM_USER; + private const int WM_USER_HOT_REMOVAL = WM_USER_HOT_BASE; + private const int WM_USER_HOT_ARRIVAL = WM_USER_HOT_BASE + 1; + private HotK mHotK; + private KHOT_PARAMS mHotParams; + + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + mHotParams.PatternMatch.DeviceInterfaceGUID = "*"; + + // Set the Hwnd handle. + mHotParams.UserHwnd = Handle; + + // Set the base user message. This can be any value greater than or equal to 0x400 + mHotParams.UserMessage = WM_USER_HOT_BASE; + + // After initializing, send plug events for devices that are currently connected. + mHotParams.Flags = KHOT_FLAG.PLUG_ALL_ON_INIT; + + // This will cause HotK to use PostMessage instead of SendMessage. + mHotParams.Flags |= KHOT_FLAG.POST_USER_MESSAGE; + + mHotK = new HotK(ref mHotParams); + } + + private void OnHotPlugInvoked(KHOT_HANDLE hotHandle, KLST_DEVINFO_HANDLE deviceInfo, KLST_SYNC_FLAG plugType) + { + string symbolicLink = deviceInfo.SymbolicLink; + switch (plugType) + { + case KLST_SYNC_FLAG.ADDED: + int iRow = dgvDevices.Rows.Add(new object[] {symbolicLink, deviceInfo.DeviceDesc, deviceInfo.DeviceID}); + dgvDevices.Rows[iRow].Cells[1].ToolTipText = deviceInfo.ToString(); + dgvDevices.Rows[iRow].Cells[2].ToolTipText = deviceInfo.Common.ToString(); + break; + case KLST_SYNC_FLAG.REMOVED: + foreach (DataGridViewRow row in dgvDevices.Rows) + { + if (row.Cells[0].Value as string != symbolicLink) continue; + dgvDevices.Rows.Remove(row); + break; + } + break; + default: + throw new ArgumentOutOfRangeException("plugType"); + } + } + + protected override void WndProc(ref Message m) + { + /* When using the HotK UserHwnd and UserMsg, the add/remove events are seperated into to different messages. + * Removal = UserMsg + 0 + * Arrival = UserMsg + 1 + */ + if (m.Msg == WM_USER_HOT_REMOVAL || m.Msg == WM_USER_HOT_ARRIVAL) + { + KHOT_HANDLE hotHandle = new KHOT_HANDLE(m.WParam); + KLST_DEVINFO_HANDLE deviceInfo = new KLST_DEVINFO_HANDLE(m.LParam); + KLST_SYNC_FLAG plugType = (m.Msg == WM_USER_HOT_REMOVAL) ? KLST_SYNC_FLAG.REMOVED : KLST_SYNC_FLAG.ADDED; + + OnHotPlugInvoked(hotHandle, deviceInfo, plugType); + return; + } + base.WndProc(ref m); + } + + private void Form1_FormClosing(object sender, FormClosingEventArgs e) + { + mHotK.Dispose(); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/a7/a74754103cbbd024e69f4caec56f8ce9481448f8.svn-base b/Old Matlab Interface/.svn/pristine/a7/a74754103cbbd024e69f4caec56f8ce9481448f8.svn-base new file mode 100644 index 00000000..2dbf01c5 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/a7/a74754103cbbd024e69f4caec56f8ce9481448f8.svn-base @@ -0,0 +1,10 @@ +clear all +first_gui_test +pause(0.01) +max_n = 10000; +setscopemode(0,1,1) +setpsu(0,1000) +%tiny_send_waveform(sin(linspace(0,2*pi, 128)),255,120) +%tiny_send_waveform(1:100, 255, 100) +mex_usb_iso_loop +%%plot(saved_waveform) \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/a7/a794081f3fb8dd91b746e26103b6a5d218317d28.svn-base b/Old Matlab Interface/.svn/pristine/a7/a794081f3fb8dd91b746e26103b6a5d218317d28.svn-base new file mode 100644 index 00000000..f301b946 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/a7/a794081f3fb8dd91b746e26103b6a5d218317d28.svn-base @@ -0,0 +1,973 @@ +function varargout = first_gui(varargin) +% FIRST_GUI MATLAB code for first_gui.fig +% FIRST_GUI, by itself, creates a new FIRST_GUI or raises the existing +% singleton*. +% +% H = FIRST_GUI returns the handle to a new FIRST_GUI or the handle to +% the existing singleton*. +% +% FIRST_GUI('CALLBACK',hObject,eventData,handles,...) calls the local +% function named CALLBACK in FIRST_GUI.M with the given input arguments. +% +% FIRST_GUI('Property','Value',...) creates a new FIRST_GUI or raises the +% existing singleton*. Starting from the left, property value pairs are +% applied to the GUI before first_gui_OpeningFcn gets called. An +% unrecognized property name or invalid value makes property application +% stop. All inputs are passed to first_gui_OpeningFcn via varargin. +% +% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one +% instance to run (singleton)". +% +% See also: GUIDE, GUIDATA, GUIHANDLES + +% Edit the above text to modify the response to help first_gui + +% Last Modified by GUIDE v2.5 21-Oct-2015 14:19:57 + +% Begin initialization code - DO NOT EDIT +gui_Singleton = 1; +gui_State = struct('gui_Name', mfilename, ... + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @first_gui_OpeningFcn, ... + 'gui_OutputFcn', @first_gui_OutputFcn, ... + 'gui_LayoutFcn', [] , ... + 'gui_Callback', []); +if nargin && ischar(varargin{1}) + gui_State.gui_Callback = str2func(varargin{1}); +end + +if nargout + [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); +else + gui_mainfcn(gui_State, varargin{:}); +end +% End initialization code - DO NOT EDIT + + +% --- Executes just before first_gui is made visible. +function first_gui_OpeningFcn(hObject, eventdata, handles, varargin) +% This function has no output args, see OutputFcn. +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +% varargin command line arguments to first_gui (see VARARGIN) + +% Choose default command line output for first_gui +handles.output = hObject; + +handles + +global gui_axes +global gui_delay +global text_box_1 +global text_box_2 +global gui_scope_running +global gui_cursor_mode +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global scope_window_min +global gui_awg_waveform +global gui_awg_amplitude +global gui_awg_frequency +global gui_vo +global gui_ro +global gui_static_text_scope +global CH1_AC +global CH2_AC + + +gui_delay = handles.slider6 +gui_axes = handles.axes1; +text_box_1 = handles.edit1; +text_box_2 = handles.text9 +gui_static_text_scope = handles.text10; +gui_scope_running = 1; +gui_cursor_mode = 1; + +gui_vert_cursor_a_pos = 0; +gui_vert_cursor_b_pos = 0; +gui_hori_cursor_a_pos = scope_window_min; +gui_hori_cursor_b_pos = scope_window_min; + +gui_awg_waveform = 'sin(linspace(0,2*pi,128))'; +gui_awg_amplitude = '255'; +gui_awg_frequency = '50' + +gui_vo = 0; +gui_ro = 1000; + +CH1_AC = 0; +CH2_AC = 0; + + +%get(handles.axes1) + +% Update handles structure +guidata(hObject, handles); + +% UIWAIT makes first_gui wait for user response (see UIRESUME) +% uiwait(handles.figure1); + + +% --- Outputs from this function are returned to the command line. +function varargout = first_gui_OutputFcn(hObject, eventdata, handles) +% varargout cell array for returning output args (see VARARGOUT); +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Get default command line output from handles structure +varargout{1} = handles.output; + + + +function edit1_Callback(hObject, eventdata, handles) +% hObject handle to edit1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit1 as text +% str2double(get(hObject,'String')) returns contents of edit1 as a double + + +% --- Executes during object creation, after setting all properties. +function edit1_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit2_Callback(hObject, eventdata, handles) +% hObject handle to edit2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit2 as text +% str2double(get(hObject,'String')) returns contents of edit2 as a double + + +% --- Executes during object creation, after setting all properties. +function edit2_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit3_Callback(hObject, eventdata, handles) +% hObject handle to edit3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit3 as text +% str2double(get(hObject,'String')) returns contents of edit3 as a double + + +% --- Executes during object creation, after setting all properties. +function edit3_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit4_Callback(hObject, eventdata, handles) +% hObject handle to edit4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit4 as text +% str2double(get(hObject,'String')) returns contents of edit4 as a double + + +% --- Executes during object creation, after setting all properties. +function edit4_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider1_Callback(hObject, eventdata, handles) +global scope_window_time +global gui_delay +% hObject handle to slider1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +scope_window_time = 10^(-get(hObject, 'value')) +set(gui_delay, 'SliderStep', [scope_window_time/100, scope_window_time/10]); +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider1_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + + +function edit5_Callback(hObject, eventdata, handles) +% hObject handle to edit5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit5 as text +% str2double(get(hObject,'String')) returns contents of edit5 as a double + + +% --- Executes during object creation, after setting all properties. +function edit5_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton1. +function pushbutton1_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + + +% --- Executes on slider movement. +function slider2_Callback(hObject, eventdata, handles) +% hObject handle to slider2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_hori_cursor_a_pos +global scope_window_max +global scope_window_min +global text_box_2 +global gui_cursor_mode + +gui_hori_cursor_a_pos = scope_window_min + (scope_window_max - scope_window_min) * get(hObject,'Value'); + +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider2_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on selection change in popupmenu1. +function popupmenu1_Callback(hObject, eventdata, handles) +% hObject handle to popupmenu1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_cursor_mode +gui_cursor_mode = get(hObject,'Value') + +% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array +% contents{get(hObject,'Value')} returns selected item from popupmenu1 + + +% --- Executes during object creation, after setting all properties. +function popupmenu1_CreateFcn(hObject, eventdata, handles) +% hObject handle to popupmenu1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: popupmenu controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider3_Callback(hObject, eventdata, handles) +% hObject handle to slider3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_hori_cursor_b_pos +global scope_window_max +global scope_window_min +global text_box_2 +global gui_cursor_mode + +gui_hori_cursor_b_pos = scope_window_min + (scope_window_max - scope_window_min) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider3_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + + +function edit6_Callback(hObject, eventdata, handles) +% hObject handle to edit6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_waveform +gui_awg_waveform = get(hObject,'String'); + + +% Hints: get(hObject,'String') returns contents of edit6 as text +% str2double(get(hObject,'String')) returns contents of edit6 as a double + + +% --- Executes during object creation, after setting all properties. +function edit6_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton3. +function pushbutton3_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_awg_waveform +global gui_awg_amplitude +global gui_awg_frequency +gui_awg_waveform +gui_awg_amplitude +gui_awg_frequency +tiny_send_waveform(eval(gui_awg_waveform), str2num(gui_awg_amplitude), str2num(gui_awg_frequency)); + + +function edit7_Callback(hObject, eventdata, handles) +% hObject handle to edit7 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_amplitude +gui_awg_amplitude = get(hObject,'String'); + +% Hints: get(hObject,'String') returns contents of edit7 as text +% str2double(get(hObject,'String')) returns contents of edit7 as a double + + +% --- Executes during object creation, after setting all properties. +function edit7_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit7 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit8_Callback(hObject, eventdata, handles) +% hObject handle to edit8 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_frequency +gui_awg_frequency = get(hObject,'String'); +% Hints: get(hObject,'String') returns contents of edit8 as text +% str2double(get(hObject,'String')) returns contents of edit8 as a double + + +% --- Executes during object creation, after setting all properties. +function edit8_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit8 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. + +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton4. +function pushbutton4_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_scope_running +gui_scope_running = ~gui_scope_running + + + +function edit9_Callback(hObject, eventdata, handles) +% hObject handle to edit9 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vo; +gui_vo = str2num(get(hObject, 'String')); + +% Hints: get(hObject,'String') returns contents of edit9 as text +% str2double(get(hObject,'String')) returns contents of edit9 as a double + + +% --- Executes during object creation, after setting all properties. +function edit9_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit9 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit10_Callback(hObject, eventdata, handles) +% hObject handle to edit10 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_ro; +gui_ro = str2num(get(hObject, 'String')); +% Hints: get(hObject,'String') returns contents of edit10 as text +% str2double(get(hObject,'String')) returns contents of edit10 as a double + + +% --- Executes during object creation, after setting all properties. +function edit10_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit10 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton5. +function pushbutton5_Callback(hObject, eventdata, handles) +global gui_vo +global gui_ro +setpsu_boost(gui_vo, 5, gui_ro); +% hObject handle to pushbutton5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + + +% --- Executes on slider movement. +function slider4_Callback(hObject, eventdata, handles) +% hObject handle to slider4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vert_cursor_a_pos +global scope_window_time +global text_box_2 +global gui_cursor_mode + +gui_vert_cursor_a_pos = -scope_window_time + (scope_window_time) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider4_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on slider movement. +function slider5_Callback(hObject, eventdata, handles) +% hObject handle to slider5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vert_cursor_b_pos +global scope_window_time +global text_box_2 +global gui_cursor_mode +gui_vert_cursor_b_pos = -scope_window_time + (scope_window_time) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos)) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %3.3e\n T2 = %3.3e\n DeltaT = %3.3e\n \n V1 = %3.3e\n V2 = %3.3e\n DeltaV = %3.3e\n', gui_vert_cursor_a_pos, gui_vert_cursor_b_pos, gui_vert_cursor_a_pos - gui_vert_cursor_b_pos, gui_hori_cursor_a_pos, gui_hori_cursor_b_pos, gui_hori_cursor_a_pos - gui_hori_cursor_b_pos)) + otherwise error('Gui_cursor_mode is invalid') +end + + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider5_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on selection change in popupmenu2. +function popupmenu2_Callback(hObject, eventdata, handles) +% hObject handle to popupmenu2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global scope_mode +global scope_gain_0 +global scope_gain_1 +global refreshrate +global refreshrate_temp +global waveform_exists +global saved_waveform_ch1 +global saved_waveform_ch2 +global gui_delay + +refreshrate_temp = refreshrate; +waveform_exists = 0 + +contents = cellstr(get(hObject,'String')); +tempstring = contents{get(hObject,'Value')}; + +mode = str2num(tempstring(6)); +setscopemode(mode, scope_gain_0, scope_gain_1) + +saved_waveform_ch1 = []; +saved_waveform_ch2 = []; +set(gui_delay, 'Value', get(gui_delay, 'Max')) + +% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu2 contents as cell array +% contents{get(hObject,'Value')} returns selected item from popupmenu2 + + +% --- Executes during object creation, after setting all properties. +function popupmenu2_CreateFcn(hObject, eventdata, handles) +% hObject handle to popupmenu2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: popupmenu controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider6_Callback(hObject, eventdata, handles) +% hObject handle to slider6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider6_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end +set(hObject,'Value', 1); + + + +function edit11_Callback(hObject, eventdata, handles) +% hObject handle to edit11 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_delay + +boxvar = str2num(get(hObject,'String')); +if boxvar +// All rights reserved. +// +// AssemblyInfo.cs +// +// Created: 03.02.2012 +// Last Updated: 03.03.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.Reflection; +using System.Runtime.InteropServices; + + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyTitle("Handle.Test")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Handle.Test")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("88461b6f-5eb8-47ed-b3f1-0105e1c85f86")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/ae/ae0f25c36f3df7432704d2bf7e1dbe0d0273513e.svn-base b/Old Matlab Interface/.svn/pristine/ae/ae0f25c36f3df7432704d2bf7e1dbe0d0273513e.svn-base new file mode 100644 index 00000000..f9649c33 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/ae/ae0f25c36f3df7432704d2bf7e1dbe0d0273513e.svn-base @@ -0,0 +1,19 @@ +global num_lc +global gui_static_text_scope +global saved_waveform_ch1 +global saved_waveform_ch2 +global usb_handle +global gui_delay + +num_lc = num_lc + 1; +max_n = 100000000; +%USB_POOL_FREE(ovlPool, ovlkHandle_0, ovlkHandle_1, usb_handle); //It +%crashes when I clear the handles. No idea why, but it's fine when I don't +clear usb_handle +set(gui_static_text_scope, 'String', sprintf('THE SCOPE (Reconnected %d times)', num_lc)); +saved_waveform_ch1 = [] +saved_waveform_ch2 = [] +set(gui_delay, 'Value', get(gui_delay, 'Max')); + +mex_usb_iso_loop + diff --git a/Old Matlab Interface/.svn/pristine/b1/b1a26ccf1a429fc72cfff9a3b4419a4c5886270d.svn-base b/Old Matlab Interface/.svn/pristine/b1/b1a26ccf1a429fc72cfff9a3b4419a4c5886270d.svn-base new file mode 100644 index 00000000..f4ee05df --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/b1/b1a26ccf1a429fc72cfff9a3b4419a4c5886270d.svn-base @@ -0,0 +1,116 @@ +%mex USB_ISO_LOOP.c -Iincludes -llibusbK -Lbin\lib\amd64 +%clear all + +global usb_handle +global scope_gain +global scope_window_time +global scope_window_max +global scope_window_min +global scope_mode +global gui_scope_running + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global gui_cursor_mode + +dotheplot + +if ~length(usb_handle) + warning('USB Handle not initialised. Initialising!') + mex_usb_init('03eb', 'a000') +end + +[isoCtx_0, isoCtx_1, ovlkHandle_0, ovlkHandle_1, ovlPool, isoBuffer] = USB_ISO_INIT(usb_handle) + +refreshrate = 4; +refreshrate_temp = refreshrate; + +if(isempty(max_n)) + max_n = 10 +end +saved_waveform = int8([]); + +if isempty(scope_mode) + error('You didn''t set the scope mode!'); +end + +if isempty(scope_window_time) + error('You didn''t set the window time (x) value!'); +end + +if (scope_window_time < 1/375000) + error('Scope window size is too small!'); +end + +if(scope_mode==0) + if isempty(scope_gain) + error('You didn''t set the gain!'); + end + + if isempty(scope_window_min) + error('You didn''t set the minimum window voltage value!'); + end + + if isempty(scope_window_max) + error('You didn''t set the maximum window voltage value!'); + end +end + +dropped_packets = 0; +waveform_exists = 0; + +for n=1:max_n + %[transfer_contents_0] = USB_ISO_LOOP(usb_handle, isoCtx_0, ovlkHandle_0, ovlPool, isoBuffer, uint8(0)); + [transfer_contents_0, libk_error] = USB_ISO_LOOP(usb_handle, isoCtx_0, ovlkHandle_0, ovlPool, isoBuffer, uint8(0)); + keep_in_sync + saved_waveform = [saved_waveform transfer_contents_0]; + if(gui_scope_running) + updatescopeaxes + else + switch(gui_cursor_mode) + case 1 + plot(gui_axes, taxis, cool_waveform, 'y'); + case 2 + plot(gui_axes, taxis, cool_waveform, 'y', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + case 3 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:'); + case 4 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + + otherwise + error('Gui_axes is in an invalid state'); + end + set(gui_axes, 'Ylim', [scope_window_min, scope_window_max], 'Xlim', [-scope_window_time, 0], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + drawnow + end + + %[transfer_contents_1] = USB_ISO_LOOP(usb_handle, isoCtx_1, ovlkHandle_1, ovlPool, isoBuffer, uint8(1)); + [transfer_contents_1, libk_error] = USB_ISO_LOOP(usb_handle, isoCtx_1, ovlkHandle_1, ovlPool, isoBuffer, uint8(1)); + keep_in_sync + saved_waveform = [saved_waveform transfer_contents_1]; + if(gui_scope_running) + updatescopeaxes + else + switch(gui_cursor_mode) + case 1 + plot(gui_axes, taxis, cool_waveform, 'y'); + case 2 + plot(gui_axes, taxis, cool_waveform, 'y', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + case 3 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:'); + case 4 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + + otherwise + error('Gui_axes is in an invalid state'); + end + set(gui_axes, 'Ylim', [scope_window_min, scope_window_max], 'Xlim', [-scope_window_time, 0], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + drawnow + end +end + +clear all +max_n = 2000 +mex_usb_iso_loop \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/b4/b44f8b25b8edf496c954c87abf9e73f992c0b26d.svn-base b/Old Matlab Interface/.svn/pristine/b4/b44f8b25b8edf496c954c87abf9e73f992c0b26d.svn-base new file mode 100644 index 00000000..01b9ce83 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/b4/b44f8b25b8edf496c954c87abf9e73f992c0b26d.svn-base @@ -0,0 +1,11250 @@ +182 +182 +182 +182 +182 +183 +183 +182 +183 +183 +183 +182 +182 +183 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +181 +12 +11 +10 +11 +11 +11 +10 +182 +182 +183 +183 +182 +183 +182 +182 +182 +182 +183 +182 +182 +182 +181 +182 +183 +182 +183 +183 +182 +182 +182 +182 +182 +10 +9 +10 +11 +11 +11 +12 +182 +182 +182 +182 +182 +182 +182 +182 +182 +185 +183 +182 +183 +183 +180 +182 +179 +181 +181 +183 +183 +182 +182 +182 +182 +181 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +184 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +12 +10 +10 +11 +11 +11 +10 +182 +182 +182 +182 +183 +182 +183 +182 +182 +183 +182 +182 +182 +182 +182 +179 +182 +182 +182 +182 +182 +182 +182 +182 +182 +12 +11 +11 +11 +11 +10 +11 +182 +182 +182 +181 +182 +182 +180 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +183 +13 +11 +10 +11 +11 +11 +11 +182 +182 +182 +182 +182 +182 +182 +183 +181 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +182 +12 +11 +11 +11 +11 +10 +10 +182 +182 +182 +182 +182 +182 +182 +184 +183 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +181 +182 +182 +11 +11 +11 +11 +11 +10 +11 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +182 +181 +182 +183 +182 +182 +182 +11 +11 +11 +11 +10 +11 +11 +183 +182 +182 +183 +182 +183 +182 +176 +182 +183 +182 +182 +183 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +12 +11 +11 +11 +11 +10 +11 +182 +183 +182 +182 +183 +182 +182 +182 +182 +184 +182 +182 +182 +182 +184 +183 +182 +183 +182 +184 +182 +182 +182 +182 +185 +12 +11 +11 +11 +13 +10 +11 +182 +182 +180 +182 +182 +182 +182 +180 +182 +182 +183 +180 +179 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +182 +12 +11 +11 +11 +11 +10 +10 +183 +182 +12 +8 +11 +11 +11 +11 +11 +182 +182 +182 +182 +182 +182 +182 +183 +183 +183 +182 +182 +182 +184 +183 +182 +182 +182 +181 +183 +182 +182 +182 +183 +182 +12 +11 +11 +6 +11 +11 +11 +182 +181 +182 +182 +183 +182 +183 +182 +182 +182 +182 +181 +182 +182 +182 +183 +181 +182 +182 +183 +182 +183 +182 +182 +182 +12 +11 +10 +9 +11 +10 +10 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +181 +183 +182 +183 +183 +13 +11 +11 +11 +10 +11 +11 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +183 +182 +183 +183 +182 +180 +182 +182 +182 +182 +183 +182 +12 +10 +10 +11 +11 +11 +10 +182 +182 +182 +182 +183 +183 +182 +182 +182 +181 +182 +182 +183 +182 +183 +183 +182 +182 +184 +182 +183 +183 +181 +182 +182 +12 +10 +10 +10 +11 +10 +10 +181 +182 +182 +182 +172 +182 +183 +182 +182 +182 +182 +182 +185 +182 +182 +183 +182 +182 +182 +183 +182 +182 +182 +182 +182 +12 +11 +11 +11 +12 +10 +10 +182 +182 +182 +182 +182 +182 +182 +183 +181 +182 +182 +182 +182 +182 +182 +183 +182 +183 +182 +183 +183 +183 +182 +182 +182 +12 +11 +10 +12 +11 +10 +11 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +183 +182 +183 +182 +183 +182 +182 +182 +12 +11 +11 +12 +10 +11 +11 +182 +182 +183 +182 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +12 +11 +11 +11 +10 +10 +10 +183 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +182 +182 +182 +180 +183 +182 +182 +182 +188 +183 +182 +182 +12 +12 +11 +11 +11 +11 +8 +182 +182 +182 +182 +183 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +179 +183 +12 +11 +11 +10 +10 +10 +10 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +183 +183 +182 +182 +181 +182 +182 +182 +183 +183 +182 +182 +184 +183 +184 +11 +11 +9 +9 +9 +12 +11 +182 +183 +183 +180 +182 +182 +183 +181 +183 +182 +181 +182 +183 +183 +182 +181 +182 +182 +181 +181 +182 +182 +183 +183 +182 +12 +11 +10 +11 +10 +10 +5 +183 +183 +184 +181 +183 +182 +181 +182 +181 +182 +183 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +181 +183 +11 +11 +10 +11 +12 +11 +9 +180 +181 +180 +183 +183 +182 +182 +183 +183 +182 +182 +181 +182 +181 +182 +182 +12 +10 +11 +11 +11 +11 +11 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +183 +183 +182 +183 +182 +182 +181 +182 +182 +182 +182 +182 +182 +181 +183 +11 +10 +11 +11 +10 +9 +10 +183 +183 +183 +183 +182 +182 +182 +182 +181 +182 +182 +182 +182 +183 +181 +183 +182 +182 +182 +182 +182 +182 +181 +182 +182 +12 +10 +11 +10 +11 +11 +10 +182 +182 +181 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +12 +11 +11 +11 +10 +11 +11 +182 +182 +183 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +181 +183 +180 +183 +182 +182 +183 +182 +11 +11 +10 +11 +11 +11 +11 +182 +182 +182 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +182 +12 +10 +10 +11 +11 +11 +10 +182 +182 +183 +181 +183 +182 +183 +182 +184 +182 +182 +183 +183 +180 +182 +182 +182 +183 +182 +182 +182 +183 +182 +186 +182 +12 +12 +10 +12 +11 +11 +11 +182 +188 +181 +183 +182 +182 +179 +182 +183 +183 +182 +189 +182 +182 +182 +182 +181 +182 +183 +182 +183 +183 +181 +180 +182 +10 +9 +10 +11 +11 +11 +9 +182 +181 +181 +183 +181 +183 +183 +182 +183 +181 +182 +182 +181 +182 +183 +183 +184 +182 +182 +182 +181 +182 +181 +182 +182 +12 +11 +11 +10 +10 +10 +10 +182 +183 +183 +180 +182 +182 +180 +181 +182 +182 +183 +183 +182 +182 +183 +183 +183 +183 +182 +182 +182 +182 +181 +181 +183 +181 +182 +181 +183 +182 +183 +182 +182 +182 +11 +10 +11 +11 +11 +10 +11 +182 +184 +183 +184 +182 +183 +181 +183 +183 +180 +182 +181 +182 +182 +182 +182 +180 +180 +182 +181 +182 +181 +182 +183 +184 +13 +11 +10 +10 +10 +10 +10 +181 +183 +182 +186 +184 +183 +181 +183 +182 +182 +182 +182 +182 +182 +183 +179 +182 +182 +183 +182 +182 +182 +182 +183 +182 +10 +10 +11 +11 +183 +182 +182 +182 +180 +181 +183 +182 +182 +183 +182 +182 +182 +181 +182 +185 +183 +183 +182 +12 +10 +10 +10 +9 +11 +11 +183 +183 +182 +183 +182 +182 +180 +182 +182 +183 +182 +180 +182 +181 +181 +184 +182 +183 +183 +181 +182 +183 +181 +184 +183 +12 +14 +10 +12 +9 +9 +11 +183 +183 +183 +181 +183 +181 +181 +183 +182 +183 +183 +181 +181 +181 +182 +182 +183 +183 +182 +182 +182 +182 +183 +181 +182 +12 +12 +12 +12 +11 +11 +10 +181 +182 +183 +183 +184 +182 +182 +181 +182 +181 +183 +183 +182 +182 +178 +182 +183 +182 +180 +181 +181 +182 +183 +182 +184 +13 +9 +10 +10 +13 +12 +12 +182 +182 +183 +182 +183 +182 +181 +183 +182 +182 +183 +182 +183 +182 +182 +183 +183 +182 +181 +182 +181 +182 +182 +185 +183 +14 +10 +11 +9 +9 +10 +10 +183 +183 +183 +183 +182 +183 +182 +182 +183 +182 +182 +181 +181 +182 +183 +182 +182 +182 +182 +183 +181 +182 +183 +183 +181 +12 +11 +10 +11 +11 +10 +10 +183 +182 +181 +183 +182 +183 +183 +183 +183 +184 +182 +182 +182 +182 +182 +181 +183 +183 +182 +183 +182 +183 +182 +182 +182 +13 +10 +11 +11 +11 +11 +10 +182 +182 +182 +183 +184 +183 +184 +182 +185 +183 +182 +182 +181 +182 +181 +182 +183 +182 +181 +182 +183 +183 +183 +182 +182 +11 +11 +11 +10 +8 +8 +10 +182 +182 +183 +183 +183 +182 +182 +182 +182 +182 +182 +181 +182 +185 +182 +182 +182 +182 +182 +182 +184 +182 +182 +182 +182 +13 +10 +11 +12 +10 +10 +11 +181 +182 +182 +183 +183 +11 +12 +10 +11 +183 +182 +182 +182 +182 +183 +183 +183 +183 +182 +182 +183 +183 +182 +182 +182 +181 +181 +182 +182 +181 +184 +182 +182 +182 +12 +11 +11 +11 +11 +11 +10 +182 +181 +182 +184 +183 +182 +181 +182 +183 +183 +183 +184 +182 +182 +182 +182 +182 +183 +182 +183 +183 +183 +182 +182 +183 +13 +11 +11 +11 +10 +10 +11 +183 +182 +181 +182 +182 +181 +182 +182 +182 +182 +183 +183 +183 +182 +182 +182 +183 +183 +181 +182 +181 +11 +10 +180 +181 +182 +181 +183 +182 +182 +182 +182 +183 +182 +182 +182 +181 +182 +182 +180 +180 +182 +181 +182 +182 +183 +182 +182 +12 +10 +11 +10 +10 +11 +11 +182 +183 +183 +182 +183 +181 +183 +182 +181 +182 +181 +181 +183 +182 +182 +182 +182 +182 +182 +183 +183 +183 +182 +183 +181 +10 +11 +9 +11 +10 +10 +10 +183 +182 +182 +183 +183 +182 +182 +181 +182 +183 +182 +182 +181 +183 +182 +181 +182 +182 +182 +182 +183 +185 +184 +183 +184 +9 +11 +9 +10 +10 +11 +10 +182 +182 +182 +182 +183 +182 +183 +182 +182 +183 +184 +182 +182 +183 +181 +181 +182 +181 +181 +182 +182 +183 +182 +182 +182 +12 +10 +7 +10 +8 +10 +10 +181 +181 +182 +182 +180 +183 +183 +183 +183 +182 +182 +182 +181 +180 +182 +182 +182 +184 +182 +183 +182 +183 +182 +183 +183 +12 +11 +7 +9 +10 +10 +8 +181 +182 +182 +183 +184 +186 +182 +181 +179 +182 +186 +182 +182 +183 +182 +186 +182 +182 +182 +182 +185 +181 +182 +183 +184 +12 +11 +12 +10 +10 +9 +11 +182 +182 +181 +181 +181 +182 +181 +182 +182 +182 +184 +183 +182 +182 +183 +182 +182 +182 +178 +183 +181 +182 +182 +182 +182 +12 +11 +11 +11 +11 +10 +11 +182 +183 +181 +183 +182 +182 +181 +181 +183 +181 +183 +182 +183 +183 +182 +182 +182 +182 +184 +183 +183 +182 +182 +182 +181 +12 +10 +11 +11 +11 +12 +10 +183 +182 +182 +182 +182 +182 +182 +182 +185 +183 +181 +182 +182 +182 +181 +182 +183 +184 +183 +184 +182 +183 +182 +182 +182 +11 +10 +10 +186 +182 +182 +183 +182 +182 +12 +10 +10 +11 +11 +11 +11 +182 +181 +181 +183 +184 +182 +182 +183 +182 +183 +183 +178 +182 +181 +182 +182 +186 +183 +184 +182 +182 +182 +186 +182 +182 +11 +12 +12 +10 +10 +10 +11 +183 +184 +182 +181 +183 +182 +183 +183 +182 +181 +181 +183 +182 +181 +182 +183 +183 +182 +180 +182 +182 +182 +183 +181 +182 +11 +10 +11 +11 +11 +8 +10 +182 +182 +183 +183 +182 +181 +183 +183 +182 +182 +182 +181 +182 +184 +183 +182 +11 +10 +11 +11 +12 +11 +11 +182 +181 +183 +182 +183 +181 +182 +182 +181 +183 +184 +181 +182 +182 +180 +182 +183 +183 +183 +181 +183 +182 +182 +181 +183 +11 +11 +12 +12 +10 +9 +10 +181 +183 +183 +181 +180 +182 +182 +184 +183 +182 +182 +182 +183 +183 +182 +181 +182 +182 +181 +181 +182 +183 +184 +182 +185 +11 +10 +10 +11 +11 +10 +11 +182 +182 +182 +182 +182 +183 +182 +182 +182 +184 +182 +183 +182 +181 +183 +182 +182 +183 +186 +181 +182 +181 +182 +183 +181 +11 +9 +12 +11 +11 +11 +7 +182 +182 +181 +183 +181 +181 +182 +183 +182 +180 +183 +182 +183 +183 +182 +182 +182 +182 +182 +183 +182 +183 +182 +182 +182 +10 +10 +11 +12 +11 +11 +11 +182 +181 +183 +182 +182 +181 +181 +182 +183 +183 +183 +183 +182 +182 +182 +183 +183 +181 +182 +182 +182 +183 +182 +181 +183 +11 +11 +11 +9 +11 +9 +11 +182 +181 +182 +182 +182 +182 +182 +183 +181 +183 +183 +182 +183 +181 +182 +182 +183 +183 +182 +183 +181 +184 +183 +184 +182 +11 +11 +11 +11 +12 +11 +11 +181 +182 +182 +182 +182 +183 +183 +182 +182 +183 +181 +181 +183 +182 +182 +182 +182 +181 +183 +180 +180 +182 +182 +183 +182 +13 +10 +11 +11 +10 +11 +9 +183 +182 +181 +183 +182 +183 +182 +181 +182 +182 +184 +183 +182 +182 +182 +182 +183 +183 +182 +182 +181 +183 +183 +184 +182 +12 +10 +11 +12 +11 +11 +10 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +180 +182 +182 +183 +182 +182 +182 +183 +183 +181 +182 +183 +184 +182 +183 +182 +181 +183 +184 +182 +182 +182 +181 +183 +13 +9 +8 +11 +11 +11 +11 +184 +184 +182 +183 +183 +182 +182 +182 +183 +183 +182 +182 +181 +184 +182 +182 +181 +182 +182 +183 +184 +182 +182 +182 +182 +12 +11 +11 +9 +10 +10 +11 +183 +183 +182 +181 +183 +183 +182 +182 +182 +183 +182 +181 +183 +182 +182 +182 +183 +182 +182 +182 +183 +181 +182 +182 +182 +12 +10 +10 +10 +12 +10 +12 +182 +181 +182 +179 +181 +182 +181 +182 +181 +183 +182 +184 +183 +184 +181 +177 +12 +11 +11 +10 +11 +11 +11 +182 +182 +182 +183 +182 +182 +183 +182 +182 +182 +183 +182 +182 +182 +182 +182 +183 +182 +184 +182 +182 +182 +182 +182 +182 +11 +10 +11 +11 +15 +10 +10 +182 +182 +183 +183 +183 +181 +182 +182 +183 +182 +180 +180 +182 +183 +183 +183 +183 +181 +183 +182 +182 +181 +182 +185 +182 +12 +10 +11 +11 +10 +10 +9 +181 +183 +182 +182 +182 +183 +182 +183 +183 +183 +181 +181 +182 +182 +183 +182 +182 +182 +182 +183 +182 +181 +183 +183 +182 +12 +11 +10 +15 +11 +12 +11 +182 +182 +183 +180 +181 +182 +183 +183 +182 +182 +181 +182 +183 +184 +182 +183 +181 +182 +182 +183 +183 +183 +185 +182 +183 +12 +9 +11 +11 +11 +11 +9 +181 +183 +182 +183 +182 +182 +182 +184 +182 +184 +182 +181 +182 +182 +181 +182 +182 +182 +184 +182 +183 +182 +182 +182 +181 +12 +11 +10 +10 +11 +12 +11 +183 +180 +184 +184 +180 +182 +182 +183 +182 +181 +182 +183 +183 +182 +182 +181 +183 +183 +184 +182 +181 +183 +182 +183 +183 +11 +9 +11 +11 +11 +10 +9 +182 +183 +183 +182 +182 +182 +182 +182 +183 +182 +180 +182 +182 +183 +183 +182 +181 +182 +182 +183 +182 +183 +182 +182 +182 +10 +10 +11 +12 +11 +10 +10 +182 +183 +185 +182 +182 +181 +181 +182 +183 +181 +181 +182 +183 +182 +183 +182 +182 +183 +182 +180 +182 +182 +182 +182 +182 +11 +11 +9 +11 +11 +11 +10 +182 +184 +184 +182 +183 +182 +182 +182 +182 +182 +184 +181 +182 +182 +182 +182 +182 +180 +183 +182 +183 +183 +181 +182 +182 +183 +183 +184 +182 +182 +183 +182 +182 +181 +12 +11 +11 +12 +11 +10 +10 +183 +183 +181 +180 +182 +184 +182 +182 +182 +182 +182 +182 +182 +181 +182 +183 +183 +179 +181 +182 +182 +182 +182 +182 +181 +11 +11 +11 +11 +9 +10 +11 +184 +185 +182 +182 +183 +183 +182 +183 +183 +183 +182 +182 +181 +181 +181 +182 +182 +182 +179 +182 +183 +181 +182 +183 +181 +183 +183 +183 +182 +182 +183 +182 +182 +181 +181 +183 +181 +181 +180 +184 +181 +180 +182 +183 +185 +181 +182 +182 +14 +12 +12 +10 +11 +11 +11 +182 +183 +182 +183 +182 +183 +184 +182 +181 +181 +182 +184 +183 +182 +181 +182 +184 +183 +183 +182 +179 +182 +182 +182 +181 +10 +12 +11 +10 +10 +10 +8 +182 +183 +182 +181 +182 +181 +181 +182 +182 +184 +183 +181 +182 +181 +183 +182 +180 +182 +183 +183 +182 +182 +181 +182 +183 +12 +10 +9 +11 +10 +11 +11 +181 +181 +183 +184 +182 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +183 +184 +182 +181 +182 +181 +182 +182 +180 +180 +12 +11 +11 +10 +10 +11 +10 +182 +183 +182 +182 +182 +182 +183 +183 +182 +182 +181 +184 +184 +183 +183 +181 +181 +182 +183 +182 +183 +182 +182 +182 +182 +10 +10 +11 +11 +11 +10 +11 +182 +182 +184 +183 +183 +181 +182 +181 +182 +183 +181 +182 +181 +183 +182 +182 +183 +182 +182 +183 +182 +183 +183 +182 +181 +12 +11 +13 +11 +12 +10 +9 +182 +181 +182 +182 +181 +182 +182 +182 +182 +182 +182 +177 +184 +182 +181 +183 +182 +183 +183 +181 +181 +183 +182 +183 +181 +12 +11 +11 +11 +9 +11 +11 +182 +182 +182 +182 +182 +183 +182 +182 +182 +182 +182 +183 +183 +183 +185 +182 +182 +182 +183 +183 +183 +183 +183 +182 +181 +11 +10 +11 +11 +12 +10 +10 +182 +184 +183 +182 +182 +182 +183 +182 +182 +182 +181 +182 +182 +181 +182 +183 +182 +182 +182 +182 +182 +183 +183 +182 +182 +11 +12 +11 +10 +10 +10 +11 +182 +183 +13 +11 +11 +10 +10 +12 +12 +182 +184 +182 +181 +182 +182 +182 +182 +181 +184 +184 +182 +184 +182 +183 +183 +183 +182 +182 +183 +181 +182 +182 +181 +183 +11 +9 +11 +11 +10 +11 +10 +182 +183 +182 +182 +181 +181 +183 +183 +182 +182 +181 +182 +183 +183 +182 +181 +182 +183 +184 +182 +182 +183 +182 +182 +183 +12 +11 +12 +10 +11 +7 +10 +182 +181 +182 +180 +182 +183 +181 +181 +183 +183 +181 +182 +182 +182 +181 +182 +12 +11 +10 +9 +10 +10 +12 +181 +182 +181 +182 +183 +181 +182 +182 +183 +182 +181 +182 +183 +183 +185 +181 +182 +182 +183 +183 +182 +182 +183 +182 +182 +11 +10 +10 +12 +10 +11 +11 +183 +182 +184 +185 +181 +181 +182 +183 +181 +181 +182 +182 +181 +182 +183 +182 +181 +183 +182 +181 +180 +181 +182 +183 +180 +12 +11 +9 +9 +11 +12 +10 +181 +183 +182 +182 +183 +183 +182 +182 +182 +183 +181 +182 +182 +183 +181 +183 +187 +183 +182 +182 +182 +183 +184 +182 +184 +11 +10 +11 +12 +11 +11 +10 +182 +182 +182 +182 +183 +182 +183 +182 +180 +183 +183 +182 +181 +182 +182 +184 +182 +184 +182 +181 +182 +182 +182 +182 +181 +12 +12 +12 +11 +11 +11 +11 +181 +183 +183 +183 +182 +181 +182 +182 +183 +183 +182 +182 +183 +183 +181 +181 +182 +182 +183 +181 +181 +182 +182 +182 +181 +12 +10 +11 +10 +11 +11 +10 +182 +181 +182 +182 +182 +182 +183 +184 +182 +182 +182 +182 +182 +182 +182 +182 +181 +183 +183 +181 +181 +182 +183 +182 +181 +12 +9 +11 +12 +10 +10 +8 +182 +183 +183 +183 +181 +183 +182 +182 +182 +183 +184 +183 +182 +182 +183 +183 +182 +183 +182 +182 +182 +182 +183 +182 +181 +12 +11 +11 +11 +11 +11 +10 +182 +182 +181 +181 +183 +177 +181 +182 +181 +184 +182 +182 +181 +183 +183 +184 +184 +181 +181 +182 +182 +182 +182 +182 +184 +11 +10 +10 +10 +11 +15 +10 +182 +183 +183 +182 +182 +183 +182 +183 +182 +181 +183 +181 +182 +183 +182 +182 +182 +182 +180 +183 +183 +181 +180 +182 +182 +183 +181 +182 +182 +183 +184 +182 +181 +182 +11 +12 +11 +11 +10 +11 +12 +183 +181 +181 +182 +182 +182 +182 +182 +182 +182 +182 +184 +182 +181 +182 +182 +182 +183 +181 +182 +183 +186 +183 +182 +182 +11 +11 +11 +10 +10 +11 +11 +181 +183 +183 +182 +182 +182 +182 +182 +183 +181 +180 +183 +182 +184 +182 +182 +181 +182 +183 +181 +183 +182 +183 +180 +183 +12 +10 +10 +11 +12 +10 +10 +181 +182 +183 +184 +183 +181 +182 +183 +182 +181 +182 +182 +181 +182 +179 +180 +12 +11 +11 +10 +11 +10 +13 +182 +181 +181 +181 +181 +182 +182 +182 +182 +182 +183 +181 +182 +182 +179 +182 +182 +183 +184 +180 +181 +182 +183 +182 +184 +11 +10 +10 +10 +10 +10 +10 +182 +182 +182 +182 +182 +183 +182 +180 +182 +183 +182 +181 +181 +181 +181 +183 +183 +181 +182 +182 +182 +181 +181 +182 +181 +10 +10 +10 +9 +11 +10 +10 +182 +182 +182 +181 +183 +184 +182 +182 +184 +183 +182 +180 +182 +182 +182 +183 +184 +182 +181 +183 +185 +183 +183 +182 +184 +12 +10 +11 +11 +11 +11 +11 +181 +182 +183 +182 +183 +182 +183 +181 +183 +182 +183 +182 +182 +182 +182 +182 +181 +182 +183 +183 +183 +182 +181 +182 +181 +13 +12 +8 +10 +10 +11 +10 +183 +184 +182 +183 +182 +182 +183 +183 +182 +182 +181 +181 +183 +183 +182 +181 +182 +182 +183 +183 +182 +182 +183 +182 +182 +12 +11 +11 +11 +10 +11 +10 +181 +182 +182 +181 +182 +186 +183 +183 +181 +181 +183 +183 +182 +182 +182 +181 +182 +182 +182 +183 +184 +183 +182 +177 +181 +13 +11 +10 +10 +10 +11 +11 +182 +182 +181 +182 +183 +182 +183 +182 +182 +182 +182 +180 +182 +182 +182 +181 +183 +182 +183 +184 +182 +179 +182 +182 +185 +11 +12 +10 +11 +10 +11 +10 +182 +181 +182 +182 +182 +182 +183 +183 +182 +182 +183 +182 +183 +183 +182 +181 +183 +183 +182 +180 +182 +183 +182 +183 +182 +13 +11 +10 +11 +10 +11 +11 +181 +181 +183 +184 +182 +182 +183 +183 +184 +183 +182 +182 +182 +182 +182 +182 +182 +181 +183 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +184 +182 +183 +181 +182 +12 +12 +10 +10 +10 +10 +12 +182 +183 +183 +184 +185 +182 +182 +182 +179 +182 +182 +181 +182 +181 +182 +182 +184 +182 +184 +181 +181 +182 +181 +182 +184 +12 +10 +11 +11 +11 +11 +11 +182 +182 +182 +183 +181 +181 +183 +183 +181 +182 +182 +182 +182 +182 +176 +181 +182 +182 +184 +182 +182 +181 +182 +182 +182 +11 +9 +10 +181 +182 +183 +182 +183 +181 +182 +183 +182 +182 +183 +183 +188 +183 +182 +181 +183 +186 +182 +183 +12 +11 +12 +10 +11 +10 +11 +182 +180 +183 +183 +182 +182 +183 +182 +182 +183 +182 +183 +185 +183 +184 +183 +181 +182 +183 +181 +181 +183 +181 +181 +180 +12 +10 +11 +11 +10 +10 +10 +182 +182 +181 +181 +182 +182 +183 +183 +182 +182 +182 +182 +184 +182 +182 +181 +180 +183 +182 +180 +182 +181 +181 +182 +182 +12 +11 +10 +11 +10 +12 +11 +182 +181 +182 +183 +182 +182 +182 +181 +182 +182 +183 +183 +182 +182 +183 +182 +181 +182 +181 +183 +183 +184 +182 +183 +183 +11 +10 +10 +10 +11 +10 +10 +182 +182 +182 +182 +182 +182 +182 +183 +183 +182 +182 +182 +185 +183 +179 +183 +182 +181 +182 +183 +184 +182 +182 +182 +181 +13 +12 +10 +11 +11 +11 +10 +181 +183 +181 +183 +183 +182 +181 +181 +183 +182 +183 +181 +181 +183 +183 +183 +183 +185 +183 +183 +182 +182 +182 +182 +182 +13 +12 +10 +10 +10 +11 +11 +182 +183 +181 +181 +183 +183 +181 +181 +183 +182 +183 +182 +182 +179 +182 +183 +184 +181 +181 +182 +182 +183 +183 +182 +181 +12 +11 +10 +10 +10 +11 +10 +182 +182 +182 +183 +182 +182 +182 +181 +182 +183 +180 +182 +183 +182 +183 +181 +179 +180 +183 +183 +184 +182 +182 +183 +182 +12 +11 +11 +10 +11 +11 +11 +182 +181 +182 +182 +183 +185 +182 +182 +183 +183 +183 +183 +185 +182 +182 +183 +182 +182 +184 +182 +182 +182 +182 +183 +183 +12 +12 +10 +11 +10 +11 +12 +181 +181 +182 +182 +182 +182 +10 +10 +9 +182 +183 +181 +180 +182 +182 +183 +182 +182 +181 +183 +182 +185 +182 +184 +182 +182 +178 +183 +182 +182 +182 +184 +185 +182 +12 +10 +9 +11 +12 +11 +10 +182 +182 +182 +180 +182 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +181 +183 +182 +183 +12 +10 +10 +10 +11 +10 +11 +183 +180 +183 +182 +182 +183 +185 +181 +181 +182 +184 +182 +183 +182 +182 +183 +181 +182 +10 +10 +12 +10 +10 +181 +181 +183 +183 +182 +181 +182 +182 +183 +183 +180 +180 +182 +182 +182 +181 +182 +181 +181 +181 +181 +182 +183 +182 +182 +11 +10 +10 +10 +10 +10 +11 +181 +181 +182 +182 +182 +181 +182 +179 +181 +181 +183 +183 +182 +179 +182 +183 +183 +181 +180 +181 +181 +182 +183 +181 +181 +11 +11 +10 +10 +10 +10 +12 +182 +181 +182 +181 +182 +181 +182 +182 +182 +182 +183 +183 +182 +181 +182 +181 +182 +184 +185 +182 +179 +182 +182 +183 +182 +12 +10 +13 +12 +13 +10 +8 +186 +182 +182 +183 +182 +178 +182 +182 +181 +183 +184 +182 +181 +182 +183 +183 +182 +182 +182 +183 +183 +182 +182 +183 +182 +11 +11 +10 +10 +10 +10 +10 +182 +183 +181 +182 +181 +182 +183 +182 +182 +183 +184 +182 +183 +182 +181 +183 +184 +181 +181 +182 +182 +182 +181 +182 +181 +12 +11 +11 +10 +10 +12 +12 +181 +181 +182 +182 +184 +182 +182 +182 +182 +181 +182 +182 +182 +181 +182 +183 +183 +182 +182 +181 +184 +182 +182 +182 +181 +11 +11 +12 +11 +11 +10 +9 +182 +184 +182 +181 +182 +183 +183 +181 +182 +182 +184 +182 +183 +182 +182 +183 +183 +181 +180 +182 +182 +182 +182 +181 +182 +12 +10 +10 +12 +12 +11 +11 +182 +181 +182 +183 +183 +182 +182 +184 +184 +182 +183 +182 +182 +183 +184 +181 +181 +182 +182 +182 +181 +182 +180 +183 +183 +12 +10 +9 +10 +10 +11 +10 +182 +182 +182 +182 +182 +182 +183 +181 +182 +181 +182 +183 +181 +182 +182 +183 +179 +182 +181 +182 +182 +182 +181 +183 +182 +11 +11 +10 +10 +182 +182 +182 +183 +183 +12 +11 +10 +9 +12 +11 +9 +181 +181 +183 +183 +184 +181 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +184 +183 +183 +181 +181 +182 +182 +12 +11 +11 +10 +10 +12 +11 +183 +182 +182 +182 +182 +182 +182 +182 +183 +180 +182 +182 +184 +182 +183 +182 +181 +183 +183 +186 +182 +182 +181 +182 +185 +11 +10 +12 +10 +10 +10 +10 +182 +181 +182 +182 +182 +182 +181 +182 +183 +182 +183 +182 +181 +183 +181 +181 +12 +11 +12 +10 +11 +10 +9 +184 +183 +183 +182 +183 +182 +183 +182 +181 +182 +183 +182 +182 +182 +182 +183 +182 +182 +182 +182 +183 +182 +182 +183 +182 +11 +11 +12 +9 +8 +8 +11 +183 +181 +182 +182 +183 +182 +180 +180 +181 +182 +183 +183 +181 +182 +182 +184 +182 +182 +182 +182 +183 +183 +182 +181 +182 +11 +11 +10 +10 +11 +12 +10 +174 +182 +182 +181 +184 +181 +181 +182 +182 +181 +179 +183 +182 +182 +182 +183 +183 +181 +183 +184 +182 +182 +182 +181 +182 +11 +10 +10 +8 +11 +11 +10 +181 +182 +183 +182 +184 +181 +181 +183 +184 +181 +182 +183 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +12 +8 +10 +12 +11 +10 +9 +182 +182 +184 +182 +182 +183 +182 +181 +182 +182 +181 +182 +181 +185 +182 +182 +182 +186 +183 +183 +182 +181 +180 +183 +182 +12 +9 +8 +11 +11 +11 +11 +182 +182 +182 +183 +182 +182 +179 +182 +183 +182 +182 +182 +183 +183 +182 +183 +182 +181 +183 +182 +183 +182 +183 +182 +182 +12 +11 +12 +12 +10 +9 +11 +182 +180 +183 +182 +181 +182 +183 +181 +180 +182 +182 +183 +182 +182 +182 +183 +184 +182 +182 +184 +182 +180 +183 +183 +183 +11 +10 +11 +11 +10 +10 +11 +184 +181 +181 +182 +182 +182 +182 +181 +181 +182 +183 +182 +182 +181 +182 +183 +185 +182 +182 +182 +182 +183 +183 +182 +182 +12 +11 +11 +11 +10 +11 +11 +182 +181 +182 +183 +184 +182 +181 +182 +183 +182 +183 +182 +182 +183 +183 +182 +181 +181 +183 +182 +182 +181 +182 +183 +184 +182 +180 +182 +182 +182 +181 +182 +183 +184 +11 +11 +11 +11 +11 +11 +10 +182 +182 +182 +181 +182 +182 +184 +181 +182 +182 +183 +181 +182 +183 +181 +182 +183 +185 +181 +182 +182 +183 +182 +183 +182 +11 +11 +12 +11 +10 +11 +12 +182 +182 +182 +182 +182 +182 +180 +182 +183 +183 +181 +182 +182 +184 +181 +182 +181 +182 +182 +183 +182 +182 +181 +181 +183 +13 +10 +11 +7 +10 +13 +183 +183 +182 +180 +182 +181 +184 +183 +182 +180 +182 +182 +182 +183 +182 +181 +183 +13 +12 +10 +10 +10 +11 +10 +182 +182 +181 +181 +183 +183 +181 +182 +181 +183 +182 +182 +182 +183 +182 +182 +183 +183 +182 +182 +183 +181 +182 +180 +184 +12 +10 +9 +11 +11 +11 +11 +181 +182 +182 +182 +182 +182 +181 +183 +184 +183 +182 +182 +180 +183 +183 +183 +182 +182 +183 +183 +182 +183 +182 +182 +181 +12 +11 +11 +10 +10 +10 +11 +182 +181 +182 +181 +182 +183 +182 +181 +181 +183 +183 +182 +181 +181 +182 +182 +181 +182 +182 +182 +182 +183 +183 +180 +182 +13 +9 +10 +10 +10 +10 +11 +182 +182 +179 +182 +183 +182 +182 +182 +183 +182 +183 +181 +182 +182 +181 +183 +182 +182 +183 +182 +181 +182 +183 +183 +182 +10 +10 +10 +11 +11 +10 +11 +182 +183 +183 +182 +182 +182 +182 +181 +184 +183 +182 +182 +181 +182 +183 +182 +183 +181 +182 +182 +183 +182 +182 +182 +182 +12 +11 +10 +10 +11 +10 +12 +182 +183 +183 +183 +184 +182 +182 +182 +182 +179 +183 +183 +182 +183 +182 +182 +182 +183 +182 +183 +182 +181 +182 +182 +183 +10 +8 +10 +11 +11 +10 +11 +181 +182 +183 +182 +182 +182 +183 +182 +182 +181 +183 +182 +183 +182 +180 +183 +182 +182 +182 +183 +181 +183 +182 +180 +181 +11 +11 +9 +10 +11 +11 +12 +181 +181 +179 +183 +182 +182 +182 +182 +185 +182 +181 +182 +181 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +181 +12 +11 +11 +9 +12 +11 +10 +182 +182 +182 +182 +182 +182 +180 +183 +182 +183 +181 +184 +182 +182 +182 +183 +184 +182 +181 +183 +183 +181 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +11 +11 +11 +11 +11 +11 +10 +180 +179 +182 +182 +182 +183 +182 +183 +182 +181 +182 +183 +182 +182 +181 +182 +182 +182 +183 +183 +182 +182 +182 +180 +180 +12 +10 +12 +12 +11 +11 +11 +181 +183 +182 +182 +182 +184 +182 +182 +182 +183 +182 +181 +182 +181 +182 +183 +182 +183 +181 +182 +181 +13 +9 +181 +181 +186 +182 +182 +182 +184 +183 +181 +182 +180 +184 +183 +182 +182 +182 +183 +186 +182 +182 +182 +182 +183 +181 +181 +12 +13 +11 +10 +10 +10 +10 +183 +182 +181 +182 +182 +181 +181 +182 +182 +182 +182 +181 +182 +182 +183 +184 +181 +181 +183 +183 +182 +181 +185 +182 +183 +12 +10 +8 +10 +10 +10 +10 +180 +183 +182 +182 +181 +183 +181 +181 +182 +183 +181 +181 +182 +183 +182 +182 +182 +183 +181 +181 +183 +183 +183 +181 +182 +12 +11 +10 +10 +10 +11 +11 +181 +182 +183 +182 +182 +182 +182 +183 +182 +182 +182 +183 +181 +181 +183 +183 +184 +181 +182 +182 +182 +182 +182 +181 +182 +12 +10 +10 +10 +11 +10 +8 +180 +182 +183 +182 +181 +182 +183 +184 +182 +181 +182 +182 +183 +181 +181 +183 +185 +182 +183 +183 +182 +183 +183 +182 +181 +12 +11 +9 +9 +10 +11 +11 +181 +182 +182 +182 +182 +179 +180 +182 +182 +182 +183 +182 +182 +182 +182 +181 +182 +183 +184 +182 +182 +182 +182 +182 +183 +11 +11 +11 +10 +11 +12 +13 +181 +182 +182 +184 +182 +183 +182 +181 +184 +183 +182 +182 +182 +182 +182 +182 +181 +181 +183 +183 +182 +183 +183 +182 +182 +12 +10 +11 +11 +12 +12 +11 +182 +182 +182 +183 +182 +181 +183 +183 +182 +181 +182 +182 +182 +182 +182 +183 +182 +182 +182 +183 +183 +181 +181 +182 +183 +12 +9 +10 +11 +13 +10 +10 +182 +183 +184 +183 +182 +181 +182 +183 +182 +182 +182 +182 +183 +183 +182 +182 +182 +184 +180 +181 +182 +184 +182 +181 +182 +13 +11 +11 +11 +11 +10 +10 +181 +184 +14 +11 +11 +11 +10 +10 +11 +183 +182 +182 +182 +181 +183 +182 +183 +183 +183 +183 +182 +182 +182 +182 +182 +177 +183 +182 +182 +182 +182 +182 +182 +182 +12 +10 +11 +11 +11 +12 +11 +182 +182 +181 +183 +182 +183 +183 +182 +183 +180 +182 +183 +182 +181 +182 +184 +182 +181 +182 +180 +182 +182 +182 +183 +181 +11 +10 +11 +10 +10 +11 +11 +182 +180 +182 +182 +182 +181 +182 +180 +179 +181 +182 +183 +180 +182 +182 +182 +11 +11 +11 +10 +11 +10 +11 +182 +183 +182 +181 +181 +182 +182 +183 +184 +182 +182 +182 +181 +182 +182 +183 +184 +184 +183 +182 +183 +182 +183 +182 +182 +12 +11 +10 +9 +8 +13 +10 +183 +184 +182 +183 +182 +180 +182 +182 +183 +185 +182 +182 +182 +182 +182 +180 +180 +181 +182 +183 +183 +182 +182 +184 +181 +13 +11 +13 +11 +12 +10 +9 +182 +181 +182 +182 +182 +182 +183 +182 +183 +183 +182 +182 +181 +181 +183 +182 +185 +183 +184 +182 +182 +185 +182 +183 +181 +13 +9 +11 +10 +11 +10 +11 +183 +182 +182 +183 +183 +182 +181 +183 +182 +182 +182 +182 +183 +183 +183 +182 +176 +183 +182 +183 +182 +182 +182 +182 +183 +11 +10 +11 +12 +10 +10 +12 +181 +182 +183 +182 +182 +184 +182 +182 +182 +182 +182 +182 +182 +183 +183 +183 +182 +182 +182 +182 +182 +183 +182 +182 +182 +11 +9 +11 +12 +10 +12 +10 +182 +182 +181 +182 +182 +182 +182 +182 +183 +182 +182 +181 +182 +183 +183 +184 +183 +182 +182 +181 +181 +182 +182 +185 +184 +13 +10 +11 +11 +9 +12 +11 +182 +183 +181 +180 +182 +182 +183 +184 +182 +183 +181 +181 +182 +182 +182 +182 +183 +182 +182 +182 +182 +182 +183 +182 +180 +12 +10 +11 +12 +11 +11 +10 +181 +182 +182 +182 +183 +184 +182 +184 +181 +182 +183 +182 +182 +183 +183 +182 +182 +182 +181 +181 +182 +185 +183 +183 +185 +12 +11 +10 +10 +11 +11 +11 +182 +183 +182 +182 +182 +182 +180 +182 +183 +183 +181 +180 +181 +182 +183 +183 +183 +182 +182 +181 +182 +183 +183 +184 +183 +182 +182 +181 +180 +180 +183 +183 +183 +183 +12 +11 +11 +11 +12 +11 +12 +182 +182 +181 +182 +183 +182 +183 +182 +182 +184 +183 +183 +183 +181 +182 +181 +182 +183 +182 +181 +182 +182 +182 +182 +184 +13 +12 +10 +11 +9 +8 +11 +182 +183 +183 +182 +183 +182 +181 +182 +182 +183 +182 +182 +182 +182 +182 +184 +180 +181 +182 +183 +183 +182 +182 +182 +183 +13 +10 +10 +10 +9 +11 +10 +182 +182 +183 +182 +182 +182 +181 +180 +176 +183 +182 +182 +183 +181 +183 +183 +11 +11 +10 +11 +10 +10 +12 +183 +182 +182 +182 +180 +183 +181 +182 +184 +183 +179 +182 +181 +183 +183 +183 +182 +183 +182 +183 +182 +182 +180 +182 +182 +11 +10 +10 +11 +13 +11 +10 +183 +181 +182 +182 +183 +183 +182 +183 +185 +182 +183 +183 +183 +182 +182 +181 +179 +182 +182 +184 +183 +181 +183 +184 +180 +13 +9 +9 +10 +11 +10 +9 +182 +181 +182 +182 +184 +182 +183 +181 +183 +182 +181 +181 +181 +183 +184 +183 +183 +182 +181 +182 +182 +182 +183 +181 +182 +14 +10 +10 +8 +10 +10 +10 +181 +180 +183 +182 +183 +184 +182 +183 +182 +182 +181 +183 +183 +183 +182 +182 +182 +182 +182 +182 +178 +181 +182 +183 +181 +11 +11 +10 +10 +10 +10 +12 +183 +182 +182 +182 +181 +181 +182 +182 +184 +183 +182 +182 +182 +183 +183 +182 +182 +182 +181 +180 +180 +182 +182 +182 +182 +11 +10 +11 +11 +10 +9 +10 +182 +183 +182 +182 +182 +182 +182 +182 +180 +183 +182 +183 +183 +182 +182 +183 +182 +180 +182 +182 +183 +183 +184 +183 +184 +11 +10 +10 +10 +10 +10 +12 +183 +182 +183 +182 +181 +182 +182 +181 +182 +182 +182 +182 +183 +181 +182 +183 +182 +186 +184 +182 +183 +182 +185 +183 +182 +10 +10 +9 +10 +10 +11 +12 +183 +183 +182 +182 +181 +181 +182 +183 +185 +183 +182 +182 +183 +182 +183 +180 +181 +182 +182 +183 +182 +182 +182 +181 +182 +12 +11 +11 +9 +8 +10 +10 +182 +184 +182 +182 +182 +182 +182 +183 +183 +182 +182 +182 +181 +182 +182 +183 +183 +183 +183 +183 +182 +181 +182 +182 +180 +182 +183 +183 +184 +183 +183 +182 +182 +181 +12 +10 +11 +11 +10 +10 +11 +183 +182 +179 +183 +181 +182 +183 +181 +183 +182 +182 +182 +182 +182 +181 +182 +182 +182 +183 +182 +182 +182 +183 +184 +179 +13 +10 +10 +11 +10 +11 +10 +182 +182 +181 +182 +182 +182 +183 +182 +183 +183 +182 +182 +183 +183 +182 +182 +182 +182 +182 +181 +183 +181 +183 +183 +181 +10 +10 +10 +182 +183 +182 +183 +181 +182 +187 +182 +183 +183 +182 +181 +182 +181 +182 +182 +183 +183 +182 +182 +10 +11 +11 +10 +10 +10 +11 +182 +182 +182 +182 +183 +182 +182 +181 +181 +183 +183 +183 +182 +180 +180 +180 +182 +182 +182 +182 +182 +183 +184 +182 +183 +10 +9 +9 +10 +10 +12 +11 +183 +183 +181 +182 +181 +182 +182 +182 +182 +182 +183 +182 +182 +184 +182 +182 +182 +182 +182 +182 +182 +182 +181 +181 +182 +11 +10 +10 +11 +11 +10 +10 +182 +182 +182 +182 +182 +181 +181 +183 +182 +183 +183 +182 +181 +182 +182 +182 +181 +180 +182 +182 +183 +181 +181 +181 +183 +12 +11 +10 +11 +10 +11 +11 +182 +182 +183 +182 +182 +183 +181 +182 +182 +181 +182 +182 +183 +183 +182 +183 +177 +183 +182 +182 +181 +182 +182 +182 +183 +12 +10 +11 +10 +10 +12 +11 +186 +183 +183 +183 +185 +183 +186 +182 +181 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +182 +183 +181 +182 +182 +182 +13 +13 +11 +11 +12 +10 +12 +181 +182 +182 +182 +182 +181 +181 +182 +182 +183 +182 +183 +184 +182 +184 +182 +182 +182 +183 +183 +184 +182 +181 +182 +182 +12 +10 +11 +11 +11 +10 +10 +182 +181 +181 +182 +182 +183 +184 +184 +182 +184 +181 +182 +182 +182 +183 +182 +182 +183 +182 +182 +182 +183 +182 +183 +182 +11 +11 +10 +10 +11 +10 +11 +184 +183 +184 +182 +182 +181 +181 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +183 +182 +183 +184 +184 +182 +179 +11 +10 +9 +12 +10 +11 +11 +184 +182 +182 +182 +183 +182 +181 +11 +9 +182 +183 +184 +183 +182 +182 +182 +183 +184 +182 +184 +182 +183 +182 +182 +183 +182 +183 +183 +182 +182 +182 +182 +182 +182 +13 +10 +10 +12 +10 +11 +12 +183 +182 +182 +182 +181 +182 +182 +182 +184 +184 +184 +183 +183 +181 +182 +182 +181 +182 +181 +182 +182 +183 +183 +183 +182 +11 +7 +9 +9 +10 +10 +11 +183 +183 +182 +182 +183 +183 +182 +184 +182 +181 +182 +183 +182 +181 +182 +182 +183 +182 +183 +9 +11 +11 +11 +183 +182 +182 +182 +182 +182 +184 +182 +179 +182 +182 +181 +182 +182 +183 +184 +182 +181 +182 +178 +181 +183 +182 +184 +182 +12 +11 +11 +10 +11 +11 +11 +182 +183 +182 +182 +179 +181 +183 +188 +183 +183 +182 +182 +181 +181 +182 +182 +184 +184 +184 +182 +181 +182 +183 +182 +181 +11 +9 +10 +9 +12 +11 +13 +183 +183 +181 +182 +182 +181 +182 +182 +181 +183 +182 +181 +181 +182 +182 +183 +182 +181 +182 +182 +183 +183 +182 +179 +182 +11 +11 +11 +10 +12 +12 +11 +184 +182 +182 +182 +182 +182 +183 +182 +181 +180 +182 +182 +182 +183 +182 +184 +183 +182 +182 +181 +182 +182 +182 +182 +182 +12 +10 +10 +10 +10 +11 +10 +182 +181 +182 +181 +182 +182 +182 +183 +183 +183 +183 +182 +180 +180 +182 +183 +183 +182 +182 +182 +182 +182 +181 +183 +183 +13 +12 +10 +9 +10 +10 +9 +181 +182 +182 +183 +185 +182 +182 +178 +182 +182 +181 +182 +182 +182 +182 +182 +183 +184 +182 +182 +182 +181 +182 +182 +182 +13 +11 +11 +13 +10 +12 +10 +182 +183 +181 +182 +183 +182 +178 +180 +182 +183 +183 +180 +182 +182 +181 +182 +181 +183 +182 +184 +182 +182 +182 +182 +182 +12 +9 +11 +10 +11 +11 +12 +182 +180 +182 +181 +182 +183 +182 +183 +183 +179 +182 +182 +182 +182 +183 +183 +185 +183 +183 +182 +183 +182 +182 +182 +184 +12 +12 +11 +10 +10 +10 +9 +183 +182 +183 +182 +182 +181 +182 +181 +182 +182 +184 +183 +182 +182 +182 +181 +183 +182 +182 +181 +181 +183 +181 +183 +183 +13 +10 +10 +10 +10 +183 +184 +183 +183 +11 +12 +10 +9 +10 +9 +9 +182 +183 +183 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +182 +182 +181 +182 +183 +183 +182 +182 +183 +182 +180 +183 +11 +10 +10 +10 +10 +10 +11 +182 +183 +179 +181 +181 +182 +181 +176 +183 +183 +183 +183 +181 +182 +182 +182 +181 +184 +182 +182 +183 +183 +185 +182 +182 +12 +11 +10 +10 +10 +11 +9 +181 +182 +182 +185 +183 +183 +182 +180 +182 +182 +182 +181 +182 +182 +183 +184 +13 +11 +15 +12 +10 +11 +10 +181 +182 +183 +182 +183 +182 +183 +183 +183 +183 +182 +182 +182 +181 +183 +183 +183 +182 +182 +182 +182 +182 +183 +183 +182 +11 +11 +11 +10 +11 +11 +11 +184 +181 +183 +182 +182 +182 +183 +182 +183 +182 +183 +180 +180 +182 +182 +183 +186 +182 +181 +182 +182 +187 +182 +181 +182 +11 +14 +12 +10 +10 +11 +10 +182 +182 +182 +182 +183 +182 +183 +183 +182 +182 +180 +182 +182 +182 +182 +182 +184 +182 +183 +183 +182 +182 +182 +182 +183 +12 +10 +10 +10 +10 +9 +10 +182 +181 +180 +182 +183 +182 +182 +183 +182 +182 +184 +182 +183 +182 +181 +181 +183 +182 +182 +182 +183 +183 +181 +180 +181 +14 +9 +11 +11 +11 +13 +11 +183 +182 +184 +182 +182 +182 +180 +182 +182 +183 +183 +182 +182 +180 +182 +183 +182 +183 +183 +182 +182 +182 +182 +181 +182 +10 +11 +12 +11 +11 +10 +11 +182 +182 +183 +184 +182 +185 +184 +182 +182 +181 +183 +182 +182 +182 +182 +182 +181 +183 +182 +183 +183 +183 +183 +182 +182 +11 +10 +11 +10 +11 +11 +11 +184 +182 +184 +182 +182 +182 +181 +181 +181 +182 +182 +182 +182 +183 +182 +183 +183 +183 +183 +182 +182 +182 +180 +180 +182 +13 +12 +11 +11 +11 +12 +9 +182 +181 +182 +182 +182 +183 +182 +182 +183 +182 +183 +181 +181 +182 +181 +182 +182 +182 +181 +182 +186 +183 +181 +183 +182 +12 +11 +10 +11 +11 +11 +11 +182 +183 +182 +183 +182 +181 +182 +182 +180 +181 +182 +181 +181 +182 +183 +182 +183 +183 +182 +182 +181 +183 +182 +182 +182 +182 +183 +183 +182 +184 +182 +183 +182 +181 +12 +11 +10 +12 +10 +11 +11 +182 +183 +183 +180 +183 +182 +182 +182 +182 +183 +182 +182 +181 +182 +182 +182 +184 +183 +184 +183 +183 +181 +182 +182 +180 +12 +9 +11 +11 +11 +11 +10 +183 +182 +182 +180 +180 +182 +183 +184 +183 +182 +183 +181 +180 +182 +182 +182 +182 +182 +182 +183 +180 +181 +181 +183 +183 +11 +11 +10 +10 +10 +9 +11 +182 +183 +183 +182 +181 +182 +181 +183 +181 +183 +182 +183 +183 +184 +182 +184 +12 +9 +11 +9 +10 +11 +12 +182 +182 +181 +182 +182 +181 +181 +182 +183 +183 +183 +182 +183 +182 +181 +182 +183 +182 +181 +181 +182 +182 +181 +180 +181 +11 +10 +11 +10 +11 +13 +10 +182 +182 +183 +183 +183 +181 +181 +182 +180 +181 +181 +182 +184 +184 +183 +183 +182 +182 +181 +182 +183 +182 +183 +183 +183 +12 +10 +12 +11 +10 +11 +11 +182 +183 +182 +181 +182 +180 +180 +182 +182 +183 +184 +182 +181 +182 +182 +182 +183 +181 +183 +183 +182 +182 +184 +182 +182 +12 +11 +13 +11 +10 +10 +9 +181 +182 +182 +182 +182 +184 +182 +182 +182 +182 +183 +181 +182 +181 +183 +182 +183 +183 +182 +182 +184 +182 +181 +181 +182 +12 +11 +10 +11 +10 +10 +10 +182 +182 +182 +182 +183 +182 +184 +182 +181 +182 +181 +182 +183 +182 +183 +182 +183 +180 +180 +182 +183 +182 +182 +182 +181 +9 +11 +11 +10 +10 +10 +11 +182 +182 +183 +182 +182 +183 +181 +181 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +181 +182 +182 +182 +183 +183 +183 +10 +8 +11 +10 +11 +12 +11 +183 +183 +182 +182 +181 +182 +182 +182 +182 +182 +183 +183 +183 +184 +182 +185 +182 +181 +182 +182 +183 +183 +184 +182 +183 +11 +10 +10 +11 +11 +10 +8 +180 +183 +183 +183 +183 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +183 +182 +12 +11 +11 +11 +11 +8 +9 +183 +182 +182 +182 +182 +181 +182 +182 +181 +183 +183 +183 +184 +183 +183 +185 +182 +181 +181 +182 +183 +182 +182 +182 +183 +180 +182 +181 +183 +182 +182 +183 +182 +182 +12 +10 +11 +10 +10 +11 +11 +182 +183 +182 +182 +182 +182 +182 +182 +182 +183 +184 +182 +184 +181 +182 +182 +181 +183 +182 +183 +184 +182 +182 +182 +181 +11 +10 +11 +11 +11 +10 +9 +182 +182 +182 +182 +182 +182 +183 +182 +182 +181 +182 +182 +182 +182 +181 +181 +181 +182 +183 +181 +182 +183 +182 +182 +181 +12 +183 +185 +182 +181 +182 +181 +182 +183 +183 +183 +183 +182 +181 +183 +183 +182 +184 +183 +183 +182 +182 +183 +12 +11 +11 +11 +12 +9 +11 +182 +183 +179 +183 +182 +183 +182 +184 +184 +183 +183 +182 +181 +183 +182 +182 +184 +183 +185 +181 +182 +182 +183 +185 +182 +11 +11 +11 +14 +11 +11 +10 +182 +185 +183 +181 +184 +182 +182 +181 +181 +182 +182 +182 +184 +182 +182 +183 +183 +183 +183 +182 +182 +183 +182 +182 +181 +11 +10 +11 +12 +12 +11 +10 +182 +181 +182 +182 +182 +183 +182 +183 +182 +181 +183 +182 +183 +182 +182 +182 +182 +182 +182 +180 +181 +182 +182 +184 +183 +12 +12 +11 +11 +10 +11 +10 +182 +182 +181 +182 +183 +183 +182 +184 +184 +183 +182 +181 +181 +181 +183 +182 +183 +179 +182 +184 +183 +180 +182 +181 +181 +13 +11 +11 +10 +10 +9 +11 +182 +182 +183 +181 +183 +182 +181 +182 +184 +182 +183 +182 +182 +184 +182 +182 +181 +184 +183 +184 +183 +182 +182 +182 +182 +11 +10 +10 +10 +10 +11 +10 +184 +183 +182 +182 +181 +181 +182 +182 +183 +183 +184 +182 +182 +182 +183 +182 +182 +182 +181 +181 +181 +183 +183 +183 +183 +12 +10 +10 +10 +11 +10 +12 +182 +184 +181 +182 +182 +182 +182 +183 +181 +179 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +183 +183 +183 +184 +12 +12 +11 +10 +11 +11 +11 +183 +182 +182 +183 +182 +182 +180 +182 +183 +183 +182 +181 +182 +182 +183 +182 +181 +183 +182 +183 +182 +183 +183 +182 +183 +12 +11 +11 +10 +10 +10 +10 +182 +182 +182 +11 +10 +8 +11 +10 +10 +183 +182 +183 +183 +183 +182 +182 +181 +181 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +11 +9 +10 +11 +12 +12 +11 +183 +182 +182 +182 +184 +182 +182 +182 +182 +182 +181 +182 +182 +180 +186 +182 +183 +183 +183 +181 +182 +181 +182 +182 +181 +14 +10 +12 +11 +14 +11 +10 +182 +182 +182 +180 +182 +181 +180 +182 +182 +183 +182 +182 +182 +181 +182 +183 +183 +11 +11 +11 +10 +10 +10 +183 +182 +182 +181 +183 +184 +181 +182 +181 +182 +184 +182 +182 +181 +182 +179 +182 +181 +179 +182 +187 +182 +181 +182 +182 +8 +10 +9 +11 +10 +10 +9 +182 +182 +185 +182 +181 +181 +181 +183 +182 +183 +182 +183 +183 +180 +179 +182 +181 +182 +182 +183 +182 +183 +182 +182 +182 +12 +11 +11 +10 +10 +10 +10 +179 +179 +181 +182 +182 +181 +182 +182 +183 +184 +184 +184 +183 +182 +182 +181 +182 +181 +182 +183 +182 +182 +183 +182 +182 +11 +9 +11 +11 +10 +12 +11 +182 +182 +181 +181 +182 +182 +182 +181 +182 +182 +184 +184 +182 +182 +182 +182 +180 +182 +182 +182 +182 +182 +182 +182 +183 +11 +10 +9 +11 +11 +11 +12 +183 +183 +181 +181 +182 +183 +182 +182 +181 +181 +182 +182 +182 +183 +182 +184 +183 +182 +181 +182 +180 +181 +181 +182 +183 +14 +12 +10 +10 +11 +10 +12 +183 +183 +182 +182 +182 +183 +182 +182 +183 +183 +181 +180 +182 +182 +182 +183 +183 +183 +183 +181 +183 +182 +182 +182 +183 +11 +10 +10 +10 +11 +10 +10 +183 +183 +181 +183 +182 +180 +181 +182 +182 +183 +183 +182 +182 +182 +182 +183 +183 +182 +182 +183 +182 +182 +183 +182 +181 +11 +9 +10 +11 +11 +12 +12 +182 +182 +181 +181 +183 +182 +182 +183 +181 +181 +181 +182 +183 +183 +183 +182 +182 +181 +183 +182 +182 +183 +183 +182 +183 +12 +10 +11 +11 +11 +11 +10 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +184 +183 +184 +183 +182 +182 +181 +183 +182 +12 +182 +182 +183 +182 +182 +182 +183 +183 +11 +11 +11 +9 +11 +10 +11 +181 +180 +182 +181 +181 +183 +182 +182 +182 +183 +182 +182 +182 +182 +182 +181 +183 +182 +183 +182 +182 +182 +182 +183 +183 +13 +11 +10 +10 +8 +9 +11 +182 +183 +183 +182 +182 +183 +182 +181 +182 +181 +182 +183 +183 +183 +182 +182 +181 +182 +182 +182 +183 +179 +183 +183 +182 +12 +10 +10 +10 +10 +10 +10 +182 +182 +182 +182 +183 +181 +182 +182 +182 +185 +182 +182 +183 +182 +183 +183 +13 +12 +10 +11 +10 +9 +11 +182 +183 +184 +184 +182 +183 +182 +183 +181 +182 +183 +183 +182 +182 +183 +183 +182 +182 +183 +181 +182 +182 +181 +182 +183 +12 +12 +10 +12 +11 +10 +11 +181 +183 +183 +183 +184 +182 +183 +184 +182 +184 +181 +181 +182 +182 +183 +181 +183 +184 +182 +182 +182 +182 +183 +181 +182 +11 +12 +11 +11 +10 +20 +9 +182 +182 +182 +182 +183 +182 +182 +182 +186 +181 +182 +182 +181 +180 +182 +183 +182 +181 +183 +182 +182 +182 +182 +181 +181 +11 +11 +14 +11 +13 +11 +11 +182 +181 +183 +183 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +185 +183 +181 +180 +182 +182 +11 +12 +10 +11 +11 +10 +10 +182 +183 +183 +183 +182 +182 +182 +182 +182 +183 +182 +182 +180 +181 +183 +182 +184 +183 +182 +182 +181 +181 +182 +182 +183 +12 +11 +11 +11 +11 +11 +7 +182 +182 +183 +182 +182 +183 +183 +183 +183 +182 +181 +182 +181 +182 +183 +184 +182 +183 +182 +182 +182 +182 +182 +180 +182 +10 +10 +10 +9 +12 +10 +11 +183 +183 +182 +183 +182 +181 +182 +182 +182 +181 +183 +183 +182 +182 +182 +182 +183 +183 +180 +182 +182 +182 +182 +182 +182 +12 +8 +10 +10 +10 +11 +10 +183 +184 +183 +184 +182 +183 +183 +180 +183 +183 +182 +181 +180 +180 +182 +182 +184 +184 +182 +182 +180 +182 +182 +182 +182 +10 +11 +11 +11 +10 +9 +10 +182 +181 +180 +185 +182 +181 +182 +182 +181 +183 +183 +182 +182 +182 +181 +182 +182 +183 +182 +181 +180 +180 +182 +183 +184 +182 +183 +182 +182 +183 +182 +182 +182 +182 +11 +11 +11 +11 +11 +11 +10 +182 +182 +182 +182 +182 +182 +181 +182 +182 +182 +183 +182 +182 +182 +182 +183 +183 +184 +183 +184 +182 +183 +181 +182 +181 +10 +11 +10 +8 +13 +11 +11 +182 +181 +181 +181 +182 +182 +182 +183 +181 +182 +182 +182 +180 +183 +182 +182 +183 +184 +181 +182 +182 +182 +180 +183 +182 +13 +12 +11 +10 +13 +10 +11 +181 +184 +183 +182 +183 +182 +181 +180 +179 +182 +182 +184 +182 +182 +181 +183 +13 +10 +10 +10 +11 +8 +12 +182 +182 +182 +182 +182 +182 +182 +182 +181 +182 +182 +181 +182 +182 +182 +182 +183 +181 +181 +183 +182 +183 +183 +182 +182 +17 +10 +12 +10 +9 +10 +11 +182 +183 +181 +182 +182 +182 +182 +182 +182 +183 +184 +182 +183 +181 +181 +183 +182 +183 +183 +183 +183 +182 +182 +182 +182 +12 +9 +11 +11 +10 +10 +10 +182 +183 +183 +184 +182 +180 +182 +182 +183 +181 +183 +182 +183 +184 +182 +182 +182 +182 +183 +182 +182 +182 +182 +181 +183 +12 +11 +11 +10 +11 +10 +11 +183 +182 +182 +182 +182 +182 +182 +183 +181 +182 +183 +182 +182 +182 +183 +182 +182 +183 +184 +182 +182 +182 +181 +182 +183 +12 +11 +12 +10 +12 +10 +11 +182 +181 +183 +182 +182 +182 +182 +183 +181 +181 +182 +182 +183 +182 +184 +182 +183 +182 +182 +184 +182 +182 +182 +183 +183 +12 +12 +9 +11 +11 +11 +14 +182 +184 +184 +182 +182 +181 +181 +182 +182 +183 +184 +184 +183 +183 +181 +183 +182 +181 +183 +181 +183 +182 +182 +183 +182 +11 +11 +11 +12 +12 +10 +10 +182 +182 +183 +182 +183 +182 +181 +182 +181 +183 +183 +182 +180 +181 +182 +182 +183 +184 +182 +184 +182 +182 +179 +181 +182 +12 +12 +11 +11 +11 +10 +10 +181 +181 +183 +182 +182 +182 +182 +182 +184 +182 +183 +182 +180 +182 +182 +183 +182 +182 +182 +182 +182 +181 +181 +182 +181 +12 +14 +12 +11 +11 +11 +11 +182 +182 +182 +183 +181 +182 +178 +182 +10 +182 +185 +182 +183 +183 +181 +183 +182 +182 +183 +182 +181 +183 +182 +181 +182 +181 +182 +184 +183 +182 +182 +182 +182 +182 +12 +11 +11 +10 +10 +11 +10 +181 +186 +181 +183 +185 +183 +183 +182 +180 +182 +182 +181 +182 +182 +181 +182 +183 +183 +182 +182 +182 +181 +181 +181 +183 +13 +11 +11 +10 +11 +9 +8 +182 +181 +182 +184 +183 +182 +182 +182 +182 +182 +182 +182 +182 +181 +179 +182 +182 +179 +182 +182 +181 +182 +184 +181 +182 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +183 +182 +183 +183 +184 +183 +182 +182 +182 +182 +13 +10 +10 +11 +10 +10 +10 +182 +183 +184 +182 +183 +181 +181 +182 +181 +183 +182 +182 +183 +183 +182 +183 +182 +181 +183 +181 +182 +183 +182 +184 +182 +12 +11 +10 +10 +9 +11 +10 +182 +184 +181 +180 +182 +182 +181 +182 +181 +182 +182 +183 +183 +182 +182 +182 +183 +182 +183 +182 +183 +182 +182 +182 +181 +10 +11 +11 +10 +11 +11 +11 +182 +181 +183 +182 +183 +182 +182 +183 +182 +182 +182 +182 +183 +182 +182 +181 +180 +182 +181 +182 +182 +181 +182 +182 +183 +12 +11 +10 +10 +10 +11 +10 +181 +182 +181 +182 +182 +183 +183 +182 +183 +183 +182 +181 +182 +182 +182 +185 +183 +184 +183 +183 +182 +182 +180 +183 +182 +11 +11 +10 +11 +12 +11 +10 +182 +181 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +183 +182 +184 +181 +182 +182 +181 +183 +182 +184 +183 +180 +183 +11 +11 +11 +9 +11 +10 +13 +183 +182 +181 +181 +179 +182 +183 +183 +183 +179 +182 +184 +182 +181 +183 +181 +183 +183 +183 +177 +183 +182 +182 +183 +184 +12 +11 +11 +10 +13 +10 +12 +182 +183 +181 +181 +184 +182 +181 +185 +181 +183 +183 +183 +181 +182 +182 +183 +183 +187 +181 +182 +183 +182 +186 +182 +183 +13 +10 +7 +10 +12 +11 +8 +178 +183 +182 +184 +183 +181 +182 +182 +182 +178 +182 +183 +182 +183 +182 +182 +182 +181 +183 +181 +184 +183 +182 +182 +182 +12 +9 +10 +9 +10 +11 +183 +183 +185 +13 +9 +8 +11 +6 +11 +11 +184 +183 +180 +182 +182 +182 +182 +183 +182 +183 +183 +179 +182 +182 +182 +182 +182 +182 +182 +183 +183 +181 +182 +183 +178 +10 +9 +11 +11 +12 +12 +10 +183 +181 +181 +183 +182 +184 +183 +184 +184 +182 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +183 +183 +182 +181 +182 +11 +10 +11 +9 +11 +11 +10 +182 +182 +183 +181 +183 +182 +182 +183 +182 +182 +182 +182 +183 +183 +183 +182 +11 +10 +11 +11 +11 +11 +11 +182 +183 +181 +182 +182 +181 +181 +182 +181 +183 +183 +183 +182 +182 +182 +184 +183 +182 +182 +183 +182 +182 +182 +182 +182 +11 +10 +12 +11 +10 +9 +10 +182 +183 +183 +181 +182 +182 +182 +182 +183 +182 +185 +182 +184 +183 +182 +182 +182 +181 +181 +182 +182 +183 +183 +184 +183 +13 +9 +10 +10 +10 +11 +11 +181 +183 +183 +182 +189 +182 +183 +182 +182 +182 +183 +182 +182 +183 +183 +183 +181 +181 +183 +182 +182 +183 +182 +182 +182 +12 +10 +10 +11 +10 +10 +10 +185 +182 +183 +183 +182 +186 +181 +180 +182 +181 +180 +184 +182 +183 +182 +184 +182 +182 +182 +182 +184 +183 +182 +182 +182 +11 +11 +11 +11 +12 +10 +12 +182 +182 +181 +181 +183 +183 +183 +183 +182 +183 +181 +181 +183 +182 +182 +182 +184 +183 +184 +183 +184 +183 +184 +182 +181 +12 +9 +11 +12 +11 +10 +8 +182 +183 +183 +183 +184 +182 +182 +182 +181 +183 +183 +182 +183 +183 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +183 +12 +10 +11 +11 +8 +11 +10 +181 +181 +182 +183 +182 +183 +183 +183 +182 +181 +182 +183 +183 +183 +182 +182 +182 +182 +182 +181 +181 +183 +182 +182 +181 +13 +10 +11 +10 +9 +11 +10 +183 +183 +182 +183 +182 +182 +182 +182 +182 +182 +183 +183 +183 +182 +182 +182 +182 +184 +182 +182 +184 +182 +184 +182 +181 +11 +11 +11 +10 +11 +11 +10 +182 +183 +182 +184 +182 +182 +182 +182 +181 +180 +183 +183 +183 +183 +183 +182 +182 +182 +181 +179 +182 +182 +183 +182 +182 +182 +181 +182 +182 +182 +183 +184 +183 +184 +12 +10 +10 +10 +10 +10 +10 +181 +182 +182 +182 +182 +182 +182 +182 +183 +184 +180 +183 +181 +181 +182 +182 +183 +183 +182 +182 +181 +182 +182 +181 +182 +11 +10 +10 +11 +11 +12 +10 +184 +182 +181 +181 +181 +182 +184 +183 +183 +182 +182 +181 +182 +183 +182 +182 +184 +184 +183 +182 +182 +181 +182 +182 +182 +11 +11 +11 +11 +12 +11 +9 +183 +181 +182 +182 +183 +182 +185 +183 +183 +182 +181 +182 +182 +183 +183 +182 +12 +9 +10 +11 +11 +11 +12 +183 +182 +180 +183 +183 +183 +183 +182 +182 +181 +182 +182 +182 +182 +182 +183 +182 +179 +183 +182 +182 +182 +182 +182 +184 +12 +11 +12 +11 +12 +10 +11 +183 +182 +183 +183 +182 +182 +182 +183 +180 +183 +180 +185 +182 +183 +182 +182 +183 +182 +183 +182 +183 +183 +185 +183 +184 +12 +10 +10 +10 +11 +11 +12 +183 +182 +182 +181 +182 +181 +183 +182 +182 +182 +184 +180 +182 +182 +183 +183 +182 +183 +181 +181 +183 +182 +183 +182 +180 +12 +10 +8 +9 +11 +11 +11 +183 +181 +182 +181 +183 +183 +182 +183 +182 +182 +183 +182 +183 +183 +182 +182 +183 +184 +183 +184 +181 +183 +182 +182 +183 +12 +10 +9 +10 +10 +10 +12 +183 +183 +183 +181 +181 +181 +182 +183 +183 +183 +185 +182 +183 +182 +182 +182 +183 +181 +180 +182 +182 +181 +182 +182 +182 +12 +11 +10 +11 +11 +11 +12 +182 +183 +182 +182 +182 +182 +182 +182 +183 +182 +181 +182 +184 +182 +183 +181 +181 +182 +180 +183 +183 +183 +183 +182 +183 +9 +8 +11 +10 +11 +10 +11 +182 +181 +182 +182 +183 +182 +183 +182 +182 +182 +183 +184 +182 +182 +182 +182 +182 +181 +182 +182 +184 +182 +182 +182 +183 +13 +12 +11 +10 +10 +11 +10 +185 +183 +184 +183 +184 +182 +184 +182 +182 +182 +181 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +182 +182 +12 +11 +11 +12 +11 +11 +10 +182 +182 +182 +182 +183 +182 +182 +182 +182 +180 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +184 +183 +184 +185 +183 +184 +182 +181 +181 +181 +183 +12 +11 +10 +12 +11 +10 +10 +182 +182 +181 +182 +182 +182 +181 +185 +182 +182 +183 +182 +183 +182 +182 +182 +181 +180 +182 +182 +183 +182 +183 +183 +182 +14 +10 +11 +10 +9 +11 +10 +182 +183 +183 +183 +182 +181 +183 +182 +182 +182 +182 +183 +182 +182 +182 +181 +182 +182 +182 +182 +181 +182 +183 +183 +183 +11 +10 +9 +9 +182 +183 +183 +181 +181 +183 +182 +182 +183 +183 +183 +183 +182 +182 +181 +182 +182 +182 +182 +12 +11 +10 +8 +10 +10 +10 +183 +182 +182 +182 +183 +182 +182 +182 +183 +182 +183 +186 +181 +184 +182 +181 +181 +181 +183 +183 +183 +182 +183 +182 +182 +12 +11 +10 +11 +11 +10 +10 +180 +183 +183 +181 +181 +182 +182 +182 +181 +182 +183 +183 +184 +183 +183 +182 +182 +183 +182 +182 +182 +182 +182 +182 +182 +12 +10 +11 +8 +9 +11 +11 +182 +184 +182 +183 +185 +182 +182 +182 +182 +179 +181 +183 +182 +183 +182 +183 +182 +182 +181 +183 +182 +183 +183 +183 +183 +11 +10 +8 +8 +10 +10 +11 +182 +183 +183 +182 +181 +181 +182 +182 +183 +181 +184 +183 +183 +183 +182 +182 +174 +180 +182 +182 +183 +183 +183 +183 +183 +11 +10 +11 +10 +10 +11 +10 +181 +182 +182 +183 +182 +182 +183 +181 +181 +182 +182 +182 +183 +183 +182 +182 +182 +181 +182 +181 +182 +181 +183 +183 +183 +12 +11 +10 +9 +11 +11 +11 +183 +183 +182 +181 +181 +182 +182 +183 +182 +182 +183 +183 +183 +182 +182 +181 +182 +182 +181 +182 +180 +183 +183 +181 +181 +12 +10 +10 +10 +10 +10 +11 +182 +183 +182 +183 +182 +182 +181 +181 +182 +183 +183 +183 +183 +182 +183 +183 +181 +182 +182 +183 +183 +182 +182 +182 +182 +12 +11 +11 +11 +11 +9 +11 +182 +183 +183 +185 +183 +184 +182 +181 +184 +181 +183 +183 +182 +183 +182 +182 +183 +182 +184 +182 +182 +183 +182 +183 +185 +12 +12 +10 +11 +11 +9 +11 +181 +183 +186 +183 +10 +11 +11 +11 +11 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +180 +180 +182 +182 +186 +183 +182 +182 +182 +182 +183 +182 +182 +182 +183 +11 +9 +10 +9 +10 +10 +11 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +181 +182 +183 +182 +183 +182 +179 +182 +181 +181 +183 +182 +181 +182 +12 +11 +10 +9 +10 +10 +11 +182 +182 +182 +182 +183 +182 +183 +183 +182 +180 +182 +182 +184 +183 +183 +182 +183 +181 +181 +183 +11 +11 +12 +183 +182 +182 +181 +181 +183 +183 +182 +182 +179 +183 +183 +181 +183 +182 +182 +182 +182 +183 +184 +185 +185 +184 +182 +181 +12 +11 +11 +11 +11 +10 +10 +181 +183 +181 +180 +182 +182 +183 +184 +182 +183 +182 +181 +183 +181 +182 +184 +183 +182 +183 +181 +183 +183 +183 +182 +182 +13 +13 +11 +11 +11 +9 +10 +182 +182 +184 +182 +183 +184 +182 +183 +182 +182 +182 +185 +182 +183 +182 +182 +182 +182 +182 +180 +179 +182 +183 +184 +183 +12 +11 +10 +10 +11 +11 +10 +183 +184 +182 +183 +181 +182 +183 +182 +182 +183 +182 +183 +181 +181 +182 +181 +183 +182 +182 +183 +181 +180 +181 +182 +182 +12 +11 +10 +9 +11 +11 +10 +182 +184 +182 +183 +181 +182 +182 +182 +181 +182 +181 +185 +182 +182 +183 +184 +180 +184 +182 +181 +182 +183 +183 +183 +182 +11 +11 +11 +11 +14 +10 +11 +182 +181 +182 +180 +183 +182 +183 +182 +182 +182 +182 +183 +183 +183 +182 +183 +182 +181 +182 +182 +184 +184 +183 +185 +181 +11 +9 +9 +12 +11 +11 +12 +182 +183 +182 +182 +183 +181 +182 +182 +182 +182 +185 +182 +183 +181 +180 +183 +182 +183 +183 +182 +181 +182 +185 +182 +182 +14 +12 +11 +11 +10 +8 +11 +183 +182 +183 +183 +181 +182 +182 +181 +182 +183 +183 +184 +182 +182 +182 +182 +183 +182 +183 +183 +182 +182 +182 +181 +182 +12 +13 +12 +12 +10 +9 +11 +183 +182 +183 +182 +182 +182 +183 +182 +182 +182 +183 +183 +183 +182 +183 +184 +182 +182 +181 +183 +182 +182 +183 +181 +180 +12 +10 \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/b5/b5d926b78c0ca46b2e63aa5ed1a2491f4225ecca.svn-base b/Old Matlab Interface/.svn/pristine/b5/b5d926b78c0ca46b2e63aa5ed1a2491f4225ecca.svn-base new file mode 100644 index 00000000..f86821bd --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/b5/b5d926b78c0ca46b2e63aa5ed1a2491f4225ecca.svn-base @@ -0,0 +1,6 @@ +a = 324567890; +tic +b = find(a>9999999,1, 'first'); +toc + +b; \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/ba/bab093ba2af354496638140bb68de7d473dd215c.svn-base b/Old Matlab Interface/.svn/pristine/ba/bab093ba2af354496638140bb68de7d473dd215c.svn-base new file mode 100644 index 00000000..50c1bb50 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/ba/bab093ba2af354496638140bb68de7d473dd215c.svn-base @@ -0,0 +1,26 @@ +function [cool_waveform] = undofrontend(temp_waveform,channel) + +Vcc = 3.3; +TOP = 128; +R4 = 75e3; +R3 = 1e6; +R2 = 1e3; +R1 = 1e3; + +global scope_gain_0 +global scope_gain_1 +global CH1_AC +global CH2_AC + +if channel == 1 + scope_gain = scope_gain_1 + AC_offset = CH2_AC * 1.65 +else + scope_gain = scope_gain_0 + AC_offset = CH1_AC * 1.65 +end + +cool_waveform = double(temp_waveform); + +cool_waveform = (cool_waveform * (Vcc/2)) / (R4/(R3+R4)*scope_gain*TOP) + Vcc*(R2/(R1+R2)); +cool_waveform = cool_waveform - AC_offset; \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/bd/bd7bf351de353254abead31a09f14e0d87a0633f.svn-base b/Old Matlab Interface/.svn/pristine/bd/bd7bf351de353254abead31a09f14e0d87a0633f.svn-base new file mode 100644 index 00000000..7dae927b --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/bd/bd7bf351de353254abead31a09f14e0d87a0633f.svn-base @@ -0,0 +1,18 @@ +function [] = setpsu(vo, ro); + +vcc = 3.3; +gain = 4.22; +vdrop = 0; +PER=256; + +psucal +vdrop = polyval(p_oc, vo) + polyval(p_ios,vo) - vo; + +CCA = ((vo + vdrop)*PER)/(vcc*gain); +CCA = uint16(CCA) + +mex_usb_send_control('40', 'a3', dec2hex(CCA), '0', '0', '0'); + +% driverLocation = 'c:\libusbk\examples\open-device\debug\win32'; +% command = [driverLocation '\open-device "03eb" "a000" "' command '" "' num2str(CCA) '" "NULL" "NULL" "NULL"'] +% system(command); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/bd/bd9cd5c53b27c190f63541df132b4b29f54b9dd9.svn-base b/Old Matlab Interface/.svn/pristine/bd/bd9cd5c53b27c190f63541df132b4b29f54b9dd9.svn-base new file mode 100644 index 00000000..420e7d70 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/bd/bd9cd5c53b27c190f63541df132b4b29f54b9dd9.svn-base @@ -0,0 +1,5 @@ +USB_POOL_FREE(ovlPool); +pause(rand(1)); +mex_usb_init('03eb', 'a000') +[isoCtx_0, isoCtx_1, ovlkHandle_0, ovlkHandle_1, ovlPool, isoBuffer] = USB_ISO_INIT(usb_handle) + diff --git a/Old Matlab Interface/.svn/pristine/bd/bdf7a339b44a37e42b34c1561828dd031f37f95a.svn-base b/Old Matlab Interface/.svn/pristine/bd/bdf7a339b44a37e42b34c1561828dd031f37f95a.svn-base new file mode 100644 index 00000000..3b4d0f57 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/bd/bdf7a339b44a37e42b34c1561828dd031f37f95a.svn-base @@ -0,0 +1,8 @@ +function [] = setpsu_boost(vo, vi, r) + err = verr(vo, r) + D = 1 - vi/(vo+err) + if D>0.75 + error('PSU DUTY CYCLE TOO LARGE!!! ABORTING!!!') + end + D = uint16(D*255) + mex_usb_send_control('40', 'a3', dec2hex(D), '0', '0', '0'); diff --git a/Old Matlab Interface/.svn/pristine/c0/c08e2e1c5ccfc0f4c6ed2ba1fb5cde835ebf53b7.svn-base b/Old Matlab Interface/.svn/pristine/c0/c08e2e1c5ccfc0f4c6ed2ba1fb5cde835ebf53b7.svn-base new file mode 100644 index 00000000..50d5d46d --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/c0/c08e2e1c5ccfc0f4c6ed2ba1fb5cde835ebf53b7.svn-base @@ -0,0 +1,11 @@ +a = 1:100 +b = 101:200 + +for k = 1:100 + plot(1,1) +end +tic +hold on + plot(a,b) + stairs(a,b) +toc \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/c1/c16c7b18552b3fc8b2a52f6d5c6f5634ba03bcda.svn-base b/Old Matlab Interface/.svn/pristine/c1/c16c7b18552b3fc8b2a52f6d5c6f5634ba03bcda.svn-base new file mode 100644 index 00000000..ca0f7a9f --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/c1/c16c7b18552b3fc8b2a52f6d5c6f5634ba03bcda.svn-base @@ -0,0 +1,136 @@ +program opendevice; + +{$APPTYPE CONSOLE} + +uses + SysUtils, Classes, + libusbK in '..\libusbK.pas', + UExampleHelpers; +var + VID, PID : Integer; +procedure EvaluateCommandLine; +var + i : Integer; + s, s0,s1 : String; + n : Integer; +begin + for i := 1 to ParamCount do + begin + s := Uppercase(ParamStr(i)); //copy the whole current param string and convert to upper cases + s0 := Copy(s,1,4); // copy the first 4 signs + if (s0 = 'VID=') or + (s0 = 'PID=') then + begin // we got a vid or pid parm + s1 := Copy(s,5,MaxInt); // copy everything behind the '=' + if Copy(s1,1,2) = '0X' then // check the c-style hex notation + s1 := '$'+ Copy(s1,3,MaxInt); // replace by delphi hex-notation + n := StrToIntDef(s1,-1); // convert, place -1 on any convert error + if (s0 = 'VID=') then + VID := n + else if (s0 = 'PID=') then + PID := n; + end; + end; +end; +const + UsbPipeTypeString : array[USBD_PIPE_TYPE] of String = ( + 'Control', + 'Isochronous', + 'Bulk,', + 'Interrupt' + ); + +var + devlist : TStringList; + i,j,k : Integer; + devhandle : KUSB_HANDLE; + pipeinfo : WINUSB_PIPE_INFORMATION; +begin + WriteLn('OpenDevice test for LibusbK'); + WriteLn('Returns Pipe info for all devices, or limited to a given VID/PID pair'); + WriteLn('usage:'); + WriteLn('opendevice [VID=nnnn] [PID=nnnn]'); + WriteLn('VID and PID may use decimal or hexadecimal notation'); + VID := -1; + PID := -1; + EvaluateCommandLine; + if VID < 0 then + WriteLn('VID is not used!') + else + WriteLn('VID used '+Format('%d (0x%x',[VID,VID])); + if VID < 0 then + WriteLn('PID is not used!') + else + WriteLn('PID used '+Format('%d (0x%x',[PID,PID])); + devlist := TStringList.Create; + try + ListLibusbKDevices(devlist,VID,PID); + if devlist.Count <= 0 then + begin + WriteLn('Error: No device found!'); + Exit; + end; + for i := 0 to devlist.Count-1 do + begin + if UsbK_InitFromDevicePath(devlist[i],devhandle) then + begin + try + WriteLn('Opened device "'+devlist[i]+'"'); + j := 0; + while UsbK_SetCurrentAlternateSetting(devhandle,j) do + begin + WriteLn('Using AlternateSetting ',j); + k := 0; + while UsbK_QueryPipe(devhandle,j,k,pipeinfo) do + begin + WriteLn(Format(' PipeId=0x%2.2x PipeType=0x%2.2x ("%s") Interval=%u MaximumPacketSize=%u', + [pipeInfo.PipeId, Byte(pipeInfo.PipeType),UsbPipeTypeString[pipeInfo.PipeType], pipeInfo.Interval, pipeInfo.MaximumPacketSize])); + Inc(k); + end; + Inc(j); + end; + finally + UsbK_Free(devhandle); + end; + end + else + WriteLn('Error: can not open device "'+devlist[i]+'"'); + end; + finally + devlist.Free; + end; +(* Example output +OpenDevice test for LibusbK +Returns Pipe info for all devices, or limited to a given VID/PID pair +usage: +opendevice [VID=nnnn] [PID=nnnn] +VID and PID may use decimal or hexadecimal notation +VID is not used! +PID is not used! +Opened device "\\?\USB#Vid_04b4&Pid_8613#6&1b8c4f52&0&1#{53373f62-b5e4-d526-b292 +-f86533b3e7df}" +Using AlternateSetting 0 +Using AlternateSetting 1 + PipeId=0x01 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 + PipeId=0x81 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 + PipeId=0x02 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 + PipeId=0x04 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 + PipeId=0x86 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 + PipeId=0x88 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 +Using AlternateSetting 2 + PipeId=0x01 PipeType=0x03 ("Interrupt") Interval=1 MaximumPacketSize=64 + PipeId=0x81 PipeType=0x03 ("Interrupt") Interval=1 MaximumPacketSize=64 + PipeId=0x02 PipeType=0x03 ("Interrupt") Interval=1 MaximumPacketSize=512 + PipeId=0x04 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 + PipeId=0x86 PipeType=0x03 ("Interrupt") Interval=1 MaximumPacketSize=512 + PipeId=0x88 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 +Using AlternateSetting 3 + PipeId=0x01 PipeType=0x03 ("Interrupt") Interval=1 MaximumPacketSize=64 + PipeId=0x81 PipeType=0x03 ("Interrupt") Interval=1 MaximumPacketSize=64 + PipeId=0x02 PipeType=0x01 ("Isochronous") Interval=1 MaximumPacketSize=512 + PipeId=0x04 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 + PipeId=0x86 PipeType=0x01 ("Isochronous") Interval=1 MaximumPacketSize=512 + PipeId=0x88 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512} +*) + +end. diff --git a/Old Matlab Interface/.svn/pristine/c5/c55b35eb191bca8e58fbab3b4e69302308bdd0c3.svn-base b/Old Matlab Interface/.svn/pristine/c5/c55b35eb191bca8e58fbab3b4e69302308bdd0c3.svn-base new file mode 100644 index 00000000..9188b95d Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/c5/c55b35eb191bca8e58fbab3b4e69302308bdd0c3.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/c5/c59f20e7cc2d121a4c984a45dd615e2cc84be5a7.svn-base b/Old Matlab Interface/.svn/pristine/c5/c59f20e7cc2d121a4c984a45dd615e2cc84be5a7.svn-base new file mode 100644 index 00000000..db006a3f --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/c5/c59f20e7cc2d121a4c984a45dd615e2cc84be5a7.svn-base @@ -0,0 +1,92 @@ +%mex USB_ISO_LOOP.c -Iincludes -llibusbK -Lbin\lib\amd64 +%clear all + +global usb_handle +global scope_gain +global scope_window_time +global scope_window_max +global scope_window_min +global scope_mode +global gui_scope_running + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global gui_cursor_mode +global saved_waveform_ch1 +global saved_waveform_ch2 + +dotheplot + +if ~length(usb_handle) + warning('USB Handle not initialised. Initialising!') + mex_usb_init('03eb', 'a000') +end + +[isoCtx_0, isoCtx_1, ovlkHandle_0, ovlkHandle_1, ovlPool, isoBuffer] = USB_ISO_INIT(usb_handle) + +refreshrate = 4; +refreshrate_temp = refreshrate; + +if(isempty(max_n)) + max_n = 10 +end +saved_waveform_ch1 = int8([]); + +if isempty(scope_mode) + error('You didn''t set the scope mode!'); +end + +if isempty(scope_window_time) + error('You didn''t set the window time (x) value!'); +end + +if (scope_window_time < 1/375000) + error('Scope window size is too small!'); +end + +if(scope_mode==0) + if isempty(scope_gain) + error('You didn''t set the gain!'); + end + + if isempty(scope_window_min) + error('You didn''t set the minimum window voltage value!'); + end + + if isempty(scope_window_max) + error('You didn''t set the maximum window voltage value!'); + end +end + +dropped_packets = 0; +waveform_exists = 0; + +for n=1:max_n + %[transfer_contents_0] = USB_ISO_LOOP(usb_handle, isoCtx_0, ovlkHandle_0, ovlPool, isoBuffer, uint8(0)); + [transfer_contents_0, libk_error] = USB_ISO_LOOP(usb_handle, isoCtx_0, ovlkHandle_0, ovlPool, isoBuffer, uint8(0)); + %keep_in_sync + displaypacket(transfer_contents_0) + if(gui_scope_running) + updatescopeaxes + else + plotcursors + drawnow + end + + %[transfer_contents_1] = USB_ISO_LOOP(usb_handle, isoCtx_1, ovlkHandle_1, ovlPool, isoBuffer, uint8(1)); + [transfer_contents_1, libk_error] = USB_ISO_LOOP(usb_handle, isoCtx_1, ovlkHandle_1, ovlPool, isoBuffer, uint8(1)); + %keep_in_sync + displaypacket(transfer_contents_1) + if(gui_scope_running) + updatescopeaxes + else + plotcursors + drawnow + end +end + +clear all +max_n = 2000 +mex_usb_iso_loop \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/c7/c73ee86a3151a5652537a0cdf85eb2544c2ac2fc.svn-base b/Old Matlab Interface/.svn/pristine/c7/c73ee86a3151a5652537a0cdf85eb2544c2ac2fc.svn-base new file mode 100644 index 00000000..e0e93271 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/c7/c73ee86a3151a5652537a0cdf85eb2544c2ac2fc.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/c8/c8241f8aa6cded21d2f4c182db3240c8c80f5acd.svn-base b/Old Matlab Interface/.svn/pristine/c8/c8241f8aa6cded21d2f4c182db3240c8c80f5acd.svn-base new file mode 100644 index 00000000..c230e609 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/c8/c8241f8aa6cded21d2f4c182db3240c8c80f5acd.svn-base @@ -0,0 +1,106 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {6A4CD32B-560F-4967-9112-37B3FD5699CC} + Exe + Properties + Xfer.UsbStream + Xfer.UsbStream + v2.0 + 512 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + true + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + libusbK.cs + + + Common\BenchmarkTestDevice.cs + + + Common\HiPerfTimer.cs + + + Common\TestParameters.cs + + + + + + + + False + .NET Framework Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/c9/c911569ea160a4acb105a087c4c99a8133cc6ad2.svn-base b/Old Matlab Interface/.svn/pristine/c9/c911569ea160a4acb105a087c4c99a8133cc6ad2.svn-base new file mode 100644 index 00000000..5cbcae5a Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/c9/c911569ea160a4acb105a087c4c99a8133cc6ad2.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/c9/c9d65d7d2ae53bd4e2a501d2b9e8a465681d039d.svn-base b/Old Matlab Interface/.svn/pristine/c9/c9d65d7d2ae53bd4e2a501d2b9e8a465681d039d.svn-base new file mode 100644 index 00000000..5e9d6a49 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/c9/c9d65d7d2ae53bd4e2a501d2b9e8a465681d039d.svn-base @@ -0,0 +1,69 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// AssemblyInfo.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.Reflection; +using System.Runtime.InteropServices; + + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyTitle("Xfer.Async")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Xfer.Async")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("bfe3ff24-a3d7-4ccc-b010-df007284dc6a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/c9/c9fc3943bb5e40c85ade2f8bd88314f327f40ec7.svn-base b/Old Matlab Interface/.svn/pristine/c9/c9fc3943bb5e40c85ade2f8bd88314f327f40ec7.svn-base new file mode 100644 index 00000000..2a030327 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/c9/c9fc3943bb5e40c85ade2f8bd88314f327f40ec7.svn-base @@ -0,0 +1,6 @@ +mex USB_INIT.c -Iincludes -llibusbK -Lbin\lib\amd64 +mex USB_CTRL_SEND.c -Iincludes -llibusbK -Lbin\lib\amd64 +mex USB_ISO_INIT.c -Iincludes -llibusbK -Lbin\lib\amd64 +mex USB_ISO_LOOP.c -Iincludes -llibusbK -Lbin\lib\amd64 +mex USB_POOL_FREE.c -Iincludes -llibusbK -Lbin\lib\amd64 + diff --git a/Old Matlab Interface/.svn/pristine/ca/ca5efeb46a4701590fffc385c7cc9f0f693389fc.svn-base b/Old Matlab Interface/.svn/pristine/ca/ca5efeb46a4701590fffc385c7cc9f0f693389fc.svn-base new file mode 100644 index 00000000..8b904fc5 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/ca/ca5efeb46a4701590fffc385c7cc9f0f693389fc.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/cb/cbd188d48e4202497c0f72bd16bb87da5ef6f2d1.svn-base b/Old Matlab Interface/.svn/pristine/cb/cbd188d48e4202497c0f72bd16bb87da5ef6f2d1.svn-base new file mode 100644 index 00000000..a266b826 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/cb/cbd188d48e4202497c0f72bd16bb87da5ef6f2d1.svn-base @@ -0,0 +1,118 @@ +namespace Hot.Plug.Detect.GUI +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dgvDevices = new System.Windows.Forms.DataGridView(); + this.label1 = new System.Windows.Forms.Label(); + this.colSymbolicLink = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colDeviceDesc = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colInstanceID = new System.Windows.Forms.DataGridViewTextBoxColumn(); + ((System.ComponentModel.ISupportInitialize)(this.dgvDevices)).BeginInit(); + this.SuspendLayout(); + // + // dgvDevices + // + this.dgvDevices.AllowUserToAddRows = false; + this.dgvDevices.AllowUserToDeleteRows = false; + this.dgvDevices.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dgvDevices.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dgvDevices.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.colSymbolicLink, + this.colDeviceDesc, + this.colInstanceID}); + this.dgvDevices.Location = new System.Drawing.Point(12, 38); + this.dgvDevices.MultiSelect = false; + this.dgvDevices.Name = "dgvDevices"; + this.dgvDevices.ReadOnly = true; + this.dgvDevices.RowHeadersVisible = false; + this.dgvDevices.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvDevices.ShowEditingIcon = false; + this.dgvDevices.Size = new System.Drawing.Size(419, 179); + this.dgvDevices.TabIndex = 0; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 22); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(104, 13); + this.label1.TabIndex = 1; + this.label1.Text = "Connected Devices:"; + // + // colSymbolicLink + // + this.colSymbolicLink.HeaderText = "SymbolicLink"; + this.colSymbolicLink.Name = "colSymbolicLink"; + this.colSymbolicLink.ReadOnly = true; + this.colSymbolicLink.Visible = false; + // + // colDeviceDesc + // + this.colDeviceDesc.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.colDeviceDesc.HeaderText = "Name"; + this.colDeviceDesc.Name = "colDeviceDesc"; + this.colDeviceDesc.ReadOnly = true; + // + // colInstanceID + // + this.colInstanceID.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.colInstanceID.HeaderText = "Instance ID"; + this.colInstanceID.Name = "colInstanceID"; + this.colInstanceID.ReadOnly = true; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(443, 229); + this.Controls.Add(this.label1); + this.Controls.Add(this.dgvDevices); + this.Name = "Form1"; + this.Text = "Hot Plug Detection GUI Example"; + this.Load += new System.EventHandler(this.Form1_Load); + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); + ((System.ComponentModel.ISupportInitialize)(this.dgvDevices)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.DataGridView dgvDevices; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.DataGridViewTextBoxColumn colSymbolicLink; + private System.Windows.Forms.DataGridViewTextBoxColumn colDeviceDesc; + private System.Windows.Forms.DataGridViewTextBoxColumn colInstanceID; + + } +} + diff --git a/Old Matlab Interface/.svn/pristine/ce/ce10b80357bb5082e5834e41bfc9d842f114f45b.svn-base b/Old Matlab Interface/.svn/pristine/ce/ce10b80357bb5082e5834e41bfc9d842f114f45b.svn-base new file mode 100644 index 00000000..4ca6bb25 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/ce/ce10b80357bb5082e5834e41bfc9d842f114f45b.svn-base @@ -0,0 +1,106 @@ +%mex USB_ISO_LOOP.c -Iincludes -llibusbK -Lbin\lib\amd64 +%clear all + +global usb_handle +global scope_gain_0 +global scope_gain_1 +global scope_window_time +global scope_window_max +global scope_window_min +global scope_mode +global gui_scope_running + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global gui_cursor_mode +global saved_waveform_ch1 +global saved_waveform_ch2 + +global refreshrate +global refreshrate_temp +global waveform_exists + +global trigger + +trigger = struct('l', 0, 'h', 0, 'state', 0, 'begin', 1, 'enabled', 0); + +dotheplot + +if ~length(usb_handle) + warning('USB Handle not initialised. Initialising!') + mex_usb_init('03eb', 'a000') +end + +[stm_handle] = USB_ISO_INIT(usb_handle) + +refreshrate = 4; +refreshrate_temp = refreshrate; + +if(isempty(max_n)) + max_n = 10 +end +saved_waveform_ch1 = int8([]); + +if isempty(scope_mode) + error('You didn''t set the scope mode!'); +end + +if isempty(scope_window_time) + error('You didn''t set the window time (x) value!'); +end + +if (scope_window_time < 1/375000) + error('Scope window size is too small!'); +end + +if(scope_mode==0) + if isempty(scope_gain_0) || isempty(scope_gain_1) + error('You didn''t set the gain!'); + end + + if isempty(scope_window_min) + error('You didn''t set the minimum window voltage value!'); + end + + if isempty(scope_window_max) + error('You didn''t set the maximum window voltage value!'); + end +end + +dropped_packets = 0; +if(isempty(waveform_exists)) + waveform_exists = 0; +end + +sem_avail = 0; +timer_30ms = timer ('TimerFcn', 'sem_avail = sem_avail + 1;', 'Period', 30e-3, 'ExecutionMode', 'fixedRate'); +start(timer_30ms); + +for n=1:max_n + %[transfer_contents_0] = USB_ISO_LOOP(usb_handle, isoCtx_0, ovlkHandle_0, ovlPool, isoBuffer, uint8(0)); + + while(sem_avail==0) + pause(0); + %timer_30ms; + end + sem_avail = sem_avail - 1; + [transfer_contents_0, libk_error] = USB_ISO_LOOP(usb_handle, stm_handle); + keep_in_sync + displaypacket(transfer_contents_0) + updatescopeaxes + + %[transfer_contents_1] = USB_ISO_LOOP(usb_handle, isoCtx_1, ovlkHandle_1, ovlPool, isoBuffer, uint8(1)); + + while(sem_avail==0) + pause(0.001); + end + sem_avail = sem_avail - 1; + [transfer_contents_1, libk_error] = USB_ISO_LOOP(usb_handle, stm_handle); + keep_in_sync + displaypacket(transfer_contents_1) + updatescopeaxes +end + +crash_recover \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/cf/cfed60fdfa127afcb252a0507c939b2e6d710f4a.svn-base b/Old Matlab Interface/.svn/pristine/cf/cfed60fdfa127afcb252a0507c939b2e6d710f4a.svn-base new file mode 100644 index 00000000..e3436189 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/cf/cfed60fdfa127afcb252a0507c939b2e6d710f4a.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/d0/d050cf2300644013dd8cb6702d7131635f651fd2.svn-base b/Old Matlab Interface/.svn/pristine/d0/d050cf2300644013dd8cb6702d7131635f651fd2.svn-base new file mode 100644 index 00000000..f20f18de Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/d0/d050cf2300644013dd8cb6702d7131635f651fd2.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/d2/d25c3322121da7330cfaba960c9517632a0ff944.svn-base b/Old Matlab Interface/.svn/pristine/d2/d25c3322121da7330cfaba960c9517632a0ff944.svn-base new file mode 100644 index 00000000..a3f6e422 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/d2/d25c3322121da7330cfaba960c9517632a0ff944.svn-base @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Hot.Plug.Detect.GUI")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Hot.Plug.Detect.GUI")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c3a55330-daa9-4501-8852-8ec0dcd33cc5")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Old Matlab Interface/.svn/pristine/d3/d35431714a5bc9b48fad9121b319978f5f34bed8.svn-base b/Old Matlab Interface/.svn/pristine/d3/d35431714a5bc9b48fad9121b319978f5f34bed8.svn-base new file mode 100644 index 00000000..ffc7c41c Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/d3/d35431714a5bc9b48fad9121b319978f5f34bed8.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/d6/d6cabc27537ccaf079a2064ef3b96519b25f6c85.svn-base b/Old Matlab Interface/.svn/pristine/d6/d6cabc27537ccaf079a2064ef3b96519b25f6c85.svn-base new file mode 100644 index 00000000..5ad95774 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/d6/d6cabc27537ccaf079a2064ef3b96519b25f6c85.svn-base @@ -0,0 +1,87 @@ +%mex USB_ISO_LOOP.c -Iincludes -llibusbK -Lbin\lib\amd64 +%clear all + +global usb_handle +global scope_gain_0 +global scope_gain_1 +global scope_window_time +global scope_window_max +global scope_window_min +global scope_mode +global gui_scope_running + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global gui_cursor_mode +global saved_waveform_ch1 +global saved_waveform_ch2 + +global refreshrate +global refreshrate_temp +global waveform_exists + +dotheplot + +if ~length(usb_handle) + warning('USB Handle not initialised. Initialising!') + mex_usb_init('03eb', 'a000') +end + +[isoCtx_0, isoCtx_1, ovlkHandle_0, ovlkHandle_1, ovlPool, isoBuffer] = USB_ISO_INIT(usb_handle) + +refreshrate = 4; +refreshrate_temp = refreshrate; + +if(isempty(max_n)) + max_n = 10 +end +saved_waveform_ch1 = int8([]); + +if isempty(scope_mode) + error('You didn''t set the scope mode!'); +end + +if isempty(scope_window_time) + error('You didn''t set the window time (x) value!'); +end + +if (scope_window_time < 1/375000) + error('Scope window size is too small!'); +end + +if(scope_mode==0) + if isempty(scope_gain_0) || isempty(scope_gain_1) + error('You didn''t set the gain!'); + end + + if isempty(scope_window_min) + error('You didn''t set the minimum window voltage value!'); + end + + if isempty(scope_window_max) + error('You didn''t set the maximum window voltage value!'); + end +end + +dropped_packets = 0; +if(isempty(waveform_exists)) + waveform_exists = 0; +end + +for n=1:max_n + %[transfer_contents_0] = USB_ISO_LOOP(usb_handle, isoCtx_0, ovlkHandle_0, ovlPool, isoBuffer, uint8(0)); + [transfer_contents_0, libk_error] = USB_ISO_LOOP(usb_handle, isoCtx_0, ovlkHandle_0, ovlPool, isoBuffer, uint8(0)); + keep_in_sync + displaypacket(transfer_contents_0) + updatescopeaxes + + %[transfer_contents_1] = USB_ISO_LOOP(usb_handle, isoCtx_1, ovlkHandle_1, ovlPool, isoBuffer, uint8(1)); + [transfer_contents_1, libk_error] = USB_ISO_LOOP(usb_handle, isoCtx_1, ovlkHandle_1, ovlPool, isoBuffer, uint8(1)); + keep_in_sync + displaypacket(transfer_contents_1) + updatescopeaxes +end + +crash_recover \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/da/da39a3ee5e6b4b0d3255bfef95601890afd80709.svn-base b/Old Matlab Interface/.svn/pristine/da/da39a3ee5e6b4b0d3255bfef95601890afd80709.svn-base new file mode 100644 index 00000000..e69de29b diff --git a/Old Matlab Interface/.svn/pristine/da/da866910c208578c2c480996b8f954aa1ab590a1.svn-base b/Old Matlab Interface/.svn/pristine/da/da866910c208578c2c480996b8f954aa1ab590a1.svn-base new file mode 100644 index 00000000..4d5d74c2 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/da/da866910c208578c2c480996b8f954aa1ab590a1.svn-base @@ -0,0 +1,63 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2011-2012 Travis Robinson +// All rights reserved. +// +// List.Devices +// +// Last Updated: 03.08.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +using System; +using libusbK; + +namespace List.Devices +{ + internal class Program + { + private static void Main() + { + int deviceIndex = 0; + int deviceCount = 0; + KLST_DEVINFO_HANDLE deviceInfo; + LstK lst = new LstK(KLST_FLAG.NONE); + + lst.Count(ref deviceCount); + while (lst.MoveNext(out deviceInfo)) + { + // Write some information about the device. + string displayLine = String.Format("{0} of {1}: {2}", + ++deviceIndex, + deviceCount, + deviceInfo.DeviceDesc); + Console.WriteLine(displayLine); + Console.WriteLine("- " + deviceInfo.DeviceID); + Console.WriteLine(); + } + + if (deviceCount == 0) + Console.WriteLine("No devices found!\n"); + + lst.Free(); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/db/db182b0d3ea5e048b3e869ea5f3010741accba03.svn-base b/Old Matlab Interface/.svn/pristine/db/db182b0d3ea5e048b3e869ea5f3010741accba03.svn-base new file mode 100644 index 00000000..aa2829ac Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/db/db182b0d3ea5e048b3e869ea5f3010741accba03.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/dc/dc51964367858a68e8535d6469dd458b6ba901bd.svn-base b/Old Matlab Interface/.svn/pristine/dc/dc51964367858a68e8535d6469dd458b6ba901bd.svn-base new file mode 100644 index 00000000..78bbdccd --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/dc/dc51964367858a68e8535d6469dd458b6ba901bd.svn-base @@ -0,0 +1,12 @@ +Vcc = 3.3; +TOP = 128; +R4 = 75e3; +R3 = 1e6; +R2 = 1e3; +R1 = 1e3; + +global scope_gain + +cool_waveform = double(temp_waveform); + +cool_waveform = (cool_waveform * (Vcc/2)) / (R4/(R3+R4)*scope_gain*TOP) + Vcc*(R2/(R1+R2)); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/dd/dd80704ba87713ec4a22e4bc45c69cb28591c907.svn-base b/Old Matlab Interface/.svn/pristine/dd/dd80704ba87713ec4a22e4bc45c69cb28591c907.svn-base new file mode 100644 index 00000000..391ba950 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/dd/dd80704ba87713ec4a22e4bc45c69cb28591c907.svn-base @@ -0,0 +1,13 @@ +function [] = displaypacket(new_packets) + +global saved_waveform_ch1 +global saved_waveform_ch2 +global scope_mode + +if scope_mode < 5 + transfer_contents_temp = []; + for tempovar = 0:length(new_packets)/750 - 1 + transfer_contents_temp = [transfer_contents_temp new_packets((tempovar*750+1):(tempovar*750+374))]; + end + saved_waveform_ch1 = [saved_waveform_ch1 transfer_contents_temp]; +end diff --git a/Old Matlab Interface/.svn/pristine/dd/dde630d9e7c16214e15471c54bfb5e6f6a438efd.svn-base b/Old Matlab Interface/.svn/pristine/dd/dde630d9e7c16214e15471c54bfb5e6f6a438efd.svn-base new file mode 100644 index 00000000..fae4ac32 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/dd/dde630d9e7c16214e15471c54bfb5e6f6a438efd.svn-base @@ -0,0 +1,323 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2011-2012 Travis Robinson +// All rights reserved. +// +// Read.Isochronous +// +// Last Updated: 03.08.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +#define BMFW + +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Threading; +using Test.Devices; +using libusbK; +using libusbK.Examples; + +namespace Read.Isochronous +{ + // ReSharper disable InconsistentNaming + + internal class Program + { + #region TODO USER: Set the test parameters for your device. + + public static IsoTestParameters Test = new IsoTestParameters(0x04d8, 0xfa2e, 0, 0x82, 3, 64, "xfer-iso-read.txt", 24); + + #endregion + + private static void Main(string[] args) + { + bool success; + WINUSB_PIPE_INFORMATION pipeInfo; + UsbK usb; + USB_INTERFACE_DESCRIPTOR interfaceDescriptor; + + // Find and configure the device. + if (!Test.ConfigureDevice(out pipeInfo, out usb, out interfaceDescriptor)) return; + +#if BMFW + // TODO FOR USER: Remove this block if not using benchmark firmware. + // This configures devices running benchmark firmware for streaming DeviceToHost transfers. + Console.WriteLine("Configuring for benchmark device.."); + BM_TEST_TYPE testType = BM_TEST_TYPE.READ; + success = Benchmark.Configure(usb, BM_COMMAND.SET_TEST, interfaceDescriptor.bInterfaceNumber, ref testType); + if (!success) + { + Console.WriteLine("Bench_Configure failed."); + } +#endif + // Create the ISO transfer queue. This class manages the pending and outstanding transfer lists. + ReadIsoTransferQueue readXfers = new ReadIsoTransferQueue(usb, ref pipeInfo, Test.MaxOutstandingTransfers, Test.IsoPacketsPerTransfer); + + if (!Test.ShowTestReady()) goto Done; + + // Always issue a reset pipe prior to re/starting an ISO stream. + usb.ResetPipe(pipeInfo.PipeId); + + // This example will not manage the start frame manually, but this is + // how I might caculate the starting point. + usb.GetCurrentFrameNumber(out readXfers.FrameNumber); + unchecked + { + // Add some start latency + readXfers.FrameNumber += 32; + + // Start FrameNumber at an interval of 8. + readXfers.FrameNumber -= ((readXfers.FrameNumber)%8); + } + + // This is a counter/timer used only for statistics gathering. + Thread.Sleep(0); + Test.Dcs.Start(); + + // Transfer processing loop + do + { + IsoTransferItem isoTransferItem; + int transferred; + int errorCode; + // While buffers exist in the completed list, submit them. + while (readXfers.Completed.Count > 0 && readXfers.TotalSubmittedCount < Test.MaxTransfersTotal) + { + errorCode = readXfers.SubmitNextRead(); + if (errorCode != 0) + { + Console.WriteLine("IsoReadPipe failed. ErrorCode: {0:X8}h", errorCode); + goto Done; + } + } + + if (readXfers.Outstanding.Count == 0) + { + // The MAX_TRANSFERS_TOTAL test limit hit. + Console.WriteLine("Done!"); + goto Done; + } + + // Wait for the oldest transfer to complete. + errorCode = readXfers.WaitRead(out isoTransferItem, 1000, out transferred); + if (errorCode != 0) + { + Console.WriteLine("OvlPool.Wait failed. ErrorCode: {0:X8}h", errorCode); + goto Done; + } + + // Report iso status. + IsoXferReport(readXfers, isoTransferItem, transferred); + + if (readXfers.CompletedCount == 1) Test.Dcs.Start(); + } while (true); + + Done: + readXfers.Destroy(); + Test.Free(); + + usb.Free(); + } + + private static void IsoXferReport(ReadIsoTransferQueue readIsoTransfers, IsoTransferItem isoTransferItem, int transferLength) + { + int packetPos; + Test.Dcs.Stop(transferLength); + if (readIsoTransfers.LastStartFrame == 0) + { + Test.LogLn("#{0}: StartFrame={1:X8}h TransferLength={2} BPS-average:{3}", + readIsoTransfers.CompletedCount, + isoTransferItem.Iso.StartFrame, + transferLength, + Math.Round(Test.Dcs.Bps, 2)); + } + else + { + int lastFrameCount = isoTransferItem.Iso.StartFrame - readIsoTransfers.LastStartFrame; + Test.LogLn("#{0}: StartFrame={1:X8}h TransferLength={2} BPS-average:{3} LastFrameCount={4}", + readIsoTransfers.CompletedCount, + isoTransferItem.Iso.StartFrame, + transferLength, + Math.Round(Test.Dcs.Bps, 2), + lastFrameCount); + } + + int numPackets = isoTransferItem.Iso.NumberOfPackets; + for (packetPos = 0; packetPos < numPackets; packetPos++) + { + KISO_PACKET isoPacket; + isoTransferItem.Iso.GetPacket(packetPos, out isoPacket); + if (isoPacket.Length > 1) + { + // This is somewhat specific to data that is returned by the benchmark firmware. + byte firstPacketByte = isoTransferItem.Buffer[isoPacket.Offset]; + byte secondPacketByte = isoTransferItem.Buffer[isoPacket.Offset + 1]; + Test.LogLn(" [{0:000}] Length={1} B0={2:X2}h B1={3:X2}h", packetPos, isoPacket.Length, firstPacketByte, secondPacketByte); + } + else + { + Test.LogLn(" [{0:000}] Empty Packet", packetPos); + } + } + + readIsoTransfers.CompletedCount++; + readIsoTransfers.LastStartFrame = isoTransferItem.Iso.StartFrame; + } + } + + internal class IsoTransferItem + { + public byte[] Buffer; + public GCHandle BufferGC; + public IsoK Iso; + public KOVL_HANDLE Ovl; + } + + internal class ReadIsoTransferQueue + { + #region Transfer lists + + public LinkedList Completed = new LinkedList(); + public LinkedList Master = new LinkedList(); + public LinkedList Outstanding = new LinkedList(); + + #endregion + + #region Core queue members + + public readonly int DataBufferSize; + public readonly OvlK OvlPool; + public readonly WINUSB_PIPE_INFORMATION PipeInfo; + public readonly UsbK Usb; + + #endregion + + #region Frame management + + public int FrameNumber; + public int LastStartFrame; + + #endregion + + #region Statisitics + + public uint CompletedCount; + public uint TotalSubmittedCount; + + #endregion + + public ReadIsoTransferQueue(UsbK usb, ref WINUSB_PIPE_INFORMATION pipeInfo, int maxPendingTransfers, int numberOfPackets) + { + PipeInfo = pipeInfo; + Usb = usb; + OvlPool = new OvlK(usb.Handle, maxPendingTransfers, KOVL_POOL_FLAG.NONE); + DataBufferSize = (pipeInfo.MaximumPacketSize*numberOfPackets); + for (int pos = 0; pos < maxPendingTransfers; pos++) + { + IsoTransferItem isoTransferItem = new IsoTransferItem(); + + isoTransferItem.Buffer = new byte[pipeInfo.MaximumPacketSize*numberOfPackets]; + isoTransferItem.BufferGC = GCHandle.Alloc(isoTransferItem.Buffer, GCHandleType.Pinned); + + isoTransferItem.Iso = new IsoK(numberOfPackets, 0); + isoTransferItem.Iso.SetPackets(pipeInfo.MaximumPacketSize); + + OvlPool.Acquire(out isoTransferItem.Ovl); + + Master.AddLast(isoTransferItem); + Completed.AddLast(isoTransferItem); + } + } + + public void Destroy() + { + // Cancel any outstanding IO and release the OvlK. + foreach (IsoTransferItem myIsoBuffer in Outstanding) + { + int transferred; + OvlPool.WaitAndRelease(myIsoBuffer.Ovl, 0, out transferred); + } + Completed.Clear(); + Outstanding.Clear(); + + foreach (IsoTransferItem myIsoBuffer in Master) + { + myIsoBuffer.Iso.Free(); + myIsoBuffer.BufferGC.Free(); + } + Master.Clear(); + OvlPool.Free(); + } + + private static void SetNextFrameNumber(IsoTransferItem isoTransferItem) + { + } + + public int SubmitNextRead() + { + // Pull from head of Completed list and push to end of Outstanding list + IsoTransferItem isoTransferItem = Completed.First.Value; + Completed.RemoveFirst(); + Outstanding.AddLast(isoTransferItem); + + // If managing a start frame manually, set it here and update the the frame counter for the next transfer. + SetNextFrameNumber(isoTransferItem); + + // Prepare the OvlK handle to be submitted. + OvlPool.ReUse(isoTransferItem.Ovl); + + // The data buffer was pinned earlier when it was allocated. Always pin managed memory before using it + // in an asynchronous function to keep the framework from tampering with it. + Usb.IsoReadPipe(PipeInfo.PipeId, + isoTransferItem.Buffer, + DataBufferSize, + isoTransferItem.Ovl, + isoTransferItem.Iso.Handle); + + int errorCode = Marshal.GetLastWin32Error(); + + // 997 is ERROR_IO_PENDING. For async, this means so far so good. + // IE: The transfer is submitted but we won't know if a problem occurs until it is completed. + if (errorCode != ErrorCodes.IoPending) return errorCode; + + TotalSubmittedCount++; + + return 0; + } + + public int WaitRead(out IsoTransferItem isoTransferItem, int i, out int transferred) + { + isoTransferItem = Outstanding.First.Value; + bool success = OvlPool.Wait(isoTransferItem.Ovl, 1000, KOVL_WAIT_FLAG.NONE, out transferred); + if (!success) + { + return Marshal.GetLastWin32Error(); + } + + Outstanding.RemoveFirst(); + Completed.AddLast(isoTransferItem); + + return 0; + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/de/de51647d95849ef82e410e841ad7472895a45c08.svn-base b/Old Matlab Interface/.svn/pristine/de/de51647d95849ef82e410e841ad7472895a45c08.svn-base new file mode 100644 index 00000000..be39bb28 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/de/de51647d95849ef82e410e841ad7472895a45c08.svn-base @@ -0,0 +1,69 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// AssemblyInfo.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.Reflection; +using System.Runtime.InteropServices; + + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyTitle("Xfer.UsbStream")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Xfer.UsbStream")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("3d6a566f-2b7f-4ada-9e61-8691a59bd3bc")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/de/dee616359ba67ec117dffff180ca1669936f867a.svn-base b/Old Matlab Interface/.svn/pristine/de/dee616359ba67ec117dffff180ca1669936f867a.svn-base new file mode 100644 index 00000000..0a2ec0f4 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/de/dee616359ba67ec117dffff180ca1669936f867a.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/df/df65a8a27c87f1048f63bf5425146ada309e0042.svn-base b/Old Matlab Interface/.svn/pristine/df/df65a8a27c87f1048f63bf5425146ada309e0042.svn-base new file mode 100644 index 00000000..85f25b07 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/df/df65a8a27c87f1048f63bf5425146ada309e0042.svn-base @@ -0,0 +1,39 @@ +function [wave] = tiny_wave_conv(wave, amplitude); + +global scope_mode +switch(scope_mode) + case 0 + max_length = 750; + case 1 + max_length = 128; + warning('Nowhere to store scope data on device. Only frequency will be transmitted.') + case 2 + max_length = 128; + warning('Nowhere to store scope data on device. Only frequency will be transmitted.') + case 3 + max_length = 750; + case 4 + max_length = 128; + warning('Nowhere to store scope data on device. Only frequency will be transmitted.') + case 5 + max_length = 1500; + case 6 + max_length = 128; + warning('Nowhere to store scope data on device. Only frequency will be transmitted.') + otherwise + error('Invalid scope_mode!') +end + + +if length(wave)>max_length + wave=imresize(wave,max_length/length(wave)); + warning('Vector length is greater than max_length. It has been scaled down.') +end + +if (amplitude>255 | amplitude<0 | amplitude ~= round(amplitude)) + error('Amplitude must be an integer between 0 and 255 for an 8 bit waveform!') +end + +wave = wave - min(wave); +wave = wave * amplitude / max(wave); +wave = round(wave); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/df/dfc3cbd62eadfc9c19e1481956d39d3f78bcb631.svn-base b/Old Matlab Interface/.svn/pristine/df/dfc3cbd62eadfc9c19e1481956d39d3f78bcb631.svn-base new file mode 100644 index 00000000..66fa3d1e Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/df/dfc3cbd62eadfc9c19e1481956d39d3f78bcb631.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/e0/e00bd01aaeb4abbbaa963b83ef9b8fc9ff93c944.svn-base b/Old Matlab Interface/.svn/pristine/e0/e00bd01aaeb4abbbaa963b83ef9b8fc9ff93c944.svn-base new file mode 100644 index 00000000..605b0244 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/e0/e00bd01aaeb4abbbaa963b83ef9b8fc9ff93c944.svn-base @@ -0,0 +1,146 @@ +global scope_window_time +global scope_window_max +global scope_window_min +global scope_mode +global gui_axes +global text_box_1 +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global gui_cursor_mode +global saved_waveform_ch1 +global saved_waveform_ch2 +global gui_scope_running + +global refreshrate_temp +global refreshrate + +global waveform_exists +global gui_delay + +refreshrate_temp = refreshrate_temp - 1; + +tic +delay_sec = get(gui_delay, 'Max') - get(gui_delay, 'Value'); +switch(scope_mode) + case 0 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + %if(gui_scope_running) + [taxis, cool_waveform] = conv_ana(saved_waveform_ch1, 375000*scope_window_time, 0); + %end + plotcursors + waveform_exists = 1; + else + if (waveform_exists) + set(text_box_1, 'String', sprintf(' ---------------------\n Vmin = %.2fV\n ---------------------\n Vmax = %.2f\n ---------------------\n Vmean = %.2f\n ---------------------\n Vrms = %.2f\n ---------------------\n ', min(cool_waveform), max(cool_waveform), mean(cool_waveform), rms(cool_waveform))); + %title(titlestring); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Voltage (V)') + drawnow + end + end + case 1 + if ~(refreshrate == 4) + error('Refreshrate assumed to be 4 for Mode 1') + end + switch(refreshrate_temp) + case 3 + %if(gui_scope_running) + [taxis, cool_waveform] = conv_ana(saved_waveform_ch1, 375000*scope_window_time, 0); + [taxis_ch2, temp_waveform_ch2] = conv_dig(saved_waveform_ch2, 375000*scope_window_time); + temp_waveform_ch2 = (scope_window_max - (0.05*(scope_window_max - scope_window_min)) - scope_window_min) * temp_waveform_ch2 + scope_window_min + (0.025*(scope_window_max - scope_window_min)); + % end + case 2 + stairs(gui_axes, taxis_ch2, temp_waveform_ch2, 'c'); + hold(gui_axes, 'on') + case 1 + plotcursors + hold(gui_axes, 'off') + case 0 + set(text_box_1, 'String', sprintf(' ---------------------\n Vmin = %.2fV\n ---------------------\n Vmax = %.2f\n ---------------------\n Vmean = %.2f\n ---------------------\n Vrms = %.2f\n ---------------------\n ', min(cool_waveform), max(cool_waveform), mean(cool_waveform), rms(cool_waveform))); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Voltage (V)') + refreshrate_temp = refreshrate; + drawnow + end + case 2 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + % if(gui_scope_running) + [taxis_ch1, cool_waveform_ch1] = conv_ana(saved_waveform_ch1, 375000*scope_window_time, 0); + [taxis_ch2, cool_waveform_ch2] = conv_ana(saved_waveform_ch2, 375000*scope_window_time, 1); + %end + plotcursors + waveform_exists = 1; + else + if (waveform_exists) + set(text_box_1, 'String', sprintf(' ---------------------\n Vmin = %.2fV\n ---------------------\n Vmax = %.2f\n ---------------------\n Vmean = %.2f\n ---------------------\n Vrms = %.2f\n ---------------------\n ', min(cool_waveform_ch1), max(cool_waveform_ch1), mean(cool_waveform_ch1), rms(cool_waveform_ch1))); + %title(titlestring); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Voltage (V)') + drawnow + end + end + case 3 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + %if(gui_scope_running) + [taxis, temp_waveform] = conv_dig(saved_waveform_ch1, 375000*scope_window_time); + % end + stairs(gui_axes, taxis, temp_waveform, 'y'); + else + set(gui_axes, 'Ylim', [-0.1, 1.1], 'Xlim', [-scope_window_time-delay_sec, 0-delay_sec], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + set(text_box_1, 'String', 'Scope in dig mode'); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Logic Value') + drawnow + end + case 4 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + % if(gui_scope_running) + [taxis_ch1, temp_waveform_ch1] = conv_dig(saved_waveform_ch1, 375000*scope_window_time); + [taxis_ch2, temp_waveform_ch2] = conv_dig(saved_waveform_ch2, 375000*scope_window_time); + %end + waveform_exists = 1 + stairs(gui_axes, taxis_ch1, temp_waveform_ch1, 'y'); + hold(gui_axes, 'off') + elseif (refreshrate_temp == 1) && (waveform_exists) + stairs(gui_axes, taxis_ch2, temp_waveform_ch2, 'c'); + hold(gui_axes, 'on') + else + set(gui_axes, 'Ylim', [-0.1, 1.1], 'Xlim', [-scope_window_time-delay_sec, 0-delay_sec], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + set(text_box_1, 'String', 'Scope in dig mode'); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Logic Value') + drawnow + end + case 5 + set(text_box_1, 'String', 'Scope disabled'); + xlabel(gui_axes, '') + ylabel(gui_axes, '') + drawnow + pause(0.001) + case 6 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + %if(gui_scope_running) + [taxis, cool_waveform] = conv_ana(saved_waveform_ch1, 750000*scope_window_time, 0); + %end + plotcursors + waveform_exists = 1; + else + if (waveform_exists) + set(text_box_1, 'String', sprintf(' ---------------------\n Vmin = %.2fV\n ---------------------\n Vmax = %.2f\n ---------------------\n Vmean = %.2f\n ---------------------\n Vrms = %.2f\n ---------------------\n ', min(cool_waveform), max(cool_waveform), mean(cool_waveform), rms(cool_waveform))); + %title(titlestring); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Voltage (V)') + drawnow + end + end + otherwise + error('scope_mode invalid!') +end +toc \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/e3/e31bc70650fefc87ee8e537155c125d24f11c484.svn-base b/Old Matlab Interface/.svn/pristine/e3/e31bc70650fefc87ee8e537155c125d24f11c484.svn-base new file mode 100644 index 00000000..a506a2bd --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/e3/e31bc70650fefc87ee8e537155c125d24f11c484.svn-base @@ -0,0 +1,10 @@ +clear all +first_gui_test +pause(0.01) +max_n = 10000; +setscopemode(0,1,1) +setpsu(0,1000) +tiny_send_waveform(sin(linspace(0,2*pi, 750)),255,300) +%tiny_send_waveform(1:100, 255, 100) +mex_usb_iso_loop +%%plot(saved_waveform) \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/e7/e78c57614ab2a63318d6d6b1fcdde440f5f47cf9.svn-base b/Old Matlab Interface/.svn/pristine/e7/e78c57614ab2a63318d6d6b1fcdde440f5f47cf9.svn-base new file mode 100644 index 00000000..aafd8f21 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/e7/e78c57614ab2a63318d6d6b1fcdde440f5f47cf9.svn-base @@ -0,0 +1,16 @@ +clear +clear global +clear functions +global num_lc +num_lc = 0 +set(0,'RecursionLimit',100000) +setscopewindowsize(1, 0, 5) +first_gui_test +pause(0.01) +max_n = 100000000; +setscopemode(0,0.5,0.5) +%setpsu(0,1000) +tiny_send_waveform(sin(linspace(0,2*pi, 128)),255,432) +%tiny_send_waveform(1:100, 255, 100) +mex_usb_iso_loop +%%plot(saved_waveform) \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/e8/e8395bc3b71c1792e8a9fe2b5896f8a263b73e57.svn-base b/Old Matlab Interface/.svn/pristine/e8/e8395bc3b71c1792e8a9fe2b5896f8a263b73e57.svn-base new file mode 100644 index 00000000..3e1285c0 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/e8/e8395bc3b71c1792e8a9fe2b5896f8a263b73e57.svn-base @@ -0,0 +1,35 @@ +function [taxis, temp_waveform] = conv_dig(buffer, samplestoshow) +global scope_window_time +global gui_delay + +delay_sec = get(gui_delay, 'Max') - get(gui_delay, 'Value'); +delay_sample = delay_sec*(samplestoshow/scope_window_time); + +if length(buffer)>samplestoshow + if (scope_window_time>(500/375000)) + temp_waveform = buffer((length(buffer) - samplestoshow - delay_sample):samplestoshow/500: (length(buffer) - delay_sample)); + temp_waveform = typecast(temp_waveform, 'uint8'); + temp_waveform = logical(bitand(temp_waveform,16)); + else + throwaway = round((ceil(samplestoshow)-samplestoshow)*8); + dig_samples = buffer((length(buffer) - samplestoshow - delay_sample) : (length(buffer) - delay_sample)); + dig_samples = typecast(dig_samples, 'uint8'); + temp_waveform = false(1,length(dig_samples)*8); + temp_waveform(1:8:length(temp_waveform)) = bitand(dig_samples,128); + temp_waveform(2:8:length(temp_waveform)) = bitand(dig_samples,64); + temp_waveform(3:8:length(temp_waveform)) = bitand(dig_samples,32); + temp_waveform(4:8:length(temp_waveform)) = bitand(dig_samples,16); + temp_waveform(5:8:length(temp_waveform)) = bitand(dig_samples,8); + temp_waveform(6:8:length(temp_waveform)) = bitand(dig_samples,4); + temp_waveform(7:8:length(temp_waveform)) = bitand(dig_samples,2); + temp_waveform(8:8:length(temp_waveform)) = bitand(dig_samples,1); + + temp_waveform = temp_waveform((throwaway+1):end); + temp_waveform = temp_waveform(1:length(temp_waveform)/500:end); + end + taxis = linspace(-scope_window_time-delay_sec,-delay_sec,length(temp_waveform)); + return +end + +taxis = []; +temp_waveform = []; \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/e9/e9c483bf05438060fe1bcbf50fec15e3e5f96514.svn-base b/Old Matlab Interface/.svn/pristine/e9/e9c483bf05438060fe1bcbf50fec15e3e5f96514.svn-base new file mode 100644 index 00000000..fd8f2ffd Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/e9/e9c483bf05438060fe1bcbf50fec15e3e5f96514.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/ea/ea3ef4fbc860418881fc8e3efaef12369b1c858c.svn-base b/Old Matlab Interface/.svn/pristine/ea/ea3ef4fbc860418881fc8e3efaef12369b1c858c.svn-base new file mode 100644 index 00000000..808d2bea --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/ea/ea3ef4fbc860418881fc8e3efaef12369b1c858c.svn-base @@ -0,0 +1,14 @@ +clear all +global num_lc +num_lc = 0 +set(0,'RecursionLimit',100000) +setscopewindowsize(1, 0, 5) +first_gui_test +pause(0.01) +max_n = 100000000; +setscopemode(0,0.5,0.5) +%setpsu(0,1000) +tiny_send_waveform(sin(linspace(0,2*pi, 128)),255,432) +%tiny_send_waveform(1:100, 255, 100) +mex_usb_iso_loop +%%plot(saved_waveform) \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/ea/eac5f5e9f6f8cab74dcb0452c5173d2a1944ce01.svn-base b/Old Matlab Interface/.svn/pristine/ea/eac5f5e9f6f8cab74dcb0452c5173d2a1944ce01.svn-base new file mode 100644 index 00000000..522fc2be --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/ea/eac5f5e9f6f8cab74dcb0452c5173d2a1944ce01.svn-base @@ -0,0 +1,12 @@ +clear all + +global usb_handle +if ~length(usb_handle) + warning('USB Handle not initialised. Initialising!') + mex_usb_init('03eb', 'a000') +end + +mex USB_ISO_INIT.c -Iincludes -llibusbK -Lbin\lib\amd64 +%USB_ISO_INIT(usb_handle) +[isoCtx_0, isoCtx_1, ovlkHandle_0, ovlkHandle_1, ovlPool, isoBuffer] = USB_ISO_INIT(usb_handle) +%USB_ISO_LOOP(usb_handle, isoCtx, ovlkHandle, ovlPool, isoBuffer, uint8(0)) \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/ed/edbf362730f0f3d815f3b0ae22207cb7d9615695.svn-base b/Old Matlab Interface/.svn/pristine/ed/edbf362730f0f3d815f3b0ae22207cb7d9615695.svn-base new file mode 100644 index 00000000..bdd2f770 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/ed/edbf362730f0f3d815f3b0ae22207cb7d9615695.svn-base @@ -0,0 +1,69 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// AssemblyInfo.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.Reflection; +using System.Runtime.InteropServices; + + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyTitle("List.Devices")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("List.Devices")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("535a41bb-2086-4cb2-8d38-2e12743bcb73")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/ee/ee3c211940aae62be90eccd5e6da149da079ba7c.svn-base b/Old Matlab Interface/.svn/pristine/ee/ee3c211940aae62be90eccd5e6da149da079ba7c.svn-base new file mode 100644 index 00000000..dc6152c7 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/ee/ee3c211940aae62be90eccd5e6da149da079ba7c.svn-base @@ -0,0 +1,65 @@ +global scope_window_time +global scope_window_max +global scope_window_min +global scope_mode +global gui_axes +global text_box_1 +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global gui_cursor_mode +global saved_waveform_ch1 +global saved_waveform_ch2 + +refreshrate_temp = refreshrate_temp - 1; + +tic +switch(scope_mode) + case 0 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + [taxis, cool_waveform] = conv_ana(saved_waveform_ch1, 375000*scope_window_time); + plotcursors + waveform_exists = 1; + else + if (waveform_exists) + set(text_box_1, 'String', sprintf(' ---------------------\n Vmin = %.2fV\n ---------------------\n Vmax = %.2f\n ---------------------\n Vmean = %.2f\n ---------------------\n Vrms = %.2f\n ---------------------\n ', min(cool_waveform), max(cool_waveform), mean(cool_waveform), rms(cool_waveform))); + %title(titlestring); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Voltage (V)') + drawnow + end + end + case 2 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + [taxis_ch1, cool_waveform_ch1] = conv_ana(saved_waveform_ch1, 375000*scope_window_time); + [taxis_ch2, cool_waveform_ch2] = conv_ana(saved_waveform_ch2, 375000*scope_window_time); + plotcursors + waveform_exists = 1; + else + if (waveform_exists) + set(text_box_1, 'String', sprintf(' ---------------------\n Vmin = %.2fV\n ---------------------\n Vmax = %.2f\n ---------------------\n Vmean = %.2f\n ---------------------\n Vrms = %.2f\n ---------------------\n ', min(cool_waveform_ch1), max(cool_waveform_ch1), mean(cool_waveform_ch1), rms(cool_waveform_ch1))); + %title(titlestring); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Voltage (V)') + drawnow + end + end + case 3 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + [taxis, temp_waveform] = conv_dig(saved_waveform_ch1, 375000*scope_window_time); + stairs(gui_axes, taxis, temp_waveform, 'y'); + else + set(gui_axes, 'Ylim', [-0.1, 1.1], 'Xlim', [-scope_window_time, 0], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + set(text_box_1, 'String', 'Scope in dig mode'); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Logic Value') + drawnow + end + otherwise + error('scope_mode invalid!') +end +toc \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/ef/efe4e6fc3b4b3682712980af8b94ae14cb294d33.svn-base b/Old Matlab Interface/.svn/pristine/ef/efe4e6fc3b4b3682712980af8b94ae14cb294d33.svn-base new file mode 100644 index 00000000..48d26bc8 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/ef/efe4e6fc3b4b3682712980af8b94ae14cb294d33.svn-base @@ -0,0 +1,44 @@ +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global scope_window_time +global scope_window_max +global scope_window_min + +global gui_cursor_mode +global gui_axes +global scope_mode +global gui_delay + +delay_sec = get(gui_delay, 'Max') - get(gui_delay, 'Value'); + +if(scope_mode==2) + switch(gui_cursor_mode) + case 1 + plot(gui_axes, taxis_ch1, cool_waveform_ch1, 'y', taxis_ch2, cool_waveform_ch2, 'c'); + case 2 + plot(gui_axes, taxis_ch1, cool_waveform_ch1, 'y', taxis_ch2, cool_waveform_ch2, 'c', [-scope_window_time-delay_sec, -delay_sec], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time-delay_sec, -delay_sec], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + case 3 + plot(gui_axes, taxis_ch1, cool_waveform_ch1, 'y', taxis_ch2, cool_waveform_ch2, 'c', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:'); + case 4 + plot(gui_axes, taxis_ch1, cool_waveform_ch1, 'y', taxis_ch2, cool_waveform_ch2, 'c', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + otherwise + error('Gui_axes is in an invalid state'); + end +else + switch(gui_cursor_mode) + case 1 + plot(gui_axes, taxis, cool_waveform, 'y'); + case 2 + plot(gui_axes, taxis, cool_waveform, 'y', [-scope_window_time-delay_sec, -delay_sec], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time-delay_sec, -delay_sec], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + case 3 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:'); + case 4 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + otherwise + error('Gui_axes is in an invalid state'); + end +end +set(gui_axes, 'Ylim', [scope_window_min, scope_window_max], 'Xlim', [-scope_window_time-delay_sec, -delay_sec], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + diff --git a/Old Matlab Interface/.svn/pristine/f0/f09b1f3552567c912a993da851d7016c8481685b.svn-base b/Old Matlab Interface/.svn/pristine/f0/f09b1f3552567c912a993da851d7016c8481685b.svn-base new file mode 100644 index 00000000..fe0a0794 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/f0/f09b1f3552567c912a993da851d7016c8481685b.svn-base @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4959 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Handle.Test.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Handle.Test.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Old Matlab Interface/.svn/pristine/f0/f0dcf1670d184c7e3efd7864797fd7b745b6bafc.svn-base b/Old Matlab Interface/.svn/pristine/f0/f0dcf1670d184c7e3efd7864797fd7b745b6bafc.svn-base new file mode 100644 index 00000000..bac5f81b --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/f0/f0dcf1670d184c7e3efd7864797fd7b745b6bafc.svn-base @@ -0,0 +1,4000 @@ +/*! \file libusbk.h +* \brief functions for usb device communication. +* +* \note +* This is the \b main libusbK USB user include file. +*/ + +#ifndef _LIBUSBK_H__ +#define _LIBUSBK_H__ + +#include "lusbk_shared.h" + +/////////////////////////////////////////////////////////////////////// +// L I B U S B K PUBLIC STRUCTS, DEFINES, AND ENUMS ////////////////// +/////////////////////////////////////////////////////////////////////// + +#ifndef _LIBUSBK_LIBK_TYPES + +/*! \addtogroup libk +* @{ +*/ + +#define _in +#define _inopt +#define _out +#define _outopt +#define _ref +#define _refopt + +//! UsbK base function pointer, See \ref LibK_GetProcAddress. +typedef INT_PTR (FAR WINAPI* KPROC)(); + +//! Indicates that a function is an exported API call. +#if defined(DYNAMIC_DLL) +#define KUSB_EXP +#else +#define KUSB_EXP +#endif + +//! Indicates the calling convention. This is always WINAPI (stdcall) by default. +#if !defined(KUSB_API) +#define KUSB_API WINAPI +#endif + +#pragma warning(disable:4201) + +#if _MSC_VER >= 1200 +#pragma warning(push) +#endif +#pragma warning (disable:4201) +#pragma warning(disable:4214) // named type definition in parentheses + +//! User defined handle context space, see \ref LibK_GetContext. +typedef INT_PTR KLIB_USER_CONTEXT; + +//! KUSB control setup packet. +/*! +* This union structure is identical in size to a \ref WINUSB_SETUP_PACKET, +* but provides additional field accessors. (see \ref libusbk.h for structure details) +*/ +typedef union _KUSB_SETUP_PACKET +{ + UCHAR Bytes[8]; + USHORT Words[4]; + struct + { + //! Request value + struct + { + UCHAR Recipient: 2; + UCHAR Reserved: 3; + UCHAR Type: 2; + UCHAR Dir: 1; + } BmRequest; + + //! Request type value + UCHAR Request; + + //! wValue + USHORT Value; + + //! wIndex + USHORT Index; + + //! wLength ushort value + USHORT Length; + }; + struct + { + struct + { + UCHAR b0: 1; + UCHAR b1: 1; + UCHAR b2: 1; + UCHAR b3: 1; + UCHAR b4: 1; + UCHAR b5: 1; + UCHAR b6: 1; + UCHAR b7: 1; + } BmRequestBits; + + struct + { + UCHAR b0: 1; + UCHAR b1: 1; + UCHAR b2: 1; + UCHAR b3: 1; + UCHAR b4: 1; + UCHAR b5: 1; + UCHAR b6: 1; + UCHAR b7: 1; + } RequestBits; + + UCHAR ValueLo; + UCHAR ValueHi; + UCHAR IndexLo; + UCHAR IndexHi; + UCHAR LengthLo; + UCHAR LengthHi; + }; +} KUSB_SETUP_PACKET; +// setup packet is eight bytes -- defined by spec +C_ASSERT(sizeof(KUSB_SETUP_PACKET) == 8); + +#if _MSC_VER >= 1200 +#pragma warning(pop) +#endif + + +//! Base handle type for all library handles, See \ref KLIB_HANDLE_TYPE. +typedef void* KLIB_HANDLE; + +//! Opaque UsbK handle, see \ref UsbK_Init. +typedef KLIB_HANDLE KUSB_HANDLE; + +//! Opaque LstK handle, see \ref LstK_Init. +typedef KLIB_HANDLE KLST_HANDLE; + +//! Opaque HotK handle, see \ref HotK_Init. +typedef KLIB_HANDLE KHOT_HANDLE; + +//! Opaque OvlK handle, see \ref OvlK_Acquire. +typedef KLIB_HANDLE KOVL_HANDLE; + + +//! Opaque OvlPoolK handle, see \ref OvlK_Init. +typedef KLIB_HANDLE KOVL_POOL_HANDLE; + +//! Opaque StmK handle, see \ref StmK_Init. +typedef KLIB_HANDLE KSTM_HANDLE; + +//! Handle type enumeration. +typedef enum _KLIB_HANDLE_TYPE +{ + //! Hot plug handle. \ref KHOT_HANDLE + KLIB_HANDLE_TYPE_HOTK, + + //! USB handle. \ref KUSB_HANDLE + KLIB_HANDLE_TYPE_USBK, + + //! Shared USB handle. \ref KUSB_HANDLE + KLIB_HANDLE_TYPE_USBSHAREDK, + + //! Device list handle. \ref KLST_HANDLE + KLIB_HANDLE_TYPE_LSTK, + + //! Device info handle. \ref KLST_DEVINFO_HANDLE + KLIB_HANDLE_TYPE_LSTINFOK, + + //! Overlapped handle. \ref KOVL_HANDLE + KLIB_HANDLE_TYPE_OVLK, + + //! Overlapped pool handle. \ref KOVL_POOL_HANDLE + KLIB_HANDLE_TYPE_OVLPOOLK, + + //! Pipe stream handle. \ref KSTM_HANDLE + KLIB_HANDLE_TYPE_STMK, + + //! Max handle type count. + KLIB_HANDLE_TYPE_COUNT +} KLIB_HANDLE_TYPE; + +//! Function typedef for \ref LibK_SetCleanupCallback. +typedef INT KUSB_API KLIB_HANDLE_CLEANUP_CB (_in KLIB_HANDLE Handle, _in KLIB_HANDLE_TYPE HandleType, _in KLIB_USER_CONTEXT UserContext); + +//! libusbK verson information structure. +typedef struct _KLIB_VERSION +{ + //! Major version number. + INT Major; + + //! Minor version number. + INT Minor; + + //! Micro version number. + INT Micro; + + //! Nano version number. + INT Nano; +} KLIB_VERSION; +//! Pointer to a \copybrief KLIB_VERSION +typedef KLIB_VERSION* PKLIB_VERSION; + +/*! @} */ +#endif + +#ifndef _LIBUSBK_ISOK_TYPES +/*! \addtogroup isok +* @{ +*/ + + +//! Callback function typedef for \ref IsoK_EnumPackets +typedef BOOL KUSB_API KISO_ENUM_PACKETS_CB (_in UINT PacketIndex, _in PKISO_PACKET IsoPacket, _in PVOID UserState); + +/*! @} */ +#endif + +#ifndef _LIBUSBK_LSTK_TYPES + +/*! \addtogroup lstk +* @{ +*/ + +//! Allocated length for all strings in a \ref KLST_DEVINFO structure. +#define KLST_STRING_MAX_LEN 256 + +//! Device list sync flags. +/*! +* These sync flags are also use by the hot plug module to indicate device +* arrival/removal notifications: +* - \b DeviceArrival = KLST_SYNC_FLAG_ADDED +* - \b DeviceRemoval = KLST_SYNC_FLAG_REMOVED +*/ +typedef enum _KLST_SYNC_FLAG +{ + //! Cleared/invalid state. + KLST_SYNC_FLAG_NONE = 0L, + + //! Unchanged state, + KLST_SYNC_FLAG_UNCHANGED = 0x0001, + + //! Added (Arrival) state, + KLST_SYNC_FLAG_ADDED = 0x0002, + + //! Removed (Unplugged) state, + KLST_SYNC_FLAG_REMOVED = 0x0004, + + //! Connect changed state. + KLST_SYNC_FLAG_CONNECT_CHANGE = 0x0008, + + //! All states. + KLST_SYNC_FLAG_MASK = 0x000F, +} KLST_SYNC_FLAG; + +//! Common usb device information structure +typedef struct _KLST_DEV_COMMON_INFO +{ + //! VendorID parsed from \ref KLST_DEVINFO::DeviceID + INT Vid; + + //! ProductID parsed from \ref KLST_DEVINFO::DeviceID + INT Pid; + + //! Composite interface number parsed from \ref KLST_DEVINFO::DeviceID. Set to \b -1 for devices that do not have the composite parent driver. + INT MI; + + // An ID that uniquely identifies a USB device. + CHAR InstanceID[KLST_STRING_MAX_LEN]; + +} KLST_DEV_COMMON_INFO; +//! Pointer to a \c KLST_DEV_COMMON_INFO structure. +typedef KLST_DEV_COMMON_INFO* PKLST_DEV_COMMON_INFO; + +//! Semi-opaque device information structure of a device list. +/*! +* +* \attention This structure is semi-opaque. +* +*/ +typedef struct _KLST_DEVINFO +{ + //! Common usb device information + KLST_DEV_COMMON_INFO Common; + + //! Driver id this device element is using + INT DriverID; + + //! Device interface GUID + CHAR DeviceInterfaceGUID[KLST_STRING_MAX_LEN]; + + //! Device instance ID. + /*! + * A Device instance ID has the following format: + * [enumerator]\[enumerator-specific-device-ID]\[instance-specific-ID] + * - [enumerator] + * - For USB device, the enumerator is always \c USB + * - [enumerator-specific-device-ID] + * - Contains the vendor and product id (VID_xxxx&PID_xxxx) + * - If present, contains the usbccgp (windows composite device layer) interface number (MI_xx) + * - [instance-specific-ID] + * - If the device is composite, contains a unique interface ID generated by Windows. + * - If the device is not composite and has a serial number, contains the devices serial number. + * - If the device does not have a serial number, contains a unique ID generated by Windows. + */ + CHAR DeviceID[KLST_STRING_MAX_LEN]; + + //! Class GUID. + CHAR ClassGUID[KLST_STRING_MAX_LEN]; + + //! Manufacturer name as specified in the INF file. + CHAR Mfg[KLST_STRING_MAX_LEN]; + + //! Device description as specified in the INF file. + CHAR DeviceDesc[KLST_STRING_MAX_LEN]; + + //! Driver service name. + CHAR Service[KLST_STRING_MAX_LEN]; + + //! Unique identifier. + CHAR SymbolicLink[KLST_STRING_MAX_LEN]; + + //! physical device filename used with the Windows \c CreateFile() + CHAR DevicePath[KLST_STRING_MAX_LEN]; + + //! libusb-win32 filter index id. + INT LUsb0FilterIndex; + + //! Indicates the devices connection state. + BOOL Connected; + + //! Synchronization flags. (internal use only) + KLST_SYNC_FLAG SyncFlags; + + INT BusNumber; + + INT DeviceAddress; + + //! If the the device is serialized, represents the string value of \ref USB_DEVICE_DESCRIPTOR::iSerialNumber. For Devices without a \b iSerialNumber, represents the unique \b InstanceID assigned by \b Windows. + CHAR SerialNumber[KLST_STRING_MAX_LEN]; + +} KLST_DEVINFO; +//! Pointer to a \ref KLST_DEVINFO structure. (semi-opaque) +typedef KLST_DEVINFO* KLST_DEVINFO_HANDLE; + +//! Device list initialization flags. +typedef enum _KLST_FLAG +{ + //! No flags (or 0) + KLST_FLAG_NONE = 0L, + + //! Enable listings for the raw device interface GUID \b only. {A5DCBF10-6530-11D2-901F-00C04FB951ED} + KLST_FLAG_INCLUDE_RAWGUID = 0x0001, + + //! List all libusbK devices including those not currently connected. + KLST_FLAG_INCLUDE_DISCONNECT = 0x0002, + +} KLST_FLAG; + +//! Device list/hot-plug pattern match structure. +/*! +* \fixedstruct{1024} +* +* These ansi char strings are used to specify which devices should be included in a device list. +* All strings file pattern match strings allowing asterisk or question mark chars as wildcards. +* +*/ +typedef struct _KLST_PATTERN_MATCH +{ + //! Pattern match a device instance id. + CHAR DeviceID[KLST_STRING_MAX_LEN]; + + //! Pattern match a device interface guid. + CHAR DeviceInterfaceGUID[KLST_STRING_MAX_LEN]; + + //! Pattern match a symbolic link. + CHAR ClassGUID[KLST_STRING_MAX_LEN]; + + //! fixed structure padding. + UCHAR z_F_i_x_e_d[1024 - KLST_STRING_MAX_LEN * 3]; + +} KLST_PATTERN_MATCH; +C_ASSERT(sizeof(KLST_PATTERN_MATCH) == 1024); + +//! Pointer to a \ref KLST_PATTERN_MATCH structure. +typedef KLST_PATTERN_MATCH* PKLST_PATTERN_MATCH; + +//! Device list enumeration function callback typedef. +/*! +* +* \param DeviceList +* The device list \c DeviceInfo belongs to +* +* \param DeviceInfo +* Device information +* +* \param Context +* User context that was passed into \ref LstK_Enumerate +* +* Use this typedef as a prototype for an enumeration function with \ref LstK_Enumerate. +* +*/ +typedef BOOL KUSB_API KLST_ENUM_DEVINFO_CB ( + _in KLST_HANDLE DeviceList, + _in KLST_DEVINFO_HANDLE DeviceInfo, + _in PVOID Context); + +/*! @} */ + +#endif + +#ifndef __USB_H__ + +#include + +/*! \addtogroup libk +* @{ +*/ + +//! Maximum value that can be added to the current start frame. +#define USBD_ISO_START_FRAME_RANGE 1024 + + +//! bmRequest.Dir +typedef enum _BMREQUEST_DIR +{ + BMREQUEST_DIR_HOST_TO_DEVICE = 0, + BMREQUEST_DIR_DEVICE_TO_HOST = 1, +} BMREQUEST_DIR; + +//! bmRequest.Type +typedef enum _BMREQUEST_TYPE +{ + //! Standard request. See \ref USB_REQUEST_ENUM + BMREQUEST_TYPE_STANDARD = 0, + + //! Class-specific request. + BMREQUEST_TYPE_CLASS = 1, + + //! Vendor-specific request + BMREQUEST_TYPE_VENDOR = 2, +} BMREQUEST_TYPE; + +//! bmRequest.Recipient +typedef enum _BMREQUEST_RECIPIENT +{ + //! Request is for a device. + BMREQUEST_RECIPIENT_DEVICE = 0, + + //! Request is for an interface of a device. + BMREQUEST_RECIPIENT_INTERFACE = 1, + + //! Request is for an endpoint of a device. + BMREQUEST_RECIPIENT_ENDPOINT = 2, + + //! Request is for a vendor-specific purpose. + BMREQUEST_RECIPIENT_OTHER = 3, +} BMREQUEST_RECIPIENT; + +//! Maximum length (in bytes) of a usb string. USB strings are always stored in wide-char format. +#define MAXIMUM_USB_STRING_LENGTH 255 + +//! Values for the bits returned by the \ref USB_REQUEST_GET_STATUS request. +typedef enum _USB_GETSTATUS +{ + //! Device is self powered + USB_GETSTATUS_SELF_POWERED = 0x01, + + //! Device can wake the system from a low power/sleeping state. + USB_GETSTATUS_REMOTE_WAKEUP_ENABLED = 0x02 +} USB_GETSTATUS; + +//! Standard USB descriptor types. For more information, see section 9-5 of the USB 3.0 specifications. +typedef enum _USB_DESCRIPTOR_TYPE +{ + //! Device descriptor type. + USB_DESCRIPTOR_TYPE_DEVICE = 0x01, + + //! Configuration descriptor type. + USB_DESCRIPTOR_TYPE_CONFIGURATION = 0x02, + + //! String descriptor type. + USB_DESCRIPTOR_TYPE_STRING = 0x03, + + //! Interface descriptor type. + USB_DESCRIPTOR_TYPE_INTERFACE = 0x04, + + //! Endpoint descriptor type. + USB_DESCRIPTOR_TYPE_ENDPOINT = 0x05, + + //! Device qualifier descriptor type. + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER = 0x06, + + //! Config power descriptor type. + USB_DESCRIPTOR_TYPE_CONFIG_POWER = 0x07, + + //! Interface power descriptor type. + USB_DESCRIPTOR_TYPE_INTERFACE_POWER = 0x08, + + //! Interface association descriptor type. + USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION = 0x0B, +} USB_DESCRIPTOR_TYPE; + +//! Makes \c wValue for a \ref USB_REQUEST_GET_DESCRIPTOR or \ref USB_REQUEST_SET_DESCRIPTOR request. +#define USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX(d, i) \ + ((USHORT)((USHORT)d<<8 | i)) + +//! Endpoint type mask for the \c bmAttributes field of a \ref USB_ENDPOINT_DESCRIPTOR +#define USB_ENDPOINT_TYPE_MASK 0x03 + +//! Indicates a control endpoint +#define USB_ENDPOINT_TYPE_CONTROL 0x00 + +//! Indicates an isochronous endpoint +#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01 + +//! Indicates a bulk endpoint +#define USB_ENDPOINT_TYPE_BULK 0x02 + +//! Indicates an interrupt endpoint +#define USB_ENDPOINT_TYPE_INTERRUPT 0x03 + +//! Config power mask for the \c bmAttributes field of a \ref USB_CONFIGURATION_DESCRIPTOR +#define USB_CONFIG_POWERED_MASK 0xc0 + +//! Values used in the \c bmAttributes field of a \ref USB_CONFIGURATION_DESCRIPTOR +enum USB_CONFIG_BM_ATTRIBUTE_ENUM +{ + //! The device is powered by it's host. + USB_CONFIG_BUS_POWERED = 0x80, + + //! The device has an external power source. + USB_CONFIG_SELF_POWERED = 0x40, + + //! The device is capable of waking the the host from a low power/sleeping state. + USB_CONFIG_REMOTE_WAKEUP = 0x20, +}; + +//! Endpoint direction mask for the \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR +#define USB_ENDPOINT_DIRECTION_MASK 0x80 + +//! Endpoint address mask for the \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR +#define USB_ENDPOINT_ADDRESS_MASK 0x0F + +//! Tests the \c bEndpointAddress direction bit. TRUE if the endpoint address is an OUT endpoint. (HostToDevice, PC Write) +/*! +* \param addr \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR +*/ +#define USB_ENDPOINT_DIRECTION_OUT(addr) (!((addr) & USB_ENDPOINT_DIRECTION_MASK)) + +//! Tests the \c bEndpointAddress direction bit. TRUE if the endpoint address is an IN endpoint. (DeviceToHost, PC Read) +/*! +* \param addr \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR +*/ +#define USB_ENDPOINT_DIRECTION_IN(addr) ((addr) & USB_ENDPOINT_DIRECTION_MASK) + +//! USB defined request codes +/* +* see Chapter 9 of the USB 2.0 specification for +* more information. +* +* These are the correct values based on the USB 2.0 specification. +*/ +enum USB_REQUEST_ENUM +{ + //! Request status of the specific recipient + USB_REQUEST_GET_STATUS = 0x00, + + //! Clear or disable a specific feature + USB_REQUEST_CLEAR_FEATURE = 0x01, + + //! Set or enable a specific feature + USB_REQUEST_SET_FEATURE = 0x03, + + //! Set device address for all future accesses + USB_REQUEST_SET_ADDRESS = 0x05, + + //! Get the specified descriptor + USB_REQUEST_GET_DESCRIPTOR = 0x06, + + //! Update existing descriptors or add new descriptors + USB_REQUEST_SET_DESCRIPTOR = 0x07, + + //! Get the current device configuration value + USB_REQUEST_GET_CONFIGURATION = 0x08, + + //! Set device configuration + USB_REQUEST_SET_CONFIGURATION = 0x09, + + //! Return the selected alternate setting for the specified interface + USB_REQUEST_GET_INTERFACE = 0x0A, + + //! Select an alternate interface for the specified interface + USB_REQUEST_SET_INTERFACE = 0x0B, + + //! Set then report an endpoint's synchronization frame + USB_REQUEST_SYNC_FRAME = 0x0C, +}; + +//! USB defined class codes +/*! +* see http://www.usb.org/developers/defined_class for more information. +* +*/ +enum USB_DEVICE_CLASS_ENUM +{ + //! Reserved class + USB_DEVICE_CLASS_RESERVED = 0x00, + + //! Audio class + USB_DEVICE_CLASS_AUDIO = 0x01, + + //! Communications class + USB_DEVICE_CLASS_COMMUNICATIONS = 0x02, + + //! Human Interface Device class + USB_DEVICE_CLASS_HUMAN_INTERFACE = 0x03, + + //! Imaging class + USB_DEVICE_CLASS_IMAGING = 0x06, + + //! Printer class + USB_DEVICE_CLASS_PRINTER = 0x07, + + //! Mass storage class + USB_DEVICE_CLASS_STORAGE = 0x08, + + //! Hub class + USB_DEVICE_CLASS_HUB = 0x09, + + //! vendor-specific class + USB_DEVICE_CLASS_VENDOR_SPECIFIC = 0xFF, +}; + +//! A structure representing the standard USB device descriptor. +/*! +* This descriptor is documented in section 9.6.1 of the USB 2.0 specification. +* All multiple-byte fields are represented in host-endian format. +*/ +typedef struct _USB_DEVICE_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! USB specification release number in binary-coded decimal. + /*! + * A value of 0x0200 indicates USB 2.0, 0x0110 indicates USB 1.1, etc. + */ + USHORT bcdUSB; + + //! USB-IF class code for the device + UCHAR bDeviceClass; + + //! USB-IF subclass code for the device + UCHAR bDeviceSubClass; + + //! USB-IF protocol code for the device + UCHAR bDeviceProtocol; + + //! Maximum packet size for control endpoint 0 + UCHAR bMaxPacketSize0; + + //! USB-IF vendor ID + USHORT idVendor; + + //! USB-IF product ID + USHORT idProduct; + + //! Device release number in binary-coded decimal + USHORT bcdDevice; + + //! Index of string descriptor describing manufacturer + UCHAR iManufacturer; + + //! Index of string descriptor describing product + UCHAR iProduct; + + //! Index of string descriptor containing device serial number + UCHAR iSerialNumber; + + //! Number of possible configurations + UCHAR bNumConfigurations; + +} USB_DEVICE_DESCRIPTOR; +//! pointer to a \c USB_DEVICE_DESCRIPTOR +typedef USB_DEVICE_DESCRIPTOR* PUSB_DEVICE_DESCRIPTOR; + +//! A structure representing the standard USB endpoint descriptor. +/*! +* This descriptor is documented in section 9.6.3 of the USB 2.0 specification. +* All multiple-byte fields are represented in host-endian format. +*/ +typedef struct _USB_ENDPOINT_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! The address of the endpoint described by this descriptor. + /*! + * - Bits 0:3 are the endpoint number + * - Bits 4:6 are reserved + * - Bit 7 indicates direction + */ + UCHAR bEndpointAddress; + + //! Attributes which apply to the endpoint when it is configured using the bConfigurationValue. + /*! + * - Bits 0:1 determine the transfer type. + * - Bits 2:3 are only used for isochronous endpoints and refer to sync type. + * - Bits 4:5 are also only used for isochronous endpoints and refer to usage type. + * - Bits 6:7 are reserved. + */ + UCHAR bmAttributes; + + //! Maximum packet size this endpoint is capable of sending/receiving. + USHORT wMaxPacketSize; + + //! Interval for polling endpoint for data transfers. + UCHAR bInterval; + +} USB_ENDPOINT_DESCRIPTOR; +//! pointer to a \c USB_ENDPOINT_DESCRIPTOR +typedef USB_ENDPOINT_DESCRIPTOR* PUSB_ENDPOINT_DESCRIPTOR; + +//! A structure representing the standard USB configuration descriptor. +/* +* +* This descriptor is documented in section 9.6.3 of the USB 2.0 specification. +* All multiple-byte fields are represented in host-endian format. +* +*/ +typedef struct _USB_CONFIGURATION_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! Total length of data returned for this configuration + USHORT wTotalLength; + + //! Number of interfaces supported by this configuration + UCHAR bNumInterfaces; + + //! Identifier value for this configuration + UCHAR bConfigurationValue; + + //! Index of string descriptor describing this configuration + UCHAR iConfiguration; + + //! Configuration characteristics + UCHAR bmAttributes; + + //! Maximum power consumption of the USB device from this bus in this configuration when the device is fully operation. + /*! + * Expressed in units of 2 mA. + */ + UCHAR MaxPower; +} USB_CONFIGURATION_DESCRIPTOR; +//! pointer to a \c USB_CONFIGURATION_DESCRIPTOR +typedef USB_CONFIGURATION_DESCRIPTOR* PUSB_CONFIGURATION_DESCRIPTOR; + +//! A structure representing the standard USB interface descriptor. +/*! +* This descriptor is documented in section 9.6.5 of the USB 2.0 specification. +* All multiple-byte fields are represented in host-endian format. +*/ +typedef struct _USB_INTERFACE_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! Number of this interface + UCHAR bInterfaceNumber; + + //! Value used to select this alternate setting for this interface + UCHAR bAlternateSetting; + + //! Number of endpoints used by this interface (excluding the control endpoint) + UCHAR bNumEndpoints; + + //! USB-IF class code for this interface + UCHAR bInterfaceClass; + + //! USB-IF subclass code for this interface + UCHAR bInterfaceSubClass; + + //! USB-IF protocol code for this interface + UCHAR bInterfaceProtocol; + + //! Index of string descriptor describing this interface + UCHAR iInterface; + +} USB_INTERFACE_DESCRIPTOR; +//! pointer to a \c USB_INTERFACE_DESCRIPTOR +typedef USB_INTERFACE_DESCRIPTOR* PUSB_INTERFACE_DESCRIPTOR; + +//! A structure representing the standard USB string descriptor. +/*! +* This descriptor is documented in section 9.6.5 of the USB 2.0 specification. +* All multiple-byte fields are represented in host-endian format. +*/ +typedef struct _USB_STRING_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! Content of the string + WCHAR bString[1]; + +} USB_STRING_DESCRIPTOR; +//! pointer to a \c USB_STRING_DESCRIPTOR +typedef USB_STRING_DESCRIPTOR* PUSB_STRING_DESCRIPTOR; + +//! A structure representing the common USB descriptor. +typedef struct _USB_COMMON_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + +} USB_COMMON_DESCRIPTOR; +//! pointer to a \c USB_COMMON_DESCRIPTOR +typedef USB_COMMON_DESCRIPTOR* PUSB_COMMON_DESCRIPTOR; + +#if _MSC_VER >= 1200 +#pragma warning(push) +#endif +#pragma warning (disable:4201) +#pragma warning(disable:4214) // named type definition in parentheses + +//! Allows hardware manufacturers to define groupings of interfaces. +/*! +* +* The ECN specifies a USB descriptor, called the Interface Association +* Descriptor (IAD). +* +* The Universal Serial Bus Specification, revision 2.0, does not support +* grouping more than one interface of a composite device within a single +* function. However, the USB Device Working Group (DWG) created USB device +* classes that allow for functions with multiple interfaces, and the USB +* Implementor's Forum issued an Engineering Change Notification (ECN) that +* defines a mechanism for grouping interfaces. +* +*/ +typedef struct _USB_INTERFACE_ASSOCIATION_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! First interface number of the set of interfaces that follow this descriptor + UCHAR bFirstInterface; + + //! The Number of interfaces follow this descriptor that are considered "associated" + UCHAR bInterfaceCount; + + //! \c bInterfaceClass used for this associated interfaces + UCHAR bFunctionClass; + + //! \c bInterfaceSubClass used for the associated interfaces + UCHAR bFunctionSubClass; + + //! \c bInterfaceProtocol used for the associated interfaces + UCHAR bFunctionProtocol; + + //! Index of string descriptor describing the associated interfaces + UCHAR iFunction; + +} USB_INTERFACE_ASSOCIATION_DESCRIPTOR; +//! pointer to a \c USB_INTERFACE_ASSOCIATION_DESCRIPTOR +typedef USB_INTERFACE_ASSOCIATION_DESCRIPTOR* PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR; + +#if _MSC_VER >= 1200 +#pragma warning(pop) +#endif + +/*! @} */ + +#include +#endif // __USB_H__ + +#ifndef _LIBUSBK_LIBK_TYPES + +/*! \addtogroup libk +* @{ +*/ + +//! Usb handle specific properties that can be retrieved with \ref UsbK_GetProperty. +typedef enum _KUSB_PROPERTY +{ + //! Get the internal device file handle used for operations such as GetOverlappedResult or DeviceIoControl. + KUSB_PROPERTY_DEVICE_FILE_HANDLE, + + KUSB_PROPERTY_COUNT + +} KUSB_PROPERTY; + +//! Supported driver id enumeration. +typedef enum _KUSB_DRVID +{ + //! libusbK.sys driver ID + KUSB_DRVID_LIBUSBK, + + //! libusb0.sys driver ID + KUSB_DRVID_LIBUSB0, + + //! WinUSB.sys driver ID + KUSB_DRVID_WINUSB, + + //! libusb0.sys filter driver ID + KUSB_DRVID_LIBUSB0_FILTER, + + //! Supported driver count + KUSB_DRVID_COUNT + +} KUSB_DRVID; + +//! Supported function id enumeration. +typedef enum _KUSB_FNID +{ + //! \ref UsbK_Init dynamic driver function id. + KUSB_FNID_Init, + + //! \ref UsbK_Free dynamic driver function id. + KUSB_FNID_Free, + + //! \ref UsbK_ClaimInterface dynamic driver function id. + KUSB_FNID_ClaimInterface, + + //! \ref UsbK_ReleaseInterface dynamic driver function id. + KUSB_FNID_ReleaseInterface, + + //! \ref UsbK_SetAltInterface dynamic driver function id. + KUSB_FNID_SetAltInterface, + + //! \ref UsbK_GetAltInterface dynamic driver function id. + KUSB_FNID_GetAltInterface, + + //! \ref UsbK_GetDescriptor dynamic driver function id. + KUSB_FNID_GetDescriptor, + + //! \ref UsbK_ControlTransfer dynamic driver function id. + KUSB_FNID_ControlTransfer, + + //! \ref UsbK_SetPowerPolicy dynamic driver function id. + KUSB_FNID_SetPowerPolicy, + + //! \ref UsbK_GetPowerPolicy dynamic driver function id. + KUSB_FNID_GetPowerPolicy, + + //! \ref UsbK_SetConfiguration dynamic driver function id. + KUSB_FNID_SetConfiguration, + + //! \ref UsbK_GetConfiguration dynamic driver function id. + KUSB_FNID_GetConfiguration, + + //! \ref UsbK_ResetDevice dynamic driver function id. + KUSB_FNID_ResetDevice, + + //! \ref UsbK_Initialize dynamic driver function id. + KUSB_FNID_Initialize, + + //! \ref UsbK_SelectInterface dynamic driver function id. + KUSB_FNID_SelectInterface, + + //! \ref UsbK_GetAssociatedInterface dynamic driver function id. + KUSB_FNID_GetAssociatedInterface, + + //! \ref UsbK_Clone dynamic driver function id. + KUSB_FNID_Clone, + + //! \ref UsbK_QueryInterfaceSettings dynamic driver function id. + KUSB_FNID_QueryInterfaceSettings, + + //! \ref UsbK_QueryDeviceInformation dynamic driver function id. + KUSB_FNID_QueryDeviceInformation, + + //! \ref UsbK_SetCurrentAlternateSetting dynamic driver function id. + KUSB_FNID_SetCurrentAlternateSetting, + + //! \ref UsbK_GetCurrentAlternateSetting dynamic driver function id. + KUSB_FNID_GetCurrentAlternateSetting, + + //! \ref UsbK_QueryPipe dynamic driver function id. + KUSB_FNID_QueryPipe, + + //! \ref UsbK_SetPipePolicy dynamic driver function id. + KUSB_FNID_SetPipePolicy, + + //! \ref UsbK_GetPipePolicy dynamic driver function id. + KUSB_FNID_GetPipePolicy, + + //! \ref UsbK_ReadPipe dynamic driver function id. + KUSB_FNID_ReadPipe, + + //! \ref UsbK_WritePipe dynamic driver function id. + KUSB_FNID_WritePipe, + + //! \ref UsbK_ResetPipe dynamic driver function id. + KUSB_FNID_ResetPipe, + + //! \ref UsbK_AbortPipe dynamic driver function id. + KUSB_FNID_AbortPipe, + + //! \ref UsbK_FlushPipe dynamic driver function id. + KUSB_FNID_FlushPipe, + + //! \ref UsbK_IsoReadPipe dynamic driver function id. + KUSB_FNID_IsoReadPipe, + + //! \ref UsbK_IsoWritePipe dynamic driver function id. + KUSB_FNID_IsoWritePipe, + + //! \ref UsbK_GetCurrentFrameNumber dynamic driver function id. + KUSB_FNID_GetCurrentFrameNumber, + + //! \ref UsbK_GetOverlappedResult dynamic driver function id. + KUSB_FNID_GetOverlappedResult, + + //! \ref UsbK_GetProperty dynamic driver function id. + KUSB_FNID_GetProperty, + + + //! Supported function count + KUSB_FNID_COUNT, + +} KUSB_FNID; + +typedef BOOL KUSB_API KUSB_Init ( + _out KUSB_HANDLE* InterfaceHandle, + _in KLST_DEVINFO_HANDLE DevInfo); + +typedef BOOL KUSB_API KUSB_Free ( + _in KUSB_HANDLE InterfaceHandle); + +typedef BOOL KUSB_API KUSB_ClaimInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API KUSB_ReleaseInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API KUSB_SetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _in UCHAR AltSettingNumber); + +typedef BOOL KUSB_API KUSB_GetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _out PUCHAR AltSettingNumber); + +typedef BOOL KUSB_API KUSB_GetDescriptor ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR DescriptorType, + _in UCHAR Index, + _in USHORT LanguageID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred); + +typedef BOOL KUSB_API KUSB_ControlTransfer ( + _in KUSB_HANDLE InterfaceHandle, + _in WINUSB_SETUP_PACKET SetupPacket, + _refopt PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API KUSB_SetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +typedef BOOL KUSB_API KUSB_GetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +typedef BOOL KUSB_API KUSB_SetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR ConfigurationNumber); + +typedef BOOL KUSB_API KUSB_GetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR ConfigurationNumber); + +typedef BOOL KUSB_API KUSB_ResetDevice ( + _in KUSB_HANDLE InterfaceHandle); + +typedef BOOL KUSB_API KUSB_Initialize ( + _in HANDLE DeviceHandle, + _out KUSB_HANDLE* InterfaceHandle); + +typedef BOOL KUSB_API KUSB_SelectInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API KUSB_GetAssociatedInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AssociatedInterfaceIndex, + _out KUSB_HANDLE* AssociatedInterfaceHandle); + +typedef BOOL KUSB_API KUSB_Clone ( + _in KUSB_HANDLE InterfaceHandle, + _out KUSB_HANDLE* DstInterfaceHandle); + +typedef BOOL KUSB_API KUSB_QueryInterfaceSettings ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingIndex, + _out PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor); + +typedef BOOL KUSB_API KUSB_QueryDeviceInformation ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT InformationType, + _ref PUINT BufferLength, + _ref PVOID Buffer); + +typedef BOOL KUSB_API KUSB_SetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber); + +typedef BOOL KUSB_API KUSB_GetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR AltSettingNumber); + +typedef BOOL KUSB_API KUSB_QueryPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber, + _in UCHAR PipeIndex, + _out PWINUSB_PIPE_INFORMATION PipeInformation); + +typedef BOOL KUSB_API KUSB_SetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +typedef BOOL KUSB_API KUSB_GetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +typedef BOOL KUSB_API KUSB_ReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API KUSB_WritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API KUSB_ResetPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API KUSB_AbortPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API KUSB_FlushPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API KUSB_IsoReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +typedef BOOL KUSB_API KUSB_IsoWritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +typedef BOOL KUSB_API KUSB_GetCurrentFrameNumber ( + _in KUSB_HANDLE InterfaceHandle, + _out PUINT FrameNumber); + +typedef BOOL KUSB_API KUSB_GetOverlappedResult ( + _in KUSB_HANDLE InterfaceHandle, + _in LPOVERLAPPED Overlapped, + _out PUINT lpNumberOfBytesTransferred, + _in BOOL bWait); + +typedef BOOL KUSB_API KUSB_GetProperty ( + _in KUSB_HANDLE InterfaceHandle, + _in KUSB_PROPERTY PropertyType, + _ref PUINT PropertySize, + _out PVOID Value); + + + +//! USB core driver API information structure. +/*! +* This structure is part of \ref KUSB_DRIVER_API and contains +* driver and user specific information. +* +*/ +typedef struct _KUSB_DRIVER_API_INFO +{ + //! \readonly Driver id of the driver api. + INT DriverID; + + //! \readonly Number of valid functions contained in the driver API. + INT FunctionCount; + +} KUSB_DRIVER_API_INFO; + +//! Driver API function set structure. +/* +* Contains the driver specific USB core function pointer set. +* +* \note +* This structure has a fixed 512 byte structure size. +*/ +typedef struct _KUSB_DRIVER_API +{ + //! Driver API information. + KUSB_DRIVER_API_INFO Info; + + /*! \fn BOOL KUSB_API Init (_out KUSB_HANDLE* InterfaceHandle, _in KLST_DEVINFO_HANDLE DevInfo) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_Init + */ + KUSB_Init* Init; + + /*! \fn BOOL KUSB_API Free (_in KUSB_HANDLE InterfaceHandle) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_Free + */ + KUSB_Free* Free; + + /*! \fn BOOL KUSB_API ClaimInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR NumberOrIndex, _in BOOL IsIndex) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ClaimInterface + */ + KUSB_ClaimInterface* ClaimInterface; + + /*! \fn BOOL KUSB_API ReleaseInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR NumberOrIndex, _in BOOL IsIndex) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ReleaseInterface + */ + KUSB_ReleaseInterface* ReleaseInterface; + + /*! \fn BOOL KUSB_API SetAltInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR NumberOrIndex, _in BOOL IsIndex, _in UCHAR AltSettingNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SetAltInterface + */ + KUSB_SetAltInterface* SetAltInterface; + + /*! \fn BOOL KUSB_API GetAltInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR NumberOrIndex, _in BOOL IsIndex, _out PUCHAR AltSettingNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetAltInterface + */ + KUSB_GetAltInterface* GetAltInterface; + + /*! \fn BOOL KUSB_API GetDescriptor (_in KUSB_HANDLE InterfaceHandle, _in UCHAR DescriptorType, _in UCHAR Index, _in USHORT LanguageID, _out PUCHAR Buffer, _in UINT BufferLength, _outopt PUINT LengthTransferred) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetDescriptor + */ + KUSB_GetDescriptor* GetDescriptor; + + /*! \fn BOOL KUSB_API ControlTransfer (_in KUSB_HANDLE InterfaceHandle, _in WINUSB_SETUP_PACKET SetupPacket, _refopt PUCHAR Buffer, _in UINT BufferLength, _outopt PUINT LengthTransferred, _inopt LPOVERLAPPED Overlapped) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ControlTransfer + */ + KUSB_ControlTransfer* ControlTransfer; + + /*! \fn BOOL KUSB_API SetPowerPolicy (_in KUSB_HANDLE InterfaceHandle, _in UINT PolicyType, _in UINT ValueLength, _in PVOID Value) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SetPowerPolicy + */ + KUSB_SetPowerPolicy* SetPowerPolicy; + + /*! \fn BOOL KUSB_API GetPowerPolicy (_in KUSB_HANDLE InterfaceHandle, _in UINT PolicyType, _ref PUINT ValueLength, _out PVOID Value) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetPowerPolicy + */ + KUSB_GetPowerPolicy* GetPowerPolicy; + + /*! \fn BOOL KUSB_API SetConfiguration (_in KUSB_HANDLE InterfaceHandle, _in UCHAR ConfigurationNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SetConfiguration + */ + KUSB_SetConfiguration* SetConfiguration; + + /*! \fn BOOL KUSB_API GetConfiguration (_in KUSB_HANDLE InterfaceHandle, _out PUCHAR ConfigurationNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetConfiguration + */ + KUSB_GetConfiguration* GetConfiguration; + + /*! \fn BOOL KUSB_API ResetDevice (_in KUSB_HANDLE InterfaceHandle) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ResetDevice + */ + KUSB_ResetDevice* ResetDevice; + + /*! \fn BOOL KUSB_API Initialize (_in HANDLE DeviceHandle, _out KUSB_HANDLE* InterfaceHandle) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_Initialize + */ + KUSB_Initialize* Initialize; + + /*! \fn BOOL KUSB_API SelectInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR NumberOrIndex, _in BOOL IsIndex) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SelectInterface + */ + KUSB_SelectInterface* SelectInterface; + + /*! \fn BOOL KUSB_API GetAssociatedInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR AssociatedInterfaceIndex, _out KUSB_HANDLE* AssociatedInterfaceHandle) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetAssociatedInterface + */ + KUSB_GetAssociatedInterface* GetAssociatedInterface; + + /*! \fn BOOL KUSB_API Clone (_in KUSB_HANDLE InterfaceHandle, _out KUSB_HANDLE* DstInterfaceHandle) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_Clone + */ + KUSB_Clone* Clone; + + /*! \fn BOOL KUSB_API QueryInterfaceSettings (_in KUSB_HANDLE InterfaceHandle, _in UCHAR AltSettingIndex, _out PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_QueryInterfaceSettings + */ + KUSB_QueryInterfaceSettings* QueryInterfaceSettings; + + /*! \fn BOOL KUSB_API QueryDeviceInformation (_in KUSB_HANDLE InterfaceHandle, _in UINT InformationType, _ref PUINT BufferLength, _ref PVOID Buffer) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_QueryDeviceInformation + */ + KUSB_QueryDeviceInformation* QueryDeviceInformation; + + /*! \fn BOOL KUSB_API SetCurrentAlternateSetting (_in KUSB_HANDLE InterfaceHandle, _in UCHAR AltSettingNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SetCurrentAlternateSetting + */ + KUSB_SetCurrentAlternateSetting* SetCurrentAlternateSetting; + + /*! \fn BOOL KUSB_API GetCurrentAlternateSetting (_in KUSB_HANDLE InterfaceHandle, _out PUCHAR AltSettingNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetCurrentAlternateSetting + */ + KUSB_GetCurrentAlternateSetting* GetCurrentAlternateSetting; + + /*! \fn BOOL KUSB_API QueryPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR AltSettingNumber, _in UCHAR PipeIndex, _out PWINUSB_PIPE_INFORMATION PipeInformation) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_QueryPipe + */ + KUSB_QueryPipe* QueryPipe; + + /*! \fn BOOL KUSB_API SetPipePolicy (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _in UINT PolicyType, _in UINT ValueLength, _in PVOID Value) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SetPipePolicy + */ + KUSB_SetPipePolicy* SetPipePolicy; + + /*! \fn BOOL KUSB_API GetPipePolicy (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _in UINT PolicyType, _ref PUINT ValueLength, _out PVOID Value) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetPipePolicy + */ + KUSB_GetPipePolicy* GetPipePolicy; + + /*! \fn BOOL KUSB_API ReadPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _out PUCHAR Buffer, _in UINT BufferLength, _outopt PUINT LengthTransferred, _inopt LPOVERLAPPED Overlapped) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ReadPipe + */ + KUSB_ReadPipe* ReadPipe; + + /*! \fn BOOL KUSB_API WritePipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _in PUCHAR Buffer, _in UINT BufferLength, _outopt PUINT LengthTransferred, _inopt LPOVERLAPPED Overlapped) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_WritePipe + */ + KUSB_WritePipe* WritePipe; + + /*! \fn BOOL KUSB_API ResetPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ResetPipe + */ + KUSB_ResetPipe* ResetPipe; + + /*! \fn BOOL KUSB_API AbortPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_AbortPipe + */ + KUSB_AbortPipe* AbortPipe; + + /*! \fn BOOL KUSB_API FlushPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_FlushPipe + */ + KUSB_FlushPipe* FlushPipe; + + /*! \fn BOOL KUSB_API IsoReadPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _out PUCHAR Buffer, _in UINT BufferLength, _in LPOVERLAPPED Overlapped, _refopt PKISO_CONTEXT IsoContext) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_IsoReadPipe + */ + KUSB_IsoReadPipe* IsoReadPipe; + + /*! \fn BOOL KUSB_API IsoWritePipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _in PUCHAR Buffer, _in UINT BufferLength, _in LPOVERLAPPED Overlapped, _refopt PKISO_CONTEXT IsoContext) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_IsoWritePipe + */ + KUSB_IsoWritePipe* IsoWritePipe; + + /*! \fn BOOL KUSB_API GetCurrentFrameNumber (_in KUSB_HANDLE InterfaceHandle, _out PUINT FrameNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetCurrentFrameNumber + */ + KUSB_GetCurrentFrameNumber* GetCurrentFrameNumber; + + /*! \fn BOOL KUSB_API GetOverlappedResult (_in KUSB_HANDLE InterfaceHandle, _in LPOVERLAPPED Overlapped, _out PUINT lpNumberOfBytesTransferred, _in BOOL bWait) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetOverlappedResult + */ + KUSB_GetOverlappedResult* GetOverlappedResult; + + /*! \fn BOOL KUSB_API GetProperty (_in KUSB_HANDLE InterfaceHandle, _in KUSB_PROPERTY PropertyType, _ref PUINT PropertySize, _out PVOID Value) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetProperty + */ + KUSB_GetProperty* GetProperty; + + //! fixed structure padding. + UCHAR z_F_i_x_e_d[512 - sizeof(KUSB_DRIVER_API_INFO) - sizeof(UINT_PTR) * KUSB_FNID_COUNT]; + +} KUSB_DRIVER_API; +typedef KUSB_DRIVER_API* PKUSB_DRIVER_API; +C_ASSERT(sizeof(KUSB_DRIVER_API) == 512); +/**@}*/ +#endif + +#ifndef _LIBUSBK_HOTK_TYPES + +/*! \addtogroup hotk +* @{ +*/ + +//! Hot plug config flags. +typedef enum _KHOT_FLAG +{ + //! No flags (or 0) + KHOT_FLAG_NONE, + + //! Notify all devices which match upon a succuessful call to \ref HotK_Init. + KHOT_FLAG_PLUG_ALL_ON_INIT = 0x0001, + + //! Allow other \ref KHOT_HANDLE instances to consume this match. + KHOT_FLAG_PASS_DUPE_INSTANCE = 0x0002, + + //! If a \c UserHwnd is specified, use \c PostMessage instead of \c SendMessage. + KHOT_FLAG_POST_USER_MESSAGE = 0x0004, +} KHOT_FLAG; + +//! Hot plug event function definition. +typedef VOID KUSB_API KHOT_PLUG_CB( + _in KHOT_HANDLE HotHandle, + _in KLST_DEVINFO_HANDLE DeviceInfo, + _in KLST_SYNC_FLAG PlugType); + +//! Power broadcast event function definition. +typedef VOID KUSB_API KHOT_POWER_BROADCAST_CB( + _in KHOT_HANDLE HotHandle, + _in KLST_DEVINFO_HANDLE DeviceInfo, + _in UINT PbtEvent); + +//! Hot plug parameter structure. +/*! +* \fixedstruct{2048} +* +* This structure is intially passed as a parameter to \ref HotK_Init. +* +*/ +typedef struct _KHOT_PARAMS +{ + //! Hot plug event window handle to send/post messages when notifications occur. + HWND UserHwnd; + + //! WM_USER message start offset used when sending/posting messages, See details. + /*! + * \attention The \ref hotk will send UserMessage+1 for arrival notifications and UserMessage+0 for removal notifications. + * + * - WPARAM = \ref KHOT_HANDLE + * - LPARAM = \ref KLST_DEVINFO_HANDLE + */ + UINT UserMessage; + + //! Additional init/config parameters + KHOT_FLAG Flags; + + //! File pattern matches for restricting notifcations to a single/group or all supported usb devices. + KLST_PATTERN_MATCH PatternMatch; + + //! Hot plug event callback function invoked when notifications occur. + /*! \fn VOID KUSB_API OnHotPlug (_in KHOT_HANDLE HotHandle, _in KLST_DEVINFO_HANDLE DeviceInfo, _in KLST_SYNC_FLAG PlugType) + * \memberof KHOT_PARAMS + */ + KHOT_PLUG_CB* OnHotPlug; + + //! \b WM_POWERBROADCAST event callback function invoked when a power-management event has occurred. + /*! \fn VOID KUSB_API OnPowerBroadcast (_in KHOT_HANDLE HotHandle, _in KLST_DEVINFO_HANDLE DeviceInfo, _in UINT PbtEvent) + * \memberof KHOT_PARAMS + */ + KHOT_POWER_BROADCAST_CB* OnPowerBroadcast; + + //! fixed structure padding. + UCHAR z_F_i_x_e_d[2048 - sizeof(KLST_PATTERN_MATCH) - sizeof(UINT_PTR) * 3 - sizeof(UINT) * 2]; + +} KHOT_PARAMS; +C_ASSERT(sizeof(KHOT_PARAMS) == 2048); + +//! Pointer to a \ref KHOT_PARAMS structure. +typedef KHOT_PARAMS* PKHOT_PARAMS; + +/**@}*/ + +#endif + +#ifndef _LIBUSBK_OVLK_TYPES + +/*! \addtogroup ovlk +* @{ +*/ + +//! \c WaitFlags used by \ref OvlK_Wait. +/*! +* +*/ +typedef enum _KOVL_WAIT_FLAG +{ + //! Do not perform any additional actions upon exiting \ref OvlK_Wait. + KOVL_WAIT_FLAG_NONE = 0L, + + //! If the i/o operation completes successfully, release the OverlappedK back to it's pool. + KOVL_WAIT_FLAG_RELEASE_ON_SUCCESS = 0x0001, + + //! If the i/o operation fails, release the OverlappedK back to it's pool. + KOVL_WAIT_FLAG_RELEASE_ON_FAIL = 0x0002, + + //! If the i/o operation fails or completes successfully, release the OverlappedK back to its pool. Perform no actions if it times-out. + KOVL_WAIT_FLAG_RELEASE_ON_SUCCESS_FAIL = 0x0003, + + //! If the i/o operation times-out cancel it, but do not release the OverlappedK back to its pool. + KOVL_WAIT_FLAG_CANCEL_ON_TIMEOUT = 0x0004, + + //! If the i/o operation times-out, cancel it and release the OverlappedK back to its pool. + KOVL_WAIT_FLAG_RELEASE_ON_TIMEOUT = 0x000C, + + //! Always release the OverlappedK back to its pool. If the operation timed-out, cancel it before releasing back to its pool. + KOVL_WAIT_FLAG_RELEASE_ALWAYS = 0x000F, + + //! Uses alterable wait functions. See http://msdn.microsoft.com/en-us/library/windows/desktop/ms687036%28v=vs.85%29.aspx + KOVL_WAIT_FLAG_ALERTABLE = 0x0010, + +} KOVL_WAIT_FLAG; + +//! \c Overlapped pool config flags. +/*! +* \attention Currently not used. +*/ +typedef enum _KOVL_POOL_FLAG +{ + KOVL_POOL_FLAG_NONE = 0L, +} KOVL_POOL_FLAG; + +/**@}*/ + +#endif + +#ifndef _LIBUSBK_STMK_TYPES + +/*! \addtogroup stmk +* @{ +*/ +//! Stream config flags. +/*! +* \attention Currently not used. +*/ +typedef enum _KSTM_FLAG +{ + //! None + KSTM_FLAG_NONE = 0L, + KSTM_FLAG_NO_PARTIAL_XFERS = 0x00100000, + KSTM_FLAG_USE_TIMEOUT = 0x80000000, + KSTM_FLAG_TIMEOUT_MASK = 0x0001FFFF +} KSTM_FLAG; + +//! Stream config flags. +/*! +* \attention Currently not used. +*/ +typedef enum _KSTM_COMPLETE_RESULT +{ + //! Valid + KSTM_COMPLETE_RESULT_VALID = 0L, + //! Invalid + KSTM_COMPLETE_RESULT_INVALID, +} KSTM_COMPLETE_RESULT; + +//! Stream transfer context structure. +/*! +* This structure is passed into the stream callback functions. +* The stream transfer context list is allocated upon a successful call to \ref StmK_Init. There is one +* transfer context for each transfer. (0 to \c MaxPendingTransfers). +* +*/ +typedef struct _KSTM_XFER_CONTEXT +{ + + //! Internal stream buffer. + PUCHAR Buffer; + + //! Size of internal stream buffer. + INT BufferSize; + + //! Number of bytes to write or number of bytes read. + INT TransferLength; + + //! User defined state. + PVOID UserState; + +} KSTM_XFER_CONTEXT; +//! Pointer to a \ref KSTM_XFER_CONTEXT structure. +typedef KSTM_XFER_CONTEXT* PKSTM_XFER_CONTEXT; + +//! Stream information structure. +/*! +* This structure is passed into the stream callback functions. +* The stream context is allocated upon a successful call to \ref StmK_Init. There is only one +* stream context per stream. +* +*/ +typedef struct _KSTM_INFO +{ + //! \ref KUSB_HANDLE this stream uses. + KUSB_HANDLE UsbHandle; + + //! This parameter corresponds to the bEndpointAddress field in the endpoint descriptor. + UCHAR PipeID; + + //! Maximum transfer read/write request allowed pending. + INT MaxPendingTransfers; + + //! Maximum transfer sage size. + INT MaxTransferSize; + + //! Maximum number of I/O request allowed pending. + INT MaxPendingIO; + + //! Populated with the endpoint descriptor for the specified \c PipeID. + USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; + + //! Populated with the driver api for the specified \c UsbHandle. + KUSB_DRIVER_API DriverAPI; + + //! Populated with the device file handle for the specified \c UsbHandle. + HANDLE DeviceHandle; + + //! Stream handle. + KSTM_HANDLE StreamHandle; + + //! Stream info user defined state. + PVOID UserState; + +} KSTM_INFO; +//! Pointer to a \ref KSTM_INFO structure. +typedef KSTM_INFO* PKSTM_INFO; + +//! Function definition for an optional user-defined callback; executed when a transfer error occurs. +/*! \fn INT KUSB_API KSTM_ERROR_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in INT ErrorCode) +* \memberof KSTM_CALLBACK +*/ +typedef INT KUSB_API KSTM_ERROR_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in INT ErrorCode); + +//! Function definition for an optional user-defined callback; executed to submit a transfer. +/*! \fn INT KUSB_API KSTM_SUBMIT_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in LPOVERLAPPED Overlapped) +* \memberof KSTM_CALLBACK +*/ +typedef INT KUSB_API KSTM_SUBMIT_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in LPOVERLAPPED Overlapped); + +//! Function definition for an optional user-defined callback; executed for each transfer context when the stream is started with \ref StmK_Start. +/*! \fn INT KUSB_API KSTM_STARTED_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex) +* \memberof KSTM_CALLBACK +*/ +typedef INT KUSB_API KSTM_STARTED_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex); + +//! Function definition for an optional user-defined callback; executed for each transfer context when the stream is stopped with \ref StmK_Stop. +/*! \fn INT KUSB_API KSTM_STOPPED_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex) +* \memberof KSTM_CALLBACK +*/ +typedef INT KUSB_API KSTM_STOPPED_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex); + +//! Function definition for an optional user-defined callback; executed when a valid transfer completes. +/*! \fn INT KUSB_API KSTM_COMPLETE_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in INT ErrorCode) +* \memberof KSTM_CALLBACK +*/ +typedef INT KUSB_API KSTM_COMPLETE_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in INT ErrorCode); + +//! Function definition for an optional user-defined callback; executed immediately after a transfer completes. +/*! \fn KSTM_COMPLETE_RESULT KUSB_API KSTM_BEFORE_COMPLETE_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _ref PINT ErrorCode) +* \memberof KSTM_CALLBACK +* +* This callback function allows the user to accept or reject the transfer: +* - IN (Read, DeviceToHost) endpoints. +* - KSTM_COMPLETE_RESULT_VALID +* Continue normal processing; add the transfer to the internal complete list and make it available to \ref StmK_Read. +* - KSTM_COMPLETE_RESULT_INVALID +* Ignore this transfer. +* - OUT (Write, HostToDevice) endpoints. +* - KSTM_COMPLETE_RESULT_VALID +* Continue normal processing; add the transfer to the internal complete list and make it available subsequent \ref StmK_Write requests. +* - KSTM_COMPLETE_RESULT_INVALID +* Return this transfer to the internal queued list for automatic resubmission to the device. +* +*/ +typedef KSTM_COMPLETE_RESULT KUSB_API KSTM_BEFORE_COMPLETE_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in PINT ErrorCode); + +//! Stream callback structure. +/*! +* \fixedstruct{64} +* +* These optional callback functions are executed from the streams internal thread at various stages of operation. +* +*/ +typedef struct _KSTM_CALLBACK +{ + //! Executed when a transfer error occurs. + KSTM_ERROR_CB* Error; + + //! Executed to submit a transfer. + KSTM_SUBMIT_CB* Submit; + + //! Executed when a valid transfer completes. + KSTM_COMPLETE_CB* Complete; + + //! Executed for every transfer context when the stream is started with \ref StmK_Start. + KSTM_STARTED_CB* Started; + + //! Executed for every transfer context when the stream is stopped with \ref StmK_Stop. + KSTM_STOPPED_CB* Stopped; + + //! Executed immediately after a transfer completes. + KSTM_BEFORE_COMPLETE_CB* BeforeComplete; + + //! fixed structure padding. + UCHAR z_F_i_x_e_d[64 - sizeof(UINT_PTR) * 6]; + +} KSTM_CALLBACK; +//! Pointer to a \ref KSTM_CALLBACK structure. +typedef KSTM_CALLBACK* PKSTM_CALLBACK; +C_ASSERT(sizeof(KSTM_CALLBACK) == 64); + +/**@}*/ + +#endif +/////////////////////////////////////////////////////////////////////// +// L I B U S B K PUBLIC FUNCTIONS //////////////////////////////////// +/////////////////////////////////////////////////////////////////////// + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _LIBUSBK_LIBK_FUNCTIONS + /*! \addtogroup libk + * @{ + */ + +//! Gets the internal user context for the specified \ref KLIB_HANDLE. + /*! + * + * \param[out] Version + * Receives the libusbK library verson information. + * + * \returns NONE + */ + KUSB_EXP VOID KUSB_API LibK_GetVersion(_out PKLIB_VERSION Version); + +//! Gets the internal user context for the specified \ref KLIB_HANDLE. + /*! + * + * \param[in] Handle + * The handle containg the context to retrieve. + * + * \param[in] HandleType + * Handle type of \c Handle. + * + * \returns + * - on success, The user context value. + * - On failure, returns NULL and sets last error to \c ERROR_INVALID_HANDLE. + * + */ + KUSB_EXP KLIB_USER_CONTEXT KUSB_API LibK_GetContext( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType); + +//! Sets internal user context for the specified \ref KLIB_HANDLE. + /*! + * + * \param[in] Handle + * The handle containg the context to set. + * + * \param[in] HandleType + * Handle type of \c Handle. + * + * \param[in] ContextValue + * Value to assign to the handle user context space. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_SetContext( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue); + +//! Assigns a cleanup callback function to a \ref KLIB_HANDLE. + /*! + * + * \param[in] Handle + * The handle containg the cleanup callback function to set. + * + * \param[in] HandleType + * Handle type of \c Handle. + * + * \param[in] CleanupCB + * User supplied callback function to execute when the handles internal reference count reaches 0. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_SetCleanupCallback( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_HANDLE_CLEANUP_CB* CleanupCB); + +//! Initialize a driver API set. + /*! + * + * \param[out] DriverAPI + * A driver API structure to populate. + * + * \param[in] DriverID + * The driver id of the API set to retrieve. See \ref KUSB_DRVID + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_LoadDriverAPI( + _out PKUSB_DRIVER_API DriverAPI, + _in INT DriverID); + +//! Copies the driver API set out of a \ref KUSB_HANDLE + /*! + * + * \param[out] DriverAPI + * A driver API structure to populate. + * + * \param[in] UsbHandle + * Handle containing the desired driver API. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_CopyDriverAPI( + _out PKUSB_DRIVER_API DriverAPI, + _in KUSB_HANDLE UsbHandle); + +//! Initialize a driver API function. + /*! + * \param[out] ProcAddress + * Reference to a function pointer that will receive the API function pointer. + * + * \param[in] DriverID + * The driver id of the API to use. See \ref KUSB_DRVID + * + * \param[in] FunctionID + * The function id. See \ref KUSB_FNID + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_GetProcAddress( + _out KPROC* ProcAddress, + _in INT DriverID, + _in INT FunctionID); + +//! Sets the default user context for the specified \ref KLIB_HANDLE_TYPE. + /*! + * + * \param[in] HandleType + * The handle type which will be assigned the default ContextValue. + * + * \param[in] ContextValue + * Value assigned to the default user context for the specified \ref KLIB_HANDLE_TYPE. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_SetDefaultContext( + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue); + +//! Gets the default user context for the specified \ref KLIB_HANDLE_TYPE. + /*! + * + * \param[in] HandleType + * Handle type used to retrieve the default user context. + * + * \returns + * - on success, The default user context value. + * - On failure, returns NULL and sets last error to \c ERROR_INVALID_HANDLE. + * + */ + KUSB_EXP KLIB_USER_CONTEXT KUSB_API LibK_GetDefaultContext( + _in KLIB_HANDLE_TYPE HandleType); + +//! Initializes the global libusbK process context. + /*! + * + * If this function is not called at startup, libusbK initializes the global libusbK process context automatically. + * + * \param[in] Heap + * A handle to the memory heap libusbK will use for dynamic memory allocation. + * \note The process context itself is always allocated from the proccess heap. + * \note If \b Heap is \b NULL, dynamic memory is allocated from the proccess heap. + * + * \param[in] Reserved + * Reserved for future use. Must set to \b NULL. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_Context_Init( + _inopt HANDLE Heap, + _in PVOID Reserved); + +//! Frees the global libusbK process context. + /*! + * + * If this function is not called on exit, libusbK frees the global libusbK process context automatically when it terminates. + * + * \returns NONE. + * + */ + KUSB_EXP VOID KUSB_API LibK_Context_Free(VOID); + + + /**@}*/ +#endif + +#ifndef _LIBUSBK_USBK_FUNCTIONS + /*! \addtogroup usbk + * @{ + */ + +//! Creates/opens a libusbK interface handle from the device list. This is a preferred method. + /*! + * + * \param[out] InterfaceHandle + * Receives a handle configured to the first (default) interface on the device. This handle is required by + * other libusbK routines that perform operations on the default interface. The handle is opaque. To release + * this handle, call the \ref UsbK_Free function. + * + * \param[in] DevInfo + * The device list element to open. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c UsbK_Init performs the same tasks as \ref UsbK_Initialize with the following exceptions: + * - Uses a \ref KLST_DEVINFO instead of a file handle created with the Windows CreateFile() API function. + * - File handles are managed internally and are closed when the last \ref KUSB_HANDLE is closed with + * \ref UsbK_Free. To obtain the internal file device handle, See \ref UsbK_GetProperty. + * + * \note + * A \c KUSB_HANDLE is required by other library routines that perform operations on a device. Once + * initialized, it can access all interfaces/endpoints of a device. An initialized handle can be cloned with + * \ref UsbK_Clone or \ref UsbK_GetAssociatedInterface. A Cloned handle will behave just as the orignal + * except in will maintain it's own \b selected interface setting. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_Init ( + _out KUSB_HANDLE* InterfaceHandle, + _in KLST_DEVINFO_HANDLE DevInfo); + +//! Frees a libusbK interface handle. + /*! + * + * \param[in] InterfaceHandle + * Handle to an interface on the device. This handle must be created by a previous call to \ref UsbK_Init, + * \ref UsbK_Initialize, \ref UsbK_GetAssociatedInterface, or \ref UsbK_Clone. + * + * \returns TRUE. + * + * The \ref UsbK_Free function releases resources alocated to the InterfaceHandle. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_Free ( + _in KUSB_HANDLE InterfaceHandle); + +//! Claims the specified interface by number or index. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] NumberOrIndex + * Interfaces can be claimed or released by a interface index or \c bInterfaceNumber. + * - Interface indexes always start from 0 and continue sequentially for all interfaces of the device. + * - An interface number always represents the actual \ref USB_INTERFACE_DESCRIPTOR::bInterfaceNumber. + * Interface numbers are not guaranteed to be zero based or sequential. + * + * \param[in] IsIndex + * If TRUE, \c NumberOrIndex represents an interface index.\n if FALSE \c NumberOrIndex represents a + * \c bInterfaceNumber. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * Claiming an interface allows applications a way to prevent other applications or multiple instances of the + * same application from using an interface at the same time. + * + * When an interface is claimed with \ref UsbK_ClaimInterface it performs the following actions: + * - Checks if the interface exists. If it does not, returns FALSE and sets last error to + * ERROR_NO_MORE_ITEMS. + * - The default (or current) interface for the device is changed to \c NumberOrIndex. + * - libusb0.sys and libusbK.sys: + * - A request to claim the interface is sent to the driver. If the interface is not claimed or already + * claimed by the application the request succeeds. If the interface is claimed by another application, + * \ref UsbK_ClaimInterface returns FALSE and sets last error to \c ERROR_BUSY. In this case the The + * default (or current) interface for the device is \b still changed to \c NumberOrIndex. + * - WinUSB.sys: All WinUSB device interfaces are claimed when the device is opened. This function performs + * identically to \ref UsbK_SelectInterface + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ClaimInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +//! Releases the specified interface by number or index. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] NumberOrIndex + * Interfaces can be claimed or released by a interface index or \c bInterfaceNumber. + * - Interface indexes always start from 0 and continue sequentially for all interfaces of the device. + * - An interface number always represents the actual \ref USB_INTERFACE_DESCRIPTOR::bInterfaceNumber. + * Interface numbers are not guaranteed to be zero based or sequential. + * + * \param[in] IsIndex + * If TRUE, \c NumberOrIndex represents an interface index.\n if FALSE \c NumberOrIndex represents a + * \c bInterfaceNumber. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * When an interface is release with \ref UsbK_ReleaseInterface it performs the following actions: + * - Checks if the interface exists. If it does not, returns FALSE and sets last error to + * ERROR_NO_MORE_ITEMS. + * - The default (or current) interface for the device is changed to the previously claimed interface. + * - libusb0.sys and libusbK.sys: + * - A request to release the interface is sent to the driver. If the interface is not claimed by a + * different application the request succeeds. If the interface is claimed by another application, + * \ref UsbK_ReleaseInterface returns FALSE and sets last error to \c ERROR_BUSY. In this case, the + * default/current interface for the device is \b still changed to the previously claimed interface. + * - WinUSB.sys: No other action needed, returns TRUE. + * + * \note + * When an interface is released, it is moved to the bottom if an interface stack making a previously claimed + * interface the current. This will continue to occur regardless of whether the interface is claimed. For + * this reason, \ref UsbK_ReleaseInterface can be used as a means to change the current/default interface of + * an \c InterfaceHandle without claiming the interface. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ReleaseInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +//! Sets the alternate setting of the specified interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] NumberOrIndex + * Interfaces can be specified by a interface index or \c bInterfaceNumber. + * - Interface indexes always start from 0 and continue sequentially for all interfaces of the device. + * - An interface number always represents the actual \ref USB_INTERFACE_DESCRIPTOR::bInterfaceNumber. + * Interface numbers are not guaranteed to be zero based or sequential. + * + * \param[in] IsIndex + * If TRUE, \c NumberOrIndex represents an interface index.\n if FALSE \c NumberOrIndex represents a + * \c bInterfaceNumber. + * + * \param[in] AltSettingNumber + * The bAlternateSetting to activate. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \ref UsbK_SetAltInterface performs the same task as \ref UsbK_SetCurrentAlternateSetting except it + * provides the option of specifying which interfaces alternate setting to activate. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _in UCHAR AltSettingNumber); + +//! Gets the alternate setting for the specified interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] NumberOrIndex + * Interfaces can be specified by a interface index or \c bInterfaceNumber. + * - Interface indexes always start from 0 and continue sequentially for all interfaces of the device. + * - An interface number always represents the actual \ref USB_INTERFACE_DESCRIPTOR::bInterfaceNumber. + * Interface numbers are not guaranteed to be zero based or sequential. + * + * \param[in] IsIndex + * If TRUE, \c NumberOrIndex represents an interface index.\n if FALSE \c NumberOrIndex represents a + * \c bInterfaceNumber. + * + * \param[out] AltSettingNumber + * On success, returns the active bAlternateSetting. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \ref UsbK_GetAltInterface performs the same task as \ref UsbK_GetCurrentAlternateSetting except it + * provides the option of specifying which interfaces alternate setting is to be retrieved. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _out PUCHAR AltSettingNumber); + +//! Gets the requested descriptor. This is a synchronous operation. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] DescriptorType + * A value that specifies the type of descriptor to return. This parameter corresponds to the bDescriptorType + * field of a standard device descriptor, whose values are described in the Universal Serial Bus + * specification. + * + * \param[in] Index + * The descriptor index. For an explanation of the descriptor index, see the Universal Serial Bus + * specification (www.usb.org). + * + * \param[in] LanguageID + * A value that specifies the language identifier, if the requested descriptor is a string descriptor. + * + * \param[out] Buffer + * A caller-allocated buffer that receives the requested descriptor. + * + * \param[in] BufferLength + * The length, in bytes, of Buffer. + * + * \param[out] LengthTransferred + * The number of bytes that were copied into Buffer. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * If the device descriptor or active config descriptor is requested, \ref UsbK_GetDescriptor retrieves + * cached data and this becomes a non-blocking, non I/O request. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetDescriptor ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR DescriptorType, + _in UCHAR Index, + _in USHORT LanguageID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred); + +//! Transmits control data over a default control endpoint. + /*! + * + * \param[in] InterfaceHandle + * A valid libusbK interface handle returned by: + * - \ref UsbK_Init + * - \ref UsbK_Initialize + * - \ref UsbK_GetAssociatedInterface + * - \ref UsbK_Clone + * + * \param[in] SetupPacket + * The 8-byte setup packet of type WINUSB_SETUP_PACKET. + * + * \param[in,out] Buffer + * A caller-allocated buffer that contains the data to transfer. + * + * \param[in] BufferLength + * The number of bytes to transfer, not including the setup packet. This number must be less than or equal to + * the size, in bytes, of Buffer. + * + * \param[out] LengthTransferred + * A pointer to a UINT variable that receives the actual number of transferred bytes. If the application + * does not expect any data to be transferred during the data phase (BufferLength is zero), LengthTransferred + * can be NULL. + * + * \param[in] Overlapped + * An optional pointer to an OVERLAPPED structure, which is used for asynchronous operations. If this + * parameter is specified, \ref UsbK_ControlTransfer immediately returns, and the event is signaled when the + * operation is complete. If Overlapped is not supplied, the \ref UsbK_ControlTransfer function transfers + * data synchronously. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. If an + * \c Overlapped member is supplied and the operation succeeds this function returns FALSE and sets last + * error to ERROR_IO_PENDING. + * + * A \ref UsbK_ControlTransfer is never cached. These requests always go directly to the usb device. + * + * \attention + * This function should not be used for operations supported by the library.\n e.g. + * \ref UsbK_SetConfiguration, \ref UsbK_SetAltInterface, etc.. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ControlTransfer ( + _in KUSB_HANDLE InterfaceHandle, + _in WINUSB_SETUP_PACKET SetupPacket, + _refopt PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +//! Sets the power policy for a device. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PolicyType + * A value that specifies the power policy to set. The following table describes symbolic constants that are + * defined in \ref lusbk_shared.h. + * + * - AUTO_SUSPEND (0x81) + * - Specifies the auto-suspend policy type; the power policy parameter must be specified by the caller in + * the Value parameter. + * - For auto-suspend, the Value parameter must point to a UCHAR variable. + * - If Value is TRUE (nonzero), the USB stack suspends the device if the device is idle. A device is idle + * if there are no transfers pending, or if the only pending transfers are IN transfers to interrupt or + * bulk endpoints. + * - The default value is determined by the value set in the DefaultIdleState registry setting. By default, + * this value is TRUE. + * + * - SUSPEND_DELAY (0x83) + * - Specifies the suspend-delay policy type; the power policy parameter must be specified by the caller in + * the Value parameter. + * - For suspend-delay, Value must point to a UINT variable. + * - Value specifies the minimum amount of time, in milliseconds, that the driver must wait post transfer + * before it can suspend the device. + * - The default value is determined by the value set in the DefaultIdleTimeout registry setting. By + * default, this value is five seconds. + * + * \param[in] ValueLength + * The size, in bytes, of the buffer at Value. + * + * \param[in] Value + * The new value for the power policy parameter. Data type and value for Value depends on the type of power + * policy passed in PolicyType. For more information, see PolicyType. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * The following list summarizes the effects of changes to power management states: + * - All pipe handles, interface handles, locks, and alternate settings are preserved across power management + * events. + * - Any transfers that are in progress are suspended when a device transfers to a low power state, and they + * are resumed when the device is restored to a working state. + * - The device and system must be in a working state before the client can restore a device-specific + * configuration. Clients can determine whether the device and system are in a working state from the + * WM_POWERBROADCAST message. + * - The client can indicate that an interface is idle by calling \ref UsbK_SetPowerPolicy. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +//! Gets the power policy for a device. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PolicyType + * A value that specifies the power policy parameter to retrieve in Value. The following table describes + * symbolic constants that are defined in \ref lusbk_shared.h. + * + * - AUTO_SUSPEND (0x81) + * - If the caller specifies a power policy of AUTO_SUSPEND, \ref UsbK_GetPowerPolicy returns the value of + * the auto suspend policy parameter in the Value parameter. + * - If Value is TRUE (that is, nonzero), the USB stack suspends the device when no transfers are pending + * or the only transfers pending are IN transfers on an interrupt or bulk endpoint. + * - The value of the DefaultIdleState registry value determines the default value of the auto suspend + * policy parameter. + * - The Value parameter must point to a UCHAR variable. + * + * - SUSPEND_DELAY (0x83) + * - If the caller specifies a power policy of SUSPEND_DELAY, \ref UsbK_GetPowerPolicy returns the value of + * the suspend delay policy parameter in Value. + * - The suspend delay policy parameter specifies the minimum amount of time, in milliseconds, that the + * driver must wait after any transfer before it can suspend the device. + * - Value must point to a UINT variable. + * + * \param[in,out] ValueLength + * A pointer to the size of the buffer that Value. On output, ValueLength receives the size of the data that + * was copied into the Value buffer. + * + * \param[out] Value + * A buffer that receives the specified power policy parameter. For more information, see PolicyType. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +//! Sets the device configuration number. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] ConfigurationNumber + * The configuration number to activate. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \ref UsbK_SetConfiguration is only supported with libusb0.sys. If the driver in not libusb0.sys, this + * function performs the following emulation actions: + * - If the requested configuration number is the current configuration number, returns TRUE. + * - If the requested configuration number is one other than the current configuration number, returns FALSE + * and set last error to \c ERROR_NO_MORE_ITEMS. + * + * This function will fail if there are pending I/O operations or there are other libusbK interface handles + * referencing the device. \sa UsbK_Free + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR ConfigurationNumber); + +//! Gets the device current configuration number. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[out] ConfigurationNumber + * On success, receives the active configuration number. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR ConfigurationNumber); + +//! Resets the usb device of the specified interface handle. (port cycle). + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ResetDevice ( + _in KUSB_HANDLE InterfaceHandle); + +//! Creates a libusbK handle for the device specified by a file handle. + /*! + * + * \attention + * This function is supported for WinUSB API compatibility only and is not intended for new development. + * libusbK library users should use \ref UsbK_Init instead. (regardless of the driver they've selected) + * + * \param[in] DeviceHandle + * The handle to the device that CreateFile returned. libusbK uses overlapped I/O, so FILE_FLAG_OVERLAPPED + * must be specified in the dwFlagsAndAttributes parameter of CreateFile call for DeviceHandle to have the + * characteristics necessary for this to function properly. + * + * \param[out] InterfaceHandle + * Receives a handle configured to the first (default) interface on the device. This handle is required by + * other libusbK routines that perform operations on the default interface. The handle is opaque. To release + * this handle, call the \ref UsbK_Free function. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * When \ref UsbK_Initialize is called, the policy settings of the interface are reset to the default values. + * + * The \ref UsbK_Initialize call queries the underlying USB stack for various descriptors and allocates + * enough memory to store the retrieved descriptor data. + * + * \ref UsbK_Initialize first retrieves the device descriptor and then gets the associated configuration + * descriptor. From the configuration descriptor, the call derives the associated interface descriptors and + * stores them in an array. The interfaces in the array are identified by zero-based indexes. An index value + * of 0 indicates the first interface (the default interface), a value of 1 indicates the second associated + * interface, and so on. \ref UsbK_Initialize parses the default interface descriptor for the endpoint + * descriptors and caches information such as the associated pipes or state specific data. The handle + * received in the InterfaceHandle parameter will have its default interface configured to the first + * interface in the array. + * + * If an application wants to use another interface on the device, it can call + * \ref UsbK_GetAssociatedInterface, or \ref UsbK_ClaimInterface. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_Initialize ( + _in HANDLE DeviceHandle, + _out KUSB_HANDLE* InterfaceHandle); + +//! Selects the specified interface by number or index as the current interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] NumberOrIndex + * Interfaces can be claimed or released by a interface index or \c bInterfaceNumber. + * - Interface indexes always start from 0 and continue sequentially for all interfaces of the device. + * - An interface number always represents the actual \ref USB_INTERFACE_DESCRIPTOR::bInterfaceNumber. + * Interface numbers are not guaranteed to be zero based or sequential. + * + * \param[in] IsIndex + * If TRUE, \c NumberOrIndex represents an interface index.\n if FALSE \c NumberOrIndex represents a + * \c bInterfaceNumber. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \sa UsbK_ClaimInterface + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SelectInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +//! Retrieves a handle for an associated interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] AssociatedInterfaceIndex + * An index that specifies the associated interface to retrieve. A value of 0 indicates the first associated + * interface, a value of 1 indicates the second associated interface, and so on. + * + * \param[out] AssociatedInterfaceHandle + * A handle for the associated interface. Callers must pass this interface handle to libusbK Functions + * exposed by libusbK.dll. To close this handle, call \ref UsbK_Free. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * The \ref UsbK_GetAssociatedInterface function retrieves an opaque handle for an associated interface. This + * is a synchronous operation. + * + * The first associated interface is the interface that immediately follows the current (or default) + * interface of the specified /c InterfaceHandle. + * + * The handle that \ref UsbK_GetAssociatedInterface returns must be released by calling \ref UsbK_Free. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetAssociatedInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AssociatedInterfaceIndex, + _out KUSB_HANDLE* AssociatedInterfaceHandle); + +//! Clones the specified interface handle. + /*! + * + * Each cloned interface handle maintains it's own selected interface. + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[out] DstInterfaceHandle + * On success, the cloned return handle. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_Clone ( + _in KUSB_HANDLE InterfaceHandle, + _out KUSB_HANDLE* DstInterfaceHandle); + +//! Retrieves the interface descriptor for the specified alternate interface settings for a particular interface handle. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] AltSettingIndex + * A value that indicates which alternate setting index to return. A value of 0 indicates the first alternate + * setting, a value of 1 indicates the second alternate setting, and so on. + * + * \param[out] UsbAltInterfaceDescriptor + * A pointer to a caller-allocated \ref USB_INTERFACE_DESCRIPTOR structure that contains information about + * the interface that AltSettingNumber specified. + * + * The \ref UsbK_QueryInterfaceSettings call searches the current/default interface array for the alternate + * interface specified by the caller in the AltSettingIndex. If the specified alternate interface is found, + * the function populates the caller-allocated USB_INTERFACE_DESCRIPTOR structure. If the specified alternate + * interface is not found, then the call fails with the ERROR_NO_MORE_ITEMS code. + * + * To change the current/default interface, see \ref UsbK_SelectInterface and \ref UsbK_ClaimInterface + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_QueryInterfaceSettings ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingIndex, + _out PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor); + +//! Retrieves information about the physical device that is associated with a libusbK handle. + /*! + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] InformationType + * A value that specifies which interface information value to retrieve. On input, InformationType must have + * the following value: \c DEVICE_SPEED (0x01). + * + * \param[in,out] BufferLength + * The maximum number of bytes to read. This number must be less than or equal to the size, in bytes, of + * Buffer. On output, BufferLength is set to the actual number of bytes that were copied into Buffer. + * + * \param[in,out] Buffer + * A caller-allocated buffer that receives the requested value. On output, Buffer indicates the device speed: + * - (0x01) low/full speed device. + * - (0x03) high speed device. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_QueryDeviceInformation ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT InformationType, + _ref PUINT BufferLength, + _ref PVOID Buffer); + +//! Sets the alternate setting of an interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] AltSettingNumber + * The value that is contained in the bAlternateSetting member of the \ref USB_INTERFACE_DESCRIPTOR + * structure. This structure can be populated by the \ref UsbK_QueryInterfaceSettings routine. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * Sets the active bAlternateSetting for the current/default interface. + * + * To change the default/current interface see \ref UsbK_ClaimInterface and \ref UsbK_ReleaseInterface + * \sa UsbK_SetAltInterface + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber); + +//! Gets the current alternate interface setting for an interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[out] AltSettingNumber + * A pointer to an unsigned character that receives an integer that indicates the current alternate setting. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * Gets the active bAlternateSetting for the current/default interface. + * + * To change the default/current interface see \ref UsbK_ClaimInterface and \ref UsbK_ReleaseInterface + * \sa UsbK_GetAltInterface + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR AltSettingNumber); + +//! Retrieves information about a pipe that is associated with an interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] AltSettingNumber + * A value that specifies the alternate interface to return the information for. + * + * \param[in] PipeIndex + * A value that specifies the pipe to return information about. This value is not the same as the + * bEndpointAddress field in the endpoint descriptor. A PipeIndex value of 0 signifies the first endpoint + * that is associated with the interface, a value of 1 signifies the second endpoint, and so on. PipeIndex + * must be less than the value in the bNumEndpoints field of the interface descriptor. + * + * \param[out] PipeInformation + * A pointer, on output, to a caller-allocated \ref WINUSB_PIPE_INFORMATION structure that contains pipe + * information. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * The \ref UsbK_QueryPipe function does not retrieve information about the control pipe. + * + * Each interface on the USB device can have multiple endpoints. To communicate with each of these endpoints, + * the bus driver creates pipes for each endpoint on the interface. The pipe indices are zero-based. + * Therefore for n number of endpoints, the pipes' indices are set from n-1. \ref UsbK_QueryPipe parses the + * configuration descriptor to get the interface specified by the caller. It searches the interface + * descriptor for the endpoint descriptor associated with the caller-specified pipe. If the endpoint is + * found, the function populates the caller-allocated \ref WINUSB_PIPE_INFORMATION structure with information + * from the endpoint descriptor. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_QueryPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber, + _in UCHAR PipeIndex, + _out PWINUSB_PIPE_INFORMATION PipeInformation); + +//! Sets the policy for a specific pipe associated with an endpoint on the device. This is a synchronous operation. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[in] PolicyType + * A UINT variable that specifies the policy parameter to change. The Value parameter contains the new value + * for the policy parameter. See the remarks section for information about each of the pipe policies and the + * resulting behavior. + * + * \param[in] ValueLength + * The size, in bytes, of the buffer at Value. + * + * \param[in] Value + * The new value for the policy parameter that PolicyType specifies. The size of this input parameter depends + * on the policy to change. For information about the size of this parameter, see the description of the + * PolicyType parameter. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * The following list describes symbolic constants that are defined in \ref lusbk_shared.h + * + * - \c SHORT_PACKET_TERMINATE (0x01) + * - The default value is \c FALSE. + * - To enable \c SHORT_PACKET_TERMINATE, in Value pass the address of a caller-allocated \c UCHAR variable + * set to \c TRUE (nonzero). + * - Enabling \c SHORT_PACKET_TERMINATE causes the driver to send a zero-length packet at the end of every + * write request to the host controller. + * + * - \c AUTO_CLEAR_STALL (0x02) + * - The default value is \c FALSE. To enable \c AUTO_CLEAR_STALL, in Value pass the address of a + * caller-allocated \c UCHAR variable set to \c TRUE (nonzero). + * - Enabling \c AUTO_CLEAR_STALL causes libusbK to reset the pipe in order to automatically clear the + * stall condition. Data continues to flow on the bulk and interrupt \c IN endpoints again as soon as a + * new or a queued transfer arrives on the endpoint. This policy parameter does not affect control pipes. + * - Disabling \c AUTO_CLEAR_STALL causes all transfers (that arrive to the endpoint after the stalled + * transfer) to fail until the caller manually resets the endpoint's pipe by calling \ref UsbK_ResetPipe. + * + * - \c PIPE_TRANSFER_TIMEOUT (0x03) + * - The default value is zero. To set a time-out value, in Value pass the address of a caller-allocated + * \c UINT variable that contains the time-out interval. + * - The \c PIPE_TRANSFER_TIMEOUT value specifies the time-out interval, in milliseconds. The host + * controller cancels transfers that do not complete within the specified time-out interval. + * - A value of zero (default) indicates that transfers do not time out because the host controller never + * cancels the transfer. + * + * - \c IGNORE_SHORT_PACKETS (0x04) + * - The default value is \c FALSE. To enable \c IGNORE_SHORT_PACKETS, in Value pass the address of a + * caller-allocated \c UCHAR variable set to \c TRUE (nonzero). + * - Enabling \c IGNORE_SHORT_PACKETS causes the host controller to not complete a read operation after it + * receives a short packet. Instead, the host controller completes the operation only after the host has + * read the specified number of bytes. + * - Disabling \c IGNORE_SHORT_PACKETS causes the host controller to complete a read operation when either + * the host has read the specified number of bytes or the host has received a short packet. + * + * - \c ALLOW_PARTIAL_READS (0x05) + * - The default value is \c TRUE (nonzero). To disable \c ALLOW_PARTIAL_READS, in Value pass the address + * of a caller-allocated \c UCHAR variable set to \c FALSE (zero). + * - Disabling \c ALLOW_PARTIAL_READS causes the read requests to fail whenever the device returns more + * data (on bulk and interrupt \c IN endpoints) than the caller requested. + * - Enabling \c ALLOW_PARTIAL_READS causes libusbK to save or discard the extra data when the device + * returns more data (on bulk and interrupt \c IN endpoints) than the caller requested. This behavior is + * defined by setting the \c AUTO_FLUSH value. + * + * - \c AUTO_FLUSH (0x06) + * - The default value is \c FALSE (zero). To enable \c AUTO_FLUSH, in Value pass the address of a + * caller-allocated \c UCHAR variable set to \c TRUE (nonzero). + * - \c AUTO_FLUSH must be used with \c ALLOW_PARTIAL_READS enabled. If \c ALLOW_PARTIAL_READS is \c TRUE, + * the value of \c AUTO_FLUSH determines the action taken by libusbK when the device returns more data + * than the caller requested. + * - Disabling \c ALLOW_PARTIAL_READS causes libusbK to ignore the \c AUTO_FLUSH value. + * - Disabling \c AUTO_FLUSH with \c ALLOW_PARTIAL_READS enabled causes libusbK to save the extra data, add + * the data to the beginning of the caller's next read request, and send it to the caller in the next + * read operation. + * - Enabling \c AUTO_FLUSH with \c ALLOW_PARTIAL_READS enabled causes libusbK to discard the extra data + * remaining from the read request. + * + * - \c RAW_IO (0x07) + * - The default value is \c FALSE (zero). To enable \c RAW_IO, in Value pass the address of a + * caller-allocated \c UCHAR variable set to \c TRUE (nonzero). + * - Enabling \c RAW_IO causes libusbK to send data directly to the \c USB driver stack, bypassing + * libusbK's queuing and error handling mechanism. + * - The buffers that are passed to \ref UsbK_ReadPipe must be configured by the caller as follows: + * - The buffer length must be a multiple of the maximum endpoint packet size. + * - The length must be less than or equal to the value of \c MAXIMUM_TRANSFER_SIZE retrieved by + * \ref UsbK_GetPipePolicy. + * - Disabling \c RAW_IO (\c FALSE) does not impose any restriction on the buffers that are passed to + * \ref UsbK_ReadPipe. + * + * - \c RESET_PIPE_ON_RESUME (0x09) + * - The default value is \c FALSE (zero). To enable \c RESET_PIPE_ON_RESUME, in Value pass the address of + * a caller-allocated \c UCHAR variable set to \c TRUE (nonzero). + * - \c TRUE (or a nonzero value) indicates that on resume from suspend, libusbK resets the endpoint before + * it allows the caller to send new requests to the endpoint. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +//! Gets the policy for a specific pipe (endpoint). + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[in] PolicyType + * A UINT variable that specifies the policy parameter to retrieve. The current value for the policy + * parameter is retrieved the Value parameter. + * + * \param[in,out] ValueLength + * A pointer to the size, in bytes, of the buffer that Value points to. On output, ValueLength receives the + * size, in bytes, of the data that was copied into the Value buffer. + * + * \param[out] Value + * A pointer to a buffer that receives the specified pipe policy value. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +//! Reads data from the specified pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[out] Buffer + * A caller-allocated buffer that receives the data that is read. + * + * \param[in] BufferLength + * The maximum number of bytes to read. This number must be less than or equal to the size, in bytes, of + * Buffer. + * + * \param[out] LengthTransferred + * A pointer to a UINT variable that receives the actual number of bytes that were copied into Buffer. For + * more information, see Remarks. + * + * \param[in] Overlapped + * An optional pointer to an overlapped structure for asynchronous operations. This can be a \ref KOVL_HANDLE + * or a pointer to a standard windows OVERLAPPED structure. If this parameter is specified, \c UsbK_ReadPipe + * returns immediately rather than waiting synchronously for the operation to complete before returning. An + * event is signaled when the operation is complete. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +//! Writes data to a pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[in] Buffer + * A caller-allocated buffer the data is written from. + * + * \param[in] BufferLength + * The maximum number of bytes to write. This number must be less than or equal to the size, in bytes, of + * Buffer. + * + * \param[out] LengthTransferred + * A pointer to a UINT variable that receives the actual number of bytes that were transferred from Buffer. + * For more information, see Remarks. + * + * \param[in] Overlapped + * An optional pointer to an overlapped structure for asynchronous operations. This can be a \ref KOVL_HANDLE + * or a pointer to a standard windows OVERLAPPED structure. If this parameter is specified, \c UsbK_WritePipe + * returns immediately rather than waiting synchronously for the operation to complete before returning. An + * event is signaled when the operation is complete. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_WritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +//! Resets the data toggle and clears the stall condition on a pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ResetPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +//! Aborts all of the pending transfers for a pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_AbortPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +//! Discards any data that is cached in a pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_FlushPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +//! Reads from an isochronous pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[out] Buffer + * A caller-allocated buffer that receives the data that is read. + * + * \param[in] BufferLength + * The maximum number of bytes to read. This number must be less than or equal to the size, in bytes, of + * Buffer. + * + * \param[in] Overlapped + * A \b required pointer to an overlapped structure for asynchronous operations. This can be a + * \ref KOVL_HANDLE or a pointer to a standard windows OVERLAPPED structure. If this parameter is specified, + * \c UsbK_IsoReadPipe returns immediately rather than waiting synchronously for the operation to complete + * before returning. An event is signaled when the operation is complete. + * + * \param[in,out] IsoContext + * Pointer to an isochronous transfer context created with \ref IsoK_Init. If \c IsoContext is NULL, + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \par Overlapped I/O considerations + * If an \c Overlapped parameter is specified and the transfer is submitted successfully, the function + * returns \b FALSE and sets last error to \c ERROR_IO_PENDING. When using overlapped I/O, users may ignore + * the return results of this function and instead use the return results from one of the \ref ovlk wait + * functions or from \ref UsbK_GetOverlappedResult. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_IsoReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +//! Writes to an isochronous pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[in] Buffer + * A caller-allocated buffer that receives the data that is read. + * + * \param[in] BufferLength + * The maximum number of bytes to write. This number must be less than or equal to the size, in bytes, of + * Buffer. + * + * \param[in] Overlapped + * An optional pointer to an overlapped structure for asynchronous operations. This can be a \ref KOVL_HANDLE + * or a pointer to a standard windows OVERLAPPED structure. If this parameter is specified, + * \c UsbK_IsoWritePipe returns immediately rather than waiting synchronously for the operation to complete + * before returning. An event is signaled when the operation is complete. + * + * \param[in,out] IsoContext + * Pointer to an isochronous transfer context created with \ref IsoK_Init. See remarks below. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_IsoWritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +//! Retrieves the current USB frame number. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[out] FrameNumber + * A pointer to a location that receives the current 32-bit frame number on the USB bus (from the host + * controller driver). + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetCurrentFrameNumber ( + _in KUSB_HANDLE InterfaceHandle, + _out PUINT FrameNumber); + +//! Retrieves the results of an overlapped operation on the specified libusbK handle. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] Overlapped + * A pointer to a standard windows OVERLAPPED structure that was specified when the overlapped operation was + * started. + * + * \param[out] lpNumberOfBytesTransferred + * A pointer to a variable that receives the number of bytes that were actually transferred by a read or + * write operation. + * + * \param[in] bWait + * If this parameter is TRUE, the function does not return until the operation has been completed. If this + * parameter is FALSE and the operation is still pending, the function returns FALSE and the GetLastError + * function returns ERROR_IO_INCOMPLETE. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * This function is like the Win32 API routine, GetOverlappedResult, with one difference; instead of passing + * a file handle that is returned from CreateFile, the caller passes an interface handle that is returned + * from \ref UsbK_Initialize, \ref UsbK_Init, or \ref UsbK_GetAssociatedInterface. The caller can use either + * API routine, if the appropriate handle is passed. The \ref UsbK_GetOverlappedResult function extracts the + * file handle from the interface handle and then calls GetOverlappedResult. \n + * + * The results that are reported by the \ref UsbK_GetOverlappedResult function are those from the specified + * handle's last overlapped operation to which the specified standard windows OVERLAPPED structure was + * provided, and for which the operation's results were pending. A pending operation is indicated when the + * function that started the operation returns FALSE, and the GetLastError routine returns ERROR_IO_PENDING. + * When an I/O operation is pending, the function that started the operation resets the hEvent member of the + * standard windows OVERLAPPED structure to the nonsignaled state. Then when the pending operation has been + * completed, the system sets the event object to the signaled state. \n + * + * The caller can specify that an event object is manually reset in the standard windows OVERLAPPED + * structure. If an automatic reset event object is used, the event handle must not be specified in any other + * wait operation in the interval between starting the overlapped operation and the call to + * \ref UsbK_GetOverlappedResult. For example, the event object is sometimes specified in one of the wait + * routines to wait for the operation to be completed. When the wait routine returns, the system sets an + * auto-reset event's state to nonsignaled, and a successive call to \ref UsbK_GetOverlappedResult with the + * bWait parameter set to TRUE causes the function to be blocked indefinitely. + * + * If the bWait parameter is TRUE, \ref UsbK_GetOverlappedResult determines whether the pending operation has + * been completed by waiting for the event object to be in the signaled state. + * + * If the hEvent member of the standard windows OVERLAPPED structure is NULL, the system uses the state of + * the file handle to signal when the operation has been completed. Do not use file handles for this purpose. + * It is better to use an event object because of the confusion that can occur when multiple concurrent + * overlapped operations are performed on the same file. In this situation, you cannot know which operation + * caused the state of the object to be signaled. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetOverlappedResult ( + _in KUSB_HANDLE InterfaceHandle, + _in LPOVERLAPPED Overlapped, + _out PUINT lpNumberOfBytesTransferred, + _in BOOL bWait); + +//! Gets a USB device (driver specific) property from usb handle. + /*! + * + * \param[in] InterfaceHandle + * USB handle of the property to retrieve. + * + * \param[in] PropertyType + * The propety type to retrieve. + * + * \param[in,out] PropertySize + * Size in bytes of \c Value. + * + * \param[out] Value + * On success, receives the proprty data. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetProperty ( + _in KUSB_HANDLE InterfaceHandle, + _in KUSB_PROPERTY PropertyType, + _ref PUINT PropertySize, + _out PVOID Value); + + /*! @} */ + + +#endif + +#ifndef _LIBUSBK_LSTK_FUNCTIONS + /*! \addtogroup lstk + *@{ + */ + +//! Initializes a new usb device list containing all supported devices. + /*! + * + * \param[out] DeviceList + * Pointer reference that will receive a populated device list. + * + * \param[in] Flags + * Search, filter, and listing options. see \c KLST_FLAG + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c LstK_Init populates \c DeviceList with connected usb devices that can be used by libusbK. + * + * \note if \ref LstK_Init returns TRUE, the device list must be freed with \ref LstK_Free when it is no + * longer needed. + * + */ + KUSB_EXP BOOL KUSB_API LstK_Init( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags); + +//! Initializes a new usb device list containing only devices matching a specific class GUID. + /*! + * + * \param[out] DeviceList + * Pointer reference that will receive a populated device list. + * + * \param[in] Flags + * Search, filter, and listing options. see \c KLST_FLAG + * + * \param[in] PatternMatch + * Pattern Search filter. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c LstK_InitEx populates \c DeviceList with usb devices that can be used by libusbK. Only device + * matching the \ref KLST_PATTERN_MATCH string are included in the list. + * + * \note + * This function significantly improves performance when used with a device interface guid pattern patch. + * + * \note if \ref LstK_InitEx returns TRUE, the device list must be freed with \ref LstK_Free when it it's no + * longer needed. + * + */ + KUSB_EXP BOOL KUSB_API LstK_InitEx( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags, + _in PKLST_PATTERN_MATCH PatternMatch); + + //! Frees a usb device list. + /*! + * + * \note if \ref LstK_Init returns TRUE, the device list must be freed with \ref LstK_Free when it is no + * longer needed. + * + * \param[in] DeviceList + * The \c DeviceList to free. + * + * \returns NONE + * + * Frees all resources that were allocated to \c DeviceList by \ref LstK_Init. + * + */ + KUSB_EXP BOOL KUSB_API LstK_Free( + _in KLST_HANDLE DeviceList); + +//! Enumerates \ref KLST_DEVINFO elements of a \ref KLST_HANDLE. + /*! + * + * \param[in] DeviceList + * The \c DeviceList to enumerate. + * + * \param[in] EnumDevListCB + * Function to call for each iteration. + * + * \param[in] Context + * Optional user context pointer. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * Calls \c EnumDevListCB for each element in the device list or until \c EnumDevListCB returns FALSE. + * + */ + KUSB_EXP BOOL KUSB_API LstK_Enumerate( + _in KLST_HANDLE DeviceList, + _in KLST_ENUM_DEVINFO_CB* EnumDevListCB, + _inopt PVOID Context); + +//! Gets the \ref KLST_DEVINFO element for the current position. + /*! + * + * \param[in] DeviceList + * The \c DeviceList to retrieve a current \ref KLST_DEVINFO for. + * + * \param[out] DeviceInfo + * The device information. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * After a \c DeviceList is created or after the \ref LstK_MoveReset method is called, the \c LstK_MoveNext + * method must be called to advance the device list enumerator to the first element of the \c DeviceList + * before calling \c LstK_Current otherwise, \c DeviceInfo is undefined. + * + * \c LstK_Current returns \c FALSE and sets last error to \c ERROR_NO_MORE_ITEMS if the last call to + * \c LstK_MoveNext returned \c FALSE, which indicates the end of the \c DeviceList. + * + * \c LstK_Current does not move the position of the device list enumerator, and consecutive calls to + * \c LstK_Current return the same object until either \c LstK_MoveNext or \ref LstK_MoveReset is called. + * + */ + KUSB_EXP BOOL KUSB_API LstK_Current( + _in KLST_HANDLE DeviceList, + _out KLST_DEVINFO_HANDLE* DeviceInfo); + +//! Advances the device list current \ref KLST_DEVINFO position. + /*! + * \param[in] DeviceList + * A usb device list returned by \ref LstK_Init + * + * \param[out] DeviceInfo + * On success, contains a pointer to the device information for the current enumerators position. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * After a \c DeviceList is created or after \ref LstK_MoveReset is called, an enumerator is positioned + * before the first element of the \c DeviceList and the \b first call to \c LstK_MoveNext moves the + * enumerator over the first element of the \c DeviceList. + * + * If \c LstK_MoveNext passes the end of the \c DeviceList, the enumerator is positioned after the last + * element in the \c DeviceList and \c LstK_MoveNext returns \c FALSE. When the enumerator is at this + * position, a subsequent call to \c LstK_MoveNext will reset the enumerator and it continues from the + * beginning. + * + */ + KUSB_EXP BOOL KUSB_API LstK_MoveNext( + _in KLST_HANDLE DeviceList, + _outopt KLST_DEVINFO_HANDLE* DeviceInfo); + +//! Sets the device list to its initial position, which is before the first element in the list. + /*! + * + * \param[in] DeviceList + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP VOID KUSB_API LstK_MoveReset( + _in KLST_HANDLE DeviceList); + +//! Find a device by vendor and product id + /*! + * + * \param[in] DeviceList + * The \c DeviceList to retrieve a current \ref KLST_DEVINFO for. + * + * \param[in] Vid + * ID is used in conjunction with the \c Pid to uniquely identify USB devices, providing traceability to the + * OEM. + * + * \param[in] Pid + * ID is used in conjunction with the \c Pid to uniquely identify USB devices, providing traceability to the + * OEM. + * + * \param[out] DeviceInfo + * On success, the device information pointer, otherwise NULL. + * + * \returns + * - TRUE if the device was found + * - FALSE if the device was \b not found or an error occurred. + * - Sets last error to \c ERROR_NO_MORE_ITEMS if the device was \b not found. + * + * Searches all elements in \c DeviceList for usb device matching the specified. + * + */ + KUSB_EXP BOOL KUSB_API LstK_FindByVidPid( + _in KLST_HANDLE DeviceList, + _in INT Vid, + _in INT Pid, + _out KLST_DEVINFO_HANDLE* DeviceInfo); + +//! Counts the number of device info elements in a device list. + /*! + * + * \param[in] DeviceList + * The deice list to count. + * + * \param[in,out] Count + * On success, receives the number of \ref KLST_DEVINFO elements in the list. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LstK_Count( + _in KLST_HANDLE DeviceList, + _ref PUINT Count); + + + /**@}*/ + +#endif + +#ifndef _LIBUSBK_HOTK_FUNCTIONS + /*! \addtogroup hotk + * @{ + */ + +//! Creates a new hot-plug handle for USB device arrival/removal event monitoring. + /*! + * + * \param[out] Handle + * Reference to a handle pointer that will receive the initialized hot-plug handle. + * + * \param[in,out] InitParams + * Hot plug handle initialization structure. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API HotK_Init( + _out KHOT_HANDLE* Handle, + _ref PKHOT_PARAMS InitParams); + +//! Frees the specified hot-plug handle. + /*! + * + * \param[in] Handle + * hot-plug handle pointer to free. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API HotK_Free( + _in KHOT_HANDLE Handle); + + //! Frees all hot-plug handles initialized with \ref HotK_Init. + /*! + * + */ + KUSB_EXP VOID KUSB_API HotK_FreeAll(VOID); + + /**@}*/ + +#endif + +#ifndef _LIBUSBK_OVLK_FUNCTIONS + /*! \addtogroup ovlk + * @{ + */ + +//! Gets a preallocated \c OverlappedK structure from the specified/default pool. + /*! + * + * \param[out] OverlappedK + * On Success, receives the overlapped handle. + * + * \param[in] PoolHandle + * The overlapped pool used to retrieve the next available \c OverlappedK. + * + * \returns On success, the next unused overlappedK available in the pool. Otherwise NULL. Use + * \c GetLastError() to get extended error information. + * + * After calling \ref OvlK_Acquire or \ref OvlK_ReUse the \c OverlappedK is ready to be used in an I/O + * operation. See one of the \c UsbK core transfer functions such as \ref UsbK_ReadPipe or + * \ref UsbK_WritePipe for more information. + * + * If the pools internal refurbished list (a re-usable list of \c OverlappedK structures) is not empty, the + * \ref OvlK_Acquire function will choose an overlapped from the refurbished list. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_Acquire( + _out KOVL_HANDLE* OverlappedK, + _in KOVL_POOL_HANDLE PoolHandle); + +//! Returns an \c OverlappedK structure to it's pool. + /*! + * + * \param[in] OverlappedK + * The overlappedK to release. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * When an overlapped is returned to pool, it resources are \b not freed. Instead, it is added to an internal + * refurbished list (a re-usable list of \c OverlappedK structures). + * + * \warning This function must not be called when the OverlappedK is in-use. If unsure, consider using + * \ref OvlK_WaitAndRelease instead. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_Release( + _in KOVL_HANDLE OverlappedK); + + +//! Creates a new overlapped pool. + /*! + * + * \param[out] PoolHandle + * On success, receives the new pool handle. + * + * \param[in] UsbHandle + * USB handle to associate with the pool. + * + * \param[in] MaxOverlappedCount + * Maximum number of overkappedK handles allowed in the pool. + * + * \param[in] Flags + * Pool flags. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_Init ( + _out KOVL_POOL_HANDLE* PoolHandle, + _in KUSB_HANDLE UsbHandle, + _in INT MaxOverlappedCount, + _inopt KOVL_POOL_FLAG Flags); + +//! Destroys the specified pool and all resources it created. + /*! + * + * \param[in] PoolHandle + * The overlapped pool to destroy. Once destroyed, the pool and all resources which belong to it can no + * longer be used. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \warning A pool should not be destroyed until all OverlappedKs acquired from it are no longer in-use. For + * more information see \ref OvlK_WaitAndRelease or \ref OvlK_Release. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_Free( + _in KOVL_POOL_HANDLE PoolHandle); + + +//! Returns the internal event handle used to signal IO operations. + /*! + * + * \param[in] OverlappedK + * The overlappedK used to return the internal event handle. + * + * \returns On success, The manual reset event handle being used by this overlappedK. Otherwise NULL. Use + * \c GetLastError() to get extended error information. + * + * \ref OvlK_GetEventHandle is useful for applications that must to their own event handling. It exposes the + * windows \c OVERLAPPED \c hEvent used for i/o completion signaling. This event handle can be used by the + * standard event wait functions; /c WaitForMultipleObjectsEx for example. + * + * \warning Use \ref OvlK_GetEventHandle with caution. Event handles returned by this function should never + * be used unless the OverlappedK has been \b acquired by the application. + * + */ + KUSB_EXP HANDLE KUSB_API OvlK_GetEventHandle( + _in KOVL_HANDLE OverlappedK); + +//! Waits for overlapped I/O completion, and performs actions specified in \c WaitFlags. + /*! + * + * \param[in] OverlappedK + * The overlappedK to wait on. + * + * \param[in] TimeoutMS + * Number of milliseconds to wait for overlapped completion. + * + * \param[in] WaitFlags + * See /ref KOVL_WAIT_FLAG + * + * \param[out] TransferredLength + * On success, returns the number of bytes transferred by this overlappedK. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. See + * the remarks section below for details on relevant error codes. + * + * \c OvlK_Wait waits the time interval specified in \c TimeoutMS for the overlapped I/O operation to + * complete. Different actions can then taken depending on the flags specified in \c WaitFlags. + * + * \WINERRORTABLE + * + * \WINERROR{ERROR_CANCELLED,1223} + * - The I/O was cancelled by the user. The transfer complete event was not signalled within the alotted + * transfer timeout time and the OvlK_Wait function issued a CancelIoEx/CancelIo request because the + * \ref KOVL_WAIT_FLAG_CANCEL_ON_TIMEOUT flag bit was set. + * \ENDWINERROR + * + * \WINERROR{ERROR_OPERATION_ABORTED,995} + * - The transfer complete event is signalled but the overlapped result was allready cancelled. The + * overlapped I/O may have bee cancelled for one of the following reasons: + * - Driver cancelled because of pipe timeout policy expiration. + * - The device was disconnected. + * - A \ref UsbK_AbortPipe request was issued. + * \ENDWINERROR + * + * \ENDWINERRORTABLE + * + */ + KUSB_EXP BOOL KUSB_API OvlK_Wait( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength); + +//! Waits for overlapped I/O completion on the oldest acquired OverlappedK handle and performs actions specified in \c WaitFlags. + /*! + * + * \param[in] PoolHandle + * The pool handle containing one or more acuired OverlappedKs. + * + * \param[out] OverlappedK + * On success, set to the oldest overlappedK in the acquired list. + * + * \param[in] TimeoutMS + * See /ref OvlK_Wait + * + * \param[in] WaitFlags + * See /ref KOVL_WAIT_FLAG + * + * \param[out] TransferredLength + * See /ref OvlK_Wait + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. See + * See /ref OvlK_Wait + */ + KUSB_EXP BOOL KUSB_API OvlK_WaitOldest( + _in KOVL_POOL_HANDLE PoolHandle, + _outopt KOVL_HANDLE* OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength); + +//! Waits for overlapped I/O completion, cancels on a timeout error. + /*! + * + * \param[in] OverlappedK + * The overlappedK to wait on. + * + * \param[in] TimeoutMS + * Number of milliseconds to wait for overlapped completion. + * + * \param[out] TransferredLength + * On success, returns the number of bytes transferred by this overlappedK. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. See + * \ref OvlK_Wait for details on relevant win32 error codes. + * + * \note This convenience function calls \ref OvlK_Wait with \ref KOVL_WAIT_FLAG_CANCEL_ON_TIMEOUT. + * + * \c OvlK_WaitOrCancel waits the the time interval specified by \c TimeoutMS for an overlapped result. If + * the \c TimeoutMS interval expires the I/O operation is cancelled. The \c OverlappedK is not released back + * to its pool. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_WaitOrCancel( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength); + +//! Waits for overlapped I/O completion, cancels on a timeout error and always releases the OvlK handle back to its pool. + /*! + * + * \param[in] OverlappedK + * The overlappedK to wait on. + * + * \param[in] TimeoutMS + * Number of milliseconds to wait for overlapped completion. + * + * \param[out] TransferredLength + * On success, returns the number of bytes transferred by this overlappedK. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. See + * \ref OvlK_Wait for details on relevant win32 error codes. + * + * \note This convenience function calls \ref OvlK_Wait with \ref KOVL_WAIT_FLAG_RELEASE_ALWAYS. + * + * \c OvlK_WaitAndRelease waits the the time interval specified by \c TimeoutMS for an overlapped result. + * When \c OvlK_WaitOrCancel returns, the I/O operation has either been completed or cancelled. The + * \c OverlappedK is always released back to its pool where it can be re-acquired with \ref OvlK_Acquire. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_WaitAndRelease( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength); + +//! Checks for i/o completion; returns immediately. (polling) + /*! + * + * \param[in] OverlappedK + * The overlappedK to check for completion. + * + * \warning \ref OvlK_IsComplete does \b no validation on the OverlappedK. It's purpose is to check the event + * signal state as fast as possible. + * + * \returns TRUE if the \c OverlappedK has completed, otherwise FALSE. + * + * \c OvlK_IsComplete quickly checks if the \c OverlappedK i/o operation has completed. + */ + KUSB_EXP BOOL KUSB_API OvlK_IsComplete( + _in KOVL_HANDLE OverlappedK); + +//! Initializes an overlappedK for re-use. The overlappedK is not return to its pool. + /*! + * + * \param[in] OverlappedK + * The overlappedK to re-use. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * This function performs the following actions: + * - Resets the overlapped event to non-signaled via ResetEvent(). + * - Clears the internal overlapped information. + * - Clears the 'Internal' and 'InternalHigh' members of the windows overlapped structure. + * + * \note + * Re-using OverlappedKs is the most efficient means of OverlappedK management. When an OverlappedK is + * "re-used" it is not returned to the pool. Instead, the application retains ownership for use in another + * i/o operation. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_ReUse( + _in KOVL_HANDLE OverlappedK); + + /**@}*/ + +#endif + +#ifndef _LIBUSBK_STMK_FUNCTIONS + + /*! \addtogroup stmk + * @{ + */ + +//! Initializes a new uni-directional pipe stream. + /*! + * + * \param[out] StreamHandle + * On success, receives the new stream handle. + * + * \param[in] UsbHandle + * Usb handle to associate with this stream. + * + * \param[in] PipeID + * Endpoint address of USB pipe to associate with this stream. + * + * \param[in] MaxTransferSize + * Maximum number of bytes transferred at once. Larger transfers committed with the stream read/write + * functions are automatically split into multiple smaller chunks. + * + * \param[in] MaxPendingTransfers + * Maximum number of transfers allowed to be outstanding and the total number of transfer contexts that are + * allocated to the stream. + * + * \param[in] MaxPendingIO + * Maximum number of I/O requests the internal stream thread is allowed to have submit at any given time. + * (Pending I/O) + * + * \param[in] Callbacks + * Optional user callback functions. If specified, these callback functions will be executed in real time + * (from within the context of the internal stream thread) as transfers go through the various states. + * + * \param[in] Flags + * Additional stream flags. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \par + * When a stream is initialized, it validates input parameters and allocates the required memory for the + * transfer context array and transfer lists from a private memory heap. The stream is not started and no I/O + * requests are sent to the device until \ref StmK_Start is executed. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Init( + _out KSTM_HANDLE* StreamHandle, + _in KUSB_HANDLE UsbHandle, + _in UCHAR PipeID, + _in INT MaxTransferSize, + _in INT MaxPendingTransfers, + _in INT MaxPendingIO, + _inopt PKSTM_CALLBACK Callbacks, + _inopt KSTM_FLAG Flags); + +//! Frees resources allocated by a stream handle. + /*! + * + * \param[in] StreamHandle + * The stream handle to free. + * + * \returns TRUE. + * + * If the stream is currently started it is automatically stopped before its resources are freed. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Free( + _in KSTM_HANDLE StreamHandle); + +//! Starts the internal stream thread. + /*! + * + * \param[in] StreamHandle + * The stream to start. A stream handle is created with \ref StmK_Init. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \par + * When a stream is started, an internal thread is created for managing pipe I/O operations. If a + * \ref KSTM_CALLBACK::Started callback function is assgined, it is executed \b for each transfer context. + * (\b MaxPendingTransfers) See \ref StmK_Init. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Start( + _in KSTM_HANDLE StreamHandle); + +//! Stops the internal stream thread. + /*! + * + * \param[in] StreamHandle + * The stream to stop. + * + * \param[in] TimeoutCancelMS + * Number of milliseconds the internal stream thread should wait for pending I/O to complete before + * cancelling all pending requests. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Stop( + _in KSTM_HANDLE StreamHandle, + _in INT TimeoutCancelMS); + +//! Reads data from the stream buffer. + /*! + * + * \param[in] StreamHandle + * The stream to read. + * + * \param[out] Buffer + * A caller-allocated buffer that receives the data that is read. + * + * \param[in] Offset + * Read start offset of \c Buffer. + * + * \param[in] Length + * Size of \c Buffer. + * + * \param[out] TransferredLength + * On success, receives the actual number of bytes that were copied into \c Buffer. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * - Read Stream Operations: + * -# The internal stream thread will always try and keep reads pending as specified by \b MaxPendingIO in + * \ref StmK_Init. + * -# As the stream submits transfers, it increments the \b PendingIO and \b PendingTransfer counts. As it + * completes transfers, it decrements the \b PendingIO count. As the user processes transfers with + * \ref StmK_Read, it decrements the \b PendingTransfer count and release control of the transfer context + * back to the stream where it is re-used. + * -# When the pending I/O count reaches \c MaxPendingIO, the stream completes the oldest + * \b PendingTransfer and moves it into a FIFO complete where it awaits user processing via the + * \ref StmK_Read function. + * -# If the stream has not exhausted its MaxPendingTransfers count, another read request is submitted + * immediately to satisfy \b MaxPendingIO. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Read( + _in KSTM_HANDLE StreamHandle, + _out PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength); + +//! Writes data to the stream buffer. + /*! + * + * \param[in] StreamHandle + * The stream to write. + * + * \param[in] Buffer + * A caller-allocated buffer the data is written from. + * + * \param[in] Offset + * Write start offset of \c Buffer. + * + * \param[in] Length + * Number of bytes to copy into the stream buffer. + * + * \param[out] TransferredLength + * On success, receives the actual number of bytes that were copied into the stream buffer. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * - Write Stream Operations: + * -# The internal stream thread will always try and exhaust all pending transfers submitted by the user + * via \ref StmK_Write. + * -# As the user submits transfers via \ref StmK_Write, the \b PendingTransfer count is inceremented and + * transfers are added to a queued FIFO list where they await processing by the internal stream thread. + * -# While the queued FIFO list is not empty and \b PendingIO count is less than \b MaxPendingIO, The + * \b PendingIO count increments and the request is sent to the device. + * -# When a transfer completes, the internal pending I/O count is decremented and the transfers is moved + * back into the idle list where it can be reused again by subsequent \ref StmK_Write requests. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Write( + _in KSTM_HANDLE StreamHandle, + _in PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength); + /**@}*/ + +#endif + +#ifndef _LIBUSBK_ISOK_FUNCTIONS + /*! \addtogroup isok + * @{ + */ + +//! Creates a new isochronous transfer context. + /*! + * + * \param[out] IsoContext + * Receives a new isochronous transfer context. + * + * \param[in] NumberOfPackets + * The number of \ref KISO_PACKET structures allocated to \c IsoContext. Assigned to + * \ref KISO_CONTEXT::NumberOfPackets. The \ref KISO_CONTEXT::NumberOfPackets field is assignable by + * \c IsoK_Init only and must not be changed by the user. + * + * \param[in] StartFrame + * The USB frame number this request must start on (or \b 0 for ASAP) and assigned to + * \ref KISO_CONTEXT::StartFrame. The \ref KISO_CONTEXT::StartFrame may be chamged by the user in subsequent + * request. For more information, see \ref KISO_CONTEXT::StartFrame. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c IsoK_Init is performs the following tasks in order: + * -# Allocates the \c IsoContext and the required \ref KISO_PACKET structures. + * -# Zero-initializes all ISO context memory. + * -# Assigns \b NumberOfPackets, \b PipeID, and \b StartFrame to \c IsoContext. + * + */ + KUSB_EXP BOOL KUSB_API IsoK_Init( + _out PKISO_CONTEXT* IsoContext, + _in INT NumberOfPackets, + _inopt INT StartFrame); + +//! Destroys an isochronous transfer context. + /*! + * \param[in] IsoContext + * A pointer to an isochronous transfer context created with \ref IsoK_Init. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + */ + KUSB_EXP BOOL KUSB_API IsoK_Free( + _in PKISO_CONTEXT IsoContext); + +//! Convenience function for setting the offset of all ISO packets of an isochronous transfer context. + /*! + * \param[in] IsoContext + * A pointer to an isochronous transfer context. + * + * \param[in] PacketSize + * The packet size used to calculate and assign the absolute data offset for each \ref KISO_PACKET in + * \c IsoContext. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c IsoK_SetPackets updates all \ref KISO_PACKET::Offset fields in a \ref KISO_CONTEXT so all offset are + * \c PacketSize apart. For example: + * - The offset of the first (0-index) packet is 0. + * - The offset of the second (1-index) packet is PacketSize. + * - The offset of the third (2-index) packet is PacketSize*2. + * + * \code + * for (packetIndex = 0; packetIndex < IsoContext->NumberOfPackets; packetIndex++) + * IsoContext->IsoPackets[packetIndex].Offset = packetIndex * PacketSize; + * \endcode + * + */ + KUSB_EXP BOOL KUSB_API IsoK_SetPackets( + _in PKISO_CONTEXT IsoContext, + _in INT PacketSize); + +//! Convenience function for setting all fields of a \ref KISO_PACKET. + /*! + * \param[in] IsoContext + * A pointer to an isochronous transfer context. + * + * \param[in] PacketIndex + * The packet index to set. + * + * \param[in] IsoPacket + * Pointer to a user allocated \c KISO_PACKET which is copied into the PKISO_CONTEXT::IsoPackets array at the + * specified index. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + */ + KUSB_EXP BOOL KUSB_API IsoK_SetPacket( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _in PKISO_PACKET IsoPacket); + +//! Convenience function for getting all fields of a \ref KISO_PACKET. + /*! + * \param[in] IsoContext + * A pointer to an isochronous transfer context. + * + * \param[in] PacketIndex + * The packet index to get. + * + * \param[out] IsoPacket + * Pointer to a user allocated \c KISO_PACKET which receives a copy of the ISO packet in the + * PKISO_CONTEXT::IsoPackets array at the specified index. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + */ + KUSB_EXP BOOL KUSB_API IsoK_GetPacket( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _out PKISO_PACKET IsoPacket); + +//! Convenience function for enumerating ISO packets of an isochronous transfer context. + /*! + * \param[in] IsoContext + * A pointer to an isochronous transfer context. + * + * \param[in] EnumPackets + * Pointer to a user supplied callback function which is executed for all ISO packets in \c IsoContext or + * until the user supplied callback function returns \c FALSE. + * + * \param[in] StartPacketIndex + * The zero-based ISO packet index to begin enumeration at. + * + * \param[in] UserState + * A user defined value which is passed as a parameter to the user supplied callback function. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + */ + KUSB_EXP BOOL KUSB_API IsoK_EnumPackets( + _in PKISO_CONTEXT IsoContext, + _in KISO_ENUM_PACKETS_CB* EnumPackets, + _inopt INT StartPacketIndex, + _inopt PVOID UserState); + +//! Convenience function for re-using an isochronous transfer context in a subsequent request. + /*! + * \param[in,out] IsoContext + * A pointer to an isochronous transfer context. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c IsoK_ReUse does the following: + * -# Zero-initializes the \b Length and \b Status fields of all \ref KISO_PACKET structures. + * -# Zero-initializes the \b StartFrame and \b ErrorCount of the \ref KISO_CONTEXT. + * + */ + KUSB_EXP BOOL KUSB_API IsoK_ReUse( + _ref PKISO_CONTEXT IsoContext); + + /*! @} */ + +#endif + +#ifdef __cplusplus +} +#endif + +#endif // _LIBUSBK_H__ diff --git a/Old Matlab Interface/.svn/pristine/f1/f172784ffef766d0efe968a17adaac35c87924ff.svn-base b/Old Matlab Interface/.svn/pristine/f1/f172784ffef766d0efe968a17adaac35c87924ff.svn-base new file mode 100644 index 00000000..3a7cf3e2 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/f1/f172784ffef766d0efe968a17adaac35c87924ff.svn-base @@ -0,0 +1,29 @@ +clear all +temp_waveform = false(1,500); + +dig_samples = uint8([0:32]); +%%, 0:255, 0:255, 0:255 + +tic +if (length(dig_samples)>500) + temp_samples = dig_samples(1:length(dig_samples)/500:end); + temp_waveform = logical(bitand(temp_samples,16)); +else + temp_samples = false(1,length(dig_samples)*8); + temp_samples(1:8:length(temp_samples)) = bitand(dig_samples,1); + temp_samples(2:8:length(temp_samples)) = bitand(dig_samples,2); + temp_samples(3:8:length(temp_samples)) = bitand(dig_samples,4); + temp_samples(4:8:length(temp_samples)) = bitand(dig_samples,8); + temp_samples(5:8:length(temp_samples)) = bitand(dig_samples,16); + temp_samples(6:8:length(temp_samples)) = bitand(dig_samples,32); + temp_samples(7:8:length(temp_samples)) = bitand(dig_samples,64); + temp_samples(8:8:length(temp_samples)) = bitand(dig_samples,128); + + temp_waveform = temp_samples(1:length(temp_samples)/500:end); +end +toc + +stairs(temp_waveform); +%b = [bitand(a,128), bitand(a,64), bitand(a,32), bitand(a,16), bitand(a,8), bitand(a,4), bitand(a,2), bitand(a,1)]; +%b(logical(mod(1:500,2))) = true; + diff --git a/Old Matlab Interface/.svn/pristine/f1/f187db5d81d807f7a4be8e690e725d8dd82fdb65.svn-base b/Old Matlab Interface/.svn/pristine/f1/f187db5d81d807f7a4be8e690e725d8dd82fdb65.svn-base new file mode 100644 index 00000000..d8e62241 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/f1/f187db5d81d807f7a4be8e690e725d8dd82fdb65.svn-base @@ -0,0 +1,21 @@ +fid = fopen('C:\users\esposch\documents\output.hex'); + +buffer = 0; + +hexarray = []; + +while (buffer ~= -1) + buffer = fgetl(fid); + hexarray = [hexarray buffer(10:end-2)]; +end + +uintarray = []; + +for n=1:2:length(hexarray) + uintarray = [uintarray hex2dec(hexarray([n n+1]))]; +end + +typecast(uintarray, 'int8') +plot(uintarray); + +fclose(fid); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/f1/f1fb5c24b06f5285a19173c9c4f834ea90ec5363.svn-base b/Old Matlab Interface/.svn/pristine/f1/f1fb5c24b06f5285a19173c9c4f834ea90ec5363.svn-base new file mode 100644 index 00000000..df20690a --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/f1/f1fb5c24b06f5285a19173c9c4f834ea90ec5363.svn-base @@ -0,0 +1,3 @@ + + + diff --git a/Old Matlab Interface/.svn/pristine/f2/f20e3547e49aa4c0b0d16561bfd892e6033fd46d.svn-base b/Old Matlab Interface/.svn/pristine/f2/f20e3547e49aa4c0b0d16561bfd892e6033fd46d.svn-base new file mode 100644 index 00000000..c8e97154 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/f2/f20e3547e49aa4c0b0d16561bfd892e6033fd46d.svn-base @@ -0,0 +1,140 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2011-2012 Travis Robinson +// All rights reserved. +// +// Xfer.Stm +// +// Last Updated: 03.08.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +#define BMFW + +using System; +using System.Runtime.InteropServices; +using System.Threading; +using Test.Devices; +using libusbK; +using libusbK.Examples; + +// ReSharper disable InconsistentNaming + +namespace Xfer.Stm +{ + internal class Program + { + #region TODO USER: Set the test parameters for your device. + + public static StmTestParameters Test = new StmTestParameters(0x04d8, 0xfa2e, 0, 0x81, 1024, null, -1, 4, 64); + + #endregion + + private static void Main() + { + bool success; + WINUSB_PIPE_INFORMATION pipeInfo; + UsbK usb; + USB_INTERFACE_DESCRIPTOR interfaceDescriptor; + + // Find and configure the device. + if (!Test.ConfigureDevice(out pipeInfo, out usb, out interfaceDescriptor)) return; + if (Test.TransferBufferSize == -1) + Test.TransferBufferSize = pipeInfo.MaximumPacketSize*64; + +#if BMFW + // TODO FOR USER: Remove this block if not using benchmark firmware. + // This configures devices running benchmark firmware for streaming DeviceToHost transfers. + Console.WriteLine("Configuring for benchmark device.."); + BM_TEST_TYPE testType = ((Test.PipeId & 0x80) > 0) ? BM_TEST_TYPE.READ : BM_TEST_TYPE.WRITE; + success = Benchmark.Configure(usb, BM_COMMAND.SET_TEST, interfaceDescriptor.bInterfaceNumber, ref testType); + if (!success) + { + Console.WriteLine("Bench_Configure failed."); + } +#endif + if (!Test.ShowTestReady()) goto Done; + + KSTM_CALLBACK callback = new KSTM_CALLBACK(); + StmK stm = new StmK( + usb.Handle, + pipeInfo.PipeId, + Test.TransferBufferSize, + Test.MaxPendingTransfers, + Test.MaxPendingIO, + ref callback, + KSTM_FLAG.USE_TIMEOUT | (KSTM_FLAG) 3000); + + byte[] tempBuffer = new byte[Test.TransferBufferSize]; + + Thread.Sleep(0); + // This is just a counter/timer for statistics gathering. + Test.Dcs.Start(); + success = stm.Start(); + + long totalTransferCount = 0; + while (success) + { + int transferred; + if ((pipeInfo.PipeId & 0x80) == 0x80) + { + success = stm.Read(tempBuffer, 0, tempBuffer.Length, out transferred); + if (!success) break; + } + else + { + success = stm.Write(tempBuffer, 0, tempBuffer.Length, out transferred); + if (!success) break; + } + + string dataPrefix = String.Format(" Data Prefix: [{0:X2} {1:X2} {2:X2} {3:X2} {4:X2} {5:X2} {6:X2} {7:X2}] ", + tempBuffer[0], + tempBuffer[1], + tempBuffer[2], + tempBuffer[3], + tempBuffer[4], + tempBuffer[5], + tempBuffer[6], + tempBuffer[7]); + + Console.WriteLine( + totalTransferCount > Test.MaxTransfersTotal + ? "#{0}: [Stream Stopped] {1} transferred. {2}" + : "#{0}: {1} transferred. {2}", + totalTransferCount.ToString("0000"), + transferred, + dataPrefix); + + totalTransferCount++; + + if (totalTransferCount == Test.MaxTransfersTotal) + success = stm.Stop(3000); + } + + Console.WriteLine("Done. TotalTransfers:{0} ErrorCode:{1:X8}h", totalTransferCount, Marshal.GetLastWin32Error()); + + stm.Free(); + + Done: + usb.Free(); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/f2/f28f71d8657521632dd5fb0a70026a6ce407e60d.svn-base b/Old Matlab Interface/.svn/pristine/f2/f28f71d8657521632dd5fb0a70026a6ce407e60d.svn-base new file mode 100644 index 00000000..542cfdb9 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/f2/f28f71d8657521632dd5fb0a70026a6ce407e60d.svn-base @@ -0,0 +1,99 @@ +global scope_window_time +global scope_window_max +global scope_window_min +global scope_mode +global gui_axes +global text_box_1 +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global gui_cursor_mode + +samplestoshow = 375000*scope_window_time; +refreshrate_temp = refreshrate_temp - 1; + +tic +if(scope_mode==0) %analog mode + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + if length(saved_waveform)>samplestoshow + if (samplestoshow>500) + temp_waveform = saved_waveform((length(saved_waveform) - samplestoshow):samplestoshow/500: length(saved_waveform)); + else + temp_waveform = saved_waveform((length(saved_waveform) - samplestoshow): length(saved_waveform)); + end + undofrontend; + taxis = linspace(-scope_window_time,0,length(cool_waveform)); + switch(gui_cursor_mode) + case 1 + plot(gui_axes, taxis, cool_waveform, 'y'); + case 2 + plot(gui_axes, taxis, cool_waveform, 'y', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + case 3 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:'); + case 4 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + + otherwise + error('Gui_axes is in an invalid state'); + end + +% if(gui_cursor_mode == 3 | gui_cursor_mode == 4) +% plot(gui_axes, [gui_vert_cursor_pos gui_vert_cursor_pos], [scope_window_min scope_window_max], 'w') +% end +% if (gui_cursor_mode == 2 | gui_cursor_mode == 4) +% plot(gui_axes, [-scope_window_time 0], [gui_hori_cursor_pos gui_hori_cursor_pos], 'w') +% end + set(gui_axes, 'Ylim', [scope_window_min, scope_window_max], 'Xlim', [-scope_window_time, 0], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + waveform_exists = 1; + %axis([-scope_window_time 0 scope_window_min scope_window_max]) + %titlestring = sprintf('Showing ADC waveform. Window size = %es \nMin=%.2fV Max=%.2fV Mean=%.2fV RMS=%.2fV', samplestoshow/375000, min(cool_waveform), max(cool_waveform), mean(cool_waveform), rms(cool_waveform)); + end + else + if (waveform_exists) + set(text_box_1, 'String', sprintf(' ---------------------\n Vmin = %.2fV\n ---------------------\n Vmax = %.2f\n ---------------------\n Vmean = %.2f\n ---------------------\n Vrms = %.2f\n ---------------------\n ', min(cool_waveform), max(cool_waveform), mean(cool_waveform), rms(cool_waveform))); + %title(titlestring); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Voltage (V)') + drawnow + end + end +else %digital mode + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + if length(saved_waveform)>samplestoshow + if (scope_window_time>(500/375000)) + temp_waveform = saved_waveform((length(saved_waveform) - samplestoshow):samplestoshow/500: length(saved_waveform)); + temp_waveform = typecast(temp_waveform, 'uint8'); + temp_waveform = logical(bitand(temp_waveform,16)); + else + throwaway = round((ceil(samplestoshow)-samplestoshow)*8); + dig_samples = saved_waveform((length(saved_waveform) - samplestoshow) : length(saved_waveform)); + dig_samples = typecast(dig_samples, 'uint8'); + temp_waveform = false(1,length(dig_samples)*8); + temp_waveform(1:8:length(temp_waveform)) = bitand(dig_samples,128); + temp_waveform(2:8:length(temp_waveform)) = bitand(dig_samples,64); + temp_waveform(3:8:length(temp_waveform)) = bitand(dig_samples,32); + temp_waveform(4:8:length(temp_waveform)) = bitand(dig_samples,16); + temp_waveform(5:8:length(temp_waveform)) = bitand(dig_samples,8); + temp_waveform(6:8:length(temp_waveform)) = bitand(dig_samples,4); + temp_waveform(7:8:length(temp_waveform)) = bitand(dig_samples,2); + temp_waveform(8:8:length(temp_waveform)) = bitand(dig_samples,1); + + temp_waveform = temp_waveform((throwaway+1):end); + temp_waveform = temp_waveform(1:length(temp_waveform)/500:end); + end + taxis = linspace(-scope_window_time,0,length(temp_waveform)); + stairs(taxis, temp_waveform); + end + else + axis([-scope_window_time 0 -0.1 1.1]) + titlestring = sprintf('Showing Digital Waveform\nInsert Information here! (Baud Rate?)'); + title(titlestring); + xlabel('Time') + ylabel('Logic Value') + drawnow + end +end +toc \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/f3/f3685fb5bb5629016249592d02bc3d60a4b72e50.svn-base b/Old Matlab Interface/.svn/pristine/f3/f3685fb5bb5629016249592d02bc3d60a4b72e50.svn-base new file mode 100644 index 00000000..ab2a692d --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/f3/f3685fb5bb5629016249592d02bc3d60a4b72e50.svn-base @@ -0,0 +1,22 @@ +function [] = setscopegain(channel, gain); + + +if(gain~=0.5 & gain~=1 & gain~=2 & gain~=4 & gain~=8 & gain~=16 & gain~=32 & gain~=64) + error('Valid values of gain are 0.5, 1, 2, 4, 8, 16, 32, 64'); +end + +global scope_gain +scope_gain = gain; + +gain_mask = uint8([]); + +%%FIX THIS UP +if (gain == 1/2) + gain_mask = 7*4; +else + gain_mask = log2(gain) * 4; +end + +%fprintf('%s\n', dec2bin(gain_mask,8)); + +mex_usb_send_control('40', 'a6', dec2hex(channel), dec2hex(gain_mask), '0', '0'); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/f4/f48d51886747a7bb88daf54ea7b7aa914607f5dd.svn-base b/Old Matlab Interface/.svn/pristine/f4/f48d51886747a7bb88daf54ea7b7aa914607f5dd.svn-base new file mode 100644 index 00000000..64876bbd --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/f4/f48d51886747a7bb88daf54ea7b7aa914607f5dd.svn-base @@ -0,0 +1,3290 @@ +ERROR: Z:\SVNMAIN\GoogleCode\usb-travis\trunk\libusbK\bindings\libusbK.cs(1281,9): BCE0000: enum member initializer must be integer value + +#region Copyright (c) Travis Robinson + +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// C# libusbK Bindings +// Auto-generated on: 04.28.2011 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + + +// ReSharper disable InconsistentNaming +// ReSharper disable CheckNamespace +// ReSharper disable UnassignedReadonlyField + +namespace libusbK + +import System +import System.Diagnostics +import System.Runtime.InteropServices + +public static class AllKOptions: + + #region Public Members + + public static LIBUSBK_FULLPATH_TO_ALTERNATE_DLL as string + + #endregion + + +public static class AllKConstants: + + #region Public Members + + public static final KLST_STRING_MAX_LEN = 256 + + + public static final LIBUSBK_DLL = 'libusbK.dll' + + + public static final USB_CONFIG_POWERED_MASK as byte = 192 + + + public static final USB_ENDPOINT_ADDRESS_MASK as byte = 15 + + + public static final USB_ENDPOINT_DIRECTION_MASK as byte = 128 + + #endregion + + +public enum PipePolicyType: + + SHORT_PACKET_TERMINATE = 1 + + AUTO_CLEAR_STALL = 2 + + PIPE_TRANSFER_TIMEOUT = 3 + + IGNORE_SHORT_PACKETS = 4 + + ALLOW_PARTIAL_READS = 5 + + AUTO_FLUSH = 6 + + RAW_IO = 7 + + MAXIMUM_TRANSFER_SIZE = 8 + + RESET_PIPE_ON_RESUME = 9 + + + ISO_START_LATENCY = 32 + + ISO_ALWAYS_START_ASAP = 33 + + ISO_NUM_FIXED_PACKETS = 34 + + + SIMUL_PARALLEL_REQUESTS = 48 + + +public enum PowerPolicyType: + + AUTO_SUSPEND = 129 + + SUSPEND_DELAY = 131 + + +public enum DeviceInformationType: + + DEVICE_SPEED = 1 + + +public enum EndpointType: + + CONTROL = 0 + + + ISOCHRONOUS = 1 + + + BULK = 2 + + + INTERRUPT = 3 + + + MASK = 3 + + +public static class ErrorCodes: + + #region Public Members + + public static final AccessDenied = 5 + + + public static final Busy = 170 + + + public static final Cancelled = 1223 + + + public static final Empty = 4306 + + + public static final InvalidHandle = 6 + + + public static final InvalidParameter = 87 + + + public static final IoIncomplete = 996 + + + public static final IoPending = 997 + + + public static final MoreData = 234 + + + public static final NoMoreItems = 259 + + + public static final NotEnoughMemory = 8 + + + public static final NotFound = 1168 + + + public static final NotSupported = 50 + + + public static final OperationAborted = 995 + + + public static final ResourceNotAvailable = 5006 + + + public static final ResourceNotFound = 5007 + + + public static final SemTimeout = 121 + + + public static final Success = 0 + + + public static final ThreadNotInProcess = 566 + + + public static final ThreadWasSuspended = 699 + + + public static final TooManyModules = 214 + + #endregion + + +public interface IKLIB_HANDLE: + + #region Public Members + + def GetContext() as IntPtr + + HandleType as KLIB_HANDLE_TYPE: + get + + Pointer as IntPtr: + get + + def SetCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool + + def SetContext(UserContext as IntPtr) as bool + + #endregion + + +#region Opaque library handles + +public struct KLST_HANDLE(IKLIB_HANDLE): + + #region IKLIB_HANDLE Members + + public Pointer as IntPtr: + get: + return mHandlePtr + + + public HandleType as KLIB_HANDLE_TYPE: + get: + return KLIB_HANDLE_TYPE.LSTK + + + public def GetContext() as IntPtr: + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + + + public def SetContext(UserContext as IntPtr) as bool: + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + + + public def SetCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool: + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + + + #endregion + + #region Public Members + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + #endregion + + #region Private Members + + private final mHandlePtr as IntPtr + + #endregion + + +public struct KHOT_HANDLE(IKLIB_HANDLE): + + #region IKLIB_HANDLE Members + + public Pointer as IntPtr: + get: + return mHandlePtr + + + public HandleType as KLIB_HANDLE_TYPE: + get: + return KLIB_HANDLE_TYPE.HOTK + + + public def GetContext() as IntPtr: + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + + + public def SetContext(UserContext as IntPtr) as bool: + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + + + public def SetCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool: + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + + + #endregion + + #region Public Members + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + #endregion + + #region Private Members + + private final mHandlePtr as IntPtr + + #endregion + + +public struct KUSB_HANDLE(IKLIB_HANDLE): + + #region IKLIB_HANDLE Members + + public Pointer as IntPtr: + get: + return mHandlePtr + + + public HandleType as KLIB_HANDLE_TYPE: + get: + return KLIB_HANDLE_TYPE.USBK + + + public def GetContext() as IntPtr: + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + + + public def SetContext(UserContext as IntPtr) as bool: + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + + + public def SetCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool: + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + + + #endregion + + #region USB Shared Device Context + + public def GetSharedContext() as IntPtr: + return AllKFunctions.LibK_GetContext(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK) + + + public def SetSharedCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool: + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK, CleanupCallback) + + + public def SetSharedContext(UserContext as IntPtr) as bool: + return AllKFunctions.LibK_SetContext(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK, UserContext) + + + #endregion + + #region Public Members + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + #endregion + + #region Private Members + + private final mHandlePtr as IntPtr + + #endregion + + +public struct KOVL_POOL_HANDLE(IKLIB_HANDLE): + + #region IKLIB_HANDLE Members + + public Pointer as IntPtr: + get: + return mHandlePtr + + + public HandleType as KLIB_HANDLE_TYPE: + get: + return KLIB_HANDLE_TYPE.OVLPOOLK + + + public def GetContext() as IntPtr: + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + + + public def SetContext(UserContext as IntPtr) as bool: + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + + + public def SetCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool: + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + + + #endregion + + #region Public Members + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + #endregion + + #region Private Members + + private final mHandlePtr as IntPtr + + #endregion + + +public struct KOVL_HANDLE(IKLIB_HANDLE): + + #region IKLIB_HANDLE Members + + public Pointer as IntPtr: + get: + return mHandlePtr + + + public HandleType as KLIB_HANDLE_TYPE: + get: + return KLIB_HANDLE_TYPE.OVLK + + + public def GetContext() as IntPtr: + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + + + public def SetContext(UserContext as IntPtr) as bool: + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + + + public def SetCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool: + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + + + #endregion + + #region Public Members + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + #endregion + + #region Private Members + + private final mHandlePtr as IntPtr + + #endregion + + +public struct KSTM_HANDLE(IKLIB_HANDLE): + + #region IKLIB_HANDLE Members + + public Pointer as IntPtr: + get: + return mHandlePtr + + + public HandleType as KLIB_HANDLE_TYPE: + get: + return KLIB_HANDLE_TYPE.STMK + + + public def GetContext() as IntPtr: + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + + + public def SetContext(UserContext as IntPtr) as bool: + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + + + public def SetCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool: + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + + + #endregion + + #region Public Members + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + #endregion + + #region Private Members + + private final mHandlePtr as IntPtr + + #endregion + + +#endregion + +#region Internal Function Imports + +internal static class AllKFunctions: + + #region Delegates + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable HotK_FreeAllDelegate() as void + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable HotK_FreeDelegate([In] Handle as KHOT_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable HotK_InitDelegate([Out] ref Handle as KHOT_HANDLE, [In] [Out] ref InitParams as KHOT_PARAMS) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable IsoK_EnumPacketsDelegate([In] IsoContext as KISO_CONTEXT, EnumPackets as KISO_ENUM_PACKETS_CB, StartPacketIndex as int, UserState as IntPtr) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable IsoK_FreeDelegate([In] IsoContext as KISO_CONTEXT) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable IsoK_GetPacketDelegate([In] IsoContext as KISO_CONTEXT, PacketIndex as int, [Out] ref IsoPacket as KISO_PACKET) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable IsoK_InitDelegate([Out] ref IsoContext as KISO_CONTEXT, NumberOfPackets as int, StartFrame as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable IsoK_ReUseDelegate([In] IsoContext as KISO_CONTEXT) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable IsoK_SetPacketDelegate([In] IsoContext as KISO_CONTEXT, PacketIndex as int, [In] ref IsoPacket as KISO_PACKET) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable IsoK_SetPacketsDelegate([In] IsoContext as KISO_CONTEXT, PacketSize as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_Context_FreeDelegate() as void + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_Context_InitDelegate(Heap as IntPtr, Reserved as IntPtr) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_CopyDriverAPIDelegate([Out] ref DriverAPI as KUSB_DRIVER_API, [In] UsbHandle as KUSB_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_GetContextDelegate([In] Handle as IntPtr, HandleType as KLIB_HANDLE_TYPE) as IntPtr + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_GetDefaultContextDelegate(HandleType as KLIB_HANDLE_TYPE) as IntPtr + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_GetProcAddressDelegate(ProcAddress as IntPtr, DriverID as int, FunctionID as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_GetVersionDelegate([Out] ref Version as KLIB_VERSION) as void + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_LoadDriverAPIDelegate([Out] ref DriverAPI as KUSB_DRIVER_API, DriverID as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_SetCleanupCallbackDelegate([In] Handle as IntPtr, HandleType as KLIB_HANDLE_TYPE, CleanupCB as KLIB_HANDLE_CLEANUP_CB) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_SetContextDelegate([In] Handle as IntPtr, HandleType as KLIB_HANDLE_TYPE, ContextValue as IntPtr) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_SetDefaultContextDelegate(HandleType as KLIB_HANDLE_TYPE, ContextValue as IntPtr) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_CountDelegate([In] DeviceList as KLST_HANDLE, ref Count as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_CurrentDelegate([In] DeviceList as KLST_HANDLE, [Out] ref DeviceInfo as KLST_DEVINFO_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_EnumerateDelegate([In] DeviceList as KLST_HANDLE, EnumDevListCB as KLST_ENUM_DEVINFO_CB, Context as IntPtr) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_FindByVidPidDelegate([In] DeviceList as KLST_HANDLE, Vid as int, Pid as int, [Out] ref DeviceInfo as KLST_DEVINFO_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_FreeDelegate([In] DeviceList as KLST_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_InitDelegate([Out] ref DeviceList as KLST_HANDLE, Flags as KLST_FLAG) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_InitExDelegate([Out] ref DeviceList as KLST_HANDLE, Flags as KLST_FLAG, [In] ref PatternMatch as KLST_PATTERN_MATCH) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_MoveNextDelegate([In] DeviceList as KLST_HANDLE, [Out] ref DeviceInfo as KLST_DEVINFO_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_MoveResetDelegate([In] DeviceList as KLST_HANDLE) as void + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_AcquireDelegate([Out] ref OverlappedK as KOVL_HANDLE, [In] PoolHandle as KOVL_POOL_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_FreeDelegate([In] PoolHandle as KOVL_POOL_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_GetEventHandleDelegate([In] OverlappedK as KOVL_HANDLE) as IntPtr + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_InitDelegate([Out] ref PoolHandle as KOVL_POOL_HANDLE, [In] UsbHandle as KUSB_HANDLE, MaxOverlappedCount as int, Flags as KOVL_POOL_FLAG) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_IsCompleteDelegate([In] OverlappedK as KOVL_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_ReUseDelegate([In] OverlappedK as KOVL_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_ReleaseDelegate([In] OverlappedK as KOVL_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_WaitAndReleaseDelegate([In] OverlappedK as KOVL_HANDLE, TimeoutMS as int, ref TransferredLength as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_WaitDelegate([In] OverlappedK as KOVL_HANDLE, TimeoutMS as int, WaitFlags as KOVL_WAIT_FLAG, ref TransferredLength as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_WaitOldestDelegate([In] PoolHandle as KOVL_POOL_HANDLE, [Out] ref OverlappedK as KOVL_HANDLE, TimeoutMS as int, WaitFlags as KOVL_WAIT_FLAG, ref TransferredLength as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_WaitOrCancelDelegate([In] OverlappedK as KOVL_HANDLE, TimeoutMS as int, ref TransferredLength as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable StmK_FreeDelegate([In] StreamHandle as KSTM_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable StmK_InitDelegate([Out] ref StreamHandle as KSTM_HANDLE, [In] UsbHandle as KUSB_HANDLE, PipeID as byte, MaxTransferSize as int, MaxPendingTransfers as int, MaxPendingIO as int, [In] ref Callbacks as KSTM_CALLBACK, Flags as KSTM_FLAG) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable StmK_ReadDelegate([In] StreamHandle as KSTM_HANDLE, Buffer as IntPtr, Offset as int, Length as int, ref TransferredLength as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable StmK_StartDelegate([In] StreamHandle as KSTM_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable StmK_StopDelegate([In] StreamHandle as KSTM_HANDLE, TimeoutCancelMS as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable StmK_WriteDelegate([In] StreamHandle as KSTM_HANDLE, Buffer as IntPtr, Offset as int, Length as int, ref TransferredLength as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable UsbK_FreeDelegate([In] InterfaceHandle as KUSB_HANDLE) as bool + + #endregion + + private static def constructor(): + if String.IsNullOrEmpty(AllKOptions.LIBUSBK_FULLPATH_TO_ALTERNATE_DLL): + mModuleLibusbK = LoadLibraryEx(AllKConstants.LIBUSBK_DLL, IntPtr.Zero, LoadLibraryFlags.NONE) + else: + mModuleLibusbK = LoadLibraryEx(AllKOptions.LIBUSBK_FULLPATH_TO_ALTERNATE_DLL, IntPtr.Zero, LoadLibraryFlags.LOAD_WITH_ALTERED_SEARCH_PATH) + + if mModuleLibusbK == IntPtr.Zero: + raise DllNotFoundException('libusbK.dll not found. Please install drivers/applications and retry.') + + LoadDynamicFunctions() + + + #region Nested Enumerations + + [Flags] + private enum LoadLibraryFlags: + + NONE = 0 + + DONT_RESOLVE_DLL_REFERENCES = 1 + + LOAD_IGNORE_CODE_AUTHZ_LEVEL = 16 + + LOAD_LIBRARY_AS_DATAFILE = 2 + + LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 64 + + LOAD_LIBRARY_AS_IMAGE_RESOURCE = 32 + + LOAD_WITH_ALTERED_SEARCH_PATH = 8 + + + #endregion + + #region Public Members + + public static HotK_Free as HotK_FreeDelegate + + public static HotK_FreeAll as HotK_FreeAllDelegate + + public static HotK_Init as HotK_InitDelegate + + public static IsoK_EnumPackets as IsoK_EnumPacketsDelegate + + public static IsoK_Free as IsoK_FreeDelegate + + public static IsoK_GetPacket as IsoK_GetPacketDelegate + + public static IsoK_Init as IsoK_InitDelegate + + public static IsoK_ReUse as IsoK_ReUseDelegate + + public static IsoK_SetPacket as IsoK_SetPacketDelegate + + public static IsoK_SetPackets as IsoK_SetPacketsDelegate + + public static LibK_Context_Free as LibK_Context_FreeDelegate + + public static LibK_Context_Init as LibK_Context_InitDelegate + + + public static LibK_CopyDriverAPI as LibK_CopyDriverAPIDelegate + + public static LibK_GetContext as LibK_GetContextDelegate + + public static LibK_GetDefaultContext as LibK_GetDefaultContextDelegate + + public static LibK_GetProcAddress as LibK_GetProcAddressDelegate + + public static LibK_GetVersion as LibK_GetVersionDelegate + + public static LibK_LoadDriverAPI as LibK_LoadDriverAPIDelegate + + public static LibK_SetCleanupCallback as LibK_SetCleanupCallbackDelegate + + public static LibK_SetContext as LibK_SetContextDelegate + + public static LibK_SetDefaultContext as LibK_SetDefaultContextDelegate + + public static LstK_Count as LstK_CountDelegate + + public static LstK_Current as LstK_CurrentDelegate + + public static LstK_Enumerate as LstK_EnumerateDelegate + + public static LstK_FindByVidPid as LstK_FindByVidPidDelegate + + public static LstK_Free as LstK_FreeDelegate + + public static LstK_Init as LstK_InitDelegate + + public static LstK_InitEx as LstK_InitExDelegate + + public static LstK_MoveNext as LstK_MoveNextDelegate + + public static LstK_MoveReset as LstK_MoveResetDelegate + + public static OvlK_Acquire as OvlK_AcquireDelegate + + public static OvlK_Free as OvlK_FreeDelegate + + public static OvlK_GetEventHandle as OvlK_GetEventHandleDelegate + + public static OvlK_Init as OvlK_InitDelegate + + public static OvlK_IsComplete as OvlK_IsCompleteDelegate + + public static OvlK_ReUse as OvlK_ReUseDelegate + + public static OvlK_Release as OvlK_ReleaseDelegate + + public static OvlK_Wait as OvlK_WaitDelegate + + public static OvlK_WaitAndRelease as OvlK_WaitAndReleaseDelegate + + public static OvlK_WaitOldest as OvlK_WaitOldestDelegate + + public static OvlK_WaitOrCancel as OvlK_WaitOrCancelDelegate + + public static StmK_Free as StmK_FreeDelegate + + public static StmK_Init as StmK_InitDelegate + + public static StmK_Read as StmK_ReadDelegate + + public static StmK_Start as StmK_StartDelegate + + public static StmK_Stop as StmK_StopDelegate + + public static StmK_Write as StmK_WriteDelegate + + public static UsbK_Free as UsbK_FreeDelegate + + + #endregion + + #region Private Members + + [DllImport('kernel32.dll', CharSet: CharSet.Ansi, ExactSpelling: true, SetLastError: true)] + private static def GetProcAddress(hModule as IntPtr, procName as string) as IntPtr: + pass + + + private static def LoadDynamicFunctions(): + LibK_GetVersion = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_GetVersion'), typeof(LibK_GetVersionDelegate)) cast LibK_GetVersionDelegate) + LibK_GetContext = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_GetContext'), typeof(LibK_GetContextDelegate)) cast LibK_GetContextDelegate) + LibK_SetContext = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_SetContext'), typeof(LibK_SetContextDelegate)) cast LibK_SetContextDelegate) + LibK_SetCleanupCallback = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_SetCleanupCallback'), typeof(LibK_SetCleanupCallbackDelegate)) cast LibK_SetCleanupCallbackDelegate) + LibK_LoadDriverAPI = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_LoadDriverAPI'), typeof(LibK_LoadDriverAPIDelegate)) cast LibK_LoadDriverAPIDelegate) + LibK_CopyDriverAPI = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_CopyDriverAPI'), typeof(LibK_CopyDriverAPIDelegate)) cast LibK_CopyDriverAPIDelegate) + LibK_GetProcAddress = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_GetProcAddress'), typeof(LibK_GetProcAddressDelegate)) cast LibK_GetProcAddressDelegate) + LibK_SetDefaultContext = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_SetDefaultContext'), typeof(LibK_SetDefaultContextDelegate)) cast LibK_SetDefaultContextDelegate) + LibK_GetDefaultContext = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_GetDefaultContext'), typeof(LibK_GetDefaultContextDelegate)) cast LibK_GetDefaultContextDelegate) + LibK_Context_Init = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_Context_Init'), typeof(LibK_Context_InitDelegate)) cast LibK_Context_InitDelegate) + LibK_Context_Free = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_Context_Free'), typeof(LibK_Context_FreeDelegate)) cast LibK_Context_FreeDelegate) + UsbK_Free = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'UsbK_Free'), typeof(UsbK_FreeDelegate)) cast UsbK_FreeDelegate) + LstK_Init = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_Init'), typeof(LstK_InitDelegate)) cast LstK_InitDelegate) + LstK_InitEx = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_InitEx'), typeof(LstK_InitExDelegate)) cast LstK_InitExDelegate) + LstK_Free = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_Free'), typeof(LstK_FreeDelegate)) cast LstK_FreeDelegate) + LstK_Enumerate = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_Enumerate'), typeof(LstK_EnumerateDelegate)) cast LstK_EnumerateDelegate) + LstK_Current = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_Current'), typeof(LstK_CurrentDelegate)) cast LstK_CurrentDelegate) + LstK_MoveNext = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_MoveNext'), typeof(LstK_MoveNextDelegate)) cast LstK_MoveNextDelegate) + LstK_MoveReset = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_MoveReset'), typeof(LstK_MoveResetDelegate)) cast LstK_MoveResetDelegate) + LstK_FindByVidPid = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_FindByVidPid'), typeof(LstK_FindByVidPidDelegate)) cast LstK_FindByVidPidDelegate) + LstK_Count = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_Count'), typeof(LstK_CountDelegate)) cast LstK_CountDelegate) + HotK_Init = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'HotK_Init'), typeof(HotK_InitDelegate)) cast HotK_InitDelegate) + HotK_Free = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'HotK_Free'), typeof(HotK_FreeDelegate)) cast HotK_FreeDelegate) + HotK_FreeAll = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'HotK_FreeAll'), typeof(HotK_FreeAllDelegate)) cast HotK_FreeAllDelegate) + OvlK_Acquire = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_Acquire'), typeof(OvlK_AcquireDelegate)) cast OvlK_AcquireDelegate) + OvlK_Release = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_Release'), typeof(OvlK_ReleaseDelegate)) cast OvlK_ReleaseDelegate) + OvlK_Init = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_Init'), typeof(OvlK_InitDelegate)) cast OvlK_InitDelegate) + OvlK_Free = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_Free'), typeof(OvlK_FreeDelegate)) cast OvlK_FreeDelegate) + OvlK_GetEventHandle = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_GetEventHandle'), typeof(OvlK_GetEventHandleDelegate)) cast OvlK_GetEventHandleDelegate) + OvlK_Wait = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_Wait'), typeof(OvlK_WaitDelegate)) cast OvlK_WaitDelegate) + OvlK_WaitOldest = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_WaitOldest'), typeof(OvlK_WaitOldestDelegate)) cast OvlK_WaitOldestDelegate) + OvlK_WaitOrCancel = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_WaitOrCancel'), typeof(OvlK_WaitOrCancelDelegate)) cast OvlK_WaitOrCancelDelegate) + OvlK_WaitAndRelease = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_WaitAndRelease'), typeof(OvlK_WaitAndReleaseDelegate)) cast OvlK_WaitAndReleaseDelegate) + OvlK_IsComplete = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_IsComplete'), typeof(OvlK_IsCompleteDelegate)) cast OvlK_IsCompleteDelegate) + OvlK_ReUse = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_ReUse'), typeof(OvlK_ReUseDelegate)) cast OvlK_ReUseDelegate) + StmK_Init = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'StmK_Init'), typeof(StmK_InitDelegate)) cast StmK_InitDelegate) + StmK_Free = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'StmK_Free'), typeof(StmK_FreeDelegate)) cast StmK_FreeDelegate) + StmK_Start = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'StmK_Start'), typeof(StmK_StartDelegate)) cast StmK_StartDelegate) + StmK_Stop = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'StmK_Stop'), typeof(StmK_StopDelegate)) cast StmK_StopDelegate) + StmK_Read = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'StmK_Read'), typeof(StmK_ReadDelegate)) cast StmK_ReadDelegate) + StmK_Write = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'StmK_Write'), typeof(StmK_WriteDelegate)) cast StmK_WriteDelegate) + IsoK_Init = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'IsoK_Init'), typeof(IsoK_InitDelegate)) cast IsoK_InitDelegate) + IsoK_Free = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'IsoK_Free'), typeof(IsoK_FreeDelegate)) cast IsoK_FreeDelegate) + IsoK_SetPackets = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'IsoK_SetPackets'), typeof(IsoK_SetPacketsDelegate)) cast IsoK_SetPacketsDelegate) + IsoK_SetPacket = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'IsoK_SetPacket'), typeof(IsoK_SetPacketDelegate)) cast IsoK_SetPacketDelegate) + IsoK_GetPacket = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'IsoK_GetPacket'), typeof(IsoK_GetPacketDelegate)) cast IsoK_GetPacketDelegate) + IsoK_EnumPackets = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'IsoK_EnumPackets'), typeof(IsoK_EnumPacketsDelegate)) cast IsoK_EnumPacketsDelegate) + IsoK_ReUse = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'IsoK_ReUse'), typeof(IsoK_ReUseDelegate)) cast IsoK_ReUseDelegate) + + + [DllImport('kernel32.dll')] + private static def LoadLibraryEx(lpFileName as string, hReservedNull as IntPtr, dwFlags as LoadLibraryFlags) as IntPtr: + pass + + + private static final mModuleLibusbK as IntPtr = IntPtr.Zero + + #endregion + + +#endregion + +#region Enumerations + +public enum USBD_PIPE_TYPE: + + UsbdPipeTypeControl + + + UsbdPipeTypeIsochronous + + + UsbdPipeTypeBulk + + + UsbdPipeTypeInterrupt + + +[Flags] +public enum KISO_FLAG: + + NONE = 0 + + + SET_START_FRAME = 1 + + +public enum KLIB_HANDLE_TYPE: + + HOTK + + + USBK + + + USBSHAREDK + + + LSTK + + + LSTINFOK + + + OVLK + + + OVLPOOLK + + + STMK + + + COUNT + + +[Flags] +public enum KLST_SYNC_FLAG: + + NONE = 0 + + + UNCHANGED = 1 + + + ADDED = 2 + + + REMOVED = 4 + + + CONNECT_CHANGE = 8 + + + MASK = 15 + + +[Flags] +public enum KLST_FLAG: + + NONE = 0 + + + INCLUDE_RAWGUID = 1 + + + INCLUDE_DISCONNECT = 2 + + +public enum BMREQUEST_DIR: + + HOST_TO_DEVICE = 0 + + DEVICE_TO_HOST = 1 + + +public enum BMREQUEST_TYPE: + + STANDARD = 0 + + + CLASS = 1 + + + VENDOR = 2 + + +public enum BMREQUEST_RECIPIENT: + + DEVICE = 0 + + + INTERFACE = 1 + + + ENDPOINT = 2 + + + OTHER = 3 + + +public enum USB_GETSTATUS: + + SELF_POWERED = 1 + + + REMOTE_WAKEUP_ENABLED = 2 + + +public enum USB_DESCRIPTOR_TYPE: + + DEVICE = 1 + + + CONFIGURATION = 2 + + + STRING = 3 + + + INTERFACE = 4 + + + ENDPOINT = 5 + + + DEVICE_QUALIFIER = 6 + + + CONFIG_POWER = 7 + + + INTERFACE_POWER = 8 + + + INTERFACE_ASSOCIATION = 11 + + +public enum KUSB_PROPERTY: + + DEVICE_FILE_HANDLE + + + COUNT + + +public enum KUSB_DRVID: + + LIBUSBK + + + LIBUSB0 + + + WINUSB + + + LIBUSB0_FILTER + + + COUNT + + +public enum KUSB_FNID: + + Init + + + Free + + + ClaimInterface + + + ReleaseInterface + + + SetAltInterface + + + GetAltInterface + + + GetDescriptor + + + ControlTransfer + + + SetPowerPolicy + + + GetPowerPolicy + + + SetConfiguration + + + GetConfiguration + + + ResetDevice + + + Initialize + + + SelectInterface + + + GetAssociatedInterface + + + Clone + + + QueryInterfaceSettings + + + QueryDeviceInformation + + + SetCurrentAlternateSetting + + + GetCurrentAlternateSetting + + + QueryPipe + + + SetPipePolicy + + + GetPipePolicy + + + ReadPipe + + + WritePipe + + + ResetPipe + + + AbortPipe + + + FlushPipe + + + IsoReadPipe + + + IsoWritePipe + + + GetCurrentFrameNumber + + + GetOverlappedResult + + + GetProperty + + + + COUNT + + +[Flags] +public enum KHOT_FLAG: + + NONE + + + PLUG_ALL_ON_INIT = 1 + + + PASS_DUPE_INSTANCE = 2 + + + POST_USER_MESSAGE = 4 + + +[Flags] +public enum KOVL_WAIT_FLAG: + + NONE = 0 + + + RELEASE_ON_SUCCESS = 1 + + + RELEASE_ON_FAIL = 2 + + + RELEASE_ON_SUCCESS_FAIL = 3 + + + CANCEL_ON_TIMEOUT = 4 + + + RELEASE_ON_TIMEOUT = 12 + + + RELEASE_ALWAYS = 15 + + + ALERTABLE = 16 + + +[Flags] +public enum KOVL_POOL_FLAG: + + NONE = 0 + + +[Flags] +public enum KSTM_FLAG(uint): + + NONE = 0 + + NO_PARTIAL_XFERS = 1048576 + + TIMEOUT_MASK = 131071 + + +public enum KSTM_COMPLETE_RESULT: + + VALID = 0 + + + INVALID + + +#endregion + +#region Structs + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi)] +public struct WINUSB_PIPE_INFORMATION: + + public PipeType as USBD_PIPE_TYPE + + + public PipeId as byte + + + public MaximumPacketSize as ushort + + + public Interval as byte + + + + public override def ToString() as string: + return string.Format('PipeType: {0}\nPipeId: {1}\nMaximumPacketSize: {2}\nInterval: {3}\n', PipeType, (PipeId.ToString('X2') + 'h'), MaximumPacketSize, (Interval.ToString('X2') + 'h')) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] +public struct WINUSB_SETUP_PACKET: + + public RequestType as byte + + + public Request as byte + + + public Value as ushort + + + public Index as ushort + + + public Length as ushort + + + + public override def ToString() as string: + return string.Format('RequestType: {0}\nRequest: {1}\nValue: {2}\nIndex: {3}\nLength: {4}\n', (RequestType.ToString('X2') + 'h'), (Request.ToString('X2') + 'h'), (Value.ToString('X4') + 'h'), (Index.ToString('X4') + 'h'), Length) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] +public struct KISO_PACKET: + + public Offset as int + + + public Length as ushort + + + public Status as ushort + + + + public override def ToString() as string: + return string.Format('Offset: {0}\nLength: {1}\nStatus: {2}\n', Offset, Length, (Status.ToString('X4') + 'h')) + + +[StructLayout(LayoutKind.Sequential)] +public struct KISO_CONTEXT: + + private final mHandlePtr as IntPtr + + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + public Pointer as IntPtr: + get: + return mHandlePtr + + + [StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] + private struct KISO_CONTEXT_MAP: + + private final Flags as KISO_FLAG + + + private final StartFrame as int + + + private final ErrorCount as short + + + private final NumberOfPackets as short + + + private final UrbHdrStatus as int + + + private static final ofsFlags as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'Flags').ToInt32() + + private static final ofsStartFrame as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'StartFrame').ToInt32() + + private static final ofsErrorCount as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'ErrorCount').ToInt32() + + private static final ofsNumberOfPackets as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'NumberOfPackets').ToInt32() + + private static final ofsUrbHdrStatus as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'UrbHdrStatus').ToInt32() + + + + public Flags as KISO_FLAG: + get: + return (Marshal.ReadInt32(mHandlePtr, ofsFlags) cast KISO_FLAG) + + + + public StartFrame as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsStartFrame) + + + + public ErrorCount as short: + get: + return Marshal.ReadInt16(mHandlePtr, ofsErrorCount) + + + + public NumberOfPackets as short: + get: + return Marshal.ReadInt16(mHandlePtr, ofsNumberOfPackets) + + + + public UrbHdrStatus as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsUrbHdrStatus) + + + + public override def ToString() as string: + return string.Format('Flags: {0}\nStartFrame: {1}\nErrorCount: {2}\nNumberOfPackets: {3}\nUrbHdrStatus: {4}\n', Flags.ToString(), StartFrame, ErrorCount, NumberOfPackets, (UrbHdrStatus.ToString('X8') + 'h')) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi)] +public struct KLIB_VERSION: + + public Major as int + + + public Minor as int + + + public Micro as int + + + public Nano as int + + + public override def ToString() as string: + return string.Format('Major: {0}\nMinor: {1}\nMicro: {2}\nNano: {3}\n', Major, Minor, Micro, Nano) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi)] +public struct KLST_DEV_COMMON_INFO: + + public Vid as int + + + public Pid as int + + + public MI as int + + + // An ID that uniquely identifies a USB device. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + public InstanceID as string + + + + public override def ToString() as string: + return string.Format('Vid: {0}\nPid: {1}\nMI: {2}\nInstanceID: {3}\n', (Vid.ToString('X4') + 'h'), (Pid.ToString('X4') + 'h'), (MI.ToString('X2') + 'h'), InstanceID) + + +[StructLayout(LayoutKind.Sequential)] +public struct KLST_DEVINFO_HANDLE(IKLIB_HANDLE): + + private final mHandlePtr as IntPtr + + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + public Pointer as IntPtr: + get: + return mHandlePtr + + + public HandleType as KLIB_HANDLE_TYPE: + get: + return KLIB_HANDLE_TYPE.LSTINFOK + + + public def GetContext() as IntPtr: + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + + + public def SetContext(UserContext as IntPtr) as bool: + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + + + public def SetCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool: + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + + + [StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi)] + private struct KLST_DEVINFO_MAP: + + private final Common as KLST_DEV_COMMON_INFO + + + private final DriverID as int + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final DeviceInterfaceGUID as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final DeviceID as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final ClassGUID as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final Mfg as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final DeviceDesc as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final Service as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final SymbolicLink as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final DevicePath as string + + + private final LUsb0FilterIndex as int + + + private final Connected as bool + + + private final SyncFlags as KLST_SYNC_FLAG + + + private final BusNumber as int + + + private final DeviceAddress as int + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final SerialNumber as string + + + private static final ofsCommon as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'Common').ToInt32() + + private static final ofsDriverID as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'DriverID').ToInt32() + + private static final ofsDeviceInterfaceGUID as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'DeviceInterfaceGUID').ToInt32() + + private static final ofsDeviceID as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'DeviceID').ToInt32() + + private static final ofsClassGUID as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'ClassGUID').ToInt32() + + private static final ofsMfg as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'Mfg').ToInt32() + + private static final ofsDeviceDesc as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'DeviceDesc').ToInt32() + + private static final ofsService as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'Service').ToInt32() + + private static final ofsSymbolicLink as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'SymbolicLink').ToInt32() + + private static final ofsDevicePath as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'DevicePath').ToInt32() + + private static final ofsLUsb0FilterIndex as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'LUsb0FilterIndex').ToInt32() + + private static final ofsConnected as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'Connected').ToInt32() + + private static final ofsSyncFlags as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'SyncFlags').ToInt32() + + private static final ofsBusNumber as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'BusNumber').ToInt32() + + private static final ofsDeviceAddress as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'DeviceAddress').ToInt32() + + private static final ofsSerialNumber as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'SerialNumber').ToInt32() + + + + public Common as KLST_DEV_COMMON_INFO: + get: + return (Marshal.PtrToStructure(IntPtr((mHandlePtr.ToInt64() + ofsCommon)), typeof(KLST_DEV_COMMON_INFO)) cast KLST_DEV_COMMON_INFO) + + + + public DriverID as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsDriverID) + + + + public DeviceInterfaceGUID as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsDeviceInterfaceGUID))) + + + + public DeviceID as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsDeviceID))) + + + + public ClassGUID as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsClassGUID))) + + + + public Mfg as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsMfg))) + + + + public DeviceDesc as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsDeviceDesc))) + + + + public Service as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsService))) + + + + public SymbolicLink as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsSymbolicLink))) + + + + public DevicePath as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsDevicePath))) + + + + public LUsb0FilterIndex as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsLUsb0FilterIndex) + + + + public Connected as bool: + get: + return (Marshal.ReadInt32(mHandlePtr, ofsConnected) != 0) + + + + public SyncFlags as KLST_SYNC_FLAG: + get: + return (Marshal.ReadInt32(mHandlePtr, ofsSyncFlags) cast KLST_SYNC_FLAG) + + + + public BusNumber as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsBusNumber) + + + + public DeviceAddress as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsDeviceAddress) + + + + public SerialNumber as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsSerialNumber))) + + + + public override def ToString() as string: + return string.Format('DriverID: {0}\nDeviceInterfaceGUID: {1}\nDeviceID: {2}\nClassGUID: {3}\nMfg: {4}\nDeviceDesc: {5}\nService: {6}\nSymbolicLink: {7}\nDevicePath: {8}\nLUsb0FilterIndex: {9}\nConnected: {10}\nSyncFlags: {11}\nBusNumber: {12}\nDeviceAddress: {13}\nSerialNumber: {14}\n', DriverID, DeviceInterfaceGUID, DeviceID, ClassGUID, Mfg, DeviceDesc, Service, SymbolicLink, DevicePath, LUsb0FilterIndex, Connected, SyncFlags.ToString(), BusNumber, DeviceAddress, SerialNumber) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Size: 1024)] +public struct KLST_PATTERN_MATCH: + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + public DeviceID as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + public DeviceInterfaceGUID as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + public ClassGUID as string + + + + public override def ToString() as string: + return string.Format('DeviceID: {0}\nDeviceInterfaceGUID: {1}\nClassGUID: {2}\n', DeviceID, DeviceInterfaceGUID, ClassGUID) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] +public struct USB_DEVICE_DESCRIPTOR: + + public bLength as byte + + + public bDescriptorType as byte + + + public bcdUSB as ushort + + + public bDeviceClass as byte + + + public bDeviceSubClass as byte + + + public bDeviceProtocol as byte + + + public bMaxPacketSize0 as byte + + + public idVendor as ushort + + + public idProduct as ushort + + + public bcdDevice as ushort + + + public iManufacturer as byte + + + public iProduct as byte + + + public iSerialNumber as byte + + + public bNumConfigurations as byte + + + + public override def ToString() as string: + return string.Format('bLength: {0}\nbDescriptorType: {1}\nbcdUSB: {2}\nbDeviceClass: {3}\nbDeviceSubClass: {4}\nbDeviceProtocol: {5}\nbMaxPacketSize0: {6}\nidVendor: {7}\nidProduct: {8}\nbcdDevice: {9}\niManufacturer: {10}\niProduct: {11}\niSerialNumber: {12}\nbNumConfigurations: {13}\n', bLength, (bDescriptorType.ToString('X2') + 'h'), (bcdUSB.ToString('X4') + 'h'), (bDeviceClass.ToString('X2') + 'h'), (bDeviceSubClass.ToString('X2') + 'h'), (bDeviceProtocol.ToString('X2') + 'h'), bMaxPacketSize0, (idVendor.ToString('X4') + 'h'), (idProduct.ToString('X4') + 'h'), (bcdDevice.ToString('X4') + 'h'), iManufacturer, iProduct, iSerialNumber, bNumConfigurations) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] +public struct USB_ENDPOINT_DESCRIPTOR: + + public bLength as byte + + + public bDescriptorType as byte + + + public bEndpointAddress as byte + + + public bmAttributes as byte + + + public wMaxPacketSize as ushort + + + public bInterval as byte + + + + public override def ToString() as string: + return string.Format('bLength: {0}\nbDescriptorType: {1}\nbEndpointAddress: {2}\nbmAttributes: {3}\nwMaxPacketSize: {4}\nbInterval: {5}\n', bLength, (bDescriptorType.ToString('X2') + 'h'), (bEndpointAddress.ToString('X2') + 'h'), (bmAttributes.ToString('X2') + 'h'), wMaxPacketSize, bInterval) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] +public struct USB_CONFIGURATION_DESCRIPTOR: + + public bLength as byte + + + public bDescriptorType as byte + + + public wTotalLength as ushort + + + public bNumInterfaces as byte + + + public bConfigurationValue as byte + + + public iConfiguration as byte + + + public bmAttributes as byte + + + public MaxPower as byte + + + public override def ToString() as string: + return string.Format('bLength: {0}\nbDescriptorType: {1}\nwTotalLength: {2}\nbNumInterfaces: {3}\nbConfigurationValue: {4}\niConfiguration: {5}\nbmAttributes: {6}\nMaxPower: {7}\n', bLength, (bDescriptorType.ToString('X2') + 'h'), wTotalLength, bNumInterfaces, bConfigurationValue, iConfiguration, (bmAttributes.ToString('X2') + 'h'), MaxPower) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] +public struct USB_INTERFACE_DESCRIPTOR: + + public bLength as byte + + + public bDescriptorType as byte + + + public bInterfaceNumber as byte + + + public bAlternateSetting as byte + + + public bNumEndpoints as byte + + + public bInterfaceClass as byte + + + public bInterfaceSubClass as byte + + + public bInterfaceProtocol as byte + + + public iInterface as byte + + + + public override def ToString() as string: + return string.Format('bLength: {0}\nbDescriptorType: {1}\nbInterfaceNumber: {2}\nbAlternateSetting: {3}\nbNumEndpoints: {4}\nbInterfaceClass: {5}\nbInterfaceSubClass: {6}\nbInterfaceProtocol: {7}\niInterface: {8}\n', bLength, (bDescriptorType.ToString('X2') + 'h'), bInterfaceNumber, bAlternateSetting, bNumEndpoints, (bInterfaceClass.ToString('X2') + 'h'), (bInterfaceSubClass.ToString('X2') + 'h'), (bInterfaceProtocol.ToString('X2') + 'h'), iInterface) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Unicode, Pack: 1)] +public struct USB_STRING_DESCRIPTOR: + + public bLength as byte + + + public bDescriptorType as byte + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + public bString as string + + + + public override def ToString() as string: + return string.Format('bLength: {0}\nbDescriptorType: {1}\nbString: {2}\n', bLength, (bDescriptorType.ToString('X2') + 'h'), bString) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] +public struct USB_COMMON_DESCRIPTOR: + + public bLength as byte + + + public bDescriptorType as byte + + + + public override def ToString() as string: + return string.Format('bLength: {0}\nbDescriptorType: {1}\n', bLength, (bDescriptorType.ToString('X2') + 'h')) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] +public struct USB_INTERFACE_ASSOCIATION_DESCRIPTOR: + + public bLength as byte + + + public bDescriptorType as byte + + + public bFirstInterface as byte + + + public bInterfaceCount as byte + + + public bFunctionClass as byte + + + public bFunctionSubClass as byte + + + public bFunctionProtocol as byte + + + public iFunction as byte + + + + public override def ToString() as string: + return string.Format('bLength: {0}\nbDescriptorType: {1}\nbFirstInterface: {2}\nbInterfaceCount: {3}\nbFunctionClass: {4}\nbFunctionSubClass: {5}\nbFunctionProtocol: {6}\niFunction: {7}\n', bLength, (bDescriptorType.ToString('X2') + 'h'), bFirstInterface, bInterfaceCount, (bFunctionClass.ToString('X2') + 'h'), (bFunctionSubClass.ToString('X2') + 'h'), (bFunctionProtocol.ToString('X2') + 'h'), iFunction) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi)] +public struct KUSB_DRIVER_API_INFO: + + public DriverID as int + + + public FunctionCount as int + + + + public override def ToString() as string: + return string.Format('DriverID: {0}\nFunctionCount: {1}\n', DriverID, FunctionCount) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Size: 512)] +public struct KUSB_DRIVER_API: + + public Info as KUSB_DRIVER_API_INFO + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Init as KUSB_InitDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Free as KUSB_FreeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public ClaimInterface as KUSB_ClaimInterfaceDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public ReleaseInterface as KUSB_ReleaseInterfaceDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public SetAltInterface as KUSB_SetAltInterfaceDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetAltInterface as KUSB_GetAltInterfaceDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetDescriptor as KUSB_GetDescriptorDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public ControlTransfer as KUSB_ControlTransferDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public SetPowerPolicy as KUSB_SetPowerPolicyDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetPowerPolicy as KUSB_GetPowerPolicyDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public SetConfiguration as KUSB_SetConfigurationDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetConfiguration as KUSB_GetConfigurationDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public ResetDevice as KUSB_ResetDeviceDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Initialize as KUSB_InitializeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public SelectInterface as KUSB_SelectInterfaceDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetAssociatedInterface as KUSB_GetAssociatedInterfaceDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Clone as KUSB_CloneDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public QueryInterfaceSettings as KUSB_QueryInterfaceSettingsDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public QueryDeviceInformation as KUSB_QueryDeviceInformationDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public SetCurrentAlternateSetting as KUSB_SetCurrentAlternateSettingDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetCurrentAlternateSetting as KUSB_GetCurrentAlternateSettingDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public QueryPipe as KUSB_QueryPipeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public SetPipePolicy as KUSB_SetPipePolicyDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetPipePolicy as KUSB_GetPipePolicyDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public ReadPipe as KUSB_ReadPipeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public WritePipe as KUSB_WritePipeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public ResetPipe as KUSB_ResetPipeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public AbortPipe as KUSB_AbortPipeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public FlushPipe as KUSB_FlushPipeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public IsoReadPipe as KUSB_IsoReadPipeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public IsoWritePipe as KUSB_IsoWritePipeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetCurrentFrameNumber as KUSB_GetCurrentFrameNumberDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetOverlappedResult as KUSB_GetOverlappedResultDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetProperty as KUSB_GetPropertyDelegate + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Size: 2048)] +public struct KHOT_PARAMS: + + public UserHwnd as IntPtr + + + public UserMessage as int + + + public Flags as KHOT_FLAG + + + public PatternMatch as KLST_PATTERN_MATCH + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public OnHotPlug as KHOT_PLUG_CB + + + + public override def ToString() as string: + return string.Format('UserHwnd: {0}\nUserMessage: {1}\nFlags: {2}\n', (UserHwnd.ToString('X16') + 'h'), (UserMessage.ToString('X8') + 'h'), Flags.ToString()) + + +[StructLayout(LayoutKind.Sequential)] +public struct KSTM_XFER_CONTEXT: + + private final mHandlePtr as IntPtr + + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + public Pointer as IntPtr: + get: + return mHandlePtr + + + [StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi)] + private struct KSTM_XFER_CONTEXT_MAP: + + private final Buffer as IntPtr + + + private final BufferSize as int + + + private final TransferLength as int + + + private final UserState as IntPtr + + + private static final ofsBuffer as int = Marshal.OffsetOf(typeof(KSTM_XFER_CONTEXT_MAP), 'Buffer').ToInt32() + + private static final ofsBufferSize as int = Marshal.OffsetOf(typeof(KSTM_XFER_CONTEXT_MAP), 'BufferSize').ToInt32() + + private static final ofsTransferLength as int = Marshal.OffsetOf(typeof(KSTM_XFER_CONTEXT_MAP), 'TransferLength').ToInt32() + + private static final ofsUserState as int = Marshal.OffsetOf(typeof(KSTM_XFER_CONTEXT_MAP), 'UserState').ToInt32() + + + + public Buffer as IntPtr: + get: + return Marshal.ReadIntPtr(mHandlePtr, ofsBuffer) + + + + public BufferSize as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsBufferSize) + + + + public TransferLength as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsTransferLength) + + + + public UserState as IntPtr: + get: + return Marshal.ReadIntPtr(mHandlePtr, ofsUserState) + set: + Marshal.WriteIntPtr(mHandlePtr, ofsUserState, value) + + + + public override def ToString() as string: + return string.Format('Buffer: {0}\nBufferSize: {1}\nTransferLength: {2}\nUserState: {3}\n', (Buffer.ToString('X16') + 'h'), BufferSize, TransferLength, (UserState.ToString('X16') + 'h')) + + +[StructLayout(LayoutKind.Sequential)] +public struct KSTM_INFO: + + private final mHandlePtr as IntPtr + + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + public Pointer as IntPtr: + get: + return mHandlePtr + + + [StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi)] + private struct KSTM_INFO_MAP: + + private final UsbHandle as IntPtr + + + private final PipeID as byte + + + private final MaxPendingTransfers as int + + + private final MaxTransferSize as int + + + private final MaxPendingIO as int + + + private final EndpointDescriptor as USB_ENDPOINT_DESCRIPTOR + + + private final DriverAPI as KUSB_DRIVER_API + + + private final DeviceHandle as IntPtr + + + private final StreamHandle as IntPtr + + + private final UserState as IntPtr + + + private static final ofsUsbHandle as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'UsbHandle').ToInt32() + + private static final ofsPipeID as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'PipeID').ToInt32() + + private static final ofsMaxPendingTransfers as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'MaxPendingTransfers').ToInt32() + + private static final ofsMaxTransferSize as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'MaxTransferSize').ToInt32() + + private static final ofsMaxPendingIO as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'MaxPendingIO').ToInt32() + + private static final ofsEndpointDescriptor as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'EndpointDescriptor').ToInt32() + + private static final ofsDriverAPI as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'DriverAPI').ToInt32() + + private static final ofsDeviceHandle as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'DeviceHandle').ToInt32() + + private static final ofsStreamHandle as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'StreamHandle').ToInt32() + + private static final ofsUserState as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'UserState').ToInt32() + + + + public UsbHandle as IntPtr: + get: + return Marshal.ReadIntPtr(mHandlePtr, ofsUsbHandle) + + + + public PipeID as byte: + get: + return Marshal.ReadByte(mHandlePtr, ofsPipeID) + + + + public MaxPendingTransfers as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsMaxPendingTransfers) + + + + public MaxTransferSize as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsMaxTransferSize) + + + + public MaxPendingIO as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsMaxPendingIO) + + + + public EndpointDescriptor as USB_ENDPOINT_DESCRIPTOR: + get: + return (Marshal.PtrToStructure(IntPtr((mHandlePtr.ToInt64() + ofsEndpointDescriptor)), typeof(USB_ENDPOINT_DESCRIPTOR)) cast USB_ENDPOINT_DESCRIPTOR) + + + + public DriverAPI as KUSB_DRIVER_API: + get: + return (Marshal.PtrToStructure(IntPtr((mHandlePtr.ToInt64() + ofsDriverAPI)), typeof(KUSB_DRIVER_API)) cast KUSB_DRIVER_API) + + + + public DeviceHandle as IntPtr: + get: + return Marshal.ReadIntPtr(mHandlePtr, ofsDeviceHandle) + + + + public StreamHandle as IntPtr: + get: + return Marshal.ReadIntPtr(mHandlePtr, ofsStreamHandle) + + + + public UserState as IntPtr: + get: + return Marshal.ReadIntPtr(mHandlePtr, ofsUserState) + set: + Marshal.WriteIntPtr(mHandlePtr, ofsUserState, value) + + + + public override def ToString() as string: + return string.Format('UsbHandle: {0}\nPipeID: {1}\nMaxPendingTransfers: {2}\nMaxTransferSize: {3}\nMaxPendingIO: {4}\nDeviceHandle: {5}\nStreamHandle: {6}\nUserState: {7}\n', (UsbHandle.ToString('X16') + 'h'), (PipeID.ToString('X2') + 'h'), MaxPendingTransfers, MaxTransferSize, MaxPendingIO, (DeviceHandle.ToString('X16') + 'h'), (StreamHandle.ToString('X16') + 'h'), (UserState.ToString('X16') + 'h')) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Size: 64)] +public struct KSTM_CALLBACK: + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Error as KSTM_ERROR_CB + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Submit as KSTM_SUBMIT_CB + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Complete as KSTM_COMPLETE_CB + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Started as KSTM_STARTED_CB + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Stopped as KSTM_STOPPED_CB + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public BeforeComplete as KSTM_BEFORE_COMPLETE_CB + + +#endregion + +#region Delegates + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KLIB_HANDLE_CLEANUP_CB([In] Handle as IntPtr, HandleType as KLIB_HANDLE_TYPE, UserContext as IntPtr) as int + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KISO_ENUM_PACKETS_CB(PacketIndex as int, [In] ref IsoPacket as KISO_PACKET, UserState as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KLST_ENUM_DEVINFO_CB([In] DeviceList as KLST_HANDLE, [In] DeviceInfo as KLST_DEVINFO_HANDLE, Context as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_InitDelegate([Out] ref InterfaceHandle as KUSB_HANDLE, [In] DevInfo as KLST_DEVINFO_HANDLE) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_FreeDelegate([In] InterfaceHandle as KUSB_HANDLE) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_ClaimInterfaceDelegate([In] InterfaceHandle as KUSB_HANDLE, NumberOrIndex as byte, IsIndex as bool) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_ReleaseInterfaceDelegate([In] InterfaceHandle as KUSB_HANDLE, NumberOrIndex as byte, IsIndex as bool) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_SetAltInterfaceDelegate([In] InterfaceHandle as KUSB_HANDLE, NumberOrIndex as byte, IsIndex as bool, AltSettingNumber as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetAltInterfaceDelegate([In] InterfaceHandle as KUSB_HANDLE, NumberOrIndex as byte, IsIndex as bool, ref AltSettingNumber as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetDescriptorDelegate([In] InterfaceHandle as KUSB_HANDLE, DescriptorType as byte, Index as byte, LanguageID as ushort, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_ControlTransferDelegate([In] InterfaceHandle as KUSB_HANDLE, SetupPacket as WINUSB_SETUP_PACKET, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_SetPowerPolicyDelegate([In] InterfaceHandle as KUSB_HANDLE, PolicyType as int, ValueLength as int, Value as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetPowerPolicyDelegate([In] InterfaceHandle as KUSB_HANDLE, PolicyType as int, ref ValueLength as int, Value as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_SetConfigurationDelegate([In] InterfaceHandle as KUSB_HANDLE, ConfigurationNumber as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetConfigurationDelegate([In] InterfaceHandle as KUSB_HANDLE, ref ConfigurationNumber as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_ResetDeviceDelegate([In] InterfaceHandle as KUSB_HANDLE) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_InitializeDelegate(DeviceHandle as IntPtr, [Out] ref InterfaceHandle as KUSB_HANDLE) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_SelectInterfaceDelegate([In] InterfaceHandle as KUSB_HANDLE, NumberOrIndex as byte, IsIndex as bool) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetAssociatedInterfaceDelegate([In] InterfaceHandle as KUSB_HANDLE, AssociatedInterfaceIndex as byte, [Out] ref AssociatedInterfaceHandle as KUSB_HANDLE) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_CloneDelegate([In] InterfaceHandle as KUSB_HANDLE, [Out] ref DstInterfaceHandle as KUSB_HANDLE) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_QueryInterfaceSettingsDelegate([In] InterfaceHandle as KUSB_HANDLE, AltSettingIndex as byte, [Out] ref UsbAltInterfaceDescriptor as USB_INTERFACE_DESCRIPTOR) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_QueryDeviceInformationDelegate([In] InterfaceHandle as KUSB_HANDLE, InformationType as int, ref BufferLength as int, Buffer as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_SetCurrentAlternateSettingDelegate([In] InterfaceHandle as KUSB_HANDLE, AltSettingNumber as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetCurrentAlternateSettingDelegate([In] InterfaceHandle as KUSB_HANDLE, ref AltSettingNumber as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_QueryPipeDelegate([In] InterfaceHandle as KUSB_HANDLE, AltSettingNumber as byte, PipeIndex as byte, [Out] ref PipeInformation as WINUSB_PIPE_INFORMATION) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_SetPipePolicyDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte, PolicyType as int, ValueLength as int, Value as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetPipePolicyDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte, PolicyType as int, ref ValueLength as int, Value as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_ReadPipeDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_WritePipeDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_ResetPipeDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_AbortPipeDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_FlushPipeDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_IsoReadPipeDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte, Buffer as IntPtr, BufferLength as int, Overlapped as IntPtr, [In] IsoContext as KISO_CONTEXT) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_IsoWritePipeDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte, Buffer as IntPtr, BufferLength as int, Overlapped as IntPtr, [In] IsoContext as KISO_CONTEXT) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetCurrentFrameNumberDelegate([In] InterfaceHandle as KUSB_HANDLE, ref FrameNumber as int) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetOverlappedResultDelegate([In] InterfaceHandle as KUSB_HANDLE, Overlapped as IntPtr, ref lpNumberOfBytesTransferred as int, bWait as bool) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetPropertyDelegate([In] InterfaceHandle as KUSB_HANDLE, PropertyType as KUSB_PROPERTY, ref PropertySize as int, Value as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KHOT_PLUG_CB([In] HotHandle as KHOT_HANDLE, [In] DeviceInfo as KLST_DEVINFO_HANDLE, PlugType as KLST_SYNC_FLAG) as void + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KSTM_ERROR_CB([In] StreamInfo as KSTM_INFO, [In] XferContext as KSTM_XFER_CONTEXT, XferContextIndex as int, ErrorCode as int) as int + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KSTM_SUBMIT_CB([In] StreamInfo as KSTM_INFO, [In] XferContext as KSTM_XFER_CONTEXT, XferContextIndex as int, Overlapped as IntPtr) as int + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KSTM_STARTED_CB([In] StreamInfo as KSTM_INFO, [In] XferContext as KSTM_XFER_CONTEXT, XferContextIndex as int) as int + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KSTM_STOPPED_CB([In] StreamInfo as KSTM_INFO, [In] XferContext as KSTM_XFER_CONTEXT, XferContextIndex as int) as int + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KSTM_COMPLETE_CB([In] StreamInfo as KSTM_INFO, [In] XferContext as KSTM_XFER_CONTEXT, XferContextIndex as int, ErrorCode as int) as int + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KSTM_BEFORE_COMPLETE_CB([In] StreamInfo as KSTM_INFO, [In] XferContext as KSTM_XFER_CONTEXT, XferContextIndex as int, ref ErrorCode as int) as KSTM_COMPLETE_RESULT + +#endregion + +public class LstK(IDisposable): + + protected mHandleStruct as KLST_HANDLE + + protected mbDisposed as bool + + + protected def constructor(): + pass + + + #region IDisposable Members + + public virtual def Dispose(): + Dispose(true) + GC.SuppressFinalize(self) + + + #endregion + + def destructor(): + Dispose(false) + + + protected virtual def Dispose(disposing as bool): + if not mbDisposed: + if mHandleStruct.Pointer != IntPtr.Zero: + AllKFunctions.LstK_Free(mHandleStruct) + Debug.Print('{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}', GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing) + else: + Debug.Print('{0} Dispose: [WARNING] Handle is null', GetType().Name) + + mHandleStruct = KLST_HANDLE(IntPtr.Zero) + mbDisposed = true + + + protected def Init(Flags as KLST_FLAG) as bool: + success as bool = AllKFunctions.LstK_Init(mHandleStruct, Flags) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + return true + + + protected def InitEx(Flags as KLST_FLAG, ref PatternMatch as KLST_PATTERN_MATCH) as bool: + success as bool = AllKFunctions.LstK_InitEx(mHandleStruct, Flags, PatternMatch) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + return true + + + #region Public Members + + public def constructor(Flags as KLST_FLAG): + success as bool = AllKFunctions.LstK_Init(mHandleStruct, Flags) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + + + public def constructor(Flags as KLST_FLAG, ref PatternMatch as KLST_PATTERN_MATCH): + success as bool = AllKFunctions.LstK_InitEx(mHandleStruct, Flags, PatternMatch) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + + + public virtual def Count(ref Count as int) as bool: + return AllKFunctions.LstK_Count(mHandleStruct, Count) + + + public virtual def Current(ref DeviceInfo as KLST_DEVINFO_HANDLE) as bool: + return AllKFunctions.LstK_Current(mHandleStruct, DeviceInfo) + + + public virtual def Enumerate(EnumDevListCB as KLST_ENUM_DEVINFO_CB, Context as IntPtr) as bool: + return AllKFunctions.LstK_Enumerate(mHandleStruct, EnumDevListCB, Context) + + + public virtual def FindByVidPid(Vid as int, Pid as int, ref DeviceInfo as KLST_DEVINFO_HANDLE) as bool: + return AllKFunctions.LstK_FindByVidPid(mHandleStruct, Vid, Pid, DeviceInfo) + + + public virtual def Free(): + Dispose() + + + public Handle as KLST_HANDLE: + get: + return mHandleStruct + + + public virtual def MoveNext(ref DeviceInfo as KLST_DEVINFO_HANDLE) as bool: + return AllKFunctions.LstK_MoveNext(mHandleStruct, DeviceInfo) + + + public virtual def MoveReset(): + AllKFunctions.LstK_MoveReset(mHandleStruct) + + #endregion + + +public class HotK(IDisposable): + + protected mHandleStruct as KHOT_HANDLE + + protected mbDisposed as bool + + + protected def constructor(): + pass + + + #region IDisposable Members + + public virtual def Dispose(): + Dispose(true) + GC.SuppressFinalize(self) + + + #endregion + + def destructor(): + Dispose(false) + + + protected virtual def Dispose(disposing as bool): + if not mbDisposed: + if mHandleStruct.Pointer != IntPtr.Zero: + AllKFunctions.HotK_Free(mHandleStruct) + Debug.Print('{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}', GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing) + else: + Debug.Print('{0} Dispose: [WARNING] Handle is null', GetType().Name) + + mHandleStruct = KHOT_HANDLE(IntPtr.Zero) + mbDisposed = true + + + protected def Init(ref InitParams as KHOT_PARAMS) as bool: + success as bool = AllKFunctions.HotK_Init(mHandleStruct, InitParams) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + return true + + + #region Public Members + + public def constructor(ref InitParams as KHOT_PARAMS): + success as bool = AllKFunctions.HotK_Init(mHandleStruct, InitParams) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + + + public virtual def Free(): + Dispose() + + + public virtual def FreeAll(): + AllKFunctions.HotK_FreeAll() + + + public Handle as KHOT_HANDLE: + get: + return mHandleStruct + + #endregion + + +public class UsbK(IDisposable): + + protected driverAPI as KUSB_DRIVER_API + + protected mHandleStruct as KUSB_HANDLE + + protected mbDisposed as bool + + + protected def constructor(): + pass + + + #region IDisposable Members + + public virtual def Dispose(): + Dispose(true) + GC.SuppressFinalize(self) + + + #endregion + + def destructor(): + Dispose(false) + + + protected virtual def Dispose(disposing as bool): + if not mbDisposed: + if mHandleStruct.Pointer != IntPtr.Zero: + AllKFunctions.UsbK_Free(mHandleStruct) + Debug.Print('{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}', GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing) + else: + Debug.Print('{0} Dispose: [WARNING] Handle is null', GetType().Name) + + mHandleStruct = KUSB_HANDLE(IntPtr.Zero) + mbDisposed = true + + + protected def Init(DevInfo as KLST_DEVINFO_HANDLE) as bool: + success as bool = AllKFunctions.LibK_LoadDriverAPI(driverAPI, DevInfo.DriverID) + + if not success: + raise Exception(string.Format('{0} failed loading Driver API. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + success = driverAPI.Init(mHandleStruct, DevInfo) + + if not success: + raise Exception(string.Format('{0} failed initializing usb device. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + return true + + + protected def Initialize(DeviceHandle as IntPtr, driverID as KUSB_DRVID) as bool: + success as bool = AllKFunctions.LibK_LoadDriverAPI(driverAPI, (driverID cast int)) + + if not success: + raise Exception(string.Format('{0} failed loading Driver API. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + success = driverAPI.Initialize(DeviceHandle, mHandleStruct) + + if not success: + raise Exception(string.Format('{0} failed initializing usb device. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + return true + + + #region Public Members + + public def constructor(DevInfo as KLST_DEVINFO_HANDLE): + success as bool = AllKFunctions.LibK_LoadDriverAPI(driverAPI, DevInfo.DriverID) + + if not success: + raise Exception(string.Format('{0} failed loading Driver API. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + success = driverAPI.Init(mHandleStruct, DevInfo) + + if not success: + raise Exception(string.Format('{0} failed initializing usb device. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + + + public def constructor(DeviceHandle as IntPtr, driverID as KUSB_DRVID): + success as bool = AllKFunctions.LibK_LoadDriverAPI(driverAPI, (driverID cast int)) + + if not success: + raise Exception(string.Format('{0} failed loading Driver API. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + success = driverAPI.Initialize(DeviceHandle, mHandleStruct) + + if not success: + raise Exception(string.Format('{0} failed initializing usb device. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + + + public virtual def AbortPipe(PipeID as byte) as bool: + return driverAPI.AbortPipe(mHandleStruct, PipeID) + + + public virtual def ClaimInterface(NumberOrIndex as byte, IsIndex as bool) as bool: + return driverAPI.ClaimInterface(mHandleStruct, NumberOrIndex, IsIndex) + + + public virtual def Clone(ref DstInterfaceHandle as KUSB_HANDLE) as bool: + return driverAPI.Clone(mHandleStruct, DstInterfaceHandle) + + + public virtual def ControlTransfer(SetupPacket as WINUSB_SETUP_PACKET, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool: + return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Buffer, BufferLength, LengthTransferred, Overlapped) + + + public virtual def ControlTransfer(SetupPacket as WINUSB_SETUP_PACKET, Buffer as Array, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool: + return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped) + + + public virtual def ControlTransfer(SetupPacket as WINUSB_SETUP_PACKET, Buffer as Array, BufferLength as int, ref LengthTransferred as int, Overlapped as KOVL_HANDLE) as bool: + return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped.Pointer) + + + public virtual def ControlTransfer(SetupPacket as WINUSB_SETUP_PACKET, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as KOVL_HANDLE) as bool: + return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Buffer, BufferLength, LengthTransferred, Overlapped.Pointer) + + + public virtual def FlushPipe(PipeID as byte) as bool: + return driverAPI.FlushPipe(mHandleStruct, PipeID) + + + public virtual def Free(): + Dispose() + + + public virtual def GetAltInterface(NumberOrIndex as byte, IsIndex as bool, ref AltSettingNumber as byte) as bool: + return driverAPI.GetAltInterface(mHandleStruct, NumberOrIndex, IsIndex, AltSettingNumber) + + + public virtual def GetAssociatedInterface(AssociatedInterfaceIndex as byte, ref AssociatedInterfaceHandle as KUSB_HANDLE) as bool: + return driverAPI.GetAssociatedInterface(mHandleStruct, AssociatedInterfaceIndex, AssociatedInterfaceHandle) + + + public virtual def GetConfiguration(ref ConfigurationNumber as byte) as bool: + return driverAPI.GetConfiguration(mHandleStruct, ConfigurationNumber) + + + public virtual def GetCurrentAlternateSetting(ref AltSettingNumber as byte) as bool: + return driverAPI.GetCurrentAlternateSetting(mHandleStruct, AltSettingNumber) + + + public virtual def GetCurrentFrameNumber(ref FrameNumber as int) as bool: + return driverAPI.GetCurrentFrameNumber(mHandleStruct, FrameNumber) + + + public virtual def GetDescriptor(DescriptorType as byte, Index as byte, LanguageID as int, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int) as bool: + return driverAPI.GetDescriptor(mHandleStruct, DescriptorType, Index, (LanguageID cast ushort), Buffer, BufferLength, LengthTransferred) + + + public virtual def GetDescriptor(DescriptorType as byte, Index as byte, LanguageID as int, Buffer as Array, BufferLength as int, ref LengthTransferred as int) as bool: + return driverAPI.GetDescriptor(mHandleStruct, DescriptorType, Index, (LanguageID cast ushort), Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred) + + + public virtual def GetOverlappedResult(Overlapped as IntPtr, ref lpNumberOfBytesTransferred as int, bWait as bool) as bool: + return driverAPI.GetOverlappedResult(mHandleStruct, Overlapped, lpNumberOfBytesTransferred, bWait) + + + public virtual def GetOverlappedResult(Overlapped as KOVL_HANDLE, ref lpNumberOfBytesTransferred as int, bWait as bool) as bool: + return driverAPI.GetOverlappedResult(mHandleStruct, Overlapped.Pointer, lpNumberOfBytesTransferred, bWait) + + + public virtual def GetPipePolicy(PipeID as byte, PolicyType as int, ref ValueLength as int, Value as IntPtr) as bool: + return driverAPI.GetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Value) + + + public virtual def GetPipePolicy(PipeID as byte, PolicyType as int, ref ValueLength as int, Value as Array) as bool: + return driverAPI.GetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + + + public virtual def GetPowerPolicy(PolicyType as int, ref ValueLength as int, Value as IntPtr) as bool: + return driverAPI.GetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Value) + + + public virtual def GetPowerPolicy(PolicyType as int, ref ValueLength as int, Value as Array) as bool: + return driverAPI.GetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + + + public virtual def GetProperty(PropertyType as KUSB_PROPERTY, ref PropertySize as int, Value as IntPtr) as bool: + return driverAPI.GetProperty(mHandleStruct, PropertyType, PropertySize, Value) + + + public virtual def GetProperty(PropertyType as KUSB_PROPERTY, ref PropertySize as int, Value as Array) as bool: + return driverAPI.GetProperty(mHandleStruct, PropertyType, PropertySize, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + + + public Handle as KUSB_HANDLE: + get: + return mHandleStruct + + + public virtual def IsoReadPipe(PipeID as byte, Buffer as IntPtr, BufferLength as int, Overlapped as IntPtr, IsoContext as KISO_CONTEXT) as bool: + return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped, IsoContext) + + + public virtual def IsoReadPipe(PipeID as byte, Buffer as Array, BufferLength as int, Overlapped as IntPtr, IsoContext as KISO_CONTEXT) as bool: + return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped, IsoContext) + + + public virtual def IsoReadPipe(PipeID as byte, Buffer as Array, BufferLength as int, Overlapped as KOVL_HANDLE, IsoContext as KISO_CONTEXT) as bool: + return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped.Pointer, IsoContext) + + + public virtual def IsoReadPipe(PipeID as byte, Buffer as IntPtr, BufferLength as int, Overlapped as KOVL_HANDLE, IsoContext as KISO_CONTEXT) as bool: + return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped.Pointer, IsoContext) + + + public virtual def IsoWritePipe(PipeID as byte, Buffer as IntPtr, BufferLength as int, Overlapped as IntPtr, IsoContext as KISO_CONTEXT) as bool: + return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped, IsoContext) + + + public virtual def IsoWritePipe(PipeID as byte, Buffer as Array, BufferLength as int, Overlapped as IntPtr, IsoContext as KISO_CONTEXT) as bool: + return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped, IsoContext) + + + public virtual def IsoWritePipe(PipeID as byte, Buffer as Array, BufferLength as int, Overlapped as KOVL_HANDLE, IsoContext as KISO_CONTEXT) as bool: + return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped.Pointer, IsoContext) + + + public virtual def IsoWritePipe(PipeID as byte, Buffer as IntPtr, BufferLength as int, Overlapped as KOVL_HANDLE, IsoContext as KISO_CONTEXT) as bool: + return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped.Pointer, IsoContext) + + + public virtual def QueryDeviceInformation(InformationType as int, ref BufferLength as int, Buffer as IntPtr) as bool: + return driverAPI.QueryDeviceInformation(mHandleStruct, InformationType, BufferLength, Buffer) + + + public virtual def QueryInterfaceSettings(AltSettingIndex as byte, ref UsbAltInterfaceDescriptor as USB_INTERFACE_DESCRIPTOR) as bool: + return driverAPI.QueryInterfaceSettings(mHandleStruct, AltSettingIndex, UsbAltInterfaceDescriptor) + + + public virtual def QueryPipe(AltSettingNumber as byte, PipeIndex as byte, ref PipeInformation as WINUSB_PIPE_INFORMATION) as bool: + return driverAPI.QueryPipe(mHandleStruct, AltSettingNumber, PipeIndex, PipeInformation) + + + public virtual def ReadPipe(PipeID as byte, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool: + return driverAPI.ReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped) + + + public virtual def ReadPipe(PipeID as byte, Buffer as Array, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool: + return driverAPI.ReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped) + + + public virtual def ReadPipe(PipeID as byte, Buffer as Array, BufferLength as int, ref LengthTransferred as int, Overlapped as KOVL_HANDLE) as bool: + return driverAPI.ReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped.Pointer) + + + public virtual def ReadPipe(PipeID as byte, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as KOVL_HANDLE) as bool: + return driverAPI.ReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped.Pointer) + + + public virtual def ReleaseInterface(NumberOrIndex as byte, IsIndex as bool) as bool: + return driverAPI.ReleaseInterface(mHandleStruct, NumberOrIndex, IsIndex) + + + public virtual def ResetDevice() as bool: + return driverAPI.ResetDevice(mHandleStruct) + + + public virtual def ResetPipe(PipeID as byte) as bool: + return driverAPI.ResetPipe(mHandleStruct, PipeID) + + + public virtual def SelectInterface(NumberOrIndex as byte, IsIndex as bool) as bool: + return driverAPI.SelectInterface(mHandleStruct, NumberOrIndex, IsIndex) + + + public virtual def SetAltInterface(NumberOrIndex as byte, IsIndex as bool, AltSettingNumber as byte) as bool: + return driverAPI.SetAltInterface(mHandleStruct, NumberOrIndex, IsIndex, AltSettingNumber) + + + public virtual def SetConfiguration(ConfigurationNumber as byte) as bool: + return driverAPI.SetConfiguration(mHandleStruct, ConfigurationNumber) + + + public virtual def SetCurrentAlternateSetting(AltSettingNumber as byte) as bool: + return driverAPI.SetCurrentAlternateSetting(mHandleStruct, AltSettingNumber) + + + public virtual def SetPipePolicy(PipeID as byte, PolicyType as int, ValueLength as int, Value as IntPtr) as bool: + return driverAPI.SetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Value) + + + public virtual def SetPipePolicy(PipeID as byte, PolicyType as int, ValueLength as int, Value as Array) as bool: + return driverAPI.SetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + + + public virtual def SetPowerPolicy(PolicyType as int, ValueLength as int, Value as IntPtr) as bool: + return driverAPI.SetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Value) + + + public virtual def SetPowerPolicy(PolicyType as int, ValueLength as int, Value as Array) as bool: + return driverAPI.SetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + + + public virtual def WritePipe(PipeID as byte, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool: + return driverAPI.WritePipe(mHandleStruct, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped) + + + public virtual def WritePipe(PipeID as byte, Buffer as Array, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool: + return driverAPI.WritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped) + + + public virtual def WritePipe(PipeID as byte, Buffer as Array, BufferLength as int, ref LengthTransferred as int, Overlapped as KOVL_HANDLE) as bool: + return driverAPI.WritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped.Pointer) + + + public virtual def WritePipe(PipeID as byte, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as KOVL_HANDLE) as bool: + return driverAPI.WritePipe(mHandleStruct, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped.Pointer) + + #endregion + + +public class OvlK(IDisposable): + + protected mHandleStruct as KOVL_POOL_HANDLE + + protected mbDisposed as bool + + + protected def constructor(): + pass + + + #region IDisposable Members + + public virtual def Dispose(): + Dispose(true) + GC.SuppressFinalize(self) + + + #endregion + + def destructor(): + Dispose(false) + + + protected virtual def Dispose(disposing as bool): + if not mbDisposed: + if mHandleStruct.Pointer != IntPtr.Zero: + AllKFunctions.OvlK_Free(mHandleStruct) + Debug.Print('{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}', GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing) + else: + Debug.Print('{0} Dispose: [WARNING] Handle is null', GetType().Name) + + mHandleStruct = KOVL_POOL_HANDLE(IntPtr.Zero) + mbDisposed = true + + + protected def Init(UsbHandle as KUSB_HANDLE, MaxOverlappedCount as int, Flags as KOVL_POOL_FLAG) as bool: + success as bool = AllKFunctions.OvlK_Init(mHandleStruct, UsbHandle, MaxOverlappedCount, Flags) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + return true + + + #region Public Members + + public def constructor(UsbHandle as KUSB_HANDLE, MaxOverlappedCount as int, Flags as KOVL_POOL_FLAG): + success as bool = AllKFunctions.OvlK_Init(mHandleStruct, UsbHandle, MaxOverlappedCount, Flags) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + + + public virtual def Acquire(ref OverlappedK as KOVL_HANDLE) as bool: + return AllKFunctions.OvlK_Acquire(OverlappedK, mHandleStruct) + + + public virtual def Free(): + Dispose() + + + public virtual def GetEventHandle(OverlappedK as KOVL_HANDLE) as IntPtr: + return AllKFunctions.OvlK_GetEventHandle(OverlappedK) + + + public Handle as KOVL_POOL_HANDLE: + get: + return mHandleStruct + + + public virtual def IsComplete(OverlappedK as KOVL_HANDLE) as bool: + return AllKFunctions.OvlK_IsComplete(OverlappedK) + + + public virtual def ReUse(OverlappedK as KOVL_HANDLE) as bool: + return AllKFunctions.OvlK_ReUse(OverlappedK) + + + public virtual def Release(OverlappedK as KOVL_HANDLE) as bool: + return AllKFunctions.OvlK_Release(OverlappedK) + + + public virtual def Wait(OverlappedK as KOVL_HANDLE, TimeoutMS as int, WaitFlags as KOVL_WAIT_FLAG, ref TransferredLength as int) as bool: + return AllKFunctions.OvlK_Wait(OverlappedK, TimeoutMS, WaitFlags, TransferredLength) + + + public virtual def WaitAndRelease(OverlappedK as KOVL_HANDLE, TimeoutMS as int, ref TransferredLength as int) as bool: + return AllKFunctions.OvlK_WaitAndRelease(OverlappedK, TimeoutMS, TransferredLength) + + + public virtual def WaitOldest(ref OverlappedK as KOVL_HANDLE, TimeoutMS as int, WaitFlags as KOVL_WAIT_FLAG, ref TransferredLength as int) as bool: + return AllKFunctions.OvlK_WaitOldest(mHandleStruct, OverlappedK, TimeoutMS, WaitFlags, TransferredLength) + + + public virtual def WaitOrCancel(OverlappedK as KOVL_HANDLE, TimeoutMS as int, ref TransferredLength as int) as bool: + return AllKFunctions.OvlK_WaitOrCancel(OverlappedK, TimeoutMS, TransferredLength) + + #endregion + + +public class StmK(IDisposable): + + protected mHandleStruct as KSTM_HANDLE + + protected mbDisposed as bool + + + protected def constructor(): + pass + + + #region IDisposable Members + + public virtual def Dispose(): + Dispose(true) + GC.SuppressFinalize(self) + + + #endregion + + def destructor(): + Dispose(false) + + + protected virtual def Dispose(disposing as bool): + if not mbDisposed: + if mHandleStruct.Pointer != IntPtr.Zero: + AllKFunctions.StmK_Free(mHandleStruct) + Debug.Print('{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}', GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing) + else: + Debug.Print('{0} Dispose: [WARNING] Handle is null', GetType().Name) + + mHandleStruct = KSTM_HANDLE(IntPtr.Zero) + mbDisposed = true + + + protected def Init(UsbHandle as KUSB_HANDLE, PipeID as byte, MaxTransferSize as int, MaxPendingTransfers as int, MaxPendingIO as int, ref Callbacks as KSTM_CALLBACK, Flags as KSTM_FLAG) as bool: + success as bool = AllKFunctions.StmK_Init(mHandleStruct, UsbHandle, PipeID, MaxTransferSize, MaxPendingTransfers, MaxPendingIO, Callbacks, Flags) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + return true + + + #region Public Members + + public def constructor(UsbHandle as KUSB_HANDLE, PipeID as byte, MaxTransferSize as int, MaxPendingTransfers as int, MaxPendingIO as int, ref Callbacks as KSTM_CALLBACK, Flags as KSTM_FLAG): + success as bool = AllKFunctions.StmK_Init(mHandleStruct, UsbHandle, PipeID, MaxTransferSize, MaxPendingTransfers, MaxPendingIO, Callbacks, Flags) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + + + public virtual def Free(): + Dispose() + + + public Handle as KSTM_HANDLE: + get: + return mHandleStruct + + + public virtual def Read(Buffer as IntPtr, Offset as int, Length as int, ref TransferredLength as int) as bool: + return AllKFunctions.StmK_Read(mHandleStruct, Buffer, Offset, Length, TransferredLength) + + + public virtual def Read(Buffer as Array, Offset as int, Length as int, ref TransferredLength as int) as bool: + return AllKFunctions.StmK_Read(mHandleStruct, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), Offset, Length, TransferredLength) + + + public virtual def Start() as bool: + return AllKFunctions.StmK_Start(mHandleStruct) + + + public virtual def Stop(TimeoutCancelMS as int) as bool: + return AllKFunctions.StmK_Stop(mHandleStruct, TimeoutCancelMS) + + + public virtual def Write(Buffer as IntPtr, Offset as int, Length as int, ref TransferredLength as int) as bool: + return AllKFunctions.StmK_Write(mHandleStruct, Buffer, Offset, Length, TransferredLength) + + + public virtual def Write(Buffer as Array, Offset as int, Length as int, ref TransferredLength as int) as bool: + return AllKFunctions.StmK_Write(mHandleStruct, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), Offset, Length, TransferredLength) + + #endregion + + +public class IsoK(IDisposable): + + protected mHandleStruct as KISO_CONTEXT + + protected mbDisposed as bool + + + protected def constructor(): + pass + + + #region IDisposable Members + + public virtual def Dispose(): + Dispose(true) + GC.SuppressFinalize(self) + + + #endregion + + def destructor(): + Dispose(false) + + + protected virtual def Dispose(disposing as bool): + if not mbDisposed: + if mHandleStruct.Pointer != IntPtr.Zero: + AllKFunctions.IsoK_Free(mHandleStruct) + Debug.Print('{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}', GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing) + else: + Debug.Print('{0} Dispose: [WARNING] Handle is null', GetType().Name) + + mHandleStruct = KISO_CONTEXT(IntPtr.Zero) + mbDisposed = true + + + protected def Init(NumberOfPackets as int, StartFrame as int) as bool: + success as bool = AllKFunctions.IsoK_Init(mHandleStruct, NumberOfPackets, StartFrame) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + return true + + + #region Nested Structs + + [StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] + private struct KISO_CONTEXT_MAP: + + private final Flags as KISO_FLAG + + + private final StartFrame as int + + + private final ErrorCount as short + + + private final NumberOfPackets as short + + + private final UrbHdrStatus as int + + + #endregion + + #region Public Members + + public def constructor(NumberOfPackets as int, StartFrame as int): + success as bool = AllKFunctions.IsoK_Init(mHandleStruct, NumberOfPackets, StartFrame) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + + + public virtual def EnumPackets(EnumPackets as KISO_ENUM_PACKETS_CB, StartPacketIndex as int, UserState as IntPtr) as bool: + return AllKFunctions.IsoK_EnumPackets(mHandleStruct, EnumPackets, StartPacketIndex, UserState) + + + public ErrorCount as short: + get: + return Marshal.ReadInt16(mHandleStruct.Pointer, ofsErrorCount) + set: + Marshal.WriteInt16(mHandleStruct.Pointer, ofsErrorCount, value) + + + public Flags as KISO_FLAG: + get: + return (Marshal.ReadInt32(mHandleStruct.Pointer, ofsFlags) cast KISO_FLAG) + set: + Marshal.WriteInt32(mHandleStruct.Pointer, ofsFlags, (value cast int)) + + + public virtual def Free(): + Dispose() + + + public virtual def GetPacket(PacketIndex as int, ref IsoPacket as KISO_PACKET) as bool: + return AllKFunctions.IsoK_GetPacket(mHandleStruct, PacketIndex, IsoPacket) + + + public Handle as KISO_CONTEXT: + get: + return mHandleStruct + + + public NumberOfPackets as short: + get: + return Marshal.ReadInt16(mHandleStruct.Pointer, ofsNumberOfPackets) + set: + Marshal.WriteInt16(mHandleStruct.Pointer, ofsNumberOfPackets, value) + + + public virtual def ReUse() as bool: + return AllKFunctions.IsoK_ReUse(mHandleStruct) + + + public virtual def SetPacket(PacketIndex as int, ref IsoPacket as KISO_PACKET) as bool: + return AllKFunctions.IsoK_SetPacket(mHandleStruct, PacketIndex, IsoPacket) + + + public virtual def SetPackets(PacketSize as int) as bool: + return AllKFunctions.IsoK_SetPackets(mHandleStruct, PacketSize) + + + public StartFrame as int: + get: + return Marshal.ReadInt32(mHandleStruct.Pointer, ofsStartFrame) + set: + Marshal.WriteInt32(mHandleStruct.Pointer, ofsStartFrame, value) + + + public UrbHdrStatus as int: + get: + return Marshal.ReadInt32(mHandleStruct.Pointer, ofsUrbHdrStatus) + set: + Marshal.WriteInt32(mHandleStruct.Pointer, ofsUrbHdrStatus, value) + + + #endregion + + #region Private Members + + private static final ofsErrorCount as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'ErrorCount').ToInt32() + + private static final ofsFlags as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'Flags').ToInt32() + + private static final ofsNumberOfPackets as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'NumberOfPackets').ToInt32() + + private static final ofsStartFrame as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'StartFrame').ToInt32() + + private static final ofsUrbHdrStatus as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'UrbHdrStatus').ToInt32() + + #endregion + diff --git a/Old Matlab Interface/.svn/pristine/f4/f4dda42d5cff055dd900dc56988ee4a55c7431e2.svn-base b/Old Matlab Interface/.svn/pristine/f4/f4dda42d5cff055dd900dc56988ee4a55c7431e2.svn-base new file mode 100644 index 00000000..7f2cb1cf Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/f4/f4dda42d5cff055dd900dc56988ee4a55c7431e2.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/f5/f558604348185cbfa01f7a96be6c925909d79515.svn-base b/Old Matlab Interface/.svn/pristine/f5/f558604348185cbfa01f7a96be6c925909d79515.svn-base new file mode 100644 index 00000000..baf03dbe --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/f5/f558604348185cbfa01f7a96be6c925909d79515.svn-base @@ -0,0 +1,52 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {E9566BFF-3BEC-4358-9871-C1700CB73C2B} + Exe + Properties + Hot.Plug.Detect + Hot.Plug.Detect + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + libusbK.cs + + + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/f7/f701f327c83d2ffcf07fb071e5c135e223413720.svn-base b/Old Matlab Interface/.svn/pristine/f7/f701f327c83d2ffcf07fb071e5c135e223413720.svn-base new file mode 100644 index 00000000..8b63a448 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/f7/f701f327c83d2ffcf07fb071e5c135e223413720.svn-base @@ -0,0 +1,67 @@ +//MATLAB INCLUDES +#include +#include + +//LIBUSBK INCLUDES +#include +#include +#include +#include +#include "libusbk.h" + +#define DEBUG_SHOWCTRL 1 +#define ISO_PACKETS_TO_READ 30 +#define ISO_PACKET_SIZE 750 +#define HALFBUFFER_SIZE (ISO_PACKETS_TO_READ*ISO_PACKET_SIZE) + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + + //Vars: + //Imports + char *HANDLE_CHAR; + KUSB_HANDLE handle = NULL; + char *stm_handle_string; + KSTM_HANDLE stm_handle = NULL; + unsigned char pipeID = 0x83; + //Internals + unsigned char *tempBuffer; + unsigned char success; + DWORD errorCode = ERROR_SUCCESS; + ULONG length; + unsigned int n; + //Exports + char *transfer_contents; + unsigned int *error_export; + + //Initialise Data + HANDLE_CHAR = mxArrayToString(prhs[0]); + sscanf(HANDLE_CHAR, "%16x", &handle); + + stm_handle_string = mxArrayToString(prhs[1]); + sscanf(stm_handle_string, "%16x", &stm_handle); + + //Actual Function + tempBuffer = mxMalloc(HALFBUFFER_SIZE); + success = StmK_Read(stm_handle, tempBuffer, 0, HALFBUFFER_SIZE, &length); + printf("%d bytes copied, out of a possible %d\n", length, HALFBUFFER_SIZE); + if (!success) { + errorCode = GetLastError(); + printf("StmkK_Read failed. ErrorCode: %08Xh\n", errorCode); + //printf("No more items = %08Xh\n", ERROR_NO_MORE_ITEMS); + } + + //Export Data + transfer_contents = mxMalloc(HALFBUFFER_SIZE); + for (n=0;nsamplestoshow + if (samplestoshow>500) + temp_waveform = buffer((length(buffer) - samplestoshow - delay_sample):samplestoshow/500: (length(buffer) - delay_sample)); + else + temp_waveform = buffer((length(buffer) - samplestoshow - delay_sample): (length(buffer) - delay_sample)); + end + cool_waveform = undofrontend(temp_waveform, channel); + taxis = linspace(-scope_window_time-delay_sec,-delay_sec,length(cool_waveform)); + return + end + + taxis = []; + cool_waveform = []; \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/f8/f89ac51bd77fc899b6f8fe81d7957e17659037cd.svn-base b/Old Matlab Interface/.svn/pristine/f8/f89ac51bd77fc899b6f8fe81d7957e17659037cd.svn-base new file mode 100644 index 00000000..d471ccea --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/f8/f89ac51bd77fc899b6f8fe81d7957e17659037cd.svn-base @@ -0,0 +1,66 @@ +function [] = tiny_send_waveform(waveform, amplitude, frequency); + +global scope_mode +global gui_axes + +offset = 375; +waveform = tiny_wave_conv(waveform, amplitude); +waveform = uint8(waveform); +%waveform; + +wave_length = length(waveform); + +f_invalid = 1; + +valid_clock_div = [1,2,4,8,64,256,1024]; +f0=24e6; + +if(frequency*wave_length)>1e6 + error('Frequency is too high') +end + +for clk_setting = 1:length(valid_clock_div) + f_test = f0 / valid_clock_div(clk_setting); + if (f_test/frequency)<65535 + f_invalid = 0; + break + end +end + +if (f_invalid) + error('Frequency is too low!') +end + +tccper = round(f_test / frequency / wave_length); +tccper = uint16(tccper); + +clk_setting = uint16(clk_setting); +%clk_setting; + +%stairs(uint8(waveform)); + +wavestring = []; +for n=1:wave_length + wavestring = [wavestring [sprintf('%3d, ', waveform(n)) ' ']]; +end + +%%Exception for mode 5 +if (scope_mode ==5) + mex_usb_send_control('40', 'a1', dec2hex(tccper), dec2hex(clk_setting), dec2hex(wave_length), uint8(waveform)); + stairs(gui_axes, waveform, 'y') + set(gui_axes, 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + return +end + + +mex_usb_send_control('40', 'a1', dec2hex(tccper), dec2hex(clk_setting + 16*offset), dec2hex(min(375,wave_length)), uint8(waveform(1:min(375,wave_length)))); + +if(wave_length>375) + warning('\nWave Length > 375') + mex_usb_send_control('40', 'a1', dec2hex(tccper), dec2hex(clk_setting + 16*(offset+750) + 32768), dec2hex(wave_length-375), uint8(waveform(376:end))); +end + + +% driverLocation = 'c:\libusbk\examples\open-device\debug\win32'; +% command = [driverLocation '\open-device "03eb" "a000" "' command '" "' num2str(tccper) '" "' num2str(clk_setting) '" "' num2str(wave_length) '" "' wavestring '"'] +% system(command); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/fa/fa8489441ac82d22567b5c3d5b494576df54f37d.svn-base b/Old Matlab Interface/.svn/pristine/fa/fa8489441ac82d22567b5c3d5b494576df54f37d.svn-base new file mode 100644 index 00000000..d8112b9e Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/fa/fa8489441ac82d22567b5c3d5b494576df54f37d.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/fb/fb204cea8eb501738d9e4ec41eb60316a3896b12.svn-base b/Old Matlab Interface/.svn/pristine/fb/fb204cea8eb501738d9e4ec41eb60316a3896b12.svn-base new file mode 100644 index 00000000..6b77b17d --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/fb/fb204cea8eb501738d9e4ec41eb60316a3896b12.svn-base @@ -0,0 +1,69 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// AssemblyInfo.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.Reflection; +using System.Runtime.InteropServices; + + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyTitle("Read.Isochronous")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Read.Isochronous")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("b345e710-181d-481f-a62c-7e434534e582")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/fb/fb57921a14cfc57fcfdc9ae090915910e58b90e4.svn-base b/Old Matlab Interface/.svn/pristine/fb/fb57921a14cfc57fcfdc9ae090915910e58b90e4.svn-base new file mode 100644 index 00000000..20150cf9 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/fb/fb57921a14cfc57fcfdc9ae090915910e58b90e4.svn-base @@ -0,0 +1,41 @@ +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global scope_window_time +global scope_window_max +global scope_window_min + +global gui_cursor_mode +global gui_axes +global scope_mode + +if(scope_mode==2) + switch(gui_cursor_mode) + case 1 + plot(gui_axes, taxis_ch1, cool_waveform_ch1, 'y', taxis_ch2, cool_waveform_ch2, 'c'); + case 2 + plot(gui_axes, taxis_ch1, cool_waveform_ch1, 'y', taxis_ch2, cool_waveform_ch2, 'c', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + case 3 + plot(gui_axes, taxis_ch1, cool_waveform_ch1, 'y', taxis_ch2, cool_waveform_ch2, 'c', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:'); + case 4 + plot(gui_axes, taxis_ch1, cool_waveform_ch1, 'y', taxis_ch2, cool_waveform_ch2, 'c', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + otherwise + error('Gui_axes is in an invalid state'); + end +else + switch(gui_cursor_mode) + case 1 + plot(gui_axes, taxis, cool_waveform, 'y'); + case 2 + plot(gui_axes, taxis, cool_waveform, 'y', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + case 3 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:'); + case 4 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + otherwise + error('Gui_axes is in an invalid state'); + end +end +set(gui_axes, 'Ylim', [scope_window_min, scope_window_max], 'Xlim', [-scope_window_time, 0], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + diff --git a/Old Matlab Interface/.svn/pristine/fb/fb80c8c407241aa3266ea0297d0973b4109368c7.svn-base b/Old Matlab Interface/.svn/pristine/fb/fb80c8c407241aa3266ea0297d0973b4109368c7.svn-base new file mode 100644 index 00000000..f3f07224 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/fb/fb80c8c407241aa3266ea0297d0973b4109368c7.svn-base @@ -0,0 +1,118 @@ +%mex USB_ISO_LOOP.c -Iincludes -llibusbK -Lbin\lib\amd64 +%clear all + +global usb_handle +global scope_gain +global scope_window_time +global scope_window_max +global scope_window_min +global scope_mode +global gui_scope_running + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global gui_cursor_mode +global saved_waveform_ch1 +global saved_waveform_ch2 + +dotheplot + +if ~length(usb_handle) + warning('USB Handle not initialised. Initialising!') + mex_usb_init('03eb', 'a000') +end + +[isoCtx_0, isoCtx_1, ovlkHandle_0, ovlkHandle_1, ovlPool, isoBuffer] = USB_ISO_INIT(usb_handle) + +refreshrate = 4; +refreshrate_temp = refreshrate; + +if(isempty(max_n)) + max_n = 10 +end +saved_waveform_ch1 = int8([]); + +if isempty(scope_mode) + error('You didn''t set the scope mode!'); +end + +if isempty(scope_window_time) + error('You didn''t set the window time (x) value!'); +end + +if (scope_window_time < 1/375000) + error('Scope window size is too small!'); +end + +if(scope_mode==0) + if isempty(scope_gain) + error('You didn''t set the gain!'); + end + + if isempty(scope_window_min) + error('You didn''t set the minimum window voltage value!'); + end + + if isempty(scope_window_max) + error('You didn''t set the maximum window voltage value!'); + end +end + +dropped_packets = 0; +waveform_exists = 0; + +for n=1:max_n + %[transfer_contents_0] = USB_ISO_LOOP(usb_handle, isoCtx_0, ovlkHandle_0, ovlPool, isoBuffer, uint8(0)); + [transfer_contents_0, libk_error] = USB_ISO_LOOP(usb_handle, isoCtx_0, ovlkHandle_0, ovlPool, isoBuffer, uint8(0)); + keep_in_sync + displaypacket(transfer_contents_0) + if(gui_scope_running) + updatescopeaxes + else + switch(gui_cursor_mode) + case 1 + plot(gui_axes, taxis, cool_waveform, 'y'); + case 2 + plot(gui_axes, taxis, cool_waveform, 'y', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + case 3 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:'); + case 4 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + + otherwise + error('Gui_axes is in an invalid state'); + end + set(gui_axes, 'Ylim', [scope_window_min, scope_window_max], 'Xlim', [-scope_window_time, 0], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + drawnow + end + + %[transfer_contents_1] = USB_ISO_LOOP(usb_handle, isoCtx_1, ovlkHandle_1, ovlPool, isoBuffer, uint8(1)); + [transfer_contents_1, libk_error] = USB_ISO_LOOP(usb_handle, isoCtx_1, ovlkHandle_1, ovlPool, isoBuffer, uint8(1)); + keep_in_sync + displaypacket(transfer_contents_1) + if(gui_scope_running) + updatescopeaxes + else + switch(gui_cursor_mode) + case 1 + plot(gui_axes, taxis, cool_waveform, 'y'); + case 2 + plot(gui_axes, taxis, cool_waveform, 'y', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + case 3 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:'); + case 4 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos gui_vert_cursor_a_pos], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos gui_vert_cursor_b_pos], [scope_window_min scope_window_max], 'w:', [-scope_window_time 0], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time 0], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + + otherwise + error('Gui_axes is in an invalid state'); + end + set(gui_axes, 'Ylim', [scope_window_min, scope_window_max], 'Xlim', [-scope_window_time, 0], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + drawnow + end +end + +clear all +max_n = 2000 +mex_usb_iso_loop \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/fb/fbaab675ab97abde1c3353748e9f3d129bd92023.svn-base b/Old Matlab Interface/.svn/pristine/fb/fbaab675ab97abde1c3353748e9f3d129bd92023.svn-base new file mode 100644 index 00000000..c5b23ee7 --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/fb/fbaab675ab97abde1c3353748e9f3d129bd92023.svn-base @@ -0,0 +1,13 @@ +function [wave] = tiny_wave_conv(wave, amplitude); +if length(wave)>750 + wave=imresize(wave,750/length(wave)); + warning('Vector length is greater than 128. It has been scaled down.') +end + +if (amplitude>255 | amplitude<0 | amplitude ~= round(amplitude)) + error('Amplitude must be an integer between 0 and 255 for an 8 bit waveform!') +end + +wave = wave - min(wave); +wave = wave * amplitude / max(wave); +wave = round(wave); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/fc/fc2350e45b0c7bdac7ac35f42b65f5fdfd622464.svn-base b/Old Matlab Interface/.svn/pristine/fc/fc2350e45b0c7bdac7ac35f42b65f5fdfd622464.svn-base new file mode 100644 index 00000000..0d410629 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/fc/fc2350e45b0c7bdac7ac35f42b65f5fdfd622464.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/fc/fc253270c36a209bcb1a8a7efc73b7bc27c5dec6.svn-base b/Old Matlab Interface/.svn/pristine/fc/fc253270c36a209bcb1a8a7efc73b7bc27c5dec6.svn-base new file mode 100644 index 00000000..b733556e --- /dev/null +++ b/Old Matlab Interface/.svn/pristine/fc/fc253270c36a209bcb1a8a7efc73b7bc27c5dec6.svn-base @@ -0,0 +1,13 @@ +function [wave] = tiny_wave_conv(wave, amplitude); +if length(wave)>128 + wave=imresize(wave,128/length(wave)); + warning('Vector length is greater than 128. It has been scaled down.') +end + +if (amplitude>255 | amplitude<0 | amplitude ~= round(amplitude)) + error('Amplitude must be an integer between 0 and 255 for an 8 bit waveform!') +end + +wave = wave - min(wave); +wave = wave * amplitude / max(wave); +wave = round(wave); \ No newline at end of file diff --git a/Old Matlab Interface/.svn/pristine/fe/fec3f9b96c660796ba167efb57158c7afe7d751e.svn-base b/Old Matlab Interface/.svn/pristine/fe/fec3f9b96c660796ba167efb57158c7afe7d751e.svn-base new file mode 100644 index 00000000..0e43a803 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/fe/fec3f9b96c660796ba167efb57158c7afe7d751e.svn-base differ diff --git a/Old Matlab Interface/.svn/pristine/fe/fed3c95fe8e06ff11d5eaaafdea8c28f8c7577ed.svn-base b/Old Matlab Interface/.svn/pristine/fe/fed3c95fe8e06ff11d5eaaafdea8c28f8c7577ed.svn-base new file mode 100644 index 00000000..4cabd8c0 Binary files /dev/null and b/Old Matlab Interface/.svn/pristine/fe/fed3c95fe8e06ff11d5eaaafdea8c28f8c7577ed.svn-base differ diff --git a/Old Matlab Interface/.svn/wc.db b/Old Matlab Interface/.svn/wc.db new file mode 100644 index 00000000..a2b29487 Binary files /dev/null and b/Old Matlab Interface/.svn/wc.db differ diff --git a/Old Matlab Interface/GUIDE/figstate.m b/Old Matlab Interface/GUIDE/figstate.m new file mode 100644 index 00000000..8b4645c7 --- /dev/null +++ b/Old Matlab Interface/GUIDE/figstate.m @@ -0,0 +1,12 @@ +%FIGSTATE State of the figure +% FIGSTATE(F) returns the state of the figure with handle F as +% {Maximized | Minimized | Normal} +% +% Example: +% If +% f = figure; +% surf(peaks); +% then +% state = figstate(f) returns the state = 'Normal' +% +% See also MAXFIG, MINFIG \ No newline at end of file diff --git a/Old Matlab Interface/GUIDE/figstate.p b/Old Matlab Interface/GUIDE/figstate.p new file mode 100644 index 00000000..9108f9cb Binary files /dev/null and b/Old Matlab Interface/GUIDE/figstate.p differ diff --git a/Old Matlab Interface/GUIDE/figstate_7a.p b/Old Matlab Interface/GUIDE/figstate_7a.p new file mode 100644 index 00000000..0c8f63cc Binary files /dev/null and b/Old Matlab Interface/GUIDE/figstate_7a.p differ diff --git a/Old Matlab Interface/GUIDE/launchgui.m b/Old Matlab Interface/GUIDE/launchgui.m new file mode 100644 index 00000000..e69de29b diff --git a/Old Matlab Interface/GUIDE/maxfig.m b/Old Matlab Interface/GUIDE/maxfig.m new file mode 100644 index 00000000..69d31ae5 --- /dev/null +++ b/Old Matlab Interface/GUIDE/maxfig.m @@ -0,0 +1,12 @@ +%MAXFIG Maximize a figure +% MAXFIG(F,1) maximizes the figure window for the figure with handle F +% MAXFIG(F,0) restores figure F if F is maximized +% +% Example: +% If +% f = figure; +% surf(peaks) +% then +% maxfig(f,1) maximizes the figure +% +% See also MINFIG, FIGSTATE \ No newline at end of file diff --git a/Old Matlab Interface/GUIDE/maxfig.p b/Old Matlab Interface/GUIDE/maxfig.p new file mode 100644 index 00000000..66fa3d1e Binary files /dev/null and b/Old Matlab Interface/GUIDE/maxfig.p differ diff --git a/Old Matlab Interface/GUIDE/maxfig_7a.p b/Old Matlab Interface/GUIDE/maxfig_7a.p new file mode 100644 index 00000000..e2437114 Binary files /dev/null and b/Old Matlab Interface/GUIDE/maxfig_7a.p differ diff --git a/Old Matlab Interface/GUIDE/minfig.m b/Old Matlab Interface/GUIDE/minfig.m new file mode 100644 index 00000000..fff68b83 --- /dev/null +++ b/Old Matlab Interface/GUIDE/minfig.m @@ -0,0 +1,12 @@ +%MINFIG Minimize a figure +% MINFIG(F,1) minimizes the figure window for the figure with handle F +% MINFIG(F,0) restores figure F if F is minimized +% +% Example: +% If +% f = figure; +% surf(peaks); +% then +% minfig(f,1) minimizes the figure +% +% See also MAXFIG, FIGSTATE \ No newline at end of file diff --git a/Old Matlab Interface/GUIDE/minfig.p b/Old Matlab Interface/GUIDE/minfig.p new file mode 100644 index 00000000..e2360958 Binary files /dev/null and b/Old Matlab Interface/GUIDE/minfig.p differ diff --git a/Old Matlab Interface/GUIDE/untitled.fig b/Old Matlab Interface/GUIDE/untitled.fig new file mode 100644 index 00000000..ffc7c41c Binary files /dev/null and b/Old Matlab Interface/GUIDE/untitled.fig differ diff --git a/Old Matlab Interface/GUIDE/untitled.m b/Old Matlab Interface/GUIDE/untitled.m new file mode 100644 index 00000000..9862dab0 --- /dev/null +++ b/Old Matlab Interface/GUIDE/untitled.m @@ -0,0 +1,211 @@ +function varargout = untitled(varargin) +% UNTITLED MATLAB code for untitled.fig +% UNTITLED, by itself, creates a new UNTITLED or raises the existing +% singleton*. +% +% H = UNTITLED returns the handle to a new UNTITLED or the handle to +% the existing singleton*. +% +% UNTITLED('CALLBACK',hObject,eventData,handles,...) calls the local +% function named CALLBACK in UNTITLED.M with the given input arguments. +% +% UNTITLED('Property','Value',...) creates a new UNTITLED or raises the +% existing singleton*. Starting from the left, property value pairs are +% applied to the GUI before untitled_OpeningFcn gets called. An +% unrecognized property name or invalid value makes property application +% stop. All inputs are passed to untitled_OpeningFcn via varargin. +% +% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one +% instance to run (singleton)". +% +% See also: GUIDE, GUIDATA, GUIHANDLES + +% Edit the above text to modify the response to help untitled + +% Last Modified by GUIDE v2.5 09-Jun-2015 16:00:50 + +% Begin initialization code - DO NOT EDIT +gui_Singleton = 1; +gui_State = struct('gui_Name', mfilename, ... + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @untitled_OpeningFcn, ... + 'gui_OutputFcn', @untitled_OutputFcn, ... + 'gui_LayoutFcn', [] , ... + 'gui_Callback', []); +if nargin && ischar(varargin{1}) + gui_State.gui_Callback = str2func(varargin{1}); +end + +if nargout + [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); +else + gui_mainfcn(gui_State, varargin{:}); +end +% End initialization code - DO NOT EDIT + + +% --- Executes just before untitled is made visible. +function untitled_OpeningFcn(hObject, eventdata, handles, varargin) +% This function has no output args, see OutputFcn. +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +% varargin command line arguments to untitled (see VARARGIN) + +handles.timer = timer(... + 'ExecutionMode', 'fixedRate', ... % Run timer repeatedly + 'Period', 0.0165, ... % 60fps. + 'TimerFcn', {@updateplot,hObject}); % Specify callback +start(handles.timer); + +global offset +global o_offset +global frac2disp + +frac2disp = 0.1; +offset = 0; +o_offset = 0; + +% Choose default command line output for untitled +handles.output = hObject; +% Update handles structure +guidata(hObject, handles); + +% UIWAIT makes untitled wait for user response (see UIRESUME) +% uiwait(handles.figure1); + +function updateplot(hObject, eventdata, hfigure) +%fprintf('updateplot running!!\n') + +global offset +global o_offset +global frac2disp + +handles = guidata(hfigure); +scaler = 10; + +offset = offset + o_offset; +x = [offset : 0.01 : (offset + 2*pi*frac2disp)]; +y = sin(x); +xrange = (x-offset-pi*frac2disp)*scaler; +plot(handles.axes1,xrange,y); +axis(handles.axes1,[-pi*scaler*frac2disp, pi*scaler*frac2disp, -1, 1]); +drawnow + + +% --- Outputs from this function are returned to the command line. +function varargout = untitled_OutputFcn(hObject, eventdata, handles) +% varargout cell array for returning output args (see VARARGOUT); +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +% Get default command line output from handles structure +varargout{1} = handles.output; + + +% --- Executes on button press in pushbutton2. +function pushbutton2_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + + +% --- Executes on button press in pushbutton3. +function pushbutton3_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + + +% --- Executes on button press in pushbutton4. +function pushbutton4_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + + +% --- Executes on slider movement. +function slider2_Callback(hObject, eventdata, handles) +global o_offset; +% hObject handle to slider2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +o_offset = 0.5*get(hObject,'Value')^0.33; +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + +% --- Executes during object creation, after setting all properties. +function slider2_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on selection change in popupmenu1. +function popupmenu1_Callback(hObject, eventdata, handles) +% hObject handle to popupmenu1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +contents = cellstr(get(hObject,'String')); +current = contents{get(hObject,'Value')}; +if isequal(current, contents{2}) + stop(handles.timer); +else start(handles.timer); +end + +% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array +% contents{get(hObject,'Value')} returns selected item from popupmenu1 + + +% --- Executes during object creation, after setting all properties. +function popupmenu1_CreateFcn(hObject, eventdata, handles) +% hObject handle to popupmenu1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: popupmenu controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider4_Callback(hObject, eventdata, handles) +% hObject handle to slider4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global frac2disp +frac2disp = get(hObject,'Value') * 10+0.1; +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider4_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on button press in pushbutton5. +function pushbutton5_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +timerdata = get(handles.timer); +if isequal(timerdata.Running,'on') + stop(handles.timer); +else + start(handles.timer); +end diff --git a/Old Matlab Interface/HelloWorld.exe b/Old Matlab Interface/HelloWorld.exe new file mode 100644 index 00000000..7ac51320 Binary files /dev/null and b/Old Matlab Interface/HelloWorld.exe differ diff --git a/Old Matlab Interface/ISOLOOPTEST.m b/Old Matlab Interface/ISOLOOPTEST.m new file mode 100644 index 00000000..a93e068e --- /dev/null +++ b/Old Matlab Interface/ISOLOOPTEST.m @@ -0,0 +1,3 @@ +compile +mex_usb_iso_init +mex_usb_iso_loop \ No newline at end of file diff --git a/Old Matlab Interface/MYFIRSTWAVEFORM.txt b/Old Matlab Interface/MYFIRSTWAVEFORM.txt new file mode 100644 index 00000000..b1a4e14a --- /dev/null +++ b/Old Matlab Interface/MYFIRSTWAVEFORM.txt @@ -0,0 +1,11252 @@ +BEGIN PACKET 0 +182 +182 +182 +182 +182 +183 +183 +182 +183 +183 +183 +182 +182 +183 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +181 +12 +11 +10 +11 +11 +11 +10 +182 +182 +183 +183 +182 +183 +182 +182 +182 +182 +183 +182 +182 +182 +181 +182 +183 +182 +183 +183 +182 +182 +182 +182 +182 +10 +9 +10 +11 +11 +11 +12 +182 +182 +182 +182 +182 +182 +182 +182 +182 +185 +183 +182 +183 +183 +180 +182 +179 +181 +181 +183 +183 +182 +182 +182 +182 +181 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +184 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +12 +10 +10 +11 +11 +11 +10 +182 +182 +182 +182 +183 +182 +183 +182 +182 +183 +182 +182 +182 +182 +182 +179 +182 +182 +182 +182 +182 +182 +182 +182 +182 +12 +11 +11 +11 +11 +10 +11 +182 +182 +182 +181 +182 +182 +180 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +183 +13 +11 +10 +11 +11 +11 +11 +182 +182 +182 +182 +182 +182 +182 +183 +181 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +182 +12 +11 +11 +11 +11 +10 +10 +182 +182 +182 +182 +182 +182 +182 +184 +183 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +181 +182 +182 +11 +11 +11 +11 +11 +10 +11 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +182 +181 +182 +183 +182 +182 +182 +11 +11 +11 +11 +10 +11 +11 +183 +182 +182 +183 +182 +183 +182 +176 +182 +183 +182 +182 +183 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +12 +11 +11 +11 +11 +10 +11 +182 +183 +182 +182 +183 +182 +182 +182 +182 +184 +182 +182 +182 +182 +184 +183 +182 +183 +182 +184 +182 +182 +182 +182 +185 +12 +11 +11 +11 +13 +10 +11 +182 +182 +180 +182 +182 +182 +182 +180 +182 +182 +183 +180 +179 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +182 +12 +11 +11 +11 +11 +10 +10 +183 +182 +12 +8 +11 +11 +11 +11 +11 +182 +182 +182 +182 +182 +182 +182 +183 +183 +183 +182 +182 +182 +184 +183 +182 +182 +182 +181 +183 +182 +182 +182 +183 +182 +12 +11 +11 +6 +11 +11 +11 +182 +181 +182 +182 +183 +182 +183 +182 +182 +182 +182 +181 +182 +182 +182 +183 +181 +182 +182 +183 +182 +183 +182 +182 +182 +12 +11 +10 +9 +11 +10 +10 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +181 +183 +182 +183 +183 +13 +11 +11 +11 +10 +11 +11 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +183 +182 +183 +183 +182 +180 +182 +182 +182 +182 +183 +182 +12 +10 +10 +11 +11 +11 +10 +182 +182 +182 +182 +183 +183 +182 +182 +182 +181 +182 +182 +183 +182 +183 +183 +182 +182 +184 +182 +183 +183 +181 +182 +182 +12 +10 +10 +10 +11 +10 +10 +181 +182 +182 +182 +172 +182 +183 +182 +182 +182 +182 +182 +185 +182 +182 +183 +182 +182 +182 +183 +182 +182 +182 +182 +182 +12 +11 +11 +11 +12 +10 +10 +182 +182 +182 +182 +182 +182 +182 +183 +181 +182 +182 +182 +182 +182 +182 +183 +182 +183 +182 +183 +183 +183 +182 +182 +182 +12 +11 +10 +12 +11 +10 +11 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +183 +182 +183 +182 +183 +182 +182 +182 +12 +11 +11 +12 +10 +11 +11 +182 +182 +183 +182 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +12 +11 +11 +11 +10 +10 +10 +183 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +182 +182 +182 +180 +183 +182 +182 +182 +188 +183 +182 +182 +12 +12 +11 +11 +11 +11 +8 +182 +182 +182 +182 +183 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +179 +183 +12 +11 +11 +10 +10 +10 +10 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +183 +183 +182 +182 +181 +182 +182 +182 +183 +183 +182 +182 +184 +183 +184 +11 +11 +9 +9 +9 +12 +11 +182 +183 +183 +180 +182 +182 +183 +181 +183 +182 +181 +182 +183 +183 +182 +181 +182 +182 +181 +181 +182 +182 +183 +183 +182 +12 +11 +10 +11 +10 +10 +5 +183 +183 +184 +181 +183 +182 +181 +182 +181 +182 +183 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +181 +183 +11 +11 +10 +11 +12 +11 +9 +180 +181 +180 +183 +183 +182 +182 +183 +183 +182 +182 +181 +182 +181 +182 +182 +12 +10 +11 +11 +11 +11 +11 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +183 +183 +182 +183 +182 +182 +181 +182 +182 +182 +182 +182 +182 +181 +183 +11 +10 +11 +11 +10 +9 +10 +183 +183 +183 +183 +182 +182 +182 +182 +181 +182 +182 +182 +182 +183 +181 +183 +182 +182 +182 +182 +182 +182 +181 +182 +182 +12 +10 +11 +10 +11 +11 +10 +182 +182 +181 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +12 +11 +11 +11 +10 +11 +11 +182 +182 +183 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +181 +183 +180 +183 +182 +182 +183 +182 +11 +11 +10 +11 +11 +11 +11 +182 +182 +182 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +182 +12 +10 +10 +11 +11 +11 +10 +182 +182 +183 +181 +183 +182 +183 +182 +184 +182 +182 +183 +183 +180 +182 +182 +182 +183 +182 +182 +182 +183 +182 +186 +182 +12 +12 +10 +12 +11 +11 +11 +182 +188 +181 +183 +182 +182 +179 +182 +183 +183 +182 +189 +182 +182 +182 +182 +181 +182 +183 +182 +183 +183 +181 +180 +182 +10 +9 +10 +11 +11 +11 +9 +182 +181 +181 +183 +181 +183 +183 +182 +183 +181 +182 +182 +181 +182 +183 +183 +184 +182 +182 +182 +181 +182 +181 +182 +182 +12 +11 +11 +10 +10 +10 +10 +182 +183 +183 +180 +182 +182 +180 +181 +182 +182 +183 +183 +182 +182 +183 +183 +183 +183 +182 +182 +182 +182 +181 +181 +183 +181 +182 +181 +183 +182 +183 +182 +182 +182 +11 +10 +11 +11 +11 +10 +11 +182 +184 +183 +184 +182 +183 +181 +183 +183 +180 +182 +181 +182 +182 +182 +182 +180 +180 +182 +181 +182 +181 +182 +183 +184 +13 +11 +10 +10 +10 +10 +10 +181 +183 +182 +186 +184 +183 +181 +183 +182 +182 +182 +182 +182 +182 +183 +179 +182 +182 +183 +182 +182 +182 +182 +183 +182 +10 +10 +11 +11 +183 +182 +182 +182 +180 +181 +183 +182 +182 +183 +182 +182 +182 +181 +182 +185 +183 +183 +182 +12 +10 +10 +10 +9 +11 +11 +183 +183 +182 +183 +182 +182 +180 +182 +182 +183 +182 +180 +182 +181 +181 +184 +182 +183 +183 +181 +182 +183 +181 +184 +183 +12 +14 +10 +12 +9 +9 +11 +183 +183 +183 +181 +183 +181 +181 +183 +182 +183 +183 +181 +181 +181 +182 +182 +183 +183 +182 +182 +182 +182 +183 +181 +182 +12 +12 +12 +12 +11 +11 +10 +181 +182 +183 +183 +184 +182 +182 +181 +182 +181 +183 +183 +182 +182 +178 +182 +183 +182 +180 +181 +181 +182 +183 +182 +184 +13 +9 +10 +10 +13 +12 +12 +182 +182 +183 +182 +183 +182 +181 +183 +182 +182 +183 +182 +183 +182 +182 +183 +183 +182 +181 +182 +181 +182 +182 +185 +183 +14 +10 +11 +9 +9 +10 +10 +183 +183 +183 +183 +182 +183 +182 +182 +183 +182 +182 +181 +181 +182 +183 +182 +182 +182 +182 +183 +181 +182 +183 +183 +181 +12 +11 +10 +11 +11 +10 +10 +183 +182 +181 +183 +182 +183 +183 +183 +183 +184 +182 +182 +182 +182 +182 +181 +183 +183 +182 +183 +182 +183 +182 +182 +182 +13 +10 +11 +11 +11 +11 +10 +182 +182 +182 +183 +184 +183 +184 +182 +185 +183 +182 +182 +181 +182 +181 +182 +183 +182 +181 +182 +183 +183 +183 +182 +182 +11 +11 +11 +10 +8 +8 +10 +182 +182 +183 +183 +183 +182 +182 +182 +182 +182 +182 +181 +182 +185 +182 +182 +182 +182 +182 +182 +184 +182 +182 +182 +182 +13 +10 +11 +12 +10 +10 +11 +181 +182 +182 +183 +183 +11 +12 +10 +11 +183 +182 +182 +182 +182 +183 +183 +183 +183 +182 +182 +183 +183 +182 +182 +182 +181 +181 +182 +182 +181 +184 +182 +182 +182 +12 +11 +11 +11 +11 +11 +10 +182 +181 +182 +184 +183 +182 +181 +182 +183 +183 +183 +184 +182 +182 +182 +182 +182 +183 +182 +183 +183 +183 +182 +182 +183 +13 +11 +11 +11 +10 +10 +11 +183 +182 +181 +182 +182 +181 +182 +182 +182 +182 +183 +183 +183 +182 +182 +182 +183 +183 +181 +182 +181 +11 +10 +180 +181 +182 +181 +183 +182 +182 +182 +182 +183 +182 +182 +182 +181 +182 +182 +180 +180 +182 +181 +182 +182 +183 +182 +182 +12 +10 +11 +10 +10 +11 +11 +182 +183 +183 +182 +183 +181 +183 +182 +181 +182 +181 +181 +183 +182 +182 +182 +182 +182 +182 +183 +183 +183 +182 +183 +181 +10 +11 +9 +11 +10 +10 +10 +183 +182 +182 +183 +183 +182 +182 +181 +182 +183 +182 +182 +181 +183 +182 +181 +182 +182 +182 +182 +183 +185 +184 +183 +184 +9 +11 +9 +10 +10 +11 +10 +182 +182 +182 +182 +183 +182 +183 +182 +182 +183 +184 +182 +182 +183 +181 +181 +182 +181 +181 +182 +182 +183 +182 +182 +182 +12 +10 +7 +10 +8 +10 +10 +181 +181 +182 +182 +180 +183 +183 +183 +183 +182 +182 +182 +181 +180 +182 +182 +182 +184 +182 +183 +182 +183 +182 +183 +183 +12 +11 +7 +9 +10 +10 +8 +181 +182 +182 +183 +184 +186 +182 +181 +179 +182 +186 +182 +182 +183 +182 +186 +182 +182 +182 +182 +185 +181 +182 +183 +184 +12 +11 +12 +10 +10 +9 +11 +182 +182 +181 +181 +181 +182 +181 +182 +182 +182 +184 +183 +182 +182 +183 +182 +182 +182 +178 +183 +181 +182 +182 +182 +182 +12 +11 +11 +11 +11 +10 +11 +182 +183 +181 +183 +182 +182 +181 +181 +183 +181 +183 +182 +183 +183 +182 +182 +182 +182 +184 +183 +183 +182 +182 +182 +181 +12 +10 +11 +11 +11 +12 +10 +183 +182 +182 +182 +182 +182 +182 +182 +185 +183 +181 +182 +182 +182 +181 +182 +183 +184 +183 +184 +182 +183 +182 +182 +182 +11 +10 +10 +186 +182 +182 +183 +182 +182 +12 +10 +10 +11 +11 +11 +11 +182 +181 +181 +183 +184 +182 +182 +183 +182 +183 +183 +178 +182 +181 +182 +182 +186 +183 +184 +182 +182 +182 +186 +182 +182 +11 +12 +12 +10 +10 +10 +11 +183 +184 +182 +181 +183 +182 +183 +183 +182 +181 +181 +183 +182 +181 +182 +183 +183 +182 +180 +182 +182 +182 +183 +181 +182 +11 +10 +11 +11 +11 +8 +10 +182 +182 +183 +183 +182 +181 +183 +183 +182 +182 +182 +181 +182 +184 +183 +182 +11 +10 +11 +11 +12 +11 +11 +182 +181 +183 +182 +183 +181 +182 +182 +181 +183 +184 +181 +182 +182 +180 +182 +183 +183 +183 +181 +183 +182 +182 +181 +183 +11 +11 +12 +12 +10 +9 +10 +181 +183 +183 +181 +180 +182 +182 +184 +183 +182 +182 +182 +183 +183 +182 +181 +182 +182 +181 +181 +182 +183 +184 +182 +185 +11 +10 +10 +11 +11 +10 +11 +182 +182 +182 +182 +182 +183 +182 +182 +182 +184 +182 +183 +182 +181 +183 +182 +182 +183 +186 +181 +182 +181 +182 +183 +181 +11 +9 +12 +11 +11 +11 +7 +182 +182 +181 +183 +181 +181 +182 +183 +182 +180 +183 +182 +183 +183 +182 +182 +182 +182 +182 +183 +182 +183 +182 +182 +182 +10 +10 +11 +12 +11 +11 +11 +182 +181 +183 +182 +182 +181 +181 +182 +183 +183 +183 +183 +182 +182 +182 +183 +183 +181 +182 +182 +182 +183 +182 +181 +183 +11 +11 +11 +9 +11 +9 +11 +182 +181 +182 +182 +182 +182 +182 +183 +181 +183 +183 +182 +183 +181 +182 +182 +183 +183 +182 +183 +181 +184 +183 +184 +182 +11 +11 +11 +11 +12 +11 +11 +181 +182 +182 +182 +182 +183 +183 +182 +182 +183 +181 +181 +183 +182 +182 +182 +182 +181 +183 +180 +180 +182 +182 +183 +182 +13 +10 +11 +11 +10 +11 +9 +183 +182 +181 +183 +182 +183 +182 +181 +182 +182 +184 +183 +182 +182 +182 +182 +183 +183 +182 +182 +181 +183 +183 +184 +182 +12 +10 +11 +12 +11 +11 +10 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +180 +182 +182 +183 +182 +182 +182 +183 +183 +181 +182 +183 +184 +182 +183 +182 +181 +183 +184 +182 +182 +182 +181 +183 +13 +9 +8 +11 +11 +11 +11 +184 +184 +182 +183 +183 +182 +182 +182 +183 +183 +182 +182 +181 +184 +182 +182 +181 +182 +182 +183 +184 +182 +182 +182 +182 +12 +11 +11 +9 +10 +10 +11 +183 +183 +182 +181 +183 +183 +182 +182 +182 +183 +182 +181 +183 +182 +182 +182 +183 +182 +182 +182 +183 +181 +182 +182 +182 +12 +10 +10 +10 +12 +10 +12 +182 +181 +182 +179 +181 +182 +181 +182 +181 +183 +182 +184 +183 +184 +181 +177 +12 +11 +11 +10 +11 +11 +11 +182 +182 +182 +183 +182 +182 +183 +182 +182 +182 +183 +182 +182 +182 +182 +182 +183 +182 +184 +182 +182 +182 +182 +182 +182 +11 +10 +11 +11 +15 +10 +10 +182 +182 +183 +183 +183 +181 +182 +182 +183 +182 +180 +180 +182 +183 +183 +183 +183 +181 +183 +182 +182 +181 +182 +185 +182 +12 +10 +11 +11 +10 +10 +9 +181 +183 +182 +182 +182 +183 +182 +183 +183 +183 +181 +181 +182 +182 +183 +182 +182 +182 +182 +183 +182 +181 +183 +183 +182 +12 +11 +10 +15 +11 +12 +11 +182 +182 +183 +180 +181 +182 +183 +183 +182 +182 +181 +182 +183 +184 +182 +183 +181 +182 +182 +183 +183 +183 +185 +182 +183 +12 +9 +11 +11 +11 +11 +9 +181 +183 +182 +183 +182 +182 +182 +184 +182 +184 +182 +181 +182 +182 +181 +182 +182 +182 +184 +182 +183 +182 +182 +182 +181 +12 +11 +10 +10 +11 +12 +11 +183 +180 +184 +184 +180 +182 +182 +183 +182 +181 +182 +183 +183 +182 +182 +181 +183 +183 +184 +182 +181 +183 +182 +183 +183 +11 +9 +11 +11 +11 +10 +9 +182 +183 +183 +182 +182 +182 +182 +182 +183 +182 +180 +182 +182 +183 +183 +182 +181 +182 +182 +183 +182 +183 +182 +182 +182 +10 +10 +11 +12 +11 +10 +10 +182 +183 +185 +182 +182 +181 +181 +182 +183 +181 +181 +182 +183 +182 +183 +182 +182 +183 +182 +180 +182 +182 +182 +182 +182 +11 +11 +9 +11 +11 +11 +10 +182 +184 +184 +182 +183 +182 +182 +182 +182 +182 +184 +181 +182 +182 +182 +182 +182 +180 +183 +182 +183 +183 +181 +182 +182 +183 +183 +184 +182 +182 +183 +182 +182 +181 +12 +11 +11 +12 +11 +10 +10 +183 +183 +181 +180 +182 +184 +182 +182 +182 +182 +182 +182 +182 +181 +182 +183 +183 +179 +181 +182 +182 +182 +182 +182 +181 +11 +11 +11 +11 +9 +10 +11 +184 +185 +182 +182 +183 +183 +182 +183 +183 +183 +182 +182 +181 +181 +181 +182 +182 +182 +179 +182 +183 +181 +182 +183 +181 +183 +183 +183 +182 +182 +183 +182 +182 +181 +181 +183 +181 +181 +180 +184 +181 +180 +182 +183 +185 +181 +182 +182 +14 +12 +12 +10 +11 +11 +11 +182 +183 +182 +183 +182 +183 +184 +182 +181 +181 +182 +184 +183 +182 +181 +182 +184 +183 +183 +182 +179 +182 +182 +182 +181 +10 +12 +11 +10 +10 +10 +8 +182 +183 +182 +181 +182 +181 +181 +182 +182 +184 +183 +181 +182 +181 +183 +182 +180 +182 +183 +183 +182 +182 +181 +182 +183 +12 +10 +9 +11 +10 +11 +11 +181 +181 +183 +184 +182 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +183 +184 +182 +181 +182 +181 +182 +182 +180 +180 +12 +11 +11 +10 +10 +11 +10 +182 +183 +182 +182 +182 +182 +183 +183 +182 +182 +181 +184 +184 +183 +183 +181 +181 +182 +183 +182 +183 +182 +182 +182 +182 +10 +10 +11 +11 +11 +10 +11 +182 +182 +184 +183 +183 +181 +182 +181 +182 +183 +181 +182 +181 +183 +182 +182 +183 +182 +182 +183 +182 +183 +183 +182 +181 +12 +11 +13 +11 +12 +10 +9 +182 +181 +182 +182 +181 +182 +182 +182 +182 +182 +182 +177 +184 +182 +181 +183 +182 +183 +183 +181 +181 +183 +182 +183 +181 +12 +11 +11 +11 +9 +11 +11 +182 +182 +182 +182 +182 +183 +182 +182 +182 +182 +182 +183 +183 +183 +185 +182 +182 +182 +183 +183 +183 +183 +183 +182 +181 +11 +10 +11 +11 +12 +10 +10 +182 +184 +183 +182 +182 +182 +183 +182 +182 +182 +181 +182 +182 +181 +182 +183 +182 +182 +182 +182 +182 +183 +183 +182 +182 +11 +12 +11 +10 +10 +10 +11 +182 +183 +13 +11 +11 +10 +10 +12 +12 +182 +184 +182 +181 +182 +182 +182 +182 +181 +184 +184 +182 +184 +182 +183 +183 +183 +182 +182 +183 +181 +182 +182 +181 +183 +11 +9 +11 +11 +10 +11 +10 +182 +183 +182 +182 +181 +181 +183 +183 +182 +182 +181 +182 +183 +183 +182 +181 +182 +183 +184 +182 +182 +183 +182 +182 +183 +12 +11 +12 +10 +11 +7 +10 +182 +181 +182 +180 +182 +183 +181 +181 +183 +183 +181 +182 +182 +182 +181 +182 +12 +11 +10 +9 +10 +10 +12 +181 +182 +181 +182 +183 +181 +182 +182 +183 +182 +181 +182 +183 +183 +185 +181 +182 +182 +183 +183 +182 +182 +183 +182 +182 +11 +10 +10 +12 +10 +11 +11 +183 +182 +184 +185 +181 +181 +182 +183 +181 +181 +182 +182 +181 +182 +183 +182 +181 +183 +182 +181 +180 +181 +182 +183 +180 +12 +11 +9 +9 +11 +12 +10 +181 +183 +182 +182 +183 +183 +182 +182 +182 +183 +181 +182 +182 +183 +181 +183 +187 +183 +182 +182 +182 +183 +184 +182 +184 +11 +10 +11 +12 +11 +11 +10 +182 +182 +182 +182 +183 +182 +183 +182 +180 +183 +183 +182 +181 +182 +182 +184 +182 +184 +182 +181 +182 +182 +182 +182 +181 +12 +12 +12 +11 +11 +11 +11 +181 +183 +183 +183 +182 +181 +182 +182 +183 +183 +182 +182 +183 +183 +181 +181 +182 +182 +183 +181 +181 +182 +182 +182 +181 +12 +10 +11 +10 +11 +11 +10 +182 +181 +182 +182 +182 +182 +183 +184 +182 +182 +182 +182 +182 +182 +182 +182 +181 +183 +183 +181 +181 +182 +183 +182 +181 +12 +9 +11 +12 +10 +10 +8 +182 +183 +183 +183 +181 +183 +182 +182 +182 +183 +184 +183 +182 +182 +183 +183 +182 +183 +182 +182 +182 +182 +183 +182 +181 +12 +11 +11 +11 +11 +11 +10 +182 +182 +181 +181 +183 +177 +181 +182 +181 +184 +182 +182 +181 +183 +183 +184 +184 +181 +181 +182 +182 +182 +182 +182 +184 +11 +10 +10 +10 +11 +15 +10 +182 +183 +183 +182 +182 +183 +182 +183 +182 +181 +183 +181 +182 +183 +182 +182 +182 +182 +180 +183 +183 +181 +180 +182 +182 +183 +181 +182 +182 +183 +184 +182 +181 +182 +11 +12 +11 +11 +10 +11 +12 +183 +181 +181 +182 +182 +182 +182 +182 +182 +182 +182 +184 +182 +181 +182 +182 +182 +183 +181 +182 +183 +186 +183 +182 +182 +11 +11 +11 +10 +10 +11 +11 +181 +183 +183 +182 +182 +182 +182 +182 +183 +181 +180 +183 +182 +184 +182 +182 +181 +182 +183 +181 +183 +182 +183 +180 +183 +12 +10 +10 +11 +12 +10 +10 +181 +182 +183 +184 +183 +181 +182 +183 +182 +181 +182 +182 +181 +182 +179 +180 +12 +11 +11 +10 +11 +10 +13 +182 +181 +181 +181 +181 +182 +182 +182 +182 +182 +183 +181 +182 +182 +179 +182 +182 +183 +184 +180 +181 +182 +183 +182 +184 +11 +10 +10 +10 +10 +10 +10 +182 +182 +182 +182 +182 +183 +182 +180 +182 +183 +182 +181 +181 +181 +181 +183 +183 +181 +182 +182 +182 +181 +181 +182 +181 +10 +10 +10 +9 +11 +10 +10 +182 +182 +182 +181 +183 +184 +182 +182 +184 +183 +182 +180 +182 +182 +182 +183 +184 +182 +181 +183 +185 +183 +183 +182 +184 +12 +10 +11 +11 +11 +11 +11 +181 +182 +183 +182 +183 +182 +183 +181 +183 +182 +183 +182 +182 +182 +182 +182 +181 +182 +183 +183 +183 +182 +181 +182 +181 +13 +12 +8 +10 +10 +11 +10 +183 +184 +182 +183 +182 +182 +183 +183 +182 +182 +181 +181 +183 +183 +182 +181 +182 +182 +183 +183 +182 +182 +183 +182 +182 +12 +11 +11 +11 +10 +11 +10 +181 +182 +182 +181 +182 +186 +183 +183 +181 +181 +183 +183 +182 +182 +182 +181 +182 +182 +182 +183 +184 +183 +182 +177 +181 +13 +11 +10 +10 +10 +11 +11 +182 +182 +181 +182 +183 +182 +183 +182 +182 +182 +182 +180 +182 +182 +182 +181 +183 +182 +183 +184 +182 +179 +182 +182 +185 +11 +12 +10 +11 +10 +11 +10 +182 +181 +182 +182 +182 +182 +183 +183 +182 +182 +183 +182 +183 +183 +182 +181 +183 +183 +182 +180 +182 +183 +182 +183 +182 +13 +11 +10 +11 +10 +11 +11 +181 +181 +183 +184 +182 +182 +183 +183 +184 +183 +182 +182 +182 +182 +182 +182 +182 +181 +183 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +184 +182 +183 +181 +182 +12 +12 +10 +10 +10 +10 +12 +182 +183 +183 +184 +185 +182 +182 +182 +179 +182 +182 +181 +182 +181 +182 +182 +184 +182 +184 +181 +181 +182 +181 +182 +184 +12 +10 +11 +11 +11 +11 +11 +182 +182 +182 +183 +181 +181 +183 +183 +181 +182 +182 +182 +182 +182 +176 +181 +182 +182 +184 +182 +182 +181 +182 +182 +182 +11 +9 +10 +181 +182 +183 +182 +183 +181 +182 +183 +182 +182 +183 +183 +188 +183 +182 +181 +183 +186 +182 +183 +12 +11 +12 +10 +11 +10 +11 +182 +180 +183 +183 +182 +182 +183 +182 +182 +183 +182 +183 +185 +183 +184 +183 +181 +182 +183 +181 +181 +183 +181 +181 +180 +12 +10 +11 +11 +10 +10 +10 +182 +182 +181 +181 +182 +182 +183 +183 +182 +182 +182 +182 +184 +182 +182 +181 +180 +183 +182 +180 +182 +181 +181 +182 +182 +12 +11 +10 +11 +10 +12 +11 +182 +181 +182 +183 +182 +182 +182 +181 +182 +182 +183 +183 +182 +182 +183 +182 +181 +182 +181 +183 +183 +184 +182 +183 +183 +11 +10 +10 +10 +11 +10 +10 +182 +182 +182 +182 +182 +182 +182 +183 +183 +182 +182 +182 +185 +183 +179 +183 +182 +181 +182 +183 +184 +182 +182 +182 +181 +13 +12 +10 +11 +11 +11 +10 +181 +183 +181 +183 +183 +182 +181 +181 +183 +182 +183 +181 +181 +183 +183 +183 +183 +185 +183 +183 +182 +182 +182 +182 +182 +13 +12 +10 +10 +10 +11 +11 +182 +183 +181 +181 +183 +183 +181 +181 +183 +182 +183 +182 +182 +179 +182 +183 +184 +181 +181 +182 +182 +183 +183 +182 +181 +12 +11 +10 +10 +10 +11 +10 +182 +182 +182 +183 +182 +182 +182 +181 +182 +183 +180 +182 +183 +182 +183 +181 +179 +180 +183 +183 +184 +182 +182 +183 +182 +12 +11 +11 +10 +11 +11 +11 +182 +181 +182 +182 +183 +185 +182 +182 +183 +183 +183 +183 +185 +182 +182 +183 +182 +182 +184 +182 +182 +182 +182 +183 +183 +12 +12 +10 +11 +10 +11 +12 +181 +181 +182 +182 +182 +182 +10 +10 +9 +182 +183 +181 +180 +182 +182 +183 +182 +182 +181 +183 +182 +185 +182 +184 +182 +182 +178 +183 +182 +182 +182 +184 +185 +182 +12 +10 +9 +11 +12 +11 +10 +182 +182 +182 +180 +182 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +181 +183 +182 +183 +12 +10 +10 +10 +11 +10 +11 +183 +180 +183 +182 +182 +183 +185 +181 +181 +182 +184 +182 +183 +182 +182 +183 +181 +182 +10 +10 +12 +10 +10 +181 +181 +183 +183 +182 +181 +182 +182 +183 +183 +180 +180 +182 +182 +182 +181 +182 +181 +181 +181 +181 +182 +183 +182 +182 +11 +10 +10 +10 +10 +10 +11 +181 +181 +182 +182 +182 +181 +182 +179 +181 +181 +183 +183 +182 +179 +182 +183 +183 +181 +180 +181 +181 +182 +183 +181 +181 +11 +11 +10 +10 +10 +10 +12 +182 +181 +182 +181 +182 +181 +182 +182 +182 +182 +183 +183 +182 +181 +182 +181 +182 +184 +185 +182 +179 +182 +182 +183 +182 +12 +10 +13 +12 +13 +10 +8 +186 +182 +182 +183 +182 +178 +182 +182 +181 +183 +184 +182 +181 +182 +183 +183 +182 +182 +182 +183 +183 +182 +182 +183 +182 +11 +11 +10 +10 +10 +10 +10 +182 +183 +181 +182 +181 +182 +183 +182 +182 +183 +184 +182 +183 +182 +181 +183 +184 +181 +181 +182 +182 +182 +181 +182 +181 +12 +11 +11 +10 +10 +12 +12 +181 +181 +182 +182 +184 +182 +182 +182 +182 +181 +182 +182 +182 +181 +182 +183 +183 +182 +182 +181 +184 +182 +182 +182 +181 +11 +11 +12 +11 +11 +10 +9 +182 +184 +182 +181 +182 +183 +183 +181 +182 +182 +184 +182 +183 +182 +182 +183 +183 +181 +180 +182 +182 +182 +182 +181 +182 +12 +10 +10 +12 +12 +11 +11 +182 +181 +182 +183 +183 +182 +182 +184 +184 +182 +183 +182 +182 +183 +184 +181 +181 +182 +182 +182 +181 +182 +180 +183 +183 +12 +10 +9 +10 +10 +11 +10 +182 +182 +182 +182 +182 +182 +183 +181 +182 +181 +182 +183 +181 +182 +182 +183 +179 +182 +181 +182 +182 +182 +181 +183 +182 +11 +11 +10 +10 +182 +182 +182 +183 +183 +12 +11 +10 +9 +12 +11 +9 +181 +181 +183 +183 +184 +181 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +184 +183 +183 +181 +181 +182 +182 +12 +11 +11 +10 +10 +12 +11 +183 +182 +182 +182 +182 +182 +182 +182 +183 +180 +182 +182 +184 +182 +183 +182 +181 +183 +183 +186 +182 +182 +181 +182 +185 +11 +10 +12 +10 +10 +10 +10 +182 +181 +182 +182 +182 +182 +181 +182 +183 +182 +183 +182 +181 +183 +181 +181 +12 +11 +12 +10 +11 +10 +9 +184 +183 +183 +182 +183 +182 +183 +182 +181 +182 +183 +182 +182 +182 +182 +183 +182 +182 +182 +182 +183 +182 +182 +183 +182 +11 +11 +12 +9 +8 +8 +11 +183 +181 +182 +182 +183 +182 +180 +180 +181 +182 +183 +183 +181 +182 +182 +184 +182 +182 +182 +182 +183 +183 +182 +181 +182 +11 +11 +10 +10 +11 +12 +10 +174 +182 +182 +181 +184 +181 +181 +182 +182 +181 +179 +183 +182 +182 +182 +183 +183 +181 +183 +184 +182 +182 +182 +181 +182 +11 +10 +10 +8 +11 +11 +10 +181 +182 +183 +182 +184 +181 +181 +183 +184 +181 +182 +183 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +12 +8 +10 +12 +11 +10 +9 +182 +182 +184 +182 +182 +183 +182 +181 +182 +182 +181 +182 +181 +185 +182 +182 +182 +186 +183 +183 +182 +181 +180 +183 +182 +12 +9 +8 +11 +11 +11 +11 +182 +182 +182 +183 +182 +182 +179 +182 +183 +182 +182 +182 +183 +183 +182 +183 +182 +181 +183 +182 +183 +182 +183 +182 +182 +12 +11 +12 +12 +10 +9 +11 +182 +180 +183 +182 +181 +182 +183 +181 +180 +182 +182 +183 +182 +182 +182 +183 +184 +182 +182 +184 +182 +180 +183 +183 +183 +11 +10 +11 +11 +10 +10 +11 +184 +181 +181 +182 +182 +182 +182 +181 +181 +182 +183 +182 +182 +181 +182 +183 +185 +182 +182 +182 +182 +183 +183 +182 +182 +12 +11 +11 +11 +10 +11 +11 +182 +181 +182 +183 +184 +182 +181 +182 +183 +182 +183 +182 +182 +183 +183 +182 +181 +181 +183 +182 +182 +181 +182 +183 +184 +182 +180 +182 +182 +182 +181 +182 +183 +184 +11 +11 +11 +11 +11 +11 +10 +182 +182 +182 +181 +182 +182 +184 +181 +182 +182 +183 +181 +182 +183 +181 +182 +183 +185 +181 +182 +182 +183 +182 +183 +182 +11 +11 +12 +11 +10 +11 +12 +182 +182 +182 +182 +182 +182 +180 +182 +183 +183 +181 +182 +182 +184 +181 +182 +181 +182 +182 +183 +182 +182 +181 +181 +183 +13 +10 +11 +7 +10 +13 +183 +183 +182 +180 +182 +181 +184 +183 +182 +180 +182 +182 +182 +183 +182 +181 +183 +13 +12 +10 +10 +10 +11 +10 +182 +182 +181 +181 +183 +183 +181 +182 +181 +183 +182 +182 +182 +183 +182 +182 +183 +183 +182 +182 +183 +181 +182 +180 +184 +12 +10 +9 +11 +11 +11 +11 +181 +182 +182 +182 +182 +182 +181 +183 +184 +183 +182 +182 +180 +183 +183 +183 +182 +182 +183 +183 +182 +183 +182 +182 +181 +12 +11 +11 +10 +10 +10 +11 +182 +181 +182 +181 +182 +183 +182 +181 +181 +183 +183 +182 +181 +181 +182 +182 +181 +182 +182 +182 +182 +183 +183 +180 +182 +13 +9 +10 +10 +10 +10 +11 +182 +182 +179 +182 +183 +182 +182 +182 +183 +182 +183 +181 +182 +182 +181 +183 +182 +182 +183 +182 +181 +182 +183 +183 +182 +10 +10 +10 +11 +11 +10 +11 +182 +183 +183 +182 +182 +182 +182 +181 +184 +183 +182 +182 +181 +182 +183 +182 +183 +181 +182 +182 +183 +182 +182 +182 +182 +12 +11 +10 +10 +11 +10 +12 +182 +183 +183 +183 +184 +182 +182 +182 +182 +179 +183 +183 +182 +183 +182 +182 +182 +183 +182 +183 +182 +181 +182 +182 +183 +10 +8 +10 +11 +11 +10 +11 +181 +182 +183 +182 +182 +182 +183 +182 +182 +181 +183 +182 +183 +182 +180 +183 +182 +182 +182 +183 +181 +183 +182 +180 +181 +11 +11 +9 +10 +11 +11 +12 +181 +181 +179 +183 +182 +182 +182 +182 +185 +182 +181 +182 +181 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +181 +12 +11 +11 +9 +12 +11 +10 +182 +182 +182 +182 +182 +182 +180 +183 +182 +183 +181 +184 +182 +182 +182 +183 +184 +182 +181 +183 +183 +181 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +11 +11 +11 +11 +11 +11 +10 +180 +179 +182 +182 +182 +183 +182 +183 +182 +181 +182 +183 +182 +182 +181 +182 +182 +182 +183 +183 +182 +182 +182 +180 +180 +12 +10 +12 +12 +11 +11 +11 +181 +183 +182 +182 +182 +184 +182 +182 +182 +183 +182 +181 +182 +181 +182 +183 +182 +183 +181 +182 +181 +13 +9 +181 +181 +186 +182 +182 +182 +184 +183 +181 +182 +180 +184 +183 +182 +182 +182 +183 +186 +182 +182 +182 +182 +183 +181 +181 +12 +13 +11 +10 +10 +10 +10 +183 +182 +181 +182 +182 +181 +181 +182 +182 +182 +182 +181 +182 +182 +183 +184 +181 +181 +183 +183 +182 +181 +185 +182 +183 +12 +10 +8 +10 +10 +10 +10 +180 +183 +182 +182 +181 +183 +181 +181 +182 +183 +181 +181 +182 +183 +182 +182 +182 +183 +181 +181 +183 +183 +183 +181 +182 +12 +11 +10 +10 +10 +11 +11 +181 +182 +183 +182 +182 +182 +182 +183 +182 +182 +182 +183 +181 +181 +183 +183 +184 +181 +182 +182 +182 +182 +182 +181 +182 +12 +10 +10 +10 +11 +10 +8 +180 +182 +183 +182 +181 +182 +183 +184 +182 +181 +182 +182 +183 +181 +181 +183 +185 +182 +183 +183 +182 +183 +183 +182 +181 +12 +11 +9 +9 +10 +11 +11 +181 +182 +182 +182 +182 +179 +180 +182 +182 +182 +183 +182 +182 +182 +182 +181 +182 +183 +184 +182 +182 +182 +182 +182 +183 +11 +11 +11 +10 +11 +12 +13 +181 +182 +182 +184 +182 +183 +182 +181 +184 +183 +182 +182 +182 +182 +182 +182 +181 +181 +183 +183 +182 +183 +183 +182 +182 +12 +10 +11 +11 +12 +12 +11 +182 +182 +182 +183 +182 +181 +183 +183 +182 +181 +182 +182 +182 +182 +182 +183 +182 +182 +182 +183 +183 +181 +181 +182 +183 +12 +9 +10 +11 +13 +10 +10 +182 +183 +184 +183 +182 +181 +182 +183 +182 +182 +182 +182 +183 +183 +182 +182 +182 +184 +180 +181 +182 +184 +182 +181 +182 +13 +11 +11 +11 +11 +10 +10 +181 +184 +14 +11 +11 +11 +10 +10 +11 +183 +182 +182 +182 +181 +183 +182 +183 +183 +183 +183 +182 +182 +182 +182 +182 +177 +183 +182 +182 +182 +182 +182 +182 +182 +12 +10 +11 +11 +11 +12 +11 +182 +182 +181 +183 +182 +183 +183 +182 +183 +180 +182 +183 +182 +181 +182 +184 +182 +181 +182 +180 +182 +182 +182 +183 +181 +11 +10 +11 +10 +10 +11 +11 +182 +180 +182 +182 +182 +181 +182 +180 +179 +181 +182 +183 +180 +182 +182 +182 +11 +11 +11 +10 +11 +10 +11 +182 +183 +182 +181 +181 +182 +182 +183 +184 +182 +182 +182 +181 +182 +182 +183 +184 +184 +183 +182 +183 +182 +183 +182 +182 +12 +11 +10 +9 +8 +13 +10 +183 +184 +182 +183 +182 +180 +182 +182 +183 +185 +182 +182 +182 +182 +182 +180 +180 +181 +182 +183 +183 +182 +182 +184 +181 +13 +11 +13 +11 +12 +10 +9 +182 +181 +182 +182 +182 +182 +183 +182 +183 +183 +182 +182 +181 +181 +183 +182 +185 +183 +184 +182 +182 +185 +182 +183 +181 +13 +9 +11 +10 +11 +10 +11 +183 +182 +182 +183 +183 +182 +181 +183 +182 +182 +182 +182 +183 +183 +183 +182 +176 +183 +182 +183 +182 +182 +182 +182 +183 +11 +10 +11 +12 +10 +10 +12 +181 +182 +183 +182 +182 +184 +182 +182 +182 +182 +182 +182 +182 +183 +183 +183 +182 +182 +182 +182 +182 +183 +182 +182 +182 +11 +9 +11 +12 +10 +12 +10 +182 +182 +181 +182 +182 +182 +182 +182 +183 +182 +182 +181 +182 +183 +183 +184 +183 +182 +182 +181 +181 +182 +182 +185 +184 +13 +10 +11 +11 +9 +12 +11 +182 +183 +181 +180 +182 +182 +183 +184 +182 +183 +181 +181 +182 +182 +182 +182 +183 +182 +182 +182 +182 +182 +183 +182 +180 +12 +10 +11 +12 +11 +11 +10 +181 +182 +182 +182 +183 +184 +182 +184 +181 +182 +183 +182 +182 +183 +183 +182 +182 +182 +181 +181 +182 +185 +183 +183 +185 +12 +11 +10 +10 +11 +11 +11 +182 +183 +182 +182 +182 +182 +180 +182 +183 +183 +181 +180 +181 +182 +183 +183 +183 +182 +182 +181 +182 +183 +183 +184 +183 +182 +182 +181 +180 +180 +183 +183 +183 +183 +12 +11 +11 +11 +12 +11 +12 +182 +182 +181 +182 +183 +182 +183 +182 +182 +184 +183 +183 +183 +181 +182 +181 +182 +183 +182 +181 +182 +182 +182 +182 +184 +13 +12 +10 +11 +9 +8 +11 +182 +183 +183 +182 +183 +182 +181 +182 +182 +183 +182 +182 +182 +182 +182 +184 +180 +181 +182 +183 +183 +182 +182 +182 +183 +13 +10 +10 +10 +9 +11 +10 +182 +182 +183 +182 +182 +182 +181 +180 +176 +183 +182 +182 +183 +181 +183 +183 +11 +11 +10 +11 +10 +10 +12 +183 +182 +182 +182 +180 +183 +181 +182 +184 +183 +179 +182 +181 +183 +183 +183 +182 +183 +182 +183 +182 +182 +180 +182 +182 +11 +10 +10 +11 +13 +11 +10 +183 +181 +182 +182 +183 +183 +182 +183 +185 +182 +183 +183 +183 +182 +182 +181 +179 +182 +182 +184 +183 +181 +183 +184 +180 +13 +9 +9 +10 +11 +10 +9 +182 +181 +182 +182 +184 +182 +183 +181 +183 +182 +181 +181 +181 +183 +184 +183 +183 +182 +181 +182 +182 +182 +183 +181 +182 +14 +10 +10 +8 +10 +10 +10 +181 +180 +183 +182 +183 +184 +182 +183 +182 +182 +181 +183 +183 +183 +182 +182 +182 +182 +182 +182 +178 +181 +182 +183 +181 +11 +11 +10 +10 +10 +10 +12 +183 +182 +182 +182 +181 +181 +182 +182 +184 +183 +182 +182 +182 +183 +183 +182 +182 +182 +181 +180 +180 +182 +182 +182 +182 +11 +10 +11 +11 +10 +9 +10 +182 +183 +182 +182 +182 +182 +182 +182 +180 +183 +182 +183 +183 +182 +182 +183 +182 +180 +182 +182 +183 +183 +184 +183 +184 +11 +10 +10 +10 +10 +10 +12 +183 +182 +183 +182 +181 +182 +182 +181 +182 +182 +182 +182 +183 +181 +182 +183 +182 +186 +184 +182 +183 +182 +185 +183 +182 +10 +10 +9 +10 +10 +11 +12 +183 +183 +182 +182 +181 +181 +182 +183 +185 +183 +182 +182 +183 +182 +183 +180 +181 +182 +182 +183 +182 +182 +182 +181 +182 +12 +11 +11 +9 +8 +10 +10 +182 +184 +182 +182 +182 +182 +182 +183 +183 +182 +182 +182 +181 +182 +182 +183 +183 +183 +183 +183 +182 +181 +182 +182 +180 +182 +183 +183 +184 +183 +183 +182 +182 +181 +12 +10 +11 +11 +10 +10 +11 +183 +182 +179 +183 +181 +182 +183 +181 +183 +182 +182 +182 +182 +182 +181 +182 +182 +182 +183 +182 +182 +182 +183 +184 +179 +13 +10 +10 +11 +10 +11 +10 +182 +182 +181 +182 +182 +182 +183 +182 +183 +183 +182 +182 +183 +183 +182 +182 +182 +182 +182 +181 +183 +181 +183 +183 +181 +10 +10 +10 +182 +183 +182 +183 +181 +182 +187 +182 +183 +183 +182 +181 +182 +181 +182 +182 +183 +183 +182 +182 +10 +11 +11 +10 +10 +10 +11 +182 +182 +182 +182 +183 +182 +182 +181 +181 +183 +183 +183 +182 +180 +180 +180 +182 +182 +182 +182 +182 +183 +184 +182 +183 +10 +9 +9 +10 +10 +12 +11 +183 +183 +181 +182 +181 +182 +182 +182 +182 +182 +183 +182 +182 +184 +182 +182 +182 +182 +182 +182 +182 +182 +181 +181 +182 +11 +10 +10 +11 +11 +10 +10 +182 +182 +182 +182 +182 +181 +181 +183 +182 +183 +183 +182 +181 +182 +182 +182 +181 +180 +182 +182 +183 +181 +181 +181 +183 +12 +11 +10 +11 +10 +11 +11 +182 +182 +183 +182 +182 +183 +181 +182 +182 +181 +182 +182 +183 +183 +182 +183 +177 +183 +182 +182 +181 +182 +182 +182 +183 +12 +10 +11 +10 +10 +12 +11 +186 +183 +183 +183 +185 +183 +186 +182 +181 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +182 +183 +181 +182 +182 +182 +13 +13 +11 +11 +12 +10 +12 +181 +182 +182 +182 +182 +181 +181 +182 +182 +183 +182 +183 +184 +182 +184 +182 +182 +182 +183 +183 +184 +182 +181 +182 +182 +12 +10 +11 +11 +11 +10 +10 +182 +181 +181 +182 +182 +183 +184 +184 +182 +184 +181 +182 +182 +182 +183 +182 +182 +183 +182 +182 +182 +183 +182 +183 +182 +11 +11 +10 +10 +11 +10 +11 +184 +183 +184 +182 +182 +181 +181 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +183 +182 +183 +184 +184 +182 +179 +11 +10 +9 +12 +10 +11 +11 +184 +182 +182 +182 +183 +182 +181 +11 +9 +182 +183 +184 +183 +182 +182 +182 +183 +184 +182 +184 +182 +183 +182 +182 +183 +182 +183 +183 +182 +182 +182 +182 +182 +182 +13 +10 +10 +12 +10 +11 +12 +183 +182 +182 +182 +181 +182 +182 +182 +184 +184 +184 +183 +183 +181 +182 +182 +181 +182 +181 +182 +182 +183 +183 +183 +182 +11 +7 +9 +9 +10 +10 +11 +183 +183 +182 +182 +183 +183 +182 +184 +182 +181 +182 +183 +182 +181 +182 +182 +183 +182 +183 +9 +11 +11 +11 +183 +182 +182 +182 +182 +182 +184 +182 +179 +182 +182 +181 +182 +182 +183 +184 +182 +181 +182 +178 +181 +183 +182 +184 +182 +12 +11 +11 +10 +11 +11 +11 +182 +183 +182 +182 +179 +181 +183 +188 +183 +183 +182 +182 +181 +181 +182 +182 +184 +184 +184 +182 +181 +182 +183 +182 +181 +11 +9 +10 +9 +12 +11 +13 +183 +183 +181 +182 +182 +181 +182 +182 +181 +183 +182 +181 +181 +182 +182 +183 +182 +181 +182 +182 +183 +183 +182 +179 +182 +11 +11 +11 +10 +12 +12 +11 +184 +182 +182 +182 +182 +182 +183 +182 +181 +180 +182 +182 +182 +183 +182 +184 +183 +182 +182 +181 +182 +182 +182 +182 +182 +12 +10 +10 +10 +10 +11 +10 +182 +181 +182 +181 +182 +182 +182 +183 +183 +183 +183 +182 +180 +180 +182 +183 +183 +182 +182 +182 +182 +182 +181 +183 +183 +13 +12 +10 +9 +10 +10 +9 +181 +182 +182 +183 +185 +182 +182 +178 +182 +182 +181 +182 +182 +182 +182 +182 +183 +184 +182 +182 +182 +181 +182 +182 +182 +13 +11 +11 +13 +10 +12 +10 +182 +183 +181 +182 +183 +182 +178 +180 +182 +183 +183 +180 +182 +182 +181 +182 +181 +183 +182 +184 +182 +182 +182 +182 +182 +12 +9 +11 +10 +11 +11 +12 +182 +180 +182 +181 +182 +183 +182 +183 +183 +179 +182 +182 +182 +182 +183 +183 +185 +183 +183 +182 +183 +182 +182 +182 +184 +12 +12 +11 +10 +10 +10 +9 +183 +182 +183 +182 +182 +181 +182 +181 +182 +182 +184 +183 +182 +182 +182 +181 +183 +182 +182 +181 +181 +183 +181 +183 +183 +13 +10 +10 +10 +10 +183 +184 +183 +183 +11 +12 +10 +9 +10 +9 +9 +182 +183 +183 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +182 +182 +181 +182 +183 +183 +182 +182 +183 +182 +180 +183 +11 +10 +10 +10 +10 +10 +11 +182 +183 +179 +181 +181 +182 +181 +176 +183 +183 +183 +183 +181 +182 +182 +182 +181 +184 +182 +182 +183 +183 +185 +182 +182 +12 +11 +10 +10 +10 +11 +9 +181 +182 +182 +185 +183 +183 +182 +180 +182 +182 +182 +181 +182 +182 +183 +184 +13 +11 +15 +12 +10 +11 +10 +181 +182 +183 +182 +183 +182 +183 +183 +183 +183 +182 +182 +182 +181 +183 +183 +183 +182 +182 +182 +182 +182 +183 +183 +182 +11 +11 +11 +10 +11 +11 +11 +184 +181 +183 +182 +182 +182 +183 +182 +183 +182 +183 +180 +180 +182 +182 +183 +186 +182 +181 +182 +182 +187 +182 +181 +182 +11 +14 +12 +10 +10 +11 +10 +182 +182 +182 +182 +183 +182 +183 +183 +182 +182 +180 +182 +182 +182 +182 +182 +184 +182 +183 +183 +182 +182 +182 +182 +183 +12 +10 +10 +10 +10 +9 +10 +182 +181 +180 +182 +183 +182 +182 +183 +182 +182 +184 +182 +183 +182 +181 +181 +183 +182 +182 +182 +183 +183 +181 +180 +181 +14 +9 +11 +11 +11 +13 +11 +183 +182 +184 +182 +182 +182 +180 +182 +182 +183 +183 +182 +182 +180 +182 +183 +182 +183 +183 +182 +182 +182 +182 +181 +182 +10 +11 +12 +11 +11 +10 +11 +182 +182 +183 +184 +182 +185 +184 +182 +182 +181 +183 +182 +182 +182 +182 +182 +181 +183 +182 +183 +183 +183 +183 +182 +182 +11 +10 +11 +10 +11 +11 +11 +184 +182 +184 +182 +182 +182 +181 +181 +181 +182 +182 +182 +182 +183 +182 +183 +183 +183 +183 +182 +182 +182 +180 +180 +182 +13 +12 +11 +11 +11 +12 +9 +182 +181 +182 +182 +182 +183 +182 +182 +183 +182 +183 +181 +181 +182 +181 +182 +182 +182 +181 +182 +186 +183 +181 +183 +182 +12 +11 +10 +11 +11 +11 +11 +182 +183 +182 +183 +182 +181 +182 +182 +180 +181 +182 +181 +181 +182 +183 +182 +183 +183 +182 +182 +181 +183 +182 +182 +182 +182 +183 +183 +182 +184 +182 +183 +182 +181 +12 +11 +10 +12 +10 +11 +11 +182 +183 +183 +180 +183 +182 +182 +182 +182 +183 +182 +182 +181 +182 +182 +182 +184 +183 +184 +183 +183 +181 +182 +182 +180 +12 +9 +11 +11 +11 +11 +10 +183 +182 +182 +180 +180 +182 +183 +184 +183 +182 +183 +181 +180 +182 +182 +182 +182 +182 +182 +183 +180 +181 +181 +183 +183 +11 +11 +10 +10 +10 +9 +11 +182 +183 +183 +182 +181 +182 +181 +183 +181 +183 +182 +183 +183 +184 +182 +184 +12 +9 +11 +9 +10 +11 +12 +182 +182 +181 +182 +182 +181 +181 +182 +183 +183 +183 +182 +183 +182 +181 +182 +183 +182 +181 +181 +182 +182 +181 +180 +181 +11 +10 +11 +10 +11 +13 +10 +182 +182 +183 +183 +183 +181 +181 +182 +180 +181 +181 +182 +184 +184 +183 +183 +182 +182 +181 +182 +183 +182 +183 +183 +183 +12 +10 +12 +11 +10 +11 +11 +182 +183 +182 +181 +182 +180 +180 +182 +182 +183 +184 +182 +181 +182 +182 +182 +183 +181 +183 +183 +182 +182 +184 +182 +182 +12 +11 +13 +11 +10 +10 +9 +181 +182 +182 +182 +182 +184 +182 +182 +182 +182 +183 +181 +182 +181 +183 +182 +183 +183 +182 +182 +184 +182 +181 +181 +182 +12 +11 +10 +11 +10 +10 +10 +182 +182 +182 +182 +183 +182 +184 +182 +181 +182 +181 +182 +183 +182 +183 +182 +183 +180 +180 +182 +183 +182 +182 +182 +181 +9 +11 +11 +10 +10 +10 +11 +182 +182 +183 +182 +182 +183 +181 +181 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +181 +182 +182 +182 +183 +183 +183 +10 +8 +11 +10 +11 +12 +11 +183 +183 +182 +182 +181 +182 +182 +182 +182 +182 +183 +183 +183 +184 +182 +185 +182 +181 +182 +182 +183 +183 +184 +182 +183 +11 +10 +10 +11 +11 +10 +8 +180 +183 +183 +183 +183 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +183 +182 +12 +11 +11 +11 +11 +8 +9 +183 +182 +182 +182 +182 +181 +182 +182 +181 +183 +183 +183 +184 +183 +183 +185 +182 +181 +181 +182 +183 +182 +182 +182 +183 +180 +182 +181 +183 +182 +182 +183 +182 +182 +12 +10 +11 +10 +10 +11 +11 +182 +183 +182 +182 +182 +182 +182 +182 +182 +183 +184 +182 +184 +181 +182 +182 +181 +183 +182 +183 +184 +182 +182 +182 +181 +11 +10 +11 +11 +11 +10 +9 +182 +182 +182 +182 +182 +182 +183 +182 +182 +181 +182 +182 +182 +182 +181 +181 +181 +182 +183 +181 +182 +183 +182 +182 +181 +12 +183 +185 +182 +181 +182 +181 +182 +183 +183 +183 +183 +182 +181 +183 +183 +182 +184 +183 +183 +182 +182 +183 +12 +11 +11 +11 +12 +9 +11 +182 +183 +179 +183 +182 +183 +182 +184 +184 +183 +183 +182 +181 +183 +182 +182 +184 +183 +185 +181 +182 +182 +183 +185 +182 +11 +11 +11 +14 +11 +11 +10 +182 +185 +183 +181 +184 +182 +182 +181 +181 +182 +182 +182 +184 +182 +182 +183 +183 +183 +183 +182 +182 +183 +182 +182 +181 +11 +10 +11 +12 +12 +11 +10 +182 +181 +182 +182 +182 +183 +182 +183 +182 +181 +183 +182 +183 +182 +182 +182 +182 +182 +182 +180 +181 +182 +182 +184 +183 +12 +12 +11 +11 +10 +11 +10 +182 +182 +181 +182 +183 +183 +182 +184 +184 +183 +182 +181 +181 +181 +183 +182 +183 +179 +182 +184 +183 +180 +182 +181 +181 +13 +11 +11 +10 +10 +9 +11 +182 +182 +183 +181 +183 +182 +181 +182 +184 +182 +183 +182 +182 +184 +182 +182 +181 +184 +183 +184 +183 +182 +182 +182 +182 +11 +10 +10 +10 +10 +11 +10 +184 +183 +182 +182 +181 +181 +182 +182 +183 +183 +184 +182 +182 +182 +183 +182 +182 +182 +181 +181 +181 +183 +183 +183 +183 +12 +10 +10 +10 +11 +10 +12 +182 +184 +181 +182 +182 +182 +182 +183 +181 +179 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +183 +183 +183 +184 +12 +12 +11 +10 +11 +11 +11 +183 +182 +182 +183 +182 +182 +180 +182 +183 +183 +182 +181 +182 +182 +183 +182 +181 +183 +182 +183 +182 +183 +183 +182 +183 +12 +11 +11 +10 +10 +10 +10 +182 +182 +182 +11 +10 +8 +11 +10 +10 +183 +182 +183 +183 +183 +182 +182 +181 +181 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +11 +9 +10 +11 +12 +12 +11 +183 +182 +182 +182 +184 +182 +182 +182 +182 +182 +181 +182 +182 +180 +186 +182 +183 +183 +183 +181 +182 +181 +182 +182 +181 +14 +10 +12 +11 +14 +11 +10 +182 +182 +182 +180 +182 +181 +180 +182 +182 +183 +182 +182 +182 +181 +182 +183 +183 +11 +11 +11 +10 +10 +10 +183 +182 +182 +181 +183 +184 +181 +182 +181 +182 +184 +182 +182 +181 +182 +179 +182 +181 +179 +182 +187 +182 +181 +182 +182 +8 +10 +9 +11 +10 +10 +9 +182 +182 +185 +182 +181 +181 +181 +183 +182 +183 +182 +183 +183 +180 +179 +182 +181 +182 +182 +183 +182 +183 +182 +182 +182 +12 +11 +11 +10 +10 +10 +10 +179 +179 +181 +182 +182 +181 +182 +182 +183 +184 +184 +184 +183 +182 +182 +181 +182 +181 +182 +183 +182 +182 +183 +182 +182 +11 +9 +11 +11 +10 +12 +11 +182 +182 +181 +181 +182 +182 +182 +181 +182 +182 +184 +184 +182 +182 +182 +182 +180 +182 +182 +182 +182 +182 +182 +182 +183 +11 +10 +9 +11 +11 +11 +12 +183 +183 +181 +181 +182 +183 +182 +182 +181 +181 +182 +182 +182 +183 +182 +184 +183 +182 +181 +182 +180 +181 +181 +182 +183 +14 +12 +10 +10 +11 +10 +12 +183 +183 +182 +182 +182 +183 +182 +182 +183 +183 +181 +180 +182 +182 +182 +183 +183 +183 +183 +181 +183 +182 +182 +182 +183 +11 +10 +10 +10 +11 +10 +10 +183 +183 +181 +183 +182 +180 +181 +182 +182 +183 +183 +182 +182 +182 +182 +183 +183 +182 +182 +183 +182 +182 +183 +182 +181 +11 +9 +10 +11 +11 +12 +12 +182 +182 +181 +181 +183 +182 +182 +183 +181 +181 +181 +182 +183 +183 +183 +182 +182 +181 +183 +182 +182 +183 +183 +182 +183 +12 +10 +11 +11 +11 +11 +10 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +184 +183 +184 +183 +182 +182 +181 +183 +182 +12 +182 +182 +183 +182 +182 +182 +183 +183 +11 +11 +11 +9 +11 +10 +11 +181 +180 +182 +181 +181 +183 +182 +182 +182 +183 +182 +182 +182 +182 +182 +181 +183 +182 +183 +182 +182 +182 +182 +183 +183 +13 +11 +10 +10 +8 +9 +11 +182 +183 +183 +182 +182 +183 +182 +181 +182 +181 +182 +183 +183 +183 +182 +182 +181 +182 +182 +182 +183 +179 +183 +183 +182 +12 +10 +10 +10 +10 +10 +10 +182 +182 +182 +182 +183 +181 +182 +182 +182 +185 +182 +182 +183 +182 +183 +183 +13 +12 +10 +11 +10 +9 +11 +182 +183 +184 +184 +182 +183 +182 +183 +181 +182 +183 +183 +182 +182 +183 +183 +182 +182 +183 +181 +182 +182 +181 +182 +183 +12 +12 +10 +12 +11 +10 +11 +181 +183 +183 +183 +184 +182 +183 +184 +182 +184 +181 +181 +182 +182 +183 +181 +183 +184 +182 +182 +182 +182 +183 +181 +182 +11 +12 +11 +11 +10 +20 +9 +182 +182 +182 +182 +183 +182 +182 +182 +186 +181 +182 +182 +181 +180 +182 +183 +182 +181 +183 +182 +182 +182 +182 +181 +181 +11 +11 +14 +11 +13 +11 +11 +182 +181 +183 +183 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +185 +183 +181 +180 +182 +182 +11 +12 +10 +11 +11 +10 +10 +182 +183 +183 +183 +182 +182 +182 +182 +182 +183 +182 +182 +180 +181 +183 +182 +184 +183 +182 +182 +181 +181 +182 +182 +183 +12 +11 +11 +11 +11 +11 +7 +182 +182 +183 +182 +182 +183 +183 +183 +183 +182 +181 +182 +181 +182 +183 +184 +182 +183 +182 +182 +182 +182 +182 +180 +182 +10 +10 +10 +9 +12 +10 +11 +183 +183 +182 +183 +182 +181 +182 +182 +182 +181 +183 +183 +182 +182 +182 +182 +183 +183 +180 +182 +182 +182 +182 +182 +182 +12 +8 +10 +10 +10 +11 +10 +183 +184 +183 +184 +182 +183 +183 +180 +183 +183 +182 +181 +180 +180 +182 +182 +184 +184 +182 +182 +180 +182 +182 +182 +182 +10 +11 +11 +11 +10 +9 +10 +182 +181 +180 +185 +182 +181 +182 +182 +181 +183 +183 +182 +182 +182 +181 +182 +182 +183 +182 +181 +180 +180 +182 +183 +184 +182 +183 +182 +182 +183 +182 +182 +182 +182 +11 +11 +11 +11 +11 +11 +10 +182 +182 +182 +182 +182 +182 +181 +182 +182 +182 +183 +182 +182 +182 +182 +183 +183 +184 +183 +184 +182 +183 +181 +182 +181 +10 +11 +10 +8 +13 +11 +11 +182 +181 +181 +181 +182 +182 +182 +183 +181 +182 +182 +182 +180 +183 +182 +182 +183 +184 +181 +182 +182 +182 +180 +183 +182 +13 +12 +11 +10 +13 +10 +11 +181 +184 +183 +182 +183 +182 +181 +180 +179 +182 +182 +184 +182 +182 +181 +183 +13 +10 +10 +10 +11 +8 +12 +182 +182 +182 +182 +182 +182 +182 +182 +181 +182 +182 +181 +182 +182 +182 +182 +183 +181 +181 +183 +182 +183 +183 +182 +182 +17 +10 +12 +10 +9 +10 +11 +182 +183 +181 +182 +182 +182 +182 +182 +182 +183 +184 +182 +183 +181 +181 +183 +182 +183 +183 +183 +183 +182 +182 +182 +182 +12 +9 +11 +11 +10 +10 +10 +182 +183 +183 +184 +182 +180 +182 +182 +183 +181 +183 +182 +183 +184 +182 +182 +182 +182 +183 +182 +182 +182 +182 +181 +183 +12 +11 +11 +10 +11 +10 +11 +183 +182 +182 +182 +182 +182 +182 +183 +181 +182 +183 +182 +182 +182 +183 +182 +182 +183 +184 +182 +182 +182 +181 +182 +183 +12 +11 +12 +10 +12 +10 +11 +182 +181 +183 +182 +182 +182 +182 +183 +181 +181 +182 +182 +183 +182 +184 +182 +183 +182 +182 +184 +182 +182 +182 +183 +183 +12 +12 +9 +11 +11 +11 +14 +182 +184 +184 +182 +182 +181 +181 +182 +182 +183 +184 +184 +183 +183 +181 +183 +182 +181 +183 +181 +183 +182 +182 +183 +182 +11 +11 +11 +12 +12 +10 +10 +182 +182 +183 +182 +183 +182 +181 +182 +181 +183 +183 +182 +180 +181 +182 +182 +183 +184 +182 +184 +182 +182 +179 +181 +182 +12 +12 +11 +11 +11 +10 +10 +181 +181 +183 +182 +182 +182 +182 +182 +184 +182 +183 +182 +180 +182 +182 +183 +182 +182 +182 +182 +182 +181 +181 +182 +181 +12 +14 +12 +11 +11 +11 +11 +182 +182 +182 +183 +181 +182 +178 +182 +10 +182 +185 +182 +183 +183 +181 +183 +182 +182 +183 +182 +181 +183 +182 +181 +182 +181 +182 +184 +183 +182 +182 +182 +182 +182 +12 +11 +11 +10 +10 +11 +10 +181 +186 +181 +183 +185 +183 +183 +182 +180 +182 +182 +181 +182 +182 +181 +182 +183 +183 +182 +182 +182 +181 +181 +181 +183 +13 +11 +11 +10 +11 +9 +8 +182 +181 +182 +184 +183 +182 +182 +182 +182 +182 +182 +182 +182 +181 +179 +182 +182 +179 +182 +182 +181 +182 +184 +181 +182 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +183 +182 +183 +183 +184 +183 +182 +182 +182 +182 +13 +10 +10 +11 +10 +10 +10 +182 +183 +184 +182 +183 +181 +181 +182 +181 +183 +182 +182 +183 +183 +182 +183 +182 +181 +183 +181 +182 +183 +182 +184 +182 +12 +11 +10 +10 +9 +11 +10 +182 +184 +181 +180 +182 +182 +181 +182 +181 +182 +182 +183 +183 +182 +182 +182 +183 +182 +183 +182 +183 +182 +182 +182 +181 +10 +11 +11 +10 +11 +11 +11 +182 +181 +183 +182 +183 +182 +182 +183 +182 +182 +182 +182 +183 +182 +182 +181 +180 +182 +181 +182 +182 +181 +182 +182 +183 +12 +11 +10 +10 +10 +11 +10 +181 +182 +181 +182 +182 +183 +183 +182 +183 +183 +182 +181 +182 +182 +182 +185 +183 +184 +183 +183 +182 +182 +180 +183 +182 +11 +11 +10 +11 +12 +11 +10 +182 +181 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +183 +182 +184 +181 +182 +182 +181 +183 +182 +184 +183 +180 +183 +11 +11 +11 +9 +11 +10 +13 +183 +182 +181 +181 +179 +182 +183 +183 +183 +179 +182 +184 +182 +181 +183 +181 +183 +183 +183 +177 +183 +182 +182 +183 +184 +12 +11 +11 +10 +13 +10 +12 +182 +183 +181 +181 +184 +182 +181 +185 +181 +183 +183 +183 +181 +182 +182 +183 +183 +187 +181 +182 +183 +182 +186 +182 +183 +13 +10 +7 +10 +12 +11 +8 +178 +183 +182 +184 +183 +181 +182 +182 +182 +178 +182 +183 +182 +183 +182 +182 +182 +181 +183 +181 +184 +183 +182 +182 +182 +12 +9 +10 +9 +10 +11 +183 +183 +185 +13 +9 +8 +11 +6 +11 +11 +184 +183 +180 +182 +182 +182 +182 +183 +182 +183 +183 +179 +182 +182 +182 +182 +182 +182 +182 +183 +183 +181 +182 +183 +178 +10 +9 +11 +11 +12 +12 +10 +183 +181 +181 +183 +182 +184 +183 +184 +184 +182 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +183 +183 +182 +181 +182 +11 +10 +11 +9 +11 +11 +10 +182 +182 +183 +181 +183 +182 +182 +183 +182 +182 +182 +182 +183 +183 +183 +182 +11 +10 +11 +11 +11 +11 +11 +182 +183 +181 +182 +182 +181 +181 +182 +181 +183 +183 +183 +182 +182 +182 +184 +183 +182 +182 +183 +182 +182 +182 +182 +182 +11 +10 +12 +11 +10 +9 +10 +182 +183 +183 +181 +182 +182 +182 +182 +183 +182 +185 +182 +184 +183 +182 +182 +182 +181 +181 +182 +182 +183 +183 +184 +183 +13 +9 +10 +10 +10 +11 +11 +181 +183 +183 +182 +189 +182 +183 +182 +182 +182 +183 +182 +182 +183 +183 +183 +181 +181 +183 +182 +182 +183 +182 +182 +182 +12 +10 +10 +11 +10 +10 +10 +185 +182 +183 +183 +182 +186 +181 +180 +182 +181 +180 +184 +182 +183 +182 +184 +182 +182 +182 +182 +184 +183 +182 +182 +182 +11 +11 +11 +11 +12 +10 +12 +182 +182 +181 +181 +183 +183 +183 +183 +182 +183 +181 +181 +183 +182 +182 +182 +184 +183 +184 +183 +184 +183 +184 +182 +181 +12 +9 +11 +12 +11 +10 +8 +182 +183 +183 +183 +184 +182 +182 +182 +181 +183 +183 +182 +183 +183 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +183 +12 +10 +11 +11 +8 +11 +10 +181 +181 +182 +183 +182 +183 +183 +183 +182 +181 +182 +183 +183 +183 +182 +182 +182 +182 +182 +181 +181 +183 +182 +182 +181 +13 +10 +11 +10 +9 +11 +10 +183 +183 +182 +183 +182 +182 +182 +182 +182 +182 +183 +183 +183 +182 +182 +182 +182 +184 +182 +182 +184 +182 +184 +182 +181 +11 +11 +11 +10 +11 +11 +10 +182 +183 +182 +184 +182 +182 +182 +182 +181 +180 +183 +183 +183 +183 +183 +182 +182 +182 +181 +179 +182 +182 +183 +182 +182 +182 +181 +182 +182 +182 +183 +184 +183 +184 +12 +10 +10 +10 +10 +10 +10 +181 +182 +182 +182 +182 +182 +182 +182 +183 +184 +180 +183 +181 +181 +182 +182 +183 +183 +182 +182 +181 +182 +182 +181 +182 +11 +10 +10 +11 +11 +12 +10 +184 +182 +181 +181 +181 +182 +184 +183 +183 +182 +182 +181 +182 +183 +182 +182 +184 +184 +183 +182 +182 +181 +182 +182 +182 +11 +11 +11 +11 +12 +11 +9 +183 +181 +182 +182 +183 +182 +185 +183 +183 +182 +181 +182 +182 +183 +183 +182 +12 +9 +10 +11 +11 +11 +12 +183 +182 +180 +183 +183 +183 +183 +182 +182 +181 +182 +182 +182 +182 +182 +183 +182 +179 +183 +182 +182 +182 +182 +182 +184 +12 +11 +12 +11 +12 +10 +11 +183 +182 +183 +183 +182 +182 +182 +183 +180 +183 +180 +185 +182 +183 +182 +182 +183 +182 +183 +182 +183 +183 +185 +183 +184 +12 +10 +10 +10 +11 +11 +12 +183 +182 +182 +181 +182 +181 +183 +182 +182 +182 +184 +180 +182 +182 +183 +183 +182 +183 +181 +181 +183 +182 +183 +182 +180 +12 +10 +8 +9 +11 +11 +11 +183 +181 +182 +181 +183 +183 +182 +183 +182 +182 +183 +182 +183 +183 +182 +182 +183 +184 +183 +184 +181 +183 +182 +182 +183 +12 +10 +9 +10 +10 +10 +12 +183 +183 +183 +181 +181 +181 +182 +183 +183 +183 +185 +182 +183 +182 +182 +182 +183 +181 +180 +182 +182 +181 +182 +182 +182 +12 +11 +10 +11 +11 +11 +12 +182 +183 +182 +182 +182 +182 +182 +182 +183 +182 +181 +182 +184 +182 +183 +181 +181 +182 +180 +183 +183 +183 +183 +182 +183 +9 +8 +11 +10 +11 +10 +11 +182 +181 +182 +182 +183 +182 +183 +182 +182 +182 +183 +184 +182 +182 +182 +182 +182 +181 +182 +182 +184 +182 +182 +182 +183 +13 +12 +11 +10 +10 +11 +10 +185 +183 +184 +183 +184 +182 +184 +182 +182 +182 +181 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +182 +182 +12 +11 +11 +12 +11 +11 +10 +182 +182 +182 +182 +183 +182 +182 +182 +182 +180 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +184 +183 +184 +185 +183 +184 +182 +181 +181 +181 +183 +12 +11 +10 +12 +11 +10 +10 +182 +182 +181 +182 +182 +182 +181 +185 +182 +182 +183 +182 +183 +182 +182 +182 +181 +180 +182 +182 +183 +182 +183 +183 +182 +14 +10 +11 +10 +9 +11 +10 +182 +183 +183 +183 +182 +181 +183 +182 +182 +182 +182 +183 +182 +182 +182 +181 +182 +182 +182 +182 +181 +182 +183 +183 +183 +11 +10 +9 +9 +182 +183 +183 +181 +181 +183 +182 +182 +183 +183 +183 +183 +182 +182 +181 +182 +182 +182 +182 +12 +11 +10 +8 +10 +10 +10 +183 +182 +182 +182 +183 +182 +182 +182 +183 +182 +183 +186 +181 +184 +182 +181 +181 +181 +183 +183 +183 +182 +183 +182 +182 +12 +11 +10 +11 +11 +10 +10 +180 +183 +183 +181 +181 +182 +182 +182 +181 +182 +183 +183 +184 +183 +183 +182 +182 +183 +182 +182 +182 +182 +182 +182 +182 +12 +10 +11 +8 +9 +11 +11 +182 +184 +182 +183 +185 +182 +182 +182 +182 +179 +181 +183 +182 +183 +182 +183 +182 +182 +181 +183 +182 +183 +183 +183 +183 +11 +10 +8 +8 +10 +10 +11 +182 +183 +183 +182 +181 +181 +182 +182 +183 +181 +184 +183 +183 +183 +182 +182 +174 +180 +182 +182 +183 +183 +183 +183 +183 +11 +10 +11 +10 +10 +11 +10 +181 +182 +182 +183 +182 +182 +183 +181 +181 +182 +182 +182 +183 +183 +182 +182 +182 +181 +182 +181 +182 +181 +183 +183 +183 +12 +11 +10 +9 +11 +11 +11 +183 +183 +182 +181 +181 +182 +182 +183 +182 +182 +183 +183 +183 +182 +182 +181 +182 +182 +181 +182 +180 +183 +183 +181 +181 +12 +10 +10 +10 +10 +10 +11 +182 +183 +182 +183 +182 +182 +181 +181 +182 +183 +183 +183 +183 +182 +183 +183 +181 +182 +182 +183 +183 +182 +182 +182 +182 +12 +11 +11 +11 +11 +9 +11 +182 +183 +183 +185 +183 +184 +182 +181 +184 +181 +183 +183 +182 +183 +182 +182 +183 +182 +184 +182 +182 +183 +182 +183 +185 +12 +12 +10 +11 +11 +9 +11 +181 +183 +186 +183 +10 +11 +11 +11 +11 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +180 +180 +182 +182 +186 +183 +182 +182 +182 +182 +183 +182 +182 +182 +183 +11 +9 +10 +9 +10 +10 +11 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +181 +182 +183 +182 +183 +182 +179 +182 +181 +181 +183 +182 +181 +182 +12 +11 +10 +9 +10 +10 +11 +182 +182 +182 +182 +183 +182 +183 +183 +182 +180 +182 +182 +184 +183 +183 +182 +183 +181 +181 +183 +11 +11 +12 +183 +182 +182 +181 +181 +183 +183 +182 +182 +179 +183 +183 +181 +183 +182 +182 +182 +182 +183 +184 +185 +185 +184 +182 +181 +12 +11 +11 +11 +11 +10 +10 +181 +183 +181 +180 +182 +182 +183 +184 +182 +183 +182 +181 +183 +181 +182 +184 +183 +182 +183 +181 +183 +183 +183 +182 +182 +13 +13 +11 +11 +11 +9 +10 +182 +182 +184 +182 +183 +184 +182 +183 +182 +182 +182 +185 +182 +183 +182 +182 +182 +182 +182 +180 +179 +182 +183 +184 +183 +12 +11 +10 +10 +11 +11 +10 +183 +184 +182 +183 +181 +182 +183 +182 +182 +183 +182 +183 +181 +181 +182 +181 +183 +182 +182 +183 +181 +180 +181 +182 +182 +12 +11 +10 +9 +11 +11 +10 +182 +184 +182 +183 +181 +182 +182 +182 +181 +182 +181 +185 +182 +182 +183 +184 +180 +184 +182 +181 +182 +183 +183 +183 +182 +11 +11 +11 +11 +14 +10 +11 +182 +181 +182 +180 +183 +182 +183 +182 +182 +182 +182 +183 +183 +183 +182 +183 +182 +181 +182 +182 +184 +184 +183 +185 +181 +11 +9 +9 +12 +11 +11 +12 +182 +183 +182 +182 +183 +181 +182 +182 +182 +182 +185 +182 +183 +181 +180 +183 +182 +183 +183 +182 +181 +182 +185 +182 +182 +14 +12 +11 +11 +10 +8 +11 +183 +182 +183 +183 +181 +182 +182 +181 +182 +183 +183 +184 +182 +182 +182 +182 +183 +182 +183 +183 +182 +182 +182 +181 +182 +12 +13 +12 +12 +10 +9 +11 +183 +182 +183 +182 +182 +182 +183 +182 +182 +182 +183 +183 +183 +182 +183 +184 +182 +182 +181 +183 +182 +182 +183 +181 +180 +12 +10 +END PACKET 0 diff --git a/Old Matlab Interface/MYFIRSTWAVEFORM_CLEANED.txt b/Old Matlab Interface/MYFIRSTWAVEFORM_CLEANED.txt new file mode 100644 index 00000000..01b9ce83 --- /dev/null +++ b/Old Matlab Interface/MYFIRSTWAVEFORM_CLEANED.txt @@ -0,0 +1,11250 @@ +182 +182 +182 +182 +182 +183 +183 +182 +183 +183 +183 +182 +182 +183 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +181 +12 +11 +10 +11 +11 +11 +10 +182 +182 +183 +183 +182 +183 +182 +182 +182 +182 +183 +182 +182 +182 +181 +182 +183 +182 +183 +183 +182 +182 +182 +182 +182 +10 +9 +10 +11 +11 +11 +12 +182 +182 +182 +182 +182 +182 +182 +182 +182 +185 +183 +182 +183 +183 +180 +182 +179 +181 +181 +183 +183 +182 +182 +182 +182 +181 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +184 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +12 +10 +10 +11 +11 +11 +10 +182 +182 +182 +182 +183 +182 +183 +182 +182 +183 +182 +182 +182 +182 +182 +179 +182 +182 +182 +182 +182 +182 +182 +182 +182 +12 +11 +11 +11 +11 +10 +11 +182 +182 +182 +181 +182 +182 +180 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +183 +13 +11 +10 +11 +11 +11 +11 +182 +182 +182 +182 +182 +182 +182 +183 +181 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +182 +12 +11 +11 +11 +11 +10 +10 +182 +182 +182 +182 +182 +182 +182 +184 +183 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +181 +182 +182 +11 +11 +11 +11 +11 +10 +11 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +182 +181 +182 +183 +182 +182 +182 +11 +11 +11 +11 +10 +11 +11 +183 +182 +182 +183 +182 +183 +182 +176 +182 +183 +182 +182 +183 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +12 +11 +11 +11 +11 +10 +11 +182 +183 +182 +182 +183 +182 +182 +182 +182 +184 +182 +182 +182 +182 +184 +183 +182 +183 +182 +184 +182 +182 +182 +182 +185 +12 +11 +11 +11 +13 +10 +11 +182 +182 +180 +182 +182 +182 +182 +180 +182 +182 +183 +180 +179 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +182 +12 +11 +11 +11 +11 +10 +10 +183 +182 +12 +8 +11 +11 +11 +11 +11 +182 +182 +182 +182 +182 +182 +182 +183 +183 +183 +182 +182 +182 +184 +183 +182 +182 +182 +181 +183 +182 +182 +182 +183 +182 +12 +11 +11 +6 +11 +11 +11 +182 +181 +182 +182 +183 +182 +183 +182 +182 +182 +182 +181 +182 +182 +182 +183 +181 +182 +182 +183 +182 +183 +182 +182 +182 +12 +11 +10 +9 +11 +10 +10 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +181 +183 +182 +183 +183 +13 +11 +11 +11 +10 +11 +11 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +183 +182 +183 +183 +182 +180 +182 +182 +182 +182 +183 +182 +12 +10 +10 +11 +11 +11 +10 +182 +182 +182 +182 +183 +183 +182 +182 +182 +181 +182 +182 +183 +182 +183 +183 +182 +182 +184 +182 +183 +183 +181 +182 +182 +12 +10 +10 +10 +11 +10 +10 +181 +182 +182 +182 +172 +182 +183 +182 +182 +182 +182 +182 +185 +182 +182 +183 +182 +182 +182 +183 +182 +182 +182 +182 +182 +12 +11 +11 +11 +12 +10 +10 +182 +182 +182 +182 +182 +182 +182 +183 +181 +182 +182 +182 +182 +182 +182 +183 +182 +183 +182 +183 +183 +183 +182 +182 +182 +12 +11 +10 +12 +11 +10 +11 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +183 +182 +183 +182 +183 +182 +182 +182 +12 +11 +11 +12 +10 +11 +11 +182 +182 +183 +182 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +12 +11 +11 +11 +10 +10 +10 +183 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +182 +182 +182 +180 +183 +182 +182 +182 +188 +183 +182 +182 +12 +12 +11 +11 +11 +11 +8 +182 +182 +182 +182 +183 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +179 +183 +12 +11 +11 +10 +10 +10 +10 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +183 +183 +182 +182 +181 +182 +182 +182 +183 +183 +182 +182 +184 +183 +184 +11 +11 +9 +9 +9 +12 +11 +182 +183 +183 +180 +182 +182 +183 +181 +183 +182 +181 +182 +183 +183 +182 +181 +182 +182 +181 +181 +182 +182 +183 +183 +182 +12 +11 +10 +11 +10 +10 +5 +183 +183 +184 +181 +183 +182 +181 +182 +181 +182 +183 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +181 +183 +11 +11 +10 +11 +12 +11 +9 +180 +181 +180 +183 +183 +182 +182 +183 +183 +182 +182 +181 +182 +181 +182 +182 +12 +10 +11 +11 +11 +11 +11 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +183 +183 +182 +183 +182 +182 +181 +182 +182 +182 +182 +182 +182 +181 +183 +11 +10 +11 +11 +10 +9 +10 +183 +183 +183 +183 +182 +182 +182 +182 +181 +182 +182 +182 +182 +183 +181 +183 +182 +182 +182 +182 +182 +182 +181 +182 +182 +12 +10 +11 +10 +11 +11 +10 +182 +182 +181 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +12 +11 +11 +11 +10 +11 +11 +182 +182 +183 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +181 +183 +180 +183 +182 +182 +183 +182 +11 +11 +10 +11 +11 +11 +11 +182 +182 +182 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +182 +12 +10 +10 +11 +11 +11 +10 +182 +182 +183 +181 +183 +182 +183 +182 +184 +182 +182 +183 +183 +180 +182 +182 +182 +183 +182 +182 +182 +183 +182 +186 +182 +12 +12 +10 +12 +11 +11 +11 +182 +188 +181 +183 +182 +182 +179 +182 +183 +183 +182 +189 +182 +182 +182 +182 +181 +182 +183 +182 +183 +183 +181 +180 +182 +10 +9 +10 +11 +11 +11 +9 +182 +181 +181 +183 +181 +183 +183 +182 +183 +181 +182 +182 +181 +182 +183 +183 +184 +182 +182 +182 +181 +182 +181 +182 +182 +12 +11 +11 +10 +10 +10 +10 +182 +183 +183 +180 +182 +182 +180 +181 +182 +182 +183 +183 +182 +182 +183 +183 +183 +183 +182 +182 +182 +182 +181 +181 +183 +181 +182 +181 +183 +182 +183 +182 +182 +182 +11 +10 +11 +11 +11 +10 +11 +182 +184 +183 +184 +182 +183 +181 +183 +183 +180 +182 +181 +182 +182 +182 +182 +180 +180 +182 +181 +182 +181 +182 +183 +184 +13 +11 +10 +10 +10 +10 +10 +181 +183 +182 +186 +184 +183 +181 +183 +182 +182 +182 +182 +182 +182 +183 +179 +182 +182 +183 +182 +182 +182 +182 +183 +182 +10 +10 +11 +11 +183 +182 +182 +182 +180 +181 +183 +182 +182 +183 +182 +182 +182 +181 +182 +185 +183 +183 +182 +12 +10 +10 +10 +9 +11 +11 +183 +183 +182 +183 +182 +182 +180 +182 +182 +183 +182 +180 +182 +181 +181 +184 +182 +183 +183 +181 +182 +183 +181 +184 +183 +12 +14 +10 +12 +9 +9 +11 +183 +183 +183 +181 +183 +181 +181 +183 +182 +183 +183 +181 +181 +181 +182 +182 +183 +183 +182 +182 +182 +182 +183 +181 +182 +12 +12 +12 +12 +11 +11 +10 +181 +182 +183 +183 +184 +182 +182 +181 +182 +181 +183 +183 +182 +182 +178 +182 +183 +182 +180 +181 +181 +182 +183 +182 +184 +13 +9 +10 +10 +13 +12 +12 +182 +182 +183 +182 +183 +182 +181 +183 +182 +182 +183 +182 +183 +182 +182 +183 +183 +182 +181 +182 +181 +182 +182 +185 +183 +14 +10 +11 +9 +9 +10 +10 +183 +183 +183 +183 +182 +183 +182 +182 +183 +182 +182 +181 +181 +182 +183 +182 +182 +182 +182 +183 +181 +182 +183 +183 +181 +12 +11 +10 +11 +11 +10 +10 +183 +182 +181 +183 +182 +183 +183 +183 +183 +184 +182 +182 +182 +182 +182 +181 +183 +183 +182 +183 +182 +183 +182 +182 +182 +13 +10 +11 +11 +11 +11 +10 +182 +182 +182 +183 +184 +183 +184 +182 +185 +183 +182 +182 +181 +182 +181 +182 +183 +182 +181 +182 +183 +183 +183 +182 +182 +11 +11 +11 +10 +8 +8 +10 +182 +182 +183 +183 +183 +182 +182 +182 +182 +182 +182 +181 +182 +185 +182 +182 +182 +182 +182 +182 +184 +182 +182 +182 +182 +13 +10 +11 +12 +10 +10 +11 +181 +182 +182 +183 +183 +11 +12 +10 +11 +183 +182 +182 +182 +182 +183 +183 +183 +183 +182 +182 +183 +183 +182 +182 +182 +181 +181 +182 +182 +181 +184 +182 +182 +182 +12 +11 +11 +11 +11 +11 +10 +182 +181 +182 +184 +183 +182 +181 +182 +183 +183 +183 +184 +182 +182 +182 +182 +182 +183 +182 +183 +183 +183 +182 +182 +183 +13 +11 +11 +11 +10 +10 +11 +183 +182 +181 +182 +182 +181 +182 +182 +182 +182 +183 +183 +183 +182 +182 +182 +183 +183 +181 +182 +181 +11 +10 +180 +181 +182 +181 +183 +182 +182 +182 +182 +183 +182 +182 +182 +181 +182 +182 +180 +180 +182 +181 +182 +182 +183 +182 +182 +12 +10 +11 +10 +10 +11 +11 +182 +183 +183 +182 +183 +181 +183 +182 +181 +182 +181 +181 +183 +182 +182 +182 +182 +182 +182 +183 +183 +183 +182 +183 +181 +10 +11 +9 +11 +10 +10 +10 +183 +182 +182 +183 +183 +182 +182 +181 +182 +183 +182 +182 +181 +183 +182 +181 +182 +182 +182 +182 +183 +185 +184 +183 +184 +9 +11 +9 +10 +10 +11 +10 +182 +182 +182 +182 +183 +182 +183 +182 +182 +183 +184 +182 +182 +183 +181 +181 +182 +181 +181 +182 +182 +183 +182 +182 +182 +12 +10 +7 +10 +8 +10 +10 +181 +181 +182 +182 +180 +183 +183 +183 +183 +182 +182 +182 +181 +180 +182 +182 +182 +184 +182 +183 +182 +183 +182 +183 +183 +12 +11 +7 +9 +10 +10 +8 +181 +182 +182 +183 +184 +186 +182 +181 +179 +182 +186 +182 +182 +183 +182 +186 +182 +182 +182 +182 +185 +181 +182 +183 +184 +12 +11 +12 +10 +10 +9 +11 +182 +182 +181 +181 +181 +182 +181 +182 +182 +182 +184 +183 +182 +182 +183 +182 +182 +182 +178 +183 +181 +182 +182 +182 +182 +12 +11 +11 +11 +11 +10 +11 +182 +183 +181 +183 +182 +182 +181 +181 +183 +181 +183 +182 +183 +183 +182 +182 +182 +182 +184 +183 +183 +182 +182 +182 +181 +12 +10 +11 +11 +11 +12 +10 +183 +182 +182 +182 +182 +182 +182 +182 +185 +183 +181 +182 +182 +182 +181 +182 +183 +184 +183 +184 +182 +183 +182 +182 +182 +11 +10 +10 +186 +182 +182 +183 +182 +182 +12 +10 +10 +11 +11 +11 +11 +182 +181 +181 +183 +184 +182 +182 +183 +182 +183 +183 +178 +182 +181 +182 +182 +186 +183 +184 +182 +182 +182 +186 +182 +182 +11 +12 +12 +10 +10 +10 +11 +183 +184 +182 +181 +183 +182 +183 +183 +182 +181 +181 +183 +182 +181 +182 +183 +183 +182 +180 +182 +182 +182 +183 +181 +182 +11 +10 +11 +11 +11 +8 +10 +182 +182 +183 +183 +182 +181 +183 +183 +182 +182 +182 +181 +182 +184 +183 +182 +11 +10 +11 +11 +12 +11 +11 +182 +181 +183 +182 +183 +181 +182 +182 +181 +183 +184 +181 +182 +182 +180 +182 +183 +183 +183 +181 +183 +182 +182 +181 +183 +11 +11 +12 +12 +10 +9 +10 +181 +183 +183 +181 +180 +182 +182 +184 +183 +182 +182 +182 +183 +183 +182 +181 +182 +182 +181 +181 +182 +183 +184 +182 +185 +11 +10 +10 +11 +11 +10 +11 +182 +182 +182 +182 +182 +183 +182 +182 +182 +184 +182 +183 +182 +181 +183 +182 +182 +183 +186 +181 +182 +181 +182 +183 +181 +11 +9 +12 +11 +11 +11 +7 +182 +182 +181 +183 +181 +181 +182 +183 +182 +180 +183 +182 +183 +183 +182 +182 +182 +182 +182 +183 +182 +183 +182 +182 +182 +10 +10 +11 +12 +11 +11 +11 +182 +181 +183 +182 +182 +181 +181 +182 +183 +183 +183 +183 +182 +182 +182 +183 +183 +181 +182 +182 +182 +183 +182 +181 +183 +11 +11 +11 +9 +11 +9 +11 +182 +181 +182 +182 +182 +182 +182 +183 +181 +183 +183 +182 +183 +181 +182 +182 +183 +183 +182 +183 +181 +184 +183 +184 +182 +11 +11 +11 +11 +12 +11 +11 +181 +182 +182 +182 +182 +183 +183 +182 +182 +183 +181 +181 +183 +182 +182 +182 +182 +181 +183 +180 +180 +182 +182 +183 +182 +13 +10 +11 +11 +10 +11 +9 +183 +182 +181 +183 +182 +183 +182 +181 +182 +182 +184 +183 +182 +182 +182 +182 +183 +183 +182 +182 +181 +183 +183 +184 +182 +12 +10 +11 +12 +11 +11 +10 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +180 +182 +182 +183 +182 +182 +182 +183 +183 +181 +182 +183 +184 +182 +183 +182 +181 +183 +184 +182 +182 +182 +181 +183 +13 +9 +8 +11 +11 +11 +11 +184 +184 +182 +183 +183 +182 +182 +182 +183 +183 +182 +182 +181 +184 +182 +182 +181 +182 +182 +183 +184 +182 +182 +182 +182 +12 +11 +11 +9 +10 +10 +11 +183 +183 +182 +181 +183 +183 +182 +182 +182 +183 +182 +181 +183 +182 +182 +182 +183 +182 +182 +182 +183 +181 +182 +182 +182 +12 +10 +10 +10 +12 +10 +12 +182 +181 +182 +179 +181 +182 +181 +182 +181 +183 +182 +184 +183 +184 +181 +177 +12 +11 +11 +10 +11 +11 +11 +182 +182 +182 +183 +182 +182 +183 +182 +182 +182 +183 +182 +182 +182 +182 +182 +183 +182 +184 +182 +182 +182 +182 +182 +182 +11 +10 +11 +11 +15 +10 +10 +182 +182 +183 +183 +183 +181 +182 +182 +183 +182 +180 +180 +182 +183 +183 +183 +183 +181 +183 +182 +182 +181 +182 +185 +182 +12 +10 +11 +11 +10 +10 +9 +181 +183 +182 +182 +182 +183 +182 +183 +183 +183 +181 +181 +182 +182 +183 +182 +182 +182 +182 +183 +182 +181 +183 +183 +182 +12 +11 +10 +15 +11 +12 +11 +182 +182 +183 +180 +181 +182 +183 +183 +182 +182 +181 +182 +183 +184 +182 +183 +181 +182 +182 +183 +183 +183 +185 +182 +183 +12 +9 +11 +11 +11 +11 +9 +181 +183 +182 +183 +182 +182 +182 +184 +182 +184 +182 +181 +182 +182 +181 +182 +182 +182 +184 +182 +183 +182 +182 +182 +181 +12 +11 +10 +10 +11 +12 +11 +183 +180 +184 +184 +180 +182 +182 +183 +182 +181 +182 +183 +183 +182 +182 +181 +183 +183 +184 +182 +181 +183 +182 +183 +183 +11 +9 +11 +11 +11 +10 +9 +182 +183 +183 +182 +182 +182 +182 +182 +183 +182 +180 +182 +182 +183 +183 +182 +181 +182 +182 +183 +182 +183 +182 +182 +182 +10 +10 +11 +12 +11 +10 +10 +182 +183 +185 +182 +182 +181 +181 +182 +183 +181 +181 +182 +183 +182 +183 +182 +182 +183 +182 +180 +182 +182 +182 +182 +182 +11 +11 +9 +11 +11 +11 +10 +182 +184 +184 +182 +183 +182 +182 +182 +182 +182 +184 +181 +182 +182 +182 +182 +182 +180 +183 +182 +183 +183 +181 +182 +182 +183 +183 +184 +182 +182 +183 +182 +182 +181 +12 +11 +11 +12 +11 +10 +10 +183 +183 +181 +180 +182 +184 +182 +182 +182 +182 +182 +182 +182 +181 +182 +183 +183 +179 +181 +182 +182 +182 +182 +182 +181 +11 +11 +11 +11 +9 +10 +11 +184 +185 +182 +182 +183 +183 +182 +183 +183 +183 +182 +182 +181 +181 +181 +182 +182 +182 +179 +182 +183 +181 +182 +183 +181 +183 +183 +183 +182 +182 +183 +182 +182 +181 +181 +183 +181 +181 +180 +184 +181 +180 +182 +183 +185 +181 +182 +182 +14 +12 +12 +10 +11 +11 +11 +182 +183 +182 +183 +182 +183 +184 +182 +181 +181 +182 +184 +183 +182 +181 +182 +184 +183 +183 +182 +179 +182 +182 +182 +181 +10 +12 +11 +10 +10 +10 +8 +182 +183 +182 +181 +182 +181 +181 +182 +182 +184 +183 +181 +182 +181 +183 +182 +180 +182 +183 +183 +182 +182 +181 +182 +183 +12 +10 +9 +11 +10 +11 +11 +181 +181 +183 +184 +182 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +183 +184 +182 +181 +182 +181 +182 +182 +180 +180 +12 +11 +11 +10 +10 +11 +10 +182 +183 +182 +182 +182 +182 +183 +183 +182 +182 +181 +184 +184 +183 +183 +181 +181 +182 +183 +182 +183 +182 +182 +182 +182 +10 +10 +11 +11 +11 +10 +11 +182 +182 +184 +183 +183 +181 +182 +181 +182 +183 +181 +182 +181 +183 +182 +182 +183 +182 +182 +183 +182 +183 +183 +182 +181 +12 +11 +13 +11 +12 +10 +9 +182 +181 +182 +182 +181 +182 +182 +182 +182 +182 +182 +177 +184 +182 +181 +183 +182 +183 +183 +181 +181 +183 +182 +183 +181 +12 +11 +11 +11 +9 +11 +11 +182 +182 +182 +182 +182 +183 +182 +182 +182 +182 +182 +183 +183 +183 +185 +182 +182 +182 +183 +183 +183 +183 +183 +182 +181 +11 +10 +11 +11 +12 +10 +10 +182 +184 +183 +182 +182 +182 +183 +182 +182 +182 +181 +182 +182 +181 +182 +183 +182 +182 +182 +182 +182 +183 +183 +182 +182 +11 +12 +11 +10 +10 +10 +11 +182 +183 +13 +11 +11 +10 +10 +12 +12 +182 +184 +182 +181 +182 +182 +182 +182 +181 +184 +184 +182 +184 +182 +183 +183 +183 +182 +182 +183 +181 +182 +182 +181 +183 +11 +9 +11 +11 +10 +11 +10 +182 +183 +182 +182 +181 +181 +183 +183 +182 +182 +181 +182 +183 +183 +182 +181 +182 +183 +184 +182 +182 +183 +182 +182 +183 +12 +11 +12 +10 +11 +7 +10 +182 +181 +182 +180 +182 +183 +181 +181 +183 +183 +181 +182 +182 +182 +181 +182 +12 +11 +10 +9 +10 +10 +12 +181 +182 +181 +182 +183 +181 +182 +182 +183 +182 +181 +182 +183 +183 +185 +181 +182 +182 +183 +183 +182 +182 +183 +182 +182 +11 +10 +10 +12 +10 +11 +11 +183 +182 +184 +185 +181 +181 +182 +183 +181 +181 +182 +182 +181 +182 +183 +182 +181 +183 +182 +181 +180 +181 +182 +183 +180 +12 +11 +9 +9 +11 +12 +10 +181 +183 +182 +182 +183 +183 +182 +182 +182 +183 +181 +182 +182 +183 +181 +183 +187 +183 +182 +182 +182 +183 +184 +182 +184 +11 +10 +11 +12 +11 +11 +10 +182 +182 +182 +182 +183 +182 +183 +182 +180 +183 +183 +182 +181 +182 +182 +184 +182 +184 +182 +181 +182 +182 +182 +182 +181 +12 +12 +12 +11 +11 +11 +11 +181 +183 +183 +183 +182 +181 +182 +182 +183 +183 +182 +182 +183 +183 +181 +181 +182 +182 +183 +181 +181 +182 +182 +182 +181 +12 +10 +11 +10 +11 +11 +10 +182 +181 +182 +182 +182 +182 +183 +184 +182 +182 +182 +182 +182 +182 +182 +182 +181 +183 +183 +181 +181 +182 +183 +182 +181 +12 +9 +11 +12 +10 +10 +8 +182 +183 +183 +183 +181 +183 +182 +182 +182 +183 +184 +183 +182 +182 +183 +183 +182 +183 +182 +182 +182 +182 +183 +182 +181 +12 +11 +11 +11 +11 +11 +10 +182 +182 +181 +181 +183 +177 +181 +182 +181 +184 +182 +182 +181 +183 +183 +184 +184 +181 +181 +182 +182 +182 +182 +182 +184 +11 +10 +10 +10 +11 +15 +10 +182 +183 +183 +182 +182 +183 +182 +183 +182 +181 +183 +181 +182 +183 +182 +182 +182 +182 +180 +183 +183 +181 +180 +182 +182 +183 +181 +182 +182 +183 +184 +182 +181 +182 +11 +12 +11 +11 +10 +11 +12 +183 +181 +181 +182 +182 +182 +182 +182 +182 +182 +182 +184 +182 +181 +182 +182 +182 +183 +181 +182 +183 +186 +183 +182 +182 +11 +11 +11 +10 +10 +11 +11 +181 +183 +183 +182 +182 +182 +182 +182 +183 +181 +180 +183 +182 +184 +182 +182 +181 +182 +183 +181 +183 +182 +183 +180 +183 +12 +10 +10 +11 +12 +10 +10 +181 +182 +183 +184 +183 +181 +182 +183 +182 +181 +182 +182 +181 +182 +179 +180 +12 +11 +11 +10 +11 +10 +13 +182 +181 +181 +181 +181 +182 +182 +182 +182 +182 +183 +181 +182 +182 +179 +182 +182 +183 +184 +180 +181 +182 +183 +182 +184 +11 +10 +10 +10 +10 +10 +10 +182 +182 +182 +182 +182 +183 +182 +180 +182 +183 +182 +181 +181 +181 +181 +183 +183 +181 +182 +182 +182 +181 +181 +182 +181 +10 +10 +10 +9 +11 +10 +10 +182 +182 +182 +181 +183 +184 +182 +182 +184 +183 +182 +180 +182 +182 +182 +183 +184 +182 +181 +183 +185 +183 +183 +182 +184 +12 +10 +11 +11 +11 +11 +11 +181 +182 +183 +182 +183 +182 +183 +181 +183 +182 +183 +182 +182 +182 +182 +182 +181 +182 +183 +183 +183 +182 +181 +182 +181 +13 +12 +8 +10 +10 +11 +10 +183 +184 +182 +183 +182 +182 +183 +183 +182 +182 +181 +181 +183 +183 +182 +181 +182 +182 +183 +183 +182 +182 +183 +182 +182 +12 +11 +11 +11 +10 +11 +10 +181 +182 +182 +181 +182 +186 +183 +183 +181 +181 +183 +183 +182 +182 +182 +181 +182 +182 +182 +183 +184 +183 +182 +177 +181 +13 +11 +10 +10 +10 +11 +11 +182 +182 +181 +182 +183 +182 +183 +182 +182 +182 +182 +180 +182 +182 +182 +181 +183 +182 +183 +184 +182 +179 +182 +182 +185 +11 +12 +10 +11 +10 +11 +10 +182 +181 +182 +182 +182 +182 +183 +183 +182 +182 +183 +182 +183 +183 +182 +181 +183 +183 +182 +180 +182 +183 +182 +183 +182 +13 +11 +10 +11 +10 +11 +11 +181 +181 +183 +184 +182 +182 +183 +183 +184 +183 +182 +182 +182 +182 +182 +182 +182 +181 +183 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +184 +182 +183 +181 +182 +12 +12 +10 +10 +10 +10 +12 +182 +183 +183 +184 +185 +182 +182 +182 +179 +182 +182 +181 +182 +181 +182 +182 +184 +182 +184 +181 +181 +182 +181 +182 +184 +12 +10 +11 +11 +11 +11 +11 +182 +182 +182 +183 +181 +181 +183 +183 +181 +182 +182 +182 +182 +182 +176 +181 +182 +182 +184 +182 +182 +181 +182 +182 +182 +11 +9 +10 +181 +182 +183 +182 +183 +181 +182 +183 +182 +182 +183 +183 +188 +183 +182 +181 +183 +186 +182 +183 +12 +11 +12 +10 +11 +10 +11 +182 +180 +183 +183 +182 +182 +183 +182 +182 +183 +182 +183 +185 +183 +184 +183 +181 +182 +183 +181 +181 +183 +181 +181 +180 +12 +10 +11 +11 +10 +10 +10 +182 +182 +181 +181 +182 +182 +183 +183 +182 +182 +182 +182 +184 +182 +182 +181 +180 +183 +182 +180 +182 +181 +181 +182 +182 +12 +11 +10 +11 +10 +12 +11 +182 +181 +182 +183 +182 +182 +182 +181 +182 +182 +183 +183 +182 +182 +183 +182 +181 +182 +181 +183 +183 +184 +182 +183 +183 +11 +10 +10 +10 +11 +10 +10 +182 +182 +182 +182 +182 +182 +182 +183 +183 +182 +182 +182 +185 +183 +179 +183 +182 +181 +182 +183 +184 +182 +182 +182 +181 +13 +12 +10 +11 +11 +11 +10 +181 +183 +181 +183 +183 +182 +181 +181 +183 +182 +183 +181 +181 +183 +183 +183 +183 +185 +183 +183 +182 +182 +182 +182 +182 +13 +12 +10 +10 +10 +11 +11 +182 +183 +181 +181 +183 +183 +181 +181 +183 +182 +183 +182 +182 +179 +182 +183 +184 +181 +181 +182 +182 +183 +183 +182 +181 +12 +11 +10 +10 +10 +11 +10 +182 +182 +182 +183 +182 +182 +182 +181 +182 +183 +180 +182 +183 +182 +183 +181 +179 +180 +183 +183 +184 +182 +182 +183 +182 +12 +11 +11 +10 +11 +11 +11 +182 +181 +182 +182 +183 +185 +182 +182 +183 +183 +183 +183 +185 +182 +182 +183 +182 +182 +184 +182 +182 +182 +182 +183 +183 +12 +12 +10 +11 +10 +11 +12 +181 +181 +182 +182 +182 +182 +10 +10 +9 +182 +183 +181 +180 +182 +182 +183 +182 +182 +181 +183 +182 +185 +182 +184 +182 +182 +178 +183 +182 +182 +182 +184 +185 +182 +12 +10 +9 +11 +12 +11 +10 +182 +182 +182 +180 +182 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +181 +183 +182 +183 +12 +10 +10 +10 +11 +10 +11 +183 +180 +183 +182 +182 +183 +185 +181 +181 +182 +184 +182 +183 +182 +182 +183 +181 +182 +10 +10 +12 +10 +10 +181 +181 +183 +183 +182 +181 +182 +182 +183 +183 +180 +180 +182 +182 +182 +181 +182 +181 +181 +181 +181 +182 +183 +182 +182 +11 +10 +10 +10 +10 +10 +11 +181 +181 +182 +182 +182 +181 +182 +179 +181 +181 +183 +183 +182 +179 +182 +183 +183 +181 +180 +181 +181 +182 +183 +181 +181 +11 +11 +10 +10 +10 +10 +12 +182 +181 +182 +181 +182 +181 +182 +182 +182 +182 +183 +183 +182 +181 +182 +181 +182 +184 +185 +182 +179 +182 +182 +183 +182 +12 +10 +13 +12 +13 +10 +8 +186 +182 +182 +183 +182 +178 +182 +182 +181 +183 +184 +182 +181 +182 +183 +183 +182 +182 +182 +183 +183 +182 +182 +183 +182 +11 +11 +10 +10 +10 +10 +10 +182 +183 +181 +182 +181 +182 +183 +182 +182 +183 +184 +182 +183 +182 +181 +183 +184 +181 +181 +182 +182 +182 +181 +182 +181 +12 +11 +11 +10 +10 +12 +12 +181 +181 +182 +182 +184 +182 +182 +182 +182 +181 +182 +182 +182 +181 +182 +183 +183 +182 +182 +181 +184 +182 +182 +182 +181 +11 +11 +12 +11 +11 +10 +9 +182 +184 +182 +181 +182 +183 +183 +181 +182 +182 +184 +182 +183 +182 +182 +183 +183 +181 +180 +182 +182 +182 +182 +181 +182 +12 +10 +10 +12 +12 +11 +11 +182 +181 +182 +183 +183 +182 +182 +184 +184 +182 +183 +182 +182 +183 +184 +181 +181 +182 +182 +182 +181 +182 +180 +183 +183 +12 +10 +9 +10 +10 +11 +10 +182 +182 +182 +182 +182 +182 +183 +181 +182 +181 +182 +183 +181 +182 +182 +183 +179 +182 +181 +182 +182 +182 +181 +183 +182 +11 +11 +10 +10 +182 +182 +182 +183 +183 +12 +11 +10 +9 +12 +11 +9 +181 +181 +183 +183 +184 +181 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +184 +183 +183 +181 +181 +182 +182 +12 +11 +11 +10 +10 +12 +11 +183 +182 +182 +182 +182 +182 +182 +182 +183 +180 +182 +182 +184 +182 +183 +182 +181 +183 +183 +186 +182 +182 +181 +182 +185 +11 +10 +12 +10 +10 +10 +10 +182 +181 +182 +182 +182 +182 +181 +182 +183 +182 +183 +182 +181 +183 +181 +181 +12 +11 +12 +10 +11 +10 +9 +184 +183 +183 +182 +183 +182 +183 +182 +181 +182 +183 +182 +182 +182 +182 +183 +182 +182 +182 +182 +183 +182 +182 +183 +182 +11 +11 +12 +9 +8 +8 +11 +183 +181 +182 +182 +183 +182 +180 +180 +181 +182 +183 +183 +181 +182 +182 +184 +182 +182 +182 +182 +183 +183 +182 +181 +182 +11 +11 +10 +10 +11 +12 +10 +174 +182 +182 +181 +184 +181 +181 +182 +182 +181 +179 +183 +182 +182 +182 +183 +183 +181 +183 +184 +182 +182 +182 +181 +182 +11 +10 +10 +8 +11 +11 +10 +181 +182 +183 +182 +184 +181 +181 +183 +184 +181 +182 +183 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +12 +8 +10 +12 +11 +10 +9 +182 +182 +184 +182 +182 +183 +182 +181 +182 +182 +181 +182 +181 +185 +182 +182 +182 +186 +183 +183 +182 +181 +180 +183 +182 +12 +9 +8 +11 +11 +11 +11 +182 +182 +182 +183 +182 +182 +179 +182 +183 +182 +182 +182 +183 +183 +182 +183 +182 +181 +183 +182 +183 +182 +183 +182 +182 +12 +11 +12 +12 +10 +9 +11 +182 +180 +183 +182 +181 +182 +183 +181 +180 +182 +182 +183 +182 +182 +182 +183 +184 +182 +182 +184 +182 +180 +183 +183 +183 +11 +10 +11 +11 +10 +10 +11 +184 +181 +181 +182 +182 +182 +182 +181 +181 +182 +183 +182 +182 +181 +182 +183 +185 +182 +182 +182 +182 +183 +183 +182 +182 +12 +11 +11 +11 +10 +11 +11 +182 +181 +182 +183 +184 +182 +181 +182 +183 +182 +183 +182 +182 +183 +183 +182 +181 +181 +183 +182 +182 +181 +182 +183 +184 +182 +180 +182 +182 +182 +181 +182 +183 +184 +11 +11 +11 +11 +11 +11 +10 +182 +182 +182 +181 +182 +182 +184 +181 +182 +182 +183 +181 +182 +183 +181 +182 +183 +185 +181 +182 +182 +183 +182 +183 +182 +11 +11 +12 +11 +10 +11 +12 +182 +182 +182 +182 +182 +182 +180 +182 +183 +183 +181 +182 +182 +184 +181 +182 +181 +182 +182 +183 +182 +182 +181 +181 +183 +13 +10 +11 +7 +10 +13 +183 +183 +182 +180 +182 +181 +184 +183 +182 +180 +182 +182 +182 +183 +182 +181 +183 +13 +12 +10 +10 +10 +11 +10 +182 +182 +181 +181 +183 +183 +181 +182 +181 +183 +182 +182 +182 +183 +182 +182 +183 +183 +182 +182 +183 +181 +182 +180 +184 +12 +10 +9 +11 +11 +11 +11 +181 +182 +182 +182 +182 +182 +181 +183 +184 +183 +182 +182 +180 +183 +183 +183 +182 +182 +183 +183 +182 +183 +182 +182 +181 +12 +11 +11 +10 +10 +10 +11 +182 +181 +182 +181 +182 +183 +182 +181 +181 +183 +183 +182 +181 +181 +182 +182 +181 +182 +182 +182 +182 +183 +183 +180 +182 +13 +9 +10 +10 +10 +10 +11 +182 +182 +179 +182 +183 +182 +182 +182 +183 +182 +183 +181 +182 +182 +181 +183 +182 +182 +183 +182 +181 +182 +183 +183 +182 +10 +10 +10 +11 +11 +10 +11 +182 +183 +183 +182 +182 +182 +182 +181 +184 +183 +182 +182 +181 +182 +183 +182 +183 +181 +182 +182 +183 +182 +182 +182 +182 +12 +11 +10 +10 +11 +10 +12 +182 +183 +183 +183 +184 +182 +182 +182 +182 +179 +183 +183 +182 +183 +182 +182 +182 +183 +182 +183 +182 +181 +182 +182 +183 +10 +8 +10 +11 +11 +10 +11 +181 +182 +183 +182 +182 +182 +183 +182 +182 +181 +183 +182 +183 +182 +180 +183 +182 +182 +182 +183 +181 +183 +182 +180 +181 +11 +11 +9 +10 +11 +11 +12 +181 +181 +179 +183 +182 +182 +182 +182 +185 +182 +181 +182 +181 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +181 +12 +11 +11 +9 +12 +11 +10 +182 +182 +182 +182 +182 +182 +180 +183 +182 +183 +181 +184 +182 +182 +182 +183 +184 +182 +181 +183 +183 +181 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +11 +11 +11 +11 +11 +11 +10 +180 +179 +182 +182 +182 +183 +182 +183 +182 +181 +182 +183 +182 +182 +181 +182 +182 +182 +183 +183 +182 +182 +182 +180 +180 +12 +10 +12 +12 +11 +11 +11 +181 +183 +182 +182 +182 +184 +182 +182 +182 +183 +182 +181 +182 +181 +182 +183 +182 +183 +181 +182 +181 +13 +9 +181 +181 +186 +182 +182 +182 +184 +183 +181 +182 +180 +184 +183 +182 +182 +182 +183 +186 +182 +182 +182 +182 +183 +181 +181 +12 +13 +11 +10 +10 +10 +10 +183 +182 +181 +182 +182 +181 +181 +182 +182 +182 +182 +181 +182 +182 +183 +184 +181 +181 +183 +183 +182 +181 +185 +182 +183 +12 +10 +8 +10 +10 +10 +10 +180 +183 +182 +182 +181 +183 +181 +181 +182 +183 +181 +181 +182 +183 +182 +182 +182 +183 +181 +181 +183 +183 +183 +181 +182 +12 +11 +10 +10 +10 +11 +11 +181 +182 +183 +182 +182 +182 +182 +183 +182 +182 +182 +183 +181 +181 +183 +183 +184 +181 +182 +182 +182 +182 +182 +181 +182 +12 +10 +10 +10 +11 +10 +8 +180 +182 +183 +182 +181 +182 +183 +184 +182 +181 +182 +182 +183 +181 +181 +183 +185 +182 +183 +183 +182 +183 +183 +182 +181 +12 +11 +9 +9 +10 +11 +11 +181 +182 +182 +182 +182 +179 +180 +182 +182 +182 +183 +182 +182 +182 +182 +181 +182 +183 +184 +182 +182 +182 +182 +182 +183 +11 +11 +11 +10 +11 +12 +13 +181 +182 +182 +184 +182 +183 +182 +181 +184 +183 +182 +182 +182 +182 +182 +182 +181 +181 +183 +183 +182 +183 +183 +182 +182 +12 +10 +11 +11 +12 +12 +11 +182 +182 +182 +183 +182 +181 +183 +183 +182 +181 +182 +182 +182 +182 +182 +183 +182 +182 +182 +183 +183 +181 +181 +182 +183 +12 +9 +10 +11 +13 +10 +10 +182 +183 +184 +183 +182 +181 +182 +183 +182 +182 +182 +182 +183 +183 +182 +182 +182 +184 +180 +181 +182 +184 +182 +181 +182 +13 +11 +11 +11 +11 +10 +10 +181 +184 +14 +11 +11 +11 +10 +10 +11 +183 +182 +182 +182 +181 +183 +182 +183 +183 +183 +183 +182 +182 +182 +182 +182 +177 +183 +182 +182 +182 +182 +182 +182 +182 +12 +10 +11 +11 +11 +12 +11 +182 +182 +181 +183 +182 +183 +183 +182 +183 +180 +182 +183 +182 +181 +182 +184 +182 +181 +182 +180 +182 +182 +182 +183 +181 +11 +10 +11 +10 +10 +11 +11 +182 +180 +182 +182 +182 +181 +182 +180 +179 +181 +182 +183 +180 +182 +182 +182 +11 +11 +11 +10 +11 +10 +11 +182 +183 +182 +181 +181 +182 +182 +183 +184 +182 +182 +182 +181 +182 +182 +183 +184 +184 +183 +182 +183 +182 +183 +182 +182 +12 +11 +10 +9 +8 +13 +10 +183 +184 +182 +183 +182 +180 +182 +182 +183 +185 +182 +182 +182 +182 +182 +180 +180 +181 +182 +183 +183 +182 +182 +184 +181 +13 +11 +13 +11 +12 +10 +9 +182 +181 +182 +182 +182 +182 +183 +182 +183 +183 +182 +182 +181 +181 +183 +182 +185 +183 +184 +182 +182 +185 +182 +183 +181 +13 +9 +11 +10 +11 +10 +11 +183 +182 +182 +183 +183 +182 +181 +183 +182 +182 +182 +182 +183 +183 +183 +182 +176 +183 +182 +183 +182 +182 +182 +182 +183 +11 +10 +11 +12 +10 +10 +12 +181 +182 +183 +182 +182 +184 +182 +182 +182 +182 +182 +182 +182 +183 +183 +183 +182 +182 +182 +182 +182 +183 +182 +182 +182 +11 +9 +11 +12 +10 +12 +10 +182 +182 +181 +182 +182 +182 +182 +182 +183 +182 +182 +181 +182 +183 +183 +184 +183 +182 +182 +181 +181 +182 +182 +185 +184 +13 +10 +11 +11 +9 +12 +11 +182 +183 +181 +180 +182 +182 +183 +184 +182 +183 +181 +181 +182 +182 +182 +182 +183 +182 +182 +182 +182 +182 +183 +182 +180 +12 +10 +11 +12 +11 +11 +10 +181 +182 +182 +182 +183 +184 +182 +184 +181 +182 +183 +182 +182 +183 +183 +182 +182 +182 +181 +181 +182 +185 +183 +183 +185 +12 +11 +10 +10 +11 +11 +11 +182 +183 +182 +182 +182 +182 +180 +182 +183 +183 +181 +180 +181 +182 +183 +183 +183 +182 +182 +181 +182 +183 +183 +184 +183 +182 +182 +181 +180 +180 +183 +183 +183 +183 +12 +11 +11 +11 +12 +11 +12 +182 +182 +181 +182 +183 +182 +183 +182 +182 +184 +183 +183 +183 +181 +182 +181 +182 +183 +182 +181 +182 +182 +182 +182 +184 +13 +12 +10 +11 +9 +8 +11 +182 +183 +183 +182 +183 +182 +181 +182 +182 +183 +182 +182 +182 +182 +182 +184 +180 +181 +182 +183 +183 +182 +182 +182 +183 +13 +10 +10 +10 +9 +11 +10 +182 +182 +183 +182 +182 +182 +181 +180 +176 +183 +182 +182 +183 +181 +183 +183 +11 +11 +10 +11 +10 +10 +12 +183 +182 +182 +182 +180 +183 +181 +182 +184 +183 +179 +182 +181 +183 +183 +183 +182 +183 +182 +183 +182 +182 +180 +182 +182 +11 +10 +10 +11 +13 +11 +10 +183 +181 +182 +182 +183 +183 +182 +183 +185 +182 +183 +183 +183 +182 +182 +181 +179 +182 +182 +184 +183 +181 +183 +184 +180 +13 +9 +9 +10 +11 +10 +9 +182 +181 +182 +182 +184 +182 +183 +181 +183 +182 +181 +181 +181 +183 +184 +183 +183 +182 +181 +182 +182 +182 +183 +181 +182 +14 +10 +10 +8 +10 +10 +10 +181 +180 +183 +182 +183 +184 +182 +183 +182 +182 +181 +183 +183 +183 +182 +182 +182 +182 +182 +182 +178 +181 +182 +183 +181 +11 +11 +10 +10 +10 +10 +12 +183 +182 +182 +182 +181 +181 +182 +182 +184 +183 +182 +182 +182 +183 +183 +182 +182 +182 +181 +180 +180 +182 +182 +182 +182 +11 +10 +11 +11 +10 +9 +10 +182 +183 +182 +182 +182 +182 +182 +182 +180 +183 +182 +183 +183 +182 +182 +183 +182 +180 +182 +182 +183 +183 +184 +183 +184 +11 +10 +10 +10 +10 +10 +12 +183 +182 +183 +182 +181 +182 +182 +181 +182 +182 +182 +182 +183 +181 +182 +183 +182 +186 +184 +182 +183 +182 +185 +183 +182 +10 +10 +9 +10 +10 +11 +12 +183 +183 +182 +182 +181 +181 +182 +183 +185 +183 +182 +182 +183 +182 +183 +180 +181 +182 +182 +183 +182 +182 +182 +181 +182 +12 +11 +11 +9 +8 +10 +10 +182 +184 +182 +182 +182 +182 +182 +183 +183 +182 +182 +182 +181 +182 +182 +183 +183 +183 +183 +183 +182 +181 +182 +182 +180 +182 +183 +183 +184 +183 +183 +182 +182 +181 +12 +10 +11 +11 +10 +10 +11 +183 +182 +179 +183 +181 +182 +183 +181 +183 +182 +182 +182 +182 +182 +181 +182 +182 +182 +183 +182 +182 +182 +183 +184 +179 +13 +10 +10 +11 +10 +11 +10 +182 +182 +181 +182 +182 +182 +183 +182 +183 +183 +182 +182 +183 +183 +182 +182 +182 +182 +182 +181 +183 +181 +183 +183 +181 +10 +10 +10 +182 +183 +182 +183 +181 +182 +187 +182 +183 +183 +182 +181 +182 +181 +182 +182 +183 +183 +182 +182 +10 +11 +11 +10 +10 +10 +11 +182 +182 +182 +182 +183 +182 +182 +181 +181 +183 +183 +183 +182 +180 +180 +180 +182 +182 +182 +182 +182 +183 +184 +182 +183 +10 +9 +9 +10 +10 +12 +11 +183 +183 +181 +182 +181 +182 +182 +182 +182 +182 +183 +182 +182 +184 +182 +182 +182 +182 +182 +182 +182 +182 +181 +181 +182 +11 +10 +10 +11 +11 +10 +10 +182 +182 +182 +182 +182 +181 +181 +183 +182 +183 +183 +182 +181 +182 +182 +182 +181 +180 +182 +182 +183 +181 +181 +181 +183 +12 +11 +10 +11 +10 +11 +11 +182 +182 +183 +182 +182 +183 +181 +182 +182 +181 +182 +182 +183 +183 +182 +183 +177 +183 +182 +182 +181 +182 +182 +182 +183 +12 +10 +11 +10 +10 +12 +11 +186 +183 +183 +183 +185 +183 +186 +182 +181 +182 +182 +182 +183 +182 +182 +182 +182 +182 +182 +182 +183 +181 +182 +182 +182 +13 +13 +11 +11 +12 +10 +12 +181 +182 +182 +182 +182 +181 +181 +182 +182 +183 +182 +183 +184 +182 +184 +182 +182 +182 +183 +183 +184 +182 +181 +182 +182 +12 +10 +11 +11 +11 +10 +10 +182 +181 +181 +182 +182 +183 +184 +184 +182 +184 +181 +182 +182 +182 +183 +182 +182 +183 +182 +182 +182 +183 +182 +183 +182 +11 +11 +10 +10 +11 +10 +11 +184 +183 +184 +182 +182 +181 +181 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +183 +182 +183 +184 +184 +182 +179 +11 +10 +9 +12 +10 +11 +11 +184 +182 +182 +182 +183 +182 +181 +11 +9 +182 +183 +184 +183 +182 +182 +182 +183 +184 +182 +184 +182 +183 +182 +182 +183 +182 +183 +183 +182 +182 +182 +182 +182 +182 +13 +10 +10 +12 +10 +11 +12 +183 +182 +182 +182 +181 +182 +182 +182 +184 +184 +184 +183 +183 +181 +182 +182 +181 +182 +181 +182 +182 +183 +183 +183 +182 +11 +7 +9 +9 +10 +10 +11 +183 +183 +182 +182 +183 +183 +182 +184 +182 +181 +182 +183 +182 +181 +182 +182 +183 +182 +183 +9 +11 +11 +11 +183 +182 +182 +182 +182 +182 +184 +182 +179 +182 +182 +181 +182 +182 +183 +184 +182 +181 +182 +178 +181 +183 +182 +184 +182 +12 +11 +11 +10 +11 +11 +11 +182 +183 +182 +182 +179 +181 +183 +188 +183 +183 +182 +182 +181 +181 +182 +182 +184 +184 +184 +182 +181 +182 +183 +182 +181 +11 +9 +10 +9 +12 +11 +13 +183 +183 +181 +182 +182 +181 +182 +182 +181 +183 +182 +181 +181 +182 +182 +183 +182 +181 +182 +182 +183 +183 +182 +179 +182 +11 +11 +11 +10 +12 +12 +11 +184 +182 +182 +182 +182 +182 +183 +182 +181 +180 +182 +182 +182 +183 +182 +184 +183 +182 +182 +181 +182 +182 +182 +182 +182 +12 +10 +10 +10 +10 +11 +10 +182 +181 +182 +181 +182 +182 +182 +183 +183 +183 +183 +182 +180 +180 +182 +183 +183 +182 +182 +182 +182 +182 +181 +183 +183 +13 +12 +10 +9 +10 +10 +9 +181 +182 +182 +183 +185 +182 +182 +178 +182 +182 +181 +182 +182 +182 +182 +182 +183 +184 +182 +182 +182 +181 +182 +182 +182 +13 +11 +11 +13 +10 +12 +10 +182 +183 +181 +182 +183 +182 +178 +180 +182 +183 +183 +180 +182 +182 +181 +182 +181 +183 +182 +184 +182 +182 +182 +182 +182 +12 +9 +11 +10 +11 +11 +12 +182 +180 +182 +181 +182 +183 +182 +183 +183 +179 +182 +182 +182 +182 +183 +183 +185 +183 +183 +182 +183 +182 +182 +182 +184 +12 +12 +11 +10 +10 +10 +9 +183 +182 +183 +182 +182 +181 +182 +181 +182 +182 +184 +183 +182 +182 +182 +181 +183 +182 +182 +181 +181 +183 +181 +183 +183 +13 +10 +10 +10 +10 +183 +184 +183 +183 +11 +12 +10 +9 +10 +9 +9 +182 +183 +183 +182 +182 +182 +182 +183 +182 +182 +183 +182 +182 +182 +182 +181 +182 +183 +183 +182 +182 +183 +182 +180 +183 +11 +10 +10 +10 +10 +10 +11 +182 +183 +179 +181 +181 +182 +181 +176 +183 +183 +183 +183 +181 +182 +182 +182 +181 +184 +182 +182 +183 +183 +185 +182 +182 +12 +11 +10 +10 +10 +11 +9 +181 +182 +182 +185 +183 +183 +182 +180 +182 +182 +182 +181 +182 +182 +183 +184 +13 +11 +15 +12 +10 +11 +10 +181 +182 +183 +182 +183 +182 +183 +183 +183 +183 +182 +182 +182 +181 +183 +183 +183 +182 +182 +182 +182 +182 +183 +183 +182 +11 +11 +11 +10 +11 +11 +11 +184 +181 +183 +182 +182 +182 +183 +182 +183 +182 +183 +180 +180 +182 +182 +183 +186 +182 +181 +182 +182 +187 +182 +181 +182 +11 +14 +12 +10 +10 +11 +10 +182 +182 +182 +182 +183 +182 +183 +183 +182 +182 +180 +182 +182 +182 +182 +182 +184 +182 +183 +183 +182 +182 +182 +182 +183 +12 +10 +10 +10 +10 +9 +10 +182 +181 +180 +182 +183 +182 +182 +183 +182 +182 +184 +182 +183 +182 +181 +181 +183 +182 +182 +182 +183 +183 +181 +180 +181 +14 +9 +11 +11 +11 +13 +11 +183 +182 +184 +182 +182 +182 +180 +182 +182 +183 +183 +182 +182 +180 +182 +183 +182 +183 +183 +182 +182 +182 +182 +181 +182 +10 +11 +12 +11 +11 +10 +11 +182 +182 +183 +184 +182 +185 +184 +182 +182 +181 +183 +182 +182 +182 +182 +182 +181 +183 +182 +183 +183 +183 +183 +182 +182 +11 +10 +11 +10 +11 +11 +11 +184 +182 +184 +182 +182 +182 +181 +181 +181 +182 +182 +182 +182 +183 +182 +183 +183 +183 +183 +182 +182 +182 +180 +180 +182 +13 +12 +11 +11 +11 +12 +9 +182 +181 +182 +182 +182 +183 +182 +182 +183 +182 +183 +181 +181 +182 +181 +182 +182 +182 +181 +182 +186 +183 +181 +183 +182 +12 +11 +10 +11 +11 +11 +11 +182 +183 +182 +183 +182 +181 +182 +182 +180 +181 +182 +181 +181 +182 +183 +182 +183 +183 +182 +182 +181 +183 +182 +182 +182 +182 +183 +183 +182 +184 +182 +183 +182 +181 +12 +11 +10 +12 +10 +11 +11 +182 +183 +183 +180 +183 +182 +182 +182 +182 +183 +182 +182 +181 +182 +182 +182 +184 +183 +184 +183 +183 +181 +182 +182 +180 +12 +9 +11 +11 +11 +11 +10 +183 +182 +182 +180 +180 +182 +183 +184 +183 +182 +183 +181 +180 +182 +182 +182 +182 +182 +182 +183 +180 +181 +181 +183 +183 +11 +11 +10 +10 +10 +9 +11 +182 +183 +183 +182 +181 +182 +181 +183 +181 +183 +182 +183 +183 +184 +182 +184 +12 +9 +11 +9 +10 +11 +12 +182 +182 +181 +182 +182 +181 +181 +182 +183 +183 +183 +182 +183 +182 +181 +182 +183 +182 +181 +181 +182 +182 +181 +180 +181 +11 +10 +11 +10 +11 +13 +10 +182 +182 +183 +183 +183 +181 +181 +182 +180 +181 +181 +182 +184 +184 +183 +183 +182 +182 +181 +182 +183 +182 +183 +183 +183 +12 +10 +12 +11 +10 +11 +11 +182 +183 +182 +181 +182 +180 +180 +182 +182 +183 +184 +182 +181 +182 +182 +182 +183 +181 +183 +183 +182 +182 +184 +182 +182 +12 +11 +13 +11 +10 +10 +9 +181 +182 +182 +182 +182 +184 +182 +182 +182 +182 +183 +181 +182 +181 +183 +182 +183 +183 +182 +182 +184 +182 +181 +181 +182 +12 +11 +10 +11 +10 +10 +10 +182 +182 +182 +182 +183 +182 +184 +182 +181 +182 +181 +182 +183 +182 +183 +182 +183 +180 +180 +182 +183 +182 +182 +182 +181 +9 +11 +11 +10 +10 +10 +11 +182 +182 +183 +182 +182 +183 +181 +181 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +181 +182 +182 +182 +183 +183 +183 +10 +8 +11 +10 +11 +12 +11 +183 +183 +182 +182 +181 +182 +182 +182 +182 +182 +183 +183 +183 +184 +182 +185 +182 +181 +182 +182 +183 +183 +184 +182 +183 +11 +10 +10 +11 +11 +10 +8 +180 +183 +183 +183 +183 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +183 +182 +12 +11 +11 +11 +11 +8 +9 +183 +182 +182 +182 +182 +181 +182 +182 +181 +183 +183 +183 +184 +183 +183 +185 +182 +181 +181 +182 +183 +182 +182 +182 +183 +180 +182 +181 +183 +182 +182 +183 +182 +182 +12 +10 +11 +10 +10 +11 +11 +182 +183 +182 +182 +182 +182 +182 +182 +182 +183 +184 +182 +184 +181 +182 +182 +181 +183 +182 +183 +184 +182 +182 +182 +181 +11 +10 +11 +11 +11 +10 +9 +182 +182 +182 +182 +182 +182 +183 +182 +182 +181 +182 +182 +182 +182 +181 +181 +181 +182 +183 +181 +182 +183 +182 +182 +181 +12 +183 +185 +182 +181 +182 +181 +182 +183 +183 +183 +183 +182 +181 +183 +183 +182 +184 +183 +183 +182 +182 +183 +12 +11 +11 +11 +12 +9 +11 +182 +183 +179 +183 +182 +183 +182 +184 +184 +183 +183 +182 +181 +183 +182 +182 +184 +183 +185 +181 +182 +182 +183 +185 +182 +11 +11 +11 +14 +11 +11 +10 +182 +185 +183 +181 +184 +182 +182 +181 +181 +182 +182 +182 +184 +182 +182 +183 +183 +183 +183 +182 +182 +183 +182 +182 +181 +11 +10 +11 +12 +12 +11 +10 +182 +181 +182 +182 +182 +183 +182 +183 +182 +181 +183 +182 +183 +182 +182 +182 +182 +182 +182 +180 +181 +182 +182 +184 +183 +12 +12 +11 +11 +10 +11 +10 +182 +182 +181 +182 +183 +183 +182 +184 +184 +183 +182 +181 +181 +181 +183 +182 +183 +179 +182 +184 +183 +180 +182 +181 +181 +13 +11 +11 +10 +10 +9 +11 +182 +182 +183 +181 +183 +182 +181 +182 +184 +182 +183 +182 +182 +184 +182 +182 +181 +184 +183 +184 +183 +182 +182 +182 +182 +11 +10 +10 +10 +10 +11 +10 +184 +183 +182 +182 +181 +181 +182 +182 +183 +183 +184 +182 +182 +182 +183 +182 +182 +182 +181 +181 +181 +183 +183 +183 +183 +12 +10 +10 +10 +11 +10 +12 +182 +184 +181 +182 +182 +182 +182 +183 +181 +179 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +183 +183 +183 +184 +12 +12 +11 +10 +11 +11 +11 +183 +182 +182 +183 +182 +182 +180 +182 +183 +183 +182 +181 +182 +182 +183 +182 +181 +183 +182 +183 +182 +183 +183 +182 +183 +12 +11 +11 +10 +10 +10 +10 +182 +182 +182 +11 +10 +8 +11 +10 +10 +183 +182 +183 +183 +183 +182 +182 +181 +181 +182 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +11 +9 +10 +11 +12 +12 +11 +183 +182 +182 +182 +184 +182 +182 +182 +182 +182 +181 +182 +182 +180 +186 +182 +183 +183 +183 +181 +182 +181 +182 +182 +181 +14 +10 +12 +11 +14 +11 +10 +182 +182 +182 +180 +182 +181 +180 +182 +182 +183 +182 +182 +182 +181 +182 +183 +183 +11 +11 +11 +10 +10 +10 +183 +182 +182 +181 +183 +184 +181 +182 +181 +182 +184 +182 +182 +181 +182 +179 +182 +181 +179 +182 +187 +182 +181 +182 +182 +8 +10 +9 +11 +10 +10 +9 +182 +182 +185 +182 +181 +181 +181 +183 +182 +183 +182 +183 +183 +180 +179 +182 +181 +182 +182 +183 +182 +183 +182 +182 +182 +12 +11 +11 +10 +10 +10 +10 +179 +179 +181 +182 +182 +181 +182 +182 +183 +184 +184 +184 +183 +182 +182 +181 +182 +181 +182 +183 +182 +182 +183 +182 +182 +11 +9 +11 +11 +10 +12 +11 +182 +182 +181 +181 +182 +182 +182 +181 +182 +182 +184 +184 +182 +182 +182 +182 +180 +182 +182 +182 +182 +182 +182 +182 +183 +11 +10 +9 +11 +11 +11 +12 +183 +183 +181 +181 +182 +183 +182 +182 +181 +181 +182 +182 +182 +183 +182 +184 +183 +182 +181 +182 +180 +181 +181 +182 +183 +14 +12 +10 +10 +11 +10 +12 +183 +183 +182 +182 +182 +183 +182 +182 +183 +183 +181 +180 +182 +182 +182 +183 +183 +183 +183 +181 +183 +182 +182 +182 +183 +11 +10 +10 +10 +11 +10 +10 +183 +183 +181 +183 +182 +180 +181 +182 +182 +183 +183 +182 +182 +182 +182 +183 +183 +182 +182 +183 +182 +182 +183 +182 +181 +11 +9 +10 +11 +11 +12 +12 +182 +182 +181 +181 +183 +182 +182 +183 +181 +181 +181 +182 +183 +183 +183 +182 +182 +181 +183 +182 +182 +183 +183 +182 +183 +12 +10 +11 +11 +11 +11 +10 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +184 +183 +184 +183 +182 +182 +181 +183 +182 +12 +182 +182 +183 +182 +182 +182 +183 +183 +11 +11 +11 +9 +11 +10 +11 +181 +180 +182 +181 +181 +183 +182 +182 +182 +183 +182 +182 +182 +182 +182 +181 +183 +182 +183 +182 +182 +182 +182 +183 +183 +13 +11 +10 +10 +8 +9 +11 +182 +183 +183 +182 +182 +183 +182 +181 +182 +181 +182 +183 +183 +183 +182 +182 +181 +182 +182 +182 +183 +179 +183 +183 +182 +12 +10 +10 +10 +10 +10 +10 +182 +182 +182 +182 +183 +181 +182 +182 +182 +185 +182 +182 +183 +182 +183 +183 +13 +12 +10 +11 +10 +9 +11 +182 +183 +184 +184 +182 +183 +182 +183 +181 +182 +183 +183 +182 +182 +183 +183 +182 +182 +183 +181 +182 +182 +181 +182 +183 +12 +12 +10 +12 +11 +10 +11 +181 +183 +183 +183 +184 +182 +183 +184 +182 +184 +181 +181 +182 +182 +183 +181 +183 +184 +182 +182 +182 +182 +183 +181 +182 +11 +12 +11 +11 +10 +20 +9 +182 +182 +182 +182 +183 +182 +182 +182 +186 +181 +182 +182 +181 +180 +182 +183 +182 +181 +183 +182 +182 +182 +182 +181 +181 +11 +11 +14 +11 +13 +11 +11 +182 +181 +183 +183 +183 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +185 +183 +181 +180 +182 +182 +11 +12 +10 +11 +11 +10 +10 +182 +183 +183 +183 +182 +182 +182 +182 +182 +183 +182 +182 +180 +181 +183 +182 +184 +183 +182 +182 +181 +181 +182 +182 +183 +12 +11 +11 +11 +11 +11 +7 +182 +182 +183 +182 +182 +183 +183 +183 +183 +182 +181 +182 +181 +182 +183 +184 +182 +183 +182 +182 +182 +182 +182 +180 +182 +10 +10 +10 +9 +12 +10 +11 +183 +183 +182 +183 +182 +181 +182 +182 +182 +181 +183 +183 +182 +182 +182 +182 +183 +183 +180 +182 +182 +182 +182 +182 +182 +12 +8 +10 +10 +10 +11 +10 +183 +184 +183 +184 +182 +183 +183 +180 +183 +183 +182 +181 +180 +180 +182 +182 +184 +184 +182 +182 +180 +182 +182 +182 +182 +10 +11 +11 +11 +10 +9 +10 +182 +181 +180 +185 +182 +181 +182 +182 +181 +183 +183 +182 +182 +182 +181 +182 +182 +183 +182 +181 +180 +180 +182 +183 +184 +182 +183 +182 +182 +183 +182 +182 +182 +182 +11 +11 +11 +11 +11 +11 +10 +182 +182 +182 +182 +182 +182 +181 +182 +182 +182 +183 +182 +182 +182 +182 +183 +183 +184 +183 +184 +182 +183 +181 +182 +181 +10 +11 +10 +8 +13 +11 +11 +182 +181 +181 +181 +182 +182 +182 +183 +181 +182 +182 +182 +180 +183 +182 +182 +183 +184 +181 +182 +182 +182 +180 +183 +182 +13 +12 +11 +10 +13 +10 +11 +181 +184 +183 +182 +183 +182 +181 +180 +179 +182 +182 +184 +182 +182 +181 +183 +13 +10 +10 +10 +11 +8 +12 +182 +182 +182 +182 +182 +182 +182 +182 +181 +182 +182 +181 +182 +182 +182 +182 +183 +181 +181 +183 +182 +183 +183 +182 +182 +17 +10 +12 +10 +9 +10 +11 +182 +183 +181 +182 +182 +182 +182 +182 +182 +183 +184 +182 +183 +181 +181 +183 +182 +183 +183 +183 +183 +182 +182 +182 +182 +12 +9 +11 +11 +10 +10 +10 +182 +183 +183 +184 +182 +180 +182 +182 +183 +181 +183 +182 +183 +184 +182 +182 +182 +182 +183 +182 +182 +182 +182 +181 +183 +12 +11 +11 +10 +11 +10 +11 +183 +182 +182 +182 +182 +182 +182 +183 +181 +182 +183 +182 +182 +182 +183 +182 +182 +183 +184 +182 +182 +182 +181 +182 +183 +12 +11 +12 +10 +12 +10 +11 +182 +181 +183 +182 +182 +182 +182 +183 +181 +181 +182 +182 +183 +182 +184 +182 +183 +182 +182 +184 +182 +182 +182 +183 +183 +12 +12 +9 +11 +11 +11 +14 +182 +184 +184 +182 +182 +181 +181 +182 +182 +183 +184 +184 +183 +183 +181 +183 +182 +181 +183 +181 +183 +182 +182 +183 +182 +11 +11 +11 +12 +12 +10 +10 +182 +182 +183 +182 +183 +182 +181 +182 +181 +183 +183 +182 +180 +181 +182 +182 +183 +184 +182 +184 +182 +182 +179 +181 +182 +12 +12 +11 +11 +11 +10 +10 +181 +181 +183 +182 +182 +182 +182 +182 +184 +182 +183 +182 +180 +182 +182 +183 +182 +182 +182 +182 +182 +181 +181 +182 +181 +12 +14 +12 +11 +11 +11 +11 +182 +182 +182 +183 +181 +182 +178 +182 +10 +182 +185 +182 +183 +183 +181 +183 +182 +182 +183 +182 +181 +183 +182 +181 +182 +181 +182 +184 +183 +182 +182 +182 +182 +182 +12 +11 +11 +10 +10 +11 +10 +181 +186 +181 +183 +185 +183 +183 +182 +180 +182 +182 +181 +182 +182 +181 +182 +183 +183 +182 +182 +182 +181 +181 +181 +183 +13 +11 +11 +10 +11 +9 +8 +182 +181 +182 +184 +183 +182 +182 +182 +182 +182 +182 +182 +182 +181 +179 +182 +182 +179 +182 +182 +181 +182 +184 +181 +182 +182 +183 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +183 +183 +182 +183 +183 +184 +183 +182 +182 +182 +182 +13 +10 +10 +11 +10 +10 +10 +182 +183 +184 +182 +183 +181 +181 +182 +181 +183 +182 +182 +183 +183 +182 +183 +182 +181 +183 +181 +182 +183 +182 +184 +182 +12 +11 +10 +10 +9 +11 +10 +182 +184 +181 +180 +182 +182 +181 +182 +181 +182 +182 +183 +183 +182 +182 +182 +183 +182 +183 +182 +183 +182 +182 +182 +181 +10 +11 +11 +10 +11 +11 +11 +182 +181 +183 +182 +183 +182 +182 +183 +182 +182 +182 +182 +183 +182 +182 +181 +180 +182 +181 +182 +182 +181 +182 +182 +183 +12 +11 +10 +10 +10 +11 +10 +181 +182 +181 +182 +182 +183 +183 +182 +183 +183 +182 +181 +182 +182 +182 +185 +183 +184 +183 +183 +182 +182 +180 +183 +182 +11 +11 +10 +11 +12 +11 +10 +182 +181 +182 +182 +182 +182 +182 +182 +183 +182 +182 +182 +183 +182 +184 +181 +182 +182 +181 +183 +182 +184 +183 +180 +183 +11 +11 +11 +9 +11 +10 +13 +183 +182 +181 +181 +179 +182 +183 +183 +183 +179 +182 +184 +182 +181 +183 +181 +183 +183 +183 +177 +183 +182 +182 +183 +184 +12 +11 +11 +10 +13 +10 +12 +182 +183 +181 +181 +184 +182 +181 +185 +181 +183 +183 +183 +181 +182 +182 +183 +183 +187 +181 +182 +183 +182 +186 +182 +183 +13 +10 +7 +10 +12 +11 +8 +178 +183 +182 +184 +183 +181 +182 +182 +182 +178 +182 +183 +182 +183 +182 +182 +182 +181 +183 +181 +184 +183 +182 +182 +182 +12 +9 +10 +9 +10 +11 +183 +183 +185 +13 +9 +8 +11 +6 +11 +11 +184 +183 +180 +182 +182 +182 +182 +183 +182 +183 +183 +179 +182 +182 +182 +182 +182 +182 +182 +183 +183 +181 +182 +183 +178 +10 +9 +11 +11 +12 +12 +10 +183 +181 +181 +183 +182 +184 +183 +184 +184 +182 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +183 +183 +182 +181 +182 +11 +10 +11 +9 +11 +11 +10 +182 +182 +183 +181 +183 +182 +182 +183 +182 +182 +182 +182 +183 +183 +183 +182 +11 +10 +11 +11 +11 +11 +11 +182 +183 +181 +182 +182 +181 +181 +182 +181 +183 +183 +183 +182 +182 +182 +184 +183 +182 +182 +183 +182 +182 +182 +182 +182 +11 +10 +12 +11 +10 +9 +10 +182 +183 +183 +181 +182 +182 +182 +182 +183 +182 +185 +182 +184 +183 +182 +182 +182 +181 +181 +182 +182 +183 +183 +184 +183 +13 +9 +10 +10 +10 +11 +11 +181 +183 +183 +182 +189 +182 +183 +182 +182 +182 +183 +182 +182 +183 +183 +183 +181 +181 +183 +182 +182 +183 +182 +182 +182 +12 +10 +10 +11 +10 +10 +10 +185 +182 +183 +183 +182 +186 +181 +180 +182 +181 +180 +184 +182 +183 +182 +184 +182 +182 +182 +182 +184 +183 +182 +182 +182 +11 +11 +11 +11 +12 +10 +12 +182 +182 +181 +181 +183 +183 +183 +183 +182 +183 +181 +181 +183 +182 +182 +182 +184 +183 +184 +183 +184 +183 +184 +182 +181 +12 +9 +11 +12 +11 +10 +8 +182 +183 +183 +183 +184 +182 +182 +182 +181 +183 +183 +182 +183 +183 +182 +183 +183 +182 +182 +182 +182 +182 +182 +182 +183 +12 +10 +11 +11 +8 +11 +10 +181 +181 +182 +183 +182 +183 +183 +183 +182 +181 +182 +183 +183 +183 +182 +182 +182 +182 +182 +181 +181 +183 +182 +182 +181 +13 +10 +11 +10 +9 +11 +10 +183 +183 +182 +183 +182 +182 +182 +182 +182 +182 +183 +183 +183 +182 +182 +182 +182 +184 +182 +182 +184 +182 +184 +182 +181 +11 +11 +11 +10 +11 +11 +10 +182 +183 +182 +184 +182 +182 +182 +182 +181 +180 +183 +183 +183 +183 +183 +182 +182 +182 +181 +179 +182 +182 +183 +182 +182 +182 +181 +182 +182 +182 +183 +184 +183 +184 +12 +10 +10 +10 +10 +10 +10 +181 +182 +182 +182 +182 +182 +182 +182 +183 +184 +180 +183 +181 +181 +182 +182 +183 +183 +182 +182 +181 +182 +182 +181 +182 +11 +10 +10 +11 +11 +12 +10 +184 +182 +181 +181 +181 +182 +184 +183 +183 +182 +182 +181 +182 +183 +182 +182 +184 +184 +183 +182 +182 +181 +182 +182 +182 +11 +11 +11 +11 +12 +11 +9 +183 +181 +182 +182 +183 +182 +185 +183 +183 +182 +181 +182 +182 +183 +183 +182 +12 +9 +10 +11 +11 +11 +12 +183 +182 +180 +183 +183 +183 +183 +182 +182 +181 +182 +182 +182 +182 +182 +183 +182 +179 +183 +182 +182 +182 +182 +182 +184 +12 +11 +12 +11 +12 +10 +11 +183 +182 +183 +183 +182 +182 +182 +183 +180 +183 +180 +185 +182 +183 +182 +182 +183 +182 +183 +182 +183 +183 +185 +183 +184 +12 +10 +10 +10 +11 +11 +12 +183 +182 +182 +181 +182 +181 +183 +182 +182 +182 +184 +180 +182 +182 +183 +183 +182 +183 +181 +181 +183 +182 +183 +182 +180 +12 +10 +8 +9 +11 +11 +11 +183 +181 +182 +181 +183 +183 +182 +183 +182 +182 +183 +182 +183 +183 +182 +182 +183 +184 +183 +184 +181 +183 +182 +182 +183 +12 +10 +9 +10 +10 +10 +12 +183 +183 +183 +181 +181 +181 +182 +183 +183 +183 +185 +182 +183 +182 +182 +182 +183 +181 +180 +182 +182 +181 +182 +182 +182 +12 +11 +10 +11 +11 +11 +12 +182 +183 +182 +182 +182 +182 +182 +182 +183 +182 +181 +182 +184 +182 +183 +181 +181 +182 +180 +183 +183 +183 +183 +182 +183 +9 +8 +11 +10 +11 +10 +11 +182 +181 +182 +182 +183 +182 +183 +182 +182 +182 +183 +184 +182 +182 +182 +182 +182 +181 +182 +182 +184 +182 +182 +182 +183 +13 +12 +11 +10 +10 +11 +10 +185 +183 +184 +183 +184 +182 +184 +182 +182 +182 +181 +182 +182 +182 +182 +182 +181 +182 +182 +182 +182 +182 +182 +182 +182 +12 +11 +11 +12 +11 +11 +10 +182 +182 +182 +182 +183 +182 +182 +182 +182 +180 +182 +182 +182 +183 +182 +183 +182 +182 +182 +182 +182 +182 +182 +184 +183 +184 +185 +183 +184 +182 +181 +181 +181 +183 +12 +11 +10 +12 +11 +10 +10 +182 +182 +181 +182 +182 +182 +181 +185 +182 +182 +183 +182 +183 +182 +182 +182 +181 +180 +182 +182 +183 +182 +183 +183 +182 +14 +10 +11 +10 +9 +11 +10 +182 +183 +183 +183 +182 +181 +183 +182 +182 +182 +182 +183 +182 +182 +182 +181 +182 +182 +182 +182 +181 +182 +183 +183 +183 +11 +10 +9 +9 +182 +183 +183 +181 +181 +183 +182 +182 +183 +183 +183 +183 +182 +182 +181 +182 +182 +182 +182 +12 +11 +10 +8 +10 +10 +10 +183 +182 +182 +182 +183 +182 +182 +182 +183 +182 +183 +186 +181 +184 +182 +181 +181 +181 +183 +183 +183 +182 +183 +182 +182 +12 +11 +10 +11 +11 +10 +10 +180 +183 +183 +181 +181 +182 +182 +182 +181 +182 +183 +183 +184 +183 +183 +182 +182 +183 +182 +182 +182 +182 +182 +182 +182 +12 +10 +11 +8 +9 +11 +11 +182 +184 +182 +183 +185 +182 +182 +182 +182 +179 +181 +183 +182 +183 +182 +183 +182 +182 +181 +183 +182 +183 +183 +183 +183 +11 +10 +8 +8 +10 +10 +11 +182 +183 +183 +182 +181 +181 +182 +182 +183 +181 +184 +183 +183 +183 +182 +182 +174 +180 +182 +182 +183 +183 +183 +183 +183 +11 +10 +11 +10 +10 +11 +10 +181 +182 +182 +183 +182 +182 +183 +181 +181 +182 +182 +182 +183 +183 +182 +182 +182 +181 +182 +181 +182 +181 +183 +183 +183 +12 +11 +10 +9 +11 +11 +11 +183 +183 +182 +181 +181 +182 +182 +183 +182 +182 +183 +183 +183 +182 +182 +181 +182 +182 +181 +182 +180 +183 +183 +181 +181 +12 +10 +10 +10 +10 +10 +11 +182 +183 +182 +183 +182 +182 +181 +181 +182 +183 +183 +183 +183 +182 +183 +183 +181 +182 +182 +183 +183 +182 +182 +182 +182 +12 +11 +11 +11 +11 +9 +11 +182 +183 +183 +185 +183 +184 +182 +181 +184 +181 +183 +183 +182 +183 +182 +182 +183 +182 +184 +182 +182 +183 +182 +183 +185 +12 +12 +10 +11 +11 +9 +11 +181 +183 +186 +183 +10 +11 +11 +11 +11 +182 +182 +182 +182 +182 +182 +182 +182 +182 +182 +180 +180 +182 +182 +186 +183 +182 +182 +182 +182 +183 +182 +182 +182 +183 +11 +9 +10 +9 +10 +10 +11 +182 +182 +182 +182 +183 +183 +182 +182 +182 +182 +182 +181 +182 +183 +182 +183 +182 +179 +182 +181 +181 +183 +182 +181 +182 +12 +11 +10 +9 +10 +10 +11 +182 +182 +182 +182 +183 +182 +183 +183 +182 +180 +182 +182 +184 +183 +183 +182 +183 +181 +181 +183 +11 +11 +12 +183 +182 +182 +181 +181 +183 +183 +182 +182 +179 +183 +183 +181 +183 +182 +182 +182 +182 +183 +184 +185 +185 +184 +182 +181 +12 +11 +11 +11 +11 +10 +10 +181 +183 +181 +180 +182 +182 +183 +184 +182 +183 +182 +181 +183 +181 +182 +184 +183 +182 +183 +181 +183 +183 +183 +182 +182 +13 +13 +11 +11 +11 +9 +10 +182 +182 +184 +182 +183 +184 +182 +183 +182 +182 +182 +185 +182 +183 +182 +182 +182 +182 +182 +180 +179 +182 +183 +184 +183 +12 +11 +10 +10 +11 +11 +10 +183 +184 +182 +183 +181 +182 +183 +182 +182 +183 +182 +183 +181 +181 +182 +181 +183 +182 +182 +183 +181 +180 +181 +182 +182 +12 +11 +10 +9 +11 +11 +10 +182 +184 +182 +183 +181 +182 +182 +182 +181 +182 +181 +185 +182 +182 +183 +184 +180 +184 +182 +181 +182 +183 +183 +183 +182 +11 +11 +11 +11 +14 +10 +11 +182 +181 +182 +180 +183 +182 +183 +182 +182 +182 +182 +183 +183 +183 +182 +183 +182 +181 +182 +182 +184 +184 +183 +185 +181 +11 +9 +9 +12 +11 +11 +12 +182 +183 +182 +182 +183 +181 +182 +182 +182 +182 +185 +182 +183 +181 +180 +183 +182 +183 +183 +182 +181 +182 +185 +182 +182 +14 +12 +11 +11 +10 +8 +11 +183 +182 +183 +183 +181 +182 +182 +181 +182 +183 +183 +184 +182 +182 +182 +182 +183 +182 +183 +183 +182 +182 +182 +181 +182 +12 +13 +12 +12 +10 +9 +11 +183 +182 +183 +182 +182 +182 +183 +182 +182 +182 +183 +183 +183 +182 +183 +184 +182 +182 +181 +183 +182 +182 +183 +181 +180 +12 +10 \ No newline at end of file diff --git a/Old Matlab Interface/USB_CTRL_SEND.c b/Old Matlab Interface/USB_CTRL_SEND.c new file mode 100644 index 00000000..23b6868b --- /dev/null +++ b/Old Matlab Interface/USB_CTRL_SEND.c @@ -0,0 +1,79 @@ +//MATLAB INCLUDES +#include +#include + +//LIBUSBK INCLUDES +#include +#include +#include +#include +#include "libusbk.h" + +//MISC INCLUDES +#include +#include + +#define BUFFERSIZE 256 + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + //Internals + WINUSB_SETUP_PACKET setupPacket; + KUSB_HANDLE handle; + char *HANDLE_CHAR; + char *RequestType_CHAR; + char *Request_CHAR; + char *Value_CHAR; + char *Index_CHAR; + char *Length_CHAR; + unsigned char controlSuccess; + UINT bytesTransferred = 0; + unsigned int n; + + //To Export + unsigned char *controlBuffer; + int dims[2] = {1,BUFFERSIZE}; + unsigned char *out_ptr; + + //Actual functions: + HANDLE_CHAR = mxArrayToString(prhs[0]); + sscanf(HANDLE_CHAR, "%16x", &handle); + + RequestType_CHAR = mxArrayToString(prhs[1]); + sscanf(RequestType_CHAR, "%2x", &setupPacket.RequestType); + + Request_CHAR = mxArrayToString(prhs[2]); + sscanf(Request_CHAR, "%2x", &setupPacket.Request); + + Value_CHAR = mxArrayToString(prhs[3]); + sscanf(Value_CHAR, "%4x", &setupPacket.Value); + + Index_CHAR = mxArrayToString(prhs[4]); + sscanf(Index_CHAR, "%4x", &setupPacket.Index); + + Length_CHAR = mxArrayToString(prhs[5]); + sscanf(Length_CHAR, "%4x", &setupPacket.Length); + + mexPrintf("Value = %d\n", setupPacket.Value); + mexPrintf("Index = %d\n", setupPacket.Index); + mexPrintf("Length = %d\n", setupPacket.Length); + + controlBuffer = mxGetData(prhs[6]); + + mexPrintf("controlBuffer = %d\n", controlBuffer); + + mexPrintf("SENDING CONTROL PACKET\n"); + controlSuccess = UsbK_ControlTransfer(handle, setupPacket, controlBuffer, setupPacket.Length, &bytesTransferred, NULL); + if (controlSuccess) mexPrintf("%d BYTES TRANSFERRED", bytesTransferred); + else mexPrintf("ERROR"); + + out_ptr = mxMalloc(BUFFERSIZE); + for (n=0;n +#include + +//LIBUSBK INCLUDES +#include +#include +#include +#include +#include "libusbk.h" + +//MISC INCLUDES +#include +#include + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + //Interals + KLST_HANDLE deviceList = NULL; + KLST_DEVINFO_HANDLE deviceInfo = NULL; + DWORD ec = ERROR_SUCCESS; + UCHAR pipeIndex = 0; + WINUSB_PIPE_INFORMATION pipeInfo; + ULONG VIDin, PIDin; + ULONG deviceCount = 0; + //To export: + KUSB_HANDLE handle = NULL; + char handle_string[17]; + + char *VID_CHAR, *PID_CHAR; + + VID_CHAR = mxArrayToString(prhs[0]); + PID_CHAR = mxArrayToString(prhs[1]); + + printf("VID=%s\n", VID_CHAR); + printf("PID=%s\n", PID_CHAR); + + sscanf(VID_CHAR, "%4x", &VIDin); + sscanf(PID_CHAR, "%04x", &PIDin); + + //Init device list! + if (!LstK_Init(&deviceList, 0)) { + mexPrintf("Error initializing device list.\n"); + return; + } + + //Check if device list is empty + LstK_Count(deviceList, &deviceCount); + if (!deviceCount) { + mexPrintf("Device list empty.\n"); + LstK_Free(deviceList); // If LstK_Init returns TRUE, the list must be freed. + return; + } + + mexPrintf("Looking for device vid/pid %04X/%04X..\n", VIDin, PIDin); + + //Set device info to the info specified by the INF that belongs to said VID/PID pair + LstK_FindByVidPid(deviceList, VIDin, PIDin, &deviceInfo); + if (deviceInfo){ + mexPrintf("Using %04X:%04X (%s): %s - %s\n", + deviceInfo->Common.Vid, + deviceInfo->Common.Pid, + deviceInfo->Common.InstanceID, + deviceInfo->DeviceDesc, + deviceInfo->Mfg); + } + else { + mexPrintf("Yeah nah kent couldn't find the device aye\n"); + return; + } + + // Initialize the device + if (!UsbK_Init(&handle, deviceInfo)){ + ec = GetLastError(); + mexPrintf("Usb.Init failed. ErrorCode: %08Xh\n", ec); + } + mexPrintf("Device opened successfully!\n"); + + mexPrintf("Pipe Information:\n"); + while (UsbK_QueryPipe(handle, 0, pipeIndex++, &pipeInfo)){ + mexPrintf(" PipeId=0x%02X PipeType=0x%02X Interval=%u MaximumPacketSize=%u\n", + pipeInfo.PipeId, pipeInfo.PipeType, pipeInfo.Interval, pipeInfo.MaximumPacketSize); + } + + + mexPrintf("Handle is %d bytes long\n", sizeof(handle)); + mexPrintf("Handle data is 0x%16x\n\n\n\n\n", handle); + + sprintf(handle_string, "%016x", handle); + + plhs[0] = mxCreateString(handle_string); + + LstK_Free(deviceList); + + return; +} diff --git a/Old Matlab Interface/USB_INIT.mexw64 b/Old Matlab Interface/USB_INIT.mexw64 new file mode 100644 index 00000000..6bc55131 Binary files /dev/null and b/Old Matlab Interface/USB_INIT.mexw64 differ diff --git a/Old Matlab Interface/USB_ISO_INIT.c b/Old Matlab Interface/USB_ISO_INIT.c new file mode 100644 index 00000000..47bf668b --- /dev/null +++ b/Old Matlab Interface/USB_ISO_INIT.c @@ -0,0 +1,68 @@ +//MATLAB INCLUDES +#include +#include + +//LIBUSBK INCLUDES +#include +#include +#include +#include +#include "libusbk.h" + +#define DEBUG_SHOWCTRL 1 +#define MAX_TRANSFER_SIZE 1023 +#define MAX_PENDING_TRANSFERS 16384 +#define MAX_PENDING_IO 16 + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + //Vars: + //Imports + char* HANDLE_CHAR; + KUSB_HANDLE handle = NULL; + unsigned char pipeID = 0x83; + //Internals + unsigned char success; + unsigned int transferred; + DWORD errorCode = ERROR_SUCCESS; + KSTM_HANDLE stm_handle = NULL; + //Exports + char stm_handle_string[17]; + + + //Initialise Data + HANDLE_CHAR = mxArrayToString(prhs[0]); + sscanf(HANDLE_CHAR, "%16x", &handle); + + //Actual Function + success = StmK_Init( + &stm_handle, + handle, + pipeID, + MAX_TRANSFER_SIZE, + MAX_PENDING_TRANSFERS, + MAX_PENDING_IO, + NULL, + KSTM_FLAG_NONE); + if (!success){ + errorCode = GetLastError(); + printf("StmK_Init failed. ErrorCode: %08Xh\n", errorCode); + } + + success = StmK_Start(stm_handle); + if (!success){ + errorCode = GetLastError(); + printf("StmK_Start failed. ErrorCode: %08Xh\n", errorCode); + } + else printf("[Start Stream] successful!\n"); + printf("stm_handle is %d bytes long\n", sizeof(stm_handle)); + printf("Value of stm_handle is 0x%16x\n\n\n\n\n\n", stm_handle); + + + //Export Data + + sprintf(stm_handle_string, "%016x", stm_handle); + plhs[0] = mxCreateString(stm_handle_string); + + return; +} \ No newline at end of file diff --git a/Old Matlab Interface/USB_ISO_INIT.mexw64 b/Old Matlab Interface/USB_ISO_INIT.mexw64 new file mode 100644 index 00000000..4646c4f3 Binary files /dev/null and b/Old Matlab Interface/USB_ISO_INIT.mexw64 differ diff --git a/Old Matlab Interface/USB_ISO_LOOP.c b/Old Matlab Interface/USB_ISO_LOOP.c new file mode 100644 index 00000000..8b63a448 --- /dev/null +++ b/Old Matlab Interface/USB_ISO_LOOP.c @@ -0,0 +1,67 @@ +//MATLAB INCLUDES +#include +#include + +//LIBUSBK INCLUDES +#include +#include +#include +#include +#include "libusbk.h" + +#define DEBUG_SHOWCTRL 1 +#define ISO_PACKETS_TO_READ 30 +#define ISO_PACKET_SIZE 750 +#define HALFBUFFER_SIZE (ISO_PACKETS_TO_READ*ISO_PACKET_SIZE) + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + + //Vars: + //Imports + char *HANDLE_CHAR; + KUSB_HANDLE handle = NULL; + char *stm_handle_string; + KSTM_HANDLE stm_handle = NULL; + unsigned char pipeID = 0x83; + //Internals + unsigned char *tempBuffer; + unsigned char success; + DWORD errorCode = ERROR_SUCCESS; + ULONG length; + unsigned int n; + //Exports + char *transfer_contents; + unsigned int *error_export; + + //Initialise Data + HANDLE_CHAR = mxArrayToString(prhs[0]); + sscanf(HANDLE_CHAR, "%16x", &handle); + + stm_handle_string = mxArrayToString(prhs[1]); + sscanf(stm_handle_string, "%16x", &stm_handle); + + //Actual Function + tempBuffer = mxMalloc(HALFBUFFER_SIZE); + success = StmK_Read(stm_handle, tempBuffer, 0, HALFBUFFER_SIZE, &length); + printf("%d bytes copied, out of a possible %d\n", length, HALFBUFFER_SIZE); + if (!success) { + errorCode = GetLastError(); + printf("StmkK_Read failed. ErrorCode: %08Xh\n", errorCode); + //printf("No more items = %08Xh\n", ERROR_NO_MORE_ITEMS); + } + + //Export Data + transfer_contents = mxMalloc(HALFBUFFER_SIZE); + for (n=0;n +#include + +//LIBUSBK INCLUDES +#include +#include +#include +#include +#include "libusbk.h" + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + //Vars: + //Imports + char* POOL_CHAR; + char* icx0, icx1; + char* HANDLE_CHAR; + KUSB_HANDLE handle = NULL; + PKISO_CONTEXT isoCtx_zero; + PKISO_CONTEXT isoCtx_one; + KOVL_POOL_HANDLE ovlPool = NULL; + + + + //Initialise Data + POOL_CHAR = mxArrayToString(prhs[0]); + sscanf(POOL_CHAR, "%16x", &ovlPool); + + icx0 = mxArrayToString(prhs[1]); + sscanf(icx0, "%16x", &isoCtx_zero); + + icx1 = mxArrayToString(prhs[2]); + sscanf(icx1, "%16x", &isoCtx_one); + + POOL_CHAR = mxArrayToString(prhs[3]); + sscanf(POOL_CHAR, "%16x", &ovlPool); + + + //Actual Function + UsbK_Free(handle); + IsoK_Free(isoCtx_zero); + IsoK_Free(isoCtx_one); + OvlK_Free(ovlPool); + return; +} \ No newline at end of file diff --git a/Old Matlab Interface/USB_POOL_FREE.mexw64 b/Old Matlab Interface/USB_POOL_FREE.mexw64 new file mode 100644 index 00000000..00a8590e Binary files /dev/null and b/Old Matlab Interface/USB_POOL_FREE.mexw64 differ diff --git a/Old Matlab Interface/amp2bin.m b/Old Matlab Interface/amp2bin.m new file mode 100644 index 00000000..4fa40c65 --- /dev/null +++ b/Old Matlab Interface/amp2bin.m @@ -0,0 +1,16 @@ +function [bin] = amp2bin(amp, channel) + +global dac_top; + +global trip_state +channel = uint8(channel); +trip_state = bitand(trip_state,bitcmp(channel)) + +if amp>dac_top + amp = amp/3; + trip_state = bitor(trip_state, channel) +end + +signal_trip(trip_state) +amp +bin = round(amp/dac_top*255) diff --git a/Old Matlab Interface/autogain.m b/Old Matlab Interface/autogain.m new file mode 100644 index 00000000..bea05bdc --- /dev/null +++ b/Old Matlab Interface/autogain.m @@ -0,0 +1,16 @@ +function gain = autogain(minrail, maxrail) +vcc = 3.3 +r1 = 1000 +r2 = 75 + +maxgain = vcc / (2 * (maxrail - vcc/2) * r2/(r1+r2)) +mingain = vcc / (2 * (minrail - vcc/2) * r2/(r1+r2)) + +maxgain = min(abs(mingain) * 0.9, abs(maxgain) * 0.9) + +for snap = [64 32 16 8 4 2 1 0.5] + if maxgain>snap + gain = snap + break + end +end diff --git a/Old Matlab Interface/avrbreak.m b/Old Matlab Interface/avrbreak.m new file mode 100644 index 00000000..400c2b7c --- /dev/null +++ b/Old Matlab Interface/avrbreak.m @@ -0,0 +1 @@ +mex_usb_send_control('40', 'a0', '0', '0', '0', '0'); diff --git a/Old Matlab Interface/avrbreakcl.m b/Old Matlab Interface/avrbreakcl.m new file mode 100644 index 00000000..49b1b909 --- /dev/null +++ b/Old Matlab Interface/avrbreakcl.m @@ -0,0 +1,2 @@ +clear all +avrbreak \ No newline at end of file diff --git a/Old Matlab Interface/axes1_ButtonDownFcn.m b/Old Matlab Interface/axes1_ButtonDownFcn.m new file mode 100644 index 00000000..e6dc5254 --- /dev/null +++ b/Old Matlab Interface/axes1_ButtonDownFcn.m @@ -0,0 +1,68 @@ +function axes1_ButtonDownFcn() + +persistent state +if isempty(state) + state = 0; +end + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global gui_figure1 +%gui_hori_cursor_a_pos = scope_window_min + (scope_window_max - scope_window_min) * get(hObject,'Value'); + + +clicktype = get(gui_figure1,'selectionType'); +pos = get (gca, 'CurrentPoint'); +pos = [pos(1,1), pos(1,2)] + +global gui_delay +delay_sec = get(gui_delay, 'Max') - get(gui_delay, 'Value') + + +switch (clicktype) + case 'normal' + switch(state) + case 0 + state=1; + gui_hori_cursor_a_pos = pos(2); + case 1 + state=0; + gui_hori_cursor_b_pos = pos(2); + otherwise + state = 0; + end + fprintf('LEFT CLICK @(%.2f, %.2f)\n', pos(1), pos(2)) + case 'alt' + switch(state) + case 0 + state=3; + gui_vert_cursor_a_pos = pos(1) + delay_sec; + case 3 + state=0; + gui_vert_cursor_b_pos = pos(1) + delay_sec; + otherwise + state = 0; + end + fprintf('RIGHT CLICK @(%.2f, %.2f)\n', pos(1), pos(2)) + otherwise + disp('OTHER') +end + +%disp('settan') + +global gui_cursor_mode +global text_box_2 + +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %s\n V2 = %s\n DeltaV = %s\n', sisprintf(gui_hori_cursor_a_pos,'V',3), sisprintf(gui_hori_cursor_b_pos,'V',3), sisprintf(gui_hori_cursor_a_pos - gui_hori_cursor_b_pos,'V',3))) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %s\n T2 = %s\n DeltaT = %s\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', sisprintf(gui_vert_cursor_a_pos,'s',3), sisprintf(gui_vert_cursor_b_pos,'s',3), sisprintf(gui_vert_cursor_a_pos - gui_vert_cursor_b_pos,'s',3))) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %s\n T2 = %s\n DeltaT = %s\n \n V1 = %s\n V2 = %s\n DeltaV = %s\n', sisprintf(gui_vert_cursor_a_pos,'s',3), sisprintf(gui_vert_cursor_b_pos,'s',3), sisprintf(gui_vert_cursor_a_pos - gui_vert_cursor_b_pos,'s',3), sisprintf(gui_hori_cursor_a_pos,'V',3), sisprintf(gui_hori_cursor_b_pos,'V',3), sisprintf(gui_hori_cursor_a_pos - gui_hori_cursor_b_pos,'V',3))) + otherwise error('Gui_cursor_mode is invalid') +end \ No newline at end of file diff --git a/Old Matlab Interface/bin/dll/amd64/libusbK.dll b/Old Matlab Interface/bin/dll/amd64/libusbK.dll new file mode 100644 index 00000000..d8112b9e Binary files /dev/null and b/Old Matlab Interface/bin/dll/amd64/libusbK.dll differ diff --git a/Old Matlab Interface/bin/dll/ia64/libusbK.dll b/Old Matlab Interface/bin/dll/ia64/libusbK.dll new file mode 100644 index 00000000..717244d5 Binary files /dev/null and b/Old Matlab Interface/bin/dll/ia64/libusbK.dll differ diff --git a/Old Matlab Interface/bin/dll/x86/libusbK.dll b/Old Matlab Interface/bin/dll/x86/libusbK.dll new file mode 100644 index 00000000..0d410629 Binary files /dev/null and b/Old Matlab Interface/bin/dll/x86/libusbK.dll differ diff --git a/Old Matlab Interface/bin/lib/amd64/libusbK.lib b/Old Matlab Interface/bin/lib/amd64/libusbK.lib new file mode 100644 index 00000000..c8358a40 Binary files /dev/null and b/Old Matlab Interface/bin/lib/amd64/libusbK.lib differ diff --git a/Old Matlab Interface/bin/lib/ia64/libusbK.lib b/Old Matlab Interface/bin/lib/ia64/libusbK.lib new file mode 100644 index 00000000..b8bdd816 Binary files /dev/null and b/Old Matlab Interface/bin/lib/ia64/libusbK.lib differ diff --git a/Old Matlab Interface/bin/lib/static/amd64/libusbK.lib b/Old Matlab Interface/bin/lib/static/amd64/libusbK.lib new file mode 100644 index 00000000..f20f18de Binary files /dev/null and b/Old Matlab Interface/bin/lib/static/amd64/libusbK.lib differ diff --git a/Old Matlab Interface/bin/lib/static/ia64/libusbK.lib b/Old Matlab Interface/bin/lib/static/ia64/libusbK.lib new file mode 100644 index 00000000..0e43a803 Binary files /dev/null and b/Old Matlab Interface/bin/lib/static/ia64/libusbK.lib differ diff --git a/Old Matlab Interface/bin/lib/static/x86/libusbK.lib b/Old Matlab Interface/bin/lib/static/x86/libusbK.lib new file mode 100644 index 00000000..f5ccfdfb Binary files /dev/null and b/Old Matlab Interface/bin/lib/static/x86/libusbK.lib differ diff --git a/Old Matlab Interface/bin/lib/x86/libusbK.lib b/Old Matlab Interface/bin/lib/x86/libusbK.lib new file mode 100644 index 00000000..2f390040 Binary files /dev/null and b/Old Matlab Interface/bin/lib/x86/libusbK.lib differ diff --git a/Old Matlab Interface/bindings/examples_csharp/BenchmarkTestDevice.cs b/Old Matlab Interface/bindings/examples_csharp/BenchmarkTestDevice.cs new file mode 100644 index 00000000..7eeeaa55 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/BenchmarkTestDevice.cs @@ -0,0 +1,87 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// BenchmarkTestDevice.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System; +using System.Runtime.InteropServices; +using libusbK; + + +// ReSharper disable CheckNamespace + +namespace Test.Devices +// ReSharper restore CheckNamespace +{ + public enum BM_COMMAND + { + SET_TEST = 0x0E, + GET_TEST = 0x0F, + }; + + public enum BM_TEST_TYPE + { + NONE = 0x00, + READ = 0x01, + WRITE = 0x02, + LOOP = READ | WRITE, + }; + + public static class Benchmark + { + //! Custom vendor requests that must be implemented in the benchmark firmware. + + + #region Public Members + public static bool Configure(UsbK usb, + BM_COMMAND command, + byte interfaceNumber, + ref BM_TEST_TYPE testType) + { + int transferred; + WINUSB_SETUP_PACKET pkt; + byte[] data = new byte[1]; + + pkt.RequestType = (1 << 7) | (2 << 5); + pkt.Request = (byte) command; + + pkt.Value = (ushort) testType; + pkt.Index = interfaceNumber; + pkt.Length = 1; + + bool success = usb.ControlTransfer(pkt, + Marshal.UnsafeAddrOfPinnedArrayElement(data, + 0), + 1, + out transferred, + IntPtr.Zero); + testType = (BM_TEST_TYPE) data[0]; + return success; + } + #endregion + } +} \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Handle.Test.csproj b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Handle.Test.csproj new file mode 100644 index 00000000..acc8fef1 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Handle.Test.csproj @@ -0,0 +1,84 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {204628C0-DFA7-4DA8-BF4A-3AFB81E74F89} + WinExe + Properties + Handle.Test + Handle.Test + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + libusbK.cs + + + Form + + + fHandleTest.cs + + + + + fHandleTest.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Program.cs b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Program.cs new file mode 100644 index 00000000..c361e69d --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Program.cs @@ -0,0 +1,49 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// Program.cs +// +// Created: 03.02.2012 +// Last Updated: 03.03.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System; +using System.Windows.Forms; + + +namespace Handle.Test +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + private static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new fHandleTest()); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Properties/AssemblyInfo.cs b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..7e54ebd9 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Properties/AssemblyInfo.cs @@ -0,0 +1,69 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// AssemblyInfo.cs +// +// Created: 03.02.2012 +// Last Updated: 03.03.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.Reflection; +using System.Runtime.InteropServices; + + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyTitle("Handle.Test")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Handle.Test")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("88461b6f-5eb8-47ed-b3f1-0105e1c85f86")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Properties/Resources.Designer.cs b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Properties/Resources.Designer.cs new file mode 100644 index 00000000..fe0a0794 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4959 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Handle.Test.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Handle.Test.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Properties/Resources.resx b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Properties/Resources.resx new file mode 100644 index 00000000..af7dbebb --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Properties/Settings.Designer.cs b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Properties/Settings.Designer.cs new file mode 100644 index 00000000..9beca6a8 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4959 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Handle.Test.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Properties/Settings.settings b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Properties/Settings.settings new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Old Matlab Interface/bindings/examples_csharp/Handle.Test/TextBoxTraceListener.cs b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/TextBoxTraceListener.cs new file mode 100644 index 00000000..53654e97 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/TextBoxTraceListener.cs @@ -0,0 +1,160 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// TextBoxTraceListener.cs +// +// Created: 03.02.2012 +// Last Updated: 03.03.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; +using System.Windows.Forms; + + +namespace Handle.Test +{ + public class TestListener + { + #region Public Members + public TestListener(int threadCount) + { + mThreadCount = threadCount; + while (threadCount-- > 0) + mThreadList.Add(new Thread(DebugDumpProc)); + + threadCount = mThreadCount; + + foreach (Thread thread in mThreadList) + thread.Start((mThreadCount) - (threadCount--)); + + Thread.Sleep(0); + } + #endregion + + + #region Private Members + private static void DebugDumpProc(object state) + { + for (int iLine = 0; iLine < 64; iLine++) + Debug.Print("Debug test output. ThreadIndex:{0:000} Line:{1:000}", (int) state, iLine); + } + + private readonly int mThreadCount; + private readonly List mThreadList = new List(); + #endregion + } + + public class TextBoxTraceListener : TraceListener + { + #region Nested Delegates + private delegate void WriteDelegate(string message); + #endregion + + + #region Public Members + public TextBoxTraceListener(TextBox textBox, ThreadPriority priority) + { + mTraceLines = ArrayList.Synchronized(mTraceLinesUnsafe); + mTextBox = textBox; + writeInvokeCb = WriteInvoke; + mUiThread = new Thread(ListenerOutputProc); + mUiThread.Priority = priority; + + mUiThread.Start(this); + } + + /// Calls the dispose method. + public virtual void Free() + { + if (mUiThread != null) + mCancelEvent.Set(); + + mUiThread = null; + } + + public override void Write(string message) + { + ArrayList traceLines = mTraceLines; + traceLines.Add(message); + mOutputReadySemaphore.Release(); + } + + public override void WriteLine(string message) + { + Write(message + Environment.NewLine); + } + #endregion + + + #region Private Members + private static void ListenerOutputProc(object state) + { + TextBoxTraceListener listener = (TextBoxTraceListener) state; + + while (true) + { + int waitRet = WaitHandle.WaitAny(new WaitHandle[] {listener.mOutputReadySemaphore, listener.mCancelEvent}); + if (waitRet != 0) break; + + ArrayList traceLines = listener.mTraceLines; + String sLines = String.Empty; + DateTime dtNow = DateTime.Now; + while (true) + { + sLines += String.Format("[{0:00}:{1:00}:{2:00}:{3:000}] {4}", dtNow.Hour, dtNow.Minute, dtNow.Second, dtNow.Millisecond, traceLines[0] as string); + traceLines.RemoveAt(0); + + if (!listener.mOutputReadySemaphore.WaitOne(0)) break; + } + + try + { + listener.mTextBox.Invoke(listener.writeInvokeCb, new object[] {sLines}); + } + catch + { + break; + } + } + } + + private void WriteInvoke(string message) + { + mTextBox.AppendText(message); + } + + private readonly ManualResetEvent mCancelEvent = new ManualResetEvent(false); + + private readonly Semaphore mOutputReadySemaphore = new Semaphore(0, int.MaxValue); + private readonly TextBox mTextBox; + private readonly ArrayList mTraceLines; + private readonly ArrayList mTraceLinesUnsafe = new ArrayList(); + private Thread mUiThread; + private readonly WriteDelegate writeInvokeCb; + #endregion + } +} \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Handle.Test/fHandleTest.Designer.cs b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/fHandleTest.Designer.cs new file mode 100644 index 00000000..b2be8047 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/fHandleTest.Designer.cs @@ -0,0 +1,198 @@ +namespace Handle.Test +{ + partial class fHandleTest + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.disposingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.createAndExplictlyDestroyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.createWithoutExplictDestroyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.runGarbageCollectorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.createToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.referenceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.derefrenceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.exhaustAllHandlesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.txtOutput = new System.Windows.Forms.TextBox(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.testListenerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.disposingToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(674, 24); + this.menuStrip1.TabIndex = 1; + this.menuStrip1.Text = "menuStrip1"; + // + // disposingToolStripMenuItem + // + this.disposingToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.createAndExplictlyDestroyToolStripMenuItem, + this.createWithoutExplictDestroyToolStripMenuItem, + this.toolStripSeparator1, + this.runGarbageCollectorToolStripMenuItem, + this.createToolStripMenuItem, + this.toolStripSeparator2, + this.exhaustAllHandlesToolStripMenuItem, + this.toolStripSeparator3, + this.testListenerToolStripMenuItem}); + this.disposingToolStripMenuItem.Name = "disposingToolStripMenuItem"; + this.disposingToolStripMenuItem.Size = new System.Drawing.Size(71, 20); + this.disposingToolStripMenuItem.Text = "Disposing"; + // + // createAndExplictlyDestroyToolStripMenuItem + // + this.createAndExplictlyDestroyToolStripMenuItem.Name = "createAndExplictlyDestroyToolStripMenuItem"; + this.createAndExplictlyDestroyToolStripMenuItem.Size = new System.Drawing.Size(234, 22); + this.createAndExplictlyDestroyToolStripMenuItem.Text = "Create and Explictly Destroy"; + this.createAndExplictlyDestroyToolStripMenuItem.Click += new System.EventHandler(this.createAndExplictlyDestroyToolStripMenuItem_Click); + // + // createWithoutExplictDestroyToolStripMenuItem + // + this.createWithoutExplictDestroyToolStripMenuItem.Name = "createWithoutExplictDestroyToolStripMenuItem"; + this.createWithoutExplictDestroyToolStripMenuItem.Size = new System.Drawing.Size(234, 22); + this.createWithoutExplictDestroyToolStripMenuItem.Text = "Create Without Explict Destroy"; + this.createWithoutExplictDestroyToolStripMenuItem.Click += new System.EventHandler(this.createWithoutExplictDestroyToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(231, 6); + // + // runGarbageCollectorToolStripMenuItem + // + this.runGarbageCollectorToolStripMenuItem.Name = "runGarbageCollectorToolStripMenuItem"; + this.runGarbageCollectorToolStripMenuItem.Size = new System.Drawing.Size(234, 22); + this.runGarbageCollectorToolStripMenuItem.Text = "Run Garbage Collector"; + this.runGarbageCollectorToolStripMenuItem.Click += new System.EventHandler(this.runGarbageCollectorToolStripMenuItem_Click); + // + // createToolStripMenuItem + // + this.createToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.referenceToolStripMenuItem, + this.derefrenceToolStripMenuItem}); + this.createToolStripMenuItem.Name = "createToolStripMenuItem"; + this.createToolStripMenuItem.Size = new System.Drawing.Size(234, 22); + this.createToolStripMenuItem.Text = "Create"; + // + // referenceToolStripMenuItem + // + this.referenceToolStripMenuItem.Name = "referenceToolStripMenuItem"; + this.referenceToolStripMenuItem.Size = new System.Drawing.Size(131, 22); + this.referenceToolStripMenuItem.Text = "Reference"; + this.referenceToolStripMenuItem.Click += new System.EventHandler(this.referenceToolStripMenuItem_Click); + // + // derefrenceToolStripMenuItem + // + this.derefrenceToolStripMenuItem.Name = "derefrenceToolStripMenuItem"; + this.derefrenceToolStripMenuItem.Size = new System.Drawing.Size(131, 22); + this.derefrenceToolStripMenuItem.Text = "Derefrence"; + this.derefrenceToolStripMenuItem.Click += new System.EventHandler(this.derefrenceToolStripMenuItem_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(231, 6); + // + // exhaustAllHandlesToolStripMenuItem + // + this.exhaustAllHandlesToolStripMenuItem.Name = "exhaustAllHandlesToolStripMenuItem"; + this.exhaustAllHandlesToolStripMenuItem.Size = new System.Drawing.Size(234, 22); + this.exhaustAllHandlesToolStripMenuItem.Text = "Exhaust All Handles"; + this.exhaustAllHandlesToolStripMenuItem.Click += new System.EventHandler(this.exhaustAllHandlesToolStripMenuItem_Click); + // + // txtOutput + // + this.txtOutput.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtOutput.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtOutput.Location = new System.Drawing.Point(0, 24); + this.txtOutput.MaxLength = 0; + this.txtOutput.Multiline = true; + this.txtOutput.Name = "txtOutput"; + this.txtOutput.ReadOnly = true; + this.txtOutput.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtOutput.Size = new System.Drawing.Size(674, 272); + this.txtOutput.TabIndex = 2; + this.txtOutput.WordWrap = false; + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(231, 6); + // + // testListenerToolStripMenuItem + // + this.testListenerToolStripMenuItem.Name = "testListenerToolStripMenuItem"; + this.testListenerToolStripMenuItem.Size = new System.Drawing.Size(234, 22); + this.testListenerToolStripMenuItem.Text = "Test Listener"; + this.testListenerToolStripMenuItem.Click += new System.EventHandler(this.testListenerToolStripMenuItem_Click); + // + // fHandleTest + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(674, 296); + this.Controls.Add(this.txtOutput); + this.Controls.Add(this.menuStrip1); + this.MainMenuStrip = this.menuStrip1; + this.Name = "fHandleTest"; + this.Text = "libusbK Handles Example"; + this.Load += new System.EventHandler(this.fHandleTest_Load); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.fHandleTest_FormClosed); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem disposingToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem createAndExplictlyDestroyToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem runGarbageCollectorToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem createWithoutExplictDestroyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem createToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem referenceToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem derefrenceToolStripMenuItem; + private System.Windows.Forms.TextBox txtOutput; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem exhaustAllHandlesToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem testListenerToolStripMenuItem; + } +} + diff --git a/Old Matlab Interface/bindings/examples_csharp/Handle.Test/fHandleTest.cs b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/fHandleTest.cs new file mode 100644 index 00000000..f6623d60 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/fHandleTest.cs @@ -0,0 +1,130 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// fHandleTest.cs +// +// Created: 03.02.2012 +// Last Updated: 03.03.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; +using System.Windows.Forms; +using libusbK; + + +namespace Handle.Test +{ + public partial class fHandleTest : Form + { + private LstK LstKField; + private List LstKList = new List(); + + private TextBoxTraceListener mListener; + + public fHandleTest() + { + InitializeComponent(); + } + + ~fHandleTest() + { + } + + private void createAndExplictlyDestroyToolStripMenuItem_Click(object sender, EventArgs e) + { + LstK lstTemp = new LstK(KLST_FLAG.NONE); + lstTemp.Dispose(); + } + + private void runGarbageCollectorToolStripMenuItem_Click(object sender, EventArgs e) + { + GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); + } + + private void referenceToolStripMenuItem_Click(object sender, EventArgs e) + { + LstK lstTemp = new LstK(KLST_FLAG.NONE); + LstKList.Add(lstTemp); + LstKField = lstTemp; + } + + private void derefrenceToolStripMenuItem_Click(object sender, EventArgs e) + { + if (LstKList.Count > 0) + { + LstKList.Clear(); + } + else + { + LstKField = null; + } + } + + private void createWithoutExplictDestroyToolStripMenuItem_Click(object sender, EventArgs e) + { + LstK lstTemp = new LstK(KLST_FLAG.NONE); + int count = 0; + lstTemp.Count(ref count); + } + + private void fHandleTest_Load(object sender, EventArgs e) + { + mListener = new TextBoxTraceListener(txtOutput, ThreadPriority.Lowest); + Debug.Listeners.Add(mListener); + } + + private void fHandleTest_FormClosed(object sender, FormClosedEventArgs e) + { + Debug.Listeners.Remove(mListener); + mListener.Free(); + } + + private void exhaustAllHandlesToolStripMenuItem_Click(object sender, EventArgs e) + { + LstKList.Clear(); + LstKField = null; + int count = 0; + try + { + while (true) + { + new LstK(KLST_FLAG.NONE); + count++; + } + } + catch + { + } + + Debug.Print("All handles exhausted. Count:{0}", count); + } + + private void testListenerToolStripMenuItem_Click(object sender, EventArgs e) + { + new TestListener(64); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Handle.Test/fHandleTest.resx b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/fHandleTest.resx new file mode 100644 index 00000000..541af56e --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Handle.Test/fHandleTest.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/HiPerfTimer.cs b/Old Matlab Interface/bindings/examples_csharp/HiPerfTimer.cs new file mode 100644 index 00000000..d81057dd --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/HiPerfTimer.cs @@ -0,0 +1,126 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// HiPerfTimer.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.ComponentModel; +using System.Runtime.InteropServices; + + +namespace Win32 +{ + internal class HiPerfTimer + { + #region Public Members + public HiPerfTimer() + { + startTime = 0; + stopTime = 0; + length = 0; + + if (QueryPerformanceFrequency(out freq) == false) + { + // high-performance counter not supported + throw new Win32Exception(); + } + } + + /// + /// Gets the bytes per second + /// + public double Bps + { + get + { + double duration = Duration; + if (duration.Equals(0.0)) return 0.0; + return length/duration; + } + } + + /// + /// Gets the duration of the timer (in seconds) + /// + public double Duration + { + get + { + return (stopTime - startTime)/(double) freq; + } + } + + /// + /// Gets the duration of the timer (in seconds) + /// + public long Ticks + { + get + { + long tDiff = stopTime - startTime; + tDiff = (tDiff*10000000)/freq; + + return tDiff; + } + } + /// + /// Start the timer + /// + public void Start() + { + length = 0; + QueryPerformanceCounter(out startTime); + } + + /// + /// Stop the timer + /// + public void Stop() + { + QueryPerformanceCounter(out stopTime); + } + + public void Stop(int addLength) + { + QueryPerformanceCounter(out stopTime); + length += addLength; + } + #endregion + + + #region Private Members + [DllImport("Kernel32.dll")] + private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); + + [DllImport("Kernel32.dll")] + private static extern bool QueryPerformanceFrequency(out long lpFrequency); + + private readonly long freq; + private long length; + private long startTime, stopTime; + #endregion + } +} \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Form1.Designer.cs b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Form1.Designer.cs new file mode 100644 index 00000000..a266b826 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Form1.Designer.cs @@ -0,0 +1,118 @@ +namespace Hot.Plug.Detect.GUI +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.dgvDevices = new System.Windows.Forms.DataGridView(); + this.label1 = new System.Windows.Forms.Label(); + this.colSymbolicLink = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colDeviceDesc = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.colInstanceID = new System.Windows.Forms.DataGridViewTextBoxColumn(); + ((System.ComponentModel.ISupportInitialize)(this.dgvDevices)).BeginInit(); + this.SuspendLayout(); + // + // dgvDevices + // + this.dgvDevices.AllowUserToAddRows = false; + this.dgvDevices.AllowUserToDeleteRows = false; + this.dgvDevices.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dgvDevices.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dgvDevices.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.colSymbolicLink, + this.colDeviceDesc, + this.colInstanceID}); + this.dgvDevices.Location = new System.Drawing.Point(12, 38); + this.dgvDevices.MultiSelect = false; + this.dgvDevices.Name = "dgvDevices"; + this.dgvDevices.ReadOnly = true; + this.dgvDevices.RowHeadersVisible = false; + this.dgvDevices.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgvDevices.ShowEditingIcon = false; + this.dgvDevices.Size = new System.Drawing.Size(419, 179); + this.dgvDevices.TabIndex = 0; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 22); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(104, 13); + this.label1.TabIndex = 1; + this.label1.Text = "Connected Devices:"; + // + // colSymbolicLink + // + this.colSymbolicLink.HeaderText = "SymbolicLink"; + this.colSymbolicLink.Name = "colSymbolicLink"; + this.colSymbolicLink.ReadOnly = true; + this.colSymbolicLink.Visible = false; + // + // colDeviceDesc + // + this.colDeviceDesc.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.colDeviceDesc.HeaderText = "Name"; + this.colDeviceDesc.Name = "colDeviceDesc"; + this.colDeviceDesc.ReadOnly = true; + // + // colInstanceID + // + this.colInstanceID.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.colInstanceID.HeaderText = "Instance ID"; + this.colInstanceID.Name = "colInstanceID"; + this.colInstanceID.ReadOnly = true; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(443, 229); + this.Controls.Add(this.label1); + this.Controls.Add(this.dgvDevices); + this.Name = "Form1"; + this.Text = "Hot Plug Detection GUI Example"; + this.Load += new System.EventHandler(this.Form1_Load); + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); + ((System.ComponentModel.ISupportInitialize)(this.dgvDevices)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.DataGridView dgvDevices; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.DataGridViewTextBoxColumn colSymbolicLink; + private System.Windows.Forms.DataGridViewTextBoxColumn colDeviceDesc; + private System.Windows.Forms.DataGridViewTextBoxColumn colInstanceID; + + } +} + diff --git a/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Form1.cs b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Form1.cs new file mode 100644 index 00000000..339bc805 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Form1.cs @@ -0,0 +1,116 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2011-2012 Travis Robinson +// All rights reserved. +// +// Hot.Plug.Detect.GUI +// +// Last Updated: 03.08.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +using System; +using System.Windows.Forms; +using libusbK; + +namespace Hot.Plug.Detect.GUI +{ + public partial class Form1 : Form + { + private const int WM_USER = 0x400; + + private const int WM_USER_HOT_BASE = WM_USER; + private const int WM_USER_HOT_REMOVAL = WM_USER_HOT_BASE; + private const int WM_USER_HOT_ARRIVAL = WM_USER_HOT_BASE + 1; + private HotK mHotK; + private KHOT_PARAMS mHotParams; + + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + mHotParams.PatternMatch.DeviceInterfaceGUID = "*"; + + // Set the Hwnd handle. + mHotParams.UserHwnd = Handle; + + // Set the base user message. This can be any value greater than or equal to 0x400 + mHotParams.UserMessage = WM_USER_HOT_BASE; + + // After initializing, send plug events for devices that are currently connected. + mHotParams.Flags = KHOT_FLAG.PLUG_ALL_ON_INIT; + + // This will cause HotK to use PostMessage instead of SendMessage. + mHotParams.Flags |= KHOT_FLAG.POST_USER_MESSAGE; + + mHotK = new HotK(ref mHotParams); + } + + private void OnHotPlugInvoked(KHOT_HANDLE hotHandle, KLST_DEVINFO_HANDLE deviceInfo, KLST_SYNC_FLAG plugType) + { + string symbolicLink = deviceInfo.SymbolicLink; + switch (plugType) + { + case KLST_SYNC_FLAG.ADDED: + int iRow = dgvDevices.Rows.Add(new object[] {symbolicLink, deviceInfo.DeviceDesc, deviceInfo.DeviceID}); + dgvDevices.Rows[iRow].Cells[1].ToolTipText = deviceInfo.ToString(); + dgvDevices.Rows[iRow].Cells[2].ToolTipText = deviceInfo.Common.ToString(); + break; + case KLST_SYNC_FLAG.REMOVED: + foreach (DataGridViewRow row in dgvDevices.Rows) + { + if (row.Cells[0].Value as string != symbolicLink) continue; + dgvDevices.Rows.Remove(row); + break; + } + break; + default: + throw new ArgumentOutOfRangeException("plugType"); + } + } + + protected override void WndProc(ref Message m) + { + /* When using the HotK UserHwnd and UserMsg, the add/remove events are seperated into to different messages. + * Removal = UserMsg + 0 + * Arrival = UserMsg + 1 + */ + if (m.Msg == WM_USER_HOT_REMOVAL || m.Msg == WM_USER_HOT_ARRIVAL) + { + KHOT_HANDLE hotHandle = new KHOT_HANDLE(m.WParam); + KLST_DEVINFO_HANDLE deviceInfo = new KLST_DEVINFO_HANDLE(m.LParam); + KLST_SYNC_FLAG plugType = (m.Msg == WM_USER_HOT_REMOVAL) ? KLST_SYNC_FLAG.REMOVED : KLST_SYNC_FLAG.ADDED; + + OnHotPlugInvoked(hotHandle, deviceInfo, plugType); + return; + } + base.WndProc(ref m); + } + + private void Form1_FormClosing(object sender, FormClosingEventArgs e) + { + mHotK.Dispose(); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Form1.resx b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Form1.resx new file mode 100644 index 00000000..f5b0ea0c --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Form1.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Hot.Plug.Detect.GUI.csproj b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Hot.Plug.Detect.GUI.csproj new file mode 100644 index 00000000..20ca2cfe --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Hot.Plug.Detect.GUI.csproj @@ -0,0 +1,83 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {CFB108D9-5489-48D4-AAFD-5FBCB3C00582} + WinExe + Properties + Hot.Plug.Detect.GUI + Hot.Plug.Detect.GUI + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + libusbK.cs + + + Form + + + Form1.cs + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Program.cs b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Program.cs new file mode 100644 index 00000000..7e23f28d --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Program.cs @@ -0,0 +1,48 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2011-2012 Travis Robinson +// All rights reserved. +// +// Hot.Plug.Detect.GUI +// +// Last Updated: 03.08.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +using System; +using System.Windows.Forms; + +namespace Hot.Plug.Detect.GUI +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + private static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Properties/AssemblyInfo.cs b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..a3f6e422 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Hot.Plug.Detect.GUI")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Hot.Plug.Detect.GUI")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c3a55330-daa9-4501-8852-8ec0dcd33cc5")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Properties/Resources.Designer.cs b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Properties/Resources.Designer.cs new file mode 100644 index 00000000..910ca72b --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4959 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Hot.Plug.Detect.GUI.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Hot.Plug.Detect.GUI.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Properties/Resources.resx b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Properties/Resources.resx new file mode 100644 index 00000000..af7dbebb --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Properties/Settings.Designer.cs b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Properties/Settings.Designer.cs new file mode 100644 index 00000000..276ddd0a --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4959 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Hot.Plug.Detect.GUI.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Properties/Settings.settings b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Properties/Settings.settings new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect.GUI/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect/Hot.Plug.Detect.csproj b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect/Hot.Plug.Detect.csproj new file mode 100644 index 00000000..baf03dbe --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect/Hot.Plug.Detect.csproj @@ -0,0 +1,52 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {E9566BFF-3BEC-4358-9871-C1700CB73C2B} + Exe + Properties + Hot.Plug.Detect + Hot.Plug.Detect + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + libusbK.cs + + + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect/Program.cs b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect/Program.cs new file mode 100644 index 00000000..6dbbd773 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect/Program.cs @@ -0,0 +1,118 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// Hot.Plug.Detect +// +// Last Updated: 04.28.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +using System; +using libusbK; + +namespace Hot.Plug.Detect +{ + internal class Program + { + // ReSharper disable InconsistentNaming + + #region For Window Applications + private const int WM_USER = 0x400; + private const int WM_USER_HOT_BASE = WM_USER; + private const int WM_USER_HOT_REMOVAL = WM_USER_HOT_BASE; + private const int WM_USER_HOT_ARRIVAL = WM_USER_HOT_BASE + 1; + #endregion + + private static void Main() + { + KHOT_PARAMS hotInitParams = new KHOT_PARAMS(); + + // In the real world, you would want to filter for only *your* device(s). + hotInitParams.PatternMatch.DeviceInterfaceGUID = "*"; + + // The PLUG_ALL_ON_INIT flag will force plug events for matching devices that are already connected. + hotInitParams.Flags = KHOT_FLAG.PLUG_ALL_ON_INIT; + + hotInitParams.OnHotPlug = OnHotPlug; + + /* Instead of a callback you can send/post messages directly to a window handle. + hotInitParams.UserHwnd = MyForm.Handle; + hotInitParams.UserMessage = WM_USER_HOT_BASE; + */ + + Console.WriteLine("Monitoring libusbK arrival/removal events."); + Console.WriteLine("[PatternMatch]"); + Console.WriteLine(hotInitParams.PatternMatch.ToString()); + Console.WriteLine("Press [ENTER] to exit.."); + + while (Console.KeyAvailable) Console.ReadKey(true); + + // You may set your initial hot handle user context like this. + // This example is using it to count connected devices and detect the first OnHotPlug event (Int32.MaxValue). + AllKFunctions.LibK_SetDefaultContext(KLIB_HANDLE_TYPE.HOTK, new IntPtr(Int32.MaxValue)); + + // Start hot-plug detection. + HotK hot = new HotK(ref hotInitParams); + + Console.ReadLine(); + + hot.Free(); + } + + private static void OnHotPlug(KHOT_HANDLE hotHandle, + KLST_DEVINFO_HANDLE deviceInfo, + KLST_SYNC_FLAG plugType) + { + string plugText; + + int totalPluggedDeviceCount = (int) hotHandle.GetContext().ToInt64(); + if (totalPluggedDeviceCount == int.MaxValue) + { + Console.WriteLine("OnHotPlug is being called for the first time on handle:{0}", hotHandle.Pointer); + totalPluggedDeviceCount = 0; + } + + switch (plugType) + { + case KLST_SYNC_FLAG.ADDED: + plugText = "Arrival"; + totalPluggedDeviceCount++; + break; + case KLST_SYNC_FLAG.REMOVED: + plugText = "Removal"; + totalPluggedDeviceCount--; + break; + default: + throw new ArgumentOutOfRangeException("plugType"); + } + + hotHandle.SetContext(new IntPtr(totalPluggedDeviceCount)); + + Console.WriteLine("\n[OnHotPlug] Device {0}:{1} \n", + plugText, + deviceInfo); + Console.WriteLine("Total Plugged Device Count: {0}", + totalPluggedDeviceCount); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect/Properties/AssemblyInfo.cs b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..252ebda4 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Hot.Plug.Detect/Properties/AssemblyInfo.cs @@ -0,0 +1,69 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// AssemblyInfo.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.Reflection; +using System.Runtime.InteropServices; + + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyTitle("Hot.Plug.Detect")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Hot.Plug.Detect")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("f58e935c-8222-42fa-9ccb-2bec7a9eae8d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/List.Devices/List.Devices.csproj b/Old Matlab Interface/bindings/examples_csharp/List.Devices/List.Devices.csproj new file mode 100644 index 00000000..bbca8d48 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/List.Devices/List.Devices.csproj @@ -0,0 +1,52 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {4FA292D2-945A-48B5-B040-3AF7E482AB31} + Exe + Properties + List.Devices + List.Devices + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + libusbK.cs + + + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/List.Devices/Program.cs b/Old Matlab Interface/bindings/examples_csharp/List.Devices/Program.cs new file mode 100644 index 00000000..4d5d74c2 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/List.Devices/Program.cs @@ -0,0 +1,63 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2011-2012 Travis Robinson +// All rights reserved. +// +// List.Devices +// +// Last Updated: 03.08.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +using System; +using libusbK; + +namespace List.Devices +{ + internal class Program + { + private static void Main() + { + int deviceIndex = 0; + int deviceCount = 0; + KLST_DEVINFO_HANDLE deviceInfo; + LstK lst = new LstK(KLST_FLAG.NONE); + + lst.Count(ref deviceCount); + while (lst.MoveNext(out deviceInfo)) + { + // Write some information about the device. + string displayLine = String.Format("{0} of {1}: {2}", + ++deviceIndex, + deviceCount, + deviceInfo.DeviceDesc); + Console.WriteLine(displayLine); + Console.WriteLine("- " + deviceInfo.DeviceID); + Console.WriteLine(); + } + + if (deviceCount == 0) + Console.WriteLine("No devices found!\n"); + + lst.Free(); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/List.Devices/Properties/AssemblyInfo.cs b/Old Matlab Interface/bindings/examples_csharp/List.Devices/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..bdd2f770 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/List.Devices/Properties/AssemblyInfo.cs @@ -0,0 +1,69 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// AssemblyInfo.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.Reflection; +using System.Runtime.InteropServices; + + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyTitle("List.Devices")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("List.Devices")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("535a41bb-2086-4cb2-8d38-2e12743bcb73")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Read.Isochronous/Program.cs b/Old Matlab Interface/bindings/examples_csharp/Read.Isochronous/Program.cs new file mode 100644 index 00000000..fae4ac32 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Read.Isochronous/Program.cs @@ -0,0 +1,323 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2011-2012 Travis Robinson +// All rights reserved. +// +// Read.Isochronous +// +// Last Updated: 03.08.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +#define BMFW + +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Threading; +using Test.Devices; +using libusbK; +using libusbK.Examples; + +namespace Read.Isochronous +{ + // ReSharper disable InconsistentNaming + + internal class Program + { + #region TODO USER: Set the test parameters for your device. + + public static IsoTestParameters Test = new IsoTestParameters(0x04d8, 0xfa2e, 0, 0x82, 3, 64, "xfer-iso-read.txt", 24); + + #endregion + + private static void Main(string[] args) + { + bool success; + WINUSB_PIPE_INFORMATION pipeInfo; + UsbK usb; + USB_INTERFACE_DESCRIPTOR interfaceDescriptor; + + // Find and configure the device. + if (!Test.ConfigureDevice(out pipeInfo, out usb, out interfaceDescriptor)) return; + +#if BMFW + // TODO FOR USER: Remove this block if not using benchmark firmware. + // This configures devices running benchmark firmware for streaming DeviceToHost transfers. + Console.WriteLine("Configuring for benchmark device.."); + BM_TEST_TYPE testType = BM_TEST_TYPE.READ; + success = Benchmark.Configure(usb, BM_COMMAND.SET_TEST, interfaceDescriptor.bInterfaceNumber, ref testType); + if (!success) + { + Console.WriteLine("Bench_Configure failed."); + } +#endif + // Create the ISO transfer queue. This class manages the pending and outstanding transfer lists. + ReadIsoTransferQueue readXfers = new ReadIsoTransferQueue(usb, ref pipeInfo, Test.MaxOutstandingTransfers, Test.IsoPacketsPerTransfer); + + if (!Test.ShowTestReady()) goto Done; + + // Always issue a reset pipe prior to re/starting an ISO stream. + usb.ResetPipe(pipeInfo.PipeId); + + // This example will not manage the start frame manually, but this is + // how I might caculate the starting point. + usb.GetCurrentFrameNumber(out readXfers.FrameNumber); + unchecked + { + // Add some start latency + readXfers.FrameNumber += 32; + + // Start FrameNumber at an interval of 8. + readXfers.FrameNumber -= ((readXfers.FrameNumber)%8); + } + + // This is a counter/timer used only for statistics gathering. + Thread.Sleep(0); + Test.Dcs.Start(); + + // Transfer processing loop + do + { + IsoTransferItem isoTransferItem; + int transferred; + int errorCode; + // While buffers exist in the completed list, submit them. + while (readXfers.Completed.Count > 0 && readXfers.TotalSubmittedCount < Test.MaxTransfersTotal) + { + errorCode = readXfers.SubmitNextRead(); + if (errorCode != 0) + { + Console.WriteLine("IsoReadPipe failed. ErrorCode: {0:X8}h", errorCode); + goto Done; + } + } + + if (readXfers.Outstanding.Count == 0) + { + // The MAX_TRANSFERS_TOTAL test limit hit. + Console.WriteLine("Done!"); + goto Done; + } + + // Wait for the oldest transfer to complete. + errorCode = readXfers.WaitRead(out isoTransferItem, 1000, out transferred); + if (errorCode != 0) + { + Console.WriteLine("OvlPool.Wait failed. ErrorCode: {0:X8}h", errorCode); + goto Done; + } + + // Report iso status. + IsoXferReport(readXfers, isoTransferItem, transferred); + + if (readXfers.CompletedCount == 1) Test.Dcs.Start(); + } while (true); + + Done: + readXfers.Destroy(); + Test.Free(); + + usb.Free(); + } + + private static void IsoXferReport(ReadIsoTransferQueue readIsoTransfers, IsoTransferItem isoTransferItem, int transferLength) + { + int packetPos; + Test.Dcs.Stop(transferLength); + if (readIsoTransfers.LastStartFrame == 0) + { + Test.LogLn("#{0}: StartFrame={1:X8}h TransferLength={2} BPS-average:{3}", + readIsoTransfers.CompletedCount, + isoTransferItem.Iso.StartFrame, + transferLength, + Math.Round(Test.Dcs.Bps, 2)); + } + else + { + int lastFrameCount = isoTransferItem.Iso.StartFrame - readIsoTransfers.LastStartFrame; + Test.LogLn("#{0}: StartFrame={1:X8}h TransferLength={2} BPS-average:{3} LastFrameCount={4}", + readIsoTransfers.CompletedCount, + isoTransferItem.Iso.StartFrame, + transferLength, + Math.Round(Test.Dcs.Bps, 2), + lastFrameCount); + } + + int numPackets = isoTransferItem.Iso.NumberOfPackets; + for (packetPos = 0; packetPos < numPackets; packetPos++) + { + KISO_PACKET isoPacket; + isoTransferItem.Iso.GetPacket(packetPos, out isoPacket); + if (isoPacket.Length > 1) + { + // This is somewhat specific to data that is returned by the benchmark firmware. + byte firstPacketByte = isoTransferItem.Buffer[isoPacket.Offset]; + byte secondPacketByte = isoTransferItem.Buffer[isoPacket.Offset + 1]; + Test.LogLn(" [{0:000}] Length={1} B0={2:X2}h B1={3:X2}h", packetPos, isoPacket.Length, firstPacketByte, secondPacketByte); + } + else + { + Test.LogLn(" [{0:000}] Empty Packet", packetPos); + } + } + + readIsoTransfers.CompletedCount++; + readIsoTransfers.LastStartFrame = isoTransferItem.Iso.StartFrame; + } + } + + internal class IsoTransferItem + { + public byte[] Buffer; + public GCHandle BufferGC; + public IsoK Iso; + public KOVL_HANDLE Ovl; + } + + internal class ReadIsoTransferQueue + { + #region Transfer lists + + public LinkedList Completed = new LinkedList(); + public LinkedList Master = new LinkedList(); + public LinkedList Outstanding = new LinkedList(); + + #endregion + + #region Core queue members + + public readonly int DataBufferSize; + public readonly OvlK OvlPool; + public readonly WINUSB_PIPE_INFORMATION PipeInfo; + public readonly UsbK Usb; + + #endregion + + #region Frame management + + public int FrameNumber; + public int LastStartFrame; + + #endregion + + #region Statisitics + + public uint CompletedCount; + public uint TotalSubmittedCount; + + #endregion + + public ReadIsoTransferQueue(UsbK usb, ref WINUSB_PIPE_INFORMATION pipeInfo, int maxPendingTransfers, int numberOfPackets) + { + PipeInfo = pipeInfo; + Usb = usb; + OvlPool = new OvlK(usb.Handle, maxPendingTransfers, KOVL_POOL_FLAG.NONE); + DataBufferSize = (pipeInfo.MaximumPacketSize*numberOfPackets); + for (int pos = 0; pos < maxPendingTransfers; pos++) + { + IsoTransferItem isoTransferItem = new IsoTransferItem(); + + isoTransferItem.Buffer = new byte[pipeInfo.MaximumPacketSize*numberOfPackets]; + isoTransferItem.BufferGC = GCHandle.Alloc(isoTransferItem.Buffer, GCHandleType.Pinned); + + isoTransferItem.Iso = new IsoK(numberOfPackets, 0); + isoTransferItem.Iso.SetPackets(pipeInfo.MaximumPacketSize); + + OvlPool.Acquire(out isoTransferItem.Ovl); + + Master.AddLast(isoTransferItem); + Completed.AddLast(isoTransferItem); + } + } + + public void Destroy() + { + // Cancel any outstanding IO and release the OvlK. + foreach (IsoTransferItem myIsoBuffer in Outstanding) + { + int transferred; + OvlPool.WaitAndRelease(myIsoBuffer.Ovl, 0, out transferred); + } + Completed.Clear(); + Outstanding.Clear(); + + foreach (IsoTransferItem myIsoBuffer in Master) + { + myIsoBuffer.Iso.Free(); + myIsoBuffer.BufferGC.Free(); + } + Master.Clear(); + OvlPool.Free(); + } + + private static void SetNextFrameNumber(IsoTransferItem isoTransferItem) + { + } + + public int SubmitNextRead() + { + // Pull from head of Completed list and push to end of Outstanding list + IsoTransferItem isoTransferItem = Completed.First.Value; + Completed.RemoveFirst(); + Outstanding.AddLast(isoTransferItem); + + // If managing a start frame manually, set it here and update the the frame counter for the next transfer. + SetNextFrameNumber(isoTransferItem); + + // Prepare the OvlK handle to be submitted. + OvlPool.ReUse(isoTransferItem.Ovl); + + // The data buffer was pinned earlier when it was allocated. Always pin managed memory before using it + // in an asynchronous function to keep the framework from tampering with it. + Usb.IsoReadPipe(PipeInfo.PipeId, + isoTransferItem.Buffer, + DataBufferSize, + isoTransferItem.Ovl, + isoTransferItem.Iso.Handle); + + int errorCode = Marshal.GetLastWin32Error(); + + // 997 is ERROR_IO_PENDING. For async, this means so far so good. + // IE: The transfer is submitted but we won't know if a problem occurs until it is completed. + if (errorCode != ErrorCodes.IoPending) return errorCode; + + TotalSubmittedCount++; + + return 0; + } + + public int WaitRead(out IsoTransferItem isoTransferItem, int i, out int transferred) + { + isoTransferItem = Outstanding.First.Value; + bool success = OvlPool.Wait(isoTransferItem.Ovl, 1000, KOVL_WAIT_FLAG.NONE, out transferred); + if (!success) + { + return Marshal.GetLastWin32Error(); + } + + Outstanding.RemoveFirst(); + Completed.AddLast(isoTransferItem); + + return 0; + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Read.Isochronous/Properties/AssemblyInfo.cs b/Old Matlab Interface/bindings/examples_csharp/Read.Isochronous/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..6b77b17d --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Read.Isochronous/Properties/AssemblyInfo.cs @@ -0,0 +1,69 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// AssemblyInfo.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.Reflection; +using System.Runtime.InteropServices; + + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyTitle("Read.Isochronous")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Read.Isochronous")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("b345e710-181d-481f-a62c-7e434534e582")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Read.Isochronous/Read.Isochronous.csproj b/Old Matlab Interface/bindings/examples_csharp/Read.Isochronous/Read.Isochronous.csproj new file mode 100644 index 00000000..6f1e8d30 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Read.Isochronous/Read.Isochronous.csproj @@ -0,0 +1,66 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {97DB9A34-994D-470E-A415-AC54ACD96713} + Exe + Properties + Read.Isochronous + Read.Isochronous + v2.0 + 512 + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + libusbK.cs + + + Common\BenchmarkTestDevice.cs + + + Common\HiPerfTimer.cs + + + Common\TestParameters.cs + + + + + + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Read.Isochronous/app.config b/Old Matlab Interface/bindings/examples_csharp/Read.Isochronous/app.config new file mode 100644 index 00000000..df20690a --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Read.Isochronous/app.config @@ -0,0 +1,3 @@ + + + diff --git a/Old Matlab Interface/bindings/examples_csharp/TestParameters.cs b/Old Matlab Interface/bindings/examples_csharp/TestParameters.cs new file mode 100644 index 00000000..462e7ecd --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/TestParameters.cs @@ -0,0 +1,540 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// TestParameters.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System; +using System.Globalization; +using System.IO; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; +using Win32; + + +namespace libusbK.Examples +{ + internal abstract class TestParameters + { + protected TestParameters(int vid, + int pid, + int altInterfaceId, + int pipeId, + int maxTransfersTotal, + string logFilename) + { + MI = -1; + ; + Vid = vid; + Pid = pid; + PipeId = pipeId; + AltInterfaceId = altInterfaceId; + MaxTransfersTotal = maxTransfersTotal; + LogFilename = logFilename; + } + + + #region Public Members + public int AltInterfaceId; + + public bool ConfigureDevice(out WINUSB_PIPE_INFORMATION pipeInfo, + out UsbK usb, + out USB_INTERFACE_DESCRIPTOR interfaceDescriptor) + { + bool success; + Console.WriteLine("Finding usb device by VID/PID.. ({0:X4}h / {1:X4}h)", + Vid, + Pid); + + // Use a patttern match to include only matching devices. + // NOTE: You can use the '*' and '?' chars as wildcards for all chars or a single char (respectively). + KLST_PATTERN_MATCH patternMatch = new KLST_PATTERN_MATCH(); + if (MI != -1) + patternMatch.DeviceID = String.Format("USB\\VID_{0:X4}&PID_{1:X4}&MI_{2:X2}*", + Vid, + Pid, + MI); + else + patternMatch.DeviceID = String.Format("USB\\VID_{0:X4}&PID_{1:X4}*", + Vid, + Pid); + + LstK deviceList = new LstK(KLST_FLAG.NONE, + ref patternMatch); + KLST_DEVINFO_HANDLE deviceInfo; + interfaceDescriptor = new USB_INTERFACE_DESCRIPTOR(); + pipeInfo = new WINUSB_PIPE_INFORMATION(); + usb = null; + + // Iterate the devices looking for a matching alt-interface and endpoint id. + while (deviceList.MoveNext(out deviceInfo)) + { + // libusbK class contructors can throw exceptions; For instance, if the device is + // using the WinUsb driver and already in-use by another application. + Console.WriteLine("Opening usb device.."); + usb = new UsbK(deviceInfo); + + Console.WriteLine("Finding interface and endpoint by PipeId.."); + success = FindPipeAndInterface(usb, + out interfaceDescriptor, + out pipeInfo); + if (success) break; + + Console.WriteLine("PipeId {0:X2}h not found on this device.", + PipeId); + usb.Free(); + usb = null; + } + if (ReferenceEquals(usb, + null)) + { + Console.WriteLine("Usb device not found: {0}", + patternMatch.DeviceID); + success = false; + goto Done; + } + + MI = interfaceDescriptor.bInterfaceNumber; + AltInterfaceId = interfaceDescriptor.bAlternateSetting; + PipeId = pipeInfo.PipeId; + + // Set interface alt setting. + Console.WriteLine("Setting interface #{0} to bAlternateSetting #{1}..", + interfaceDescriptor.bInterfaceNumber, + interfaceDescriptor.bAlternateSetting); + success = usb.SetAltInterface(interfaceDescriptor.bInterfaceNumber, + false, + interfaceDescriptor.bAlternateSetting); + if (!success) + { + Console.WriteLine("SetAltInterface failed. ErrorCode={0:X8}h", + Marshal.GetLastWin32Error()); + Console.WriteLine(interfaceDescriptor.ToString()); + } + + Done: + deviceList.Free(); + + return success; + } + + public HiPerfTimer Dcs = new HiPerfTimer(); + + public void FillFromCommandLine(string commandLine) + { + commandLine = Regex.Replace(commandLine, + "^(\".+?\"|\\S+)\\s*", + ""); + string exp = String.Empty; + exp += makeArgExpression("Vid", + NumberStyles.HexNumber) + "|"; + exp += makeArgExpression("Pid", + NumberStyles.HexNumber) + "|"; + exp += makeArgExpression("PipeId", + NumberStyles.HexNumber) + "|"; + exp += makeArgExpression("AltId", + NumberStyles.Integer) + "|"; + exp += makeArgExpression("MI", + NumberStyles.Integer) + "|"; + exp += makeArgExpression("Log", + NumberStyles.None); + + m_CommandArguments = Regex.Matches(commandLine, + exp, + RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase | + RegexOptions.IgnorePatternWhitespace); + + foreach (Match m in m_CommandArguments) + { + Group gVid = m.Groups["Vid"]; + Group gPid = m.Groups["Pid"]; + Group gMI = m.Groups["MI"]; + Group gPipeId = m.Groups["PipeId"]; + Group gAltId = m.Groups["AltId"]; + Group gLog = m.Groups["Log"]; + Group gIsHex = m.Groups["IsHex"]; + + if (gVid.Success) + Vid = gIsHex.Success + ? UInt16.Parse(gVid.Value, + NumberStyles.HexNumber) + : UInt16.Parse(gVid.Value); + else if (gPid.Success) + Pid = gIsHex.Success + ? UInt16.Parse(gPid.Value, + NumberStyles.HexNumber) + : UInt16.Parse(gPid.Value); + else if (gMI.Success) + MI = gIsHex.Success + ? UInt16.Parse(gMI.Value, + NumberStyles.HexNumber) + : UInt16.Parse(gMI.Value); + else if (gPipeId.Success) + PipeId = gIsHex.Success + ? Byte.Parse(gPipeId.Value, + NumberStyles.HexNumber) + : Byte.Parse(gPipeId.Value); + else if (gAltId.Success) + AltInterfaceId = gIsHex.Success + ? Byte.Parse(gAltId.Value, + NumberStyles.HexNumber) + : Byte.Parse(gAltId.Value); + else if (gLog.Success) + LogFilename = gLog.Value; + else + { + throw new Exception("Invalid argument:" + m.Value); + } + } + } + + public bool FindPipeAndInterface(UsbK usb, + out USB_INTERFACE_DESCRIPTOR interfaceDescriptor, + out WINUSB_PIPE_INFORMATION pipeInfo) + { + if (FindPipeAndInterface(usb, + out interfaceDescriptor, + out pipeInfo, + AltInterfaceId, + PipeId)) + { + AltInterfaceId = interfaceDescriptor.bAlternateSetting; + PipeId = pipeInfo.PipeId; + + return true; + } + return false; + } + + public static bool FindPipeAndInterface(UsbK usb, + out USB_INTERFACE_DESCRIPTOR interfaceDescriptor, + out WINUSB_PIPE_INFORMATION pipeInfo, + int altInterfaceId, + int pipeId) + { + byte interfaceIndex = 0; + interfaceDescriptor = new USB_INTERFACE_DESCRIPTOR(); + pipeInfo = new WINUSB_PIPE_INFORMATION(); + while (usb.SelectInterface(interfaceIndex, + true)) + { + byte altSettingNumber = 0; + while (usb.QueryInterfaceSettings(altSettingNumber, + out interfaceDescriptor)) + { + if (altInterfaceId == -1 || altInterfaceId == altSettingNumber) + { + byte pipeIndex = 0; + while (usb.QueryPipe(altSettingNumber, + pipeIndex++, + out pipeInfo)) + { + if ((pipeInfo.MaximumPacketSize > 0) && + pipeId == -1 || pipeInfo.PipeId == pipeId || + ((pipeId & 0xF) == 0 && ((pipeId & 0x80) == (pipeInfo.PipeId & 0x80)))) + { + goto FindInterfaceDone; + } + pipeInfo.PipeId = 0; + } + } + altSettingNumber++; + } + interfaceIndex++; + } + + FindInterfaceDone: + return pipeInfo.PipeId != 0; + } + + public void Free() + { + if (fileLoggingEnabled && logStream != null) + { + logStream.Flush(); + logStream.Close(); + logStream = null; + } + } + + public void Init() + { + if (!String.IsNullOrEmpty(LogFilename)) + { + logStream = new StreamWriter(LogFilename); + fileLoggingEnabled = true; + } + } + + public void Log(String text) + { + if (fileLoggingEnabled) logStream.Write(text); + else Console.Write(text); + } + + public void Log(String format, + params object[] args) + { + if (fileLoggingEnabled) + logStream.Write(format, + args); + else + Console.Write(format, + args); + } + + public string LogFilename; + + public void LogLn(String text) + { + if (fileLoggingEnabled) logStream.WriteLine(text); + else Console.WriteLine(text); + } + + public void LogLn(String format, + params object[] args) + { + if (fileLoggingEnabled) + logStream.WriteLine(format, + args); + else + Console.WriteLine(format, + args); + } + + public int MI; + public int MaxTransfersTotal; + public int Pid; + public int PipeId; + + public bool ShowTestReady() + { + while (Console.KeyAvailable) + Console.ReadKey(true); + + Console.WriteLine("Test ready:"); + Console.Write(ToString()); + + if (!String.IsNullOrEmpty(LogFilename)) + Console.WriteLine("Logging output to file: {0}", + LogFilename); + + Console.WriteLine("Press 'Q' to abort or any other key to continue.."); + ConsoleKeyInfo key = Console.ReadKey(true); + if (key.KeyChar == 'q' || key.KeyChar == 'Q') return false; + + Console.WriteLine(); + Console.WriteLine("Starting test.."); + Console.WriteLine(); + + return true; + } + + public override string ToString() + { + return + String.Format( + "Vid: {0:X4}h\nPid: {1:X4}h\nMI: {2:X2}h\nPipeId: {3:X2}h\nMaxTransfersTotal: {4}\n\nLogFilename: {5}\n", + Vid, + Pid, + MI, + PipeId, + MaxTransfersTotal, + LogFilename); + } + + public int Vid; + #endregion + + + #region Private Members + private bool fileLoggingEnabled; + + private StreamWriter logStream; + private MatchCollection m_CommandArguments; + + private string makeArgExpression(string argName, + NumberStyles argType) + { + const string argsep = @"\W\s*"; + + switch (argType) + { + case NumberStyles.None: + return String.Format(@"(({0}{1}(?<{0}>{2}))\s*)", + argName, + argsep, + "(\".+?\"|\\S+)"); + case NumberStyles.Integer: + case NumberStyles.HexNumber: + return String.Format(@"(({0}{1}(?0x)?(?<{0}>[0-9A-F]+))(?h)?\s*)", + argName, + argsep); + default: + throw new Exception(); + } + } + #endregion + } + + internal class IsoTestParameters : TestParameters + { + #region Public Members + public IsoTestParameters(int vid, + int pid, + int altInterfaceId, + int pipeId, + int maxOutstandingTransfers, + int maxTransfersTotal, + string logFilename, + int isoPacketsPerTransfer) + : base(vid, + pid, + altInterfaceId, + pipeId, + maxTransfersTotal, + logFilename) + { + IsoPacketsPerTransfer = isoPacketsPerTransfer; + MaxOutstandingTransfers = maxOutstandingTransfers; + + FillFromCommandLine(Environment.CommandLine); + Init(); + } + + public int IsoPacketsPerTransfer; + public int MaxOutstandingTransfers; + + public override string ToString() + { + string fmt = String.Empty; + fmt += "IsoPacketsPerTransfer: {0}\n"; + fmt += "MaxOutstandingTransfers: {1}\n"; + + object[] args = new object[] + { + IsoPacketsPerTransfer, MaxOutstandingTransfers + }; + return base.ToString() + string.Format(fmt, + args); + } + #endregion + } + + internal class StmTestParameters : TestParameters + { + #region Public Members + public StmTestParameters(int vid, + int pid, + int altInterfaceId, + byte pipeId, + int maxTransfersTotal, + string logFilename, + int transferBufferSize, + int maxPendingIO, + int maxPendingTransfers) + : base(vid, + pid, + altInterfaceId, + pipeId, + maxTransfersTotal, + logFilename) + { + TransferBufferSize = transferBufferSize; + MaxPendingIO = maxPendingIO; + MaxPendingTransfers = maxPendingTransfers; + + FillFromCommandLine(Environment.CommandLine); + Init(); + } + + public int MaxPendingIO; + public int MaxPendingTransfers; + + public override string ToString() + { + string fmt = String.Empty; + fmt += "TransferBufferSize: {0}\n"; + fmt += "MaxPendingIO: {1}\n"; + fmt += "MaxPendingTransfers: {2}\n"; + + object[] args = new object[] + { + TransferBufferSize, MaxPendingIO, MaxPendingTransfers + }; + return base.ToString() + string.Format(fmt, + args); + } + + public int TransferBufferSize; + #endregion + } + + internal class AsyncTestParameters : TestParameters + { + #region Public Members + public AsyncTestParameters(int vid, + int pid, + int altInterfaceId, + byte pipeId, + int maxTransfersTotal, + string logFilename, + int transferBufferSize, + int maxPendingIO) + : base(vid, + pid, + altInterfaceId, + pipeId, + maxTransfersTotal, + logFilename) + { + TransferBufferSize = transferBufferSize; + MaxPendingIO = maxPendingIO; + + FillFromCommandLine(Environment.CommandLine); + Init(); + } + + public int MaxPendingIO; + + public override string ToString() + { + string fmt = String.Empty; + fmt += "TransferBufferSize: {0}\n"; + fmt += "MaxPendingIO: {1}\n"; + + object[] args = new object[] + { + TransferBufferSize, MaxPendingIO + }; + return base.ToString() + string.Format(fmt, + args); + } + + public int TransferBufferSize; + #endregion + } +} \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Xfer.Async/Program.cs b/Old Matlab Interface/bindings/examples_csharp/Xfer.Async/Program.cs new file mode 100644 index 00000000..0ba38030 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Xfer.Async/Program.cs @@ -0,0 +1,210 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2011-2012 Travis Robinson +// All rights reserved. +// +// Xfer.Async +// +// Last Updated: 03.09.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +#define BMFW + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Runtime.InteropServices; +using Test.Devices; +using libusbK; +using libusbK.Examples; + +// ReSharper disable InconsistentNaming + +namespace Xfer.Async +{ + internal class Program + { + #region TODO USER: Set the test parameters for your device. + + public static AsyncTestParameters Test = new AsyncTestParameters(0x04d8, 0xfa2e, 0, 0x81, 9, null, -1, 3); + + #endregion + + private static void Main() + { + bool success; + + WINUSB_PIPE_INFORMATION pipeInfo; + UsbK usb; + USB_INTERFACE_DESCRIPTOR interfaceDescriptor; + + // Find and configure the device. + if (!Test.ConfigureDevice(out pipeInfo, out usb, out interfaceDescriptor)) return; + if (Test.TransferBufferSize == -1) + Test.TransferBufferSize = pipeInfo.MaximumPacketSize * 64; + +#if BMFW + // TODO FOR USER: Remove this block if not using benchmark firmware. + // This configures devices running benchmark firmware for streaming DeviceToHost transfers. + Console.WriteLine("Configuring for benchmark device.."); + BM_TEST_TYPE testType = ((Test.PipeId & 0x80) > 0) ? BM_TEST_TYPE.READ : BM_TEST_TYPE.WRITE; + success = Benchmark.Configure(usb, BM_COMMAND.SET_TEST, interfaceDescriptor.bInterfaceNumber, ref testType); + if (!success) + { + Console.WriteLine("Bench_Configure failed."); + } +#endif + if (!Test.ShowTestReady()) goto Done; + + /* In most cases, you should clear the pipe timeout policy before using asynchronous I/O. (INFINITE) + * This decreases overhead in the driver and generally we managed the timeout ourselves from user code. + * + * Set the PIPE_TRANSFER_TIMEOUT policy to INFINITE: + */ + int[] pipeTimeoutMS = new[] {0}; + usb.SetPipePolicy((byte) Test.PipeId, + (int) PipePolicyType.PIPE_TRANSFER_TIMEOUT, + Marshal.SizeOf(typeof (int)), + pipeTimeoutMS); + + + /* In some cases, you may want to set the RAW_IO pipe policy. This will impose more restrictions on the + * allowable transfer buffer sizes but will improve performance. (See documentation for restrictions) + * + * Set the RAW_IO policy to TRUE: + */ + int[] useRawIO = new[] {1}; + usb.SetPipePolicy((byte)Test.PipeId, + (int)PipePolicyType.RAW_IO, + Marshal.SizeOf(typeof(int)), + useRawIO); + + int totalSubmittedTransfers = 0; + int totalCompletedTransfers = 0; + + /* We need a different buffer for each MaxPendingIO slot because they will all be submitted to the driver + * (outstanding) at the same time. + */ + byte[][] transferBuffers = new byte[Test.MaxPendingIO][]; + + OvlK ovlPool = new OvlK(usb.Handle, Test.MaxPendingIO, KOVL_POOL_FLAG.NONE); + List transferBufferGCList = new List(Test.MaxPendingIO); + success = true; + + // Start transferring data synchronously; one transfer at a time until the test limit (MaxTransfersTotal) is hit. + while (success && totalCompletedTransfers < Test.MaxTransfersTotal) + { + KOVL_HANDLE ovlHandle; + int transferred; + while (success && totalSubmittedTransfers < Test.MaxTransfersTotal) + { + // Get the next KOVL_HANDLE + if (!ovlPool.Acquire(out ovlHandle)) + { + // This example expects a failure of NoMoreItems when the pool has no more handles to acquire. This is + // our indication that it is time to begin waiting for a completion. + Debug.Assert(Marshal.GetLastWin32Error() == ErrorCodes.NoMoreItems); + break; + } + + // Get the next transfer buffer + int transferBufferIndex = totalSubmittedTransfers % Test.MaxPendingIO; + if (transferBuffers[transferBufferIndex] == null) + { + /* This index has not been allocated yet. We need a different buffer for each MaxPendingIO + * slot because they will all be submitted to the driver (outstanding) at the same time. + */ + + Console.WriteLine("Allocating transfer buffer at index:{0}", transferBufferIndex); + transferBuffers[transferBufferIndex] = new byte[Test.TransferBufferSize]; + + // Transfer buffers should be pinned so the garbage collector cannot move the memory. + transferBufferGCList.Add(GCHandle.Alloc(transferBuffers[transferBufferIndex], GCHandleType.Pinned)); + } + + byte[] transferBuffer = transferBuffers[transferBufferIndex]; + + int not_used_for_async; + if ((Test.PipeId & AllKConstants.USB_ENDPOINT_DIRECTION_MASK) > 0) + { + success = usb.ReadPipe((byte) Test.PipeId, transferBuffer, transferBuffer.Length, out not_used_for_async, ovlHandle); + } + else + { + FillMyBufferForWrite(transferBuffer, out transferred); + success = usb.WritePipe((byte)Test.PipeId, transferBuffer, transferred, out not_used_for_async, ovlHandle); + } + + if (Marshal.GetLastWin32Error() == ErrorCodes.IoPending) + { + success = true; + totalSubmittedTransfers++; + Console.WriteLine("Pending #{0:0000} {1} bytes.", totalSubmittedTransfers, transferBuffer.Length); + } + else + Console.WriteLine("Pending #{0:0000} failed. ErrorCode={1:X8}h", totalSubmittedTransfers, Marshal.GetLastWin32Error()); + } + if (!success) break; + + // Wait for the oldest transfer to complete and release the ovlHandle to the pool so it can be re-acquired. + success = ovlPool.WaitOldest(out ovlHandle, 1000, KOVL_WAIT_FLAG.RELEASE_ALWAYS, out transferred); + totalCompletedTransfers++; + + if (success) + { + if ((Test.PipeId & AllKConstants.USB_ENDPOINT_DIRECTION_MASK) > 0) + { + ProcessMyBufferFromRead(transferBuffers[(totalCompletedTransfers-1) % Test.MaxPendingIO], transferred); + } + Console.WriteLine("Complete #{0:0000} {1} bytes.", totalCompletedTransfers, transferred); + } + else + Console.WriteLine("Complete #{0:0000} Wait failed. ErrorCode={1:X8}h", totalCompletedTransfers, Marshal.GetLastWin32Error()); + } + + if (!success) + Console.WriteLine("An error occured transferring data. ErrorCode: {0:X8}h", Marshal.GetLastWin32Error()); + + ovlPool.Free(); + + // Free the GC handles allocated for the transfer buffers + foreach (GCHandle gcHandle in transferBufferGCList) + gcHandle.Free(); + + Done: + usb.Free(); + } + + #region TODO USER: Use these functions to process and fill the transfer buffers + + private static void ProcessMyBufferFromRead(byte[] transferBuffer, int transferred) + { + } + + private static void FillMyBufferForWrite(byte[] transferBuffer, out int length) + { + length = transferBuffer.Length; + } + + #endregion + } +} \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Xfer.Async/Properties/AssemblyInfo.cs b/Old Matlab Interface/bindings/examples_csharp/Xfer.Async/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..5e9d6a49 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Xfer.Async/Properties/AssemblyInfo.cs @@ -0,0 +1,69 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// AssemblyInfo.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.Reflection; +using System.Runtime.InteropServices; + + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyTitle("Xfer.Async")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Xfer.Async")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("bfe3ff24-a3d7-4ccc-b010-df007284dc6a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Xfer.Async/Xfer.Async.csproj b/Old Matlab Interface/bindings/examples_csharp/Xfer.Async/Xfer.Async.csproj new file mode 100644 index 00000000..cdb959ec --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Xfer.Async/Xfer.Async.csproj @@ -0,0 +1,62 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {67C87F34-0DD6-41DB-B95B-0BFF24D8C4E8} + Exe + Properties + Xfer.Async + Xfer.Async + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + libusbK.cs + + + Common\BenchmarkTestDevice.cs + + + Common\HiPerfTimer.cs + + + Common\TestParameters.cs + + + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Xfer.Sync/Program.cs b/Old Matlab Interface/bindings/examples_csharp/Xfer.Sync/Program.cs new file mode 100644 index 00000000..02a976c5 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Xfer.Sync/Program.cs @@ -0,0 +1,109 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2011-2012 Travis Robinson +// All rights reserved. +// +// Xfer.Sync +// +// Last Updated: 03.08.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +#define BMFW + +using System; +using System.Runtime.InteropServices; +using Test.Devices; +using libusbK; +using libusbK.Examples; + +// ReSharper disable InconsistentNaming + +namespace Xfer.Sync +{ + internal class Program + { + #region TODO USER: Set the test parameters for your device. + + public static StmTestParameters Test = new StmTestParameters(0x04d8, 0xfa2e, 0, 0x01, 1024, null, -1, 4, 64); + + #endregion + + private static void Main() + { + bool success; + WINUSB_PIPE_INFORMATION pipeInfo; + UsbK usb; + USB_INTERFACE_DESCRIPTOR interfaceDescriptor; + + // Find and configure the device. + if (!Test.ConfigureDevice(out pipeInfo, out usb, out interfaceDescriptor)) return; + if (Test.TransferBufferSize == -1) + Test.TransferBufferSize = pipeInfo.MaximumPacketSize*64; + +#if BMFW + // TODO FOR USER: Remove this block if not using benchmark firmware. + // This configures devices running benchmark firmware for streaming DeviceToHost transfers. + Console.WriteLine("Configuring for benchmark device.."); + BM_TEST_TYPE testType = ((Test.PipeId & 0x80) > 0) ? BM_TEST_TYPE.READ : BM_TEST_TYPE.WRITE; + success = Benchmark.Configure(usb, BM_COMMAND.SET_TEST, interfaceDescriptor.bInterfaceNumber, ref testType); + if (!success) + { + Console.WriteLine("Bench_Configure failed."); + } +#endif + if (!Test.ShowTestReady()) goto Done; + + // In most cases, you should to set the pipe timeout policy before using synchronous I/O. + // By default, sync transfers wait infinitely for a transfer to complete. + + // Set the pipe timeout policy to 3000ms + int[] pipeTimeoutMS = new[] {3000}; + usb.SetPipePolicy( + (byte) Test.PipeId, + (int) PipePolicyType.PIPE_TRANSFER_TIMEOUT, + Marshal.SizeOf(typeof (int)), + pipeTimeoutMS); + + int totalTransfers = 0; + success = true; + byte[] tempBuffer = new byte[Test.TransferBufferSize]; + while (success && totalTransfers++ < Test.MaxTransfersTotal) + { + int transferred; + if ((Test.PipeId & 0x80) > 0) + success = usb.ReadPipe((byte) Test.PipeId, tempBuffer, tempBuffer.Length, out transferred, IntPtr.Zero); + else + success = usb.WritePipe((byte) Test.PipeId, tempBuffer, tempBuffer.Length, out transferred, IntPtr.Zero); + + Console.WriteLine("#{0:0000} Transferred {1} bytes.", totalTransfers, transferred); + } + + if (!success) + { + Console.WriteLine("An error occured transferring data. ErrorCode: {0:X8}h", Marshal.GetLastWin32Error()); + } + + Done: + usb.Free(); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Xfer.Sync/Properties/AssemblyInfo.cs b/Old Matlab Interface/bindings/examples_csharp/Xfer.Sync/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..1be234ab --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Xfer.Sync/Properties/AssemblyInfo.cs @@ -0,0 +1,69 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// AssemblyInfo.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.Reflection; +using System.Runtime.InteropServices; + + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyTitle("Xfer.Sync")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Xfer.Sync")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("bd85bac8-7975-4bcd-8e0b-b0e84e558546")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Xfer.Sync/Xfer.Sync.csproj b/Old Matlab Interface/bindings/examples_csharp/Xfer.Sync/Xfer.Sync.csproj new file mode 100644 index 00000000..1479c989 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Xfer.Sync/Xfer.Sync.csproj @@ -0,0 +1,62 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {68CE8DCE-504B-4C73-B788-F6BB7911EDAA} + Exe + Properties + Xfer.Sync + Xfer.Sync + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + libusbK.cs + + + Common\BenchmarkTestDevice.cs + + + Common\HiPerfTimer.cs + + + Common\TestParameters.cs + + + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Xfer.Threaded.Stream/Program.cs b/Old Matlab Interface/bindings/examples_csharp/Xfer.Threaded.Stream/Program.cs new file mode 100644 index 00000000..c8e97154 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Xfer.Threaded.Stream/Program.cs @@ -0,0 +1,140 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2011-2012 Travis Robinson +// All rights reserved. +// +// Xfer.Stm +// +// Last Updated: 03.08.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +#define BMFW + +using System; +using System.Runtime.InteropServices; +using System.Threading; +using Test.Devices; +using libusbK; +using libusbK.Examples; + +// ReSharper disable InconsistentNaming + +namespace Xfer.Stm +{ + internal class Program + { + #region TODO USER: Set the test parameters for your device. + + public static StmTestParameters Test = new StmTestParameters(0x04d8, 0xfa2e, 0, 0x81, 1024, null, -1, 4, 64); + + #endregion + + private static void Main() + { + bool success; + WINUSB_PIPE_INFORMATION pipeInfo; + UsbK usb; + USB_INTERFACE_DESCRIPTOR interfaceDescriptor; + + // Find and configure the device. + if (!Test.ConfigureDevice(out pipeInfo, out usb, out interfaceDescriptor)) return; + if (Test.TransferBufferSize == -1) + Test.TransferBufferSize = pipeInfo.MaximumPacketSize*64; + +#if BMFW + // TODO FOR USER: Remove this block if not using benchmark firmware. + // This configures devices running benchmark firmware for streaming DeviceToHost transfers. + Console.WriteLine("Configuring for benchmark device.."); + BM_TEST_TYPE testType = ((Test.PipeId & 0x80) > 0) ? BM_TEST_TYPE.READ : BM_TEST_TYPE.WRITE; + success = Benchmark.Configure(usb, BM_COMMAND.SET_TEST, interfaceDescriptor.bInterfaceNumber, ref testType); + if (!success) + { + Console.WriteLine("Bench_Configure failed."); + } +#endif + if (!Test.ShowTestReady()) goto Done; + + KSTM_CALLBACK callback = new KSTM_CALLBACK(); + StmK stm = new StmK( + usb.Handle, + pipeInfo.PipeId, + Test.TransferBufferSize, + Test.MaxPendingTransfers, + Test.MaxPendingIO, + ref callback, + KSTM_FLAG.USE_TIMEOUT | (KSTM_FLAG) 3000); + + byte[] tempBuffer = new byte[Test.TransferBufferSize]; + + Thread.Sleep(0); + // This is just a counter/timer for statistics gathering. + Test.Dcs.Start(); + success = stm.Start(); + + long totalTransferCount = 0; + while (success) + { + int transferred; + if ((pipeInfo.PipeId & 0x80) == 0x80) + { + success = stm.Read(tempBuffer, 0, tempBuffer.Length, out transferred); + if (!success) break; + } + else + { + success = stm.Write(tempBuffer, 0, tempBuffer.Length, out transferred); + if (!success) break; + } + + string dataPrefix = String.Format(" Data Prefix: [{0:X2} {1:X2} {2:X2} {3:X2} {4:X2} {5:X2} {6:X2} {7:X2}] ", + tempBuffer[0], + tempBuffer[1], + tempBuffer[2], + tempBuffer[3], + tempBuffer[4], + tempBuffer[5], + tempBuffer[6], + tempBuffer[7]); + + Console.WriteLine( + totalTransferCount > Test.MaxTransfersTotal + ? "#{0}: [Stream Stopped] {1} transferred. {2}" + : "#{0}: {1} transferred. {2}", + totalTransferCount.ToString("0000"), + transferred, + dataPrefix); + + totalTransferCount++; + + if (totalTransferCount == Test.MaxTransfersTotal) + success = stm.Stop(3000); + } + + Console.WriteLine("Done. TotalTransfers:{0} ErrorCode:{1:X8}h", totalTransferCount, Marshal.GetLastWin32Error()); + + stm.Free(); + + Done: + usb.Free(); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Xfer.Threaded.Stream/Properties/AssemblyInfo.cs b/Old Matlab Interface/bindings/examples_csharp/Xfer.Threaded.Stream/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..ddc00a05 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Xfer.Threaded.Stream/Properties/AssemblyInfo.cs @@ -0,0 +1,69 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// AssemblyInfo.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.Reflection; +using System.Runtime.InteropServices; + + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyTitle("Xfer.Threaded.Stream")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Xfer.Threaded.Stream")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("e66b3bbf-a288-4a3e-9468-2f3bfd7303f6")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Xfer.Threaded.Stream/Xfer.Stm.csproj b/Old Matlab Interface/bindings/examples_csharp/Xfer.Threaded.Stream/Xfer.Stm.csproj new file mode 100644 index 00000000..84b1c5d3 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Xfer.Threaded.Stream/Xfer.Stm.csproj @@ -0,0 +1,62 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {AB79B52F-49BA-4424-8DD3-CC61489EFC1E} + Exe + Properties + Xfer.Stm + Xfer.Stm + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + libusbK.cs + + + Common\BenchmarkTestDevice.cs + + + Common\HiPerfTimer.cs + + + Common\TestParameters.cs + + + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Xfer.UsbStream/Program.cs b/Old Matlab Interface/bindings/examples_csharp/Xfer.UsbStream/Program.cs new file mode 100644 index 00000000..448c3b1d --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Xfer.UsbStream/Program.cs @@ -0,0 +1,187 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2011-2012 Travis Robinson +// All rights reserved. +// +// Xfer.UsbStream +// +// Last Updated: 03.08.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +#define BMFW + +using System; +using System.Diagnostics; +using System.IO; +using System.Threading; +using Test.Devices; +using libusbK; +using libusbK.Examples; + +namespace Xfer.UsbStream +{ + internal class Program + { + #region TODO USER: Set the test parameters for your device. + + public static StmTestParameters Test = new StmTestParameters(0x04d8, 0xfa2e, 0, 0x81, 1024, null, -1, 4, 64); + + #endregion + + private static bool FormatBrokenStrings(int fixedLength, string preAdd, ref string sPartialRead, ref string sRead) + { + if (sRead.Length != fixedLength) + { + // partial read. + if (!String.IsNullOrEmpty(sPartialRead)) + { + sPartialRead += sRead; + if (sPartialRead.Length != fixedLength) + return false; + + sRead = sPartialRead; + sPartialRead = String.Empty; + } + else + { + sPartialRead = sRead; + return false; + } + } + sRead = preAdd + sRead.Substring(preAdd.Length); + return true; + } + + private static void Main() + { + bool success; + UsbK usb; + WINUSB_PIPE_INFORMATION pipeInfoRead; + USB_INTERFACE_DESCRIPTOR interfaceDescriptorRead; + + WINUSB_PIPE_INFORMATION pipeInfoWrite; + USB_INTERFACE_DESCRIPTOR interfaceDescriptorWrite; + + // Find the IN endpoint and configure the device. + Test.PipeId = Test.PipeId | AllKConstants.USB_ENDPOINT_DIRECTION_MASK; + if (!Test.ConfigureDevice(out pipeInfoRead, out usb, out interfaceDescriptorRead)) return; + + // Find the OUT endpoint. + Test.PipeId = Test.PipeId & ~AllKConstants.USB_ENDPOINT_DIRECTION_MASK; + if (!Test.FindPipeAndInterface(usb, out interfaceDescriptorWrite, out pipeInfoWrite)) return; + + Debug.Assert( + interfaceDescriptorRead.bInterfaceNumber == interfaceDescriptorWrite.bInterfaceNumber, + "This example requires the IN and OUT endpoints have the same bInterfaceNumber."); + + Debug.Assert( + pipeInfoRead.MaximumPacketSize > 0 && + pipeInfoRead.MaximumPacketSize == pipeInfoWrite.MaximumPacketSize, + "This example requires the IN and OUT endpoints have the same MaximumPacketSize."); + + // We will keep the buffer >= 1024. + // To satisfy StmK it must also be an interval of MaximumPacketSize + if (Test.TransferBufferSize == -1) + Test.TransferBufferSize = pipeInfoWrite.MaximumPacketSize * ((1024 + pipeInfoWrite.MaximumPacketSize-1) / pipeInfoWrite.MaximumPacketSize); + +#if BMFW + // TODO FOR USER: Remove this block if not using benchmark firmware. + // This configures devices running benchmark firmware for streaming DeviceToHost transfers. + Console.WriteLine("Configuring for benchmark device.."); + BM_TEST_TYPE testType = BM_TEST_TYPE.LOOP; + success = Benchmark.Configure(usb, BM_COMMAND.SET_TEST, interfaceDescriptorRead.bInterfaceNumber, ref testType); + if (!success) + { + Console.WriteLine("Bench_Configure failed."); + } +#endif + if (!Test.ShowTestReady()) goto Done; + + UsbStream stmRead = new UsbStream(usb, + pipeInfoRead.PipeId, + Test.TransferBufferSize, + Test.MaxPendingTransfers, + Test.MaxPendingIO, + true, + 1); + UsbStream stmWrite = new UsbStream(usb, + pipeInfoWrite.PipeId, + Test.TransferBufferSize, + Test.MaxPendingTransfers, + Test.MaxPendingIO, + true, + 3000); + + StreamReader stmReader = new StreamReader(stmRead); + StreamWriter stmWriter = new StreamWriter(stmWrite); + + stmRead.Start(); + stmWrite.Start(); + + Char[] chTemp = new char[Test.TransferBufferSize]; + while (stmReader.Read(chTemp, 0, chTemp.Length) > 0) + { + Console.WriteLine("Flushing packets.."); + } + string sWrite = String.Empty; + string sPartialRead = String.Empty; + string sRead; + const string lineFormat = "Tx#{0:000000} This string is being looped through endpoints {1:X2}h and {2:X2}h"; + int lineLength = String.Format(lineFormat, 0, 0, 0).Length; + + // This is a counter/timer used only for statistics gathering. + Thread.Sleep(0); + Test.Dcs.Start(); + + for (int iTransfers = 0; iTransfers < Test.MaxTransfersTotal; iTransfers++) + { + sWrite = String.Format(lineFormat, iTransfers, pipeInfoWrite.PipeId, pipeInfoRead.PipeId); + stmWriter.WriteLine(sWrite); + Console.WriteLine(sWrite); + + if ((iTransfers & 8) > 0) stmWriter.Flush(); + if (iTransfers <= 16 || (String.IsNullOrEmpty((sRead = stmReader.ReadLine())))) + continue; + + if (!FormatBrokenStrings(lineLength, "Rx", ref sPartialRead, ref sRead)) continue; + Console.WriteLine(sRead); + } + + stmWriter.Flush(); + while (!(String.IsNullOrEmpty((sRead = stmReader.ReadLine())))) + { + if (!FormatBrokenStrings(lineLength, "Rx", ref sPartialRead, ref sRead)) continue; + Console.WriteLine(sRead); + } + + Test.Dcs.Stop(); + TimeSpan ts = new TimeSpan(Test.Dcs.Ticks); + Console.WriteLine("Elapsed Time:\n\t{0} mins\n\t{1} secs\n\t{2} msecs", Math.Floor(ts.TotalMinutes), ts.Seconds, ts.Milliseconds); + + stmWriter.Dispose(); + stmReader.Dispose(); + + Done: + usb.Free(); + } + } +} \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Xfer.UsbStream/Properties/AssemblyInfo.cs b/Old Matlab Interface/bindings/examples_csharp/Xfer.UsbStream/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..be39bb28 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Xfer.UsbStream/Properties/AssemblyInfo.cs @@ -0,0 +1,69 @@ +#region Copyright(c) Travis Robinson +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// AssemblyInfo.cs +// +// Created: 03.05.2012 +// Last Updated: 03.05.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +#endregion + + +using System.Reflection; +using System.Runtime.InteropServices; + + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyTitle("Xfer.UsbStream")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Xfer.UsbStream")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("3d6a566f-2b7f-4ada-9e61-8691a59bd3bc")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Xfer.UsbStream/UsbStream.cs b/Old Matlab Interface/bindings/examples_csharp/Xfer.UsbStream/UsbStream.cs new file mode 100644 index 00000000..4280bc3c --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Xfer.UsbStream/UsbStream.cs @@ -0,0 +1,258 @@ +#region Copyright(c) Travis Robinson + +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// UsbStream.cs +// +// Created: 03.05.2012 +// Last Updated: 03.07.2012 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +using System; +using System.Diagnostics; +using System.IO; +using System.Runtime.InteropServices; +using libusbK; + +namespace Xfer.UsbStream +{ + // ReSharper disable InconsistentNaming + + public class UsbStream : Stream + { + public static bool UseCallbacks = true; + + private readonly KSTM_CALLBACK mCallbacks; + protected readonly byte mPipeId; + protected StmK mStm; + protected UsbK mUsb; + private bool mbDisposed; + + public UsbStream(UsbK usb, + byte pipeId, + int maxTransferSize, + int maxPendingTransfers, + int maxPendingIo, + bool useTimeout, + UInt16 timeout) + { + mUsb = usb; + mPipeId = pipeId; + + if (UseCallbacks) + { + mCallbacks.Complete = StmComplete; + if (((mPipeId & AllKConstants.USB_ENDPOINT_DIRECTION_MASK) > 0)) + { + mCallbacks.Submit = StmSubmitRead; + } + else + { + mCallbacks.Submit = StmSubmitWrite; + } + } + KSTM_FLAG flags = useTimeout ? KSTM_FLAG.USE_TIMEOUT | (KSTM_FLAG) timeout : KSTM_FLAG.NONE; + + mStm = new StmK(mUsb.Handle, + pipeId, + maxTransferSize, + maxPendingTransfers, + maxPendingIo, + ref mCallbacks, + flags); + } + + public override bool CanRead + { + get + { + return ((mPipeId & AllKConstants.USB_ENDPOINT_DIRECTION_MASK) > 0); + } + } + + public override bool CanSeek + { + get + { + return false; + } + } + + public override bool CanWrite + { + get + { + return ((mPipeId & AllKConstants.USB_ENDPOINT_DIRECTION_MASK) == 0); + } + } + + protected override void Dispose(bool disposing) + { + if (!mbDisposed) + { + mStm.Dispose(); + mStm = null; + mUsb = null; + mbDisposed = true; + } + base.Dispose(disposing); + } + + public override int Read(byte[] buffer, int offset, int count) + { + int transferred; + bool success = mStm.Read(buffer, offset, count, out transferred); + + Debug.WriteLineIf(!success, + String.Format("Failed reading from usb stream. ErrorCode={0:X8}h", + Marshal.GetLastWin32Error()), + "ERROR"); + + return !success ? 0 : transferred; + } + + public bool Start() + { + return mStm.Start(); + } + + public bool Stop(int timeoutCancelMs) + { + return mStm.Stop(timeoutCancelMs); + } + + public override void Write(byte[] buffer, int offset, int count) + { + int transferred; + + bool success = mStm.Write(buffer, offset, count, out transferred); + if (!success) + { + // This is caused by a lack of 'PendingTransfer' slots. + Debug.WriteLine( + String.Format("Failed writing to usb stream. ErrorCode={0:X8}h", + Marshal.GetLastWin32Error()), + "ERROR"); + return; + } + + // If the KSTM_FLAG.NO_PARTIAL_XFERS is *not* set, StmK will transfer as many bytes as it can and return true. + Debug.WriteLineIf(transferred != count, + String.Format("Not all bytes were written. Expected:{0} Transferred:{1}", + count, + transferred), + "ERROR"); + } + + public override void Flush() + { + } + + private int StmComplete(KSTM_INFO stmInfo, KSTM_XFER_CONTEXT xferContext, int stmXferContextIndex, int errorCode) + { + Debug.WriteLineIf(errorCode != ErrorCodes.Success, + String.Format("Failed completing transfer. PipeID:{0:X2}h ErrorCode:{1:X8}h", + mPipeId, + errorCode), + "ERROR"); + return errorCode; + } + + private int StmSubmitRead(KSTM_INFO info, + KSTM_XFER_CONTEXT xferContext, + int xferContextIndex, + IntPtr nativeOverlapped) + { + int notUsedForAsync; + int bufferSize = xferContext.BufferSize; + + bool success = mUsb.ReadPipe(mPipeId, xferContext.Buffer, bufferSize, out notUsedForAsync, nativeOverlapped); + int errorCode = Marshal.GetLastWin32Error(); + + if (!success && errorCode == ErrorCodes.IoPending) return ErrorCodes.Success; + + Debug.WriteLine( + String.Format("Failed submitting transfer. PipeID:{0:X2}h ErrorCode:{1:X8}h", + mPipeId, + errorCode), + "ERROR"); + return errorCode; + } + + private int StmSubmitWrite(KSTM_INFO info, + KSTM_XFER_CONTEXT xferContext, + int xferContextIndex, + IntPtr nativeOverlapped) + { + int notUsedForAsync; + int bufferSize = xferContext.TransferLength; + + bool success = mUsb.WritePipe(mPipeId, xferContext.Buffer, bufferSize, out notUsedForAsync, nativeOverlapped); + int errorCode = Marshal.GetLastWin32Error(); + + if (!success && errorCode == ErrorCodes.IoPending) return ErrorCodes.Success; + + Debug.WriteLine( + String.Format("Failed submitting transfer. PipeID:{0:X2}h ErrorCode:{1:X8}h", + mPipeId, + errorCode), + "ERROR"); + + return errorCode; + } + + #region Not Supported + + public override long Length + { + get + { + throw new NotSupportedException(); + } + } + + public override long Position + { + get + { + throw new NotSupportedException(); + } + set + { + throw new NotSupportedException(); + } + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + #endregion + } +} \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/Xfer.UsbStream/Xfer.UsbStream.csproj b/Old Matlab Interface/bindings/examples_csharp/Xfer.UsbStream/Xfer.UsbStream.csproj new file mode 100644 index 00000000..c230e609 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/Xfer.UsbStream/Xfer.UsbStream.csproj @@ -0,0 +1,106 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {6A4CD32B-560F-4967-9112-37B3FD5699CC} + Exe + Properties + Xfer.UsbStream + Xfer.UsbStream + v2.0 + 512 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + true + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + libusbK.cs + + + Common\BenchmarkTestDevice.cs + + + Common\HiPerfTimer.cs + + + Common\TestParameters.cs + + + + + + + + False + .NET Framework Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + \ No newline at end of file diff --git a/Old Matlab Interface/bindings/examples_csharp/libusbK_Examples.sln b/Old Matlab Interface/bindings/examples_csharp/libusbK_Examples.sln new file mode 100644 index 00000000..7c032cf3 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_csharp/libusbK_Examples.sln @@ -0,0 +1,62 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Read.Isochronous", "Read.Isochronous\Read.Isochronous.csproj", "{97DB9A34-994D-470E-A415-AC54ACD96713}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xfer.Stm", "Xfer.Threaded.Stream\Xfer.Stm.csproj", "{AB79B52F-49BA-4424-8DD3-CC61489EFC1E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hot.Plug.Detect", "Hot.Plug.Detect\Hot.Plug.Detect.csproj", "{E9566BFF-3BEC-4358-9871-C1700CB73C2B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "List.Devices", "List.Devices\List.Devices.csproj", "{4FA292D2-945A-48B5-B040-3AF7E482AB31}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xfer.Sync", "Xfer.Sync\Xfer.Sync.csproj", "{68CE8DCE-504B-4C73-B788-F6BB7911EDAA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xfer.Async", "Xfer.Async\Xfer.Async.csproj", "{67C87F34-0DD6-41DB-B95B-0BFF24D8C4E8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xfer.UsbStream", "Xfer.UsbStream\Xfer.UsbStream.csproj", "{6A4CD32B-560F-4967-9112-37B3FD5699CC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hot.Plug.Detect.GUI", "Hot.Plug.Detect.GUI\Hot.Plug.Detect.GUI.csproj", "{CFB108D9-5489-48D4-AAFD-5FBCB3C00582}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {97DB9A34-994D-470E-A415-AC54ACD96713}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {97DB9A34-994D-470E-A415-AC54ACD96713}.Debug|Any CPU.Build.0 = Debug|Any CPU + {97DB9A34-994D-470E-A415-AC54ACD96713}.Release|Any CPU.ActiveCfg = Release|Any CPU + {97DB9A34-994D-470E-A415-AC54ACD96713}.Release|Any CPU.Build.0 = Release|Any CPU + {AB79B52F-49BA-4424-8DD3-CC61489EFC1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB79B52F-49BA-4424-8DD3-CC61489EFC1E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AB79B52F-49BA-4424-8DD3-CC61489EFC1E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB79B52F-49BA-4424-8DD3-CC61489EFC1E}.Release|Any CPU.Build.0 = Release|Any CPU + {E9566BFF-3BEC-4358-9871-C1700CB73C2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E9566BFF-3BEC-4358-9871-C1700CB73C2B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9566BFF-3BEC-4358-9871-C1700CB73C2B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E9566BFF-3BEC-4358-9871-C1700CB73C2B}.Release|Any CPU.Build.0 = Release|Any CPU + {4FA292D2-945A-48B5-B040-3AF7E482AB31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4FA292D2-945A-48B5-B040-3AF7E482AB31}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4FA292D2-945A-48B5-B040-3AF7E482AB31}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4FA292D2-945A-48B5-B040-3AF7E482AB31}.Release|Any CPU.Build.0 = Release|Any CPU + {68CE8DCE-504B-4C73-B788-F6BB7911EDAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {68CE8DCE-504B-4C73-B788-F6BB7911EDAA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {68CE8DCE-504B-4C73-B788-F6BB7911EDAA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {68CE8DCE-504B-4C73-B788-F6BB7911EDAA}.Release|Any CPU.Build.0 = Release|Any CPU + {67C87F34-0DD6-41DB-B95B-0BFF24D8C4E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {67C87F34-0DD6-41DB-B95B-0BFF24D8C4E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {67C87F34-0DD6-41DB-B95B-0BFF24D8C4E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {67C87F34-0DD6-41DB-B95B-0BFF24D8C4E8}.Release|Any CPU.Build.0 = Release|Any CPU + {6A4CD32B-560F-4967-9112-37B3FD5699CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6A4CD32B-560F-4967-9112-37B3FD5699CC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6A4CD32B-560F-4967-9112-37B3FD5699CC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6A4CD32B-560F-4967-9112-37B3FD5699CC}.Release|Any CPU.Build.0 = Release|Any CPU + {CFB108D9-5489-48D4-AAFD-5FBCB3C00582}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CFB108D9-5489-48D4-AAFD-5FBCB3C00582}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CFB108D9-5489-48D4-AAFD-5FBCB3C00582}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CFB108D9-5489-48D4-AAFD-5FBCB3C00582}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Old Matlab Interface/bindings/examples_delphi/enumerate.dpr b/Old Matlab Interface/bindings/examples_delphi/enumerate.dpr new file mode 100644 index 00000000..25fbf807 --- /dev/null +++ b/Old Matlab Interface/bindings/examples_delphi/enumerate.dpr @@ -0,0 +1,99 @@ +program enumerate; + +{$APPTYPE CONSOLE} +uses + SysUtils, + libusbK in '..\libusbK.pas'; + +procedure EnumerateAttachedDevices; +var + deviceCount : Cardinal; + lDeviceList : KLST_HANDLE; + lDeviceInfo : KLST_DEVINFO_HANDLE; + i : Integer; +begin + deviceCount := 0; + lDeviceList := Nil; + lDeviceInfo := Nil; + // Get the device list + if (not LstK_Init(lDeviceList, 0)) then + begin + WriteLn('Error in LstK_Init!'); + Exit; + end; + try // make sure list is freed under all circumstances + LstK_Count(lDeviceList, deviceCount); + if (deviceCount = 0) then + begin + WriteLn('No devices found!'); + Exit; // lDeviceList is freed in finally + end; + i := -1; + while LstK_MoveNext(lDeviceList, lDeviceInfo) do + begin + Inc(i); + if Assigned(lDeviceInfo) then + begin + WriteLn('Device ',i,' ---------------------------------'); + WriteLn('VID: ',lDeviceInfo.Common.Vid); + WriteLn('PID: ',lDeviceInfo.Common.Pid); + WriteLn('MI: ',lDeviceInfo.Common.MI); + WriteLn('InstanceID: ',lDeviceInfo.Common.InstanceID); + WriteLn('DriverID: ',lDeviceInfo.DriverID); + WriteLn('DeviceInterfaceGUID: ',lDeviceInfo.DeviceInterfaceGUID); + WriteLn('InstanceID: ',lDeviceInfo.InstanceID); + WriteLn('ClassGUID: ',lDeviceInfo.ClassGUID); + WriteLn('Mfg: ',lDeviceInfo.Mfg); + WriteLn('DeviceDesc: ',lDeviceInfo.DeviceDesc); + WriteLn('Service: ',lDeviceInfo.Service); + WriteLn('SymbolicLink: ',lDeviceInfo.SymbolicLink); + WriteLn('DevicePath: ',lDeviceInfo.DevicePath); + WriteLn('LUsb0FilterIndex: ',lDeviceInfo.LUsb0FilterIndex); + if lDeviceInfo.Connected then + WriteLn('Connected: True') + else + WriteLn('Connected: False'); + WriteLn('SyncFlags: '+Format('%x',[lDeviceInfo.SyncFlags])); + end; + end; + finally + if Assigned(lDeviceList) then + LstK_Free(lDeviceList); + end; +end; + + +begin + WriteLn('libusbK Device enumeration demo'); + if not libusbK.DllAvailable then + begin + WriteLn('Error: '+libusbK.LIBUSBK_DLL+' not available!'); + Halt(1); + end; + EnumerateAttachedDevices; + WriteLn('libusbK Device enumeration done'); + +(* Example output +libusbK Device enumeration demo +Device 0 --------------------------------- +VID: 1204 +PID: 34323 +MI: -1 +InstanceID: 6&564E695&0&1 +DriverID: 0 +DeviceInterfaceGUID: {53373f62-b5e4-d526-b292-f86533b3e7df} +InstanceID: USB\Vid_04b4&Pid_8613\6&564e695&0&1 +ClassGUID: {ECFB0CFD-74C4-4F52-BBF7-343461CD72AC} +Mfg: Cypress Semiconductor Corp. +DeviceDesc: Cypress Generic USB Device (LibUSB) +Service: libusbK +SymbolicLink: \\?\USB#Vid_04b4&Pid_8613#6&564e695&0&1#{53373f62-b5e4-d526-b292-f86533b3e7df} +DevicePath: \\?\USB#Vid_04b4&Pid_8613#6&564e695&0&1#{53373f62-b5e4-d526-b292-f86533b3e7df} +LUsb0FilterIndex: -1 +Connected: True +SyncFlags: 0 +libusbK Device enumeration done +*) + + +end. diff --git a/Old Matlab Interface/bindings/examples_delphi/opendevice.dpr b/Old Matlab Interface/bindings/examples_delphi/opendevice.dpr new file mode 100644 index 00000000..ca0f7a9f --- /dev/null +++ b/Old Matlab Interface/bindings/examples_delphi/opendevice.dpr @@ -0,0 +1,136 @@ +program opendevice; + +{$APPTYPE CONSOLE} + +uses + SysUtils, Classes, + libusbK in '..\libusbK.pas', + UExampleHelpers; +var + VID, PID : Integer; +procedure EvaluateCommandLine; +var + i : Integer; + s, s0,s1 : String; + n : Integer; +begin + for i := 1 to ParamCount do + begin + s := Uppercase(ParamStr(i)); //copy the whole current param string and convert to upper cases + s0 := Copy(s,1,4); // copy the first 4 signs + if (s0 = 'VID=') or + (s0 = 'PID=') then + begin // we got a vid or pid parm + s1 := Copy(s,5,MaxInt); // copy everything behind the '=' + if Copy(s1,1,2) = '0X' then // check the c-style hex notation + s1 := '$'+ Copy(s1,3,MaxInt); // replace by delphi hex-notation + n := StrToIntDef(s1,-1); // convert, place -1 on any convert error + if (s0 = 'VID=') then + VID := n + else if (s0 = 'PID=') then + PID := n; + end; + end; +end; +const + UsbPipeTypeString : array[USBD_PIPE_TYPE] of String = ( + 'Control', + 'Isochronous', + 'Bulk,', + 'Interrupt' + ); + +var + devlist : TStringList; + i,j,k : Integer; + devhandle : KUSB_HANDLE; + pipeinfo : WINUSB_PIPE_INFORMATION; +begin + WriteLn('OpenDevice test for LibusbK'); + WriteLn('Returns Pipe info for all devices, or limited to a given VID/PID pair'); + WriteLn('usage:'); + WriteLn('opendevice [VID=nnnn] [PID=nnnn]'); + WriteLn('VID and PID may use decimal or hexadecimal notation'); + VID := -1; + PID := -1; + EvaluateCommandLine; + if VID < 0 then + WriteLn('VID is not used!') + else + WriteLn('VID used '+Format('%d (0x%x',[VID,VID])); + if VID < 0 then + WriteLn('PID is not used!') + else + WriteLn('PID used '+Format('%d (0x%x',[PID,PID])); + devlist := TStringList.Create; + try + ListLibusbKDevices(devlist,VID,PID); + if devlist.Count <= 0 then + begin + WriteLn('Error: No device found!'); + Exit; + end; + for i := 0 to devlist.Count-1 do + begin + if UsbK_InitFromDevicePath(devlist[i],devhandle) then + begin + try + WriteLn('Opened device "'+devlist[i]+'"'); + j := 0; + while UsbK_SetCurrentAlternateSetting(devhandle,j) do + begin + WriteLn('Using AlternateSetting ',j); + k := 0; + while UsbK_QueryPipe(devhandle,j,k,pipeinfo) do + begin + WriteLn(Format(' PipeId=0x%2.2x PipeType=0x%2.2x ("%s") Interval=%u MaximumPacketSize=%u', + [pipeInfo.PipeId, Byte(pipeInfo.PipeType),UsbPipeTypeString[pipeInfo.PipeType], pipeInfo.Interval, pipeInfo.MaximumPacketSize])); + Inc(k); + end; + Inc(j); + end; + finally + UsbK_Free(devhandle); + end; + end + else + WriteLn('Error: can not open device "'+devlist[i]+'"'); + end; + finally + devlist.Free; + end; +(* Example output +OpenDevice test for LibusbK +Returns Pipe info for all devices, or limited to a given VID/PID pair +usage: +opendevice [VID=nnnn] [PID=nnnn] +VID and PID may use decimal or hexadecimal notation +VID is not used! +PID is not used! +Opened device "\\?\USB#Vid_04b4&Pid_8613#6&1b8c4f52&0&1#{53373f62-b5e4-d526-b292 +-f86533b3e7df}" +Using AlternateSetting 0 +Using AlternateSetting 1 + PipeId=0x01 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 + PipeId=0x81 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 + PipeId=0x02 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 + PipeId=0x04 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 + PipeId=0x86 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 + PipeId=0x88 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 +Using AlternateSetting 2 + PipeId=0x01 PipeType=0x03 ("Interrupt") Interval=1 MaximumPacketSize=64 + PipeId=0x81 PipeType=0x03 ("Interrupt") Interval=1 MaximumPacketSize=64 + PipeId=0x02 PipeType=0x03 ("Interrupt") Interval=1 MaximumPacketSize=512 + PipeId=0x04 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 + PipeId=0x86 PipeType=0x03 ("Interrupt") Interval=1 MaximumPacketSize=512 + PipeId=0x88 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 +Using AlternateSetting 3 + PipeId=0x01 PipeType=0x03 ("Interrupt") Interval=1 MaximumPacketSize=64 + PipeId=0x81 PipeType=0x03 ("Interrupt") Interval=1 MaximumPacketSize=64 + PipeId=0x02 PipeType=0x01 ("Isochronous") Interval=1 MaximumPacketSize=512 + PipeId=0x04 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512 + PipeId=0x86 PipeType=0x01 ("Isochronous") Interval=1 MaximumPacketSize=512 + PipeId=0x88 PipeType=0x02 ("Bulk,") Interval=0 MaximumPacketSize=512} +*) + +end. diff --git a/Old Matlab Interface/bindings/libusbK.boo b/Old Matlab Interface/bindings/libusbK.boo new file mode 100644 index 00000000..64876bbd --- /dev/null +++ b/Old Matlab Interface/bindings/libusbK.boo @@ -0,0 +1,3290 @@ +ERROR: Z:\SVNMAIN\GoogleCode\usb-travis\trunk\libusbK\bindings\libusbK.cs(1281,9): BCE0000: enum member initializer must be integer value + +#region Copyright (c) Travis Robinson + +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// C# libusbK Bindings +// Auto-generated on: 04.28.2011 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + + +// ReSharper disable InconsistentNaming +// ReSharper disable CheckNamespace +// ReSharper disable UnassignedReadonlyField + +namespace libusbK + +import System +import System.Diagnostics +import System.Runtime.InteropServices + +public static class AllKOptions: + + #region Public Members + + public static LIBUSBK_FULLPATH_TO_ALTERNATE_DLL as string + + #endregion + + +public static class AllKConstants: + + #region Public Members + + public static final KLST_STRING_MAX_LEN = 256 + + + public static final LIBUSBK_DLL = 'libusbK.dll' + + + public static final USB_CONFIG_POWERED_MASK as byte = 192 + + + public static final USB_ENDPOINT_ADDRESS_MASK as byte = 15 + + + public static final USB_ENDPOINT_DIRECTION_MASK as byte = 128 + + #endregion + + +public enum PipePolicyType: + + SHORT_PACKET_TERMINATE = 1 + + AUTO_CLEAR_STALL = 2 + + PIPE_TRANSFER_TIMEOUT = 3 + + IGNORE_SHORT_PACKETS = 4 + + ALLOW_PARTIAL_READS = 5 + + AUTO_FLUSH = 6 + + RAW_IO = 7 + + MAXIMUM_TRANSFER_SIZE = 8 + + RESET_PIPE_ON_RESUME = 9 + + + ISO_START_LATENCY = 32 + + ISO_ALWAYS_START_ASAP = 33 + + ISO_NUM_FIXED_PACKETS = 34 + + + SIMUL_PARALLEL_REQUESTS = 48 + + +public enum PowerPolicyType: + + AUTO_SUSPEND = 129 + + SUSPEND_DELAY = 131 + + +public enum DeviceInformationType: + + DEVICE_SPEED = 1 + + +public enum EndpointType: + + CONTROL = 0 + + + ISOCHRONOUS = 1 + + + BULK = 2 + + + INTERRUPT = 3 + + + MASK = 3 + + +public static class ErrorCodes: + + #region Public Members + + public static final AccessDenied = 5 + + + public static final Busy = 170 + + + public static final Cancelled = 1223 + + + public static final Empty = 4306 + + + public static final InvalidHandle = 6 + + + public static final InvalidParameter = 87 + + + public static final IoIncomplete = 996 + + + public static final IoPending = 997 + + + public static final MoreData = 234 + + + public static final NoMoreItems = 259 + + + public static final NotEnoughMemory = 8 + + + public static final NotFound = 1168 + + + public static final NotSupported = 50 + + + public static final OperationAborted = 995 + + + public static final ResourceNotAvailable = 5006 + + + public static final ResourceNotFound = 5007 + + + public static final SemTimeout = 121 + + + public static final Success = 0 + + + public static final ThreadNotInProcess = 566 + + + public static final ThreadWasSuspended = 699 + + + public static final TooManyModules = 214 + + #endregion + + +public interface IKLIB_HANDLE: + + #region Public Members + + def GetContext() as IntPtr + + HandleType as KLIB_HANDLE_TYPE: + get + + Pointer as IntPtr: + get + + def SetCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool + + def SetContext(UserContext as IntPtr) as bool + + #endregion + + +#region Opaque library handles + +public struct KLST_HANDLE(IKLIB_HANDLE): + + #region IKLIB_HANDLE Members + + public Pointer as IntPtr: + get: + return mHandlePtr + + + public HandleType as KLIB_HANDLE_TYPE: + get: + return KLIB_HANDLE_TYPE.LSTK + + + public def GetContext() as IntPtr: + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + + + public def SetContext(UserContext as IntPtr) as bool: + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + + + public def SetCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool: + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + + + #endregion + + #region Public Members + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + #endregion + + #region Private Members + + private final mHandlePtr as IntPtr + + #endregion + + +public struct KHOT_HANDLE(IKLIB_HANDLE): + + #region IKLIB_HANDLE Members + + public Pointer as IntPtr: + get: + return mHandlePtr + + + public HandleType as KLIB_HANDLE_TYPE: + get: + return KLIB_HANDLE_TYPE.HOTK + + + public def GetContext() as IntPtr: + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + + + public def SetContext(UserContext as IntPtr) as bool: + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + + + public def SetCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool: + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + + + #endregion + + #region Public Members + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + #endregion + + #region Private Members + + private final mHandlePtr as IntPtr + + #endregion + + +public struct KUSB_HANDLE(IKLIB_HANDLE): + + #region IKLIB_HANDLE Members + + public Pointer as IntPtr: + get: + return mHandlePtr + + + public HandleType as KLIB_HANDLE_TYPE: + get: + return KLIB_HANDLE_TYPE.USBK + + + public def GetContext() as IntPtr: + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + + + public def SetContext(UserContext as IntPtr) as bool: + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + + + public def SetCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool: + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + + + #endregion + + #region USB Shared Device Context + + public def GetSharedContext() as IntPtr: + return AllKFunctions.LibK_GetContext(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK) + + + public def SetSharedCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool: + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK, CleanupCallback) + + + public def SetSharedContext(UserContext as IntPtr) as bool: + return AllKFunctions.LibK_SetContext(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK, UserContext) + + + #endregion + + #region Public Members + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + #endregion + + #region Private Members + + private final mHandlePtr as IntPtr + + #endregion + + +public struct KOVL_POOL_HANDLE(IKLIB_HANDLE): + + #region IKLIB_HANDLE Members + + public Pointer as IntPtr: + get: + return mHandlePtr + + + public HandleType as KLIB_HANDLE_TYPE: + get: + return KLIB_HANDLE_TYPE.OVLPOOLK + + + public def GetContext() as IntPtr: + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + + + public def SetContext(UserContext as IntPtr) as bool: + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + + + public def SetCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool: + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + + + #endregion + + #region Public Members + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + #endregion + + #region Private Members + + private final mHandlePtr as IntPtr + + #endregion + + +public struct KOVL_HANDLE(IKLIB_HANDLE): + + #region IKLIB_HANDLE Members + + public Pointer as IntPtr: + get: + return mHandlePtr + + + public HandleType as KLIB_HANDLE_TYPE: + get: + return KLIB_HANDLE_TYPE.OVLK + + + public def GetContext() as IntPtr: + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + + + public def SetContext(UserContext as IntPtr) as bool: + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + + + public def SetCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool: + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + + + #endregion + + #region Public Members + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + #endregion + + #region Private Members + + private final mHandlePtr as IntPtr + + #endregion + + +public struct KSTM_HANDLE(IKLIB_HANDLE): + + #region IKLIB_HANDLE Members + + public Pointer as IntPtr: + get: + return mHandlePtr + + + public HandleType as KLIB_HANDLE_TYPE: + get: + return KLIB_HANDLE_TYPE.STMK + + + public def GetContext() as IntPtr: + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + + + public def SetContext(UserContext as IntPtr) as bool: + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + + + public def SetCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool: + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + + + #endregion + + #region Public Members + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + #endregion + + #region Private Members + + private final mHandlePtr as IntPtr + + #endregion + + +#endregion + +#region Internal Function Imports + +internal static class AllKFunctions: + + #region Delegates + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable HotK_FreeAllDelegate() as void + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable HotK_FreeDelegate([In] Handle as KHOT_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable HotK_InitDelegate([Out] ref Handle as KHOT_HANDLE, [In] [Out] ref InitParams as KHOT_PARAMS) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable IsoK_EnumPacketsDelegate([In] IsoContext as KISO_CONTEXT, EnumPackets as KISO_ENUM_PACKETS_CB, StartPacketIndex as int, UserState as IntPtr) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable IsoK_FreeDelegate([In] IsoContext as KISO_CONTEXT) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable IsoK_GetPacketDelegate([In] IsoContext as KISO_CONTEXT, PacketIndex as int, [Out] ref IsoPacket as KISO_PACKET) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable IsoK_InitDelegate([Out] ref IsoContext as KISO_CONTEXT, NumberOfPackets as int, StartFrame as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable IsoK_ReUseDelegate([In] IsoContext as KISO_CONTEXT) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable IsoK_SetPacketDelegate([In] IsoContext as KISO_CONTEXT, PacketIndex as int, [In] ref IsoPacket as KISO_PACKET) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable IsoK_SetPacketsDelegate([In] IsoContext as KISO_CONTEXT, PacketSize as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_Context_FreeDelegate() as void + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_Context_InitDelegate(Heap as IntPtr, Reserved as IntPtr) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_CopyDriverAPIDelegate([Out] ref DriverAPI as KUSB_DRIVER_API, [In] UsbHandle as KUSB_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_GetContextDelegate([In] Handle as IntPtr, HandleType as KLIB_HANDLE_TYPE) as IntPtr + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_GetDefaultContextDelegate(HandleType as KLIB_HANDLE_TYPE) as IntPtr + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_GetProcAddressDelegate(ProcAddress as IntPtr, DriverID as int, FunctionID as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_GetVersionDelegate([Out] ref Version as KLIB_VERSION) as void + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_LoadDriverAPIDelegate([Out] ref DriverAPI as KUSB_DRIVER_API, DriverID as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_SetCleanupCallbackDelegate([In] Handle as IntPtr, HandleType as KLIB_HANDLE_TYPE, CleanupCB as KLIB_HANDLE_CLEANUP_CB) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_SetContextDelegate([In] Handle as IntPtr, HandleType as KLIB_HANDLE_TYPE, ContextValue as IntPtr) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LibK_SetDefaultContextDelegate(HandleType as KLIB_HANDLE_TYPE, ContextValue as IntPtr) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_CountDelegate([In] DeviceList as KLST_HANDLE, ref Count as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_CurrentDelegate([In] DeviceList as KLST_HANDLE, [Out] ref DeviceInfo as KLST_DEVINFO_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_EnumerateDelegate([In] DeviceList as KLST_HANDLE, EnumDevListCB as KLST_ENUM_DEVINFO_CB, Context as IntPtr) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_FindByVidPidDelegate([In] DeviceList as KLST_HANDLE, Vid as int, Pid as int, [Out] ref DeviceInfo as KLST_DEVINFO_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_FreeDelegate([In] DeviceList as KLST_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_InitDelegate([Out] ref DeviceList as KLST_HANDLE, Flags as KLST_FLAG) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_InitExDelegate([Out] ref DeviceList as KLST_HANDLE, Flags as KLST_FLAG, [In] ref PatternMatch as KLST_PATTERN_MATCH) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_MoveNextDelegate([In] DeviceList as KLST_HANDLE, [Out] ref DeviceInfo as KLST_DEVINFO_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable LstK_MoveResetDelegate([In] DeviceList as KLST_HANDLE) as void + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_AcquireDelegate([Out] ref OverlappedK as KOVL_HANDLE, [In] PoolHandle as KOVL_POOL_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_FreeDelegate([In] PoolHandle as KOVL_POOL_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_GetEventHandleDelegate([In] OverlappedK as KOVL_HANDLE) as IntPtr + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_InitDelegate([Out] ref PoolHandle as KOVL_POOL_HANDLE, [In] UsbHandle as KUSB_HANDLE, MaxOverlappedCount as int, Flags as KOVL_POOL_FLAG) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_IsCompleteDelegate([In] OverlappedK as KOVL_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_ReUseDelegate([In] OverlappedK as KOVL_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_ReleaseDelegate([In] OverlappedK as KOVL_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_WaitAndReleaseDelegate([In] OverlappedK as KOVL_HANDLE, TimeoutMS as int, ref TransferredLength as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_WaitDelegate([In] OverlappedK as KOVL_HANDLE, TimeoutMS as int, WaitFlags as KOVL_WAIT_FLAG, ref TransferredLength as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_WaitOldestDelegate([In] PoolHandle as KOVL_POOL_HANDLE, [Out] ref OverlappedK as KOVL_HANDLE, TimeoutMS as int, WaitFlags as KOVL_WAIT_FLAG, ref TransferredLength as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable OvlK_WaitOrCancelDelegate([In] OverlappedK as KOVL_HANDLE, TimeoutMS as int, ref TransferredLength as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable StmK_FreeDelegate([In] StreamHandle as KSTM_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable StmK_InitDelegate([Out] ref StreamHandle as KSTM_HANDLE, [In] UsbHandle as KUSB_HANDLE, PipeID as byte, MaxTransferSize as int, MaxPendingTransfers as int, MaxPendingIO as int, [In] ref Callbacks as KSTM_CALLBACK, Flags as KSTM_FLAG) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable StmK_ReadDelegate([In] StreamHandle as KSTM_HANDLE, Buffer as IntPtr, Offset as int, Length as int, ref TransferredLength as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable StmK_StartDelegate([In] StreamHandle as KSTM_HANDLE) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable StmK_StopDelegate([In] StreamHandle as KSTM_HANDLE, TimeoutCancelMS as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable StmK_WriteDelegate([In] StreamHandle as KSTM_HANDLE, Buffer as IntPtr, Offset as int, Length as int, ref TransferredLength as int) as bool + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] + public static callable UsbK_FreeDelegate([In] InterfaceHandle as KUSB_HANDLE) as bool + + #endregion + + private static def constructor(): + if String.IsNullOrEmpty(AllKOptions.LIBUSBK_FULLPATH_TO_ALTERNATE_DLL): + mModuleLibusbK = LoadLibraryEx(AllKConstants.LIBUSBK_DLL, IntPtr.Zero, LoadLibraryFlags.NONE) + else: + mModuleLibusbK = LoadLibraryEx(AllKOptions.LIBUSBK_FULLPATH_TO_ALTERNATE_DLL, IntPtr.Zero, LoadLibraryFlags.LOAD_WITH_ALTERED_SEARCH_PATH) + + if mModuleLibusbK == IntPtr.Zero: + raise DllNotFoundException('libusbK.dll not found. Please install drivers/applications and retry.') + + LoadDynamicFunctions() + + + #region Nested Enumerations + + [Flags] + private enum LoadLibraryFlags: + + NONE = 0 + + DONT_RESOLVE_DLL_REFERENCES = 1 + + LOAD_IGNORE_CODE_AUTHZ_LEVEL = 16 + + LOAD_LIBRARY_AS_DATAFILE = 2 + + LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 64 + + LOAD_LIBRARY_AS_IMAGE_RESOURCE = 32 + + LOAD_WITH_ALTERED_SEARCH_PATH = 8 + + + #endregion + + #region Public Members + + public static HotK_Free as HotK_FreeDelegate + + public static HotK_FreeAll as HotK_FreeAllDelegate + + public static HotK_Init as HotK_InitDelegate + + public static IsoK_EnumPackets as IsoK_EnumPacketsDelegate + + public static IsoK_Free as IsoK_FreeDelegate + + public static IsoK_GetPacket as IsoK_GetPacketDelegate + + public static IsoK_Init as IsoK_InitDelegate + + public static IsoK_ReUse as IsoK_ReUseDelegate + + public static IsoK_SetPacket as IsoK_SetPacketDelegate + + public static IsoK_SetPackets as IsoK_SetPacketsDelegate + + public static LibK_Context_Free as LibK_Context_FreeDelegate + + public static LibK_Context_Init as LibK_Context_InitDelegate + + + public static LibK_CopyDriverAPI as LibK_CopyDriverAPIDelegate + + public static LibK_GetContext as LibK_GetContextDelegate + + public static LibK_GetDefaultContext as LibK_GetDefaultContextDelegate + + public static LibK_GetProcAddress as LibK_GetProcAddressDelegate + + public static LibK_GetVersion as LibK_GetVersionDelegate + + public static LibK_LoadDriverAPI as LibK_LoadDriverAPIDelegate + + public static LibK_SetCleanupCallback as LibK_SetCleanupCallbackDelegate + + public static LibK_SetContext as LibK_SetContextDelegate + + public static LibK_SetDefaultContext as LibK_SetDefaultContextDelegate + + public static LstK_Count as LstK_CountDelegate + + public static LstK_Current as LstK_CurrentDelegate + + public static LstK_Enumerate as LstK_EnumerateDelegate + + public static LstK_FindByVidPid as LstK_FindByVidPidDelegate + + public static LstK_Free as LstK_FreeDelegate + + public static LstK_Init as LstK_InitDelegate + + public static LstK_InitEx as LstK_InitExDelegate + + public static LstK_MoveNext as LstK_MoveNextDelegate + + public static LstK_MoveReset as LstK_MoveResetDelegate + + public static OvlK_Acquire as OvlK_AcquireDelegate + + public static OvlK_Free as OvlK_FreeDelegate + + public static OvlK_GetEventHandle as OvlK_GetEventHandleDelegate + + public static OvlK_Init as OvlK_InitDelegate + + public static OvlK_IsComplete as OvlK_IsCompleteDelegate + + public static OvlK_ReUse as OvlK_ReUseDelegate + + public static OvlK_Release as OvlK_ReleaseDelegate + + public static OvlK_Wait as OvlK_WaitDelegate + + public static OvlK_WaitAndRelease as OvlK_WaitAndReleaseDelegate + + public static OvlK_WaitOldest as OvlK_WaitOldestDelegate + + public static OvlK_WaitOrCancel as OvlK_WaitOrCancelDelegate + + public static StmK_Free as StmK_FreeDelegate + + public static StmK_Init as StmK_InitDelegate + + public static StmK_Read as StmK_ReadDelegate + + public static StmK_Start as StmK_StartDelegate + + public static StmK_Stop as StmK_StopDelegate + + public static StmK_Write as StmK_WriteDelegate + + public static UsbK_Free as UsbK_FreeDelegate + + + #endregion + + #region Private Members + + [DllImport('kernel32.dll', CharSet: CharSet.Ansi, ExactSpelling: true, SetLastError: true)] + private static def GetProcAddress(hModule as IntPtr, procName as string) as IntPtr: + pass + + + private static def LoadDynamicFunctions(): + LibK_GetVersion = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_GetVersion'), typeof(LibK_GetVersionDelegate)) cast LibK_GetVersionDelegate) + LibK_GetContext = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_GetContext'), typeof(LibK_GetContextDelegate)) cast LibK_GetContextDelegate) + LibK_SetContext = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_SetContext'), typeof(LibK_SetContextDelegate)) cast LibK_SetContextDelegate) + LibK_SetCleanupCallback = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_SetCleanupCallback'), typeof(LibK_SetCleanupCallbackDelegate)) cast LibK_SetCleanupCallbackDelegate) + LibK_LoadDriverAPI = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_LoadDriverAPI'), typeof(LibK_LoadDriverAPIDelegate)) cast LibK_LoadDriverAPIDelegate) + LibK_CopyDriverAPI = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_CopyDriverAPI'), typeof(LibK_CopyDriverAPIDelegate)) cast LibK_CopyDriverAPIDelegate) + LibK_GetProcAddress = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_GetProcAddress'), typeof(LibK_GetProcAddressDelegate)) cast LibK_GetProcAddressDelegate) + LibK_SetDefaultContext = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_SetDefaultContext'), typeof(LibK_SetDefaultContextDelegate)) cast LibK_SetDefaultContextDelegate) + LibK_GetDefaultContext = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_GetDefaultContext'), typeof(LibK_GetDefaultContextDelegate)) cast LibK_GetDefaultContextDelegate) + LibK_Context_Init = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_Context_Init'), typeof(LibK_Context_InitDelegate)) cast LibK_Context_InitDelegate) + LibK_Context_Free = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LibK_Context_Free'), typeof(LibK_Context_FreeDelegate)) cast LibK_Context_FreeDelegate) + UsbK_Free = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'UsbK_Free'), typeof(UsbK_FreeDelegate)) cast UsbK_FreeDelegate) + LstK_Init = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_Init'), typeof(LstK_InitDelegate)) cast LstK_InitDelegate) + LstK_InitEx = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_InitEx'), typeof(LstK_InitExDelegate)) cast LstK_InitExDelegate) + LstK_Free = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_Free'), typeof(LstK_FreeDelegate)) cast LstK_FreeDelegate) + LstK_Enumerate = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_Enumerate'), typeof(LstK_EnumerateDelegate)) cast LstK_EnumerateDelegate) + LstK_Current = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_Current'), typeof(LstK_CurrentDelegate)) cast LstK_CurrentDelegate) + LstK_MoveNext = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_MoveNext'), typeof(LstK_MoveNextDelegate)) cast LstK_MoveNextDelegate) + LstK_MoveReset = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_MoveReset'), typeof(LstK_MoveResetDelegate)) cast LstK_MoveResetDelegate) + LstK_FindByVidPid = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_FindByVidPid'), typeof(LstK_FindByVidPidDelegate)) cast LstK_FindByVidPidDelegate) + LstK_Count = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'LstK_Count'), typeof(LstK_CountDelegate)) cast LstK_CountDelegate) + HotK_Init = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'HotK_Init'), typeof(HotK_InitDelegate)) cast HotK_InitDelegate) + HotK_Free = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'HotK_Free'), typeof(HotK_FreeDelegate)) cast HotK_FreeDelegate) + HotK_FreeAll = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'HotK_FreeAll'), typeof(HotK_FreeAllDelegate)) cast HotK_FreeAllDelegate) + OvlK_Acquire = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_Acquire'), typeof(OvlK_AcquireDelegate)) cast OvlK_AcquireDelegate) + OvlK_Release = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_Release'), typeof(OvlK_ReleaseDelegate)) cast OvlK_ReleaseDelegate) + OvlK_Init = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_Init'), typeof(OvlK_InitDelegate)) cast OvlK_InitDelegate) + OvlK_Free = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_Free'), typeof(OvlK_FreeDelegate)) cast OvlK_FreeDelegate) + OvlK_GetEventHandle = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_GetEventHandle'), typeof(OvlK_GetEventHandleDelegate)) cast OvlK_GetEventHandleDelegate) + OvlK_Wait = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_Wait'), typeof(OvlK_WaitDelegate)) cast OvlK_WaitDelegate) + OvlK_WaitOldest = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_WaitOldest'), typeof(OvlK_WaitOldestDelegate)) cast OvlK_WaitOldestDelegate) + OvlK_WaitOrCancel = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_WaitOrCancel'), typeof(OvlK_WaitOrCancelDelegate)) cast OvlK_WaitOrCancelDelegate) + OvlK_WaitAndRelease = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_WaitAndRelease'), typeof(OvlK_WaitAndReleaseDelegate)) cast OvlK_WaitAndReleaseDelegate) + OvlK_IsComplete = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_IsComplete'), typeof(OvlK_IsCompleteDelegate)) cast OvlK_IsCompleteDelegate) + OvlK_ReUse = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'OvlK_ReUse'), typeof(OvlK_ReUseDelegate)) cast OvlK_ReUseDelegate) + StmK_Init = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'StmK_Init'), typeof(StmK_InitDelegate)) cast StmK_InitDelegate) + StmK_Free = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'StmK_Free'), typeof(StmK_FreeDelegate)) cast StmK_FreeDelegate) + StmK_Start = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'StmK_Start'), typeof(StmK_StartDelegate)) cast StmK_StartDelegate) + StmK_Stop = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'StmK_Stop'), typeof(StmK_StopDelegate)) cast StmK_StopDelegate) + StmK_Read = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'StmK_Read'), typeof(StmK_ReadDelegate)) cast StmK_ReadDelegate) + StmK_Write = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'StmK_Write'), typeof(StmK_WriteDelegate)) cast StmK_WriteDelegate) + IsoK_Init = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'IsoK_Init'), typeof(IsoK_InitDelegate)) cast IsoK_InitDelegate) + IsoK_Free = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'IsoK_Free'), typeof(IsoK_FreeDelegate)) cast IsoK_FreeDelegate) + IsoK_SetPackets = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'IsoK_SetPackets'), typeof(IsoK_SetPacketsDelegate)) cast IsoK_SetPacketsDelegate) + IsoK_SetPacket = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'IsoK_SetPacket'), typeof(IsoK_SetPacketDelegate)) cast IsoK_SetPacketDelegate) + IsoK_GetPacket = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'IsoK_GetPacket'), typeof(IsoK_GetPacketDelegate)) cast IsoK_GetPacketDelegate) + IsoK_EnumPackets = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'IsoK_EnumPackets'), typeof(IsoK_EnumPacketsDelegate)) cast IsoK_EnumPacketsDelegate) + IsoK_ReUse = (Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, 'IsoK_ReUse'), typeof(IsoK_ReUseDelegate)) cast IsoK_ReUseDelegate) + + + [DllImport('kernel32.dll')] + private static def LoadLibraryEx(lpFileName as string, hReservedNull as IntPtr, dwFlags as LoadLibraryFlags) as IntPtr: + pass + + + private static final mModuleLibusbK as IntPtr = IntPtr.Zero + + #endregion + + +#endregion + +#region Enumerations + +public enum USBD_PIPE_TYPE: + + UsbdPipeTypeControl + + + UsbdPipeTypeIsochronous + + + UsbdPipeTypeBulk + + + UsbdPipeTypeInterrupt + + +[Flags] +public enum KISO_FLAG: + + NONE = 0 + + + SET_START_FRAME = 1 + + +public enum KLIB_HANDLE_TYPE: + + HOTK + + + USBK + + + USBSHAREDK + + + LSTK + + + LSTINFOK + + + OVLK + + + OVLPOOLK + + + STMK + + + COUNT + + +[Flags] +public enum KLST_SYNC_FLAG: + + NONE = 0 + + + UNCHANGED = 1 + + + ADDED = 2 + + + REMOVED = 4 + + + CONNECT_CHANGE = 8 + + + MASK = 15 + + +[Flags] +public enum KLST_FLAG: + + NONE = 0 + + + INCLUDE_RAWGUID = 1 + + + INCLUDE_DISCONNECT = 2 + + +public enum BMREQUEST_DIR: + + HOST_TO_DEVICE = 0 + + DEVICE_TO_HOST = 1 + + +public enum BMREQUEST_TYPE: + + STANDARD = 0 + + + CLASS = 1 + + + VENDOR = 2 + + +public enum BMREQUEST_RECIPIENT: + + DEVICE = 0 + + + INTERFACE = 1 + + + ENDPOINT = 2 + + + OTHER = 3 + + +public enum USB_GETSTATUS: + + SELF_POWERED = 1 + + + REMOTE_WAKEUP_ENABLED = 2 + + +public enum USB_DESCRIPTOR_TYPE: + + DEVICE = 1 + + + CONFIGURATION = 2 + + + STRING = 3 + + + INTERFACE = 4 + + + ENDPOINT = 5 + + + DEVICE_QUALIFIER = 6 + + + CONFIG_POWER = 7 + + + INTERFACE_POWER = 8 + + + INTERFACE_ASSOCIATION = 11 + + +public enum KUSB_PROPERTY: + + DEVICE_FILE_HANDLE + + + COUNT + + +public enum KUSB_DRVID: + + LIBUSBK + + + LIBUSB0 + + + WINUSB + + + LIBUSB0_FILTER + + + COUNT + + +public enum KUSB_FNID: + + Init + + + Free + + + ClaimInterface + + + ReleaseInterface + + + SetAltInterface + + + GetAltInterface + + + GetDescriptor + + + ControlTransfer + + + SetPowerPolicy + + + GetPowerPolicy + + + SetConfiguration + + + GetConfiguration + + + ResetDevice + + + Initialize + + + SelectInterface + + + GetAssociatedInterface + + + Clone + + + QueryInterfaceSettings + + + QueryDeviceInformation + + + SetCurrentAlternateSetting + + + GetCurrentAlternateSetting + + + QueryPipe + + + SetPipePolicy + + + GetPipePolicy + + + ReadPipe + + + WritePipe + + + ResetPipe + + + AbortPipe + + + FlushPipe + + + IsoReadPipe + + + IsoWritePipe + + + GetCurrentFrameNumber + + + GetOverlappedResult + + + GetProperty + + + + COUNT + + +[Flags] +public enum KHOT_FLAG: + + NONE + + + PLUG_ALL_ON_INIT = 1 + + + PASS_DUPE_INSTANCE = 2 + + + POST_USER_MESSAGE = 4 + + +[Flags] +public enum KOVL_WAIT_FLAG: + + NONE = 0 + + + RELEASE_ON_SUCCESS = 1 + + + RELEASE_ON_FAIL = 2 + + + RELEASE_ON_SUCCESS_FAIL = 3 + + + CANCEL_ON_TIMEOUT = 4 + + + RELEASE_ON_TIMEOUT = 12 + + + RELEASE_ALWAYS = 15 + + + ALERTABLE = 16 + + +[Flags] +public enum KOVL_POOL_FLAG: + + NONE = 0 + + +[Flags] +public enum KSTM_FLAG(uint): + + NONE = 0 + + NO_PARTIAL_XFERS = 1048576 + + TIMEOUT_MASK = 131071 + + +public enum KSTM_COMPLETE_RESULT: + + VALID = 0 + + + INVALID + + +#endregion + +#region Structs + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi)] +public struct WINUSB_PIPE_INFORMATION: + + public PipeType as USBD_PIPE_TYPE + + + public PipeId as byte + + + public MaximumPacketSize as ushort + + + public Interval as byte + + + + public override def ToString() as string: + return string.Format('PipeType: {0}\nPipeId: {1}\nMaximumPacketSize: {2}\nInterval: {3}\n', PipeType, (PipeId.ToString('X2') + 'h'), MaximumPacketSize, (Interval.ToString('X2') + 'h')) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] +public struct WINUSB_SETUP_PACKET: + + public RequestType as byte + + + public Request as byte + + + public Value as ushort + + + public Index as ushort + + + public Length as ushort + + + + public override def ToString() as string: + return string.Format('RequestType: {0}\nRequest: {1}\nValue: {2}\nIndex: {3}\nLength: {4}\n', (RequestType.ToString('X2') + 'h'), (Request.ToString('X2') + 'h'), (Value.ToString('X4') + 'h'), (Index.ToString('X4') + 'h'), Length) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] +public struct KISO_PACKET: + + public Offset as int + + + public Length as ushort + + + public Status as ushort + + + + public override def ToString() as string: + return string.Format('Offset: {0}\nLength: {1}\nStatus: {2}\n', Offset, Length, (Status.ToString('X4') + 'h')) + + +[StructLayout(LayoutKind.Sequential)] +public struct KISO_CONTEXT: + + private final mHandlePtr as IntPtr + + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + public Pointer as IntPtr: + get: + return mHandlePtr + + + [StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] + private struct KISO_CONTEXT_MAP: + + private final Flags as KISO_FLAG + + + private final StartFrame as int + + + private final ErrorCount as short + + + private final NumberOfPackets as short + + + private final UrbHdrStatus as int + + + private static final ofsFlags as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'Flags').ToInt32() + + private static final ofsStartFrame as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'StartFrame').ToInt32() + + private static final ofsErrorCount as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'ErrorCount').ToInt32() + + private static final ofsNumberOfPackets as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'NumberOfPackets').ToInt32() + + private static final ofsUrbHdrStatus as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'UrbHdrStatus').ToInt32() + + + + public Flags as KISO_FLAG: + get: + return (Marshal.ReadInt32(mHandlePtr, ofsFlags) cast KISO_FLAG) + + + + public StartFrame as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsStartFrame) + + + + public ErrorCount as short: + get: + return Marshal.ReadInt16(mHandlePtr, ofsErrorCount) + + + + public NumberOfPackets as short: + get: + return Marshal.ReadInt16(mHandlePtr, ofsNumberOfPackets) + + + + public UrbHdrStatus as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsUrbHdrStatus) + + + + public override def ToString() as string: + return string.Format('Flags: {0}\nStartFrame: {1}\nErrorCount: {2}\nNumberOfPackets: {3}\nUrbHdrStatus: {4}\n', Flags.ToString(), StartFrame, ErrorCount, NumberOfPackets, (UrbHdrStatus.ToString('X8') + 'h')) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi)] +public struct KLIB_VERSION: + + public Major as int + + + public Minor as int + + + public Micro as int + + + public Nano as int + + + public override def ToString() as string: + return string.Format('Major: {0}\nMinor: {1}\nMicro: {2}\nNano: {3}\n', Major, Minor, Micro, Nano) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi)] +public struct KLST_DEV_COMMON_INFO: + + public Vid as int + + + public Pid as int + + + public MI as int + + + // An ID that uniquely identifies a USB device. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + public InstanceID as string + + + + public override def ToString() as string: + return string.Format('Vid: {0}\nPid: {1}\nMI: {2}\nInstanceID: {3}\n', (Vid.ToString('X4') + 'h'), (Pid.ToString('X4') + 'h'), (MI.ToString('X2') + 'h'), InstanceID) + + +[StructLayout(LayoutKind.Sequential)] +public struct KLST_DEVINFO_HANDLE(IKLIB_HANDLE): + + private final mHandlePtr as IntPtr + + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + public Pointer as IntPtr: + get: + return mHandlePtr + + + public HandleType as KLIB_HANDLE_TYPE: + get: + return KLIB_HANDLE_TYPE.LSTINFOK + + + public def GetContext() as IntPtr: + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + + + public def SetContext(UserContext as IntPtr) as bool: + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + + + public def SetCleanupCallback(CleanupCallback as KLIB_HANDLE_CLEANUP_CB) as bool: + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + + + [StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi)] + private struct KLST_DEVINFO_MAP: + + private final Common as KLST_DEV_COMMON_INFO + + + private final DriverID as int + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final DeviceInterfaceGUID as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final DeviceID as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final ClassGUID as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final Mfg as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final DeviceDesc as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final Service as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final SymbolicLink as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final DevicePath as string + + + private final LUsb0FilterIndex as int + + + private final Connected as bool + + + private final SyncFlags as KLST_SYNC_FLAG + + + private final BusNumber as int + + + private final DeviceAddress as int + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + private final SerialNumber as string + + + private static final ofsCommon as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'Common').ToInt32() + + private static final ofsDriverID as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'DriverID').ToInt32() + + private static final ofsDeviceInterfaceGUID as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'DeviceInterfaceGUID').ToInt32() + + private static final ofsDeviceID as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'DeviceID').ToInt32() + + private static final ofsClassGUID as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'ClassGUID').ToInt32() + + private static final ofsMfg as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'Mfg').ToInt32() + + private static final ofsDeviceDesc as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'DeviceDesc').ToInt32() + + private static final ofsService as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'Service').ToInt32() + + private static final ofsSymbolicLink as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'SymbolicLink').ToInt32() + + private static final ofsDevicePath as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'DevicePath').ToInt32() + + private static final ofsLUsb0FilterIndex as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'LUsb0FilterIndex').ToInt32() + + private static final ofsConnected as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'Connected').ToInt32() + + private static final ofsSyncFlags as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'SyncFlags').ToInt32() + + private static final ofsBusNumber as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'BusNumber').ToInt32() + + private static final ofsDeviceAddress as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'DeviceAddress').ToInt32() + + private static final ofsSerialNumber as int = Marshal.OffsetOf(typeof(KLST_DEVINFO_MAP), 'SerialNumber').ToInt32() + + + + public Common as KLST_DEV_COMMON_INFO: + get: + return (Marshal.PtrToStructure(IntPtr((mHandlePtr.ToInt64() + ofsCommon)), typeof(KLST_DEV_COMMON_INFO)) cast KLST_DEV_COMMON_INFO) + + + + public DriverID as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsDriverID) + + + + public DeviceInterfaceGUID as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsDeviceInterfaceGUID))) + + + + public DeviceID as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsDeviceID))) + + + + public ClassGUID as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsClassGUID))) + + + + public Mfg as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsMfg))) + + + + public DeviceDesc as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsDeviceDesc))) + + + + public Service as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsService))) + + + + public SymbolicLink as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsSymbolicLink))) + + + + public DevicePath as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsDevicePath))) + + + + public LUsb0FilterIndex as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsLUsb0FilterIndex) + + + + public Connected as bool: + get: + return (Marshal.ReadInt32(mHandlePtr, ofsConnected) != 0) + + + + public SyncFlags as KLST_SYNC_FLAG: + get: + return (Marshal.ReadInt32(mHandlePtr, ofsSyncFlags) cast KLST_SYNC_FLAG) + + + + public BusNumber as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsBusNumber) + + + + public DeviceAddress as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsDeviceAddress) + + + + public SerialNumber as string: + get: + return Marshal.PtrToStringAnsi(IntPtr((mHandlePtr.ToInt64() + ofsSerialNumber))) + + + + public override def ToString() as string: + return string.Format('DriverID: {0}\nDeviceInterfaceGUID: {1}\nDeviceID: {2}\nClassGUID: {3}\nMfg: {4}\nDeviceDesc: {5}\nService: {6}\nSymbolicLink: {7}\nDevicePath: {8}\nLUsb0FilterIndex: {9}\nConnected: {10}\nSyncFlags: {11}\nBusNumber: {12}\nDeviceAddress: {13}\nSerialNumber: {14}\n', DriverID, DeviceInterfaceGUID, DeviceID, ClassGUID, Mfg, DeviceDesc, Service, SymbolicLink, DevicePath, LUsb0FilterIndex, Connected, SyncFlags.ToString(), BusNumber, DeviceAddress, SerialNumber) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Size: 1024)] +public struct KLST_PATTERN_MATCH: + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + public DeviceID as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + public DeviceInterfaceGUID as string + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + public ClassGUID as string + + + + public override def ToString() as string: + return string.Format('DeviceID: {0}\nDeviceInterfaceGUID: {1}\nClassGUID: {2}\n', DeviceID, DeviceInterfaceGUID, ClassGUID) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] +public struct USB_DEVICE_DESCRIPTOR: + + public bLength as byte + + + public bDescriptorType as byte + + + public bcdUSB as ushort + + + public bDeviceClass as byte + + + public bDeviceSubClass as byte + + + public bDeviceProtocol as byte + + + public bMaxPacketSize0 as byte + + + public idVendor as ushort + + + public idProduct as ushort + + + public bcdDevice as ushort + + + public iManufacturer as byte + + + public iProduct as byte + + + public iSerialNumber as byte + + + public bNumConfigurations as byte + + + + public override def ToString() as string: + return string.Format('bLength: {0}\nbDescriptorType: {1}\nbcdUSB: {2}\nbDeviceClass: {3}\nbDeviceSubClass: {4}\nbDeviceProtocol: {5}\nbMaxPacketSize0: {6}\nidVendor: {7}\nidProduct: {8}\nbcdDevice: {9}\niManufacturer: {10}\niProduct: {11}\niSerialNumber: {12}\nbNumConfigurations: {13}\n', bLength, (bDescriptorType.ToString('X2') + 'h'), (bcdUSB.ToString('X4') + 'h'), (bDeviceClass.ToString('X2') + 'h'), (bDeviceSubClass.ToString('X2') + 'h'), (bDeviceProtocol.ToString('X2') + 'h'), bMaxPacketSize0, (idVendor.ToString('X4') + 'h'), (idProduct.ToString('X4') + 'h'), (bcdDevice.ToString('X4') + 'h'), iManufacturer, iProduct, iSerialNumber, bNumConfigurations) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] +public struct USB_ENDPOINT_DESCRIPTOR: + + public bLength as byte + + + public bDescriptorType as byte + + + public bEndpointAddress as byte + + + public bmAttributes as byte + + + public wMaxPacketSize as ushort + + + public bInterval as byte + + + + public override def ToString() as string: + return string.Format('bLength: {0}\nbDescriptorType: {1}\nbEndpointAddress: {2}\nbmAttributes: {3}\nwMaxPacketSize: {4}\nbInterval: {5}\n', bLength, (bDescriptorType.ToString('X2') + 'h'), (bEndpointAddress.ToString('X2') + 'h'), (bmAttributes.ToString('X2') + 'h'), wMaxPacketSize, bInterval) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] +public struct USB_CONFIGURATION_DESCRIPTOR: + + public bLength as byte + + + public bDescriptorType as byte + + + public wTotalLength as ushort + + + public bNumInterfaces as byte + + + public bConfigurationValue as byte + + + public iConfiguration as byte + + + public bmAttributes as byte + + + public MaxPower as byte + + + public override def ToString() as string: + return string.Format('bLength: {0}\nbDescriptorType: {1}\nwTotalLength: {2}\nbNumInterfaces: {3}\nbConfigurationValue: {4}\niConfiguration: {5}\nbmAttributes: {6}\nMaxPower: {7}\n', bLength, (bDescriptorType.ToString('X2') + 'h'), wTotalLength, bNumInterfaces, bConfigurationValue, iConfiguration, (bmAttributes.ToString('X2') + 'h'), MaxPower) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] +public struct USB_INTERFACE_DESCRIPTOR: + + public bLength as byte + + + public bDescriptorType as byte + + + public bInterfaceNumber as byte + + + public bAlternateSetting as byte + + + public bNumEndpoints as byte + + + public bInterfaceClass as byte + + + public bInterfaceSubClass as byte + + + public bInterfaceProtocol as byte + + + public iInterface as byte + + + + public override def ToString() as string: + return string.Format('bLength: {0}\nbDescriptorType: {1}\nbInterfaceNumber: {2}\nbAlternateSetting: {3}\nbNumEndpoints: {4}\nbInterfaceClass: {5}\nbInterfaceSubClass: {6}\nbInterfaceProtocol: {7}\niInterface: {8}\n', bLength, (bDescriptorType.ToString('X2') + 'h'), bInterfaceNumber, bAlternateSetting, bNumEndpoints, (bInterfaceClass.ToString('X2') + 'h'), (bInterfaceSubClass.ToString('X2') + 'h'), (bInterfaceProtocol.ToString('X2') + 'h'), iInterface) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Unicode, Pack: 1)] +public struct USB_STRING_DESCRIPTOR: + + public bLength as byte + + + public bDescriptorType as byte + + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst: AllKConstants.KLST_STRING_MAX_LEN)] + public bString as string + + + + public override def ToString() as string: + return string.Format('bLength: {0}\nbDescriptorType: {1}\nbString: {2}\n', bLength, (bDescriptorType.ToString('X2') + 'h'), bString) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] +public struct USB_COMMON_DESCRIPTOR: + + public bLength as byte + + + public bDescriptorType as byte + + + + public override def ToString() as string: + return string.Format('bLength: {0}\nbDescriptorType: {1}\n', bLength, (bDescriptorType.ToString('X2') + 'h')) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] +public struct USB_INTERFACE_ASSOCIATION_DESCRIPTOR: + + public bLength as byte + + + public bDescriptorType as byte + + + public bFirstInterface as byte + + + public bInterfaceCount as byte + + + public bFunctionClass as byte + + + public bFunctionSubClass as byte + + + public bFunctionProtocol as byte + + + public iFunction as byte + + + + public override def ToString() as string: + return string.Format('bLength: {0}\nbDescriptorType: {1}\nbFirstInterface: {2}\nbInterfaceCount: {3}\nbFunctionClass: {4}\nbFunctionSubClass: {5}\nbFunctionProtocol: {6}\niFunction: {7}\n', bLength, (bDescriptorType.ToString('X2') + 'h'), bFirstInterface, bInterfaceCount, (bFunctionClass.ToString('X2') + 'h'), (bFunctionSubClass.ToString('X2') + 'h'), (bFunctionProtocol.ToString('X2') + 'h'), iFunction) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi)] +public struct KUSB_DRIVER_API_INFO: + + public DriverID as int + + + public FunctionCount as int + + + + public override def ToString() as string: + return string.Format('DriverID: {0}\nFunctionCount: {1}\n', DriverID, FunctionCount) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Size: 512)] +public struct KUSB_DRIVER_API: + + public Info as KUSB_DRIVER_API_INFO + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Init as KUSB_InitDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Free as KUSB_FreeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public ClaimInterface as KUSB_ClaimInterfaceDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public ReleaseInterface as KUSB_ReleaseInterfaceDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public SetAltInterface as KUSB_SetAltInterfaceDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetAltInterface as KUSB_GetAltInterfaceDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetDescriptor as KUSB_GetDescriptorDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public ControlTransfer as KUSB_ControlTransferDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public SetPowerPolicy as KUSB_SetPowerPolicyDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetPowerPolicy as KUSB_GetPowerPolicyDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public SetConfiguration as KUSB_SetConfigurationDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetConfiguration as KUSB_GetConfigurationDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public ResetDevice as KUSB_ResetDeviceDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Initialize as KUSB_InitializeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public SelectInterface as KUSB_SelectInterfaceDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetAssociatedInterface as KUSB_GetAssociatedInterfaceDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Clone as KUSB_CloneDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public QueryInterfaceSettings as KUSB_QueryInterfaceSettingsDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public QueryDeviceInformation as KUSB_QueryDeviceInformationDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public SetCurrentAlternateSetting as KUSB_SetCurrentAlternateSettingDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetCurrentAlternateSetting as KUSB_GetCurrentAlternateSettingDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public QueryPipe as KUSB_QueryPipeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public SetPipePolicy as KUSB_SetPipePolicyDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetPipePolicy as KUSB_GetPipePolicyDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public ReadPipe as KUSB_ReadPipeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public WritePipe as KUSB_WritePipeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public ResetPipe as KUSB_ResetPipeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public AbortPipe as KUSB_AbortPipeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public FlushPipe as KUSB_FlushPipeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public IsoReadPipe as KUSB_IsoReadPipeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public IsoWritePipe as KUSB_IsoWritePipeDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetCurrentFrameNumber as KUSB_GetCurrentFrameNumberDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetOverlappedResult as KUSB_GetOverlappedResultDelegate + + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public GetProperty as KUSB_GetPropertyDelegate + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Size: 2048)] +public struct KHOT_PARAMS: + + public UserHwnd as IntPtr + + + public UserMessage as int + + + public Flags as KHOT_FLAG + + + public PatternMatch as KLST_PATTERN_MATCH + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public OnHotPlug as KHOT_PLUG_CB + + + + public override def ToString() as string: + return string.Format('UserHwnd: {0}\nUserMessage: {1}\nFlags: {2}\n', (UserHwnd.ToString('X16') + 'h'), (UserMessage.ToString('X8') + 'h'), Flags.ToString()) + + +[StructLayout(LayoutKind.Sequential)] +public struct KSTM_XFER_CONTEXT: + + private final mHandlePtr as IntPtr + + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + public Pointer as IntPtr: + get: + return mHandlePtr + + + [StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi)] + private struct KSTM_XFER_CONTEXT_MAP: + + private final Buffer as IntPtr + + + private final BufferSize as int + + + private final TransferLength as int + + + private final UserState as IntPtr + + + private static final ofsBuffer as int = Marshal.OffsetOf(typeof(KSTM_XFER_CONTEXT_MAP), 'Buffer').ToInt32() + + private static final ofsBufferSize as int = Marshal.OffsetOf(typeof(KSTM_XFER_CONTEXT_MAP), 'BufferSize').ToInt32() + + private static final ofsTransferLength as int = Marshal.OffsetOf(typeof(KSTM_XFER_CONTEXT_MAP), 'TransferLength').ToInt32() + + private static final ofsUserState as int = Marshal.OffsetOf(typeof(KSTM_XFER_CONTEXT_MAP), 'UserState').ToInt32() + + + + public Buffer as IntPtr: + get: + return Marshal.ReadIntPtr(mHandlePtr, ofsBuffer) + + + + public BufferSize as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsBufferSize) + + + + public TransferLength as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsTransferLength) + + + + public UserState as IntPtr: + get: + return Marshal.ReadIntPtr(mHandlePtr, ofsUserState) + set: + Marshal.WriteIntPtr(mHandlePtr, ofsUserState, value) + + + + public override def ToString() as string: + return string.Format('Buffer: {0}\nBufferSize: {1}\nTransferLength: {2}\nUserState: {3}\n', (Buffer.ToString('X16') + 'h'), BufferSize, TransferLength, (UserState.ToString('X16') + 'h')) + + +[StructLayout(LayoutKind.Sequential)] +public struct KSTM_INFO: + + private final mHandlePtr as IntPtr + + + public def constructor(Handle as IntPtr): + mHandlePtr = Handle + + + public Pointer as IntPtr: + get: + return mHandlePtr + + + [StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi)] + private struct KSTM_INFO_MAP: + + private final UsbHandle as IntPtr + + + private final PipeID as byte + + + private final MaxPendingTransfers as int + + + private final MaxTransferSize as int + + + private final MaxPendingIO as int + + + private final EndpointDescriptor as USB_ENDPOINT_DESCRIPTOR + + + private final DriverAPI as KUSB_DRIVER_API + + + private final DeviceHandle as IntPtr + + + private final StreamHandle as IntPtr + + + private final UserState as IntPtr + + + private static final ofsUsbHandle as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'UsbHandle').ToInt32() + + private static final ofsPipeID as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'PipeID').ToInt32() + + private static final ofsMaxPendingTransfers as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'MaxPendingTransfers').ToInt32() + + private static final ofsMaxTransferSize as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'MaxTransferSize').ToInt32() + + private static final ofsMaxPendingIO as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'MaxPendingIO').ToInt32() + + private static final ofsEndpointDescriptor as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'EndpointDescriptor').ToInt32() + + private static final ofsDriverAPI as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'DriverAPI').ToInt32() + + private static final ofsDeviceHandle as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'DeviceHandle').ToInt32() + + private static final ofsStreamHandle as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'StreamHandle').ToInt32() + + private static final ofsUserState as int = Marshal.OffsetOf(typeof(KSTM_INFO_MAP), 'UserState').ToInt32() + + + + public UsbHandle as IntPtr: + get: + return Marshal.ReadIntPtr(mHandlePtr, ofsUsbHandle) + + + + public PipeID as byte: + get: + return Marshal.ReadByte(mHandlePtr, ofsPipeID) + + + + public MaxPendingTransfers as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsMaxPendingTransfers) + + + + public MaxTransferSize as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsMaxTransferSize) + + + + public MaxPendingIO as int: + get: + return Marshal.ReadInt32(mHandlePtr, ofsMaxPendingIO) + + + + public EndpointDescriptor as USB_ENDPOINT_DESCRIPTOR: + get: + return (Marshal.PtrToStructure(IntPtr((mHandlePtr.ToInt64() + ofsEndpointDescriptor)), typeof(USB_ENDPOINT_DESCRIPTOR)) cast USB_ENDPOINT_DESCRIPTOR) + + + + public DriverAPI as KUSB_DRIVER_API: + get: + return (Marshal.PtrToStructure(IntPtr((mHandlePtr.ToInt64() + ofsDriverAPI)), typeof(KUSB_DRIVER_API)) cast KUSB_DRIVER_API) + + + + public DeviceHandle as IntPtr: + get: + return Marshal.ReadIntPtr(mHandlePtr, ofsDeviceHandle) + + + + public StreamHandle as IntPtr: + get: + return Marshal.ReadIntPtr(mHandlePtr, ofsStreamHandle) + + + + public UserState as IntPtr: + get: + return Marshal.ReadIntPtr(mHandlePtr, ofsUserState) + set: + Marshal.WriteIntPtr(mHandlePtr, ofsUserState, value) + + + + public override def ToString() as string: + return string.Format('UsbHandle: {0}\nPipeID: {1}\nMaxPendingTransfers: {2}\nMaxTransferSize: {3}\nMaxPendingIO: {4}\nDeviceHandle: {5}\nStreamHandle: {6}\nUserState: {7}\n', (UsbHandle.ToString('X16') + 'h'), (PipeID.ToString('X2') + 'h'), MaxPendingTransfers, MaxTransferSize, MaxPendingIO, (DeviceHandle.ToString('X16') + 'h'), (StreamHandle.ToString('X16') + 'h'), (UserState.ToString('X16') + 'h')) + + +[StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Size: 64)] +public struct KSTM_CALLBACK: + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Error as KSTM_ERROR_CB + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Submit as KSTM_SUBMIT_CB + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Complete as KSTM_COMPLETE_CB + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Started as KSTM_STARTED_CB + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public Stopped as KSTM_STOPPED_CB + + + [MarshalAs(UnmanagedType.FunctionPtr)] + public BeforeComplete as KSTM_BEFORE_COMPLETE_CB + + +#endregion + +#region Delegates + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KLIB_HANDLE_CLEANUP_CB([In] Handle as IntPtr, HandleType as KLIB_HANDLE_TYPE, UserContext as IntPtr) as int + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KISO_ENUM_PACKETS_CB(PacketIndex as int, [In] ref IsoPacket as KISO_PACKET, UserState as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KLST_ENUM_DEVINFO_CB([In] DeviceList as KLST_HANDLE, [In] DeviceInfo as KLST_DEVINFO_HANDLE, Context as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_InitDelegate([Out] ref InterfaceHandle as KUSB_HANDLE, [In] DevInfo as KLST_DEVINFO_HANDLE) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_FreeDelegate([In] InterfaceHandle as KUSB_HANDLE) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_ClaimInterfaceDelegate([In] InterfaceHandle as KUSB_HANDLE, NumberOrIndex as byte, IsIndex as bool) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_ReleaseInterfaceDelegate([In] InterfaceHandle as KUSB_HANDLE, NumberOrIndex as byte, IsIndex as bool) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_SetAltInterfaceDelegate([In] InterfaceHandle as KUSB_HANDLE, NumberOrIndex as byte, IsIndex as bool, AltSettingNumber as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetAltInterfaceDelegate([In] InterfaceHandle as KUSB_HANDLE, NumberOrIndex as byte, IsIndex as bool, ref AltSettingNumber as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetDescriptorDelegate([In] InterfaceHandle as KUSB_HANDLE, DescriptorType as byte, Index as byte, LanguageID as ushort, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_ControlTransferDelegate([In] InterfaceHandle as KUSB_HANDLE, SetupPacket as WINUSB_SETUP_PACKET, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_SetPowerPolicyDelegate([In] InterfaceHandle as KUSB_HANDLE, PolicyType as int, ValueLength as int, Value as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetPowerPolicyDelegate([In] InterfaceHandle as KUSB_HANDLE, PolicyType as int, ref ValueLength as int, Value as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_SetConfigurationDelegate([In] InterfaceHandle as KUSB_HANDLE, ConfigurationNumber as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetConfigurationDelegate([In] InterfaceHandle as KUSB_HANDLE, ref ConfigurationNumber as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_ResetDeviceDelegate([In] InterfaceHandle as KUSB_HANDLE) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_InitializeDelegate(DeviceHandle as IntPtr, [Out] ref InterfaceHandle as KUSB_HANDLE) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_SelectInterfaceDelegate([In] InterfaceHandle as KUSB_HANDLE, NumberOrIndex as byte, IsIndex as bool) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetAssociatedInterfaceDelegate([In] InterfaceHandle as KUSB_HANDLE, AssociatedInterfaceIndex as byte, [Out] ref AssociatedInterfaceHandle as KUSB_HANDLE) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_CloneDelegate([In] InterfaceHandle as KUSB_HANDLE, [Out] ref DstInterfaceHandle as KUSB_HANDLE) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_QueryInterfaceSettingsDelegate([In] InterfaceHandle as KUSB_HANDLE, AltSettingIndex as byte, [Out] ref UsbAltInterfaceDescriptor as USB_INTERFACE_DESCRIPTOR) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_QueryDeviceInformationDelegate([In] InterfaceHandle as KUSB_HANDLE, InformationType as int, ref BufferLength as int, Buffer as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_SetCurrentAlternateSettingDelegate([In] InterfaceHandle as KUSB_HANDLE, AltSettingNumber as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetCurrentAlternateSettingDelegate([In] InterfaceHandle as KUSB_HANDLE, ref AltSettingNumber as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_QueryPipeDelegate([In] InterfaceHandle as KUSB_HANDLE, AltSettingNumber as byte, PipeIndex as byte, [Out] ref PipeInformation as WINUSB_PIPE_INFORMATION) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_SetPipePolicyDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte, PolicyType as int, ValueLength as int, Value as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetPipePolicyDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte, PolicyType as int, ref ValueLength as int, Value as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_ReadPipeDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_WritePipeDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_ResetPipeDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_AbortPipeDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_FlushPipeDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_IsoReadPipeDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte, Buffer as IntPtr, BufferLength as int, Overlapped as IntPtr, [In] IsoContext as KISO_CONTEXT) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_IsoWritePipeDelegate([In] InterfaceHandle as KUSB_HANDLE, PipeID as byte, Buffer as IntPtr, BufferLength as int, Overlapped as IntPtr, [In] IsoContext as KISO_CONTEXT) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetCurrentFrameNumberDelegate([In] InterfaceHandle as KUSB_HANDLE, ref FrameNumber as int) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetOverlappedResultDelegate([In] InterfaceHandle as KUSB_HANDLE, Overlapped as IntPtr, ref lpNumberOfBytesTransferred as int, bWait as bool) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KUSB_GetPropertyDelegate([In] InterfaceHandle as KUSB_HANDLE, PropertyType as KUSB_PROPERTY, ref PropertySize as int, Value as IntPtr) as bool + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KHOT_PLUG_CB([In] HotHandle as KHOT_HANDLE, [In] DeviceInfo as KLST_DEVINFO_HANDLE, PlugType as KLST_SYNC_FLAG) as void + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KSTM_ERROR_CB([In] StreamInfo as KSTM_INFO, [In] XferContext as KSTM_XFER_CONTEXT, XferContextIndex as int, ErrorCode as int) as int + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KSTM_SUBMIT_CB([In] StreamInfo as KSTM_INFO, [In] XferContext as KSTM_XFER_CONTEXT, XferContextIndex as int, Overlapped as IntPtr) as int + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KSTM_STARTED_CB([In] StreamInfo as KSTM_INFO, [In] XferContext as KSTM_XFER_CONTEXT, XferContextIndex as int) as int + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KSTM_STOPPED_CB([In] StreamInfo as KSTM_INFO, [In] XferContext as KSTM_XFER_CONTEXT, XferContextIndex as int) as int + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KSTM_COMPLETE_CB([In] StreamInfo as KSTM_INFO, [In] XferContext as KSTM_XFER_CONTEXT, XferContextIndex as int, ErrorCode as int) as int + +[UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet: CharSet.Ansi, SetLastError: true)] +public callable KSTM_BEFORE_COMPLETE_CB([In] StreamInfo as KSTM_INFO, [In] XferContext as KSTM_XFER_CONTEXT, XferContextIndex as int, ref ErrorCode as int) as KSTM_COMPLETE_RESULT + +#endregion + +public class LstK(IDisposable): + + protected mHandleStruct as KLST_HANDLE + + protected mbDisposed as bool + + + protected def constructor(): + pass + + + #region IDisposable Members + + public virtual def Dispose(): + Dispose(true) + GC.SuppressFinalize(self) + + + #endregion + + def destructor(): + Dispose(false) + + + protected virtual def Dispose(disposing as bool): + if not mbDisposed: + if mHandleStruct.Pointer != IntPtr.Zero: + AllKFunctions.LstK_Free(mHandleStruct) + Debug.Print('{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}', GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing) + else: + Debug.Print('{0} Dispose: [WARNING] Handle is null', GetType().Name) + + mHandleStruct = KLST_HANDLE(IntPtr.Zero) + mbDisposed = true + + + protected def Init(Flags as KLST_FLAG) as bool: + success as bool = AllKFunctions.LstK_Init(mHandleStruct, Flags) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + return true + + + protected def InitEx(Flags as KLST_FLAG, ref PatternMatch as KLST_PATTERN_MATCH) as bool: + success as bool = AllKFunctions.LstK_InitEx(mHandleStruct, Flags, PatternMatch) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + return true + + + #region Public Members + + public def constructor(Flags as KLST_FLAG): + success as bool = AllKFunctions.LstK_Init(mHandleStruct, Flags) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + + + public def constructor(Flags as KLST_FLAG, ref PatternMatch as KLST_PATTERN_MATCH): + success as bool = AllKFunctions.LstK_InitEx(mHandleStruct, Flags, PatternMatch) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + + + public virtual def Count(ref Count as int) as bool: + return AllKFunctions.LstK_Count(mHandleStruct, Count) + + + public virtual def Current(ref DeviceInfo as KLST_DEVINFO_HANDLE) as bool: + return AllKFunctions.LstK_Current(mHandleStruct, DeviceInfo) + + + public virtual def Enumerate(EnumDevListCB as KLST_ENUM_DEVINFO_CB, Context as IntPtr) as bool: + return AllKFunctions.LstK_Enumerate(mHandleStruct, EnumDevListCB, Context) + + + public virtual def FindByVidPid(Vid as int, Pid as int, ref DeviceInfo as KLST_DEVINFO_HANDLE) as bool: + return AllKFunctions.LstK_FindByVidPid(mHandleStruct, Vid, Pid, DeviceInfo) + + + public virtual def Free(): + Dispose() + + + public Handle as KLST_HANDLE: + get: + return mHandleStruct + + + public virtual def MoveNext(ref DeviceInfo as KLST_DEVINFO_HANDLE) as bool: + return AllKFunctions.LstK_MoveNext(mHandleStruct, DeviceInfo) + + + public virtual def MoveReset(): + AllKFunctions.LstK_MoveReset(mHandleStruct) + + #endregion + + +public class HotK(IDisposable): + + protected mHandleStruct as KHOT_HANDLE + + protected mbDisposed as bool + + + protected def constructor(): + pass + + + #region IDisposable Members + + public virtual def Dispose(): + Dispose(true) + GC.SuppressFinalize(self) + + + #endregion + + def destructor(): + Dispose(false) + + + protected virtual def Dispose(disposing as bool): + if not mbDisposed: + if mHandleStruct.Pointer != IntPtr.Zero: + AllKFunctions.HotK_Free(mHandleStruct) + Debug.Print('{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}', GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing) + else: + Debug.Print('{0} Dispose: [WARNING] Handle is null', GetType().Name) + + mHandleStruct = KHOT_HANDLE(IntPtr.Zero) + mbDisposed = true + + + protected def Init(ref InitParams as KHOT_PARAMS) as bool: + success as bool = AllKFunctions.HotK_Init(mHandleStruct, InitParams) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + return true + + + #region Public Members + + public def constructor(ref InitParams as KHOT_PARAMS): + success as bool = AllKFunctions.HotK_Init(mHandleStruct, InitParams) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + + + public virtual def Free(): + Dispose() + + + public virtual def FreeAll(): + AllKFunctions.HotK_FreeAll() + + + public Handle as KHOT_HANDLE: + get: + return mHandleStruct + + #endregion + + +public class UsbK(IDisposable): + + protected driverAPI as KUSB_DRIVER_API + + protected mHandleStruct as KUSB_HANDLE + + protected mbDisposed as bool + + + protected def constructor(): + pass + + + #region IDisposable Members + + public virtual def Dispose(): + Dispose(true) + GC.SuppressFinalize(self) + + + #endregion + + def destructor(): + Dispose(false) + + + protected virtual def Dispose(disposing as bool): + if not mbDisposed: + if mHandleStruct.Pointer != IntPtr.Zero: + AllKFunctions.UsbK_Free(mHandleStruct) + Debug.Print('{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}', GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing) + else: + Debug.Print('{0} Dispose: [WARNING] Handle is null', GetType().Name) + + mHandleStruct = KUSB_HANDLE(IntPtr.Zero) + mbDisposed = true + + + protected def Init(DevInfo as KLST_DEVINFO_HANDLE) as bool: + success as bool = AllKFunctions.LibK_LoadDriverAPI(driverAPI, DevInfo.DriverID) + + if not success: + raise Exception(string.Format('{0} failed loading Driver API. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + success = driverAPI.Init(mHandleStruct, DevInfo) + + if not success: + raise Exception(string.Format('{0} failed initializing usb device. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + return true + + + protected def Initialize(DeviceHandle as IntPtr, driverID as KUSB_DRVID) as bool: + success as bool = AllKFunctions.LibK_LoadDriverAPI(driverAPI, (driverID cast int)) + + if not success: + raise Exception(string.Format('{0} failed loading Driver API. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + success = driverAPI.Initialize(DeviceHandle, mHandleStruct) + + if not success: + raise Exception(string.Format('{0} failed initializing usb device. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + return true + + + #region Public Members + + public def constructor(DevInfo as KLST_DEVINFO_HANDLE): + success as bool = AllKFunctions.LibK_LoadDriverAPI(driverAPI, DevInfo.DriverID) + + if not success: + raise Exception(string.Format('{0} failed loading Driver API. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + success = driverAPI.Init(mHandleStruct, DevInfo) + + if not success: + raise Exception(string.Format('{0} failed initializing usb device. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + + + public def constructor(DeviceHandle as IntPtr, driverID as KUSB_DRVID): + success as bool = AllKFunctions.LibK_LoadDriverAPI(driverAPI, (driverID cast int)) + + if not success: + raise Exception(string.Format('{0} failed loading Driver API. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + success = driverAPI.Initialize(DeviceHandle, mHandleStruct) + + if not success: + raise Exception(string.Format('{0} failed initializing usb device. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + + + public virtual def AbortPipe(PipeID as byte) as bool: + return driverAPI.AbortPipe(mHandleStruct, PipeID) + + + public virtual def ClaimInterface(NumberOrIndex as byte, IsIndex as bool) as bool: + return driverAPI.ClaimInterface(mHandleStruct, NumberOrIndex, IsIndex) + + + public virtual def Clone(ref DstInterfaceHandle as KUSB_HANDLE) as bool: + return driverAPI.Clone(mHandleStruct, DstInterfaceHandle) + + + public virtual def ControlTransfer(SetupPacket as WINUSB_SETUP_PACKET, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool: + return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Buffer, BufferLength, LengthTransferred, Overlapped) + + + public virtual def ControlTransfer(SetupPacket as WINUSB_SETUP_PACKET, Buffer as Array, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool: + return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped) + + + public virtual def ControlTransfer(SetupPacket as WINUSB_SETUP_PACKET, Buffer as Array, BufferLength as int, ref LengthTransferred as int, Overlapped as KOVL_HANDLE) as bool: + return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped.Pointer) + + + public virtual def ControlTransfer(SetupPacket as WINUSB_SETUP_PACKET, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as KOVL_HANDLE) as bool: + return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Buffer, BufferLength, LengthTransferred, Overlapped.Pointer) + + + public virtual def FlushPipe(PipeID as byte) as bool: + return driverAPI.FlushPipe(mHandleStruct, PipeID) + + + public virtual def Free(): + Dispose() + + + public virtual def GetAltInterface(NumberOrIndex as byte, IsIndex as bool, ref AltSettingNumber as byte) as bool: + return driverAPI.GetAltInterface(mHandleStruct, NumberOrIndex, IsIndex, AltSettingNumber) + + + public virtual def GetAssociatedInterface(AssociatedInterfaceIndex as byte, ref AssociatedInterfaceHandle as KUSB_HANDLE) as bool: + return driverAPI.GetAssociatedInterface(mHandleStruct, AssociatedInterfaceIndex, AssociatedInterfaceHandle) + + + public virtual def GetConfiguration(ref ConfigurationNumber as byte) as bool: + return driverAPI.GetConfiguration(mHandleStruct, ConfigurationNumber) + + + public virtual def GetCurrentAlternateSetting(ref AltSettingNumber as byte) as bool: + return driverAPI.GetCurrentAlternateSetting(mHandleStruct, AltSettingNumber) + + + public virtual def GetCurrentFrameNumber(ref FrameNumber as int) as bool: + return driverAPI.GetCurrentFrameNumber(mHandleStruct, FrameNumber) + + + public virtual def GetDescriptor(DescriptorType as byte, Index as byte, LanguageID as int, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int) as bool: + return driverAPI.GetDescriptor(mHandleStruct, DescriptorType, Index, (LanguageID cast ushort), Buffer, BufferLength, LengthTransferred) + + + public virtual def GetDescriptor(DescriptorType as byte, Index as byte, LanguageID as int, Buffer as Array, BufferLength as int, ref LengthTransferred as int) as bool: + return driverAPI.GetDescriptor(mHandleStruct, DescriptorType, Index, (LanguageID cast ushort), Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred) + + + public virtual def GetOverlappedResult(Overlapped as IntPtr, ref lpNumberOfBytesTransferred as int, bWait as bool) as bool: + return driverAPI.GetOverlappedResult(mHandleStruct, Overlapped, lpNumberOfBytesTransferred, bWait) + + + public virtual def GetOverlappedResult(Overlapped as KOVL_HANDLE, ref lpNumberOfBytesTransferred as int, bWait as bool) as bool: + return driverAPI.GetOverlappedResult(mHandleStruct, Overlapped.Pointer, lpNumberOfBytesTransferred, bWait) + + + public virtual def GetPipePolicy(PipeID as byte, PolicyType as int, ref ValueLength as int, Value as IntPtr) as bool: + return driverAPI.GetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Value) + + + public virtual def GetPipePolicy(PipeID as byte, PolicyType as int, ref ValueLength as int, Value as Array) as bool: + return driverAPI.GetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + + + public virtual def GetPowerPolicy(PolicyType as int, ref ValueLength as int, Value as IntPtr) as bool: + return driverAPI.GetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Value) + + + public virtual def GetPowerPolicy(PolicyType as int, ref ValueLength as int, Value as Array) as bool: + return driverAPI.GetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + + + public virtual def GetProperty(PropertyType as KUSB_PROPERTY, ref PropertySize as int, Value as IntPtr) as bool: + return driverAPI.GetProperty(mHandleStruct, PropertyType, PropertySize, Value) + + + public virtual def GetProperty(PropertyType as KUSB_PROPERTY, ref PropertySize as int, Value as Array) as bool: + return driverAPI.GetProperty(mHandleStruct, PropertyType, PropertySize, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + + + public Handle as KUSB_HANDLE: + get: + return mHandleStruct + + + public virtual def IsoReadPipe(PipeID as byte, Buffer as IntPtr, BufferLength as int, Overlapped as IntPtr, IsoContext as KISO_CONTEXT) as bool: + return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped, IsoContext) + + + public virtual def IsoReadPipe(PipeID as byte, Buffer as Array, BufferLength as int, Overlapped as IntPtr, IsoContext as KISO_CONTEXT) as bool: + return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped, IsoContext) + + + public virtual def IsoReadPipe(PipeID as byte, Buffer as Array, BufferLength as int, Overlapped as KOVL_HANDLE, IsoContext as KISO_CONTEXT) as bool: + return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped.Pointer, IsoContext) + + + public virtual def IsoReadPipe(PipeID as byte, Buffer as IntPtr, BufferLength as int, Overlapped as KOVL_HANDLE, IsoContext as KISO_CONTEXT) as bool: + return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped.Pointer, IsoContext) + + + public virtual def IsoWritePipe(PipeID as byte, Buffer as IntPtr, BufferLength as int, Overlapped as IntPtr, IsoContext as KISO_CONTEXT) as bool: + return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped, IsoContext) + + + public virtual def IsoWritePipe(PipeID as byte, Buffer as Array, BufferLength as int, Overlapped as IntPtr, IsoContext as KISO_CONTEXT) as bool: + return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped, IsoContext) + + + public virtual def IsoWritePipe(PipeID as byte, Buffer as Array, BufferLength as int, Overlapped as KOVL_HANDLE, IsoContext as KISO_CONTEXT) as bool: + return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped.Pointer, IsoContext) + + + public virtual def IsoWritePipe(PipeID as byte, Buffer as IntPtr, BufferLength as int, Overlapped as KOVL_HANDLE, IsoContext as KISO_CONTEXT) as bool: + return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped.Pointer, IsoContext) + + + public virtual def QueryDeviceInformation(InformationType as int, ref BufferLength as int, Buffer as IntPtr) as bool: + return driverAPI.QueryDeviceInformation(mHandleStruct, InformationType, BufferLength, Buffer) + + + public virtual def QueryInterfaceSettings(AltSettingIndex as byte, ref UsbAltInterfaceDescriptor as USB_INTERFACE_DESCRIPTOR) as bool: + return driverAPI.QueryInterfaceSettings(mHandleStruct, AltSettingIndex, UsbAltInterfaceDescriptor) + + + public virtual def QueryPipe(AltSettingNumber as byte, PipeIndex as byte, ref PipeInformation as WINUSB_PIPE_INFORMATION) as bool: + return driverAPI.QueryPipe(mHandleStruct, AltSettingNumber, PipeIndex, PipeInformation) + + + public virtual def ReadPipe(PipeID as byte, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool: + return driverAPI.ReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped) + + + public virtual def ReadPipe(PipeID as byte, Buffer as Array, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool: + return driverAPI.ReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped) + + + public virtual def ReadPipe(PipeID as byte, Buffer as Array, BufferLength as int, ref LengthTransferred as int, Overlapped as KOVL_HANDLE) as bool: + return driverAPI.ReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped.Pointer) + + + public virtual def ReadPipe(PipeID as byte, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as KOVL_HANDLE) as bool: + return driverAPI.ReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped.Pointer) + + + public virtual def ReleaseInterface(NumberOrIndex as byte, IsIndex as bool) as bool: + return driverAPI.ReleaseInterface(mHandleStruct, NumberOrIndex, IsIndex) + + + public virtual def ResetDevice() as bool: + return driverAPI.ResetDevice(mHandleStruct) + + + public virtual def ResetPipe(PipeID as byte) as bool: + return driverAPI.ResetPipe(mHandleStruct, PipeID) + + + public virtual def SelectInterface(NumberOrIndex as byte, IsIndex as bool) as bool: + return driverAPI.SelectInterface(mHandleStruct, NumberOrIndex, IsIndex) + + + public virtual def SetAltInterface(NumberOrIndex as byte, IsIndex as bool, AltSettingNumber as byte) as bool: + return driverAPI.SetAltInterface(mHandleStruct, NumberOrIndex, IsIndex, AltSettingNumber) + + + public virtual def SetConfiguration(ConfigurationNumber as byte) as bool: + return driverAPI.SetConfiguration(mHandleStruct, ConfigurationNumber) + + + public virtual def SetCurrentAlternateSetting(AltSettingNumber as byte) as bool: + return driverAPI.SetCurrentAlternateSetting(mHandleStruct, AltSettingNumber) + + + public virtual def SetPipePolicy(PipeID as byte, PolicyType as int, ValueLength as int, Value as IntPtr) as bool: + return driverAPI.SetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Value) + + + public virtual def SetPipePolicy(PipeID as byte, PolicyType as int, ValueLength as int, Value as Array) as bool: + return driverAPI.SetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + + + public virtual def SetPowerPolicy(PolicyType as int, ValueLength as int, Value as IntPtr) as bool: + return driverAPI.SetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Value) + + + public virtual def SetPowerPolicy(PolicyType as int, ValueLength as int, Value as Array) as bool: + return driverAPI.SetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + + + public virtual def WritePipe(PipeID as byte, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool: + return driverAPI.WritePipe(mHandleStruct, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped) + + + public virtual def WritePipe(PipeID as byte, Buffer as Array, BufferLength as int, ref LengthTransferred as int, Overlapped as IntPtr) as bool: + return driverAPI.WritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped) + + + public virtual def WritePipe(PipeID as byte, Buffer as Array, BufferLength as int, ref LengthTransferred as int, Overlapped as KOVL_HANDLE) as bool: + return driverAPI.WritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped.Pointer) + + + public virtual def WritePipe(PipeID as byte, Buffer as IntPtr, BufferLength as int, ref LengthTransferred as int, Overlapped as KOVL_HANDLE) as bool: + return driverAPI.WritePipe(mHandleStruct, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped.Pointer) + + #endregion + + +public class OvlK(IDisposable): + + protected mHandleStruct as KOVL_POOL_HANDLE + + protected mbDisposed as bool + + + protected def constructor(): + pass + + + #region IDisposable Members + + public virtual def Dispose(): + Dispose(true) + GC.SuppressFinalize(self) + + + #endregion + + def destructor(): + Dispose(false) + + + protected virtual def Dispose(disposing as bool): + if not mbDisposed: + if mHandleStruct.Pointer != IntPtr.Zero: + AllKFunctions.OvlK_Free(mHandleStruct) + Debug.Print('{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}', GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing) + else: + Debug.Print('{0} Dispose: [WARNING] Handle is null', GetType().Name) + + mHandleStruct = KOVL_POOL_HANDLE(IntPtr.Zero) + mbDisposed = true + + + protected def Init(UsbHandle as KUSB_HANDLE, MaxOverlappedCount as int, Flags as KOVL_POOL_FLAG) as bool: + success as bool = AllKFunctions.OvlK_Init(mHandleStruct, UsbHandle, MaxOverlappedCount, Flags) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + return true + + + #region Public Members + + public def constructor(UsbHandle as KUSB_HANDLE, MaxOverlappedCount as int, Flags as KOVL_POOL_FLAG): + success as bool = AllKFunctions.OvlK_Init(mHandleStruct, UsbHandle, MaxOverlappedCount, Flags) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + + + public virtual def Acquire(ref OverlappedK as KOVL_HANDLE) as bool: + return AllKFunctions.OvlK_Acquire(OverlappedK, mHandleStruct) + + + public virtual def Free(): + Dispose() + + + public virtual def GetEventHandle(OverlappedK as KOVL_HANDLE) as IntPtr: + return AllKFunctions.OvlK_GetEventHandle(OverlappedK) + + + public Handle as KOVL_POOL_HANDLE: + get: + return mHandleStruct + + + public virtual def IsComplete(OverlappedK as KOVL_HANDLE) as bool: + return AllKFunctions.OvlK_IsComplete(OverlappedK) + + + public virtual def ReUse(OverlappedK as KOVL_HANDLE) as bool: + return AllKFunctions.OvlK_ReUse(OverlappedK) + + + public virtual def Release(OverlappedK as KOVL_HANDLE) as bool: + return AllKFunctions.OvlK_Release(OverlappedK) + + + public virtual def Wait(OverlappedK as KOVL_HANDLE, TimeoutMS as int, WaitFlags as KOVL_WAIT_FLAG, ref TransferredLength as int) as bool: + return AllKFunctions.OvlK_Wait(OverlappedK, TimeoutMS, WaitFlags, TransferredLength) + + + public virtual def WaitAndRelease(OverlappedK as KOVL_HANDLE, TimeoutMS as int, ref TransferredLength as int) as bool: + return AllKFunctions.OvlK_WaitAndRelease(OverlappedK, TimeoutMS, TransferredLength) + + + public virtual def WaitOldest(ref OverlappedK as KOVL_HANDLE, TimeoutMS as int, WaitFlags as KOVL_WAIT_FLAG, ref TransferredLength as int) as bool: + return AllKFunctions.OvlK_WaitOldest(mHandleStruct, OverlappedK, TimeoutMS, WaitFlags, TransferredLength) + + + public virtual def WaitOrCancel(OverlappedK as KOVL_HANDLE, TimeoutMS as int, ref TransferredLength as int) as bool: + return AllKFunctions.OvlK_WaitOrCancel(OverlappedK, TimeoutMS, TransferredLength) + + #endregion + + +public class StmK(IDisposable): + + protected mHandleStruct as KSTM_HANDLE + + protected mbDisposed as bool + + + protected def constructor(): + pass + + + #region IDisposable Members + + public virtual def Dispose(): + Dispose(true) + GC.SuppressFinalize(self) + + + #endregion + + def destructor(): + Dispose(false) + + + protected virtual def Dispose(disposing as bool): + if not mbDisposed: + if mHandleStruct.Pointer != IntPtr.Zero: + AllKFunctions.StmK_Free(mHandleStruct) + Debug.Print('{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}', GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing) + else: + Debug.Print('{0} Dispose: [WARNING] Handle is null', GetType().Name) + + mHandleStruct = KSTM_HANDLE(IntPtr.Zero) + mbDisposed = true + + + protected def Init(UsbHandle as KUSB_HANDLE, PipeID as byte, MaxTransferSize as int, MaxPendingTransfers as int, MaxPendingIO as int, ref Callbacks as KSTM_CALLBACK, Flags as KSTM_FLAG) as bool: + success as bool = AllKFunctions.StmK_Init(mHandleStruct, UsbHandle, PipeID, MaxTransferSize, MaxPendingTransfers, MaxPendingIO, Callbacks, Flags) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + return true + + + #region Public Members + + public def constructor(UsbHandle as KUSB_HANDLE, PipeID as byte, MaxTransferSize as int, MaxPendingTransfers as int, MaxPendingIO as int, ref Callbacks as KSTM_CALLBACK, Flags as KSTM_FLAG): + success as bool = AllKFunctions.StmK_Init(mHandleStruct, UsbHandle, PipeID, MaxTransferSize, MaxPendingTransfers, MaxPendingIO, Callbacks, Flags) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + + + public virtual def Free(): + Dispose() + + + public Handle as KSTM_HANDLE: + get: + return mHandleStruct + + + public virtual def Read(Buffer as IntPtr, Offset as int, Length as int, ref TransferredLength as int) as bool: + return AllKFunctions.StmK_Read(mHandleStruct, Buffer, Offset, Length, TransferredLength) + + + public virtual def Read(Buffer as Array, Offset as int, Length as int, ref TransferredLength as int) as bool: + return AllKFunctions.StmK_Read(mHandleStruct, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), Offset, Length, TransferredLength) + + + public virtual def Start() as bool: + return AllKFunctions.StmK_Start(mHandleStruct) + + + public virtual def Stop(TimeoutCancelMS as int) as bool: + return AllKFunctions.StmK_Stop(mHandleStruct, TimeoutCancelMS) + + + public virtual def Write(Buffer as IntPtr, Offset as int, Length as int, ref TransferredLength as int) as bool: + return AllKFunctions.StmK_Write(mHandleStruct, Buffer, Offset, Length, TransferredLength) + + + public virtual def Write(Buffer as Array, Offset as int, Length as int, ref TransferredLength as int) as bool: + return AllKFunctions.StmK_Write(mHandleStruct, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), Offset, Length, TransferredLength) + + #endregion + + +public class IsoK(IDisposable): + + protected mHandleStruct as KISO_CONTEXT + + protected mbDisposed as bool + + + protected def constructor(): + pass + + + #region IDisposable Members + + public virtual def Dispose(): + Dispose(true) + GC.SuppressFinalize(self) + + + #endregion + + def destructor(): + Dispose(false) + + + protected virtual def Dispose(disposing as bool): + if not mbDisposed: + if mHandleStruct.Pointer != IntPtr.Zero: + AllKFunctions.IsoK_Free(mHandleStruct) + Debug.Print('{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}', GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing) + else: + Debug.Print('{0} Dispose: [WARNING] Handle is null', GetType().Name) + + mHandleStruct = KISO_CONTEXT(IntPtr.Zero) + mbDisposed = true + + + protected def Init(NumberOfPackets as int, StartFrame as int) as bool: + success as bool = AllKFunctions.IsoK_Init(mHandleStruct, NumberOfPackets, StartFrame) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + return true + + + #region Nested Structs + + [StructLayout(LayoutKind.Sequential, CharSet: CharSet.Ansi, Pack: 1)] + private struct KISO_CONTEXT_MAP: + + private final Flags as KISO_FLAG + + + private final StartFrame as int + + + private final ErrorCount as short + + + private final NumberOfPackets as short + + + private final UrbHdrStatus as int + + + #endregion + + #region Public Members + + public def constructor(NumberOfPackets as int, StartFrame as int): + success as bool = AllKFunctions.IsoK_Init(mHandleStruct, NumberOfPackets, StartFrame) + + if not success: + raise Exception(string.Format('{0} failed initializing. ErrorCode={1:X8}h', GetType().Name, Marshal.GetLastWin32Error())) + + Debug.Print('{0} Init: handle 0x{1:X16}', GetType().Name, mHandleStruct.Pointer.ToInt64()) + + + public virtual def EnumPackets(EnumPackets as KISO_ENUM_PACKETS_CB, StartPacketIndex as int, UserState as IntPtr) as bool: + return AllKFunctions.IsoK_EnumPackets(mHandleStruct, EnumPackets, StartPacketIndex, UserState) + + + public ErrorCount as short: + get: + return Marshal.ReadInt16(mHandleStruct.Pointer, ofsErrorCount) + set: + Marshal.WriteInt16(mHandleStruct.Pointer, ofsErrorCount, value) + + + public Flags as KISO_FLAG: + get: + return (Marshal.ReadInt32(mHandleStruct.Pointer, ofsFlags) cast KISO_FLAG) + set: + Marshal.WriteInt32(mHandleStruct.Pointer, ofsFlags, (value cast int)) + + + public virtual def Free(): + Dispose() + + + public virtual def GetPacket(PacketIndex as int, ref IsoPacket as KISO_PACKET) as bool: + return AllKFunctions.IsoK_GetPacket(mHandleStruct, PacketIndex, IsoPacket) + + + public Handle as KISO_CONTEXT: + get: + return mHandleStruct + + + public NumberOfPackets as short: + get: + return Marshal.ReadInt16(mHandleStruct.Pointer, ofsNumberOfPackets) + set: + Marshal.WriteInt16(mHandleStruct.Pointer, ofsNumberOfPackets, value) + + + public virtual def ReUse() as bool: + return AllKFunctions.IsoK_ReUse(mHandleStruct) + + + public virtual def SetPacket(PacketIndex as int, ref IsoPacket as KISO_PACKET) as bool: + return AllKFunctions.IsoK_SetPacket(mHandleStruct, PacketIndex, IsoPacket) + + + public virtual def SetPackets(PacketSize as int) as bool: + return AllKFunctions.IsoK_SetPackets(mHandleStruct, PacketSize) + + + public StartFrame as int: + get: + return Marshal.ReadInt32(mHandleStruct.Pointer, ofsStartFrame) + set: + Marshal.WriteInt32(mHandleStruct.Pointer, ofsStartFrame, value) + + + public UrbHdrStatus as int: + get: + return Marshal.ReadInt32(mHandleStruct.Pointer, ofsUrbHdrStatus) + set: + Marshal.WriteInt32(mHandleStruct.Pointer, ofsUrbHdrStatus, value) + + + #endregion + + #region Private Members + + private static final ofsErrorCount as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'ErrorCount').ToInt32() + + private static final ofsFlags as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'Flags').ToInt32() + + private static final ofsNumberOfPackets as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'NumberOfPackets').ToInt32() + + private static final ofsStartFrame as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'StartFrame').ToInt32() + + private static final ofsUrbHdrStatus as int = Marshal.OffsetOf(typeof(KISO_CONTEXT_MAP), 'UrbHdrStatus').ToInt32() + + #endregion + diff --git a/Old Matlab Interface/bindings/libusbK.cs b/Old Matlab Interface/bindings/libusbK.cs new file mode 100644 index 00000000..80402b0e --- /dev/null +++ b/Old Matlab Interface/bindings/libusbK.cs @@ -0,0 +1,3836 @@ +#region Copyright (c) Travis Robinson + +// Copyright (c) 2012 Travis Robinson +// All rights reserved. +// +// C# libusbK Bindings +// Auto-generated on: 04.28.2011 +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +// ReSharper disable InconsistentNaming +// ReSharper disable CheckNamespace +// ReSharper disable UnassignedReadonlyField + +namespace libusbK +{ + public static class AllKOptions + { + #region Public Members + + /// + /// Alternate libusbK library to use. This must be assigned before any libusbK functions are called and it must be the full path and file name to a libusbK.dll. + /// + public static string LIBUSBK_FULLPATH_TO_ALTERNATE_DLL; + + #endregion + } + + public static class AllKConstants + { + #region Public Members + + /// + /// Allocated length for all strings in a \ref KLST_DEVINFO structure. + /// + public const int KLST_STRING_MAX_LEN = 256; + + /// + /// libusbK library + /// + public const string LIBUSBK_DLL = "libusbK.dll"; + + /// + /// Config power mask for the \c bmAttributes field of a \ref USB_CONFIGURATION_DESCRIPTOR + /// + public const byte USB_CONFIG_POWERED_MASK = 0xC0; + + /// + /// Endpoint address mask for the \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR + /// + public const byte USB_ENDPOINT_ADDRESS_MASK = 0x0F; + + /// + /// Endpoint direction mask for the \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR + /// + public const byte USB_ENDPOINT_DIRECTION_MASK = 0x80; + + #endregion + } + + public enum PipePolicyType + { + SHORT_PACKET_TERMINATE = 0x01, + AUTO_CLEAR_STALL = 0x02, + PIPE_TRANSFER_TIMEOUT = 0x03, + IGNORE_SHORT_PACKETS = 0x04, + ALLOW_PARTIAL_READS = 0x05, + AUTO_FLUSH = 0x06, + RAW_IO = 0x07, + MAXIMUM_TRANSFER_SIZE = 0x08, + RESET_PIPE_ON_RESUME = 0x09, + + ISO_START_LATENCY = 0x20, + ISO_ALWAYS_START_ASAP = 0x21, + ISO_NUM_FIXED_PACKETS = 0x22, + + SIMUL_PARALLEL_REQUESTS = 0x30, + } + + public enum PowerPolicyType + { + AUTO_SUSPEND = 0x81, + SUSPEND_DELAY = 0x83, + } + + public enum DeviceInformationType + { + DEVICE_SPEED = 0x01, + } + + public enum EndpointType + { + /// + /// Indicates a control endpoint + /// + CONTROL = 0x00, + + /// + /// Indicates an isochronous endpoint + /// + ISOCHRONOUS = 0x01, + + /// + /// Indicates a bulk endpoint + /// + BULK = 0x02, + + /// + /// Indicates an interrupt endpoint + /// + INTERRUPT = 0x03, + + /// + /// Endpoint type mask for the \c bmAttributes field of a \ref USB_ENDPOINT_DESCRIPTOR + /// + MASK = 0x03, + } + + public static class ErrorCodes + { + #region Public Members + + /// + /// Access is denied. + /// + public const int AccessDenied = 5; + + /// + /// The requested resource is in use. + /// + public const int Busy = 170; + + /// + /// The operation was canceled by the user. + /// + public const int Cancelled = 1223; + + /// + /// The library, drive, or media pool is empty. + /// + public const int Empty = 4306; + + /// + /// The handle is invalid. + /// + public const int InvalidHandle = 6; + + /// + /// The parameter is incorrect. + /// + public const int InvalidParameter = 87; + + /// + /// Overlapped I/O event is not in a signaled state. + /// + public const int IoIncomplete = 996; + + /// + /// Overlapped I/O operation is in progress. + /// + public const int IoPending = 997; + + /// + /// More data is available. + /// + public const int MoreData = 234; + + /// + /// No more data is available. + /// + public const int NoMoreItems = 259; + + /// + /// Not enough storage is available to process this command. + /// + public const int NotEnoughMemory = 8; + + /// + /// Element not found. + /// + public const int NotFound = 1168; + + /// + /// The request is not supported. + /// + public const int NotSupported = 50; + + /// + /// The I/O operation has been aborted because of either a thread exit or an application request. + /// + public const int OperationAborted = 995; + + /// + /// The cluster resource is not available. + /// + public const int ResourceNotAvailable = 5006; + + /// + /// The cluster resource could not be found. + /// + public const int ResourceNotFound = 5007; + + /// + /// The semaphore timeout period has expired. + /// + public const int SemTimeout = 121; + + /// + /// The operation completed successfully. + /// + public const int Success = 0; + + /// + /// An attempt was made to operate on a thread within a specific process, but the thread specified is not in the process specified. + /// + public const int ThreadNotInProcess = 566; + + /// + /// A thread termination occurred while the thread was suspended. The thread was resumed, and termination proceeded. + /// + public const int ThreadWasSuspended = 699; + + /// + /// Too many dynamic-link modules are attached to this program or dynamic-link module. + /// + public const int TooManyModules = 214; + + #endregion + } + + public interface IKLIB_HANDLE + { + #region Public Members + + IntPtr GetContext(); + KLIB_HANDLE_TYPE HandleType { get; } + IntPtr Pointer { get; } + bool SetCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback); + bool SetContext(IntPtr UserContext); + + #endregion + } + + #region Opaque library handles + + public struct KLST_HANDLE : IKLIB_HANDLE + { + #region IKLIB_HANDLE Members + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + public KLIB_HANDLE_TYPE HandleType + { + get + { + return KLIB_HANDLE_TYPE.LSTK; + } + } + + public IntPtr GetContext() + { + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType); + } + + public bool SetContext(IntPtr UserContext) + { + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext); + } + + public bool SetCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback) + { + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback); + } + + #endregion + + #region Public Members + + public KLST_HANDLE(IntPtr Handle) + { + mHandlePtr = Handle; + } + + #endregion + + #region Private Members + + private readonly IntPtr mHandlePtr; + + #endregion + } + + public struct KHOT_HANDLE : IKLIB_HANDLE + { + #region IKLIB_HANDLE Members + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + public KLIB_HANDLE_TYPE HandleType + { + get + { + return KLIB_HANDLE_TYPE.HOTK; + } + } + + public IntPtr GetContext() + { + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType); + } + + public bool SetContext(IntPtr UserContext) + { + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext); + } + + public bool SetCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback) + { + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback); + } + + #endregion + + #region Public Members + + public KHOT_HANDLE(IntPtr Handle) + { + mHandlePtr = Handle; + } + + #endregion + + #region Private Members + + private readonly IntPtr mHandlePtr; + + #endregion + } + + public struct KUSB_HANDLE : IKLIB_HANDLE + { + #region IKLIB_HANDLE Members + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + public KLIB_HANDLE_TYPE HandleType + { + get + { + return KLIB_HANDLE_TYPE.USBK; + } + } + + public IntPtr GetContext() + { + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType); + } + + public bool SetContext(IntPtr UserContext) + { + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext); + } + + public bool SetCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback) + { + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback); + } + + #endregion + + #region USB Shared Device Context + + public IntPtr GetSharedContext() + { + return AllKFunctions.LibK_GetContext(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK); + } + + public bool SetSharedCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback) + { + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK, CleanupCallback); + } + + public bool SetSharedContext(IntPtr UserContext) + { + return AllKFunctions.LibK_SetContext(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK, UserContext); + } + + #endregion + + #region Public Members + + public KUSB_HANDLE(IntPtr Handle) + { + mHandlePtr = Handle; + } + + #endregion + + #region Private Members + + private readonly IntPtr mHandlePtr; + + #endregion + } + + public struct KOVL_POOL_HANDLE : IKLIB_HANDLE + { + #region IKLIB_HANDLE Members + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + public KLIB_HANDLE_TYPE HandleType + { + get + { + return KLIB_HANDLE_TYPE.OVLPOOLK; + } + } + + public IntPtr GetContext() + { + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType); + } + + public bool SetContext(IntPtr UserContext) + { + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext); + } + + public bool SetCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback) + { + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback); + } + + #endregion + + #region Public Members + + public KOVL_POOL_HANDLE(IntPtr Handle) + { + mHandlePtr = Handle; + } + + #endregion + + #region Private Members + + private readonly IntPtr mHandlePtr; + + #endregion + } + + public struct KOVL_HANDLE : IKLIB_HANDLE + { + #region IKLIB_HANDLE Members + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + public KLIB_HANDLE_TYPE HandleType + { + get + { + return KLIB_HANDLE_TYPE.OVLK; + } + } + + public IntPtr GetContext() + { + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType); + } + + public bool SetContext(IntPtr UserContext) + { + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext); + } + + public bool SetCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback) + { + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback); + } + + #endregion + + #region Public Members + + public KOVL_HANDLE(IntPtr Handle) + { + mHandlePtr = Handle; + } + + #endregion + + #region Private Members + + private readonly IntPtr mHandlePtr; + + #endregion + } + + public struct KSTM_HANDLE : IKLIB_HANDLE + { + #region IKLIB_HANDLE Members + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + public KLIB_HANDLE_TYPE HandleType + { + get + { + return KLIB_HANDLE_TYPE.STMK; + } + } + + public IntPtr GetContext() + { + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType); + } + + public bool SetContext(IntPtr UserContext) + { + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext); + } + + public bool SetCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback) + { + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback); + } + + #endregion + + #region Public Members + + public KSTM_HANDLE(IntPtr Handle) + { + mHandlePtr = Handle; + } + + #endregion + + #region Private Members + + private readonly IntPtr mHandlePtr; + + #endregion + } + + #endregion + + #region Internal Function Imports + + internal static class AllKFunctions + { + #region Delegates + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate void HotK_FreeAllDelegate(); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool HotK_FreeDelegate([In] KHOT_HANDLE Handle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool HotK_InitDelegate([Out] out KHOT_HANDLE Handle, [In, Out] ref KHOT_PARAMS InitParams); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool IsoK_EnumPacketsDelegate([In] KISO_CONTEXT IsoContext, KISO_ENUM_PACKETS_CB EnumPackets, int StartPacketIndex, IntPtr UserState); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool IsoK_FreeDelegate([In] KISO_CONTEXT IsoContext); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool IsoK_GetPacketDelegate([In] KISO_CONTEXT IsoContext, int PacketIndex, [Out] out KISO_PACKET IsoPacket); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool IsoK_InitDelegate([Out] out KISO_CONTEXT IsoContext, int NumberOfPackets, int StartFrame); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool IsoK_ReUseDelegate([In] KISO_CONTEXT IsoContext); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool IsoK_SetPacketDelegate([In] KISO_CONTEXT IsoContext, int PacketIndex, [In] ref KISO_PACKET IsoPacket); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool IsoK_SetPacketsDelegate([In] KISO_CONTEXT IsoContext, int PacketSize); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate void LibK_Context_FreeDelegate(); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LibK_Context_InitDelegate(IntPtr Heap, IntPtr Reserved); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LibK_CopyDriverAPIDelegate([Out] out KUSB_DRIVER_API DriverAPI, [In] KUSB_HANDLE UsbHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate IntPtr LibK_GetContextDelegate([In] IntPtr Handle, KLIB_HANDLE_TYPE HandleType); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate IntPtr LibK_GetDefaultContextDelegate(KLIB_HANDLE_TYPE HandleType); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LibK_GetProcAddressDelegate(IntPtr ProcAddress, int DriverID, int FunctionID); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate void LibK_GetVersionDelegate([Out] out KLIB_VERSION Version); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LibK_LoadDriverAPIDelegate([Out] out KUSB_DRIVER_API DriverAPI, int DriverID); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LibK_SetCleanupCallbackDelegate([In] IntPtr Handle, KLIB_HANDLE_TYPE HandleType, KLIB_HANDLE_CLEANUP_CB CleanupCB); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LibK_SetContextDelegate([In] IntPtr Handle, KLIB_HANDLE_TYPE HandleType, IntPtr ContextValue); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LibK_SetDefaultContextDelegate(KLIB_HANDLE_TYPE HandleType, IntPtr ContextValue); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LstK_CountDelegate([In] KLST_HANDLE DeviceList, ref int Count); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LstK_CurrentDelegate([In] KLST_HANDLE DeviceList, [Out] out KLST_DEVINFO_HANDLE DeviceInfo); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LstK_EnumerateDelegate([In] KLST_HANDLE DeviceList, KLST_ENUM_DEVINFO_CB EnumDevListCB, IntPtr Context); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LstK_FindByVidPidDelegate([In] KLST_HANDLE DeviceList, int Vid, int Pid, [Out] out KLST_DEVINFO_HANDLE DeviceInfo); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LstK_FreeDelegate([In] KLST_HANDLE DeviceList); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LstK_InitDelegate([Out] out KLST_HANDLE DeviceList, KLST_FLAG Flags); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LstK_InitExDelegate([Out] out KLST_HANDLE DeviceList, KLST_FLAG Flags, [In] ref KLST_PATTERN_MATCH PatternMatch); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool LstK_MoveNextDelegate([In] KLST_HANDLE DeviceList, [Out] out KLST_DEVINFO_HANDLE DeviceInfo); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate void LstK_MoveResetDelegate([In] KLST_HANDLE DeviceList); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_AcquireDelegate([Out] out KOVL_HANDLE OverlappedK, [In] KOVL_POOL_HANDLE PoolHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_FreeDelegate([In] KOVL_POOL_HANDLE PoolHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate IntPtr OvlK_GetEventHandleDelegate([In] KOVL_HANDLE OverlappedK); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_InitDelegate([Out] out KOVL_POOL_HANDLE PoolHandle, [In] KUSB_HANDLE UsbHandle, int MaxOverlappedCount, KOVL_POOL_FLAG Flags); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_IsCompleteDelegate([In] KOVL_HANDLE OverlappedK); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_ReUseDelegate([In] KOVL_HANDLE OverlappedK); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_ReleaseDelegate([In] KOVL_HANDLE OverlappedK); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_WaitAndReleaseDelegate([In] KOVL_HANDLE OverlappedK, int TimeoutMS, out int TransferredLength); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_WaitDelegate([In] KOVL_HANDLE OverlappedK, int TimeoutMS, KOVL_WAIT_FLAG WaitFlags, out int TransferredLength); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_WaitOldestDelegate([In] KOVL_POOL_HANDLE PoolHandle, [Out] out KOVL_HANDLE OverlappedK, int TimeoutMS, KOVL_WAIT_FLAG WaitFlags, out int TransferredLength); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool OvlK_WaitOrCancelDelegate([In] KOVL_HANDLE OverlappedK, int TimeoutMS, out int TransferredLength); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool StmK_FreeDelegate([In] KSTM_HANDLE StreamHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool StmK_InitDelegate( + [Out] out KSTM_HANDLE StreamHandle, [In] KUSB_HANDLE UsbHandle, byte PipeID, int MaxTransferSize, int MaxPendingTransfers, int MaxPendingIO, [In] ref KSTM_CALLBACK Callbacks, KSTM_FLAG Flags); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool StmK_ReadDelegate([In] KSTM_HANDLE StreamHandle, IntPtr Buffer, int Offset, int Length, out int TransferredLength); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool StmK_StartDelegate([In] KSTM_HANDLE StreamHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool StmK_StopDelegate([In] KSTM_HANDLE StreamHandle, int TimeoutCancelMS); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool StmK_WriteDelegate([In] KSTM_HANDLE StreamHandle, IntPtr Buffer, int Offset, int Length, out int TransferredLength); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool UsbK_FreeDelegate([In] KUSB_HANDLE InterfaceHandle); + + #endregion + + static AllKFunctions() + { + if (String.IsNullOrEmpty(AllKOptions.LIBUSBK_FULLPATH_TO_ALTERNATE_DLL)) + mModuleLibusbK = LoadLibraryEx(AllKConstants.LIBUSBK_DLL, IntPtr.Zero, LoadLibraryFlags.NONE); + else + mModuleLibusbK = LoadLibraryEx(AllKOptions.LIBUSBK_FULLPATH_TO_ALTERNATE_DLL, IntPtr.Zero, LoadLibraryFlags.LOAD_WITH_ALTERED_SEARCH_PATH); + + if (mModuleLibusbK == IntPtr.Zero) + throw new DllNotFoundException("libusbK.dll not found. Please install drivers/applications and retry."); + + LoadDynamicFunctions(); + } + + #region Nested Enumerations + + [Flags] + private enum LoadLibraryFlags + { + NONE = 0, + DONT_RESOLVE_DLL_REFERENCES = 0x00000001, + LOAD_IGNORE_CODE_AUTHZ_LEVEL = 0x00000010, + LOAD_LIBRARY_AS_DATAFILE = 0x00000002, + LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 0x00000040, + LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x00000020, + LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008 + } + + #endregion + + #region Public Members + + public static HotK_FreeDelegate HotK_Free; + public static HotK_FreeAllDelegate HotK_FreeAll; + public static HotK_InitDelegate HotK_Init; + public static IsoK_EnumPacketsDelegate IsoK_EnumPackets; + public static IsoK_FreeDelegate IsoK_Free; + public static IsoK_GetPacketDelegate IsoK_GetPacket; + public static IsoK_InitDelegate IsoK_Init; + public static IsoK_ReUseDelegate IsoK_ReUse; + public static IsoK_SetPacketDelegate IsoK_SetPacket; + public static IsoK_SetPacketsDelegate IsoK_SetPackets; + public static LibK_Context_FreeDelegate LibK_Context_Free; + public static LibK_Context_InitDelegate LibK_Context_Init; + + public static LibK_CopyDriverAPIDelegate LibK_CopyDriverAPI; + public static LibK_GetContextDelegate LibK_GetContext; + public static LibK_GetDefaultContextDelegate LibK_GetDefaultContext; + public static LibK_GetProcAddressDelegate LibK_GetProcAddress; + public static LibK_GetVersionDelegate LibK_GetVersion; + public static LibK_LoadDriverAPIDelegate LibK_LoadDriverAPI; + public static LibK_SetCleanupCallbackDelegate LibK_SetCleanupCallback; + public static LibK_SetContextDelegate LibK_SetContext; + public static LibK_SetDefaultContextDelegate LibK_SetDefaultContext; + public static LstK_CountDelegate LstK_Count; + public static LstK_CurrentDelegate LstK_Current; + public static LstK_EnumerateDelegate LstK_Enumerate; + public static LstK_FindByVidPidDelegate LstK_FindByVidPid; + public static LstK_FreeDelegate LstK_Free; + public static LstK_InitDelegate LstK_Init; + public static LstK_InitExDelegate LstK_InitEx; + public static LstK_MoveNextDelegate LstK_MoveNext; + public static LstK_MoveResetDelegate LstK_MoveReset; + public static OvlK_AcquireDelegate OvlK_Acquire; + public static OvlK_FreeDelegate OvlK_Free; + public static OvlK_GetEventHandleDelegate OvlK_GetEventHandle; + public static OvlK_InitDelegate OvlK_Init; + public static OvlK_IsCompleteDelegate OvlK_IsComplete; + public static OvlK_ReUseDelegate OvlK_ReUse; + public static OvlK_ReleaseDelegate OvlK_Release; + public static OvlK_WaitDelegate OvlK_Wait; + public static OvlK_WaitAndReleaseDelegate OvlK_WaitAndRelease; + public static OvlK_WaitOldestDelegate OvlK_WaitOldest; + public static OvlK_WaitOrCancelDelegate OvlK_WaitOrCancel; + public static StmK_FreeDelegate StmK_Free; + public static StmK_InitDelegate StmK_Init; + public static StmK_ReadDelegate StmK_Read; + public static StmK_StartDelegate StmK_Start; + public static StmK_StopDelegate StmK_Stop; + public static StmK_WriteDelegate StmK_Write; + public static UsbK_FreeDelegate UsbK_Free; + + #endregion + + #region Private Members + + [DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)] + private static extern IntPtr GetProcAddress(IntPtr hModule, string procName); + + private static void LoadDynamicFunctions() + { + LibK_GetVersion = (LibK_GetVersionDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_GetVersion"), typeof (LibK_GetVersionDelegate)); + LibK_GetContext = (LibK_GetContextDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_GetContext"), typeof (LibK_GetContextDelegate)); + LibK_SetContext = (LibK_SetContextDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_SetContext"), typeof (LibK_SetContextDelegate)); + LibK_SetCleanupCallback = (LibK_SetCleanupCallbackDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_SetCleanupCallback"), typeof (LibK_SetCleanupCallbackDelegate)); + LibK_LoadDriverAPI = (LibK_LoadDriverAPIDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_LoadDriverAPI"), typeof (LibK_LoadDriverAPIDelegate)); + LibK_CopyDriverAPI = (LibK_CopyDriverAPIDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_CopyDriverAPI"), typeof (LibK_CopyDriverAPIDelegate)); + LibK_GetProcAddress = (LibK_GetProcAddressDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_GetProcAddress"), typeof (LibK_GetProcAddressDelegate)); + LibK_SetDefaultContext = (LibK_SetDefaultContextDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_SetDefaultContext"), typeof (LibK_SetDefaultContextDelegate)); + LibK_GetDefaultContext = (LibK_GetDefaultContextDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_GetDefaultContext"), typeof (LibK_GetDefaultContextDelegate)); + LibK_Context_Init = (LibK_Context_InitDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_Context_Init"), typeof (LibK_Context_InitDelegate)); + LibK_Context_Free = (LibK_Context_FreeDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_Context_Free"), typeof (LibK_Context_FreeDelegate)); + UsbK_Free = (UsbK_FreeDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "UsbK_Free"), typeof (UsbK_FreeDelegate)); + LstK_Init = (LstK_InitDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Init"), typeof (LstK_InitDelegate)); + LstK_InitEx = (LstK_InitExDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_InitEx"), typeof (LstK_InitExDelegate)); + LstK_Free = (LstK_FreeDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Free"), typeof (LstK_FreeDelegate)); + LstK_Enumerate = (LstK_EnumerateDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Enumerate"), typeof (LstK_EnumerateDelegate)); + LstK_Current = (LstK_CurrentDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Current"), typeof (LstK_CurrentDelegate)); + LstK_MoveNext = (LstK_MoveNextDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_MoveNext"), typeof (LstK_MoveNextDelegate)); + LstK_MoveReset = (LstK_MoveResetDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_MoveReset"), typeof (LstK_MoveResetDelegate)); + LstK_FindByVidPid = (LstK_FindByVidPidDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_FindByVidPid"), typeof (LstK_FindByVidPidDelegate)); + LstK_Count = (LstK_CountDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Count"), typeof (LstK_CountDelegate)); + HotK_Init = (HotK_InitDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "HotK_Init"), typeof (HotK_InitDelegate)); + HotK_Free = (HotK_FreeDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "HotK_Free"), typeof (HotK_FreeDelegate)); + HotK_FreeAll = (HotK_FreeAllDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "HotK_FreeAll"), typeof (HotK_FreeAllDelegate)); + OvlK_Acquire = (OvlK_AcquireDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Acquire"), typeof (OvlK_AcquireDelegate)); + OvlK_Release = (OvlK_ReleaseDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Release"), typeof (OvlK_ReleaseDelegate)); + OvlK_Init = (OvlK_InitDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Init"), typeof (OvlK_InitDelegate)); + OvlK_Free = (OvlK_FreeDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Free"), typeof (OvlK_FreeDelegate)); + OvlK_GetEventHandle = (OvlK_GetEventHandleDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_GetEventHandle"), typeof (OvlK_GetEventHandleDelegate)); + OvlK_Wait = (OvlK_WaitDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Wait"), typeof (OvlK_WaitDelegate)); + OvlK_WaitOldest = (OvlK_WaitOldestDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_WaitOldest"), typeof (OvlK_WaitOldestDelegate)); + OvlK_WaitOrCancel = (OvlK_WaitOrCancelDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_WaitOrCancel"), typeof (OvlK_WaitOrCancelDelegate)); + OvlK_WaitAndRelease = (OvlK_WaitAndReleaseDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_WaitAndRelease"), typeof (OvlK_WaitAndReleaseDelegate)); + OvlK_IsComplete = (OvlK_IsCompleteDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_IsComplete"), typeof (OvlK_IsCompleteDelegate)); + OvlK_ReUse = (OvlK_ReUseDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_ReUse"), typeof (OvlK_ReUseDelegate)); + StmK_Init = (StmK_InitDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Init"), typeof (StmK_InitDelegate)); + StmK_Free = (StmK_FreeDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Free"), typeof (StmK_FreeDelegate)); + StmK_Start = (StmK_StartDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Start"), typeof (StmK_StartDelegate)); + StmK_Stop = (StmK_StopDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Stop"), typeof (StmK_StopDelegate)); + StmK_Read = (StmK_ReadDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Read"), typeof (StmK_ReadDelegate)); + StmK_Write = (StmK_WriteDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Write"), typeof (StmK_WriteDelegate)); + IsoK_Init = (IsoK_InitDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_Init"), typeof (IsoK_InitDelegate)); + IsoK_Free = (IsoK_FreeDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_Free"), typeof (IsoK_FreeDelegate)); + IsoK_SetPackets = (IsoK_SetPacketsDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_SetPackets"), typeof (IsoK_SetPacketsDelegate)); + IsoK_SetPacket = (IsoK_SetPacketDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_SetPacket"), typeof (IsoK_SetPacketDelegate)); + IsoK_GetPacket = (IsoK_GetPacketDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_GetPacket"), typeof (IsoK_GetPacketDelegate)); + IsoK_EnumPackets = (IsoK_EnumPacketsDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_EnumPackets"), typeof (IsoK_EnumPacketsDelegate)); + IsoK_ReUse = (IsoK_ReUseDelegate) Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_ReUse"), typeof (IsoK_ReUseDelegate)); + } + + [DllImport("kernel32.dll")] + private static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hReservedNull, LoadLibraryFlags dwFlags); + + private static readonly IntPtr mModuleLibusbK = IntPtr.Zero; + + #endregion + } + + #endregion + + #region Enumerations + + /// Values used in the \c bmAttributes field of a \ref USB_ENDPOINT_DESCRIPTOR + public enum USBD_PIPE_TYPE + { + /// Indicates a control endpoint + UsbdPipeTypeControl, + + /// Indicates an isochronous endpoint + UsbdPipeTypeIsochronous, + + /// Indicates a bulk endpoint + UsbdPipeTypeBulk, + + /// Indicates an interrupt endpoint + UsbdPipeTypeInterrupt, + } + + /// Additional ISO transfer flags. + [Flags] + public enum KISO_FLAG + { + NONE = 0, + + /// Do not start the transfer immediately, instead use \ref KISO_CONTEXT::StartFrame. + SET_START_FRAME = 0x00000001, + } + + /// Handle type enumeration. + public enum KLIB_HANDLE_TYPE + { + /// Hot plug handle. \ref KHOT_HANDLE + HOTK, + + /// USB handle. \ref KUSB_HANDLE + USBK, + + /// Shared USB handle. \ref KUSB_HANDLE + USBSHAREDK, + + /// Device list handle. \ref KLST_HANDLE + LSTK, + + /// Device info handle. \ref KLST_DEVINFO_HANDLE + LSTINFOK, + + /// Overlapped handle. \ref KOVL_HANDLE + OVLK, + + /// Overlapped pool handle. \ref KOVL_POOL_HANDLE + OVLPOOLK, + + /// Pipe stream handle. \ref KSTM_HANDLE + STMK, + + /// Max handle type count. + COUNT + } + + /// Device list sync flags. + [Flags] + public enum KLST_SYNC_FLAG + { + /// Cleared/invalid state. + NONE = 0, + + /// Unchanged state, + UNCHANGED = 0x0001, + + /// Added (Arrival) state, + ADDED = 0x0002, + + /// Removed (Unplugged) state, + REMOVED = 0x0004, + + /// Connect changed state. + CONNECT_CHANGE = 0x0008, + + /// All states. + MASK = 0x000F, + } + + /// Device list initialization flags. + [Flags] + public enum KLST_FLAG + { + /// No flags (or 0) + NONE = 0, + + /// Enable listings for the raw device interface GUID \b only. {A5DCBF10-6530-11D2-901F-00C04FB951ED} + INCLUDE_RAWGUID = 0x0001, + + /// List all libusbK devices including those not currently connected. + INCLUDE_DISCONNECT = 0x0002, + } + + /// bmRequest.Dir + public enum BMREQUEST_DIR + { + HOST_TO_DEVICE = 0, + DEVICE_TO_HOST = 1, + } + + /// bmRequest.Type + public enum BMREQUEST_TYPE + { + /// Standard request. See \ref USB_REQUEST_ENUM + STANDARD = 0, + + /// Class-specific request. + CLASS = 1, + + /// Vendor-specific request + VENDOR = 2, + } + + /// bmRequest.Recipient + public enum BMREQUEST_RECIPIENT + { + /// Request is for a device. + DEVICE = 0, + + /// Request is for an interface of a device. + INTERFACE = 1, + + /// Request is for an endpoint of a device. + ENDPOINT = 2, + + /// Request is for a vendor-specific purpose. + OTHER = 3, + } + + /// Values for the bits returned by the \ref USB_REQUEST_GET_STATUS request. + public enum USB_GETSTATUS + { + /// Device is self powered + SELF_POWERED = 0x01, + + /// Device can wake the system from a low power/sleeping state. + REMOTE_WAKEUP_ENABLED = 0x02 + } + + /// Standard USB descriptor types. For more information, see section 9-5 of the USB 3.0 specifications. + public enum USB_DESCRIPTOR_TYPE + { + /// Device descriptor type. + DEVICE = 0x01, + + /// Configuration descriptor type. + CONFIGURATION = 0x02, + + /// String descriptor type. + STRING = 0x03, + + /// Interface descriptor type. + INTERFACE = 0x04, + + /// Endpoint descriptor type. + ENDPOINT = 0x05, + + /// Device qualifier descriptor type. + DEVICE_QUALIFIER = 0x06, + + /// Config power descriptor type. + CONFIG_POWER = 0x07, + + /// Interface power descriptor type. + INTERFACE_POWER = 0x08, + + /// Interface association descriptor type. + INTERFACE_ASSOCIATION = 0x0B, + } + + /// Usb handle specific properties that can be retrieved with \ref UsbK_GetProperty. + public enum KUSB_PROPERTY + { + /// Get the internal device file handle used for operations such as GetOverlappedResult or DeviceIoControl. + DEVICE_FILE_HANDLE, + + COUNT + } + + /// Supported driver id enumeration. + public enum KUSB_DRVID + { + /// libusbK.sys driver ID + LIBUSBK, + + /// libusb0.sys driver ID + LIBUSB0, + + /// WinUSB.sys driver ID + WINUSB, + + /// libusb0.sys filter driver ID + LIBUSB0_FILTER, + + /// Supported driver count + COUNT + } + + /// Supported function id enumeration. + public enum KUSB_FNID + { + /// \ref UsbK_Init dynamic driver function id. + Init, + + /// \ref UsbK_Free dynamic driver function id. + Free, + + /// \ref UsbK_ClaimInterface dynamic driver function id. + ClaimInterface, + + /// \ref UsbK_ReleaseInterface dynamic driver function id. + ReleaseInterface, + + /// \ref UsbK_SetAltInterface dynamic driver function id. + SetAltInterface, + + /// \ref UsbK_GetAltInterface dynamic driver function id. + GetAltInterface, + + /// \ref UsbK_GetDescriptor dynamic driver function id. + GetDescriptor, + + /// \ref UsbK_ControlTransfer dynamic driver function id. + ControlTransfer, + + /// \ref UsbK_SetPowerPolicy dynamic driver function id. + SetPowerPolicy, + + /// \ref UsbK_GetPowerPolicy dynamic driver function id. + GetPowerPolicy, + + /// \ref UsbK_SetConfiguration dynamic driver function id. + SetConfiguration, + + /// \ref UsbK_GetConfiguration dynamic driver function id. + GetConfiguration, + + /// \ref UsbK_ResetDevice dynamic driver function id. + ResetDevice, + + /// \ref UsbK_Initialize dynamic driver function id. + Initialize, + + /// \ref UsbK_SelectInterface dynamic driver function id. + SelectInterface, + + /// \ref UsbK_GetAssociatedInterface dynamic driver function id. + GetAssociatedInterface, + + /// \ref UsbK_Clone dynamic driver function id. + Clone, + + /// \ref UsbK_QueryInterfaceSettings dynamic driver function id. + QueryInterfaceSettings, + + /// \ref UsbK_QueryDeviceInformation dynamic driver function id. + QueryDeviceInformation, + + /// \ref UsbK_SetCurrentAlternateSetting dynamic driver function id. + SetCurrentAlternateSetting, + + /// \ref UsbK_GetCurrentAlternateSetting dynamic driver function id. + GetCurrentAlternateSetting, + + /// \ref UsbK_QueryPipe dynamic driver function id. + QueryPipe, + + /// \ref UsbK_SetPipePolicy dynamic driver function id. + SetPipePolicy, + + /// \ref UsbK_GetPipePolicy dynamic driver function id. + GetPipePolicy, + + /// \ref UsbK_ReadPipe dynamic driver function id. + ReadPipe, + + /// \ref UsbK_WritePipe dynamic driver function id. + WritePipe, + + /// \ref UsbK_ResetPipe dynamic driver function id. + ResetPipe, + + /// \ref UsbK_AbortPipe dynamic driver function id. + AbortPipe, + + /// \ref UsbK_FlushPipe dynamic driver function id. + FlushPipe, + + /// \ref UsbK_IsoReadPipe dynamic driver function id. + IsoReadPipe, + + /// \ref UsbK_IsoWritePipe dynamic driver function id. + IsoWritePipe, + + /// \ref UsbK_GetCurrentFrameNumber dynamic driver function id. + GetCurrentFrameNumber, + + /// \ref UsbK_GetOverlappedResult dynamic driver function id. + GetOverlappedResult, + + /// \ref UsbK_GetProperty dynamic driver function id. + GetProperty, + + + /// Supported function count + COUNT, + } + + /// Hot plug config flags. + [Flags] + public enum KHOT_FLAG + { + /// No flags (or 0) + NONE, + + /// Notify all devices which match upon a succuessful call to \ref HotK_Init. + PLUG_ALL_ON_INIT = 0x0001, + + /// Allow other \ref KHOT_HANDLE instances to consume this match. + PASS_DUPE_INSTANCE = 0x0002, + + /// If a \c UserHwnd is specified, use \c PostMessage instead of \c SendMessage. + POST_USER_MESSAGE = 0x0004, + } + + /// \c WaitFlags used by \ref OvlK_Wait. + [Flags] + public enum KOVL_WAIT_FLAG + { + /// Do not perform any additional actions upon exiting \ref OvlK_Wait. + NONE = 0, + + /// If the i/o operation completes successfully, release the OverlappedK back to it's pool. + RELEASE_ON_SUCCESS = 0x0001, + + /// If the i/o operation fails, release the OverlappedK back to it's pool. + RELEASE_ON_FAIL = 0x0002, + + /// If the i/o operation fails or completes successfully, release the OverlappedK back to its pool. Perform no actions if it times-out. + RELEASE_ON_SUCCESS_FAIL = 0x0003, + + /// If the i/o operation times-out cancel it, but do not release the OverlappedK back to its pool. + CANCEL_ON_TIMEOUT = 0x0004, + + /// If the i/o operation times-out, cancel it and release the OverlappedK back to its pool. + RELEASE_ON_TIMEOUT = 0x000C, + + /// Always release the OverlappedK back to its pool. If the operation timed-out, cancel it before releasing back to its pool. + RELEASE_ALWAYS = 0x000F, + + /// Uses alterable wait functions. See http://msdn.microsoft.com/en-us/library/windows/desktop/ms687036%28v=vs.85%29.aspx + ALERTABLE = 0x0010, + } + + /// \c Overlapped pool config flags. + [Flags] + public enum KOVL_POOL_FLAG + { + NONE = 0, + } + + /// Stream config flags. + [Flags] + public enum KSTM_FLAG : uint + { + /// None + NONE = 0, + NO_PARTIAL_XFERS = 0x00100000, + USE_TIMEOUT = 0x80000000, + TIMEOUT_MASK = 0x0001FFFF + } + + /// Stream config flags. + public enum KSTM_COMPLETE_RESULT + { + /// Valid + VALID = 0, + + /// Invalid + INVALID, + } + + #endregion + + #region Structs + + /// The \c WINUSB_PIPE_INFORMATION structure contains pipe information that the \ref UsbK_QueryPipe routine retrieves. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + public struct WINUSB_PIPE_INFORMATION + { + /// A \c USBD_PIPE_TYPE enumeration value that specifies the pipe type + public USBD_PIPE_TYPE PipeType; + + /// The pipe identifier (ID) + public byte PipeId; + + /// The maximum size, in bytes, of the packets that are transmitted on the pipe + public ushort MaximumPacketSize; + + /// The pipe interval + public byte Interval; + + + public override string ToString() + { + return string.Format("PipeType: {0}\nPipeId: {1}\nMaximumPacketSize: {2}\nInterval: {3}\n", PipeType, PipeId.ToString("X2") + "h", MaximumPacketSize, Interval.ToString("X2") + "h"); + } + }; + + /// The \c WINUSB_SETUP_PACKET structure describes a USB setup packet. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct WINUSB_SETUP_PACKET + { + /// The request type. The values that are assigned to this member are defined in Table 9.2 of section 9.3 of the Universal Serial Bus (USB) specification (www.usb.org). + public byte RequestType; + + /// The device request. The values that are assigned to this member are defined in Table 9.3 of section 9.4 of the Universal Serial Bus (USB) specification. + public byte Request; + + /// The meaning of this member varies according to the request. For an explanation of this member, see the Universal Serial Bus (USB) specification. + public ushort Value; + + /// The meaning of this member varies according to the request. For an explanation of this member, see the Universal Serial Bus (USB) specification. + public ushort Index; + + /// The number of bytes to transfer. (not including the \c WINUSB_SETUP_PACKET itself) + public ushort Length; + + + public override string ToString() + { + return string.Format("RequestType: {0}\nRequest: {1}\nValue: {2}\nIndex: {3}\nLength: {4}\n", + RequestType.ToString("X2") + "h", + Request.ToString("X2") + "h", + Value.ToString("X4") + "h", + Index.ToString("X4") + "h", + Length); + } + }; + + /// Structure describing an isochronous transfer packet. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct KISO_PACKET + { + /// Specifies the offset, in bytes, of the buffer for this packet from the beginning of the entire isochronous transfer data buffer. + public int Offset; + + /// Set by the host controller to indicate the actual number of bytes received by the device for isochronous IN transfers. Length not used for isochronous OUT transfers. + public ushort Length; + + /// Contains the 16 least significant USBD status bits, on return from the host controller driver, of this transfer packet. + public ushort Status; + + + public override string ToString() + { + return string.Format("Offset: {0}\nLength: {1}\nStatus: {2}\n", Offset, Length, Status.ToString("X4") + "h"); + } + }; + + [StructLayout(LayoutKind.Sequential)] + public struct KISO_CONTEXT + { + private readonly IntPtr mHandlePtr; + + public KISO_CONTEXT(IntPtr Handle) + { + mHandlePtr = Handle; + } + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + /// KISO_CONTEXT_MAP is used for calculating field offsets only + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + private struct KISO_CONTEXT_MAP + { + /// Additional ISO transfer flags. See \ref KISO_FLAG. + private readonly KISO_FLAG Flags; + + /// Specifies the frame number that the transfer should begin on (0 for ASAP). + private readonly int StartFrame; + + /// Contains the number of packets that completed with an error condition on return from the host controller driver. + private readonly short ErrorCount; + + /// Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + private readonly short NumberOfPackets; + + /// Contains the URB Hdr.Status value on return from the host controller driver. + private readonly int UrbHdrStatus; + }; + + private static readonly int ofsFlags = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "Flags").ToInt32(); + private static readonly int ofsStartFrame = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "StartFrame").ToInt32(); + private static readonly int ofsErrorCount = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "ErrorCount").ToInt32(); + private static readonly int ofsNumberOfPackets = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "NumberOfPackets").ToInt32(); + private static readonly int ofsUrbHdrStatus = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "UrbHdrStatus").ToInt32(); + + + /// Additional ISO transfer flags. See \ref KISO_FLAG. + public KISO_FLAG Flags + { + get + { + return (KISO_FLAG) Marshal.ReadInt32(mHandlePtr, ofsFlags); + } + } + + + /// Specifies the frame number that the transfer should begin on (0 for ASAP). + public int StartFrame + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsStartFrame); + } + } + + + /// Contains the number of packets that completed with an error condition on return from the host controller driver. + public short ErrorCount + { + get + { + return Marshal.ReadInt16(mHandlePtr, ofsErrorCount); + } + } + + + /// Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + public short NumberOfPackets + { + get + { + return Marshal.ReadInt16(mHandlePtr, ofsNumberOfPackets); + } + } + + + /// Contains the URB Hdr.Status value on return from the host controller driver. + public int UrbHdrStatus + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsUrbHdrStatus); + } + } + + + public override string ToString() + { + return string.Format("Flags: {0}\nStartFrame: {1}\nErrorCount: {2}\nNumberOfPackets: {3}\nUrbHdrStatus: {4}\n", + Flags.ToString(), + StartFrame, + ErrorCount, + NumberOfPackets, + UrbHdrStatus.ToString("X8") + "h"); + } + } + + /// libusbK verson information structure. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + public struct KLIB_VERSION + { + /// Major version number. + public int Major; + + /// Minor version number. + public int Minor; + + /// Micro version number. + public int Micro; + + /// Nano version number. + public int Nano; + + public override string ToString() + { + return string.Format("Major: {0}\nMinor: {1}\nMicro: {2}\nNano: {3}\n", Major, Minor, Micro, Nano); + } + }; + + /// Common usb device information structure + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + public struct KLST_DEV_COMMON_INFO + { + /// VendorID parsed from \ref KLST_DEVINFO::DeviceID + public int Vid; + + /// ProductID parsed from \ref KLST_DEVINFO::DeviceID + public int Pid; + + /// Composite interface number parsed from \ref KLST_DEVINFO::DeviceID. Set to \b -1 for devices that do not have the composite parent driver. + public int MI; + + // An ID that uniquely identifies a USB device. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] public string InstanceID; + + + public override string ToString() + { + return string.Format("Vid: {0}\nPid: {1}\nMI: {2}\nInstanceID: {3}\n", Vid.ToString("X4") + "h", Pid.ToString("X4") + "h", MI.ToString("X2") + "h", InstanceID); + } + }; + + [StructLayout(LayoutKind.Sequential)] + public struct KLST_DEVINFO_HANDLE : IKLIB_HANDLE + { + private readonly IntPtr mHandlePtr; + + public KLST_DEVINFO_HANDLE(IntPtr Handle) + { + mHandlePtr = Handle; + } + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + public KLIB_HANDLE_TYPE HandleType + { + get + { + return KLIB_HANDLE_TYPE.LSTINFOK; + } + } + + public IntPtr GetContext() + { + return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType); + } + + public bool SetContext(IntPtr UserContext) + { + return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext); + } + + public bool SetCleanupCallback(KLIB_HANDLE_CLEANUP_CB CleanupCallback) + { + return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback); + } + + /// KLST_DEVINFO_MAP is used for calculating field offsets only + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + private struct KLST_DEVINFO_MAP + { + /// Common usb device information + private readonly KLST_DEV_COMMON_INFO Common; + + /// Driver id this device element is using + private readonly int DriverID; + + /// Device interface GUID + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string DeviceInterfaceGUID; + + /// Device instance ID. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string DeviceID; + + /// Class GUID. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string ClassGUID; + + /// Manufacturer name as specified in the INF file. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string Mfg; + + /// Device description as specified in the INF file. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string DeviceDesc; + + /// Driver service name. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string Service; + + /// Unique identifier. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string SymbolicLink; + + /// physical device filename used with the Windows \c CreateFile() + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string DevicePath; + + /// libusb-win32 filter index id. + private readonly int LUsb0FilterIndex; + + /// Indicates the devices connection state. + private readonly bool Connected; + + /// Synchronization flags. (internal use only) + private readonly KLST_SYNC_FLAG SyncFlags; + + private readonly int BusNumber; + + private readonly int DeviceAddress; + + /// If the the device is serialized, represents the string value of \ref USB_DEVICE_DESCRIPTOR::iSerialNumber. For Devices without a \b iSerialNumber, represents the unique \b InstanceID assigned by \b Windows. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] private readonly string SerialNumber; + }; + + private static readonly int ofsCommon = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "Common").ToInt32(); + private static readonly int ofsDriverID = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "DriverID").ToInt32(); + private static readonly int ofsDeviceInterfaceGUID = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "DeviceInterfaceGUID").ToInt32(); + private static readonly int ofsDeviceID = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "DeviceID").ToInt32(); + private static readonly int ofsClassGUID = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "ClassGUID").ToInt32(); + private static readonly int ofsMfg = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "Mfg").ToInt32(); + private static readonly int ofsDeviceDesc = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "DeviceDesc").ToInt32(); + private static readonly int ofsService = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "Service").ToInt32(); + private static readonly int ofsSymbolicLink = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "SymbolicLink").ToInt32(); + private static readonly int ofsDevicePath = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "DevicePath").ToInt32(); + private static readonly int ofsLUsb0FilterIndex = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "LUsb0FilterIndex").ToInt32(); + private static readonly int ofsConnected = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "Connected").ToInt32(); + private static readonly int ofsSyncFlags = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "SyncFlags").ToInt32(); + private static readonly int ofsBusNumber = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "BusNumber").ToInt32(); + private static readonly int ofsDeviceAddress = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "DeviceAddress").ToInt32(); + private static readonly int ofsSerialNumber = Marshal.OffsetOf(typeof (KLST_DEVINFO_MAP), "SerialNumber").ToInt32(); + + + /// Common usb device information + public KLST_DEV_COMMON_INFO Common + { + get + { + return (KLST_DEV_COMMON_INFO) Marshal.PtrToStructure(new IntPtr(mHandlePtr.ToInt64() + ofsCommon), typeof (KLST_DEV_COMMON_INFO)); + } + } + + + /// Driver id this device element is using + public int DriverID + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsDriverID); + } + } + + + /// Device interface GUID + public string DeviceInterfaceGUID + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsDeviceInterfaceGUID)); + } + } + + + /// Device instance ID. + public string DeviceID + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsDeviceID)); + } + } + + + /// Class GUID. + public string ClassGUID + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsClassGUID)); + } + } + + + /// Manufacturer name as specified in the INF file. + public string Mfg + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsMfg)); + } + } + + + /// Device description as specified in the INF file. + public string DeviceDesc + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsDeviceDesc)); + } + } + + + /// Driver service name. + public string Service + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsService)); + } + } + + + /// Unique identifier. + public string SymbolicLink + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsSymbolicLink)); + } + } + + + /// physical device filename used with the Windows \c CreateFile() + public string DevicePath + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsDevicePath)); + } + } + + + /// libusb-win32 filter index id. + public int LUsb0FilterIndex + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsLUsb0FilterIndex); + } + } + + + /// Indicates the devices connection state. + public bool Connected + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsConnected) != 0; + } + } + + + /// Synchronization flags. (internal use only) + public KLST_SYNC_FLAG SyncFlags + { + get + { + return (KLST_SYNC_FLAG) Marshal.ReadInt32(mHandlePtr, ofsSyncFlags); + } + } + + + public int BusNumber + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsBusNumber); + } + } + + + public int DeviceAddress + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsDeviceAddress); + } + } + + + /// If the the device is serialized, represents the string value of \ref USB_DEVICE_DESCRIPTOR::iSerialNumber. For Devices without a \b iSerialNumber, represents the unique \b InstanceID assigned by \b Windows. + public string SerialNumber + { + get + { + return Marshal.PtrToStringAnsi(new IntPtr(mHandlePtr.ToInt64() + ofsSerialNumber)); + } + } + + + public override string ToString() + { + return + string.Format( + "DriverID: {0}\nDeviceInterfaceGUID: {1}\nDeviceID: {2}\nClassGUID: {3}\nMfg: {4}\nDeviceDesc: {5}\nService: {6}\nSymbolicLink: {7}\nDevicePath: {8}\nLUsb0FilterIndex: {9}\nConnected: {10}\nSyncFlags: {11}\nBusNumber: {12}\nDeviceAddress: {13}\nSerialNumber: {14}\n", + DriverID, + DeviceInterfaceGUID, + DeviceID, + ClassGUID, + Mfg, + DeviceDesc, + Service, + SymbolicLink, + DevicePath, + LUsb0FilterIndex, + Connected, + SyncFlags.ToString(), + BusNumber, + DeviceAddress, + SerialNumber); + } + } + + /// Device list/hot-plug pattern match structure. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Size = 1024)] + public struct KLST_PATTERN_MATCH + { + /// Pattern match a device instance id. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] public string DeviceID; + + /// Pattern match a device interface guid. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] public string DeviceInterfaceGUID; + + /// Pattern match a symbolic link. + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] public string ClassGUID; + + + public override string ToString() + { + return string.Format("DeviceID: {0}\nDeviceInterfaceGUID: {1}\nClassGUID: {2}\n", DeviceID, DeviceInterfaceGUID, ClassGUID); + } + }; + + /// A structure representing the standard USB device descriptor. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct USB_DEVICE_DESCRIPTOR + { + /// Size of this descriptor (in bytes) + public byte bLength; + + /// Descriptor type + public byte bDescriptorType; + + /// USB specification release number in binary-coded decimal. + public ushort bcdUSB; + + /// USB-IF class code for the device + public byte bDeviceClass; + + /// USB-IF subclass code for the device + public byte bDeviceSubClass; + + /// USB-IF protocol code for the device + public byte bDeviceProtocol; + + /// Maximum packet size for control endpoint 0 + public byte bMaxPacketSize0; + + /// USB-IF vendor ID + public ushort idVendor; + + /// USB-IF product ID + public ushort idProduct; + + /// Device release number in binary-coded decimal + public ushort bcdDevice; + + /// Index of string descriptor describing manufacturer + public byte iManufacturer; + + /// Index of string descriptor describing product + public byte iProduct; + + /// Index of string descriptor containing device serial number + public byte iSerialNumber; + + /// Number of possible configurations + public byte bNumConfigurations; + + + public override string ToString() + { + return + string.Format( + "bLength: {0}\nbDescriptorType: {1}\nbcdUSB: {2}\nbDeviceClass: {3}\nbDeviceSubClass: {4}\nbDeviceProtocol: {5}\nbMaxPacketSize0: {6}\nidVendor: {7}\nidProduct: {8}\nbcdDevice: {9}\niManufacturer: {10}\niProduct: {11}\niSerialNumber: {12}\nbNumConfigurations: {13}\n", + bLength, + bDescriptorType.ToString("X2") + "h", + bcdUSB.ToString("X4") + "h", + bDeviceClass.ToString("X2") + "h", + bDeviceSubClass.ToString("X2") + "h", + bDeviceProtocol.ToString("X2") + "h", + bMaxPacketSize0, + idVendor.ToString("X4") + "h", + idProduct.ToString("X4") + "h", + bcdDevice.ToString("X4") + "h", + iManufacturer, + iProduct, + iSerialNumber, + bNumConfigurations); + } + }; + + /// A structure representing the standard USB endpoint descriptor. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct USB_ENDPOINT_DESCRIPTOR + { + /// Size of this descriptor (in bytes) + public byte bLength; + + /// Descriptor type + public byte bDescriptorType; + + /// The address of the endpoint described by this descriptor. + public byte bEndpointAddress; + + /// Attributes which apply to the endpoint when it is configured using the bConfigurationValue. + public byte bmAttributes; + + /// Maximum packet size this endpoint is capable of sending/receiving. + public ushort wMaxPacketSize; + + /// Interval for polling endpoint for data transfers. + public byte bInterval; + + + public override string ToString() + { + return string.Format("bLength: {0}\nbDescriptorType: {1}\nbEndpointAddress: {2}\nbmAttributes: {3}\nwMaxPacketSize: {4}\nbInterval: {5}\n", + bLength, + bDescriptorType.ToString("X2") + "h", + bEndpointAddress.ToString("X2") + "h", + bmAttributes.ToString("X2") + "h", + wMaxPacketSize, + bInterval); + } + }; + + /// A structure representing the standard USB configuration descriptor. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct USB_CONFIGURATION_DESCRIPTOR + { + /// Size of this descriptor (in bytes) + public byte bLength; + + /// Descriptor type + public byte bDescriptorType; + + /// Total length of data returned for this configuration + public ushort wTotalLength; + + /// Number of interfaces supported by this configuration + public byte bNumInterfaces; + + /// Identifier value for this configuration + public byte bConfigurationValue; + + /// Index of string descriptor describing this configuration + public byte iConfiguration; + + /// Configuration characteristics + public byte bmAttributes; + + /// Maximum power consumption of the USB device from this bus in this configuration when the device is fully operation. + public byte MaxPower; + + public override string ToString() + { + return string.Format("bLength: {0}\nbDescriptorType: {1}\nwTotalLength: {2}\nbNumInterfaces: {3}\nbConfigurationValue: {4}\niConfiguration: {5}\nbmAttributes: {6}\nMaxPower: {7}\n", + bLength, + bDescriptorType.ToString("X2") + "h", + wTotalLength, + bNumInterfaces, + bConfigurationValue, + iConfiguration, + bmAttributes.ToString("X2") + "h", + MaxPower); + } + }; + + /// A structure representing the standard USB interface descriptor. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct USB_INTERFACE_DESCRIPTOR + { + /// Size of this descriptor (in bytes) + public byte bLength; + + /// Descriptor type + public byte bDescriptorType; + + /// Number of this interface + public byte bInterfaceNumber; + + /// Value used to select this alternate setting for this interface + public byte bAlternateSetting; + + /// Number of endpoints used by this interface (excluding the control endpoint) + public byte bNumEndpoints; + + /// USB-IF class code for this interface + public byte bInterfaceClass; + + /// USB-IF subclass code for this interface + public byte bInterfaceSubClass; + + /// USB-IF protocol code for this interface + public byte bInterfaceProtocol; + + /// Index of string descriptor describing this interface + public byte iInterface; + + + public override string ToString() + { + return + string.Format( + "bLength: {0}\nbDescriptorType: {1}\nbInterfaceNumber: {2}\nbAlternateSetting: {3}\nbNumEndpoints: {4}\nbInterfaceClass: {5}\nbInterfaceSubClass: {6}\nbInterfaceProtocol: {7}\niInterface: {8}\n", + bLength, + bDescriptorType.ToString("X2") + "h", + bInterfaceNumber, + bAlternateSetting, + bNumEndpoints, + bInterfaceClass.ToString("X2") + "h", + bInterfaceSubClass.ToString("X2") + "h", + bInterfaceProtocol.ToString("X2") + "h", + iInterface); + } + }; + + /// A structure representing the standard USB string descriptor. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)] + public struct USB_STRING_DESCRIPTOR + { + /// Size of this descriptor (in bytes) + public byte bLength; + + /// Descriptor type + public byte bDescriptorType; + + /// Content of the string + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = AllKConstants.KLST_STRING_MAX_LEN)] public string bString; + + + public override string ToString() + { + return string.Format("bLength: {0}\nbDescriptorType: {1}\nbString: {2}\n", bLength, bDescriptorType.ToString("X2") + "h", bString); + } + }; + + /// A structure representing the common USB descriptor. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct USB_COMMON_DESCRIPTOR + { + /// Size of this descriptor (in bytes) + public byte bLength; + + /// Descriptor type + public byte bDescriptorType; + + + public override string ToString() + { + return string.Format("bLength: {0}\nbDescriptorType: {1}\n", bLength, bDescriptorType.ToString("X2") + "h"); + } + }; + + /// Allows hardware manufacturers to define groupings of interfaces. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + public struct USB_INTERFACE_ASSOCIATION_DESCRIPTOR + { + /// Size of this descriptor (in bytes) + public byte bLength; + + /// Descriptor type + public byte bDescriptorType; + + /// First interface number of the set of interfaces that follow this descriptor + public byte bFirstInterface; + + /// The Number of interfaces follow this descriptor that are considered "associated" + public byte bInterfaceCount; + + /// \c bInterfaceClass used for this associated interfaces + public byte bFunctionClass; + + /// \c bInterfaceSubClass used for the associated interfaces + public byte bFunctionSubClass; + + /// \c bInterfaceProtocol used for the associated interfaces + public byte bFunctionProtocol; + + /// Index of string descriptor describing the associated interfaces + public byte iFunction; + + + public override string ToString() + { + return string.Format("bLength: {0}\nbDescriptorType: {1}\nbFirstInterface: {2}\nbInterfaceCount: {3}\nbFunctionClass: {4}\nbFunctionSubClass: {5}\nbFunctionProtocol: {6}\niFunction: {7}\n", + bLength, + bDescriptorType.ToString("X2") + "h", + bFirstInterface, + bInterfaceCount, + bFunctionClass.ToString("X2") + "h", + bFunctionSubClass.ToString("X2") + "h", + bFunctionProtocol.ToString("X2") + "h", + iFunction); + } + }; + + /// USB core driver API information structure. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + public struct KUSB_DRIVER_API_INFO + { + /// \readonly Driver id of the driver api. + public int DriverID; + + /// \readonly Number of valid functions contained in the driver API. + public int FunctionCount; + + + public override string ToString() + { + return string.Format("DriverID: {0}\nFunctionCount: {1}\n", DriverID, FunctionCount); + } + }; + + /// Driver API function set structure. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Size = 512)] + public struct KUSB_DRIVER_API + { + /// Driver API information. + public KUSB_DRIVER_API_INFO Info; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_InitDelegate Init; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_FreeDelegate Free; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_ClaimInterfaceDelegate ClaimInterface; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_ReleaseInterfaceDelegate ReleaseInterface; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_SetAltInterfaceDelegate SetAltInterface; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetAltInterfaceDelegate GetAltInterface; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetDescriptorDelegate GetDescriptor; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_ControlTransferDelegate ControlTransfer; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_SetPowerPolicyDelegate SetPowerPolicy; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetPowerPolicyDelegate GetPowerPolicy; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_SetConfigurationDelegate SetConfiguration; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetConfigurationDelegate GetConfiguration; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_ResetDeviceDelegate ResetDevice; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_InitializeDelegate Initialize; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_SelectInterfaceDelegate SelectInterface; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetAssociatedInterfaceDelegate GetAssociatedInterface; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_CloneDelegate Clone; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_QueryInterfaceSettingsDelegate QueryInterfaceSettings; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_QueryDeviceInformationDelegate QueryDeviceInformation; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_SetCurrentAlternateSettingDelegate SetCurrentAlternateSetting; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetCurrentAlternateSettingDelegate GetCurrentAlternateSetting; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_QueryPipeDelegate QueryPipe; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_SetPipePolicyDelegate SetPipePolicy; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetPipePolicyDelegate GetPipePolicy; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_ReadPipeDelegate ReadPipe; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_WritePipeDelegate WritePipe; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_ResetPipeDelegate ResetPipe; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_AbortPipeDelegate AbortPipe; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_FlushPipeDelegate FlushPipe; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_IsoReadPipeDelegate IsoReadPipe; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_IsoWritePipeDelegate IsoWritePipe; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetCurrentFrameNumberDelegate GetCurrentFrameNumber; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetOverlappedResultDelegate GetOverlappedResult; + + + [MarshalAs(UnmanagedType.FunctionPtr)] public KUSB_GetPropertyDelegate GetProperty; + }; + + /// Hot plug parameter structure. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Size = 2048)] + public struct KHOT_PARAMS + { + /// Hot plug event window handle to send/post messages when notifications occur. + public IntPtr UserHwnd; + + /// WM_USER message start offset used when sending/posting messages, See details. + public int UserMessage; + + /// Additional init/config parameters + public KHOT_FLAG Flags; + + /// File pattern matches for restricting notifcations to a single/group or all supported usb devices. + public KLST_PATTERN_MATCH PatternMatch; + + /// Hot plug event callback function invoked when notifications occur. + [MarshalAs(UnmanagedType.FunctionPtr)] public KHOT_PLUG_CB OnHotPlug; + + + public override string ToString() + { + return string.Format("UserHwnd: {0}\nUserMessage: {1}\nFlags: {2}\n", UserHwnd.ToString("X16") + "h", UserMessage.ToString("X8") + "h", Flags.ToString()); + } + }; + + [StructLayout(LayoutKind.Sequential)] + public struct KSTM_XFER_CONTEXT + { + private readonly IntPtr mHandlePtr; + + public KSTM_XFER_CONTEXT(IntPtr Handle) + { + mHandlePtr = Handle; + } + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + /// KSTM_XFER_CONTEXT_MAP is used for calculating field offsets only + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + private struct KSTM_XFER_CONTEXT_MAP + { + /// Internal stream buffer. + private readonly IntPtr Buffer; + + /// Size of internal stream buffer. + private readonly int BufferSize; + + /// Number of bytes to write or number of bytes read. + private readonly int TransferLength; + + /// User defined state. + private readonly IntPtr UserState; + }; + + private static readonly int ofsBuffer = Marshal.OffsetOf(typeof (KSTM_XFER_CONTEXT_MAP), "Buffer").ToInt32(); + private static readonly int ofsBufferSize = Marshal.OffsetOf(typeof (KSTM_XFER_CONTEXT_MAP), "BufferSize").ToInt32(); + private static readonly int ofsTransferLength = Marshal.OffsetOf(typeof (KSTM_XFER_CONTEXT_MAP), "TransferLength").ToInt32(); + private static readonly int ofsUserState = Marshal.OffsetOf(typeof (KSTM_XFER_CONTEXT_MAP), "UserState").ToInt32(); + + + /// Internal stream buffer. + public IntPtr Buffer + { + get + { + return Marshal.ReadIntPtr(mHandlePtr, ofsBuffer); + } + } + + + /// Size of internal stream buffer. + public int BufferSize + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsBufferSize); + } + } + + + /// Number of bytes to write or number of bytes read. + public int TransferLength + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsTransferLength); + } + } + + + /// User defined state. + public IntPtr UserState + { + get + { + return Marshal.ReadIntPtr(mHandlePtr, ofsUserState); + } + set + { + Marshal.WriteIntPtr(mHandlePtr, ofsUserState, value); + } + } + + + public override string ToString() + { + return string.Format("Buffer: {0}\nBufferSize: {1}\nTransferLength: {2}\nUserState: {3}\n", Buffer.ToString("X16") + "h", BufferSize, TransferLength, UserState.ToString("X16") + "h"); + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct KSTM_INFO + { + private readonly IntPtr mHandlePtr; + + public KSTM_INFO(IntPtr Handle) + { + mHandlePtr = Handle; + } + + public IntPtr Pointer + { + get + { + return mHandlePtr; + } + } + + /// KSTM_INFO_MAP is used for calculating field offsets only + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + private struct KSTM_INFO_MAP + { + /// \ref KUSB_HANDLE this stream uses. + private readonly IntPtr UsbHandle; + + /// This parameter corresponds to the bEndpointAddress field in the endpoint descriptor. + private readonly byte PipeID; + + /// Maximum transfer read/write request allowed pending. + private readonly int MaxPendingTransfers; + + /// Maximum transfer sage size. + private readonly int MaxTransferSize; + + /// Maximum number of I/O request allowed pending. + private readonly int MaxPendingIO; + + /// Populated with the endpoint descriptor for the specified \c PipeID. + private readonly USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; + + /// Populated with the driver api for the specified \c UsbHandle. + private readonly KUSB_DRIVER_API DriverAPI; + + /// Populated with the device file handle for the specified \c UsbHandle. + private readonly IntPtr DeviceHandle; + + /// Stream handle. + private readonly IntPtr StreamHandle; + + /// Stream info user defined state. + private readonly IntPtr UserState; + }; + + private static readonly int ofsUsbHandle = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "UsbHandle").ToInt32(); + private static readonly int ofsPipeID = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "PipeID").ToInt32(); + private static readonly int ofsMaxPendingTransfers = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "MaxPendingTransfers").ToInt32(); + private static readonly int ofsMaxTransferSize = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "MaxTransferSize").ToInt32(); + private static readonly int ofsMaxPendingIO = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "MaxPendingIO").ToInt32(); + private static readonly int ofsEndpointDescriptor = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "EndpointDescriptor").ToInt32(); + private static readonly int ofsDriverAPI = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "DriverAPI").ToInt32(); + private static readonly int ofsDeviceHandle = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "DeviceHandle").ToInt32(); + private static readonly int ofsStreamHandle = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "StreamHandle").ToInt32(); + private static readonly int ofsUserState = Marshal.OffsetOf(typeof (KSTM_INFO_MAP), "UserState").ToInt32(); + + + /// \ref KUSB_HANDLE this stream uses. + public IntPtr UsbHandle + { + get + { + return Marshal.ReadIntPtr(mHandlePtr, ofsUsbHandle); + } + } + + + /// This parameter corresponds to the bEndpointAddress field in the endpoint descriptor. + public byte PipeID + { + get + { + return Marshal.ReadByte(mHandlePtr, ofsPipeID); + } + } + + + /// Maximum transfer read/write request allowed pending. + public int MaxPendingTransfers + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsMaxPendingTransfers); + } + } + + + /// Maximum transfer sage size. + public int MaxTransferSize + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsMaxTransferSize); + } + } + + + /// Maximum number of I/O request allowed pending. + public int MaxPendingIO + { + get + { + return Marshal.ReadInt32(mHandlePtr, ofsMaxPendingIO); + } + } + + + /// Populated with the endpoint descriptor for the specified \c PipeID. + public USB_ENDPOINT_DESCRIPTOR EndpointDescriptor + { + get + { + return (USB_ENDPOINT_DESCRIPTOR) Marshal.PtrToStructure(new IntPtr(mHandlePtr.ToInt64() + ofsEndpointDescriptor), typeof (USB_ENDPOINT_DESCRIPTOR)); + } + } + + + /// Populated with the driver api for the specified \c UsbHandle. + public KUSB_DRIVER_API DriverAPI + { + get + { + return (KUSB_DRIVER_API) Marshal.PtrToStructure(new IntPtr(mHandlePtr.ToInt64() + ofsDriverAPI), typeof (KUSB_DRIVER_API)); + } + } + + + /// Populated with the device file handle for the specified \c UsbHandle. + public IntPtr DeviceHandle + { + get + { + return Marshal.ReadIntPtr(mHandlePtr, ofsDeviceHandle); + } + } + + + /// Stream handle. + public IntPtr StreamHandle + { + get + { + return Marshal.ReadIntPtr(mHandlePtr, ofsStreamHandle); + } + } + + + /// Stream info user defined state. + public IntPtr UserState + { + get + { + return Marshal.ReadIntPtr(mHandlePtr, ofsUserState); + } + set + { + Marshal.WriteIntPtr(mHandlePtr, ofsUserState, value); + } + } + + + public override string ToString() + { + return string.Format("UsbHandle: {0}\nPipeID: {1}\nMaxPendingTransfers: {2}\nMaxTransferSize: {3}\nMaxPendingIO: {4}\nDeviceHandle: {5}\nStreamHandle: {6}\nUserState: {7}\n", + UsbHandle.ToString("X16") + "h", + PipeID.ToString("X2") + "h", + MaxPendingTransfers, + MaxTransferSize, + MaxPendingIO, + DeviceHandle.ToString("X16") + "h", + StreamHandle.ToString("X16") + "h", + UserState.ToString("X16") + "h"); + } + } + + /// Stream callback structure. + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Size = 64)] + public struct KSTM_CALLBACK + { + /// Executed when a transfer error occurs. + [MarshalAs(UnmanagedType.FunctionPtr)] public KSTM_ERROR_CB Error; + + /// Executed to submit a transfer. + [MarshalAs(UnmanagedType.FunctionPtr)] public KSTM_SUBMIT_CB Submit; + + /// Executed when a valid transfer completes. + [MarshalAs(UnmanagedType.FunctionPtr)] public KSTM_COMPLETE_CB Complete; + + /// Executed for every transfer context when the stream is started with \ref StmK_Start. + [MarshalAs(UnmanagedType.FunctionPtr)] public KSTM_STARTED_CB Started; + + /// Executed for every transfer context when the stream is stopped with \ref StmK_Stop. + [MarshalAs(UnmanagedType.FunctionPtr)] public KSTM_STOPPED_CB Stopped; + + /// Executed immediately after a transfer completes. + [MarshalAs(UnmanagedType.FunctionPtr)] public KSTM_BEFORE_COMPLETE_CB BeforeComplete; + }; + + #endregion + + #region Delegates + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate int KLIB_HANDLE_CLEANUP_CB([In] IntPtr Handle, KLIB_HANDLE_TYPE HandleType, IntPtr UserContext); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KISO_ENUM_PACKETS_CB(int PacketIndex, [In] ref KISO_PACKET IsoPacket, IntPtr UserState); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KLST_ENUM_DEVINFO_CB([In] KLST_HANDLE DeviceList, [In] KLST_DEVINFO_HANDLE DeviceInfo, IntPtr Context); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_InitDelegate([Out] out KUSB_HANDLE InterfaceHandle, [In] KLST_DEVINFO_HANDLE DevInfo); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_FreeDelegate([In] KUSB_HANDLE InterfaceHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_ClaimInterfaceDelegate([In] KUSB_HANDLE InterfaceHandle, byte NumberOrIndex, bool IsIndex); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_ReleaseInterfaceDelegate([In] KUSB_HANDLE InterfaceHandle, byte NumberOrIndex, bool IsIndex); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_SetAltInterfaceDelegate([In] KUSB_HANDLE InterfaceHandle, byte NumberOrIndex, bool IsIndex, byte AltSettingNumber); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetAltInterfaceDelegate([In] KUSB_HANDLE InterfaceHandle, byte NumberOrIndex, bool IsIndex, out byte AltSettingNumber); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetDescriptorDelegate([In] KUSB_HANDLE InterfaceHandle, byte DescriptorType, byte Index, ushort LanguageID, IntPtr Buffer, int BufferLength, out int LengthTransferred); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_ControlTransferDelegate([In] KUSB_HANDLE InterfaceHandle, WINUSB_SETUP_PACKET SetupPacket, IntPtr Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_SetPowerPolicyDelegate([In] KUSB_HANDLE InterfaceHandle, int PolicyType, int ValueLength, IntPtr Value); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetPowerPolicyDelegate([In] KUSB_HANDLE InterfaceHandle, int PolicyType, ref int ValueLength, IntPtr Value); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_SetConfigurationDelegate([In] KUSB_HANDLE InterfaceHandle, byte ConfigurationNumber); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetConfigurationDelegate([In] KUSB_HANDLE InterfaceHandle, out byte ConfigurationNumber); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_ResetDeviceDelegate([In] KUSB_HANDLE InterfaceHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_InitializeDelegate(IntPtr DeviceHandle, [Out] out KUSB_HANDLE InterfaceHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_SelectInterfaceDelegate([In] KUSB_HANDLE InterfaceHandle, byte NumberOrIndex, bool IsIndex); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetAssociatedInterfaceDelegate([In] KUSB_HANDLE InterfaceHandle, byte AssociatedInterfaceIndex, [Out] out KUSB_HANDLE AssociatedInterfaceHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_CloneDelegate([In] KUSB_HANDLE InterfaceHandle, [Out] out KUSB_HANDLE DstInterfaceHandle); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_QueryInterfaceSettingsDelegate([In] KUSB_HANDLE InterfaceHandle, byte AltSettingIndex, [Out] out USB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_QueryDeviceInformationDelegate([In] KUSB_HANDLE InterfaceHandle, int InformationType, ref int BufferLength, IntPtr Buffer); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_SetCurrentAlternateSettingDelegate([In] KUSB_HANDLE InterfaceHandle, byte AltSettingNumber); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetCurrentAlternateSettingDelegate([In] KUSB_HANDLE InterfaceHandle, out byte AltSettingNumber); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_QueryPipeDelegate([In] KUSB_HANDLE InterfaceHandle, byte AltSettingNumber, byte PipeIndex, [Out] out WINUSB_PIPE_INFORMATION PipeInformation); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_SetPipePolicyDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID, int PolicyType, int ValueLength, IntPtr Value); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetPipePolicyDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID, int PolicyType, ref int ValueLength, IntPtr Value); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_ReadPipeDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID, IntPtr Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_WritePipeDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID, IntPtr Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_ResetPipeDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_AbortPipeDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_FlushPipeDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_IsoReadPipeDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID, IntPtr Buffer, int BufferLength, IntPtr Overlapped, [In] KISO_CONTEXT IsoContext); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_IsoWritePipeDelegate([In] KUSB_HANDLE InterfaceHandle, byte PipeID, IntPtr Buffer, int BufferLength, IntPtr Overlapped, [In] KISO_CONTEXT IsoContext); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetCurrentFrameNumberDelegate([In] KUSB_HANDLE InterfaceHandle, out int FrameNumber); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetOverlappedResultDelegate([In] KUSB_HANDLE InterfaceHandle, IntPtr Overlapped, out int lpNumberOfBytesTransferred, bool bWait); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate bool KUSB_GetPropertyDelegate([In] KUSB_HANDLE InterfaceHandle, KUSB_PROPERTY PropertyType, ref int PropertySize, IntPtr Value); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate void KHOT_PLUG_CB([In] KHOT_HANDLE HotHandle, [In] KLST_DEVINFO_HANDLE DeviceInfo, KLST_SYNC_FLAG PlugType); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate int KSTM_ERROR_CB([In] KSTM_INFO StreamInfo, [In] KSTM_XFER_CONTEXT XferContext, int XferContextIndex, int ErrorCode); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate int KSTM_SUBMIT_CB([In] KSTM_INFO StreamInfo, [In] KSTM_XFER_CONTEXT XferContext, int XferContextIndex, IntPtr Overlapped); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate int KSTM_STARTED_CB([In] KSTM_INFO StreamInfo, [In] KSTM_XFER_CONTEXT XferContext, int XferContextIndex); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate int KSTM_STOPPED_CB([In] KSTM_INFO StreamInfo, [In] KSTM_XFER_CONTEXT XferContext, int XferContextIndex); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate int KSTM_COMPLETE_CB([In] KSTM_INFO StreamInfo, [In] KSTM_XFER_CONTEXT XferContext, int XferContextIndex, int ErrorCode); + + [UnmanagedFunctionPointer(CallingConvention.Winapi, CharSet = CharSet.Ansi, SetLastError = true)] + public delegate KSTM_COMPLETE_RESULT KSTM_BEFORE_COMPLETE_CB([In] KSTM_INFO StreamInfo, [In] KSTM_XFER_CONTEXT XferContext, int XferContextIndex, ref int ErrorCode); + + #endregion + + public class LstK : IDisposable + { + protected KLST_HANDLE mHandleStruct; + protected bool mbDisposed; + + protected LstK() + { + } + + #region IDisposable Members + + /// Explicitly closes and frees the handle. + public virtual void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + ~LstK() + { + Dispose(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!mbDisposed) + { + if (mHandleStruct.Pointer != IntPtr.Zero) + { + AllKFunctions.LstK_Free(mHandleStruct); + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing); + } + else + Debug.Print("{0} Dispose: [WARNING] Handle is null", GetType().Name); + + mHandleStruct = new KLST_HANDLE(IntPtr.Zero); + mbDisposed = true; + } + } + + /// Initializes a new usb device list containing all supported devices. + protected bool Init(KLST_FLAG Flags) + { + bool success = AllKFunctions.LstK_Init(out mHandleStruct, Flags); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + return true; + } + + /// Initializes a new usb device list containing only devices matching a specific class GUID. + protected bool InitEx(KLST_FLAG Flags, ref KLST_PATTERN_MATCH PatternMatch) + { + bool success = AllKFunctions.LstK_InitEx(out mHandleStruct, Flags, ref PatternMatch); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + return true; + } + + #region Public Members + + /// Initializes a new usb device list containing all supported devices. + public LstK(KLST_FLAG Flags) + { + bool success = AllKFunctions.LstK_Init(out mHandleStruct, Flags); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + } + + /// Initializes a new usb device list containing only devices matching a specific class GUID. + public LstK(KLST_FLAG Flags, ref KLST_PATTERN_MATCH PatternMatch) + { + bool success = AllKFunctions.LstK_InitEx(out mHandleStruct, Flags, ref PatternMatch); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + } + + /// Counts the number of device info elements in a device list. + public virtual bool Count(ref int Count) + { + return AllKFunctions.LstK_Count(mHandleStruct, ref Count); + } + + /// Gets the \ref KLST_DEVINFO element for the current position. + public virtual bool Current(out KLST_DEVINFO_HANDLE DeviceInfo) + { + return AllKFunctions.LstK_Current(mHandleStruct, out DeviceInfo); + } + + /// Enumerates \ref KLST_DEVINFO elements of a \ref KLST_HANDLE. + public virtual bool Enumerate(KLST_ENUM_DEVINFO_CB EnumDevListCB, IntPtr Context) + { + return AllKFunctions.LstK_Enumerate(mHandleStruct, EnumDevListCB, Context); + } + + /// Find a device by vendor and product id + public virtual bool FindByVidPid(int Vid, int Pid, out KLST_DEVINFO_HANDLE DeviceInfo) + { + return AllKFunctions.LstK_FindByVidPid(mHandleStruct, Vid, Pid, out DeviceInfo); + } + + /// Calls the dispose method. + public virtual void Free() + { + Dispose(); + } + + /// Gets the handle class structure. + public KLST_HANDLE Handle + { + get + { + return mHandleStruct; + } + } + + /// Advances the device list current \ref KLST_DEVINFO position. + public virtual bool MoveNext(out KLST_DEVINFO_HANDLE DeviceInfo) + { + return AllKFunctions.LstK_MoveNext(mHandleStruct, out DeviceInfo); + } + + /// Sets the device list to its initial position, which is before the first element in the list. + public virtual void MoveReset() + { + AllKFunctions.LstK_MoveReset(mHandleStruct); + } + + #endregion + } + + public class HotK : IDisposable + { + protected KHOT_HANDLE mHandleStruct; + protected bool mbDisposed; + + protected HotK() + { + } + + #region IDisposable Members + + /// Explicitly closes and frees the handle. + public virtual void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + ~HotK() + { + Dispose(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!mbDisposed) + { + if (mHandleStruct.Pointer != IntPtr.Zero) + { + AllKFunctions.HotK_Free(mHandleStruct); + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing); + } + else + Debug.Print("{0} Dispose: [WARNING] Handle is null", GetType().Name); + + mHandleStruct = new KHOT_HANDLE(IntPtr.Zero); + mbDisposed = true; + } + } + + /// Creates a new hot-plug handle for USB device arrival/removal event monitoring. + protected bool Init(ref KHOT_PARAMS InitParams) + { + bool success = AllKFunctions.HotK_Init(out mHandleStruct, ref InitParams); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + return true; + } + + #region Public Members + + /// Creates a new hot-plug handle for USB device arrival/removal event monitoring. + public HotK(ref KHOT_PARAMS InitParams) + { + bool success = AllKFunctions.HotK_Init(out mHandleStruct, ref InitParams); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + } + + /// Calls the dispose method. + public virtual void Free() + { + Dispose(); + } + + /// Frees all hot-plug handles initialized with \ref HotK_Init. + public virtual void FreeAll() + { + AllKFunctions.HotK_FreeAll(); + } + + /// Gets the handle class structure. + public KHOT_HANDLE Handle + { + get + { + return mHandleStruct; + } + } + + #endregion + } + + public class UsbK : IDisposable + { + protected KUSB_DRIVER_API driverAPI; + protected KUSB_HANDLE mHandleStruct; + protected bool mbDisposed; + + protected UsbK() + { + } + + #region IDisposable Members + + /// Explicitly closes and frees the handle. + public virtual void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + ~UsbK() + { + Dispose(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!mbDisposed) + { + if (mHandleStruct.Pointer != IntPtr.Zero) + { + AllKFunctions.UsbK_Free(mHandleStruct); + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing); + } + else + Debug.Print("{0} Dispose: [WARNING] Handle is null", GetType().Name); + + mHandleStruct = new KUSB_HANDLE(IntPtr.Zero); + mbDisposed = true; + } + } + + /// Creates/opens a libusbK interface handle from the device list. This is a preferred method. + protected bool Init(KLST_DEVINFO_HANDLE DevInfo) + { + bool success = AllKFunctions.LibK_LoadDriverAPI(out driverAPI, DevInfo.DriverID); + + if (!success) throw new Exception(string.Format("{0} failed loading Driver API. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + success = driverAPI.Init(out mHandleStruct, DevInfo); + + if (!success) + throw new Exception(string.Format("{0} failed initializing usb device. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + return true; + } + + /// Creates a libusbK handle for the device specified by a file handle. + protected bool Initialize(IntPtr DeviceHandle, KUSB_DRVID driverID) + { + bool success = AllKFunctions.LibK_LoadDriverAPI(out driverAPI, (int) driverID); + + if (!success) throw new Exception(string.Format("{0} failed loading Driver API. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + success = driverAPI.Initialize(DeviceHandle, out mHandleStruct); + + if (!success) + throw new Exception(string.Format("{0} failed initializing usb device. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + return true; + } + + #region Public Members + + /// Creates/opens a libusbK interface handle from the device list. This is a preferred method. + public UsbK(KLST_DEVINFO_HANDLE DevInfo) + { + bool success = AllKFunctions.LibK_LoadDriverAPI(out driverAPI, DevInfo.DriverID); + + if (!success) throw new Exception(string.Format("{0} failed loading Driver API. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + success = driverAPI.Init(out mHandleStruct, DevInfo); + + if (!success) + throw new Exception(string.Format("{0} failed initializing usb device. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + } + + /// Creates a libusbK handle for the device specified by a file handle. + public UsbK(IntPtr DeviceHandle, KUSB_DRVID driverID) + { + bool success = AllKFunctions.LibK_LoadDriverAPI(out driverAPI, (int) driverID); + + if (!success) throw new Exception(string.Format("{0} failed loading Driver API. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + success = driverAPI.Initialize(DeviceHandle, out mHandleStruct); + + if (!success) + throw new Exception(string.Format("{0} failed initializing usb device. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + } + + /// Aborts all of the pending transfers for a pipe. + public virtual bool AbortPipe(byte PipeID) + { + return driverAPI.AbortPipe(mHandleStruct, PipeID); + } + + /// Claims the specified interface by number or index. + public virtual bool ClaimInterface(byte NumberOrIndex, bool IsIndex) + { + return driverAPI.ClaimInterface(mHandleStruct, NumberOrIndex, IsIndex); + } + + /// Clones the specified interface handle. + public virtual bool Clone(out KUSB_HANDLE DstInterfaceHandle) + { + return driverAPI.Clone(mHandleStruct, out DstInterfaceHandle); + } + + /// Transmits control data over a default control endpoint. + public virtual bool ControlTransfer(WINUSB_SETUP_PACKET SetupPacket, IntPtr Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped) + { + return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Buffer, BufferLength, out LengthTransferred, Overlapped); + } + + /// Transmits control data over a default control endpoint. + public virtual bool ControlTransfer(WINUSB_SETUP_PACKET SetupPacket, Array Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped) + { + return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, out LengthTransferred, Overlapped); + } + + /// Transmits control data over a default control endpoint. + public virtual bool ControlTransfer(WINUSB_SETUP_PACKET SetupPacket, Array Buffer, int BufferLength, out int LengthTransferred, KOVL_HANDLE Overlapped) + { + return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, out LengthTransferred, Overlapped.Pointer); + } + + /// Transmits control data over a default control endpoint. + public virtual bool ControlTransfer(WINUSB_SETUP_PACKET SetupPacket, IntPtr Buffer, int BufferLength, out int LengthTransferred, KOVL_HANDLE Overlapped) + { + return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Buffer, BufferLength, out LengthTransferred, Overlapped.Pointer); + } + + /// Discards any data that is cached in a pipe. + public virtual bool FlushPipe(byte PipeID) + { + return driverAPI.FlushPipe(mHandleStruct, PipeID); + } + + /// Calls the dispose method. + public virtual void Free() + { + Dispose(); + } + + /// Gets the alternate setting for the specified interface. + public virtual bool GetAltInterface(byte NumberOrIndex, bool IsIndex, out byte AltSettingNumber) + { + return driverAPI.GetAltInterface(mHandleStruct, NumberOrIndex, IsIndex, out AltSettingNumber); + } + + /// Retrieves a handle for an associated interface. + public virtual bool GetAssociatedInterface(byte AssociatedInterfaceIndex, out KUSB_HANDLE AssociatedInterfaceHandle) + { + return driverAPI.GetAssociatedInterface(mHandleStruct, AssociatedInterfaceIndex, out AssociatedInterfaceHandle); + } + + /// Gets the device current configuration number. + public virtual bool GetConfiguration(out byte ConfigurationNumber) + { + return driverAPI.GetConfiguration(mHandleStruct, out ConfigurationNumber); + } + + /// Gets the current alternate interface setting for an interface. + public virtual bool GetCurrentAlternateSetting(out byte AltSettingNumber) + { + return driverAPI.GetCurrentAlternateSetting(mHandleStruct, out AltSettingNumber); + } + + /// Retrieves the current USB frame number. + public virtual bool GetCurrentFrameNumber(out int FrameNumber) + { + return driverAPI.GetCurrentFrameNumber(mHandleStruct, out FrameNumber); + } + + /// Gets the requested descriptor. This is a synchronous operation. + public virtual bool GetDescriptor(byte DescriptorType, byte Index, int LanguageID, IntPtr Buffer, int BufferLength, out int LengthTransferred) + { + return driverAPI.GetDescriptor(mHandleStruct, DescriptorType, Index, (ushort) LanguageID, Buffer, BufferLength, out LengthTransferred); + } + + /// Gets the requested descriptor. This is a synchronous operation. + public virtual bool GetDescriptor(byte DescriptorType, byte Index, int LanguageID, Array Buffer, int BufferLength, out int LengthTransferred) + { + return driverAPI.GetDescriptor(mHandleStruct, DescriptorType, Index, (ushort) LanguageID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, out LengthTransferred); + } + + /// Retrieves the results of an overlapped operation on the specified libusbK handle. + public virtual bool GetOverlappedResult(IntPtr Overlapped, out int lpNumberOfBytesTransferred, bool bWait) + { + return driverAPI.GetOverlappedResult(mHandleStruct, Overlapped, out lpNumberOfBytesTransferred, bWait); + } + + /// Retrieves the results of an overlapped operation on the specified libusbK handle. + public virtual bool GetOverlappedResult(KOVL_HANDLE Overlapped, out int lpNumberOfBytesTransferred, bool bWait) + { + return driverAPI.GetOverlappedResult(mHandleStruct, Overlapped.Pointer, out lpNumberOfBytesTransferred, bWait); + } + + /// Gets the policy for a specific pipe (endpoint). + public virtual bool GetPipePolicy(byte PipeID, int PolicyType, ref int ValueLength, IntPtr Value) + { + return driverAPI.GetPipePolicy(mHandleStruct, PipeID, PolicyType, ref ValueLength, Value); + } + + /// Gets the policy for a specific pipe (endpoint). + public virtual bool GetPipePolicy(byte PipeID, int PolicyType, ref int ValueLength, Array Value) + { + return driverAPI.GetPipePolicy(mHandleStruct, PipeID, PolicyType, ref ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)); + } + + /// Gets the power policy for a device. + public virtual bool GetPowerPolicy(int PolicyType, ref int ValueLength, IntPtr Value) + { + return driverAPI.GetPowerPolicy(mHandleStruct, PolicyType, ref ValueLength, Value); + } + + /// Gets the power policy for a device. + public virtual bool GetPowerPolicy(int PolicyType, ref int ValueLength, Array Value) + { + return driverAPI.GetPowerPolicy(mHandleStruct, PolicyType, ref ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)); + } + + /// Gets a USB device (driver specific) property from usb handle. + public virtual bool GetProperty(KUSB_PROPERTY PropertyType, ref int PropertySize, IntPtr Value) + { + return driverAPI.GetProperty(mHandleStruct, PropertyType, ref PropertySize, Value); + } + + /// Gets a USB device (driver specific) property from usb handle. + public virtual bool GetProperty(KUSB_PROPERTY PropertyType, ref int PropertySize, Array Value) + { + return driverAPI.GetProperty(mHandleStruct, PropertyType, ref PropertySize, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)); + } + + /// Gets the handle class structure. + public KUSB_HANDLE Handle + { + get + { + return mHandleStruct; + } + } + + /// Reads from an isochronous pipe. + public virtual bool IsoReadPipe(byte PipeID, IntPtr Buffer, int BufferLength, IntPtr Overlapped, KISO_CONTEXT IsoContext) + { + return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped, IsoContext); + } + + /// Reads from an isochronous pipe. + public virtual bool IsoReadPipe(byte PipeID, Array Buffer, int BufferLength, IntPtr Overlapped, KISO_CONTEXT IsoContext) + { + return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped, IsoContext); + } + + /// Reads from an isochronous pipe. + public virtual bool IsoReadPipe(byte PipeID, Array Buffer, int BufferLength, KOVL_HANDLE Overlapped, KISO_CONTEXT IsoContext) + { + return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped.Pointer, IsoContext); + } + + /// Reads from an isochronous pipe. + public virtual bool IsoReadPipe(byte PipeID, IntPtr Buffer, int BufferLength, KOVL_HANDLE Overlapped, KISO_CONTEXT IsoContext) + { + return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped.Pointer, IsoContext); + } + + /// Writes to an isochronous pipe. + public virtual bool IsoWritePipe(byte PipeID, IntPtr Buffer, int BufferLength, IntPtr Overlapped, KISO_CONTEXT IsoContext) + { + return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped, IsoContext); + } + + /// Writes to an isochronous pipe. + public virtual bool IsoWritePipe(byte PipeID, Array Buffer, int BufferLength, IntPtr Overlapped, KISO_CONTEXT IsoContext) + { + return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped, IsoContext); + } + + /// Writes to an isochronous pipe. + public virtual bool IsoWritePipe(byte PipeID, Array Buffer, int BufferLength, KOVL_HANDLE Overlapped, KISO_CONTEXT IsoContext) + { + return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped.Pointer, IsoContext); + } + + /// Writes to an isochronous pipe. + public virtual bool IsoWritePipe(byte PipeID, IntPtr Buffer, int BufferLength, KOVL_HANDLE Overlapped, KISO_CONTEXT IsoContext) + { + return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped.Pointer, IsoContext); + } + + /// Retrieves information about the physical device that is associated with a libusbK handle. + public virtual bool QueryDeviceInformation(int InformationType, ref int BufferLength, IntPtr Buffer) + { + return driverAPI.QueryDeviceInformation(mHandleStruct, InformationType, ref BufferLength, Buffer); + } + + /// Retrieves the interface descriptor for the specified alternate interface settings for a particular interface handle. + public virtual bool QueryInterfaceSettings(byte AltSettingIndex, out USB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor) + { + return driverAPI.QueryInterfaceSettings(mHandleStruct, AltSettingIndex, out UsbAltInterfaceDescriptor); + } + + /// Retrieves information about a pipe that is associated with an interface. + public virtual bool QueryPipe(byte AltSettingNumber, byte PipeIndex, out WINUSB_PIPE_INFORMATION PipeInformation) + { + return driverAPI.QueryPipe(mHandleStruct, AltSettingNumber, PipeIndex, out PipeInformation); + } + + /// Reads data from the specified pipe. + public virtual bool ReadPipe(byte PipeID, IntPtr Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped) + { + return driverAPI.ReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, out LengthTransferred, Overlapped); + } + + /// Reads data from the specified pipe. + public virtual bool ReadPipe(byte PipeID, Array Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped) + { + return driverAPI.ReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, out LengthTransferred, Overlapped); + } + + /// Reads data from the specified pipe. + public virtual bool ReadPipe(byte PipeID, Array Buffer, int BufferLength, out int LengthTransferred, KOVL_HANDLE Overlapped) + { + return driverAPI.ReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, out LengthTransferred, Overlapped.Pointer); + } + + /// Reads data from the specified pipe. + public virtual bool ReadPipe(byte PipeID, IntPtr Buffer, int BufferLength, out int LengthTransferred, KOVL_HANDLE Overlapped) + { + return driverAPI.ReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, out LengthTransferred, Overlapped.Pointer); + } + + /// Releases the specified interface by number or index. + public virtual bool ReleaseInterface(byte NumberOrIndex, bool IsIndex) + { + return driverAPI.ReleaseInterface(mHandleStruct, NumberOrIndex, IsIndex); + } + + /// Resets the usb device of the specified interface handle. (port cycle). + public virtual bool ResetDevice() + { + return driverAPI.ResetDevice(mHandleStruct); + } + + /// Resets the data toggle and clears the stall condition on a pipe. + public virtual bool ResetPipe(byte PipeID) + { + return driverAPI.ResetPipe(mHandleStruct, PipeID); + } + + /// Selects the specified interface by number or index as the current interface. + public virtual bool SelectInterface(byte NumberOrIndex, bool IsIndex) + { + return driverAPI.SelectInterface(mHandleStruct, NumberOrIndex, IsIndex); + } + + /// Sets the alternate setting of the specified interface. + public virtual bool SetAltInterface(byte NumberOrIndex, bool IsIndex, byte AltSettingNumber) + { + return driverAPI.SetAltInterface(mHandleStruct, NumberOrIndex, IsIndex, AltSettingNumber); + } + + /// Sets the device configuration number. + public virtual bool SetConfiguration(byte ConfigurationNumber) + { + return driverAPI.SetConfiguration(mHandleStruct, ConfigurationNumber); + } + + /// Sets the alternate setting of an interface. + public virtual bool SetCurrentAlternateSetting(byte AltSettingNumber) + { + return driverAPI.SetCurrentAlternateSetting(mHandleStruct, AltSettingNumber); + } + + /// Sets the policy for a specific pipe associated with an endpoint on the device. This is a synchronous operation. + public virtual bool SetPipePolicy(byte PipeID, int PolicyType, int ValueLength, IntPtr Value) + { + return driverAPI.SetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Value); + } + + /// Sets the policy for a specific pipe associated with an endpoint on the device. This is a synchronous operation. + public virtual bool SetPipePolicy(byte PipeID, int PolicyType, int ValueLength, Array Value) + { + return driverAPI.SetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)); + } + + /// Sets the power policy for a device. + public virtual bool SetPowerPolicy(int PolicyType, int ValueLength, IntPtr Value) + { + return driverAPI.SetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Value); + } + + /// Sets the power policy for a device. + public virtual bool SetPowerPolicy(int PolicyType, int ValueLength, Array Value) + { + return driverAPI.SetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)); + } + + /// Writes data to a pipe. + public virtual bool WritePipe(byte PipeID, IntPtr Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped) + { + return driverAPI.WritePipe(mHandleStruct, PipeID, Buffer, BufferLength, out LengthTransferred, Overlapped); + } + + /// Writes data to a pipe. + public virtual bool WritePipe(byte PipeID, Array Buffer, int BufferLength, out int LengthTransferred, IntPtr Overlapped) + { + return driverAPI.WritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, out LengthTransferred, Overlapped); + } + + /// Writes data to a pipe. + public virtual bool WritePipe(byte PipeID, Array Buffer, int BufferLength, out int LengthTransferred, KOVL_HANDLE Overlapped) + { + return driverAPI.WritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, out LengthTransferred, Overlapped.Pointer); + } + + /// Writes data to a pipe. + public virtual bool WritePipe(byte PipeID, IntPtr Buffer, int BufferLength, out int LengthTransferred, KOVL_HANDLE Overlapped) + { + return driverAPI.WritePipe(mHandleStruct, PipeID, Buffer, BufferLength, out LengthTransferred, Overlapped.Pointer); + } + + #endregion + } + + public class OvlK : IDisposable + { + protected KOVL_POOL_HANDLE mHandleStruct; + protected bool mbDisposed; + + protected OvlK() + { + } + + #region IDisposable Members + + /// Explicitly closes and frees the handle. + public virtual void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + ~OvlK() + { + Dispose(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!mbDisposed) + { + if (mHandleStruct.Pointer != IntPtr.Zero) + { + AllKFunctions.OvlK_Free(mHandleStruct); + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing); + } + else + Debug.Print("{0} Dispose: [WARNING] Handle is null", GetType().Name); + + mHandleStruct = new KOVL_POOL_HANDLE(IntPtr.Zero); + mbDisposed = true; + } + } + + /// Creates a new overlapped pool. + protected bool Init(KUSB_HANDLE UsbHandle, int MaxOverlappedCount, KOVL_POOL_FLAG Flags) + { + bool success = AllKFunctions.OvlK_Init(out mHandleStruct, UsbHandle, MaxOverlappedCount, Flags); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + return true; + } + + #region Public Members + + /// Creates a new overlapped pool. + public OvlK(KUSB_HANDLE UsbHandle, int MaxOverlappedCount, KOVL_POOL_FLAG Flags) + { + bool success = AllKFunctions.OvlK_Init(out mHandleStruct, UsbHandle, MaxOverlappedCount, Flags); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + } + + /// Gets a preallocated \c OverlappedK structure from the specified/default pool. + public virtual bool Acquire(out KOVL_HANDLE OverlappedK) + { + return AllKFunctions.OvlK_Acquire(out OverlappedK, mHandleStruct); + } + + /// Calls the dispose method. + public virtual void Free() + { + Dispose(); + } + + /// Returns the internal event handle used to signal IO operations. + public virtual IntPtr GetEventHandle(KOVL_HANDLE OverlappedK) + { + return AllKFunctions.OvlK_GetEventHandle(OverlappedK); + } + + /// Gets the handle class structure. + public KOVL_POOL_HANDLE Handle + { + get + { + return mHandleStruct; + } + } + + /// Checks for i/o completion; returns immediately. (polling) + public virtual bool IsComplete(KOVL_HANDLE OverlappedK) + { + return AllKFunctions.OvlK_IsComplete(OverlappedK); + } + + /// Initializes an overlappedK for re-use. The overlappedK is not return to its pool. + public virtual bool ReUse(KOVL_HANDLE OverlappedK) + { + return AllKFunctions.OvlK_ReUse(OverlappedK); + } + + /// Returns an \c OverlappedK structure to it's pool. + public virtual bool Release(KOVL_HANDLE OverlappedK) + { + return AllKFunctions.OvlK_Release(OverlappedK); + } + + /// Waits for overlapped I/O completion, and performs actions specified in \c WaitFlags. + public virtual bool Wait(KOVL_HANDLE OverlappedK, int TimeoutMS, KOVL_WAIT_FLAG WaitFlags, out int TransferredLength) + { + return AllKFunctions.OvlK_Wait(OverlappedK, TimeoutMS, WaitFlags, out TransferredLength); + } + + /// Waits for overlapped I/O completion, cancels on a timeout error and always releases the OvlK handle back to its pool. + public virtual bool WaitAndRelease(KOVL_HANDLE OverlappedK, int TimeoutMS, out int TransferredLength) + { + return AllKFunctions.OvlK_WaitAndRelease(OverlappedK, TimeoutMS, out TransferredLength); + } + + /// Waits for overlapped I/O completion on the oldest acquired OverlappedK handle and performs actions specified in \c WaitFlags. + public virtual bool WaitOldest(out KOVL_HANDLE OverlappedK, int TimeoutMS, KOVL_WAIT_FLAG WaitFlags, out int TransferredLength) + { + return AllKFunctions.OvlK_WaitOldest(mHandleStruct, out OverlappedK, TimeoutMS, WaitFlags, out TransferredLength); + } + + /// Waits for overlapped I/O completion, cancels on a timeout error. + public virtual bool WaitOrCancel(KOVL_HANDLE OverlappedK, int TimeoutMS, out int TransferredLength) + { + return AllKFunctions.OvlK_WaitOrCancel(OverlappedK, TimeoutMS, out TransferredLength); + } + + #endregion + } + + public class StmK : IDisposable + { + protected KSTM_HANDLE mHandleStruct; + protected bool mbDisposed; + + protected StmK() + { + } + + #region IDisposable Members + + /// Explicitly closes and frees the handle. + public virtual void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + ~StmK() + { + Dispose(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!mbDisposed) + { + if (mHandleStruct.Pointer != IntPtr.Zero) + { + AllKFunctions.StmK_Free(mHandleStruct); + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing); + } + else + Debug.Print("{0} Dispose: [WARNING] Handle is null", GetType().Name); + + mHandleStruct = new KSTM_HANDLE(IntPtr.Zero); + mbDisposed = true; + } + } + + /// Initializes a new uni-directional pipe stream. + protected bool Init(KUSB_HANDLE UsbHandle, byte PipeID, int MaxTransferSize, int MaxPendingTransfers, int MaxPendingIO, ref KSTM_CALLBACK Callbacks, KSTM_FLAG Flags) + { + bool success = AllKFunctions.StmK_Init(out mHandleStruct, UsbHandle, PipeID, MaxTransferSize, MaxPendingTransfers, MaxPendingIO, ref Callbacks, Flags); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + return true; + } + + #region Public Members + + /// Initializes a new uni-directional pipe stream. + public StmK(KUSB_HANDLE UsbHandle, byte PipeID, int MaxTransferSize, int MaxPendingTransfers, int MaxPendingIO, ref KSTM_CALLBACK Callbacks, KSTM_FLAG Flags) + { + bool success = AllKFunctions.StmK_Init(out mHandleStruct, UsbHandle, PipeID, MaxTransferSize, MaxPendingTransfers, MaxPendingIO, ref Callbacks, Flags); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + } + + /// Calls the dispose method. + public virtual void Free() + { + Dispose(); + } + + /// Gets the handle class structure. + public KSTM_HANDLE Handle + { + get + { + return mHandleStruct; + } + } + + /// Reads data from the stream buffer. + public virtual bool Read(IntPtr Buffer, int Offset, int Length, out int TransferredLength) + { + return AllKFunctions.StmK_Read(mHandleStruct, Buffer, Offset, Length, out TransferredLength); + } + + /// Reads data from the stream buffer. + public virtual bool Read(Array Buffer, int Offset, int Length, out int TransferredLength) + { + return AllKFunctions.StmK_Read(mHandleStruct, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), Offset, Length, out TransferredLength); + } + + /// Starts the internal stream thread. + public virtual bool Start() + { + return AllKFunctions.StmK_Start(mHandleStruct); + } + + /// Stops the internal stream thread. + public virtual bool Stop(int TimeoutCancelMS) + { + return AllKFunctions.StmK_Stop(mHandleStruct, TimeoutCancelMS); + } + + /// Writes data to the stream buffer. + public virtual bool Write(IntPtr Buffer, int Offset, int Length, out int TransferredLength) + { + return AllKFunctions.StmK_Write(mHandleStruct, Buffer, Offset, Length, out TransferredLength); + } + + /// Writes data to the stream buffer. + public virtual bool Write(Array Buffer, int Offset, int Length, out int TransferredLength) + { + return AllKFunctions.StmK_Write(mHandleStruct, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), Offset, Length, out TransferredLength); + } + + #endregion + } + + public class IsoK : IDisposable + { + protected KISO_CONTEXT mHandleStruct; + protected bool mbDisposed; + + protected IsoK() + { + } + + #region IDisposable Members + + /// Explicitly closes and frees the handle. + public virtual void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + ~IsoK() + { + Dispose(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!mbDisposed) + { + if (mHandleStruct.Pointer != IntPtr.Zero) + { + AllKFunctions.IsoK_Free(mHandleStruct); + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", GetType().Name, mHandleStruct.Pointer.ToInt64(), disposing); + } + else + Debug.Print("{0} Dispose: [WARNING] Handle is null", GetType().Name); + + mHandleStruct = new KISO_CONTEXT(IntPtr.Zero); + mbDisposed = true; + } + } + + /// Creates a new isochronous transfer context. + protected bool Init(int NumberOfPackets, int StartFrame) + { + bool success = AllKFunctions.IsoK_Init(out mHandleStruct, NumberOfPackets, StartFrame); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + return true; + } + + #region Nested Structs + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] + private struct KISO_CONTEXT_MAP + { + /// Additional ISO transfer flags. See \ref KISO_FLAG. + private readonly KISO_FLAG Flags; + + /// Specifies the frame number that the transfer should begin on (0 for ASAP). + private readonly int StartFrame; + + /// Contains the number of packets that completed with an error condition on return from the host controller driver. + private readonly short ErrorCount; + + /// Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + private readonly short NumberOfPackets; + + /// Contains the URB Hdr.Status value on return from the host controller driver. + private readonly int UrbHdrStatus; + }; + + #endregion + + #region Public Members + + /// Creates a new isochronous transfer context. + public IsoK(int NumberOfPackets, int StartFrame) + { + bool success = AllKFunctions.IsoK_Init(out mHandleStruct, NumberOfPackets, StartFrame); + + if (!success) throw new Exception(string.Format("{0} failed initializing. ErrorCode={1:X8}h", GetType().Name, Marshal.GetLastWin32Error())); + + Debug.Print("{0} Init: handle 0x{1:X16}", GetType().Name, mHandleStruct.Pointer.ToInt64()); + } + + /// Convenience function for enumerating ISO packets of an isochronous transfer context. + public virtual bool EnumPackets(KISO_ENUM_PACKETS_CB EnumPackets, int StartPacketIndex, IntPtr UserState) + { + return AllKFunctions.IsoK_EnumPackets(mHandleStruct, EnumPackets, StartPacketIndex, UserState); + } + + /// Contains the number of packets that completed with an error condition on return from the host controller driver. + public short ErrorCount + { + get + { + return Marshal.ReadInt16(mHandleStruct.Pointer, ofsErrorCount); + } + set + { + Marshal.WriteInt16(mHandleStruct.Pointer, ofsErrorCount, value); + } + } + + /// Additional ISO transfer flags. See \ref KISO_FLAG. + public KISO_FLAG Flags + { + get + { + return (KISO_FLAG) Marshal.ReadInt32(mHandleStruct.Pointer, ofsFlags); + } + set + { + Marshal.WriteInt32(mHandleStruct.Pointer, ofsFlags, (int) value); + } + } + + /// Calls the dispose method. + public virtual void Free() + { + Dispose(); + } + + /// Convenience function for getting all fields of a \ref KISO_PACKET. + public virtual bool GetPacket(int PacketIndex, out KISO_PACKET IsoPacket) + { + return AllKFunctions.IsoK_GetPacket(mHandleStruct, PacketIndex, out IsoPacket); + } + + /// Gets the handle class structure. + public KISO_CONTEXT Handle + { + get + { + return mHandleStruct; + } + } + + /// Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + public short NumberOfPackets + { + get + { + return Marshal.ReadInt16(mHandleStruct.Pointer, ofsNumberOfPackets); + } + set + { + Marshal.WriteInt16(mHandleStruct.Pointer, ofsNumberOfPackets, value); + } + } + + /// Convenience function for re-using an isochronous transfer context in a subsequent request. + public virtual bool ReUse() + { + return AllKFunctions.IsoK_ReUse(mHandleStruct); + } + + /// Convenience function for setting all fields of a \ref KISO_PACKET. + public virtual bool SetPacket(int PacketIndex, ref KISO_PACKET IsoPacket) + { + return AllKFunctions.IsoK_SetPacket(mHandleStruct, PacketIndex, ref IsoPacket); + } + + /// Convenience function for setting the offset of all ISO packets of an isochronous transfer context. + public virtual bool SetPackets(int PacketSize) + { + return AllKFunctions.IsoK_SetPackets(mHandleStruct, PacketSize); + } + + /// Specifies the frame number that the transfer should begin on (0 for ASAP). + public int StartFrame + { + get + { + return Marshal.ReadInt32(mHandleStruct.Pointer, ofsStartFrame); + } + set + { + Marshal.WriteInt32(mHandleStruct.Pointer, ofsStartFrame, value); + } + } + + /// Contains the URB Hdr.Status value on return from the host controller driver. + public int UrbHdrStatus + { + get + { + return Marshal.ReadInt32(mHandleStruct.Pointer, ofsUrbHdrStatus); + } + set + { + Marshal.WriteInt32(mHandleStruct.Pointer, ofsUrbHdrStatus, value); + } + } + + #endregion + + #region Private Members + + private static readonly int ofsErrorCount = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "ErrorCount").ToInt32(); + private static readonly int ofsFlags = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "Flags").ToInt32(); + private static readonly int ofsNumberOfPackets = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "NumberOfPackets").ToInt32(); + private static readonly int ofsStartFrame = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "StartFrame").ToInt32(); + private static readonly int ofsUrbHdrStatus = Marshal.OffsetOf(typeof (KISO_CONTEXT_MAP), "UrbHdrStatus").ToInt32(); + + #endregion + } +} \ No newline at end of file diff --git a/Old Matlab Interface/bindings/libusbK.pas b/Old Matlab Interface/bindings/libusbK.pas new file mode 100644 index 00000000..b0e2050b --- /dev/null +++ b/Old Matlab Interface/bindings/libusbK.pas @@ -0,0 +1,1630 @@ +// Copyright (c) 2011 Ekkehard Domning (edomning@adcocom-broadcast.com) +// Portions Copyright (c) 2012 Alberto Semenzato +// All rights reserved. +// +// Pascal libusbK Bindings +// Created on: 12.8.2011 +// +// History: +// +// 2011-08-12 Initial release (Ekkehard Domning) +// +// 2012-02-10 Added Hotplug Event Notifier API, LstK_InitEx, implicit linking +// and minor stuff (Alberto Semenzato) +// +// 2012-03-09 Added LibK_SetContext, LibK_GetContext, HotK_FreeAll, +// KSTM_BEFORE_COMPLETE_CB, OvlK_WaitOldest, +// LibK_SetDefaultContext, LibK_GetDefaultContext, +// 3.0.5.10 changes has been applied (Alberto Semenzato) +// +// Functions not in the original sources: +// +// GetIsoPacketFromIsoContext: helper to get a pointer to a specific packet +// +// UsbK_InitFromDevicePath: example showing a way to init a device +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// Notes: +// +// Default setting uses dynamic linking, see below and remove the compiler +// directive to change to implicit linking +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +// OR EKKEHARD DOMNING OR ALBERTO SEMENZATO BE LIABLE FOR ANY DIRECT, INDIRECT, +// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +unit libusbK; + +// Import of the functions of libusbK.dll + +// Conditional compiling "DynamicLink" +// defined: the unit will load the DLL on startup and assign all functions, +// if all functions available the variable "DllAvailable" becomes +// true +// undefined: implicit linking, the application failes if the DLL is not +// available + +{$DEFINE DynamicLink} + +interface + + uses + + Windows; + + const + + LIBUSBK_DLL = 'libusbK.dll'; + + const + + // pipe policy types + SHORT_PACKET_TERMINATE = $01; + AUTO_CLEAR_STALL = $02; + PIPE_TRANSFER_TIMEOUT = $03; + IGNORE_SHORT_PACKETS = $04; + ALLOW_PARTIAL_READS = $05; + AUTO_FLUSH = $06; + RAW_IO = $07; + MAXIMUM_TRANSFER_SIZE = $08; + RESET_PIPE_ON_RESUME = $09; + + // libusbK ISO pipe policy types + ISO_START_LATENCY = $20; + ISO_ALWAYS_START_ASAP = $21; + ISO_NUM_FIXED_PACKETS = $22; + + // http://msdn.microsoft.com/en-us/library/windows/hardware/ff552359%28v=vs.85%29.aspx + // Settings.Parallel.NumberOfPresentedRequests + // Maximum number of transfers that can be asynchronously delivered at a + // time. Available in version 1.9 and later versions of KMDF. + SIMUL_PARALLEL_REQUESTS = $30; + + // Power policy types + AUTO_SUSPEND = $81; + SUSPEND_DELAY = $83; + + // Device Information types + DEVICE_SPEED = $01; + + // Device Speeds + LowSpeed = $01; + FullSpeed = $02; + HighSpeed = $03; + + USB_DESCRIPTOR_TYPE_DEVICE = $01; + USB_DESCRIPTOR_TYPE_CONFIGURATION = $02; + USB_DESCRIPTOR_TYPE_STRING = $03; + USB_DESCRIPTOR_TYPE_INTERFACE = $04; + USB_DESCRIPTOR_TYPE_ENDPOINT = $05; + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER = $06; + USB_DESCRIPTOR_TYPE_CONFIG_POWER = $07; + USB_DESCRIPTOR_TYPE_INTERFACE_POWER = $08; + USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION = $0B; + + USB_REQUEST_GET_STATUS = $00; + USB_REQUEST_CLEAR_FEATURE = $01; + USB_REQUEST_SET_FEATURE = $03; + USB_REQUEST_SET_ADDRESS = $05; + USB_REQUEST_GET_DESCRIPTOR = $06; + USB_REQUEST_SET_DESCRIPTOR = $07; + USB_REQUEST_GET_CONFIGURATION = $08; + USB_REQUEST_SET_CONFIGURATION = $09; + USB_REQUEST_GET_INTERFACE = $0A; + USB_REQUEST_SET_INTERFACE = $0B; + USB_REQUEST_SYNC_FRAME = $0C; + + type + + USBD_PIPE_TYPE = (UsbdPipeTypeControl, UsbdPipeTypeIsochronous, + UsbdPipeTypeBulk, UsbdPipeTypeInterrupt); + + PWINUSB_PIPE_INFORMATION = ^WINUSB_PIPE_INFORMATION; + + WINUSB_PIPE_INFORMATION = packed record + PipeType: USBD_PIPE_TYPE; + dummy0: array [0 .. 2] of Byte; + PipeId: Byte; + dummy1: Byte; + MaximumPacketSize: Word; + Interval: Byte; + dummy2: array [0 .. 2] of Byte; + end; + + WINUSB_SETUP_PACKET_INT64 = Int64; + + PWINUSB_SETUP_PACKET = ^WINUSB_SETUP_PACKET; + + WINUSB_SETUP_PACKET = packed record + case Integer of + 0: + (AsInt64: WINUSB_SETUP_PACKET_INT64); + 1: + (RequestType: Byte; + Request: Byte; + Value: Word; + Index: Word; + Length: Word + ); + end; + + // Structure describing an isochronous transfer packet. + PKISO_PACKET = ^KISO_PACKET; + + KISO_PACKET = packed record + Offset: Cardinal; + Length: SmallInt; + Status: Word; + end; + + PKISO_PACKET_ARRAY = ^KISO_PACKET_ARRAY; + + KISO_PACKET_ARRAY = array [0 .. (MaxInt div SizeOf(KISO_PACKET)) - 1] + of KISO_PACKET; + + const + + KISO_FLAG_NONE = 0; + KISO_FLAG_SET_START_FRAME = $00000001; + + type + + KISO_FLAG = Cardinal; + + // Structure describing a user defined isochronous transfer. + PKISO_CONTEXT = ^KISO_CONTEXT; + + KISO_CONTEXT = packed record + Flags: Cardinal; + StartFrame: Cardinal; + ErrorCount: SmallInt; + NumberOfPackets: SmallInt; + UrbHdrStatus: Cardinal; + // Contains a variable-length array of KISO_PACKET structures that + // describe the isochronous transfer packets to be transferred on the + // USB bus. + // note This field is assigned by the user application, used by the driver + // upon transfer submission, and updated by the driver upon transfer + // completion. + // Translation to Delphi is difficult, since you can not declare array + // with the length of zero, so you must use a Type cast to access the + // (optional) array members PKISO_PACKET_ARRAY(@x.IsoPackets)^[n] + // I made the function GetIsoPacketFromIsoContext that returns a pointer + // to a specific packet. + IsoPackets: record end; + end; + + KLIB_USER_CONTEXT = pointer; + + // pointer to a \c KISO_CONTEXT structure + KLIB_HANDLE = pointer; + + // Opaque UsbK handle, see \ref UsbK_Init. + KUSB_HANDLE = KLIB_HANDLE; + + // Opaque LstK handle, see \ref LstK_Init. + KLST_HANDLE = KLIB_HANDLE; + + // Opaque HotK handle, see \ref HotK_Init. + KHOT_HANDLE = KLIB_HANDLE; + + // Opaque OvlK handle, see \ref OvlK_Acquire. + KOVL_HANDLE = KLIB_HANDLE; + + // Opaque OvlPoolK handle, see \ref OvlK_Init. + KOVL_POOL_HANDLE = KLIB_HANDLE; + + // Opaque StmK handle, see \ref StmK_Init. + KSTM_HANDLE = KLIB_HANDLE; + + // Handle type enumeration. + KLIB_HANDLE_TYPE = (KLIB_HANDLE_TYPE_HOTK, KLIB_HANDLE_TYPE_USBK, + KLIB_HANDLE_TYPE_USBSHAREDK, KLIB_HANDLE_TYPE_LSTK, + KLIB_HANDLE_TYPE_LSTINFOK, KLIB_HANDLE_TYPE_OVLK, + KLIB_HANDLE_TYPE_OVLPOOLK, KLIB_HANDLE_TYPE_STMK, KLIB_HANDLE_TYPE_COUNT); + + PKLIB_VERSION = ^KLIB_VERSION; + + KLIB_VERSION = record + Major: Integer; + Minor: Integer; + Micro: Integer; + Nano: Integer; + end; + + // Callback function typedef for \ref IsoK_EnumPackets + KISO_ENUM_PACKETS_CB = function(const PacketIndex: Cardinal; + const IsoPacket: PKISO_PACKET; const UserState: pointer): Bool; stdcall; + + const + + KLST_STRING_MAX_LEN = 256; + + KLST_SYNC_FLAG_NONE = $0000; + KLST_SYNC_FLAG_UNCHANGED = $0001; + KLST_SYNC_FLAG_ADDED = $0002; + KLST_SYNC_FLAG_REMOVED = $0004; + KLST_SYNC_FLAG_CONNECT_CHANGE = $0008; + KLST_SYNC_FLAG_MASK = $000F; + + type + + KLST_SYNC_FLAG = Cardinal; + + // Common usb device information structure + PKLST_DEV_COMMON_INFO = ^KLST_DEV_COMMON_INFO; + + KLST_DEV_COMMON_INFO = packed record + Vid: Integer; + Pid: Integer; + MI: Integer; + InstanceID: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar; + end; + + KLST_DEVINFO_HANDLE = ^KLST_DEVINFO; + + KLST_DEVINFO = packed record + Common: KLST_DEV_COMMON_INFO; + DriverID: Integer; + DeviceInterfaceGUID: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar; + InstanceID: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar; + ClassGUID: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar; + Mfg: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar; + DeviceDesc: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar; + Service: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar; + SymbolicLink: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar; + DevicePath: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar; + LUsb0FilterIndex: Integer; + Connected: Bool; + SyncFlags: KLST_SYNC_FLAG; + end; + + const + + KLST_FLAG_NONE = $0000; + KLST_FLAG_INCLUDE_RAWGUID = $0001; + KLST_FLAG_INCLUDE_DISCONNECT = $0002; + + type + + KLST_FLAG = Cardinal; + + KLST_ENUM_DEVINFO_CB = function(const DeviceList: KLST_HANDLE; + const DeviceInfo: KLST_DEVINFO_HANDLE; const Contex: pointer) + : Bool; stdcall; + + PUSB_INTERFACE_DESCRIPTOR = ^USB_INTERFACE_DESCRIPTOR; + + USB_INTERFACE_DESCRIPTOR = packed record + bLength: Byte; + bDescriptorType: Byte; + bInterfaceNumber: Byte; + bAlternateSetting: Byte; + bNumEndpoints: Byte; + bInterfaceClass: Byte; + bInterfaceSubClass: Byte; + bInterfaceProtocol: Byte; + iInterface: Byte; + end; + + PUSB_DEVICE_DESCRIPTOR = ^USB_DEVICE_DESCRIPTOR; + + USB_DEVICE_DESCRIPTOR = packed record + bLength: Byte; + bDescriptorType: Byte; + bcdUSB: Word; + bDeviceClass: Byte; + bDeviceSubClass: Byte; + bDeviceProtocol: Byte; + bMaxPacketSize0: Byte; + idVendor: Word; + idProduct: Word; + bcdDevice: Word; + iManufacturer: Byte; + iProduct: Byte; + iSerialNumber: Byte; + bNumConfigurations: Byte; + end; + + PUSB_ENDPOINT_DESCRIPTOR = ^USB_ENDPOINT_DESCRIPTOR; + + USB_ENDPOINT_DESCRIPTOR = packed record + bLength: Byte; + bDescriptorType: Byte; + bEndpointAddress: Byte; + bmAttributes: Byte; + wMaxPacketSize: SmallInt; + bInterval: Byte; + end; + + KUSB_PROPERTY = (KUSB_PROPERTY_DEVICE_FILE_HANDLE, KUSB_PROPERTY_COUNT); + + const + + KHOT_FLAG_NONE: UINT = 0; + KHOT_FLAG_PLUG_ALL_ON_INIT: UINT = $0001; + KHOT_FLAG_PASS_DUPE_INSTANCE: UINT = $0002; + KHOT_FLAG_POST_USER_MESSAGE: UINT = $0004; + + type + + KLST_PATTERN_MATCH = packed record + InstanceID: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar; + DeviceInterfaceGUID: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar; + SymbolicLink: array [0 .. KLST_STRING_MAX_LEN - 1] of AnsiChar; + z_F_i_x_e_d: array [0 .. (1024 - (KLST_STRING_MAX_LEN * 3)) - 1] of Byte; + end; + + PKLST_PATTERN_MATCH = ^KLST_PATTERN_MATCH; + + KHOT_PLUG_CB = procedure(HotHandle: KHOT_HANDLE; + DeviceInfo: KLST_DEVINFO_HANDLE; PlugType: KLST_SYNC_FLAG); stdcall; + + KHOT_PARAMS = packed record + UserHwnd: HWND; + UserMessage: UINT; + Flags: UINT; + PatternMatch: KLST_PATTERN_MATCH; + OnHotPlug: KHOT_PLUG_CB; + z_F_i_x_e_d: array [0 .. (2048 - SizeOf(KLST_PATTERN_MATCH) - + SizeOf(PUINT) * 2 - (SizeOf(UINT) * 2)) - 1] of Byte; + end; + + PKHOT_PARAMS = ^KHOT_PARAMS; + + const + + USBD_ISO_START_FRAME_RANGE = 1024; + + type + + KUSB_DRIVER_API_INFO = packed record + DriverID: Integer; + FunctionCount: Integer; + end; + + // Supported function id enumeration. + KUSB_FNID = (KUSB_FNID_Init, KUSB_FNID_Free, KUSB_FNID_ClaimInterface, + KUSB_FNID_ReleaseInterface, KUSB_FNID_SetAltInterface, + KUSB_FNID_GetAltInterface, KUSB_FNID_GetDescriptor, + KUSB_FNID_ControlTransfer, KUSB_FNID_SetPowerPolicy, + KUSB_FNID_GetPowerPolicy, KUSB_FNID_SetConfiguration, + KUSB_FNID_GetConfiguration, KUSB_FNID_ResetDevice, KUSB_FNID_Initialize, + KUSB_FNID_SelectInterface, KUSB_FNID_GetAssociatedInterface, + KUSB_FNID_Clone, KUSB_FNID_QueryInterfaceSettings, + KUSB_FNID_QueryDeviceInformation, KUSB_FNID_SetCurrentAlternateSetting, + KUSB_FNID_GetCurrentAlternateSetting, KUSB_FNID_QueryPipe, + KUSB_FNID_SetPipePolicy, KUSB_FNID_GetPipePolicy, KUSB_FNID_ReadPipe, + KUSB_FNID_WritePipe, KUSB_FNID_ResetPipe, KUSB_FNID_AbortPipe, + KUSB_FNID_FlushPipe, KUSB_FNID_IsoReadPipe, KUSB_FNID_IsoWritePipe, + KUSB_FNID_GetCurrentFrameNumber, KUSB_FNID_GetOverlappedResult, + KUSB_FNID_GetProperty, + // Supported function count + KUSB_FNID_COUNT); + + KUSB_Init = function(var InterfaceHandle: KUSB_HANDLE; + const DevInfo: KLST_DEVINFO_HANDLE): Bool; stdcall; + + KUSB_Free = function(const InterfaceHandle: KUSB_HANDLE): Bool; stdcall; + + KUSB_ClaimInterface = function(const InterfaceHandle: KUSB_HANDLE; + const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall; + + KUSB_ReleaseInterface = function(const InterfaceHandle: KUSB_HANDLE; + const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall; + + KUSB_SetAltInterface = function(const InterfaceHandle: KUSB_HANDLE; + const NumberOrIndex: Byte; const IsIndex: Bool; + const AltSettingNumber: Byte): Bool; stdcall; + + KUSB_GetAltInterface = function(const InterfaceHandle: KUSB_HANDLE; + const NumberOrIndex: Byte; const IsIndex: Bool; + var AltSettingNumber: Byte): Bool; stdcall; + + KUSB_GetDescriptor = function(const InterfaceHandle: KUSB_HANDLE; + const DescriptorType: Byte; const Index: Byte; const LanguageID: Word; + var Buffer; const BufferLength: Cardinal; var LengthTransferred: Cardinal) + : Bool; stdcall; + + KUSB_ControlTransfer = function(const InterfaceHandle: KUSB_HANDLE; + const SetupPacket: WINUSB_SETUP_PACKET_INT64; const PBuffer: PByte; + //optional may be Nil + const BufferLength: Cardinal; const LengthTransferred: PCardinal; + //Optional may be Nil + const Overlapped: POverlapped //Optional + ): Bool; stdcall; + + KUSB_SetPowerPolicy = function(const InterfaceHandle: KUSB_HANDLE; + const PolicyType: Cardinal; const ValueLength: Cardinal; const Value) + : Bool; stdcall; + + KUSB_GetPowerPolicy = function(const InterfaceHandle: KUSB_HANDLE; + const PolicyType: Cardinal; var ValueLength: Cardinal; + //Input: Size of Value, output : copied bytes + var Value): Bool; stdcall; + + KUSB_SetConfiguration = function(const InterfaceHandle: KUSB_HANDLE; + const ConfigurationNumber: Byte): Bool; stdcall; + + KUSB_GetConfiguration = function(const InterfaceHandle: KUSB_HANDLE; + var ConfigurationNumber: Byte): Bool; stdcall; + + KUSB_ResetDevice = function(const InterfaceHandle: KUSB_HANDLE) + : Bool; stdcall; + + KUSB_Initialize = function(const DeviceHandle: KUSB_HANDLE; + var InterfaceHandle: KUSB_HANDLE): Bool; stdcall; + + KUSB_SelectInterface = function(const InterfaceHandle: KUSB_HANDLE; + const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall; + + KUSB_GetAssociatedInterface = function(const InterfaceHandle: KUSB_HANDLE; + const AssociatedInterfaceIndex: Byte; + var AssociatedInterfaceHandle: KUSB_HANDLE): Bool; stdcall; + + KUSB_Clone = function(const InterfaceHandle: KUSB_HANDLE; + var DstInterfaceHandle: KUSB_HANDLE): Bool; stdcall; + + KUSB_QueryInterfaceSettings = function(const InterfaceHandle: KUSB_HANDLE; + const AltSettingNumber: Byte; + var UsbAltInterfaceDescriptor: USB_INTERFACE_DESCRIPTOR): Bool; stdcall; + + KUSB_QueryDeviceInformation = function(const InterfaceHandle: KUSB_HANDLE; + const InformationType: Cardinal; var BufferLength: Cardinal; + // Input: Length of Buffer, copied Bytes in Buffer + var Buffer): Bool; stdcall; + + KUSB_SetCurrentAlternateSetting = function(const InterfaceHandle + : KUSB_HANDLE; const AltSettingNumber: Byte): Bool; stdcall; + + KUSB_GetCurrentAlternateSetting = function(const InterfaceHandle + : KUSB_HANDLE; var AltSettingNumber: Byte): Bool; stdcall; + + KUSB_QueryPipe = function(const InterfaceHandle: KUSB_HANDLE; + const AltSettingNumber: Byte; const PipeIndex: Byte; + var PipeInformation: WINUSB_PIPE_INFORMATION): Bool; stdcall; + + KUSB_SetPipePolicy = function(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte; const PolicyType: Cardinal; + const ValueLength: Cardinal; const Value): Bool; stdcall; + + KUSB_GetPipePolicy = function(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte; const PolicyType: Cardinal; var ValueLength: Cardinal; + // Input: Length of Value, copied Bytes in Value + var Value): Bool; stdcall; + + KUSB_ReadPipe = function(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte; var Buffer; const BufferLength: Cardinal; + const LengthTransferred: PCardinal; // optional may be Nil + const Overlapped: POverlapped //Optional + ): Bool; stdcall; + + KUSB_WritePipe = function(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte; const Buffer; const BufferLength: Cardinal; + const LengthTransferred: PCardinal; // optional may be Nil + const Overlapped: POverlapped //Optional + ): Bool; stdcall; + + KUSB_ResetPipe = function(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte): Bool; stdcall; + + KUSB_AbortPipe = function(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte): Bool; stdcall; + + KUSB_FlushPipe = function(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte): Bool; stdcall; + + KUSB_IsoReadPipe = function(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte; var Buffer; const BufferLength: Cardinal; + const Overlapped: POverlapped; //Optional + const IsoContext: PKISO_CONTEXT // optional + ): Bool; stdcall; + + KUSB_IsoWritePipe = function(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte; const Buffer; const BufferLength: Cardinal; + const Overlapped: POverlapped; //Optional + const IsoContext: PKISO_CONTEXT // optional + ): Bool; stdcall; + + KUSB_GetCurrentFrameNumber = function(const InterfaceHandle: KUSB_HANDLE; + var FrameNumber: Cardinal): Bool; stdcall; + + KUSB_GetOverlappedResult = function(const InterfaceHandle: KUSB_HANDLE; + const lpOverlapped: POverlapped; //Optional + var lpNumberOfBytesTransferred: Cardinal; const bWait: Bool) + : Bool; stdcall; + + KUSB_GetProperty = function(const InterfaceHandle: KUSB_HANDLE; + const PropertyType: KUSB_PROPERTY; var PropertySize: Cardinal; + // Input: Length of Property Buffer, copied Bytes in Property Buffer + var TheProperty + // Parameter name changed, since "property" is a reserved word in Delphi + ): Bool; stdcall; + + // Driver API function set structure. + PKUSB_DRIVER_API = ^KUSB_DRIVER_API; + + KUSB_DRIVER_API = packed record + Info: KUSB_DRIVER_API_INFO; + Init: KUSB_Init; + Free: KUSB_Free; + ClaimInterface: KUSB_ClaimInterface; + ReleaseInterface: KUSB_ReleaseInterface; + SetAltInterface: KUSB_SetAltInterface; + GetAltInterface: KUSB_GetAltInterface; + GetDescriptor: KUSB_GetDescriptor; + ControlTransfer: KUSB_ControlTransfer; + SetPowerPolicy: KUSB_SetPowerPolicy; + GetPowerPolicy: KUSB_GetPowerPolicy; + SetConfiguration: KUSB_SetConfiguration; + GetConfiguration: KUSB_GetConfiguration; + ResetDevice: KUSB_ResetDevice; + Initialize: KUSB_Initialize; + SelectInterface: KUSB_SelectInterface; + GetAssociatedInterface: KUSB_GetAssociatedInterface; + Clone: KUSB_Clone; + QueryInterfaceSettings: KUSB_QueryInterfaceSettings; + QueryDeviceInformation: KUSB_QueryDeviceInformation; + SetCurrentAlternateSetting: KUSB_SetCurrentAlternateSetting; + GetCurrentAlternateSetting: KUSB_GetCurrentAlternateSetting; + QueryPipe: KUSB_QueryPipe; + SetPipePolicy: KUSB_SetPipePolicy; + GetPipePolicy: KUSB_GetPipePolicy; + ReadPipe: KUSB_ReadPipe; + WritePipe: KUSB_WritePipe; + ResetPipe: KUSB_ResetPipe; + AbortPipe: KUSB_AbortPipe; + FlushPipe: KUSB_FlushPipe; + IsoReadPipe: KUSB_IsoReadPipe; + IsoWritePipe: KUSB_IsoWritePipe; + GetCurrentFrameNumber: KUSB_GetCurrentFrameNumber; + GetOverlappedResult: KUSB_GetOverlappedResult; + GetProperty: KUSB_GetProperty; + // fixed structure padding. + z_F_i_x_e_d: array [0 .. 512 - SizeOf(KUSB_DRIVER_API_INFO) - + (SizeOf(pointer) * Ord(KUSB_FNID_COUNT)) - 1] of Byte; + end; + + // StmK + + type + + KSTM_FLAG = Cardinal; + + KSTM_COMPLETE_RESULT = Cardinal; + + const + + KSTM_FLAG_NONE = 0; + KSTM_FLAG_USE_TIMEOUT = $80000000; + KSTM_FLAG_NO_PARTIAL_XFERS = $00100000; + KSTM_FLAG_TIMEOUT_MASK = $0001FFFF; + + KSTM_COMPLETE_RESULT_VALID = 0; + KSTM_COMPLETE_RESULT_INVALID = 1; + + type + + PKSTM_XFER_CONTEXT = ^KSTM_XFER_CONTEXT; + + KSTM_XFER_CONTEXT = packed record + Buffer: PByte; + BufferSize: Integer; + TransferLength: Integer; + UserState: pointer; + end; + + PKSTM_INFO = ^KSTM_INFO; + + KSTM_INFO = packed record + UsbHandle: KUSB_HANDLE; + PipeId: Byte; + MaxPendingTransfers: Integer; + MaxTransferSize: Integer; + MaxPendingIO: Integer; + EndpointDescriptor: USB_ENDPOINT_DESCRIPTOR; + DriverAPI: KUSB_DRIVER_API; + DeviceHandle: THandle; + StreamHandle: KSTM_HANDLE; + UserState: pointer; + end; + + PInteger = ^Integer; + + KSTM_ERROR_CB = function(const StreamInfo: PKSTM_INFO; + const XferContext: PKSTM_XFER_CONTEXT; const XferContextIndex: Integer; + const ErrorCode: Integer): Integer; stdcall; + KSTM_SUBMIT_CB = function(const StreamInfo: PKSTM_INFO; + const XferContext: PKSTM_XFER_CONTEXT; const XferContextIndex: Integer; + Overlapped: POverlapped): Integer; stdcall; + KSTM_STARTED_CB = function(const StreamInfo: PKSTM_INFO; + const XferContext: PKSTM_XFER_CONTEXT; const XferContextIndex: Integer) + : Integer; stdcall; + KSTM_STOPPED_CB = function(const StreamInfo: PKSTM_INFO; + const XferContext: PKSTM_XFER_CONTEXT; const XferContextIndex: Integer) + : Integer; stdcall; + KSTM_COMPLETE_CB = function(const StreamInfo: PKSTM_INFO; + const XferContext: PKSTM_XFER_CONTEXT; const XferContextIndex: Integer; + const ErrorCode: Integer): Integer; stdcall; + KSTM_BEFORE_COMPLETE_CB = function(const StreamInfo: PKSTM_INFO; + const XferContext: PKSTM_XFER_CONTEXT; const XferContextIndex: Integer; + const ErrorCode: PInteger): KSTM_COMPLETE_RESULT; stdcall; + + PKSTM_CALLBACK = ^KSTM_CALLBACK; + + KSTM_CALLBACK = packed record + Error: KSTM_ERROR_CB; + Submit: KSTM_SUBMIT_CB; + Complete: KSTM_COMPLETE_CB; + Started: KSTM_STARTED_CB; + Stopped: KSTM_STOPPED_CB; + BeforeComplete: KSTM_BEFORE_COMPLETE_CB; + z_F_i_x_e_d: array [0 .. (64 - SizeOf(pointer) * 6) - 1] of Byte; + end; + + KOVL_POOL_FLAG = (KOVL_POOL_FLAG_NONE); + KOVL_WAIT_FLAG = Cardinal; + + const + + KOVL_WAIT_FLAG_NONE = 0; + KOVL_WAIT_FLAG_RELEASE_ON_SUCCESS = $0001; + KOVL_WAIT_FLAG_RELEASE_ON_FAIL = $0002; + KOVL_WAIT_FLAG_RELEASE_ON_SUCCESS_FAIL = $0003; + KOVL_WAIT_FLAG_CANCEL_ON_TIMEOUT = $0004; + KOVL_WAIT_FLAG_RELEASE_ON_TIMEOUT = $000C; + KOVL_WAIT_FLAG_RELEASE_ALWAYS = $000F; + KOVL_WAIT_FLAG_ALERTABLE = $0010; + + var + + DllAvailable: Boolean; + + {$IFDEF DynamicLink} + + var + + HLIBUSBKDll: THandle; + + HotK_Init: function(var Handle: KHOT_HANDLE; const InitParams: PKHOT_PARAMS) + : Bool; stdcall; + HotK_Free: function(const Handle: KHOT_HANDLE): Bool; stdcall; + HotK_FreeAll: procedure; stdcall; + IsoK_EnumPackets: function(const IsoContext: PKISO_CONTEXT; + const EnumPackets: KISO_ENUM_PACKETS_CB; const StartPacketIndex: Integer; + const UserState): Bool; stdcall; + IsoK_Free: function(const IsoContext: PKISO_CONTEXT): Bool; stdcall; + IsoK_GetPacket: function(const IsoContext: PKISO_CONTEXT; + const PacketIndex: Integer; const IsoPacket: PKISO_PACKET): Bool; stdcall; + IsoK_Init: function(var IsoContext: PKISO_CONTEXT; + const NumberOfPackets: Integer; const StartFrame: Integer): Bool; stdcall; + IsoK_ReUse: function(const IsoContext: PKISO_CONTEXT): Bool; stdcall; + IsoK_SetPacket: function(const IsoContext: PKISO_CONTEXT; + const PacketIndex: Integer; const IsoPacket: PKISO_PACKET): Bool; stdcall; + IsoK_SetPackets: function(const IsoContext: PKISO_CONTEXT; + const PacketSize: Integer): Bool; stdcall; + LibK_CopyDriverAPI: function: Bool; stdcall; + LibK_GetContext: function(const Handle: KLIB_HANDLE; + const HandleType: KLIB_HANDLE_TYPE): KLIB_USER_CONTEXT; stdcall; + LibK_GetProcAddress: function: Bool; stdcall; + LibK_GetVersion: function: Bool; stdcall; + LibK_LoadDriverAPI: function(var DriverAPI: KUSB_DRIVER_API; + const DriverID: Integer): Bool; stdcall; + LibK_SetCleanupCallback: function: Bool; stdcall; + LibK_SetContext: function(const Handle: KLIB_HANDLE; + const HandleType: KLIB_HANDLE_TYPE; const ContextValue: KLIB_USER_CONTEXT) + : Bool; stdcall; + LibK_SetDefaultContext: function(const HandleType: KLIB_HANDLE_TYPE; + const UserContext: KLIB_USER_CONTEXT): Bool; stdcall; + LibK_GetDefaultContext: function(const HandleType: KLIB_HANDLE_TYPE) + : KLIB_USER_CONTEXT; stdcall; + LstK_AttachInfo: function: Bool; stdcall; + LstK_Clone: function(const InterfaceHandle: KUSB_HANDLE; + var DstInterfaceHandle: KUSB_HANDLE): Bool; stdcall; + LstK_CloneInfo: function: Bool; stdcall; + LstK_Count: function(const DeviceList: KLST_HANDLE; var Count: Cardinal) + : Bool; stdcall; + LstK_Current: function: Bool; stdcall; + LstK_DetachInfo: function: Bool; stdcall; + LstK_Enumerate: function: Bool; stdcall; + LstK_FindByVidPid: function(const DeviceList: KLST_HANDLE; + const Vid: Integer; const Pid: Integer; + var DeviceInfo: KLST_DEVINFO_HANDLE): Bool; stdcall; + LstK_Free: function(const DeviceList: KLST_HANDLE): Bool; stdcall; + LstK_FreeInfo: function: Bool; stdcall; + LstK_Init: function(var DeviceList: KLST_HANDLE; const Flags: KLST_FLAG) + : Bool; stdcall; + LstK_InitEx: function(var DeviceList: KLST_HANDLE; const Flags: KLST_FLAG; + const PatternMatch: PKLST_PATTERN_MATCH): Bool; stdcall; + LstK_MoveNext: function(const DeviceList: KLST_HANDLE; + var DevInfo: KLST_DEVINFO_HANDLE): Bool; stdcall; + LstK_MoveReset: function(const DeviceList: KLST_HANDLE): Bool; stdcall; + LstK_Sync: function: Bool; stdcall; + OvlK_Acquire: function(var OverlappedK: KOVL_HANDLE; + const PoolHandle: KOVL_POOL_HANDLE): Bool; stdcall; + OvlK_Free: function(const PoolHandle: KOVL_POOL_HANDLE): Bool; stdcall; + OvlK_GetEventHandle: function: Bool; stdcall; + OvlK_Init: function(var PoolHandle: KOVL_POOL_HANDLE; + const UsbHandle: KUSB_HANDLE; const MaxOverlappedCount: Integer; + const Flags: KOVL_POOL_FLAG): Bool; stdcall; + OvlK_IsComplete: function: Bool; stdcall; + OvlK_ReUse: function(const OverlappedK: KOVL_HANDLE): Bool; stdcall; + OvlK_Release: function(const OverlappedK: KOVL_HANDLE): Bool; stdcall; + OvlK_Wait: function(const OverlappedK: KOVL_HANDLE; + const TimeoutMS: Integer; const WaitFlags: KOVL_WAIT_FLAG; + var TransferredLength: Cardinal): Bool; stdcall; + OvlK_WaitOldest: function(const PoolHandle: KOVL_POOL_HANDLE; + var OverlappedK: KOVL_HANDLE; const TimeoutMS: Integer; + const WaitFlags: KOVL_WAIT_FLAG; var TransferredLength: Cardinal) + : Bool; stdcall; + OvlK_WaitAndRelease: function(const OverlappedK: KOVL_HANDLE; + const TimeoutMS: Integer; var TransferredLength: Cardinal): Bool; stdcall; + OvlK_WaitOrCancel: function(const OverlappedK: KOVL_HANDLE; + const TimeoutMS: Integer; var TransferredLength: Cardinal): Bool; stdcall; + StmK_Free: function(const StreamHandle: KSTM_HANDLE): Bool; stdcall; + StmK_Init: function(var StreamHandle: KSTM_HANDLE; + const UsbHandle: KUSB_HANDLE; const PipeId: Byte; + const MaxTransferSize: Integer; const MaxPendingTransfers: Integer; + const MaxPendingIO: Integer; const Callbacks: PKSTM_CALLBACK; + const Flags: KSTM_FLAG): Bool; stdcall; + StmK_Read: function(const StreamHandle: KSTM_HANDLE; var Buffer; + const Offset: Integer; const Length: Integer; + var TransferredLength: Cardinal): Bool; stdcall; + StmK_Start: function(const StreamHandle: KSTM_HANDLE): Bool; stdcall; + StmK_Stop: function(const StreamHandle: KSTM_HANDLE; + const TimeoutCancelMS: Integer): Bool; stdcall; + StmK_Write: function(const StreamHandle: KSTM_HANDLE; const Buffer; + const Offset: Integer; const Length: Integer; + var TransferredLength: Cardinal): Bool; stdcall; + UsbK_AbortPipe: function(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte): Bool; stdcall; + UsbK_ClaimInterface: function(const InterfaceHandle: KUSB_HANDLE; + const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall; + UsbK_Clone: function(const InterfaceHandle: KUSB_HANDLE; + var DstInterfaceHandle: KUSB_HANDLE): Bool; stdcall; + UsbK_ControlTransfer: function(const InterfaceHandle: KUSB_HANDLE; + const SetupPacket: WINUSB_SETUP_PACKET_INT64; var Buffer; + const BufferLength: Cardinal; const LengthTransferred: PCardinal; + //Optional may be Nil + const Overlapped: POverlapped): Bool; stdcall; + UsbK_FlushPipe: function: Bool; stdcall; + UsbK_Free: function(const InterfaceHandle: KUSB_HANDLE): Bool; stdcall; + UsbK_GetAltInterface: function(const InterfaceHandle: KUSB_HANDLE; + const NumberOrIndex: Byte; const IsIndex: Bool; + var AltSettingNumber: Byte): Bool; stdcall; + UsbK_GetAssociatedInterface: function: Bool; stdcall; + UsbK_GetConfiguration: function: Bool; stdcall; + UsbK_GetCurrentAlternateSetting: function: Bool; stdcall; + UsbK_GetCurrentFrameNumber: function(const InterfaceHandle: KUSB_HANDLE; + var FrameNumber: Cardinal): Bool; stdcall; + UsbK_GetDescriptor: function(const InterfaceHandle: KUSB_HANDLE; + const DescriptorType: Byte; const Index: Byte; const LanguageID: Word; + var Buffer; const BufferLength: Cardinal; var LengthTransferred: Cardinal) + : Bool; stdcall; + UsbK_GetOverlappedResult: function: Bool; stdcall; + UsbK_GetPipePolicy: function: Bool; stdcall; + UsbK_GetPowerPolicy: function: Bool; stdcall; + UsbK_GetProperty: function: Bool; stdcall; + UsbK_Init: function(var InterfaceHandle: KUSB_HANDLE; + const DevInfo: KLST_DEVINFO_HANDLE): Bool; stdcall; + UsbK_Initialize: function: Bool; stdcall; + UsbK_IsoReadPipe: function(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte; var Buffer; const BufferLength: Cardinal; + const Overlapped: POverlapped; const IsoContext: PKISO_CONTEXT) + : Bool; stdcall; + UsbK_IsoWritePipe: function: Bool; stdcall; + UsbK_QueryDeviceInformation: function: Bool; stdcall; + UsbK_QueryInterfaceSettings: function(const InterfaceHandle: KUSB_HANDLE; + const AltSettingNumber: Byte; + var UsbAltInterfaceDescriptor: USB_INTERFACE_DESCRIPTOR): Bool; stdcall; + UsbK_QueryPipe: function(const InterfaceHandle: KUSB_HANDLE; + const AltSettingNumber: Byte; const PipeIndex: Byte; + var PipeInformation: WINUSB_PIPE_INFORMATION): Bool; stdcall; + UsbK_ReadPipe: function(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte; var Buffer; const BufferLength: Cardinal; + const LengthTransferred: PCardinal; //Optional may be Nil + const Overlapped: POverlapped): Bool; stdcall; + UsbK_ReleaseInterface: function(const InterfaceHandle: KUSB_HANDLE; + const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall; + UsbK_ResetDevice: function: Bool; stdcall; + UsbK_ResetPipe: function(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte): Bool; stdcall; + UsbK_SelectInterface: function(const InterfaceHandle: KUSB_HANDLE; + const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall; + UsbK_SetAltInterface: function(const InterfaceHandle: KUSB_HANDLE; + const NumberOrIndex: Byte; const IsIndex: Bool; + const AltSettingNumber: Byte): Bool; stdcall; + UsbK_SetConfiguration: function(const InterfaceHandle: KUSB_HANDLE; + const ConfigurationNumber: Byte): Bool; stdcall; + UsbK_SetCurrentAlternateSetting + : function(const InterfaceHandle: KUSB_HANDLE; + const AltSettingNumber: Byte): Bool; stdcall; + UsbK_SetPipePolicy: function(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte; const PolicyType: Cardinal; + const ValueLength: Cardinal; const Value): Bool; stdcall; + UsbK_SetPowerPolicy: function: Bool; stdcall; + + UsbK_WritePipe: function(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte; var Buffer; const BufferLength: Cardinal; + const LengthTransferred: PCardinal; + const Overlapped: POverlapped): Bool; stdcall; + + WinUsb_AbortPipe: function: Bool; stdcall; + WinUsb_ControlTransfer: function: Bool; stdcall; + WinUsb_FlushPipe: function: Bool; stdcall; + WinUsb_Free: function: Bool; stdcall; + WinUsb_GetAssociatedInterface: function: Bool; stdcall; + WinUsb_GetCurrentAlternateSetting: function: Bool; stdcall; + WinUsb_GetDescriptor: function: Bool; stdcall; + WinUsb_GetOverlappedResult: function: Bool; stdcall; + WinUsb_GetPipePolicy: function: Bool; stdcall; + WinUsb_GetPowerPolicy: function: Bool; stdcall; + WinUsb_Initialize: function: Bool; stdcall; + WinUsb_QueryDeviceInformation: function: Bool; stdcall; + WinUsb_QueryInterfaceSettings: function: Bool; stdcall; + WinUsb_QueryPipe: function: Bool; stdcall; + WinUsb_ReadPipe: function: Bool; stdcall; + WinUsb_ResetPipe: function: Bool; stdcall; + WinUsb_SetCurrentAlternateSetting: function: Bool; stdcall; + WinUsb_SetPipePolicy: function: Bool; stdcall; + WinUsb_SetPowerPolicy: function: Bool; stdcall; + WinUsb_WritePipe: function: Bool; stdcall; + + {$ELSE} + function HotK_Init(var Handle: KHOT_HANDLE; const InitParams: PKHOT_PARAMS) + : Bool; stdcall; external LIBUSBK_DLL name 'HotK_Init'; + function HotK_Free(const Handle: KHOT_HANDLE): Bool; stdcall; + external LIBUSBK_DLL name 'HotK_Free'; + procedure HotK_FreeAll; stdcall; external LIBUSBK_DLL name 'HotK_FreeAll'; + function IsoK_EnumPackets(const IsoContext: PKISO_CONTEXT; + const EnumPackets: KISO_ENUM_PACKETS_CB; const StartPacketIndex: Integer; + const UserState): Bool; stdcall; + external LIBUSBK_DLL name 'IsoK_EnumPackets'; + function IsoK_Free(const IsoContext: PKISO_CONTEXT): Bool; stdcall; + external LIBUSBK_DLL name 'IsoK_Free'; + function IsoK_GetPacket(const IsoContext: PKISO_CONTEXT; + const PacketIndex: Integer; const IsoPacket: PKISO_PACKET): Bool; stdcall; + external LIBUSBK_DLL name 'IsoK_GetPacket'; + function IsoK_Init(var IsoContext: PKISO_CONTEXT; + const NumberOfPackets: Integer; const StartFrame: Integer): Bool; stdcall; + external LIBUSBK_DLL name 'IsoK_Init'; + function IsoK_ReUse(const IsoContext: PKISO_CONTEXT): Bool; stdcall; + external LIBUSBK_DLL name 'IsoK_ReUse'; + function IsoK_SetPacket(const IsoContext: PKISO_CONTEXT; + const PacketIndex: Integer; const IsoPacket: PKISO_PACKET): Bool; stdcall; + external LIBUSBK_DLL name 'IsoK_SetPacket'; + function IsoK_SetPackets(const IsoContext: PKISO_CONTEXT; + const PacketSize: Integer): Bool; stdcall; + external LIBUSBK_DLL name 'IsoK_SetPackets'; + function LibK_CopyDriverAPI: Bool; stdcall; + external LIBUSBK_DLL name 'LibK_CopyDriverAPI'; + function LibK_GetContext(const Handle: KLIB_HANDLE; + const HandleType: KLIB_HANDLE_TYPE): KLIB_USER_CONTEXT; stdcall; + external LIBUSBK_DLL name 'LibK_GetContext'; + function LibK_GetProcAddress: Bool; stdcall; + external LIBUSBK_DLL name 'LibK_GetProcAddress'; + function LibK_GetVersion: Bool; stdcall; + external LIBUSBK_DLL name 'LibK_GetVersion'; + function LibK_LoadDriverAPI(var DriverAPI: KUSB_DRIVER_API; + const DriverID: Integer): Bool; stdcall; + external LIBUSBK_DLL name 'LibK_LoadDriverAPI'; + function LibK_SetCleanupCallback: Bool; stdcall; + external LIBUSBK_DLL name 'LibK_SetCleanupCallback'; + function LibK_SetContext(const Handle: KLIB_HANDLE; + const HandleType: KLIB_HANDLE_TYPE; const ContextValue: KLIB_USER_CONTEXT) + : Bool; stdcall; external LIBUSBK_DLL name 'LibK_SetContext'; + function LibK_SetDefaultContext(const HandleType: KLIB_HANDLE_TYPE; + const UserContext: KLIB_USER_CONTEXT): Bool; stdcall; + external LIBUSBK_DLL name 'LibK_SetDefaultContext'; + function LibK_GetDefaultContext(const HandleType: KLIB_HANDLE_TYPE) + : KLIB_USER_CONTEXT; stdcall; + external LIBUSBK_DLL name 'LibK_GetDefaultContext'; + function LstK_AttachInfo: Bool; stdcall; + external LIBUSBK_DLL name 'LstK_AttachInfo'; + function LstK_Clone(const InterfaceHandle: KUSB_HANDLE; + var DstInterfaceHandle: KUSB_HANDLE): Bool; stdcall; + external LIBUSBK_DLL name 'LstK_Clone'; + function LstK_CloneInfo: Bool; stdcall; + external LIBUSBK_DLL name 'LstK_CloneInfo'; + function LstK_Count(const DeviceList: KLST_HANDLE; var Count: Cardinal): Bool; + stdcall; external LIBUSBK_DLL name 'LstK_Count'; + function LstK_Current: Bool; stdcall; + external LIBUSBK_DLL name 'LstK_Current'; + function LstK_DetachInfo: Bool; stdcall; + external LIBUSBK_DLL name 'LstK_Current'; + function LstK_Enumerate: Bool; stdcall; + external LIBUSBK_DLL name 'LstK_Enumerate'; + function LstK_FindByVidPid(const DeviceList: KLST_HANDLE; const Vid: Integer; + const Pid: Integer; var DeviceInfo: KLST_DEVINFO_HANDLE): Bool; stdcall; + external LIBUSBK_DLL name 'LstK_FindByVidPid'; + function LstK_Free(const DeviceList: KLST_HANDLE): Bool; stdcall; + external LIBUSBK_DLL name 'LstK_Free'; + function LstK_FreeInfo: Bool; stdcall; + external LIBUSBK_DLL name 'LstK_FreeInfo'; + function LstK_Init(var DeviceList: KLST_HANDLE; const Flags: KLST_FLAG): Bool; + stdcall; external LIBUSBK_DLL name 'LstK_Init'; + function LstK_InitEx(var DeviceList: KLST_HANDLE; const Flags: KLST_FLAG; + const PatternMatch: PKLST_PATTERN_MATCH): Bool; stdcall; + external LIBUSBK_DLL name 'LstK_InitEx'; + function LstK_MoveNext(const DeviceList: KLST_HANDLE; + var DevInfo: KLST_DEVINFO_HANDLE): Bool; stdcall; + external LIBUSBK_DLL name 'LstK_MoveNext'; + function LstK_MoveReset(const DeviceList: KLST_HANDLE): Bool; stdcall; + external LIBUSBK_DLL name 'LstK_MoveReset'; + function LstK_Sync: Bool; stdcall; external LIBUSBK_DLL name 'LstK_Sync'; + function OvlK_Acquire(var OverlappedK: KOVL_HANDLE; + const PoolHandle: KOVL_POOL_HANDLE): Bool; stdcall; + external LIBUSBK_DLL name 'OvlK_Acquire'; + function OvlK_Free(const PoolHandle: KOVL_POOL_HANDLE): Bool; stdcall; + external LIBUSBK_DLL name 'OvlK_Free'; + function OvlK_GetEventHandle: Bool; stdcall; + external LIBUSBK_DLL name 'OvlK_GetEventHandle'; + function OvlK_Init(var PoolHandle: KOVL_POOL_HANDLE; + const UsbHandle: KUSB_HANDLE; const MaxOverlappedCount: Integer; + const Flags: KOVL_POOL_FLAG): Bool; stdcall; + external LIBUSBK_DLL name 'OvlK_Init'; + function OvlK_IsComplete: Bool; stdcall; + external LIBUSBK_DLL name 'OvlK_IsComplete'; + function OvlK_ReUse(const OverlappedK: KOVL_HANDLE): Bool; stdcall; + external LIBUSBK_DLL name 'OvlK_ReUse'; + function OvlK_Release(const OverlappedK: KOVL_HANDLE): Bool; stdcall; + external LIBUSBK_DLL name 'OvlK_Release'; + function OvlK_Wait(const OverlappedK: KOVL_HANDLE; const TimeoutMS: Integer; + const WaitFlags: KOVL_WAIT_FLAG; var TransferredLength: Cardinal): Bool; + stdcall; external LIBUSBK_DLL name 'OvlK_Wait'; + function OvlK_WaitOldest(const PoolHandle: KOVL_POOL_HANDLE; + var OverlappedK: KOVL_HANDLE; const TimeoutMS: Integer; + const WaitFlags: KOVL_WAIT_FLAG; var TransferredLength: Cardinal): Bool; + stdcall; external LIBUSBK_DLL name 'OvlK_WaitOldest'; + function OvlK_WaitAndRelease(const OverlappedK: KOVL_HANDLE; + const TimeoutMS: Integer; var TransferredLength: Cardinal): Bool; stdcall; + external LIBUSBK_DLL name 'OvlK_WaitAndRelease'; + function OvlK_WaitOrCancel(const OverlappedK: KOVL_HANDLE; + const TimeoutMS: Integer; var TransferredLength: Cardinal): Bool; stdcall; + external LIBUSBK_DLL name 'OvlK_WaitOrCancel'; + function StmK_Free(const StreamHandle: KSTM_HANDLE): Bool; stdcall; + external LIBUSBK_DLL name 'StmK_Free'; + function StmK_Init(var StreamHandle: KSTM_HANDLE; + const UsbHandle: KUSB_HANDLE; const PipeId: Byte; + const MaxTransferSize: Integer; const MaxPendingTransfers: Integer; + const MaxPendingIO: Integer; const Callbacks: PKSTM_CALLBACK; + const Flags: KSTM_FLAG): Bool; stdcall; + external LIBUSBK_DLL name 'StmK_Init'; + function StmK_Read(const StreamHandle: KSTM_HANDLE; var Buffer; + const Offset: Integer; const Length: Integer; + var TransferredLength: Cardinal): Bool; stdcall; + external LIBUSBK_DLL name 'StmK_Read'; + function StmK_Start(const StreamHandle: KSTM_HANDLE): Bool; stdcall; + external LIBUSBK_DLL name 'StmK_Start'; + function StmK_Stop(const StreamHandle: KSTM_HANDLE; + const TimeoutCancelMS: Integer): Bool; stdcall; + external LIBUSBK_DLL name 'StmK_Stop'; + function StmK_Write(const StreamHandle: KSTM_HANDLE; const Buffer; + const Offset: Integer; const Length: Integer; + var TransferredLength: Cardinal): Bool; stdcall; + external LIBUSBK_DLL name 'StmK_Write'; + function UsbK_AbortPipe(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte): Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_AbortPipe'; + function UsbK_ClaimInterface(const InterfaceHandle: KUSB_HANDLE; + const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_ClaimInterface'; + function UsbK_Clone(const InterfaceHandle: KUSB_HANDLE; + var DstInterfaceHandle: KUSB_HANDLE): Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_Clone'; + function UsbK_ControlTransfer(const InterfaceHandle: KUSB_HANDLE; + const SetupPacket: WINUSB_SETUP_PACKET_INT64; var Buffer; + const BufferLength: Cardinal; const LengthTransferred: PCardinal; + //Optional may be Nil + const Overlapped: POverlapped): Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_ControlTransfer'; + function UsbK_FlushPipe: Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_FlushPipe'; + function UsbK_Free(const InterfaceHandle: KUSB_HANDLE): Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_Free'; + function UsbK_GetAltInterface(const InterfaceHandle: KUSB_HANDLE; + const NumberOrIndex: Byte; const IsIndex: Bool; var AltSettingNumber: Byte) + : Bool; stdcall; external LIBUSBK_DLL name 'UsbK_GetAltInterface'; + function UsbK_GetAssociatedInterface: Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_GetAssociatedInterface'; + function UsbK_GetConfiguration: Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_GetConfiguration'; + function UsbK_GetCurrentAlternateSetting: Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_GetCurrentAlternateSetting'; + function UsbK_GetCurrentFrameNumber(const InterfaceHandle: KUSB_HANDLE; + var FrameNumber: Cardinal): Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_GetCurrentFrameNumber'; + function UsbK_GetDescriptor(const InterfaceHandle: KUSB_HANDLE; + const DescriptorType: Byte; const Index: Byte; const LanguageID: Word; + var Buffer; const BufferLength: Cardinal; var LengthTransferred: Cardinal) + : Bool; stdcall; external LIBUSBK_DLL name 'UsbK_GetDescriptor'; + function UsbK_GetOverlappedResult: Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_GetOverlappedResult'; + function UsbK_GetPipePolicy: Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_GetPipePolicy'; + function UsbK_GetPowerPolicy: Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_GetPowerPolicy'; + function UsbK_GetProperty: Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_GetProperty'; + function UsbK_Init(var InterfaceHandle: KUSB_HANDLE; + const DevInfo: KLST_DEVINFO_HANDLE): Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_Init'; + function UsbK_Initialize: Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_Initialize'; + function UsbK_IsoReadPipe(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte; var Buffer; const BufferLength: Cardinal; + const Overlapped: POverlapped; const IsoContext: PKISO_CONTEXT): Bool; + stdcall; external LIBUSBK_DLL name 'UsbK_IsoReadPipe'; + function UsbK_IsoWritePipe: Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_IsoWritePipe'; + function UsbK_QueryDeviceInformation: Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_QueryDeviceInformation'; + function UsbK_QueryInterfaceSettings(const InterfaceHandle: KUSB_HANDLE; + const AltSettingNumber: Byte; + var UsbAltInterfaceDescriptor: USB_INTERFACE_DESCRIPTOR): Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_QueryInterfaceSettings'; + function UsbK_QueryPipe(const InterfaceHandle: KUSB_HANDLE; + const AltSettingNumber: Byte; const PipeIndex: Byte; + var PipeInformation: WINUSB_PIPE_INFORMATION): Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_QueryPipe'; + function UsbK_ReadPipe(const InterfaceHandle: KUSB_HANDLE; const PipeId: Byte; + var Buffer; const BufferLength: Cardinal; + const LengthTransferred: PCardinal; //Optional may be Nil + const Overlapped: POverlapped): Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_ReadPipe'; + function UsbK_ReleaseInterface(const InterfaceHandle: KUSB_HANDLE; + const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_ReleaseInterface'; + function UsbK_ResetDevice: Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_ResetDevice'; + function UsbK_ResetPipe(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte): Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_ResetPipe'; + function UsbK_SelectInterface(const InterfaceHandle: KUSB_HANDLE; + const NumberOrIndex: Byte; const IsIndex: Bool): Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_SelectInterface'; + function UsbK_SetAltInterface(const InterfaceHandle: KUSB_HANDLE; + const NumberOrIndex: Byte; const IsIndex: Bool; + const AltSettingNumber: Byte): Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_SetAltInterface'; + function UsbK_SetConfiguration(const InterfaceHandle: KUSB_HANDLE; + const ConfigurationNumber: Byte): Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_SetConfiguration'; + function UsbK_SetCurrentAlternateSetting(const InterfaceHandle: KUSB_HANDLE; + const AltSettingNumber: Byte): Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_SetCurrentAlternateSetting'; + function UsbK_SetPipePolicy(const InterfaceHandle: KUSB_HANDLE; + const PipeId: Byte; const PolicyType: Cardinal; const ValueLength: Cardinal; + const Value): Bool; stdcall; external LIBUSBK_DLL name 'UsbK_SetPipePolicy'; + + function UsbK_SetPowerPolicy: Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_SetPowerPolicy'; + + function UsbK_WritePipe(const InterfaceHandle: KUSB_HANDLE; const PipeId: Byte; + var Buffer; const BufferLength: Cardinal; + const LengthTransferred: PCardinal; + const Overlapped: POverlapped): Bool; stdcall; + external LIBUSBK_DLL name 'UsbK_WritePipe'; + + function WinUsb_AbortPipe: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_AbortPipe'; + function WinUsb_ControlTransfer: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_ControlTransfer'; + function WinUsb_FlushPipe: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_FlushPipe'; + function WinUsb_Free: Bool; stdcall; external LIBUSBK_DLL name 'WinUsb_Free'; + function WinUsb_GetAssociatedInterface: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_GetAssociatedInterface'; + function WinUsb_GetCurrentAlternateSetting: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_GetCurrentAlternateSetting'; + function WinUsb_GetDescriptor: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_GetDescriptor'; + function WinUsb_GetOverlappedResult: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_GetOverlappedResult'; + function WinUsb_GetPipePolicy: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_GetPipePolicy'; + function WinUsb_GetPowerPolicy: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_GetPowerPolicy'; + function WinUsb_Initialize: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_Initialize'; + function WinUsb_QueryDeviceInformation: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_QueryDeviceInformation'; + function WinUsb_QueryInterfaceSettings: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_QueryInterfaceSettings'; + function WinUsb_QueryPipe: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_QueryPipe'; + function WinUsb_ReadPipe: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_ReadPipe'; + function WinUsb_ResetPipe: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_ResetPipe'; + function WinUsb_SetCurrentAlternateSetting: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_SetCurrentAlternateSetting'; + function WinUsb_SetPipePolicy: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_SetPipePolicy'; + function WinUsb_SetPowerPolicy: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_SetPowerPolicy'; + function WinUsb_WritePipe: Bool; stdcall; + external LIBUSBK_DLL name 'WinUsb_WritePipe'; + + {$ENDIF} + function GetIsoPacketFromIsoContext(const AIsoContext: PKISO_CONTEXT; + const AIndex: Integer): PKISO_PACKET; + + function UsbK_InitFromDevicePath(const ADevicePath: String; + var InterfaceHandle: KUSB_HANDLE): Boolean; + + function USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX(const DescriptorType: Byte; + const Index: Byte): Word; + +implementation + + function GetIsoPacketFromIsoContext(const AIsoContext: PKISO_CONTEXT; + const AIndex: Integer): PKISO_PACKET; + begin + if not Assigned(AIsoContext) or (AIndex < 0) or + (AIndex >= AIsoContext.NumberOfPackets) then + Result:= Nil + else + Result:= @PKISO_PACKET_ARRAY(@AIsoContext.IsoPackets)^[AIndex]; + // isoCtx.IsoPackets[posPacket]; + end; + + function UsbK_InitFromDevicePath(const ADevicePath: String; + var InterfaceHandle: KUSB_HANDLE): Boolean; + var + deviceCount: Cardinal; + lDeviceList: KLST_HANDLE; + lDeviceInfo: KLST_DEVINFO_HANDLE; + begin + Result:= False; + if not DllAvailable then + Exit; + InterfaceHandle:= Nil; + deviceCount:= 0; + lDeviceList:= Nil; + lDeviceInfo:= Nil; + // Get the device list + if (not LstK_Init(lDeviceList, 0)) then + Exit; + try + LstK_Count(lDeviceList, deviceCount); + if (deviceCount = 0) then + Exit; // List is freed in finally + while LstK_MoveNext(lDeviceList, lDeviceInfo) do + begin + if Assigned(lDeviceInfo) then + begin + if ADevicePath = lDeviceInfo.DevicePath then + begin + if UsbK_Init(InterfaceHandle, lDeviceInfo) then + begin + Result:= True; + Exit; + end; + InterfaceHandle:= Nil; + end; + end; + end; + finally + // If lDeviceList is still assigned than free + if Assigned(lDeviceList) then + LstK_Free(lDeviceList); + end; + end; + + function USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX(const DescriptorType: Byte; + const Index: Byte): Word; + begin + Result:= (Word(DescriptorType) shl 8) or Index; + end; + + function InitDllImport: Boolean; + begin + Result:= False; + {$IFDEF DynamicLink} + HLIBUSBKDll:= LoadLibrary(LIBUSBK_DLL); + if HLIBUSBKDll >= 32 then { success } + begin + HotK_Init:= GetProcAddress(HLIBUSBKDll, 'HotK_Init'); + HotK_Free:= GetProcAddress(HLIBUSBKDll, 'HotK_Free'); + HotK_FreeAll:= GetProcAddress(HLIBUSBKDll, 'HotK_FreeAll'); + IsoK_EnumPackets:= GetProcAddress(HLIBUSBKDll, 'IsoK_EnumPackets'); + IsoK_Free:= GetProcAddress(HLIBUSBKDll, 'IsoK_Free'); + IsoK_GetPacket:= GetProcAddress(HLIBUSBKDll, 'IsoK_GetPacket'); + IsoK_Init:= GetProcAddress(HLIBUSBKDll, 'IsoK_Init'); + IsoK_ReUse:= GetProcAddress(HLIBUSBKDll, 'IsoK_ReUse'); + IsoK_SetPacket:= GetProcAddress(HLIBUSBKDll, 'IsoK_SetPacket'); + IsoK_SetPackets:= GetProcAddress(HLIBUSBKDll, 'IsoK_SetPackets'); + LibK_CopyDriverAPI:= GetProcAddress(HLIBUSBKDll, 'LibK_CopyDriverAPI'); + LibK_GetContext:= GetProcAddress(HLIBUSBKDll, 'LibK_GetContext'); + LibK_GetProcAddress:= GetProcAddress(HLIBUSBKDll, 'LibK_GetProcAddress'); + LibK_GetVersion:= GetProcAddress(HLIBUSBKDll, 'LibK_GetVersion'); + LibK_LoadDriverAPI:= GetProcAddress(HLIBUSBKDll, 'LibK_LoadDriverAPI'); + LibK_SetCleanupCallback:= GetProcAddress(HLIBUSBKDll, + 'LibK_SetCleanupCallback'); + LibK_SetContext:= GetProcAddress(HLIBUSBKDll, 'LibK_SetContext'); + LibK_SetDefaultContext:= GetProcAddress(HLIBUSBKDll, + 'LibK_SetDefaultContext'); + LibK_GetDefaultContext:= GetProcAddress(HLIBUSBKDll, + 'LibK_GetDefaultContext'); + LstK_AttachInfo:= GetProcAddress(HLIBUSBKDll, 'LstK_AttachInfo'); + LstK_Clone:= GetProcAddress(HLIBUSBKDll, 'LstK_Clone'); + LstK_CloneInfo:= GetProcAddress(HLIBUSBKDll, 'LstK_CloneInfo'); + LstK_Count:= GetProcAddress(HLIBUSBKDll, 'LstK_Count'); + LstK_Current:= GetProcAddress(HLIBUSBKDll, 'LstK_Current'); + LstK_DetachInfo:= GetProcAddress(HLIBUSBKDll, 'LstK_DetachInfo'); + LstK_Enumerate:= GetProcAddress(HLIBUSBKDll, 'LstK_Enumerate'); + LstK_FindByVidPid:= GetProcAddress(HLIBUSBKDll, 'LstK_FindByVidPid'); + LstK_Free:= GetProcAddress(HLIBUSBKDll, 'LstK_Free'); + LstK_FreeInfo:= GetProcAddress(HLIBUSBKDll, 'LstK_FreeInfo'); + LstK_Init:= GetProcAddress(HLIBUSBKDll, 'LstK_Init'); + LstK_InitEx:= GetProcAddress(HLIBUSBKDll, 'LstK_InitEx'); + LstK_MoveNext:= GetProcAddress(HLIBUSBKDll, 'LstK_MoveNext'); + LstK_MoveReset:= GetProcAddress(HLIBUSBKDll, 'LstK_MoveReset'); + LstK_Sync:= GetProcAddress(HLIBUSBKDll, 'LstK_Sync'); + OvlK_Acquire:= GetProcAddress(HLIBUSBKDll, 'OvlK_Acquire'); + OvlK_Free:= GetProcAddress(HLIBUSBKDll, 'OvlK_Free'); + OvlK_GetEventHandle:= GetProcAddress(HLIBUSBKDll, 'OvlK_GetEventHandle'); + OvlK_Init:= GetProcAddress(HLIBUSBKDll, 'OvlK_Init'); + OvlK_IsComplete:= GetProcAddress(HLIBUSBKDll, 'OvlK_IsComplete'); + OvlK_ReUse:= GetProcAddress(HLIBUSBKDll, 'OvlK_ReUse'); + OvlK_Release:= GetProcAddress(HLIBUSBKDll, 'OvlK_Release'); + OvlK_Wait:= GetProcAddress(HLIBUSBKDll, 'OvlK_Wait'); + OvlK_WaitOldest:= GetProcAddress(HLIBUSBKDll, 'OvlK_WaitOldest'); + OvlK_WaitAndRelease:= GetProcAddress(HLIBUSBKDll, 'OvlK_WaitAndRelease'); + OvlK_WaitOrCancel:= GetProcAddress(HLIBUSBKDll, 'OvlK_WaitOrCancel'); + StmK_Free:= GetProcAddress(HLIBUSBKDll, 'StmK_Free'); + StmK_Init:= GetProcAddress(HLIBUSBKDll, 'StmK_Init'); + StmK_Read:= GetProcAddress(HLIBUSBKDll, 'StmK_Read'); + StmK_Start:= GetProcAddress(HLIBUSBKDll, 'StmK_Start'); + StmK_Stop:= GetProcAddress(HLIBUSBKDll, 'StmK_Stop'); + StmK_Write:= GetProcAddress(HLIBUSBKDll, 'StmK_Write'); + UsbK_AbortPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_AbortPipe'); + UsbK_ClaimInterface:= GetProcAddress(HLIBUSBKDll, 'UsbK_ClaimInterface'); + UsbK_Clone:= GetProcAddress(HLIBUSBKDll, 'UsbK_Clone'); + UsbK_ControlTransfer:= GetProcAddress(HLIBUSBKDll, + 'UsbK_ControlTransfer'); + UsbK_FlushPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_FlushPipe'); + UsbK_Free:= GetProcAddress(HLIBUSBKDll, 'UsbK_Free'); + UsbK_GetAltInterface:= GetProcAddress(HLIBUSBKDll, + 'UsbK_GetAltInterface'); + UsbK_GetAssociatedInterface:= GetProcAddress(HLIBUSBKDll, + 'UsbK_GetAssociatedInterface'); + UsbK_GetConfiguration:= GetProcAddress(HLIBUSBKDll, + 'UsbK_GetConfiguration'); + UsbK_GetCurrentAlternateSetting:= GetProcAddress(HLIBUSBKDll, + 'UsbK_GetCurrentAlternateSetting'); + UsbK_GetCurrentFrameNumber:= GetProcAddress(HLIBUSBKDll, + 'UsbK_GetCurrentFrameNumber'); + UsbK_GetDescriptor:= GetProcAddress(HLIBUSBKDll, 'UsbK_GetDescriptor'); + UsbK_GetOverlappedResult:= GetProcAddress(HLIBUSBKDll, + 'UsbK_GetOverlappedResult'); + UsbK_GetPipePolicy:= GetProcAddress(HLIBUSBKDll, 'UsbK_GetPipePolicy'); + UsbK_GetPowerPolicy:= GetProcAddress(HLIBUSBKDll, 'UsbK_GetPowerPolicy'); + UsbK_GetProperty:= GetProcAddress(HLIBUSBKDll, 'UsbK_GetProperty'); + UsbK_Init:= GetProcAddress(HLIBUSBKDll, 'UsbK_Init'); + UsbK_Initialize:= GetProcAddress(HLIBUSBKDll, 'UsbK_Initialize'); + UsbK_IsoReadPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_IsoReadPipe'); + UsbK_IsoWritePipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_IsoWritePipe'); + UsbK_QueryDeviceInformation:= GetProcAddress(HLIBUSBKDll, + 'UsbK_QueryDeviceInformation'); + UsbK_QueryInterfaceSettings:= GetProcAddress(HLIBUSBKDll, + 'UsbK_QueryInterfaceSettings'); + UsbK_QueryPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_QueryPipe'); + UsbK_ReadPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_ReadPipe'); + UsbK_ReleaseInterface:= GetProcAddress(HLIBUSBKDll, + 'UsbK_ReleaseInterface'); + UsbK_ResetDevice:= GetProcAddress(HLIBUSBKDll, 'UsbK_ResetDevice'); + UsbK_ResetPipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_ResetPipe'); + UsbK_SelectInterface:= GetProcAddress(HLIBUSBKDll, + 'UsbK_SelectInterface'); + UsbK_SetAltInterface:= GetProcAddress(HLIBUSBKDll, + 'UsbK_SetAltInterface'); + UsbK_SetConfiguration:= GetProcAddress(HLIBUSBKDll, + 'UsbK_SetConfiguration'); + UsbK_SetCurrentAlternateSetting:= GetProcAddress(HLIBUSBKDll, + 'UsbK_SetCurrentAlternateSetting'); + UsbK_SetPipePolicy:= GetProcAddress(HLIBUSBKDll, 'UsbK_SetPipePolicy'); + UsbK_SetPowerPolicy:= GetProcAddress(HLIBUSBKDll, 'UsbK_SetPowerPolicy'); + UsbK_WritePipe:= GetProcAddress(HLIBUSBKDll, 'UsbK_WritePipe'); + WinUsb_AbortPipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_AbortPipe'); + WinUsb_ControlTransfer:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_ControlTransfer'); + WinUsb_FlushPipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_FlushPipe'); + WinUsb_Free:= GetProcAddress(HLIBUSBKDll, 'WinUsb_Free'); + WinUsb_GetAssociatedInterface:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_GetAssociatedInterface'); + WinUsb_GetCurrentAlternateSetting:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_GetCurrentAlternateSetting'); + WinUsb_GetDescriptor:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_GetDescriptor'); + WinUsb_GetOverlappedResult:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_GetOverlappedResult'); + WinUsb_GetPipePolicy:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_GetPipePolicy'); + WinUsb_GetPowerPolicy:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_GetPowerPolicy'); + WinUsb_Initialize:= GetProcAddress(HLIBUSBKDll, 'WinUsb_Initialize'); + WinUsb_QueryDeviceInformation:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_QueryDeviceInformation'); + WinUsb_QueryInterfaceSettings:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_QueryInterfaceSettings'); + WinUsb_QueryPipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_QueryPipe'); + WinUsb_ReadPipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_ReadPipe'); + WinUsb_ResetPipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_ResetPipe'); + WinUsb_SetCurrentAlternateSetting:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_SetCurrentAlternateSetting'); + WinUsb_SetPipePolicy:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_SetPipePolicy'); + WinUsb_SetPowerPolicy:= GetProcAddress(HLIBUSBKDll, + 'WinUsb_SetPowerPolicy'); + WinUsb_WritePipe:= GetProcAddress(HLIBUSBKDll, 'WinUsb_WritePipe'); + Result:= True; + Result:= Result and Assigned(HotK_Init); + Result:= Result and Assigned(HotK_Free); + Result:= Result and Assigned(HotK_FreeAll); + Result:= Result and Assigned(IsoK_EnumPackets); + Result:= Result and Assigned(IsoK_Free); + Result:= Result and Assigned(IsoK_GetPacket); + Result:= Result and Assigned(IsoK_Init); + Result:= Result and Assigned(IsoK_ReUse); + Result:= Result and Assigned(IsoK_SetPacket); + Result:= Result and Assigned(IsoK_SetPackets); + Result:= Result and Assigned(LibK_CopyDriverAPI); + Result:= Result and Assigned(LibK_GetContext); + Result:= Result and Assigned(LibK_GetProcAddress); + Result:= Result and Assigned(LibK_GetVersion); + Result:= Result and Assigned(LibK_LoadDriverAPI); + Result:= Result and Assigned(LibK_SetCleanupCallback); + Result:= Result and Assigned(LibK_SetContext); + Result:= Result and Assigned(LibK_SetDefaultContext); + Result:= Result and Assigned(LibK_GetDefaultContext); + Result:= Result and Assigned(LstK_AttachInfo); + Result:= Result and Assigned(LstK_Clone); + Result:= Result and Assigned(LstK_CloneInfo); + Result:= Result and Assigned(LstK_Count); + Result:= Result and Assigned(LstK_Current); + Result:= Result and Assigned(LstK_DetachInfo); + Result:= Result and Assigned(LstK_Enumerate); + Result:= Result and Assigned(LstK_FindByVidPid); + Result:= Result and Assigned(LstK_Free); + Result:= Result and Assigned(LstK_FreeInfo); + Result:= Result and Assigned(LstK_Init); + Result:= Result and Assigned(LstK_InitEx); + Result:= Result and Assigned(LstK_MoveNext); + Result:= Result and Assigned(LstK_MoveReset); + Result:= Result and Assigned(LstK_Sync); + Result:= Result and Assigned(OvlK_Acquire); + Result:= Result and Assigned(OvlK_Free); + Result:= Result and Assigned(OvlK_GetEventHandle); + Result:= Result and Assigned(OvlK_Init); + Result:= Result and Assigned(OvlK_IsComplete); + Result:= Result and Assigned(OvlK_ReUse); + Result:= Result and Assigned(OvlK_Release); + Result:= Result and Assigned(OvlK_Wait); + Result:= Result and Assigned(OvlK_WaitOldest); + Result:= Result and Assigned(OvlK_WaitAndRelease); + Result:= Result and Assigned(OvlK_WaitOrCancel); + Result:= Result and Assigned(StmK_Free); + Result:= Result and Assigned(StmK_Init); + Result:= Result and Assigned(StmK_Read); + Result:= Result and Assigned(StmK_Start); + Result:= Result and Assigned(StmK_Stop); + Result:= Result and Assigned(StmK_Write); + Result:= Result and Assigned(UsbK_AbortPipe); + Result:= Result and Assigned(UsbK_ClaimInterface); + Result:= Result and Assigned(UsbK_Clone); + Result:= Result and Assigned(UsbK_ControlTransfer); + Result:= Result and Assigned(UsbK_FlushPipe); + Result:= Result and Assigned(UsbK_Free); + Result:= Result and Assigned(UsbK_GetAltInterface); + Result:= Result and Assigned(UsbK_GetAssociatedInterface); + Result:= Result and Assigned(UsbK_GetConfiguration); + Result:= Result and Assigned(UsbK_GetCurrentAlternateSetting); + Result:= Result and Assigned(UsbK_GetCurrentFrameNumber); + Result:= Result and Assigned(UsbK_GetDescriptor); + Result:= Result and Assigned(UsbK_GetOverlappedResult); + Result:= Result and Assigned(UsbK_GetPipePolicy); + Result:= Result and Assigned(UsbK_GetPowerPolicy); + Result:= Result and Assigned(UsbK_GetProperty); + Result:= Result and Assigned(UsbK_Init); + Result:= Result and Assigned(UsbK_Initialize); + Result:= Result and Assigned(UsbK_IsoReadPipe); + Result:= Result and Assigned(UsbK_IsoWritePipe); + Result:= Result and Assigned(UsbK_QueryDeviceInformation); + Result:= Result and Assigned(UsbK_QueryInterfaceSettings); + Result:= Result and Assigned(UsbK_QueryPipe); + Result:= Result and Assigned(UsbK_ReadPipe); + Result:= Result and Assigned(UsbK_ReleaseInterface); + Result:= Result and Assigned(UsbK_ResetDevice); + Result:= Result and Assigned(UsbK_ResetPipe); + Result:= Result and Assigned(UsbK_SelectInterface); + Result:= Result and Assigned(UsbK_SetAltInterface); + Result:= Result and Assigned(UsbK_SetConfiguration); + Result:= Result and Assigned(UsbK_SetCurrentAlternateSetting); + Result:= Result and Assigned(UsbK_SetPipePolicy); + Result:= Result and Assigned(UsbK_SetPowerPolicy); + Result:= Result and Assigned(UsbK_WritePipe); + Result:= Result and Assigned(WinUsb_AbortPipe); + Result:= Result and Assigned(WinUsb_ControlTransfer); + Result:= Result and Assigned(WinUsb_FlushPipe); + Result:= Result and Assigned(WinUsb_Free); + Result:= Result and Assigned(WinUsb_GetAssociatedInterface); + Result:= Result and Assigned(WinUsb_GetCurrentAlternateSetting); + Result:= Result and Assigned(WinUsb_GetDescriptor); + Result:= Result and Assigned(WinUsb_GetOverlappedResult); + Result:= Result and Assigned(WinUsb_GetPipePolicy); + Result:= Result and Assigned(WinUsb_GetPowerPolicy); + Result:= Result and Assigned(WinUsb_Initialize); + Result:= Result and Assigned(WinUsb_QueryDeviceInformation); + Result:= Result and Assigned(WinUsb_QueryInterfaceSettings); + Result:= Result and Assigned(WinUsb_QueryPipe); + Result:= Result and Assigned(WinUsb_ReadPipe); + Result:= Result and Assigned(WinUsb_ResetPipe); + Result:= Result and Assigned(WinUsb_SetCurrentAlternateSetting); + Result:= Result and Assigned(WinUsb_SetPipePolicy); + Result:= Result and Assigned(WinUsb_SetPowerPolicy); + Result:= Result and Assigned(WinUsb_WritePipe); + end + else + begin + HotK_Init:= Nil; + HotK_Free:= Nil; + HotK_FreeAll:= Nil; + IsoK_EnumPackets:= Nil; + IsoK_Free:= Nil; + IsoK_GetPacket:= Nil; + IsoK_Init:= Nil; + IsoK_ReUse:= Nil; + IsoK_SetPacket:= Nil; + IsoK_SetPackets:= Nil; + LibK_CopyDriverAPI:= Nil; + LibK_GetContext:= Nil; + LibK_GetProcAddress:= Nil; + LibK_GetVersion:= Nil; + LibK_LoadDriverAPI:= Nil; + LibK_SetCleanupCallback:= Nil; + LibK_SetContext:= Nil; + LibK_SetDefaultContext:= Nil; + LibK_GetDefaultContext:= Nil; + LstK_AttachInfo:= Nil; + LstK_Clone:= Nil; + LstK_CloneInfo:= Nil; + LstK_Count:= Nil; + LstK_Current:= Nil; + LstK_DetachInfo:= Nil; + LstK_Enumerate:= Nil; + LstK_FindByVidPid:= Nil; + LstK_Free:= Nil; + LstK_FreeInfo:= Nil; + LstK_Init:= Nil; + LstK_InitEx:= Nil; + LstK_MoveNext:= Nil; + LstK_MoveReset:= Nil; + LstK_Sync:= Nil; + OvlK_Acquire:= Nil; + OvlK_Free:= Nil; + OvlK_GetEventHandle:= Nil; + OvlK_Init:= Nil; + OvlK_IsComplete:= Nil; + OvlK_ReUse:= Nil; + OvlK_Release:= Nil; + OvlK_Wait:= Nil; + OvlK_WaitOldest:= Nil; + OvlK_WaitAndRelease:= Nil; + OvlK_WaitOrCancel:= Nil; + StmK_Free:= Nil; + StmK_Init:= Nil; + StmK_Read:= Nil; + StmK_Start:= Nil; + StmK_Stop:= Nil; + StmK_Write:= Nil; + UsbK_AbortPipe:= Nil; + UsbK_ClaimInterface:= Nil; + UsbK_Clone:= Nil; + UsbK_ControlTransfer:= Nil; + UsbK_FlushPipe:= Nil; + UsbK_Free:= Nil; + UsbK_GetAltInterface:= Nil; + UsbK_GetAssociatedInterface:= Nil; + UsbK_GetConfiguration:= Nil; + UsbK_GetCurrentAlternateSetting:= Nil; + UsbK_GetCurrentFrameNumber:= Nil; + UsbK_GetDescriptor:= Nil; + UsbK_GetOverlappedResult:= Nil; + UsbK_GetPipePolicy:= Nil; + UsbK_GetPowerPolicy:= Nil; + UsbK_GetProperty:= Nil; + UsbK_Init:= Nil; + UsbK_Initialize:= Nil; + UsbK_IsoReadPipe:= Nil; + UsbK_IsoWritePipe:= Nil; + UsbK_QueryDeviceInformation:= Nil; + UsbK_QueryInterfaceSettings:= Nil; + UsbK_QueryPipe:= Nil; + UsbK_ReadPipe:= Nil; + UsbK_ReleaseInterface:= Nil; + UsbK_ResetDevice:= Nil; + UsbK_ResetPipe:= Nil; + UsbK_SelectInterface:= Nil; + UsbK_SetAltInterface:= Nil; + UsbK_SetConfiguration:= Nil; + UsbK_SetCurrentAlternateSetting:= Nil; + UsbK_SetPipePolicy:= Nil; + UsbK_SetPowerPolicy:= Nil; + UsbK_WritePipe:= Nil; + WinUsb_AbortPipe:= Nil; + WinUsb_ControlTransfer:= Nil; + WinUsb_FlushPipe:= Nil; + WinUsb_Free:= Nil; + WinUsb_GetAssociatedInterface:= Nil; + WinUsb_GetCurrentAlternateSetting:= Nil; + WinUsb_GetDescriptor:= Nil; + WinUsb_GetOverlappedResult:= Nil; + WinUsb_GetPipePolicy:= Nil; + WinUsb_GetPowerPolicy:= Nil; + WinUsb_Initialize:= Nil; + WinUsb_QueryDeviceInformation:= Nil; + WinUsb_QueryInterfaceSettings:= Nil; + WinUsb_QueryPipe:= Nil; + WinUsb_ReadPipe:= Nil; + WinUsb_ResetPipe:= Nil; + WinUsb_SetCurrentAlternateSetting:= Nil; + WinUsb_SetPipePolicy:= Nil; + WinUsb_SetPowerPolicy:= Nil; + WinUsb_WritePipe:= Nil; + end; + {$ELSE} + Result:= True; + {$ENDIF} + end; + + procedure DoneDllImport; + begin + {$IFDEF DynamicLink} + if DllAvailable then + FreeLibrary(HLIBUSBKDll); + {$ENDIF} + end; + +initialization + + {$IFDEF DynamicLink} + DllAvailable:= InitDllImport; + {$ELSE} + // Anyway the program will not start if the DLL is not available + DllAvailable:= True; + {$ENDIF} + // Delphi will show a Breakpoint if Assert violates, if no violation is + // detected by the compiler, the linker will eliminate the calls + Assert((SizeOf(WINUSB_PIPE_INFORMATION) = 12), + 'WINUSB_PIPE_INFORMATION size violation'); + Assert((SizeOf(WINUSB_SETUP_PACKET) = 8), + 'WINUSB_SETUP_PACKET size violation'); + Assert((SizeOf(KISO_CONTEXT) = 16), 'KISO_CONTEXT size violation'); + Assert((SizeOf(KUSB_DRIVER_API) = 512), 'KUSB_DRIVER_API size violation'); + Assert((SizeOf(KSTM_CALLBACK) = 64), 'KSTM_CALLBACK size violation'); + Assert((SizeOf(KLST_PATTERN_MATCH) = 1024), + 'KLST_PATTERN_MATCH size violation'); + Assert((SizeOf(KHOT_PARAMS) = 2048), 'KHOT_PARAMS size violation'); + +finalization + + {$IFDEF DynamicLink} + DoneDllImport; + {$ENDIF} + +end. diff --git a/Old Matlab Interface/bindings/libusbK.vb b/Old Matlab Interface/bindings/libusbK.vb new file mode 100644 index 00000000..906db7fc --- /dev/null +++ b/Old Matlab Interface/bindings/libusbK.vb @@ -0,0 +1,3513 @@ +#Region "Copyright (c) Travis Robinson" + +' Copyright (c) 2012 Travis Robinson +' All rights reserved. +' +' C# libusbK Bindings +' Auto-generated on: 04.28.2011 +' +' Redistribution and use in source and binary forms, with or without +' modification, are permitted provided that the following conditions are met: +' +' * Redistributions of source code must retain the above copyright +' notice, this list of conditions and the following disclaimer. +' +' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +' IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +' TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +' PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TRAVIS LEE ROBINSON +' BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +' CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +' SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +' INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +' CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +' ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +' THE POSSIBILITY OF SUCH DAMAGE. + +#End Region + +Imports System +Imports System.Diagnostics +Imports System.Runtime.InteropServices + +' ReSharper disable InconsistentNaming +' ReSharper disable CheckNamespace +' ReSharper disable UnassignedReadonlyField + +Namespace libusbK + Public NotInheritable Class AllKOptions + Private Sub New() + End Sub + #Region "Public Members" + + ''' + ''' Alternate libusbK library to use. This must be assigned before any libusbK functions are called and it must be the full path and file name to a libusbK.dll. + ''' + Public Shared LIBUSBK_FULLPATH_TO_ALTERNATE_DLL As String + + #End Region + End Class + + Public NotInheritable Class AllKConstants + Private Sub New() + End Sub + #Region "Public Members" + + ''' + ''' Allocated length for all strings in a \ref KLST_DEVINFO structure. + ''' + Public Const KLST_STRING_MAX_LEN As Integer = 256 + + ''' + ''' libusbK library + ''' + Public Const LIBUSBK_DLL As String = "libusbK.dll" + + ''' + ''' Config power mask for the \c bmAttributes field of a \ref USB_CONFIGURATION_DESCRIPTOR + ''' + Public Const USB_CONFIG_POWERED_MASK As Byte = &Hc0 + + ''' + ''' Endpoint address mask for the \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR + ''' + Public Const USB_ENDPOINT_ADDRESS_MASK As Byte = &Hf + + ''' + ''' Endpoint direction mask for the \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR + ''' + Public Const USB_ENDPOINT_DIRECTION_MASK As Byte = &H80 + + #End Region + End Class + + Public Enum PipePolicyType + SHORT_PACKET_TERMINATE = &H1 + AUTO_CLEAR_STALL = &H2 + PIPE_TRANSFER_TIMEOUT = &H3 + IGNORE_SHORT_PACKETS = &H4 + ALLOW_PARTIAL_READS = &H5 + AUTO_FLUSH = &H6 + RAW_IO = &H7 + MAXIMUM_TRANSFER_SIZE = &H8 + RESET_PIPE_ON_RESUME = &H9 + + ISO_START_LATENCY = &H20 + ISO_ALWAYS_START_ASAP = &H21 + ISO_NUM_FIXED_PACKETS = &H22 + + SIMUL_PARALLEL_REQUESTS = &H30 + End Enum + + Public Enum PowerPolicyType + AUTO_SUSPEND = &H81 + SUSPEND_DELAY = &H83 + End Enum + + Public Enum DeviceInformationType + DEVICE_SPEED = &H1 + End Enum + + Public Enum EndpointType + ''' + ''' Indicates a control endpoint + ''' + CONTROL = &H0 + + ''' + ''' Indicates an isochronous endpoint + ''' + ISOCHRONOUS = &H1 + + ''' + ''' Indicates a bulk endpoint + ''' + BULK = &H2 + + ''' + ''' Indicates an interrupt endpoint + ''' + INTERRUPT = &H3 + + ''' + ''' Endpoint type mask for the \c bmAttributes field of a \ref USB_ENDPOINT_DESCRIPTOR + ''' + MASK = &H3 + End Enum + + Public NotInheritable Class ErrorCodes + Private Sub New() + End Sub + #Region "Public Members" + + ''' + ''' Access is denied. + ''' + Public Const AccessDenied As Integer = 5 + + ''' + ''' The requested resource is in use. + ''' + Public Const Busy As Integer = 170 + + ''' + ''' The operation was canceled by the user. + ''' + Public Const Cancelled As Integer = 1223 + + ''' + ''' The library, drive, or media pool is empty. + ''' + Public Const Empty As Integer = 4306 + + ''' + ''' The handle is invalid. + ''' + Public Const InvalidHandle As Integer = 6 + + ''' + ''' The parameter is incorrect. + ''' + Public Const InvalidParameter As Integer = 87 + + ''' + ''' Overlapped I/O event is not in a signaled state. + ''' + Public Const IoIncomplete As Integer = 996 + + ''' + ''' Overlapped I/O operation is in progress. + ''' + Public Const IoPending As Integer = 997 + + ''' + ''' More data is available. + ''' + Public Const MoreData As Integer = 234 + + ''' + ''' No more data is available. + ''' + Public Const NoMoreItems As Integer = 259 + + ''' + ''' Not enough storage is available to process this command. + ''' + Public Const NotEnoughMemory As Integer = 8 + + ''' + ''' Element not found. + ''' + Public Const NotFound As Integer = 1168 + + ''' + ''' The request is not supported. + ''' + Public Const NotSupported As Integer = 50 + + ''' + ''' The I/O operation has been aborted because of either a thread exit or an application request. + ''' + Public Const OperationAborted As Integer = 995 + + ''' + ''' The cluster resource is not available. + ''' + Public Const ResourceNotAvailable As Integer = 5006 + + ''' + ''' The cluster resource could not be found. + ''' + Public Const ResourceNotFound As Integer = 5007 + + ''' + ''' The semaphore timeout period has expired. + ''' + Public Const SemTimeout As Integer = 121 + + ''' + ''' The operation completed successfully. + ''' + Public Const Success As Integer = 0 + + ''' + ''' An attempt was made to operate on a thread within a specific process, but the thread specified is not in the process specified. + ''' + Public Const ThreadNotInProcess As Integer = 566 + + ''' + ''' A thread termination occurred while the thread was suspended. The thread was resumed, and termination proceeded. + ''' + Public Const ThreadWasSuspended As Integer = 699 + + ''' + ''' Too many dynamic-link modules are attached to this program or dynamic-link module. + ''' + Public Const TooManyModules As Integer = 214 + + #End Region + End Class + + Public Interface IKLIB_HANDLE + #Region "Public Members" + + Function GetContext() As IntPtr + ReadOnly Property HandleType() As KLIB_HANDLE_TYPE + ReadOnly Property Pointer() As IntPtr + Function SetCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean + Function SetContext(UserContext As IntPtr) As Boolean + + #End Region + End Interface + + #Region "Opaque library handles" + + Public Structure KLST_HANDLE + Implements IKLIB_HANDLE + #Region "IKLIB_HANDLE Members" + + Public ReadOnly Property Pointer() As IntPtr Implements IKLIB_HANDLE.Pointer + Get + Return mHandlePtr + End Get + End Property + + Public ReadOnly Property HandleType() As KLIB_HANDLE_TYPE Implements IKLIB_HANDLE.HandleType + Get + Return KLIB_HANDLE_TYPE.LSTK + End Get + End Property + + Public Function GetContext() As IntPtr Implements IKLIB_HANDLE.GetContext + Return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + End Function + + Public Function SetContext(UserContext As IntPtr) As Boolean Implements IKLIB_HANDLE.SetContext + Return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + End Function + + Public Function SetCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean Implements IKLIB_HANDLE.SetCleanupCallback + Return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + End Function + + #End Region + + #Region "Public Members" + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + #End Region + + #Region "Private Members" + + Private ReadOnly mHandlePtr As IntPtr + + #End Region + End Structure + + Public Structure KHOT_HANDLE + Implements IKLIB_HANDLE + #Region "IKLIB_HANDLE Members" + + Public ReadOnly Property Pointer() As IntPtr Implements IKLIB_HANDLE.Pointer + Get + Return mHandlePtr + End Get + End Property + + Public ReadOnly Property HandleType() As KLIB_HANDLE_TYPE Implements IKLIB_HANDLE.HandleType + Get + Return KLIB_HANDLE_TYPE.HOTK + End Get + End Property + + Public Function GetContext() As IntPtr Implements IKLIB_HANDLE.GetContext + Return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + End Function + + Public Function SetContext(UserContext As IntPtr) As Boolean Implements IKLIB_HANDLE.SetContext + Return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + End Function + + Public Function SetCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean Implements IKLIB_HANDLE.SetCleanupCallback + Return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + End Function + + #End Region + + #Region "Public Members" + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + #End Region + + #Region "Private Members" + + Private ReadOnly mHandlePtr As IntPtr + + #End Region + End Structure + + Public Structure KUSB_HANDLE + Implements IKLIB_HANDLE + #Region "IKLIB_HANDLE Members" + + Public ReadOnly Property Pointer() As IntPtr Implements IKLIB_HANDLE.Pointer + Get + Return mHandlePtr + End Get + End Property + + Public ReadOnly Property HandleType() As KLIB_HANDLE_TYPE Implements IKLIB_HANDLE.HandleType + Get + Return KLIB_HANDLE_TYPE.USBK + End Get + End Property + + Public Function GetContext() As IntPtr Implements IKLIB_HANDLE.GetContext + Return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + End Function + + Public Function SetContext(UserContext As IntPtr) As Boolean Implements IKLIB_HANDLE.SetContext + Return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + End Function + + Public Function SetCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean Implements IKLIB_HANDLE.SetCleanupCallback + Return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + End Function + + #End Region + + #Region "USB Shared Device Context" + + Public Function GetSharedContext() As IntPtr + Return AllKFunctions.LibK_GetContext(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK) + End Function + + Public Function SetSharedCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean + Return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK, CleanupCallback) + End Function + + Public Function SetSharedContext(UserContext As IntPtr) As Boolean + Return AllKFunctions.LibK_SetContext(mHandlePtr, KLIB_HANDLE_TYPE.USBSHAREDK, UserContext) + End Function + + #End Region + + #Region "Public Members" + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + #End Region + + #Region "Private Members" + + Private ReadOnly mHandlePtr As IntPtr + + #End Region + End Structure + + Public Structure KOVL_POOL_HANDLE + Implements IKLIB_HANDLE + #Region "IKLIB_HANDLE Members" + + Public ReadOnly Property Pointer() As IntPtr Implements IKLIB_HANDLE.Pointer + Get + Return mHandlePtr + End Get + End Property + + Public ReadOnly Property HandleType() As KLIB_HANDLE_TYPE Implements IKLIB_HANDLE.HandleType + Get + Return KLIB_HANDLE_TYPE.OVLPOOLK + End Get + End Property + + Public Function GetContext() As IntPtr Implements IKLIB_HANDLE.GetContext + Return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + End Function + + Public Function SetContext(UserContext As IntPtr) As Boolean Implements IKLIB_HANDLE.SetContext + Return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + End Function + + Public Function SetCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean Implements IKLIB_HANDLE.SetCleanupCallback + Return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + End Function + + #End Region + + #Region "Public Members" + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + #End Region + + #Region "Private Members" + + Private ReadOnly mHandlePtr As IntPtr + + #End Region + End Structure + + Public Structure KOVL_HANDLE + Implements IKLIB_HANDLE + #Region "IKLIB_HANDLE Members" + + Public ReadOnly Property Pointer() As IntPtr Implements IKLIB_HANDLE.Pointer + Get + Return mHandlePtr + End Get + End Property + + Public ReadOnly Property HandleType() As KLIB_HANDLE_TYPE Implements IKLIB_HANDLE.HandleType + Get + Return KLIB_HANDLE_TYPE.OVLK + End Get + End Property + + Public Function GetContext() As IntPtr Implements IKLIB_HANDLE.GetContext + Return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + End Function + + Public Function SetContext(UserContext As IntPtr) As Boolean Implements IKLIB_HANDLE.SetContext + Return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + End Function + + Public Function SetCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean Implements IKLIB_HANDLE.SetCleanupCallback + Return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + End Function + + #End Region + + #Region "Public Members" + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + #End Region + + #Region "Private Members" + + Private ReadOnly mHandlePtr As IntPtr + + #End Region + End Structure + + Public Structure KSTM_HANDLE + Implements IKLIB_HANDLE + #Region "IKLIB_HANDLE Members" + + Public ReadOnly Property Pointer() As IntPtr Implements IKLIB_HANDLE.Pointer + Get + Return mHandlePtr + End Get + End Property + + Public ReadOnly Property HandleType() As KLIB_HANDLE_TYPE Implements IKLIB_HANDLE.HandleType + Get + Return KLIB_HANDLE_TYPE.STMK + End Get + End Property + + Public Function GetContext() As IntPtr Implements IKLIB_HANDLE.GetContext + Return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + End Function + + Public Function SetContext(UserContext As IntPtr) As Boolean Implements IKLIB_HANDLE.SetContext + Return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + End Function + + Public Function SetCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean Implements IKLIB_HANDLE.SetCleanupCallback + Return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + End Function + + #End Region + + #Region "Public Members" + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + #End Region + + #Region "Private Members" + + Private ReadOnly mHandlePtr As IntPtr + + #End Region + End Structure + + #End Region + + #Region "Internal Function Imports" + + Friend NotInheritable Class AllKFunctions + Private Sub New() + End Sub + #Region "Delegates" + + _ + Public Delegate Sub HotK_FreeAllDelegate() + + _ + Public Delegate Function HotK_FreeDelegate(<[In]> Handle As KHOT_HANDLE) As Boolean + + _ + Public Delegate Function HotK_InitDelegate( ByRef Handle As KHOT_HANDLE, <[In], Out> ByRef InitParams As KHOT_PARAMS) As Boolean + + _ + Public Delegate Function IsoK_EnumPacketsDelegate(<[In]> IsoContext As KISO_CONTEXT, EnumPackets As KISO_ENUM_PACKETS_CB, StartPacketIndex As Integer, UserState As IntPtr) As Boolean + + _ + Public Delegate Function IsoK_FreeDelegate(<[In]> IsoContext As KISO_CONTEXT) As Boolean + + _ + Public Delegate Function IsoK_GetPacketDelegate(<[In]> IsoContext As KISO_CONTEXT, PacketIndex As Integer, ByRef IsoPacket As KISO_PACKET) As Boolean + + _ + Public Delegate Function IsoK_InitDelegate( ByRef IsoContext As KISO_CONTEXT, NumberOfPackets As Integer, StartFrame As Integer) As Boolean + + _ + Public Delegate Function IsoK_ReUseDelegate(<[In]> IsoContext As KISO_CONTEXT) As Boolean + + _ + Public Delegate Function IsoK_SetPacketDelegate(<[In]> IsoContext As KISO_CONTEXT, PacketIndex As Integer, <[In]> ByRef IsoPacket As KISO_PACKET) As Boolean + + _ + Public Delegate Function IsoK_SetPacketsDelegate(<[In]> IsoContext As KISO_CONTEXT, PacketSize As Integer) As Boolean + + _ + Public Delegate Sub LibK_Context_FreeDelegate() + + _ + Public Delegate Function LibK_Context_InitDelegate(Heap As IntPtr, Reserved As IntPtr) As Boolean + + _ + Public Delegate Function LibK_CopyDriverAPIDelegate( ByRef DriverAPI As KUSB_DRIVER_API, <[In]> UsbHandle As KUSB_HANDLE) As Boolean + + _ + Public Delegate Function LibK_GetContextDelegate(<[In]> Handle As IntPtr, HandleType As KLIB_HANDLE_TYPE) As IntPtr + + _ + Public Delegate Function LibK_GetDefaultContextDelegate(HandleType As KLIB_HANDLE_TYPE) As IntPtr + + _ + Public Delegate Function LibK_GetProcAddressDelegate(ProcAddress As IntPtr, DriverID As Integer, FunctionID As Integer) As Boolean + + _ + Public Delegate Sub LibK_GetVersionDelegate( ByRef Version As KLIB_VERSION) + + _ + Public Delegate Function LibK_LoadDriverAPIDelegate( ByRef DriverAPI As KUSB_DRIVER_API, DriverID As Integer) As Boolean + + _ + Public Delegate Function LibK_SetCleanupCallbackDelegate(<[In]> Handle As IntPtr, HandleType As KLIB_HANDLE_TYPE, CleanupCB As KLIB_HANDLE_CLEANUP_CB) As Boolean + + _ + Public Delegate Function LibK_SetContextDelegate(<[In]> Handle As IntPtr, HandleType As KLIB_HANDLE_TYPE, ContextValue As IntPtr) As Boolean + + _ + Public Delegate Function LibK_SetDefaultContextDelegate(HandleType As KLIB_HANDLE_TYPE, ContextValue As IntPtr) As Boolean + + _ + Public Delegate Function LstK_CountDelegate(<[In]> DeviceList As KLST_HANDLE, ByRef Count As Integer) As Boolean + + _ + Public Delegate Function LstK_CurrentDelegate(<[In]> DeviceList As KLST_HANDLE, ByRef DeviceInfo As KLST_DEVINFO_HANDLE) As Boolean + + _ + Public Delegate Function LstK_EnumerateDelegate(<[In]> DeviceList As KLST_HANDLE, EnumDevListCB As KLST_ENUM_DEVINFO_CB, Context As IntPtr) As Boolean + + _ + Public Delegate Function LstK_FindByVidPidDelegate(<[In]> DeviceList As KLST_HANDLE, Vid As Integer, Pid As Integer, ByRef DeviceInfo As KLST_DEVINFO_HANDLE) As Boolean + + _ + Public Delegate Function LstK_FreeDelegate(<[In]> DeviceList As KLST_HANDLE) As Boolean + + _ + Public Delegate Function LstK_InitDelegate( ByRef DeviceList As KLST_HANDLE, Flags As KLST_FLAG) As Boolean + + _ + Public Delegate Function LstK_InitExDelegate( ByRef DeviceList As KLST_HANDLE, Flags As KLST_FLAG, <[In]> ByRef PatternMatch As KLST_PATTERN_MATCH) As Boolean + + _ + Public Delegate Function LstK_MoveNextDelegate(<[In]> DeviceList As KLST_HANDLE, ByRef DeviceInfo As KLST_DEVINFO_HANDLE) As Boolean + + _ + Public Delegate Sub LstK_MoveResetDelegate(<[In]> DeviceList As KLST_HANDLE) + + _ + Public Delegate Function OvlK_AcquireDelegate( ByRef OverlappedK As KOVL_HANDLE, <[In]> PoolHandle As KOVL_POOL_HANDLE) As Boolean + + _ + Public Delegate Function OvlK_FreeDelegate(<[In]> PoolHandle As KOVL_POOL_HANDLE) As Boolean + + _ + Public Delegate Function OvlK_GetEventHandleDelegate(<[In]> OverlappedK As KOVL_HANDLE) As IntPtr + + _ + Public Delegate Function OvlK_InitDelegate( ByRef PoolHandle As KOVL_POOL_HANDLE, <[In]> UsbHandle As KUSB_HANDLE, MaxOverlappedCount As Integer, Flags As KOVL_POOL_FLAG) As Boolean + + _ + Public Delegate Function OvlK_IsCompleteDelegate(<[In]> OverlappedK As KOVL_HANDLE) As Boolean + + _ + Public Delegate Function OvlK_ReUseDelegate(<[In]> OverlappedK As KOVL_HANDLE) As Boolean + + _ + Public Delegate Function OvlK_ReleaseDelegate(<[In]> OverlappedK As KOVL_HANDLE) As Boolean + + _ + Public Delegate Function OvlK_WaitAndReleaseDelegate(<[In]> OverlappedK As KOVL_HANDLE, TimeoutMS As Integer, ByRef TransferredLength As Integer) As Boolean + + _ + Public Delegate Function OvlK_WaitDelegate(<[In]> OverlappedK As KOVL_HANDLE, TimeoutMS As Integer, WaitFlags As KOVL_WAIT_FLAG, ByRef TransferredLength As Integer) As Boolean + + _ + Public Delegate Function OvlK_WaitOldestDelegate(<[In]> PoolHandle As KOVL_POOL_HANDLE, ByRef OverlappedK As KOVL_HANDLE, TimeoutMS As Integer, WaitFlags As KOVL_WAIT_FLAG, ByRef TransferredLength As Integer) As Boolean + + _ + Public Delegate Function OvlK_WaitOrCancelDelegate(<[In]> OverlappedK As KOVL_HANDLE, TimeoutMS As Integer, ByRef TransferredLength As Integer) As Boolean + + _ + Public Delegate Function StmK_FreeDelegate(<[In]> StreamHandle As KSTM_HANDLE) As Boolean + + _ + Public Delegate Function StmK_InitDelegate( ByRef StreamHandle As KSTM_HANDLE, <[In]> UsbHandle As KUSB_HANDLE, PipeID As Byte, MaxTransferSize As Integer, MaxPendingTransfers As Integer, MaxPendingIO As Integer, _ + <[In]> ByRef Callbacks As KSTM_CALLBACK, Flags As KSTM_FLAG) As Boolean + + _ + Public Delegate Function StmK_ReadDelegate(<[In]> StreamHandle As KSTM_HANDLE, Buffer As IntPtr, Offset As Integer, Length As Integer, ByRef TransferredLength As Integer) As Boolean + + _ + Public Delegate Function StmK_StartDelegate(<[In]> StreamHandle As KSTM_HANDLE) As Boolean + + _ + Public Delegate Function StmK_StopDelegate(<[In]> StreamHandle As KSTM_HANDLE, TimeoutCancelMS As Integer) As Boolean + + _ + Public Delegate Function StmK_WriteDelegate(<[In]> StreamHandle As KSTM_HANDLE, Buffer As IntPtr, Offset As Integer, Length As Integer, ByRef TransferredLength As Integer) As Boolean + + _ + Public Delegate Function UsbK_FreeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE) As Boolean + + #End Region + + Shared Sub New() + If [String].IsNullOrEmpty(AllKOptions.LIBUSBK_FULLPATH_TO_ALTERNATE_DLL) Then + mModuleLibusbK = LoadLibraryEx(AllKConstants.LIBUSBK_DLL, IntPtr.Zero, LoadLibraryFlags.NONE) + Else + mModuleLibusbK = LoadLibraryEx(AllKOptions.LIBUSBK_FULLPATH_TO_ALTERNATE_DLL, IntPtr.Zero, LoadLibraryFlags.LOAD_WITH_ALTERED_SEARCH_PATH) + End If + + If mModuleLibusbK = IntPtr.Zero Then + Throw New DllNotFoundException("libusbK.dll not found. Please install drivers/applications and retry.") + End If + + LoadDynamicFunctions() + End Sub + + #Region "Nested Enumerations" + + _ + Private Enum LoadLibraryFlags + NONE = 0 + DONT_RESOLVE_DLL_REFERENCES = &H1 + LOAD_IGNORE_CODE_AUTHZ_LEVEL = &H10 + LOAD_LIBRARY_AS_DATAFILE = &H2 + LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = &H40 + LOAD_LIBRARY_AS_IMAGE_RESOURCE = &H20 + LOAD_WITH_ALTERED_SEARCH_PATH = &H8 + End Enum + + #End Region + + #Region "Public Members" + + Public Shared HotK_Free As HotK_FreeDelegate + Public Shared HotK_FreeAll As HotK_FreeAllDelegate + Public Shared HotK_Init As HotK_InitDelegate + Public Shared IsoK_EnumPackets As IsoK_EnumPacketsDelegate + Public Shared IsoK_Free As IsoK_FreeDelegate + Public Shared IsoK_GetPacket As IsoK_GetPacketDelegate + Public Shared IsoK_Init As IsoK_InitDelegate + Public Shared IsoK_ReUse As IsoK_ReUseDelegate + Public Shared IsoK_SetPacket As IsoK_SetPacketDelegate + Public Shared IsoK_SetPackets As IsoK_SetPacketsDelegate + Public Shared LibK_Context_Free As LibK_Context_FreeDelegate + Public Shared LibK_Context_Init As LibK_Context_InitDelegate + + Public Shared LibK_CopyDriverAPI As LibK_CopyDriverAPIDelegate + Public Shared LibK_GetContext As LibK_GetContextDelegate + Public Shared LibK_GetDefaultContext As LibK_GetDefaultContextDelegate + Public Shared LibK_GetProcAddress As LibK_GetProcAddressDelegate + Public Shared LibK_GetVersion As LibK_GetVersionDelegate + Public Shared LibK_LoadDriverAPI As LibK_LoadDriverAPIDelegate + Public Shared LibK_SetCleanupCallback As LibK_SetCleanupCallbackDelegate + Public Shared LibK_SetContext As LibK_SetContextDelegate + Public Shared LibK_SetDefaultContext As LibK_SetDefaultContextDelegate + Public Shared LstK_Count As LstK_CountDelegate + Public Shared LstK_Current As LstK_CurrentDelegate + Public Shared LstK_Enumerate As LstK_EnumerateDelegate + Public Shared LstK_FindByVidPid As LstK_FindByVidPidDelegate + Public Shared LstK_Free As LstK_FreeDelegate + Public Shared LstK_Init As LstK_InitDelegate + Public Shared LstK_InitEx As LstK_InitExDelegate + Public Shared LstK_MoveNext As LstK_MoveNextDelegate + Public Shared LstK_MoveReset As LstK_MoveResetDelegate + Public Shared OvlK_Acquire As OvlK_AcquireDelegate + Public Shared OvlK_Free As OvlK_FreeDelegate + Public Shared OvlK_GetEventHandle As OvlK_GetEventHandleDelegate + Public Shared OvlK_Init As OvlK_InitDelegate + Public Shared OvlK_IsComplete As OvlK_IsCompleteDelegate + Public Shared OvlK_ReUse As OvlK_ReUseDelegate + Public Shared OvlK_Release As OvlK_ReleaseDelegate + Public Shared OvlK_Wait As OvlK_WaitDelegate + Public Shared OvlK_WaitAndRelease As OvlK_WaitAndReleaseDelegate + Public Shared OvlK_WaitOldest As OvlK_WaitOldestDelegate + Public Shared OvlK_WaitOrCancel As OvlK_WaitOrCancelDelegate + Public Shared StmK_Free As StmK_FreeDelegate + Public Shared StmK_Init As StmK_InitDelegate + Public Shared StmK_Read As StmK_ReadDelegate + Public Shared StmK_Start As StmK_StartDelegate + Public Shared StmK_Stop As StmK_StopDelegate + Public Shared StmK_Write As StmK_WriteDelegate + Public Shared UsbK_Free As UsbK_FreeDelegate + + #End Region + + #Region "Private Members" + + Private Declare Ansi Function GetProcAddress Lib "kernel32.dll" (hModule As IntPtr, procName As String) As IntPtr + + Private Shared Sub LoadDynamicFunctions() + LibK_GetVersion = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_GetVersion"), GetType(LibK_GetVersionDelegate)), LibK_GetVersionDelegate) + LibK_GetContext = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_GetContext"), GetType(LibK_GetContextDelegate)), LibK_GetContextDelegate) + LibK_SetContext = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_SetContext"), GetType(LibK_SetContextDelegate)), LibK_SetContextDelegate) + LibK_SetCleanupCallback = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_SetCleanupCallback"), GetType(LibK_SetCleanupCallbackDelegate)), LibK_SetCleanupCallbackDelegate) + LibK_LoadDriverAPI = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_LoadDriverAPI"), GetType(LibK_LoadDriverAPIDelegate)), LibK_LoadDriverAPIDelegate) + LibK_CopyDriverAPI = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_CopyDriverAPI"), GetType(LibK_CopyDriverAPIDelegate)), LibK_CopyDriverAPIDelegate) + LibK_GetProcAddress = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_GetProcAddress"), GetType(LibK_GetProcAddressDelegate)), LibK_GetProcAddressDelegate) + LibK_SetDefaultContext = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_SetDefaultContext"), GetType(LibK_SetDefaultContextDelegate)), LibK_SetDefaultContextDelegate) + LibK_GetDefaultContext = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_GetDefaultContext"), GetType(LibK_GetDefaultContextDelegate)), LibK_GetDefaultContextDelegate) + LibK_Context_Init = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_Context_Init"), GetType(LibK_Context_InitDelegate)), LibK_Context_InitDelegate) + LibK_Context_Free = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LibK_Context_Free"), GetType(LibK_Context_FreeDelegate)), LibK_Context_FreeDelegate) + UsbK_Free = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "UsbK_Free"), GetType(UsbK_FreeDelegate)), UsbK_FreeDelegate) + LstK_Init = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Init"), GetType(LstK_InitDelegate)), LstK_InitDelegate) + LstK_InitEx = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_InitEx"), GetType(LstK_InitExDelegate)), LstK_InitExDelegate) + LstK_Free = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Free"), GetType(LstK_FreeDelegate)), LstK_FreeDelegate) + LstK_Enumerate = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Enumerate"), GetType(LstK_EnumerateDelegate)), LstK_EnumerateDelegate) + LstK_Current = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Current"), GetType(LstK_CurrentDelegate)), LstK_CurrentDelegate) + LstK_MoveNext = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_MoveNext"), GetType(LstK_MoveNextDelegate)), LstK_MoveNextDelegate) + LstK_MoveReset = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_MoveReset"), GetType(LstK_MoveResetDelegate)), LstK_MoveResetDelegate) + LstK_FindByVidPid = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_FindByVidPid"), GetType(LstK_FindByVidPidDelegate)), LstK_FindByVidPidDelegate) + LstK_Count = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "LstK_Count"), GetType(LstK_CountDelegate)), LstK_CountDelegate) + HotK_Init = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "HotK_Init"), GetType(HotK_InitDelegate)), HotK_InitDelegate) + HotK_Free = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "HotK_Free"), GetType(HotK_FreeDelegate)), HotK_FreeDelegate) + HotK_FreeAll = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "HotK_FreeAll"), GetType(HotK_FreeAllDelegate)), HotK_FreeAllDelegate) + OvlK_Acquire = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Acquire"), GetType(OvlK_AcquireDelegate)), OvlK_AcquireDelegate) + OvlK_Release = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Release"), GetType(OvlK_ReleaseDelegate)), OvlK_ReleaseDelegate) + OvlK_Init = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Init"), GetType(OvlK_InitDelegate)), OvlK_InitDelegate) + OvlK_Free = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Free"), GetType(OvlK_FreeDelegate)), OvlK_FreeDelegate) + OvlK_GetEventHandle = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_GetEventHandle"), GetType(OvlK_GetEventHandleDelegate)), OvlK_GetEventHandleDelegate) + OvlK_Wait = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_Wait"), GetType(OvlK_WaitDelegate)), OvlK_WaitDelegate) + OvlK_WaitOldest = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_WaitOldest"), GetType(OvlK_WaitOldestDelegate)), OvlK_WaitOldestDelegate) + OvlK_WaitOrCancel = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_WaitOrCancel"), GetType(OvlK_WaitOrCancelDelegate)), OvlK_WaitOrCancelDelegate) + OvlK_WaitAndRelease = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_WaitAndRelease"), GetType(OvlK_WaitAndReleaseDelegate)), OvlK_WaitAndReleaseDelegate) + OvlK_IsComplete = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_IsComplete"), GetType(OvlK_IsCompleteDelegate)), OvlK_IsCompleteDelegate) + OvlK_ReUse = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "OvlK_ReUse"), GetType(OvlK_ReUseDelegate)), OvlK_ReUseDelegate) + StmK_Init = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Init"), GetType(StmK_InitDelegate)), StmK_InitDelegate) + StmK_Free = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Free"), GetType(StmK_FreeDelegate)), StmK_FreeDelegate) + StmK_Start = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Start"), GetType(StmK_StartDelegate)), StmK_StartDelegate) + StmK_Stop = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Stop"), GetType(StmK_StopDelegate)), StmK_StopDelegate) + StmK_Read = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Read"), GetType(StmK_ReadDelegate)), StmK_ReadDelegate) + StmK_Write = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "StmK_Write"), GetType(StmK_WriteDelegate)), StmK_WriteDelegate) + IsoK_Init = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_Init"), GetType(IsoK_InitDelegate)), IsoK_InitDelegate) + IsoK_Free = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_Free"), GetType(IsoK_FreeDelegate)), IsoK_FreeDelegate) + IsoK_SetPackets = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_SetPackets"), GetType(IsoK_SetPacketsDelegate)), IsoK_SetPacketsDelegate) + IsoK_SetPacket = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_SetPacket"), GetType(IsoK_SetPacketDelegate)), IsoK_SetPacketDelegate) + IsoK_GetPacket = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_GetPacket"), GetType(IsoK_GetPacketDelegate)), IsoK_GetPacketDelegate) + IsoK_EnumPackets = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_EnumPackets"), GetType(IsoK_EnumPacketsDelegate)), IsoK_EnumPacketsDelegate) + IsoK_ReUse = DirectCast(Marshal.GetDelegateForFunctionPointer(GetProcAddress(mModuleLibusbK, "IsoK_ReUse"), GetType(IsoK_ReUseDelegate)), IsoK_ReUseDelegate) + End Sub + + _ + Private Shared Function LoadLibraryEx(lpFileName As String, hReservedNull As IntPtr, dwFlags As LoadLibraryFlags) As IntPtr + End Function + + Private Shared ReadOnly mModuleLibusbK As IntPtr = IntPtr.Zero + + #End Region + End Class + + #End Region + + #Region "Enumerations" + + ''' Values used in the \c bmAttributes field of a \ref USB_ENDPOINT_DESCRIPTOR + Public Enum USBD_PIPE_TYPE + ''' Indicates a control endpoint + UsbdPipeTypeControl + + ''' Indicates an isochronous endpoint + UsbdPipeTypeIsochronous + + ''' Indicates a bulk endpoint + UsbdPipeTypeBulk + + ''' Indicates an interrupt endpoint + UsbdPipeTypeInterrupt + End Enum + + ''' Additional ISO transfer flags. + _ + Public Enum KISO_FLAG + NONE = 0 + + ''' Do not start the transfer immediately, instead use \ref KISO_CONTEXT::StartFrame. + SET_START_FRAME = &H1 + End Enum + + ''' Handle type enumeration. + Public Enum KLIB_HANDLE_TYPE + ''' Hot plug handle. \ref KHOT_HANDLE + HOTK + + ''' USB handle. \ref KUSB_HANDLE + USBK + + ''' Shared USB handle. \ref KUSB_HANDLE + USBSHAREDK + + ''' Device list handle. \ref KLST_HANDLE + LSTK + + ''' Device info handle. \ref KLST_DEVINFO_HANDLE + LSTINFOK + + ''' Overlapped handle. \ref KOVL_HANDLE + OVLK + + ''' Overlapped pool handle. \ref KOVL_POOL_HANDLE + OVLPOOLK + + ''' Pipe stream handle. \ref KSTM_HANDLE + STMK + + ''' Max handle type count. + COUNT + End Enum + + ''' Device list sync flags. + _ + Public Enum KLST_SYNC_FLAG + ''' Cleared/invalid state. + NONE = 0 + + ''' Unchanged state, + UNCHANGED = &H1 + + ''' Added (Arrival) state, + ADDED = &H2 + + ''' Removed (Unplugged) state, + REMOVED = &H4 + + ''' Connect changed state. + CONNECT_CHANGE = &H8 + + ''' All states. + MASK = &Hf + End Enum + + ''' Device list initialization flags. + _ + Public Enum KLST_FLAG + ''' No flags (or 0) + NONE = 0 + + ''' Enable listings for the raw device interface GUID \b only. {A5DCBF10-6530-11D2-901F-00C04FB951ED} + INCLUDE_RAWGUID = &H1 + + ''' List all libusbK devices including those not currently connected. + INCLUDE_DISCONNECT = &H2 + End Enum + + ''' bmRequest.Dir + Public Enum BMREQUEST_DIR + HOST_TO_DEVICE = 0 + DEVICE_TO_HOST = 1 + End Enum + + ''' bmRequest.Type + Public Enum BMREQUEST_TYPE + ''' Standard request. See \ref USB_REQUEST_ENUM + STANDARD = 0 + + ''' Class-specific request. + [CLASS] = 1 + + ''' Vendor-specific request + VENDOR = 2 + End Enum + + ''' bmRequest.Recipient + Public Enum BMREQUEST_RECIPIENT + ''' Request is for a device. + DEVICE = 0 + + ''' Request is for an interface of a device. + [INTERFACE] = 1 + + ''' Request is for an endpoint of a device. + ENDPOINT = 2 + + ''' Request is for a vendor-specific purpose. + OTHER = 3 + End Enum + + ''' Values for the bits returned by the \ref USB_REQUEST_GET_STATUS request. + Public Enum USB_GETSTATUS + ''' Device is self powered + SELF_POWERED = &H1 + + ''' Device can wake the system from a low power/sleeping state. + REMOTE_WAKEUP_ENABLED = &H2 + End Enum + + ''' Standard USB descriptor types. For more information, see section 9-5 of the USB 3.0 specifications. + Public Enum USB_DESCRIPTOR_TYPE + ''' Device descriptor type. + DEVICE = &H1 + + ''' Configuration descriptor type. + CONFIGURATION = &H2 + + ''' String descriptor type. + [STRING] = &H3 + + ''' Interface descriptor type. + [INTERFACE] = &H4 + + ''' Endpoint descriptor type. + ENDPOINT = &H5 + + ''' Device qualifier descriptor type. + DEVICE_QUALIFIER = &H6 + + ''' Config power descriptor type. + CONFIG_POWER = &H7 + + ''' Interface power descriptor type. + INTERFACE_POWER = &H8 + + ''' Interface association descriptor type. + INTERFACE_ASSOCIATION = &Hb + End Enum + + ''' Usb handle specific properties that can be retrieved with \ref UsbK_GetProperty. + Public Enum KUSB_PROPERTY + ''' Get the internal device file handle used for operations such as GetOverlappedResult or DeviceIoControl. + DEVICE_FILE_HANDLE + + COUNT + End Enum + + ''' Supported driver id enumeration. + Public Enum KUSB_DRVID + ''' libusbK.sys driver ID + LIBUSBK + + ''' libusb0.sys driver ID + LIBUSB0 + + ''' WinUSB.sys driver ID + WINUSB + + ''' libusb0.sys filter driver ID + LIBUSB0_FILTER + + ''' Supported driver count + COUNT + End Enum + + ''' Supported function id enumeration. + Public Enum KUSB_FNID + ''' \ref UsbK_Init dynamic driver function id. + Init + + ''' \ref UsbK_Free dynamic driver function id. + Free + + ''' \ref UsbK_ClaimInterface dynamic driver function id. + ClaimInterface + + ''' \ref UsbK_ReleaseInterface dynamic driver function id. + ReleaseInterface + + ''' \ref UsbK_SetAltInterface dynamic driver function id. + SetAltInterface + + ''' \ref UsbK_GetAltInterface dynamic driver function id. + GetAltInterface + + ''' \ref UsbK_GetDescriptor dynamic driver function id. + GetDescriptor + + ''' \ref UsbK_ControlTransfer dynamic driver function id. + ControlTransfer + + ''' \ref UsbK_SetPowerPolicy dynamic driver function id. + SetPowerPolicy + + ''' \ref UsbK_GetPowerPolicy dynamic driver function id. + GetPowerPolicy + + ''' \ref UsbK_SetConfiguration dynamic driver function id. + SetConfiguration + + ''' \ref UsbK_GetConfiguration dynamic driver function id. + GetConfiguration + + ''' \ref UsbK_ResetDevice dynamic driver function id. + ResetDevice + + ''' \ref UsbK_Initialize dynamic driver function id. + Initialize + + ''' \ref UsbK_SelectInterface dynamic driver function id. + SelectInterface + + ''' \ref UsbK_GetAssociatedInterface dynamic driver function id. + GetAssociatedInterface + + ''' \ref UsbK_Clone dynamic driver function id. + Clone + + ''' \ref UsbK_QueryInterfaceSettings dynamic driver function id. + QueryInterfaceSettings + + ''' \ref UsbK_QueryDeviceInformation dynamic driver function id. + QueryDeviceInformation + + ''' \ref UsbK_SetCurrentAlternateSetting dynamic driver function id. + SetCurrentAlternateSetting + + ''' \ref UsbK_GetCurrentAlternateSetting dynamic driver function id. + GetCurrentAlternateSetting + + ''' \ref UsbK_QueryPipe dynamic driver function id. + QueryPipe + + ''' \ref UsbK_SetPipePolicy dynamic driver function id. + SetPipePolicy + + ''' \ref UsbK_GetPipePolicy dynamic driver function id. + GetPipePolicy + + ''' \ref UsbK_ReadPipe dynamic driver function id. + ReadPipe + + ''' \ref UsbK_WritePipe dynamic driver function id. + WritePipe + + ''' \ref UsbK_ResetPipe dynamic driver function id. + ResetPipe + + ''' \ref UsbK_AbortPipe dynamic driver function id. + AbortPipe + + ''' \ref UsbK_FlushPipe dynamic driver function id. + FlushPipe + + ''' \ref UsbK_IsoReadPipe dynamic driver function id. + IsoReadPipe + + ''' \ref UsbK_IsoWritePipe dynamic driver function id. + IsoWritePipe + + ''' \ref UsbK_GetCurrentFrameNumber dynamic driver function id. + GetCurrentFrameNumber + + ''' \ref UsbK_GetOverlappedResult dynamic driver function id. + GetOverlappedResult + + ''' \ref UsbK_GetProperty dynamic driver function id. + GetProperty + + + ''' Supported function count + COUNT + End Enum + + ''' Hot plug config flags. + _ + Public Enum KHOT_FLAG + ''' No flags (or 0) + NONE + + ''' Notify all devices which match upon a succuessful call to \ref HotK_Init. + PLUG_ALL_ON_INIT = &H1 + + ''' Allow other \ref KHOT_HANDLE instances to consume this match. + PASS_DUPE_INSTANCE = &H2 + + ''' If a \c UserHwnd is specified, use \c PostMessage instead of \c SendMessage. + POST_USER_MESSAGE = &H4 + End Enum + + ''' \c WaitFlags used by \ref OvlK_Wait. + _ + Public Enum KOVL_WAIT_FLAG + ''' Do not perform any additional actions upon exiting \ref OvlK_Wait. + NONE = 0 + + ''' If the i/o operation completes successfully, release the OverlappedK back to it's pool. + RELEASE_ON_SUCCESS = &H1 + + ''' If the i/o operation fails, release the OverlappedK back to it's pool. + RELEASE_ON_FAIL = &H2 + + ''' If the i/o operation fails or completes successfully, release the OverlappedK back to its pool. Perform no actions if it times-out. + RELEASE_ON_SUCCESS_FAIL = &H3 + + ''' If the i/o operation times-out cancel it, but do not release the OverlappedK back to its pool. + CANCEL_ON_TIMEOUT = &H4 + + ''' If the i/o operation times-out, cancel it and release the OverlappedK back to its pool. + RELEASE_ON_TIMEOUT = &Hc + + ''' Always release the OverlappedK back to its pool. If the operation timed-out, cancel it before releasing back to its pool. + RELEASE_ALWAYS = &Hf + + ''' Uses alterable wait functions. See http://msdn.microsoft.com/en-us/library/windows/desktop/ms687036%28v=vs.85%29.aspx + ALERTABLE = &H10 + End Enum + + ''' \c Overlapped pool config flags. + _ + Public Enum KOVL_POOL_FLAG + NONE = 0 + End Enum + + ''' Stream config flags. + _ + Public Enum KSTM_FLAG As UInteger + ''' None + NONE = 0 + NO_PARTIAL_XFERS = &H100000 + USE_TIMEOUT = &H80000000UI + TIMEOUT_MASK = &H1ffff + End Enum + + ''' Stream config flags. + Public Enum KSTM_COMPLETE_RESULT + ''' Valid + VALID = 0 + + ''' Invalid + INVALID + End Enum + + #End Region + + #Region "Structs" + + ''' The \c WINUSB_PIPE_INFORMATION structure contains pipe information that the \ref UsbK_QueryPipe routine retrieves. + _ + Public Structure WINUSB_PIPE_INFORMATION + ''' A \c USBD_PIPE_TYPE enumeration value that specifies the pipe type + Public PipeType As USBD_PIPE_TYPE + + ''' The pipe identifier (ID) + Public PipeId As Byte + + ''' The maximum size, in bytes, of the packets that are transmitted on the pipe + Public MaximumPacketSize As UShort + + ''' The pipe interval + Public Interval As Byte + + + Public Overrides Function ToString() As String + Return String.Format("PipeType: {0}" & vbLf & "PipeId: {1}" & vbLf & "MaximumPacketSize: {2}" & vbLf & "Interval: {3}" & vbLf, PipeType, PipeId.ToString("X2") & "h", MaximumPacketSize, Interval.ToString("X2") & "h") + End Function + End Structure + + ''' The \c WINUSB_SETUP_PACKET structure describes a USB setup packet. + _ + Public Structure WINUSB_SETUP_PACKET + ''' The request type. The values that are assigned to this member are defined in Table 9.2 of section 9.3 of the Universal Serial Bus (USB) specification (www.usb.org). + Public RequestType As Byte + + ''' The device request. The values that are assigned to this member are defined in Table 9.3 of section 9.4 of the Universal Serial Bus (USB) specification. + Public Request As Byte + + ''' The meaning of this member varies according to the request. For an explanation of this member, see the Universal Serial Bus (USB) specification. + Public Value As UShort + + ''' The meaning of this member varies according to the request. For an explanation of this member, see the Universal Serial Bus (USB) specification. + Public Index As UShort + + ''' The number of bytes to transfer. (not including the \c WINUSB_SETUP_PACKET itself) + Public Length As UShort + + + Public Overrides Function ToString() As String + Return String.Format("RequestType: {0}" & vbLf & "Request: {1}" & vbLf & "Value: {2}" & vbLf & "Index: {3}" & vbLf & "Length: {4}" & vbLf, RequestType.ToString("X2") & "h", Request.ToString("X2") & "h", Value.ToString("X4") & "h", Index.ToString("X4") & "h", Length) + End Function + End Structure + + ''' Structure describing an isochronous transfer packet. + _ + Public Structure KISO_PACKET + ''' Specifies the offset, in bytes, of the buffer for this packet from the beginning of the entire isochronous transfer data buffer. + Public Offset As Integer + + ''' Set by the host controller to indicate the actual number of bytes received by the device for isochronous IN transfers. Length not used for isochronous OUT transfers. + Public Length As UShort + + ''' Contains the 16 least significant USBD status bits, on return from the host controller driver, of this transfer packet. + Public Status As UShort + + + Public Overrides Function ToString() As String + Return String.Format("Offset: {0}" & vbLf & "Length: {1}" & vbLf & "Status: {2}" & vbLf, Offset, Length, Status.ToString("X4") & "h") + End Function + End Structure + + _ + Public Structure KISO_CONTEXT + Private ReadOnly mHandlePtr As IntPtr + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + Public ReadOnly Property Pointer() As IntPtr + Get + Return mHandlePtr + End Get + End Property + + ''' KISO_CONTEXT_MAP is used for calculating field offsets only + _ + Private Structure KISO_CONTEXT_MAP + ''' Additional ISO transfer flags. See \ref KISO_FLAG. + Private ReadOnly Flags As KISO_FLAG + + ''' Specifies the frame number that the transfer should begin on (0 for ASAP). + Private ReadOnly StartFrame As Integer + + ''' Contains the number of packets that completed with an error condition on return from the host controller driver. + Private ReadOnly ErrorCount As Short + + ''' Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + Private ReadOnly NumberOfPackets As Short + + ''' Contains the URB Hdr.Status value on return from the host controller driver. + Private ReadOnly UrbHdrStatus As Integer + End Structure + + Private Shared ReadOnly ofsFlags As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "Flags").ToInt32() + Private Shared ReadOnly ofsStartFrame As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "StartFrame").ToInt32() + Private Shared ReadOnly ofsErrorCount As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "ErrorCount").ToInt32() + Private Shared ReadOnly ofsNumberOfPackets As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "NumberOfPackets").ToInt32() + Private Shared ReadOnly ofsUrbHdrStatus As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "UrbHdrStatus").ToInt32() + + + ''' Additional ISO transfer flags. See \ref KISO_FLAG. + Public ReadOnly Property Flags() As KISO_FLAG + Get + Return CType(Marshal.ReadInt32(mHandlePtr, ofsFlags), KISO_FLAG) + End Get + End Property + + + ''' Specifies the frame number that the transfer should begin on (0 for ASAP). + Public ReadOnly Property StartFrame() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsStartFrame) + End Get + End Property + + + ''' Contains the number of packets that completed with an error condition on return from the host controller driver. + Public ReadOnly Property ErrorCount() As Short + Get + Return Marshal.ReadInt16(mHandlePtr, ofsErrorCount) + End Get + End Property + + + ''' Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + Public ReadOnly Property NumberOfPackets() As Short + Get + Return Marshal.ReadInt16(mHandlePtr, ofsNumberOfPackets) + End Get + End Property + + + ''' Contains the URB Hdr.Status value on return from the host controller driver. + Public ReadOnly Property UrbHdrStatus() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsUrbHdrStatus) + End Get + End Property + + + Public Overrides Function ToString() As String + Return String.Format("Flags: {0}" & vbLf & "StartFrame: {1}" & vbLf & "ErrorCount: {2}" & vbLf & "NumberOfPackets: {3}" & vbLf & "UrbHdrStatus: {4}" & vbLf, Flags.ToString(), StartFrame, ErrorCount, NumberOfPackets, UrbHdrStatus.ToString("X8") & "h") + End Function + End Structure + + ''' libusbK verson information structure. + _ + Public Structure KLIB_VERSION + ''' Major version number. + Public Major As Integer + + ''' Minor version number. + Public Minor As Integer + + ''' Micro version number. + Public Micro As Integer + + ''' Nano version number. + Public Nano As Integer + + Public Overrides Function ToString() As String + Return String.Format("Major: {0}" & vbLf & "Minor: {1}" & vbLf & "Micro: {2}" & vbLf & "Nano: {3}" & vbLf, Major, Minor, Micro, Nano) + End Function + End Structure + + ''' Common usb device information structure + _ + Public Structure KLST_DEV_COMMON_INFO + ''' VendorID parsed from \ref KLST_DEVINFO::DeviceID + Public Vid As Integer + + ''' ProductID parsed from \ref KLST_DEVINFO::DeviceID + Public Pid As Integer + + ''' Composite interface number parsed from \ref KLST_DEVINFO::DeviceID. Set to \b -1 for devices that do not have the composite parent driver. + Public MI As Integer + + ' An ID that uniquely identifies a USB device. + _ + Public InstanceID As String + + + Public Overrides Function ToString() As String + Return String.Format("Vid: {0}" & vbLf & "Pid: {1}" & vbLf & "MI: {2}" & vbLf & "InstanceID: {3}" & vbLf, Vid.ToString("X4") & "h", Pid.ToString("X4") & "h", MI.ToString("X2") & "h", InstanceID) + End Function + End Structure + + _ + Public Structure KLST_DEVINFO_HANDLE + Implements IKLIB_HANDLE + Private ReadOnly mHandlePtr As IntPtr + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + Public ReadOnly Property Pointer() As IntPtr Implements IKLIB_HANDLE.Pointer + Get + Return mHandlePtr + End Get + End Property + + Public ReadOnly Property HandleType() As KLIB_HANDLE_TYPE Implements IKLIB_HANDLE.HandleType + Get + Return KLIB_HANDLE_TYPE.LSTINFOK + End Get + End Property + + Public Function GetContext() As IntPtr Implements IKLIB_HANDLE.GetContext + Return AllKFunctions.LibK_GetContext(mHandlePtr, HandleType) + End Function + + Public Function SetContext(UserContext As IntPtr) As Boolean Implements IKLIB_HANDLE.SetContext + Return AllKFunctions.LibK_SetContext(mHandlePtr, HandleType, UserContext) + End Function + + Public Function SetCleanupCallback(CleanupCallback As KLIB_HANDLE_CLEANUP_CB) As Boolean Implements IKLIB_HANDLE.SetCleanupCallback + Return AllKFunctions.LibK_SetCleanupCallback(mHandlePtr, HandleType, CleanupCallback) + End Function + + ''' KLST_DEVINFO_MAP is used for calculating field offsets only + _ + Private Structure KLST_DEVINFO_MAP + ''' Common usb device information + Private ReadOnly Common As KLST_DEV_COMMON_INFO + + ''' Driver id this device element is using + Private ReadOnly DriverID As Integer + + ''' Device interface GUID + _ + Private ReadOnly DeviceInterfaceGUID As String + + ''' Device instance ID. + _ + Private ReadOnly DeviceID As String + + ''' Class GUID. + _ + Private ReadOnly ClassGUID As String + + ''' Manufacturer name as specified in the INF file. + _ + Private ReadOnly Mfg As String + + ''' Device description as specified in the INF file. + _ + Private ReadOnly DeviceDesc As String + + ''' Driver service name. + _ + Private ReadOnly Service As String + + ''' Unique identifier. + _ + Private ReadOnly SymbolicLink As String + + ''' physical device filename used with the Windows \c CreateFile() + _ + Private ReadOnly DevicePath As String + + ''' libusb-win32 filter index id. + Private ReadOnly LUsb0FilterIndex As Integer + + ''' Indicates the devices connection state. + Private ReadOnly Connected As Boolean + + ''' Synchronization flags. (internal use only) + Private ReadOnly SyncFlags As KLST_SYNC_FLAG + + Private ReadOnly BusNumber As Integer + + Private ReadOnly DeviceAddress As Integer + + ''' If the the device is serialized, represents the string value of \ref USB_DEVICE_DESCRIPTOR::iSerialNumber. For Devices without a \b iSerialNumber, represents the unique \b InstanceID assigned by \b Windows. + _ + Private ReadOnly SerialNumber As String + End Structure + + Private Shared ReadOnly ofsCommon As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "Common").ToInt32() + Private Shared ReadOnly ofsDriverID As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "DriverID").ToInt32() + Private Shared ReadOnly ofsDeviceInterfaceGUID As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "DeviceInterfaceGUID").ToInt32() + Private Shared ReadOnly ofsDeviceID As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "DeviceID").ToInt32() + Private Shared ReadOnly ofsClassGUID As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "ClassGUID").ToInt32() + Private Shared ReadOnly ofsMfg As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "Mfg").ToInt32() + Private Shared ReadOnly ofsDeviceDesc As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "DeviceDesc").ToInt32() + Private Shared ReadOnly ofsService As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "Service").ToInt32() + Private Shared ReadOnly ofsSymbolicLink As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "SymbolicLink").ToInt32() + Private Shared ReadOnly ofsDevicePath As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "DevicePath").ToInt32() + Private Shared ReadOnly ofsLUsb0FilterIndex As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "LUsb0FilterIndex").ToInt32() + Private Shared ReadOnly ofsConnected As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "Connected").ToInt32() + Private Shared ReadOnly ofsSyncFlags As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "SyncFlags").ToInt32() + Private Shared ReadOnly ofsBusNumber As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "BusNumber").ToInt32() + Private Shared ReadOnly ofsDeviceAddress As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "DeviceAddress").ToInt32() + Private Shared ReadOnly ofsSerialNumber As Integer = Marshal.OffsetOf(GetType(KLST_DEVINFO_MAP), "SerialNumber").ToInt32() + + + ''' Common usb device information + Public ReadOnly Property Common() As KLST_DEV_COMMON_INFO + Get + Return CType(Marshal.PtrToStructure(New IntPtr(mHandlePtr.ToInt64() + ofsCommon), GetType(KLST_DEV_COMMON_INFO)), KLST_DEV_COMMON_INFO) + End Get + End Property + + + ''' Driver id this device element is using + Public ReadOnly Property DriverID() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsDriverID) + End Get + End Property + + + ''' Device interface GUID + Public ReadOnly Property DeviceInterfaceGUID() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsDeviceInterfaceGUID)) + End Get + End Property + + + ''' Device instance ID. + Public ReadOnly Property DeviceID() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsDeviceID)) + End Get + End Property + + + ''' Class GUID. + Public ReadOnly Property ClassGUID() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsClassGUID)) + End Get + End Property + + + ''' Manufacturer name as specified in the INF file. + Public ReadOnly Property Mfg() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsMfg)) + End Get + End Property + + + ''' Device description as specified in the INF file. + Public ReadOnly Property DeviceDesc() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsDeviceDesc)) + End Get + End Property + + + ''' Driver service name. + Public ReadOnly Property Service() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsService)) + End Get + End Property + + + ''' Unique identifier. + Public ReadOnly Property SymbolicLink() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsSymbolicLink)) + End Get + End Property + + + ''' physical device filename used with the Windows \c CreateFile() + Public ReadOnly Property DevicePath() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsDevicePath)) + End Get + End Property + + + ''' libusb-win32 filter index id. + Public ReadOnly Property LUsb0FilterIndex() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsLUsb0FilterIndex) + End Get + End Property + + + ''' Indicates the devices connection state. + Public ReadOnly Property Connected() As Boolean + Get + Return Marshal.ReadInt32(mHandlePtr, ofsConnected) <> 0 + End Get + End Property + + + ''' Synchronization flags. (internal use only) + Public ReadOnly Property SyncFlags() As KLST_SYNC_FLAG + Get + Return CType(Marshal.ReadInt32(mHandlePtr, ofsSyncFlags), KLST_SYNC_FLAG) + End Get + End Property + + + Public ReadOnly Property BusNumber() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsBusNumber) + End Get + End Property + + + Public ReadOnly Property DeviceAddress() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsDeviceAddress) + End Get + End Property + + + ''' If the the device is serialized, represents the string value of \ref USB_DEVICE_DESCRIPTOR::iSerialNumber. For Devices without a \b iSerialNumber, represents the unique \b InstanceID assigned by \b Windows. + Public ReadOnly Property SerialNumber() As String + Get + Return Marshal.PtrToStringAnsi(New IntPtr(mHandlePtr.ToInt64() + ofsSerialNumber)) + End Get + End Property + + + Public Overrides Function ToString() As String + Return String.Format("DriverID: {0}" & vbLf & "DeviceInterfaceGUID: {1}" & vbLf & "DeviceID: {2}" & vbLf & "ClassGUID: {3}" & vbLf & "Mfg: {4}" & vbLf & "DeviceDesc: {5}" & vbLf & "Service: {6}" & vbLf & "SymbolicLink: {7}" & vbLf & "DevicePath: {8}" & vbLf & "LUsb0FilterIndex: {9}" & vbLf & "Connected: {10}" & vbLf & "SyncFlags: {11}" & vbLf & "BusNumber: {12}" & vbLf & "DeviceAddress: {13}" & vbLf & "SerialNumber: {14}" & vbLf, DriverID, DeviceInterfaceGUID, DeviceID, ClassGUID, Mfg, _ + DeviceDesc, Service, SymbolicLink, DevicePath, LUsb0FilterIndex, Connected, _ + SyncFlags.ToString(), BusNumber, DeviceAddress, SerialNumber) + End Function + End Structure + + ''' Device list/hot-plug pattern match structure. + _ + Public Structure KLST_PATTERN_MATCH + ''' Pattern match a device instance id. + _ + Public DeviceID As String + + ''' Pattern match a device interface guid. + _ + Public DeviceInterfaceGUID As String + + ''' Pattern match a symbolic link. + _ + Public ClassGUID As String + + + Public Overrides Function ToString() As String + Return String.Format("DeviceID: {0}" & vbLf & "DeviceInterfaceGUID: {1}" & vbLf & "ClassGUID: {2}" & vbLf, DeviceID, DeviceInterfaceGUID, ClassGUID) + End Function + End Structure + + ''' A structure representing the standard USB device descriptor. + _ + Public Structure USB_DEVICE_DESCRIPTOR + ''' Size of this descriptor (in bytes) + Public bLength As Byte + + ''' Descriptor type + Public bDescriptorType As Byte + + ''' USB specification release number in binary-coded decimal. + Public bcdUSB As UShort + + ''' USB-IF class code for the device + Public bDeviceClass As Byte + + ''' USB-IF subclass code for the device + Public bDeviceSubClass As Byte + + ''' USB-IF protocol code for the device + Public bDeviceProtocol As Byte + + ''' Maximum packet size for control endpoint 0 + Public bMaxPacketSize0 As Byte + + ''' USB-IF vendor ID + Public idVendor As UShort + + ''' USB-IF product ID + Public idProduct As UShort + + ''' Device release number in binary-coded decimal + Public bcdDevice As UShort + + ''' Index of string descriptor describing manufacturer + Public iManufacturer As Byte + + ''' Index of string descriptor describing product + Public iProduct As Byte + + ''' Index of string descriptor containing device serial number + Public iSerialNumber As Byte + + ''' Number of possible configurations + Public bNumConfigurations As Byte + + + Public Overrides Function ToString() As String + Return String.Format("bLength: {0}" & vbLf & "bDescriptorType: {1}" & vbLf & "bcdUSB: {2}" & vbLf & "bDeviceClass: {3}" & vbLf & "bDeviceSubClass: {4}" & vbLf & "bDeviceProtocol: {5}" & vbLf & "bMaxPacketSize0: {6}" & vbLf & "idVendor: {7}" & vbLf & "idProduct: {8}" & vbLf & "bcdDevice: {9}" & vbLf & "iManufacturer: {10}" & vbLf & "iProduct: {11}" & vbLf & "iSerialNumber: {12}" & vbLf & "bNumConfigurations: {13}" & vbLf, bLength, bDescriptorType.ToString("X2") & "h", bcdUSB.ToString("X4") & "h", bDeviceClass.ToString("X2") & "h", bDeviceSubClass.ToString("X2") & "h", _ + bDeviceProtocol.ToString("X2") & "h", bMaxPacketSize0, idVendor.ToString("X4") & "h", idProduct.ToString("X4") & "h", bcdDevice.ToString("X4") & "h", iManufacturer, _ + iProduct, iSerialNumber, bNumConfigurations) + End Function + End Structure + + ''' A structure representing the standard USB endpoint descriptor. + _ + Public Structure USB_ENDPOINT_DESCRIPTOR + ''' Size of this descriptor (in bytes) + Public bLength As Byte + + ''' Descriptor type + Public bDescriptorType As Byte + + ''' The address of the endpoint described by this descriptor. + Public bEndpointAddress As Byte + + ''' Attributes which apply to the endpoint when it is configured using the bConfigurationValue. + Public bmAttributes As Byte + + ''' Maximum packet size this endpoint is capable of sending/receiving. + Public wMaxPacketSize As UShort + + ''' Interval for polling endpoint for data transfers. + Public bInterval As Byte + + + Public Overrides Function ToString() As String + Return String.Format("bLength: {0}" & vbLf & "bDescriptorType: {1}" & vbLf & "bEndpointAddress: {2}" & vbLf & "bmAttributes: {3}" & vbLf & "wMaxPacketSize: {4}" & vbLf & "bInterval: {5}" & vbLf, bLength, bDescriptorType.ToString("X2") & "h", bEndpointAddress.ToString("X2") & "h", bmAttributes.ToString("X2") & "h", wMaxPacketSize, _ + bInterval) + End Function + End Structure + + ''' A structure representing the standard USB configuration descriptor. + _ + Public Structure USB_CONFIGURATION_DESCRIPTOR + ''' Size of this descriptor (in bytes) + Public bLength As Byte + + ''' Descriptor type + Public bDescriptorType As Byte + + ''' Total length of data returned for this configuration + Public wTotalLength As UShort + + ''' Number of interfaces supported by this configuration + Public bNumInterfaces As Byte + + ''' Identifier value for this configuration + Public bConfigurationValue As Byte + + ''' Index of string descriptor describing this configuration + Public iConfiguration As Byte + + ''' Configuration characteristics + Public bmAttributes As Byte + + ''' Maximum power consumption of the USB device from this bus in this configuration when the device is fully operation. + Public MaxPower As Byte + + Public Overrides Function ToString() As String + Return String.Format("bLength: {0}" & vbLf & "bDescriptorType: {1}" & vbLf & "wTotalLength: {2}" & vbLf & "bNumInterfaces: {3}" & vbLf & "bConfigurationValue: {4}" & vbLf & "iConfiguration: {5}" & vbLf & "bmAttributes: {6}" & vbLf & "MaxPower: {7}" & vbLf, bLength, bDescriptorType.ToString("X2") & "h", wTotalLength, bNumInterfaces, bConfigurationValue, _ + iConfiguration, bmAttributes.ToString("X2") & "h", MaxPower) + End Function + End Structure + + ''' A structure representing the standard USB interface descriptor. + _ + Public Structure USB_INTERFACE_DESCRIPTOR + ''' Size of this descriptor (in bytes) + Public bLength As Byte + + ''' Descriptor type + Public bDescriptorType As Byte + + ''' Number of this interface + Public bInterfaceNumber As Byte + + ''' Value used to select this alternate setting for this interface + Public bAlternateSetting As Byte + + ''' Number of endpoints used by this interface (excluding the control endpoint) + Public bNumEndpoints As Byte + + ''' USB-IF class code for this interface + Public bInterfaceClass As Byte + + ''' USB-IF subclass code for this interface + Public bInterfaceSubClass As Byte + + ''' USB-IF protocol code for this interface + Public bInterfaceProtocol As Byte + + ''' Index of string descriptor describing this interface + Public iInterface As Byte + + + Public Overrides Function ToString() As String + Return String.Format("bLength: {0}" & vbLf & "bDescriptorType: {1}" & vbLf & "bInterfaceNumber: {2}" & vbLf & "bAlternateSetting: {3}" & vbLf & "bNumEndpoints: {4}" & vbLf & "bInterfaceClass: {5}" & vbLf & "bInterfaceSubClass: {6}" & vbLf & "bInterfaceProtocol: {7}" & vbLf & "iInterface: {8}" & vbLf, bLength, bDescriptorType.ToString("X2") & "h", bInterfaceNumber, bAlternateSetting, bNumEndpoints, _ + bInterfaceClass.ToString("X2") & "h", bInterfaceSubClass.ToString("X2") & "h", bInterfaceProtocol.ToString("X2") & "h", iInterface) + End Function + End Structure + + ''' A structure representing the standard USB string descriptor. + _ + Public Structure USB_STRING_DESCRIPTOR + ''' Size of this descriptor (in bytes) + Public bLength As Byte + + ''' Descriptor type + Public bDescriptorType As Byte + + ''' Content of the string + _ + Public bString As String + + + Public Overrides Function ToString() As String + Return String.Format("bLength: {0}" & vbLf & "bDescriptorType: {1}" & vbLf & "bString: {2}" & vbLf, bLength, bDescriptorType.ToString("X2") & "h", bString) + End Function + End Structure + + ''' A structure representing the common USB descriptor. + _ + Public Structure USB_COMMON_DESCRIPTOR + ''' Size of this descriptor (in bytes) + Public bLength As Byte + + ''' Descriptor type + Public bDescriptorType As Byte + + + Public Overrides Function ToString() As String + Return String.Format("bLength: {0}" & vbLf & "bDescriptorType: {1}" & vbLf, bLength, bDescriptorType.ToString("X2") & "h") + End Function + End Structure + + ''' Allows hardware manufacturers to define groupings of interfaces. + _ + Public Structure USB_INTERFACE_ASSOCIATION_DESCRIPTOR + ''' Size of this descriptor (in bytes) + Public bLength As Byte + + ''' Descriptor type + Public bDescriptorType As Byte + + ''' First interface number of the set of interfaces that follow this descriptor + Public bFirstInterface As Byte + + ''' The Number of interfaces follow this descriptor that are considered "associated" + Public bInterfaceCount As Byte + + ''' \c bInterfaceClass used for this associated interfaces + Public bFunctionClass As Byte + + ''' \c bInterfaceSubClass used for the associated interfaces + Public bFunctionSubClass As Byte + + ''' \c bInterfaceProtocol used for the associated interfaces + Public bFunctionProtocol As Byte + + ''' Index of string descriptor describing the associated interfaces + Public iFunction As Byte + + + Public Overrides Function ToString() As String + Return String.Format("bLength: {0}" & vbLf & "bDescriptorType: {1}" & vbLf & "bFirstInterface: {2}" & vbLf & "bInterfaceCount: {3}" & vbLf & "bFunctionClass: {4}" & vbLf & "bFunctionSubClass: {5}" & vbLf & "bFunctionProtocol: {6}" & vbLf & "iFunction: {7}" & vbLf, bLength, bDescriptorType.ToString("X2") & "h", bFirstInterface, bInterfaceCount, bFunctionClass.ToString("X2") & "h", _ + bFunctionSubClass.ToString("X2") & "h", bFunctionProtocol.ToString("X2") & "h", iFunction) + End Function + End Structure + + ''' USB core driver API information structure. + _ + Public Structure KUSB_DRIVER_API_INFO + ''' \readonly Driver id of the driver api. + Public DriverID As Integer + + ''' \readonly Number of valid functions contained in the driver API. + Public FunctionCount As Integer + + + Public Overrides Function ToString() As String + Return String.Format("DriverID: {0}" & vbLf & "FunctionCount: {1}" & vbLf, DriverID, FunctionCount) + End Function + End Structure + + ''' Driver API function set structure. + _ + Public Structure KUSB_DRIVER_API + ''' Driver API information. + Public Info As KUSB_DRIVER_API_INFO + + + _ + Public Init As KUSB_InitDelegate + + + _ + Public Free As KUSB_FreeDelegate + + + _ + Public ClaimInterface As KUSB_ClaimInterfaceDelegate + + + _ + Public ReleaseInterface As KUSB_ReleaseInterfaceDelegate + + + _ + Public SetAltInterface As KUSB_SetAltInterfaceDelegate + + + _ + Public GetAltInterface As KUSB_GetAltInterfaceDelegate + + + _ + Public GetDescriptor As KUSB_GetDescriptorDelegate + + + _ + Public ControlTransfer As KUSB_ControlTransferDelegate + + + _ + Public SetPowerPolicy As KUSB_SetPowerPolicyDelegate + + + _ + Public GetPowerPolicy As KUSB_GetPowerPolicyDelegate + + + _ + Public SetConfiguration As KUSB_SetConfigurationDelegate + + + _ + Public GetConfiguration As KUSB_GetConfigurationDelegate + + + _ + Public ResetDevice As KUSB_ResetDeviceDelegate + + + _ + Public Initialize As KUSB_InitializeDelegate + + + _ + Public SelectInterface As KUSB_SelectInterfaceDelegate + + + _ + Public GetAssociatedInterface As KUSB_GetAssociatedInterfaceDelegate + + + _ + Public Clone As KUSB_CloneDelegate + + + _ + Public QueryInterfaceSettings As KUSB_QueryInterfaceSettingsDelegate + + + _ + Public QueryDeviceInformation As KUSB_QueryDeviceInformationDelegate + + + _ + Public SetCurrentAlternateSetting As KUSB_SetCurrentAlternateSettingDelegate + + + _ + Public GetCurrentAlternateSetting As KUSB_GetCurrentAlternateSettingDelegate + + + _ + Public QueryPipe As KUSB_QueryPipeDelegate + + + _ + Public SetPipePolicy As KUSB_SetPipePolicyDelegate + + + _ + Public GetPipePolicy As KUSB_GetPipePolicyDelegate + + + _ + Public ReadPipe As KUSB_ReadPipeDelegate + + + _ + Public WritePipe As KUSB_WritePipeDelegate + + + _ + Public ResetPipe As KUSB_ResetPipeDelegate + + + _ + Public AbortPipe As KUSB_AbortPipeDelegate + + + _ + Public FlushPipe As KUSB_FlushPipeDelegate + + + _ + Public IsoReadPipe As KUSB_IsoReadPipeDelegate + + + _ + Public IsoWritePipe As KUSB_IsoWritePipeDelegate + + + _ + Public GetCurrentFrameNumber As KUSB_GetCurrentFrameNumberDelegate + + + _ + Public GetOverlappedResult As KUSB_GetOverlappedResultDelegate + + + _ + Public GetProperty As KUSB_GetPropertyDelegate + End Structure + + ''' Hot plug parameter structure. + _ + Public Structure KHOT_PARAMS + ''' Hot plug event window handle to send/post messages when notifications occur. + Public UserHwnd As IntPtr + + ''' WM_USER message start offset used when sending/posting messages, See details. + Public UserMessage As Integer + + ''' Additional init/config parameters + Public Flags As KHOT_FLAG + + ''' File pattern matches for restricting notifcations to a single/group or all supported usb devices. + Public PatternMatch As KLST_PATTERN_MATCH + + ''' Hot plug event callback function invoked when notifications occur. + _ + Public OnHotPlug As KHOT_PLUG_CB + + + Public Overrides Function ToString() As String + Return String.Format("UserHwnd: {0}" & vbLf & "UserMessage: {1}" & vbLf & "Flags: {2}" & vbLf, UserHwnd.ToString("X16") & "h", UserMessage.ToString("X8") & "h", Flags.ToString()) + End Function + End Structure + + _ + Public Structure KSTM_XFER_CONTEXT + Private ReadOnly mHandlePtr As IntPtr + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + Public ReadOnly Property Pointer() As IntPtr + Get + Return mHandlePtr + End Get + End Property + + ''' KSTM_XFER_CONTEXT_MAP is used for calculating field offsets only + _ + Private Structure KSTM_XFER_CONTEXT_MAP + ''' Internal stream buffer. + Private ReadOnly Buffer As IntPtr + + ''' Size of internal stream buffer. + Private ReadOnly BufferSize As Integer + + ''' Number of bytes to write or number of bytes read. + Private ReadOnly TransferLength As Integer + + ''' User defined state. + Private ReadOnly UserState As IntPtr + End Structure + + Private Shared ReadOnly ofsBuffer As Integer = Marshal.OffsetOf(GetType(KSTM_XFER_CONTEXT_MAP), "Buffer").ToInt32() + Private Shared ReadOnly ofsBufferSize As Integer = Marshal.OffsetOf(GetType(KSTM_XFER_CONTEXT_MAP), "BufferSize").ToInt32() + Private Shared ReadOnly ofsTransferLength As Integer = Marshal.OffsetOf(GetType(KSTM_XFER_CONTEXT_MAP), "TransferLength").ToInt32() + Private Shared ReadOnly ofsUserState As Integer = Marshal.OffsetOf(GetType(KSTM_XFER_CONTEXT_MAP), "UserState").ToInt32() + + + ''' Internal stream buffer. + Public ReadOnly Property Buffer() As IntPtr + Get + Return Marshal.ReadIntPtr(mHandlePtr, ofsBuffer) + End Get + End Property + + + ''' Size of internal stream buffer. + Public ReadOnly Property BufferSize() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsBufferSize) + End Get + End Property + + + ''' Number of bytes to write or number of bytes read. + Public ReadOnly Property TransferLength() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsTransferLength) + End Get + End Property + + + ''' User defined state. + Public Property UserState() As IntPtr + Get + Return Marshal.ReadIntPtr(mHandlePtr, ofsUserState) + End Get + Set + Marshal.WriteIntPtr(mHandlePtr, ofsUserState, value) + End Set + End Property + + + Public Overrides Function ToString() As String + Return String.Format("Buffer: {0}" & vbLf & "BufferSize: {1}" & vbLf & "TransferLength: {2}" & vbLf & "UserState: {3}" & vbLf, Buffer.ToString("X16") & "h", BufferSize, TransferLength, UserState.ToString("X16") & "h") + End Function + End Structure + + _ + Public Structure KSTM_INFO + Private ReadOnly mHandlePtr As IntPtr + + Public Sub New(Handle As IntPtr) + mHandlePtr = Handle + End Sub + + Public ReadOnly Property Pointer() As IntPtr + Get + Return mHandlePtr + End Get + End Property + + ''' KSTM_INFO_MAP is used for calculating field offsets only + _ + Private Structure KSTM_INFO_MAP + ''' \ref KUSB_HANDLE this stream uses. + Private ReadOnly UsbHandle As IntPtr + + ''' This parameter corresponds to the bEndpointAddress field in the endpoint descriptor. + Private ReadOnly PipeID As Byte + + ''' Maximum transfer read/write request allowed pending. + Private ReadOnly MaxPendingTransfers As Integer + + ''' Maximum transfer sage size. + Private ReadOnly MaxTransferSize As Integer + + ''' Maximum number of I/O request allowed pending. + Private ReadOnly MaxPendingIO As Integer + + ''' Populated with the endpoint descriptor for the specified \c PipeID. + Private ReadOnly EndpointDescriptor As USB_ENDPOINT_DESCRIPTOR + + ''' Populated with the driver api for the specified \c UsbHandle. + Private ReadOnly DriverAPI As KUSB_DRIVER_API + + ''' Populated with the device file handle for the specified \c UsbHandle. + Private ReadOnly DeviceHandle As IntPtr + + ''' Stream handle. + Private ReadOnly StreamHandle As IntPtr + + ''' Stream info user defined state. + Private ReadOnly UserState As IntPtr + End Structure + + Private Shared ReadOnly ofsUsbHandle As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "UsbHandle").ToInt32() + Private Shared ReadOnly ofsPipeID As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "PipeID").ToInt32() + Private Shared ReadOnly ofsMaxPendingTransfers As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "MaxPendingTransfers").ToInt32() + Private Shared ReadOnly ofsMaxTransferSize As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "MaxTransferSize").ToInt32() + Private Shared ReadOnly ofsMaxPendingIO As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "MaxPendingIO").ToInt32() + Private Shared ReadOnly ofsEndpointDescriptor As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "EndpointDescriptor").ToInt32() + Private Shared ReadOnly ofsDriverAPI As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "DriverAPI").ToInt32() + Private Shared ReadOnly ofsDeviceHandle As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "DeviceHandle").ToInt32() + Private Shared ReadOnly ofsStreamHandle As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "StreamHandle").ToInt32() + Private Shared ReadOnly ofsUserState As Integer = Marshal.OffsetOf(GetType(KSTM_INFO_MAP), "UserState").ToInt32() + + + ''' \ref KUSB_HANDLE this stream uses. + Public ReadOnly Property UsbHandle() As IntPtr + Get + Return Marshal.ReadIntPtr(mHandlePtr, ofsUsbHandle) + End Get + End Property + + + ''' This parameter corresponds to the bEndpointAddress field in the endpoint descriptor. + Public ReadOnly Property PipeID() As Byte + Get + Return Marshal.ReadByte(mHandlePtr, ofsPipeID) + End Get + End Property + + + ''' Maximum transfer read/write request allowed pending. + Public ReadOnly Property MaxPendingTransfers() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsMaxPendingTransfers) + End Get + End Property + + + ''' Maximum transfer sage size. + Public ReadOnly Property MaxTransferSize() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsMaxTransferSize) + End Get + End Property + + + ''' Maximum number of I/O request allowed pending. + Public ReadOnly Property MaxPendingIO() As Integer + Get + Return Marshal.ReadInt32(mHandlePtr, ofsMaxPendingIO) + End Get + End Property + + + ''' Populated with the endpoint descriptor for the specified \c PipeID. + Public ReadOnly Property EndpointDescriptor() As USB_ENDPOINT_DESCRIPTOR + Get + Return CType(Marshal.PtrToStructure(New IntPtr(mHandlePtr.ToInt64() + ofsEndpointDescriptor), GetType(USB_ENDPOINT_DESCRIPTOR)), USB_ENDPOINT_DESCRIPTOR) + End Get + End Property + + + ''' Populated with the driver api for the specified \c UsbHandle. + Public ReadOnly Property DriverAPI() As KUSB_DRIVER_API + Get + Return CType(Marshal.PtrToStructure(New IntPtr(mHandlePtr.ToInt64() + ofsDriverAPI), GetType(KUSB_DRIVER_API)), KUSB_DRIVER_API) + End Get + End Property + + + ''' Populated with the device file handle for the specified \c UsbHandle. + Public ReadOnly Property DeviceHandle() As IntPtr + Get + Return Marshal.ReadIntPtr(mHandlePtr, ofsDeviceHandle) + End Get + End Property + + + ''' Stream handle. + Public ReadOnly Property StreamHandle() As IntPtr + Get + Return Marshal.ReadIntPtr(mHandlePtr, ofsStreamHandle) + End Get + End Property + + + ''' Stream info user defined state. + Public Property UserState() As IntPtr + Get + Return Marshal.ReadIntPtr(mHandlePtr, ofsUserState) + End Get + Set + Marshal.WriteIntPtr(mHandlePtr, ofsUserState, value) + End Set + End Property + + + Public Overrides Function ToString() As String + Return String.Format("UsbHandle: {0}" & vbLf & "PipeID: {1}" & vbLf & "MaxPendingTransfers: {2}" & vbLf & "MaxTransferSize: {3}" & vbLf & "MaxPendingIO: {4}" & vbLf & "DeviceHandle: {5}" & vbLf & "StreamHandle: {6}" & vbLf & "UserState: {7}" & vbLf, UsbHandle.ToString("X16") & "h", PipeID.ToString("X2") & "h", MaxPendingTransfers, MaxTransferSize, MaxPendingIO, _ + DeviceHandle.ToString("X16") & "h", StreamHandle.ToString("X16") & "h", UserState.ToString("X16") & "h") + End Function + End Structure + + ''' Stream callback structure. + _ + Public Structure KSTM_CALLBACK + ''' Executed when a transfer error occurs. + _ + Public [Error] As KSTM_ERROR_CB + + ''' Executed to submit a transfer. + _ + Public Submit As KSTM_SUBMIT_CB + + ''' Executed when a valid transfer completes. + _ + Public Complete As KSTM_COMPLETE_CB + + ''' Executed for every transfer context when the stream is started with \ref StmK_Start. + _ + Public Started As KSTM_STARTED_CB + + ''' Executed for every transfer context when the stream is stopped with \ref StmK_Stop. + _ + Public Stopped As KSTM_STOPPED_CB + + ''' Executed immediately after a transfer completes. + _ + Public BeforeComplete As KSTM_BEFORE_COMPLETE_CB + End Structure + + #End Region + + #Region "Delegates" + + _ + Public Delegate Function KLIB_HANDLE_CLEANUP_CB(<[In]> Handle As IntPtr, HandleType As KLIB_HANDLE_TYPE, UserContext As IntPtr) As Integer + + _ + Public Delegate Function KISO_ENUM_PACKETS_CB(PacketIndex As Integer, <[In]> ByRef IsoPacket As KISO_PACKET, UserState As IntPtr) As Boolean + + _ + Public Delegate Function KLST_ENUM_DEVINFO_CB(<[In]> DeviceList As KLST_HANDLE, <[In]> DeviceInfo As KLST_DEVINFO_HANDLE, Context As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_InitDelegate( ByRef InterfaceHandle As KUSB_HANDLE, <[In]> DevInfo As KLST_DEVINFO_HANDLE) As Boolean + + _ + Public Delegate Function KUSB_FreeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE) As Boolean + + _ + Public Delegate Function KUSB_ClaimInterfaceDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, NumberOrIndex As Byte, IsIndex As Boolean) As Boolean + + _ + Public Delegate Function KUSB_ReleaseInterfaceDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, NumberOrIndex As Byte, IsIndex As Boolean) As Boolean + + _ + Public Delegate Function KUSB_SetAltInterfaceDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, NumberOrIndex As Byte, IsIndex As Boolean, AltSettingNumber As Byte) As Boolean + + _ + Public Delegate Function KUSB_GetAltInterfaceDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, NumberOrIndex As Byte, IsIndex As Boolean, ByRef AltSettingNumber As Byte) As Boolean + + _ + Public Delegate Function KUSB_GetDescriptorDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, DescriptorType As Byte, Index As Byte, LanguageID As UShort, Buffer As IntPtr, BufferLength As Integer, _ + ByRef LengthTransferred As Integer) As Boolean + + _ + Public Delegate Function KUSB_ControlTransferDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, SetupPacket As WINUSB_SETUP_PACKET, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_SetPowerPolicyDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PolicyType As Integer, ValueLength As Integer, Value As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_GetPowerPolicyDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PolicyType As Integer, ByRef ValueLength As Integer, Value As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_SetConfigurationDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, ConfigurationNumber As Byte) As Boolean + + _ + Public Delegate Function KUSB_GetConfigurationDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, ByRef ConfigurationNumber As Byte) As Boolean + + _ + Public Delegate Function KUSB_ResetDeviceDelegate(<[In]> InterfaceHandle As KUSB_HANDLE) As Boolean + + _ + Public Delegate Function KUSB_InitializeDelegate(DeviceHandle As IntPtr, ByRef InterfaceHandle As KUSB_HANDLE) As Boolean + + _ + Public Delegate Function KUSB_SelectInterfaceDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, NumberOrIndex As Byte, IsIndex As Boolean) As Boolean + + _ + Public Delegate Function KUSB_GetAssociatedInterfaceDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, AssociatedInterfaceIndex As Byte, ByRef AssociatedInterfaceHandle As KUSB_HANDLE) As Boolean + + _ + Public Delegate Function KUSB_CloneDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, ByRef DstInterfaceHandle As KUSB_HANDLE) As Boolean + + _ + Public Delegate Function KUSB_QueryInterfaceSettingsDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, AltSettingIndex As Byte, ByRef UsbAltInterfaceDescriptor As USB_INTERFACE_DESCRIPTOR) As Boolean + + _ + Public Delegate Function KUSB_QueryDeviceInformationDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, InformationType As Integer, ByRef BufferLength As Integer, Buffer As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_SetCurrentAlternateSettingDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, AltSettingNumber As Byte) As Boolean + + _ + Public Delegate Function KUSB_GetCurrentAlternateSettingDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, ByRef AltSettingNumber As Byte) As Boolean + + _ + Public Delegate Function KUSB_QueryPipeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, AltSettingNumber As Byte, PipeIndex As Byte, ByRef PipeInformation As WINUSB_PIPE_INFORMATION) As Boolean + + _ + Public Delegate Function KUSB_SetPipePolicyDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte, PolicyType As Integer, ValueLength As Integer, Value As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_GetPipePolicyDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte, PolicyType As Integer, ByRef ValueLength As Integer, Value As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_ReadPipeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_WritePipeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + + _ + Public Delegate Function KUSB_ResetPipeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte) As Boolean + + _ + Public Delegate Function KUSB_AbortPipeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte) As Boolean + + _ + Public Delegate Function KUSB_FlushPipeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte) As Boolean + + _ + Public Delegate Function KUSB_IsoReadPipeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, Overlapped As IntPtr, <[In]> IsoContext As KISO_CONTEXT) As Boolean + + _ + Public Delegate Function KUSB_IsoWritePipeDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, Overlapped As IntPtr, <[In]> IsoContext As KISO_CONTEXT) As Boolean + + _ + Public Delegate Function KUSB_GetCurrentFrameNumberDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, ByRef FrameNumber As Integer) As Boolean + + _ + Public Delegate Function KUSB_GetOverlappedResultDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, Overlapped As IntPtr, ByRef lpNumberOfBytesTransferred As Integer, bWait As Boolean) As Boolean + + _ + Public Delegate Function KUSB_GetPropertyDelegate(<[In]> InterfaceHandle As KUSB_HANDLE, PropertyType As KUSB_PROPERTY, ByRef PropertySize As Integer, Value As IntPtr) As Boolean + + _ + Public Delegate Sub KHOT_PLUG_CB(<[In]> HotHandle As KHOT_HANDLE, <[In]> DeviceInfo As KLST_DEVINFO_HANDLE, PlugType As KLST_SYNC_FLAG) + + _ + Public Delegate Function KSTM_ERROR_CB(<[In]> StreamInfo As KSTM_INFO, <[In]> XferContext As KSTM_XFER_CONTEXT, XferContextIndex As Integer, ErrorCode As Integer) As Integer + + _ + Public Delegate Function KSTM_SUBMIT_CB(<[In]> StreamInfo As KSTM_INFO, <[In]> XferContext As KSTM_XFER_CONTEXT, XferContextIndex As Integer, Overlapped As IntPtr) As Integer + + _ + Public Delegate Function KSTM_STARTED_CB(<[In]> StreamInfo As KSTM_INFO, <[In]> XferContext As KSTM_XFER_CONTEXT, XferContextIndex As Integer) As Integer + + _ + Public Delegate Function KSTM_STOPPED_CB(<[In]> StreamInfo As KSTM_INFO, <[In]> XferContext As KSTM_XFER_CONTEXT, XferContextIndex As Integer) As Integer + + _ + Public Delegate Function KSTM_COMPLETE_CB(<[In]> StreamInfo As KSTM_INFO, <[In]> XferContext As KSTM_XFER_CONTEXT, XferContextIndex As Integer, ErrorCode As Integer) As Integer + + _ + Public Delegate Function KSTM_BEFORE_COMPLETE_CB(<[In]> StreamInfo As KSTM_INFO, <[In]> XferContext As KSTM_XFER_CONTEXT, XferContextIndex As Integer, ByRef ErrorCode As Integer) As KSTM_COMPLETE_RESULT + + #End Region + + Public Class LstK + Implements IDisposable + Protected mHandleStruct As KLST_HANDLE + Protected mbDisposed As Boolean + + Protected Sub New() + End Sub + + #Region "IDisposable Members" + + ''' Explicitly closes and frees the handle. + Public Overridable Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub + + #End Region + + Protected Overrides Sub Finalize() + Try + Dispose(False) + Finally + MyBase.Finalize() + End Try + End Sub + + Protected Overridable Sub Dispose(disposing As Boolean) + If Not mbDisposed Then + If mHandleStruct.Pointer <> IntPtr.Zero Then + AllKFunctions.LstK_Free(mHandleStruct) + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", [GetType]().Name, mHandleStruct.Pointer.ToInt64(), disposing) + Else + Debug.Print("{0} Dispose: [WARNING] Handle is null", [GetType]().Name) + End If + + mHandleStruct = New KLST_HANDLE(IntPtr.Zero) + mbDisposed = True + End If + End Sub + + ''' Initializes a new usb device list containing all supported devices. + Protected Function Init(Flags As KLST_FLAG) As Boolean + Dim success As Boolean = AllKFunctions.LstK_Init(mHandleStruct, Flags) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + Return True + End Function + + ''' Initializes a new usb device list containing only devices matching a specific class GUID. + Protected Function InitEx(Flags As KLST_FLAG, ByRef PatternMatch As KLST_PATTERN_MATCH) As Boolean + Dim success As Boolean = AllKFunctions.LstK_InitEx(mHandleStruct, Flags, PatternMatch) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + Return True + End Function + + #Region "Public Members" + + ''' Initializes a new usb device list containing all supported devices. + Public Sub New(Flags As KLST_FLAG) + Dim success As Boolean = AllKFunctions.LstK_Init(mHandleStruct, Flags) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + End Sub + + ''' Initializes a new usb device list containing only devices matching a specific class GUID. + Public Sub New(Flags As KLST_FLAG, ByRef PatternMatch As KLST_PATTERN_MATCH) + Dim success As Boolean = AllKFunctions.LstK_InitEx(mHandleStruct, Flags, PatternMatch) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + End Sub + + ''' Counts the number of device info elements in a device list. + Public Overridable Function Count(ByRef Count As Integer) As Boolean + Return AllKFunctions.LstK_Count(mHandleStruct, Count) + End Function + + ''' Gets the \ref KLST_DEVINFO element for the current position. + Public Overridable Function Current(ByRef DeviceInfo As KLST_DEVINFO_HANDLE) As Boolean + Return AllKFunctions.LstK_Current(mHandleStruct, DeviceInfo) + End Function + + ''' Enumerates \ref KLST_DEVINFO elements of a \ref KLST_HANDLE. + Public Overridable Function Enumerate(EnumDevListCB As KLST_ENUM_DEVINFO_CB, Context As IntPtr) As Boolean + Return AllKFunctions.LstK_Enumerate(mHandleStruct, EnumDevListCB, Context) + End Function + + ''' Find a device by vendor and product id + Public Overridable Function FindByVidPid(Vid As Integer, Pid As Integer, ByRef DeviceInfo As KLST_DEVINFO_HANDLE) As Boolean + Return AllKFunctions.LstK_FindByVidPid(mHandleStruct, Vid, Pid, DeviceInfo) + End Function + + ''' Calls the dispose method. + Public Overridable Sub Free() + Dispose() + End Sub + + ''' Gets the handle class structure. + Public ReadOnly Property Handle() As KLST_HANDLE + Get + Return mHandleStruct + End Get + End Property + + ''' Advances the device list current \ref KLST_DEVINFO position. + Public Overridable Function MoveNext(ByRef DeviceInfo As KLST_DEVINFO_HANDLE) As Boolean + Return AllKFunctions.LstK_MoveNext(mHandleStruct, DeviceInfo) + End Function + + ''' Sets the device list to its initial position, which is before the first element in the list. + Public Overridable Sub MoveReset() + AllKFunctions.LstK_MoveReset(mHandleStruct) + End Sub + + #End Region + End Class + + Public Class HotK + Implements IDisposable + Protected mHandleStruct As KHOT_HANDLE + Protected mbDisposed As Boolean + + Protected Sub New() + End Sub + + #Region "IDisposable Members" + + ''' Explicitly closes and frees the handle. + Public Overridable Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub + + #End Region + + Protected Overrides Sub Finalize() + Try + Dispose(False) + Finally + MyBase.Finalize() + End Try + End Sub + + Protected Overridable Sub Dispose(disposing As Boolean) + If Not mbDisposed Then + If mHandleStruct.Pointer <> IntPtr.Zero Then + AllKFunctions.HotK_Free(mHandleStruct) + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", [GetType]().Name, mHandleStruct.Pointer.ToInt64(), disposing) + Else + Debug.Print("{0} Dispose: [WARNING] Handle is null", [GetType]().Name) + End If + + mHandleStruct = New KHOT_HANDLE(IntPtr.Zero) + mbDisposed = True + End If + End Sub + + ''' Creates a new hot-plug handle for USB device arrival/removal event monitoring. + Protected Function Init(ByRef InitParams As KHOT_PARAMS) As Boolean + Dim success As Boolean = AllKFunctions.HotK_Init(mHandleStruct, InitParams) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + Return True + End Function + + #Region "Public Members" + + ''' Creates a new hot-plug handle for USB device arrival/removal event monitoring. + Public Sub New(ByRef InitParams As KHOT_PARAMS) + Dim success As Boolean = AllKFunctions.HotK_Init(mHandleStruct, InitParams) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + End Sub + + ''' Calls the dispose method. + Public Overridable Sub Free() + Dispose() + End Sub + + ''' Frees all hot-plug handles initialized with \ref HotK_Init. + Public Overridable Sub FreeAll() + AllKFunctions.HotK_FreeAll() + End Sub + + ''' Gets the handle class structure. + Public ReadOnly Property Handle() As KHOT_HANDLE + Get + Return mHandleStruct + End Get + End Property + + #End Region + End Class + + Public Class UsbK + Implements IDisposable + Protected driverAPI As KUSB_DRIVER_API + Protected mHandleStruct As KUSB_HANDLE + Protected mbDisposed As Boolean + + Protected Sub New() + End Sub + + #Region "IDisposable Members" + + ''' Explicitly closes and frees the handle. + Public Overridable Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub + + #End Region + + Protected Overrides Sub Finalize() + Try + Dispose(False) + Finally + MyBase.Finalize() + End Try + End Sub + + Protected Overridable Sub Dispose(disposing As Boolean) + If Not mbDisposed Then + If mHandleStruct.Pointer <> IntPtr.Zero Then + AllKFunctions.UsbK_Free(mHandleStruct) + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", [GetType]().Name, mHandleStruct.Pointer.ToInt64(), disposing) + Else + Debug.Print("{0} Dispose: [WARNING] Handle is null", [GetType]().Name) + End If + + mHandleStruct = New KUSB_HANDLE(IntPtr.Zero) + mbDisposed = True + End If + End Sub + + ''' Creates/opens a libusbK interface handle from the device list. This is a preferred method. + Protected Function Init(DevInfo As KLST_DEVINFO_HANDLE) As Boolean + Dim success As Boolean = AllKFunctions.LibK_LoadDriverAPI(driverAPI, DevInfo.DriverID) + + If Not success Then + Throw New Exception(String.Format("{0} failed loading Driver API. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + success = driverAPI.Init(mHandleStruct, DevInfo) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing usb device. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + Return True + End Function + + ''' Creates a libusbK handle for the device specified by a file handle. + Protected Function Initialize(DeviceHandle As IntPtr, driverID As KUSB_DRVID) As Boolean + Dim success As Boolean = AllKFunctions.LibK_LoadDriverAPI(driverAPI, CInt(driverID)) + + If Not success Then + Throw New Exception(String.Format("{0} failed loading Driver API. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + success = driverAPI.Initialize(DeviceHandle, mHandleStruct) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing usb device. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + Return True + End Function + + #Region "Public Members" + + ''' Creates/opens a libusbK interface handle from the device list. This is a preferred method. + Public Sub New(DevInfo As KLST_DEVINFO_HANDLE) + Dim success As Boolean = AllKFunctions.LibK_LoadDriverAPI(driverAPI, DevInfo.DriverID) + + If Not success Then + Throw New Exception(String.Format("{0} failed loading Driver API. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + success = driverAPI.Init(mHandleStruct, DevInfo) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing usb device. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + End Sub + + ''' Creates a libusbK handle for the device specified by a file handle. + Public Sub New(DeviceHandle As IntPtr, driverID As KUSB_DRVID) + Dim success As Boolean = AllKFunctions.LibK_LoadDriverAPI(driverAPI, CInt(driverID)) + + If Not success Then + Throw New Exception(String.Format("{0} failed loading Driver API. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + success = driverAPI.Initialize(DeviceHandle, mHandleStruct) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing usb device. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + End Sub + + ''' Aborts all of the pending transfers for a pipe. + Public Overridable Function AbortPipe(PipeID As Byte) As Boolean + Return driverAPI.AbortPipe(mHandleStruct, PipeID) + End Function + + ''' Claims the specified interface by number or index. + Public Overridable Function ClaimInterface(NumberOrIndex As Byte, IsIndex As Boolean) As Boolean + Return driverAPI.ClaimInterface(mHandleStruct, NumberOrIndex, IsIndex) + End Function + + ''' Clones the specified interface handle. + Public Overridable Function Clone(ByRef DstInterfaceHandle As KUSB_HANDLE) As Boolean + Return driverAPI.Clone(mHandleStruct, DstInterfaceHandle) + End Function + + ''' Transmits control data over a default control endpoint. + Public Overridable Function ControlTransfer(SetupPacket As WINUSB_SETUP_PACKET, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + Return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Buffer, BufferLength, LengthTransferred, Overlapped) + End Function + + ''' Transmits control data over a default control endpoint. + Public Overridable Function ControlTransfer(SetupPacket As WINUSB_SETUP_PACKET, Buffer As Array, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + Return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped) + End Function + + ''' Transmits control data over a default control endpoint. + Public Overridable Function ControlTransfer(SetupPacket As WINUSB_SETUP_PACKET, Buffer As Array, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As KOVL_HANDLE) As Boolean + Return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped.Pointer) + End Function + + ''' Transmits control data over a default control endpoint. + Public Overridable Function ControlTransfer(SetupPacket As WINUSB_SETUP_PACKET, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As KOVL_HANDLE) As Boolean + Return driverAPI.ControlTransfer(mHandleStruct, SetupPacket, Buffer, BufferLength, LengthTransferred, Overlapped.Pointer) + End Function + + ''' Discards any data that is cached in a pipe. + Public Overridable Function FlushPipe(PipeID As Byte) As Boolean + Return driverAPI.FlushPipe(mHandleStruct, PipeID) + End Function + + ''' Calls the dispose method. + Public Overridable Sub Free() + Dispose() + End Sub + + ''' Gets the alternate setting for the specified interface. + Public Overridable Function GetAltInterface(NumberOrIndex As Byte, IsIndex As Boolean, ByRef AltSettingNumber As Byte) As Boolean + Return driverAPI.GetAltInterface(mHandleStruct, NumberOrIndex, IsIndex, AltSettingNumber) + End Function + + ''' Retrieves a handle for an associated interface. + Public Overridable Function GetAssociatedInterface(AssociatedInterfaceIndex As Byte, ByRef AssociatedInterfaceHandle As KUSB_HANDLE) As Boolean + Return driverAPI.GetAssociatedInterface(mHandleStruct, AssociatedInterfaceIndex, AssociatedInterfaceHandle) + End Function + + ''' Gets the device current configuration number. + Public Overridable Function GetConfiguration(ByRef ConfigurationNumber As Byte) As Boolean + Return driverAPI.GetConfiguration(mHandleStruct, ConfigurationNumber) + End Function + + ''' Gets the current alternate interface setting for an interface. + Public Overridable Function GetCurrentAlternateSetting(ByRef AltSettingNumber As Byte) As Boolean + Return driverAPI.GetCurrentAlternateSetting(mHandleStruct, AltSettingNumber) + End Function + + ''' Retrieves the current USB frame number. + Public Overridable Function GetCurrentFrameNumber(ByRef FrameNumber As Integer) As Boolean + Return driverAPI.GetCurrentFrameNumber(mHandleStruct, FrameNumber) + End Function + + ''' Gets the requested descriptor. This is a synchronous operation. + Public Overridable Function GetDescriptor(DescriptorType As Byte, Index As Byte, LanguageID As Integer, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer) As Boolean + Return driverAPI.GetDescriptor(mHandleStruct, DescriptorType, Index, CUShort(LanguageID), Buffer, BufferLength, _ + LengthTransferred) + End Function + + ''' Gets the requested descriptor. This is a synchronous operation. + Public Overridable Function GetDescriptor(DescriptorType As Byte, Index As Byte, LanguageID As Integer, Buffer As Array, BufferLength As Integer, ByRef LengthTransferred As Integer) As Boolean + Return driverAPI.GetDescriptor(mHandleStruct, DescriptorType, Index, CUShort(LanguageID), Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, _ + LengthTransferred) + End Function + + ''' Retrieves the results of an overlapped operation on the specified libusbK handle. + Public Overridable Function GetOverlappedResult(Overlapped As IntPtr, ByRef lpNumberOfBytesTransferred As Integer, bWait As Boolean) As Boolean + Return driverAPI.GetOverlappedResult(mHandleStruct, Overlapped, lpNumberOfBytesTransferred, bWait) + End Function + + ''' Retrieves the results of an overlapped operation on the specified libusbK handle. + Public Overridable Function GetOverlappedResult(Overlapped As KOVL_HANDLE, ByRef lpNumberOfBytesTransferred As Integer, bWait As Boolean) As Boolean + Return driverAPI.GetOverlappedResult(mHandleStruct, Overlapped.Pointer, lpNumberOfBytesTransferred, bWait) + End Function + + ''' Gets the policy for a specific pipe (endpoint). + Public Overridable Function GetPipePolicy(PipeID As Byte, PolicyType As Integer, ByRef ValueLength As Integer, Value As IntPtr) As Boolean + Return driverAPI.GetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Value) + End Function + + ''' Gets the policy for a specific pipe (endpoint). + Public Overridable Function GetPipePolicy(PipeID As Byte, PolicyType As Integer, ByRef ValueLength As Integer, Value As Array) As Boolean + Return driverAPI.GetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + End Function + + ''' Gets the power policy for a device. + Public Overridable Function GetPowerPolicy(PolicyType As Integer, ByRef ValueLength As Integer, Value As IntPtr) As Boolean + Return driverAPI.GetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Value) + End Function + + ''' Gets the power policy for a device. + Public Overridable Function GetPowerPolicy(PolicyType As Integer, ByRef ValueLength As Integer, Value As Array) As Boolean + Return driverAPI.GetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + End Function + + ''' Gets a USB device (driver specific) property from usb handle. + Public Overridable Function GetProperty(PropertyType As KUSB_PROPERTY, ByRef PropertySize As Integer, Value As IntPtr) As Boolean + Return driverAPI.GetProperty(mHandleStruct, PropertyType, PropertySize, Value) + End Function + + ''' Gets a USB device (driver specific) property from usb handle. + Public Overridable Function GetProperty(PropertyType As KUSB_PROPERTY, ByRef PropertySize As Integer, Value As Array) As Boolean + Return driverAPI.GetProperty(mHandleStruct, PropertyType, PropertySize, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + End Function + + ''' Gets the handle class structure. + Public ReadOnly Property Handle() As KUSB_HANDLE + Get + Return mHandleStruct + End Get + End Property + + ''' Reads from an isochronous pipe. + Public Overridable Function IsoReadPipe(PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, Overlapped As IntPtr, IsoContext As KISO_CONTEXT) As Boolean + Return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped, IsoContext) + End Function + + ''' Reads from an isochronous pipe. + Public Overridable Function IsoReadPipe(PipeID As Byte, Buffer As Array, BufferLength As Integer, Overlapped As IntPtr, IsoContext As KISO_CONTEXT) As Boolean + Return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped, IsoContext) + End Function + + ''' Reads from an isochronous pipe. + Public Overridable Function IsoReadPipe(PipeID As Byte, Buffer As Array, BufferLength As Integer, Overlapped As KOVL_HANDLE, IsoContext As KISO_CONTEXT) As Boolean + Return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped.Pointer, IsoContext) + End Function + + ''' Reads from an isochronous pipe. + Public Overridable Function IsoReadPipe(PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, Overlapped As KOVL_HANDLE, IsoContext As KISO_CONTEXT) As Boolean + Return driverAPI.IsoReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped.Pointer, IsoContext) + End Function + + ''' Writes to an isochronous pipe. + Public Overridable Function IsoWritePipe(PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, Overlapped As IntPtr, IsoContext As KISO_CONTEXT) As Boolean + Return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped, IsoContext) + End Function + + ''' Writes to an isochronous pipe. + Public Overridable Function IsoWritePipe(PipeID As Byte, Buffer As Array, BufferLength As Integer, Overlapped As IntPtr, IsoContext As KISO_CONTEXT) As Boolean + Return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped, IsoContext) + End Function + + ''' Writes to an isochronous pipe. + Public Overridable Function IsoWritePipe(PipeID As Byte, Buffer As Array, BufferLength As Integer, Overlapped As KOVL_HANDLE, IsoContext As KISO_CONTEXT) As Boolean + Return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, Overlapped.Pointer, IsoContext) + End Function + + ''' Writes to an isochronous pipe. + Public Overridable Function IsoWritePipe(PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, Overlapped As KOVL_HANDLE, IsoContext As KISO_CONTEXT) As Boolean + Return driverAPI.IsoWritePipe(mHandleStruct, PipeID, Buffer, BufferLength, Overlapped.Pointer, IsoContext) + End Function + + ''' Retrieves information about the physical device that is associated with a libusbK handle. + Public Overridable Function QueryDeviceInformation(InformationType As Integer, ByRef BufferLength As Integer, Buffer As IntPtr) As Boolean + Return driverAPI.QueryDeviceInformation(mHandleStruct, InformationType, BufferLength, Buffer) + End Function + + ''' Retrieves the interface descriptor for the specified alternate interface settings for a particular interface handle. + Public Overridable Function QueryInterfaceSettings(AltSettingIndex As Byte, ByRef UsbAltInterfaceDescriptor As USB_INTERFACE_DESCRIPTOR) As Boolean + Return driverAPI.QueryInterfaceSettings(mHandleStruct, AltSettingIndex, UsbAltInterfaceDescriptor) + End Function + + ''' Retrieves information about a pipe that is associated with an interface. + Public Overridable Function QueryPipe(AltSettingNumber As Byte, PipeIndex As Byte, ByRef PipeInformation As WINUSB_PIPE_INFORMATION) As Boolean + Return driverAPI.QueryPipe(mHandleStruct, AltSettingNumber, PipeIndex, PipeInformation) + End Function + + ''' Reads data from the specified pipe. + Public Overridable Function ReadPipe(PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + Return driverAPI.ReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped) + End Function + + ''' Reads data from the specified pipe. + Public Overridable Function ReadPipe(PipeID As Byte, Buffer As Array, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + Return driverAPI.ReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped) + End Function + + ''' Reads data from the specified pipe. + Public Overridable Function ReadPipe(PipeID As Byte, Buffer As Array, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As KOVL_HANDLE) As Boolean + Return driverAPI.ReadPipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped.Pointer) + End Function + + ''' Reads data from the specified pipe. + Public Overridable Function ReadPipe(PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As KOVL_HANDLE) As Boolean + Return driverAPI.ReadPipe(mHandleStruct, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped.Pointer) + End Function + + ''' Releases the specified interface by number or index. + Public Overridable Function ReleaseInterface(NumberOrIndex As Byte, IsIndex As Boolean) As Boolean + Return driverAPI.ReleaseInterface(mHandleStruct, NumberOrIndex, IsIndex) + End Function + + ''' Resets the usb device of the specified interface handle. (port cycle). + Public Overridable Function ResetDevice() As Boolean + Return driverAPI.ResetDevice(mHandleStruct) + End Function + + ''' Resets the data toggle and clears the stall condition on a pipe. + Public Overridable Function ResetPipe(PipeID As Byte) As Boolean + Return driverAPI.ResetPipe(mHandleStruct, PipeID) + End Function + + ''' Selects the specified interface by number or index as the current interface. + Public Overridable Function SelectInterface(NumberOrIndex As Byte, IsIndex As Boolean) As Boolean + Return driverAPI.SelectInterface(mHandleStruct, NumberOrIndex, IsIndex) + End Function + + ''' Sets the alternate setting of the specified interface. + Public Overridable Function SetAltInterface(NumberOrIndex As Byte, IsIndex As Boolean, AltSettingNumber As Byte) As Boolean + Return driverAPI.SetAltInterface(mHandleStruct, NumberOrIndex, IsIndex, AltSettingNumber) + End Function + + ''' Sets the device configuration number. + Public Overridable Function SetConfiguration(ConfigurationNumber As Byte) As Boolean + Return driverAPI.SetConfiguration(mHandleStruct, ConfigurationNumber) + End Function + + ''' Sets the alternate setting of an interface. + Public Overridable Function SetCurrentAlternateSetting(AltSettingNumber As Byte) As Boolean + Return driverAPI.SetCurrentAlternateSetting(mHandleStruct, AltSettingNumber) + End Function + + ''' Sets the policy for a specific pipe associated with an endpoint on the device. This is a synchronous operation. + Public Overridable Function SetPipePolicy(PipeID As Byte, PolicyType As Integer, ValueLength As Integer, Value As IntPtr) As Boolean + Return driverAPI.SetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Value) + End Function + + ''' Sets the policy for a specific pipe associated with an endpoint on the device. This is a synchronous operation. + Public Overridable Function SetPipePolicy(PipeID As Byte, PolicyType As Integer, ValueLength As Integer, Value As Array) As Boolean + Return driverAPI.SetPipePolicy(mHandleStruct, PipeID, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + End Function + + ''' Sets the power policy for a device. + Public Overridable Function SetPowerPolicy(PolicyType As Integer, ValueLength As Integer, Value As IntPtr) As Boolean + Return driverAPI.SetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Value) + End Function + + ''' Sets the power policy for a device. + Public Overridable Function SetPowerPolicy(PolicyType As Integer, ValueLength As Integer, Value As Array) As Boolean + Return driverAPI.SetPowerPolicy(mHandleStruct, PolicyType, ValueLength, Marshal.UnsafeAddrOfPinnedArrayElement(Value, 0)) + End Function + + ''' Writes data to a pipe. + Public Overridable Function WritePipe(PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + Return driverAPI.WritePipe(mHandleStruct, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped) + End Function + + ''' Writes data to a pipe. + Public Overridable Function WritePipe(PipeID As Byte, Buffer As Array, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As IntPtr) As Boolean + Return driverAPI.WritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped) + End Function + + ''' Writes data to a pipe. + Public Overridable Function WritePipe(PipeID As Byte, Buffer As Array, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As KOVL_HANDLE) As Boolean + Return driverAPI.WritePipe(mHandleStruct, PipeID, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), BufferLength, LengthTransferred, Overlapped.Pointer) + End Function + + ''' Writes data to a pipe. + Public Overridable Function WritePipe(PipeID As Byte, Buffer As IntPtr, BufferLength As Integer, ByRef LengthTransferred As Integer, Overlapped As KOVL_HANDLE) As Boolean + Return driverAPI.WritePipe(mHandleStruct, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped.Pointer) + End Function + + #End Region + End Class + + Public Class OvlK + Implements IDisposable + Protected mHandleStruct As KOVL_POOL_HANDLE + Protected mbDisposed As Boolean + + Protected Sub New() + End Sub + + #Region "IDisposable Members" + + ''' Explicitly closes and frees the handle. + Public Overridable Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub + + #End Region + + Protected Overrides Sub Finalize() + Try + Dispose(False) + Finally + MyBase.Finalize() + End Try + End Sub + + Protected Overridable Sub Dispose(disposing As Boolean) + If Not mbDisposed Then + If mHandleStruct.Pointer <> IntPtr.Zero Then + AllKFunctions.OvlK_Free(mHandleStruct) + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", [GetType]().Name, mHandleStruct.Pointer.ToInt64(), disposing) + Else + Debug.Print("{0} Dispose: [WARNING] Handle is null", [GetType]().Name) + End If + + mHandleStruct = New KOVL_POOL_HANDLE(IntPtr.Zero) + mbDisposed = True + End If + End Sub + + ''' Creates a new overlapped pool. + Protected Function Init(UsbHandle As KUSB_HANDLE, MaxOverlappedCount As Integer, Flags As KOVL_POOL_FLAG) As Boolean + Dim success As Boolean = AllKFunctions.OvlK_Init(mHandleStruct, UsbHandle, MaxOverlappedCount, Flags) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + Return True + End Function + + #Region "Public Members" + + ''' Creates a new overlapped pool. + Public Sub New(UsbHandle As KUSB_HANDLE, MaxOverlappedCount As Integer, Flags As KOVL_POOL_FLAG) + Dim success As Boolean = AllKFunctions.OvlK_Init(mHandleStruct, UsbHandle, MaxOverlappedCount, Flags) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + End Sub + + ''' Gets a preallocated \c OverlappedK structure from the specified/default pool. + Public Overridable Function Acquire(ByRef OverlappedK As KOVL_HANDLE) As Boolean + Return AllKFunctions.OvlK_Acquire(OverlappedK, mHandleStruct) + End Function + + ''' Calls the dispose method. + Public Overridable Sub Free() + Dispose() + End Sub + + ''' Returns the internal event handle used to signal IO operations. + Public Overridable Function GetEventHandle(OverlappedK As KOVL_HANDLE) As IntPtr + Return AllKFunctions.OvlK_GetEventHandle(OverlappedK) + End Function + + ''' Gets the handle class structure. + Public ReadOnly Property Handle() As KOVL_POOL_HANDLE + Get + Return mHandleStruct + End Get + End Property + + ''' Checks for i/o completion; returns immediately. (polling) + Public Overridable Function IsComplete(OverlappedK As KOVL_HANDLE) As Boolean + Return AllKFunctions.OvlK_IsComplete(OverlappedK) + End Function + + ''' Initializes an overlappedK for re-use. The overlappedK is not return to its pool. + Public Overridable Function ReUse(OverlappedK As KOVL_HANDLE) As Boolean + Return AllKFunctions.OvlK_ReUse(OverlappedK) + End Function + + ''' Returns an \c OverlappedK structure to it's pool. + Public Overridable Function Release(OverlappedK As KOVL_HANDLE) As Boolean + Return AllKFunctions.OvlK_Release(OverlappedK) + End Function + + ''' Waits for overlapped I/O completion, and performs actions specified in \c WaitFlags. + Public Overridable Function Wait(OverlappedK As KOVL_HANDLE, TimeoutMS As Integer, WaitFlags As KOVL_WAIT_FLAG, ByRef TransferredLength As Integer) As Boolean + Return AllKFunctions.OvlK_Wait(OverlappedK, TimeoutMS, WaitFlags, TransferredLength) + End Function + + ''' Waits for overlapped I/O completion, cancels on a timeout error and always releases the OvlK handle back to its pool. + Public Overridable Function WaitAndRelease(OverlappedK As KOVL_HANDLE, TimeoutMS As Integer, ByRef TransferredLength As Integer) As Boolean + Return AllKFunctions.OvlK_WaitAndRelease(OverlappedK, TimeoutMS, TransferredLength) + End Function + + ''' Waits for overlapped I/O completion on the oldest acquired OverlappedK handle and performs actions specified in \c WaitFlags. + Public Overridable Function WaitOldest(ByRef OverlappedK As KOVL_HANDLE, TimeoutMS As Integer, WaitFlags As KOVL_WAIT_FLAG, ByRef TransferredLength As Integer) As Boolean + Return AllKFunctions.OvlK_WaitOldest(mHandleStruct, OverlappedK, TimeoutMS, WaitFlags, TransferredLength) + End Function + + ''' Waits for overlapped I/O completion, cancels on a timeout error. + Public Overridable Function WaitOrCancel(OverlappedK As KOVL_HANDLE, TimeoutMS As Integer, ByRef TransferredLength As Integer) As Boolean + Return AllKFunctions.OvlK_WaitOrCancel(OverlappedK, TimeoutMS, TransferredLength) + End Function + + #End Region + End Class + + Public Class StmK + Implements IDisposable + Protected mHandleStruct As KSTM_HANDLE + Protected mbDisposed As Boolean + + Protected Sub New() + End Sub + + #Region "IDisposable Members" + + ''' Explicitly closes and frees the handle. + Public Overridable Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub + + #End Region + + Protected Overrides Sub Finalize() + Try + Dispose(False) + Finally + MyBase.Finalize() + End Try + End Sub + + Protected Overridable Sub Dispose(disposing As Boolean) + If Not mbDisposed Then + If mHandleStruct.Pointer <> IntPtr.Zero Then + AllKFunctions.StmK_Free(mHandleStruct) + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", [GetType]().Name, mHandleStruct.Pointer.ToInt64(), disposing) + Else + Debug.Print("{0} Dispose: [WARNING] Handle is null", [GetType]().Name) + End If + + mHandleStruct = New KSTM_HANDLE(IntPtr.Zero) + mbDisposed = True + End If + End Sub + + ''' Initializes a new uni-directional pipe stream. + Protected Function Init(UsbHandle As KUSB_HANDLE, PipeID As Byte, MaxTransferSize As Integer, MaxPendingTransfers As Integer, MaxPendingIO As Integer, ByRef Callbacks As KSTM_CALLBACK, _ + Flags As KSTM_FLAG) As Boolean + Dim success As Boolean = AllKFunctions.StmK_Init(mHandleStruct, UsbHandle, PipeID, MaxTransferSize, MaxPendingTransfers, MaxPendingIO, _ + Callbacks, Flags) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + Return True + End Function + + #Region "Public Members" + + ''' Initializes a new uni-directional pipe stream. + Public Sub New(UsbHandle As KUSB_HANDLE, PipeID As Byte, MaxTransferSize As Integer, MaxPendingTransfers As Integer, MaxPendingIO As Integer, ByRef Callbacks As KSTM_CALLBACK, _ + Flags As KSTM_FLAG) + Dim success As Boolean = AllKFunctions.StmK_Init(mHandleStruct, UsbHandle, PipeID, MaxTransferSize, MaxPendingTransfers, MaxPendingIO, _ + Callbacks, Flags) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + End Sub + + ''' Calls the dispose method. + Public Overridable Sub Free() + Dispose() + End Sub + + ''' Gets the handle class structure. + Public ReadOnly Property Handle() As KSTM_HANDLE + Get + Return mHandleStruct + End Get + End Property + + ''' Reads data from the stream buffer. + Public Overridable Function Read(Buffer As IntPtr, Offset As Integer, Length As Integer, ByRef TransferredLength As Integer) As Boolean + Return AllKFunctions.StmK_Read(mHandleStruct, Buffer, Offset, Length, TransferredLength) + End Function + + ''' Reads data from the stream buffer. + Public Overridable Function Read(Buffer As Array, Offset As Integer, Length As Integer, ByRef TransferredLength As Integer) As Boolean + Return AllKFunctions.StmK_Read(mHandleStruct, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), Offset, Length, TransferredLength) + End Function + + ''' Starts the internal stream thread. + Public Overridable Function Start() As Boolean + Return AllKFunctions.StmK_Start(mHandleStruct) + End Function + + ''' Stops the internal stream thread. + Public Overridable Function [Stop](TimeoutCancelMS As Integer) As Boolean + Return AllKFunctions.StmK_Stop(mHandleStruct, TimeoutCancelMS) + End Function + + ''' Writes data to the stream buffer. + Public Overridable Function Write(Buffer As IntPtr, Offset As Integer, Length As Integer, ByRef TransferredLength As Integer) As Boolean + Return AllKFunctions.StmK_Write(mHandleStruct, Buffer, Offset, Length, TransferredLength) + End Function + + ''' Writes data to the stream buffer. + Public Overridable Function Write(Buffer As Array, Offset As Integer, Length As Integer, ByRef TransferredLength As Integer) As Boolean + Return AllKFunctions.StmK_Write(mHandleStruct, Marshal.UnsafeAddrOfPinnedArrayElement(Buffer, 0), Offset, Length, TransferredLength) + End Function + + #End Region + End Class + + Public Class IsoK + Implements IDisposable + Protected mHandleStruct As KISO_CONTEXT + Protected mbDisposed As Boolean + + Protected Sub New() + End Sub + + #Region "IDisposable Members" + + ''' Explicitly closes and frees the handle. + Public Overridable Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub + + #End Region + + Protected Overrides Sub Finalize() + Try + Dispose(False) + Finally + MyBase.Finalize() + End Try + End Sub + + Protected Overridable Sub Dispose(disposing As Boolean) + If Not mbDisposed Then + If mHandleStruct.Pointer <> IntPtr.Zero Then + AllKFunctions.IsoK_Free(mHandleStruct) + Debug.Print("{0} Dispose: Freed Handle:{1:X16}h Explicit:{2}", [GetType]().Name, mHandleStruct.Pointer.ToInt64(), disposing) + Else + Debug.Print("{0} Dispose: [WARNING] Handle is null", [GetType]().Name) + End If + + mHandleStruct = New KISO_CONTEXT(IntPtr.Zero) + mbDisposed = True + End If + End Sub + + ''' Creates a new isochronous transfer context. + Protected Function Init(NumberOfPackets As Integer, StartFrame As Integer) As Boolean + Dim success As Boolean = AllKFunctions.IsoK_Init(mHandleStruct, NumberOfPackets, StartFrame) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + Return True + End Function + + #Region "Nested Structs" + + _ + Private Structure KISO_CONTEXT_MAP + ''' Additional ISO transfer flags. See \ref KISO_FLAG. + Private ReadOnly Flags As KISO_FLAG + + ''' Specifies the frame number that the transfer should begin on (0 for ASAP). + Private ReadOnly StartFrame As Integer + + ''' Contains the number of packets that completed with an error condition on return from the host controller driver. + Private ReadOnly ErrorCount As Short + + ''' Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + Private ReadOnly NumberOfPackets As Short + + ''' Contains the URB Hdr.Status value on return from the host controller driver. + Private ReadOnly UrbHdrStatus As Integer + End Structure + + #End Region + + #Region "Public Members" + + ''' Creates a new isochronous transfer context. + Public Sub New(NumberOfPackets As Integer, StartFrame As Integer) + Dim success As Boolean = AllKFunctions.IsoK_Init(mHandleStruct, NumberOfPackets, StartFrame) + + If Not success Then + Throw New Exception(String.Format("{0} failed initializing. ErrorCode={1:X8}h", [GetType]().Name, Marshal.GetLastWin32Error())) + End If + + Debug.Print("{0} Init: handle 0x{1:X16}", [GetType]().Name, mHandleStruct.Pointer.ToInt64()) + End Sub + + ''' Convenience function for enumerating ISO packets of an isochronous transfer context. + Public Overridable Function EnumPackets(EnumPackets As KISO_ENUM_PACKETS_CB, StartPacketIndex As Integer, UserState As IntPtr) As Boolean + Return AllKFunctions.IsoK_EnumPackets(mHandleStruct, EnumPackets, StartPacketIndex, UserState) + End Function + + ''' Contains the number of packets that completed with an error condition on return from the host controller driver. + Public Property ErrorCount() As Short + Get + Return Marshal.ReadInt16(mHandleStruct.Pointer, ofsErrorCount) + End Get + Set + Marshal.WriteInt16(mHandleStruct.Pointer, ofsErrorCount, value) + End Set + End Property + + ''' Additional ISO transfer flags. See \ref KISO_FLAG. + Public Property Flags() As KISO_FLAG + Get + Return CType(Marshal.ReadInt32(mHandleStruct.Pointer, ofsFlags), KISO_FLAG) + End Get + Set + Marshal.WriteInt32(mHandleStruct.Pointer, ofsFlags, CInt(value)) + End Set + End Property + + ''' Calls the dispose method. + Public Overridable Sub Free() + Dispose() + End Sub + + ''' Convenience function for getting all fields of a \ref KISO_PACKET. + Public Overridable Function GetPacket(PacketIndex As Integer, ByRef IsoPacket As KISO_PACKET) As Boolean + Return AllKFunctions.IsoK_GetPacket(mHandleStruct, PacketIndex, IsoPacket) + End Function + + ''' Gets the handle class structure. + Public ReadOnly Property Handle() As KISO_CONTEXT + Get + Return mHandleStruct + End Get + End Property + + ''' Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + Public Property NumberOfPackets() As Short + Get + Return Marshal.ReadInt16(mHandleStruct.Pointer, ofsNumberOfPackets) + End Get + Set + Marshal.WriteInt16(mHandleStruct.Pointer, ofsNumberOfPackets, value) + End Set + End Property + + ''' Convenience function for re-using an isochronous transfer context in a subsequent request. + Public Overridable Function ReUse() As Boolean + Return AllKFunctions.IsoK_ReUse(mHandleStruct) + End Function + + ''' Convenience function for setting all fields of a \ref KISO_PACKET. + Public Overridable Function SetPacket(PacketIndex As Integer, ByRef IsoPacket As KISO_PACKET) As Boolean + Return AllKFunctions.IsoK_SetPacket(mHandleStruct, PacketIndex, IsoPacket) + End Function + + ''' Convenience function for setting the offset of all ISO packets of an isochronous transfer context. + Public Overridable Function SetPackets(PacketSize As Integer) As Boolean + Return AllKFunctions.IsoK_SetPackets(mHandleStruct, PacketSize) + End Function + + ''' Specifies the frame number that the transfer should begin on (0 for ASAP). + Public Property StartFrame() As Integer + Get + Return Marshal.ReadInt32(mHandleStruct.Pointer, ofsStartFrame) + End Get + Set + Marshal.WriteInt32(mHandleStruct.Pointer, ofsStartFrame, value) + End Set + End Property + + ''' Contains the URB Hdr.Status value on return from the host controller driver. + Public Property UrbHdrStatus() As Integer + Get + Return Marshal.ReadInt32(mHandleStruct.Pointer, ofsUrbHdrStatus) + End Get + Set + Marshal.WriteInt32(mHandleStruct.Pointer, ofsUrbHdrStatus, value) + End Set + End Property + + #End Region + + #Region "Private Members" + + Private Shared ReadOnly ofsErrorCount As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "ErrorCount").ToInt32() + Private Shared ReadOnly ofsFlags As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "Flags").ToInt32() + Private Shared ReadOnly ofsNumberOfPackets As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "NumberOfPackets").ToInt32() + Private Shared ReadOnly ofsStartFrame As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "StartFrame").ToInt32() + Private Shared ReadOnly ofsUrbHdrStatus As Integer = Marshal.OffsetOf(GetType(KISO_CONTEXT_MAP), "UrbHdrStatus").ToInt32() + + #End Region + End Class +End Namespace diff --git a/Old Matlab Interface/cmeasuretest.m b/Old Matlab Interface/cmeasuretest.m new file mode 100644 index 00000000..d83acd1d --- /dev/null +++ b/Old Matlab Interface/cmeasuretest.m @@ -0,0 +1,66 @@ +vref = 3.3/2; +R4 = 75e3; +R3 = 1e6; +scope_gain = 4; +TOP = 2048; +global saved_waveform_ch1; +global fastmode + +tt = 2.5; +bt = 0.8; +vcc = 3.3; + +tic +top_val = (tt/vref * R4/(R3+R4) * scope_gain * TOP) +bot_val = (bt/vref * R4/(R3+R4) * scope_gain * TOP) + +samples_per_sec = 375000 / (3 * fastmode + 1) +range = length(saved_waveform_ch1) - samples_per_sec / 5 + + +gtt = saved_waveform_ch1(range:end)>top_val; +gtb = saved_waveform_ch1(range:end)hi, 1, 'first') + begin + if ~isempty(first) + draw_triggered; + else + taxis = [] + cool_waveform = [] + update_enable = 0 + pause(0.001) + end + end + end + return + + + diff --git a/Old Matlab Interface/conv_ana_notrig.m b/Old Matlab Interface/conv_ana_notrig.m new file mode 100644 index 00000000..f7569a7d --- /dev/null +++ b/Old Matlab Interface/conv_ana_notrig.m @@ -0,0 +1,28 @@ + global scope_window_time + global gui_delay + + update_enable = 1; + + delay_sec = get(gui_delay, 'Max') - get(gui_delay, 'Value'); + delay_sample = delay_sec*(samplestoshow/scope_window_time); + global scope_filter_value + global scope_filter_enabled + + nshow = 500; + if(scope_filter_enabled) + nshow = nshow + scope_filter_value; + end + + if length(buffer)>samplestoshow + if (samplestoshow>nshow) + temp_waveform = buffer((length(buffer) - samplestoshow - delay_sample):samplestoshow/nshow: (length(buffer) - delay_sample)); + else + temp_waveform = buffer((length(buffer) - samplestoshow - delay_sample): (length(buffer) - delay_sample)); + end + cool_waveform = undofrontend(temp_waveform, channel); + taxis = linspace(-scope_window_time-delay_sec,-delay_sec,length(cool_waveform)); + return + end + + taxis = []; + cool_waveform = []; diff --git a/Old Matlab Interface/conv_dig.m b/Old Matlab Interface/conv_dig.m new file mode 100644 index 00000000..3e1285c0 --- /dev/null +++ b/Old Matlab Interface/conv_dig.m @@ -0,0 +1,35 @@ +function [taxis, temp_waveform] = conv_dig(buffer, samplestoshow) +global scope_window_time +global gui_delay + +delay_sec = get(gui_delay, 'Max') - get(gui_delay, 'Value'); +delay_sample = delay_sec*(samplestoshow/scope_window_time); + +if length(buffer)>samplestoshow + if (scope_window_time>(500/375000)) + temp_waveform = buffer((length(buffer) - samplestoshow - delay_sample):samplestoshow/500: (length(buffer) - delay_sample)); + temp_waveform = typecast(temp_waveform, 'uint8'); + temp_waveform = logical(bitand(temp_waveform,16)); + else + throwaway = round((ceil(samplestoshow)-samplestoshow)*8); + dig_samples = buffer((length(buffer) - samplestoshow - delay_sample) : (length(buffer) - delay_sample)); + dig_samples = typecast(dig_samples, 'uint8'); + temp_waveform = false(1,length(dig_samples)*8); + temp_waveform(1:8:length(temp_waveform)) = bitand(dig_samples,128); + temp_waveform(2:8:length(temp_waveform)) = bitand(dig_samples,64); + temp_waveform(3:8:length(temp_waveform)) = bitand(dig_samples,32); + temp_waveform(4:8:length(temp_waveform)) = bitand(dig_samples,16); + temp_waveform(5:8:length(temp_waveform)) = bitand(dig_samples,8); + temp_waveform(6:8:length(temp_waveform)) = bitand(dig_samples,4); + temp_waveform(7:8:length(temp_waveform)) = bitand(dig_samples,2); + temp_waveform(8:8:length(temp_waveform)) = bitand(dig_samples,1); + + temp_waveform = temp_waveform((throwaway+1):end); + temp_waveform = temp_waveform(1:length(temp_waveform)/500:end); + end + taxis = linspace(-scope_window_time-delay_sec,-delay_sec,length(temp_waveform)); + return +end + +taxis = []; +temp_waveform = []; \ No newline at end of file diff --git a/Old Matlab Interface/crash_recover.m b/Old Matlab Interface/crash_recover.m new file mode 100644 index 00000000..f9649c33 --- /dev/null +++ b/Old Matlab Interface/crash_recover.m @@ -0,0 +1,19 @@ +global num_lc +global gui_static_text_scope +global saved_waveform_ch1 +global saved_waveform_ch2 +global usb_handle +global gui_delay + +num_lc = num_lc + 1; +max_n = 100000000; +%USB_POOL_FREE(ovlPool, ovlkHandle_0, ovlkHandle_1, usb_handle); //It +%crashes when I clear the handles. No idea why, but it's fine when I don't +clear usb_handle +set(gui_static_text_scope, 'String', sprintf('THE SCOPE (Reconnected %d times)', num_lc)); +saved_waveform_ch1 = [] +saved_waveform_ch2 = [] +set(gui_delay, 'Value', get(gui_delay, 'Max')); + +mex_usb_iso_loop + diff --git a/Old Matlab Interface/displaypacket.m b/Old Matlab Interface/displaypacket.m new file mode 100644 index 00000000..867ff334 --- /dev/null +++ b/Old Matlab Interface/displaypacket.m @@ -0,0 +1,78 @@ +function [] = displaypacket(new_packets) + +global saved_waveform_ch1 +global saved_waveform_ch2 +global scope_mode +global gui_scope_running +global fastmode + + +%Keep the arrays small(ish) +if length(saved_waveform_ch1)>3.75e6/(16*fastmode) + saved_waveform_ch1 = saved_waveform_ch1(length(saved_waveform_ch1)-3.75e6/(16*fastmode):end); +end +if length(saved_waveform_ch2)>1e6 + saved_waveform_ch2 = saved_waveform_ch2(length(saved_waveform_ch2)-1e6:end); +end + + + +%%Insta-return if scope is paused +if(~gui_scope_running) + return +end + +%%Exception for mode 6 +if (scope_mode == 6) + transfer_contents_temp = []; + for tempovar = 0:length(new_packets)/750 - 1 + transfer_contents_temp = [transfer_contents_temp new_packets((tempovar*750+1):(tempovar*750+748))]; + end + saved_waveform_ch1 = [saved_waveform_ch1 transfer_contents_temp]; + return +end + +%%Exception for mode 7 +if (scope_mode == 7) + new_packets = double(new_packets); + + topbytes = new_packets(~logical(mod(1:length(new_packets),2))); + botbytes = new_packets(logical(mod(1:length(new_packets),2))); + + botbytes = sign(topbytes) .* abs(botbytes); %lower bytes should steal sign info from top byte + + realval = topbytes*16 + botbytes/16; + + transfer_contents_temp = []; + for tempovar = 0:length(realval)/375 - 1 + transfer_contents_temp = [transfer_contents_temp realval((tempovar*375+1):(3*fastmode+1):(tempovar*375+374))]; + end + saved_waveform_ch1 = [saved_waveform_ch1 transfer_contents_temp]; + return +end + + +%%Pull out CH1 data +if scope_mode < 5 + transfer_contents_temp = []; + for tempovar = 0:length(new_packets)/750 - 1 + transfer_contents_temp = [transfer_contents_temp new_packets((tempovar*750+1):(tempovar*750+374))]; + end + saved_waveform_ch1 = [saved_waveform_ch1 transfer_contents_temp]; +end + +%%Pull out CH2 data for relevant states +if (scope_mode == 1 | scope_mode == 2 | scope_mode == 4) + transfer_contents_temp = []; + for tempovar = 0:length(new_packets)/750 - 1 + transfer_contents_temp = [transfer_contents_temp new_packets((tempovar*750+376):(tempovar*750+748))]; + end + saved_waveform_ch2 = [saved_waveform_ch2 transfer_contents_temp]; +end + +% transfer_contents_whole = [transfer_contents_0 transfer_contents_1] +% transfer_contents_temp = []; +% for tempovar = 0:length(transfer_contents_whole)/750 - 1 +% transfer_contents_temp = [transfer_contents_temp transfer_contents_whole((tempovar*750+1):(tempovar*750+748))]; +% end +% plot(transfer_contents_temp) diff --git a/Old Matlab Interface/dofrontend.m b/Old Matlab Interface/dofrontend.m new file mode 100644 index 00000000..4d8d7618 --- /dev/null +++ b/Old Matlab Interface/dofrontend.m @@ -0,0 +1,27 @@ +function [expected] = dofrontend(vin, channel) + +vcc = 3.3; +TOP = 128; +r4 = 75e3; +r3 = 1e6; +r2 = 1e3; +r1 = 1e3; + +global scope_gain_0 +global scope_gain_1 +global CH1_AC +global CH2_AC + +if channel == 1 + scope_gain = scope_gain_1; + AC_offset = CH2_AC * 1.65; +else + scope_gain = scope_gain_0; + AC_offset = CH1_AC * 1.65; +end + +vn = vcc * (r2/(r1+r2)); +vx = vn + (vin - vn) * (r4 / (r3+r4)); +vref = vcc/2; + +expected = int8((vx - vn)/vref * scope_gain * TOP); \ No newline at end of file diff --git a/Old Matlab Interface/dotheplot.m b/Old Matlab Interface/dotheplot.m new file mode 100644 index 00000000..2906160b --- /dev/null +++ b/Old Matlab Interface/dotheplot.m @@ -0,0 +1,8 @@ +global gui_axes + +tic +for n = 1:10 + plot(gui_axes, 1, 1) + drawnow +end +toc \ No newline at end of file diff --git a/Old Matlab Interface/draw_triggered.m b/Old Matlab Interface/draw_triggered.m new file mode 100644 index 00000000..9f980ed9 --- /dev/null +++ b/Old Matlab Interface/draw_triggered.m @@ -0,0 +1,29 @@ +global scope_window_time +global gui_delay +global trigger + +pause(0.001) +%Will be buggy with delay +delay_sec = get(gui_delay, 'Max') - get(gui_delay, 'Value'); +delay_sample = delay_sec*(samplestoshow/scope_window_time); + +first + +if (length(buffer)>samplestoshow) & ((length(buffer) - first) > (floor(samplestoshow/2))) + if (samplestoshow>500) + temp_waveform = buffer((first - floor(samplestoshow/2)) : (samplestoshow/500) : (first + floor(samplestoshow/2))); + else + temp_waveform = buffer((first - floor(samplestoshow/2)) : (first + floor(samplestoshow/2))); + end + trigger.begin = length(buffer) + trigger.state = 0; + update_enable = 1 + cool_waveform = undofrontend(temp_waveform, channel); + taxis = linspace(-scope_window_time-delay_sec,-delay_sec,length(cool_waveform)); + return +end + +update_enable = 0 +taxis = [] +cool_waveform = [] +pause(0.001) \ No newline at end of file diff --git a/Old Matlab Interface/drawdick.m b/Old Matlab Interface/drawdick.m new file mode 100644 index 00000000..930d948b --- /dev/null +++ b/Old Matlab Interface/drawdick.m @@ -0,0 +1,28 @@ +x = -21:20 +leftBall = sqrt(21.^2 - x.^2) +rightBall = fliplr(leftBall) +x = -21:0 + +length = 156 +leftCockHalf = sqrt(21.^2 - x.^2) + length +centreDip = length + 21/2 +rightCockHalf = fliplr(leftCockHalf) + +penis = [leftCockHalf centreDip rightCockHalf] + +cockAndBalls = [leftBall penis rightBall] + +plot(cockAndBalls) +diff = (length + 21 - 128)/2 +axis([-diff, 128 + diff, 0, length + 21]) + +cockAndBalls = cockAndBalls * 255/max(cockAndBalls) +cockAndBalls = uint8(cockAndBalls) + +for i=1:128 + fprintf('%d\t', cockAndBalls(i)) +end + +% length = 156 +% plot([sqrt(21.^2 - [-21:20].^2), [sqrt(21.^2 - [-21:0].^2) + 156, 156 + 21/2, fliplr(sqrt(21.^2 - [-21:0].^2)+156)] fliplr(sqrt(21.^2 - [-21:20].^2))]) +% axis([-(156+21-128)/2, 128 + (156+21-128)/2, 0, length + 21]) diff --git a/Old Matlab Interface/expected_adc.m b/Old Matlab Interface/expected_adc.m new file mode 100644 index 00000000..0a21e192 --- /dev/null +++ b/Old Matlab Interface/expected_adc.m @@ -0,0 +1,9 @@ +function [res] = expected_adc(vout) + +vinp = vout/11; +vinn = 0; +vref = 1.65; +gain = 1; +top = 128; + +res = int16((vinp - vinn)/vref * gain * top); \ No newline at end of file diff --git a/Old Matlab Interface/findtest.m b/Old Matlab Interface/findtest.m new file mode 100644 index 00000000..f86821bd --- /dev/null +++ b/Old Matlab Interface/findtest.m @@ -0,0 +1,6 @@ +a = 324567890; +tic +b = find(a>9999999,1, 'first'); +toc + +b; \ No newline at end of file diff --git a/Old Matlab Interface/first_gui.fig b/Old Matlab Interface/first_gui.fig new file mode 100644 index 00000000..b14b8e29 Binary files /dev/null and b/Old Matlab Interface/first_gui.fig differ diff --git a/Old Matlab Interface/first_gui.m b/Old Matlab Interface/first_gui.m new file mode 100644 index 00000000..ae9e431d --- /dev/null +++ b/Old Matlab Interface/first_gui.m @@ -0,0 +1,1425 @@ +function varargout = first_gui(varargin) +% FIRST_GUI MATLAB code for first_gui.fig +% FIRST_GUI, by itself, creates a new FIRST_GUI or raises the existing +% singleton*. +% +% H = FIRST_GUI returns the handle to a new FIRST_GUI or the handle to +% the existing singleton*. +% +% FIRST_GUI('CALLBACK',hObject,eventData,handles,...) calls the local +% function named CALLBACK in FIRST_GUI.M with the given input arguments. +% +% FIRST_GUI('Property','Value',...) creates a new FIRST_GUI or raises the +% existing singleton*. Starting from the left, property value pairs are +% applied to the GUI before first_gui_OpeningFcn gets called. An +% unrecognized property name or invalid value makes property application +% stop. All inputs are passed to first_gui_OpeningFcn via varargin. +% +% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one +% instance to run (singleton)". +% +% See also: GUIDE, GUIDATA, GUIHANDLES + +% Edit the above text to modify the response to help first_gui + +% Last Modified by GUIDE v2.5 26-Feb-2016 12:00:46 + +% Begin initialization code - DO NOT EDIT +gui_Singleton = 1; +gui_State = struct('gui_Name', mfilename, ... + 'gui_Singleton', gui_Singleton, ... + 'gui_OpeningFcn', @first_gui_OpeningFcn, ... + 'gui_OutputFcn', @first_gui_OutputFcn, ... + 'gui_LayoutFcn', [] , ... + 'gui_Callback', []); +if nargin && ischar(varargin{1}) + gui_State.gui_Callback = str2func(varargin{1}); +end + +if nargout + [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); +else + gui_mainfcn(gui_State, varargin{:}); +end +% End initialization code - DO NOT EDIT + + +% --- Executes just before first_gui is made visible. +function first_gui_OpeningFcn(hObject, eventdata, handles, varargin) +% This function has no output args, see OutputFcn. +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +% varargin command line arguments to first_gui (see VARARGIN) + +% Choose default command line output for first_gui +handles.output = hObject; + +handles + +movegui(handles.figure1,[128,128]) + +global gui_axes +global gui_delay +global text_box_1 +global text_box_2 +global text_box_c +global gui_figure1 + +text_box_c = handles.text14; + +gui_delay = handles.slider6 +gui_axes = handles.axes1; +text_box_1 = handles.edit1; +text_box_2 = handles.text9; +gui_figure1 = handles.figure1; + + + +%get(handles.axes1) + +% Update handles structure +guidata(hObject, handles); + +% UIWAIT makes first_gui wait for user response (see UIRESUME) +% uiwait(handles.figure1); + + +% --- Outputs from this function are returned to the command line. +function varargout = first_gui_OutputFcn(hObject, eventdata, handles) +% varargout cell array for returning output args (see VARARGOUT); +% hObject handle to figure +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Get default command line output from handles structure +varargout{1} = handles.output; + + + +function edit1_Callback(hObject, eventdata, handles) +% hObject handle to edit1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit1 as text +% str2double(get(hObject,'String')) returns contents of edit1 as a double + + +% --- Executes during object creation, after setting all properties. +function edit1_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit2_Callback(hObject, eventdata, handles) +% hObject handle to edit2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit2 as text +% str2double(get(hObject,'String')) returns contents of edit2 as a double + + +% --- Executes during object creation, after setting all properties. +function edit2_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit3_Callback(hObject, eventdata, handles) +% hObject handle to edit3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit3 as text +% str2double(get(hObject,'String')) returns contents of edit3 as a double + + +% --- Executes during object creation, after setting all properties. +function edit3_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit4_Callback(hObject, eventdata, handles) +% hObject handle to edit4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit4 as text +% str2double(get(hObject,'String')) returns contents of edit4 as a double + + +% --- Executes during object creation, after setting all properties. +function edit4_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider1_Callback(hObject, eventdata, handles) +global scope_window_time +global gui_delay +% hObject handle to slider1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +scope_window_time = 10^(-get(hObject, 'value')) +set(gui_delay, 'SliderStep', [scope_window_time/100, scope_window_time/10]); +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider1_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + + +function edit5_Callback(hObject, eventdata, handles) +% hObject handle to edit5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit5 as text +% str2double(get(hObject,'String')) returns contents of edit5 as a double + + +% --- Executes during object creation, after setting all properties. +function edit5_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton1. +function pushbutton1_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + + +% --- Executes on slider movement. +function slider2_Callback(hObject, eventdata, handles) +% hObject handle to slider2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_hori_cursor_a_pos +global scope_window_max +global scope_window_min +global text_box_2 +global gui_cursor_mode + +gui_hori_cursor_a_pos = scope_window_min + (scope_window_max - scope_window_min) * get(hObject,'Value'); + +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %s\n V2 = %s\n DeltaV = %s\n', sisprintf(gui_hori_cursor_a_pos,'V',3), sisprintf(gui_hori_cursor_b_pos,'V',3), sisprintf(gui_hori_cursor_a_pos - gui_hori_cursor_b_pos,'V',3))) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %s\n T2 = %s\n DeltaT = %s\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', sisprintf(gui_vert_cursor_a_pos,'s',3), sisprintf(gui_vert_cursor_b_pos,'s',3), sisprintf(gui_vert_cursor_a_pos - gui_vert_cursor_b_pos,'s',3))) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %s\n T2 = %s\n DeltaT = %s\n \n V1 = %s\n V2 = %s\n DeltaV = %s\n', sisprintf(gui_vert_cursor_a_pos,'s',3), sisprintf(gui_vert_cursor_b_pos,'s',3), sisprintf(gui_vert_cursor_a_pos - gui_vert_cursor_b_pos,'s',3), sisprintf(gui_hori_cursor_a_pos,'v',3), sisprintf(gui_hori_cursor_b_pos,'v',3), sisprintf(gui_hori_cursor_a_pos - gui_hori_cursor_b_pos,'v',3))) + otherwise error('Gui_cursor_mode is invalid') +end +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider2_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on selection change in popupmenu1. +function popupmenu1_Callback(hObject, eventdata, handles) +% hObject handle to popupmenu1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_cursor_mode +gui_cursor_mode = get(hObject,'Value') + +% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array +% contents{get(hObject,'Value')} returns selected item from popupmenu1 + + +% --- Executes during object creation, after setting all properties. +function popupmenu1_CreateFcn(hObject, eventdata, handles) +% hObject handle to popupmenu1 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: popupmenu controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider3_Callback(hObject, eventdata, handles) +% hObject handle to slider3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_hori_cursor_b_pos +global scope_window_max +global scope_window_min +global text_box_2 +global gui_cursor_mode + +gui_hori_cursor_b_pos = scope_window_min + (scope_window_max - scope_window_min) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %s\n V2 = %s\n DeltaV = %s\n', sisprintf(gui_hori_cursor_a_pos,'V',3), sisprintf(gui_hori_cursor_b_pos,'V',3), sisprintf(gui_hori_cursor_a_pos - gui_hori_cursor_b_pos,'V',3))) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %s\n T2 = %s\n DeltaT = %s\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', sisprintf(gui_vert_cursor_a_pos,'s',3), sisprintf(gui_vert_cursor_b_pos,'s',3), sisprintf(gui_vert_cursor_a_pos - gui_vert_cursor_b_pos,'s',3))) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %s\n T2 = %s\n DeltaT = %s\n \n V1 = %s\n V2 = %s\n DeltaV = %s\n', sisprintf(gui_vert_cursor_a_pos,'s',3), sisprintf(gui_vert_cursor_b_pos,'s',3), sisprintf(gui_vert_cursor_a_pos - gui_vert_cursor_b_pos,'s',3), sisprintf(gui_hori_cursor_a_pos,'v',3), sisprintf(gui_hori_cursor_b_pos,'v',3), sisprintf(gui_hori_cursor_a_pos - gui_hori_cursor_b_pos,'v',3))) + otherwise error('Gui_cursor_mode is invalid') +end +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider3_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + + +function edit6_Callback(hObject, eventdata, handles) +% hObject handle to edit6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_waveform +gui_awg_waveform = get(hObject,'String'); + + +% Hints: get(hObject,'String') returns contents of edit6 as text +% str2double(get(hObject,'String')) returns contents of edit6 as a double + + +% --- Executes during object creation, after setting all properties. +function edit6_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton3. +function pushbutton3_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton3 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_awg_waveform +global gui_awg_amplitude +global gui_awg_frequency +global scope_mode + +gui_awg_waveform +gui_awg_amplitude +gui_awg_frequency +if scope_mode == 0 | scope_mode == 3 | scope_mode == 5 + tiny_send_waveform(eval(gui_awg_waveform), amp2bin(str2num(gui_awg_amplitude),1), str2num(gui_awg_frequency)); + fprintf('\nStandard\n') +else + error('Can''t send, breh!') +end + + +function edit7_Callback(hObject, eventdata, handles) +% hObject handle to edit7 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_amplitude +gui_awg_amplitude = get(hObject,'String'); + +% Hints: get(hObject,'String') returns contents of edit7 as text +% str2double(get(hObject,'String')) returns contents of edit7 as a double + + +% --- Executes during object creation, after setting all properties. +function edit7_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit7 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit8_Callback(hObject, eventdata, handles) +% hObject handle to edit8 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_awg_frequency +gui_awg_frequency = get(hObject,'String'); +% Hints: get(hObject,'String') returns contents of edit8 as text +% str2double(get(hObject,'String')) returns contents of edit8 as a double + + +% --- Executes during object creation, after setting all properties. +function edit8_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit8 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. + +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton4. +function pushbutton4_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_scope_running +gui_scope_running = ~gui_scope_running + + + +function edit9_Callback(hObject, eventdata, handles) +% hObject handle to edit9 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vo; +gui_vo = str2num(get(hObject, 'String')); +setpsu_boost(gui_vo); + + +% Hints: get(hObject,'String') returns contents of edit9 as text +% str2double(get(hObject,'String')) returns contents of edit9 as a double + + +% --- Executes during object creation, after setting all properties. +function edit9_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit9 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit10_Callback(hObject, eventdata, handles) +% hObject handle to edit10 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_ro; +gui_ro = str2num(get(hObject, 'String')); +% Hints: get(hObject,'String') returns contents of edit10 as text +% str2double(get(hObject,'String')) returns contents of edit10 as a double + + +% --- Executes during object creation, after setting all properties. +function edit10_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit10 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in pushbutton5. +function pushbutton5_Callback(hObject, eventdata, handles) +% hObject handle to pushbutton5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + + +% --- Executes on slider movement. +function slider4_Callback(hObject, eventdata, handles) +% hObject handle to slider4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vert_cursor_a_pos +global scope_window_time +global text_box_2 +global gui_cursor_mode + +gui_vert_cursor_a_pos = -scope_window_time + (scope_window_time) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_b_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %s\n V2 = %s\n DeltaV = %s\n', sisprintf(gui_hori_cursor_a_pos,'V',3), sisprintf(gui_hori_cursor_b_pos,'V',3), sisprintf(gui_hori_cursor_a_pos - gui_hori_cursor_b_pos,'V',3))) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %s\n T2 = %s\n DeltaT = %s\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', sisprintf(gui_vert_cursor_a_pos,'s',3), sisprintf(gui_vert_cursor_b_pos,'s',3), sisprintf(gui_vert_cursor_a_pos - gui_vert_cursor_b_pos,'s',3))) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %s\n T2 = %s\n DeltaT = %s\n \n V1 = %s\n V2 = %s\n DeltaV = %s\n', sisprintf(gui_vert_cursor_a_pos,'s',3), sisprintf(gui_vert_cursor_b_pos,'s',3), sisprintf(gui_vert_cursor_a_pos - gui_vert_cursor_b_pos,'s',3), sisprintf(gui_hori_cursor_a_pos,'v',3), sisprintf(gui_hori_cursor_b_pos,'v',3), sisprintf(gui_hori_cursor_a_pos - gui_hori_cursor_b_pos,'v',3))) + otherwise error('Gui_cursor_mode is invalid') +end +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider4_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on slider movement. +function slider5_Callback(hObject, eventdata, handles) +% hObject handle to slider5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +global gui_vert_cursor_b_pos +global scope_window_time +global text_box_2 +global gui_cursor_mode +gui_vert_cursor_b_pos = -scope_window_time + (scope_window_time) * get(hObject,'Value'); + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +switch gui_cursor_mode + case 1 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ')) + case 2 + set(text_box_2, 'String', sprintf(' Vertical Cursor Disabled\n Vertical Cursor Disabled\n Vertical Cursor Disabled\n \n V1 = %s\n V2 = %s\n DeltaV = %s\n', sisprintf(gui_hori_cursor_a_pos,'V',3), sisprintf(gui_hori_cursor_b_pos,'V',3), sisprintf(gui_hori_cursor_a_pos - gui_hori_cursor_b_pos,'V',3))) + case 3 + set(text_box_2, 'String', sprintf(' T1 = %s\n T2 = %s\n DeltaT = %s\n \n Horizontal cursor disabled \n Horizontal cursor disabled \n Horizontal cursor disabled \n ', sisprintf(gui_vert_cursor_a_pos,'s',3), sisprintf(gui_vert_cursor_b_pos,'s',3), sisprintf(gui_vert_cursor_a_pos - gui_vert_cursor_b_pos,'s',3))) + case 4 + set(text_box_2, 'String', sprintf(' T1 = %s\n T2 = %s\n DeltaT = %s\n \n V1 = %s\n V2 = %s\n DeltaV = %s\n', sisprintf(gui_vert_cursor_a_pos,'s',3), sisprintf(gui_vert_cursor_b_pos,'s',3), sisprintf(gui_vert_cursor_a_pos - gui_vert_cursor_b_pos,'s',3), sisprintf(gui_hori_cursor_a_pos,'v',3), sisprintf(gui_hori_cursor_b_pos,'v',3), sisprintf(gui_hori_cursor_a_pos - gui_hori_cursor_b_pos,'v',3))) + otherwise error('Gui_cursor_mode is invalid') +end +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider5_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end + + +% --- Executes on selection change in popupmenu2. +function popupmenu2_Callback(hObject, eventdata, handles) +% hObject handle to popupmenu2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global scope_mode +global scope_gain_0 +global scope_gain_1 +global refreshrate +global refreshrate_temp +global waveform_exists +global saved_waveform_ch1 +global saved_waveform_ch2 +global gui_delay + +refreshrate_temp = refreshrate; +waveform_exists = 0 + +contents = cellstr(get(hObject,'String')); +tempstring = contents{get(hObject,'Value')}; + +mode = str2num(tempstring(6)); +setscopemode(mode, scope_gain_0, scope_gain_1) + +saved_waveform_ch1 = []; +saved_waveform_ch2 = []; +set(gui_delay, 'Value', get(gui_delay, 'Max')) + +if(mode==7) + set(handles.popupmenu3, 'Visible', 'on') + set(handles.popupmenu4, 'Visible', 'on') + set(handles.popupmenu7, 'Visible', 'on') +else + set(handles.popupmenu3, 'Visible', 'off') + set(handles.popupmenu4, 'Visible', 'off') + set(handles.popupmenu7, 'Visible', 'off') + set_gain_auto +end + +% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu2 contents as cell array +% contents{get(hObject,'Value')} returns selected item from popupmenu2 + + +% --- Executes during object creation, after setting all properties. +function popupmenu2_CreateFcn(hObject, eventdata, handles) +% hObject handle to popupmenu2 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: popupmenu controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on slider movement. +function slider6_Callback(hObject, eventdata, handles) +% hObject handle to slider6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'Value') returns position of slider +% get(hObject,'Min') and get(hObject,'Max') to determine range of slider + + +% --- Executes during object creation, after setting all properties. +function slider6_CreateFcn(hObject, eventdata, handles) +% hObject handle to slider6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: slider controls usually have a light gray background. +if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor',[.9 .9 .9]); +end +set(hObject,'Value', 1); + + + +function edit11_Callback(hObject, eventdata, handles) +% hObject handle to edit11 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) +global gui_delay + +boxvar = str2num(get(hObject,'String')); +if boxvar1.1e-5) + scope_window_time = scope_window_time / sqrt(sqrt(10)); +end + +scope_window_time + + +% --- Executes on button press in checkbox4. +function checkbox4_Callback(hObject, eventdata, handles) +% hObject handle to checkbox4 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hint: get(hObject,'Value') returns toggle state of checkbox4 + +global gui_cursor_mode +switch(gui_cursor_mode) + case 1 + gui_cursor_mode = 3; + case 2 + gui_cursor_mode = 4; + case 3 + gui_cursor_mode = 1; + case 4 + gui_cursor_mode = 2; +end + +if(gui_cursor_mode>1) + set(handles.text9, 'Visible', 'on') +else + set(handles.text9, 'Visible', 'off') +end + +% --- Executes on button press in checkbox5. +function checkbox5_Callback(hObject, eventdata, handles) +% hObject handle to checkbox5 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hint: get(hObject,'Value') returns toggle state of checkbox5 +global gui_cursor_mode +switch(gui_cursor_mode) + case 1 + gui_cursor_mode = 2; + case 2 + gui_cursor_mode = 1; + case 3 + gui_cursor_mode = 4; + case 4 + gui_cursor_mode = 3; +end + +if(gui_cursor_mode>1) + set(handles.text9, 'Visible', 'on') +else + set(handles.text9, 'Visible', 'off') +end + + + +% --- Executes on button press in checkbox6. +function checkbox6_Callback(hObject, eventdata, handles) +% hObject handle to checkbox6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hint: get(hObject,'Value') returns toggle state of checkbox6 +global CH1_AC +CH1_AC = get(hObject,'Value') + +% --- Executes on button press in checkbox7. +function checkbox7_Callback(hObject, eventdata, handles) +% hObject handle to checkbox7 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hint: get(hObject,'Value') returns toggle state of checkbox7 +global CH2_AC +CH2_AC = get(hObject,'Value') + + +% --- Executes on button press in togglebutton6. +function togglebutton6_Callback(hObject, eventdata, handles) +% hObject handle to togglebutton6 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hint: get(hObject,'Value') returns toggle state of togglebutton6 + + + +function edit23_Callback(hObject, eventdata, handles) +% hObject handle to edit23 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit23 as text +% str2double(get(hObject,'String')) returns contents of edit23 as a double +global trigger +trigger.h = str2double(get(hObject,'String')) + + +% --- Executes during object creation, after setting all properties. +function edit23_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit23 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + + +function edit24_Callback(hObject, eventdata, handles) +% hObject handle to edit24 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hints: get(hObject,'String') returns contents of edit24 as text +% str2double(get(hObject,'String')) returns contents of edit24 as a double +global trigger +trigger.l = str2double(get(hObject,'String')) + + +% --- Executes during object creation, after setting all properties. +function edit24_CreateFcn(hObject, eventdata, handles) +% hObject handle to edit24 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles empty - handles not created until after all CreateFcns called + +% Hint: edit controls usually have a white background on Windows. +% See ISPC and COMPUTER. +if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) + set(hObject,'BackgroundColor','white'); +end + + +% --- Executes on button press in togglebutton7. +function togglebutton7_Callback(hObject, eventdata, handles) +% hObject handle to togglebutton7 (see GCBO) +% eventdata reserved - to be defined in a future version of MATLAB +% handles structure with handles and user data (see GUIDATA) + +% Hint: get(hObject,'Value') returns toggle state of togglebutton7 +global trigger +trigger.enabled = get(hObject,'Value') + + +if(trigger.enabled == 1) + set(handles.edit23, 'Visible', 'on') + set(handles.edit24, 'Visible', 'on') +else + set(handles.edit23, 'Visible', 'off') + set(handles.edit24, 'Visible', 'off') +end diff --git a/Old Matlab Interface/first_gui_test.m b/Old Matlab Interface/first_gui_test.m new file mode 100644 index 00000000..9409e06c --- /dev/null +++ b/Old Matlab Interface/first_gui_test.m @@ -0,0 +1,4 @@ +first_gui + +%global gui_axes +%plot(gui_axes, linspace(0,2*pi,1000), sin(linspace(0,2*pi,1000))) \ No newline at end of file diff --git a/Old Matlab Interface/helloworld.cpp b/Old Matlab Interface/helloworld.cpp new file mode 100644 index 00000000..7c3080c9 --- /dev/null +++ b/Old Matlab Interface/helloworld.cpp @@ -0,0 +1,19 @@ +#include +#include +#include + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + unsigned char n; + char *garen; + + garen = mxArrayToString(prhs[0]); + + mexPrintf("nlhs = %d\n", nlhs); + mexPrintf("nrhs = %d\n", nrhs); + mexPrintf("STRING = %s\n", garen); + + + + return; +} \ No newline at end of file diff --git a/Old Matlab Interface/helloworld.mexw64 b/Old Matlab Interface/helloworld.mexw64 new file mode 100644 index 00000000..4cabd8c0 Binary files /dev/null and b/Old Matlab Interface/helloworld.mexw64 differ diff --git a/Old Matlab Interface/hexoffset.m b/Old Matlab Interface/hexoffset.m new file mode 100644 index 00000000..2a9d895a --- /dev/null +++ b/Old Matlab Interface/hexoffset.m @@ -0,0 +1,3 @@ +function [offset] = hexoffset(hexin) + decin = hex2dec(hexin); + offset = dec2hex(decin+750); \ No newline at end of file diff --git a/Old Matlab Interface/hs_err_pid1976.log b/Old Matlab Interface/hs_err_pid1976.log new file mode 100644 index 00000000..8a6a7a40 --- /dev/null +++ b/Old Matlab Interface/hs_err_pid1976.log @@ -0,0 +1,272 @@ +# +# A fatal error has been detected by the Java Runtime Environment: +# +# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000078c39eba, pid=1976, tid=4708 +# +# JRE version: 6.0_17-b04 +# Java VM: Java HotSpot(TM) 64-Bit Server VM (14.3-b01 mixed mode windows-amd64 ) +# Problematic frame: +# C 0x0000000078c39eba +# +# If you would like to submit a bug report, please visit: +# http://java.sun.com/webapps/bugreport/crash.jsp +# + +--------------- T H R E A D --------------- + +Current thread (0x0000000005eb6800): GCTaskThread [stack: 0x0000000044b90000,0x0000000048b90000] [id=4708] + +siginfo: ExceptionCode=0xc0000005, reading address 0x00000000000000a0 + +Registers: +EAX=0x0000000000000000, EBX=0x000000003fdd1d00, ECX=0x000000002cc752c8, EDX=0x000000003f3848c0 +ESP=0x0000000048b8f5f0, EBP=0x0000000000000001, ESI=0x0000000005f7ea20, EDI=0x000000003f3848c0 +EIP=0x0000000078c39eba, EFLAGS=0x0000000000010246 + +Top of Stack: (sp=0x0000000048b8f5f0) +0x0000000048b8f5f0: 000000003fdd1db8 0000000000000008 +0x0000000048b8f600: 0000000005f7ea20 000000003fdd1df8 +0x0000000048b8f610: 000000003fdd0908 0000000000001000 +0x0000000048b8f620: 0000000005f7ea20 000000003f1ad550 +0x0000000048b8f630: 0000000000000000 0000000005eb7101 +0x0000000048b8f640: 000000005b409a60 0000000005f7ea20 +0x0000000048b8f650: 00000000000008bd 0000000005f7ea20 +0x0000000048b8f660: 0000000000000001 0000000078c3b371 +0x0000000048b8f670: 000000005b4096a0 0000000000000011 +0x0000000048b8f680: 00000000593ecd01 000000003fdd1d00 +0x0000000048b8f690: 0000000048b8f701 0000000078c9f391 +0x0000000048b8f6a0: 000000000dcee201 000000003fdd1d00 +0x0000000048b8f6b0: 0000000005eb7140 0000000005eb7130 +0x0000000048b8f6c0: 0000000005eb34e0 0000000078b4b4be +0x0000000048b8f6d0: 0000000048b8f720 0000000005eb7518 +0x0000000048b8f6e0: 0000000005eb7140 000000005b409a60 + +Instructions: (pc=0x0000000078c39eba) +0x0000000078c39eaa: c1 e8 03 eb 11 49 8b 40 10 49 8d 48 10 48 8b d7 +0x0000000078c39eba: ff 90 a0 00 00 00 48 63 e8 41 0f b6 c5 f6 d0 a8 + + +Stack: [0x0000000044b90000,0x0000000048b90000], sp=0x0000000048b8f5f0, free space=65533k +Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) +C 0x0000000078c39eba + + +--------------- P R O C E S S --------------- + +Java Threads: ( => current thread ) + 0x0000000059654000 JavaThread "Thread-42" [_thread_blocked, id=5668, stack(0x0000000029330000,0x00000000293b0000)] + 0x000000000ed84000 JavaThread "Code Analyzer updating thread" [_thread_blocked, id=5416, stack(0x0000000060b00000,0x0000000060b80000)] + 0x000000000ed83000 JavaThread "Code Analyzer updating thread" [_thread_blocked, id=5412, stack(0x0000000060bc0000,0x0000000060c40000)] + 0x000000000ed82800 JavaThread "Code Analyzer updating thread" [_thread_blocked, id=5408, stack(0x0000000060680000,0x0000000060700000)] + 0x000000005965f800 JavaThread "Code Analyzer updating thread" [_thread_blocked, id=5404, stack(0x0000000060980000,0x0000000060a00000)] + 0x000000005965e000 JavaThread "Code Analyzer updating thread" [_thread_blocked, id=5400, stack(0x0000000060a70000,0x0000000060af0000)] + 0x000000005965d800 JavaThread "Code Analyzer updating thread" [_thread_blocked, id=5396, stack(0x00000000608b0000,0x0000000060930000)] + 0x000000005965c800 JavaThread "Code Analyzer updating thread" [_thread_blocked, id=5392, stack(0x00000000607d0000,0x0000000060850000)] + 0x000000005965c000 JavaThread "Code Analyzer updating thread" [_thread_blocked, id=5388, stack(0x000000005fc40000,0x000000005fcc0000)] + 0x000000005965b000 JavaThread "Code Analyzer updating thread" [_thread_blocked, id=5384, stack(0x0000000060700000,0x0000000060780000)] + 0x000000005965a800 JavaThread "Code Analyzer updating thread" [_thread_blocked, id=5380, stack(0x000000005bbc0000,0x000000005bc40000)] + 0x0000000059658000 JavaThread "Active Reference Queue Daemon" daemon [_thread_blocked, id=5372, stack(0x000000005ba20000,0x000000005baa0000)] + 0x0000000059659800 JavaThread "Timer-7" daemon [_thread_blocked, id=5368, stack(0x0000000060ec0000,0x0000000060f40000)] + 0x0000000059659000 JavaThread "Timer-6" daemon [_thread_blocked, id=5360, stack(0x000000005fcc0000,0x000000005fd40000)] + 0x0000000059657800 JavaThread "Explorer NavigationContext request queue" [_thread_blocked, id=5336, stack(0x000000005bb20000,0x000000005bba0000)] + 0x0000000059656000 JavaThread "AddressBar directory emptiness poller" [_thread_blocked, id=5324, stack(0x0000000044b10000,0x0000000044b90000)] + 0x0000000059655800 JavaThread "Explorer Refresh Service 196620025" [_thread_blocked, id=5320, stack(0x0000000048cf0000,0x0000000048d70000)] + 0x0000000059654800 JavaThread "Timer-1" daemon [_thread_blocked, id=5308, stack(0x0000000054fa0000,0x0000000055020000)] + 0x0000000059651800 JavaThread "TimerQueue" daemon [_thread_blocked, id=5192, stack(0x000000000fda0000,0x000000000fe20000)] + 0x0000000059651000 JavaThread "Thread-5" daemon [_thread_blocked, id=5164, stack(0x000000000ff20000,0x000000000ffa0000)] + 0x0000000059650800 JavaThread "FelixPackageAdmin" daemon [_thread_blocked, id=5160, stack(0x000000000fe20000,0x000000000fea0000)] + 0x00000000596d6000 JavaThread "FelixStartLevel" daemon [_thread_blocked, id=5156, stack(0x0000000014ec0000,0x0000000014f40000)] + 0x0000000059801000 JavaThread "FelixDispatchQueue" daemon [_thread_blocked, id=5152, stack(0x0000000008e50000,0x0000000008ed0000)] + 0x00000000593db000 JavaThread "AWT-EventQueue-0" [_thread_blocked, id=5144, stack(0x0000000008c20000,0x0000000008ca0000)] + 0x00000000593ef800 JavaThread "com.google.common.base.internal.Finalizer" daemon [_thread_blocked, id=5140, stack(0x00000000089c0000,0x0000000008a40000)] + 0x0000000059308800 JavaThread "AWT-Windows" daemon [_thread_in_native, id=5132, stack(0x00000000088b0000,0x0000000008930000)] + 0x0000000059308000 JavaThread "AWT-Shutdown" [_thread_blocked, id=5128, stack(0x0000000008aa0000,0x0000000008b20000)] + 0x0000000059307000 JavaThread "Java2D Disposer" daemon [_thread_blocked, id=5124, stack(0x0000000008930000,0x00000000089b0000)] + 0x00000000590ef000 JavaThread "Timer-0" [_thread_blocked, id=2064, stack(0x000000000ee20000,0x000000000eea0000)] + 0x000000000fca9000 JavaThread "EventMgr Dispatcher" daemon [_thread_in_native, id=4820, stack(0x0000000009290000,0x000000000d290000)] + 0x000000000ecac000 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=4476, stack(0x000000000f0f0000,0x000000000f170000)] + 0x000000000ecaa000 JavaThread "CompilerThread1" daemon [_thread_blocked, id=2884, stack(0x0000000050f80000,0x0000000054f80000)] + 0x000000000eca4000 JavaThread "CompilerThread0" daemon [_thread_blocked, id=1444, stack(0x000000004ce00000,0x0000000050e00000)] + 0x000000000eca3800 JavaThread "Attach Listener" daemon [_thread_blocked, id=4136, stack(0x000000000ef70000,0x000000000eff0000)] + 0x000000000ec48000 JavaThread "Finalizer" daemon [_thread_blocked, id=4300, stack(0x000000000eef0000,0x000000000ef70000)] + 0x000000000ec45000 JavaThread "Reference Handler" daemon [_thread_blocked, id=1980, stack(0x000000000ddf0000,0x000000000de70000)] + 0x0000000005e7e800 JavaThread "main" [_thread_in_native, id=1936, stack(0x0000000000220000,0x0000000004220000)] + +Other Threads: + 0x000000000ec41000 VMThread [stack: 0x0000000048d80000,0x000000004cd80000] [id=4332] + 0x000000000ece3800 WatcherThread [stack: 0x0000000055080000,0x0000000059080000] [id=3408] + +=>0x0000000005eb6800 (exited) GCTaskThread [stack: 0x0000000044b90000,0x0000000048b90000] [id=4708] + +VM state:at safepoint (normal execution) + +VM Mutex/Monitor currently owned by a thread: ([mutex/lock_event]) +[0x0000000005eaa660] Threads_lock - owner thread: 0x000000000ec41000 +[0x0000000005eaab60] Heap_lock - owner thread: 0x00000000593db000 + +Heap + PSYoungGen total 38592K, used 29570K [0x000000003d6b0000, 0x0000000040690000, 0x00000000407b0000) + eden space 27776K, 100% used [0x000000003d6b0000,0x000000003f1d0000,0x000000003f1d0000) + from space 10816K, 16% used [0x000000003f1d0000,0x000000003f390908,0x000000003fc60000) + to space 10368K, 18% used [0x000000003fc70000,0x000000003fe562e8,0x0000000040690000) + PSOldGen total 108032K, used 65756K [0x00000000343b0000, 0x000000003ad30000, 0x000000003d6b0000) + object space 108032K, 60% used [0x00000000343b0000,0x00000000383e7188,0x000000003ad30000) + PSPermGen total 123968K, used 61741K [0x000000002c3b0000, 0x0000000033cc0000, 0x00000000343b0000) + object space 123968K, 49% used [0x000000002c3b0000,0x000000002fffb440,0x0000000033cc0000) + +Dynamic libraries: +0x000000013f5d0000 - 0x000000013f5fd000 C:\Program Files\MATLAB\R2012b\bin\win64\MATLAB.exe +0x0000000077b60000 - 0x0000000077d09000 C:\Windows\SYSTEM32\ntdll.dll +0x0000000077940000 - 0x0000000077a5f000 C:\Windows\system32\kernel32.dll +0x000007fefda60000 - 0x000007fefdacc000 C:\Windows\system32\KERNELBASE.dll +0x0000000074460000 - 0x000000007451f000 C:\Program Files\MATLAB\R2012b\bin\win64\libut.dll +0x00000000758a0000 - 0x000000007595c000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwi18n.dll +0x0000000180000000 - 0x000000018000b000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwresource_core.dll +0x0000000072ed0000 - 0x0000000072fa3000 C:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.6161_none_08e61857a83bc251\MSVCP90.dll +0x0000000072e20000 - 0x0000000072ec3000 C:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.6161_none_08e61857a83bc251\MSVCR90.dll +0x000000007a170000 - 0x000000007a19c000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_filesystem-vc90-mt-1_44.dll +0x000000007a560000 - 0x000000007a569000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_system-vc90-mt-1_44.dll +0x000007feffd90000 - 0x000007feffe6b000 C:\Windows\system32\ADVAPI32.dll +0x000007fefdfd0000 - 0x000007fefe06f000 C:\Windows\system32\msvcrt.dll +0x000007feff250000 - 0x000007feff26f000 C:\Windows\SYSTEM32\sechost.dll +0x000007feff7d0000 - 0x000007feff8fd000 C:\Windows\system32\RPCRT4.dll +0x000000007a010000 - 0x000000007a035000 C:\Program Files\MATLAB\R2012b\bin\win64\LIBEXPAT.dll +0x000000006e870000 - 0x000000006ea61000 C:\Program Files\MATLAB\R2012b\bin\win64\icuin44.dll +0x000000006e6f0000 - 0x000000006e861000 C:\Program Files\MATLAB\R2012b\bin\win64\icuuc44.dll +0x0000000010000000 - 0x0000000010e41000 C:\Program Files\MATLAB\R2012b\bin\win64\icudt44.dll +0x0000000073f70000 - 0x000000007411d000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwfl.dll +0x0000000004440000 - 0x00000000047f6000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwMATLAB_res.dll +0x000000007a3b0000 - 0x000000007a3c0000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_date_time-vc90-mt-1_44.dll +0x000000007a250000 - 0x000000007a263000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_signals-vc90-mt-1_44.dll +0x000000007a2d0000 - 0x000000007a2e2000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_thread-vc90-mt-1_44.dll +0x0000000004220000 - 0x00000000042dd000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_log-vc90-mt-1_44.dll +0x0000000077d20000 - 0x0000000077d27000 C:\Windows\system32\PSAPI.DLL +0x000007fefe300000 - 0x000007fefe34d000 C:\Windows\system32\WS2_32.dll +0x000007feff240000 - 0x000007feff248000 C:\Windows\system32\NSI.dll +0x00000000001b0000 - 0x00000000001f6000 C:\Program Files\MATLAB\R2012b\bin\win64\tbb.dll +0x000007fefe2e0000 - 0x000007fefe2f9000 C:\Windows\system32\imagehlp.dll +0x0000000073010000 - 0x0000000073023000 C:\Program Files\MATLAB\R2012b\bin\win64\icuio44.dll +0x000007fef6de0000 - 0x000007fef6f05000 C:\Windows\system32\dbghelp.dll +0x0000000077a60000 - 0x0000000077b5a000 C:\Windows\system32\USER32.dll +0x000007feffd20000 - 0x000007feffd87000 C:\Windows\system32\GDI32.dll +0x000007feff340000 - 0x000007feff34e000 C:\Windows\system32\LPK.dll +0x000007feff270000 - 0x000007feff339000 C:\Windows\system32\USP10.dll +0x0000000004800000 - 0x0000000004adc000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwservices.dll +0x0000000075a20000 - 0x0000000075af3000 C:\Program Files\MATLAB\R2012b\bin\win64\libmx.dll +0x0000000004300000 - 0x0000000004329000 C:\Program Files\MATLAB\R2012b\bin\win64\tbbmalloc.dll +0x000000007a210000 - 0x000000007a228000 C:\Program Files\MATLAB\R2012b\bin\win64\zlib1.dll +0x0000000004af0000 - 0x0000000004b3d000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwregexp.dll +0x0000000004b50000 - 0x0000000004b73000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwmfl_scalar.dll +0x0000000075f10000 - 0x0000000075f60000 C:\Program Files\MATLAB\R2012b\bin\win64\mpath.dll +0x000000007b680000 - 0x000000007bc9a000 C:\Program Files\MATLAB\R2012b\bin\win64\mlutil.dll +0x00000000754d0000 - 0x0000000075551000 C:\Program Files\MATLAB\R2012b\bin\win64\xmlcore.dll +0x0000000004bc0000 - 0x0000000004e13000 C:\Program Files\MATLAB\R2012b\bin\win64\xerces-c_2_7.dll +0x0000000004e30000 - 0x0000000004e50000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwMATLAB_settings_res.dll +0x0000000004e60000 - 0x0000000004e70000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_iostreams-vc90-mt-1_44.dll +0x0000000004e80000 - 0x0000000004ec7000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_serialization-vc90-mt-1_44.dll +0x000007fefe4b0000 - 0x000007feff239000 C:\Windows\system32\SHELL32.dll +0x000007fefe350000 - 0x000007fefe3c1000 C:\Windows\system32\SHLWAPI.dll +0x000007fefab10000 - 0x000007fefabb0000 C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7601.18837_none_a4d981ff711297b6\COMCTL32.dll +0x000007fefdf30000 - 0x000007fefdfc7000 C:\Windows\system32\COMDLG32.dll +0x000007fefb310000 - 0x000007fefb326000 C:\Windows\system32\NETAPI32.dll +0x000007fefb300000 - 0x000007fefb30c000 C:\Windows\system32\netutils.dll +0x000007fefd360000 - 0x000007fefd383000 C:\Windows\system32\srvcli.dll +0x000007fefb2e0000 - 0x000007fefb2f5000 C:\Windows\system32\wkscli.dll +0x000007feffb10000 - 0x000007feffd13000 C:\Windows\system32\ole32.dll +0x000007fefe3d0000 - 0x000007fefe4a7000 C:\Windows\system32\OLEAUT32.dll +0x0000000074970000 - 0x0000000074a31000 C:\Program Files\MATLAB\R2012b\bin\win64\mcr.dll +0x0000000075000000 - 0x00000000753e9000 C:\Program Files\MATLAB\R2012b\bin\win64\iqm.dll +0x0000000074e80000 - 0x0000000074f38000 C:\Program Files\MATLAB\R2012b\bin\win64\m_dispatcher.dll +0x0000000074880000 - 0x000000007496d000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_regex-vc90-mt-1_44.dll +0x000007feec490000 - 0x000007feecd01000 C:\Program Files\MATLAB\R2012b\bin\win64\m_interpreter.dll +0x0000000071610000 - 0x0000000071637000 C:\Program Files\MATLAB\R2012b\bin\win64\libmex.dll +0x0000000063880000 - 0x0000000063904000 C:\Program Files\MATLAB\R2012b\bin\win64\profiler.dll +0x0000000004f50000 - 0x00000000051ba000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwmathutil.dll +0x0000000079f40000 - 0x0000000079f6e000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwmathrng.dll +0x00000000051e0000 - 0x00000000051f2000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwmfl_rng.dll +0x0000000074c10000 - 0x0000000074cee000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwmathcore.dll +0x0000000076160000 - 0x00000000761ca000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwspmatrix.dll +0x0000000075ea0000 - 0x0000000075f02000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwcholmod.dll +0x000000007a460000 - 0x000000007a46d000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwamd.dll +0x000000007a4b0000 - 0x000000007a4bc000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwcolamd.dll +0x000000007a290000 - 0x000000007a2a9000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwblas.dll +0x000000007a310000 - 0x000000007a321000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwbinder.dll +0x000000007a4d0000 - 0x000000007a4dc000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwompwrapper.dll +0x0000000005290000 - 0x0000000005315000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwlapack.dll +0x0000000071500000 - 0x0000000071521000 C:\Program Files\MATLAB\R2012b\bin\win64\m_pcodeio.dll +0x0000000079b10000 - 0x0000000079b77000 C:\Program Files\MATLAB\R2012b\bin\win64\m_ir.dll +0x0000000062600000 - 0x0000000062c70000 C:\Program Files\MATLAB\R2012b\bin\win64\m_parser.dll +0x00000000715f0000 - 0x000000007160a000 C:\Program Files\MATLAB\R2012b\bin\win64\ir_xfmr.dll +0x000007feeb310000 - 0x000007feeb5a6000 C:\Program Files\MATLAB\R2012b\bin\win64\mcos.dll +0x00000000714e0000 - 0x00000000714f1000 C:\Program Files\MATLAB\R2012b\bin\win64\mtok.dll +0x000000006e6b0000 - 0x000000006e6e1000 C:\Program Files\MATLAB\R2012b\bin\win64\m_pcodegen.dll +0x0000000079fb0000 - 0x0000000079fe6000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwbridge.dll +0x00000000637b0000 - 0x0000000063878000 C:\Program Files\MATLAB\R2012b\bin\win64\udd.dll +0x00000000624a0000 - 0x00000000625f2000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwgui.dll +0x00000000714c0000 - 0x00000000714d7000 C:\Program Files\MATLAB\R2012b\bin\win64\graphics_util.dll +0x0000000061a40000 - 0x000000006249f000 C:\Program Files\MATLAB\R2012b\bin\win64\hg.dll +0x00000000053f0000 - 0x0000000005458000 C:\Program Files\MATLAB\R2012b\bin\win64\libmat.dll +0x0000000005470000 - 0x0000000005684000 C:\Program Files\MATLAB\R2012b\bin\win64\hdf5dll.dll +0x0000000075710000 - 0x00000000757de000 C:\Program Files\MATLAB\R2012b\bin\win64\jmi.dll +0x00000000056b0000 - 0x00000000056bd000 C:\Program Files\MATLAB\R2012b\bin\win64\nativejava_services.dll +0x0000000063760000 - 0x00000000637a6000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwhardcopy.dll +0x00000000619d0000 - 0x0000000061a33000 C:\Program Files\MATLAB\R2012b\bin\win64\libuij.dll +0x0000000061760000 - 0x00000000619c4000 C:\Program Files\MATLAB\R2012b\bin\win64\hgdatatypes.dll +0x0000000061640000 - 0x000000006175f000 C:\Program Files\MATLAB\R2012b\bin\win64\hgutils.dll +0x0000000061580000 - 0x0000000061640000 C:\Program Files\MATLAB\R2012b\bin\win64\udd_mi.dll +0x0000000005720000 - 0x000000000575b000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwgbtutils.dll +0x0000000005770000 - 0x000000000578b000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwgbt.dll +0x00000000057a0000 - 0x0000000005a71000 C:\Program Files\MATLAB\R2012b\bin\win64\uiw.dll +0x0000000073070000 - 0x000000007307f000 C:\Program Files\MATLAB\R2012b\bin\win64\uinone.dll +0x0000000005aa0000 - 0x0000000005ac9000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwnativefiledialogs.dll +0x0000000005ae0000 - 0x0000000005ae8000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwplatform_res.dll +0x000007fefa8e0000 - 0x000007fefa8f8000 C:\Windows\system32\MPR.dll +0x0000000060150000 - 0x0000000060634000 C:\Windows\WinSxS\amd64_microsoft.vc90.mfc_1fc8b3b9a1e18e3b_9.0.30729.6161_none_044aad0bab1eb146\mfc90.dll +0x000007fefaae0000 - 0x000007fefaae7000 C:\Windows\system32\MSIMG32.dll +0x000007fefaa60000 - 0x000007fefaad1000 C:\Windows\system32\WINSPOOL.DRV +0x0000000061550000 - 0x0000000061572000 C:\Program Files\MATLAB\R2012b\bin\win64\mwoles05.DLL +0x00000000614d0000 - 0x000000006154d000 C:\Program Files\MATLAB\R2012b\bin\win64\comcli.dll +0x00000000614a0000 - 0x00000000614cf000 C:\Windows\WinSxS\amd64_microsoft.vc90.atl_1fc8b3b9a1e18e3b_9.0.30729.6161_none_0a1fd3a3a768b895\ATL90.DLL +0x000000006e6a0000 - 0x000000006e6ac000 C:\Program Files\MATLAB\R2012b\bin\win64\mlautoregister.dll +0x000007fefd750000 - 0x000007fefd7a7000 C:\Windows\system32\apphelp.dll +0x000007fef6140000 - 0x000007fef6191000 C:\Windows\AppPatch\AppPatch64\AcGenral.DLL +0x000007fefd720000 - 0x000007fefd745000 C:\Windows\system32\SspiCli.dll +0x0000000072500000 - 0x0000000072503000 C:\Windows\system32\sfc.dll +0x000007fef6130000 - 0x000007fef6140000 C:\Windows\system32\sfc_os.DLL +0x000007fefd930000 - 0x000007fefd94e000 C:\Windows\system32\USERENV.dll +0x000007fefd920000 - 0x000007fefd92f000 C:\Windows\system32\profapi.dll +0x000007fefbbd0000 - 0x000007fefbbe8000 C:\Windows\system32\dwmapi.dll +0x000007feffae0000 - 0x000007feffb0e000 C:\Windows\system32\IMM32.DLL +0x000007feff350000 - 0x000007feff459000 C:\Windows\system32\MSCTF.dll +0x000007fefc030000 - 0x000007fefc086000 C:\Windows\system32\UxTheme.dll +0x000000006e690000 - 0x000000006e69d000 C:\Windows\WinSxS\amd64_microsoft.vc90.mfcloc_1fc8b3b9a1e18e3b_9.0.30729.6161_none_01c9581e60cbee58\MFC90ENU.DLL +0x0000000005c80000 - 0x0000000005c92000 C:\Program Files\Logitech\SetPoint\GameHook.dll +0x0000000005de0000 - 0x0000000005df1000 C:\Program Files\Logitech\SetPoint\lgscroll.dll +0x0000000073410000 - 0x00000000734d9000 C:\Windows\WinSxS\amd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6229_none_88dcc0bf2fb1b808\MSVCR80.dll + +VM Arguments: +jvm_args: -Xss512k -XX:PermSize=32m -Xms64m -XX:NewRatio=3 -XX:MaxPermSize=128m -Xmx196m -XX:MaxDirectMemorySize=2147400000 -Dsun.java2d.noddraw=true -Dsun.awt.nopixfmt=true -Xshare:off -Xrs -Dsun.awt.disableMixing=true -Djava.library.path=C:\Program Files\MATLAB\R2012b\bin\win64;C:\Program Files\MATLAB\R2012b\sys\jxbrowser\win64\lib vfprintf abort +java_command: +Launcher Type: generic + +Environment Variables: +PATH=C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Qucs\bin;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\MATLAB\R2012b\runtime\win64;C:\Program Files\MATLAB\R2012b\bin;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.0\;C:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\mingw32\bin;c:\iverilog\bin;c:\iverilog\gtkwave\bin;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files\Microsoft Windows Performance Toolkit\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\Calibre2\;C:\Program Files (x86)\Brackets\command;C:\Program Files (x86)\Skype\Phone\;C:\Program Files (x86)\Atmel\Flip 3.4.7\bin;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\ +USERNAME=Esposch +OS=Windows_NT +PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 15 Stepping 11, GenuineIntel + + + +--------------- S Y S T E M --------------- + +OS: Windows 7 Build 7601 Service Pack 1 + +CPU:total 2 (2 cores per cpu, 1 threads per core) family 6 model 15 stepping 11, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3 + +Memory: 4k page, physical 8387696k(5975848k free), swap 16773552k(14257900k free) + +vm_info: Java HotSpot(TM) 64-Bit Server VM (14.3-b01) for windows-amd64 JRE (1.6.0_17-b04), built on Oct 11 2009 00:46:08 by "java_re" with MS VC++ 8.0 + +time: Fri Jan 29 11:51:11 2016 +elapsed time: 127 seconds + diff --git a/Old Matlab Interface/hs_err_pid4968.log b/Old Matlab Interface/hs_err_pid4968.log new file mode 100644 index 00000000..e27026ef --- /dev/null +++ b/Old Matlab Interface/hs_err_pid4968.log @@ -0,0 +1,268 @@ +# +# A fatal error has been detected by the Java Runtime Environment: +# +# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000352cf9df, pid=4968, tid=1544 +# +# JRE version: 6.0_17-b04 +# Java VM: Java HotSpot(TM) 64-Bit Server VM (14.3-b01 mixed mode windows-amd64 ) +# Problematic frame: +# C 0x00000000352cf9df +# +# If you would like to submit a bug report, please visit: +# http://java.sun.com/webapps/bugreport/crash.jsp +# + +--------------- T H R E A D --------------- + +Current thread (0x0000000005ef6800): GCTaskThread [stack: 0x00000000449f0000,0x00000000489f0000] [id=1544] + +siginfo: ExceptionCode=0xc0000005, writing address 0x000000003f530afe + +Registers: +EAX=0x000000003f246898, EBX=0x000000003f246898, ECX=0x000000003f2468c8, EDX=0x0000000005fbea20 +ESP=0x00000000489ef8d8, EBP=0x0000000006a59f3b, ESI=0x00000000352cf5b8, EDI=0x0000000005fbea20 +EIP=0x00000000352cf9df, EFLAGS=0x0000000000010a17 + +Top of Stack: (sp=0x00000000489ef8d8) +0x00000000489ef8d8: 0000000078c39d54 0000000000000000 +0x00000000489ef8e8: 00000000352cf9d8 0000000005fbea20 +0x00000000489ef8f8: 0000000005ef0740 0000000005fbea48 +0x00000000489ef908: 0000000078c3a0ad 0000000000000000 +0x00000000489ef918: 0000000000000000 0000000005fbea20 +0x00000000489ef928: 000000003f246898 000000003ef18000 +0x00000000489ef938: 0000000000001000 0000000000000000 +0x00000000489ef948: 000007fefdb21203 0000000000000000 +0x00000000489ef958: 0000000005ef0500 0000000005fbea20 +0x00000000489ef968: 0000000005fbea20 000000000eb5182f +0x00000000489ef978: 0000000036595e00 0000000000003de4 +0x00000000489ef988: 0000000078c3b7b9 0000000000000048 +0x00000000489ef998: 000000000000003d 0000000000000001 +0x00000000489ef9a8: 000000003ef1cfc8 0000000000000000 +0x00000000489ef9b8: 0000000000000000 0000000000000000 +0x00000000489ef9c8: 000000003ef1cfc8 0000000000000000 + +Instructions: (pc=0x00000000352cf9df) +0x00000000352cf9cf: 00 a8 62 34 2c 00 00 00 00 05 00 00 00 00 00 00 +0x00000000352cf9df: 00 b0 66 a2 2e 00 00 00 00 5b 75 01 00 02 1f 03 + + +Stack: [0x00000000449f0000,0x00000000489f0000], sp=0x00000000489ef8d8, free space=65534k +Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) +C 0x00000000352cf9df + + +--------------- P R O C E S S --------------- + +Java Threads: ( => current thread ) + 0x0000000060f92800 JavaThread "Code Analyzer updating thread" [_thread_blocked, id=1356, stack(0x00000000624e0000,0x0000000062560000)] + 0x0000000060f91800 JavaThread "Code Analyzer updating thread" [_thread_blocked, id=2584, stack(0x0000000062010000,0x0000000062090000)] + 0x0000000060f93000 JavaThread "Code Analyzer updating thread" [_thread_blocked, id=3492, stack(0x0000000062130000,0x00000000621b0000)] + 0x0000000059309800 JavaThread "Foxtrot Multi Worker Thread Runner #1" daemon [_thread_blocked, id=4604, stack(0x00000000406a0000,0x0000000040720000)] + 0x0000000059308000 JavaThread "pool-4-thread-1" [_thread_blocked, id=5856, stack(0x0000000028620000,0x00000000286a0000)] + 0x000000005930c800 JavaThread "Active Reference Queue Daemon" daemon [_thread_blocked, id=4512, stack(0x0000000059ef0000,0x0000000059f70000)] + 0x000000005930c000 JavaThread "Timer-21" daemon [_thread_blocked, id=2512, stack(0x0000000028eb0000,0x0000000028f30000)] + 0x000000005930b000 JavaThread "Prefs Updater" daemon [_thread_blocked, id=3100, stack(0x00000000285a0000,0x0000000028620000)] + 0x0000000059307800 JavaThread "Thread-39" [_thread_blocked, id=1732, stack(0x0000000048a30000,0x0000000048ab0000)] + 0x0000000059306800 JavaThread "Timer-6" daemon [_thread_blocked, id=188, stack(0x0000000062220000,0x00000000622a0000)] + 0x0000000059305800 JavaThread "Explorer NavigationContext request queue" [_thread_blocked, id=2988, stack(0x00000000620a0000,0x0000000062120000)] + 0x0000000059304000 JavaThread "AddressBar directory emptiness poller" [_thread_blocked, id=5308, stack(0x0000000059d00000,0x0000000059d80000)] + 0x0000000059303000 JavaThread "Explorer Refresh Service 1569840413" [_thread_blocked, id=2040, stack(0x000000005c950000,0x000000005c9d0000)] + 0x0000000059301800 JavaThread "Timer-1" daemon [_thread_blocked, id=6092, stack(0x000000000f110000,0x000000000f190000)] + 0x0000000059301000 JavaThread "TimerQueue" daemon [_thread_blocked, id=5932, stack(0x000000000f1a0000,0x000000000f220000)] + 0x00000000592fe000 JavaThread "Thread-5" daemon [_thread_blocked, id=2428, stack(0x000000000f040000,0x000000000f0c0000)] + 0x0000000059300000 JavaThread "FelixPackageAdmin" daemon [_thread_blocked, id=5920, stack(0x0000000059fc0000,0x000000005a040000)] + 0x00000000592ff800 JavaThread "FelixStartLevel" daemon [_thread_blocked, id=4728, stack(0x0000000018fe0000,0x0000000019060000)] + 0x00000000592ff000 JavaThread "FelixDispatchQueue" daemon [_thread_blocked, id=1428, stack(0x0000000059da0000,0x0000000059e20000)] + 0x0000000058eea800 JavaThread "AWT-EventQueue-0" [_thread_blocked, id=4276, stack(0x0000000059c30000,0x0000000059cb0000)] + 0x0000000058d9b800 JavaThread "com.google.common.base.internal.Finalizer" daemon [_thread_blocked, id=5616, stack(0x00000000448e0000,0x0000000044960000)] + 0x0000000058c5c000 JavaThread "AWT-Windows" daemon [_thread_in_native, id=5636, stack(0x0000000008e90000,0x0000000008f10000)] + 0x0000000058c5b000 JavaThread "AWT-Shutdown" [_thread_blocked, id=5964, stack(0x0000000010e50000,0x0000000010ed0000)] + 0x000000000ec08800 JavaThread "Java2D Disposer" daemon [_thread_blocked, id=5108, stack(0x0000000008f10000,0x0000000008f90000)] + 0x000000000fe32000 JavaThread "Timer-0" [_thread_blocked, id=604, stack(0x0000000008d10000,0x0000000008d90000)] + 0x000000000fdaa800 JavaThread "EventMgr Dispatcher" daemon [_thread_in_native, id=2236, stack(0x0000000009260000,0x000000000d260000)] + 0x000000000ec60800 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=1300, stack(0x000000000ef10000,0x000000000ef90000)] + 0x000000000ec5e800 JavaThread "CompilerThread1" daemon [_thread_blocked, id=3504, stack(0x0000000050ae0000,0x0000000054ae0000)] + 0x000000000ec56800 JavaThread "CompilerThread0" daemon [_thread_blocked, id=5944, stack(0x000000004cae0000,0x0000000050ae0000)] + 0x000000000ec56000 JavaThread "Attach Listener" daemon [_thread_blocked, id=1124, stack(0x000000000da10000,0x000000000da90000)] + 0x000000000ebfd800 JavaThread "Finalizer" daemon [_thread_blocked, id=1712, stack(0x000000000ee10000,0x000000000ee90000)] + 0x000000000ebf5000 JavaThread "Reference Handler" daemon [_thread_blocked, id=3260, stack(0x000000000ee90000,0x000000000ef10000)] + 0x0000000005ffe800 JavaThread "main" [_thread_blocked, id=1268, stack(0x00000000000c0000,0x00000000040c0000)] + +Other Threads: + 0x000000000ebf1000 VMThread [stack: 0x0000000048ae0000,0x000000004cae0000] [id=5104] + 0x000000000ecad000 WatcherThread [stack: 0x0000000054ae0000,0x0000000058ae0000] [id=6048] + +=>0x0000000005ef6800 (exited) GCTaskThread [stack: 0x00000000449f0000,0x00000000489f0000] [id=1544] + +VM state:at safepoint (normal execution) + +VM Mutex/Monitor currently owned by a thread: ([mutex/lock_event]) +[0x0000000005eea660] Threads_lock - owner thread: 0x000000000ebf1000 +[0x0000000005eeab60] Heap_lock - owner thread: 0x0000000005ffe800 + +Heap + PSYoungGen total 25984K, used 25984K [0x000000003d590000, 0x000000003f2e0000, 0x0000000040690000) + eden space 24256K, 100% used [0x000000003d590000,0x000000003ed40000,0x000000003ed40000) + from space 1728K, 100% used [0x000000003f130000,0x000000003f2e0000,0x000000003f2e0000) + to space 2560K, 60% used [0x000000003ede0000,0x000000003ef60000,0x000000003f060000) + PSOldGen total 150528K, used 91202K [0x0000000034290000, 0x000000003d590000, 0x000000003d590000) + object space 150528K, 60% used [0x0000000034290000,0x0000000039ba09d0,0x000000003d590000) + PSPermGen total 123200K, used 73638K [0x000000002c290000, 0x0000000033ae0000, 0x0000000034290000) + object space 123200K, 59% used [0x000000002c290000,0x0000000030a79ae0,0x0000000033ae0000) + +Dynamic libraries: +0x000000013f710000 - 0x000000013f73d000 C:\Program Files\MATLAB\R2012b\bin\win64\MATLAB.exe +0x0000000077b00000 - 0x0000000077ca9000 C:\Windows\SYSTEM32\ntdll.dll +0x00000000779e0000 - 0x0000000077aff000 C:\Windows\system32\kernel32.dll +0x000007fefdb20000 - 0x000007fefdb8c000 C:\Windows\system32\KERNELBASE.dll +0x0000000074460000 - 0x000000007451f000 C:\Program Files\MATLAB\R2012b\bin\win64\libut.dll +0x00000000758a0000 - 0x000000007595c000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwi18n.dll +0x0000000180000000 - 0x000000018000b000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwresource_core.dll +0x000000005cfd0000 - 0x000000005d0a3000 C:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.6161_none_08e61857a83bc251\MSVCP90.dll +0x000000006e950000 - 0x000000006e9f3000 C:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.6161_none_08e61857a83bc251\MSVCR90.dll +0x000000007a170000 - 0x000000007a19c000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_filesystem-vc90-mt-1_44.dll +0x000000007a560000 - 0x000000007a569000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_system-vc90-mt-1_44.dll +0x000007feffd00000 - 0x000007feffddb000 C:\Windows\system32\ADVAPI32.dll +0x000007feffc60000 - 0x000007feffcff000 C:\Windows\system32\msvcrt.dll +0x000007fefe550000 - 0x000007fefe56f000 C:\Windows\SYSTEM32\sechost.dll +0x000007fefdc70000 - 0x000007fefdd9d000 C:\Windows\system32\RPCRT4.dll +0x000000007a010000 - 0x000000007a035000 C:\Program Files\MATLAB\R2012b\bin\win64\LIBEXPAT.dll +0x00000000626b0000 - 0x00000000628a1000 C:\Program Files\MATLAB\R2012b\bin\win64\icuin44.dll +0x000000005ce50000 - 0x000000005cfc1000 C:\Program Files\MATLAB\R2012b\bin\win64\icuuc44.dll +0x0000000010000000 - 0x0000000010e41000 C:\Program Files\MATLAB\R2012b\bin\win64\icudt44.dll +0x0000000073f70000 - 0x000000007411d000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwfl.dll +0x0000000004310000 - 0x00000000046c6000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwMATLAB_res.dll +0x000000007a3b0000 - 0x000000007a3c0000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_date_time-vc90-mt-1_44.dll +0x000000007a250000 - 0x000000007a263000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_signals-vc90-mt-1_44.dll +0x000000007a2d0000 - 0x000000007a2e2000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_thread-vc90-mt-1_44.dll +0x00000000046d0000 - 0x000000000478d000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_log-vc90-mt-1_44.dll +0x0000000077cd0000 - 0x0000000077cd7000 C:\Windows\system32\PSAPI.DLL +0x000007fefed00000 - 0x000007fefed4d000 C:\Windows\system32\WS2_32.dll +0x000007fefe540000 - 0x000007fefe548000 C:\Windows\system32\NSI.dll +0x00000000041b0000 - 0x00000000041f6000 C:\Program Files\MATLAB\R2012b\bin\win64\tbb.dll +0x000007fefe300000 - 0x000007fefe319000 C:\Windows\system32\imagehlp.dll +0x0000000072db0000 - 0x0000000072dc3000 C:\Program Files\MATLAB\R2012b\bin\win64\icuio44.dll +0x000007fef6840000 - 0x000007fef6965000 C:\Windows\system32\dbghelp.dll +0x00000000778e0000 - 0x00000000779da000 C:\Windows\system32\USER32.dll +0x000007feffbf0000 - 0x000007feffc57000 C:\Windows\system32\GDI32.dll +0x000007fefe320000 - 0x000007fefe32e000 C:\Windows\system32\LPK.dll +0x000007fefec30000 - 0x000007fefecf9000 C:\Windows\system32\USP10.dll +0x00000000047a0000 - 0x0000000004a7c000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwservices.dll +0x0000000075a20000 - 0x0000000075af3000 C:\Program Files\MATLAB\R2012b\bin\win64\libmx.dll +0x0000000004aa0000 - 0x0000000004ac9000 C:\Program Files\MATLAB\R2012b\bin\win64\tbbmalloc.dll +0x000000007a210000 - 0x000000007a228000 C:\Program Files\MATLAB\R2012b\bin\win64\zlib1.dll +0x0000000004af0000 - 0x0000000004b3d000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwregexp.dll +0x0000000004b50000 - 0x0000000004b73000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwmfl_scalar.dll +0x0000000075f10000 - 0x0000000075f60000 C:\Program Files\MATLAB\R2012b\bin\win64\mpath.dll +0x000000007b680000 - 0x000000007bc9a000 C:\Program Files\MATLAB\R2012b\bin\win64\mlutil.dll +0x00000000754d0000 - 0x0000000075551000 C:\Program Files\MATLAB\R2012b\bin\win64\xmlcore.dll +0x0000000004bc0000 - 0x0000000004e13000 C:\Program Files\MATLAB\R2012b\bin\win64\xerces-c_2_7.dll +0x0000000004e30000 - 0x0000000004e50000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwMATLAB_settings_res.dll +0x0000000004e60000 - 0x0000000004e70000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_iostreams-vc90-mt-1_44.dll +0x0000000004e80000 - 0x0000000004ec7000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_serialization-vc90-mt-1_44.dll +0x000007fefee60000 - 0x000007feffbe9000 C:\Windows\system32\SHELL32.dll +0x000007fefead0000 - 0x000007fefeb41000 C:\Windows\system32\SHLWAPI.dll +0x000007fefa150000 - 0x000007fefa1f0000 C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7601.18837_none_a4d981ff711297b6\COMCTL32.dll +0x000007fefe080000 - 0x000007fefe117000 C:\Windows\system32\COMDLG32.dll +0x000007fefb320000 - 0x000007fefb336000 C:\Windows\system32\NETAPI32.dll +0x000007fefb310000 - 0x000007fefb31c000 C:\Windows\system32\netutils.dll +0x000007fefd370000 - 0x000007fefd393000 C:\Windows\system32\srvcli.dll +0x000007fefb2f0000 - 0x000007fefb305000 C:\Windows\system32\wkscli.dll +0x000007fefe330000 - 0x000007fefe533000 C:\Windows\system32\ole32.dll +0x000007fefeb50000 - 0x000007fefec27000 C:\Windows\system32\OLEAUT32.dll +0x0000000074970000 - 0x0000000074a31000 C:\Program Files\MATLAB\R2012b\bin\win64\mcr.dll +0x0000000075000000 - 0x00000000753e9000 C:\Program Files\MATLAB\R2012b\bin\win64\iqm.dll +0x0000000074e80000 - 0x0000000074f38000 C:\Program Files\MATLAB\R2012b\bin\win64\m_dispatcher.dll +0x0000000074880000 - 0x000000007496d000 C:\Program Files\MATLAB\R2012b\bin\win64\boost_regex-vc90-mt-1_44.dll +0x000007fee8f40000 - 0x000007fee97b1000 C:\Program Files\MATLAB\R2012b\bin\win64\m_interpreter.dll +0x000000006e390000 - 0x000000006e3b7000 C:\Program Files\MATLAB\R2012b\bin\win64\libmex.dll +0x0000000062620000 - 0x00000000626a4000 C:\Program Files\MATLAB\R2012b\bin\win64\profiler.dll +0x0000000004f50000 - 0x00000000051ba000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwmathutil.dll +0x0000000079f40000 - 0x0000000079f6e000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwmathrng.dll +0x00000000051e0000 - 0x00000000051f2000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwmfl_rng.dll +0x0000000074c10000 - 0x0000000074cee000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwmathcore.dll +0x0000000076160000 - 0x00000000761ca000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwspmatrix.dll +0x0000000075ea0000 - 0x0000000075f02000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwcholmod.dll +0x000000007a460000 - 0x000000007a46d000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwamd.dll +0x000000007a4b0000 - 0x000000007a4bc000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwcolamd.dll +0x000000007a290000 - 0x000000007a2a9000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwblas.dll +0x000000007a310000 - 0x000000007a321000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwbinder.dll +0x000000007a4d0000 - 0x000000007a4dc000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwompwrapper.dll +0x0000000005290000 - 0x0000000005315000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwlapack.dll +0x00000000625f0000 - 0x0000000062611000 C:\Program Files\MATLAB\R2012b\bin\win64\m_pcodeio.dll +0x0000000079b10000 - 0x0000000079b77000 C:\Program Files\MATLAB\R2012b\bin\win64\m_ir.dll +0x000000005c2a0000 - 0x000000005c910000 C:\Program Files\MATLAB\R2012b\bin\win64\m_parser.dll +0x00000000625d0000 - 0x00000000625ea000 C:\Program Files\MATLAB\R2012b\bin\win64\ir_xfmr.dll +0x000007feea390000 - 0x000007feea626000 C:\Program Files\MATLAB\R2012b\bin\win64\mcos.dll +0x000000005ce30000 - 0x000000005ce41000 C:\Program Files\MATLAB\R2012b\bin\win64\mtok.dll +0x000000005cdf0000 - 0x000000005ce21000 C:\Program Files\MATLAB\R2012b\bin\win64\m_pcodegen.dll +0x0000000079fb0000 - 0x0000000079fe6000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwbridge.dll +0x000000005cd20000 - 0x000000005cde8000 C:\Program Files\MATLAB\R2012b\bin\win64\udd.dll +0x000000005cbc0000 - 0x000000005cd12000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwgui.dll +0x000000005cba0000 - 0x000000005cbb7000 C:\Program Files\MATLAB\R2012b\bin\win64\graphics_util.dll +0x000000005b840000 - 0x000000005c29f000 C:\Program Files\MATLAB\R2012b\bin\win64\hg.dll +0x00000000053f0000 - 0x0000000005458000 C:\Program Files\MATLAB\R2012b\bin\win64\libmat.dll +0x0000000005470000 - 0x0000000005684000 C:\Program Files\MATLAB\R2012b\bin\win64\hdf5dll.dll +0x0000000075710000 - 0x00000000757de000 C:\Program Files\MATLAB\R2012b\bin\win64\jmi.dll +0x00000000056b0000 - 0x00000000056bd000 C:\Program Files\MATLAB\R2012b\bin\win64\nativejava_services.dll +0x000000005cb50000 - 0x000000005cb96000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwhardcopy.dll +0x000000005cae0000 - 0x000000005cb43000 C:\Program Files\MATLAB\R2012b\bin\win64\libuij.dll +0x000000005b5d0000 - 0x000000005b834000 C:\Program Files\MATLAB\R2012b\bin\win64\hgdatatypes.dll +0x000000005b4b0000 - 0x000000005b5cf000 C:\Program Files\MATLAB\R2012b\bin\win64\hgutils.dll +0x000000005b3f0000 - 0x000000005b4b0000 C:\Program Files\MATLAB\R2012b\bin\win64\udd_mi.dll +0x0000000005720000 - 0x000000000575b000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwgbtutils.dll +0x0000000005770000 - 0x000000000578b000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwgbt.dll +0x00000000057a0000 - 0x0000000005a71000 C:\Program Files\MATLAB\R2012b\bin\win64\uiw.dll +0x0000000073df0000 - 0x0000000073dff000 C:\Program Files\MATLAB\R2012b\bin\win64\uinone.dll +0x0000000005aa0000 - 0x0000000005ac9000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwnativefiledialogs.dll +0x0000000005ae0000 - 0x0000000005ae8000 C:\Program Files\MATLAB\R2012b\bin\win64\libmwplatform_res.dll +0x000007fef9180000 - 0x000007fef9198000 C:\Windows\system32\MPR.dll +0x000000005af00000 - 0x000000005b3e4000 C:\Windows\WinSxS\amd64_microsoft.vc90.mfc_1fc8b3b9a1e18e3b_9.0.30729.6161_none_044aad0bab1eb146\mfc90.dll +0x000007fefa250000 - 0x000007fefa257000 C:\Windows\system32\MSIMG32.dll +0x000007fefa0d0000 - 0x000007fefa141000 C:\Windows\system32\WINSPOOL.DRV +0x000000005cab0000 - 0x000000005cad2000 C:\Program Files\MATLAB\R2012b\bin\win64\mwoles05.DLL +0x000000005ae80000 - 0x000000005aefd000 C:\Program Files\MATLAB\R2012b\bin\win64\comcli.dll +0x000000005ca80000 - 0x000000005caaf000 C:\Windows\WinSxS\amd64_microsoft.vc90.atl_1fc8b3b9a1e18e3b_9.0.30729.6161_none_0a1fd3a3a768b895\ATL90.DLL +0x0000000072da0000 - 0x0000000072dac000 C:\Program Files\MATLAB\R2012b\bin\win64\mlautoregister.dll +0x000007fefd6f0000 - 0x000007fefd747000 C:\Windows\system32\apphelp.dll +0x000007fef51c0000 - 0x000007fef5211000 C:\Windows\AppPatch\AppPatch64\AcGenral.DLL +0x000007fefd6c0000 - 0x000007fefd6e5000 C:\Windows\system32\SspiCli.dll +0x00000000700e0000 - 0x00000000700e3000 C:\Windows\system32\sfc.dll +0x000007fef5290000 - 0x000007fef52a0000 C:\Windows\system32\sfc_os.DLL +0x000007fefdbf0000 - 0x000007fefdc0e000 C:\Windows\system32\USERENV.dll +0x000007fefd8c0000 - 0x000007fefd8cf000 C:\Windows\system32\profapi.dll +0x000007fefbb70000 - 0x000007fefbb88000 C:\Windows\system32\dwmapi.dll +0x000007feffde0000 - 0x000007feffe0e000 C:\Windows\system32\IMM32.DLL +0x000007fefed50000 - 0x000007fefee59000 C:\Windows\system32\MSCTF.dll +0x000007fefbfd0000 - 0x000007fefc026000 C:\Windows\system32\UxTheme.dll +0x000000006e380000 - 0x000000006e38d000 C:\Windows\WinSxS\amd64_microsoft.vc90.mfcloc_1fc8b3b9a1e18e3b_9.0.30729.6161_none_01c9581e60cbee58\MFC90ENU.DLL +0x0000000005b80000 - 0x0000000005b92000 C:\Program Files\Logitech\SetPoint\GameHook.dll +0x0000000005bc0000 - 0x0000000005bd1000 C:\Program Files\Logitech\SetPoint\lgscroll.dll +0x000000006f600000 - 0x000000006f6c9000 C:\Windows\WinSxS\amd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6229_none_88dcc0bf2fb1b808\MSVCR80.dll + +VM Arguments: +jvm_args: -Xss512k -XX:PermSize=32m -Xms64m -XX:NewRatio=3 -XX:MaxPermSize=128m -Xmx196m -XX:MaxDirectMemorySize=2147400000 -Dsun.java2d.noddraw=true -Dsun.awt.nopixfmt=true -Xshare:off -Xrs -Dsun.awt.disableMixing=true -Djava.library.path=C:\Program Files\MATLAB\R2012b\bin\win64;C:\Program Files\MATLAB\R2012b\sys\jxbrowser\win64\lib vfprintf abort +java_command: +Launcher Type: generic + +Environment Variables: +PATH=C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Qucs\bin;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\MATLAB\R2012b\runtime\win64;C:\Program Files\MATLAB\R2012b\bin;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.0\;C:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\mingw32\bin;c:\iverilog\bin;c:\iverilog\gtkwave\bin;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files\Microsoft Windows Performance Toolkit\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\Calibre2\;C:\Program Files (x86)\Brackets\command;C:\Program Files (x86)\Skype\Phone\;C:\Program Files (x86)\Atmel\Flip 3.4.7\bin;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\ +USERNAME=Esposch +OS=Windows_NT +PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 15 Stepping 11, GenuineIntel + + + +--------------- S Y S T E M --------------- + +OS: Windows 7 Build 7601 Service Pack 1 + +CPU:total 2 (2 cores per cpu, 1 threads per core) family 6 model 15 stepping 11, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3 + +Memory: 4k page, physical 8387696k(3509800k free), swap 16773552k(11408064k free) + +vm_info: Java HotSpot(TM) 64-Bit Server VM (14.3-b01) for windows-amd64 JRE (1.6.0_17-b04), built on Oct 11 2009 00:46:08 by "java_re" with MS VC++ 8.0 + +time: Fri Jan 29 23:06:01 2016 +elapsed time: 2766 seconds + diff --git a/Old Matlab Interface/includes/libusbk.h b/Old Matlab Interface/includes/libusbk.h new file mode 100644 index 00000000..bac5f81b --- /dev/null +++ b/Old Matlab Interface/includes/libusbk.h @@ -0,0 +1,4000 @@ +/*! \file libusbk.h +* \brief functions for usb device communication. +* +* \note +* This is the \b main libusbK USB user include file. +*/ + +#ifndef _LIBUSBK_H__ +#define _LIBUSBK_H__ + +#include "lusbk_shared.h" + +/////////////////////////////////////////////////////////////////////// +// L I B U S B K PUBLIC STRUCTS, DEFINES, AND ENUMS ////////////////// +/////////////////////////////////////////////////////////////////////// + +#ifndef _LIBUSBK_LIBK_TYPES + +/*! \addtogroup libk +* @{ +*/ + +#define _in +#define _inopt +#define _out +#define _outopt +#define _ref +#define _refopt + +//! UsbK base function pointer, See \ref LibK_GetProcAddress. +typedef INT_PTR (FAR WINAPI* KPROC)(); + +//! Indicates that a function is an exported API call. +#if defined(DYNAMIC_DLL) +#define KUSB_EXP +#else +#define KUSB_EXP +#endif + +//! Indicates the calling convention. This is always WINAPI (stdcall) by default. +#if !defined(KUSB_API) +#define KUSB_API WINAPI +#endif + +#pragma warning(disable:4201) + +#if _MSC_VER >= 1200 +#pragma warning(push) +#endif +#pragma warning (disable:4201) +#pragma warning(disable:4214) // named type definition in parentheses + +//! User defined handle context space, see \ref LibK_GetContext. +typedef INT_PTR KLIB_USER_CONTEXT; + +//! KUSB control setup packet. +/*! +* This union structure is identical in size to a \ref WINUSB_SETUP_PACKET, +* but provides additional field accessors. (see \ref libusbk.h for structure details) +*/ +typedef union _KUSB_SETUP_PACKET +{ + UCHAR Bytes[8]; + USHORT Words[4]; + struct + { + //! Request value + struct + { + UCHAR Recipient: 2; + UCHAR Reserved: 3; + UCHAR Type: 2; + UCHAR Dir: 1; + } BmRequest; + + //! Request type value + UCHAR Request; + + //! wValue + USHORT Value; + + //! wIndex + USHORT Index; + + //! wLength ushort value + USHORT Length; + }; + struct + { + struct + { + UCHAR b0: 1; + UCHAR b1: 1; + UCHAR b2: 1; + UCHAR b3: 1; + UCHAR b4: 1; + UCHAR b5: 1; + UCHAR b6: 1; + UCHAR b7: 1; + } BmRequestBits; + + struct + { + UCHAR b0: 1; + UCHAR b1: 1; + UCHAR b2: 1; + UCHAR b3: 1; + UCHAR b4: 1; + UCHAR b5: 1; + UCHAR b6: 1; + UCHAR b7: 1; + } RequestBits; + + UCHAR ValueLo; + UCHAR ValueHi; + UCHAR IndexLo; + UCHAR IndexHi; + UCHAR LengthLo; + UCHAR LengthHi; + }; +} KUSB_SETUP_PACKET; +// setup packet is eight bytes -- defined by spec +C_ASSERT(sizeof(KUSB_SETUP_PACKET) == 8); + +#if _MSC_VER >= 1200 +#pragma warning(pop) +#endif + + +//! Base handle type for all library handles, See \ref KLIB_HANDLE_TYPE. +typedef void* KLIB_HANDLE; + +//! Opaque UsbK handle, see \ref UsbK_Init. +typedef KLIB_HANDLE KUSB_HANDLE; + +//! Opaque LstK handle, see \ref LstK_Init. +typedef KLIB_HANDLE KLST_HANDLE; + +//! Opaque HotK handle, see \ref HotK_Init. +typedef KLIB_HANDLE KHOT_HANDLE; + +//! Opaque OvlK handle, see \ref OvlK_Acquire. +typedef KLIB_HANDLE KOVL_HANDLE; + + +//! Opaque OvlPoolK handle, see \ref OvlK_Init. +typedef KLIB_HANDLE KOVL_POOL_HANDLE; + +//! Opaque StmK handle, see \ref StmK_Init. +typedef KLIB_HANDLE KSTM_HANDLE; + +//! Handle type enumeration. +typedef enum _KLIB_HANDLE_TYPE +{ + //! Hot plug handle. \ref KHOT_HANDLE + KLIB_HANDLE_TYPE_HOTK, + + //! USB handle. \ref KUSB_HANDLE + KLIB_HANDLE_TYPE_USBK, + + //! Shared USB handle. \ref KUSB_HANDLE + KLIB_HANDLE_TYPE_USBSHAREDK, + + //! Device list handle. \ref KLST_HANDLE + KLIB_HANDLE_TYPE_LSTK, + + //! Device info handle. \ref KLST_DEVINFO_HANDLE + KLIB_HANDLE_TYPE_LSTINFOK, + + //! Overlapped handle. \ref KOVL_HANDLE + KLIB_HANDLE_TYPE_OVLK, + + //! Overlapped pool handle. \ref KOVL_POOL_HANDLE + KLIB_HANDLE_TYPE_OVLPOOLK, + + //! Pipe stream handle. \ref KSTM_HANDLE + KLIB_HANDLE_TYPE_STMK, + + //! Max handle type count. + KLIB_HANDLE_TYPE_COUNT +} KLIB_HANDLE_TYPE; + +//! Function typedef for \ref LibK_SetCleanupCallback. +typedef INT KUSB_API KLIB_HANDLE_CLEANUP_CB (_in KLIB_HANDLE Handle, _in KLIB_HANDLE_TYPE HandleType, _in KLIB_USER_CONTEXT UserContext); + +//! libusbK verson information structure. +typedef struct _KLIB_VERSION +{ + //! Major version number. + INT Major; + + //! Minor version number. + INT Minor; + + //! Micro version number. + INT Micro; + + //! Nano version number. + INT Nano; +} KLIB_VERSION; +//! Pointer to a \copybrief KLIB_VERSION +typedef KLIB_VERSION* PKLIB_VERSION; + +/*! @} */ +#endif + +#ifndef _LIBUSBK_ISOK_TYPES +/*! \addtogroup isok +* @{ +*/ + + +//! Callback function typedef for \ref IsoK_EnumPackets +typedef BOOL KUSB_API KISO_ENUM_PACKETS_CB (_in UINT PacketIndex, _in PKISO_PACKET IsoPacket, _in PVOID UserState); + +/*! @} */ +#endif + +#ifndef _LIBUSBK_LSTK_TYPES + +/*! \addtogroup lstk +* @{ +*/ + +//! Allocated length for all strings in a \ref KLST_DEVINFO structure. +#define KLST_STRING_MAX_LEN 256 + +//! Device list sync flags. +/*! +* These sync flags are also use by the hot plug module to indicate device +* arrival/removal notifications: +* - \b DeviceArrival = KLST_SYNC_FLAG_ADDED +* - \b DeviceRemoval = KLST_SYNC_FLAG_REMOVED +*/ +typedef enum _KLST_SYNC_FLAG +{ + //! Cleared/invalid state. + KLST_SYNC_FLAG_NONE = 0L, + + //! Unchanged state, + KLST_SYNC_FLAG_UNCHANGED = 0x0001, + + //! Added (Arrival) state, + KLST_SYNC_FLAG_ADDED = 0x0002, + + //! Removed (Unplugged) state, + KLST_SYNC_FLAG_REMOVED = 0x0004, + + //! Connect changed state. + KLST_SYNC_FLAG_CONNECT_CHANGE = 0x0008, + + //! All states. + KLST_SYNC_FLAG_MASK = 0x000F, +} KLST_SYNC_FLAG; + +//! Common usb device information structure +typedef struct _KLST_DEV_COMMON_INFO +{ + //! VendorID parsed from \ref KLST_DEVINFO::DeviceID + INT Vid; + + //! ProductID parsed from \ref KLST_DEVINFO::DeviceID + INT Pid; + + //! Composite interface number parsed from \ref KLST_DEVINFO::DeviceID. Set to \b -1 for devices that do not have the composite parent driver. + INT MI; + + // An ID that uniquely identifies a USB device. + CHAR InstanceID[KLST_STRING_MAX_LEN]; + +} KLST_DEV_COMMON_INFO; +//! Pointer to a \c KLST_DEV_COMMON_INFO structure. +typedef KLST_DEV_COMMON_INFO* PKLST_DEV_COMMON_INFO; + +//! Semi-opaque device information structure of a device list. +/*! +* +* \attention This structure is semi-opaque. +* +*/ +typedef struct _KLST_DEVINFO +{ + //! Common usb device information + KLST_DEV_COMMON_INFO Common; + + //! Driver id this device element is using + INT DriverID; + + //! Device interface GUID + CHAR DeviceInterfaceGUID[KLST_STRING_MAX_LEN]; + + //! Device instance ID. + /*! + * A Device instance ID has the following format: + * [enumerator]\[enumerator-specific-device-ID]\[instance-specific-ID] + * - [enumerator] + * - For USB device, the enumerator is always \c USB + * - [enumerator-specific-device-ID] + * - Contains the vendor and product id (VID_xxxx&PID_xxxx) + * - If present, contains the usbccgp (windows composite device layer) interface number (MI_xx) + * - [instance-specific-ID] + * - If the device is composite, contains a unique interface ID generated by Windows. + * - If the device is not composite and has a serial number, contains the devices serial number. + * - If the device does not have a serial number, contains a unique ID generated by Windows. + */ + CHAR DeviceID[KLST_STRING_MAX_LEN]; + + //! Class GUID. + CHAR ClassGUID[KLST_STRING_MAX_LEN]; + + //! Manufacturer name as specified in the INF file. + CHAR Mfg[KLST_STRING_MAX_LEN]; + + //! Device description as specified in the INF file. + CHAR DeviceDesc[KLST_STRING_MAX_LEN]; + + //! Driver service name. + CHAR Service[KLST_STRING_MAX_LEN]; + + //! Unique identifier. + CHAR SymbolicLink[KLST_STRING_MAX_LEN]; + + //! physical device filename used with the Windows \c CreateFile() + CHAR DevicePath[KLST_STRING_MAX_LEN]; + + //! libusb-win32 filter index id. + INT LUsb0FilterIndex; + + //! Indicates the devices connection state. + BOOL Connected; + + //! Synchronization flags. (internal use only) + KLST_SYNC_FLAG SyncFlags; + + INT BusNumber; + + INT DeviceAddress; + + //! If the the device is serialized, represents the string value of \ref USB_DEVICE_DESCRIPTOR::iSerialNumber. For Devices without a \b iSerialNumber, represents the unique \b InstanceID assigned by \b Windows. + CHAR SerialNumber[KLST_STRING_MAX_LEN]; + +} KLST_DEVINFO; +//! Pointer to a \ref KLST_DEVINFO structure. (semi-opaque) +typedef KLST_DEVINFO* KLST_DEVINFO_HANDLE; + +//! Device list initialization flags. +typedef enum _KLST_FLAG +{ + //! No flags (or 0) + KLST_FLAG_NONE = 0L, + + //! Enable listings for the raw device interface GUID \b only. {A5DCBF10-6530-11D2-901F-00C04FB951ED} + KLST_FLAG_INCLUDE_RAWGUID = 0x0001, + + //! List all libusbK devices including those not currently connected. + KLST_FLAG_INCLUDE_DISCONNECT = 0x0002, + +} KLST_FLAG; + +//! Device list/hot-plug pattern match structure. +/*! +* \fixedstruct{1024} +* +* These ansi char strings are used to specify which devices should be included in a device list. +* All strings file pattern match strings allowing asterisk or question mark chars as wildcards. +* +*/ +typedef struct _KLST_PATTERN_MATCH +{ + //! Pattern match a device instance id. + CHAR DeviceID[KLST_STRING_MAX_LEN]; + + //! Pattern match a device interface guid. + CHAR DeviceInterfaceGUID[KLST_STRING_MAX_LEN]; + + //! Pattern match a symbolic link. + CHAR ClassGUID[KLST_STRING_MAX_LEN]; + + //! fixed structure padding. + UCHAR z_F_i_x_e_d[1024 - KLST_STRING_MAX_LEN * 3]; + +} KLST_PATTERN_MATCH; +C_ASSERT(sizeof(KLST_PATTERN_MATCH) == 1024); + +//! Pointer to a \ref KLST_PATTERN_MATCH structure. +typedef KLST_PATTERN_MATCH* PKLST_PATTERN_MATCH; + +//! Device list enumeration function callback typedef. +/*! +* +* \param DeviceList +* The device list \c DeviceInfo belongs to +* +* \param DeviceInfo +* Device information +* +* \param Context +* User context that was passed into \ref LstK_Enumerate +* +* Use this typedef as a prototype for an enumeration function with \ref LstK_Enumerate. +* +*/ +typedef BOOL KUSB_API KLST_ENUM_DEVINFO_CB ( + _in KLST_HANDLE DeviceList, + _in KLST_DEVINFO_HANDLE DeviceInfo, + _in PVOID Context); + +/*! @} */ + +#endif + +#ifndef __USB_H__ + +#include + +/*! \addtogroup libk +* @{ +*/ + +//! Maximum value that can be added to the current start frame. +#define USBD_ISO_START_FRAME_RANGE 1024 + + +//! bmRequest.Dir +typedef enum _BMREQUEST_DIR +{ + BMREQUEST_DIR_HOST_TO_DEVICE = 0, + BMREQUEST_DIR_DEVICE_TO_HOST = 1, +} BMREQUEST_DIR; + +//! bmRequest.Type +typedef enum _BMREQUEST_TYPE +{ + //! Standard request. See \ref USB_REQUEST_ENUM + BMREQUEST_TYPE_STANDARD = 0, + + //! Class-specific request. + BMREQUEST_TYPE_CLASS = 1, + + //! Vendor-specific request + BMREQUEST_TYPE_VENDOR = 2, +} BMREQUEST_TYPE; + +//! bmRequest.Recipient +typedef enum _BMREQUEST_RECIPIENT +{ + //! Request is for a device. + BMREQUEST_RECIPIENT_DEVICE = 0, + + //! Request is for an interface of a device. + BMREQUEST_RECIPIENT_INTERFACE = 1, + + //! Request is for an endpoint of a device. + BMREQUEST_RECIPIENT_ENDPOINT = 2, + + //! Request is for a vendor-specific purpose. + BMREQUEST_RECIPIENT_OTHER = 3, +} BMREQUEST_RECIPIENT; + +//! Maximum length (in bytes) of a usb string. USB strings are always stored in wide-char format. +#define MAXIMUM_USB_STRING_LENGTH 255 + +//! Values for the bits returned by the \ref USB_REQUEST_GET_STATUS request. +typedef enum _USB_GETSTATUS +{ + //! Device is self powered + USB_GETSTATUS_SELF_POWERED = 0x01, + + //! Device can wake the system from a low power/sleeping state. + USB_GETSTATUS_REMOTE_WAKEUP_ENABLED = 0x02 +} USB_GETSTATUS; + +//! Standard USB descriptor types. For more information, see section 9-5 of the USB 3.0 specifications. +typedef enum _USB_DESCRIPTOR_TYPE +{ + //! Device descriptor type. + USB_DESCRIPTOR_TYPE_DEVICE = 0x01, + + //! Configuration descriptor type. + USB_DESCRIPTOR_TYPE_CONFIGURATION = 0x02, + + //! String descriptor type. + USB_DESCRIPTOR_TYPE_STRING = 0x03, + + //! Interface descriptor type. + USB_DESCRIPTOR_TYPE_INTERFACE = 0x04, + + //! Endpoint descriptor type. + USB_DESCRIPTOR_TYPE_ENDPOINT = 0x05, + + //! Device qualifier descriptor type. + USB_DESCRIPTOR_TYPE_DEVICE_QUALIFIER = 0x06, + + //! Config power descriptor type. + USB_DESCRIPTOR_TYPE_CONFIG_POWER = 0x07, + + //! Interface power descriptor type. + USB_DESCRIPTOR_TYPE_INTERFACE_POWER = 0x08, + + //! Interface association descriptor type. + USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION = 0x0B, +} USB_DESCRIPTOR_TYPE; + +//! Makes \c wValue for a \ref USB_REQUEST_GET_DESCRIPTOR or \ref USB_REQUEST_SET_DESCRIPTOR request. +#define USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX(d, i) \ + ((USHORT)((USHORT)d<<8 | i)) + +//! Endpoint type mask for the \c bmAttributes field of a \ref USB_ENDPOINT_DESCRIPTOR +#define USB_ENDPOINT_TYPE_MASK 0x03 + +//! Indicates a control endpoint +#define USB_ENDPOINT_TYPE_CONTROL 0x00 + +//! Indicates an isochronous endpoint +#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01 + +//! Indicates a bulk endpoint +#define USB_ENDPOINT_TYPE_BULK 0x02 + +//! Indicates an interrupt endpoint +#define USB_ENDPOINT_TYPE_INTERRUPT 0x03 + +//! Config power mask for the \c bmAttributes field of a \ref USB_CONFIGURATION_DESCRIPTOR +#define USB_CONFIG_POWERED_MASK 0xc0 + +//! Values used in the \c bmAttributes field of a \ref USB_CONFIGURATION_DESCRIPTOR +enum USB_CONFIG_BM_ATTRIBUTE_ENUM +{ + //! The device is powered by it's host. + USB_CONFIG_BUS_POWERED = 0x80, + + //! The device has an external power source. + USB_CONFIG_SELF_POWERED = 0x40, + + //! The device is capable of waking the the host from a low power/sleeping state. + USB_CONFIG_REMOTE_WAKEUP = 0x20, +}; + +//! Endpoint direction mask for the \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR +#define USB_ENDPOINT_DIRECTION_MASK 0x80 + +//! Endpoint address mask for the \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR +#define USB_ENDPOINT_ADDRESS_MASK 0x0F + +//! Tests the \c bEndpointAddress direction bit. TRUE if the endpoint address is an OUT endpoint. (HostToDevice, PC Write) +/*! +* \param addr \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR +*/ +#define USB_ENDPOINT_DIRECTION_OUT(addr) (!((addr) & USB_ENDPOINT_DIRECTION_MASK)) + +//! Tests the \c bEndpointAddress direction bit. TRUE if the endpoint address is an IN endpoint. (DeviceToHost, PC Read) +/*! +* \param addr \c bEndpointAddress field of a \ref USB_ENDPOINT_DESCRIPTOR +*/ +#define USB_ENDPOINT_DIRECTION_IN(addr) ((addr) & USB_ENDPOINT_DIRECTION_MASK) + +//! USB defined request codes +/* +* see Chapter 9 of the USB 2.0 specification for +* more information. +* +* These are the correct values based on the USB 2.0 specification. +*/ +enum USB_REQUEST_ENUM +{ + //! Request status of the specific recipient + USB_REQUEST_GET_STATUS = 0x00, + + //! Clear or disable a specific feature + USB_REQUEST_CLEAR_FEATURE = 0x01, + + //! Set or enable a specific feature + USB_REQUEST_SET_FEATURE = 0x03, + + //! Set device address for all future accesses + USB_REQUEST_SET_ADDRESS = 0x05, + + //! Get the specified descriptor + USB_REQUEST_GET_DESCRIPTOR = 0x06, + + //! Update existing descriptors or add new descriptors + USB_REQUEST_SET_DESCRIPTOR = 0x07, + + //! Get the current device configuration value + USB_REQUEST_GET_CONFIGURATION = 0x08, + + //! Set device configuration + USB_REQUEST_SET_CONFIGURATION = 0x09, + + //! Return the selected alternate setting for the specified interface + USB_REQUEST_GET_INTERFACE = 0x0A, + + //! Select an alternate interface for the specified interface + USB_REQUEST_SET_INTERFACE = 0x0B, + + //! Set then report an endpoint's synchronization frame + USB_REQUEST_SYNC_FRAME = 0x0C, +}; + +//! USB defined class codes +/*! +* see http://www.usb.org/developers/defined_class for more information. +* +*/ +enum USB_DEVICE_CLASS_ENUM +{ + //! Reserved class + USB_DEVICE_CLASS_RESERVED = 0x00, + + //! Audio class + USB_DEVICE_CLASS_AUDIO = 0x01, + + //! Communications class + USB_DEVICE_CLASS_COMMUNICATIONS = 0x02, + + //! Human Interface Device class + USB_DEVICE_CLASS_HUMAN_INTERFACE = 0x03, + + //! Imaging class + USB_DEVICE_CLASS_IMAGING = 0x06, + + //! Printer class + USB_DEVICE_CLASS_PRINTER = 0x07, + + //! Mass storage class + USB_DEVICE_CLASS_STORAGE = 0x08, + + //! Hub class + USB_DEVICE_CLASS_HUB = 0x09, + + //! vendor-specific class + USB_DEVICE_CLASS_VENDOR_SPECIFIC = 0xFF, +}; + +//! A structure representing the standard USB device descriptor. +/*! +* This descriptor is documented in section 9.6.1 of the USB 2.0 specification. +* All multiple-byte fields are represented in host-endian format. +*/ +typedef struct _USB_DEVICE_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! USB specification release number in binary-coded decimal. + /*! + * A value of 0x0200 indicates USB 2.0, 0x0110 indicates USB 1.1, etc. + */ + USHORT bcdUSB; + + //! USB-IF class code for the device + UCHAR bDeviceClass; + + //! USB-IF subclass code for the device + UCHAR bDeviceSubClass; + + //! USB-IF protocol code for the device + UCHAR bDeviceProtocol; + + //! Maximum packet size for control endpoint 0 + UCHAR bMaxPacketSize0; + + //! USB-IF vendor ID + USHORT idVendor; + + //! USB-IF product ID + USHORT idProduct; + + //! Device release number in binary-coded decimal + USHORT bcdDevice; + + //! Index of string descriptor describing manufacturer + UCHAR iManufacturer; + + //! Index of string descriptor describing product + UCHAR iProduct; + + //! Index of string descriptor containing device serial number + UCHAR iSerialNumber; + + //! Number of possible configurations + UCHAR bNumConfigurations; + +} USB_DEVICE_DESCRIPTOR; +//! pointer to a \c USB_DEVICE_DESCRIPTOR +typedef USB_DEVICE_DESCRIPTOR* PUSB_DEVICE_DESCRIPTOR; + +//! A structure representing the standard USB endpoint descriptor. +/*! +* This descriptor is documented in section 9.6.3 of the USB 2.0 specification. +* All multiple-byte fields are represented in host-endian format. +*/ +typedef struct _USB_ENDPOINT_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! The address of the endpoint described by this descriptor. + /*! + * - Bits 0:3 are the endpoint number + * - Bits 4:6 are reserved + * - Bit 7 indicates direction + */ + UCHAR bEndpointAddress; + + //! Attributes which apply to the endpoint when it is configured using the bConfigurationValue. + /*! + * - Bits 0:1 determine the transfer type. + * - Bits 2:3 are only used for isochronous endpoints and refer to sync type. + * - Bits 4:5 are also only used for isochronous endpoints and refer to usage type. + * - Bits 6:7 are reserved. + */ + UCHAR bmAttributes; + + //! Maximum packet size this endpoint is capable of sending/receiving. + USHORT wMaxPacketSize; + + //! Interval for polling endpoint for data transfers. + UCHAR bInterval; + +} USB_ENDPOINT_DESCRIPTOR; +//! pointer to a \c USB_ENDPOINT_DESCRIPTOR +typedef USB_ENDPOINT_DESCRIPTOR* PUSB_ENDPOINT_DESCRIPTOR; + +//! A structure representing the standard USB configuration descriptor. +/* +* +* This descriptor is documented in section 9.6.3 of the USB 2.0 specification. +* All multiple-byte fields are represented in host-endian format. +* +*/ +typedef struct _USB_CONFIGURATION_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! Total length of data returned for this configuration + USHORT wTotalLength; + + //! Number of interfaces supported by this configuration + UCHAR bNumInterfaces; + + //! Identifier value for this configuration + UCHAR bConfigurationValue; + + //! Index of string descriptor describing this configuration + UCHAR iConfiguration; + + //! Configuration characteristics + UCHAR bmAttributes; + + //! Maximum power consumption of the USB device from this bus in this configuration when the device is fully operation. + /*! + * Expressed in units of 2 mA. + */ + UCHAR MaxPower; +} USB_CONFIGURATION_DESCRIPTOR; +//! pointer to a \c USB_CONFIGURATION_DESCRIPTOR +typedef USB_CONFIGURATION_DESCRIPTOR* PUSB_CONFIGURATION_DESCRIPTOR; + +//! A structure representing the standard USB interface descriptor. +/*! +* This descriptor is documented in section 9.6.5 of the USB 2.0 specification. +* All multiple-byte fields are represented in host-endian format. +*/ +typedef struct _USB_INTERFACE_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! Number of this interface + UCHAR bInterfaceNumber; + + //! Value used to select this alternate setting for this interface + UCHAR bAlternateSetting; + + //! Number of endpoints used by this interface (excluding the control endpoint) + UCHAR bNumEndpoints; + + //! USB-IF class code for this interface + UCHAR bInterfaceClass; + + //! USB-IF subclass code for this interface + UCHAR bInterfaceSubClass; + + //! USB-IF protocol code for this interface + UCHAR bInterfaceProtocol; + + //! Index of string descriptor describing this interface + UCHAR iInterface; + +} USB_INTERFACE_DESCRIPTOR; +//! pointer to a \c USB_INTERFACE_DESCRIPTOR +typedef USB_INTERFACE_DESCRIPTOR* PUSB_INTERFACE_DESCRIPTOR; + +//! A structure representing the standard USB string descriptor. +/*! +* This descriptor is documented in section 9.6.5 of the USB 2.0 specification. +* All multiple-byte fields are represented in host-endian format. +*/ +typedef struct _USB_STRING_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! Content of the string + WCHAR bString[1]; + +} USB_STRING_DESCRIPTOR; +//! pointer to a \c USB_STRING_DESCRIPTOR +typedef USB_STRING_DESCRIPTOR* PUSB_STRING_DESCRIPTOR; + +//! A structure representing the common USB descriptor. +typedef struct _USB_COMMON_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + +} USB_COMMON_DESCRIPTOR; +//! pointer to a \c USB_COMMON_DESCRIPTOR +typedef USB_COMMON_DESCRIPTOR* PUSB_COMMON_DESCRIPTOR; + +#if _MSC_VER >= 1200 +#pragma warning(push) +#endif +#pragma warning (disable:4201) +#pragma warning(disable:4214) // named type definition in parentheses + +//! Allows hardware manufacturers to define groupings of interfaces. +/*! +* +* The ECN specifies a USB descriptor, called the Interface Association +* Descriptor (IAD). +* +* The Universal Serial Bus Specification, revision 2.0, does not support +* grouping more than one interface of a composite device within a single +* function. However, the USB Device Working Group (DWG) created USB device +* classes that allow for functions with multiple interfaces, and the USB +* Implementor's Forum issued an Engineering Change Notification (ECN) that +* defines a mechanism for grouping interfaces. +* +*/ +typedef struct _USB_INTERFACE_ASSOCIATION_DESCRIPTOR +{ + //! Size of this descriptor (in bytes) + UCHAR bLength; + + //! Descriptor type + UCHAR bDescriptorType; + + //! First interface number of the set of interfaces that follow this descriptor + UCHAR bFirstInterface; + + //! The Number of interfaces follow this descriptor that are considered "associated" + UCHAR bInterfaceCount; + + //! \c bInterfaceClass used for this associated interfaces + UCHAR bFunctionClass; + + //! \c bInterfaceSubClass used for the associated interfaces + UCHAR bFunctionSubClass; + + //! \c bInterfaceProtocol used for the associated interfaces + UCHAR bFunctionProtocol; + + //! Index of string descriptor describing the associated interfaces + UCHAR iFunction; + +} USB_INTERFACE_ASSOCIATION_DESCRIPTOR; +//! pointer to a \c USB_INTERFACE_ASSOCIATION_DESCRIPTOR +typedef USB_INTERFACE_ASSOCIATION_DESCRIPTOR* PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR; + +#if _MSC_VER >= 1200 +#pragma warning(pop) +#endif + +/*! @} */ + +#include +#endif // __USB_H__ + +#ifndef _LIBUSBK_LIBK_TYPES + +/*! \addtogroup libk +* @{ +*/ + +//! Usb handle specific properties that can be retrieved with \ref UsbK_GetProperty. +typedef enum _KUSB_PROPERTY +{ + //! Get the internal device file handle used for operations such as GetOverlappedResult or DeviceIoControl. + KUSB_PROPERTY_DEVICE_FILE_HANDLE, + + KUSB_PROPERTY_COUNT + +} KUSB_PROPERTY; + +//! Supported driver id enumeration. +typedef enum _KUSB_DRVID +{ + //! libusbK.sys driver ID + KUSB_DRVID_LIBUSBK, + + //! libusb0.sys driver ID + KUSB_DRVID_LIBUSB0, + + //! WinUSB.sys driver ID + KUSB_DRVID_WINUSB, + + //! libusb0.sys filter driver ID + KUSB_DRVID_LIBUSB0_FILTER, + + //! Supported driver count + KUSB_DRVID_COUNT + +} KUSB_DRVID; + +//! Supported function id enumeration. +typedef enum _KUSB_FNID +{ + //! \ref UsbK_Init dynamic driver function id. + KUSB_FNID_Init, + + //! \ref UsbK_Free dynamic driver function id. + KUSB_FNID_Free, + + //! \ref UsbK_ClaimInterface dynamic driver function id. + KUSB_FNID_ClaimInterface, + + //! \ref UsbK_ReleaseInterface dynamic driver function id. + KUSB_FNID_ReleaseInterface, + + //! \ref UsbK_SetAltInterface dynamic driver function id. + KUSB_FNID_SetAltInterface, + + //! \ref UsbK_GetAltInterface dynamic driver function id. + KUSB_FNID_GetAltInterface, + + //! \ref UsbK_GetDescriptor dynamic driver function id. + KUSB_FNID_GetDescriptor, + + //! \ref UsbK_ControlTransfer dynamic driver function id. + KUSB_FNID_ControlTransfer, + + //! \ref UsbK_SetPowerPolicy dynamic driver function id. + KUSB_FNID_SetPowerPolicy, + + //! \ref UsbK_GetPowerPolicy dynamic driver function id. + KUSB_FNID_GetPowerPolicy, + + //! \ref UsbK_SetConfiguration dynamic driver function id. + KUSB_FNID_SetConfiguration, + + //! \ref UsbK_GetConfiguration dynamic driver function id. + KUSB_FNID_GetConfiguration, + + //! \ref UsbK_ResetDevice dynamic driver function id. + KUSB_FNID_ResetDevice, + + //! \ref UsbK_Initialize dynamic driver function id. + KUSB_FNID_Initialize, + + //! \ref UsbK_SelectInterface dynamic driver function id. + KUSB_FNID_SelectInterface, + + //! \ref UsbK_GetAssociatedInterface dynamic driver function id. + KUSB_FNID_GetAssociatedInterface, + + //! \ref UsbK_Clone dynamic driver function id. + KUSB_FNID_Clone, + + //! \ref UsbK_QueryInterfaceSettings dynamic driver function id. + KUSB_FNID_QueryInterfaceSettings, + + //! \ref UsbK_QueryDeviceInformation dynamic driver function id. + KUSB_FNID_QueryDeviceInformation, + + //! \ref UsbK_SetCurrentAlternateSetting dynamic driver function id. + KUSB_FNID_SetCurrentAlternateSetting, + + //! \ref UsbK_GetCurrentAlternateSetting dynamic driver function id. + KUSB_FNID_GetCurrentAlternateSetting, + + //! \ref UsbK_QueryPipe dynamic driver function id. + KUSB_FNID_QueryPipe, + + //! \ref UsbK_SetPipePolicy dynamic driver function id. + KUSB_FNID_SetPipePolicy, + + //! \ref UsbK_GetPipePolicy dynamic driver function id. + KUSB_FNID_GetPipePolicy, + + //! \ref UsbK_ReadPipe dynamic driver function id. + KUSB_FNID_ReadPipe, + + //! \ref UsbK_WritePipe dynamic driver function id. + KUSB_FNID_WritePipe, + + //! \ref UsbK_ResetPipe dynamic driver function id. + KUSB_FNID_ResetPipe, + + //! \ref UsbK_AbortPipe dynamic driver function id. + KUSB_FNID_AbortPipe, + + //! \ref UsbK_FlushPipe dynamic driver function id. + KUSB_FNID_FlushPipe, + + //! \ref UsbK_IsoReadPipe dynamic driver function id. + KUSB_FNID_IsoReadPipe, + + //! \ref UsbK_IsoWritePipe dynamic driver function id. + KUSB_FNID_IsoWritePipe, + + //! \ref UsbK_GetCurrentFrameNumber dynamic driver function id. + KUSB_FNID_GetCurrentFrameNumber, + + //! \ref UsbK_GetOverlappedResult dynamic driver function id. + KUSB_FNID_GetOverlappedResult, + + //! \ref UsbK_GetProperty dynamic driver function id. + KUSB_FNID_GetProperty, + + + //! Supported function count + KUSB_FNID_COUNT, + +} KUSB_FNID; + +typedef BOOL KUSB_API KUSB_Init ( + _out KUSB_HANDLE* InterfaceHandle, + _in KLST_DEVINFO_HANDLE DevInfo); + +typedef BOOL KUSB_API KUSB_Free ( + _in KUSB_HANDLE InterfaceHandle); + +typedef BOOL KUSB_API KUSB_ClaimInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API KUSB_ReleaseInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API KUSB_SetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _in UCHAR AltSettingNumber); + +typedef BOOL KUSB_API KUSB_GetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _out PUCHAR AltSettingNumber); + +typedef BOOL KUSB_API KUSB_GetDescriptor ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR DescriptorType, + _in UCHAR Index, + _in USHORT LanguageID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred); + +typedef BOOL KUSB_API KUSB_ControlTransfer ( + _in KUSB_HANDLE InterfaceHandle, + _in WINUSB_SETUP_PACKET SetupPacket, + _refopt PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API KUSB_SetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +typedef BOOL KUSB_API KUSB_GetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +typedef BOOL KUSB_API KUSB_SetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR ConfigurationNumber); + +typedef BOOL KUSB_API KUSB_GetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR ConfigurationNumber); + +typedef BOOL KUSB_API KUSB_ResetDevice ( + _in KUSB_HANDLE InterfaceHandle); + +typedef BOOL KUSB_API KUSB_Initialize ( + _in HANDLE DeviceHandle, + _out KUSB_HANDLE* InterfaceHandle); + +typedef BOOL KUSB_API KUSB_SelectInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API KUSB_GetAssociatedInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AssociatedInterfaceIndex, + _out KUSB_HANDLE* AssociatedInterfaceHandle); + +typedef BOOL KUSB_API KUSB_Clone ( + _in KUSB_HANDLE InterfaceHandle, + _out KUSB_HANDLE* DstInterfaceHandle); + +typedef BOOL KUSB_API KUSB_QueryInterfaceSettings ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingIndex, + _out PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor); + +typedef BOOL KUSB_API KUSB_QueryDeviceInformation ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT InformationType, + _ref PUINT BufferLength, + _ref PVOID Buffer); + +typedef BOOL KUSB_API KUSB_SetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber); + +typedef BOOL KUSB_API KUSB_GetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR AltSettingNumber); + +typedef BOOL KUSB_API KUSB_QueryPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber, + _in UCHAR PipeIndex, + _out PWINUSB_PIPE_INFORMATION PipeInformation); + +typedef BOOL KUSB_API KUSB_SetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +typedef BOOL KUSB_API KUSB_GetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +typedef BOOL KUSB_API KUSB_ReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API KUSB_WritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API KUSB_ResetPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API KUSB_AbortPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API KUSB_FlushPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API KUSB_IsoReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +typedef BOOL KUSB_API KUSB_IsoWritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +typedef BOOL KUSB_API KUSB_GetCurrentFrameNumber ( + _in KUSB_HANDLE InterfaceHandle, + _out PUINT FrameNumber); + +typedef BOOL KUSB_API KUSB_GetOverlappedResult ( + _in KUSB_HANDLE InterfaceHandle, + _in LPOVERLAPPED Overlapped, + _out PUINT lpNumberOfBytesTransferred, + _in BOOL bWait); + +typedef BOOL KUSB_API KUSB_GetProperty ( + _in KUSB_HANDLE InterfaceHandle, + _in KUSB_PROPERTY PropertyType, + _ref PUINT PropertySize, + _out PVOID Value); + + + +//! USB core driver API information structure. +/*! +* This structure is part of \ref KUSB_DRIVER_API and contains +* driver and user specific information. +* +*/ +typedef struct _KUSB_DRIVER_API_INFO +{ + //! \readonly Driver id of the driver api. + INT DriverID; + + //! \readonly Number of valid functions contained in the driver API. + INT FunctionCount; + +} KUSB_DRIVER_API_INFO; + +//! Driver API function set structure. +/* +* Contains the driver specific USB core function pointer set. +* +* \note +* This structure has a fixed 512 byte structure size. +*/ +typedef struct _KUSB_DRIVER_API +{ + //! Driver API information. + KUSB_DRIVER_API_INFO Info; + + /*! \fn BOOL KUSB_API Init (_out KUSB_HANDLE* InterfaceHandle, _in KLST_DEVINFO_HANDLE DevInfo) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_Init + */ + KUSB_Init* Init; + + /*! \fn BOOL KUSB_API Free (_in KUSB_HANDLE InterfaceHandle) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_Free + */ + KUSB_Free* Free; + + /*! \fn BOOL KUSB_API ClaimInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR NumberOrIndex, _in BOOL IsIndex) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ClaimInterface + */ + KUSB_ClaimInterface* ClaimInterface; + + /*! \fn BOOL KUSB_API ReleaseInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR NumberOrIndex, _in BOOL IsIndex) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ReleaseInterface + */ + KUSB_ReleaseInterface* ReleaseInterface; + + /*! \fn BOOL KUSB_API SetAltInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR NumberOrIndex, _in BOOL IsIndex, _in UCHAR AltSettingNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SetAltInterface + */ + KUSB_SetAltInterface* SetAltInterface; + + /*! \fn BOOL KUSB_API GetAltInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR NumberOrIndex, _in BOOL IsIndex, _out PUCHAR AltSettingNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetAltInterface + */ + KUSB_GetAltInterface* GetAltInterface; + + /*! \fn BOOL KUSB_API GetDescriptor (_in KUSB_HANDLE InterfaceHandle, _in UCHAR DescriptorType, _in UCHAR Index, _in USHORT LanguageID, _out PUCHAR Buffer, _in UINT BufferLength, _outopt PUINT LengthTransferred) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetDescriptor + */ + KUSB_GetDescriptor* GetDescriptor; + + /*! \fn BOOL KUSB_API ControlTransfer (_in KUSB_HANDLE InterfaceHandle, _in WINUSB_SETUP_PACKET SetupPacket, _refopt PUCHAR Buffer, _in UINT BufferLength, _outopt PUINT LengthTransferred, _inopt LPOVERLAPPED Overlapped) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ControlTransfer + */ + KUSB_ControlTransfer* ControlTransfer; + + /*! \fn BOOL KUSB_API SetPowerPolicy (_in KUSB_HANDLE InterfaceHandle, _in UINT PolicyType, _in UINT ValueLength, _in PVOID Value) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SetPowerPolicy + */ + KUSB_SetPowerPolicy* SetPowerPolicy; + + /*! \fn BOOL KUSB_API GetPowerPolicy (_in KUSB_HANDLE InterfaceHandle, _in UINT PolicyType, _ref PUINT ValueLength, _out PVOID Value) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetPowerPolicy + */ + KUSB_GetPowerPolicy* GetPowerPolicy; + + /*! \fn BOOL KUSB_API SetConfiguration (_in KUSB_HANDLE InterfaceHandle, _in UCHAR ConfigurationNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SetConfiguration + */ + KUSB_SetConfiguration* SetConfiguration; + + /*! \fn BOOL KUSB_API GetConfiguration (_in KUSB_HANDLE InterfaceHandle, _out PUCHAR ConfigurationNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetConfiguration + */ + KUSB_GetConfiguration* GetConfiguration; + + /*! \fn BOOL KUSB_API ResetDevice (_in KUSB_HANDLE InterfaceHandle) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ResetDevice + */ + KUSB_ResetDevice* ResetDevice; + + /*! \fn BOOL KUSB_API Initialize (_in HANDLE DeviceHandle, _out KUSB_HANDLE* InterfaceHandle) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_Initialize + */ + KUSB_Initialize* Initialize; + + /*! \fn BOOL KUSB_API SelectInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR NumberOrIndex, _in BOOL IsIndex) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SelectInterface + */ + KUSB_SelectInterface* SelectInterface; + + /*! \fn BOOL KUSB_API GetAssociatedInterface (_in KUSB_HANDLE InterfaceHandle, _in UCHAR AssociatedInterfaceIndex, _out KUSB_HANDLE* AssociatedInterfaceHandle) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetAssociatedInterface + */ + KUSB_GetAssociatedInterface* GetAssociatedInterface; + + /*! \fn BOOL KUSB_API Clone (_in KUSB_HANDLE InterfaceHandle, _out KUSB_HANDLE* DstInterfaceHandle) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_Clone + */ + KUSB_Clone* Clone; + + /*! \fn BOOL KUSB_API QueryInterfaceSettings (_in KUSB_HANDLE InterfaceHandle, _in UCHAR AltSettingIndex, _out PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_QueryInterfaceSettings + */ + KUSB_QueryInterfaceSettings* QueryInterfaceSettings; + + /*! \fn BOOL KUSB_API QueryDeviceInformation (_in KUSB_HANDLE InterfaceHandle, _in UINT InformationType, _ref PUINT BufferLength, _ref PVOID Buffer) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_QueryDeviceInformation + */ + KUSB_QueryDeviceInformation* QueryDeviceInformation; + + /*! \fn BOOL KUSB_API SetCurrentAlternateSetting (_in KUSB_HANDLE InterfaceHandle, _in UCHAR AltSettingNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SetCurrentAlternateSetting + */ + KUSB_SetCurrentAlternateSetting* SetCurrentAlternateSetting; + + /*! \fn BOOL KUSB_API GetCurrentAlternateSetting (_in KUSB_HANDLE InterfaceHandle, _out PUCHAR AltSettingNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetCurrentAlternateSetting + */ + KUSB_GetCurrentAlternateSetting* GetCurrentAlternateSetting; + + /*! \fn BOOL KUSB_API QueryPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR AltSettingNumber, _in UCHAR PipeIndex, _out PWINUSB_PIPE_INFORMATION PipeInformation) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_QueryPipe + */ + KUSB_QueryPipe* QueryPipe; + + /*! \fn BOOL KUSB_API SetPipePolicy (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _in UINT PolicyType, _in UINT ValueLength, _in PVOID Value) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_SetPipePolicy + */ + KUSB_SetPipePolicy* SetPipePolicy; + + /*! \fn BOOL KUSB_API GetPipePolicy (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _in UINT PolicyType, _ref PUINT ValueLength, _out PVOID Value) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetPipePolicy + */ + KUSB_GetPipePolicy* GetPipePolicy; + + /*! \fn BOOL KUSB_API ReadPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _out PUCHAR Buffer, _in UINT BufferLength, _outopt PUINT LengthTransferred, _inopt LPOVERLAPPED Overlapped) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ReadPipe + */ + KUSB_ReadPipe* ReadPipe; + + /*! \fn BOOL KUSB_API WritePipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _in PUCHAR Buffer, _in UINT BufferLength, _outopt PUINT LengthTransferred, _inopt LPOVERLAPPED Overlapped) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_WritePipe + */ + KUSB_WritePipe* WritePipe; + + /*! \fn BOOL KUSB_API ResetPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_ResetPipe + */ + KUSB_ResetPipe* ResetPipe; + + /*! \fn BOOL KUSB_API AbortPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_AbortPipe + */ + KUSB_AbortPipe* AbortPipe; + + /*! \fn BOOL KUSB_API FlushPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_FlushPipe + */ + KUSB_FlushPipe* FlushPipe; + + /*! \fn BOOL KUSB_API IsoReadPipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _out PUCHAR Buffer, _in UINT BufferLength, _in LPOVERLAPPED Overlapped, _refopt PKISO_CONTEXT IsoContext) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_IsoReadPipe + */ + KUSB_IsoReadPipe* IsoReadPipe; + + /*! \fn BOOL KUSB_API IsoWritePipe (_in KUSB_HANDLE InterfaceHandle, _in UCHAR PipeID, _in PUCHAR Buffer, _in UINT BufferLength, _in LPOVERLAPPED Overlapped, _refopt PKISO_CONTEXT IsoContext) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_IsoWritePipe + */ + KUSB_IsoWritePipe* IsoWritePipe; + + /*! \fn BOOL KUSB_API GetCurrentFrameNumber (_in KUSB_HANDLE InterfaceHandle, _out PUINT FrameNumber) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetCurrentFrameNumber + */ + KUSB_GetCurrentFrameNumber* GetCurrentFrameNumber; + + /*! \fn BOOL KUSB_API GetOverlappedResult (_in KUSB_HANDLE InterfaceHandle, _in LPOVERLAPPED Overlapped, _out PUINT lpNumberOfBytesTransferred, _in BOOL bWait) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetOverlappedResult + */ + KUSB_GetOverlappedResult* GetOverlappedResult; + + /*! \fn BOOL KUSB_API GetProperty (_in KUSB_HANDLE InterfaceHandle, _in KUSB_PROPERTY PropertyType, _ref PUINT PropertySize, _out PVOID Value) + * \memberof KUSB_DRIVER_API + * \copydoc UsbK_GetProperty + */ + KUSB_GetProperty* GetProperty; + + //! fixed structure padding. + UCHAR z_F_i_x_e_d[512 - sizeof(KUSB_DRIVER_API_INFO) - sizeof(UINT_PTR) * KUSB_FNID_COUNT]; + +} KUSB_DRIVER_API; +typedef KUSB_DRIVER_API* PKUSB_DRIVER_API; +C_ASSERT(sizeof(KUSB_DRIVER_API) == 512); +/**@}*/ +#endif + +#ifndef _LIBUSBK_HOTK_TYPES + +/*! \addtogroup hotk +* @{ +*/ + +//! Hot plug config flags. +typedef enum _KHOT_FLAG +{ + //! No flags (or 0) + KHOT_FLAG_NONE, + + //! Notify all devices which match upon a succuessful call to \ref HotK_Init. + KHOT_FLAG_PLUG_ALL_ON_INIT = 0x0001, + + //! Allow other \ref KHOT_HANDLE instances to consume this match. + KHOT_FLAG_PASS_DUPE_INSTANCE = 0x0002, + + //! If a \c UserHwnd is specified, use \c PostMessage instead of \c SendMessage. + KHOT_FLAG_POST_USER_MESSAGE = 0x0004, +} KHOT_FLAG; + +//! Hot plug event function definition. +typedef VOID KUSB_API KHOT_PLUG_CB( + _in KHOT_HANDLE HotHandle, + _in KLST_DEVINFO_HANDLE DeviceInfo, + _in KLST_SYNC_FLAG PlugType); + +//! Power broadcast event function definition. +typedef VOID KUSB_API KHOT_POWER_BROADCAST_CB( + _in KHOT_HANDLE HotHandle, + _in KLST_DEVINFO_HANDLE DeviceInfo, + _in UINT PbtEvent); + +//! Hot plug parameter structure. +/*! +* \fixedstruct{2048} +* +* This structure is intially passed as a parameter to \ref HotK_Init. +* +*/ +typedef struct _KHOT_PARAMS +{ + //! Hot plug event window handle to send/post messages when notifications occur. + HWND UserHwnd; + + //! WM_USER message start offset used when sending/posting messages, See details. + /*! + * \attention The \ref hotk will send UserMessage+1 for arrival notifications and UserMessage+0 for removal notifications. + * + * - WPARAM = \ref KHOT_HANDLE + * - LPARAM = \ref KLST_DEVINFO_HANDLE + */ + UINT UserMessage; + + //! Additional init/config parameters + KHOT_FLAG Flags; + + //! File pattern matches for restricting notifcations to a single/group or all supported usb devices. + KLST_PATTERN_MATCH PatternMatch; + + //! Hot plug event callback function invoked when notifications occur. + /*! \fn VOID KUSB_API OnHotPlug (_in KHOT_HANDLE HotHandle, _in KLST_DEVINFO_HANDLE DeviceInfo, _in KLST_SYNC_FLAG PlugType) + * \memberof KHOT_PARAMS + */ + KHOT_PLUG_CB* OnHotPlug; + + //! \b WM_POWERBROADCAST event callback function invoked when a power-management event has occurred. + /*! \fn VOID KUSB_API OnPowerBroadcast (_in KHOT_HANDLE HotHandle, _in KLST_DEVINFO_HANDLE DeviceInfo, _in UINT PbtEvent) + * \memberof KHOT_PARAMS + */ + KHOT_POWER_BROADCAST_CB* OnPowerBroadcast; + + //! fixed structure padding. + UCHAR z_F_i_x_e_d[2048 - sizeof(KLST_PATTERN_MATCH) - sizeof(UINT_PTR) * 3 - sizeof(UINT) * 2]; + +} KHOT_PARAMS; +C_ASSERT(sizeof(KHOT_PARAMS) == 2048); + +//! Pointer to a \ref KHOT_PARAMS structure. +typedef KHOT_PARAMS* PKHOT_PARAMS; + +/**@}*/ + +#endif + +#ifndef _LIBUSBK_OVLK_TYPES + +/*! \addtogroup ovlk +* @{ +*/ + +//! \c WaitFlags used by \ref OvlK_Wait. +/*! +* +*/ +typedef enum _KOVL_WAIT_FLAG +{ + //! Do not perform any additional actions upon exiting \ref OvlK_Wait. + KOVL_WAIT_FLAG_NONE = 0L, + + //! If the i/o operation completes successfully, release the OverlappedK back to it's pool. + KOVL_WAIT_FLAG_RELEASE_ON_SUCCESS = 0x0001, + + //! If the i/o operation fails, release the OverlappedK back to it's pool. + KOVL_WAIT_FLAG_RELEASE_ON_FAIL = 0x0002, + + //! If the i/o operation fails or completes successfully, release the OverlappedK back to its pool. Perform no actions if it times-out. + KOVL_WAIT_FLAG_RELEASE_ON_SUCCESS_FAIL = 0x0003, + + //! If the i/o operation times-out cancel it, but do not release the OverlappedK back to its pool. + KOVL_WAIT_FLAG_CANCEL_ON_TIMEOUT = 0x0004, + + //! If the i/o operation times-out, cancel it and release the OverlappedK back to its pool. + KOVL_WAIT_FLAG_RELEASE_ON_TIMEOUT = 0x000C, + + //! Always release the OverlappedK back to its pool. If the operation timed-out, cancel it before releasing back to its pool. + KOVL_WAIT_FLAG_RELEASE_ALWAYS = 0x000F, + + //! Uses alterable wait functions. See http://msdn.microsoft.com/en-us/library/windows/desktop/ms687036%28v=vs.85%29.aspx + KOVL_WAIT_FLAG_ALERTABLE = 0x0010, + +} KOVL_WAIT_FLAG; + +//! \c Overlapped pool config flags. +/*! +* \attention Currently not used. +*/ +typedef enum _KOVL_POOL_FLAG +{ + KOVL_POOL_FLAG_NONE = 0L, +} KOVL_POOL_FLAG; + +/**@}*/ + +#endif + +#ifndef _LIBUSBK_STMK_TYPES + +/*! \addtogroup stmk +* @{ +*/ +//! Stream config flags. +/*! +* \attention Currently not used. +*/ +typedef enum _KSTM_FLAG +{ + //! None + KSTM_FLAG_NONE = 0L, + KSTM_FLAG_NO_PARTIAL_XFERS = 0x00100000, + KSTM_FLAG_USE_TIMEOUT = 0x80000000, + KSTM_FLAG_TIMEOUT_MASK = 0x0001FFFF +} KSTM_FLAG; + +//! Stream config flags. +/*! +* \attention Currently not used. +*/ +typedef enum _KSTM_COMPLETE_RESULT +{ + //! Valid + KSTM_COMPLETE_RESULT_VALID = 0L, + //! Invalid + KSTM_COMPLETE_RESULT_INVALID, +} KSTM_COMPLETE_RESULT; + +//! Stream transfer context structure. +/*! +* This structure is passed into the stream callback functions. +* The stream transfer context list is allocated upon a successful call to \ref StmK_Init. There is one +* transfer context for each transfer. (0 to \c MaxPendingTransfers). +* +*/ +typedef struct _KSTM_XFER_CONTEXT +{ + + //! Internal stream buffer. + PUCHAR Buffer; + + //! Size of internal stream buffer. + INT BufferSize; + + //! Number of bytes to write or number of bytes read. + INT TransferLength; + + //! User defined state. + PVOID UserState; + +} KSTM_XFER_CONTEXT; +//! Pointer to a \ref KSTM_XFER_CONTEXT structure. +typedef KSTM_XFER_CONTEXT* PKSTM_XFER_CONTEXT; + +//! Stream information structure. +/*! +* This structure is passed into the stream callback functions. +* The stream context is allocated upon a successful call to \ref StmK_Init. There is only one +* stream context per stream. +* +*/ +typedef struct _KSTM_INFO +{ + //! \ref KUSB_HANDLE this stream uses. + KUSB_HANDLE UsbHandle; + + //! This parameter corresponds to the bEndpointAddress field in the endpoint descriptor. + UCHAR PipeID; + + //! Maximum transfer read/write request allowed pending. + INT MaxPendingTransfers; + + //! Maximum transfer sage size. + INT MaxTransferSize; + + //! Maximum number of I/O request allowed pending. + INT MaxPendingIO; + + //! Populated with the endpoint descriptor for the specified \c PipeID. + USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; + + //! Populated with the driver api for the specified \c UsbHandle. + KUSB_DRIVER_API DriverAPI; + + //! Populated with the device file handle for the specified \c UsbHandle. + HANDLE DeviceHandle; + + //! Stream handle. + KSTM_HANDLE StreamHandle; + + //! Stream info user defined state. + PVOID UserState; + +} KSTM_INFO; +//! Pointer to a \ref KSTM_INFO structure. +typedef KSTM_INFO* PKSTM_INFO; + +//! Function definition for an optional user-defined callback; executed when a transfer error occurs. +/*! \fn INT KUSB_API KSTM_ERROR_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in INT ErrorCode) +* \memberof KSTM_CALLBACK +*/ +typedef INT KUSB_API KSTM_ERROR_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in INT ErrorCode); + +//! Function definition for an optional user-defined callback; executed to submit a transfer. +/*! \fn INT KUSB_API KSTM_SUBMIT_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in LPOVERLAPPED Overlapped) +* \memberof KSTM_CALLBACK +*/ +typedef INT KUSB_API KSTM_SUBMIT_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in LPOVERLAPPED Overlapped); + +//! Function definition for an optional user-defined callback; executed for each transfer context when the stream is started with \ref StmK_Start. +/*! \fn INT KUSB_API KSTM_STARTED_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex) +* \memberof KSTM_CALLBACK +*/ +typedef INT KUSB_API KSTM_STARTED_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex); + +//! Function definition for an optional user-defined callback; executed for each transfer context when the stream is stopped with \ref StmK_Stop. +/*! \fn INT KUSB_API KSTM_STOPPED_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex) +* \memberof KSTM_CALLBACK +*/ +typedef INT KUSB_API KSTM_STOPPED_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex); + +//! Function definition for an optional user-defined callback; executed when a valid transfer completes. +/*! \fn INT KUSB_API KSTM_COMPLETE_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in INT ErrorCode) +* \memberof KSTM_CALLBACK +*/ +typedef INT KUSB_API KSTM_COMPLETE_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in INT ErrorCode); + +//! Function definition for an optional user-defined callback; executed immediately after a transfer completes. +/*! \fn KSTM_COMPLETE_RESULT KUSB_API KSTM_BEFORE_COMPLETE_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _ref PINT ErrorCode) +* \memberof KSTM_CALLBACK +* +* This callback function allows the user to accept or reject the transfer: +* - IN (Read, DeviceToHost) endpoints. +* - KSTM_COMPLETE_RESULT_VALID +* Continue normal processing; add the transfer to the internal complete list and make it available to \ref StmK_Read. +* - KSTM_COMPLETE_RESULT_INVALID +* Ignore this transfer. +* - OUT (Write, HostToDevice) endpoints. +* - KSTM_COMPLETE_RESULT_VALID +* Continue normal processing; add the transfer to the internal complete list and make it available subsequent \ref StmK_Write requests. +* - KSTM_COMPLETE_RESULT_INVALID +* Return this transfer to the internal queued list for automatic resubmission to the device. +* +*/ +typedef KSTM_COMPLETE_RESULT KUSB_API KSTM_BEFORE_COMPLETE_CB(_in PKSTM_INFO StreamInfo, _in PKSTM_XFER_CONTEXT XferContext, _in INT XferContextIndex, _in PINT ErrorCode); + +//! Stream callback structure. +/*! +* \fixedstruct{64} +* +* These optional callback functions are executed from the streams internal thread at various stages of operation. +* +*/ +typedef struct _KSTM_CALLBACK +{ + //! Executed when a transfer error occurs. + KSTM_ERROR_CB* Error; + + //! Executed to submit a transfer. + KSTM_SUBMIT_CB* Submit; + + //! Executed when a valid transfer completes. + KSTM_COMPLETE_CB* Complete; + + //! Executed for every transfer context when the stream is started with \ref StmK_Start. + KSTM_STARTED_CB* Started; + + //! Executed for every transfer context when the stream is stopped with \ref StmK_Stop. + KSTM_STOPPED_CB* Stopped; + + //! Executed immediately after a transfer completes. + KSTM_BEFORE_COMPLETE_CB* BeforeComplete; + + //! fixed structure padding. + UCHAR z_F_i_x_e_d[64 - sizeof(UINT_PTR) * 6]; + +} KSTM_CALLBACK; +//! Pointer to a \ref KSTM_CALLBACK structure. +typedef KSTM_CALLBACK* PKSTM_CALLBACK; +C_ASSERT(sizeof(KSTM_CALLBACK) == 64); + +/**@}*/ + +#endif +/////////////////////////////////////////////////////////////////////// +// L I B U S B K PUBLIC FUNCTIONS //////////////////////////////////// +/////////////////////////////////////////////////////////////////////// + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _LIBUSBK_LIBK_FUNCTIONS + /*! \addtogroup libk + * @{ + */ + +//! Gets the internal user context for the specified \ref KLIB_HANDLE. + /*! + * + * \param[out] Version + * Receives the libusbK library verson information. + * + * \returns NONE + */ + KUSB_EXP VOID KUSB_API LibK_GetVersion(_out PKLIB_VERSION Version); + +//! Gets the internal user context for the specified \ref KLIB_HANDLE. + /*! + * + * \param[in] Handle + * The handle containg the context to retrieve. + * + * \param[in] HandleType + * Handle type of \c Handle. + * + * \returns + * - on success, The user context value. + * - On failure, returns NULL and sets last error to \c ERROR_INVALID_HANDLE. + * + */ + KUSB_EXP KLIB_USER_CONTEXT KUSB_API LibK_GetContext( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType); + +//! Sets internal user context for the specified \ref KLIB_HANDLE. + /*! + * + * \param[in] Handle + * The handle containg the context to set. + * + * \param[in] HandleType + * Handle type of \c Handle. + * + * \param[in] ContextValue + * Value to assign to the handle user context space. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_SetContext( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue); + +//! Assigns a cleanup callback function to a \ref KLIB_HANDLE. + /*! + * + * \param[in] Handle + * The handle containg the cleanup callback function to set. + * + * \param[in] HandleType + * Handle type of \c Handle. + * + * \param[in] CleanupCB + * User supplied callback function to execute when the handles internal reference count reaches 0. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_SetCleanupCallback( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_HANDLE_CLEANUP_CB* CleanupCB); + +//! Initialize a driver API set. + /*! + * + * \param[out] DriverAPI + * A driver API structure to populate. + * + * \param[in] DriverID + * The driver id of the API set to retrieve. See \ref KUSB_DRVID + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_LoadDriverAPI( + _out PKUSB_DRIVER_API DriverAPI, + _in INT DriverID); + +//! Copies the driver API set out of a \ref KUSB_HANDLE + /*! + * + * \param[out] DriverAPI + * A driver API structure to populate. + * + * \param[in] UsbHandle + * Handle containing the desired driver API. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_CopyDriverAPI( + _out PKUSB_DRIVER_API DriverAPI, + _in KUSB_HANDLE UsbHandle); + +//! Initialize a driver API function. + /*! + * \param[out] ProcAddress + * Reference to a function pointer that will receive the API function pointer. + * + * \param[in] DriverID + * The driver id of the API to use. See \ref KUSB_DRVID + * + * \param[in] FunctionID + * The function id. See \ref KUSB_FNID + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_GetProcAddress( + _out KPROC* ProcAddress, + _in INT DriverID, + _in INT FunctionID); + +//! Sets the default user context for the specified \ref KLIB_HANDLE_TYPE. + /*! + * + * \param[in] HandleType + * The handle type which will be assigned the default ContextValue. + * + * \param[in] ContextValue + * Value assigned to the default user context for the specified \ref KLIB_HANDLE_TYPE. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_SetDefaultContext( + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue); + +//! Gets the default user context for the specified \ref KLIB_HANDLE_TYPE. + /*! + * + * \param[in] HandleType + * Handle type used to retrieve the default user context. + * + * \returns + * - on success, The default user context value. + * - On failure, returns NULL and sets last error to \c ERROR_INVALID_HANDLE. + * + */ + KUSB_EXP KLIB_USER_CONTEXT KUSB_API LibK_GetDefaultContext( + _in KLIB_HANDLE_TYPE HandleType); + +//! Initializes the global libusbK process context. + /*! + * + * If this function is not called at startup, libusbK initializes the global libusbK process context automatically. + * + * \param[in] Heap + * A handle to the memory heap libusbK will use for dynamic memory allocation. + * \note The process context itself is always allocated from the proccess heap. + * \note If \b Heap is \b NULL, dynamic memory is allocated from the proccess heap. + * + * \param[in] Reserved + * Reserved for future use. Must set to \b NULL. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LibK_Context_Init( + _inopt HANDLE Heap, + _in PVOID Reserved); + +//! Frees the global libusbK process context. + /*! + * + * If this function is not called on exit, libusbK frees the global libusbK process context automatically when it terminates. + * + * \returns NONE. + * + */ + KUSB_EXP VOID KUSB_API LibK_Context_Free(VOID); + + + /**@}*/ +#endif + +#ifndef _LIBUSBK_USBK_FUNCTIONS + /*! \addtogroup usbk + * @{ + */ + +//! Creates/opens a libusbK interface handle from the device list. This is a preferred method. + /*! + * + * \param[out] InterfaceHandle + * Receives a handle configured to the first (default) interface on the device. This handle is required by + * other libusbK routines that perform operations on the default interface. The handle is opaque. To release + * this handle, call the \ref UsbK_Free function. + * + * \param[in] DevInfo + * The device list element to open. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c UsbK_Init performs the same tasks as \ref UsbK_Initialize with the following exceptions: + * - Uses a \ref KLST_DEVINFO instead of a file handle created with the Windows CreateFile() API function. + * - File handles are managed internally and are closed when the last \ref KUSB_HANDLE is closed with + * \ref UsbK_Free. To obtain the internal file device handle, See \ref UsbK_GetProperty. + * + * \note + * A \c KUSB_HANDLE is required by other library routines that perform operations on a device. Once + * initialized, it can access all interfaces/endpoints of a device. An initialized handle can be cloned with + * \ref UsbK_Clone or \ref UsbK_GetAssociatedInterface. A Cloned handle will behave just as the orignal + * except in will maintain it's own \b selected interface setting. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_Init ( + _out KUSB_HANDLE* InterfaceHandle, + _in KLST_DEVINFO_HANDLE DevInfo); + +//! Frees a libusbK interface handle. + /*! + * + * \param[in] InterfaceHandle + * Handle to an interface on the device. This handle must be created by a previous call to \ref UsbK_Init, + * \ref UsbK_Initialize, \ref UsbK_GetAssociatedInterface, or \ref UsbK_Clone. + * + * \returns TRUE. + * + * The \ref UsbK_Free function releases resources alocated to the InterfaceHandle. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_Free ( + _in KUSB_HANDLE InterfaceHandle); + +//! Claims the specified interface by number or index. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] NumberOrIndex + * Interfaces can be claimed or released by a interface index or \c bInterfaceNumber. + * - Interface indexes always start from 0 and continue sequentially for all interfaces of the device. + * - An interface number always represents the actual \ref USB_INTERFACE_DESCRIPTOR::bInterfaceNumber. + * Interface numbers are not guaranteed to be zero based or sequential. + * + * \param[in] IsIndex + * If TRUE, \c NumberOrIndex represents an interface index.\n if FALSE \c NumberOrIndex represents a + * \c bInterfaceNumber. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * Claiming an interface allows applications a way to prevent other applications or multiple instances of the + * same application from using an interface at the same time. + * + * When an interface is claimed with \ref UsbK_ClaimInterface it performs the following actions: + * - Checks if the interface exists. If it does not, returns FALSE and sets last error to + * ERROR_NO_MORE_ITEMS. + * - The default (or current) interface for the device is changed to \c NumberOrIndex. + * - libusb0.sys and libusbK.sys: + * - A request to claim the interface is sent to the driver. If the interface is not claimed or already + * claimed by the application the request succeeds. If the interface is claimed by another application, + * \ref UsbK_ClaimInterface returns FALSE and sets last error to \c ERROR_BUSY. In this case the The + * default (or current) interface for the device is \b still changed to \c NumberOrIndex. + * - WinUSB.sys: All WinUSB device interfaces are claimed when the device is opened. This function performs + * identically to \ref UsbK_SelectInterface + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ClaimInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +//! Releases the specified interface by number or index. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] NumberOrIndex + * Interfaces can be claimed or released by a interface index or \c bInterfaceNumber. + * - Interface indexes always start from 0 and continue sequentially for all interfaces of the device. + * - An interface number always represents the actual \ref USB_INTERFACE_DESCRIPTOR::bInterfaceNumber. + * Interface numbers are not guaranteed to be zero based or sequential. + * + * \param[in] IsIndex + * If TRUE, \c NumberOrIndex represents an interface index.\n if FALSE \c NumberOrIndex represents a + * \c bInterfaceNumber. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * When an interface is release with \ref UsbK_ReleaseInterface it performs the following actions: + * - Checks if the interface exists. If it does not, returns FALSE and sets last error to + * ERROR_NO_MORE_ITEMS. + * - The default (or current) interface for the device is changed to the previously claimed interface. + * - libusb0.sys and libusbK.sys: + * - A request to release the interface is sent to the driver. If the interface is not claimed by a + * different application the request succeeds. If the interface is claimed by another application, + * \ref UsbK_ReleaseInterface returns FALSE and sets last error to \c ERROR_BUSY. In this case, the + * default/current interface for the device is \b still changed to the previously claimed interface. + * - WinUSB.sys: No other action needed, returns TRUE. + * + * \note + * When an interface is released, it is moved to the bottom if an interface stack making a previously claimed + * interface the current. This will continue to occur regardless of whether the interface is claimed. For + * this reason, \ref UsbK_ReleaseInterface can be used as a means to change the current/default interface of + * an \c InterfaceHandle without claiming the interface. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ReleaseInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +//! Sets the alternate setting of the specified interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] NumberOrIndex + * Interfaces can be specified by a interface index or \c bInterfaceNumber. + * - Interface indexes always start from 0 and continue sequentially for all interfaces of the device. + * - An interface number always represents the actual \ref USB_INTERFACE_DESCRIPTOR::bInterfaceNumber. + * Interface numbers are not guaranteed to be zero based or sequential. + * + * \param[in] IsIndex + * If TRUE, \c NumberOrIndex represents an interface index.\n if FALSE \c NumberOrIndex represents a + * \c bInterfaceNumber. + * + * \param[in] AltSettingNumber + * The bAlternateSetting to activate. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \ref UsbK_SetAltInterface performs the same task as \ref UsbK_SetCurrentAlternateSetting except it + * provides the option of specifying which interfaces alternate setting to activate. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _in UCHAR AltSettingNumber); + +//! Gets the alternate setting for the specified interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] NumberOrIndex + * Interfaces can be specified by a interface index or \c bInterfaceNumber. + * - Interface indexes always start from 0 and continue sequentially for all interfaces of the device. + * - An interface number always represents the actual \ref USB_INTERFACE_DESCRIPTOR::bInterfaceNumber. + * Interface numbers are not guaranteed to be zero based or sequential. + * + * \param[in] IsIndex + * If TRUE, \c NumberOrIndex represents an interface index.\n if FALSE \c NumberOrIndex represents a + * \c bInterfaceNumber. + * + * \param[out] AltSettingNumber + * On success, returns the active bAlternateSetting. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \ref UsbK_GetAltInterface performs the same task as \ref UsbK_GetCurrentAlternateSetting except it + * provides the option of specifying which interfaces alternate setting is to be retrieved. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _out PUCHAR AltSettingNumber); + +//! Gets the requested descriptor. This is a synchronous operation. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] DescriptorType + * A value that specifies the type of descriptor to return. This parameter corresponds to the bDescriptorType + * field of a standard device descriptor, whose values are described in the Universal Serial Bus + * specification. + * + * \param[in] Index + * The descriptor index. For an explanation of the descriptor index, see the Universal Serial Bus + * specification (www.usb.org). + * + * \param[in] LanguageID + * A value that specifies the language identifier, if the requested descriptor is a string descriptor. + * + * \param[out] Buffer + * A caller-allocated buffer that receives the requested descriptor. + * + * \param[in] BufferLength + * The length, in bytes, of Buffer. + * + * \param[out] LengthTransferred + * The number of bytes that were copied into Buffer. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * If the device descriptor or active config descriptor is requested, \ref UsbK_GetDescriptor retrieves + * cached data and this becomes a non-blocking, non I/O request. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetDescriptor ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR DescriptorType, + _in UCHAR Index, + _in USHORT LanguageID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred); + +//! Transmits control data over a default control endpoint. + /*! + * + * \param[in] InterfaceHandle + * A valid libusbK interface handle returned by: + * - \ref UsbK_Init + * - \ref UsbK_Initialize + * - \ref UsbK_GetAssociatedInterface + * - \ref UsbK_Clone + * + * \param[in] SetupPacket + * The 8-byte setup packet of type WINUSB_SETUP_PACKET. + * + * \param[in,out] Buffer + * A caller-allocated buffer that contains the data to transfer. + * + * \param[in] BufferLength + * The number of bytes to transfer, not including the setup packet. This number must be less than or equal to + * the size, in bytes, of Buffer. + * + * \param[out] LengthTransferred + * A pointer to a UINT variable that receives the actual number of transferred bytes. If the application + * does not expect any data to be transferred during the data phase (BufferLength is zero), LengthTransferred + * can be NULL. + * + * \param[in] Overlapped + * An optional pointer to an OVERLAPPED structure, which is used for asynchronous operations. If this + * parameter is specified, \ref UsbK_ControlTransfer immediately returns, and the event is signaled when the + * operation is complete. If Overlapped is not supplied, the \ref UsbK_ControlTransfer function transfers + * data synchronously. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. If an + * \c Overlapped member is supplied and the operation succeeds this function returns FALSE and sets last + * error to ERROR_IO_PENDING. + * + * A \ref UsbK_ControlTransfer is never cached. These requests always go directly to the usb device. + * + * \attention + * This function should not be used for operations supported by the library.\n e.g. + * \ref UsbK_SetConfiguration, \ref UsbK_SetAltInterface, etc.. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ControlTransfer ( + _in KUSB_HANDLE InterfaceHandle, + _in WINUSB_SETUP_PACKET SetupPacket, + _refopt PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +//! Sets the power policy for a device. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PolicyType + * A value that specifies the power policy to set. The following table describes symbolic constants that are + * defined in \ref lusbk_shared.h. + * + * - AUTO_SUSPEND (0x81) + * - Specifies the auto-suspend policy type; the power policy parameter must be specified by the caller in + * the Value parameter. + * - For auto-suspend, the Value parameter must point to a UCHAR variable. + * - If Value is TRUE (nonzero), the USB stack suspends the device if the device is idle. A device is idle + * if there are no transfers pending, or if the only pending transfers are IN transfers to interrupt or + * bulk endpoints. + * - The default value is determined by the value set in the DefaultIdleState registry setting. By default, + * this value is TRUE. + * + * - SUSPEND_DELAY (0x83) + * - Specifies the suspend-delay policy type; the power policy parameter must be specified by the caller in + * the Value parameter. + * - For suspend-delay, Value must point to a UINT variable. + * - Value specifies the minimum amount of time, in milliseconds, that the driver must wait post transfer + * before it can suspend the device. + * - The default value is determined by the value set in the DefaultIdleTimeout registry setting. By + * default, this value is five seconds. + * + * \param[in] ValueLength + * The size, in bytes, of the buffer at Value. + * + * \param[in] Value + * The new value for the power policy parameter. Data type and value for Value depends on the type of power + * policy passed in PolicyType. For more information, see PolicyType. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * The following list summarizes the effects of changes to power management states: + * - All pipe handles, interface handles, locks, and alternate settings are preserved across power management + * events. + * - Any transfers that are in progress are suspended when a device transfers to a low power state, and they + * are resumed when the device is restored to a working state. + * - The device and system must be in a working state before the client can restore a device-specific + * configuration. Clients can determine whether the device and system are in a working state from the + * WM_POWERBROADCAST message. + * - The client can indicate that an interface is idle by calling \ref UsbK_SetPowerPolicy. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +//! Gets the power policy for a device. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PolicyType + * A value that specifies the power policy parameter to retrieve in Value. The following table describes + * symbolic constants that are defined in \ref lusbk_shared.h. + * + * - AUTO_SUSPEND (0x81) + * - If the caller specifies a power policy of AUTO_SUSPEND, \ref UsbK_GetPowerPolicy returns the value of + * the auto suspend policy parameter in the Value parameter. + * - If Value is TRUE (that is, nonzero), the USB stack suspends the device when no transfers are pending + * or the only transfers pending are IN transfers on an interrupt or bulk endpoint. + * - The value of the DefaultIdleState registry value determines the default value of the auto suspend + * policy parameter. + * - The Value parameter must point to a UCHAR variable. + * + * - SUSPEND_DELAY (0x83) + * - If the caller specifies a power policy of SUSPEND_DELAY, \ref UsbK_GetPowerPolicy returns the value of + * the suspend delay policy parameter in Value. + * - The suspend delay policy parameter specifies the minimum amount of time, in milliseconds, that the + * driver must wait after any transfer before it can suspend the device. + * - Value must point to a UINT variable. + * + * \param[in,out] ValueLength + * A pointer to the size of the buffer that Value. On output, ValueLength receives the size of the data that + * was copied into the Value buffer. + * + * \param[out] Value + * A buffer that receives the specified power policy parameter. For more information, see PolicyType. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +//! Sets the device configuration number. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] ConfigurationNumber + * The configuration number to activate. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \ref UsbK_SetConfiguration is only supported with libusb0.sys. If the driver in not libusb0.sys, this + * function performs the following emulation actions: + * - If the requested configuration number is the current configuration number, returns TRUE. + * - If the requested configuration number is one other than the current configuration number, returns FALSE + * and set last error to \c ERROR_NO_MORE_ITEMS. + * + * This function will fail if there are pending I/O operations or there are other libusbK interface handles + * referencing the device. \sa UsbK_Free + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR ConfigurationNumber); + +//! Gets the device current configuration number. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[out] ConfigurationNumber + * On success, receives the active configuration number. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR ConfigurationNumber); + +//! Resets the usb device of the specified interface handle. (port cycle). + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ResetDevice ( + _in KUSB_HANDLE InterfaceHandle); + +//! Creates a libusbK handle for the device specified by a file handle. + /*! + * + * \attention + * This function is supported for WinUSB API compatibility only and is not intended for new development. + * libusbK library users should use \ref UsbK_Init instead. (regardless of the driver they've selected) + * + * \param[in] DeviceHandle + * The handle to the device that CreateFile returned. libusbK uses overlapped I/O, so FILE_FLAG_OVERLAPPED + * must be specified in the dwFlagsAndAttributes parameter of CreateFile call for DeviceHandle to have the + * characteristics necessary for this to function properly. + * + * \param[out] InterfaceHandle + * Receives a handle configured to the first (default) interface on the device. This handle is required by + * other libusbK routines that perform operations on the default interface. The handle is opaque. To release + * this handle, call the \ref UsbK_Free function. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * When \ref UsbK_Initialize is called, the policy settings of the interface are reset to the default values. + * + * The \ref UsbK_Initialize call queries the underlying USB stack for various descriptors and allocates + * enough memory to store the retrieved descriptor data. + * + * \ref UsbK_Initialize first retrieves the device descriptor and then gets the associated configuration + * descriptor. From the configuration descriptor, the call derives the associated interface descriptors and + * stores them in an array. The interfaces in the array are identified by zero-based indexes. An index value + * of 0 indicates the first interface (the default interface), a value of 1 indicates the second associated + * interface, and so on. \ref UsbK_Initialize parses the default interface descriptor for the endpoint + * descriptors and caches information such as the associated pipes or state specific data. The handle + * received in the InterfaceHandle parameter will have its default interface configured to the first + * interface in the array. + * + * If an application wants to use another interface on the device, it can call + * \ref UsbK_GetAssociatedInterface, or \ref UsbK_ClaimInterface. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_Initialize ( + _in HANDLE DeviceHandle, + _out KUSB_HANDLE* InterfaceHandle); + +//! Selects the specified interface by number or index as the current interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] NumberOrIndex + * Interfaces can be claimed or released by a interface index or \c bInterfaceNumber. + * - Interface indexes always start from 0 and continue sequentially for all interfaces of the device. + * - An interface number always represents the actual \ref USB_INTERFACE_DESCRIPTOR::bInterfaceNumber. + * Interface numbers are not guaranteed to be zero based or sequential. + * + * \param[in] IsIndex + * If TRUE, \c NumberOrIndex represents an interface index.\n if FALSE \c NumberOrIndex represents a + * \c bInterfaceNumber. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \sa UsbK_ClaimInterface + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SelectInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +//! Retrieves a handle for an associated interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] AssociatedInterfaceIndex + * An index that specifies the associated interface to retrieve. A value of 0 indicates the first associated + * interface, a value of 1 indicates the second associated interface, and so on. + * + * \param[out] AssociatedInterfaceHandle + * A handle for the associated interface. Callers must pass this interface handle to libusbK Functions + * exposed by libusbK.dll. To close this handle, call \ref UsbK_Free. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * The \ref UsbK_GetAssociatedInterface function retrieves an opaque handle for an associated interface. This + * is a synchronous operation. + * + * The first associated interface is the interface that immediately follows the current (or default) + * interface of the specified /c InterfaceHandle. + * + * The handle that \ref UsbK_GetAssociatedInterface returns must be released by calling \ref UsbK_Free. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetAssociatedInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AssociatedInterfaceIndex, + _out KUSB_HANDLE* AssociatedInterfaceHandle); + +//! Clones the specified interface handle. + /*! + * + * Each cloned interface handle maintains it's own selected interface. + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[out] DstInterfaceHandle + * On success, the cloned return handle. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_Clone ( + _in KUSB_HANDLE InterfaceHandle, + _out KUSB_HANDLE* DstInterfaceHandle); + +//! Retrieves the interface descriptor for the specified alternate interface settings for a particular interface handle. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] AltSettingIndex + * A value that indicates which alternate setting index to return. A value of 0 indicates the first alternate + * setting, a value of 1 indicates the second alternate setting, and so on. + * + * \param[out] UsbAltInterfaceDescriptor + * A pointer to a caller-allocated \ref USB_INTERFACE_DESCRIPTOR structure that contains information about + * the interface that AltSettingNumber specified. + * + * The \ref UsbK_QueryInterfaceSettings call searches the current/default interface array for the alternate + * interface specified by the caller in the AltSettingIndex. If the specified alternate interface is found, + * the function populates the caller-allocated USB_INTERFACE_DESCRIPTOR structure. If the specified alternate + * interface is not found, then the call fails with the ERROR_NO_MORE_ITEMS code. + * + * To change the current/default interface, see \ref UsbK_SelectInterface and \ref UsbK_ClaimInterface + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_QueryInterfaceSettings ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingIndex, + _out PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor); + +//! Retrieves information about the physical device that is associated with a libusbK handle. + /*! + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] InformationType + * A value that specifies which interface information value to retrieve. On input, InformationType must have + * the following value: \c DEVICE_SPEED (0x01). + * + * \param[in,out] BufferLength + * The maximum number of bytes to read. This number must be less than or equal to the size, in bytes, of + * Buffer. On output, BufferLength is set to the actual number of bytes that were copied into Buffer. + * + * \param[in,out] Buffer + * A caller-allocated buffer that receives the requested value. On output, Buffer indicates the device speed: + * - (0x01) low/full speed device. + * - (0x03) high speed device. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_QueryDeviceInformation ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT InformationType, + _ref PUINT BufferLength, + _ref PVOID Buffer); + +//! Sets the alternate setting of an interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] AltSettingNumber + * The value that is contained in the bAlternateSetting member of the \ref USB_INTERFACE_DESCRIPTOR + * structure. This structure can be populated by the \ref UsbK_QueryInterfaceSettings routine. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * Sets the active bAlternateSetting for the current/default interface. + * + * To change the default/current interface see \ref UsbK_ClaimInterface and \ref UsbK_ReleaseInterface + * \sa UsbK_SetAltInterface + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber); + +//! Gets the current alternate interface setting for an interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[out] AltSettingNumber + * A pointer to an unsigned character that receives an integer that indicates the current alternate setting. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * Gets the active bAlternateSetting for the current/default interface. + * + * To change the default/current interface see \ref UsbK_ClaimInterface and \ref UsbK_ReleaseInterface + * \sa UsbK_GetAltInterface + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR AltSettingNumber); + +//! Retrieves information about a pipe that is associated with an interface. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] AltSettingNumber + * A value that specifies the alternate interface to return the information for. + * + * \param[in] PipeIndex + * A value that specifies the pipe to return information about. This value is not the same as the + * bEndpointAddress field in the endpoint descriptor. A PipeIndex value of 0 signifies the first endpoint + * that is associated with the interface, a value of 1 signifies the second endpoint, and so on. PipeIndex + * must be less than the value in the bNumEndpoints field of the interface descriptor. + * + * \param[out] PipeInformation + * A pointer, on output, to a caller-allocated \ref WINUSB_PIPE_INFORMATION structure that contains pipe + * information. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * The \ref UsbK_QueryPipe function does not retrieve information about the control pipe. + * + * Each interface on the USB device can have multiple endpoints. To communicate with each of these endpoints, + * the bus driver creates pipes for each endpoint on the interface. The pipe indices are zero-based. + * Therefore for n number of endpoints, the pipes' indices are set from n-1. \ref UsbK_QueryPipe parses the + * configuration descriptor to get the interface specified by the caller. It searches the interface + * descriptor for the endpoint descriptor associated with the caller-specified pipe. If the endpoint is + * found, the function populates the caller-allocated \ref WINUSB_PIPE_INFORMATION structure with information + * from the endpoint descriptor. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_QueryPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber, + _in UCHAR PipeIndex, + _out PWINUSB_PIPE_INFORMATION PipeInformation); + +//! Sets the policy for a specific pipe associated with an endpoint on the device. This is a synchronous operation. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[in] PolicyType + * A UINT variable that specifies the policy parameter to change. The Value parameter contains the new value + * for the policy parameter. See the remarks section for information about each of the pipe policies and the + * resulting behavior. + * + * \param[in] ValueLength + * The size, in bytes, of the buffer at Value. + * + * \param[in] Value + * The new value for the policy parameter that PolicyType specifies. The size of this input parameter depends + * on the policy to change. For information about the size of this parameter, see the description of the + * PolicyType parameter. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * The following list describes symbolic constants that are defined in \ref lusbk_shared.h + * + * - \c SHORT_PACKET_TERMINATE (0x01) + * - The default value is \c FALSE. + * - To enable \c SHORT_PACKET_TERMINATE, in Value pass the address of a caller-allocated \c UCHAR variable + * set to \c TRUE (nonzero). + * - Enabling \c SHORT_PACKET_TERMINATE causes the driver to send a zero-length packet at the end of every + * write request to the host controller. + * + * - \c AUTO_CLEAR_STALL (0x02) + * - The default value is \c FALSE. To enable \c AUTO_CLEAR_STALL, in Value pass the address of a + * caller-allocated \c UCHAR variable set to \c TRUE (nonzero). + * - Enabling \c AUTO_CLEAR_STALL causes libusbK to reset the pipe in order to automatically clear the + * stall condition. Data continues to flow on the bulk and interrupt \c IN endpoints again as soon as a + * new or a queued transfer arrives on the endpoint. This policy parameter does not affect control pipes. + * - Disabling \c AUTO_CLEAR_STALL causes all transfers (that arrive to the endpoint after the stalled + * transfer) to fail until the caller manually resets the endpoint's pipe by calling \ref UsbK_ResetPipe. + * + * - \c PIPE_TRANSFER_TIMEOUT (0x03) + * - The default value is zero. To set a time-out value, in Value pass the address of a caller-allocated + * \c UINT variable that contains the time-out interval. + * - The \c PIPE_TRANSFER_TIMEOUT value specifies the time-out interval, in milliseconds. The host + * controller cancels transfers that do not complete within the specified time-out interval. + * - A value of zero (default) indicates that transfers do not time out because the host controller never + * cancels the transfer. + * + * - \c IGNORE_SHORT_PACKETS (0x04) + * - The default value is \c FALSE. To enable \c IGNORE_SHORT_PACKETS, in Value pass the address of a + * caller-allocated \c UCHAR variable set to \c TRUE (nonzero). + * - Enabling \c IGNORE_SHORT_PACKETS causes the host controller to not complete a read operation after it + * receives a short packet. Instead, the host controller completes the operation only after the host has + * read the specified number of bytes. + * - Disabling \c IGNORE_SHORT_PACKETS causes the host controller to complete a read operation when either + * the host has read the specified number of bytes or the host has received a short packet. + * + * - \c ALLOW_PARTIAL_READS (0x05) + * - The default value is \c TRUE (nonzero). To disable \c ALLOW_PARTIAL_READS, in Value pass the address + * of a caller-allocated \c UCHAR variable set to \c FALSE (zero). + * - Disabling \c ALLOW_PARTIAL_READS causes the read requests to fail whenever the device returns more + * data (on bulk and interrupt \c IN endpoints) than the caller requested. + * - Enabling \c ALLOW_PARTIAL_READS causes libusbK to save or discard the extra data when the device + * returns more data (on bulk and interrupt \c IN endpoints) than the caller requested. This behavior is + * defined by setting the \c AUTO_FLUSH value. + * + * - \c AUTO_FLUSH (0x06) + * - The default value is \c FALSE (zero). To enable \c AUTO_FLUSH, in Value pass the address of a + * caller-allocated \c UCHAR variable set to \c TRUE (nonzero). + * - \c AUTO_FLUSH must be used with \c ALLOW_PARTIAL_READS enabled. If \c ALLOW_PARTIAL_READS is \c TRUE, + * the value of \c AUTO_FLUSH determines the action taken by libusbK when the device returns more data + * than the caller requested. + * - Disabling \c ALLOW_PARTIAL_READS causes libusbK to ignore the \c AUTO_FLUSH value. + * - Disabling \c AUTO_FLUSH with \c ALLOW_PARTIAL_READS enabled causes libusbK to save the extra data, add + * the data to the beginning of the caller's next read request, and send it to the caller in the next + * read operation. + * - Enabling \c AUTO_FLUSH with \c ALLOW_PARTIAL_READS enabled causes libusbK to discard the extra data + * remaining from the read request. + * + * - \c RAW_IO (0x07) + * - The default value is \c FALSE (zero). To enable \c RAW_IO, in Value pass the address of a + * caller-allocated \c UCHAR variable set to \c TRUE (nonzero). + * - Enabling \c RAW_IO causes libusbK to send data directly to the \c USB driver stack, bypassing + * libusbK's queuing and error handling mechanism. + * - The buffers that are passed to \ref UsbK_ReadPipe must be configured by the caller as follows: + * - The buffer length must be a multiple of the maximum endpoint packet size. + * - The length must be less than or equal to the value of \c MAXIMUM_TRANSFER_SIZE retrieved by + * \ref UsbK_GetPipePolicy. + * - Disabling \c RAW_IO (\c FALSE) does not impose any restriction on the buffers that are passed to + * \ref UsbK_ReadPipe. + * + * - \c RESET_PIPE_ON_RESUME (0x09) + * - The default value is \c FALSE (zero). To enable \c RESET_PIPE_ON_RESUME, in Value pass the address of + * a caller-allocated \c UCHAR variable set to \c TRUE (nonzero). + * - \c TRUE (or a nonzero value) indicates that on resume from suspend, libusbK resets the endpoint before + * it allows the caller to send new requests to the endpoint. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_SetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +//! Gets the policy for a specific pipe (endpoint). + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[in] PolicyType + * A UINT variable that specifies the policy parameter to retrieve. The current value for the policy + * parameter is retrieved the Value parameter. + * + * \param[in,out] ValueLength + * A pointer to the size, in bytes, of the buffer that Value points to. On output, ValueLength receives the + * size, in bytes, of the data that was copied into the Value buffer. + * + * \param[out] Value + * A pointer to a buffer that receives the specified pipe policy value. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +//! Reads data from the specified pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[out] Buffer + * A caller-allocated buffer that receives the data that is read. + * + * \param[in] BufferLength + * The maximum number of bytes to read. This number must be less than or equal to the size, in bytes, of + * Buffer. + * + * \param[out] LengthTransferred + * A pointer to a UINT variable that receives the actual number of bytes that were copied into Buffer. For + * more information, see Remarks. + * + * \param[in] Overlapped + * An optional pointer to an overlapped structure for asynchronous operations. This can be a \ref KOVL_HANDLE + * or a pointer to a standard windows OVERLAPPED structure. If this parameter is specified, \c UsbK_ReadPipe + * returns immediately rather than waiting synchronously for the operation to complete before returning. An + * event is signaled when the operation is complete. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +//! Writes data to a pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[in] Buffer + * A caller-allocated buffer the data is written from. + * + * \param[in] BufferLength + * The maximum number of bytes to write. This number must be less than or equal to the size, in bytes, of + * Buffer. + * + * \param[out] LengthTransferred + * A pointer to a UINT variable that receives the actual number of bytes that were transferred from Buffer. + * For more information, see Remarks. + * + * \param[in] Overlapped + * An optional pointer to an overlapped structure for asynchronous operations. This can be a \ref KOVL_HANDLE + * or a pointer to a standard windows OVERLAPPED structure. If this parameter is specified, \c UsbK_WritePipe + * returns immediately rather than waiting synchronously for the operation to complete before returning. An + * event is signaled when the operation is complete. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_WritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +//! Resets the data toggle and clears the stall condition on a pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_ResetPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +//! Aborts all of the pending transfers for a pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_AbortPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +//! Discards any data that is cached in a pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_FlushPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +//! Reads from an isochronous pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[out] Buffer + * A caller-allocated buffer that receives the data that is read. + * + * \param[in] BufferLength + * The maximum number of bytes to read. This number must be less than or equal to the size, in bytes, of + * Buffer. + * + * \param[in] Overlapped + * A \b required pointer to an overlapped structure for asynchronous operations. This can be a + * \ref KOVL_HANDLE or a pointer to a standard windows OVERLAPPED structure. If this parameter is specified, + * \c UsbK_IsoReadPipe returns immediately rather than waiting synchronously for the operation to complete + * before returning. An event is signaled when the operation is complete. + * + * \param[in,out] IsoContext + * Pointer to an isochronous transfer context created with \ref IsoK_Init. If \c IsoContext is NULL, + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \par Overlapped I/O considerations + * If an \c Overlapped parameter is specified and the transfer is submitted successfully, the function + * returns \b FALSE and sets last error to \c ERROR_IO_PENDING. When using overlapped I/O, users may ignore + * the return results of this function and instead use the return results from one of the \ref ovlk wait + * functions or from \ref UsbK_GetOverlappedResult. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_IsoReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +//! Writes to an isochronous pipe. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] PipeID + * An 8-bit value that consists of a 7-bit address and a direction bit. This parameter corresponds to the + * bEndpointAddress field in the endpoint descriptor. + * + * \param[in] Buffer + * A caller-allocated buffer that receives the data that is read. + * + * \param[in] BufferLength + * The maximum number of bytes to write. This number must be less than or equal to the size, in bytes, of + * Buffer. + * + * \param[in] Overlapped + * An optional pointer to an overlapped structure for asynchronous operations. This can be a \ref KOVL_HANDLE + * or a pointer to a standard windows OVERLAPPED structure. If this parameter is specified, + * \c UsbK_IsoWritePipe returns immediately rather than waiting synchronously for the operation to complete + * before returning. An event is signaled when the operation is complete. + * + * \param[in,out] IsoContext + * Pointer to an isochronous transfer context created with \ref IsoK_Init. See remarks below. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_IsoWritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +//! Retrieves the current USB frame number. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[out] FrameNumber + * A pointer to a location that receives the current 32-bit frame number on the USB bus (from the host + * controller driver). + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetCurrentFrameNumber ( + _in KUSB_HANDLE InterfaceHandle, + _out PUINT FrameNumber); + +//! Retrieves the results of an overlapped operation on the specified libusbK handle. + /*! + * + * \param[in] InterfaceHandle + * An initialized usb handle, see \ref UsbK_Init. + * + * \param[in] Overlapped + * A pointer to a standard windows OVERLAPPED structure that was specified when the overlapped operation was + * started. + * + * \param[out] lpNumberOfBytesTransferred + * A pointer to a variable that receives the number of bytes that were actually transferred by a read or + * write operation. + * + * \param[in] bWait + * If this parameter is TRUE, the function does not return until the operation has been completed. If this + * parameter is FALSE and the operation is still pending, the function returns FALSE and the GetLastError + * function returns ERROR_IO_INCOMPLETE. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * This function is like the Win32 API routine, GetOverlappedResult, with one difference; instead of passing + * a file handle that is returned from CreateFile, the caller passes an interface handle that is returned + * from \ref UsbK_Initialize, \ref UsbK_Init, or \ref UsbK_GetAssociatedInterface. The caller can use either + * API routine, if the appropriate handle is passed. The \ref UsbK_GetOverlappedResult function extracts the + * file handle from the interface handle and then calls GetOverlappedResult. \n + * + * The results that are reported by the \ref UsbK_GetOverlappedResult function are those from the specified + * handle's last overlapped operation to which the specified standard windows OVERLAPPED structure was + * provided, and for which the operation's results were pending. A pending operation is indicated when the + * function that started the operation returns FALSE, and the GetLastError routine returns ERROR_IO_PENDING. + * When an I/O operation is pending, the function that started the operation resets the hEvent member of the + * standard windows OVERLAPPED structure to the nonsignaled state. Then when the pending operation has been + * completed, the system sets the event object to the signaled state. \n + * + * The caller can specify that an event object is manually reset in the standard windows OVERLAPPED + * structure. If an automatic reset event object is used, the event handle must not be specified in any other + * wait operation in the interval between starting the overlapped operation and the call to + * \ref UsbK_GetOverlappedResult. For example, the event object is sometimes specified in one of the wait + * routines to wait for the operation to be completed. When the wait routine returns, the system sets an + * auto-reset event's state to nonsignaled, and a successive call to \ref UsbK_GetOverlappedResult with the + * bWait parameter set to TRUE causes the function to be blocked indefinitely. + * + * If the bWait parameter is TRUE, \ref UsbK_GetOverlappedResult determines whether the pending operation has + * been completed by waiting for the event object to be in the signaled state. + * + * If the hEvent member of the standard windows OVERLAPPED structure is NULL, the system uses the state of + * the file handle to signal when the operation has been completed. Do not use file handles for this purpose. + * It is better to use an event object because of the confusion that can occur when multiple concurrent + * overlapped operations are performed on the same file. In this situation, you cannot know which operation + * caused the state of the object to be signaled. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetOverlappedResult ( + _in KUSB_HANDLE InterfaceHandle, + _in LPOVERLAPPED Overlapped, + _out PUINT lpNumberOfBytesTransferred, + _in BOOL bWait); + +//! Gets a USB device (driver specific) property from usb handle. + /*! + * + * \param[in] InterfaceHandle + * USB handle of the property to retrieve. + * + * \param[in] PropertyType + * The propety type to retrieve. + * + * \param[in,out] PropertySize + * Size in bytes of \c Value. + * + * \param[out] Value + * On success, receives the proprty data. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API UsbK_GetProperty ( + _in KUSB_HANDLE InterfaceHandle, + _in KUSB_PROPERTY PropertyType, + _ref PUINT PropertySize, + _out PVOID Value); + + /*! @} */ + + +#endif + +#ifndef _LIBUSBK_LSTK_FUNCTIONS + /*! \addtogroup lstk + *@{ + */ + +//! Initializes a new usb device list containing all supported devices. + /*! + * + * \param[out] DeviceList + * Pointer reference that will receive a populated device list. + * + * \param[in] Flags + * Search, filter, and listing options. see \c KLST_FLAG + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c LstK_Init populates \c DeviceList with connected usb devices that can be used by libusbK. + * + * \note if \ref LstK_Init returns TRUE, the device list must be freed with \ref LstK_Free when it is no + * longer needed. + * + */ + KUSB_EXP BOOL KUSB_API LstK_Init( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags); + +//! Initializes a new usb device list containing only devices matching a specific class GUID. + /*! + * + * \param[out] DeviceList + * Pointer reference that will receive a populated device list. + * + * \param[in] Flags + * Search, filter, and listing options. see \c KLST_FLAG + * + * \param[in] PatternMatch + * Pattern Search filter. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c LstK_InitEx populates \c DeviceList with usb devices that can be used by libusbK. Only device + * matching the \ref KLST_PATTERN_MATCH string are included in the list. + * + * \note + * This function significantly improves performance when used with a device interface guid pattern patch. + * + * \note if \ref LstK_InitEx returns TRUE, the device list must be freed with \ref LstK_Free when it it's no + * longer needed. + * + */ + KUSB_EXP BOOL KUSB_API LstK_InitEx( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags, + _in PKLST_PATTERN_MATCH PatternMatch); + + //! Frees a usb device list. + /*! + * + * \note if \ref LstK_Init returns TRUE, the device list must be freed with \ref LstK_Free when it is no + * longer needed. + * + * \param[in] DeviceList + * The \c DeviceList to free. + * + * \returns NONE + * + * Frees all resources that were allocated to \c DeviceList by \ref LstK_Init. + * + */ + KUSB_EXP BOOL KUSB_API LstK_Free( + _in KLST_HANDLE DeviceList); + +//! Enumerates \ref KLST_DEVINFO elements of a \ref KLST_HANDLE. + /*! + * + * \param[in] DeviceList + * The \c DeviceList to enumerate. + * + * \param[in] EnumDevListCB + * Function to call for each iteration. + * + * \param[in] Context + * Optional user context pointer. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * Calls \c EnumDevListCB for each element in the device list or until \c EnumDevListCB returns FALSE. + * + */ + KUSB_EXP BOOL KUSB_API LstK_Enumerate( + _in KLST_HANDLE DeviceList, + _in KLST_ENUM_DEVINFO_CB* EnumDevListCB, + _inopt PVOID Context); + +//! Gets the \ref KLST_DEVINFO element for the current position. + /*! + * + * \param[in] DeviceList + * The \c DeviceList to retrieve a current \ref KLST_DEVINFO for. + * + * \param[out] DeviceInfo + * The device information. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * After a \c DeviceList is created or after the \ref LstK_MoveReset method is called, the \c LstK_MoveNext + * method must be called to advance the device list enumerator to the first element of the \c DeviceList + * before calling \c LstK_Current otherwise, \c DeviceInfo is undefined. + * + * \c LstK_Current returns \c FALSE and sets last error to \c ERROR_NO_MORE_ITEMS if the last call to + * \c LstK_MoveNext returned \c FALSE, which indicates the end of the \c DeviceList. + * + * \c LstK_Current does not move the position of the device list enumerator, and consecutive calls to + * \c LstK_Current return the same object until either \c LstK_MoveNext or \ref LstK_MoveReset is called. + * + */ + KUSB_EXP BOOL KUSB_API LstK_Current( + _in KLST_HANDLE DeviceList, + _out KLST_DEVINFO_HANDLE* DeviceInfo); + +//! Advances the device list current \ref KLST_DEVINFO position. + /*! + * \param[in] DeviceList + * A usb device list returned by \ref LstK_Init + * + * \param[out] DeviceInfo + * On success, contains a pointer to the device information for the current enumerators position. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * After a \c DeviceList is created or after \ref LstK_MoveReset is called, an enumerator is positioned + * before the first element of the \c DeviceList and the \b first call to \c LstK_MoveNext moves the + * enumerator over the first element of the \c DeviceList. + * + * If \c LstK_MoveNext passes the end of the \c DeviceList, the enumerator is positioned after the last + * element in the \c DeviceList and \c LstK_MoveNext returns \c FALSE. When the enumerator is at this + * position, a subsequent call to \c LstK_MoveNext will reset the enumerator and it continues from the + * beginning. + * + */ + KUSB_EXP BOOL KUSB_API LstK_MoveNext( + _in KLST_HANDLE DeviceList, + _outopt KLST_DEVINFO_HANDLE* DeviceInfo); + +//! Sets the device list to its initial position, which is before the first element in the list. + /*! + * + * \param[in] DeviceList + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP VOID KUSB_API LstK_MoveReset( + _in KLST_HANDLE DeviceList); + +//! Find a device by vendor and product id + /*! + * + * \param[in] DeviceList + * The \c DeviceList to retrieve a current \ref KLST_DEVINFO for. + * + * \param[in] Vid + * ID is used in conjunction with the \c Pid to uniquely identify USB devices, providing traceability to the + * OEM. + * + * \param[in] Pid + * ID is used in conjunction with the \c Pid to uniquely identify USB devices, providing traceability to the + * OEM. + * + * \param[out] DeviceInfo + * On success, the device information pointer, otherwise NULL. + * + * \returns + * - TRUE if the device was found + * - FALSE if the device was \b not found or an error occurred. + * - Sets last error to \c ERROR_NO_MORE_ITEMS if the device was \b not found. + * + * Searches all elements in \c DeviceList for usb device matching the specified. + * + */ + KUSB_EXP BOOL KUSB_API LstK_FindByVidPid( + _in KLST_HANDLE DeviceList, + _in INT Vid, + _in INT Pid, + _out KLST_DEVINFO_HANDLE* DeviceInfo); + +//! Counts the number of device info elements in a device list. + /*! + * + * \param[in] DeviceList + * The deice list to count. + * + * \param[in,out] Count + * On success, receives the number of \ref KLST_DEVINFO elements in the list. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API LstK_Count( + _in KLST_HANDLE DeviceList, + _ref PUINT Count); + + + /**@}*/ + +#endif + +#ifndef _LIBUSBK_HOTK_FUNCTIONS + /*! \addtogroup hotk + * @{ + */ + +//! Creates a new hot-plug handle for USB device arrival/removal event monitoring. + /*! + * + * \param[out] Handle + * Reference to a handle pointer that will receive the initialized hot-plug handle. + * + * \param[in,out] InitParams + * Hot plug handle initialization structure. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API HotK_Init( + _out KHOT_HANDLE* Handle, + _ref PKHOT_PARAMS InitParams); + +//! Frees the specified hot-plug handle. + /*! + * + * \param[in] Handle + * hot-plug handle pointer to free. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API HotK_Free( + _in KHOT_HANDLE Handle); + + //! Frees all hot-plug handles initialized with \ref HotK_Init. + /*! + * + */ + KUSB_EXP VOID KUSB_API HotK_FreeAll(VOID); + + /**@}*/ + +#endif + +#ifndef _LIBUSBK_OVLK_FUNCTIONS + /*! \addtogroup ovlk + * @{ + */ + +//! Gets a preallocated \c OverlappedK structure from the specified/default pool. + /*! + * + * \param[out] OverlappedK + * On Success, receives the overlapped handle. + * + * \param[in] PoolHandle + * The overlapped pool used to retrieve the next available \c OverlappedK. + * + * \returns On success, the next unused overlappedK available in the pool. Otherwise NULL. Use + * \c GetLastError() to get extended error information. + * + * After calling \ref OvlK_Acquire or \ref OvlK_ReUse the \c OverlappedK is ready to be used in an I/O + * operation. See one of the \c UsbK core transfer functions such as \ref UsbK_ReadPipe or + * \ref UsbK_WritePipe for more information. + * + * If the pools internal refurbished list (a re-usable list of \c OverlappedK structures) is not empty, the + * \ref OvlK_Acquire function will choose an overlapped from the refurbished list. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_Acquire( + _out KOVL_HANDLE* OverlappedK, + _in KOVL_POOL_HANDLE PoolHandle); + +//! Returns an \c OverlappedK structure to it's pool. + /*! + * + * \param[in] OverlappedK + * The overlappedK to release. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * When an overlapped is returned to pool, it resources are \b not freed. Instead, it is added to an internal + * refurbished list (a re-usable list of \c OverlappedK structures). + * + * \warning This function must not be called when the OverlappedK is in-use. If unsure, consider using + * \ref OvlK_WaitAndRelease instead. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_Release( + _in KOVL_HANDLE OverlappedK); + + +//! Creates a new overlapped pool. + /*! + * + * \param[out] PoolHandle + * On success, receives the new pool handle. + * + * \param[in] UsbHandle + * USB handle to associate with the pool. + * + * \param[in] MaxOverlappedCount + * Maximum number of overkappedK handles allowed in the pool. + * + * \param[in] Flags + * Pool flags. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_Init ( + _out KOVL_POOL_HANDLE* PoolHandle, + _in KUSB_HANDLE UsbHandle, + _in INT MaxOverlappedCount, + _inopt KOVL_POOL_FLAG Flags); + +//! Destroys the specified pool and all resources it created. + /*! + * + * \param[in] PoolHandle + * The overlapped pool to destroy. Once destroyed, the pool and all resources which belong to it can no + * longer be used. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \warning A pool should not be destroyed until all OverlappedKs acquired from it are no longer in-use. For + * more information see \ref OvlK_WaitAndRelease or \ref OvlK_Release. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_Free( + _in KOVL_POOL_HANDLE PoolHandle); + + +//! Returns the internal event handle used to signal IO operations. + /*! + * + * \param[in] OverlappedK + * The overlappedK used to return the internal event handle. + * + * \returns On success, The manual reset event handle being used by this overlappedK. Otherwise NULL. Use + * \c GetLastError() to get extended error information. + * + * \ref OvlK_GetEventHandle is useful for applications that must to their own event handling. It exposes the + * windows \c OVERLAPPED \c hEvent used for i/o completion signaling. This event handle can be used by the + * standard event wait functions; /c WaitForMultipleObjectsEx for example. + * + * \warning Use \ref OvlK_GetEventHandle with caution. Event handles returned by this function should never + * be used unless the OverlappedK has been \b acquired by the application. + * + */ + KUSB_EXP HANDLE KUSB_API OvlK_GetEventHandle( + _in KOVL_HANDLE OverlappedK); + +//! Waits for overlapped I/O completion, and performs actions specified in \c WaitFlags. + /*! + * + * \param[in] OverlappedK + * The overlappedK to wait on. + * + * \param[in] TimeoutMS + * Number of milliseconds to wait for overlapped completion. + * + * \param[in] WaitFlags + * See /ref KOVL_WAIT_FLAG + * + * \param[out] TransferredLength + * On success, returns the number of bytes transferred by this overlappedK. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. See + * the remarks section below for details on relevant error codes. + * + * \c OvlK_Wait waits the time interval specified in \c TimeoutMS for the overlapped I/O operation to + * complete. Different actions can then taken depending on the flags specified in \c WaitFlags. + * + * \WINERRORTABLE + * + * \WINERROR{ERROR_CANCELLED,1223} + * - The I/O was cancelled by the user. The transfer complete event was not signalled within the alotted + * transfer timeout time and the OvlK_Wait function issued a CancelIoEx/CancelIo request because the + * \ref KOVL_WAIT_FLAG_CANCEL_ON_TIMEOUT flag bit was set. + * \ENDWINERROR + * + * \WINERROR{ERROR_OPERATION_ABORTED,995} + * - The transfer complete event is signalled but the overlapped result was allready cancelled. The + * overlapped I/O may have bee cancelled for one of the following reasons: + * - Driver cancelled because of pipe timeout policy expiration. + * - The device was disconnected. + * - A \ref UsbK_AbortPipe request was issued. + * \ENDWINERROR + * + * \ENDWINERRORTABLE + * + */ + KUSB_EXP BOOL KUSB_API OvlK_Wait( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength); + +//! Waits for overlapped I/O completion on the oldest acquired OverlappedK handle and performs actions specified in \c WaitFlags. + /*! + * + * \param[in] PoolHandle + * The pool handle containing one or more acuired OverlappedKs. + * + * \param[out] OverlappedK + * On success, set to the oldest overlappedK in the acquired list. + * + * \param[in] TimeoutMS + * See /ref OvlK_Wait + * + * \param[in] WaitFlags + * See /ref KOVL_WAIT_FLAG + * + * \param[out] TransferredLength + * See /ref OvlK_Wait + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. See + * See /ref OvlK_Wait + */ + KUSB_EXP BOOL KUSB_API OvlK_WaitOldest( + _in KOVL_POOL_HANDLE PoolHandle, + _outopt KOVL_HANDLE* OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength); + +//! Waits for overlapped I/O completion, cancels on a timeout error. + /*! + * + * \param[in] OverlappedK + * The overlappedK to wait on. + * + * \param[in] TimeoutMS + * Number of milliseconds to wait for overlapped completion. + * + * \param[out] TransferredLength + * On success, returns the number of bytes transferred by this overlappedK. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. See + * \ref OvlK_Wait for details on relevant win32 error codes. + * + * \note This convenience function calls \ref OvlK_Wait with \ref KOVL_WAIT_FLAG_CANCEL_ON_TIMEOUT. + * + * \c OvlK_WaitOrCancel waits the the time interval specified by \c TimeoutMS for an overlapped result. If + * the \c TimeoutMS interval expires the I/O operation is cancelled. The \c OverlappedK is not released back + * to its pool. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_WaitOrCancel( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength); + +//! Waits for overlapped I/O completion, cancels on a timeout error and always releases the OvlK handle back to its pool. + /*! + * + * \param[in] OverlappedK + * The overlappedK to wait on. + * + * \param[in] TimeoutMS + * Number of milliseconds to wait for overlapped completion. + * + * \param[out] TransferredLength + * On success, returns the number of bytes transferred by this overlappedK. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. See + * \ref OvlK_Wait for details on relevant win32 error codes. + * + * \note This convenience function calls \ref OvlK_Wait with \ref KOVL_WAIT_FLAG_RELEASE_ALWAYS. + * + * \c OvlK_WaitAndRelease waits the the time interval specified by \c TimeoutMS for an overlapped result. + * When \c OvlK_WaitOrCancel returns, the I/O operation has either been completed or cancelled. The + * \c OverlappedK is always released back to its pool where it can be re-acquired with \ref OvlK_Acquire. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_WaitAndRelease( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength); + +//! Checks for i/o completion; returns immediately. (polling) + /*! + * + * \param[in] OverlappedK + * The overlappedK to check for completion. + * + * \warning \ref OvlK_IsComplete does \b no validation on the OverlappedK. It's purpose is to check the event + * signal state as fast as possible. + * + * \returns TRUE if the \c OverlappedK has completed, otherwise FALSE. + * + * \c OvlK_IsComplete quickly checks if the \c OverlappedK i/o operation has completed. + */ + KUSB_EXP BOOL KUSB_API OvlK_IsComplete( + _in KOVL_HANDLE OverlappedK); + +//! Initializes an overlappedK for re-use. The overlappedK is not return to its pool. + /*! + * + * \param[in] OverlappedK + * The overlappedK to re-use. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * This function performs the following actions: + * - Resets the overlapped event to non-signaled via ResetEvent(). + * - Clears the internal overlapped information. + * - Clears the 'Internal' and 'InternalHigh' members of the windows overlapped structure. + * + * \note + * Re-using OverlappedKs is the most efficient means of OverlappedK management. When an OverlappedK is + * "re-used" it is not returned to the pool. Instead, the application retains ownership for use in another + * i/o operation. + * + */ + KUSB_EXP BOOL KUSB_API OvlK_ReUse( + _in KOVL_HANDLE OverlappedK); + + /**@}*/ + +#endif + +#ifndef _LIBUSBK_STMK_FUNCTIONS + + /*! \addtogroup stmk + * @{ + */ + +//! Initializes a new uni-directional pipe stream. + /*! + * + * \param[out] StreamHandle + * On success, receives the new stream handle. + * + * \param[in] UsbHandle + * Usb handle to associate with this stream. + * + * \param[in] PipeID + * Endpoint address of USB pipe to associate with this stream. + * + * \param[in] MaxTransferSize + * Maximum number of bytes transferred at once. Larger transfers committed with the stream read/write + * functions are automatically split into multiple smaller chunks. + * + * \param[in] MaxPendingTransfers + * Maximum number of transfers allowed to be outstanding and the total number of transfer contexts that are + * allocated to the stream. + * + * \param[in] MaxPendingIO + * Maximum number of I/O requests the internal stream thread is allowed to have submit at any given time. + * (Pending I/O) + * + * \param[in] Callbacks + * Optional user callback functions. If specified, these callback functions will be executed in real time + * (from within the context of the internal stream thread) as transfers go through the various states. + * + * \param[in] Flags + * Additional stream flags. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \par + * When a stream is initialized, it validates input parameters and allocates the required memory for the + * transfer context array and transfer lists from a private memory heap. The stream is not started and no I/O + * requests are sent to the device until \ref StmK_Start is executed. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Init( + _out KSTM_HANDLE* StreamHandle, + _in KUSB_HANDLE UsbHandle, + _in UCHAR PipeID, + _in INT MaxTransferSize, + _in INT MaxPendingTransfers, + _in INT MaxPendingIO, + _inopt PKSTM_CALLBACK Callbacks, + _inopt KSTM_FLAG Flags); + +//! Frees resources allocated by a stream handle. + /*! + * + * \param[in] StreamHandle + * The stream handle to free. + * + * \returns TRUE. + * + * If the stream is currently started it is automatically stopped before its resources are freed. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Free( + _in KSTM_HANDLE StreamHandle); + +//! Starts the internal stream thread. + /*! + * + * \param[in] StreamHandle + * The stream to start. A stream handle is created with \ref StmK_Init. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \par + * When a stream is started, an internal thread is created for managing pipe I/O operations. If a + * \ref KSTM_CALLBACK::Started callback function is assgined, it is executed \b for each transfer context. + * (\b MaxPendingTransfers) See \ref StmK_Init. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Start( + _in KSTM_HANDLE StreamHandle); + +//! Stops the internal stream thread. + /*! + * + * \param[in] StreamHandle + * The stream to stop. + * + * \param[in] TimeoutCancelMS + * Number of milliseconds the internal stream thread should wait for pending I/O to complete before + * cancelling all pending requests. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Stop( + _in KSTM_HANDLE StreamHandle, + _in INT TimeoutCancelMS); + +//! Reads data from the stream buffer. + /*! + * + * \param[in] StreamHandle + * The stream to read. + * + * \param[out] Buffer + * A caller-allocated buffer that receives the data that is read. + * + * \param[in] Offset + * Read start offset of \c Buffer. + * + * \param[in] Length + * Size of \c Buffer. + * + * \param[out] TransferredLength + * On success, receives the actual number of bytes that were copied into \c Buffer. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * - Read Stream Operations: + * -# The internal stream thread will always try and keep reads pending as specified by \b MaxPendingIO in + * \ref StmK_Init. + * -# As the stream submits transfers, it increments the \b PendingIO and \b PendingTransfer counts. As it + * completes transfers, it decrements the \b PendingIO count. As the user processes transfers with + * \ref StmK_Read, it decrements the \b PendingTransfer count and release control of the transfer context + * back to the stream where it is re-used. + * -# When the pending I/O count reaches \c MaxPendingIO, the stream completes the oldest + * \b PendingTransfer and moves it into a FIFO complete where it awaits user processing via the + * \ref StmK_Read function. + * -# If the stream has not exhausted its MaxPendingTransfers count, another read request is submitted + * immediately to satisfy \b MaxPendingIO. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Read( + _in KSTM_HANDLE StreamHandle, + _out PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength); + +//! Writes data to the stream buffer. + /*! + * + * \param[in] StreamHandle + * The stream to write. + * + * \param[in] Buffer + * A caller-allocated buffer the data is written from. + * + * \param[in] Offset + * Write start offset of \c Buffer. + * + * \param[in] Length + * Number of bytes to copy into the stream buffer. + * + * \param[out] TransferredLength + * On success, receives the actual number of bytes that were copied into the stream buffer. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * - Write Stream Operations: + * -# The internal stream thread will always try and exhaust all pending transfers submitted by the user + * via \ref StmK_Write. + * -# As the user submits transfers via \ref StmK_Write, the \b PendingTransfer count is inceremented and + * transfers are added to a queued FIFO list where they await processing by the internal stream thread. + * -# While the queued FIFO list is not empty and \b PendingIO count is less than \b MaxPendingIO, The + * \b PendingIO count increments and the request is sent to the device. + * -# When a transfer completes, the internal pending I/O count is decremented and the transfers is moved + * back into the idle list where it can be reused again by subsequent \ref StmK_Write requests. + * + */ + KUSB_EXP BOOL KUSB_API StmK_Write( + _in KSTM_HANDLE StreamHandle, + _in PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength); + /**@}*/ + +#endif + +#ifndef _LIBUSBK_ISOK_FUNCTIONS + /*! \addtogroup isok + * @{ + */ + +//! Creates a new isochronous transfer context. + /*! + * + * \param[out] IsoContext + * Receives a new isochronous transfer context. + * + * \param[in] NumberOfPackets + * The number of \ref KISO_PACKET structures allocated to \c IsoContext. Assigned to + * \ref KISO_CONTEXT::NumberOfPackets. The \ref KISO_CONTEXT::NumberOfPackets field is assignable by + * \c IsoK_Init only and must not be changed by the user. + * + * \param[in] StartFrame + * The USB frame number this request must start on (or \b 0 for ASAP) and assigned to + * \ref KISO_CONTEXT::StartFrame. The \ref KISO_CONTEXT::StartFrame may be chamged by the user in subsequent + * request. For more information, see \ref KISO_CONTEXT::StartFrame. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c IsoK_Init is performs the following tasks in order: + * -# Allocates the \c IsoContext and the required \ref KISO_PACKET structures. + * -# Zero-initializes all ISO context memory. + * -# Assigns \b NumberOfPackets, \b PipeID, and \b StartFrame to \c IsoContext. + * + */ + KUSB_EXP BOOL KUSB_API IsoK_Init( + _out PKISO_CONTEXT* IsoContext, + _in INT NumberOfPackets, + _inopt INT StartFrame); + +//! Destroys an isochronous transfer context. + /*! + * \param[in] IsoContext + * A pointer to an isochronous transfer context created with \ref IsoK_Init. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + */ + KUSB_EXP BOOL KUSB_API IsoK_Free( + _in PKISO_CONTEXT IsoContext); + +//! Convenience function for setting the offset of all ISO packets of an isochronous transfer context. + /*! + * \param[in] IsoContext + * A pointer to an isochronous transfer context. + * + * \param[in] PacketSize + * The packet size used to calculate and assign the absolute data offset for each \ref KISO_PACKET in + * \c IsoContext. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c IsoK_SetPackets updates all \ref KISO_PACKET::Offset fields in a \ref KISO_CONTEXT so all offset are + * \c PacketSize apart. For example: + * - The offset of the first (0-index) packet is 0. + * - The offset of the second (1-index) packet is PacketSize. + * - The offset of the third (2-index) packet is PacketSize*2. + * + * \code + * for (packetIndex = 0; packetIndex < IsoContext->NumberOfPackets; packetIndex++) + * IsoContext->IsoPackets[packetIndex].Offset = packetIndex * PacketSize; + * \endcode + * + */ + KUSB_EXP BOOL KUSB_API IsoK_SetPackets( + _in PKISO_CONTEXT IsoContext, + _in INT PacketSize); + +//! Convenience function for setting all fields of a \ref KISO_PACKET. + /*! + * \param[in] IsoContext + * A pointer to an isochronous transfer context. + * + * \param[in] PacketIndex + * The packet index to set. + * + * \param[in] IsoPacket + * Pointer to a user allocated \c KISO_PACKET which is copied into the PKISO_CONTEXT::IsoPackets array at the + * specified index. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + */ + KUSB_EXP BOOL KUSB_API IsoK_SetPacket( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _in PKISO_PACKET IsoPacket); + +//! Convenience function for getting all fields of a \ref KISO_PACKET. + /*! + * \param[in] IsoContext + * A pointer to an isochronous transfer context. + * + * \param[in] PacketIndex + * The packet index to get. + * + * \param[out] IsoPacket + * Pointer to a user allocated \c KISO_PACKET which receives a copy of the ISO packet in the + * PKISO_CONTEXT::IsoPackets array at the specified index. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + */ + KUSB_EXP BOOL KUSB_API IsoK_GetPacket( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _out PKISO_PACKET IsoPacket); + +//! Convenience function for enumerating ISO packets of an isochronous transfer context. + /*! + * \param[in] IsoContext + * A pointer to an isochronous transfer context. + * + * \param[in] EnumPackets + * Pointer to a user supplied callback function which is executed for all ISO packets in \c IsoContext or + * until the user supplied callback function returns \c FALSE. + * + * \param[in] StartPacketIndex + * The zero-based ISO packet index to begin enumeration at. + * + * \param[in] UserState + * A user defined value which is passed as a parameter to the user supplied callback function. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + */ + KUSB_EXP BOOL KUSB_API IsoK_EnumPackets( + _in PKISO_CONTEXT IsoContext, + _in KISO_ENUM_PACKETS_CB* EnumPackets, + _inopt INT StartPacketIndex, + _inopt PVOID UserState); + +//! Convenience function for re-using an isochronous transfer context in a subsequent request. + /*! + * \param[in,out] IsoContext + * A pointer to an isochronous transfer context. + * + * \returns On success, TRUE. Otherwise FALSE. Use \c GetLastError() to get extended error information. + * + * \c IsoK_ReUse does the following: + * -# Zero-initializes the \b Length and \b Status fields of all \ref KISO_PACKET structures. + * -# Zero-initializes the \b StartFrame and \b ErrorCount of the \ref KISO_CONTEXT. + * + */ + KUSB_EXP BOOL KUSB_API IsoK_ReUse( + _ref PKISO_CONTEXT IsoContext); + + /*! @} */ + +#endif + +#ifdef __cplusplus +} +#endif + +#endif // _LIBUSBK_H__ diff --git a/Old Matlab Interface/includes/lusbk_dynapi.c b/Old Matlab Interface/includes/lusbk_dynapi.c new file mode 100644 index 00000000..3b414327 --- /dev/null +++ b/Old Matlab Interface/includes/lusbk_dynapi.c @@ -0,0 +1,1915 @@ +/*!******************************************************************** +libusbK - Multi-driver USB library. +Copyright (C) 2012 Travis Lee Robinson. All Rights Reserved. +libusb-win32.sourceforge.net + +Development : Travis Lee Robinson (libusbdotnet@gmail.com) +Testing : Xiaofan Chen (xiaofanc@gmail.com) + +At the discretion of the user of this library, this software may be +licensed under the terms of the GNU Public License v3 or a BSD-Style +license as outlined in the following files: +* LICENSE-gpl3.txt +* LICENSE-bsd.txt + +License files are located in a license folder at the root of source and +binary distributions. +********************************************************************!*/ + +#include +#include "libusbk.h" + +#define mLoadLibraryExA LoadLibraryExA +#define mFreeLibrary FreeLibrary + +HMODULE mLibusbK_ModuleHandle = NULL; + +VOID LibusbK_DynApi_Free(VOID); +INT LibusbK_DynApi_Init(_inopt LPCSTR DllFullPathName); + +// Function typedefs: + +typedef VOID KUSB_API LibK_GetVersion_T(_out PKLIB_VERSION Version); + +typedef KLIB_USER_CONTEXT KUSB_API LibK_GetContext_T( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType); + +typedef BOOL KUSB_API LibK_SetContext_T( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue); + +typedef BOOL KUSB_API LibK_SetCleanupCallback_T( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_HANDLE_CLEANUP_CB* CleanupCB); + +typedef BOOL KUSB_API LibK_LoadDriverAPI_T( + _out PKUSB_DRIVER_API DriverAPI, + _in INT DriverID); + +typedef BOOL KUSB_API LibK_CopyDriverAPI_T( + _out PKUSB_DRIVER_API DriverAPI, + _in KUSB_HANDLE UsbHandle); + +typedef BOOL KUSB_API LibK_GetProcAddress_T( + _out KPROC* ProcAddress, + _in INT DriverID, + _in INT FunctionID); + +typedef BOOL KUSB_API LibK_SetDefaultContext_T( + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue); + +typedef KLIB_USER_CONTEXT KUSB_API LibK_GetDefaultContext_T( + _in KLIB_HANDLE_TYPE HandleType); + +typedef BOOL KUSB_API LibK_Context_Init_T( + _inopt HANDLE Heap, + _in PVOID Reserved); + +typedef VOID KUSB_API LibK_Context_Free_T(VOID); + +typedef BOOL KUSB_API UsbK_Init_T ( + _out KUSB_HANDLE* InterfaceHandle, + _in KLST_DEVINFO_HANDLE DevInfo); + +typedef BOOL KUSB_API UsbK_Free_T ( + _in KUSB_HANDLE InterfaceHandle); + +typedef BOOL KUSB_API UsbK_ClaimInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API UsbK_ReleaseInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API UsbK_SetAltInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _in UCHAR AltSettingNumber); + +typedef BOOL KUSB_API UsbK_GetAltInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _out PUCHAR AltSettingNumber); + +typedef BOOL KUSB_API UsbK_GetDescriptor_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR DescriptorType, + _in UCHAR Index, + _in USHORT LanguageID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred); + +typedef BOOL KUSB_API UsbK_ControlTransfer_T ( + _in KUSB_HANDLE InterfaceHandle, + _in WINUSB_SETUP_PACKET SetupPacket, + _refopt PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API UsbK_SetPowerPolicy_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +typedef BOOL KUSB_API UsbK_GetPowerPolicy_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +typedef BOOL KUSB_API UsbK_SetConfiguration_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR ConfigurationNumber); + +typedef BOOL KUSB_API UsbK_GetConfiguration_T ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR ConfigurationNumber); + +typedef BOOL KUSB_API UsbK_ResetDevice_T ( + _in KUSB_HANDLE InterfaceHandle); + +typedef BOOL KUSB_API UsbK_Initialize_T ( + _in HANDLE DeviceHandle, + _out KUSB_HANDLE* InterfaceHandle); + +typedef BOOL KUSB_API UsbK_SelectInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex); + +typedef BOOL KUSB_API UsbK_GetAssociatedInterface_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AssociatedInterfaceIndex, + _out KUSB_HANDLE* AssociatedInterfaceHandle); + +typedef BOOL KUSB_API UsbK_Clone_T ( + _in KUSB_HANDLE InterfaceHandle, + _out KUSB_HANDLE* DstInterfaceHandle); + +typedef BOOL KUSB_API UsbK_QueryInterfaceSettings_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingIndex, + _out PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor); + +typedef BOOL KUSB_API UsbK_QueryDeviceInformation_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT InformationType, + _ref PUINT BufferLength, + _ref PVOID Buffer); + +typedef BOOL KUSB_API UsbK_SetCurrentAlternateSetting_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber); + +typedef BOOL KUSB_API UsbK_GetCurrentAlternateSetting_T ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR AltSettingNumber); + +typedef BOOL KUSB_API UsbK_QueryPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber, + _in UCHAR PipeIndex, + _out PWINUSB_PIPE_INFORMATION PipeInformation); + +typedef BOOL KUSB_API UsbK_SetPipePolicy_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value); + +typedef BOOL KUSB_API UsbK_GetPipePolicy_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value); + +typedef BOOL KUSB_API UsbK_ReadPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API UsbK_WritePipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped); + +typedef BOOL KUSB_API UsbK_ResetPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API UsbK_AbortPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API UsbK_FlushPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID); + +typedef BOOL KUSB_API UsbK_IsoReadPipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +typedef BOOL KUSB_API UsbK_IsoWritePipe_T ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext); + +typedef BOOL KUSB_API UsbK_GetCurrentFrameNumber_T ( + _in KUSB_HANDLE InterfaceHandle, + _out PUINT FrameNumber); + +typedef BOOL KUSB_API UsbK_GetOverlappedResult_T ( + _in KUSB_HANDLE InterfaceHandle, + _in LPOVERLAPPED Overlapped, + _out PUINT lpNumberOfBytesTransferred, + _in BOOL bWait); + +typedef BOOL KUSB_API UsbK_GetProperty_T ( + _in KUSB_HANDLE InterfaceHandle, + _in KUSB_PROPERTY PropertyType, + _ref PUINT PropertySize, + _out PVOID Value); + +typedef BOOL KUSB_API LstK_Init_T( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags); + +typedef BOOL KUSB_API LstK_InitEx_T( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags, + _in PKLST_PATTERN_MATCH PatternMatch); + +typedef BOOL KUSB_API LstK_Free_T( + _in KLST_HANDLE DeviceList); + +typedef BOOL KUSB_API LstK_Enumerate_T( + _in KLST_HANDLE DeviceList, + _in KLST_ENUM_DEVINFO_CB* EnumDevListCB, + _inopt PVOID Context); + +typedef BOOL KUSB_API LstK_Current_T( + _in KLST_HANDLE DeviceList, + _out KLST_DEVINFO_HANDLE* DeviceInfo); + +typedef BOOL KUSB_API LstK_MoveNext_T( + _in KLST_HANDLE DeviceList, + _outopt KLST_DEVINFO_HANDLE* DeviceInfo); + +typedef VOID KUSB_API LstK_MoveReset_T( + _in KLST_HANDLE DeviceList); + +typedef BOOL KUSB_API LstK_FindByVidPid_T( + _in KLST_HANDLE DeviceList, + _in INT Vid, + _in INT Pid, + _out KLST_DEVINFO_HANDLE* DeviceInfo); + +typedef BOOL KUSB_API LstK_Count_T( + _in KLST_HANDLE DeviceList, + _ref PUINT Count); + +typedef BOOL KUSB_API HotK_Init_T( + _out KHOT_HANDLE* Handle, + _ref PKHOT_PARAMS InitParams); + +typedef BOOL KUSB_API HotK_Free_T( + _in KHOT_HANDLE Handle); + +typedef VOID KUSB_API HotK_FreeAll_T(VOID); + +typedef BOOL KUSB_API OvlK_Acquire_T( + _out KOVL_HANDLE* OverlappedK, + _in KOVL_POOL_HANDLE PoolHandle); + +typedef BOOL KUSB_API OvlK_Release_T( + _in KOVL_HANDLE OverlappedK); + +typedef BOOL KUSB_API OvlK_Init_T ( + _out KOVL_POOL_HANDLE* PoolHandle, + _in KUSB_HANDLE UsbHandle, + _in INT MaxOverlappedCount, + _inopt KOVL_POOL_FLAG Flags); + +typedef BOOL KUSB_API OvlK_Free_T( + _in KOVL_POOL_HANDLE PoolHandle); + +typedef HANDLE KUSB_API OvlK_GetEventHandle_T( + _in KOVL_HANDLE OverlappedK); + +typedef BOOL KUSB_API OvlK_Wait_T( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API OvlK_WaitOldest_T( + _in KOVL_POOL_HANDLE PoolHandle, + _outopt KOVL_HANDLE* OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API OvlK_WaitOrCancel_T( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API OvlK_WaitAndRelease_T( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API OvlK_IsComplete_T( + _in KOVL_HANDLE OverlappedK); + +typedef BOOL KUSB_API OvlK_ReUse_T( + _in KOVL_HANDLE OverlappedK); + +typedef BOOL KUSB_API StmK_Init_T( + _out KSTM_HANDLE* StreamHandle, + _in KUSB_HANDLE UsbHandle, + _in UCHAR PipeID, + _in INT MaxTransferSize, + _in INT MaxPendingTransfers, + _in INT MaxPendingIO, + _inopt PKSTM_CALLBACK Callbacks, + _inopt KSTM_FLAG Flags); + +typedef BOOL KUSB_API StmK_Free_T( + _in KSTM_HANDLE StreamHandle); + +typedef BOOL KUSB_API StmK_Start_T( + _in KSTM_HANDLE StreamHandle); + +typedef BOOL KUSB_API StmK_Stop_T( + _in KSTM_HANDLE StreamHandle, + _in INT TimeoutCancelMS); + +typedef BOOL KUSB_API StmK_Read_T( + _in KSTM_HANDLE StreamHandle, + _out PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API StmK_Write_T( + _in KSTM_HANDLE StreamHandle, + _in PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength); + +typedef BOOL KUSB_API IsoK_Init_T( + _out PKISO_CONTEXT* IsoContext, + _in INT NumberOfPackets, + _inopt INT StartFrame); + +typedef BOOL KUSB_API IsoK_Free_T( + _in PKISO_CONTEXT IsoContext); + +typedef BOOL KUSB_API IsoK_SetPackets_T( + _in PKISO_CONTEXT IsoContext, + _in INT PacketSize); + +typedef BOOL KUSB_API IsoK_SetPacket_T( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _in PKISO_PACKET IsoPacket); + +typedef BOOL KUSB_API IsoK_GetPacket_T( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _out PKISO_PACKET IsoPacket); + +typedef BOOL KUSB_API IsoK_EnumPackets_T( + _in PKISO_CONTEXT IsoContext, + _in KISO_ENUM_PACKETS_CB* EnumPackets, + _inopt INT StartPacketIndex, + _inopt PVOID UserState); + +typedef BOOL KUSB_API IsoK_ReUse_T( + _ref PKISO_CONTEXT IsoContext); + + + +/////////////////////////////////////////////////////////////////////// + +// Function pointers: + +static LibK_GetVersion_T* pLibK_GetVersion = NULL; + +static LibK_GetContext_T* pLibK_GetContext = NULL; + +static LibK_SetContext_T* pLibK_SetContext = NULL; + +static LibK_SetCleanupCallback_T* pLibK_SetCleanupCallback = NULL; + +static LibK_LoadDriverAPI_T* pLibK_LoadDriverAPI = NULL; + +static LibK_CopyDriverAPI_T* pLibK_CopyDriverAPI = NULL; + +static LibK_GetProcAddress_T* pLibK_GetProcAddress = NULL; + +static LibK_SetDefaultContext_T* pLibK_SetDefaultContext = NULL; + +static LibK_GetDefaultContext_T* pLibK_GetDefaultContext = NULL; + +static LibK_Context_Init_T* pLibK_Context_Init = NULL; + +static LibK_Context_Free_T* pLibK_Context_Free = NULL; + +static UsbK_Init_T* pUsbK_Init = NULL; + +static UsbK_Free_T* pUsbK_Free = NULL; + +static UsbK_ClaimInterface_T* pUsbK_ClaimInterface = NULL; + +static UsbK_ReleaseInterface_T* pUsbK_ReleaseInterface = NULL; + +static UsbK_SetAltInterface_T* pUsbK_SetAltInterface = NULL; + +static UsbK_GetAltInterface_T* pUsbK_GetAltInterface = NULL; + +static UsbK_GetDescriptor_T* pUsbK_GetDescriptor = NULL; + +static UsbK_ControlTransfer_T* pUsbK_ControlTransfer = NULL; + +static UsbK_SetPowerPolicy_T* pUsbK_SetPowerPolicy = NULL; + +static UsbK_GetPowerPolicy_T* pUsbK_GetPowerPolicy = NULL; + +static UsbK_SetConfiguration_T* pUsbK_SetConfiguration = NULL; + +static UsbK_GetConfiguration_T* pUsbK_GetConfiguration = NULL; + +static UsbK_ResetDevice_T* pUsbK_ResetDevice = NULL; + +static UsbK_Initialize_T* pUsbK_Initialize = NULL; + +static UsbK_SelectInterface_T* pUsbK_SelectInterface = NULL; + +static UsbK_GetAssociatedInterface_T* pUsbK_GetAssociatedInterface = NULL; + +static UsbK_Clone_T* pUsbK_Clone = NULL; + +static UsbK_QueryInterfaceSettings_T* pUsbK_QueryInterfaceSettings = NULL; + +static UsbK_QueryDeviceInformation_T* pUsbK_QueryDeviceInformation = NULL; + +static UsbK_SetCurrentAlternateSetting_T* pUsbK_SetCurrentAlternateSetting = NULL; + +static UsbK_GetCurrentAlternateSetting_T* pUsbK_GetCurrentAlternateSetting = NULL; + +static UsbK_QueryPipe_T* pUsbK_QueryPipe = NULL; + +static UsbK_SetPipePolicy_T* pUsbK_SetPipePolicy = NULL; + +static UsbK_GetPipePolicy_T* pUsbK_GetPipePolicy = NULL; + +static UsbK_ReadPipe_T* pUsbK_ReadPipe = NULL; + +static UsbK_WritePipe_T* pUsbK_WritePipe = NULL; + +static UsbK_ResetPipe_T* pUsbK_ResetPipe = NULL; + +static UsbK_AbortPipe_T* pUsbK_AbortPipe = NULL; + +static UsbK_FlushPipe_T* pUsbK_FlushPipe = NULL; + +static UsbK_IsoReadPipe_T* pUsbK_IsoReadPipe = NULL; + +static UsbK_IsoWritePipe_T* pUsbK_IsoWritePipe = NULL; + +static UsbK_GetCurrentFrameNumber_T* pUsbK_GetCurrentFrameNumber = NULL; + +static UsbK_GetOverlappedResult_T* pUsbK_GetOverlappedResult = NULL; + +static UsbK_GetProperty_T* pUsbK_GetProperty = NULL; + +static LstK_Init_T* pLstK_Init = NULL; + +static LstK_InitEx_T* pLstK_InitEx = NULL; + +static LstK_Free_T* pLstK_Free = NULL; + +static LstK_Enumerate_T* pLstK_Enumerate = NULL; + +static LstK_Current_T* pLstK_Current = NULL; + +static LstK_MoveNext_T* pLstK_MoveNext = NULL; + +static LstK_MoveReset_T* pLstK_MoveReset = NULL; + +static LstK_FindByVidPid_T* pLstK_FindByVidPid = NULL; + +static LstK_Count_T* pLstK_Count = NULL; + +static HotK_Init_T* pHotK_Init = NULL; + +static HotK_Free_T* pHotK_Free = NULL; + +static HotK_FreeAll_T* pHotK_FreeAll = NULL; + +static OvlK_Acquire_T* pOvlK_Acquire = NULL; + +static OvlK_Release_T* pOvlK_Release = NULL; + +static OvlK_Init_T* pOvlK_Init = NULL; + +static OvlK_Free_T* pOvlK_Free = NULL; + +static OvlK_GetEventHandle_T* pOvlK_GetEventHandle = NULL; + +static OvlK_Wait_T* pOvlK_Wait = NULL; + +static OvlK_WaitOldest_T* pOvlK_WaitOldest = NULL; + +static OvlK_WaitOrCancel_T* pOvlK_WaitOrCancel = NULL; + +static OvlK_WaitAndRelease_T* pOvlK_WaitAndRelease = NULL; + +static OvlK_IsComplete_T* pOvlK_IsComplete = NULL; + +static OvlK_ReUse_T* pOvlK_ReUse = NULL; + +static StmK_Init_T* pStmK_Init = NULL; + +static StmK_Free_T* pStmK_Free = NULL; + +static StmK_Start_T* pStmK_Start = NULL; + +static StmK_Stop_T* pStmK_Stop = NULL; + +static StmK_Read_T* pStmK_Read = NULL; + +static StmK_Write_T* pStmK_Write = NULL; + +static IsoK_Init_T* pIsoK_Init = NULL; + +static IsoK_Free_T* pIsoK_Free = NULL; + +static IsoK_SetPackets_T* pIsoK_SetPackets = NULL; + +static IsoK_SetPacket_T* pIsoK_SetPacket = NULL; + +static IsoK_GetPacket_T* pIsoK_GetPacket = NULL; + +static IsoK_EnumPackets_T* pIsoK_EnumPackets = NULL; + +static IsoK_ReUse_T* pIsoK_ReUse = NULL; + + + +/////////////////////////////////////////////////////////////////////// + + +VOID LibusbK_DynApi_Free(VOID) +{ + if (mLibusbK_ModuleHandle) + { + mFreeLibrary(mLibusbK_ModuleHandle); + mLibusbK_ModuleHandle = NULL; + + // Set all function pointers to null: + + pLibK_GetVersion = NULL; + + pLibK_GetContext = NULL; + + pLibK_SetContext = NULL; + + pLibK_SetCleanupCallback = NULL; + + pLibK_LoadDriverAPI = NULL; + + pLibK_CopyDriverAPI = NULL; + + pLibK_GetProcAddress = NULL; + + pLibK_SetDefaultContext = NULL; + + pLibK_GetDefaultContext = NULL; + + pLibK_Context_Init = NULL; + + pLibK_Context_Free = NULL; + + pUsbK_Init = NULL; + + pUsbK_Free = NULL; + + pUsbK_ClaimInterface = NULL; + + pUsbK_ReleaseInterface = NULL; + + pUsbK_SetAltInterface = NULL; + + pUsbK_GetAltInterface = NULL; + + pUsbK_GetDescriptor = NULL; + + pUsbK_ControlTransfer = NULL; + + pUsbK_SetPowerPolicy = NULL; + + pUsbK_GetPowerPolicy = NULL; + + pUsbK_SetConfiguration = NULL; + + pUsbK_GetConfiguration = NULL; + + pUsbK_ResetDevice = NULL; + + pUsbK_Initialize = NULL; + + pUsbK_SelectInterface = NULL; + + pUsbK_GetAssociatedInterface = NULL; + + pUsbK_Clone = NULL; + + pUsbK_QueryInterfaceSettings = NULL; + + pUsbK_QueryDeviceInformation = NULL; + + pUsbK_SetCurrentAlternateSetting = NULL; + + pUsbK_GetCurrentAlternateSetting = NULL; + + pUsbK_QueryPipe = NULL; + + pUsbK_SetPipePolicy = NULL; + + pUsbK_GetPipePolicy = NULL; + + pUsbK_ReadPipe = NULL; + + pUsbK_WritePipe = NULL; + + pUsbK_ResetPipe = NULL; + + pUsbK_AbortPipe = NULL; + + pUsbK_FlushPipe = NULL; + + pUsbK_IsoReadPipe = NULL; + + pUsbK_IsoWritePipe = NULL; + + pUsbK_GetCurrentFrameNumber = NULL; + + pUsbK_GetOverlappedResult = NULL; + + pUsbK_GetProperty = NULL; + + pLstK_Init = NULL; + + pLstK_InitEx = NULL; + + pLstK_Free = NULL; + + pLstK_Enumerate = NULL; + + pLstK_Current = NULL; + + pLstK_MoveNext = NULL; + + pLstK_MoveReset = NULL; + + pLstK_FindByVidPid = NULL; + + pLstK_Count = NULL; + + pHotK_Init = NULL; + + pHotK_Free = NULL; + + pHotK_FreeAll = NULL; + + pOvlK_Acquire = NULL; + + pOvlK_Release = NULL; + + pOvlK_Init = NULL; + + pOvlK_Free = NULL; + + pOvlK_GetEventHandle = NULL; + + pOvlK_Wait = NULL; + + pOvlK_WaitOldest = NULL; + + pOvlK_WaitOrCancel = NULL; + + pOvlK_WaitAndRelease = NULL; + + pOvlK_IsComplete = NULL; + + pOvlK_ReUse = NULL; + + pStmK_Init = NULL; + + pStmK_Free = NULL; + + pStmK_Start = NULL; + + pStmK_Stop = NULL; + + pStmK_Read = NULL; + + pStmK_Write = NULL; + + pIsoK_Init = NULL; + + pIsoK_Free = NULL; + + pIsoK_SetPackets = NULL; + + pIsoK_SetPacket = NULL; + + pIsoK_GetPacket = NULL; + + pIsoK_EnumPackets = NULL; + + pIsoK_ReUse = NULL; + + + + /////////////////////////////////////////////////////////////////////// + } +} + +INT LibusbK_DynApi_Init(_inopt LPCSTR DllFullPathName) +{ + LPCSTR dllFullPathName = (DllFullPathName == NULL) ? "libusbK.dll" : DllFullPathName; + INT funcLoadFailCount = 0; + + if (mLibusbK_ModuleHandle) LibusbK_DynApi_Free(); + + if (DllFullPathName) + mLibusbK_ModuleHandle = mLoadLibraryExA(dllFullPathName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); + else + mLibusbK_ModuleHandle = mLoadLibraryExA(dllFullPathName, NULL, 0); + + if (mLibusbK_ModuleHandle == NULL) return -1; + + + // Function loads: + + if ((pLibK_GetVersion = (LibK_GetVersion_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_GetVersion")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_GetVersion.\n"); + } + + if ((pLibK_GetContext = (LibK_GetContext_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_GetContext")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_GetContext.\n"); + } + + if ((pLibK_SetContext = (LibK_SetContext_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_SetContext")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_SetContext.\n"); + } + + if ((pLibK_SetCleanupCallback = (LibK_SetCleanupCallback_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_SetCleanupCallback")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_SetCleanupCallback.\n"); + } + + if ((pLibK_LoadDriverAPI = (LibK_LoadDriverAPI_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_LoadDriverAPI")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_LoadDriverAPI.\n"); + } + + if ((pLibK_CopyDriverAPI = (LibK_CopyDriverAPI_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_CopyDriverAPI")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_CopyDriverAPI.\n"); + } + + if ((pLibK_GetProcAddress = (LibK_GetProcAddress_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_GetProcAddress")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_GetProcAddress.\n"); + } + + if ((pLibK_SetDefaultContext = (LibK_SetDefaultContext_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_SetDefaultContext")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_SetDefaultContext.\n"); + } + + if ((pLibK_GetDefaultContext = (LibK_GetDefaultContext_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_GetDefaultContext")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_GetDefaultContext.\n"); + } + + if ((pLibK_Context_Init = (LibK_Context_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_Context_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_Context_Init.\n"); + } + + if ((pLibK_Context_Free = (LibK_Context_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "LibK_Context_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LibK_Context_Free.\n"); + } + + if ((pUsbK_Init = (UsbK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_Init.\n"); + } + + if ((pUsbK_Free = (UsbK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_Free.\n"); + } + + if ((pUsbK_ClaimInterface = (UsbK_ClaimInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ClaimInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ClaimInterface.\n"); + } + + if ((pUsbK_ReleaseInterface = (UsbK_ReleaseInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ReleaseInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ReleaseInterface.\n"); + } + + if ((pUsbK_SetAltInterface = (UsbK_SetAltInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SetAltInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SetAltInterface.\n"); + } + + if ((pUsbK_GetAltInterface = (UsbK_GetAltInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetAltInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetAltInterface.\n"); + } + + if ((pUsbK_GetDescriptor = (UsbK_GetDescriptor_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetDescriptor")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetDescriptor.\n"); + } + + if ((pUsbK_ControlTransfer = (UsbK_ControlTransfer_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ControlTransfer")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ControlTransfer.\n"); + } + + if ((pUsbK_SetPowerPolicy = (UsbK_SetPowerPolicy_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SetPowerPolicy")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SetPowerPolicy.\n"); + } + + if ((pUsbK_GetPowerPolicy = (UsbK_GetPowerPolicy_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetPowerPolicy")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetPowerPolicy.\n"); + } + + if ((pUsbK_SetConfiguration = (UsbK_SetConfiguration_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SetConfiguration")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SetConfiguration.\n"); + } + + if ((pUsbK_GetConfiguration = (UsbK_GetConfiguration_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetConfiguration")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetConfiguration.\n"); + } + + if ((pUsbK_ResetDevice = (UsbK_ResetDevice_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ResetDevice")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ResetDevice.\n"); + } + + if ((pUsbK_Initialize = (UsbK_Initialize_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_Initialize")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_Initialize.\n"); + } + + if ((pUsbK_SelectInterface = (UsbK_SelectInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SelectInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SelectInterface.\n"); + } + + if ((pUsbK_GetAssociatedInterface = (UsbK_GetAssociatedInterface_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetAssociatedInterface")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetAssociatedInterface.\n"); + } + + if ((pUsbK_Clone = (UsbK_Clone_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_Clone")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_Clone.\n"); + } + + if ((pUsbK_QueryInterfaceSettings = (UsbK_QueryInterfaceSettings_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_QueryInterfaceSettings")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_QueryInterfaceSettings.\n"); + } + + if ((pUsbK_QueryDeviceInformation = (UsbK_QueryDeviceInformation_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_QueryDeviceInformation")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_QueryDeviceInformation.\n"); + } + + if ((pUsbK_SetCurrentAlternateSetting = (UsbK_SetCurrentAlternateSetting_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SetCurrentAlternateSetting")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SetCurrentAlternateSetting.\n"); + } + + if ((pUsbK_GetCurrentAlternateSetting = (UsbK_GetCurrentAlternateSetting_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetCurrentAlternateSetting")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetCurrentAlternateSetting.\n"); + } + + if ((pUsbK_QueryPipe = (UsbK_QueryPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_QueryPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_QueryPipe.\n"); + } + + if ((pUsbK_SetPipePolicy = (UsbK_SetPipePolicy_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_SetPipePolicy")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_SetPipePolicy.\n"); + } + + if ((pUsbK_GetPipePolicy = (UsbK_GetPipePolicy_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetPipePolicy")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetPipePolicy.\n"); + } + + if ((pUsbK_ReadPipe = (UsbK_ReadPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ReadPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ReadPipe.\n"); + } + + if ((pUsbK_WritePipe = (UsbK_WritePipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_WritePipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_WritePipe.\n"); + } + + if ((pUsbK_ResetPipe = (UsbK_ResetPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_ResetPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_ResetPipe.\n"); + } + + if ((pUsbK_AbortPipe = (UsbK_AbortPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_AbortPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_AbortPipe.\n"); + } + + if ((pUsbK_FlushPipe = (UsbK_FlushPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_FlushPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_FlushPipe.\n"); + } + + if ((pUsbK_IsoReadPipe = (UsbK_IsoReadPipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_IsoReadPipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_IsoReadPipe.\n"); + } + + if ((pUsbK_IsoWritePipe = (UsbK_IsoWritePipe_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_IsoWritePipe")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_IsoWritePipe.\n"); + } + + if ((pUsbK_GetCurrentFrameNumber = (UsbK_GetCurrentFrameNumber_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetCurrentFrameNumber")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetCurrentFrameNumber.\n"); + } + + if ((pUsbK_GetOverlappedResult = (UsbK_GetOverlappedResult_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetOverlappedResult")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetOverlappedResult.\n"); + } + + if ((pUsbK_GetProperty = (UsbK_GetProperty_T*)GetProcAddress(mLibusbK_ModuleHandle, "UsbK_GetProperty")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function UsbK_GetProperty.\n"); + } + + if ((pLstK_Init = (LstK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_Init.\n"); + } + + if ((pLstK_InitEx = (LstK_InitEx_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_InitEx")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_InitEx.\n"); + } + + if ((pLstK_Free = (LstK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_Free.\n"); + } + + if ((pLstK_Enumerate = (LstK_Enumerate_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_Enumerate")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_Enumerate.\n"); + } + + if ((pLstK_Current = (LstK_Current_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_Current")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_Current.\n"); + } + + if ((pLstK_MoveNext = (LstK_MoveNext_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_MoveNext")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_MoveNext.\n"); + } + + if ((pLstK_MoveReset = (LstK_MoveReset_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_MoveReset")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_MoveReset.\n"); + } + + if ((pLstK_FindByVidPid = (LstK_FindByVidPid_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_FindByVidPid")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_FindByVidPid.\n"); + } + + if ((pLstK_Count = (LstK_Count_T*)GetProcAddress(mLibusbK_ModuleHandle, "LstK_Count")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function LstK_Count.\n"); + } + + if ((pHotK_Init = (HotK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "HotK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function HotK_Init.\n"); + } + + if ((pHotK_Free = (HotK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "HotK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function HotK_Free.\n"); + } + + if ((pHotK_FreeAll = (HotK_FreeAll_T*)GetProcAddress(mLibusbK_ModuleHandle, "HotK_FreeAll")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function HotK_FreeAll.\n"); + } + + if ((pOvlK_Acquire = (OvlK_Acquire_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_Acquire")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_Acquire.\n"); + } + + if ((pOvlK_Release = (OvlK_Release_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_Release")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_Release.\n"); + } + + if ((pOvlK_Init = (OvlK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_Init.\n"); + } + + if ((pOvlK_Free = (OvlK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_Free.\n"); + } + + if ((pOvlK_GetEventHandle = (OvlK_GetEventHandle_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_GetEventHandle")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_GetEventHandle.\n"); + } + + if ((pOvlK_Wait = (OvlK_Wait_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_Wait")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_Wait.\n"); + } + + if ((pOvlK_WaitOldest = (OvlK_WaitOldest_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_WaitOldest")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_WaitOldest.\n"); + } + + if ((pOvlK_WaitOrCancel = (OvlK_WaitOrCancel_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_WaitOrCancel")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_WaitOrCancel.\n"); + } + + if ((pOvlK_WaitAndRelease = (OvlK_WaitAndRelease_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_WaitAndRelease")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_WaitAndRelease.\n"); + } + + if ((pOvlK_IsComplete = (OvlK_IsComplete_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_IsComplete")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_IsComplete.\n"); + } + + if ((pOvlK_ReUse = (OvlK_ReUse_T*)GetProcAddress(mLibusbK_ModuleHandle, "OvlK_ReUse")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function OvlK_ReUse.\n"); + } + + if ((pStmK_Init = (StmK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Init.\n"); + } + + if ((pStmK_Free = (StmK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Free.\n"); + } + + if ((pStmK_Start = (StmK_Start_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Start")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Start.\n"); + } + + if ((pStmK_Stop = (StmK_Stop_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Stop")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Stop.\n"); + } + + if ((pStmK_Read = (StmK_Read_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Read")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Read.\n"); + } + + if ((pStmK_Write = (StmK_Write_T*)GetProcAddress(mLibusbK_ModuleHandle, "StmK_Write")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function StmK_Write.\n"); + } + + if ((pIsoK_Init = (IsoK_Init_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_Init")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_Init.\n"); + } + + if ((pIsoK_Free = (IsoK_Free_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_Free")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_Free.\n"); + } + + if ((pIsoK_SetPackets = (IsoK_SetPackets_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_SetPackets")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_SetPackets.\n"); + } + + if ((pIsoK_SetPacket = (IsoK_SetPacket_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_SetPacket")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_SetPacket.\n"); + } + + if ((pIsoK_GetPacket = (IsoK_GetPacket_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_GetPacket")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_GetPacket.\n"); + } + + if ((pIsoK_EnumPackets = (IsoK_EnumPackets_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_EnumPackets")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_EnumPackets.\n"); + } + + if ((pIsoK_ReUse = (IsoK_ReUse_T*)GetProcAddress(mLibusbK_ModuleHandle, "IsoK_ReUse")) == NULL) + { + funcLoadFailCount++; + OutputDebugStringA("Failed loading function IsoK_ReUse.\n"); + } + + + + /////////////////////////////////////////////////////////////////////// + + return funcLoadFailCount; +} + +// Function wrappers: + +KUSB_EXP VOID KUSB_API LibK_GetVersion(_out PKLIB_VERSION Version) +{ + pLibK_GetVersion(Version); +} + +KUSB_EXP KLIB_USER_CONTEXT KUSB_API LibK_GetContext( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType) +{ + return pLibK_GetContext(Handle, HandleType); +} + +KUSB_EXP BOOL KUSB_API LibK_SetContext( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue) +{ + return pLibK_SetContext(Handle, HandleType, ContextValue); +} + +KUSB_EXP BOOL KUSB_API LibK_SetCleanupCallback( + _in KLIB_HANDLE Handle, + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_HANDLE_CLEANUP_CB* CleanupCB) +{ + return pLibK_SetCleanupCallback(Handle, HandleType, CleanupCB); +} + +KUSB_EXP BOOL KUSB_API LibK_LoadDriverAPI( + _out PKUSB_DRIVER_API DriverAPI, + _in INT DriverID) +{ + return pLibK_LoadDriverAPI(DriverAPI, DriverID); +} + +KUSB_EXP BOOL KUSB_API LibK_CopyDriverAPI( + _out PKUSB_DRIVER_API DriverAPI, + _in KUSB_HANDLE UsbHandle) +{ + return pLibK_CopyDriverAPI(DriverAPI, UsbHandle); +} + +KUSB_EXP BOOL KUSB_API LibK_GetProcAddress( + _out KPROC* ProcAddress, + _in INT DriverID, + _in INT FunctionID) +{ + return pLibK_GetProcAddress(ProcAddress, DriverID, FunctionID); +} + +KUSB_EXP BOOL KUSB_API LibK_SetDefaultContext( + _in KLIB_HANDLE_TYPE HandleType, + _in KLIB_USER_CONTEXT ContextValue) +{ + return pLibK_SetDefaultContext(HandleType, ContextValue); +} + +KUSB_EXP KLIB_USER_CONTEXT KUSB_API LibK_GetDefaultContext( + _in KLIB_HANDLE_TYPE HandleType) +{ + return pLibK_GetDefaultContext(HandleType); +} + +KUSB_EXP BOOL KUSB_API LibK_Context_Init( + _inopt HANDLE Heap, + _in PVOID Reserved) +{ + return pLibK_Context_Init(Heap, Reserved); +} + +KUSB_EXP VOID KUSB_API LibK_Context_Free(VOID) +{ + pLibK_Context_Free(); +} + +KUSB_EXP BOOL KUSB_API UsbK_Init ( + _out KUSB_HANDLE* InterfaceHandle, + _in KLST_DEVINFO_HANDLE DevInfo) +{ + return pUsbK_Init(InterfaceHandle, DevInfo); +} + +KUSB_EXP BOOL KUSB_API UsbK_Free ( + _in KUSB_HANDLE InterfaceHandle) +{ + return pUsbK_Free(InterfaceHandle); +} + +KUSB_EXP BOOL KUSB_API UsbK_ClaimInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex) +{ + return pUsbK_ClaimInterface(InterfaceHandle, NumberOrIndex, IsIndex); +} + +KUSB_EXP BOOL KUSB_API UsbK_ReleaseInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex) +{ + return pUsbK_ReleaseInterface(InterfaceHandle, NumberOrIndex, IsIndex); +} + +KUSB_EXP BOOL KUSB_API UsbK_SetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _in UCHAR AltSettingNumber) +{ + return pUsbK_SetAltInterface(InterfaceHandle, NumberOrIndex, IsIndex, AltSettingNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetAltInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex, + _out PUCHAR AltSettingNumber) +{ + return pUsbK_GetAltInterface(InterfaceHandle, NumberOrIndex, IsIndex, AltSettingNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetDescriptor ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR DescriptorType, + _in UCHAR Index, + _in USHORT LanguageID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred) +{ + return pUsbK_GetDescriptor(InterfaceHandle, DescriptorType, Index, LanguageID, Buffer, BufferLength, LengthTransferred); +} + +KUSB_EXP BOOL KUSB_API UsbK_ControlTransfer ( + _in KUSB_HANDLE InterfaceHandle, + _in WINUSB_SETUP_PACKET SetupPacket, + _refopt PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped) +{ + return pUsbK_ControlTransfer(InterfaceHandle, SetupPacket, Buffer, BufferLength, LengthTransferred, Overlapped); +} + +KUSB_EXP BOOL KUSB_API UsbK_SetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value) +{ + return pUsbK_SetPowerPolicy(InterfaceHandle, PolicyType, ValueLength, Value); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetPowerPolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value) +{ + return pUsbK_GetPowerPolicy(InterfaceHandle, PolicyType, ValueLength, Value); +} + +KUSB_EXP BOOL KUSB_API UsbK_SetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR ConfigurationNumber) +{ + return pUsbK_SetConfiguration(InterfaceHandle, ConfigurationNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetConfiguration ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR ConfigurationNumber) +{ + return pUsbK_GetConfiguration(InterfaceHandle, ConfigurationNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_ResetDevice ( + _in KUSB_HANDLE InterfaceHandle) +{ + return pUsbK_ResetDevice(InterfaceHandle); +} + +KUSB_EXP BOOL KUSB_API UsbK_Initialize ( + _in HANDLE DeviceHandle, + _out KUSB_HANDLE* InterfaceHandle) +{ + return pUsbK_Initialize(DeviceHandle, InterfaceHandle); +} + +KUSB_EXP BOOL KUSB_API UsbK_SelectInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR NumberOrIndex, + _in BOOL IsIndex) +{ + return pUsbK_SelectInterface(InterfaceHandle, NumberOrIndex, IsIndex); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetAssociatedInterface ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AssociatedInterfaceIndex, + _out KUSB_HANDLE* AssociatedInterfaceHandle) +{ + return pUsbK_GetAssociatedInterface(InterfaceHandle, AssociatedInterfaceIndex, AssociatedInterfaceHandle); +} + +KUSB_EXP BOOL KUSB_API UsbK_Clone ( + _in KUSB_HANDLE InterfaceHandle, + _out KUSB_HANDLE* DstInterfaceHandle) +{ + return pUsbK_Clone(InterfaceHandle, DstInterfaceHandle); +} + +KUSB_EXP BOOL KUSB_API UsbK_QueryInterfaceSettings ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingIndex, + _out PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor) +{ + return pUsbK_QueryInterfaceSettings(InterfaceHandle, AltSettingIndex, UsbAltInterfaceDescriptor); +} + +KUSB_EXP BOOL KUSB_API UsbK_QueryDeviceInformation ( + _in KUSB_HANDLE InterfaceHandle, + _in UINT InformationType, + _ref PUINT BufferLength, + _ref PVOID Buffer) +{ + return pUsbK_QueryDeviceInformation(InterfaceHandle, InformationType, BufferLength, Buffer); +} + +KUSB_EXP BOOL KUSB_API UsbK_SetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber) +{ + return pUsbK_SetCurrentAlternateSetting(InterfaceHandle, AltSettingNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetCurrentAlternateSetting ( + _in KUSB_HANDLE InterfaceHandle, + _out PUCHAR AltSettingNumber) +{ + return pUsbK_GetCurrentAlternateSetting(InterfaceHandle, AltSettingNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_QueryPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR AltSettingNumber, + _in UCHAR PipeIndex, + _out PWINUSB_PIPE_INFORMATION PipeInformation) +{ + return pUsbK_QueryPipe(InterfaceHandle, AltSettingNumber, PipeIndex, PipeInformation); +} + +KUSB_EXP BOOL KUSB_API UsbK_SetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _in UINT ValueLength, + _in PVOID Value) +{ + return pUsbK_SetPipePolicy(InterfaceHandle, PipeID, PolicyType, ValueLength, Value); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetPipePolicy ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in UINT PolicyType, + _ref PUINT ValueLength, + _out PVOID Value) +{ + return pUsbK_GetPipePolicy(InterfaceHandle, PipeID, PolicyType, ValueLength, Value); +} + +KUSB_EXP BOOL KUSB_API UsbK_ReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped) +{ + return pUsbK_ReadPipe(InterfaceHandle, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped); +} + +KUSB_EXP BOOL KUSB_API UsbK_WritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _outopt PUINT LengthTransferred, + _inopt LPOVERLAPPED Overlapped) +{ + return pUsbK_WritePipe(InterfaceHandle, PipeID, Buffer, BufferLength, LengthTransferred, Overlapped); +} + +KUSB_EXP BOOL KUSB_API UsbK_ResetPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID) +{ + return pUsbK_ResetPipe(InterfaceHandle, PipeID); +} + +KUSB_EXP BOOL KUSB_API UsbK_AbortPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID) +{ + return pUsbK_AbortPipe(InterfaceHandle, PipeID); +} + +KUSB_EXP BOOL KUSB_API UsbK_FlushPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID) +{ + return pUsbK_FlushPipe(InterfaceHandle, PipeID); +} + +KUSB_EXP BOOL KUSB_API UsbK_IsoReadPipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _out PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext) +{ + return pUsbK_IsoReadPipe(InterfaceHandle, PipeID, Buffer, BufferLength, Overlapped, IsoContext); +} + +KUSB_EXP BOOL KUSB_API UsbK_IsoWritePipe ( + _in KUSB_HANDLE InterfaceHandle, + _in UCHAR PipeID, + _in PUCHAR Buffer, + _in UINT BufferLength, + _in LPOVERLAPPED Overlapped, + _refopt PKISO_CONTEXT IsoContext) +{ + return pUsbK_IsoWritePipe(InterfaceHandle, PipeID, Buffer, BufferLength, Overlapped, IsoContext); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetCurrentFrameNumber ( + _in KUSB_HANDLE InterfaceHandle, + _out PUINT FrameNumber) +{ + return pUsbK_GetCurrentFrameNumber(InterfaceHandle, FrameNumber); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetOverlappedResult ( + _in KUSB_HANDLE InterfaceHandle, + _in LPOVERLAPPED Overlapped, + _out PUINT lpNumberOfBytesTransferred, + _in BOOL bWait) +{ + return pUsbK_GetOverlappedResult(InterfaceHandle, Overlapped, lpNumberOfBytesTransferred, bWait); +} + +KUSB_EXP BOOL KUSB_API UsbK_GetProperty ( + _in KUSB_HANDLE InterfaceHandle, + _in KUSB_PROPERTY PropertyType, + _ref PUINT PropertySize, + _out PVOID Value) +{ + return pUsbK_GetProperty(InterfaceHandle, PropertyType, PropertySize, Value); +} + +KUSB_EXP BOOL KUSB_API LstK_Init( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags) +{ + return pLstK_Init(DeviceList, Flags); +} + +KUSB_EXP BOOL KUSB_API LstK_InitEx( + _out KLST_HANDLE* DeviceList, + _in KLST_FLAG Flags, + _in PKLST_PATTERN_MATCH PatternMatch) +{ + return pLstK_InitEx(DeviceList, Flags, PatternMatch); +} + +KUSB_EXP BOOL KUSB_API LstK_Free( + _in KLST_HANDLE DeviceList) +{ + return pLstK_Free(DeviceList); +} + +KUSB_EXP BOOL KUSB_API LstK_Enumerate( + _in KLST_HANDLE DeviceList, + _in KLST_ENUM_DEVINFO_CB* EnumDevListCB, + _inopt PVOID Context) +{ + return pLstK_Enumerate(DeviceList, EnumDevListCB, Context); +} + +KUSB_EXP BOOL KUSB_API LstK_Current( + _in KLST_HANDLE DeviceList, + _out KLST_DEVINFO_HANDLE* DeviceInfo) +{ + return pLstK_Current(DeviceList, DeviceInfo); +} + +KUSB_EXP BOOL KUSB_API LstK_MoveNext( + _in KLST_HANDLE DeviceList, + _outopt KLST_DEVINFO_HANDLE* DeviceInfo) +{ + return pLstK_MoveNext(DeviceList, DeviceInfo); +} + +KUSB_EXP VOID KUSB_API LstK_MoveReset( + _in KLST_HANDLE DeviceList) +{ + pLstK_MoveReset(DeviceList); +} + +KUSB_EXP BOOL KUSB_API LstK_FindByVidPid( + _in KLST_HANDLE DeviceList, + _in INT Vid, + _in INT Pid, + _out KLST_DEVINFO_HANDLE* DeviceInfo) +{ + return pLstK_FindByVidPid(DeviceList, Vid, Pid, DeviceInfo); +} + +KUSB_EXP BOOL KUSB_API LstK_Count( + _in KLST_HANDLE DeviceList, + _ref PUINT Count) +{ + return pLstK_Count(DeviceList, Count); +} + +KUSB_EXP BOOL KUSB_API HotK_Init( + _out KHOT_HANDLE* Handle, + _ref PKHOT_PARAMS InitParams) +{ + return pHotK_Init(Handle, InitParams); +} + +KUSB_EXP BOOL KUSB_API HotK_Free( + _in KHOT_HANDLE Handle) +{ + return pHotK_Free(Handle); +} + +KUSB_EXP VOID KUSB_API HotK_FreeAll(VOID) +{ + pHotK_FreeAll(); +} + +KUSB_EXP BOOL KUSB_API OvlK_Acquire( + _out KOVL_HANDLE* OverlappedK, + _in KOVL_POOL_HANDLE PoolHandle) +{ + return pOvlK_Acquire(OverlappedK, PoolHandle); +} + +KUSB_EXP BOOL KUSB_API OvlK_Release( + _in KOVL_HANDLE OverlappedK) +{ + return pOvlK_Release(OverlappedK); +} + +KUSB_EXP BOOL KUSB_API OvlK_Init ( + _out KOVL_POOL_HANDLE* PoolHandle, + _in KUSB_HANDLE UsbHandle, + _in INT MaxOverlappedCount, + _inopt KOVL_POOL_FLAG Flags) +{ + return pOvlK_Init(PoolHandle, UsbHandle, MaxOverlappedCount, Flags); +} + +KUSB_EXP BOOL KUSB_API OvlK_Free( + _in KOVL_POOL_HANDLE PoolHandle) +{ + return pOvlK_Free(PoolHandle); +} + +KUSB_EXP HANDLE KUSB_API OvlK_GetEventHandle( + _in KOVL_HANDLE OverlappedK) +{ + return pOvlK_GetEventHandle(OverlappedK); +} + +KUSB_EXP BOOL KUSB_API OvlK_Wait( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength) +{ + return pOvlK_Wait(OverlappedK, TimeoutMS, WaitFlags, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API OvlK_WaitOldest( + _in KOVL_POOL_HANDLE PoolHandle, + _outopt KOVL_HANDLE* OverlappedK, + _inopt INT TimeoutMS, + _inopt KOVL_WAIT_FLAG WaitFlags, + _out PUINT TransferredLength) +{ + return pOvlK_WaitOldest(PoolHandle, OverlappedK, TimeoutMS, WaitFlags, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API OvlK_WaitOrCancel( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength) +{ + return pOvlK_WaitOrCancel(OverlappedK, TimeoutMS, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API OvlK_WaitAndRelease( + _in KOVL_HANDLE OverlappedK, + _inopt INT TimeoutMS, + _out PUINT TransferredLength) +{ + return pOvlK_WaitAndRelease(OverlappedK, TimeoutMS, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API OvlK_IsComplete( + _in KOVL_HANDLE OverlappedK) +{ + return pOvlK_IsComplete(OverlappedK); +} + +KUSB_EXP BOOL KUSB_API OvlK_ReUse( + _in KOVL_HANDLE OverlappedK) +{ + return pOvlK_ReUse(OverlappedK); +} + +KUSB_EXP BOOL KUSB_API StmK_Init( + _out KSTM_HANDLE* StreamHandle, + _in KUSB_HANDLE UsbHandle, + _in UCHAR PipeID, + _in INT MaxTransferSize, + _in INT MaxPendingTransfers, + _in INT MaxPendingIO, + _inopt PKSTM_CALLBACK Callbacks, + _inopt KSTM_FLAG Flags) +{ + return pStmK_Init(StreamHandle, UsbHandle, PipeID, MaxTransferSize, MaxPendingTransfers, MaxPendingIO, Callbacks, Flags); +} + +KUSB_EXP BOOL KUSB_API StmK_Free( + _in KSTM_HANDLE StreamHandle) +{ + return pStmK_Free(StreamHandle); +} + +KUSB_EXP BOOL KUSB_API StmK_Start( + _in KSTM_HANDLE StreamHandle) +{ + return pStmK_Start(StreamHandle); +} + +KUSB_EXP BOOL KUSB_API StmK_Stop( + _in KSTM_HANDLE StreamHandle, + _in INT TimeoutCancelMS) +{ + return pStmK_Stop(StreamHandle, TimeoutCancelMS); +} + +KUSB_EXP BOOL KUSB_API StmK_Read( + _in KSTM_HANDLE StreamHandle, + _out PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength) +{ + return pStmK_Read(StreamHandle, Buffer, Offset, Length, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API StmK_Write( + _in KSTM_HANDLE StreamHandle, + _in PUCHAR Buffer, + _in INT Offset, + _in INT Length, + _out PUINT TransferredLength) +{ + return pStmK_Write(StreamHandle, Buffer, Offset, Length, TransferredLength); +} + +KUSB_EXP BOOL KUSB_API IsoK_Init( + _out PKISO_CONTEXT* IsoContext, + _in INT NumberOfPackets, + _inopt INT StartFrame) +{ + return pIsoK_Init(IsoContext, NumberOfPackets, StartFrame); +} + +KUSB_EXP BOOL KUSB_API IsoK_Free( + _in PKISO_CONTEXT IsoContext) +{ + return pIsoK_Free(IsoContext); +} + +KUSB_EXP BOOL KUSB_API IsoK_SetPackets( + _in PKISO_CONTEXT IsoContext, + _in INT PacketSize) +{ + return pIsoK_SetPackets(IsoContext, PacketSize); +} + +KUSB_EXP BOOL KUSB_API IsoK_SetPacket( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _in PKISO_PACKET IsoPacket) +{ + return pIsoK_SetPacket(IsoContext, PacketIndex, IsoPacket); +} + +KUSB_EXP BOOL KUSB_API IsoK_GetPacket( + _in PKISO_CONTEXT IsoContext, + _in INT PacketIndex, + _out PKISO_PACKET IsoPacket) +{ + return pIsoK_GetPacket(IsoContext, PacketIndex, IsoPacket); +} + +KUSB_EXP BOOL KUSB_API IsoK_EnumPackets( + _in PKISO_CONTEXT IsoContext, + _in KISO_ENUM_PACKETS_CB* EnumPackets, + _inopt INT StartPacketIndex, + _inopt PVOID UserState) +{ + return pIsoK_EnumPackets(IsoContext, EnumPackets, StartPacketIndex, UserState); +} + +KUSB_EXP BOOL KUSB_API IsoK_ReUse( + _ref PKISO_CONTEXT IsoContext) +{ + return pIsoK_ReUse(IsoContext); +} + + + +/////////////////////////////////////////////////////////////////////// diff --git a/Old Matlab Interface/includes/lusbk_shared.h b/Old Matlab Interface/includes/lusbk_shared.h new file mode 100644 index 00000000..ddfa3fa9 --- /dev/null +++ b/Old Matlab Interface/includes/lusbk_shared.h @@ -0,0 +1,309 @@ +/*! \file lusbk_shared.h +* \brief Types and defines shared with the driver. +*/ + +#ifndef __LUSBK_SHARED_H_ +#define __LUSBK_SHARED_H_ + +#ifndef __USB_H__ + +//! Values used in the \c bmAttributes field of a \ref USB_ENDPOINT_DESCRIPTOR +typedef enum _USBD_PIPE_TYPE +{ + //! Indicates a control endpoint + UsbdPipeTypeControl, + + //! Indicates an isochronous endpoint + UsbdPipeTypeIsochronous, + + //! Indicates a bulk endpoint + UsbdPipeTypeBulk, + + //! Indicates an interrupt endpoint + UsbdPipeTypeInterrupt, +} USBD_PIPE_TYPE; + +#endif + +#if !defined(__WINUSB_COMPAT_IO_H__) && !defined(__WUSBIO_H__) + +// pipe policy types /////////////// +#define SHORT_PACKET_TERMINATE 0x01 +#define AUTO_CLEAR_STALL 0x02 +#define PIPE_TRANSFER_TIMEOUT 0x03 +#define IGNORE_SHORT_PACKETS 0x04 +#define ALLOW_PARTIAL_READS 0x05 +#define AUTO_FLUSH 0x06 +#define RAW_IO 0x07 +#define MAXIMUM_TRANSFER_SIZE 0x08 +#define RESET_PIPE_ON_RESUME 0x09 + +// libusbK ISO pipe policy types /// +#define ISO_START_LATENCY 0x20 +#define ISO_ALWAYS_START_ASAP 0x21 +#define ISO_NUM_FIXED_PACKETS 0x22 + +// http://msdn.microsoft.com/en-us/library/windows/hardware/ff552359%28v=vs.85%29.aspx +// Settings.Parallel.NumberOfPresentedRequests +// Maximum number of transfers that can be asynchronously delivered at a +// time. Available in version 1.9 and later versions of KMDF. +#define SIMUL_PARALLEL_REQUESTS 0x30 + +// Power policy types ////////////// +#define AUTO_SUSPEND 0x81 +#define SUSPEND_DELAY 0x83 + +// Device Information types //////// +#define DEVICE_SPEED 0x01 + +// Device Speeds +#define LowSpeed 0x01 +#define FullSpeed 0x02 +#define HighSpeed 0x03 + +//! The \c WINUSB_PIPE_INFORMATION structure contains pipe information that the \ref UsbK_QueryPipe routine retrieves. +typedef struct _WINUSB_PIPE_INFORMATION +{ + //! A \c USBD_PIPE_TYPE enumeration value that specifies the pipe type + USBD_PIPE_TYPE PipeType; + + //! The pipe identifier (ID) + UCHAR PipeId; + + //! The maximum size, in bytes, of the packets that are transmitted on the pipe + USHORT MaximumPacketSize; + + //! The pipe interval + UCHAR Interval; + +} WINUSB_PIPE_INFORMATION; +//! Pointer to a \ref WINUSB_PIPE_INFORMATION structure +typedef WINUSB_PIPE_INFORMATION* PWINUSB_PIPE_INFORMATION; +C_ASSERT(sizeof(WINUSB_PIPE_INFORMATION) == 12); + +#include + +//! The \c WINUSB_SETUP_PACKET structure describes a USB setup packet. +/*! +* It is often more convient to use this structure in combination with a \ref KUSB_SETUP_PACKET. +* For example: +* \code + +* \endcode +*/ +typedef struct _WINUSB_SETUP_PACKET +{ + //! The request type. The values that are assigned to this member are defined in Table 9.2 of section 9.3 of the Universal Serial Bus (USB) specification (www.usb.org). + UCHAR RequestType; + + //! The device request. The values that are assigned to this member are defined in Table 9.3 of section 9.4 of the Universal Serial Bus (USB) specification. + UCHAR Request; + + //! The meaning of this member varies according to the request. For an explanation of this member, see the Universal Serial Bus (USB) specification. + USHORT Value; + + //! The meaning of this member varies according to the request. For an explanation of this member, see the Universal Serial Bus (USB) specification. + USHORT Index; + + //! The number of bytes to transfer. (not including the \c WINUSB_SETUP_PACKET itself) + USHORT Length; + +} WINUSB_SETUP_PACKET; +//! pointer to a \c WINUSB_SETUP_PACKET structure +typedef WINUSB_SETUP_PACKET* PWINUSB_SETUP_PACKET; +C_ASSERT(sizeof(WINUSB_SETUP_PACKET) == 8); + +#include + +#endif // __WUSBIO_H__ __WINUSB_COMPAT_IO_H__ + +#include + +/*! \addtogroup isok +* @{ +*/ + +//! Structure describing an isochronous transfer packet. +typedef struct _KISO_PACKET +{ + //! Specifies the offset, in bytes, of the buffer for this packet from the beginning of the entire isochronous transfer data buffer. + /*! + * \c Offset represents an absolute data offset from the start of the \c Buffer parameter \ref UsbK_IsoReadPipe or \ref UsbK_IsoWritePipe. + * + * \note This field is assigned by the user application only and used by the driver upon transfer submission and completion. + */ + UINT Offset; + + //! Set by the host controller to indicate the actual number of bytes received by the device for isochronous IN transfers. Length not used for isochronous OUT transfers. + /*! + * \note This field is is not user assignable and is updated by the driver upon transfer completion. + */ + USHORT Length; + + //! Contains the 16 least significant USBD status bits, on return from the host controller driver, of this transfer packet. + /*! + * See MSDN for USBD status codes: USBD status code reference + * + * \note This field is is not user assignable and is updated by the driver upon transfer completion. + */ + USHORT Status; + +} KISO_PACKET; +//! pointer to a \c KISO_PACKET structure +typedef KISO_PACKET* PKISO_PACKET; + +#pragma warning(disable:4200) + +//! Additional ISO transfer flags. +typedef enum _KISO_FLAG +{ + KISO_FLAG_NONE = 0, + + //! Do not start the transfer immediately, instead use \ref KISO_CONTEXT::StartFrame. + /*! + * By default, isochronous transfers start on the next frame and \ref KISO_CONTEXT::StartFrame is + * ignored. If this flag is specified, the transfer is postponed until the current usb frame number + * equals that specified by \ref KISO_CONTEXT::StartFrame. + * + * Under certain circumstances, the driver can specify 0 for \ref KISO_CONTEXT::StartFrame, and the bus + * driver will begin the transaction in the next available frame. + * + * Specifing \b 0 for \ref KISO_CONTEXT::StartFrame (start transfer ASAP) is restricted to the first + * transaction on a newly opened or reset pipe. Furthermore, the USB stack contains a bug in Microsoft + * Windows Server 2003 and Windows XP that limits the use of this to an isochronous context with 255 or fewer + * packets. + * + * For more information about resetting pipes, see \ref UsbK_ResetPipe. + */ + KISO_FLAG_SET_START_FRAME = 0x00000001, +} KISO_FLAG; + +//! Structure describing a user defined isochronous transfer. +/*! +* +* \fixedstruct{16} +* +* The \ref KISO_CONTEXT::StartFrame member of the \ref KISO_CONTEXT specifies the starting USB frame number +* for the transaction. The driver can use \ref UsbK_GetCurrentFrameNumber to request the current frame +* number. +* +* In full-speed transmissions, the frame number for any particular packet will be the sum of the start frame +* number and the packet index. For instance, the fourth packet in the \ref KISO_CONTEXT has an index of 3, so +* its frame number will be StartFrame + 3. In a write transfer, the port driver loads this frame with the +* buffer data at the data buffer offset specified by IsoPacket[3].Offset. +* +* When the driver processes the \ref KISO_CONTEXT, it discards all packets in the \ref KISO_CONTEXT whose +* frame numbers are lower than the current frame number. The port driver sets the Status member of the packet +* descriptor for each discarded packet to USBD_STATUS_ISO_NA_LATE_USBPORT, USBD_STATUS_ISO_NOT_ACCESSED_BY_HW +* or USBD_STATUS_ISO_NOT_ACCESSED_LATE. Even if it discards some packets, the port driver attempts to +* transmit those packets in the \ref KISO_CONTEXT whose frame numbers are higher than the current frame +* number. +* +* The check for a valid StartFrame member is slightly more complicated in high-speed transmissions because +* the port driver loads each packet into a high-speed microframe; however, the value in StartFrame refers to +* the 1 millisecond (full-speed) frame number, not the microframe. For example, if the StartFrame value +* recorded in the \ref KISO_CONTEXT is one less than the current frame, the port driver will discard as many +* as eight packets. The exact number of packets that the port driver discards depends on the period +* associated with the isochronous pipe. +* +* High-speed isochronous pipes can have periods of 1, 2, 4, or 8. The period number specifies the frequency +* with which the port driver inserts packets into the data stream. If the period is 2, for example, the port +* driver will insert a packet into the data stream every two microframes. This means that it will only use +* four of the eight microframes available within each 1-millisecond frame for isochronous data transmission. +* +* In general, the higher the period, the fewer packets the port driver will discard when a \ref KISO_CONTEXT +* arrives late. Assume the period on an isochronous pipe is 2. With a period of 2, each 1-millisecond speed +* frame will carry four packets of isochronous data for that pipe. So, for example, if CurrentFrame - +* StartFrame = 3, the port driver will discard 3 * 4 = 12 packets. On the other hand, if the period is 4, +* each 1-millisecond frame carries only two packets of isochronous data for the pipe. Therefore, if the +* \ref KISO_CONTEXT arrives three 1-millisecond frames late, as in the previous example, the port driver will +* discard 3 * 2 = 6 packets, instead of 12 packets. +* +* For all types of isochronous pipe, the distance between the current frame and the StartFrame value +* specified in the \ref KISO_CONTEXT must be less than USBD_ISO_START_FRAME_RANGE. If StartFrame is not +* within the proper range, the driver sets the Status member of the \ref KISO_PACKET +* \c USBD_STATUS_BAD_START_FRAME and discards the entire \ref KISO_CONTEXT. The following code example shows +* the precise check that the port driver does on the \ref KISO_CONTEXT start frame: +* \code +* if (abs((CurrentFrame - StartFrame)) > USBD_ISO_START_FRAME_RANGE) +* { +* // discard the KISO_CONTEXT +* } +* \endcode +* +*/ +typedef struct _KISO_CONTEXT +{ + //! Additional ISO transfer flags. See \ref KISO_FLAG. + KISO_FLAG Flags; + + //! Specifies the frame number that the transfer should begin on (0 for ASAP). + /*! + * This variable must be within a system-defined range of the current frame. The range is specified by the + * constant \ref USBD_ISO_START_FRAME_RANGE. + * + * If /ref KISO_FLAG_SET_START_FRAME was specified, this member contains the frame number that the transfer should begin on. + * When the request is returned by the host controller driver, this member is updated to reflect the frame number this transfer + * did begin on. + * + * \note This field may be assigned by the user application and is updated by the driver upon transfer + * completion. + */ + UINT StartFrame; + + //! Contains the number of packets that completed with an error condition on return from the host controller driver. + /*! + * \note This field is is not user assignable and is updated by the driver upon transfer completion. + */ + SHORT ErrorCount; + + //! Specifies the number of packets that are described by the variable-length array member \c IsoPacket. + /* + * \note This field is assigned by the user application only and used by the driver upon transfer submission + * and completion. + */ + SHORT NumberOfPackets; + + //! Contains the URB Hdr.Status value on return from the host controller driver. + /*! + * \note This field is is not user assignable and is updated by the driver upon transfer completion. + * + * The USB bus driver always returns a value of USBD_STATUS_SUCCESS in + * Hdr.Status, unless every packet in the transfer generated an error or + * the request was not well-formed and could not be executed at all. The + * following table includes possible error codes returned in Hdr.Status: + * - USBD_STATUS_ISOCH_REQUEST_FAILED + * Indicates that every packet of an isochronous request was completed with + * errors. + * - USBD_STATUS_BAD_START_FRAME + * Indicates that the requested start frame is not within + * USBD_ISO_START_FRAME_RANGE of the current USB frame. + * - USBD_ISO_NOT_ACCESSED_LATE + * Indicates that every packet was submitted too late for the packet to be + * sent, based on the requested start frame. + * - USBD_STATUS_INVALID_PARAMETER + * Indicates that one of the URB parameters was incorrect. + */ + UINT UrbHdrStatus; + + //! Contains a variable-length array of \c KISO_PACKET structures that describe the isochronous transfer packets to be transferred on the USB bus. + /* + * \note This field is assigned by the user application, used by the driver upon transfer submission, and + * updated by the driver upon transfer completion. + */ + KISO_PACKET IsoPackets[0]; + +} KISO_CONTEXT; +C_ASSERT(sizeof(KISO_CONTEXT) == 16); + +//! pointer to a \c KISO_CONTEXT structure +typedef KISO_CONTEXT* PKISO_CONTEXT; + +/*! @} */ + +#pragma warning(default:4200) + +#include + +#endif // __LUSBK_SHARED_H_ + diff --git a/Old Matlab Interface/isoLog.txt b/Old Matlab Interface/isoLog.txt new file mode 100644 index 00000000..7d562888 --- /dev/null +++ b/Old Matlab Interface/isoLog.txt @@ -0,0 +1,375000 @@ +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +36 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +77 +76 +76 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +119 +126 +125 +130 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +158 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +178 +179 +183 +182 +183 +185 +185 +188 +188 +190 +191 +190 +194 +195 +197 +197 +196 +198 +198 +200 +200 +201 +201 +200 +202 +202 +202 +204 +205 +204 +204 +205 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +201 +201 +200 +200 +201 +198 +198 +196 +197 +194 +194 +195 +191 +191 +188 +189 +188 +184 +185 +185 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +146 +147 +143 +143 +139 +139 +140 +133 +133 +130 +129 +126 +125 +125 +119 +119 +116 +116 +115 +110 +109 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +77 +72 +72 +72 +68 +68 +65 +64 +65 +59 +58 +54 +55 +54 +51 +51 +46 +47 +47 +43 +43 +41 +41 +40 +37 +36 +33 +32 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +46 +50 +50 +54 +54 +54 +59 +58 +59 +58 +59 +65 +64 +68 +68 +69 +72 +72 +77 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +110 +109 +115 +116 +119 +119 +120 +125 +125 +129 +129 +132 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +168 +169 +173 +173 +175 +175 +178 +178 +178 +183 +183 +184 +184 +184 +188 +189 +191 +191 +191 +195 +194 +197 +196 +196 +199 +198 +200 +201 +201 +200 +200 +202 +202 +205 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +203 +202 +201 +200 +200 +201 +201 +198 +198 +198 +196 +196 +197 +196 +196 +194 +194 +191 +191 +190 +189 +189 +184 +184 +185 +182 +183 +178 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +126 +120 +119 +116 +115 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +65 +65 +58 +59 +55 +55 +55 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +46 +46 +47 +51 +51 +55 +54 +55 +58 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +91 +90 +96 +96 +96 +99 +100 +105 +106 +106 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +182 +182 +184 +185 +189 +188 +188 +190 +191 +194 +195 +195 +196 +196 +198 +198 +201 +200 +201 +200 +200 +203 +202 +203 +204 +204 +205 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +204 +205 +205 +205 +205 +202 +202 +202 +202 +202 +200 +201 +200 +200 +200 +198 +199 +197 +197 +195 +195 +195 +190 +190 +188 +189 +188 +185 +185 +183 +183 +182 +179 +179 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +164 +160 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +134 +129 +129 +125 +125 +126 +120 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +59 +58 +58 +55 +54 +51 +50 +50 +46 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +26 +27 +27 +31 +31 +30 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +44 +47 +46 +51 +50 +54 +54 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +83 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +120 +125 +125 +125 +130 +129 +133 +133 +133 +139 +138 +143 +143 +146 +147 +148 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +184 +189 +189 +189 +191 +190 +195 +195 +195 +196 +196 +198 +199 +199 +200 +200 +200 +200 +200 +203 +203 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +203 +203 +202 +200 +200 +200 +200 +198 +199 +198 +196 +196 +194 +194 +195 +190 +190 +191 +191 +190 +188 +188 +185 +184 +185 +183 +183 +178 +179 +175 +175 +174 +173 +173 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +132 +129 +129 +125 +126 +120 +119 +119 +116 +116 +110 +110 +109 +106 +106 +100 +100 +100 +97 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +51 +51 +51 +47 +47 +42 +42 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +59 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +100 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +129 +129 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +156 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +182 +183 +185 +185 +188 +189 +189 +191 +190 +194 +194 +196 +196 +197 +198 +198 +201 +201 +200 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +204 +204 +202 +203 +203 +200 +200 +200 +200 +199 +198 +199 +196 +197 +194 +194 +195 +190 +190 +188 +188 +188 +185 +185 +183 +183 +183 +179 +178 +175 +175 +175 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +130 +126 +125 +119 +120 +116 +115 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +65 +64 +58 +58 +54 +54 +54 +50 +50 +46 +46 +47 +43 +43 +41 +41 +40 +37 +37 +33 +32 +33 +31 +31 +27 +26 +25 +24 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +18 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +42 +46 +47 +47 +50 +50 +54 +54 +55 +58 +59 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +115 +116 +120 +120 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +158 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +180 +183 +183 +184 +185 +188 +189 +188 +191 +191 +195 +194 +195 +197 +196 +199 +198 +198 +200 +201 +201 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +199 +199 +197 +196 +195 +194 +195 +190 +191 +189 +189 +188 +185 +184 +182 +182 +183 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +150 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +125 +126 +120 +119 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +95 +96 +96 +90 +89 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +55 +54 +50 +51 +47 +46 +46 +43 +43 +41 +41 +42 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +50 +50 +55 +55 +58 +59 +59 +64 +64 +68 +68 +68 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +119 +120 +125 +126 +129 +129 +134 +133 +134 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +172 +173 +174 +175 +175 +179 +179 +182 +183 +182 +184 +184 +189 +188 +188 +190 +190 +194 +194 +194 +197 +197 +198 +198 +199 +201 +201 +200 +201 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +199 +196 +197 +195 +194 +195 +191 +191 +189 +188 +184 +185 +184 +182 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +125 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +55 +50 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +34 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +50 +50 +54 +54 +55 +58 +58 +64 +64 +69 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +119 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +178 +179 +178 +178 +179 +183 +183 +185 +184 +184 +188 +189 +191 +190 +192 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +202 +202 +204 +204 +204 +205 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +200 +201 +200 +201 +201 +198 +198 +196 +196 +194 +194 +194 +190 +190 +188 +188 +189 +185 +184 +183 +183 +182 +178 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +120 +119 +120 +115 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +58 +55 +55 +54 +50 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +15 +15 +15 +16 +17 +17 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +47 +46 +47 +51 +51 +55 +54 +54 +58 +58 +64 +65 +65 +68 +68 +73 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +120 +126 +126 +126 +129 +130 +133 +134 +133 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +185 +184 +184 +189 +188 +190 +190 +191 +194 +194 +195 +195 +195 +197 +196 +198 +198 +198 +200 +201 +200 +200 +201 +203 +203 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +201 +198 +198 +197 +197 +196 +194 +195 +190 +190 +191 +189 +188 +184 +184 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +164 +161 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +144 +143 +139 +140 +134 +133 +130 +129 +129 +125 +126 +120 +119 +120 +116 +116 +115 +116 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +59 +59 +59 +55 +55 +51 +50 +49 +47 +46 +43 +43 +40 +41 +41 +37 +37 +33 +32 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +26 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +54 +54 +59 +59 +59 +64 +64 +68 +68 +72 +72 +72 +76 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +99 +105 +106 +109 +109 +111 +115 +116 +120 +120 +125 +126 +126 +129 +129 +133 +134 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +156 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +179 +183 +182 +185 +185 +185 +188 +188 +191 +190 +194 +195 +195 +196 +196 +198 +198 +198 +201 +201 +200 +201 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +199 +197 +196 +195 +194 +190 +191 +190 +188 +189 +184 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +65 +64 +65 +58 +58 +54 +54 +51 +50 +51 +46 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +20 +19 +21 +21 +21 +25 +24 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +46 +47 +47 +51 +50 +55 +54 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +101 +106 +105 +109 +110 +110 +115 +116 +119 +119 +120 +126 +126 +126 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +172 +173 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +188 +189 +190 +190 +190 +194 +195 +196 +196 +196 +198 +198 +200 +201 +200 +200 +200 +202 +202 +203 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +205 +204 +204 +205 +204 +202 +203 +203 +200 +201 +200 +200 +198 +198 +198 +196 +196 +194 +195 +194 +190 +191 +189 +188 +189 +185 +184 +183 +182 +182 +179 +179 +174 +175 +175 +172 +173 +169 +169 +165 +164 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +59 +58 +54 +55 +55 +54 +55 +51 +51 +47 +46 +47 +43 +43 +41 +41 +39 +37 +37 +33 +33 +31 +31 +31 +28 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +51 +51 +55 +55 +58 +58 +58 +65 +64 +68 +68 +69 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +100 +105 +106 +106 +106 +106 +110 +110 +115 +116 +115 +120 +120 +126 +125 +126 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +174 +179 +178 +179 +183 +182 +184 +185 +185 +189 +189 +190 +190 +191 +194 +195 +196 +196 +197 +199 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +199 +198 +196 +197 +195 +194 +194 +190 +191 +188 +189 +189 +185 +184 +182 +183 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +130 +130 +125 +126 +126 +119 +119 +120 +119 +119 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +65 +64 +64 +58 +58 +55 +54 +53 +50 +50 +46 +47 +43 +43 +42 +41 +41 +37 +37 +37 +32 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +58 +59 +59 +65 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +116 +120 +120 +120 +125 +126 +129 +130 +129 +133 +133 +134 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +188 +189 +191 +190 +194 +194 +194 +196 +196 +198 +199 +198 +201 +201 +200 +200 +201 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +205 +205 +205 +202 +202 +202 +200 +200 +200 +201 +200 +198 +199 +196 +197 +195 +194 +194 +191 +191 +188 +189 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +156 +157 +157 +151 +151 +147 +147 +147 +144 +143 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +123 +120 +119 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +54 +51 +50 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +32 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +50 +51 +51 +54 +55 +58 +59 +58 +64 +65 +64 +64 +64 +69 +68 +73 +72 +72 +76 +76 +82 +82 +83 +86 +87 +90 +90 +95 +96 +96 +100 +100 +105 +106 +106 +110 +109 +109 +110 +110 +115 +116 +119 +120 +120 +125 +125 +130 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +174 +178 +179 +179 +182 +183 +185 +184 +184 +189 +189 +190 +191 +190 +195 +194 +196 +196 +197 +199 +198 +201 +200 +201 +200 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +205 +205 +204 +203 +202 +202 +200 +200 +200 +201 +200 +198 +198 +196 +197 +196 +195 +194 +191 +190 +191 +188 +189 +185 +185 +185 +183 +182 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +115 +116 +115 +115 +115 +110 +110 +106 +106 +106 +99 +100 +96 +96 +93 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +69 +64 +64 +59 +59 +58 +55 +54 +51 +50 +46 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +16 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +55 +59 +58 +64 +64 +68 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +120 +119 +125 +125 +130 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +183 +182 +184 +184 +188 +188 +189 +191 +191 +195 +194 +197 +197 +196 +198 +199 +200 +200 +201 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +207 +206 +207 +206 +206 +206 +207 +207 +206 +207 +206 +206 +204 +204 +204 +205 +204 +202 +202 +202 +200 +201 +200 +201 +201 +198 +199 +197 +197 +197 +195 +195 +190 +190 +188 +189 +189 +185 +184 +183 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +160 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +116 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +59 +59 +54 +54 +50 +50 +50 +46 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +18 +17 +14 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +58 +59 +59 +65 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +97 +95 +100 +100 +105 +106 +106 +109 +110 +116 +115 +116 +120 +119 +125 +126 +125 +129 +129 +134 +133 +134 +139 +139 +143 +143 +146 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +188 +188 +188 +191 +191 +194 +194 +194 +197 +197 +198 +198 +198 +200 +201 +200 +200 +200 +203 +202 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +205 +204 +204 +204 +202 +202 +201 +200 +201 +200 +201 +199 +198 +196 +196 +197 +195 +194 +190 +191 +190 +188 +189 +189 +189 +188 +184 +185 +183 +183 +182 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +131 +129 +129 +125 +125 +119 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +55 +54 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +28 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +46 +47 +47 +51 +51 +54 +54 +54 +59 +58 +58 +58 +59 +64 +65 +68 +68 +68 +73 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +116 +116 +119 +119 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +152 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +178 +182 +183 +184 +185 +184 +188 +188 +191 +191 +191 +195 +194 +197 +197 +196 +199 +198 +200 +200 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +200 +200 +199 +198 +199 +197 +197 +197 +196 +196 +195 +194 +190 +190 +191 +189 +188 +185 +185 +185 +182 +183 +178 +178 +179 +178 +179 +175 +175 +173 +172 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +134 +133 +130 +129 +129 +125 +125 +119 +119 +120 +115 +116 +109 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +69 +68 +65 +64 +58 +58 +59 +55 +55 +51 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +36 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +58 +58 +58 +64 +64 +69 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +109 +110 +116 +116 +120 +119 +119 +125 +125 +126 +126 +125 +129 +130 +134 +134 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +182 +182 +184 +185 +185 +188 +188 +191 +190 +195 +194 +194 +196 +196 +199 +199 +198 +201 +200 +200 +201 +200 +200 +201 +203 +202 +202 +205 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +197 +194 +195 +195 +190 +190 +189 +189 +188 +185 +185 +185 +184 +184 +183 +183 +179 +179 +178 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +119 +119 +115 +115 +110 +110 +109 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +17 +16 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +54 +58 +58 +64 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +95 +96 +99 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +126 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +183 +182 +183 +184 +185 +188 +188 +188 +191 +190 +195 +194 +194 +196 +196 +198 +198 +198 +200 +201 +200 +200 +201 +203 +203 +205 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +200 +200 +200 +201 +200 +198 +198 +198 +196 +196 +196 +196 +196 +194 +194 +190 +190 +191 +189 +188 +184 +184 +183 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +152 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +126 +120 +119 +119 +116 +115 +110 +109 +110 +105 +106 +100 +100 +100 +96 +96 +89 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +42 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +12 +15 +15 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +46 +47 +47 +50 +50 +55 +55 +55 +59 +58 +64 +65 +68 +69 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +189 +188 +189 +191 +190 +194 +195 +195 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +203 +202 +204 +204 +205 +204 +204 +204 +204 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +196 +195 +194 +195 +190 +191 +188 +188 +189 +185 +185 +183 +183 +183 +178 +179 +175 +174 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +120 +119 +120 +116 +115 +110 +110 +106 +106 +106 +100 +99 +96 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +64 +64 +58 +58 +55 +54 +54 +51 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +22 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +12 +16 +15 +16 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +36 +41 +41 +41 +43 +43 +47 +47 +48 +51 +51 +55 +55 +58 +59 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +120 +119 +125 +126 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +150 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +183 +185 +185 +188 +189 +190 +190 +190 +195 +194 +196 +196 +197 +198 +199 +199 +198 +198 +200 +201 +200 +201 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +197 +197 +194 +194 +194 +191 +191 +189 +188 +189 +185 +184 +183 +183 +183 +178 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +96 +96 +96 +96 +90 +89 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +68 +69 +64 +64 +64 +58 +58 +54 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +22 +21 +21 +21 +19 +20 +17 +18 +16 +15 +16 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +36 +36 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +55 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +188 +188 +189 +191 +191 +195 +194 +194 +196 +196 +198 +198 +199 +200 +201 +201 +200 +202 +203 +202 +204 +204 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +205 +205 +204 +204 +204 +203 +203 +201 +200 +201 +200 +201 +198 +198 +198 +197 +196 +194 +195 +194 +191 +190 +189 +189 +184 +184 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +126 +119 +120 +120 +115 +115 +110 +110 +110 +106 +106 +100 +99 +97 +96 +96 +90 +90 +86 +85 +86 +82 +82 +76 +77 +77 +72 +72 +68 +69 +68 +64 +64 +58 +58 +59 +55 +54 +51 +50 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +26 +26 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +58 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +95 +96 +100 +100 +106 +106 +111 +110 +110 +116 +115 +116 +116 +116 +120 +119 +125 +125 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +148 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +178 +178 +183 +183 +182 +184 +184 +189 +188 +190 +190 +190 +194 +194 +196 +196 +197 +198 +198 +200 +200 +201 +200 +201 +200 +201 +200 +202 +202 +205 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +204 +204 +204 +204 +205 +202 +202 +200 +200 +201 +200 +201 +199 +199 +197 +197 +197 +195 +194 +191 +190 +190 +188 +189 +185 +184 +184 +182 +182 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +119 +116 +115 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +65 +64 +64 +58 +58 +55 +54 +55 +51 +51 +51 +50 +50 +47 +46 +42 +43 +43 +41 +41 +37 +37 +35 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +18 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +18 +18 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +55 +55 +54 +54 +55 +59 +58 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +87 +86 +87 +90 +90 +96 +96 +96 +99 +100 +106 +105 +106 +110 +110 +115 +115 +115 +119 +119 +125 +126 +126 +129 +130 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +183 +182 +185 +184 +189 +188 +189 +191 +191 +191 +190 +191 +194 +194 +197 +196 +197 +198 +199 +201 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +205 +205 +202 +203 +200 +200 +200 +200 +200 +198 +198 +198 +197 +196 +195 +194 +194 +190 +191 +188 +189 +189 +185 +184 +182 +182 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +134 +133 +129 +129 +125 +125 +126 +120 +120 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +69 +64 +64 +58 +58 +59 +54 +55 +50 +50 +49 +47 +47 +42 +43 +41 +41 +41 +36 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +16 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +50 +51 +55 +54 +59 +58 +59 +64 +64 +69 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +115 +116 +119 +119 +120 +125 +125 +129 +129 +129 +133 +134 +134 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +174 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +188 +189 +190 +191 +195 +194 +197 +196 +197 +198 +198 +200 +201 +200 +201 +201 +202 +202 +202 +204 +204 +204 +205 +205 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +207 +206 +204 +204 +205 +204 +204 +202 +202 +202 +200 +201 +201 +200 +201 +198 +199 +196 +197 +194 +195 +195 +191 +191 +189 +188 +189 +185 +185 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +134 +133 +130 +129 +125 +125 +126 +120 +119 +116 +116 +109 +109 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +54 +55 +50 +51 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +47 +47 +47 +50 +51 +55 +54 +55 +58 +58 +64 +64 +64 +69 +68 +72 +72 +73 +77 +76 +82 +82 +82 +86 +86 +90 +90 +97 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +116 +119 +119 +125 +125 +125 +129 +130 +134 +133 +134 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +176 +179 +179 +182 +182 +184 +184 +185 +188 +189 +190 +191 +190 +194 +194 +197 +197 +197 +198 +198 +201 +200 +201 +200 +201 +202 +203 +204 +205 +205 +205 +205 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +207 +206 +204 +204 +204 +204 +205 +202 +202 +201 +201 +201 +200 +201 +199 +198 +198 +197 +196 +194 +195 +195 +190 +191 +188 +189 +188 +185 +184 +183 +182 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +157 +152 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +129 +129 +126 +125 +126 +120 +120 +115 +116 +115 +110 +109 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +77 +76 +72 +72 +69 +68 +68 +64 +65 +64 +65 +65 +58 +59 +55 +54 +55 +51 +50 +47 +47 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +38 +37 +37 +41 +40 +43 +43 +42 +47 +47 +50 +50 +51 +54 +55 +58 +59 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +99 +106 +106 +110 +110 +110 +116 +115 +119 +119 +122 +125 +125 +129 +130 +133 +133 +134 +140 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +183 +184 +185 +188 +189 +188 +191 +191 +194 +195 +195 +196 +197 +198 +198 +200 +201 +200 +200 +200 +202 +202 +202 +204 +204 +204 +205 +204 +207 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +202 +202 +202 +200 +200 +200 +201 +201 +199 +199 +197 +196 +196 +195 +195 +191 +191 +191 +188 +189 +185 +184 +183 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +129 +125 +125 +120 +119 +120 +116 +115 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +54 +51 +50 +51 +47 +46 +42 +42 +42 +41 +41 +37 +37 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +46 +47 +51 +51 +51 +55 +55 +59 +58 +59 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +112 +116 +115 +120 +119 +125 +125 +126 +129 +130 +133 +133 +134 +139 +139 +139 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +189 +191 +191 +194 +194 +196 +196 +196 +199 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +205 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +207 +206 +204 +204 +205 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +199 +199 +196 +197 +196 +195 +195 +191 +191 +189 +188 +189 +184 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +130 +130 +126 +125 +125 +120 +119 +115 +115 +113 +109 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +77 +77 +72 +72 +68 +69 +65 +64 +64 +58 +58 +55 +54 +55 +50 +50 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +32 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +20 +19 +21 +21 +21 +25 +24 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +47 +51 +50 +54 +55 +59 +58 +58 +64 +65 +68 +68 +69 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +106 +105 +110 +109 +115 +116 +116 +119 +120 +119 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +178 +183 +183 +184 +185 +184 +189 +189 +190 +190 +191 +195 +195 +197 +196 +196 +198 +198 +201 +201 +201 +200 +200 +203 +202 +202 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +202 +200 +201 +200 +201 +199 +199 +199 +196 +196 +194 +195 +194 +190 +190 +188 +188 +189 +184 +185 +182 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +139 +133 +133 +130 +130 +127 +125 +125 +119 +119 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +83 +83 +77 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +58 +54 +55 +50 +50 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +47 +47 +47 +50 +51 +55 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +109 +110 +110 +115 +115 +119 +119 +120 +126 +125 +129 +129 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +184 +185 +188 +189 +189 +190 +190 +195 +194 +194 +196 +197 +198 +199 +198 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +198 +198 +196 +197 +195 +195 +194 +191 +190 +188 +188 +189 +184 +185 +183 +183 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +130 +129 +125 +125 +126 +125 +126 +120 +119 +115 +116 +116 +110 +109 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +72 +69 +69 +64 +64 +65 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +56 +58 +59 +64 +64 +69 +68 +68 +72 +73 +76 +76 +76 +82 +82 +82 +82 +82 +86 +87 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +184 +189 +188 +191 +191 +194 +195 +194 +197 +197 +198 +198 +199 +201 +200 +201 +200 +200 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +201 +201 +201 +200 +198 +198 +200 +196 +196 +195 +194 +191 +191 +190 +188 +189 +185 +185 +185 +183 +183 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +168 +167 +165 +165 +160 +161 +157 +157 +157 +151 +151 +147 +148 +147 +143 +143 +143 +143 +143 +139 +139 +133 +134 +134 +129 +129 +125 +126 +121 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +69 +68 +68 +64 +65 +59 +59 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +14 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +20 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +42 +47 +46 +50 +51 +51 +55 +54 +58 +59 +59 +64 +65 +64 +65 +64 +69 +68 +72 +72 +72 +72 +72 +77 +77 +78 +82 +82 +87 +85 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +119 +120 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +178 +179 +183 +182 +184 +184 +184 +189 +189 +191 +190 +191 +195 +194 +196 +196 +196 +198 +199 +201 +200 +201 +201 +200 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +205 +205 +205 +204 +204 +203 +202 +200 +201 +200 +200 +200 +198 +198 +199 +197 +197 +195 +195 +195 +191 +190 +189 +189 +189 +185 +185 +182 +183 +183 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +59 +59 +58 +55 +54 +51 +50 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +42 +43 +47 +46 +47 +47 +47 +50 +51 +55 +55 +55 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +119 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +183 +185 +185 +189 +188 +188 +191 +191 +194 +194 +195 +196 +196 +198 +199 +201 +200 +201 +200 +200 +202 +203 +203 +204 +204 +204 +205 +204 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +204 +204 +206 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +195 +190 +191 +191 +188 +189 +185 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +170 +165 +165 +165 +161 +160 +157 +157 +151 +151 +151 +147 +147 +143 +143 +142 +139 +139 +134 +133 +133 +129 +129 +126 +126 +126 +120 +120 +116 +116 +116 +110 +110 +106 +106 +103 +100 +100 +97 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +65 +65 +65 +58 +58 +55 +54 +50 +50 +50 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +24 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +110 +109 +110 +116 +116 +120 +119 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +162 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +189 +188 +191 +191 +195 +194 +194 +196 +196 +198 +198 +198 +200 +200 +201 +200 +200 +203 +202 +205 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +198 +196 +196 +195 +194 +191 +190 +190 +188 +188 +184 +185 +185 +183 +183 +183 +182 +183 +178 +178 +175 +175 +175 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +120 +119 +115 +116 +110 +110 +107 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +69 +68 +65 +64 +65 +58 +58 +55 +55 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +15 +15 +17 +17 +19 +19 +19 +21 +20 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +47 +51 +51 +51 +55 +54 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +184 +185 +185 +188 +188 +190 +191 +191 +195 +195 +196 +196 +196 +198 +198 +201 +201 +200 +200 +201 +202 +202 +203 +204 +204 +204 +204 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +201 +201 +198 +198 +196 +196 +196 +194 +194 +195 +194 +195 +190 +190 +189 +189 +189 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +158 +158 +151 +151 +147 +147 +148 +143 +143 +139 +139 +135 +134 +133 +129 +129 +126 +126 +125 +119 +119 +115 +115 +115 +109 +109 +106 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +65 +64 +59 +59 +55 +55 +55 +50 +50 +47 +47 +47 +43 +43 +41 +40 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +12 +15 +15 +15 +17 +17 +17 +17 +17 +19 +18 +21 +21 +21 +25 +25 +27 +27 +30 +30 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +119 +120 +126 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +174 +179 +179 +179 +182 +183 +185 +185 +185 +188 +189 +191 +190 +190 +194 +194 +196 +196 +197 +198 +198 +200 +200 +200 +200 +201 +203 +202 +204 +205 +204 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +200 +200 +201 +200 +200 +200 +200 +198 +198 +199 +196 +196 +195 +195 +191 +190 +190 +188 +188 +185 +184 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +126 +119 +119 +115 +115 +116 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +55 +54 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +26 +27 +25 +25 +26 +21 +21 +19 +19 +17 +16 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +42 +46 +47 +51 +50 +54 +55 +54 +58 +58 +65 +64 +64 +69 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +106 +106 +106 +109 +110 +115 +115 +116 +119 +120 +125 +125 +125 +129 +129 +133 +134 +133 +139 +140 +144 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +178 +182 +183 +184 +185 +185 +189 +188 +190 +190 +194 +195 +195 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +196 +197 +194 +195 +190 +191 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +179 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +129 +129 +126 +126 +120 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +87 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +65 +58 +58 +59 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +55 +58 +58 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +95 +96 +100 +99 +106 +105 +106 +110 +109 +116 +115 +116 +119 +119 +125 +125 +125 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +182 +184 +184 +189 +189 +188 +190 +190 +191 +190 +190 +194 +194 +196 +196 +196 +198 +198 +200 +200 +201 +200 +201 +202 +202 +202 +202 +202 +205 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +199 +199 +198 +196 +197 +195 +194 +195 +191 +191 +189 +188 +184 +184 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +119 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +54 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +50 +54 +54 +59 +59 +65 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +116 +116 +116 +119 +120 +125 +126 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +185 +185 +185 +188 +189 +190 +190 +191 +194 +194 +197 +196 +198 +198 +198 +200 +200 +200 +200 +201 +203 +202 +203 +202 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +203 +203 +202 +201 +200 +200 +200 +201 +198 +198 +197 +197 +195 +195 +195 +190 +191 +188 +188 +189 +184 +184 +183 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +129 +125 +125 +119 +119 +119 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +59 +54 +54 +54 +51 +50 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +14 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +51 +51 +54 +55 +59 +59 +59 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +116 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +178 +179 +180 +183 +182 +185 +185 +188 +189 +189 +190 +190 +195 +195 +194 +197 +196 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +200 +200 +198 +199 +198 +196 +196 +195 +194 +194 +191 +190 +189 +189 +189 +184 +185 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +125 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +58 +59 +59 +58 +59 +55 +55 +50 +50 +51 +47 +47 +42 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +50 +55 +55 +59 +58 +58 +64 +64 +68 +68 +69 +72 +72 +77 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +116 +119 +120 +120 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +184 +185 +185 +184 +185 +188 +188 +190 +191 +191 +194 +194 +196 +196 +198 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +201 +200 +200 +200 +200 +199 +198 +199 +196 +196 +194 +194 +195 +190 +190 +189 +188 +184 +184 +185 +182 +183 +179 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +125 +119 +120 +116 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +73 +68 +68 +64 +64 +64 +58 +58 +54 +54 +55 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +47 +50 +50 +55 +55 +56 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +119 +119 +119 +125 +125 +130 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +175 +175 +175 +178 +179 +183 +183 +183 +185 +184 +188 +189 +190 +190 +190 +194 +194 +196 +196 +196 +199 +198 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +205 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +201 +198 +198 +196 +196 +195 +194 +194 +190 +191 +188 +188 +189 +185 +185 +183 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +168 +169 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +120 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +59 +58 +58 +54 +55 +50 +51 +51 +47 +46 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +42 +43 +47 +46 +51 +51 +50 +54 +55 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +115 +116 +116 +119 +120 +125 +125 +125 +129 +130 +133 +133 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +156 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +178 +179 +183 +182 +184 +185 +185 +188 +188 +190 +191 +190 +194 +194 +196 +197 +196 +198 +198 +201 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +196 +196 +195 +194 +194 +190 +190 +189 +188 +188 +185 +184 +182 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +130 +129 +126 +125 +126 +119 +119 +116 +115 +115 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +64 +65 +64 +58 +58 +54 +55 +55 +50 +51 +47 +47 +44 +43 +42 +41 +40 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +26 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +51 +51 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +73 +76 +76 +83 +82 +81 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +117 +119 +120 +125 +125 +130 +129 +130 +133 +134 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +182 +185 +185 +185 +188 +188 +190 +190 +191 +194 +195 +196 +196 +198 +198 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +195 +194 +195 +191 +190 +189 +188 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +140 +134 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +59 +55 +54 +54 +50 +51 +47 +47 +48 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +51 +50 +51 +54 +54 +58 +59 +65 +65 +64 +69 +69 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +89 +96 +96 +96 +100 +100 +105 +106 +109 +110 +110 +115 +116 +120 +119 +120 +125 +125 +126 +126 +125 +130 +130 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +174 +175 +178 +179 +178 +183 +183 +185 +184 +188 +188 +188 +190 +191 +194 +194 +194 +196 +196 +199 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +203 +202 +200 +200 +201 +200 +201 +198 +198 +197 +196 +197 +194 +195 +191 +190 +190 +188 +189 +185 +184 +184 +183 +182 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +130 +129 +127 +125 +125 +119 +119 +116 +115 +116 +109 +110 +106 +106 +105 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +31 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +55 +58 +59 +58 +59 +59 +65 +64 +68 +68 +68 +72 +72 +76 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +127 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +185 +184 +188 +188 +188 +190 +191 +195 +194 +195 +196 +196 +198 +198 +199 +200 +200 +200 +200 +202 +202 +202 +205 +205 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +203 +202 +203 +200 +201 +200 +200 +200 +198 +198 +198 +198 +198 +197 +196 +195 +195 +194 +191 +191 +188 +189 +189 +184 +184 +183 +183 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +156 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +126 +125 +125 +125 +120 +119 +116 +116 +116 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +64 +58 +58 +55 +54 +51 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +50 +54 +54 +59 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +109 +109 +110 +110 +116 +116 +119 +119 +119 +125 +126 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +174 +179 +179 +182 +183 +183 +185 +184 +188 +189 +188 +190 +191 +194 +194 +197 +197 +196 +199 +198 +201 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +205 +204 +203 +202 +202 +200 +200 +200 +200 +200 +199 +199 +196 +196 +197 +195 +194 +190 +190 +189 +188 +188 +185 +184 +182 +182 +183 +178 +179 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +143 +143 +139 +139 +139 +139 +139 +133 +134 +129 +129 +130 +126 +125 +119 +119 +117 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +55 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +47 +46 +51 +51 +55 +54 +54 +58 +58 +65 +64 +64 +68 +67 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +89 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +115 +119 +119 +120 +126 +125 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +174 +175 +179 +179 +183 +183 +185 +184 +185 +188 +189 +190 +191 +191 +194 +195 +194 +195 +194 +196 +196 +198 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +198 +196 +196 +197 +194 +195 +195 +195 +194 +191 +190 +189 +189 +189 +185 +184 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +119 +119 +115 +116 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +51 +50 +46 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +29 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +46 +47 +47 +51 +51 +55 +54 +55 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +119 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +182 +182 +184 +184 +188 +189 +188 +191 +190 +195 +195 +195 +196 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +200 +200 +201 +201 +198 +199 +199 +196 +196 +194 +194 +192 +190 +190 +189 +188 +184 +184 +185 +182 +182 +179 +178 +178 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +146 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +115 +110 +109 +108 +106 +106 +100 +100 +96 +96 +96 +89 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +54 +55 +54 +50 +50 +47 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +54 +55 +54 +58 +58 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +116 +115 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +185 +189 +188 +190 +190 +195 +194 +194 +196 +197 +198 +198 +198 +200 +200 +200 +199 +201 +202 +202 +204 +204 +205 +205 +204 +206 +206 +207 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +200 +196 +197 +194 +194 +190 +191 +190 +189 +188 +185 +185 +184 +182 +183 +183 +183 +182 +179 +178 +174 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +54 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +30 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +15 +15 +16 +17 +17 +19 +20 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +44 +47 +47 +51 +50 +54 +55 +54 +58 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +115 +115 +119 +119 +125 +126 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +184 +189 +188 +188 +191 +191 +195 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +197 +196 +194 +195 +194 +190 +191 +190 +191 +190 +189 +188 +185 +184 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +73 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +50 +52 +51 +47 +47 +43 +42 +44 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +55 +59 +59 +64 +64 +65 +68 +68 +72 +72 +75 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +120 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +175 +175 +175 +179 +179 +182 +182 +183 +185 +184 +185 +185 +184 +185 +185 +189 +189 +189 +191 +191 +194 +194 +195 +197 +196 +199 +198 +201 +200 +201 +200 +200 +202 +202 +203 +204 +204 +205 +204 +204 +204 +204 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +205 +204 +202 +202 +203 +202 +202 +200 +200 +201 +200 +201 +198 +199 +196 +195 +195 +194 +195 +191 +190 +188 +189 +189 +185 +185 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +170 +165 +165 +161 +160 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +126 +119 +120 +119 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +69 +68 +64 +64 +59 +59 +55 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +54 +54 +54 +59 +58 +64 +65 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +105 +110 +110 +116 +115 +115 +120 +120 +125 +126 +126 +129 +129 +133 +134 +133 +140 +140 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +176 +179 +178 +179 +183 +182 +185 +184 +185 +189 +188 +190 +191 +195 +194 +194 +197 +196 +198 +199 +198 +200 +200 +200 +200 +200 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +199 +198 +199 +196 +197 +194 +194 +194 +190 +190 +188 +188 +189 +185 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +116 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +65 +64 +65 +58 +59 +55 +55 +55 +51 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +15 +15 +17 +16 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +36 +41 +41 +43 +43 +43 +47 +46 +51 +51 +50 +55 +54 +58 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +120 +119 +120 +125 +125 +129 +129 +130 +133 +134 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +185 +184 +184 +189 +188 +191 +190 +190 +194 +194 +194 +194 +194 +197 +196 +198 +198 +198 +201 +201 +200 +200 +201 +202 +202 +204 +204 +205 +205 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +204 +204 +205 +203 +202 +200 +201 +201 +200 +200 +198 +198 +198 +197 +197 +194 +195 +194 +190 +191 +189 +189 +188 +184 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +164 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +83 +76 +76 +73 +72 +72 +69 +68 +64 +64 +64 +59 +59 +54 +54 +55 +51 +50 +46 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +14 +15 +15 +13 +13 +12 +12 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +54 +55 +58 +59 +64 +65 +64 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +109 +115 +116 +115 +119 +119 +125 +126 +130 +129 +130 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +148 +147 +151 +151 +151 +156 +157 +161 +161 +162 +166 +165 +169 +169 +172 +173 +173 +175 +175 +178 +178 +179 +183 +183 +185 +185 +185 +188 +189 +190 +191 +190 +195 +195 +196 +197 +196 +198 +199 +201 +200 +200 +200 +200 +203 +202 +205 +205 +204 +204 +204 +205 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +194 +190 +190 +189 +189 +189 +185 +185 +182 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +156 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +129 +125 +126 +125 +119 +119 +115 +115 +116 +110 +110 +106 +105 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +73 +68 +68 +64 +64 +65 +59 +58 +55 +55 +51 +50 +51 +47 +46 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +30 +31 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +47 +47 +50 +50 +55 +54 +59 +58 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +115 +115 +116 +116 +116 +120 +120 +125 +126 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +152 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +172 +175 +174 +178 +179 +179 +183 +183 +185 +184 +185 +189 +188 +191 +191 +195 +194 +194 +197 +197 +198 +199 +198 +201 +200 +200 +200 +201 +201 +200 +202 +202 +203 +205 +205 +205 +204 +206 +207 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +204 +204 +204 +204 +204 +202 +202 +203 +202 +203 +200 +200 +201 +201 +200 +199 +198 +197 +196 +196 +194 +195 +190 +190 +190 +189 +188 +185 +185 +184 +182 +182 +178 +179 +179 +175 +175 +173 +173 +170 +168 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +146 +143 +143 +143 +139 +139 +134 +133 +134 +130 +130 +125 +126 +120 +120 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +59 +59 +59 +54 +54 +50 +51 +51 +47 +47 +42 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +50 +54 +55 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +77 +76 +77 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +116 +115 +119 +119 +119 +126 +125 +129 +130 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +182 +182 +183 +184 +184 +189 +189 +188 +191 +191 +191 +190 +190 +194 +194 +197 +197 +197 +198 +199 +201 +201 +201 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +207 +204 +204 +204 +204 +205 +202 +202 +200 +200 +201 +200 +200 +198 +199 +198 +196 +196 +195 +194 +194 +190 +190 +189 +189 +189 +185 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +97 +90 +89 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +69 +68 +68 +64 +64 +58 +58 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +54 +55 +58 +59 +58 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +139 +139 +140 +144 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +179 +178 +179 +183 +183 +185 +184 +185 +189 +189 +191 +191 +194 +194 +195 +196 +197 +198 +198 +198 +200 +201 +200 +201 +201 +203 +203 +204 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +204 +205 +205 +204 +204 +202 +203 +201 +201 +200 +200 +200 +198 +199 +198 +196 +196 +195 +194 +191 +191 +191 +189 +189 +184 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +87 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +65 +59 +59 +55 +54 +54 +50 +50 +50 +51 +51 +47 +47 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +50 +50 +50 +54 +55 +59 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +101 +100 +100 +106 +106 +109 +110 +110 +116 +116 +120 +119 +120 +125 +126 +130 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +179 +182 +182 +183 +185 +185 +188 +188 +188 +190 +190 +194 +194 +194 +197 +196 +198 +198 +198 +200 +200 +200 +201 +201 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +204 +202 +202 +201 +201 +200 +200 +201 +198 +198 +196 +196 +197 +195 +194 +190 +191 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +156 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +130 +129 +126 +125 +119 +120 +119 +115 +116 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +58 +59 +59 +54 +55 +50 +51 +51 +47 +47 +43 +43 +42 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +14 +15 +15 +14 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +38 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +51 +55 +55 +58 +59 +58 +65 +64 +68 +68 +69 +73 +72 +77 +76 +81 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +115 +120 +119 +123 +125 +125 +129 +130 +134 +134 +134 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +167 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +184 +188 +188 +188 +191 +191 +194 +195 +195 +197 +197 +199 +199 +199 +200 +200 +200 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +203 +203 +202 +202 +200 +200 +201 +201 +200 +198 +198 +196 +196 +197 +195 +195 +190 +191 +189 +188 +188 +184 +185 +183 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +134 +133 +133 +129 +129 +125 +125 +126 +120 +120 +116 +116 +112 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +59 +54 +54 +55 +50 +51 +46 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +26 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +58 +59 +58 +64 +64 +68 +68 +69 +72 +72 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +116 +116 +119 +120 +119 +120 +119 +126 +125 +129 +129 +130 +133 +133 +139 +139 +142 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +185 +185 +185 +189 +189 +190 +191 +191 +195 +194 +196 +197 +196 +198 +198 +200 +200 +201 +201 +200 +202 +202 +202 +204 +205 +204 +204 +206 +207 +206 +207 +206 +207 +207 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +194 +190 +191 +190 +188 +189 +184 +184 +185 +183 +183 +178 +178 +179 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +137 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +95 +89 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +59 +54 +55 +50 +50 +51 +47 +47 +43 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +50 +50 +51 +54 +54 +58 +59 +58 +64 +65 +69 +68 +69 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +116 +117 +119 +120 +126 +126 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +178 +178 +183 +182 +183 +184 +185 +189 +189 +189 +190 +191 +195 +195 +195 +196 +197 +199 +199 +200 +200 +200 +200 +200 +202 +203 +202 +204 +204 +205 +205 +204 +207 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +205 +204 +205 +204 +204 +202 +202 +203 +201 +200 +200 +201 +201 +198 +199 +197 +196 +197 +194 +195 +191 +191 +192 +189 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +148 +144 +143 +143 +139 +139 +133 +133 +134 +129 +129 +130 +130 +130 +125 +125 +119 +120 +120 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +54 +55 +54 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +52 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +191 +191 +190 +195 +195 +196 +196 +196 +199 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +205 +204 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +205 +205 +202 +202 +202 +200 +200 +200 +201 +201 +198 +198 +197 +197 +194 +194 +194 +190 +190 +188 +188 +189 +185 +184 +185 +184 +184 +183 +183 +178 +179 +179 +175 +175 +173 +172 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +127 +125 +125 +120 +119 +115 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +55 +50 +50 +46 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +55 +55 +55 +55 +54 +58 +59 +64 +65 +64 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +125 +126 +129 +130 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +174 +178 +179 +183 +183 +183 +184 +184 +185 +185 +184 +188 +189 +191 +191 +190 +195 +195 +196 +197 +197 +199 +198 +200 +200 +201 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +205 +202 +202 +200 +201 +200 +200 +201 +201 +200 +200 +198 +198 +197 +196 +197 +195 +194 +190 +191 +189 +189 +189 +185 +185 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +120 +116 +116 +115 +110 +110 +105 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +55 +51 +50 +50 +46 +47 +43 +43 +43 +40 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +20 +19 +17 +18 +17 +15 +15 +15 +16 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +42 +43 +47 +46 +51 +51 +52 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +105 +110 +110 +116 +115 +116 +119 +119 +126 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +179 +183 +183 +184 +184 +185 +188 +189 +191 +190 +195 +194 +195 +196 +196 +198 +199 +199 +200 +201 +201 +200 +200 +202 +202 +204 +205 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +200 +198 +198 +196 +196 +197 +195 +195 +190 +190 +191 +188 +189 +189 +189 +188 +184 +185 +183 +182 +183 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +140 +134 +133 +129 +129 +125 +125 +125 +119 +119 +115 +115 +115 +110 +110 +110 +110 +111 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +72 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +55 +55 +51 +50 +47 +46 +47 +43 +43 +41 +40 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +24 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +47 +47 +50 +51 +54 +55 +55 +59 +58 +64 +64 +65 +69 +68 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +116 +115 +119 +119 +119 +126 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +184 +188 +188 +190 +190 +190 +194 +195 +196 +197 +196 +199 +198 +200 +201 +201 +201 +201 +202 +202 +204 +205 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +199 +196 +196 +197 +196 +196 +194 +194 +191 +191 +191 +188 +188 +185 +185 +183 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +134 +134 +129 +129 +129 +126 +125 +120 +120 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +58 +58 +55 +55 +51 +51 +51 +47 +47 +43 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +15 +16 +15 +17 +17 +17 +17 +18 +19 +19 +21 +21 +21 +25 +25 +27 +27 +29 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +55 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +126 +126 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +183 +183 +183 +184 +185 +189 +189 +189 +190 +191 +194 +194 +195 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +203 +202 +202 +200 +200 +201 +200 +200 +198 +199 +196 +196 +195 +194 +195 +190 +190 +189 +189 +189 +184 +184 +183 +183 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +129 +129 +129 +126 +125 +119 +119 +119 +115 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +69 +64 +64 +59 +59 +55 +55 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +20 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +46 +50 +51 +51 +54 +55 +59 +58 +59 +65 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +109 +115 +116 +120 +120 +119 +126 +125 +130 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +151 +151 +151 +157 +156 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +189 +188 +188 +191 +190 +194 +195 +195 +196 +196 +197 +197 +196 +199 +199 +200 +201 +201 +200 +201 +202 +203 +203 +204 +205 +205 +204 +207 +207 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +205 +203 +202 +203 +200 +201 +200 +200 +201 +198 +199 +197 +196 +196 +194 +194 +191 +190 +190 +188 +188 +185 +185 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +143 +139 +139 +134 +133 +130 +129 +129 +125 +125 +120 +120 +119 +115 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +81 +76 +76 +76 +72 +73 +68 +69 +69 +64 +65 +59 +58 +59 +55 +54 +50 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +26 +25 +25 +27 +27 +30 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +55 +54 +55 +58 +58 +64 +64 +64 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +97 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +144 +144 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +182 +183 +184 +184 +188 +188 +189 +190 +190 +195 +194 +195 +197 +196 +199 +198 +199 +200 +201 +201 +200 +202 +203 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +204 +205 +204 +205 +205 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +195 +195 +190 +191 +189 +188 +185 +184 +184 +183 +182 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +150 +151 +147 +147 +143 +144 +143 +139 +139 +133 +134 +133 +130 +129 +125 +125 +125 +120 +119 +115 +115 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +55 +51 +50 +47 +47 +42 +42 +42 +41 +41 +41 +41 +41 +36 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +40 +40 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +119 +126 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +188 +188 +189 +190 +191 +195 +194 +196 +196 +197 +198 +199 +201 +201 +200 +200 +200 +201 +200 +200 +202 +202 +205 +204 +205 +204 +205 +207 +206 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +200 +200 +201 +201 +201 +198 +198 +198 +196 +197 +195 +195 +190 +190 +190 +189 +189 +185 +184 +185 +182 +183 +179 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +119 +116 +116 +109 +109 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +59 +59 +58 +55 +54 +51 +50 +51 +47 +47 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +42 +47 +47 +47 +51 +50 +54 +54 +55 +59 +58 +65 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +119 +125 +125 +125 +129 +130 +133 +133 +134 +139 +139 +143 +144 +147 +147 +148 +151 +151 +157 +157 +157 +161 +161 +161 +160 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +175 +179 +179 +183 +183 +184 +185 +184 +188 +188 +190 +191 +191 +194 +194 +194 +194 +194 +197 +197 +198 +198 +199 +201 +201 +201 +201 +201 +202 +203 +204 +204 +204 +204 +205 +206 +206 +206 +207 +206 +206 +207 +207 +207 +206 +207 +206 +206 +206 +207 +204 +205 +204 +204 +202 +202 +203 +201 +200 +200 +200 +200 +198 +198 +197 +197 +196 +194 +195 +190 +190 +190 +188 +188 +184 +184 +184 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +116 +116 +109 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +55 +54 +51 +50 +50 +47 +46 +43 +43 +41 +40 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +12 +15 +15 +17 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +47 +47 +51 +50 +51 +54 +54 +58 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +117 +119 +120 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +178 +183 +182 +183 +183 +182 +184 +184 +189 +189 +189 +190 +191 +194 +194 +195 +196 +196 +198 +199 +200 +201 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +196 +195 +194 +190 +190 +189 +188 +188 +184 +184 +182 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +140 +139 +134 +134 +129 +129 +129 +125 +125 +120 +120 +120 +116 +115 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +59 +58 +59 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +36 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +50 +51 +55 +54 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +115 +115 +119 +119 +120 +125 +125 +125 +125 +125 +130 +130 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +174 +174 +179 +178 +183 +182 +184 +184 +185 +189 +188 +190 +190 +191 +194 +194 +197 +196 +196 +198 +198 +201 +201 +201 +201 +200 +203 +202 +203 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +203 +203 +200 +201 +200 +200 +198 +198 +199 +196 +196 +195 +194 +194 +190 +190 +189 +188 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +129 +130 +125 +125 +120 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +59 +54 +55 +55 +55 +55 +51 +51 +47 +47 +47 +47 +46 +42 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +42 +46 +47 +47 +51 +50 +50 +50 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +119 +119 +119 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +158 +160 +161 +165 +165 +169 +169 +169 +173 +173 +175 +176 +175 +178 +179 +183 +182 +183 +185 +184 +189 +188 +189 +191 +191 +195 +194 +195 +196 +196 +198 +198 +200 +201 +200 +200 +201 +202 +202 +203 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +200 +200 +199 +198 +198 +197 +197 +195 +195 +195 +191 +190 +189 +188 +185 +184 +185 +182 +183 +178 +178 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +130 +129 +129 +125 +125 +119 +119 +119 +116 +116 +110 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +61 +58 +58 +55 +54 +51 +50 +51 +47 +47 +43 +42 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +120 +119 +125 +125 +126 +125 +125 +129 +129 +133 +134 +134 +139 +140 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +179 +183 +183 +185 +185 +186 +188 +189 +191 +191 +194 +195 +195 +197 +196 +198 +198 +198 +200 +200 +201 +201 +200 +202 +203 +204 +204 +205 +204 +205 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +200 +201 +201 +200 +198 +198 +197 +196 +196 +194 +194 +190 +191 +191 +188 +188 +185 +184 +184 +183 +183 +178 +179 +179 +175 +175 +173 +172 +173 +169 +168 +165 +165 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +129 +130 +125 +125 +122 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +77 +73 +73 +72 +69 +68 +64 +65 +64 +58 +58 +54 +54 +54 +51 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +26 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +51 +51 +51 +55 +58 +58 +58 +58 +65 +64 +64 +64 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +115 +116 +120 +120 +119 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +148 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +178 +179 +183 +182 +185 +185 +185 +188 +189 +191 +190 +190 +195 +195 +197 +196 +196 +198 +199 +200 +200 +200 +201 +200 +203 +202 +205 +205 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +197 +196 +195 +194 +194 +191 +191 +188 +189 +189 +184 +184 +183 +182 +183 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +134 +134 +129 +129 +129 +125 +125 +119 +120 +119 +116 +116 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +55 +54 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +46 +51 +51 +55 +55 +54 +58 +59 +64 +64 +66 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +87 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +112 +116 +115 +120 +119 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +178 +182 +182 +185 +184 +185 +188 +189 +190 +190 +190 +195 +195 +197 +196 +199 +198 +198 +200 +200 +200 +200 +200 +202 +203 +203 +202 +202 +205 +205 +204 +205 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +203 +202 +201 +201 +200 +201 +200 +198 +199 +196 +197 +197 +195 +194 +191 +191 +188 +188 +189 +185 +184 +183 +183 +182 +179 +179 +179 +179 +179 +175 +175 +172 +173 +172 +169 +169 +165 +165 +164 +161 +161 +158 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +120 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +85 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +59 +55 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +14 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +12 +15 +15 +15 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +44 +47 +47 +51 +50 +54 +54 +55 +59 +59 +65 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +105 +109 +110 +110 +115 +115 +119 +119 +119 +125 +125 +129 +130 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +175 +178 +179 +183 +183 +185 +185 +185 +188 +188 +191 +191 +191 +195 +195 +196 +197 +196 +199 +198 +200 +200 +200 +200 +200 +202 +203 +203 +205 +205 +204 +205 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +205 +205 +204 +204 +204 +202 +202 +203 +201 +201 +200 +201 +198 +198 +198 +197 +197 +194 +194 +194 +190 +190 +191 +190 +190 +189 +188 +185 +184 +184 +183 +182 +179 +179 +178 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +134 +133 +129 +129 +125 +125 +126 +119 +119 +115 +116 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +89 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +73 +68 +68 +68 +65 +64 +58 +59 +58 +54 +54 +50 +50 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +26 +28 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +46 +47 +47 +47 +51 +51 +54 +54 +55 +59 +59 +65 +64 +66 +69 +68 +73 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +116 +115 +120 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +156 +157 +161 +161 +165 +166 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +182 +182 +185 +185 +184 +188 +188 +191 +191 +191 +195 +194 +196 +196 +199 +199 +199 +201 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +202 +202 +202 +200 +200 +200 +201 +200 +198 +199 +197 +197 +197 +194 +195 +191 +191 +188 +189 +188 +184 +184 +182 +183 +183 +179 +179 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +130 +129 +125 +125 +125 +120 +119 +115 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +59 +58 +59 +54 +54 +51 +51 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +30 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +44 +47 +46 +50 +51 +55 +55 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +99 +100 +106 +106 +106 +109 +110 +116 +115 +115 +120 +120 +126 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +184 +189 +188 +189 +191 +191 +195 +195 +194 +196 +196 +199 +198 +198 +200 +200 +200 +200 +200 +202 +203 +204 +204 +205 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +199 +200 +200 +201 +198 +199 +196 +196 +196 +194 +195 +191 +191 +190 +189 +188 +189 +189 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +125 +125 +126 +120 +119 +116 +116 +116 +109 +110 +106 +106 +106 +100 +100 +95 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +58 +55 +54 +55 +51 +51 +47 +47 +47 +42 +43 +40 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +22 +21 +21 +21 +25 +25 +27 +27 +26 +31 +31 +33 +33 +36 +37 +37 +41 +41 +42 +42 +43 +46 +47 +50 +51 +51 +54 +55 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +116 +120 +120 +119 +125 +125 +130 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +179 +178 +179 +182 +183 +184 +184 +185 +188 +188 +189 +189 +189 +190 +191 +194 +194 +194 +197 +197 +198 +198 +199 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +202 +202 +200 +201 +200 +201 +201 +198 +199 +199 +198 +198 +197 +196 +194 +194 +195 +190 +190 +188 +188 +185 +184 +185 +182 +182 +178 +179 +179 +174 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +134 +133 +130 +129 +125 +125 +125 +120 +119 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +64 +64 +59 +58 +55 +55 +55 +50 +50 +47 +46 +44 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +26 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +46 +51 +51 +51 +55 +54 +59 +58 +63 +64 +65 +69 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +87 +90 +89 +96 +96 +96 +99 +100 +106 +105 +110 +110 +110 +116 +116 +119 +119 +119 +125 +125 +125 +125 +126 +129 +129 +133 +133 +133 +140 +140 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +179 +183 +183 +185 +185 +185 +188 +189 +191 +190 +195 +195 +195 +197 +196 +198 +198 +198 +200 +200 +200 +200 +200 +201 +200 +203 +203 +202 +204 +204 +205 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +194 +194 +191 +190 +190 +188 +189 +185 +185 +184 +183 +183 +179 +179 +179 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +120 +120 +120 +115 +115 +110 +109 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +73 +69 +68 +68 +64 +64 +58 +58 +59 +54 +55 +50 +51 +50 +46 +47 +42 +43 +42 +41 +40 +37 +37 +38 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +12 +16 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +43 +43 +42 +47 +46 +51 +51 +51 +55 +54 +54 +54 +54 +58 +59 +64 +64 +65 +68 +68 +72 +72 +73 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +115 +115 +115 +119 +120 +126 +125 +125 +129 +130 +133 +134 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +174 +174 +178 +179 +183 +183 +183 +185 +185 +189 +188 +189 +191 +190 +191 +191 +191 +194 +194 +197 +196 +196 +199 +199 +200 +200 +201 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +207 +206 +205 +204 +205 +205 +205 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +197 +197 +197 +195 +195 +191 +190 +191 +189 +189 +185 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +129 +125 +125 +119 +119 +119 +116 +115 +109 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +55 +54 +50 +50 +51 +47 +47 +43 +43 +41 +41 +40 +37 +37 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +55 +55 +59 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +115 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +175 +175 +175 +179 +178 +182 +182 +182 +185 +185 +188 +189 +189 +190 +190 +195 +194 +197 +196 +197 +199 +198 +200 +200 +200 +200 +200 +200 +200 +200 +202 +202 +204 +205 +204 +204 +205 +206 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +204 +204 +204 +202 +202 +203 +201 +201 +201 +200 +198 +198 +199 +196 +196 +194 +194 +194 +190 +190 +188 +188 +188 +185 +184 +183 +183 +183 +179 +179 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +130 +129 +125 +125 +120 +120 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +73 +72 +68 +68 +69 +64 +64 +59 +58 +59 +55 +55 +54 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +40 +42 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +55 +59 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +83 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +170 +170 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +184 +189 +189 +189 +188 +188 +191 +190 +195 +194 +195 +197 +197 +198 +198 +200 +200 +201 +200 +201 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +205 +205 +204 +202 +203 +202 +200 +200 +200 +201 +200 +198 +199 +196 +197 +196 +194 +194 +190 +190 +191 +189 +189 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +140 +139 +134 +134 +130 +129 +129 +125 +125 +119 +119 +120 +115 +115 +110 +110 +109 +106 +106 +100 +100 +100 +95 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +69 +68 +64 +64 +65 +58 +58 +54 +54 +53 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +36 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +18 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +65 +65 +69 +69 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +109 +116 +116 +120 +119 +119 +125 +125 +129 +129 +130 +134 +134 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +174 +175 +175 +175 +175 +178 +179 +182 +183 +182 +185 +185 +189 +188 +190 +190 +191 +195 +195 +196 +196 +196 +198 +198 +200 +201 +200 +201 +201 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +198 +198 +196 +196 +195 +194 +194 +191 +190 +189 +188 +189 +185 +185 +185 +184 +185 +182 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +126 +125 +125 +120 +119 +115 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +77 +77 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +55 +54 +51 +51 +50 +51 +50 +47 +46 +43 +43 +43 +40 +41 +37 +37 +37 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +37 +41 +41 +42 +43 +48 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +64 +69 +69 +73 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +116 +119 +119 +119 +125 +125 +130 +130 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +184 +184 +189 +188 +189 +190 +191 +195 +194 +194 +196 +196 +198 +199 +199 +201 +201 +200 +200 +202 +203 +203 +204 +204 +204 +205 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +194 +194 +191 +191 +190 +188 +189 +184 +184 +184 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +160 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +126 +125 +119 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +73 +69 +69 +68 +64 +64 +64 +64 +64 +58 +58 +55 +55 +54 +50 +50 +47 +47 +47 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +24 +21 +21 +19 +19 +19 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +20 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +47 +47 +46 +47 +50 +51 +54 +55 +55 +59 +58 +64 +64 +65 +68 +68 +73 +72 +76 +76 +76 +83 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +112 +116 +116 +119 +120 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +174 +175 +179 +179 +183 +182 +183 +185 +185 +188 +188 +189 +191 +191 +195 +195 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +203 +203 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +205 +204 +202 +203 +203 +201 +201 +200 +200 +200 +199 +198 +196 +196 +196 +194 +195 +191 +191 +189 +189 +188 +184 +184 +183 +183 +183 +179 +178 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +119 +120 +120 +116 +116 +110 +110 +108 +105 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +61 +58 +58 +55 +54 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +54 +55 +59 +58 +65 +64 +64 +69 +68 +72 +72 +72 +76 +76 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +95 +96 +100 +99 +106 +106 +110 +110 +110 +115 +115 +119 +120 +119 +125 +125 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +184 +184 +184 +189 +188 +190 +190 +191 +194 +194 +197 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +203 +202 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +205 +204 +202 +202 +202 +201 +200 +200 +201 +199 +198 +199 +196 +196 +194 +195 +195 +191 +190 +188 +189 +189 +184 +184 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +134 +129 +129 +127 +125 +125 +120 +119 +115 +116 +116 +110 +109 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +89 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +32 +31 +31 +27 +27 +28 +25 +25 +21 +21 +21 +19 +19 +17 +18 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +38 +41 +40 +43 +43 +47 +47 +46 +50 +50 +54 +54 +55 +59 +58 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +105 +109 +109 +116 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +178 +182 +182 +183 +185 +185 +184 +185 +185 +188 +188 +191 +191 +191 +195 +194 +196 +196 +196 +198 +199 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +205 +205 +204 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +205 +205 +204 +205 +204 +202 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +197 +196 +195 +195 +190 +191 +191 +188 +189 +185 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +129 +125 +125 +125 +126 +125 +120 +119 +115 +115 +116 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +65 +58 +58 +54 +54 +50 +50 +51 +46 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +26 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +43 +43 +47 +46 +48 +50 +50 +54 +55 +58 +59 +58 +64 +65 +68 +69 +68 +72 +72 +72 +72 +73 +77 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +170 +169 +173 +173 +175 +174 +175 +179 +179 +183 +182 +185 +184 +185 +188 +188 +190 +191 +190 +195 +195 +197 +196 +196 +198 +198 +200 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +202 +202 +203 +201 +201 +201 +201 +198 +199 +199 +197 +197 +195 +194 +195 +191 +190 +189 +188 +188 +185 +184 +183 +183 +183 +179 +178 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +131 +130 +130 +125 +125 +119 +119 +119 +116 +115 +110 +109 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +69 +68 +64 +64 +59 +58 +59 +55 +54 +50 +50 +51 +47 +47 +43 +42 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +20 +25 +24 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +42 +47 +46 +47 +47 +46 +51 +50 +51 +50 +51 +55 +55 +59 +59 +58 +64 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +116 +119 +119 +124 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +185 +188 +188 +190 +190 +191 +195 +195 +196 +196 +196 +198 +199 +201 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +201 +200 +201 +198 +198 +196 +196 +197 +195 +195 +191 +190 +191 +189 +189 +184 +185 +182 +183 +183 +179 +179 +175 +175 +175 +172 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +119 +119 +116 +116 +116 +110 +109 +105 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +59 +55 +55 +51 +50 +50 +47 +46 +43 +42 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +24 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +46 +51 +50 +55 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +95 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +116 +119 +120 +126 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +184 +189 +189 +188 +191 +195 +195 +194 +194 +196 +196 +197 +196 +197 +199 +198 +201 +200 +201 +200 +200 +202 +203 +203 +205 +204 +205 +204 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +205 +205 +202 +202 +201 +200 +200 +200 +201 +198 +198 +198 +197 +197 +195 +195 +194 +191 +191 +190 +191 +191 +189 +189 +185 +185 +184 +182 +183 +179 +178 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +140 +139 +134 +134 +130 +129 +130 +125 +125 +119 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +59 +55 +54 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +30 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +59 +59 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +109 +116 +116 +120 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +173 +173 +173 +175 +175 +178 +179 +179 +182 +183 +185 +184 +185 +188 +189 +191 +190 +191 +195 +195 +197 +197 +196 +198 +199 +201 +201 +201 +201 +200 +202 +203 +204 +204 +205 +204 +205 +205 +204 +205 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +201 +201 +200 +200 +199 +199 +199 +197 +196 +194 +195 +193 +191 +191 +189 +188 +184 +185 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +125 +120 +120 +116 +115 +116 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +85 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +65 +65 +58 +59 +54 +54 +51 +51 +50 +46 +47 +43 +42 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +54 +54 +54 +58 +58 +64 +65 +65 +68 +68 +71 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +125 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +182 +183 +184 +184 +188 +189 +191 +190 +191 +194 +194 +196 +196 +197 +198 +198 +200 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +205 +205 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +201 +200 +201 +201 +198 +198 +196 +196 +197 +194 +194 +190 +190 +190 +188 +188 +184 +184 +185 +182 +183 +179 +178 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +130 +126 +125 +120 +120 +119 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +65 +64 +59 +58 +59 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +38 +33 +33 +31 +31 +28 +26 +27 +25 +25 +21 +22 +21 +19 +19 +17 +18 +17 +15 +15 +14 +16 +15 +13 +13 +12 +12 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +12 +15 +16 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +51 +51 +50 +55 +55 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +140 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +175 +179 +179 +183 +183 +185 +185 +185 +189 +189 +190 +190 +191 +194 +195 +195 +194 +194 +197 +197 +198 +198 +198 +200 +200 +201 +201 +201 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +195 +194 +195 +190 +191 +188 +189 +189 +185 +185 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +134 +130 +129 +126 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +105 +99 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +58 +58 +54 +54 +55 +51 +50 +46 +46 +48 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +54 +54 +55 +59 +59 +64 +65 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +105 +110 +110 +116 +115 +116 +120 +119 +126 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +183 +183 +185 +185 +185 +185 +185 +189 +189 +191 +190 +190 +194 +194 +196 +196 +196 +198 +199 +200 +201 +200 +200 +200 +202 +203 +205 +204 +204 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +200 +201 +201 +198 +199 +196 +196 +197 +194 +195 +190 +191 +188 +189 +189 +184 +185 +185 +184 +184 +182 +182 +179 +178 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +130 +129 +125 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +69 +69 +64 +65 +65 +59 +59 +54 +55 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +18 +21 +21 +25 +25 +25 +28 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +51 +55 +55 +55 +58 +59 +64 +65 +65 +68 +69 +73 +72 +72 +76 +76 +82 +82 +82 +86 +87 +90 +90 +90 +96 +95 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +120 +120 +119 +125 +126 +129 +129 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +188 +189 +189 +191 +191 +195 +194 +194 +197 +196 +196 +196 +197 +198 +198 +200 +200 +200 +200 +201 +202 +203 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +205 +205 +205 +203 +202 +200 +200 +200 +200 +200 +201 +200 +200 +199 +198 +197 +196 +197 +194 +194 +191 +191 +191 +188 +189 +185 +185 +184 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +130 +129 +129 +125 +126 +119 +120 +120 +115 +115 +110 +110 +109 +106 +105 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +65 +64 +65 +58 +58 +54 +54 +54 +51 +51 +47 +47 +48 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +46 +47 +50 +50 +54 +54 +54 +59 +58 +64 +65 +65 +68 +68 +72 +72 +73 +76 +76 +82 +83 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +115 +116 +119 +120 +125 +126 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +178 +178 +183 +183 +182 +182 +183 +184 +185 +188 +188 +189 +191 +190 +194 +194 +196 +196 +197 +199 +198 +201 +200 +201 +201 +200 +202 +202 +202 +204 +204 +204 +205 +205 +206 +206 +206 +206 +207 +207 +206 +207 +207 +206 +206 +207 +207 +206 +204 +204 +204 +204 +204 +203 +203 +202 +201 +200 +200 +200 +200 +199 +198 +197 +196 +197 +195 +194 +190 +190 +189 +188 +188 +184 +185 +182 +183 +183 +179 +179 +175 +174 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +115 +110 +109 +111 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +83 +82 +82 +76 +76 +72 +72 +72 +69 +68 +65 +64 +61 +59 +58 +55 +55 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +50 +55 +55 +59 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +116 +116 +115 +115 +116 +119 +120 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +152 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +182 +183 +183 +184 +185 +188 +188 +189 +191 +190 +195 +194 +195 +197 +196 +198 +198 +198 +200 +200 +200 +200 +201 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +205 +205 +204 +204 +205 +203 +203 +200 +200 +201 +201 +201 +198 +198 +197 +196 +196 +194 +194 +190 +190 +190 +189 +189 +185 +184 +185 +182 +183 +178 +179 +179 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +120 +119 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +77 +76 +73 +72 +68 +69 +69 +64 +64 +59 +58 +58 +55 +54 +54 +55 +54 +51 +51 +47 +47 +47 +43 +42 +41 +41 +39 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +20 +19 +19 +19 +19 +22 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +42 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +54 +58 +59 +64 +64 +64 +68 +69 +72 +72 +73 +76 +76 +82 +83 +86 +86 +85 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +120 +122 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +172 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +188 +191 +191 +195 +195 +195 +196 +197 +198 +198 +201 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +205 +204 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +205 +205 +204 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +201 +200 +198 +198 +198 +196 +196 +194 +195 +195 +190 +191 +188 +189 +185 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +144 +143 +143 +139 +140 +133 +133 +133 +129 +130 +130 +129 +130 +125 +125 +120 +119 +119 +116 +115 +109 +110 +110 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +62 +59 +59 +55 +55 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +36 +33 +33 +30 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +48 +50 +50 +55 +55 +58 +59 +58 +65 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +116 +115 +115 +115 +119 +120 +125 +126 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +185 +185 +189 +188 +189 +190 +190 +194 +194 +194 +197 +196 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +200 +200 +198 +198 +196 +196 +196 +194 +195 +190 +190 +191 +189 +189 +185 +185 +184 +182 +183 +179 +178 +178 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +136 +134 +133 +129 +129 +125 +126 +125 +120 +119 +116 +116 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +89 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +69 +64 +64 +59 +59 +59 +55 +55 +50 +51 +51 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +31 +31 +32 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +47 +47 +51 +50 +50 +50 +50 +55 +55 +58 +59 +59 +64 +65 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +125 +125 +126 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +174 +175 +179 +179 +179 +182 +183 +184 +184 +184 +188 +189 +191 +190 +191 +194 +194 +197 +196 +197 +199 +199 +200 +201 +201 +201 +201 +203 +202 +204 +205 +204 +205 +204 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +207 +207 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +199 +198 +196 +196 +194 +195 +195 +191 +191 +188 +188 +188 +185 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +133 +129 +130 +126 +125 +126 +119 +120 +119 +119 +119 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +65 +59 +59 +54 +54 +53 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +20 +21 +19 +19 +18 +16 +17 +15 +15 +15 +14 +15 +13 +13 +12 +12 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +12 +16 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +36 +41 +41 +40 +41 +40 +43 +43 +47 +47 +47 +51 +51 +54 +54 +55 +59 +58 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +105 +106 +105 +110 +109 +110 +110 +110 +115 +115 +119 +119 +119 +125 +126 +129 +129 +128 +133 +134 +139 +139 +139 +143 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +188 +191 +190 +191 +194 +194 +196 +196 +197 +199 +199 +201 +201 +201 +201 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +201 +200 +198 +198 +196 +196 +194 +195 +194 +191 +191 +189 +189 +189 +185 +185 +185 +185 +185 +183 +183 +178 +178 +178 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +127 +125 +125 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +77 +72 +72 +73 +68 +69 +64 +64 +64 +57 +58 +55 +55 +54 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +54 +55 +58 +58 +59 +59 +58 +64 +64 +68 +68 +69 +73 +73 +76 +76 +79 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +121 +125 +126 +129 +129 +132 +133 +133 +139 +139 +143 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +178 +178 +182 +182 +184 +184 +185 +189 +189 +188 +189 +189 +191 +191 +194 +194 +194 +196 +196 +198 +198 +198 +201 +201 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +200 +201 +200 +198 +199 +196 +196 +197 +194 +194 +191 +190 +189 +188 +189 +185 +185 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +160 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +134 +133 +129 +130 +130 +125 +125 +120 +120 +120 +116 +116 +110 +110 +107 +106 +106 +100 +100 +96 +96 +96 +89 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +55 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +42 +43 +43 +47 +46 +51 +51 +52 +54 +54 +59 +58 +64 +65 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +120 +119 +125 +125 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +185 +188 +189 +190 +191 +194 +195 +195 +197 +197 +198 +198 +198 +201 +200 +200 +201 +200 +203 +202 +205 +205 +204 +205 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +203 +200 +200 +201 +200 +200 +198 +199 +196 +196 +196 +195 +195 +190 +190 +190 +188 +188 +188 +188 +188 +185 +185 +183 +183 +183 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +140 +133 +134 +129 +129 +126 +126 +125 +120 +119 +115 +116 +116 +109 +110 +106 +106 +106 +99 +100 +96 +96 +96 +90 +90 +85 +86 +86 +82 +82 +76 +76 +72 +73 +72 +68 +68 +65 +65 +64 +58 +58 +55 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +55 +55 +59 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +119 +126 +126 +129 +129 +133 +134 +134 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +168 +169 +169 +172 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +185 +188 +188 +191 +191 +191 +194 +195 +197 +196 +197 +198 +198 +200 +200 +201 +200 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +207 +204 +205 +205 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +196 +197 +196 +196 +197 +195 +194 +191 +191 +190 +189 +188 +184 +185 +185 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +120 +119 +116 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +42 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +115 +115 +119 +119 +126 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +184 +185 +188 +188 +190 +190 +191 +194 +195 +196 +196 +199 +199 +199 +200 +200 +200 +200 +201 +202 +202 +203 +202 +203 +204 +204 +205 +204 +204 +207 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +205 +204 +205 +203 +203 +201 +201 +201 +200 +201 +198 +199 +199 +197 +197 +194 +195 +190 +191 +191 +188 +189 +185 +185 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +134 +133 +134 +129 +129 +125 +125 +126 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +73 +68 +68 +65 +64 +59 +59 +58 +55 +54 +50 +51 +51 +47 +47 +47 +47 +47 +42 +42 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +28 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +42 +43 +43 +47 +47 +50 +51 +50 +55 +54 +58 +58 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +87 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +115 +116 +119 +119 +120 +126 +125 +130 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +184 +185 +185 +189 +189 +191 +190 +191 +194 +194 +196 +196 +196 +199 +199 +200 +201 +201 +200 +200 +202 +202 +203 +205 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +204 +204 +205 +205 +202 +202 +200 +200 +200 +200 +200 +198 +199 +197 +196 +196 +194 +194 +190 +191 +190 +188 +189 +185 +185 +185 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +130 +129 +125 +125 +120 +119 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +59 +55 +55 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +18 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +55 +55 +58 +59 +64 +64 +64 +69 +68 +72 +72 +77 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +109 +110 +110 +116 +116 +120 +120 +126 +126 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +183 +183 +183 +183 +182 +185 +184 +188 +189 +188 +190 +190 +195 +194 +195 +196 +197 +198 +199 +200 +200 +201 +201 +200 +202 +202 +202 +204 +204 +205 +204 +204 +205 +204 +206 +207 +207 +206 +207 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +201 +201 +200 +198 +198 +199 +196 +197 +194 +194 +190 +191 +191 +189 +189 +185 +185 +185 +183 +182 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +130 +130 +126 +125 +125 +120 +119 +116 +115 +116 +110 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +65 +58 +59 +54 +55 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +30 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +42 +43 +42 +47 +47 +50 +50 +55 +55 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +184 +189 +188 +190 +190 +191 +195 +194 +196 +196 +196 +198 +199 +198 +199 +199 +200 +200 +200 +200 +200 +203 +203 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +207 +207 +204 +205 +205 +205 +205 +203 +203 +200 +200 +201 +200 +200 +199 +198 +196 +197 +196 +194 +195 +191 +191 +190 +188 +188 +185 +184 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +120 +120 +119 +116 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +54 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +20 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +54 +55 +59 +58 +64 +65 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +87 +86 +86 +90 +90 +96 +95 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +125 +125 +129 +129 +133 +133 +139 +140 +139 +143 +143 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +166 +165 +166 +169 +169 +173 +172 +175 +175 +175 +178 +178 +182 +183 +182 +185 +184 +185 +185 +184 +188 +189 +190 +191 +191 +194 +195 +196 +196 +198 +198 +199 +200 +201 +200 +200 +201 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +203 +203 +201 +200 +201 +200 +200 +198 +198 +199 +196 +197 +194 +194 +194 +191 +190 +189 +188 +185 +185 +184 +182 +182 +178 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +119 +115 +115 +115 +110 +110 +106 +106 +107 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +77 +77 +76 +76 +73 +72 +69 +69 +68 +65 +65 +59 +58 +59 +55 +54 +51 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +36 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +47 +46 +51 +51 +50 +54 +54 +58 +58 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +116 +119 +119 +125 +125 +126 +129 +129 +129 +129 +129 +134 +133 +140 +140 +140 +143 +143 +147 +147 +147 +151 +151 +156 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +173 +172 +173 +175 +175 +178 +179 +179 +182 +183 +185 +184 +188 +188 +189 +190 +191 +194 +195 +195 +197 +197 +198 +199 +199 +200 +200 +200 +201 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +201 +199 +198 +197 +196 +196 +195 +194 +190 +190 +190 +188 +188 +184 +184 +184 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +116 +115 +109 +110 +110 +105 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +54 +50 +51 +50 +51 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +28 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +12 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +37 +40 +41 +43 +42 +47 +46 +47 +51 +51 +55 +55 +55 +59 +58 +64 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +109 +110 +110 +110 +110 +116 +116 +119 +120 +120 +125 +125 +129 +130 +131 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +172 +174 +174 +175 +179 +179 +182 +182 +183 +185 +185 +189 +189 +189 +191 +191 +195 +194 +195 +197 +197 +198 +198 +199 +201 +201 +200 +200 +202 +202 +203 +205 +204 +205 +205 +205 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +207 +206 +206 +207 +204 +205 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +198 +196 +197 +196 +194 +195 +191 +190 +191 +188 +188 +185 +185 +185 +183 +183 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +158 +151 +151 +151 +147 +148 +143 +143 +144 +139 +140 +133 +133 +129 +130 +130 +125 +125 +119 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +64 +64 +64 +58 +58 +55 +55 +54 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +28 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +58 +58 +59 +64 +64 +69 +68 +69 +72 +72 +76 +77 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +117 +120 +120 +126 +126 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +147 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +185 +184 +185 +189 +189 +190 +191 +191 +195 +195 +196 +196 +198 +198 +198 +200 +201 +200 +200 +200 +202 +202 +205 +204 +204 +205 +205 +207 +206 +206 +206 +206 +207 +206 +207 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +201 +200 +200 +201 +198 +198 +198 +197 +196 +194 +195 +195 +190 +191 +189 +188 +185 +184 +184 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +140 +140 +133 +134 +134 +129 +129 +126 +126 +124 +120 +119 +116 +116 +116 +109 +110 +106 +105 +106 +100 +100 +96 +96 +89 +90 +90 +86 +86 +83 +82 +82 +76 +76 +77 +76 +76 +73 +72 +68 +69 +68 +64 +64 +59 +58 +55 +54 +54 +50 +50 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +24 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +24 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +59 +59 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +83 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +115 +116 +116 +120 +120 +125 +126 +125 +129 +129 +129 +129 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +189 +189 +190 +191 +190 +194 +194 +196 +196 +196 +199 +198 +200 +200 +200 +201 +200 +203 +202 +202 +204 +204 +204 +205 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +197 +195 +195 +194 +190 +190 +188 +188 +189 +184 +184 +182 +182 +182 +179 +178 +175 +174 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +144 +143 +139 +139 +133 +133 +134 +130 +129 +125 +125 +123 +120 +119 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +95 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +75 +72 +72 +68 +68 +65 +64 +64 +59 +59 +55 +55 +54 +50 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +18 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +55 +59 +59 +58 +59 +59 +65 +64 +69 +68 +68 +72 +72 +76 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +106 +106 +106 +110 +110 +115 +115 +115 +119 +120 +125 +125 +129 +130 +129 +134 +134 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +183 +182 +185 +185 +189 +189 +188 +190 +191 +195 +194 +195 +196 +196 +199 +199 +198 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +204 +205 +205 +205 +203 +203 +202 +201 +200 +200 +200 +201 +198 +199 +197 +197 +196 +195 +195 +191 +191 +191 +189 +189 +185 +185 +185 +183 +183 +179 +178 +175 +175 +175 +173 +169 +169 +169 +169 +165 +165 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +120 +119 +119 +120 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +65 +58 +59 +58 +55 +54 +50 +51 +46 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +30 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +37 +37 +42 +41 +41 +43 +43 +42 +43 +43 +48 +47 +51 +50 +51 +55 +54 +58 +59 +59 +65 +64 +68 +69 +72 +73 +72 +76 +76 +82 +82 +82 +87 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +116 +119 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +189 +188 +188 +190 +191 +194 +194 +196 +196 +196 +199 +198 +201 +201 +200 +200 +200 +202 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +205 +203 +202 +202 +201 +200 +201 +201 +201 +198 +198 +196 +196 +197 +194 +195 +190 +190 +188 +189 +189 +185 +185 +183 +183 +183 +178 +179 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +130 +130 +126 +125 +119 +119 +116 +115 +116 +110 +109 +105 +105 +105 +100 +100 +95 +96 +96 +90 +90 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +54 +55 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +14 +15 +15 +15 +15 +13 +13 +13 +12 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +24 +25 +25 +27 +28 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +51 +55 +54 +58 +58 +58 +64 +64 +64 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +126 +126 +126 +129 +130 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +182 +182 +185 +185 +189 +188 +189 +190 +191 +195 +194 +195 +196 +196 +199 +199 +198 +201 +201 +201 +200 +201 +202 +202 +204 +204 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +201 +200 +200 +201 +198 +198 +198 +196 +197 +197 +197 +197 +195 +194 +191 +191 +190 +189 +190 +184 +185 +184 +183 +182 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +164 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +148 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +126 +125 +120 +119 +116 +115 +115 +109 +110 +106 +105 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +65 +58 +58 +54 +54 +55 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +26 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +42 +43 +46 +47 +50 +51 +51 +54 +54 +58 +58 +60 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +146 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +182 +185 +185 +185 +189 +188 +190 +190 +190 +195 +194 +196 +196 +199 +199 +199 +200 +200 +200 +201 +201 +203 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +202 +202 +201 +200 +201 +201 +201 +199 +199 +197 +196 +195 +194 +195 +191 +191 +188 +189 +188 +185 +185 +183 +183 +182 +179 +179 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +126 +126 +125 +119 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +59 +59 +59 +55 +55 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +47 +46 +51 +51 +54 +54 +54 +58 +59 +64 +65 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +157 +161 +161 +165 +166 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +185 +185 +188 +189 +189 +191 +191 +194 +195 +194 +196 +197 +198 +198 +198 +201 +201 +200 +201 +200 +202 +202 +205 +205 +205 +204 +204 +206 +207 +207 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +201 +201 +200 +200 +199 +198 +199 +197 +196 +195 +195 +194 +191 +190 +191 +190 +191 +188 +188 +185 +184 +184 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +115 +116 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +58 +58 +55 +54 +51 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +36 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +55 +58 +58 +59 +64 +64 +68 +68 +69 +72 +71 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +119 +126 +125 +130 +129 +134 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +179 +179 +179 +182 +182 +184 +185 +185 +188 +188 +191 +191 +190 +194 +194 +197 +197 +197 +198 +198 +200 +200 +201 +201 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +205 +204 +202 +202 +202 +200 +201 +200 +200 +200 +198 +199 +198 +198 +199 +196 +196 +195 +194 +195 +191 +191 +188 +188 +187 +185 +185 +183 +183 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +130 +129 +126 +126 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +105 +100 +100 +96 +96 +89 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +55 +50 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +34 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +12 +15 +15 +15 +15 +15 +17 +18 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +50 +51 +54 +54 +55 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +120 +120 +120 +125 +125 +129 +129 +129 +133 +134 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +188 +189 +188 +190 +190 +195 +195 +195 +196 +196 +199 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +205 +205 +204 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +202 +203 +200 +201 +200 +200 +200 +198 +198 +196 +196 +195 +195 +194 +191 +191 +188 +188 +189 +185 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +150 +147 +147 +147 +144 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +119 +120 +116 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +69 +68 +68 +65 +64 +59 +58 +54 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +15 +15 +16 +17 +17 +20 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +50 +51 +50 +54 +55 +58 +59 +58 +65 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +174 +175 +174 +175 +178 +178 +183 +182 +183 +185 +185 +189 +189 +191 +191 +190 +194 +195 +196 +196 +196 +198 +198 +199 +198 +199 +200 +201 +200 +200 +201 +203 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +197 +197 +195 +195 +195 +190 +190 +188 +189 +188 +185 +185 +183 +183 +183 +179 +178 +175 +174 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +125 +125 +125 +120 +120 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +59 +58 +58 +55 +55 +51 +50 +50 +46 +46 +43 +42 +44 +41 +40 +37 +36 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +25 +25 +24 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +109 +110 +115 +116 +115 +120 +119 +126 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +164 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +183 +183 +185 +184 +185 +184 +185 +189 +189 +190 +191 +191 +195 +195 +196 +197 +197 +199 +199 +200 +200 +200 +200 +200 +202 +203 +205 +205 +205 +205 +204 +204 +205 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +207 +204 +205 +205 +205 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +197 +194 +194 +191 +191 +188 +189 +189 +184 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +126 +125 +120 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +59 +54 +55 +50 +51 +47 +46 +47 +43 +42 +41 +40 +41 +37 +37 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +42 +43 +47 +46 +50 +51 +51 +55 +55 +59 +58 +65 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +116 +115 +115 +119 +119 +125 +125 +125 +129 +130 +133 +133 +133 +139 +139 +142 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +166 +165 +165 +169 +169 +173 +173 +172 +175 +175 +175 +175 +175 +178 +179 +182 +183 +183 +185 +185 +188 +188 +189 +191 +191 +194 +194 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +201 +200 +201 +202 +202 +204 +205 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +198 +196 +196 +196 +194 +194 +190 +190 +190 +189 +188 +185 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +146 +143 +143 +143 +139 +140 +133 +133 +133 +129 +129 +125 +125 +125 +120 +119 +116 +116 +111 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +74 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +50 +51 +46 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +42 +47 +46 +47 +50 +50 +55 +55 +55 +58 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +182 +183 +184 +184 +184 +188 +189 +190 +190 +190 +195 +194 +194 +194 +194 +196 +196 +198 +198 +199 +200 +201 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +203 +203 +202 +200 +201 +200 +200 +200 +198 +198 +196 +196 +196 +195 +194 +190 +191 +190 +189 +188 +184 +184 +185 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +64 +64 +65 +58 +58 +54 +54 +54 +51 +50 +47 +46 +48 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +105 +110 +110 +116 +116 +115 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +172 +175 +175 +179 +179 +179 +182 +183 +183 +183 +183 +185 +184 +188 +189 +189 +190 +191 +195 +195 +197 +196 +197 +199 +198 +201 +200 +200 +200 +201 +202 +202 +202 +204 +204 +205 +204 +205 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +201 +200 +200 +200 +200 +198 +199 +198 +196 +197 +194 +194 +191 +190 +190 +188 +188 +185 +185 +184 +183 +183 +178 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +129 +130 +126 +125 +125 +119 +119 +115 +116 +116 +110 +109 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +65 +64 +58 +58 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +18 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +55 +54 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +95 +100 +100 +106 +106 +106 +110 +109 +116 +115 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +185 +185 +185 +189 +189 +191 +190 +190 +194 +194 +196 +197 +196 +198 +199 +200 +200 +200 +201 +200 +202 +202 +203 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +201 +199 +198 +199 +197 +196 +195 +195 +194 +190 +191 +189 +188 +188 +185 +185 +182 +183 +183 +178 +179 +175 +175 +175 +172 +173 +169 +169 +165 +164 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +130 +125 +125 +120 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +73 +72 +68 +68 +68 +65 +64 +58 +58 +58 +55 +55 +55 +55 +55 +51 +51 +46 +47 +47 +43 +42 +40 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +43 +42 +43 +47 +47 +50 +50 +51 +54 +54 +58 +58 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +100 +106 +106 +106 +105 +106 +110 +110 +115 +115 +115 +120 +120 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +174 +175 +178 +179 +179 +183 +183 +185 +184 +184 +188 +188 +191 +190 +190 +194 +195 +196 +197 +197 +199 +199 +200 +201 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +204 +205 +205 +204 +204 +202 +202 +201 +201 +200 +201 +200 +199 +198 +198 +196 +196 +195 +194 +194 +191 +191 +188 +188 +188 +185 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +126 +125 +125 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +72 +68 +69 +68 +68 +68 +64 +64 +59 +58 +59 +55 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +26 +26 +27 +31 +31 +34 +32 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +50 +54 +55 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +117 +119 +120 +125 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +162 +161 +163 +165 +165 +168 +169 +173 +173 +173 +175 +174 +179 +179 +179 +182 +183 +184 +185 +184 +189 +188 +191 +190 +191 +194 +195 +196 +197 +198 +198 +199 +200 +200 +200 +201 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +204 +204 +204 +204 +204 +203 +202 +202 +203 +203 +200 +200 +201 +200 +200 +198 +199 +196 +197 +197 +194 +194 +190 +190 +189 +188 +188 +185 +184 +183 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +140 +139 +133 +133 +133 +133 +133 +129 +129 +125 +126 +125 +120 +119 +116 +115 +113 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +67 +65 +64 +59 +58 +54 +54 +54 +51 +51 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +34 +31 +31 +28 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +58 +59 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +83 +82 +86 +86 +86 +89 +90 +96 +96 +97 +100 +100 +106 +106 +109 +110 +110 +115 +115 +119 +120 +119 +125 +125 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +188 +189 +189 +190 +190 +195 +195 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +201 +198 +198 +197 +197 +196 +194 +194 +191 +190 +191 +188 +189 +185 +185 +184 +183 +183 +179 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +130 +129 +128 +125 +125 +119 +119 +115 +115 +116 +110 +110 +106 +105 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +51 +50 +46 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +38 +41 +41 +42 +43 +47 +47 +47 +50 +50 +54 +54 +54 +58 +58 +59 +59 +59 +65 +65 +68 +68 +68 +72 +72 +76 +76 +79 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +109 +116 +116 +116 +119 +119 +125 +126 +127 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +182 +182 +185 +185 +189 +188 +188 +190 +190 +195 +195 +194 +197 +196 +198 +198 +198 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +203 +202 +202 +201 +200 +200 +201 +200 +198 +198 +196 +196 +196 +195 +194 +191 +190 +191 +188 +189 +184 +185 +185 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +164 +165 +165 +165 +165 +160 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +134 +133 +134 +129 +129 +125 +125 +125 +119 +119 +119 +119 +120 +115 +116 +109 +110 +110 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +58 +59 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +36 +37 +40 +41 +41 +42 +43 +47 +46 +46 +51 +51 +54 +54 +55 +58 +58 +65 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +112 +116 +116 +119 +119 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +151 +151 +157 +157 +160 +161 +160 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +183 +184 +184 +188 +188 +188 +191 +191 +194 +194 +197 +196 +196 +198 +199 +200 +200 +200 +200 +200 +203 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +201 +199 +199 +196 +196 +197 +194 +194 +190 +190 +189 +188 +189 +184 +185 +183 +183 +182 +178 +179 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +119 +116 +115 +116 +109 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +65 +58 +59 +54 +55 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +16 +17 +18 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +48 +51 +51 +54 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +120 +126 +125 +125 +129 +129 +133 +133 +134 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +182 +185 +185 +189 +189 +189 +191 +190 +194 +194 +195 +196 +197 +198 +198 +198 +200 +201 +201 +200 +200 +202 +203 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +196 +197 +194 +194 +190 +190 +191 +188 +188 +189 +189 +188 +185 +185 +182 +183 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +58 +54 +55 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +39 +41 +40 +43 +43 +47 +47 +47 +51 +50 +55 +55 +55 +58 +59 +59 +59 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +120 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +179 +182 +182 +184 +184 +184 +188 +189 +190 +191 +191 +194 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +207 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +199 +199 +196 +196 +197 +196 +196 +194 +194 +190 +190 +190 +188 +188 +185 +185 +183 +183 +183 +179 +178 +174 +175 +175 +172 +172 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +54 +54 +55 +51 +50 +47 +46 +43 +42 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +37 +37 +38 +41 +41 +43 +43 +43 +47 +47 +46 +47 +47 +51 +50 +54 +54 +54 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +115 +119 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +175 +178 +178 +182 +182 +182 +184 +185 +188 +189 +188 +190 +191 +194 +194 +195 +196 +197 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +205 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +197 +197 +194 +194 +190 +191 +191 +188 +189 +184 +184 +182 +183 +182 +178 +178 +175 +175 +175 +173 +173 +173 +172 +172 +169 +169 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +105 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +65 +58 +59 +54 +55 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +20 +21 +21 +23 +25 +25 +27 +27 +31 +31 +30 +33 +33 +37 +37 +37 +41 +41 +40 +41 +41 +42 +42 +47 +47 +47 +50 +50 +54 +55 +56 +59 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +109 +110 +110 +116 +115 +119 +120 +119 +125 +126 +130 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +183 +183 +184 +185 +188 +188 +189 +190 +190 +195 +194 +197 +196 +196 +198 +199 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +202 +201 +201 +200 +201 +201 +198 +198 +196 +197 +195 +194 +195 +190 +190 +188 +188 +189 +184 +185 +182 +183 +182 +179 +178 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +130 +129 +126 +125 +126 +119 +120 +115 +116 +109 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +58 +59 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +36 +36 +33 +33 +31 +31 +31 +26 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +12 +15 +15 +17 +16 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +50 +50 +54 +54 +59 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +184 +185 +188 +189 +191 +190 +190 +194 +194 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +200 +201 +200 +200 +201 +199 +198 +196 +196 +197 +194 +194 +190 +190 +190 +188 +188 +189 +188 +188 +184 +185 +183 +182 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +139 +140 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +116 +116 +110 +110 +110 +106 +106 +99 +100 +100 +96 +96 +89 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +55 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +16 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +15 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +59 +65 +64 +68 +68 +69 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +179 +179 +179 +183 +182 +185 +184 +185 +188 +188 +191 +190 +190 +194 +194 +196 +197 +196 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +197 +196 +196 +194 +195 +191 +190 +190 +189 +189 +185 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +126 +119 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +59 +55 +54 +51 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +33 +31 +32 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +26 +31 +31 +32 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +59 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +119 +120 +119 +125 +126 +129 +130 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +184 +184 +188 +188 +189 +190 +191 +194 +195 +195 +197 +196 +198 +198 +201 +200 +201 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +201 +202 +203 +202 +200 +200 +200 +200 +201 +198 +199 +196 +196 +195 +195 +195 +190 +191 +189 +188 +188 +185 +185 +182 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +119 +119 +120 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +69 +64 +64 +59 +59 +55 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +58 +59 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +178 +182 +182 +182 +184 +184 +189 +189 +189 +191 +190 +194 +194 +196 +196 +196 +199 +198 +200 +201 +200 +200 +201 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +202 +202 +203 +201 +200 +200 +200 +199 +198 +199 +196 +197 +194 +195 +195 +191 +191 +189 +188 +188 +184 +184 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +168 +169 +165 +164 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +59 +59 +55 +55 +54 +50 +51 +47 +47 +47 +43 +42 +41 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +42 +43 +42 +47 +47 +51 +51 +50 +55 +54 +59 +58 +59 +65 +64 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +119 +125 +125 +130 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +162 +161 +165 +165 +169 +168 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +184 +184 +184 +188 +189 +191 +191 +191 +195 +194 +195 +195 +194 +197 +196 +198 +199 +198 +201 +201 +200 +201 +202 +202 +203 +205 +204 +205 +205 +204 +207 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +207 +206 +207 +206 +206 +207 +204 +204 +205 +205 +205 +202 +202 +200 +200 +201 +201 +200 +199 +199 +199 +197 +197 +195 +194 +195 +191 +191 +189 +188 +188 +185 +185 +182 +183 +183 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +134 +129 +129 +125 +125 +126 +119 +120 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +87 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +24 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +55 +58 +58 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +120 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +184 +185 +185 +188 +188 +191 +190 +192 +195 +194 +197 +196 +198 +199 +199 +200 +200 +200 +200 +200 +202 +203 +203 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +207 +206 +204 +205 +204 +204 +204 +202 +202 +202 +200 +201 +201 +200 +200 +198 +199 +196 +197 +194 +194 +195 +190 +191 +188 +189 +189 +184 +185 +182 +183 +182 +179 +178 +175 +174 +175 +172 +172 +169 +168 +170 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +130 +126 +125 +120 +120 +119 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +43 +42 +43 +41 +41 +37 +37 +37 +34 +33 +31 +31 +32 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +51 +51 +51 +55 +55 +58 +58 +58 +64 +64 +64 +64 +64 +69 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +97 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +119 +126 +125 +125 +130 +130 +134 +133 +133 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +178 +179 +183 +183 +185 +184 +185 +188 +189 +191 +190 +190 +194 +194 +194 +195 +194 +196 +196 +199 +198 +199 +200 +200 +200 +201 +201 +203 +203 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +207 +204 +205 +205 +204 +203 +202 +202 +200 +200 +201 +200 +201 +199 +199 +197 +197 +196 +194 +194 +191 +190 +190 +189 +189 +184 +185 +185 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +152 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +120 +116 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +73 +73 +68 +68 +69 +64 +64 +64 +64 +64 +59 +58 +54 +55 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +15 +15 +15 +18 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +51 +51 +55 +54 +55 +59 +59 +65 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +116 +120 +120 +125 +125 +128 +129 +129 +133 +134 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +174 +175 +179 +178 +178 +183 +182 +183 +182 +182 +185 +185 +189 +188 +189 +190 +191 +195 +195 +195 +196 +197 +199 +198 +200 +200 +200 +201 +200 +202 +202 +203 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +201 +200 +198 +198 +196 +196 +196 +194 +195 +191 +190 +188 +189 +188 +185 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +115 +109 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +68 +65 +64 +59 +58 +59 +54 +55 +50 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +36 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +18 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +47 +51 +50 +55 +55 +59 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +120 +125 +125 +125 +125 +125 +129 +130 +133 +134 +133 +140 +139 +143 +143 +145 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +183 +183 +183 +184 +185 +189 +189 +190 +191 +191 +194 +195 +197 +197 +197 +199 +199 +201 +200 +200 +200 +200 +202 +202 +203 +204 +205 +204 +205 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +205 +204 +204 +205 +204 +203 +203 +203 +201 +201 +201 +200 +199 +199 +198 +197 +197 +194 +195 +194 +190 +191 +189 +189 +188 +185 +185 +183 +183 +183 +179 +178 +175 +174 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +130 +125 +126 +119 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +69 +69 +64 +64 +59 +59 +59 +55 +54 +54 +55 +55 +51 +51 +47 +46 +47 +42 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +16 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +43 +43 +43 +46 +47 +50 +51 +51 +54 +54 +58 +58 +58 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +115 +119 +120 +125 +125 +127 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +185 +189 +189 +191 +191 +191 +195 +194 +196 +196 +196 +198 +199 +200 +201 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +204 +205 +204 +204 +204 +203 +203 +200 +200 +200 +201 +201 +198 +198 +198 +197 +197 +195 +195 +194 +191 +190 +189 +189 +189 +185 +184 +183 +182 +179 +178 +179 +175 +175 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +150 +147 +147 +148 +143 +143 +139 +139 +134 +133 +133 +130 +130 +125 +125 +126 +120 +119 +120 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +65 +64 +64 +59 +59 +54 +54 +51 +51 +50 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +50 +54 +54 +59 +58 +61 +65 +65 +68 +68 +73 +73 +72 +76 +76 +82 +82 +82 +86 +86 +86 +85 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +115 +119 +119 +119 +125 +126 +130 +129 +129 +133 +133 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +154 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +188 +189 +190 +190 +194 +195 +195 +197 +196 +196 +197 +196 +199 +198 +200 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +207 +207 +206 +206 +206 +207 +206 +207 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +199 +199 +197 +196 +195 +194 +195 +190 +190 +189 +189 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +144 +143 +143 +139 +139 +133 +133 +133 +130 +130 +125 +125 +123 +120 +119 +116 +115 +109 +110 +110 +106 +105 +100 +100 +100 +96 +97 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +54 +50 +51 +46 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +14 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +32 +32 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +51 +50 +55 +55 +58 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +91 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +116 +116 +116 +120 +120 +125 +125 +125 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +152 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +182 +183 +184 +184 +189 +188 +189 +191 +191 +191 +191 +191 +194 +194 +197 +197 +196 +199 +199 +200 +200 +201 +201 +201 +202 +203 +204 +204 +205 +205 +204 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +205 +205 +202 +202 +201 +200 +200 +200 +200 +199 +199 +198 +197 +196 +196 +196 +196 +196 +196 +195 +194 +195 +190 +191 +188 +189 +189 +184 +184 +182 +183 +178 +179 +179 +175 +175 +173 +172 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +144 +143 +139 +139 +133 +134 +133 +129 +129 +125 +125 +125 +120 +119 +119 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +59 +59 +54 +53 +51 +51 +46 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +26 +21 +21 +21 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +40 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +56 +58 +58 +64 +64 +67 +68 +68 +72 +72 +76 +76 +77 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +109 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +148 +151 +151 +157 +157 +156 +161 +161 +165 +165 +166 +168 +169 +173 +173 +173 +174 +175 +179 +178 +179 +183 +183 +185 +184 +184 +188 +188 +190 +191 +195 +194 +194 +196 +196 +196 +197 +197 +198 +198 +201 +201 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +203 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +196 +194 +194 +195 +191 +190 +189 +188 +189 +185 +185 +182 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +157 +157 +156 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +126 +125 +120 +120 +120 +116 +116 +109 +109 +110 +105 +106 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +55 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +36 +41 +41 +42 +43 +43 +47 +46 +51 +50 +50 +54 +55 +54 +54 +55 +59 +59 +64 +64 +65 +68 +68 +72 +72 +74 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +185 +185 +185 +185 +184 +188 +188 +190 +190 +190 +194 +194 +196 +196 +197 +199 +198 +200 +201 +201 +201 +200 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +207 +205 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +201 +200 +200 +199 +199 +196 +197 +196 +195 +194 +191 +190 +191 +188 +189 +184 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +164 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +126 +120 +119 +115 +115 +116 +109 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +91 +86 +86 +82 +82 +82 +76 +77 +72 +72 +72 +68 +68 +64 +64 +65 +59 +59 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +48 +50 +50 +55 +54 +59 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +109 +116 +116 +120 +120 +119 +125 +126 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +181 +182 +182 +184 +185 +189 +188 +191 +191 +191 +195 +194 +196 +196 +196 +199 +199 +200 +200 +201 +200 +200 +203 +203 +202 +204 +205 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +201 +201 +199 +199 +196 +196 +194 +194 +194 +191 +190 +189 +188 +188 +185 +185 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +129 +129 +125 +125 +120 +119 +119 +116 +115 +109 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +73 +72 +69 +69 +69 +64 +65 +58 +58 +58 +55 +54 +51 +50 +50 +46 +47 +43 +42 +43 +41 +40 +37 +36 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +42 +47 +47 +47 +50 +51 +54 +54 +54 +58 +59 +65 +64 +64 +68 +68 +73 +72 +72 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +125 +130 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +182 +185 +185 +188 +189 +189 +191 +190 +195 +195 +194 +197 +197 +199 +198 +198 +201 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +204 +204 +205 +204 +205 +202 +203 +201 +200 +200 +201 +200 +198 +199 +197 +196 +196 +194 +195 +195 +195 +195 +191 +191 +189 +189 +188 +185 +185 +183 +182 +181 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +144 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +120 +119 +116 +116 +115 +110 +109 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +65 +58 +58 +54 +55 +55 +50 +50 +47 +47 +47 +43 +43 +40 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +58 +58 +64 +64 +69 +68 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +119 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +183 +182 +185 +185 +185 +189 +188 +190 +190 +190 +195 +195 +196 +196 +196 +199 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +201 +200 +200 +201 +201 +198 +198 +199 +196 +196 +195 +195 +191 +190 +191 +189 +189 +185 +185 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +119 +116 +115 +115 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +55 +54 +54 +51 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +20 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +46 +47 +51 +51 +54 +54 +54 +58 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +120 +125 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +182 +184 +184 +185 +188 +188 +191 +191 +191 +195 +194 +194 +195 +195 +197 +196 +198 +198 +198 +201 +200 +200 +200 +201 +202 +203 +204 +205 +204 +205 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +205 +205 +202 +203 +200 +201 +200 +201 +200 +198 +199 +199 +196 +196 +195 +194 +194 +191 +191 +188 +189 +189 +185 +185 +182 +183 +178 +179 +178 +175 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +120 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +64 +58 +58 +54 +54 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +16 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +32 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +58 +59 +64 +65 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +150 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +174 +179 +179 +178 +183 +183 +183 +183 +183 +184 +184 +189 +189 +189 +191 +191 +194 +195 +194 +196 +197 +198 +198 +200 +201 +200 +201 +200 +203 +202 +202 +204 +205 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +204 +204 +204 +205 +204 +202 +202 +200 +200 +200 +200 +200 +199 +199 +199 +196 +197 +194 +194 +190 +191 +191 +188 +188 +185 +184 +185 +183 +182 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +115 +116 +116 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +55 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +58 +58 +59 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +97 +96 +96 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +119 +126 +126 +129 +129 +129 +133 +133 +140 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +174 +175 +179 +178 +179 +183 +183 +184 +185 +184 +188 +189 +190 +191 +194 +194 +195 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +199 +198 +199 +196 +196 +194 +195 +195 +191 +190 +189 +188 +189 +185 +185 +183 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +130 +125 +126 +119 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +77 +73 +72 +69 +68 +64 +64 +64 +58 +59 +55 +55 +55 +51 +51 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +32 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +54 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +109 +109 +116 +116 +119 +120 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +184 +185 +184 +189 +189 +191 +191 +191 +195 +195 +194 +194 +194 +197 +197 +198 +198 +199 +200 +201 +200 +200 +201 +202 +202 +205 +204 +204 +205 +205 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +205 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +199 +198 +197 +196 +195 +194 +194 +191 +191 +188 +189 +188 +184 +185 +183 +183 +179 +179 +179 +175 +176 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +134 +133 +133 +130 +129 +125 +125 +125 +119 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +69 +68 +68 +69 +65 +64 +58 +58 +59 +55 +55 +51 +51 +48 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +32 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +50 +51 +50 +55 +54 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +100 +106 +106 +109 +110 +111 +116 +116 +119 +119 +126 +126 +126 +129 +129 +133 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +174 +175 +179 +179 +179 +179 +179 +183 +183 +185 +184 +185 +189 +189 +191 +190 +192 +195 +195 +197 +196 +198 +198 +198 +200 +200 +200 +200 +201 +203 +202 +204 +204 +204 +205 +204 +206 +207 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +201 +201 +200 +201 +201 +198 +199 +197 +197 +195 +194 +195 +190 +191 +189 +188 +189 +185 +185 +183 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +116 +109 +110 +105 +106 +105 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +59 +59 +58 +54 +55 +51 +50 +50 +47 +47 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +51 +51 +54 +55 +59 +58 +59 +65 +64 +68 +68 +69 +72 +72 +76 +77 +76 +82 +82 +86 +86 +87 +90 +90 +96 +95 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +116 +115 +115 +120 +120 +126 +125 +125 +129 +129 +133 +133 +135 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +160 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +179 +178 +179 +182 +183 +184 +185 +185 +189 +188 +191 +191 +190 +194 +194 +196 +197 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +204 +205 +204 +204 +205 +202 +203 +201 +201 +200 +200 +200 +198 +198 +198 +197 +197 +195 +194 +194 +191 +191 +188 +188 +189 +184 +185 +182 +183 +182 +179 +178 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +134 +133 +129 +130 +126 +125 +125 +119 +120 +116 +116 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +65 +64 +64 +65 +58 +59 +54 +54 +54 +51 +51 +46 +47 +45 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +26 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +47 +47 +51 +51 +51 +54 +54 +58 +59 +58 +65 +64 +69 +68 +68 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +122 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +160 +161 +165 +165 +168 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +182 +183 +185 +184 +189 +189 +189 +191 +190 +195 +194 +195 +197 +197 +199 +199 +200 +200 +201 +200 +200 +202 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +205 +205 +204 +204 +202 +202 +202 +201 +201 +201 +200 +200 +198 +198 +196 +197 +196 +194 +195 +191 +191 +191 +189 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +158 +151 +151 +152 +147 +147 +143 +143 +140 +139 +140 +134 +133 +130 +130 +130 +125 +126 +125 +125 +126 +120 +120 +116 +115 +115 +110 +109 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +61 +58 +58 +55 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +20 +25 +25 +26 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +42 +43 +42 +47 +46 +50 +51 +50 +54 +54 +58 +58 +64 +64 +64 +68 +69 +72 +72 +72 +76 +76 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +109 +110 +110 +116 +116 +119 +120 +119 +125 +126 +125 +125 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +188 +188 +188 +190 +191 +195 +195 +195 +196 +196 +199 +198 +198 +201 +201 +201 +200 +201 +203 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +197 +196 +196 +195 +195 +190 +190 +190 +188 +189 +185 +184 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +156 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +120 +120 +115 +115 +115 +110 +110 +106 +106 +105 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +77 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +55 +51 +50 +51 +47 +46 +43 +42 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +22 +21 +19 +19 +17 +17 +17 +15 +15 +15 +16 +15 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +46 +51 +51 +55 +55 +55 +59 +59 +65 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +97 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +130 +130 +133 +133 +139 +140 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +172 +175 +175 +178 +179 +178 +183 +183 +182 +182 +183 +184 +184 +189 +189 +188 +191 +191 +195 +194 +194 +196 +197 +199 +198 +198 +200 +201 +200 +201 +203 +202 +202 +204 +204 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +205 +204 +204 +204 +203 +202 +202 +200 +200 +200 +201 +200 +199 +198 +197 +196 +197 +194 +194 +191 +190 +191 +188 +189 +185 +185 +185 +183 +182 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +158 +157 +151 +151 +147 +148 +147 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +120 +119 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +59 +54 +54 +51 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +50 +50 +54 +54 +58 +58 +61 +64 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +107 +110 +110 +116 +116 +119 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +144 +147 +147 +148 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +183 +184 +184 +189 +188 +189 +191 +191 +194 +195 +196 +196 +196 +198 +198 +200 +201 +201 +201 +201 +203 +202 +202 +204 +204 +204 +205 +204 +206 +206 +207 +207 +207 +206 +207 +207 +206 +207 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +203 +202 +201 +201 +200 +200 +200 +198 +198 +197 +196 +197 +194 +195 +190 +191 +188 +188 +189 +185 +184 +183 +182 +182 +179 +179 +179 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +140 +139 +139 +133 +133 +129 +129 +130 +126 +125 +120 +120 +116 +115 +116 +110 +110 +106 +106 +106 +99 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +65 +65 +59 +58 +55 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +26 +25 +25 +20 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +30 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +47 +46 +51 +51 +54 +54 +54 +58 +59 +65 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +119 +125 +125 +129 +130 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +185 +185 +185 +188 +188 +190 +190 +190 +194 +195 +197 +196 +197 +198 +199 +200 +201 +200 +200 +200 +202 +202 +203 +205 +204 +204 +205 +207 +206 +206 +206 +207 +206 +206 +207 +206 +207 +207 +206 +206 +207 +206 +205 +205 +204 +204 +204 +203 +203 +203 +200 +201 +200 +200 +199 +198 +199 +196 +197 +195 +195 +195 +191 +191 +191 +191 +190 +188 +189 +185 +185 +184 +182 +183 +178 +179 +177 +175 +175 +173 +172 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +126 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +69 +68 +64 +65 +65 +59 +58 +55 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +46 +47 +47 +47 +47 +51 +51 +55 +54 +55 +58 +58 +64 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +109 +110 +115 +116 +119 +120 +119 +126 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +184 +189 +189 +188 +191 +191 +195 +194 +195 +197 +197 +199 +198 +201 +201 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +205 +204 +204 +204 +202 +202 +203 +200 +200 +200 +201 +200 +200 +201 +199 +199 +198 +196 +196 +194 +195 +195 +190 +191 +189 +189 +185 +185 +184 +183 +183 +179 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +115 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +54 +54 +54 +50 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +22 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +20 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +48 +51 +50 +54 +54 +59 +59 +59 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +119 +125 +126 +130 +130 +129 +133 +134 +139 +139 +139 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +161 +164 +164 +169 +169 +169 +173 +173 +174 +175 +175 +179 +178 +183 +183 +183 +184 +185 +188 +189 +191 +190 +190 +195 +195 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +203 +204 +204 +205 +204 +205 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +203 +202 +202 +200 +200 +200 +201 +199 +198 +199 +196 +197 +194 +194 +195 +191 +190 +188 +188 +189 +184 +185 +185 +185 +184 +183 +182 +179 +179 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +130 +125 +125 +120 +119 +120 +115 +115 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +75 +76 +72 +72 +69 +68 +68 +64 +64 +58 +59 +58 +55 +55 +51 +50 +50 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +51 +55 +54 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +109 +115 +116 +119 +120 +120 +125 +126 +129 +130 +134 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +179 +178 +178 +182 +183 +184 +185 +185 +188 +189 +191 +190 +190 +194 +194 +196 +196 +197 +198 +199 +200 +201 +201 +200 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +199 +198 +198 +198 +198 +196 +196 +194 +194 +195 +191 +191 +188 +188 +185 +184 +185 +183 +183 +179 +179 +178 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +126 +119 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +65 +58 +58 +59 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +38 +37 +41 +40 +43 +42 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +64 +64 +64 +68 +68 +73 +72 +72 +76 +77 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +116 +115 +115 +119 +119 +125 +126 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +189 +189 +190 +191 +191 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +201 +200 +202 +203 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +205 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +199 +197 +196 +197 +194 +194 +190 +191 +190 +188 +189 +189 +189 +189 +185 +185 +183 +183 +183 +179 +178 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +126 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +69 +64 +64 +65 +58 +58 +55 +55 +55 +51 +50 +46 +47 +47 +43 +42 +40 +41 +41 +37 +37 +33 +33 +34 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +20 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +43 +43 +43 +47 +46 +51 +51 +50 +54 +55 +59 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +83 +82 +87 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +119 +119 +126 +125 +130 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +185 +185 +185 +188 +188 +191 +191 +191 +195 +194 +194 +195 +195 +197 +196 +199 +199 +198 +200 +200 +200 +200 +201 +202 +203 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +207 +205 +204 +205 +205 +204 +203 +202 +200 +200 +200 +200 +200 +199 +198 +198 +196 +197 +194 +194 +194 +190 +190 +188 +188 +189 +185 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +134 +130 +129 +125 +125 +125 +119 +120 +116 +116 +116 +110 +109 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +54 +55 +55 +51 +50 +47 +47 +47 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +40 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +59 +58 +64 +65 +65 +68 +68 +72 +72 +77 +77 +76 +82 +82 +86 +85 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +126 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +176 +175 +175 +179 +178 +183 +182 +183 +184 +184 +184 +184 +184 +189 +189 +190 +191 +191 +195 +195 +196 +196 +196 +199 +198 +200 +201 +200 +201 +201 +202 +202 +202 +202 +203 +204 +204 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +201 +200 +200 +201 +200 +199 +199 +198 +197 +196 +194 +195 +191 +191 +191 +188 +189 +185 +184 +184 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +120 +115 +116 +110 +110 +106 +106 +106 +99 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +59 +54 +55 +55 +50 +50 +47 +47 +46 +43 +43 +43 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +29 +27 +27 +25 +24 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +58 +65 +64 +68 +69 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +184 +189 +188 +189 +191 +191 +194 +194 +194 +196 +196 +197 +196 +197 +199 +198 +200 +201 +201 +200 +200 +202 +202 +203 +205 +205 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +204 +202 +203 +200 +200 +201 +200 +200 +199 +198 +199 +197 +196 +194 +195 +194 +191 +191 +188 +189 +188 +184 +185 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +158 +157 +157 +151 +151 +146 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +126 +126 +126 +119 +120 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +72 +73 +73 +68 +69 +64 +64 +64 +59 +58 +58 +58 +58 +55 +54 +50 +50 +50 +46 +47 +43 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +20 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +55 +58 +59 +59 +64 +64 +69 +68 +68 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +99 +105 +106 +110 +110 +110 +115 +116 +119 +120 +120 +125 +126 +130 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +184 +184 +184 +185 +184 +188 +188 +190 +190 +191 +194 +194 +197 +197 +198 +198 +199 +200 +201 +200 +200 +200 +202 +203 +204 +204 +205 +204 +205 +207 +207 +206 +206 +207 +207 +207 +207 +207 +206 +207 +207 +206 +207 +206 +205 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +201 +198 +198 +198 +196 +197 +195 +195 +194 +190 +191 +189 +189 +185 +185 +185 +183 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +144 +142 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +120 +119 +116 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +56 +55 +55 +50 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +55 +58 +58 +65 +64 +65 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +89 +97 +96 +96 +100 +100 +106 +105 +109 +110 +110 +116 +115 +119 +120 +119 +125 +125 +126 +126 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +183 +185 +185 +188 +189 +190 +191 +191 +194 +195 +197 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +204 +205 +205 +205 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +205 +204 +204 +205 +204 +203 +202 +202 +201 +201 +200 +201 +199 +198 +198 +196 +197 +195 +194 +194 +190 +190 +189 +189 +188 +185 +185 +183 +182 +183 +178 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +116 +116 +116 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +81 +82 +82 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +59 +54 +54 +54 +54 +55 +50 +50 +46 +47 +47 +43 +43 +41 +40 +37 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +20 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +26 +31 +31 +33 +33 +33 +37 +37 +40 +40 +44 +43 +42 +47 +47 +51 +50 +51 +54 +55 +58 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +116 +116 +120 +120 +125 +125 +127 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +147 +147 +147 +151 +152 +157 +157 +157 +161 +161 +165 +165 +168 +169 +170 +173 +173 +175 +175 +175 +179 +178 +183 +182 +182 +185 +184 +189 +188 +189 +191 +191 +195 +194 +195 +196 +197 +198 +199 +201 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +201 +201 +200 +200 +199 +198 +196 +196 +196 +194 +195 +190 +190 +190 +188 +189 +184 +184 +183 +182 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +129 +129 +125 +125 +125 +126 +126 +119 +120 +116 +116 +116 +110 +110 +106 +106 +107 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +59 +57 +55 +54 +51 +51 +46 +46 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +42 +43 +46 +47 +47 +50 +50 +54 +55 +55 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +109 +110 +115 +115 +116 +119 +119 +125 +125 +125 +130 +129 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +162 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +188 +190 +191 +190 +195 +194 +196 +196 +197 +198 +198 +200 +200 +201 +201 +201 +202 +202 +202 +205 +204 +204 +205 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +205 +204 +204 +204 +202 +202 +202 +200 +201 +200 +201 +200 +199 +198 +196 +196 +195 +195 +195 +190 +190 +188 +189 +188 +185 +185 +183 +183 +183 +179 +179 +175 +174 +175 +173 +173 +169 +169 +170 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +144 +139 +139 +133 +133 +133 +129 +129 +126 +126 +126 +119 +119 +116 +115 +109 +110 +110 +105 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +86 +86 +82 +83 +79 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +59 +55 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +22 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +54 +55 +58 +59 +65 +65 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +117 +116 +120 +120 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +178 +179 +179 +183 +182 +185 +184 +185 +188 +189 +191 +190 +190 +195 +194 +197 +196 +197 +198 +198 +200 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +205 +204 +205 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +196 +196 +195 +194 +195 +190 +190 +189 +188 +189 +185 +185 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +133 +133 +129 +129 +129 +126 +126 +120 +119 +120 +116 +116 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +65 +58 +58 +54 +54 +55 +50 +50 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +38 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +59 +59 +64 +65 +68 +68 +67 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +117 +120 +120 +125 +125 +130 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +172 +174 +175 +174 +179 +178 +182 +183 +183 +184 +185 +189 +189 +189 +190 +191 +194 +194 +195 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +197 +195 +194 +190 +190 +189 +189 +189 +184 +184 +182 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +126 +126 +126 +120 +119 +115 +116 +116 +110 +110 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +56 +58 +58 +64 +64 +69 +69 +68 +73 +72 +76 +77 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +95 +96 +99 +100 +105 +106 +106 +110 +110 +115 +116 +116 +120 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +160 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +189 +188 +190 +190 +191 +195 +194 +196 +197 +197 +199 +199 +201 +200 +200 +200 +200 +202 +203 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +201 +200 +200 +200 +199 +198 +198 +196 +196 +195 +194 +194 +190 +190 +189 +188 +188 +184 +184 +184 +184 +184 +183 +183 +179 +179 +178 +175 +175 +173 +172 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +140 +140 +133 +133 +129 +129 +126 +125 +125 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +55 +54 +55 +51 +50 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +46 +46 +47 +50 +51 +54 +54 +55 +59 +59 +58 +58 +58 +64 +64 +69 +69 +68 +72 +72 +77 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +168 +169 +169 +173 +173 +174 +175 +179 +178 +178 +183 +183 +184 +184 +184 +188 +188 +191 +191 +190 +195 +194 +197 +197 +196 +198 +198 +200 +200 +201 +200 +201 +202 +203 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +205 +204 +205 +205 +204 +202 +203 +201 +201 +200 +200 +200 +198 +198 +198 +196 +196 +197 +196 +196 +195 +194 +190 +190 +191 +188 +189 +185 +184 +185 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +119 +116 +116 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +77 +76 +76 +73 +72 +68 +68 +69 +64 +64 +58 +58 +58 +55 +55 +51 +51 +47 +47 +46 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +46 +47 +46 +50 +50 +55 +54 +56 +59 +59 +64 +64 +68 +69 +69 +73 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +115 +115 +120 +120 +119 +125 +125 +129 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +184 +184 +188 +189 +188 +191 +191 +195 +195 +197 +196 +197 +199 +198 +200 +200 +200 +200 +201 +200 +201 +201 +202 +202 +204 +204 +204 +205 +205 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +204 +204 +204 +203 +202 +200 +200 +200 +201 +200 +198 +198 +198 +196 +197 +195 +194 +191 +190 +191 +189 +189 +185 +185 +184 +183 +183 +183 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +120 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +89 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +65 +64 +58 +59 +55 +54 +55 +51 +51 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +32 +34 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +42 +47 +47 +51 +50 +51 +54 +55 +58 +58 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +178 +179 +182 +183 +185 +185 +185 +189 +188 +191 +191 +190 +194 +194 +196 +197 +197 +198 +199 +201 +200 +201 +201 +200 +202 +202 +203 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +203 +202 +202 +200 +201 +200 +200 +200 +198 +198 +197 +196 +197 +194 +195 +195 +195 +194 +190 +190 +189 +189 +189 +184 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +134 +129 +130 +125 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +99 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +65 +58 +58 +55 +54 +55 +51 +50 +47 +46 +47 +43 +42 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +18 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +58 +59 +65 +64 +68 +68 +72 +72 +73 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +109 +115 +116 +120 +119 +125 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +174 +179 +178 +179 +183 +183 +185 +185 +184 +188 +188 +190 +191 +191 +194 +195 +196 +196 +196 +199 +198 +201 +201 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +205 +204 +204 +206 +207 +206 +207 +207 +206 +206 +206 +206 +207 +206 +207 +207 +206 +204 +204 +204 +204 +205 +202 +202 +202 +201 +201 +201 +201 +201 +200 +200 +198 +198 +198 +196 +197 +194 +195 +191 +190 +191 +189 +189 +185 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +126 +126 +126 +119 +119 +116 +115 +115 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +24 +25 +26 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +18 +18 +19 +21 +21 +25 +24 +25 +27 +27 +31 +32 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +50 +54 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +144 +147 +148 +151 +151 +158 +157 +157 +161 +161 +165 +164 +164 +169 +169 +169 +169 +168 +173 +173 +175 +175 +174 +179 +179 +182 +182 +183 +185 +185 +189 +188 +190 +190 +190 +194 +194 +196 +196 +196 +198 +198 +199 +199 +198 +201 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +205 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +201 +200 +201 +200 +201 +198 +198 +198 +196 +196 +194 +194 +194 +191 +190 +189 +189 +189 +184 +185 +182 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +126 +125 +119 +120 +115 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +65 +59 +58 +54 +55 +55 +51 +50 +47 +46 +47 +43 +43 +41 +40 +37 +37 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +26 +25 +28 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +55 +59 +58 +58 +65 +65 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +109 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +174 +175 +175 +178 +179 +183 +182 +182 +185 +185 +185 +185 +184 +188 +189 +191 +190 +191 +194 +194 +196 +196 +196 +199 +199 +200 +200 +200 +200 +200 +202 +202 +202 +202 +202 +204 +204 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +201 +201 +198 +198 +199 +196 +197 +194 +195 +190 +190 +191 +189 +188 +185 +184 +184 +183 +182 +179 +178 +178 +174 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +125 +119 +119 +115 +115 +116 +109 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +62 +59 +58 +54 +54 +50 +51 +50 +47 +47 +43 +43 +42 +41 +41 +41 +41 +41 +37 +37 +32 +33 +34 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +46 +50 +50 +51 +55 +55 +59 +59 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +120 +126 +126 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +164 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +188 +188 +189 +190 +190 +194 +194 +194 +197 +196 +196 +196 +196 +198 +198 +200 +200 +201 +200 +201 +203 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +205 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +199 +197 +196 +194 +194 +194 +190 +191 +189 +189 +189 +185 +185 +183 +183 +182 +179 +179 +175 +175 +173 +172 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +140 +133 +133 +129 +130 +126 +125 +125 +120 +120 +116 +115 +116 +110 +110 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +65 +64 +65 +65 +58 +58 +54 +54 +55 +50 +51 +46 +47 +45 +43 +42 +41 +41 +37 +37 +36 +32 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +54 +54 +55 +54 +59 +59 +65 +64 +64 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +89 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +111 +115 +115 +119 +120 +126 +126 +126 +129 +129 +133 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +162 +165 +165 +169 +169 +168 +173 +173 +175 +175 +174 +179 +179 +178 +179 +179 +183 +183 +185 +185 +185 +188 +188 +190 +190 +194 +195 +194 +196 +197 +199 +198 +199 +201 +200 +200 +200 +200 +202 +202 +205 +204 +205 +205 +204 +206 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +201 +199 +198 +199 +197 +196 +194 +195 +191 +190 +191 +188 +188 +185 +184 +185 +183 +183 +183 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +120 +115 +115 +109 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +69 +66 +64 +64 +58 +58 +54 +54 +55 +50 +51 +47 +47 +46 +43 +43 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +105 +106 +105 +110 +110 +115 +115 +115 +119 +119 +119 +120 +119 +126 +125 +129 +129 +130 +133 +133 +139 +140 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +168 +173 +173 +173 +175 +175 +178 +179 +182 +183 +183 +184 +184 +188 +188 +188 +191 +191 +191 +191 +191 +195 +194 +197 +197 +197 +198 +199 +201 +200 +201 +200 +201 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +201 +201 +200 +201 +199 +198 +198 +196 +196 +195 +194 +194 +191 +190 +188 +188 +189 +185 +185 +182 +182 +182 +179 +179 +175 +175 +173 +173 +172 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +126 +126 +125 +119 +119 +116 +115 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +68 +64 +64 +64 +64 +64 +58 +58 +55 +54 +55 +51 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +24 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +20 +25 +25 +27 +27 +27 +31 +31 +33 +33 +38 +37 +37 +41 +40 +43 +43 +43 +46 +47 +50 +51 +51 +54 +55 +58 +58 +59 +64 +64 +68 +68 +68 +72 +73 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +122 +125 +125 +129 +129 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +178 +182 +183 +183 +185 +185 +188 +188 +188 +191 +190 +194 +195 +195 +196 +196 +198 +198 +200 +200 +201 +200 +201 +202 +203 +203 +205 +204 +205 +205 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +200 +201 +201 +201 +201 +199 +198 +199 +196 +197 +194 +195 +194 +190 +191 +189 +189 +185 +185 +184 +183 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +77 +72 +72 +68 +69 +68 +65 +64 +58 +59 +58 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +55 +59 +59 +64 +64 +69 +69 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +130 +129 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +185 +189 +189 +190 +190 +191 +194 +194 +196 +196 +197 +198 +199 +201 +200 +200 +200 +201 +203 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +204 +205 +204 +205 +204 +202 +202 +202 +201 +201 +200 +200 +201 +198 +198 +196 +196 +195 +194 +194 +190 +191 +188 +188 +189 +185 +185 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +170 +164 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +130 +130 +125 +126 +123 +120 +119 +116 +116 +109 +110 +109 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +73 +69 +68 +64 +64 +64 +58 +59 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +38 +41 +41 +43 +43 +47 +47 +46 +51 +50 +55 +54 +55 +58 +59 +58 +58 +59 +64 +65 +68 +68 +68 +72 +72 +77 +76 +79 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +109 +110 +115 +116 +116 +120 +119 +126 +126 +129 +129 +130 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +182 +185 +185 +189 +189 +189 +190 +191 +194 +194 +194 +197 +196 +199 +198 +199 +200 +200 +201 +201 +203 +202 +202 +204 +204 +204 +204 +204 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +195 +194 +190 +190 +190 +189 +189 +185 +185 +185 +183 +183 +179 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +133 +130 +130 +126 +126 +126 +119 +120 +120 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +96 +95 +97 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +73 +68 +69 +69 +64 +64 +59 +59 +59 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +15 +14 +15 +17 +17 +19 +19 +19 +20 +22 +24 +25 +26 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +59 +58 +59 +64 +64 +68 +69 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +87 +86 +90 +90 +96 +95 +96 +100 +100 +106 +106 +107 +110 +109 +116 +116 +120 +120 +120 +125 +126 +129 +130 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +174 +179 +179 +183 +183 +183 +184 +185 +188 +188 +189 +191 +191 +194 +194 +196 +196 +197 +199 +199 +200 +201 +200 +201 +201 +202 +202 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +207 +207 +206 +207 +207 +206 +207 +206 +206 +204 +205 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +199 +199 +196 +196 +197 +195 +195 +191 +190 +188 +188 +188 +185 +185 +183 +182 +183 +178 +179 +179 +179 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +140 +139 +140 +133 +133 +129 +129 +129 +125 +126 +119 +119 +118 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +73 +68 +68 +64 +64 +64 +58 +58 +55 +54 +55 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +46 +47 +51 +50 +55 +55 +54 +59 +58 +64 +64 +64 +68 +68 +69 +69 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +115 +120 +119 +120 +124 +125 +129 +129 +130 +134 +133 +140 +139 +142 +143 +143 +147 +147 +151 +152 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +174 +179 +179 +182 +183 +184 +185 +185 +189 +189 +190 +191 +191 +195 +194 +194 +194 +194 +197 +196 +198 +199 +198 +200 +200 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +205 +203 +202 +201 +200 +200 +200 +200 +198 +198 +196 +196 +197 +195 +195 +195 +194 +195 +190 +190 +188 +189 +189 +185 +184 +183 +183 +181 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +140 +133 +133 +130 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +59 +54 +55 +51 +50 +51 +47 +47 +44 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +46 +47 +50 +50 +50 +55 +55 +58 +58 +61 +65 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +120 +119 +125 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +166 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +184 +185 +189 +189 +191 +190 +190 +194 +194 +196 +196 +198 +199 +198 +201 +201 +200 +200 +200 +202 +202 +204 +205 +205 +205 +204 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +197 +195 +194 +194 +191 +190 +188 +189 +189 +185 +184 +183 +183 +183 +178 +179 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +126 +120 +120 +115 +115 +111 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +65 +64 +59 +59 +59 +55 +55 +51 +51 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +46 +46 +50 +50 +54 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +91 +90 +95 +96 +96 +99 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +180 +179 +179 +183 +183 +184 +185 +189 +188 +188 +191 +190 +194 +194 +195 +196 +196 +199 +198 +198 +201 +201 +201 +201 +201 +202 +203 +204 +205 +204 +204 +205 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +207 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +199 +198 +196 +197 +197 +194 +194 +191 +191 +190 +188 +189 +189 +189 +188 +184 +184 +183 +183 +183 +179 +179 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +125 +125 +125 +119 +120 +115 +116 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +69 +68 +64 +64 +65 +58 +58 +55 +54 +54 +51 +51 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +35 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +59 +58 +64 +64 +68 +68 +69 +73 +71 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +120 +119 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +179 +179 +179 +183 +184 +184 +184 +184 +189 +188 +190 +191 +190 +194 +194 +196 +196 +197 +198 +198 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +205 +205 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +198 +197 +196 +197 +197 +197 +195 +194 +191 +191 +191 +189 +189 +185 +185 +184 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +143 +139 +139 +138 +133 +133 +129 +129 +130 +125 +125 +119 +120 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +99 +96 +96 +89 +90 +86 +86 +87 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +58 +54 +54 +51 +50 +51 +46 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +16 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +56 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +77 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +116 +116 +115 +120 +120 +125 +125 +125 +129 +130 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +182 +185 +185 +185 +189 +189 +191 +191 +191 +194 +194 +197 +196 +199 +198 +198 +200 +201 +200 +200 +200 +202 +203 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +204 +204 +204 +202 +203 +201 +200 +201 +200 +201 +198 +198 +198 +196 +197 +194 +195 +190 +190 +190 +189 +188 +185 +185 +185 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +126 +125 +126 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +58 +58 +55 +54 +51 +51 +50 +46 +46 +43 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +20 +19 +19 +17 +17 +17 +15 +15 +15 +16 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +37 +41 +41 +43 +42 +46 +46 +47 +50 +50 +55 +55 +55 +58 +58 +59 +59 +59 +64 +65 +68 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +144 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +183 +184 +185 +188 +189 +188 +191 +191 +194 +194 +195 +196 +196 +198 +199 +199 +201 +201 +200 +200 +201 +202 +203 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +205 +204 +204 +204 +205 +202 +202 +201 +200 +201 +200 +200 +198 +199 +198 +197 +197 +195 +194 +195 +190 +191 +188 +189 +189 +184 +185 +182 +182 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +148 +143 +143 +139 +139 +134 +134 +133 +129 +129 +126 +125 +125 +120 +120 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +65 +58 +58 +55 +54 +54 +50 +50 +47 +46 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +12 +13 +12 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +42 +43 +47 +47 +50 +51 +51 +54 +54 +59 +58 +59 +64 +64 +68 +69 +73 +72 +72 +76 +76 +82 +83 +82 +86 +87 +90 +90 +90 +96 +96 +100 +99 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +172 +173 +173 +175 +175 +179 +178 +179 +183 +183 +183 +183 +183 +185 +185 +189 +189 +188 +191 +191 +195 +194 +195 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +205 +205 +205 +204 +204 +202 +202 +201 +200 +201 +201 +201 +198 +198 +199 +196 +197 +195 +194 +190 +191 +190 +189 +188 +184 +185 +185 +182 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +119 +120 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +55 +55 +55 +50 +50 +47 +47 +47 +43 +42 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +40 +41 +43 +42 +47 +47 +50 +51 +50 +54 +54 +58 +58 +58 +64 +64 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +97 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +116 +115 +120 +120 +125 +125 +125 +130 +129 +133 +133 +132 +139 +139 +143 +143 +143 +143 +144 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +160 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +178 +182 +182 +183 +185 +184 +188 +189 +188 +190 +190 +190 +191 +190 +194 +194 +197 +196 +197 +198 +198 +201 +201 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +205 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +195 +195 +194 +190 +190 +189 +188 +188 +185 +185 +183 +183 +179 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +134 +133 +129 +130 +125 +125 +126 +120 +120 +115 +115 +116 +110 +110 +106 +105 +106 +100 +100 +96 +95 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +65 +64 +58 +58 +59 +55 +54 +51 +51 +49 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +40 +41 +43 +42 +47 +47 +46 +50 +51 +55 +55 +54 +59 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +89 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +115 +119 +119 +119 +125 +125 +129 +129 +130 +133 +134 +140 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +170 +169 +169 +173 +173 +174 +175 +175 +179 +179 +179 +179 +178 +183 +182 +185 +184 +185 +189 +189 +190 +190 +194 +194 +195 +196 +196 +198 +199 +198 +201 +200 +201 +200 +200 +202 +202 +204 +204 +204 +205 +204 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +199 +196 +196 +195 +195 +190 +190 +190 +189 +189 +184 +184 +184 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +134 +133 +129 +129 +125 +125 +125 +120 +119 +115 +115 +116 +109 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +65 +59 +59 +54 +54 +54 +51 +50 +47 +47 +47 +43 +43 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +16 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +59 +59 +64 +65 +64 +68 +68 +72 +73 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +107 +106 +106 +110 +110 +116 +115 +115 +119 +120 +119 +120 +119 +125 +125 +130 +129 +130 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +158 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +182 +184 +184 +185 +188 +188 +191 +190 +191 +194 +194 +196 +197 +196 +199 +198 +200 +201 +200 +200 +200 +203 +203 +202 +204 +204 +204 +205 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +203 +203 +200 +201 +201 +200 +198 +198 +199 +197 +196 +194 +194 +195 +190 +190 +188 +189 +189 +184 +185 +182 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +148 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +119 +119 +116 +116 +115 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +73 +72 +68 +68 +68 +65 +64 +58 +58 +58 +55 +54 +54 +54 +55 +51 +51 +47 +47 +47 +43 +42 +41 +41 +38 +37 +36 +33 +33 +31 +31 +31 +27 +27 +27 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +54 +54 +58 +59 +58 +65 +64 +68 +69 +69 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +117 +120 +119 +125 +125 +130 +129 +129 +134 +133 +133 +134 +133 +140 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +183 +182 +184 +185 +188 +189 +189 +190 +191 +194 +194 +197 +197 +196 +199 +199 +200 +200 +200 +200 +200 +203 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +207 +207 +206 +206 +207 +207 +206 +206 +206 +204 +204 +205 +204 +204 +203 +203 +202 +201 +200 +201 +201 +200 +199 +198 +197 +196 +196 +194 +195 +191 +190 +189 +189 +188 +185 +184 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +87 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +55 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +24 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +20 +19 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +42 +43 +47 +47 +50 +50 +55 +55 +55 +58 +58 +64 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +88 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +116 +116 +115 +116 +115 +120 +120 +125 +125 +125 +130 +129 +133 +134 +138 +139 +139 +143 +143 +147 +147 +147 +151 +152 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +182 +183 +182 +184 +185 +188 +189 +188 +190 +191 +195 +194 +194 +196 +196 +199 +199 +198 +200 +200 +200 +200 +200 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +201 +201 +200 +201 +198 +199 +196 +196 +196 +194 +194 +191 +191 +190 +188 +189 +185 +185 +185 +183 +183 +178 +179 +178 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +137 +134 +134 +129 +129 +125 +125 +125 +120 +120 +115 +115 +116 +110 +110 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +65 +65 +59 +59 +59 +55 +54 +51 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +51 +50 +51 +51 +55 +55 +58 +59 +58 +64 +64 +69 +68 +70 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +105 +105 +106 +110 +110 +115 +115 +119 +120 +120 +126 +126 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +152 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +183 +185 +184 +189 +188 +189 +190 +191 +194 +194 +195 +197 +196 +199 +198 +200 +200 +200 +201 +201 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +194 +195 +195 +190 +190 +188 +188 +184 +185 +184 +183 +182 +179 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +133 +133 +133 +130 +130 +125 +126 +125 +119 +119 +116 +115 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +73 +68 +68 +64 +64 +59 +58 +58 +54 +55 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +16 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +12 +15 +15 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +32 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +46 +50 +50 +54 +54 +54 +59 +58 +65 +64 +65 +68 +68 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +89 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +156 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +178 +183 +183 +184 +185 +189 +189 +188 +191 +190 +194 +194 +194 +196 +196 +198 +197 +198 +200 +200 +201 +200 +200 +202 +203 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +201 +200 +201 +201 +200 +198 +198 +196 +197 +196 +194 +194 +191 +191 +191 +188 +188 +188 +189 +189 +185 +185 +182 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +137 +133 +133 +130 +129 +126 +126 +126 +119 +120 +116 +116 +116 +110 +109 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +65 +64 +65 +58 +59 +54 +55 +55 +51 +51 +46 +47 +47 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +20 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +46 +47 +47 +50 +51 +54 +55 +55 +58 +58 +65 +65 +65 +69 +68 +72 +72 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +119 +119 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +175 +179 +178 +183 +183 +183 +184 +185 +189 +188 +188 +191 +191 +194 +194 +194 +197 +197 +198 +199 +201 +201 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +207 +204 +204 +204 +205 +204 +202 +203 +202 +201 +200 +201 +200 +200 +199 +199 +196 +197 +196 +195 +195 +191 +190 +189 +188 +188 +185 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +126 +125 +120 +119 +115 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +65 +59 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +53 +54 +54 +59 +59 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +105 +106 +106 +110 +110 +116 +115 +115 +120 +119 +125 +125 +125 +129 +129 +133 +134 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +184 +185 +188 +188 +191 +191 +190 +194 +194 +196 +196 +196 +198 +199 +201 +200 +200 +200 +201 +202 +202 +203 +204 +204 +204 +205 +205 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +204 +202 +202 +202 +200 +201 +200 +200 +199 +198 +199 +196 +196 +194 +194 +194 +190 +191 +189 +188 +189 +184 +184 +184 +184 +184 +182 +182 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +130 +129 +125 +125 +120 +120 +119 +116 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +91 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +58 +54 +55 +50 +51 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +32 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +24 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +51 +55 +54 +58 +59 +59 +64 +64 +69 +68 +68 +72 +72 +76 +76 +77 +82 +82 +87 +86 +89 +90 +90 +96 +96 +100 +99 +100 +106 +105 +110 +109 +110 +115 +115 +119 +119 +120 +125 +126 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +185 +184 +184 +188 +188 +191 +191 +191 +194 +195 +196 +196 +197 +198 +199 +200 +200 +201 +201 +201 +202 +202 +202 +205 +204 +204 +204 +207 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +199 +198 +199 +196 +196 +196 +197 +196 +194 +194 +191 +191 +191 +189 +188 +185 +184 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +139 +140 +139 +134 +133 +130 +129 +129 +125 +125 +119 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +95 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +59 +59 +59 +55 +54 +51 +50 +51 +47 +47 +43 +42 +41 +40 +41 +37 +37 +33 +33 +33 +31 +32 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +26 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +59 +58 +65 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +115 +116 +120 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +164 +169 +168 +169 +173 +173 +174 +175 +175 +179 +178 +179 +178 +178 +182 +183 +185 +184 +184 +188 +188 +190 +190 +191 +194 +195 +197 +197 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +205 +204 +205 +204 +204 +207 +206 +206 +206 +207 +206 +206 +207 +206 +207 +207 +207 +207 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +202 +202 +200 +200 +201 +200 +200 +198 +199 +197 +196 +196 +195 +194 +191 +191 +189 +188 +189 +185 +184 +183 +182 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +126 +126 +120 +119 +120 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +55 +54 +54 +50 +50 +47 +46 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +16 +17 +16 +19 +18 +21 +21 +21 +25 +26 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +50 +50 +55 +54 +58 +59 +59 +64 +64 +65 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +89 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +116 +120 +120 +125 +125 +125 +129 +129 +133 +134 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +166 +165 +165 +169 +169 +173 +173 +173 +173 +173 +175 +175 +175 +178 +179 +183 +182 +184 +185 +184 +189 +189 +191 +190 +190 +194 +194 +195 +194 +194 +197 +197 +199 +198 +198 +201 +201 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +205 +204 +202 +202 +200 +200 +201 +201 +200 +199 +198 +198 +196 +196 +194 +193 +195 +190 +190 +188 +188 +189 +184 +185 +182 +182 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +137 +133 +133 +129 +129 +125 +125 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +69 +68 +65 +65 +64 +58 +59 +55 +55 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +20 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +51 +51 +55 +54 +58 +58 +58 +64 +64 +68 +68 +73 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +120 +120 +126 +125 +125 +130 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +174 +173 +175 +175 +179 +178 +179 +183 +183 +183 +183 +183 +185 +185 +189 +188 +189 +191 +191 +194 +195 +195 +196 +197 +199 +198 +200 +201 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +201 +200 +201 +201 +200 +199 +198 +199 +196 +197 +194 +195 +191 +190 +191 +189 +189 +185 +185 +185 +182 +183 +178 +179 +179 +175 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +115 +116 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +55 +55 +54 +50 +50 +46 +47 +47 +43 +43 +43 +42 +42 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +22 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +55 +54 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +99 +106 +106 +105 +110 +110 +115 +115 +116 +119 +120 +120 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +185 +188 +189 +188 +191 +190 +194 +195 +195 +196 +196 +196 +196 +196 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +199 +197 +197 +194 +194 +194 +190 +191 +188 +189 +189 +184 +185 +183 +182 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +140 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +83 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +65 +65 +64 +58 +58 +55 +55 +55 +51 +50 +46 +47 +47 +43 +42 +41 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +55 +55 +59 +59 +59 +65 +64 +69 +68 +73 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +109 +111 +115 +116 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +160 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +183 +183 +183 +185 +185 +188 +188 +188 +190 +191 +194 +194 +195 +196 +196 +199 +198 +200 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +207 +207 +207 +207 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +203 +202 +202 +200 +201 +201 +200 +200 +198 +198 +197 +196 +197 +194 +195 +190 +190 +189 +188 +189 +184 +185 +183 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +130 +130 +129 +126 +125 +120 +119 +120 +115 +116 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +69 +64 +64 +59 +58 +56 +54 +54 +51 +50 +47 +46 +46 +43 +43 +40 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +50 +50 +51 +54 +55 +59 +59 +64 +64 +64 +69 +68 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +100 +106 +106 +110 +109 +116 +116 +116 +119 +119 +125 +126 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +160 +164 +165 +165 +169 +168 +173 +173 +173 +175 +175 +175 +174 +175 +178 +178 +183 +182 +183 +185 +185 +189 +188 +189 +191 +191 +195 +194 +196 +196 +196 +199 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +194 +194 +194 +190 +190 +188 +188 +189 +185 +184 +182 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +119 +119 +120 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +68 +68 +64 +64 +59 +58 +59 +54 +55 +51 +50 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +51 +50 +50 +56 +55 +58 +58 +58 +65 +65 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +101 +100 +100 +106 +106 +110 +110 +110 +116 +115 +115 +116 +116 +119 +120 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +174 +175 +176 +178 +179 +183 +182 +184 +185 +184 +189 +189 +191 +190 +191 +194 +194 +196 +197 +196 +198 +199 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +190 +188 +188 +188 +185 +185 +183 +182 +183 +179 +179 +175 +174 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +141 +133 +133 +129 +129 +126 +125 +125 +120 +120 +115 +115 +115 +110 +109 +110 +109 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +64 +64 +64 +58 +58 +54 +54 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +51 +55 +55 +59 +58 +58 +64 +64 +68 +68 +67 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +115 +119 +119 +120 +126 +125 +129 +130 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +183 +183 +185 +184 +188 +189 +189 +190 +190 +195 +194 +195 +197 +196 +199 +198 +199 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +196 +196 +195 +194 +190 +190 +191 +189 +189 +184 +184 +183 +182 +183 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +69 +68 +64 +64 +64 +59 +58 +54 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +47 +47 +51 +50 +50 +54 +54 +58 +58 +59 +65 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +87 +86 +86 +86 +90 +89 +96 +96 +96 +100 +100 +106 +106 +107 +109 +109 +116 +116 +120 +119 +119 +125 +126 +129 +129 +129 +133 +133 +134 +134 +134 +139 +140 +144 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +182 +183 +185 +185 +185 +188 +189 +190 +191 +194 +195 +195 +197 +197 +198 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +201 +199 +198 +199 +196 +197 +195 +194 +191 +191 +190 +188 +189 +185 +184 +184 +183 +182 +179 +178 +179 +174 +175 +172 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +134 +133 +129 +129 +129 +125 +125 +119 +119 +118 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +69 +68 +65 +65 +59 +58 +59 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +50 +55 +55 +54 +58 +59 +64 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +89 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +116 +115 +115 +120 +119 +125 +125 +126 +129 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +182 +182 +184 +184 +188 +189 +189 +190 +191 +194 +195 +195 +196 +196 +198 +199 +199 +200 +201 +200 +200 +201 +203 +203 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +201 +198 +199 +196 +196 +197 +194 +194 +191 +190 +190 +188 +188 +184 +185 +184 +182 +182 +179 +179 +178 +175 +175 +173 +173 +170 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +130 +129 +125 +125 +125 +119 +120 +116 +115 +116 +109 +110 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +89 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +59 +55 +54 +51 +50 +51 +47 +46 +43 +42 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +46 +46 +51 +50 +50 +51 +51 +55 +55 +58 +58 +59 +64 +64 +68 +68 +70 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +117 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +184 +185 +189 +189 +189 +190 +190 +195 +194 +194 +196 +197 +198 +198 +201 +200 +199 +200 +200 +203 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +197 +194 +195 +190 +191 +191 +189 +188 +184 +185 +183 +182 +183 +179 +179 +179 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +152 +147 +147 +147 +143 +142 +139 +139 +139 +133 +134 +134 +133 +133 +129 +129 +125 +125 +126 +119 +119 +116 +116 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +48 +51 +50 +55 +54 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +105 +106 +110 +109 +116 +115 +116 +120 +120 +125 +126 +125 +129 +129 +133 +133 +134 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +184 +184 +189 +189 +188 +190 +190 +194 +194 +194 +196 +196 +198 +199 +199 +200 +200 +201 +200 +201 +202 +202 +204 +204 +205 +204 +205 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +197 +196 +196 +195 +194 +191 +190 +191 +189 +188 +189 +189 +188 +185 +184 +182 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +119 +115 +116 +110 +110 +110 +106 +100 +100 +100 +100 +96 +96 +90 +90 +91 +86 +85 +82 +83 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +55 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +38 +41 +41 +43 +43 +47 +46 +47 +50 +50 +55 +54 +54 +58 +58 +58 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +116 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +184 +185 +188 +189 +188 +191 +190 +195 +194 +194 +196 +197 +198 +198 +199 +200 +200 +200 +200 +203 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +200 +200 +198 +198 +199 +199 +198 +196 +196 +194 +194 +195 +190 +190 +188 +189 +187 +184 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +172 +169 +169 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +129 +125 +125 +119 +119 +119 +116 +116 +110 +110 +110 +105 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +59 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +22 +22 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +20 +24 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +57 +58 +58 +64 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +116 +119 +120 +120 +125 +125 +130 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +186 +188 +188 +189 +191 +191 +195 +194 +197 +197 +197 +198 +198 +200 +200 +200 +200 +200 +203 +202 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +205 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +197 +195 +194 +190 +190 +191 +188 +188 +185 +184 +184 +182 +183 +183 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +119 +115 +116 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +54 +54 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +46 +47 +47 +51 +51 +55 +55 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +115 +115 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +178 +179 +178 +182 +183 +185 +184 +188 +188 +189 +191 +190 +194 +195 +195 +197 +197 +198 +198 +199 +200 +200 +200 +200 +201 +203 +203 +204 +204 +204 +204 +205 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +205 +204 +205 +204 +204 +202 +202 +203 +200 +201 +200 +200 +198 +198 +199 +196 +197 +194 +195 +194 +191 +190 +190 +190 +190 +189 +188 +185 +185 +185 +183 +183 +178 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +126 +125 +120 +119 +119 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +59 +54 +54 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +16 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +46 +51 +50 +51 +54 +54 +58 +58 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +101 +100 +100 +106 +106 +110 +110 +109 +115 +116 +119 +120 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +160 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +179 +178 +179 +183 +183 +185 +184 +185 +188 +188 +191 +190 +191 +194 +194 +197 +196 +196 +198 +199 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +207 +204 +205 +205 +204 +202 +202 +202 +200 +200 +200 +200 +200 +199 +199 +198 +199 +198 +197 +197 +195 +194 +194 +190 +191 +188 +189 +189 +184 +184 +183 +183 +179 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +126 +119 +119 +115 +115 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +65 +64 +64 +58 +58 +55 +55 +55 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +24 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +54 +54 +55 +59 +58 +64 +65 +68 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +120 +119 +120 +126 +126 +129 +129 +129 +133 +134 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +178 +178 +182 +183 +183 +185 +185 +188 +189 +188 +190 +190 +195 +195 +196 +197 +198 +198 +200 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +200 +200 +200 +200 +200 +198 +198 +199 +196 +197 +194 +194 +193 +190 +191 +189 +188 +184 +184 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +144 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +126 +120 +119 +116 +116 +116 +110 +110 +105 +106 +101 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +55 +54 +51 +50 +51 +46 +48 +42 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +50 +51 +51 +54 +54 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +101 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +119 +125 +125 +130 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +152 +151 +151 +157 +157 +162 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +183 +185 +185 +188 +189 +191 +190 +191 +194 +194 +197 +196 +197 +198 +198 +198 +198 +198 +200 +201 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +205 +204 +202 +202 +201 +200 +201 +200 +201 +198 +198 +198 +196 +197 +194 +195 +195 +190 +190 +189 +189 +188 +184 +185 +183 +183 +183 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +140 +139 +133 +133 +129 +129 +126 +125 +125 +119 +119 +116 +116 +115 +109 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +69 +68 +65 +64 +64 +59 +58 +54 +55 +55 +50 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +172 +174 +175 +175 +179 +179 +182 +183 +182 +184 +185 +189 +188 +189 +190 +190 +191 +191 +190 +195 +194 +197 +196 +196 +199 +198 +200 +201 +200 +200 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +205 +204 +205 +204 +205 +203 +202 +202 +200 +201 +200 +200 +200 +199 +198 +197 +196 +196 +194 +195 +191 +190 +191 +188 +189 +185 +185 +183 +182 +182 +179 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +50 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +59 +59 +65 +64 +68 +68 +72 +72 +71 +76 +76 +82 +82 +83 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +174 +175 +179 +178 +183 +183 +182 +184 +185 +188 +188 +188 +191 +190 +195 +194 +195 +196 +197 +198 +199 +200 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +204 +204 +205 +204 +204 +202 +203 +201 +200 +200 +200 +200 +198 +198 +199 +196 +197 +194 +195 +190 +190 +191 +189 +189 +185 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +115 +117 +110 +110 +106 +106 +101 +100 +100 +96 +96 +91 +90 +90 +86 +86 +81 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +46 +51 +51 +55 +54 +54 +58 +58 +65 +64 +65 +69 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +116 +116 +119 +120 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +175 +175 +179 +178 +180 +183 +183 +185 +184 +188 +188 +189 +191 +191 +194 +194 +194 +197 +196 +196 +196 +197 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +204 +204 +205 +205 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +194 +194 +190 +191 +188 +188 +188 +185 +185 +183 +183 +183 +179 +178 +175 +175 +173 +173 +174 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +129 +126 +126 +125 +119 +119 +116 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +59 +59 +55 +55 +54 +51 +50 +46 +47 +47 +43 +43 +41 +41 +39 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +36 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +109 +110 +115 +115 +115 +119 +120 +125 +125 +125 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +178 +178 +179 +183 +182 +184 +185 +184 +189 +188 +189 +189 +188 +190 +190 +195 +194 +195 +196 +197 +198 +198 +200 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +204 +204 +205 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +198 +196 +197 +196 +194 +194 +190 +191 +191 +188 +189 +185 +184 +182 +182 +182 +179 +178 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +140 +133 +133 +130 +129 +129 +125 +125 +119 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +58 +55 +54 +51 +51 +49 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +20 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +58 +59 +59 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +100 +100 +106 +106 +107 +110 +110 +115 +116 +120 +119 +119 +125 +125 +129 +129 +129 +134 +133 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +174 +179 +178 +182 +183 +182 +185 +185 +188 +189 +189 +191 +191 +194 +195 +196 +196 +196 +198 +199 +200 +200 +200 +200 +201 +202 +202 +203 +204 +205 +204 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +205 +205 +202 +202 +202 +200 +200 +200 +200 +201 +198 +199 +196 +196 +195 +194 +195 +191 +191 +188 +189 +189 +184 +185 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +116 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +70 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +50 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +51 +51 +50 +55 +54 +58 +59 +59 +64 +65 +68 +69 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +110 +116 +115 +115 +115 +116 +120 +120 +126 +125 +125 +129 +129 +133 +133 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +158 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +174 +176 +178 +179 +183 +183 +184 +185 +185 +188 +188 +190 +190 +190 +194 +194 +197 +197 +196 +199 +199 +200 +201 +201 +200 +200 +202 +202 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +207 +207 +206 +207 +205 +204 +205 +205 +204 +202 +202 +201 +201 +200 +201 +200 +198 +199 +198 +197 +196 +194 +194 +194 +190 +191 +189 +188 +188 +185 +185 +183 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +130 +129 +126 +125 +126 +119 +119 +115 +115 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +87 +86 +82 +82 +76 +76 +72 +72 +73 +68 +68 +65 +64 +64 +58 +59 +55 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +39 +37 +36 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +43 +43 +43 +47 +47 +51 +50 +50 +55 +55 +58 +59 +59 +64 +64 +68 +68 +68 +72 +73 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +160 +161 +165 +165 +169 +169 +172 +173 +173 +175 +174 +178 +179 +179 +183 +182 +185 +185 +184 +189 +188 +191 +190 +191 +195 +194 +197 +196 +197 +199 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +205 +204 +205 +204 +202 +202 +202 +202 +202 +200 +200 +201 +201 +201 +198 +198 +196 +196 +196 +194 +195 +191 +190 +190 +188 +188 +184 +184 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +128 +125 +126 +126 +125 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +89 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +56 +55 +54 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +46 +47 +46 +51 +50 +55 +55 +55 +58 +59 +64 +64 +68 +69 +68 +72 +72 +76 +77 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +109 +116 +115 +116 +119 +119 +126 +125 +125 +129 +129 +130 +129 +129 +133 +133 +140 +140 +139 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +189 +188 +190 +190 +190 +194 +195 +197 +197 +197 +198 +199 +200 +200 +200 +200 +200 +202 +203 +202 +205 +204 +204 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +200 +201 +199 +198 +196 +197 +195 +194 +195 +190 +190 +188 +189 +188 +184 +184 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +123 +120 +120 +116 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +54 +50 +50 +46 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +34 +32 +30 +31 +27 +27 +25 +25 +25 +21 +20 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +46 +46 +50 +51 +50 +54 +55 +59 +58 +58 +65 +65 +68 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +110 +115 +116 +116 +115 +116 +120 +120 +125 +125 +125 +129 +129 +133 +133 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +182 +182 +185 +185 +188 +188 +188 +191 +190 +195 +194 +195 +196 +196 +199 +199 +198 +200 +200 +200 +201 +201 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +201 +200 +198 +199 +196 +196 +196 +194 +194 +190 +190 +191 +189 +189 +185 +185 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +164 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +131 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +105 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +58 +54 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +42 +40 +41 +42 +43 +46 +47 +47 +51 +50 +50 +50 +50 +55 +54 +58 +58 +59 +65 +64 +69 +69 +68 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +99 +106 +105 +106 +110 +110 +116 +116 +118 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +182 +185 +185 +188 +189 +189 +190 +191 +195 +194 +194 +196 +196 +198 +198 +200 +201 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +199 +199 +197 +196 +197 +194 +195 +191 +191 +191 +189 +189 +185 +185 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +126 +125 +125 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +64 +59 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +12 +15 +14 +17 +17 +16 +19 +19 +21 +21 +22 +25 +24 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +57 +59 +59 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +116 +120 +119 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +168 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +188 +189 +191 +190 +190 +194 +194 +196 +196 +197 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +201 +200 +201 +198 +199 +196 +196 +196 +194 +194 +190 +190 +191 +189 +189 +188 +188 +189 +185 +185 +182 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +58 +54 +54 +51 +50 +50 +46 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +46 +50 +51 +55 +55 +54 +58 +58 +64 +64 +66 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +116 +119 +120 +119 +125 +125 +129 +129 +129 +133 +133 +140 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +178 +178 +183 +182 +182 +184 +185 +188 +188 +189 +191 +191 +194 +194 +194 +196 +197 +199 +199 +200 +201 +201 +200 +200 +202 +202 +202 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +205 +205 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +201 +200 +200 +198 +198 +198 +197 +197 +194 +194 +193 +191 +190 +188 +188 +184 +184 +185 +183 +182 +183 +183 +182 +179 +179 +179 +179 +178 +175 +175 +173 +173 +173 +168 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +126 +126 +119 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +67 +68 +64 +64 +59 +58 +58 +54 +54 +51 +51 +51 +46 +47 +43 +42 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +15 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +36 +37 +41 +40 +43 +43 +44 +47 +46 +50 +51 +54 +54 +54 +58 +59 +65 +65 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +89 +90 +95 +95 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +189 +188 +189 +191 +191 +194 +195 +194 +196 +196 +198 +199 +198 +200 +201 +201 +201 +201 +203 +202 +204 +205 +204 +205 +204 +206 +207 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +204 +205 +205 +204 +205 +202 +202 +200 +200 +201 +200 +201 +198 +199 +196 +196 +196 +194 +195 +191 +190 +191 +189 +188 +188 +188 +189 +184 +184 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +125 +125 +120 +120 +116 +115 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +69 +65 +64 +64 +59 +59 +54 +55 +55 +50 +50 +47 +47 +47 +43 +42 +41 +41 +40 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +38 +37 +37 +41 +41 +43 +42 +43 +47 +46 +51 +51 +51 +55 +55 +58 +58 +58 +65 +64 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +120 +119 +125 +125 +129 +130 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +184 +185 +188 +189 +191 +191 +190 +194 +194 +196 +197 +197 +198 +198 +201 +201 +201 +200 +200 +203 +202 +204 +204 +204 +205 +205 +206 +207 +207 +206 +207 +206 +206 +206 +207 +207 +207 +206 +207 +206 +206 +205 +204 +205 +204 +204 +202 +203 +200 +201 +200 +201 +200 +198 +198 +198 +197 +196 +196 +196 +196 +194 +195 +190 +191 +191 +188 +189 +185 +184 +183 +183 +183 +178 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +152 +151 +151 +148 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +126 +125 +120 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +51 +50 +51 +47 +46 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +30 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +55 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +116 +120 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +182 +185 +185 +189 +188 +189 +191 +191 +195 +195 +195 +196 +197 +198 +198 +200 +201 +200 +200 +200 +202 +202 +202 +204 +204 +204 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +207 +206 +204 +204 +204 +204 +204 +203 +202 +202 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +196 +195 +195 +195 +191 +190 +188 +188 +189 +184 +185 +183 +183 +183 +178 +179 +175 +175 +175 +175 +176 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +58 +58 +58 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +20 +25 +25 +25 +25 +26 +27 +27 +31 +31 +32 +33 +33 +37 +37 +37 +41 +40 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +58 +58 +65 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +125 +130 +130 +133 +134 +133 +139 +139 +143 +144 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +188 +189 +188 +191 +190 +195 +194 +194 +196 +197 +196 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +203 +203 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +198 +199 +196 +197 +194 +194 +195 +191 +191 +189 +188 +189 +185 +185 +183 +183 +179 +179 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +129 +129 +129 +126 +125 +120 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +81 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +58 +58 +58 +55 +54 +51 +50 +51 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +47 +47 +50 +50 +50 +54 +55 +58 +59 +58 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +152 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +178 +178 +183 +182 +183 +183 +183 +185 +185 +189 +188 +188 +190 +191 +195 +194 +195 +196 +197 +198 +198 +200 +200 +200 +201 +201 +202 +202 +203 +205 +204 +205 +205 +205 +204 +205 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +207 +204 +204 +204 +204 +204 +202 +202 +201 +201 +201 +200 +200 +199 +198 +199 +196 +197 +195 +194 +190 +191 +191 +188 +189 +185 +184 +185 +182 +182 +183 +183 +183 +179 +179 +175 +175 +175 +173 +172 +169 +169 +168 +164 +165 +161 +161 +157 +157 +157 +151 +151 +146 +147 +147 +143 +143 +139 +139 +139 +134 +133 +130 +129 +129 +125 +126 +120 +120 +120 +116 +116 +109 +110 +107 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +69 +64 +64 +58 +58 +54 +54 +54 +50 +51 +46 +46 +47 +43 +42 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +28 +27 +31 +31 +32 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +46 +49 +51 +50 +54 +54 +59 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +189 +189 +189 +190 +191 +194 +194 +194 +197 +197 +196 +197 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +203 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +200 +200 +200 +200 +201 +199 +198 +198 +196 +196 +194 +195 +195 +190 +191 +188 +188 +188 +185 +184 +182 +183 +183 +179 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +126 +125 +125 +120 +119 +115 +115 +116 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +59 +58 +59 +59 +58 +54 +54 +50 +50 +50 +47 +47 +43 +43 +42 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +37 +37 +37 +41 +40 +43 +42 +43 +47 +47 +51 +51 +51 +54 +55 +58 +58 +58 +65 +64 +68 +68 +69 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +95 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +179 +182 +182 +183 +183 +183 +185 +184 +188 +188 +189 +190 +191 +195 +195 +196 +196 +196 +199 +198 +200 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +205 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +204 +205 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +199 +196 +196 +194 +195 +191 +190 +191 +189 +188 +184 +185 +184 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +126 +125 +119 +120 +116 +116 +116 +109 +109 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +61 +58 +58 +54 +55 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +34 +33 +37 +37 +41 +41 +40 +43 +43 +47 +46 +47 +51 +51 +54 +55 +59 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +109 +116 +116 +119 +119 +119 +125 +125 +126 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +183 +183 +185 +185 +189 +188 +190 +191 +191 +194 +194 +196 +196 +197 +199 +199 +200 +201 +201 +200 +200 +202 +203 +203 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +205 +202 +203 +201 +201 +200 +200 +200 +199 +199 +196 +196 +196 +194 +194 +191 +190 +190 +188 +189 +185 +185 +184 +183 +183 +179 +178 +179 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +150 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +119 +120 +120 +115 +116 +109 +110 +110 +106 +106 +106 +105 +106 +100 +99 +96 +96 +96 +90 +90 +87 +86 +84 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +64 +58 +58 +58 +58 +58 +54 +54 +50 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +18 +19 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +40 +41 +42 +43 +47 +47 +47 +50 +51 +54 +55 +54 +58 +58 +64 +64 +64 +68 +69 +72 +72 +73 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +101 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +119 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +184 +185 +189 +188 +188 +190 +191 +195 +195 +195 +196 +197 +199 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +204 +202 +202 +203 +201 +201 +200 +201 +200 +198 +199 +196 +196 +196 +194 +195 +191 +191 +190 +189 +189 +184 +185 +182 +183 +183 +178 +178 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +160 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +126 +120 +120 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +65 +64 +65 +58 +58 +54 +54 +52 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +20 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +24 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +59 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +81 +86 +86 +90 +90 +89 +96 +96 +100 +100 +100 +106 +106 +110 +110 +112 +115 +115 +119 +120 +125 +126 +125 +129 +130 +133 +134 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +182 +183 +185 +185 +188 +189 +189 +190 +191 +194 +195 +196 +196 +197 +198 +198 +200 +201 +200 +201 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +207 +207 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +200 +200 +200 +199 +198 +199 +196 +196 +194 +195 +191 +191 +191 +188 +189 +184 +184 +184 +183 +183 +179 +179 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +120 +119 +120 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +95 +96 +90 +90 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +69 +65 +64 +58 +58 +59 +54 +55 +50 +51 +50 +46 +47 +42 +42 +43 +41 +40 +36 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +28 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +42 +44 +47 +47 +51 +50 +55 +54 +54 +59 +58 +64 +65 +65 +68 +68 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +115 +116 +116 +115 +119 +120 +125 +125 +125 +130 +129 +133 +133 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +182 +182 +184 +185 +188 +189 +189 +190 +191 +195 +194 +194 +196 +196 +199 +198 +198 +201 +200 +201 +200 +201 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +205 +205 +204 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +198 +196 +197 +196 +194 +194 +190 +191 +190 +188 +189 +185 +185 +184 +182 +183 +179 +179 +179 +175 +174 +173 +173 +168 +169 +169 +164 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +139 +139 +139 +137 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +58 +55 +54 +50 +50 +51 +46 +47 +43 +43 +42 +41 +41 +37 +37 +33 +32 +33 +30 +31 +27 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +18 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +50 +51 +54 +55 +55 +58 +59 +64 +64 +64 +69 +68 +72 +72 +74 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +105 +106 +109 +109 +110 +115 +116 +120 +120 +124 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +172 +175 +175 +178 +179 +179 +183 +182 +185 +184 +184 +188 +189 +191 +190 +190 +194 +194 +196 +196 +196 +198 +199 +200 +200 +201 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +205 +205 +204 +204 +202 +202 +200 +200 +200 +200 +201 +199 +198 +199 +196 +196 +194 +194 +194 +190 +190 +189 +188 +189 +184 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +120 +119 +119 +116 +115 +110 +110 +110 +105 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +59 +55 +54 +51 +50 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +46 +50 +50 +51 +54 +55 +58 +59 +59 +65 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +185 +184 +185 +188 +188 +191 +190 +195 +195 +195 +196 +196 +199 +199 +198 +200 +200 +201 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +207 +207 +206 +206 +207 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +200 +199 +198 +200 +196 +197 +194 +194 +190 +191 +191 +189 +188 +184 +184 +185 +183 +182 +183 +182 +183 +178 +178 +175 +175 +175 +172 +173 +169 +169 +169 +164 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +120 +120 +119 +116 +116 +110 +109 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +77 +76 +72 +72 +69 +68 +68 +64 +64 +58 +59 +58 +55 +54 +51 +51 +51 +47 +46 +42 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +28 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +34 +33 +37 +36 +37 +41 +41 +42 +43 +43 +47 +47 +50 +50 +55 +55 +54 +59 +58 +64 +64 +64 +68 +68 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +87 +86 +88 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +115 +119 +120 +125 +125 +126 +129 +130 +133 +133 +138 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +172 +173 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +189 +191 +191 +194 +195 +195 +196 +197 +198 +198 +198 +200 +201 +201 +200 +201 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +198 +196 +197 +196 +195 +194 +194 +194 +194 +191 +190 +188 +189 +188 +185 +185 +183 +182 +181 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +160 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +85 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +46 +46 +50 +50 +54 +55 +54 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +89 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +120 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +182 +182 +184 +184 +189 +188 +188 +190 +191 +195 +194 +195 +196 +197 +198 +199 +201 +201 +201 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +205 +204 +204 +205 +204 +202 +202 +202 +200 +200 +201 +200 +200 +201 +200 +197 +198 +198 +196 +196 +195 +194 +195 +191 +191 +189 +188 +184 +184 +184 +182 +182 +179 +179 +179 +175 +174 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +130 +125 +125 +120 +119 +120 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +95 +90 +90 +86 +86 +87 +82 +82 +76 +77 +77 +72 +72 +68 +69 +69 +64 +64 +58 +58 +54 +55 +55 +51 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +20 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +46 +46 +50 +50 +50 +54 +54 +58 +59 +59 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +188 +188 +191 +191 +191 +194 +194 +197 +197 +196 +199 +198 +200 +200 +200 +200 +200 +202 +202 +202 +205 +205 +204 +205 +205 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +200 +198 +199 +196 +197 +194 +194 +194 +191 +190 +188 +189 +189 +185 +185 +185 +185 +184 +182 +183 +179 +179 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +160 +157 +158 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +130 +129 +125 +125 +120 +119 +119 +116 +115 +109 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +55 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +40 +42 +43 +47 +46 +47 +50 +50 +54 +54 +55 +59 +59 +65 +65 +64 +68 +69 +72 +73 +73 +77 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +179 +179 +179 +183 +183 +184 +184 +185 +189 +188 +190 +190 +190 +194 +195 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +207 +207 +206 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +203 +201 +200 +200 +200 +201 +198 +198 +198 +198 +198 +197 +197 +195 +195 +195 +191 +191 +189 +189 +185 +184 +184 +183 +183 +178 +179 +179 +175 +174 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +146 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +115 +115 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +90 +90 +89 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +59 +55 +54 +55 +50 +51 +47 +46 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +18 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +41 +43 +43 +46 +46 +47 +50 +50 +54 +55 +55 +58 +58 +65 +64 +68 +69 +69 +73 +73 +76 +76 +76 +82 +82 +86 +87 +86 +90 +89 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +120 +119 +119 +126 +126 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +182 +184 +185 +189 +188 +189 +190 +191 +195 +194 +195 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +207 +204 +204 +205 +204 +204 +203 +202 +202 +202 +203 +201 +200 +200 +201 +200 +198 +199 +196 +196 +195 +194 +195 +190 +190 +188 +188 +188 +184 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +129 +129 +129 +125 +125 +120 +120 +119 +115 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +69 +65 +64 +58 +59 +55 +54 +54 +51 +51 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +30 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +43 +47 +47 +50 +50 +51 +55 +55 +58 +58 +58 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +109 +110 +110 +116 +116 +120 +119 +120 +125 +125 +129 +129 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +188 +189 +191 +191 +191 +195 +195 +196 +197 +197 +199 +199 +201 +200 +201 +200 +201 +202 +203 +203 +205 +205 +204 +205 +205 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +201 +200 +201 +199 +198 +196 +196 +196 +195 +194 +191 +191 +190 +188 +189 +185 +184 +185 +183 +183 +178 +179 +179 +175 +175 +173 +174 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +143 +139 +139 +133 +133 +133 +130 +129 +125 +126 +120 +119 +119 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +69 +68 +64 +64 +59 +59 +59 +55 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +54 +55 +58 +59 +64 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +120 +119 +126 +126 +126 +130 +129 +133 +134 +140 +140 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +185 +184 +188 +189 +188 +190 +191 +191 +191 +191 +195 +194 +197 +196 +197 +198 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +205 +204 +205 +207 +207 +207 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +197 +197 +195 +195 +191 +190 +191 +189 +189 +184 +185 +183 +183 +183 +179 +179 +174 +175 +175 +173 +173 +168 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +126 +126 +120 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +73 +72 +68 +68 +68 +65 +64 +58 +58 +59 +54 +55 +50 +51 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +20 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +46 +47 +47 +51 +51 +54 +54 +54 +58 +59 +65 +65 +69 +68 +69 +73 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +106 +110 +110 +115 +116 +120 +120 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +182 +183 +185 +185 +188 +188 +189 +190 +191 +194 +194 +195 +196 +197 +199 +198 +200 +200 +200 +201 +200 +202 +202 +202 +204 +204 +205 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +204 +205 +205 +204 +203 +202 +201 +201 +200 +200 +200 +199 +199 +199 +196 +197 +194 +195 +190 +191 +191 +188 +188 +184 +184 +185 +182 +183 +179 +179 +179 +175 +176 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +148 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +95 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +77 +76 +76 +72 +72 +69 +68 +69 +64 +64 +58 +58 +55 +55 +54 +50 +50 +47 +46 +47 +42 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +32 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +47 +47 +51 +50 +54 +54 +54 +58 +58 +65 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +109 +116 +116 +120 +119 +120 +126 +126 +130 +130 +129 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +160 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +182 +185 +184 +189 +189 +188 +191 +191 +191 +191 +191 +195 +195 +197 +196 +197 +199 +198 +200 +201 +200 +201 +201 +203 +202 +204 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +204 +205 +203 +202 +200 +200 +200 +201 +201 +198 +198 +198 +196 +196 +195 +194 +195 +190 +190 +188 +188 +188 +184 +185 +183 +183 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +134 +133 +129 +129 +126 +125 +125 +120 +120 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +69 +69 +68 +64 +64 +59 +58 +58 +54 +55 +51 +50 +51 +47 +46 +43 +43 +40 +41 +41 +37 +36 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +24 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +40 +41 +43 +43 +43 +46 +47 +51 +51 +50 +54 +55 +58 +58 +59 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +115 +116 +119 +120 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +183 +183 +183 +185 +185 +189 +189 +189 +191 +190 +194 +195 +195 +197 +197 +198 +199 +200 +201 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +204 +204 +204 +205 +204 +203 +202 +203 +200 +200 +201 +201 +200 +198 +198 +197 +196 +196 +195 +195 +190 +190 +188 +189 +188 +185 +184 +182 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +116 +110 +110 +108 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +61 +59 +58 +55 +55 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +20 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +15 +15 +15 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +59 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +81 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +120 +126 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +149 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +184 +186 +188 +189 +191 +191 +194 +194 +195 +196 +196 +198 +198 +199 +201 +201 +200 +200 +201 +203 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +205 +205 +204 +203 +202 +200 +200 +200 +200 +201 +198 +199 +197 +196 +196 +195 +194 +190 +191 +190 +189 +188 +185 +184 +184 +182 +182 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +138 +133 +133 +133 +129 +128 +125 +125 +126 +119 +119 +116 +115 +110 +109 +110 +106 +106 +100 +99 +100 +96 +95 +96 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +54 +51 +50 +51 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +55 +54 +58 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +105 +106 +105 +106 +110 +110 +115 +116 +115 +120 +120 +125 +126 +127 +129 +129 +134 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +178 +179 +183 +183 +184 +185 +185 +188 +188 +191 +191 +191 +195 +195 +196 +197 +197 +198 +199 +200 +200 +200 +201 +201 +203 +203 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +204 +204 +205 +204 +205 +202 +202 +201 +200 +200 +200 +200 +201 +200 +200 +199 +198 +197 +196 +196 +194 +194 +191 +191 +190 +188 +189 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +126 +125 +125 +120 +119 +116 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +77 +76 +77 +72 +72 +68 +68 +68 +64 +65 +59 +59 +56 +54 +54 +50 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +38 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +55 +55 +58 +59 +64 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +91 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +125 +129 +129 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +149 +151 +151 +157 +157 +160 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +174 +178 +179 +182 +183 +183 +185 +185 +189 +189 +190 +191 +190 +195 +194 +196 +196 +196 +198 +199 +201 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +201 +198 +198 +197 +197 +197 +195 +195 +191 +191 +191 +188 +188 +185 +184 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +140 +139 +139 +134 +134 +129 +129 +127 +125 +125 +119 +119 +116 +116 +115 +109 +109 +106 +106 +106 +100 +100 +100 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +73 +72 +68 +68 +69 +65 +64 +59 +59 +59 +55 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +30 +31 +27 +27 +28 +25 +25 +21 +21 +21 +19 +19 +17 +16 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +42 +43 +46 +47 +51 +51 +51 +55 +54 +54 +54 +55 +58 +59 +64 +64 +64 +68 +69 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +95 +100 +100 +100 +100 +100 +106 +106 +109 +109 +110 +115 +115 +120 +119 +122 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +178 +179 +182 +183 +185 +184 +184 +189 +188 +191 +191 +191 +194 +195 +196 +196 +196 +198 +198 +200 +201 +200 +200 +200 +202 +203 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +207 +207 +206 +207 +206 +206 +206 +206 +206 +207 +205 +204 +205 +204 +204 +202 +202 +202 +203 +202 +200 +200 +200 +201 +200 +199 +198 +196 +197 +196 +195 +194 +190 +190 +191 +188 +188 +185 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +125 +119 +119 +120 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +69 +64 +64 +58 +58 +54 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +50 +52 +54 +55 +58 +58 +64 +64 +65 +68 +69 +72 +72 +72 +76 +77 +76 +76 +76 +82 +82 +86 +87 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +109 +110 +110 +116 +115 +120 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +140 +139 +144 +143 +147 +147 +149 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +185 +189 +189 +189 +191 +190 +194 +195 +195 +196 +196 +198 +198 +198 +200 +200 +201 +200 +200 +202 +203 +205 +205 +204 +204 +204 +206 +206 +207 +206 +206 +207 +207 +206 +206 +207 +207 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +199 +196 +197 +197 +195 +195 +190 +191 +190 +188 +189 +189 +188 +189 +184 +185 +183 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +69 +68 +68 +65 +64 +59 +58 +58 +54 +54 +50 +50 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +50 +50 +51 +51 +54 +55 +59 +59 +58 +64 +65 +68 +68 +70 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +124 +126 +125 +129 +129 +133 +134 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +182 +183 +184 +184 +185 +188 +189 +191 +191 +190 +195 +194 +196 +196 +197 +199 +198 +200 +201 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +201 +201 +200 +201 +200 +198 +198 +199 +196 +196 +195 +194 +192 +190 +190 +188 +188 +184 +185 +185 +183 +182 +179 +179 +178 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +120 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +55 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +30 +27 +27 +27 +25 +25 +21 +21 +20 +20 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +40 +41 +43 +42 +47 +47 +48 +50 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +73 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +109 +110 +110 +115 +115 +120 +119 +119 +125 +126 +129 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +184 +185 +188 +188 +190 +191 +190 +195 +194 +196 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +203 +202 +204 +205 +205 +204 +205 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +205 +204 +204 +205 +204 +202 +202 +200 +200 +200 +201 +200 +199 +198 +197 +197 +196 +194 +194 +190 +190 +190 +188 +188 +188 +188 +188 +184 +185 +183 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +129 +129 +127 +125 +126 +120 +120 +116 +116 +116 +110 +110 +106 +105 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +65 +64 +58 +59 +54 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +26 +25 +27 +27 +27 +31 +31 +33 +33 +35 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +50 +50 +54 +55 +59 +58 +59 +64 +65 +68 +68 +69 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +119 +120 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +183 +184 +185 +189 +188 +189 +191 +191 +195 +194 +195 +197 +197 +199 +199 +199 +200 +200 +201 +200 +202 +202 +203 +204 +204 +204 +205 +205 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +200 +200 +201 +201 +198 +199 +196 +196 +197 +194 +194 +190 +190 +190 +188 +189 +185 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +150 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +130 +125 +126 +119 +119 +119 +115 +116 +110 +110 +109 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +65 +64 +58 +59 +58 +55 +54 +51 +50 +48 +47 +47 +42 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +24 +21 +21 +21 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +50 +50 +54 +54 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +119 +120 +125 +125 +130 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +162 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +184 +185 +188 +189 +189 +191 +191 +194 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +201 +200 +200 +202 +202 +204 +205 +204 +204 +204 +206 +207 +207 +207 +207 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +201 +201 +201 +200 +198 +199 +197 +196 +197 +194 +194 +190 +190 +191 +188 +189 +184 +184 +185 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +126 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +58 +59 +55 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +40 +43 +43 +46 +47 +47 +50 +51 +55 +55 +54 +59 +59 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +172 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +188 +188 +188 +190 +191 +195 +194 +194 +197 +197 +197 +196 +196 +198 +198 +200 +201 +201 +200 +200 +202 +202 +203 +205 +205 +204 +204 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +203 +203 +200 +201 +200 +200 +200 +198 +199 +197 +196 +197 +195 +195 +191 +191 +191 +188 +189 +184 +185 +185 +183 +183 +179 +179 +175 +175 +174 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +130 +129 +129 +125 +126 +120 +120 +119 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +89 +86 +86 +83 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +58 +58 +54 +54 +50 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +58 +58 +58 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +115 +119 +120 +126 +126 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +178 +179 +182 +183 +183 +183 +182 +185 +185 +189 +188 +189 +191 +190 +194 +194 +195 +197 +197 +198 +198 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +205 +204 +204 +205 +204 +206 +206 +207 +206 +207 +206 +207 +206 +206 +207 +207 +206 +206 +207 +206 +204 +205 +204 +205 +204 +202 +202 +200 +200 +201 +200 +200 +198 +199 +198 +197 +197 +194 +194 +190 +191 +191 +188 +188 +184 +185 +185 +183 +182 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +97 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +73 +72 +72 +69 +68 +65 +64 +65 +59 +58 +54 +54 +50 +50 +51 +47 +46 +43 +42 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +24 +21 +21 +19 +19 +19 +17 +17 +15 +14 +15 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +12 +15 +15 +18 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +37 +41 +40 +43 +42 +43 +47 +46 +51 +51 +52 +54 +54 +58 +58 +65 +64 +64 +68 +69 +72 +73 +72 +76 +76 +82 +82 +82 +87 +86 +90 +90 +91 +96 +96 +99 +100 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +120 +120 +126 +125 +129 +129 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +166 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +180 +183 +183 +185 +184 +188 +189 +188 +190 +190 +194 +194 +195 +196 +197 +196 +197 +196 +199 +198 +200 +200 +201 +201 +200 +202 +202 +203 +205 +205 +205 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +207 +205 +204 +205 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +198 +198 +197 +196 +195 +195 +194 +190 +190 +189 +189 +189 +184 +185 +183 +183 +183 +179 +178 +175 +175 +173 +172 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +130 +126 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +64 +59 +59 +54 +54 +54 +50 +51 +46 +46 +47 +43 +43 +41 +41 +39 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +24 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +12 +12 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +46 +46 +47 +50 +50 +54 +54 +54 +59 +58 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +81 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +109 +110 +116 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +178 +179 +179 +182 +182 +185 +185 +184 +188 +188 +189 +189 +189 +190 +190 +195 +195 +195 +197 +197 +199 +198 +199 +201 +201 +200 +200 +202 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +198 +198 +197 +196 +197 +195 +195 +190 +190 +190 +190 +189 +185 +184 +183 +183 +183 +178 +178 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +139 +139 +139 +133 +133 +129 +129 +130 +126 +126 +120 +119 +120 +116 +116 +110 +109 +110 +105 +105 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +50 +51 +49 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +15 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +55 +54 +58 +59 +59 +65 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +85 +86 +90 +90 +90 +96 +96 +100 +99 +100 +106 +107 +110 +110 +110 +116 +116 +120 +119 +126 +125 +125 +130 +129 +133 +133 +133 +139 +140 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +174 +175 +179 +178 +179 +179 +179 +182 +182 +184 +184 +185 +188 +189 +190 +190 +193 +194 +195 +196 +197 +199 +198 +198 +200 +200 +200 +201 +200 +203 +202 +204 +204 +204 +205 +204 +207 +206 +206 +207 +207 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +201 +200 +200 +200 +201 +198 +198 +198 +197 +197 +195 +195 +194 +194 +195 +191 +190 +189 +188 +188 +185 +185 +183 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +120 +116 +116 +109 +109 +106 +106 +106 +100 +100 +96 +95 +96 +89 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +64 +64 +58 +58 +54 +54 +54 +50 +51 +47 +47 +47 +43 +43 +43 +42 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +18 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +44 +43 +43 +47 +47 +50 +50 +55 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +116 +120 +120 +119 +119 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +178 +182 +183 +183 +184 +184 +188 +188 +188 +190 +191 +194 +194 +194 +197 +197 +198 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +205 +204 +205 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +203 +200 +200 +200 +201 +200 +198 +198 +197 +196 +197 +194 +195 +190 +190 +190 +189 +189 +185 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +72 +73 +72 +69 +68 +64 +64 +64 +59 +58 +58 +58 +59 +55 +54 +50 +50 +51 +47 +46 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +20 +21 +21 +20 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +54 +54 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +115 +115 +117 +119 +120 +125 +125 +129 +130 +130 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +168 +172 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +184 +185 +189 +188 +190 +190 +191 +195 +195 +197 +196 +197 +197 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +203 +202 +203 +200 +200 +201 +201 +200 +199 +199 +197 +196 +197 +195 +194 +190 +190 +189 +188 +189 +185 +185 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +140 +140 +133 +134 +129 +129 +129 +125 +126 +120 +119 +120 +116 +116 +110 +109 +111 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +59 +59 +58 +55 +54 +50 +51 +50 +46 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +50 +51 +55 +55 +59 +59 +64 +65 +64 +68 +69 +72 +73 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +110 +110 +110 +116 +115 +119 +120 +120 +125 +125 +126 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +188 +188 +189 +190 +191 +195 +195 +195 +196 +196 +198 +198 +198 +201 +201 +201 +200 +201 +202 +203 +204 +204 +205 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +200 +201 +200 +201 +199 +198 +197 +196 +196 +194 +194 +190 +191 +191 +188 +188 +185 +184 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +140 +139 +139 +134 +133 +130 +129 +127 +126 +126 +120 +119 +116 +116 +116 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +50 +50 +51 +47 +46 +42 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +14 +15 +15 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +48 +47 +46 +51 +50 +54 +54 +54 +58 +58 +65 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +110 +110 +110 +110 +115 +116 +119 +120 +120 +125 +125 +129 +129 +131 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +178 +179 +179 +183 +183 +184 +185 +185 +188 +189 +191 +190 +191 +195 +195 +196 +197 +196 +198 +199 +200 +200 +201 +201 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +204 +205 +204 +205 +204 +203 +203 +201 +200 +200 +201 +200 +198 +199 +198 +197 +197 +195 +194 +195 +190 +191 +189 +188 +189 +185 +185 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +150 +151 +147 +147 +143 +144 +141 +139 +139 +134 +133 +129 +130 +129 +125 +125 +120 +120 +120 +115 +115 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +65 +64 +58 +58 +54 +55 +55 +51 +51 +47 +46 +43 +43 +42 +41 +41 +37 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +50 +50 +54 +55 +55 +58 +59 +65 +64 +66 +69 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +116 +119 +120 +120 +125 +125 +129 +129 +129 +133 +134 +140 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +185 +184 +188 +189 +188 +190 +191 +194 +194 +197 +196 +196 +198 +198 +200 +200 +200 +201 +201 +203 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +202 +202 +200 +200 +201 +201 +200 +198 +198 +196 +196 +197 +194 +194 +191 +191 +188 +189 +189 +185 +184 +183 +183 +182 +179 +178 +178 +178 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +118 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +65 +65 +59 +58 +55 +54 +54 +50 +50 +46 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +22 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +12 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +47 +47 +50 +51 +54 +54 +55 +59 +59 +65 +65 +64 +68 +68 +68 +68 +68 +72 +72 +76 +77 +77 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +99 +105 +106 +110 +110 +110 +115 +116 +119 +120 +120 +125 +126 +129 +129 +130 +133 +133 +139 +139 +142 +143 +143 +147 +148 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +185 +185 +185 +189 +189 +191 +191 +191 +195 +194 +196 +196 +196 +199 +199 +200 +201 +200 +200 +201 +203 +202 +203 +205 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +203 +200 +200 +200 +201 +198 +198 +198 +197 +196 +194 +195 +195 +190 +190 +191 +191 +191 +189 +188 +184 +184 +185 +182 +183 +179 +179 +177 +175 +175 +172 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +137 +133 +133 +129 +129 +126 +125 +125 +119 +119 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +55 +51 +50 +47 +46 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +15 +15 +15 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +42 +43 +43 +47 +47 +50 +51 +51 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +116 +116 +120 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +184 +185 +184 +189 +189 +191 +191 +190 +194 +195 +196 +197 +199 +198 +198 +201 +201 +200 +201 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +207 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +200 +198 +198 +197 +196 +197 +194 +194 +191 +191 +191 +189 +189 +185 +185 +182 +183 +183 +179 +179 +175 +174 +174 +172 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +119 +119 +115 +115 +116 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +73 +68 +68 +64 +65 +65 +59 +59 +55 +55 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +50 +51 +50 +54 +54 +58 +58 +59 +65 +65 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +140 +139 +139 +143 +143 +146 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +174 +179 +178 +183 +183 +183 +185 +185 +189 +189 +191 +191 +190 +194 +194 +196 +196 +197 +198 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +200 +201 +200 +200 +201 +198 +198 +196 +196 +196 +195 +194 +191 +190 +190 +188 +189 +188 +188 +189 +185 +184 +183 +183 +183 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +126 +125 +125 +119 +120 +115 +116 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +55 +50 +50 +46 +46 +46 +43 +43 +41 +41 +41 +36 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +58 +64 +64 +68 +69 +69 +72 +72 +76 +76 +81 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +134 +134 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +162 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +179 +179 +179 +183 +182 +185 +184 +185 +188 +188 +190 +191 +191 +194 +195 +197 +196 +196 +198 +199 +200 +201 +201 +201 +200 +202 +203 +205 +205 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +202 +203 +200 +201 +200 +201 +200 +199 +198 +198 +197 +196 +197 +196 +196 +194 +195 +190 +191 +191 +188 +189 +185 +185 +184 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +134 +133 +129 +129 +130 +125 +125 +120 +120 +119 +116 +115 +110 +110 +110 +105 +106 +99 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +55 +55 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +15 +15 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +55 +54 +59 +58 +65 +65 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +115 +120 +119 +119 +125 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +184 +185 +189 +189 +188 +191 +190 +195 +195 +195 +196 +197 +198 +198 +200 +200 +201 +201 +201 +202 +202 +202 +204 +204 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +207 +207 +206 +206 +206 +204 +204 +205 +205 +204 +202 +202 +203 +202 +203 +200 +200 +200 +201 +201 +199 +199 +197 +197 +195 +194 +194 +190 +190 +188 +188 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +168 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +130 +125 +125 +120 +119 +119 +115 +115 +109 +110 +106 +106 +106 +99 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +58 +59 +55 +55 +55 +51 +51 +46 +46 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +42 +42 +43 +47 +46 +50 +51 +51 +55 +55 +58 +59 +58 +65 +65 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +97 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +125 +129 +130 +133 +133 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +184 +188 +188 +188 +190 +191 +195 +194 +194 +196 +197 +197 +197 +197 +199 +199 +201 +200 +200 +200 +200 +203 +202 +203 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +203 +202 +203 +201 +201 +200 +200 +200 +199 +199 +196 +196 +197 +194 +195 +191 +190 +190 +189 +189 +185 +185 +185 +183 +183 +179 +178 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +152 +151 +151 +147 +148 +144 +143 +143 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +85 +86 +82 +82 +80 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +58 +55 +55 +51 +50 +50 +46 +47 +43 +42 +43 +41 +40 +37 +36 +33 +33 +33 +32 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +12 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +37 +37 +41 +41 +41 +41 +40 +43 +43 +42 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +58 +58 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +95 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +120 +120 +119 +126 +126 +129 +130 +129 +133 +134 +140 +139 +140 +144 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +179 +183 +182 +185 +185 +185 +189 +189 +191 +191 +192 +195 +194 +197 +197 +198 +199 +199 +200 +201 +200 +201 +201 +202 +202 +202 +202 +202 +204 +204 +204 +205 +205 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +201 +200 +200 +200 +201 +198 +199 +196 +197 +194 +195 +194 +191 +190 +188 +188 +189 +184 +185 +183 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +126 +125 +120 +120 +120 +115 +115 +110 +109 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +73 +72 +68 +68 +69 +65 +64 +58 +58 +55 +54 +54 +51 +50 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +26 +24 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +37 +36 +41 +41 +40 +43 +43 +46 +47 +51 +50 +51 +55 +55 +58 +59 +59 +64 +65 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +89 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +115 +119 +120 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +180 +182 +183 +185 +185 +188 +188 +188 +190 +190 +195 +195 +194 +196 +196 +196 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +203 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +201 +201 +200 +200 +198 +198 +199 +196 +196 +195 +194 +194 +191 +190 +188 +189 +188 +185 +185 +183 +183 +182 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +140 +133 +133 +130 +129 +126 +126 +126 +120 +120 +115 +115 +115 +109 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +55 +51 +51 +47 +47 +46 +43 +43 +41 +41 +39 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +64 +64 +69 +69 +72 +73 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +126 +129 +130 +133 +133 +139 +139 +140 +143 +144 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +162 +161 +161 +165 +165 +169 +169 +171 +173 +173 +175 +175 +179 +178 +179 +183 +183 +184 +185 +184 +189 +188 +189 +188 +189 +190 +190 +194 +195 +195 +197 +197 +198 +198 +200 +200 +201 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +207 +204 +204 +204 +204 +204 +203 +202 +203 +200 +200 +201 +201 +201 +199 +198 +197 +197 +197 +195 +194 +190 +191 +190 +189 +188 +185 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +160 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +130 +130 +130 +126 +126 +120 +120 +119 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +69 +69 +64 +64 +64 +58 +58 +54 +55 +55 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +18 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +47 +47 +46 +51 +51 +55 +54 +55 +58 +58 +64 +64 +69 +69 +68 +72 +72 +76 +76 +76 +82 +83 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +119 +119 +120 +126 +125 +129 +129 +129 +133 +133 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +153 +156 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +173 +174 +173 +174 +175 +179 +179 +179 +182 +183 +184 +184 +188 +189 +189 +190 +190 +194 +195 +194 +196 +197 +198 +198 +198 +200 +201 +200 +200 +200 +202 +203 +205 +204 +205 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +201 +200 +200 +201 +198 +198 +197 +197 +196 +194 +195 +190 +191 +191 +188 +188 +188 +188 +189 +184 +185 +183 +183 +183 +178 +179 +174 +175 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +130 +129 +130 +125 +125 +119 +119 +115 +115 +116 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +69 +69 +64 +64 +58 +59 +59 +55 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +40 +43 +43 +47 +47 +47 +50 +51 +54 +55 +55 +59 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +105 +106 +110 +110 +110 +109 +110 +116 +116 +120 +119 +119 +126 +125 +130 +130 +131 +134 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +184 +185 +189 +188 +188 +190 +190 +195 +195 +194 +196 +196 +198 +198 +199 +201 +200 +200 +201 +202 +202 +203 +205 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +205 +205 +202 +202 +202 +200 +201 +200 +201 +201 +198 +198 +196 +196 +196 +194 +195 +191 +191 +190 +189 +189 +185 +185 +185 +183 +183 +179 +178 +175 +175 +174 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +134 +130 +129 +129 +125 +125 +126 +125 +125 +119 +120 +119 +119 +119 +115 +115 +110 +110 +110 +110 +109 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +73 +68 +68 +68 +64 +64 +58 +58 +55 +55 +54 +51 +50 +47 +47 +47 +42 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +30 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +47 +46 +51 +51 +52 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +120 +119 +125 +125 +125 +125 +126 +129 +129 +133 +133 +134 +140 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +179 +183 +183 +184 +184 +188 +188 +189 +190 +191 +195 +195 +194 +196 +197 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +201 +201 +199 +198 +197 +196 +196 +195 +194 +190 +191 +190 +188 +189 +185 +184 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +129 +129 +130 +126 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +73 +69 +68 +68 +64 +64 +58 +59 +59 +54 +55 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +55 +55 +54 +55 +54 +58 +58 +64 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +109 +110 +116 +116 +120 +120 +122 +125 +126 +129 +129 +133 +133 +133 +139 +140 +144 +144 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +172 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +188 +189 +191 +190 +190 +194 +195 +196 +196 +196 +199 +198 +201 +200 +201 +200 +201 +202 +203 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +205 +205 +205 +205 +204 +203 +202 +201 +200 +200 +200 +201 +198 +198 +198 +196 +197 +195 +195 +194 +195 +195 +191 +191 +191 +189 +189 +185 +185 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +156 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +129 +129 +129 +125 +125 +120 +120 +119 +115 +115 +109 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +65 +59 +58 +57 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +26 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +50 +52 +55 +55 +59 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +76 +77 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +109 +110 +116 +115 +119 +120 +119 +126 +125 +129 +129 +129 +134 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +183 +184 +184 +188 +188 +190 +191 +191 +195 +194 +196 +196 +196 +198 +198 +201 +200 +201 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +205 +204 +205 +204 +204 +202 +202 +202 +200 +201 +200 +200 +201 +198 +199 +197 +197 +195 +195 +194 +190 +191 +188 +189 +189 +185 +185 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +128 +125 +125 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +72 +73 +69 +68 +64 +64 +64 +58 +58 +55 +54 +55 +50 +50 +46 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +31 +31 +30 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +22 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +35 +37 +37 +41 +41 +43 +43 +42 +47 +47 +51 +50 +51 +54 +55 +55 +55 +55 +58 +58 +65 +64 +65 +68 +68 +72 +72 +74 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +109 +115 +116 +116 +120 +119 +126 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +183 +183 +185 +184 +189 +189 +188 +190 +191 +194 +194 +194 +196 +196 +198 +199 +199 +201 +200 +200 +201 +203 +202 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +203 +200 +200 +201 +201 +201 +201 +200 +200 +198 +198 +197 +196 +197 +194 +194 +191 +190 +189 +189 +189 +184 +185 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +152 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +115 +115 +116 +110 +109 +106 +106 +101 +100 +100 +96 +96 +91 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +54 +51 +51 +51 +46 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +49 +50 +50 +54 +55 +58 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +119 +125 +126 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +178 +183 +183 +183 +185 +185 +189 +189 +191 +191 +190 +195 +195 +196 +197 +196 +199 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +200 +200 +201 +200 +199 +198 +199 +197 +196 +194 +194 +194 +190 +191 +189 +188 +188 +185 +184 +185 +185 +185 +182 +183 +178 +178 +178 +175 +175 +173 +173 +170 +169 +169 +165 +166 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +120 +119 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +58 +55 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +16 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +40 +43 +42 +47 +47 +47 +51 +51 +54 +54 +55 +58 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +125 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +150 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +184 +185 +188 +188 +190 +191 +190 +194 +195 +196 +196 +197 +198 +198 +200 +200 +201 +200 +200 +202 +203 +204 +204 +204 +205 +204 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +205 +204 +205 +204 +204 +202 +203 +202 +200 +200 +200 +201 +201 +198 +198 +199 +198 +198 +196 +197 +194 +194 +194 +191 +191 +188 +189 +187 +185 +185 +183 +182 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +158 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +132 +133 +134 +129 +129 +126 +126 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +54 +55 +50 +51 +47 +46 +44 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +16 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +41 +41 +42 +43 +47 +46 +47 +50 +50 +54 +54 +55 +58 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +109 +116 +116 +119 +120 +120 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +174 +175 +179 +178 +183 +183 +183 +184 +185 +189 +188 +189 +191 +191 +194 +195 +195 +197 +197 +198 +198 +201 +201 +201 +200 +200 +202 +202 +202 +204 +204 +204 +205 +204 +205 +204 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +207 +206 +207 +205 +204 +204 +204 +204 +202 +203 +203 +202 +203 +200 +201 +200 +200 +201 +199 +199 +196 +196 +196 +195 +195 +190 +191 +188 +189 +188 +184 +184 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +120 +120 +119 +115 +116 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +87 +86 +83 +83 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +55 +54 +54 +50 +51 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +16 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +42 +46 +47 +50 +51 +51 +55 +55 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +85 +86 +86 +90 +90 +95 +96 +100 +100 +100 +105 +106 +110 +109 +109 +115 +115 +120 +119 +120 +125 +125 +129 +130 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +161 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +183 +185 +185 +188 +188 +190 +191 +190 +194 +194 +197 +197 +197 +199 +198 +198 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +204 +205 +205 +204 +204 +203 +202 +203 +200 +201 +200 +200 +198 +198 +198 +196 +196 +194 +195 +195 +190 +191 +189 +188 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +162 +161 +157 +157 +157 +151 +151 +148 +147 +147 +144 +143 +139 +139 +140 +134 +133 +130 +129 +126 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +55 +51 +50 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +51 +50 +55 +55 +59 +59 +58 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +139 +139 +139 +144 +143 +147 +147 +147 +151 +151 +157 +157 +158 +160 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +179 +179 +178 +182 +183 +185 +185 +185 +188 +189 +190 +191 +192 +194 +194 +196 +197 +198 +198 +198 +200 +201 +200 +200 +201 +200 +200 +201 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +201 +201 +201 +200 +201 +198 +198 +196 +196 +196 +195 +194 +191 +191 +191 +188 +189 +184 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +99 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +73 +72 +69 +68 +65 +64 +64 +59 +58 +55 +55 +55 +50 +51 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +35 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +58 +58 +59 +64 +65 +68 +68 +68 +73 +72 +76 +76 +77 +82 +82 +86 +86 +91 +90 +90 +95 +96 +100 +100 +100 +105 +106 +110 +110 +109 +116 +116 +120 +120 +120 +125 +125 +129 +129 +130 +133 +134 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +168 +172 +173 +173 +175 +175 +179 +179 +182 +182 +183 +185 +185 +189 +189 +188 +190 +191 +191 +191 +190 +194 +195 +196 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +205 +202 +203 +200 +201 +200 +200 +200 +198 +198 +198 +197 +197 +195 +195 +194 +191 +190 +188 +188 +188 +185 +185 +183 +183 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +134 +133 +129 +130 +129 +126 +126 +120 +120 +120 +116 +116 +110 +110 +110 +105 +106 +100 +100 +99 +96 +96 +90 +90 +87 +86 +87 +82 +82 +76 +76 +76 +72 +73 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +55 +54 +55 +51 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +24 +21 +21 +20 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +55 +55 +59 +58 +65 +64 +69 +68 +69 +72 +72 +76 +76 +76 +82 +82 +82 +83 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +116 +115 +120 +119 +125 +125 +125 +130 +129 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +184 +188 +188 +189 +191 +190 +194 +195 +194 +196 +196 +198 +198 +198 +200 +201 +201 +200 +200 +203 +202 +204 +205 +205 +205 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +201 +198 +198 +197 +197 +196 +195 +194 +191 +191 +191 +189 +188 +184 +185 +185 +182 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +130 +129 +126 +126 +126 +119 +119 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +73 +72 +68 +68 +64 +65 +65 +58 +58 +55 +54 +55 +51 +51 +51 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +32 +33 +37 +37 +36 +41 +40 +43 +43 +47 +47 +47 +50 +50 +54 +55 +55 +58 +58 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +77 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +105 +106 +106 +109 +110 +116 +116 +116 +119 +120 +125 +125 +127 +130 +129 +134 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +148 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +178 +179 +179 +179 +182 +182 +184 +184 +185 +188 +189 +190 +190 +191 +195 +195 +197 +197 +198 +198 +199 +201 +200 +201 +201 +200 +203 +202 +205 +204 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +204 +204 +202 +202 +201 +201 +201 +200 +200 +198 +199 +198 +197 +196 +195 +195 +195 +190 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +130 +129 +129 +125 +125 +120 +120 +119 +115 +116 +110 +109 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +65 +65 +59 +59 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +65 +64 +65 +68 +68 +72 +73 +73 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +110 +110 +110 +115 +116 +119 +120 +120 +125 +125 +125 +125 +125 +130 +130 +134 +133 +133 +139 +139 +143 +143 +147 +147 +146 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +188 +188 +188 +191 +191 +194 +194 +194 +196 +196 +199 +198 +198 +200 +200 +201 +200 +200 +202 +203 +204 +204 +205 +204 +205 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +204 +204 +204 +204 +203 +203 +201 +200 +201 +200 +200 +199 +198 +197 +197 +197 +194 +194 +190 +190 +190 +189 +188 +189 +188 +188 +185 +185 +183 +183 +183 +178 +178 +175 +174 +176 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +131 +129 +129 +125 +125 +119 +120 +119 +116 +116 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +51 +51 +55 +55 +55 +55 +55 +58 +58 +64 +65 +64 +68 +68 +73 +72 +74 +76 +76 +82 +82 +87 +86 +86 +89 +90 +96 +96 +96 +99 +100 +100 +100 +100 +106 +106 +110 +109 +110 +115 +116 +120 +119 +123 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +174 +179 +179 +179 +182 +183 +185 +184 +184 +188 +188 +190 +191 +190 +194 +195 +197 +196 +197 +199 +198 +201 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +205 +204 +204 +203 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +197 +195 +195 +190 +191 +191 +189 +189 +185 +184 +183 +183 +183 +178 +178 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +152 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +129 +129 +129 +125 +125 +120 +120 +120 +115 +115 +110 +110 +107 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +59 +58 +54 +55 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +28 +27 +25 +25 +21 +21 +18 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +52 +55 +54 +59 +58 +64 +64 +68 +68 +68 +72 +72 +73 +76 +77 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +115 +115 +120 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +176 +175 +174 +179 +179 +183 +182 +183 +185 +184 +190 +188 +191 +191 +190 +194 +194 +196 +196 +196 +199 +198 +200 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +200 +201 +201 +201 +201 +198 +198 +196 +196 +195 +194 +195 +190 +190 +188 +188 +189 +184 +185 +185 +185 +184 +182 +183 +179 +179 +179 +175 +175 +172 +173 +171 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +140 +139 +139 +134 +134 +129 +129 +126 +126 +125 +119 +120 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +58 +59 +55 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +39 +41 +41 +43 +42 +47 +47 +47 +51 +50 +54 +55 +55 +58 +59 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +109 +110 +116 +115 +119 +119 +120 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +179 +178 +179 +182 +182 +184 +184 +185 +189 +189 +190 +191 +191 +194 +195 +196 +196 +196 +198 +199 +200 +200 +201 +200 +200 +202 +202 +205 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +203 +201 +200 +200 +200 +201 +198 +198 +199 +196 +196 +196 +197 +196 +195 +194 +191 +190 +191 +188 +189 +184 +184 +185 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +164 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +146 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +120 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +72 +68 +69 +64 +65 +64 +58 +59 +54 +54 +55 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +46 +47 +50 +51 +51 +54 +54 +59 +59 +61 +64 +64 +69 +69 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +178 +178 +183 +182 +184 +185 +184 +188 +188 +190 +191 +191 +194 +194 +197 +196 +199 +198 +199 +200 +200 +200 +200 +200 +202 +203 +205 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +201 +198 +198 +197 +197 +196 +194 +194 +190 +190 +190 +188 +189 +185 +184 +184 +182 +183 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +168 +168 +165 +165 +161 +161 +156 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +131 +126 +125 +120 +119 +117 +115 +116 +110 +109 +105 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +55 +54 +50 +50 +47 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +16 +15 +15 +17 +18 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +58 +58 +59 +65 +65 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +109 +110 +115 +116 +119 +120 +120 +125 +125 +129 +129 +129 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +185 +184 +185 +188 +189 +190 +191 +190 +194 +194 +197 +196 +196 +199 +198 +200 +200 +201 +200 +200 +202 +202 +203 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +203 +202 +203 +200 +200 +200 +200 +200 +198 +198 +196 +196 +196 +194 +195 +194 +194 +194 +191 +190 +189 +188 +189 +185 +185 +183 +183 +181 +178 +179 +175 +175 +172 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +160 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +115 +109 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +58 +58 +55 +54 +51 +51 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +15 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +55 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +119 +120 +120 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +185 +185 +188 +188 +188 +190 +191 +194 +194 +195 +196 +196 +198 +198 +200 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +203 +203 +202 +202 +200 +200 +200 +200 +201 +198 +199 +196 +196 +195 +194 +194 +190 +191 +188 +188 +189 +184 +184 +183 +183 +183 +179 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +116 +116 +110 +110 +106 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +58 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +50 +50 +54 +54 +58 +59 +59 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +115 +116 +115 +119 +119 +126 +125 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +179 +183 +182 +184 +184 +189 +189 +189 +190 +191 +195 +195 +194 +197 +196 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +202 +203 +200 +200 +200 +200 +200 +198 +198 +197 +196 +197 +194 +194 +190 +191 +191 +188 +188 +184 +185 +185 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +59 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +44 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +22 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +42 +47 +46 +47 +51 +50 +54 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +73 +77 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +120 +120 +125 +125 +130 +130 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +182 +182 +184 +185 +185 +184 +184 +189 +188 +191 +191 +191 +196 +194 +197 +196 +197 +199 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +197 +196 +197 +194 +194 +190 +191 +188 +188 +189 +185 +185 +182 +183 +182 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +126 +125 +120 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +59 +55 +55 +51 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +54 +59 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +109 +110 +115 +116 +120 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +172 +175 +175 +178 +178 +179 +182 +182 +184 +184 +185 +189 +189 +190 +190 +194 +194 +194 +196 +196 +198 +198 +198 +201 +200 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +203 +200 +200 +200 +200 +198 +198 +199 +196 +196 +194 +194 +194 +190 +190 +188 +189 +188 +184 +185 +183 +182 +182 +179 +178 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +129 +129 +130 +125 +126 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +64 +64 +58 +59 +55 +54 +54 +51 +51 +46 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +46 +51 +50 +55 +54 +55 +58 +58 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +109 +110 +115 +115 +115 +119 +119 +126 +125 +125 +129 +129 +134 +133 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +184 +184 +185 +189 +188 +191 +190 +191 +195 +194 +194 +195 +194 +196 +197 +198 +198 +199 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +205 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +204 +204 +204 +204 +203 +203 +202 +200 +200 +201 +200 +200 +198 +199 +196 +196 +197 +194 +194 +191 +191 +191 +189 +189 +185 +184 +185 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +144 +143 +144 +139 +140 +133 +133 +130 +130 +130 +125 +126 +120 +119 +120 +115 +115 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +50 +51 +49 +46 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +55 +54 +58 +59 +59 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +115 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +140 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +179 +179 +179 +182 +183 +184 +184 +185 +189 +189 +191 +191 +191 +194 +195 +197 +196 +198 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +201 +200 +200 +200 +200 +198 +198 +198 +197 +196 +194 +194 +190 +190 +191 +189 +188 +185 +185 +184 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +120 +120 +115 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +59 +54 +55 +55 +50 +51 +47 +47 +47 +42 +43 +43 +43 +43 +41 +41 +37 +36 +37 +33 +32 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +16 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +55 +54 +54 +58 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +109 +109 +115 +115 +115 +119 +119 +120 +119 +119 +125 +126 +129 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +182 +183 +185 +185 +188 +188 +189 +190 +191 +194 +194 +194 +197 +196 +198 +198 +198 +200 +200 +200 +201 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +197 +196 +194 +195 +191 +190 +190 +189 +188 +185 +184 +184 +182 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +134 +129 +129 +125 +126 +120 +119 +119 +116 +115 +110 +110 +110 +106 +106 +106 +106 +105 +100 +100 +96 +95 +96 +90 +90 +86 +86 +84 +82 +82 +76 +77 +72 +72 +72 +68 +69 +64 +64 +64 +58 +58 +59 +58 +59 +54 +54 +50 +51 +51 +47 +47 +43 +42 +43 +41 +40 +37 +37 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +16 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +54 +59 +58 +64 +64 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +122 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +182 +184 +185 +189 +189 +188 +191 +191 +195 +194 +195 +196 +197 +198 +198 +200 +200 +201 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +199 +198 +197 +196 +196 +194 +195 +190 +190 +191 +188 +189 +185 +184 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +126 +125 +125 +125 +125 +119 +120 +116 +116 +115 +115 +116 +110 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +81 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +60 +59 +58 +54 +54 +50 +50 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +50 +51 +54 +54 +59 +58 +65 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +87 +86 +90 +90 +90 +95 +96 +100 +100 +101 +106 +106 +109 +110 +115 +116 +115 +120 +120 +126 +125 +126 +129 +130 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +185 +188 +189 +191 +190 +191 +194 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +205 +205 +205 +202 +202 +202 +200 +201 +200 +200 +200 +198 +199 +197 +197 +195 +194 +194 +191 +190 +188 +188 +188 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +123 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +73 +72 +68 +68 +65 +64 +64 +58 +59 +55 +55 +55 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +36 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +50 +54 +54 +58 +58 +58 +64 +64 +64 +64 +64 +68 +68 +72 +72 +72 +75 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +116 +119 +120 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +178 +182 +183 +184 +185 +184 +189 +188 +190 +190 +190 +194 +194 +197 +196 +197 +199 +199 +200 +201 +201 +200 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +206 +207 +205 +204 +205 +204 +204 +202 +202 +201 +201 +200 +200 +200 +198 +198 +198 +197 +196 +194 +194 +194 +190 +190 +188 +189 +189 +184 +185 +182 +183 +183 +179 +178 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +129 +130 +125 +125 +125 +119 +120 +116 +116 +116 +110 +110 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +65 +59 +59 +59 +54 +55 +50 +50 +51 +47 +46 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +55 +55 +59 +58 +64 +64 +65 +69 +68 +72 +72 +74 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +99 +100 +100 +100 +100 +106 +106 +109 +110 +110 +116 +116 +119 +119 +123 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +174 +179 +178 +179 +182 +183 +185 +184 +184 +188 +188 +191 +191 +190 +195 +195 +196 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +207 +207 +206 +205 +204 +205 +204 +204 +204 +204 +202 +203 +202 +200 +200 +200 +200 +200 +198 +198 +196 +197 +196 +195 +195 +191 +190 +191 +188 +188 +184 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +125 +119 +119 +120 +115 +115 +109 +110 +106 +106 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +55 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +115 +119 +119 +120 +125 +125 +130 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +172 +175 +175 +175 +179 +179 +183 +182 +183 +184 +184 +189 +189 +190 +190 +190 +195 +195 +196 +197 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +203 +200 +201 +200 +200 +201 +198 +199 +196 +197 +195 +195 +194 +190 +190 +188 +189 +188 +185 +185 +184 +185 +184 +182 +182 +179 +179 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +129 +126 +125 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +58 +58 +55 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +16 +15 +13 +13 +13 +12 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +17 +16 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +32 +33 +37 +37 +39 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +56 +54 +58 +58 +59 +58 +59 +65 +64 +68 +69 +68 +73 +72 +77 +77 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +107 +110 +109 +110 +115 +115 +119 +120 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +178 +183 +183 +185 +185 +185 +188 +188 +190 +191 +191 +194 +194 +197 +197 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +205 +205 +205 +204 +205 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +199 +198 +196 +196 +197 +197 +197 +194 +194 +190 +191 +191 +188 +189 +185 +184 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +168 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +119 +119 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +64 +64 +59 +58 +54 +55 +55 +51 +50 +47 +46 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +42 +43 +43 +43 +43 +46 +47 +50 +51 +50 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +182 +183 +185 +184 +185 +189 +189 +191 +191 +191 +194 +195 +197 +196 +199 +199 +198 +200 +200 +200 +200 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +205 +205 +204 +204 +202 +203 +200 +200 +200 +201 +200 +199 +199 +198 +197 +197 +194 +194 +190 +191 +190 +188 +189 +185 +185 +184 +183 +182 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +130 +130 +125 +125 +120 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +65 +65 +58 +58 +55 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +12 +15 +16 +17 +17 +19 +20 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +32 +33 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +50 +55 +54 +58 +58 +59 +65 +65 +68 +69 +68 +72 +72 +76 +76 +76 +83 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +116 +119 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +183 +185 +184 +185 +189 +189 +190 +191 +190 +194 +194 +196 +197 +196 +198 +199 +201 +201 +200 +200 +201 +202 +203 +203 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +197 +197 +194 +194 +194 +190 +190 +191 +191 +191 +189 +189 +185 +185 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +168 +169 +169 +164 +165 +161 +161 +161 +158 +157 +151 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +134 +130 +130 +129 +125 +126 +119 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +77 +77 +72 +72 +72 +72 +72 +69 +69 +64 +64 +64 +59 +59 +55 +55 +55 +51 +50 +47 +46 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +46 +51 +51 +54 +54 +55 +59 +58 +64 +65 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +116 +119 +119 +126 +125 +130 +129 +130 +133 +133 +139 +140 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +156 +157 +161 +161 +161 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +178 +179 +183 +183 +185 +184 +184 +188 +188 +191 +190 +190 +194 +195 +196 +196 +197 +198 +198 +201 +200 +201 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +201 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +190 +190 +189 +188 +189 +184 +184 +183 +182 +182 +178 +178 +175 +174 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +126 +126 +120 +120 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +65 +65 +59 +59 +59 +55 +55 +51 +50 +47 +46 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +58 +59 +58 +65 +64 +68 +68 +69 +72 +73 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +110 +110 +110 +116 +115 +120 +120 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +178 +179 +183 +183 +183 +185 +184 +189 +189 +189 +191 +191 +194 +194 +196 +197 +197 +199 +198 +200 +200 +200 +201 +201 +200 +201 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +205 +204 +203 +202 +202 +201 +200 +200 +200 +198 +199 +198 +197 +196 +194 +195 +195 +190 +191 +189 +188 +188 +185 +185 +183 +182 +183 +178 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +134 +133 +130 +129 +129 +125 +125 +120 +120 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +25 +26 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +37 +37 +41 +41 +43 +43 +42 +47 +47 +50 +50 +51 +55 +55 +59 +58 +59 +65 +64 +68 +68 +69 +73 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +116 +116 +119 +120 +120 +126 +126 +129 +130 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +182 +185 +185 +185 +188 +188 +190 +191 +191 +195 +194 +195 +194 +195 +196 +197 +199 +198 +198 +201 +200 +200 +201 +201 +202 +202 +205 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +204 +204 +205 +204 +205 +202 +202 +200 +200 +200 +201 +200 +199 +198 +199 +196 +196 +195 +194 +194 +191 +190 +188 +189 +189 +185 +185 +183 +183 +179 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +134 +130 +129 +125 +126 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +65 +58 +58 +54 +55 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +50 +50 +54 +55 +59 +59 +58 +65 +65 +69 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +115 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +162 +161 +165 +165 +168 +169 +173 +173 +172 +174 +175 +178 +178 +179 +183 +182 +183 +183 +182 +185 +184 +189 +189 +189 +190 +190 +195 +194 +195 +197 +197 +198 +198 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +201 +198 +199 +199 +196 +196 +194 +195 +190 +190 +190 +188 +188 +188 +188 +189 +184 +184 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +150 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +69 +65 +64 +58 +58 +55 +55 +54 +51 +50 +47 +47 +47 +43 +43 +43 +42 +43 +41 +41 +37 +37 +36 +33 +33 +31 +31 +29 +27 +27 +25 +25 +20 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +16 +15 +16 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +51 +50 +51 +55 +54 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +95 +101 +100 +100 +106 +106 +110 +109 +110 +115 +116 +119 +120 +120 +126 +126 +129 +129 +129 +133 +133 +139 +140 +140 +144 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +178 +179 +182 +182 +183 +184 +185 +188 +189 +190 +190 +191 +195 +195 +196 +196 +197 +198 +198 +199 +198 +198 +201 +201 +200 +200 +200 +202 +203 +204 +204 +205 +204 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +201 +200 +200 +200 +198 +199 +196 +196 +197 +195 +194 +190 +190 +190 +189 +188 +185 +184 +185 +182 +183 +179 +179 +178 +174 +175 +172 +173 +169 +168 +169 +165 +165 +161 +160 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +126 +120 +119 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +64 +65 +59 +58 +58 +54 +54 +54 +54 +55 +50 +50 +47 +47 +47 +42 +43 +41 +41 +39 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +120 +119 +125 +125 +126 +130 +129 +133 +133 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +174 +178 +179 +178 +183 +183 +185 +185 +185 +189 +188 +189 +188 +188 +190 +190 +194 +195 +195 +197 +197 +199 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +204 +204 +205 +205 +204 +202 +203 +202 +201 +201 +201 +200 +200 +198 +198 +196 +196 +196 +194 +194 +191 +190 +191 +188 +188 +184 +184 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +120 +120 +116 +116 +110 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +54 +50 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +59 +58 +65 +64 +65 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +115 +115 +115 +120 +119 +125 +125 +126 +129 +130 +129 +129 +129 +134 +133 +139 +140 +139 +143 +143 +147 +147 +148 +151 +151 +157 +156 +161 +160 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +184 +185 +188 +189 +188 +190 +190 +194 +195 +195 +196 +196 +199 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +205 +204 +203 +203 +200 +200 +201 +201 +200 +198 +198 +197 +197 +196 +194 +195 +190 +191 +191 +188 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +116 +115 +109 +110 +109 +106 +106 +100 +100 +100 +96 +96 +96 +97 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +75 +72 +72 +69 +69 +65 +64 +64 +58 +58 +55 +55 +55 +51 +50 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +26 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +14 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +44 +43 +48 +46 +47 +50 +51 +54 +54 +54 +59 +58 +65 +64 +65 +68 +68 +72 +72 +72 +77 +77 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +115 +116 +119 +120 +119 +125 +125 +129 +130 +131 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +172 +173 +174 +175 +175 +179 +179 +183 +183 +183 +185 +184 +188 +189 +188 +190 +190 +195 +195 +195 +196 +197 +198 +198 +199 +200 +201 +200 +200 +202 +202 +202 +204 +205 +204 +205 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +204 +205 +205 +204 +202 +202 +202 +200 +200 +201 +200 +200 +198 +199 +197 +196 +196 +194 +194 +191 +190 +190 +188 +188 +184 +185 +184 +183 +183 +178 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +148 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +115 +116 +116 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +69 +65 +64 +58 +58 +58 +54 +54 +50 +50 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +46 +47 +50 +50 +54 +54 +55 +59 +59 +64 +65 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +99 +105 +106 +106 +110 +109 +115 +115 +117 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +185 +184 +185 +189 +188 +190 +190 +191 +195 +195 +196 +196 +198 +198 +199 +200 +200 +200 +200 +200 +201 +200 +203 +202 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +201 +200 +198 +198 +196 +196 +197 +195 +195 +191 +190 +189 +188 +189 +184 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +129 +126 +125 +126 +119 +119 +115 +116 +113 +110 +110 +106 +106 +100 +99 +100 +96 +96 +90 +91 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +59 +54 +54 +55 +51 +50 +47 +47 +47 +43 +42 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +18 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +12 +15 +15 +18 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +30 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +47 +46 +50 +50 +55 +55 +55 +59 +58 +64 +64 +64 +68 +69 +73 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +119 +120 +119 +119 +125 +125 +129 +130 +130 +133 +133 +139 +139 +142 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +178 +179 +183 +182 +183 +185 +185 +188 +189 +191 +191 +191 +194 +194 +197 +196 +197 +198 +198 +200 +200 +201 +201 +200 +202 +202 +203 +204 +204 +204 +204 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +204 +202 +202 +203 +200 +201 +200 +201 +199 +198 +198 +196 +196 +194 +195 +194 +190 +190 +189 +188 +188 +185 +185 +183 +182 +182 +179 +179 +175 +175 +176 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +127 +126 +125 +119 +119 +115 +116 +115 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +77 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +59 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +16 +17 +17 +15 +15 +15 +15 +15 +12 +13 +12 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +31 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +129 +132 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +176 +178 +179 +183 +183 +184 +184 +185 +188 +189 +190 +191 +190 +194 +195 +197 +196 +196 +198 +199 +201 +200 +200 +201 +201 +202 +203 +205 +205 +205 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +199 +198 +197 +196 +196 +196 +196 +195 +195 +191 +190 +191 +189 +189 +185 +184 +185 +183 +183 +178 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +134 +134 +130 +129 +130 +125 +126 +120 +120 +119 +116 +115 +116 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +91 +90 +89 +86 +86 +82 +82 +83 +76 +76 +72 +72 +73 +68 +68 +64 +65 +65 +58 +58 +54 +55 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +58 +59 +61 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +119 +119 +120 +125 +126 +129 +130 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +182 +183 +184 +185 +189 +189 +189 +190 +191 +194 +194 +196 +196 +196 +198 +198 +200 +201 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +207 +207 +207 +206 +207 +206 +206 +206 +206 +207 +207 +206 +204 +205 +204 +204 +204 +203 +202 +201 +200 +200 +201 +200 +198 +198 +200 +196 +196 +194 +195 +191 +191 +191 +189 +188 +185 +185 +184 +182 +183 +183 +182 +182 +179 +178 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +144 +133 +133 +129 +129 +130 +125 +125 +119 +120 +117 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +59 +58 +55 +54 +54 +51 +50 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +18 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +44 +47 +47 +51 +51 +54 +54 +54 +58 +59 +58 +58 +59 +64 +64 +64 +64 +65 +69 +69 +72 +72 +72 +77 +76 +82 +83 +86 +87 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +126 +129 +129 +134 +133 +138 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +182 +185 +185 +188 +188 +188 +190 +190 +190 +190 +191 +194 +195 +197 +197 +196 +198 +198 +201 +200 +201 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +199 +196 +196 +195 +194 +194 +190 +191 +188 +189 +188 +184 +185 +183 +182 +181 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +160 +158 +157 +151 +151 +152 +147 +147 +143 +143 +141 +139 +139 +134 +133 +129 +129 +129 +125 +126 +120 +120 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +69 +68 +64 +64 +58 +58 +58 +54 +55 +50 +50 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +40 +43 +43 +42 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +58 +63 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +115 +115 +116 +119 +119 +125 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +184 +185 +184 +188 +189 +191 +190 +191 +194 +194 +197 +197 +199 +198 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +205 +207 +207 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +202 +202 +200 +200 +200 +201 +199 +198 +196 +196 +197 +194 +194 +190 +191 +189 +188 +188 +185 +184 +182 +183 +183 +178 +179 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +130 +125 +126 +125 +119 +120 +115 +116 +110 +109 +109 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +65 +64 +59 +59 +59 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +36 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +16 +16 +15 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +47 +46 +50 +50 +50 +51 +51 +54 +54 +59 +59 +59 +64 +65 +68 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +183 +185 +184 +185 +189 +189 +191 +190 +190 +195 +195 +196 +196 +197 +198 +199 +201 +201 +201 +201 +201 +202 +202 +203 +204 +204 +205 +204 +206 +207 +207 +206 +206 +206 +206 +206 +206 +207 +207 +207 +207 +206 +206 +207 +206 +206 +204 +205 +204 +204 +203 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +197 +197 +195 +194 +195 +194 +194 +190 +190 +188 +189 +189 +185 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +137 +133 +133 +130 +130 +126 +125 +126 +120 +120 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +69 +68 +68 +65 +64 +58 +58 +59 +55 +55 +50 +51 +51 +47 +47 +42 +42 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +14 +15 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +116 +116 +119 +120 +125 +125 +125 +129 +129 +134 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +185 +184 +189 +189 +191 +191 +191 +194 +194 +196 +196 +199 +198 +198 +200 +200 +200 +200 +200 +203 +203 +203 +202 +202 +205 +205 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +205 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +196 +197 +197 +194 +195 +191 +191 +190 +189 +188 +184 +185 +184 +182 +182 +179 +178 +178 +175 +174 +173 +172 +173 +169 +169 +165 +165 +160 +161 +160 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +130 +125 +125 +125 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +59 +59 +59 +55 +54 +55 +54 +54 +50 +51 +51 +51 +50 +47 +47 +43 +42 +43 +41 +40 +37 +37 +38 +33 +33 +31 +30 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +40 +41 +41 +43 +43 +47 +47 +46 +50 +51 +54 +54 +55 +59 +59 +65 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +85 +86 +86 +90 +89 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +126 +126 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +183 +183 +184 +184 +188 +188 +188 +190 +190 +191 +191 +190 +194 +194 +196 +197 +197 +199 +198 +200 +200 +200 +201 +200 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +197 +196 +195 +194 +190 +190 +191 +188 +189 +184 +185 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +125 +126 +125 +119 +120 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +55 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +105 +109 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +172 +173 +175 +175 +175 +179 +179 +183 +182 +183 +184 +185 +189 +188 +190 +190 +191 +194 +194 +196 +196 +197 +198 +199 +200 +200 +200 +200 +201 +200 +201 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +201 +201 +199 +198 +196 +196 +197 +194 +194 +190 +190 +191 +189 +189 +184 +184 +184 +183 +182 +179 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +162 +161 +161 +158 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +134 +133 +130 +129 +126 +125 +125 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +69 +64 +64 +58 +58 +58 +54 +55 +51 +51 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +18 +17 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +47 +46 +47 +51 +51 +54 +54 +55 +58 +58 +65 +64 +65 +68 +69 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +115 +116 +116 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +160 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +176 +179 +179 +183 +183 +185 +184 +185 +188 +188 +190 +191 +191 +195 +194 +195 +195 +194 +196 +196 +199 +199 +198 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +199 +199 +198 +196 +196 +195 +194 +194 +190 +190 +189 +188 +188 +189 +189 +185 +185 +183 +182 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +140 +139 +139 +133 +134 +129 +129 +130 +125 +126 +120 +120 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +67 +68 +64 +64 +64 +59 +59 +54 +54 +52 +50 +51 +46 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +20 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +40 +40 +43 +43 +47 +47 +47 +50 +50 +54 +54 +55 +58 +58 +65 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +110 +116 +115 +119 +120 +119 +125 +126 +129 +129 +130 +133 +133 +140 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +156 +158 +161 +161 +165 +164 +168 +169 +169 +173 +172 +175 +175 +175 +179 +179 +178 +178 +179 +183 +183 +184 +185 +185 +189 +189 +190 +190 +194 +195 +195 +196 +196 +198 +199 +198 +200 +200 +201 +200 +200 +202 +203 +205 +204 +204 +204 +204 +206 +207 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +204 +204 +204 +202 +202 +201 +200 +201 +201 +200 +199 +198 +199 +197 +197 +194 +195 +191 +190 +191 +189 +189 +185 +185 +184 +183 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +144 +143 +143 +139 +139 +134 +134 +134 +129 +129 +126 +125 +126 +119 +120 +116 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +66 +64 +64 +59 +59 +54 +55 +54 +50 +50 +47 +46 +47 +43 +43 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +20 +21 +19 +19 +17 +17 +17 +15 +15 +14 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +64 +64 +68 +69 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +116 +119 +120 +120 +120 +119 +126 +126 +129 +129 +130 +133 +134 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +182 +183 +185 +185 +188 +188 +189 +191 +190 +194 +194 +194 +196 +197 +198 +198 +198 +201 +201 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +205 +204 +202 +203 +201 +201 +200 +200 +200 +198 +199 +199 +196 +196 +195 +195 +194 +190 +190 +189 +189 +189 +184 +184 +183 +183 +182 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +83 +77 +76 +76 +72 +72 +72 +72 +72 +68 +68 +69 +68 +69 +64 +64 +58 +58 +59 +54 +55 +51 +50 +48 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +55 +59 +59 +65 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +95 +96 +100 +100 +106 +106 +107 +109 +110 +116 +115 +119 +119 +119 +126 +126 +129 +129 +130 +133 +133 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +185 +189 +189 +191 +191 +194 +195 +194 +196 +197 +198 +199 +198 +200 +201 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +201 +198 +198 +199 +196 +196 +194 +195 +191 +191 +190 +189 +188 +185 +185 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +119 +117 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +68 +68 +65 +64 +58 +59 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +50 +55 +55 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +73 +76 +77 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +116 +119 +119 +119 +120 +120 +126 +125 +129 +129 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +182 +184 +185 +184 +188 +189 +190 +190 +191 +194 +195 +197 +197 +196 +198 +199 +200 +200 +200 +201 +200 +202 +202 +202 +204 +205 +204 +204 +207 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +205 +202 +202 +202 +200 +200 +200 +201 +199 +198 +198 +196 +197 +195 +195 +195 +190 +191 +189 +189 +188 +184 +185 +183 +182 +182 +179 +179 +175 +175 +174 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +131 +129 +129 +125 +126 +119 +120 +120 +116 +116 +116 +116 +115 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +59 +55 +54 +51 +50 +51 +47 +46 +43 +43 +40 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +16 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +15 +16 +15 +18 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +46 +47 +51 +50 +50 +51 +51 +55 +55 +58 +58 +58 +65 +64 +68 +68 +69 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +119 +119 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +172 +175 +175 +175 +178 +178 +183 +183 +183 +185 +184 +189 +189 +188 +191 +190 +194 +194 +195 +196 +197 +198 +199 +200 +201 +200 +201 +200 +202 +203 +203 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +201 +200 +200 +200 +200 +198 +198 +198 +197 +197 +195 +194 +195 +190 +191 +189 +188 +185 +184 +184 +183 +182 +179 +179 +178 +174 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +134 +133 +129 +129 +125 +125 +125 +120 +119 +115 +116 +111 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +58 +58 +59 +55 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +32 +31 +30 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +51 +50 +55 +54 +58 +58 +59 +64 +64 +68 +68 +69 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +105 +109 +110 +115 +115 +115 +119 +120 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +179 +183 +183 +184 +184 +189 +188 +189 +191 +190 +194 +194 +194 +196 +196 +198 +199 +199 +200 +201 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +207 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +201 +201 +201 +200 +200 +198 +198 +196 +197 +196 +194 +194 +190 +191 +190 +189 +188 +189 +188 +188 +185 +185 +183 +182 +182 +178 +179 +175 +175 +175 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +144 +143 +139 +139 +133 +133 +130 +129 +129 +125 +126 +120 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +69 +68 +65 +65 +58 +59 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +34 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +55 +54 +54 +55 +55 +59 +58 +64 +64 +65 +68 +68 +72 +72 +75 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +120 +126 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +152 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +178 +182 +182 +183 +185 +185 +189 +188 +189 +191 +191 +195 +194 +194 +196 +196 +198 +198 +199 +200 +200 +200 +201 +203 +202 +202 +204 +204 +204 +205 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +205 +204 +205 +202 +202 +202 +201 +200 +200 +201 +200 +198 +198 +198 +199 +198 +196 +196 +194 +194 +195 +190 +191 +189 +189 +186 +184 +184 +182 +182 +179 +179 +179 +175 +175 +173 +173 +172 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +125 +125 +119 +120 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +59 +58 +58 +54 +54 +51 +51 +46 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +12 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +54 +54 +55 +59 +59 +64 +65 +65 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +116 +116 +120 +120 +125 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +144 +143 +147 +148 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +172 +175 +175 +179 +178 +179 +182 +183 +185 +185 +184 +189 +188 +190 +190 +195 +194 +194 +196 +196 +198 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +204 +205 +202 +202 +203 +201 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +191 +188 +188 +188 +185 +184 +185 +185 +185 +183 +183 +179 +178 +179 +175 +175 +173 +172 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +125 +125 +126 +119 +119 +116 +116 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +64 +64 +58 +58 +58 +54 +55 +50 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +20 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +58 +58 +59 +64 +65 +69 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +120 +119 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +179 +178 +179 +183 +182 +185 +185 +185 +189 +189 +191 +191 +191 +195 +195 +196 +197 +197 +198 +198 +200 +200 +201 +201 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +205 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +198 +198 +196 +196 +195 +194 +195 +190 +191 +188 +188 +188 +185 +184 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +134 +133 +130 +129 +125 +125 +125 +120 +120 +116 +116 +115 +110 +109 +106 +105 +106 +100 +100 +95 +96 +91 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +58 +54 +54 +51 +51 +47 +47 +46 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +16 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +42 +47 +46 +47 +50 +50 +54 +54 +58 +59 +59 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +109 +110 +115 +115 +120 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +162 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +183 +184 +185 +188 +188 +189 +191 +191 +194 +194 +197 +197 +196 +198 +198 +200 +200 +200 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +205 +204 +207 +207 +207 +206 +206 +206 +207 +206 +207 +207 +206 +206 +206 +206 +207 +204 +204 +204 +205 +204 +204 +204 +202 +202 +203 +200 +201 +200 +200 +199 +198 +199 +197 +196 +194 +195 +194 +190 +190 +188 +188 +188 +185 +184 +183 +183 +183 +179 +178 +175 +174 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +120 +119 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +85 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +65 +65 +59 +58 +55 +55 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +36 +32 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +40 +41 +43 +43 +43 +47 +47 +50 +51 +50 +55 +55 +59 +58 +58 +64 +65 +68 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +120 +126 +125 +130 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +185 +185 +185 +188 +189 +190 +191 +191 +195 +195 +195 +194 +194 +197 +196 +199 +198 +198 +201 +201 +200 +200 +201 +203 +203 +205 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +204 +204 +205 +203 +202 +200 +201 +200 +201 +200 +199 +198 +199 +197 +197 +195 +195 +194 +191 +191 +189 +189 +189 +185 +185 +183 +183 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +130 +126 +126 +119 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +51 +51 +47 +47 +42 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +32 +31 +27 +27 +25 +24 +25 +21 +21 +19 +18 +20 +17 +17 +15 +14 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +51 +51 +55 +55 +58 +59 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +105 +106 +110 +110 +117 +116 +116 +120 +119 +125 +125 +125 +129 +129 +130 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +186 +189 +189 +191 +191 +194 +195 +194 +196 +196 +196 +196 +196 +199 +198 +198 +199 +199 +200 +201 +200 +200 +201 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +202 +203 +200 +200 +201 +200 +200 +198 +199 +196 +197 +196 +194 +194 +191 +191 +191 +189 +189 +185 +185 +185 +183 +183 +178 +179 +178 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +68 +68 +68 +65 +65 +58 +58 +59 +54 +55 +51 +50 +50 +47 +47 +43 +44 +43 +40 +41 +37 +37 +35 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +18 +20 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +14 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +42 +47 +47 +51 +51 +50 +54 +54 +58 +58 +58 +64 +64 +68 +68 +67 +72 +72 +76 +76 +77 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +109 +116 +116 +116 +120 +119 +125 +126 +126 +130 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +184 +185 +189 +188 +189 +191 +190 +190 +191 +190 +194 +195 +196 +196 +197 +199 +198 +201 +200 +200 +201 +201 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +204 +205 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +197 +196 +195 +194 +194 +190 +190 +189 +189 +188 +184 +185 +183 +183 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +156 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +130 +129 +125 +125 +126 +119 +119 +119 +120 +120 +115 +116 +109 +110 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +85 +86 +86 +82 +82 +76 +76 +76 +72 +73 +72 +73 +72 +68 +68 +64 +64 +65 +58 +58 +54 +54 +53 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +14 +13 +12 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +38 +38 +41 +41 +41 +43 +44 +46 +47 +47 +50 +51 +54 +55 +55 +58 +58 +64 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +120 +119 +120 +126 +125 +129 +129 +129 +133 +133 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +156 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +189 +188 +189 +190 +191 +194 +194 +196 +196 +196 +199 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +205 +204 +204 +204 +205 +202 +202 +203 +200 +201 +200 +200 +200 +198 +199 +196 +197 +194 +194 +195 +191 +191 +188 +189 +188 +185 +185 +183 +183 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +129 +125 +125 +120 +119 +120 +115 +116 +109 +110 +107 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +66 +64 +64 +59 +58 +55 +54 +54 +50 +50 +46 +47 +46 +43 +43 +43 +43 +43 +41 +41 +36 +36 +37 +33 +33 +31 +31 +29 +27 +27 +26 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +28 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +42 +47 +47 +51 +51 +50 +54 +54 +59 +59 +59 +64 +65 +68 +69 +69 +72 +72 +76 +77 +77 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +115 +115 +116 +119 +119 +125 +126 +125 +129 +129 +133 +133 +135 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +177 +178 +179 +182 +183 +184 +185 +184 +189 +188 +190 +191 +191 +195 +195 +196 +196 +196 +199 +198 +200 +201 +200 +200 +200 +203 +202 +204 +205 +205 +204 +204 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +203 +201 +200 +200 +200 +200 +198 +198 +198 +196 +197 +195 +194 +195 +191 +190 +189 +189 +188 +185 +185 +183 +183 +183 +178 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +130 +130 +125 +126 +125 +120 +119 +116 +115 +115 +110 +110 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +76 +76 +76 +72 +72 +67 +68 +69 +64 +65 +64 +64 +65 +58 +59 +55 +55 +54 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +16 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +32 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +58 +59 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +100 +106 +110 +110 +109 +110 +116 +116 +119 +119 +122 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +172 +173 +174 +175 +175 +179 +179 +182 +183 +183 +185 +184 +189 +189 +189 +191 +191 +194 +194 +194 +197 +196 +198 +199 +199 +200 +201 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +207 +206 +207 +206 +207 +207 +207 +207 +206 +206 +207 +206 +206 +207 +204 +205 +204 +204 +205 +202 +202 +202 +200 +201 +200 +200 +200 +198 +199 +197 +196 +197 +194 +195 +191 +191 +190 +188 +189 +185 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +126 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +56 +54 +54 +51 +51 +47 +46 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +46 +47 +47 +50 +50 +54 +55 +55 +59 +58 +64 +64 +69 +69 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +126 +125 +129 +130 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +148 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +183 +183 +185 +185 +188 +190 +190 +190 +191 +195 +194 +194 +195 +194 +196 +196 +199 +199 +198 +200 +200 +201 +200 +200 +203 +203 +204 +204 +205 +204 +204 +206 +207 +207 +207 +206 +206 +206 +206 +207 +207 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +201 +201 +200 +200 +198 +198 +197 +197 +196 +194 +194 +190 +191 +191 +189 +188 +185 +184 +184 +182 +183 +179 +178 +178 +174 +174 +172 +173 +173 +169 +169 +165 +164 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +134 +134 +134 +130 +129 +125 +126 +125 +120 +119 +115 +116 +109 +110 +110 +106 +105 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +73 +73 +72 +68 +68 +64 +64 +64 +58 +59 +55 +55 +55 +51 +51 +47 +47 +46 +42 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +51 +50 +50 +54 +54 +58 +58 +59 +65 +65 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +109 +116 +115 +119 +119 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +174 +175 +179 +179 +179 +183 +183 +185 +184 +184 +189 +188 +190 +190 +190 +194 +194 +196 +196 +196 +199 +199 +201 +200 +201 +201 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +197 +197 +197 +197 +196 +195 +194 +190 +190 +190 +188 +189 +184 +185 +185 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +134 +133 +134 +129 +129 +125 +125 +125 +119 +120 +119 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +69 +68 +68 +64 +64 +58 +59 +59 +54 +54 +50 +51 +47 +46 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +59 +58 +61 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +101 +106 +105 +109 +110 +110 +116 +116 +119 +120 +119 +126 +125 +130 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +189 +189 +188 +190 +191 +194 +194 +197 +197 +196 +199 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +201 +198 +198 +197 +196 +197 +194 +195 +190 +191 +188 +189 +188 +185 +184 +183 +182 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +134 +133 +133 +129 +129 +126 +125 +126 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +58 +58 +59 +54 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +38 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +12 +15 +15 +17 +17 +18 +19 +19 +22 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +54 +58 +58 +58 +64 +64 +72 +72 +72 +76 +76 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +109 +115 +116 +120 +120 +119 +125 +125 +129 +129 +129 +134 +133 +139 +140 +140 +143 +143 +147 +147 +151 +152 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +174 +179 +178 +183 +182 +183 +184 +185 +189 +189 +191 +190 +191 +195 +194 +196 +196 +197 +198 +198 +200 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +205 +205 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +201 +198 +198 +197 +196 +194 +194 +195 +191 +191 +188 +188 +188 +185 +184 +185 +185 +185 +183 +183 +179 +179 +178 +175 +175 +173 +173 +174 +169 +169 +165 +165 +161 +161 +161 +156 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +127 +125 +125 +120 +120 +115 +116 +115 +110 +109 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +58 +59 +55 +54 +55 +51 +51 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +32 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +22 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +51 +50 +54 +54 +58 +59 +59 +65 +64 +64 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +87 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +115 +119 +119 +126 +125 +125 +129 +129 +133 +133 +135 +139 +139 +143 +143 +146 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +183 +182 +182 +185 +184 +188 +188 +188 +191 +190 +191 +190 +190 +194 +194 +197 +196 +196 +198 +199 +200 +200 +201 +200 +200 +202 +202 +205 +204 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +200 +200 +200 +198 +199 +199 +196 +196 +196 +197 +196 +194 +194 +191 +190 +191 +188 +188 +184 +185 +185 +183 +183 +179 +178 +174 +175 +174 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +140 +133 +134 +134 +129 +129 +125 +125 +125 +120 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +83 +83 +82 +76 +76 +73 +73 +73 +68 +68 +64 +64 +64 +59 +59 +55 +54 +54 +50 +50 +47 +47 +44 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +12 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +42 +43 +47 +47 +51 +51 +51 +55 +55 +59 +59 +61 +65 +64 +68 +68 +72 +72 +72 +76 +77 +82 +83 +83 +86 +86 +90 +90 +91 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +125 +129 +129 +134 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +184 +188 +188 +191 +191 +190 +195 +194 +196 +196 +199 +198 +199 +201 +201 +200 +200 +200 +202 +202 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +202 +202 +203 +202 +202 +201 +200 +200 +200 +200 +198 +199 +196 +197 +197 +194 +194 +190 +191 +188 +189 +188 +185 +185 +183 +183 +182 +178 +179 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +119 +116 +116 +110 +110 +109 +106 +105 +100 +100 +101 +96 +96 +90 +90 +91 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +50 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +50 +55 +54 +58 +58 +58 +64 +64 +68 +69 +69 +72 +72 +76 +76 +76 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +120 +126 +125 +129 +130 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +170 +169 +169 +172 +173 +175 +175 +175 +179 +178 +182 +183 +182 +184 +185 +189 +189 +191 +190 +190 +195 +195 +196 +196 +197 +198 +198 +200 +201 +201 +200 +200 +202 +202 +203 +204 +204 +204 +205 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +204 +205 +204 +204 +202 +202 +202 +200 +201 +200 +201 +200 +199 +198 +197 +197 +195 +194 +194 +191 +190 +189 +188 +188 +185 +184 +185 +185 +185 +183 +183 +178 +179 +179 +174 +175 +173 +173 +173 +169 +170 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +119 +119 +115 +116 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +65 +59 +58 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +54 +54 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +110 +116 +115 +119 +120 +119 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +148 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +175 +175 +179 +179 +182 +182 +183 +185 +185 +185 +184 +184 +189 +189 +190 +191 +190 +194 +194 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +200 +200 +200 +201 +198 +198 +199 +196 +196 +195 +195 +192 +190 +191 +189 +189 +184 +185 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +134 +129 +129 +126 +126 +126 +120 +119 +116 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +64 +64 +58 +58 +55 +54 +55 +51 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +54 +55 +55 +59 +58 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +120 +126 +125 +125 +130 +129 +133 +134 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +158 +157 +157 +161 +161 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +182 +183 +183 +184 +185 +189 +188 +191 +191 +191 +194 +195 +197 +197 +196 +199 +199 +199 +198 +199 +200 +200 +201 +200 +200 +202 +203 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +201 +200 +201 +201 +200 +198 +199 +198 +196 +196 +194 +195 +195 +191 +190 +188 +188 +188 +184 +184 +183 +183 +183 +178 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +129 +125 +125 +125 +119 +120 +115 +116 +115 +110 +109 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +69 +65 +64 +58 +59 +58 +55 +55 +51 +50 +50 +47 +47 +43 +44 +43 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +14 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +54 +58 +59 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +184 +185 +185 +185 +185 +188 +189 +190 +191 +190 +194 +194 +196 +197 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +204 +205 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +201 +201 +200 +200 +198 +199 +199 +196 +197 +194 +194 +191 +191 +191 +188 +188 +185 +185 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +119 +115 +116 +116 +110 +110 +105 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +65 +59 +58 +54 +54 +50 +50 +51 +47 +47 +43 +42 +43 +40 +41 +37 +37 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +51 +54 +54 +58 +59 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +119 +119 +125 +125 +130 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +174 +175 +174 +179 +179 +183 +182 +183 +185 +184 +189 +188 +189 +191 +191 +195 +194 +196 +196 +196 +199 +198 +200 +200 +201 +200 +200 +200 +200 +200 +203 +202 +204 +204 +205 +204 +205 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +200 +201 +200 +200 +201 +198 +198 +196 +196 +197 +194 +195 +190 +190 +190 +188 +188 +185 +184 +184 +183 +183 +179 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +134 +134 +133 +129 +130 +125 +125 +126 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +91 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +74 +69 +69 +64 +58 +58 +58 +55 +55 +51 +50 +51 +47 +47 +47 +47 +46 +43 +42 +41 +41 +41 +37 +36 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +47 +50 +50 +55 +54 +55 +58 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +97 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +109 +115 +116 +120 +120 +119 +125 +125 +130 +130 +130 +133 +133 +140 +140 +143 +143 +143 +147 +147 +151 +151 +151 +156 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +174 +175 +175 +179 +178 +182 +182 +183 +185 +184 +188 +189 +189 +190 +191 +191 +190 +190 +194 +194 +196 +196 +197 +198 +199 +201 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +207 +204 +205 +204 +204 +204 +203 +202 +200 +200 +200 +201 +200 +199 +198 +198 +196 +196 +195 +194 +195 +191 +191 +189 +188 +189 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +126 +126 +119 +119 +116 +116 +115 +110 +110 +105 +106 +106 +99 +100 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +65 +64 +58 +58 +58 +54 +54 +51 +51 +48 +47 +47 +43 +43 +41 +41 +41 +36 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +51 +50 +54 +54 +58 +58 +59 +65 +64 +69 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +120 +126 +125 +125 +130 +130 +133 +133 +133 +139 +140 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +175 +179 +178 +178 +178 +179 +182 +182 +185 +185 +185 +188 +189 +190 +190 +194 +194 +194 +196 +196 +198 +198 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +200 +200 +200 +200 +200 +199 +198 +198 +196 +197 +195 +195 +191 +190 +190 +188 +188 +184 +184 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +146 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +119 +120 +116 +116 +116 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +87 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +64 +64 +58 +58 +54 +55 +55 +51 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +28 +27 +27 +25 +25 +21 +22 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +50 +55 +54 +55 +59 +59 +65 +65 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +120 +120 +120 +120 +125 +125 +129 +130 +129 +134 +133 +139 +139 +141 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +181 +183 +183 +185 +185 +188 +188 +188 +190 +191 +194 +195 +194 +197 +196 +198 +198 +198 +200 +200 +200 +201 +201 +203 +203 +204 +204 +205 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +195 +195 +190 +190 +190 +188 +188 +185 +185 +184 +182 +183 +179 +179 +179 +174 +175 +173 +173 +170 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +134 +129 +129 +125 +125 +119 +119 +119 +116 +115 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +59 +58 +59 +54 +55 +50 +51 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +12 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +51 +54 +54 +54 +59 +58 +64 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +121 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +182 +184 +184 +189 +189 +189 +190 +190 +195 +194 +195 +196 +196 +198 +198 +199 +201 +201 +201 +200 +202 +202 +203 +205 +204 +205 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +205 +204 +202 +203 +203 +201 +201 +201 +200 +200 +198 +199 +197 +196 +196 +194 +194 +191 +190 +190 +188 +189 +185 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +138 +139 +140 +134 +133 +129 +129 +129 +125 +125 +126 +125 +125 +119 +119 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +55 +55 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +42 +43 +47 +47 +47 +50 +50 +55 +54 +55 +59 +59 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +109 +115 +116 +116 +119 +120 +126 +125 +125 +129 +129 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +178 +179 +182 +182 +183 +185 +185 +188 +188 +190 +191 +190 +195 +194 +196 +197 +196 +198 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +202 +200 +201 +201 +201 +200 +198 +199 +196 +197 +195 +195 +194 +191 +191 +189 +189 +189 +184 +185 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +130 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +68 +69 +68 +65 +64 +58 +58 +59 +55 +54 +50 +50 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +16 +15 +15 +18 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +48 +47 +46 +50 +51 +55 +54 +54 +58 +58 +58 +58 +59 +64 +64 +68 +69 +68 +72 +72 +76 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +115 +120 +119 +125 +126 +127 +130 +129 +133 +133 +139 +139 +139 +144 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +174 +175 +175 +178 +179 +183 +182 +183 +185 +185 +189 +189 +188 +190 +190 +194 +194 +194 +196 +197 +199 +198 +198 +200 +201 +201 +200 +202 +202 +202 +205 +204 +204 +204 +204 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +205 +204 +204 +203 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +190 +190 +189 +189 +189 +184 +185 +185 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +126 +126 +125 +126 +120 +119 +115 +115 +116 +110 +110 +105 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +54 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +15 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +50 +51 +55 +55 +59 +58 +61 +64 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +115 +115 +120 +119 +119 +126 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +178 +183 +183 +183 +184 +185 +188 +189 +188 +190 +191 +195 +194 +197 +196 +196 +198 +198 +200 +200 +200 +201 +201 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +207 +207 +206 +206 +207 +206 +207 +206 +207 +207 +207 +204 +205 +204 +204 +205 +202 +202 +202 +200 +201 +201 +200 +200 +199 +199 +196 +197 +197 +194 +194 +190 +190 +189 +189 +189 +185 +185 +183 +183 +183 +179 +178 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +140 +139 +139 +133 +133 +129 +129 +130 +125 +126 +120 +119 +116 +115 +110 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +77 +72 +72 +69 +69 +65 +64 +64 +58 +58 +54 +55 +55 +50 +50 +46 +47 +46 +43 +43 +40 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +55 +59 +58 +58 +64 +64 +69 +68 +68 +73 +72 +71 +72 +72 +77 +76 +82 +82 +83 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +115 +115 +120 +119 +120 +126 +125 +129 +129 +130 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +185 +185 +185 +189 +188 +191 +191 +191 +195 +194 +196 +197 +196 +198 +198 +200 +201 +200 +200 +201 +202 +202 +203 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +200 +200 +201 +200 +200 +198 +198 +196 +197 +197 +194 +195 +195 +194 +195 +191 +191 +189 +189 +189 +184 +184 +182 +182 +181 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +140 +139 +133 +133 +129 +129 +129 +126 +126 +119 +119 +119 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +59 +59 +59 +54 +55 +51 +51 +51 +47 +47 +42 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +27 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +20 +25 +25 +27 +27 +29 +31 +30 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +46 +47 +47 +47 +51 +50 +55 +54 +55 +59 +58 +65 +64 +67 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +117 +120 +120 +125 +125 +129 +129 +130 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +182 +185 +184 +189 +188 +188 +190 +191 +194 +195 +195 +196 +196 +199 +198 +201 +200 +200 +201 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +201 +201 +200 +200 +200 +198 +198 +198 +197 +197 +194 +194 +192 +190 +191 +188 +189 +184 +184 +185 +183 +182 +178 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +129 +125 +125 +119 +120 +120 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +55 +54 +55 +51 +51 +47 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +50 +50 +50 +55 +54 +58 +58 +59 +64 +64 +69 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +115 +119 +119 +120 +125 +125 +129 +129 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +156 +157 +161 +161 +161 +166 +165 +169 +169 +169 +172 +173 +175 +175 +175 +178 +179 +183 +183 +182 +184 +185 +188 +188 +190 +191 +191 +195 +195 +196 +196 +196 +198 +198 +198 +198 +198 +200 +200 +201 +200 +200 +202 +203 +204 +204 +205 +205 +204 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +202 +203 +201 +201 +201 +200 +200 +198 +198 +198 +196 +197 +195 +195 +195 +190 +191 +189 +188 +188 +184 +184 +183 +183 +183 +178 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +158 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +125 +125 +125 +120 +120 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +65 +64 +58 +59 +54 +55 +55 +50 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +32 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +50 +51 +54 +54 +55 +58 +58 +64 +65 +65 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +120 +126 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +152 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +174 +175 +175 +179 +178 +183 +183 +183 +185 +185 +185 +184 +184 +189 +189 +190 +190 +190 +194 +194 +197 +196 +196 +199 +198 +200 +200 +201 +201 +200 +203 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +207 +206 +206 +206 +207 +207 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +203 +201 +200 +201 +200 +200 +200 +201 +199 +198 +198 +196 +197 +194 +194 +193 +191 +190 +188 +189 +184 +185 +184 +183 +182 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +168 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +125 +126 +120 +119 +120 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +73 +68 +68 +64 +64 +59 +58 +58 +54 +55 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +55 +58 +58 +59 +58 +59 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +119 +120 +125 +125 +130 +130 +130 +134 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +161 +161 +161 +161 +164 +165 +169 +169 +169 +174 +173 +175 +175 +175 +178 +179 +182 +182 +185 +185 +185 +188 +189 +190 +190 +190 +194 +195 +196 +197 +196 +198 +198 +200 +201 +200 +200 +201 +202 +202 +203 +204 +204 +205 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +205 +204 +202 +203 +200 +200 +200 +200 +200 +198 +199 +196 +197 +197 +195 +194 +191 +190 +191 +189 +188 +184 +184 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +158 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +120 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +50 +51 +50 +47 +47 +43 +43 +44 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +42 +43 +47 +47 +51 +51 +51 +55 +54 +58 +59 +59 +65 +64 +69 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +126 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +183 +183 +182 +184 +184 +188 +188 +188 +191 +190 +194 +194 +195 +196 +197 +198 +198 +200 +200 +200 +201 +200 +202 +202 +202 +204 +204 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +205 +205 +204 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +199 +199 +196 +196 +194 +195 +191 +190 +190 +189 +188 +185 +184 +185 +182 +182 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +126 +125 +125 +119 +120 +116 +115 +116 +109 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +55 +54 +52 +51 +51 +47 +46 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +30 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +24 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +51 +51 +55 +54 +55 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +116 +119 +119 +126 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +191 +191 +190 +195 +194 +196 +196 +197 +198 +199 +198 +199 +198 +201 +201 +201 +200 +201 +202 +202 +205 +205 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +207 +204 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +200 +198 +198 +196 +197 +196 +194 +194 +191 +190 +190 +189 +189 +184 +184 +184 +182 +183 +179 +178 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +126 +125 +126 +120 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +73 +73 +68 +68 +64 +64 +64 +58 +58 +54 +54 +54 +50 +51 +47 +47 +47 +43 +43 +40 +41 +39 +37 +36 +33 +32 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +18 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +55 +58 +58 +65 +64 +65 +68 +68 +72 +72 +72 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +105 +106 +110 +110 +116 +116 +115 +119 +119 +125 +126 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +152 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +182 +183 +183 +185 +185 +188 +188 +188 +191 +190 +191 +190 +191 +194 +194 +197 +197 +196 +198 +198 +200 +200 +201 +201 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +199 +198 +196 +197 +195 +195 +194 +190 +191 +189 +188 +189 +184 +185 +183 +182 +179 +179 +179 +175 +174 +173 +173 +172 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +126 +126 +119 +119 +116 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +51 +51 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +30 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +55 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +87 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +105 +106 +110 +109 +116 +116 +120 +119 +119 +126 +126 +129 +130 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +178 +179 +178 +183 +182 +184 +184 +184 +189 +189 +190 +190 +192 +194 +195 +196 +197 +198 +198 +198 +200 +200 +200 +200 +200 +202 +203 +205 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +199 +196 +196 +194 +194 +190 +190 +191 +188 +189 +184 +184 +185 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +129 +130 +125 +125 +126 +119 +120 +115 +115 +116 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +69 +66 +64 +64 +58 +58 +55 +54 +54 +50 +50 +47 +47 +47 +43 +43 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +16 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +56 +55 +55 +58 +59 +65 +65 +65 +68 +68 +72 +72 +73 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +107 +106 +106 +110 +110 +116 +116 +115 +120 +120 +125 +125 +126 +130 +129 +134 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +169 +169 +169 +172 +173 +175 +175 +175 +179 +179 +183 +182 +184 +184 +185 +189 +189 +190 +191 +191 +194 +195 +197 +197 +197 +198 +198 +200 +200 +200 +201 +200 +202 +203 +203 +204 +205 +205 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +202 +200 +201 +200 +200 +199 +198 +198 +197 +197 +195 +194 +195 +190 +191 +189 +188 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +130 +125 +125 +119 +119 +120 +115 +116 +109 +109 +110 +106 +106 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +58 +59 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +15 +16 +15 +17 +17 +19 +19 +19 +21 +22 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +42 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +58 +58 +64 +64 +64 +69 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +120 +126 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +158 +157 +161 +161 +161 +164 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +184 +184 +185 +188 +189 +191 +191 +190 +194 +195 +197 +196 +197 +198 +199 +200 +200 +200 +200 +201 +202 +203 +204 +205 +204 +204 +204 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +198 +198 +199 +196 +196 +195 +195 +194 +191 +191 +188 +189 +189 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +134 +129 +129 +126 +125 +126 +120 +119 +119 +119 +120 +115 +116 +109 +110 +109 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +51 +50 +50 +47 +47 +43 +43 +42 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +14 +12 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +59 +59 +65 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +111 +115 +116 +119 +119 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +184 +185 +188 +188 +189 +190 +191 +194 +194 +196 +196 +197 +198 +198 +199 +201 +200 +201 +200 +202 +202 +202 +205 +205 +204 +204 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +203 +200 +201 +201 +200 +200 +198 +198 +196 +196 +196 +194 +195 +190 +191 +188 +189 +188 +185 +185 +182 +183 +183 +179 +178 +175 +174 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +152 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +134 +130 +130 +125 +125 +126 +119 +119 +115 +115 +116 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +55 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +58 +58 +59 +64 +65 +68 +69 +68 +72 +72 +72 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +120 +119 +120 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +184 +185 +185 +188 +188 +190 +190 +190 +194 +195 +197 +196 +197 +199 +199 +201 +200 +200 +200 +200 +202 +203 +204 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +199 +198 +198 +197 +197 +194 +195 +194 +190 +191 +188 +188 +188 +185 +185 +183 +182 +182 +179 +179 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +150 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +130 +129 +125 +125 +119 +120 +115 +116 +115 +109 +110 +106 +106 +106 +100 +100 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +69 +68 +64 +65 +58 +58 +58 +54 +54 +50 +51 +51 +46 +46 +42 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +30 +27 +27 +27 +25 +25 +21 +21 +21 +20 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +55 +55 +59 +58 +59 +59 +59 +64 +64 +68 +69 +68 +72 +72 +76 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +105 +110 +110 +116 +116 +116 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +174 +175 +179 +178 +182 +183 +182 +185 +184 +189 +189 +189 +190 +190 +194 +194 +195 +196 +197 +198 +198 +198 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +203 +202 +202 +200 +201 +200 +200 +200 +198 +199 +196 +197 +197 +195 +194 +190 +190 +190 +188 +189 +185 +185 +185 +183 +183 +178 +179 +175 +174 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +144 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +119 +120 +115 +116 +116 +116 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +87 +83 +82 +82 +76 +77 +72 +72 +73 +68 +68 +64 +65 +65 +58 +59 +54 +55 +55 +51 +51 +47 +47 +45 +43 +43 +41 +41 +37 +37 +37 +33 +32 +33 +33 +33 +31 +31 +26 +27 +28 +25 +25 +21 +21 +22 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +47 +50 +51 +54 +54 +55 +59 +58 +64 +64 +66 +68 +68 +72 +72 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +99 +100 +106 +106 +110 +110 +115 +116 +115 +120 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +182 +185 +185 +185 +189 +189 +191 +191 +190 +195 +195 +197 +196 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +207 +207 +207 +205 +205 +204 +205 +205 +202 +202 +203 +203 +202 +200 +200 +200 +200 +201 +199 +199 +196 +196 +197 +195 +195 +191 +190 +188 +188 +189 +184 +185 +183 +183 +183 +179 +179 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +130 +129 +131 +125 +125 +119 +119 +115 +115 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +65 +64 +64 +58 +58 +54 +55 +55 +51 +50 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +50 +55 +55 +55 +59 +59 +65 +64 +64 +69 +68 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +88 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +116 +116 +119 +120 +125 +126 +126 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +189 +189 +190 +190 +195 +195 +195 +197 +197 +199 +198 +198 +200 +201 +200 +200 +200 +202 +203 +205 +205 +205 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +194 +190 +191 +191 +189 +188 +185 +185 +184 +183 +182 +178 +178 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +140 +134 +133 +134 +130 +130 +126 +125 +126 +120 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +20 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +32 +32 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +51 +50 +51 +51 +55 +55 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +85 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +124 +125 +125 +130 +129 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +178 +183 +182 +185 +185 +185 +188 +189 +190 +191 +191 +194 +195 +196 +197 +197 +198 +198 +200 +201 +201 +200 +200 +202 +202 +204 +204 +204 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +207 +206 +204 +204 +204 +204 +205 +203 +202 +202 +200 +200 +200 +201 +200 +200 +200 +198 +198 +199 +196 +196 +194 +194 +193 +190 +190 +188 +189 +184 +184 +184 +183 +183 +179 +179 +179 +175 +175 +175 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +144 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +126 +126 +120 +120 +115 +115 +111 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +59 +59 +58 +55 +55 +51 +51 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +12 +15 +15 +17 +17 +17 +20 +19 +21 +21 +21 +25 +26 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +54 +55 +58 +59 +64 +65 +65 +69 +68 +72 +72 +72 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +109 +110 +115 +115 +115 +119 +119 +125 +126 +126 +129 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +156 +157 +161 +161 +165 +165 +165 +169 +168 +173 +172 +173 +175 +175 +179 +179 +183 +182 +183 +184 +185 +189 +188 +188 +191 +191 +195 +194 +195 +196 +196 +199 +198 +198 +200 +201 +200 +201 +201 +202 +203 +204 +204 +205 +204 +205 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +205 +206 +204 +204 +205 +204 +205 +203 +203 +200 +201 +200 +200 +200 +198 +198 +199 +197 +196 +197 +197 +196 +195 +194 +190 +191 +191 +188 +188 +184 +185 +183 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +143 +140 +140 +139 +133 +133 +130 +130 +129 +126 +125 +120 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +65 +59 +58 +58 +55 +54 +50 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +55 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +120 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +183 +182 +183 +185 +184 +188 +188 +189 +190 +191 +194 +194 +195 +197 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +203 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +194 +195 +190 +190 +188 +188 +189 +184 +185 +183 +183 +182 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +115 +116 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +59 +58 +58 +54 +55 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +51 +51 +55 +54 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +115 +115 +119 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +174 +179 +179 +182 +182 +183 +184 +185 +189 +189 +190 +190 +190 +194 +195 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +203 +203 +202 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +201 +200 +201 +198 +199 +197 +197 +196 +194 +194 +190 +190 +190 +188 +189 +184 +184 +184 +182 +182 +178 +179 +179 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +119 +119 +119 +115 +116 +109 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +89 +86 +86 +82 +82 +83 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +59 +59 +54 +55 +51 +51 +51 +47 +47 +42 +43 +43 +43 +42 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +18 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +58 +58 +59 +64 +64 +68 +69 +68 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +120 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +174 +179 +178 +179 +182 +183 +184 +184 +184 +189 +188 +189 +188 +188 +190 +191 +194 +194 +195 +196 +196 +198 +198 +199 +201 +201 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +195 +195 +190 +191 +188 +188 +184 +184 +184 +183 +183 +179 +179 +179 +174 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +119 +119 +116 +116 +116 +110 +109 +105 +105 +106 +100 +100 +96 +96 +90 +90 +90 +87 +86 +82 +82 +82 +76 +77 +72 +72 +72 +69 +68 +64 +65 +65 +59 +59 +54 +54 +55 +50 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +51 +50 +54 +54 +59 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +116 +115 +115 +120 +120 +125 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +160 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +174 +175 +178 +179 +183 +183 +183 +184 +185 +189 +188 +189 +190 +191 +194 +194 +196 +197 +196 +198 +198 +200 +200 +200 +200 +201 +200 +200 +200 +202 +202 +204 +204 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +200 +201 +201 +200 +201 +198 +199 +196 +197 +196 +194 +195 +190 +190 +190 +188 +188 +184 +185 +185 +182 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +126 +126 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +75 +69 +68 +64 +65 +58 +58 +58 +55 +55 +51 +51 +51 +47 +47 +47 +48 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +31 +31 +31 +32 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +115 +116 +120 +120 +119 +126 +126 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +183 +182 +184 +185 +188 +188 +188 +191 +190 +191 +190 +190 +195 +194 +196 +196 +197 +198 +199 +200 +200 +200 +201 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +201 +200 +200 +200 +198 +199 +198 +196 +196 +195 +194 +195 +190 +190 +188 +188 +188 +185 +184 +183 +183 +179 +179 +179 +175 +175 +172 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +58 +58 +58 +54 +51 +51 +50 +51 +47 +47 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +14 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +55 +54 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +95 +99 +100 +106 +106 +106 +110 +110 +115 +115 +120 +119 +120 +126 +125 +125 +125 +126 +129 +129 +129 +129 +129 +134 +133 +140 +139 +139 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +184 +185 +185 +188 +189 +191 +190 +191 +194 +194 +196 +196 +196 +198 +198 +201 +200 +201 +200 +201 +202 +202 +203 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +203 +201 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +195 +190 +191 +189 +188 +188 +184 +185 +183 +182 +183 +178 +179 +175 +174 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +65 +59 +59 +54 +54 +54 +50 +50 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +36 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +40 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +55 +59 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +99 +106 +106 +106 +106 +106 +110 +109 +115 +115 +115 +119 +119 +125 +125 +128 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +171 +173 +173 +175 +174 +179 +179 +178 +183 +183 +184 +184 +185 +188 +189 +191 +190 +190 +194 +195 +196 +196 +196 +199 +199 +200 +200 +200 +200 +200 +202 +203 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +198 +198 +196 +196 +194 +195 +195 +191 +190 +188 +188 +188 +185 +185 +183 +182 +179 +178 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +133 +130 +129 +126 +125 +125 +119 +120 +120 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +99 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +54 +55 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +50 +51 +50 +54 +54 +59 +59 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +91 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +116 +119 +120 +120 +125 +125 +129 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +178 +182 +183 +184 +184 +185 +188 +188 +190 +191 +195 +195 +194 +196 +196 +199 +198 +198 +200 +201 +200 +200 +200 +202 +203 +204 +204 +204 +204 +205 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +201 +198 +198 +199 +197 +197 +194 +194 +191 +190 +190 +188 +189 +185 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +139 +140 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +118 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +59 +59 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +55 +55 +54 +58 +59 +64 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +116 +116 +115 +115 +116 +119 +120 +125 +126 +126 +129 +129 +133 +133 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +182 +182 +185 +184 +188 +188 +188 +190 +190 +194 +194 +194 +197 +196 +199 +198 +199 +200 +200 +200 +200 +200 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +194 +194 +190 +191 +190 +189 +188 +184 +185 +184 +183 +183 +179 +178 +179 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +137 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +50 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +40 +43 +43 +47 +47 +47 +51 +51 +54 +55 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +81 +82 +86 +86 +86 +91 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +125 +125 +125 +130 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +178 +179 +183 +182 +185 +185 +184 +188 +188 +191 +190 +190 +195 +194 +197 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +204 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +205 +204 +205 +203 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +195 +194 +194 +190 +191 +188 +188 +189 +185 +185 +183 +183 +179 +178 +178 +175 +175 +172 +173 +173 +169 +169 +169 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +129 +125 +125 +125 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +107 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +52 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +16 +15 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +42 +46 +47 +50 +51 +52 +55 +55 +59 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +178 +179 +183 +183 +183 +184 +184 +188 +189 +191 +190 +190 +194 +194 +196 +196 +196 +198 +199 +201 +201 +200 +200 +201 +203 +203 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +201 +198 +199 +197 +196 +195 +194 +195 +190 +190 +189 +188 +188 +185 +184 +185 +185 +182 +183 +179 +179 +178 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +129 +126 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +65 +59 +58 +55 +55 +55 +51 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +15 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +39 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +55 +54 +59 +58 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +185 +184 +189 +188 +191 +190 +190 +194 +194 +196 +196 +196 +198 +199 +200 +201 +201 +200 +201 +202 +202 +205 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +200 +200 +201 +199 +198 +199 +196 +197 +195 +195 +194 +191 +191 +189 +188 +188 +184 +184 +183 +182 +181 +178 +179 +175 +175 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +133 +133 +129 +130 +129 +125 +125 +120 +120 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +90 +89 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +58 +54 +55 +54 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +58 +58 +62 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +89 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +119 +120 +125 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +156 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +174 +175 +178 +178 +179 +182 +182 +184 +184 +184 +188 +189 +190 +191 +191 +195 +195 +197 +196 +199 +199 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +197 +195 +195 +190 +190 +189 +189 +189 +184 +184 +182 +183 +183 +179 +178 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +164 +164 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +125 +119 +119 +116 +115 +110 +109 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +65 +65 +58 +59 +58 +55 +55 +51 +50 +50 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +46 +49 +50 +50 +55 +54 +59 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +109 +110 +110 +115 +116 +120 +119 +119 +126 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +183 +183 +184 +184 +188 +188 +189 +189 +188 +190 +190 +194 +194 +194 +197 +197 +199 +198 +198 +200 +201 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +194 +194 +190 +191 +190 +191 +190 +188 +188 +185 +184 +185 +182 +183 +178 +178 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +120 +120 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +73 +72 +68 +68 +68 +64 +64 +57 +58 +58 +55 +54 +51 +50 +51 +46 +47 +42 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +18 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +55 +55 +59 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +176 +174 +175 +179 +178 +182 +183 +183 +184 +184 +188 +188 +188 +190 +190 +195 +195 +195 +196 +196 +198 +198 +198 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +199 +198 +198 +198 +198 +196 +196 +194 +194 +195 +190 +191 +188 +189 +185 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +140 +139 +133 +133 +133 +129 +129 +126 +125 +125 +120 +119 +115 +116 +117 +109 +110 +105 +106 +105 +100 +100 +96 +95 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +55 +51 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +15 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +116 +116 +116 +119 +120 +125 +126 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +160 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +182 +185 +185 +185 +188 +189 +190 +190 +191 +195 +194 +196 +196 +199 +198 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +207 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +203 +202 +203 +203 +202 +201 +200 +201 +201 +201 +198 +198 +196 +196 +197 +194 +194 +190 +190 +189 +189 +189 +185 +185 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +130 +130 +129 +125 +126 +120 +119 +120 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +76 +72 +72 +69 +68 +69 +65 +64 +58 +59 +55 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +46 +51 +50 +55 +54 +54 +58 +59 +65 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +119 +125 +125 +125 +130 +129 +134 +134 +133 +139 +139 +143 +143 +144 +147 +147 +152 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +183 +183 +184 +185 +185 +189 +188 +190 +190 +194 +195 +194 +197 +197 +198 +198 +198 +200 +200 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +201 +200 +200 +200 +200 +198 +199 +196 +197 +196 +194 +195 +191 +191 +191 +189 +188 +185 +184 +185 +183 +183 +179 +178 +179 +175 +174 +172 +173 +168 +169 +168 +165 +164 +161 +161 +162 +157 +157 +157 +157 +158 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +125 +125 +126 +120 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +55 +54 +54 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +51 +50 +54 +55 +58 +58 +58 +65 +64 +68 +68 +69 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +116 +119 +120 +120 +125 +125 +130 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +156 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +184 +185 +188 +188 +191 +190 +190 +194 +194 +197 +197 +196 +198 +198 +200 +201 +200 +200 +201 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +204 +204 +204 +205 +205 +202 +203 +202 +200 +200 +201 +200 +200 +198 +199 +196 +197 +195 +194 +190 +190 +191 +188 +189 +185 +185 +182 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +55 +50 +51 +46 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +26 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +87 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +120 +120 +120 +125 +126 +129 +129 +130 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +183 +183 +184 +184 +188 +189 +189 +191 +190 +194 +195 +195 +196 +196 +198 +198 +200 +200 +200 +201 +201 +202 +202 +202 +204 +205 +205 +204 +204 +205 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +201 +199 +198 +199 +196 +197 +194 +194 +191 +191 +191 +188 +189 +184 +185 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +130 +130 +126 +126 +125 +120 +119 +116 +116 +115 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +65 +65 +59 +58 +55 +54 +50 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +26 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +30 +31 +33 +33 +32 +37 +37 +41 +41 +41 +43 +42 +47 +47 +47 +51 +51 +54 +54 +58 +58 +58 +65 +64 +69 +68 +69 +73 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +109 +109 +116 +115 +119 +120 +119 +125 +125 +129 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +178 +179 +179 +182 +182 +184 +185 +186 +189 +189 +190 +190 +194 +194 +194 +197 +197 +198 +198 +198 +200 +200 +200 +201 +200 +200 +200 +203 +202 +203 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +205 +204 +204 +204 +204 +202 +202 +203 +201 +201 +200 +200 +198 +198 +199 +196 +196 +194 +194 +195 +190 +190 +188 +188 +188 +184 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +168 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +65 +64 +59 +58 +54 +54 +55 +51 +51 +51 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +38 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +119 +125 +125 +129 +130 +130 +133 +133 +138 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +178 +178 +179 +183 +183 +184 +184 +185 +188 +188 +189 +189 +188 +190 +191 +195 +194 +195 +196 +197 +198 +198 +199 +201 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +201 +201 +198 +199 +196 +196 +196 +195 +195 +190 +190 +190 +189 +189 +185 +184 +183 +182 +183 +178 +178 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +158 +157 +151 +151 +151 +147 +147 +143 +143 +140 +140 +139 +133 +134 +129 +129 +130 +126 +126 +120 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +55 +54 +52 +50 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +32 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +115 +119 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +179 +178 +178 +183 +182 +184 +185 +184 +189 +189 +191 +190 +191 +195 +195 +196 +197 +199 +199 +198 +200 +200 +200 +201 +201 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +204 +204 +203 +203 +202 +200 +200 +200 +200 +200 +199 +199 +196 +196 +195 +195 +194 +190 +191 +189 +189 +188 +185 +185 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +140 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +116 +109 +110 +110 +106 +106 +99 +100 +100 +96 +96 +96 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +65 +64 +59 +58 +55 +55 +55 +50 +50 +50 +50 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +16 +15 +16 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +54 +58 +58 +64 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +105 +106 +110 +109 +110 +110 +110 +116 +115 +119 +120 +119 +126 +125 +129 +129 +131 +134 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +174 +175 +175 +178 +179 +183 +182 +183 +185 +184 +189 +189 +189 +190 +190 +195 +195 +194 +197 +197 +198 +198 +199 +201 +200 +201 +201 +202 +202 +203 +204 +204 +204 +204 +204 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +205 +204 +204 +205 +203 +202 +202 +200 +200 +200 +200 +200 +199 +198 +196 +196 +196 +195 +194 +191 +190 +191 +188 +188 +184 +185 +184 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +120 +120 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +73 +72 +69 +68 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +51 +47 +47 +46 +43 +42 +41 +41 +41 +37 +37 +33 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +54 +58 +58 +64 +64 +65 +68 +69 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +112 +115 +116 +120 +119 +125 +125 +125 +129 +129 +133 +134 +134 +139 +139 +139 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +174 +175 +178 +179 +183 +183 +182 +185 +184 +188 +188 +189 +190 +191 +195 +195 +196 +197 +196 +198 +199 +200 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +204 +203 +202 +202 +200 +200 +201 +200 +200 +199 +198 +197 +197 +196 +195 +194 +190 +190 +188 +189 +189 +185 +185 +183 +182 +183 +179 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +146 +147 +144 +143 +139 +140 +139 +133 +133 +130 +129 +130 +126 +125 +120 +120 +119 +115 +115 +109 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +65 +64 +59 +59 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +34 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +51 +54 +54 +58 +58 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +110 +109 +116 +115 +119 +120 +120 +125 +125 +125 +125 +126 +129 +129 +133 +133 +133 +140 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +184 +188 +188 +189 +190 +190 +194 +194 +195 +197 +196 +199 +199 +199 +200 +200 +200 +200 +200 +202 +203 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +201 +201 +200 +200 +198 +198 +197 +196 +196 +195 +195 +190 +191 +190 +189 +189 +185 +184 +184 +182 +183 +179 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +127 +125 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +55 +51 +51 +51 +46 +47 +42 +43 +43 +41 +41 +37 +36 +36 +34 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +50 +54 +55 +55 +54 +54 +59 +58 +64 +65 +64 +68 +68 +72 +72 +73 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +144 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +178 +183 +183 +184 +184 +184 +188 +188 +191 +190 +190 +195 +194 +196 +196 +197 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +200 +199 +198 +196 +196 +196 +195 +194 +190 +191 +191 +188 +188 +184 +184 +183 +182 +182 +178 +179 +175 +175 +174 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +150 +150 +147 +147 +144 +144 +139 +139 +139 +133 +133 +129 +130 +129 +126 +125 +125 +125 +124 +120 +119 +116 +115 +116 +110 +110 +106 +106 +102 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +55 +51 +50 +50 +46 +46 +43 +43 +43 +40 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +16 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +55 +54 +56 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +87 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +115 +115 +115 +119 +120 +125 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +172 +175 +174 +178 +179 +179 +182 +182 +185 +185 +184 +189 +188 +190 +190 +194 +194 +194 +197 +196 +199 +198 +198 +200 +200 +200 +200 +201 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +203 +202 +202 +200 +201 +200 +201 +201 +198 +199 +197 +196 +194 +194 +194 +190 +190 +189 +188 +188 +185 +184 +185 +185 +184 +183 +183 +178 +178 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +127 +125 +126 +120 +119 +116 +115 +116 +109 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +73 +72 +72 +68 +68 +65 +64 +64 +58 +58 +59 +59 +58 +55 +54 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +18 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +42 +41 +40 +43 +43 +47 +46 +47 +50 +51 +51 +51 +51 +54 +55 +58 +59 +58 +64 +64 +68 +69 +67 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +119 +125 +125 +125 +129 +129 +130 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +156 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +182 +184 +184 +188 +188 +188 +190 +191 +194 +195 +195 +197 +196 +198 +199 +201 +200 +201 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +200 +200 +198 +199 +198 +197 +196 +194 +194 +193 +190 +190 +188 +189 +185 +184 +185 +182 +183 +179 +178 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +119 +120 +120 +115 +115 +109 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +59 +55 +54 +54 +51 +50 +47 +46 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +16 +15 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +49 +50 +50 +55 +54 +58 +58 +58 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +99 +100 +106 +106 +110 +109 +110 +116 +115 +120 +120 +119 +125 +125 +129 +129 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +188 +189 +191 +190 +190 +194 +195 +196 +196 +196 +198 +198 +198 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +205 +205 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +200 +201 +200 +200 +198 +199 +199 +196 +196 +195 +194 +194 +190 +191 +190 +191 +190 +188 +188 +185 +184 +184 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +160 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +116 +116 +110 +110 +110 +106 +106 +100 +99 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +77 +76 +77 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +40 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +26 +25 +21 +21 +21 +18 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +16 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +32 +31 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +54 +59 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +95 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +115 +119 +119 +126 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +144 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +174 +175 +179 +178 +182 +183 +183 +185 +185 +189 +188 +189 +190 +191 +194 +195 +195 +196 +196 +198 +198 +199 +200 +200 +200 +201 +203 +202 +202 +205 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +200 +200 +200 +198 +198 +197 +197 +197 +195 +195 +191 +190 +189 +188 +189 +185 +184 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +115 +116 +110 +110 +109 +106 +106 +100 +100 +96 +96 +96 +91 +90 +85 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +51 +51 +48 +46 +47 +42 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +26 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +46 +50 +50 +54 +54 +54 +59 +58 +64 +64 +64 +68 +68 +69 +69 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +91 +90 +96 +96 +99 +100 +100 +106 +106 +109 +110 +110 +115 +116 +116 +116 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +160 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +178 +179 +183 +183 +185 +185 +185 +189 +188 +191 +191 +190 +195 +194 +196 +196 +197 +198 +198 +200 +200 +201 +200 +200 +203 +202 +203 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +207 +204 +204 +204 +205 +204 +202 +202 +201 +200 +200 +201 +200 +198 +198 +197 +196 +197 +194 +194 +190 +190 +191 +189 +188 +185 +185 +185 +183 +182 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +126 +119 +119 +120 +116 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +59 +58 +55 +55 +51 +50 +50 +47 +47 +43 +43 +44 +41 +41 +37 +37 +33 +33 +33 +30 +31 +27 +27 +27 +24 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +16 +15 +15 +16 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +55 +58 +59 +64 +65 +64 +68 +68 +72 +73 +77 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +116 +120 +120 +125 +125 +130 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +185 +185 +185 +189 +189 +190 +191 +190 +195 +194 +197 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +201 +201 +201 +199 +199 +196 +197 +197 +195 +194 +191 +191 +189 +189 +189 +185 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +134 +133 +129 +129 +126 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +83 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +54 +54 +50 +51 +51 +46 +46 +47 +47 +47 +43 +43 +42 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +51 +50 +51 +55 +54 +59 +58 +59 +64 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +116 +119 +119 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +146 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +184 +185 +189 +189 +190 +191 +191 +194 +195 +196 +196 +196 +198 +199 +198 +198 +198 +201 +200 +200 +201 +201 +202 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +203 +202 +200 +200 +200 +200 +201 +199 +198 +196 +196 +197 +194 +195 +191 +190 +190 +188 +189 +184 +184 +185 +183 +182 +178 +178 +178 +175 +175 +173 +173 +169 +169 +169 +165 +165 +160 +161 +161 +157 +157 +150 +151 +151 +147 +147 +144 +143 +143 +139 +139 +134 +133 +134 +129 +130 +126 +125 +120 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +83 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +59 +59 +59 +55 +54 +51 +51 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +20 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +50 +55 +54 +58 +58 +58 +65 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +105 +106 +106 +110 +110 +115 +116 +115 +120 +119 +126 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +152 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +184 +184 +189 +188 +189 +189 +188 +190 +191 +195 +194 +195 +196 +197 +198 +198 +198 +200 +201 +201 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +198 +198 +197 +197 +196 +195 +195 +190 +191 +190 +188 +188 +185 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +130 +130 +130 +125 +126 +120 +119 +119 +116 +116 +109 +110 +110 +106 +105 +100 +100 +101 +96 +96 +90 +90 +85 +86 +86 +83 +82 +76 +77 +76 +72 +72 +72 +72 +72 +68 +69 +65 +65 +64 +58 +58 +55 +54 +55 +51 +51 +46 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +59 +59 +65 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +116 +115 +115 +119 +120 +125 +125 +125 +129 +130 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +174 +175 +175 +179 +179 +183 +182 +183 +184 +185 +189 +189 +190 +191 +191 +194 +195 +196 +196 +196 +199 +198 +200 +201 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +203 +200 +200 +201 +201 +200 +198 +199 +196 +196 +195 +195 +194 +190 +190 +188 +189 +188 +185 +184 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +170 +165 +165 +161 +161 +158 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +126 +120 +119 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +73 +72 +68 +68 +64 +64 +64 +59 +58 +55 +55 +55 +50 +50 +51 +50 +50 +48 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +40 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +59 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +77 +82 +83 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +115 +120 +120 +125 +126 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +183 +182 +185 +185 +189 +189 +188 +190 +190 +194 +194 +194 +196 +196 +198 +199 +199 +201 +201 +201 +200 +202 +202 +203 +205 +204 +204 +205 +204 +206 +206 +207 +206 +207 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +204 +203 +202 +202 +200 +201 +201 +200 +200 +198 +198 +197 +196 +197 +194 +195 +190 +190 +190 +189 +189 +184 +185 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +150 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +120 +115 +116 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +81 +82 +82 +76 +76 +72 +72 +73 +69 +68 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +51 +51 +48 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +26 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +16 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +59 +59 +65 +65 +65 +68 +68 +72 +73 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +116 +116 +119 +119 +125 +125 +130 +130 +129 +133 +134 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +150 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +184 +188 +188 +190 +191 +191 +195 +194 +196 +196 +195 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +207 +206 +206 +205 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +195 +195 +191 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +178 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +129 +126 +126 +126 +120 +120 +116 +116 +113 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +64 +65 +58 +58 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +24 +21 +22 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +46 +47 +50 +50 +55 +55 +58 +58 +58 +64 +68 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +105 +110 +109 +110 +115 +116 +119 +120 +120 +125 +125 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +187 +188 +188 +190 +190 +194 +195 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +204 +202 +202 +200 +200 +201 +201 +200 +198 +198 +197 +197 +196 +195 +194 +190 +190 +191 +188 +188 +185 +185 +184 +183 +183 +178 +178 +179 +175 +175 +173 +173 +174 +169 +169 +165 +165 +161 +161 +161 +156 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +130 +125 +125 +119 +120 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +100 +99 +100 +96 +96 +90 +90 +90 +85 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +50 +51 +51 +47 +47 +42 +42 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +55 +55 +58 +59 +64 +64 +65 +68 +69 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +109 +110 +110 +116 +116 +119 +119 +120 +125 +125 +129 +129 +131 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +174 +175 +178 +179 +178 +183 +183 +185 +184 +185 +189 +189 +191 +190 +190 +194 +194 +196 +196 +196 +198 +198 +200 +200 +201 +201 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +205 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +201 +200 +200 +198 +198 +198 +196 +197 +194 +194 +195 +190 +190 +188 +189 +188 +184 +185 +183 +183 +183 +179 +179 +175 +175 +172 +172 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +160 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +119 +116 +116 +116 +116 +116 +109 +109 +105 +106 +106 +100 +99 +96 +96 +91 +90 +90 +86 +86 +82 +82 +81 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +54 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +46 +47 +46 +51 +50 +55 +54 +55 +58 +58 +64 +64 +66 +69 +68 +72 +72 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +115 +116 +116 +120 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +188 +188 +189 +191 +191 +194 +194 +196 +196 +197 +198 +199 +200 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +200 +200 +199 +198 +200 +196 +196 +194 +195 +190 +190 +190 +189 +189 +184 +185 +185 +183 +182 +183 +183 +183 +178 +178 +175 +174 +175 +173 +173 +169 +168 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +144 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +123 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +71 +68 +69 +64 +64 +59 +58 +58 +55 +55 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +42 +46 +46 +51 +51 +50 +54 +54 +59 +58 +58 +65 +65 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +126 +130 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +183 +183 +182 +185 +185 +184 +184 +185 +189 +188 +191 +190 +191 +194 +195 +197 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +202 +203 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +197 +197 +197 +194 +194 +191 +190 +190 +188 +188 +185 +184 +184 +183 +183 +179 +178 +174 +174 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +145 +143 +144 +139 +139 +133 +133 +133 +129 +130 +126 +125 +125 +120 +119 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +87 +86 +82 +82 +82 +76 +76 +72 +72 +73 +69 +68 +64 +65 +65 +58 +58 +55 +54 +54 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +36 +33 +33 +31 +31 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +12 +15 +16 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +43 +43 +43 +46 +47 +50 +50 +51 +55 +55 +58 +59 +64 +64 +64 +68 +69 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +115 +116 +116 +119 +119 +125 +125 +125 +129 +129 +134 +134 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +178 +183 +183 +185 +185 +184 +188 +188 +190 +191 +191 +194 +194 +196 +196 +199 +198 +198 +201 +200 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +207 +206 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +202 +202 +200 +201 +200 +201 +200 +199 +198 +197 +197 +198 +195 +194 +190 +191 +188 +189 +189 +185 +185 +182 +183 +183 +179 +179 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +126 +126 +119 +119 +116 +115 +111 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +58 +58 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +32 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +42 +47 +46 +51 +51 +55 +54 +55 +58 +58 +64 +64 +64 +68 +69 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +91 +95 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +115 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +133 +139 +140 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +189 +188 +188 +190 +190 +195 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +203 +203 +204 +205 +205 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +204 +205 +204 +205 +204 +202 +202 +200 +200 +200 +200 +200 +199 +198 +196 +197 +196 +194 +194 +191 +191 +191 +189 +188 +189 +188 +188 +184 +184 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +127 +126 +125 +119 +120 +115 +115 +115 +109 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +12 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +42 +46 +47 +47 +51 +50 +55 +55 +55 +59 +58 +64 +64 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +105 +110 +110 +115 +115 +116 +120 +119 +125 +125 +126 +129 +129 +133 +133 +136 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +183 +182 +183 +184 +185 +188 +189 +188 +190 +191 +195 +195 +194 +196 +196 +198 +198 +199 +200 +201 +200 +200 +201 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +198 +198 +197 +196 +197 +196 +196 +195 +194 +190 +190 +190 +189 +189 +184 +184 +183 +182 +183 +179 +179 +174 +175 +175 +172 +173 +168 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +119 +119 +119 +116 +116 +110 +110 +110 +106 +105 +100 +100 +100 +96 +95 +90 +90 +87 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +59 +55 +54 +51 +51 +51 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +55 +59 +58 +65 +64 +68 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +101 +100 +106 +106 +106 +109 +110 +116 +116 +120 +120 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +188 +188 +188 +190 +191 +195 +194 +194 +196 +196 +198 +198 +201 +201 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +204 +204 +206 +207 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +196 +195 +194 +195 +190 +191 +190 +191 +190 +189 +189 +185 +185 +184 +182 +182 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +119 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +59 +59 +55 +54 +55 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +36 +36 +41 +40 +42 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +110 +109 +115 +116 +120 +120 +120 +126 +126 +130 +129 +129 +134 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +184 +184 +185 +189 +188 +190 +191 +190 +194 +194 +194 +195 +194 +196 +196 +198 +198 +199 +200 +200 +200 +200 +201 +202 +203 +204 +205 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +196 +196 +194 +194 +194 +191 +191 +188 +188 +189 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +126 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +83 +82 +82 +76 +76 +76 +76 +77 +72 +73 +68 +68 +69 +64 +64 +58 +59 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +40 +40 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +55 +55 +58 +58 +58 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +126 +125 +126 +129 +129 +133 +134 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +182 +182 +182 +182 +183 +185 +185 +189 +188 +188 +190 +191 +194 +195 +195 +196 +197 +198 +199 +200 +200 +201 +200 +201 +202 +203 +202 +205 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +201 +200 +199 +198 +199 +197 +197 +194 +194 +191 +191 +191 +189 +188 +184 +185 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +140 +134 +133 +133 +129 +130 +126 +126 +125 +119 +119 +115 +115 +116 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +81 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +55 +54 +54 +51 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +12 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +51 +51 +51 +55 +55 +59 +58 +58 +64 +64 +64 +64 +65 +69 +69 +72 +72 +72 +76 +76 +82 +83 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +126 +125 +125 +129 +130 +134 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +176 +178 +179 +182 +183 +184 +184 +184 +188 +189 +190 +191 +190 +194 +194 +194 +195 +194 +196 +196 +198 +199 +199 +200 +201 +200 +200 +201 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +205 +204 +204 +203 +202 +202 +200 +200 +200 +200 +200 +199 +198 +199 +199 +199 +196 +196 +195 +195 +195 +190 +191 +188 +188 +188 +185 +184 +182 +183 +179 +178 +179 +175 +174 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +134 +133 +129 +129 +129 +125 +125 +120 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +73 +72 +72 +68 +68 +65 +65 +65 +59 +58 +54 +54 +53 +51 +51 +47 +47 +42 +43 +43 +41 +41 +38 +37 +37 +33 +33 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +20 +19 +19 +21 +22 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +55 +59 +59 +65 +64 +69 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +115 +119 +119 +120 +126 +125 +129 +129 +129 +134 +133 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +172 +172 +175 +175 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +188 +188 +190 +190 +191 +194 +194 +196 +196 +197 +198 +198 +201 +200 +200 +200 +201 +203 +202 +202 +204 +205 +204 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +201 +200 +198 +198 +196 +196 +195 +194 +194 +190 +191 +188 +188 +188 +184 +185 +183 +183 +182 +178 +179 +175 +174 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +130 +130 +129 +129 +125 +126 +119 +119 +120 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +74 +69 +68 +65 +65 +58 +59 +59 +54 +55 +50 +51 +51 +47 +46 +47 +47 +47 +43 +43 +41 +40 +41 +36 +37 +33 +33 +34 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +51 +51 +50 +55 +54 +59 +59 +58 +65 +64 +64 +64 +65 +69 +68 +72 +72 +72 +76 +76 +82 +82 +83 +85 +86 +90 +90 +95 +96 +95 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +115 +116 +119 +119 +119 +125 +125 +129 +130 +130 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +182 +182 +184 +185 +188 +189 +188 +190 +190 +195 +194 +194 +196 +197 +199 +198 +198 +200 +201 +200 +200 +202 +202 +203 +204 +204 +204 +205 +204 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +201 +199 +199 +198 +196 +196 +194 +194 +194 +190 +191 +189 +189 +189 +185 +185 +183 +183 +179 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +120 +120 +115 +116 +115 +110 +110 +107 +106 +106 +100 +100 +97 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +69 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +50 +51 +51 +47 +46 +43 +42 +40 +41 +41 +36 +37 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +46 +51 +51 +55 +55 +55 +59 +58 +64 +65 +65 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +112 +116 +116 +120 +119 +126 +125 +126 +129 +130 +133 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +185 +189 +189 +190 +190 +194 +194 +195 +196 +197 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +201 +200 +200 +200 +198 +198 +198 +196 +196 +194 +194 +191 +190 +191 +188 +189 +184 +185 +184 +182 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +140 +139 +134 +133 +129 +129 +129 +125 +125 +119 +119 +117 +116 +116 +110 +110 +105 +106 +106 +101 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +69 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +50 +54 +55 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +109 +110 +116 +115 +116 +115 +116 +119 +119 +125 +125 +125 +128 +129 +133 +133 +136 +139 +139 +143 +143 +146 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +183 +183 +185 +185 +189 +188 +188 +191 +190 +195 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +200 +201 +200 +200 +198 +198 +196 +197 +197 +195 +195 +191 +190 +191 +189 +189 +185 +185 +184 +183 +183 +178 +179 +178 +175 +175 +172 +173 +169 +169 +169 +165 +165 +160 +161 +161 +157 +157 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +137 +133 +133 +130 +130 +125 +125 +125 +119 +119 +116 +115 +115 +109 +110 +109 +110 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +59 +59 +54 +55 +51 +51 +51 +47 +46 +43 +43 +41 +41 +42 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +47 +51 +50 +50 +51 +51 +54 +58 +59 +59 +64 +65 +68 +68 +69 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +119 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +160 +164 +165 +168 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +183 +184 +185 +188 +189 +189 +191 +191 +194 +194 +195 +196 +197 +199 +198 +200 +201 +200 +201 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +195 +194 +190 +190 +191 +189 +188 +184 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +160 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +116 +109 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +77 +72 +72 +73 +68 +68 +64 +65 +65 +59 +58 +55 +54 +51 +50 +50 +46 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +42 +47 +47 +51 +51 +51 +54 +54 +58 +59 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +109 +116 +115 +119 +119 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +144 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +174 +175 +179 +179 +183 +183 +183 +184 +185 +189 +189 +188 +191 +191 +194 +194 +196 +197 +196 +198 +198 +200 +200 +200 +200 +200 +203 +202 +202 +204 +205 +204 +204 +204 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +203 +202 +202 +201 +200 +200 +200 +200 +199 +199 +197 +197 +197 +194 +195 +191 +191 +189 +188 +189 +184 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +148 +143 +143 +140 +139 +139 +133 +133 +133 +133 +134 +129 +130 +125 +125 +125 +119 +119 +116 +116 +113 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +58 +58 +59 +54 +55 +51 +51 +51 +47 +47 +47 +46 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +46 +47 +51 +50 +54 +54 +55 +58 +59 +65 +64 +65 +68 +68 +68 +69 +68 +73 +72 +75 +76 +76 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +129 +130 +134 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +182 +184 +184 +184 +189 +189 +190 +191 +190 +195 +195 +197 +197 +196 +198 +198 +200 +200 +201 +201 +200 +202 +202 +203 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +207 +204 +204 +204 +204 +204 +202 +202 +203 +200 +201 +200 +201 +198 +199 +199 +196 +196 +195 +194 +194 +191 +191 +188 +188 +188 +184 +184 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +168 +166 +165 +165 +161 +161 +157 +157 +157 +151 +152 +151 +152 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +131 +129 +129 +125 +125 +119 +120 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +80 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +50 +51 +55 +55 +55 +59 +58 +64 +64 +66 +69 +68 +73 +72 +76 +77 +76 +82 +81 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +119 +120 +119 +125 +126 +129 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +188 +189 +189 +191 +190 +195 +195 +194 +196 +197 +198 +199 +201 +200 +201 +201 +200 +202 +203 +202 +205 +204 +205 +205 +205 +207 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +206 +205 +204 +204 +204 +205 +202 +202 +202 +201 +201 +200 +200 +200 +200 +200 +199 +198 +199 +197 +197 +195 +194 +192 +191 +191 +188 +189 +184 +184 +184 +183 +183 +178 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +160 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +120 +120 +116 +116 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +69 +64 +64 +59 +58 +55 +54 +54 +51 +50 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +26 +27 +25 +24 +21 +21 +19 +19 +19 +17 +17 +15 +16 +15 +15 +15 +15 +15 +15 +14 +13 +12 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +46 +48 +50 +51 +54 +54 +59 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +158 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +188 +189 +191 +191 +191 +194 +195 +196 +197 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +205 +205 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +201 +201 +198 +198 +196 +196 +196 +195 +195 +190 +191 +191 +189 +189 +188 +189 +189 +184 +185 +183 +182 +182 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +116 +109 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +83 +76 +76 +73 +73 +72 +68 +69 +64 +64 +64 +59 +58 +58 +58 +58 +55 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +14 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +51 +54 +55 +54 +58 +59 +64 +64 +65 +68 +69 +72 +72 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +116 +116 +120 +119 +125 +125 +125 +130 +129 +134 +134 +134 +140 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +185 +185 +188 +188 +191 +191 +190 +194 +195 +196 +197 +196 +199 +198 +201 +201 +201 +200 +200 +203 +202 +205 +204 +204 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +203 +202 +200 +200 +200 +200 +200 +200 +200 +199 +199 +199 +196 +197 +195 +194 +191 +191 +190 +188 +188 +185 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +160 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +55 +55 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +51 +53 +54 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +73 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +120 +120 +126 +126 +126 +130 +129 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +185 +188 +189 +191 +191 +194 +194 +194 +196 +196 +199 +198 +198 +201 +201 +201 +200 +200 +200 +200 +203 +202 +202 +204 +205 +204 +204 +205 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +203 +203 +200 +201 +200 +201 +201 +198 +199 +196 +196 +196 +194 +195 +191 +191 +191 +188 +189 +185 +184 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +152 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +130 +130 +125 +126 +120 +120 +120 +116 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +69 +68 +68 +65 +64 +58 +58 +58 +54 +55 +51 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +20 +19 +19 +19 +17 +18 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +58 +58 +59 +64 +65 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +99 +106 +106 +110 +109 +109 +116 +116 +120 +119 +119 +126 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +152 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +182 +184 +184 +184 +185 +184 +188 +189 +190 +191 +190 +195 +195 +197 +197 +198 +199 +198 +201 +200 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +205 +204 +205 +206 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +196 +197 +194 +195 +191 +190 +188 +188 +188 +185 +184 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +170 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +120 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +59 +54 +55 +51 +51 +48 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +15 +15 +17 +18 +17 +19 +19 +22 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +54 +54 +58 +58 +65 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +115 +115 +119 +119 +125 +126 +125 +129 +129 +129 +130 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +173 +173 +173 +174 +174 +178 +179 +179 +183 +183 +184 +184 +186 +189 +189 +190 +191 +194 +194 +195 +196 +196 +197 +197 +196 +198 +199 +198 +199 +198 +200 +200 +200 +200 +201 +203 +203 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +207 +206 +206 +207 +206 +206 +207 +207 +207 +205 +205 +204 +205 +205 +202 +202 +201 +201 +201 +201 +200 +199 +199 +196 +197 +197 +194 +195 +191 +191 +190 +189 +188 +184 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +120 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +58 +54 +54 +55 +55 +54 +50 +50 +46 +46 +46 +42 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +87 +86 +86 +90 +89 +96 +95 +96 +100 +100 +105 +106 +106 +109 +109 +116 +116 +116 +120 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +178 +179 +182 +183 +183 +183 +183 +185 +185 +184 +185 +184 +189 +188 +191 +190 +191 +195 +195 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +200 +199 +199 +198 +196 +196 +194 +194 +195 +191 +190 +189 +188 +185 +185 +185 +183 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +125 +125 +119 +120 +115 +115 +116 +110 +109 +106 +106 +103 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +55 +51 +50 +47 +46 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +24 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +58 +65 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +109 +116 +115 +115 +120 +119 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +189 +188 +191 +191 +191 +195 +195 +196 +196 +196 +199 +198 +200 +201 +200 +201 +200 +202 +202 +202 +204 +204 +204 +205 +205 +207 +207 +206 +206 +207 +207 +206 +207 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +202 +202 +200 +201 +201 +201 +200 +198 +199 +196 +196 +195 +194 +195 +191 +190 +188 +188 +189 +185 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +152 +147 +147 +147 +143 +143 +140 +140 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +120 +116 +116 +110 +110 +107 +106 +105 +100 +100 +96 +96 +95 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +58 +58 +58 +54 +55 +50 +51 +51 +47 +47 +47 +47 +47 +43 +43 +40 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +22 +19 +20 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +51 +51 +54 +54 +59 +59 +59 +64 +65 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +99 +100 +100 +105 +105 +110 +110 +110 +115 +116 +116 +116 +115 +120 +120 +125 +125 +126 +129 +130 +133 +134 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +176 +178 +179 +183 +183 +185 +185 +185 +188 +189 +190 +190 +191 +195 +194 +196 +197 +196 +199 +198 +200 +201 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +199 +197 +196 +196 +196 +197 +195 +194 +191 +190 +190 +189 +188 +185 +184 +184 +182 +183 +178 +178 +175 +175 +175 +173 +172 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +120 +119 +115 +116 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +68 +68 +68 +65 +64 +59 +59 +59 +54 +54 +51 +51 +49 +47 +46 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +37 +36 +41 +41 +40 +43 +43 +47 +47 +47 +51 +50 +55 +55 +54 +59 +58 +64 +65 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +112 +116 +116 +119 +120 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +182 +184 +185 +189 +189 +189 +191 +191 +194 +195 +196 +196 +196 +198 +198 +200 +200 +200 +201 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +204 +204 +205 +204 +204 +203 +203 +200 +200 +200 +200 +200 +198 +199 +198 +196 +196 +194 +194 +191 +191 +190 +188 +188 +185 +185 +184 +182 +183 +178 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +150 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +126 +125 +119 +120 +116 +115 +113 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +65 +64 +64 +58 +58 +55 +55 +54 +51 +51 +47 +47 +46 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +26 +25 +27 +26 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +55 +59 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +109 +115 +116 +120 +120 +120 +125 +125 +125 +125 +125 +130 +130 +133 +133 +134 +139 +139 +143 +143 +146 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +184 +188 +188 +188 +190 +190 +195 +195 +195 +197 +197 +198 +199 +198 +201 +200 +200 +200 +200 +202 +202 +204 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +201 +201 +200 +200 +200 +198 +198 +197 +196 +196 +194 +195 +190 +191 +191 +188 +189 +189 +188 +189 +185 +185 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +134 +131 +129 +129 +126 +125 +119 +120 +120 +116 +116 +109 +110 +110 +106 +105 +106 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +54 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +28 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +54 +55 +59 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +78 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +116 +119 +119 +125 +126 +127 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +182 +183 +184 +185 +189 +188 +188 +190 +190 +195 +194 +195 +197 +196 +198 +199 +199 +201 +201 +200 +200 +203 +202 +202 +205 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +204 +204 +204 +204 +203 +202 +202 +200 +201 +200 +200 +200 +199 +199 +198 +198 +198 +196 +196 +194 +194 +194 +190 +190 +188 +189 +189 +185 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +168 +169 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +133 +133 +134 +130 +129 +125 +125 +125 +119 +119 +119 +119 +120 +115 +116 +109 +110 +110 +105 +106 +99 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +69 +64 +64 +59 +59 +59 +55 +54 +50 +51 +48 +47 +47 +43 +43 +41 +41 +41 +37 +37 +38 +37 +37 +33 +34 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +20 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +59 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +116 +116 +116 +120 +120 +125 +125 +126 +129 +129 +133 +133 +134 +139 +140 +143 +143 +144 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +185 +185 +188 +189 +191 +190 +195 +194 +195 +197 +197 +198 +198 +199 +200 +201 +201 +201 +201 +202 +202 +204 +205 +204 +204 +205 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +204 +205 +204 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +199 +199 +196 +196 +194 +194 +191 +191 +190 +189 +189 +184 +185 +185 +183 +182 +182 +183 +183 +179 +178 +174 +175 +175 +173 +173 +168 +169 +167 +165 +165 +161 +161 +156 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +134 +134 +134 +130 +129 +126 +125 +122 +120 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +58 +59 +55 +55 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +51 +54 +55 +59 +59 +59 +65 +64 +64 +65 +65 +68 +68 +72 +73 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +115 +115 +116 +119 +119 +125 +125 +126 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +174 +179 +178 +183 +183 +183 +184 +184 +188 +188 +188 +190 +191 +194 +194 +195 +197 +197 +198 +198 +198 +200 +201 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +203 +202 +201 +201 +200 +200 +200 +198 +198 +197 +197 +196 +194 +194 +195 +194 +194 +190 +190 +189 +189 +188 +184 +185 +182 +182 +180 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +164 +161 +161 +161 +161 +161 +157 +157 +152 +151 +152 +147 +147 +143 +143 +141 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +85 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +59 +58 +54 +54 +55 +51 +50 +46 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +12 +12 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +20 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +32 +37 +36 +41 +41 +41 +42 +43 +42 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +115 +115 +115 +119 +120 +125 +126 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +182 +182 +185 +185 +184 +189 +189 +190 +190 +191 +194 +195 +196 +196 +199 +198 +198 +200 +200 +200 +201 +200 +202 +202 +205 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +205 +204 +202 +203 +203 +202 +202 +200 +200 +200 +201 +200 +198 +198 +196 +196 +197 +195 +194 +191 +191 +188 +188 +189 +185 +184 +183 +183 +183 +179 +179 +179 +179 +179 +174 +174 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +126 +120 +119 +115 +116 +109 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +89 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +58 +58 +54 +54 +50 +51 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +31 +27 +27 +26 +24 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +51 +54 +55 +59 +59 +59 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +185 +185 +185 +189 +189 +190 +191 +191 +194 +195 +197 +196 +196 +198 +198 +201 +200 +201 +200 +200 +202 +202 +203 +204 +204 +204 +205 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +201 +200 +200 +201 +201 +198 +198 +198 +197 +197 +194 +194 +194 +190 +190 +190 +190 +191 +189 +188 +184 +184 +185 +183 +182 +179 +176 +176 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +130 +130 +126 +125 +119 +119 +119 +116 +115 +110 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +87 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +58 +59 +58 +55 +54 +51 +50 +50 +47 +46 +43 +42 +43 +41 +41 +37 +36 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +42 +43 +47 +47 +47 +51 +51 +54 +55 +54 +58 +58 +64 +64 +65 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +115 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +140 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +182 +182 +183 +185 +185 +188 +189 +188 +191 +190 +194 +194 +195 +196 +197 +198 +199 +200 +200 +200 +201 +201 +202 +203 +202 +204 +204 +204 +205 +204 +204 +204 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +205 +205 +204 +204 +204 +203 +202 +203 +202 +203 +200 +200 +200 +200 +200 +199 +199 +197 +196 +195 +194 +195 +191 +191 +188 +189 +188 +185 +185 +182 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +129 +126 +125 +119 +120 +119 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +83 +77 +76 +72 +72 +72 +68 +68 +64 +64 +59 +58 +58 +54 +55 +51 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +24 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +54 +55 +59 +58 +64 +65 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +185 +188 +189 +189 +191 +190 +194 +194 +194 +196 +196 +196 +196 +196 +199 +199 +201 +200 +200 +200 +201 +202 +202 +203 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +207 +206 +206 +205 +204 +205 +204 +205 +202 +203 +200 +200 +200 +200 +200 +198 +198 +198 +197 +197 +195 +194 +194 +191 +191 +188 +189 +189 +185 +185 +183 +183 +180 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +125 +120 +120 +116 +116 +116 +109 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +59 +58 +55 +55 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +15 +15 +18 +17 +18 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +55 +59 +59 +59 +64 +64 +69 +69 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +109 +110 +116 +116 +119 +119 +126 +125 +126 +129 +129 +133 +134 +134 +140 +139 +143 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +183 +182 +183 +185 +185 +189 +189 +189 +190 +190 +194 +194 +195 +196 +196 +198 +198 +200 +200 +201 +201 +201 +203 +203 +202 +204 +204 +204 +205 +204 +205 +205 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +199 +198 +199 +197 +196 +195 +194 +190 +191 +191 +188 +188 +184 +184 +185 +182 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +126 +125 +120 +120 +116 +116 +115 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +65 +58 +59 +54 +55 +50 +50 +50 +46 +47 +43 +43 +43 +41 +40 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +28 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +15 +15 +17 +18 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +54 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +73 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +105 +110 +110 +116 +115 +116 +120 +120 +126 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +182 +185 +184 +185 +188 +189 +190 +190 +195 +194 +194 +197 +196 +198 +199 +198 +200 +201 +201 +201 +200 +200 +200 +202 +202 +202 +204 +204 +204 +205 +205 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +201 +200 +200 +198 +198 +198 +197 +196 +196 +197 +197 +194 +195 +191 +190 +191 +189 +188 +184 +185 +185 +182 +183 +179 +179 +178 +174 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +120 +120 +116 +115 +110 +110 +109 +106 +106 +100 +100 +99 +95 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +73 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +54 +54 +55 +50 +50 +47 +46 +47 +43 +43 +41 +41 +42 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +22 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +50 +51 +55 +54 +54 +59 +59 +64 +64 +64 +69 +68 +72 +72 +73 +76 +77 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +120 +125 +125 +126 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +184 +189 +189 +189 +189 +189 +191 +190 +195 +194 +194 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +203 +204 +204 +204 +204 +204 +207 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +207 +206 +205 +204 +204 +205 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +198 +196 +196 +196 +195 +194 +190 +190 +191 +189 +189 +184 +184 +183 +182 +183 +179 +179 +175 +175 +175 +172 +173 +169 +168 +169 +166 +165 +161 +161 +160 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +138 +139 +133 +133 +129 +130 +129 +125 +126 +119 +120 +120 +116 +116 +110 +109 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +73 +72 +72 +68 +68 +65 +64 +65 +59 +59 +55 +55 +52 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +18 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +58 +58 +64 +65 +69 +68 +68 +72 +73 +77 +77 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +119 +120 +119 +126 +125 +129 +129 +130 +133 +132 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +174 +175 +179 +179 +183 +183 +183 +185 +184 +188 +189 +189 +191 +190 +195 +194 +196 +196 +196 +198 +198 +198 +198 +198 +200 +200 +200 +200 +201 +203 +202 +204 +204 +204 +205 +204 +207 +206 +205 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +204 +205 +204 +204 +204 +203 +203 +200 +200 +201 +201 +201 +199 +199 +197 +197 +197 +195 +195 +191 +191 +190 +189 +188 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +152 +150 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +134 +129 +130 +125 +125 +126 +120 +119 +116 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +64 +59 +58 +55 +55 +54 +51 +51 +51 +51 +50 +47 +47 +42 +43 +43 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +59 +58 +65 +65 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +110 +110 +110 +115 +116 +120 +119 +119 +125 +126 +129 +130 +130 +133 +133 +139 +139 +143 +144 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +160 +165 +165 +165 +169 +169 +173 +173 +175 +175 +176 +179 +179 +182 +182 +182 +185 +184 +188 +189 +188 +190 +190 +194 +194 +194 +196 +197 +199 +199 +199 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +203 +203 +202 +200 +201 +200 +200 +200 +198 +199 +196 +196 +197 +194 +194 +191 +191 +191 +188 +188 +185 +184 +185 +182 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +133 +133 +130 +129 +126 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +69 +68 +68 +68 +65 +64 +59 +58 +59 +54 +54 +51 +51 +50 +47 +46 +43 +42 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +46 +51 +51 +55 +54 +55 +58 +58 +64 +64 +65 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +95 +100 +100 +100 +106 +105 +110 +110 +112 +116 +115 +119 +119 +125 +126 +125 +130 +129 +133 +133 +133 +140 +140 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +162 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +178 +183 +183 +183 +184 +185 +189 +188 +189 +190 +191 +194 +195 +196 +196 +196 +199 +198 +200 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +202 +202 +201 +201 +200 +200 +200 +198 +198 +196 +197 +197 +194 +194 +190 +190 +189 +189 +189 +184 +185 +182 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +116 +110 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +65 +65 +59 +58 +58 +55 +55 +50 +51 +50 +47 +46 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +46 +50 +50 +51 +55 +54 +58 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +110 +109 +115 +116 +119 +119 +119 +125 +125 +126 +126 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +162 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +184 +185 +188 +189 +188 +191 +191 +194 +195 +195 +196 +196 +199 +198 +198 +200 +200 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +207 +207 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +204 +203 +202 +200 +200 +201 +200 +200 +199 +198 +197 +197 +197 +195 +195 +190 +190 +190 +189 +189 +185 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +174 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +130 +129 +127 +125 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +87 +82 +82 +77 +76 +76 +73 +73 +68 +68 +68 +64 +64 +58 +59 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +16 +15 +15 +17 +18 +19 +19 +20 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +38 +41 +41 +43 +43 +46 +46 +46 +51 +50 +54 +55 +54 +58 +59 +58 +58 +59 +65 +64 +69 +68 +69 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +126 +126 +127 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +178 +183 +182 +183 +185 +184 +189 +188 +188 +191 +191 +194 +194 +194 +197 +196 +198 +198 +198 +200 +201 +200 +200 +203 +203 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +203 +202 +203 +200 +200 +200 +201 +201 +199 +198 +196 +197 +196 +195 +195 +190 +191 +191 +188 +189 +185 +184 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +140 +140 +133 +133 +130 +130 +129 +126 +126 +119 +119 +119 +116 +116 +116 +115 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +54 +54 +55 +51 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +16 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +46 +47 +51 +51 +55 +55 +55 +58 +59 +64 +64 +65 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +115 +116 +116 +119 +120 +125 +125 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +148 +147 +151 +151 +152 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +189 +189 +190 +190 +191 +195 +195 +196 +197 +198 +198 +199 +201 +201 +200 +200 +201 +203 +203 +205 +204 +205 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +204 +204 +204 +205 +205 +202 +203 +201 +200 +200 +200 +200 +199 +198 +199 +197 +197 +195 +195 +195 +190 +190 +189 +188 +184 +185 +185 +182 +182 +179 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +134 +133 +133 +129 +129 +125 +126 +125 +120 +120 +115 +115 +111 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +59 +59 +59 +54 +54 +51 +51 +50 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +32 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +58 +59 +58 +64 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +120 +120 +125 +126 +130 +129 +130 +134 +133 +139 +139 +140 +144 +144 +147 +147 +151 +151 +152 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +182 +184 +185 +188 +189 +190 +190 +191 +195 +195 +196 +196 +197 +198 +199 +199 +199 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +205 +203 +202 +201 +200 +201 +200 +201 +198 +198 +197 +196 +197 +195 +194 +190 +191 +190 +188 +189 +188 +188 +188 +185 +185 +182 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +144 +139 +140 +133 +133 +131 +130 +129 +126 +126 +119 +119 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +69 +64 +65 +59 +59 +58 +55 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +36 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +54 +55 +55 +55 +54 +58 +59 +65 +64 +64 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +105 +110 +110 +115 +116 +116 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +188 +188 +189 +190 +190 +195 +194 +195 +196 +197 +199 +199 +199 +201 +200 +200 +201 +203 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +200 +200 +198 +199 +198 +199 +198 +196 +196 +194 +194 +195 +190 +191 +188 +188 +188 +185 +185 +182 +183 +178 +179 +179 +175 +174 +173 +173 +172 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +126 +126 +119 +120 +120 +116 +116 +110 +110 +110 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +50 +51 +51 +54 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +126 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +168 +173 +173 +172 +175 +175 +179 +179 +179 +183 +182 +185 +185 +184 +188 +189 +190 +191 +190 +194 +194 +197 +197 +199 +198 +199 +200 +201 +200 +200 +200 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +203 +203 +202 +200 +200 +201 +200 +201 +198 +198 +196 +196 +195 +194 +195 +190 +190 +188 +188 +189 +185 +185 +183 +183 +182 +179 +178 +179 +178 +179 +174 +175 +173 +173 +173 +169 +170 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +126 +126 +119 +119 +115 +116 +110 +109 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +87 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +69 +65 +65 +58 +58 +59 +55 +55 +50 +50 +51 +46 +47 +43 +42 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +16 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +39 +41 +41 +42 +42 +47 +47 +47 +51 +51 +55 +54 +55 +58 +58 +64 +65 +65 +68 +68 +72 +73 +72 +75 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +126 +125 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +174 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +188 +190 +190 +191 +190 +191 +194 +194 +196 +196 +196 +198 +198 +200 +200 +201 +200 +201 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +205 +205 +204 +204 +202 +202 +202 +200 +201 +200 +200 +201 +198 +198 +199 +198 +199 +196 +197 +195 +195 +195 +190 +190 +188 +188 +185 +184 +185 +183 +182 +178 +178 +178 +175 +173 +173 +173 +168 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +115 +110 +109 +110 +106 +106 +100 +100 +97 +96 +95 +89 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +51 +47 +47 +47 +42 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +18 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +46 +47 +50 +51 +51 +55 +54 +59 +59 +64 +65 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +115 +115 +115 +120 +119 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +174 +179 +178 +179 +182 +183 +184 +184 +185 +189 +189 +191 +190 +191 +194 +194 +196 +196 +198 +198 +198 +200 +201 +200 +200 +200 +202 +202 +203 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +205 +204 +204 +202 +202 +200 +200 +201 +200 +200 +199 +198 +198 +196 +196 +194 +194 +190 +190 +190 +189 +189 +185 +184 +184 +183 +183 +178 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +126 +126 +120 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +75 +72 +73 +72 +72 +72 +68 +68 +65 +64 +64 +59 +59 +54 +55 +54 +51 +51 +47 +47 +46 +43 +43 +40 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +24 +25 +27 +27 +27 +31 +31 +32 +33 +34 +38 +36 +41 +41 +42 +43 +42 +47 +47 +51 +51 +51 +55 +55 +55 +54 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +120 +120 +125 +125 +126 +129 +129 +133 +134 +140 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +166 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +182 +183 +183 +184 +184 +188 +189 +189 +191 +190 +191 +191 +191 +194 +195 +197 +197 +197 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +197 +194 +195 +190 +191 +191 +189 +189 +184 +185 +182 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +142 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +120 +119 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +68 +65 +64 +58 +59 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +16 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +55 +55 +59 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +115 +120 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +175 +179 +179 +179 +179 +179 +183 +183 +185 +185 +185 +189 +188 +191 +190 +191 +194 +195 +197 +196 +198 +198 +199 +201 +200 +200 +200 +200 +203 +202 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +207 +205 +205 +204 +204 +205 +202 +202 +202 +200 +201 +200 +200 +201 +198 +199 +196 +196 +194 +194 +195 +191 +190 +188 +188 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +126 +125 +120 +119 +120 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +69 +65 +64 +59 +59 +54 +55 +55 +51 +51 +47 +47 +46 +43 +43 +42 +42 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +50 +50 +55 +54 +59 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +120 +126 +126 +129 +129 +129 +134 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +172 +173 +173 +175 +174 +179 +179 +178 +182 +183 +185 +184 +188 +188 +188 +190 +191 +194 +195 +194 +196 +196 +196 +196 +196 +198 +199 +200 +200 +201 +200 +200 +202 +202 +203 +204 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +207 +204 +204 +205 +204 +205 +202 +202 +200 +201 +201 +200 +200 +199 +198 +199 +197 +197 +195 +194 +195 +190 +190 +189 +189 +188 +185 +185 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +130 +126 +125 +125 +120 +118 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +77 +72 +72 +72 +69 +68 +64 +64 +65 +58 +59 +58 +58 +59 +54 +54 +50 +51 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +55 +54 +59 +58 +64 +65 +65 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +116 +115 +117 +119 +119 +126 +126 +130 +130 +129 +133 +133 +140 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +174 +175 +179 +178 +179 +182 +183 +183 +183 +182 +185 +185 +188 +189 +188 +191 +190 +195 +195 +196 +197 +197 +198 +198 +201 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +205 +206 +206 +207 +207 +207 +206 +207 +206 +207 +206 +206 +207 +206 +206 +204 +205 +204 +204 +205 +202 +202 +202 +201 +201 +201 +200 +200 +199 +199 +197 +196 +196 +194 +195 +190 +191 +189 +188 +188 +185 +185 +183 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +65 +58 +59 +59 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +26 +24 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +58 +59 +65 +64 +65 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +91 +90 +96 +96 +100 +100 +101 +106 +105 +110 +110 +115 +116 +115 +120 +119 +126 +125 +125 +129 +129 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +149 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +188 +189 +189 +191 +191 +194 +195 +195 +197 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +201 +201 +200 +201 +198 +199 +196 +196 +197 +194 +194 +190 +191 +190 +189 +189 +185 +185 +185 +183 +182 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +140 +133 +134 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +110 +110 +110 +106 +105 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +65 +64 +65 +58 +58 +55 +55 +55 +51 +51 +51 +50 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +35 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +115 +115 +119 +119 +119 +125 +125 +130 +130 +131 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +189 +188 +190 +191 +195 +195 +195 +196 +197 +198 +198 +199 +201 +201 +200 +201 +202 +202 +202 +205 +204 +204 +204 +204 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +203 +202 +203 +200 +201 +200 +200 +200 +198 +199 +199 +199 +199 +197 +197 +194 +194 +194 +191 +191 +189 +189 +189 +184 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +126 +125 +119 +120 +119 +120 +119 +116 +115 +109 +109 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +77 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +55 +55 +53 +51 +50 +47 +46 +43 +43 +42 +41 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +26 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +46 +47 +51 +51 +51 +55 +54 +58 +58 +60 +65 +64 +68 +68 +73 +72 +72 +76 +77 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +164 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +184 +185 +188 +189 +191 +190 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +194 +191 +191 +191 +189 +188 +184 +185 +184 +182 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +115 +116 +109 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +59 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +20 +19 +19 +22 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +54 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +93 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +120 +119 +120 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +184 +185 +185 +189 +189 +190 +190 +191 +195 +194 +197 +197 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +198 +198 +198 +196 +196 +195 +195 +195 +190 +190 +189 +188 +188 +185 +185 +183 +183 +183 +178 +179 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +127 +125 +125 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +99 +100 +100 +96 +96 +90 +90 +90 +86 +85 +82 +82 +79 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +51 +54 +54 +54 +54 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +99 +99 +100 +106 +105 +110 +110 +110 +115 +116 +119 +119 +120 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +172 +175 +175 +179 +179 +179 +182 +183 +184 +184 +184 +189 +188 +190 +190 +191 +194 +194 +197 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +200 +201 +200 +199 +198 +198 +196 +196 +195 +194 +195 +191 +191 +188 +188 +189 +184 +185 +182 +182 +179 +178 +179 +175 +175 +173 +173 +173 +168 +168 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +126 +125 +125 +120 +120 +115 +116 +116 +110 +110 +106 +105 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +55 +51 +50 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +52 +55 +54 +59 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +109 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +174 +175 +178 +179 +182 +183 +183 +185 +184 +188 +189 +191 +190 +190 +194 +194 +196 +197 +196 +198 +198 +200 +200 +200 +201 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +197 +194 +194 +190 +190 +191 +188 +189 +188 +188 +188 +184 +185 +183 +182 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +131 +129 +129 +125 +125 +119 +119 +119 +116 +116 +110 +109 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +51 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +35 +36 +36 +41 +41 +43 +44 +43 +47 +47 +51 +51 +51 +54 +54 +55 +54 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +172 +173 +174 +175 +174 +178 +179 +182 +183 +182 +185 +185 +188 +188 +189 +190 +191 +194 +194 +194 +197 +197 +198 +198 +198 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +204 +204 +205 +204 +202 +202 +202 +200 +200 +200 +201 +200 +198 +198 +198 +198 +198 +196 +196 +194 +194 +194 +190 +191 +188 +188 +187 +184 +185 +182 +183 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +50 +50 +47 +47 +46 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +40 +41 +43 +43 +47 +46 +47 +51 +50 +54 +54 +58 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +81 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +109 +110 +110 +115 +116 +120 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +162 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +189 +189 +189 +190 +191 +194 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +202 +204 +204 +205 +204 +204 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +199 +196 +197 +196 +194 +195 +190 +191 +189 +189 +189 +184 +185 +183 +182 +182 +179 +179 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +119 +119 +116 +115 +113 +110 +109 +105 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +71 +72 +72 +68 +68 +65 +64 +58 +58 +59 +55 +54 +51 +50 +51 +46 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +44 +47 +47 +51 +51 +55 +54 +54 +58 +58 +64 +64 +65 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +95 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +125 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +184 +189 +188 +189 +191 +190 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +201 +202 +202 +205 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +203 +200 +201 +200 +200 +198 +198 +198 +196 +196 +194 +194 +194 +190 +191 +191 +190 +190 +188 +188 +184 +184 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +130 +129 +129 +125 +125 +119 +120 +119 +115 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +83 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +54 +54 +50 +50 +51 +46 +47 +43 +42 +43 +41 +40 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +55 +58 +58 +59 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +182 +182 +185 +184 +185 +188 +188 +191 +190 +191 +195 +195 +197 +196 +196 +199 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +204 +204 +204 +205 +205 +202 +202 +200 +200 +200 +200 +200 +200 +200 +200 +198 +199 +196 +196 +196 +195 +195 +191 +190 +189 +188 +189 +184 +185 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +160 +161 +157 +158 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +120 +115 +115 +109 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +55 +55 +51 +51 +47 +47 +47 +43 +43 +40 +40 +41 +36 +37 +33 +33 +33 +30 +31 +27 +27 +27 +25 +24 +21 +21 +22 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +54 +54 +55 +58 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +116 +119 +120 +126 +126 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +185 +185 +188 +188 +190 +191 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +202 +202 +202 +201 +201 +200 +200 +199 +198 +198 +196 +197 +194 +195 +194 +190 +190 +188 +188 +188 +184 +185 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +120 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +65 +65 +58 +59 +54 +55 +54 +50 +50 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +19 +18 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +40 +43 +43 +46 +47 +47 +51 +50 +55 +55 +55 +58 +58 +65 +64 +65 +68 +68 +72 +72 +72 +77 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +116 +119 +120 +125 +126 +125 +129 +129 +133 +134 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +179 +182 +182 +184 +184 +188 +189 +188 +191 +190 +195 +194 +194 +196 +196 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +205 +204 +204 +203 +203 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +194 +191 +191 +190 +189 +189 +184 +184 +185 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +119 +116 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +59 +58 +55 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +36 +33 +33 +33 +30 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +55 +58 +58 +64 +65 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +116 +120 +120 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +182 +183 +184 +184 +185 +185 +184 +189 +189 +191 +191 +191 +195 +194 +196 +196 +197 +198 +198 +200 +200 +200 +200 +200 +203 +202 +202 +202 +202 +204 +204 +205 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +198 +199 +196 +197 +195 +194 +191 +190 +190 +189 +188 +184 +184 +185 +182 +182 +179 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +134 +130 +129 +125 +125 +125 +120 +120 +115 +115 +116 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +54 +51 +51 +51 +46 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +32 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +55 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +126 +130 +130 +133 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +183 +184 +185 +188 +188 +191 +190 +191 +195 +194 +196 +196 +196 +198 +199 +199 +198 +198 +201 +200 +200 +200 +200 +202 +203 +205 +204 +204 +204 +205 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +194 +195 +190 +190 +190 +188 +188 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +129 +129 +126 +126 +120 +119 +120 +115 +116 +110 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +59 +58 +54 +54 +50 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +55 +59 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +91 +89 +90 +96 +96 +100 +100 +100 +106 +105 +110 +109 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +182 +182 +184 +185 +184 +189 +188 +191 +191 +191 +194 +195 +194 +194 +194 +196 +196 +199 +199 +198 +200 +201 +199 +201 +201 +202 +202 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +204 +203 +203 +202 +200 +201 +200 +200 +200 +199 +198 +196 +196 +196 +194 +194 +191 +190 +190 +188 +189 +184 +184 +184 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +126 +125 +119 +119 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +69 +64 +64 +64 +64 +64 +58 +58 +55 +54 +55 +50 +50 +47 +47 +45 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +14 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +12 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +55 +55 +59 +58 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +101 +105 +106 +106 +110 +109 +115 +115 +116 +120 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +138 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +175 +179 +178 +183 +182 +183 +185 +185 +185 +184 +185 +188 +188 +191 +191 +191 +194 +194 +196 +196 +197 +198 +199 +200 +201 +200 +200 +200 +202 +202 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +205 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +198 +196 +196 +194 +194 +194 +190 +190 +188 +188 +184 +184 +185 +182 +183 +178 +179 +178 +174 +175 +173 +172 +172 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +65 +59 +58 +55 +55 +55 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +16 +13 +13 +12 +12 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +46 +47 +50 +51 +51 +54 +54 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +109 +116 +115 +116 +119 +120 +125 +125 +125 +129 +129 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +173 +173 +173 +175 +175 +178 +179 +179 +183 +182 +184 +184 +188 +188 +189 +190 +190 +195 +195 +194 +197 +196 +198 +199 +198 +200 +200 +201 +201 +200 +202 +202 +204 +204 +205 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +201 +200 +198 +198 +196 +196 +196 +194 +194 +190 +190 +190 +188 +189 +185 +185 +184 +182 +182 +179 +178 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +69 +68 +64 +64 +58 +58 +58 +54 +54 +51 +50 +51 +47 +47 +47 +46 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +15 +15 +18 +17 +17 +19 +18 +21 +21 +21 +25 +25 +27 +27 +27 +30 +31 +33 +33 +33 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +54 +55 +59 +59 +58 +59 +58 +65 +64 +69 +69 +69 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +126 +127 +130 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +171 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +185 +188 +188 +190 +191 +190 +195 +195 +197 +196 +197 +199 +199 +200 +200 +200 +200 +200 +202 +202 +205 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +207 +207 +204 +204 +205 +204 +204 +203 +202 +200 +200 +200 +200 +200 +198 +198 +198 +197 +196 +195 +194 +194 +191 +191 +189 +189 +189 +184 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +130 +130 +125 +126 +125 +120 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +69 +68 +69 +64 +64 +59 +58 +59 +54 +54 +51 +50 +52 +47 +47 +43 +43 +41 +41 +41 +37 +37 +32 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +20 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +55 +55 +59 +58 +65 +64 +64 +68 +69 +72 +73 +77 +76 +77 +82 +83 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +117 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +168 +169 +173 +173 +173 +175 +175 +178 +178 +179 +183 +182 +184 +185 +184 +189 +189 +191 +190 +191 +195 +195 +197 +196 +198 +198 +198 +200 +201 +200 +201 +200 +202 +202 +204 +204 +205 +204 +204 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +201 +200 +199 +198 +198 +197 +196 +194 +195 +194 +190 +190 +188 +188 +185 +184 +185 +183 +183 +179 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +116 +116 +110 +110 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +69 +64 +65 +59 +59 +55 +54 +54 +50 +50 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +24 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +42 +43 +47 +46 +47 +50 +51 +54 +54 +56 +58 +58 +65 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +81 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +100 +106 +105 +110 +110 +116 +115 +116 +120 +120 +125 +126 +126 +129 +129 +130 +129 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +149 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +184 +185 +188 +189 +190 +191 +190 +194 +194 +197 +196 +197 +198 +198 +198 +198 +198 +200 +201 +200 +200 +201 +202 +203 +204 +205 +205 +205 +205 +207 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +195 +195 +190 +191 +191 +188 +189 +185 +185 +184 +183 +183 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +130 +126 +125 +126 +120 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +74 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +42 +37 +36 +33 +33 +31 +31 +31 +26 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +51 +55 +55 +59 +59 +58 +65 +64 +65 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +109 +109 +109 +115 +116 +119 +119 +120 +125 +125 +129 +129 +131 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +177 +179 +179 +182 +182 +184 +185 +185 +188 +188 +190 +190 +190 +194 +195 +196 +196 +197 +199 +198 +200 +201 +200 +201 +201 +203 +202 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +200 +200 +201 +201 +200 +198 +198 +198 +197 +197 +194 +195 +194 +191 +190 +189 +188 +189 +185 +185 +183 +182 +183 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +116 +116 +116 +116 +116 +109 +109 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +58 +59 +54 +55 +55 +50 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +20 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +40 +41 +43 +43 +43 +47 +47 +47 +47 +46 +50 +50 +54 +55 +55 +58 +59 +64 +65 +66 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +164 +168 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +185 +189 +188 +190 +191 +190 +194 +194 +197 +197 +197 +199 +198 +200 +200 +200 +201 +200 +203 +203 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +205 +205 +205 +204 +204 +202 +202 +201 +201 +200 +200 +201 +199 +198 +199 +197 +196 +194 +195 +194 +190 +191 +189 +189 +184 +184 +185 +182 +183 +179 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +129 +125 +126 +126 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +73 +73 +68 +68 +64 +65 +59 +58 +58 +55 +55 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +46 +48 +50 +52 +54 +54 +58 +58 +58 +64 +65 +68 +68 +69 +73 +72 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +126 +126 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +178 +179 +179 +182 +183 +184 +185 +188 +188 +188 +190 +191 +194 +194 +195 +196 +197 +198 +198 +201 +201 +200 +200 +201 +200 +203 +202 +205 +204 +204 +204 +204 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +203 +200 +201 +200 +200 +198 +198 +198 +196 +196 +195 +194 +194 +191 +190 +191 +191 +191 +189 +188 +185 +185 +185 +182 +183 +178 +178 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +160 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +138 +133 +133 +129 +129 +126 +125 +125 +119 +119 +115 +116 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +58 +58 +54 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +12 +15 +16 +17 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +32 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +47 +47 +46 +46 +47 +51 +51 +55 +55 +54 +58 +58 +64 +65 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +174 +175 +179 +178 +183 +183 +183 +184 +185 +189 +189 +188 +191 +190 +194 +194 +195 +197 +196 +198 +198 +200 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +197 +194 +190 +190 +191 +189 +188 +189 +184 +185 +182 +182 +183 +179 +178 +175 +175 +174 +173 +173 +172 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +126 +125 +119 +119 +115 +115 +116 +110 +110 +106 +106 +101 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +64 +65 +58 +58 +54 +55 +51 +50 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +54 +54 +54 +58 +59 +64 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +109 +110 +116 +115 +116 +120 +119 +126 +125 +125 +130 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +183 +183 +184 +184 +185 +188 +188 +190 +190 +195 +194 +194 +196 +197 +198 +198 +198 +200 +200 +201 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +200 +198 +199 +196 +196 +196 +194 +194 +195 +195 +194 +190 +190 +191 +191 +190 +188 +189 +184 +185 +185 +183 +182 +179 +179 +175 +175 +175 +173 +173 +168 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +130 +125 +119 +119 +119 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +83 +77 +76 +76 +72 +73 +68 +69 +68 +64 +64 +58 +59 +58 +55 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +20 +20 +21 +21 +25 +25 +25 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +40 +40 +43 +43 +47 +47 +46 +51 +50 +54 +55 +54 +58 +59 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +109 +110 +115 +116 +115 +119 +119 +125 +125 +129 +130 +130 +133 +133 +139 +140 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +174 +175 +179 +178 +183 +183 +183 +185 +184 +185 +185 +185 +188 +188 +191 +190 +190 +195 +194 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +200 +200 +198 +198 +198 +197 +197 +195 +195 +191 +190 +191 +188 +189 +185 +184 +185 +183 +183 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +126 +125 +125 +119 +119 +115 +115 +115 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +72 +68 +69 +65 +64 +65 +58 +59 +55 +55 +51 +51 +51 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +46 +50 +51 +54 +54 +55 +59 +58 +64 +65 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +106 +106 +105 +109 +110 +115 +116 +116 +120 +120 +126 +126 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +184 +185 +189 +189 +190 +191 +190 +195 +194 +196 +196 +196 +199 +198 +198 +198 +198 +200 +200 +200 +200 +200 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +200 +201 +201 +200 +198 +198 +198 +196 +196 +195 +195 +195 +191 +191 +189 +189 +188 +184 +185 +183 +182 +183 +179 +179 +175 +175 +174 +173 +172 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +140 +140 +133 +133 +129 +129 +126 +126 +125 +120 +119 +120 +119 +119 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +69 +68 +68 +64 +64 +64 +64 +65 +58 +58 +55 +55 +55 +51 +50 +47 +46 +48 +43 +43 +40 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +55 +59 +59 +64 +64 +64 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +105 +110 +110 +116 +115 +117 +119 +120 +126 +125 +129 +129 +129 +133 +133 +139 +140 +139 +143 +143 +148 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +183 +185 +184 +185 +185 +185 +188 +189 +191 +190 +191 +194 +194 +196 +197 +196 +198 +199 +201 +200 +201 +200 +200 +203 +202 +204 +204 +204 +204 +204 +205 +205 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +204 +205 +204 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +199 +196 +197 +195 +195 +190 +190 +191 +189 +189 +185 +185 +184 +182 +183 +178 +178 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +158 +158 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +133 +130 +129 +125 +126 +125 +119 +120 +116 +116 +116 +110 +110 +106 +105 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +50 +55 +55 +55 +59 +65 +64 +64 +68 +68 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +101 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +160 +165 +165 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +178 +180 +182 +183 +185 +185 +189 +188 +188 +191 +190 +195 +194 +194 +196 +196 +197 +196 +197 +198 +198 +201 +200 +200 +200 +200 +203 +203 +203 +205 +205 +204 +204 +206 +207 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +203 +202 +200 +200 +200 +201 +200 +198 +198 +199 +196 +196 +194 +194 +194 +190 +190 +189 +188 +189 +185 +185 +182 +182 +182 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +160 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +126 +125 +125 +119 +119 +115 +116 +115 +109 +110 +106 +105 +105 +100 +100 +96 +95 +96 +90 +91 +86 +86 +86 +82 +82 +77 +76 +72 +73 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +54 +50 +50 +47 +47 +47 +43 +42 +41 +41 +39 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +30 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +105 +105 +109 +110 +109 +115 +116 +120 +120 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +179 +182 +183 +182 +183 +183 +184 +185 +189 +188 +189 +191 +190 +195 +194 +196 +196 +197 +199 +199 +201 +201 +201 +200 +201 +202 +202 +202 +204 +205 +205 +204 +204 +207 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +204 +205 +204 +204 +204 +202 +202 +203 +201 +201 +201 +201 +201 +199 +198 +196 +197 +197 +194 +195 +191 +191 +189 +189 +188 +185 +184 +183 +182 +183 +179 +178 +178 +178 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +126 +126 +126 +120 +119 +116 +115 +116 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +87 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +66 +64 +64 +59 +59 +54 +55 +55 +51 +51 +47 +46 +46 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +42 +43 +43 +47 +47 +50 +51 +55 +54 +54 +58 +59 +64 +64 +64 +68 +68 +68 +68 +68 +73 +72 +76 +77 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +115 +115 +116 +120 +120 +126 +125 +125 +129 +129 +133 +133 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +182 +183 +184 +185 +185 +188 +189 +190 +191 +190 +194 +194 +196 +197 +197 +198 +200 +200 +201 +200 +200 +202 +202 +203 +204 +204 +205 +204 +204 +204 +205 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +204 +204 +204 +204 +202 +203 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +196 +194 +194 +191 +191 +191 +189 +189 +185 +185 +185 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +152 +151 +147 +147 +143 +143 +144 +139 +139 +134 +133 +130 +129 +129 +125 +126 +119 +120 +120 +116 +115 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +69 +68 +68 +64 +65 +58 +59 +58 +54 +54 +50 +50 +49 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +65 +64 +64 +69 +68 +73 +72 +72 +76 +76 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +105 +106 +110 +110 +110 +115 +116 +120 +120 +120 +125 +125 +126 +125 +125 +130 +129 +133 +133 +133 +140 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +170 +173 +173 +173 +175 +174 +179 +179 +179 +182 +183 +185 +185 +188 +189 +188 +191 +190 +194 +194 +194 +196 +196 +198 +199 +199 +200 +201 +201 +200 +200 +203 +203 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +205 +204 +203 +202 +201 +200 +201 +201 +200 +198 +198 +197 +196 +197 +194 +190 +190 +190 +190 +188 +189 +189 +189 +189 +184 +184 +183 +182 +182 +179 +179 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +144 +140 +139 +133 +133 +134 +129 +129 +126 +125 +120 +119 +120 +116 +116 +109 +110 +110 +106 +106 +106 +106 +105 +100 +100 +96 +96 +96 +90 +89 +86 +86 +85 +82 +82 +76 +76 +73 +72 +72 +69 +68 +64 +64 +65 +58 +58 +54 +55 +54 +51 +50 +47 +47 +47 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +18 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +50 +50 +54 +55 +58 +59 +59 +64 +65 +68 +68 +68 +72 +72 +76 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +109 +115 +115 +116 +119 +119 +126 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +170 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +184 +188 +189 +189 +191 +191 +195 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +205 +206 +207 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +203 +203 +203 +201 +200 +200 +200 +200 +199 +198 +197 +196 +196 +195 +195 +191 +191 +190 +188 +189 +185 +185 +185 +183 +183 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +141 +139 +139 +134 +133 +129 +130 +129 +125 +125 +119 +119 +120 +115 +115 +116 +116 +110 +110 +106 +106 +106 +106 +105 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +18 +19 +21 +21 +25 +24 +26 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +46 +47 +51 +51 +50 +54 +55 +59 +58 +59 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +144 +143 +147 +147 +148 +151 +151 +157 +157 +160 +161 +162 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +184 +188 +189 +189 +190 +191 +194 +195 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +206 +207 +206 +206 +207 +206 +207 +207 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +197 +196 +197 +195 +194 +191 +190 +188 +188 +188 +185 +185 +182 +183 +183 +179 +178 +178 +178 +179 +175 +175 +173 +173 +173 +169 +170 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +119 +118 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +54 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +27 +27 +27 +25 +26 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +50 +51 +50 +54 +54 +58 +57 +58 +64 +64 +64 +64 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +126 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +178 +182 +182 +183 +184 +184 +188 +189 +189 +191 +191 +194 +195 +194 +197 +197 +198 +199 +198 +200 +200 +200 +200 +201 +202 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +201 +200 +201 +200 +200 +198 +198 +197 +196 +196 +194 +194 +194 +195 +194 +191 +190 +188 +189 +189 +185 +185 +183 +183 +181 +179 +179 +175 +175 +172 +173 +172 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +119 +120 +115 +115 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +83 +82 +82 +82 +76 +76 +73 +72 +72 +68 +69 +64 +64 +64 +58 +58 +54 +55 +55 +51 +51 +47 +46 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +24 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +46 +47 +47 +51 +51 +54 +54 +54 +58 +58 +64 +64 +68 +68 +68 +72 +72 +72 +72 +72 +75 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +115 +115 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +178 +179 +183 +182 +185 +185 +185 +189 +188 +190 +190 +191 +195 +195 +196 +196 +199 +198 +199 +200 +200 +200 +201 +200 +203 +202 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +195 +194 +192 +191 +191 +189 +188 +184 +185 +185 +182 +182 +178 +178 +178 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +162 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +129 +129 +129 +125 +125 +119 +119 +120 +115 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +59 +55 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +50 +50 +54 +55 +59 +58 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +105 +110 +110 +109 +115 +116 +120 +119 +120 +125 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +182 +184 +185 +188 +189 +190 +190 +190 +194 +195 +196 +197 +197 +199 +198 +201 +201 +200 +201 +200 +202 +202 +202 +205 +205 +204 +204 +205 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +203 +203 +200 +201 +200 +200 +200 +199 +198 +196 +197 +195 +194 +195 +190 +191 +188 +188 +188 +185 +184 +184 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +172 +174 +169 +169 +165 +165 +161 +161 +161 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +129 +125 +125 +119 +119 +115 +116 +116 +109 +110 +106 +107 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +65 +64 +58 +59 +54 +55 +55 +50 +50 +46 +46 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +55 +54 +59 +59 +58 +64 +64 +68 +68 +68 +72 +73 +76 +76 +77 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +115 +120 +119 +120 +125 +125 +129 +130 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +160 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +183 +182 +182 +185 +184 +188 +189 +188 +191 +190 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +205 +204 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +205 +205 +202 +202 +200 +200 +200 +201 +201 +199 +199 +197 +196 +197 +194 +194 +195 +195 +194 +191 +190 +189 +188 +188 +184 +184 +182 +183 +181 +179 +179 +175 +175 +172 +173 +174 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +72 +69 +68 +64 +64 +64 +59 +58 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +32 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +59 +58 +64 +64 +65 +69 +68 +72 +72 +76 +76 +76 +82 +83 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +109 +110 +115 +116 +115 +119 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +183 +183 +184 +184 +184 +184 +185 +189 +189 +190 +190 +191 +194 +195 +197 +197 +196 +198 +198 +200 +200 +200 +200 +200 +203 +202 +204 +205 +205 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +205 +204 +205 +205 +204 +204 +204 +202 +202 +202 +202 +203 +201 +200 +200 +200 +201 +199 +198 +196 +197 +195 +194 +195 +190 +191 +188 +188 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +129 +125 +126 +119 +120 +119 +115 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +55 +55 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +15 +15 +17 +17 +17 +18 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +51 +50 +55 +55 +58 +58 +59 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +101 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +184 +184 +188 +189 +189 +190 +191 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +205 +204 +205 +204 +204 +202 +202 +201 +200 +201 +201 +201 +198 +199 +198 +197 +196 +194 +194 +194 +190 +191 +188 +188 +188 +184 +185 +183 +183 +183 +179 +179 +175 +174 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +130 +129 +126 +125 +125 +120 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +69 +68 +68 +68 +68 +64 +64 +58 +58 +59 +55 +55 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +30 +31 +27 +27 +27 +25 +25 +25 +25 +25 +22 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +15 +16 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +55 +59 +58 +65 +64 +64 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +95 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +116 +120 +119 +126 +125 +130 +130 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +178 +179 +182 +183 +183 +182 +183 +185 +185 +188 +188 +189 +191 +190 +195 +194 +195 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +204 +205 +204 +204 +204 +204 +204 +207 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +199 +197 +196 +194 +194 +191 +191 +190 +189 +189 +184 +185 +184 +183 +182 +178 +178 +178 +174 +175 +174 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +134 +134 +130 +129 +125 +125 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +65 +59 +59 +54 +54 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +15 +15 +16 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +51 +54 +54 +55 +58 +58 +64 +64 +64 +69 +69 +72 +72 +72 +76 +76 +82 +82 +82 +87 +86 +90 +90 +90 +95 +96 +100 +100 +106 +105 +105 +110 +110 +116 +116 +116 +119 +119 +126 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +145 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +174 +179 +179 +178 +183 +183 +185 +184 +186 +189 +189 +191 +190 +194 +194 +194 +196 +196 +199 +199 +198 +200 +200 +200 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +205 +205 +204 +204 +202 +202 +202 +200 +201 +201 +201 +198 +198 +199 +196 +196 +195 +194 +195 +190 +190 +189 +189 +188 +184 +185 +182 +183 +183 +179 +178 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +156 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +129 +125 +126 +119 +120 +116 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +55 +50 +50 +51 +51 +51 +47 +47 +42 +42 +43 +41 +41 +37 +37 +35 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +54 +54 +59 +58 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +109 +110 +116 +116 +115 +119 +120 +125 +125 +126 +129 +129 +133 +134 +140 +139 +139 +143 +143 +147 +146 +147 +151 +151 +157 +158 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +182 +182 +183 +184 +184 +189 +188 +188 +191 +191 +190 +190 +191 +194 +194 +197 +196 +196 +198 +199 +200 +200 +200 +200 +201 +202 +202 +202 +202 +202 +204 +204 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +199 +196 +196 +196 +195 +195 +190 +191 +191 +188 +188 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +140 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +115 +115 +110 +110 +110 +106 +106 +99 +100 +101 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +72 +72 +72 +69 +68 +65 +64 +65 +58 +58 +54 +55 +52 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +26 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +38 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +55 +55 +58 +58 +65 +64 +65 +68 +69 +73 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +101 +106 +106 +110 +110 +116 +116 +116 +120 +120 +125 +125 +126 +129 +129 +129 +129 +129 +134 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +172 +175 +175 +179 +179 +179 +183 +182 +185 +184 +188 +189 +189 +190 +190 +195 +194 +195 +197 +197 +198 +198 +198 +200 +201 +200 +201 +201 +202 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +200 +200 +201 +200 +201 +198 +198 +197 +197 +196 +194 +195 +190 +190 +190 +188 +188 +189 +189 +189 +184 +185 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +130 +125 +125 +119 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +77 +76 +73 +73 +68 +69 +68 +65 +64 +58 +58 +58 +55 +54 +54 +55 +54 +51 +50 +47 +46 +47 +43 +43 +41 +41 +39 +37 +37 +33 +33 +31 +31 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +73 +72 +76 +76 +77 +82 +82 +87 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +105 +106 +106 +110 +110 +116 +116 +116 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +178 +183 +182 +184 +185 +184 +189 +189 +191 +190 +191 +195 +195 +196 +197 +197 +198 +199 +200 +201 +200 +201 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +201 +201 +200 +198 +199 +198 +196 +196 +194 +194 +195 +190 +191 +189 +188 +189 +184 +185 +182 +183 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +140 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +119 +120 +120 +119 +116 +115 +110 +110 +110 +106 +105 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +81 +82 +76 +76 +76 +72 +72 +72 +72 +73 +68 +69 +64 +65 +65 +59 +58 +55 +54 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +20 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +42 +43 +47 +47 +51 +50 +51 +55 +54 +59 +58 +59 +64 +64 +69 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +115 +116 +119 +119 +120 +125 +125 +129 +130 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +153 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +178 +183 +182 +184 +184 +185 +188 +189 +191 +191 +194 +195 +195 +196 +196 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +200 +200 +201 +198 +198 +199 +197 +196 +194 +194 +191 +191 +191 +188 +188 +185 +185 +185 +183 +183 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +134 +133 +133 +130 +130 +125 +125 +123 +120 +119 +115 +116 +110 +109 +110 +106 +105 +100 +100 +99 +96 +95 +96 +96 +96 +90 +89 +86 +86 +86 +82 +82 +76 +76 +75 +72 +72 +68 +69 +64 +64 +64 +58 +58 +55 +55 +55 +50 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +20 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +42 +46 +47 +51 +51 +51 +55 +55 +55 +55 +55 +59 +58 +65 +64 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +109 +109 +110 +115 +116 +120 +120 +125 +125 +126 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +146 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +172 +174 +175 +179 +179 +179 +182 +182 +185 +184 +185 +188 +188 +191 +191 +190 +194 +195 +197 +197 +196 +199 +199 +201 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +201 +201 +201 +201 +200 +198 +198 +196 +196 +196 +194 +195 +191 +191 +191 +188 +189 +185 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +125 +120 +120 +120 +115 +116 +110 +110 +108 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +69 +65 +65 +59 +58 +55 +55 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +36 +37 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +16 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +30 +33 +33 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +48 +51 +51 +54 +54 +58 +59 +59 +64 +64 +68 +68 +69 +72 +72 +72 +73 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +120 +126 +126 +125 +130 +130 +134 +134 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +178 +178 +179 +183 +183 +184 +184 +189 +188 +189 +191 +190 +194 +194 +194 +196 +196 +198 +198 +198 +201 +201 +200 +200 +200 +202 +202 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +201 +201 +198 +199 +197 +197 +197 +195 +195 +191 +190 +190 +189 +189 +185 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +126 +126 +126 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +55 +55 +51 +51 +47 +47 +47 +43 +42 +41 +41 +40 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +22 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +37 +41 +41 +43 +43 +47 +46 +46 +50 +50 +54 +54 +55 +58 +58 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +77 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +115 +116 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +144 +147 +147 +147 +151 +151 +157 +157 +157 +160 +161 +165 +165 +165 +169 +169 +173 +172 +175 +175 +175 +178 +179 +182 +183 +182 +184 +184 +188 +188 +188 +191 +190 +195 +194 +194 +196 +197 +199 +198 +199 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +201 +200 +200 +200 +201 +200 +200 +198 +199 +196 +196 +197 +194 +194 +191 +190 +191 +189 +188 +184 +184 +182 +182 +183 +179 +179 +175 +175 +174 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +129 +130 +126 +125 +126 +120 +120 +116 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +58 +58 +55 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +40 +41 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +51 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +116 +119 +120 +120 +125 +126 +130 +130 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +183 +185 +185 +188 +189 +191 +191 +191 +194 +194 +196 +197 +196 +198 +199 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +207 +207 +207 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +198 +197 +197 +196 +195 +195 +191 +191 +191 +189 +189 +188 +189 +188 +185 +184 +182 +183 +182 +179 +179 +174 +174 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +126 +125 +125 +119 +120 +116 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +73 +72 +68 +68 +64 +65 +64 +58 +59 +55 +55 +55 +51 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +19 +21 +21 +21 +22 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +36 +36 +36 +41 +41 +42 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +59 +59 +64 +64 +69 +69 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +120 +125 +125 +130 +130 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +182 +184 +185 +184 +188 +188 +191 +190 +190 +195 +194 +197 +196 +197 +199 +198 +200 +201 +200 +201 +201 +203 +202 +204 +205 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +204 +204 +202 +203 +202 +201 +200 +200 +200 +200 +198 +198 +199 +198 +198 +197 +197 +194 +194 +195 +190 +191 +189 +188 +185 +184 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +119 +120 +116 +116 +116 +110 +110 +106 +106 +105 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +65 +64 +64 +58 +58 +55 +54 +55 +50 +51 +46 +47 +44 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +12 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +26 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +51 +51 +54 +54 +58 +64 +64 +65 +64 +68 +68 +72 +72 +73 +77 +76 +82 +82 +82 +87 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +115 +115 +119 +119 +125 +125 +125 +129 +130 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +178 +179 +183 +183 +185 +184 +184 +188 +189 +190 +190 +191 +195 +195 +196 +196 +198 +198 +199 +201 +200 +200 +200 +200 +203 +203 +203 +202 +202 +205 +204 +204 +205 +204 +207 +207 +206 +207 +207 +207 +207 +206 +207 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +204 +204 +205 +202 +202 +201 +200 +201 +200 +200 +198 +199 +197 +196 +197 +194 +195 +190 +191 +190 +188 +188 +188 +189 +188 +185 +185 +183 +182 +183 +178 +179 +175 +174 +175 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +120 +116 +115 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +65 +65 +64 +59 +58 +54 +55 +55 +51 +50 +46 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +55 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +130 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +178 +179 +183 +182 +184 +185 +185 +188 +188 +191 +190 +190 +194 +194 +197 +196 +196 +199 +198 +200 +200 +200 +200 +200 +202 +204 +203 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +197 +195 +195 +191 +191 +190 +189 +188 +185 +184 +185 +183 +183 +178 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +81 +82 +77 +76 +76 +72 +72 +68 +68 +69 +65 +65 +59 +59 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +51 +54 +55 +55 +59 +59 +65 +64 +64 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +120 +126 +125 +130 +130 +129 +134 +133 +139 +139 +139 +142 +143 +147 +147 +147 +152 +151 +157 +157 +157 +160 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +183 +184 +184 +184 +185 +184 +188 +188 +190 +190 +190 +194 +194 +196 +197 +197 +198 +198 +200 +201 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +205 +204 +202 +203 +202 +200 +201 +201 +200 +201 +199 +198 +196 +196 +197 +195 +195 +190 +191 +188 +189 +188 +185 +184 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +115 +115 +110 +109 +110 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +77 +72 +72 +72 +68 +68 +64 +65 +65 +59 +58 +54 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +36 +32 +32 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +55 +55 +54 +59 +58 +64 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +120 +126 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +182 +183 +184 +185 +188 +188 +190 +190 +191 +194 +194 +196 +196 +196 +199 +198 +199 +198 +198 +201 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +204 +204 +204 +204 +205 +202 +203 +200 +201 +200 +200 +200 +198 +199 +196 +196 +196 +194 +194 +190 +191 +190 +188 +189 +184 +185 +185 +183 +183 +179 +178 +178 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +134 +133 +129 +130 +125 +125 +120 +119 +120 +116 +116 +110 +110 +110 +106 +105 +100 +100 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +54 +55 +55 +54 +55 +51 +50 +47 +47 +47 +43 +42 +41 +41 +41 +37 +36 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +20 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +36 +42 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +83 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +120 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +185 +184 +188 +188 +188 +190 +190 +191 +190 +191 +195 +195 +196 +197 +196 +198 +198 +200 +200 +200 +200 +200 +203 +202 +204 +204 +205 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +207 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +195 +194 +194 +190 +190 +188 +189 +189 +185 +185 +183 +183 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +134 +134 +133 +129 +129 +126 +126 +126 +120 +120 +116 +115 +115 +110 +110 +106 +105 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +59 +59 +54 +54 +54 +50 +51 +47 +47 +45 +43 +43 +41 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +12 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +30 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +109 +115 +115 +116 +119 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +166 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +184 +184 +184 +184 +184 +188 +188 +190 +190 +191 +194 +195 +196 +196 +198 +198 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +201 +198 +198 +198 +197 +197 +194 +195 +194 +191 +191 +188 +188 +185 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +130 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +64 +62 +58 +58 +55 +55 +50 +50 +51 +47 +46 +42 +43 +43 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +12 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +58 +59 +58 +64 +64 +68 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +110 +110 +110 +116 +116 +119 +120 +120 +125 +125 +129 +129 +130 +133 +133 +139 +140 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +185 +188 +188 +188 +190 +191 +194 +195 +194 +196 +196 +198 +199 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +205 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +201 +199 +198 +197 +196 +197 +194 +194 +191 +191 +190 +189 +188 +184 +184 +185 +182 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +119 +115 +116 +115 +110 +109 +106 +106 +106 +100 +99 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +59 +54 +55 +55 +54 +55 +51 +51 +47 +46 +47 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +41 +41 +41 +43 +43 +43 +47 +47 +51 +50 +50 +54 +55 +54 +54 +55 +59 +59 +64 +65 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +87 +86 +85 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +119 +119 +120 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +148 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +167 +169 +169 +173 +173 +175 +175 +176 +178 +179 +183 +182 +182 +185 +185 +188 +188 +188 +190 +190 +194 +195 +195 +196 +197 +198 +199 +200 +201 +200 +200 +201 +202 +202 +202 +205 +204 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +201 +199 +198 +196 +196 +196 +195 +195 +190 +191 +191 +189 +189 +184 +185 +183 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +130 +125 +125 +119 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +98 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +65 +65 +58 +58 +54 +55 +51 +50 +50 +46 +46 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +46 +50 +51 +51 +54 +55 +58 +58 +59 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +97 +96 +100 +100 +100 +106 +106 +110 +110 +112 +115 +116 +120 +119 +125 +125 +125 +130 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +163 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +184 +185 +185 +189 +189 +190 +190 +191 +194 +195 +197 +196 +198 +199 +199 +200 +200 +201 +201 +201 +202 +203 +204 +204 +204 +204 +204 +206 +207 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +205 +207 +204 +205 +205 +204 +204 +203 +202 +200 +200 +200 +200 +201 +199 +199 +198 +196 +196 +194 +194 +194 +190 +191 +189 +189 +185 +185 +185 +183 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +130 +130 +130 +129 +129 +125 +126 +119 +119 +120 +115 +115 +109 +110 +108 +106 +106 +100 +100 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +73 +73 +68 +68 +65 +64 +59 +58 +59 +55 +55 +50 +50 +51 +47 +47 +42 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +77 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +109 +109 +115 +115 +119 +119 +119 +125 +126 +125 +125 +126 +129 +129 +133 +134 +133 +139 +139 +143 +143 +147 +147 +147 +151 +150 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +182 +183 +185 +185 +188 +188 +189 +191 +190 +194 +194 +194 +197 +197 +198 +199 +198 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +204 +205 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +199 +197 +196 +196 +194 +194 +190 +190 +190 +188 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +164 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +126 +126 +119 +120 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +69 +68 +68 +64 +65 +59 +59 +59 +54 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +54 +58 +58 +58 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +126 +125 +127 +130 +129 +133 +133 +139 +139 +139 +143 +144 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +174 +179 +179 +183 +183 +183 +185 +185 +189 +188 +188 +191 +190 +194 +195 +195 +196 +196 +199 +198 +199 +201 +200 +201 +200 +202 +202 +203 +205 +204 +204 +205 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +202 +202 +202 +201 +200 +200 +201 +200 +198 +198 +196 +197 +196 +194 +195 +191 +190 +191 +188 +188 +185 +185 +185 +182 +182 +179 +179 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +133 +130 +129 +129 +125 +125 +125 +125 +125 +119 +120 +116 +115 +115 +110 +110 +106 +106 +107 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +73 +72 +69 +68 +64 +64 +65 +58 +58 +55 +54 +50 +50 +50 +47 +47 +43 +42 +42 +41 +40 +37 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +26 +21 +21 +19 +19 +17 +17 +17 +15 +15 +14 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +46 +51 +50 +55 +55 +56 +58 +58 +64 +64 +68 +69 +68 +72 +72 +72 +72 +72 +76 +77 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +115 +115 +119 +120 +120 +125 +126 +129 +129 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +184 +184 +189 +188 +188 +191 +191 +194 +194 +194 +196 +196 +198 +198 +198 +200 +201 +201 +201 +200 +203 +203 +204 +205 +204 +205 +204 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +205 +204 +204 +205 +204 +203 +203 +200 +201 +201 +200 +200 +199 +198 +197 +197 +197 +194 +194 +190 +190 +190 +188 +189 +188 +189 +189 +185 +185 +182 +183 +183 +179 +179 +174 +175 +174 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +140 +140 +133 +133 +131 +129 +129 +125 +125 +119 +119 +119 +115 +116 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +89 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +65 +64 +64 +59 +59 +55 +54 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +22 +21 +25 +25 +25 +27 +26 +31 +31 +32 +33 +33 +37 +36 +41 +41 +41 +42 +43 +46 +47 +47 +51 +51 +51 +51 +51 +54 +54 +58 +58 +59 +64 +64 +69 +68 +70 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +100 +106 +105 +110 +110 +110 +115 +115 +120 +119 +125 +126 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +172 +175 +174 +178 +179 +179 +182 +182 +185 +184 +184 +188 +189 +191 +191 +191 +195 +194 +196 +196 +197 +198 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +200 +200 +201 +201 +200 +200 +198 +198 +196 +196 +196 +194 +195 +191 +190 +189 +188 +189 +185 +184 +182 +183 +183 +179 +178 +175 +175 +174 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +130 +125 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +73 +72 +68 +68 +64 +64 +64 +59 +58 +55 +54 +50 +50 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +18 +20 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +51 +51 +52 +54 +54 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +116 +116 +120 +119 +126 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +152 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +184 +185 +189 +189 +191 +191 +194 +195 +194 +196 +196 +198 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +205 +204 +202 +202 +202 +200 +200 +200 +200 +199 +198 +198 +197 +196 +194 +194 +194 +190 +190 +189 +189 +188 +185 +185 +185 +184 +184 +183 +183 +178 +179 +179 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +126 +120 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +59 +54 +55 +51 +51 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +42 +47 +46 +51 +50 +50 +55 +55 +59 +58 +58 +65 +64 +68 +68 +69 +73 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +95 +99 +99 +100 +106 +106 +110 +110 +110 +115 +115 +120 +119 +120 +126 +125 +129 +129 +130 +133 +133 +139 +139 +142 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +183 +182 +184 +185 +185 +188 +188 +190 +191 +191 +194 +194 +197 +197 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +203 +205 +204 +204 +204 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +203 +202 +203 +200 +200 +200 +201 +200 +198 +198 +196 +196 +196 +194 +194 +194 +195 +194 +190 +190 +189 +188 +189 +184 +184 +183 +183 +181 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +134 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +89 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +69 +68 +68 +65 +65 +58 +58 +59 +55 +54 +50 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +12 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +55 +58 +58 +64 +65 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +89 +96 +96 +96 +100 +100 +106 +105 +106 +109 +109 +116 +116 +120 +119 +120 +125 +125 +125 +125 +125 +129 +130 +134 +133 +134 +139 +139 +143 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +185 +189 +188 +191 +191 +191 +195 +195 +196 +196 +199 +199 +198 +201 +201 +201 +201 +201 +202 +202 +202 +202 +203 +205 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +204 +204 +204 +205 +204 +205 +205 +204 +202 +202 +200 +200 +201 +200 +200 +199 +198 +200 +196 +197 +194 +194 +190 +191 +191 +188 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +120 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +51 +50 +55 +55 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +120 +119 +125 +125 +125 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +185 +185 +188 +189 +188 +190 +191 +195 +195 +194 +196 +196 +198 +199 +198 +201 +200 +200 +201 +201 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +196 +196 +194 +195 +194 +190 +190 +188 +188 +189 +184 +184 +182 +183 +179 +178 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +144 +143 +139 +139 +134 +134 +133 +130 +129 +125 +125 +125 +119 +119 +116 +116 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +54 +59 +58 +65 +64 +64 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +176 +174 +179 +179 +179 +183 +182 +183 +183 +182 +184 +185 +189 +188 +188 +190 +190 +194 +194 +195 +197 +197 +198 +198 +200 +201 +201 +201 +200 +202 +202 +203 +204 +204 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +201 +200 +200 +201 +201 +198 +199 +199 +196 +197 +194 +195 +190 +190 +190 +188 +189 +185 +184 +184 +183 +182 +183 +182 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +130 +129 +129 +125 +126 +120 +119 +119 +116 +115 +110 +109 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +55 +54 +54 +51 +50 +47 +47 +46 +43 +43 +43 +43 +42 +40 +41 +36 +37 +36 +33 +32 +31 +31 +29 +27 +27 +25 +25 +20 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +47 +50 +50 +51 +54 +54 +58 +58 +58 +64 +64 +68 +68 +68 +73 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +119 +120 +125 +126 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +180 +183 +183 +185 +185 +188 +189 +188 +190 +190 +194 +194 +194 +196 +196 +196 +197 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +204 +205 +204 +204 +204 +203 +203 +201 +200 +200 +201 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +191 +189 +189 +188 +184 +184 +183 +182 +182 +179 +179 +175 +174 +172 +173 +173 +168 +169 +165 +165 +161 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +125 +126 +120 +120 +115 +116 +115 +110 +110 +106 +106 +105 +100 +100 +96 +95 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +59 +59 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +40 +41 +37 +36 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +25 +24 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +24 +25 +27 +27 +27 +31 +31 +32 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +55 +54 +58 +59 +64 +64 +65 +68 +68 +72 +72 +77 +77 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +99 +100 +106 +105 +110 +110 +110 +115 +116 +120 +119 +125 +126 +126 +129 +129 +133 +133 +133 +139 +139 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +179 +183 +182 +185 +185 +185 +189 +189 +190 +190 +192 +194 +195 +196 +197 +198 +199 +199 +200 +200 +200 +200 +201 +203 +203 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +201 +200 +200 +200 +200 +198 +199 +198 +196 +196 +195 +195 +191 +191 +190 +189 +188 +184 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +126 +120 +120 +115 +116 +116 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +76 +76 +76 +76 +72 +72 +68 +69 +66 +64 +65 +58 +58 +55 +54 +55 +50 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +12 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +26 +25 +24 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +51 +51 +55 +54 +54 +59 +58 +64 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +119 +119 +119 +126 +125 +129 +129 +130 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +168 +173 +173 +173 +175 +175 +178 +179 +182 +183 +183 +185 +184 +188 +189 +188 +191 +190 +194 +194 +195 +197 +196 +198 +198 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +205 +205 +204 +204 +204 +203 +202 +200 +200 +200 +201 +201 +198 +198 +198 +197 +197 +195 +194 +195 +190 +190 +189 +189 +188 +185 +185 +183 +182 +182 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +142 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +115 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +64 +64 +65 +58 +58 +54 +55 +54 +51 +50 +47 +46 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +22 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +20 +20 +21 +21 +21 +26 +25 +27 +27 +27 +31 +31 +33 +33 +38 +36 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +50 +54 +54 +58 +58 +58 +64 +64 +69 +68 +69 +73 +73 +77 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +95 +99 +100 +106 +106 +106 +110 +109 +115 +116 +117 +119 +120 +125 +125 +129 +130 +130 +134 +133 +140 +139 +140 +143 +143 +143 +144 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +163 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +178 +183 +182 +184 +185 +184 +188 +188 +190 +191 +191 +194 +195 +197 +197 +198 +199 +198 +200 +200 +200 +200 +201 +202 +202 +205 +204 +205 +205 +204 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +205 +202 +202 +200 +201 +200 +200 +200 +199 +198 +199 +196 +197 +194 +195 +195 +190 +190 +188 +188 +185 +184 +185 +183 +183 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +148 +144 +143 +143 +139 +139 +133 +134 +133 +130 +130 +129 +129 +130 +125 +125 +120 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +59 +58 +58 +54 +55 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +33 +33 +33 +33 +33 +36 +37 +41 +40 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +58 +58 +59 +65 +65 +68 +69 +68 +73 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +99 +100 +107 +106 +106 +110 +109 +115 +116 +116 +119 +120 +125 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +165 +169 +169 +173 +173 +173 +175 +174 +179 +179 +179 +182 +183 +185 +184 +189 +188 +189 +190 +190 +194 +194 +195 +196 +196 +198 +198 +198 +200 +201 +201 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +207 +207 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +205 +204 +202 +203 +203 +200 +200 +200 +201 +199 +198 +199 +197 +196 +194 +195 +195 +191 +190 +189 +189 +189 +185 +184 +183 +183 +182 +179 +179 +175 +174 +175 +172 +173 +169 +169 +164 +165 +165 +162 +161 +157 +156 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +134 +129 +129 +126 +126 +119 +120 +120 +116 +115 +110 +109 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +54 +51 +51 +47 +47 +47 +43 +42 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +55 +58 +59 +59 +64 +64 +69 +68 +68 +72 +72 +76 +76 +79 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +116 +115 +116 +116 +120 +120 +122 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +160 +161 +165 +165 +169 +169 +172 +172 +173 +175 +175 +179 +178 +179 +182 +182 +185 +185 +184 +188 +188 +191 +191 +190 +195 +195 +196 +196 +196 +198 +198 +200 +200 +201 +201 +201 +202 +202 +204 +205 +204 +204 +205 +206 +206 +207 +206 +207 +207 +206 +206 +207 +206 +206 +207 +207 +207 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +200 +201 +201 +198 +198 +196 +196 +196 +195 +194 +191 +191 +191 +189 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +125 +125 +125 +126 +126 +120 +120 +116 +116 +115 +110 +110 +106 +106 +101 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +83 +82 +76 +77 +72 +72 +72 +69 +68 +65 +64 +65 +58 +58 +55 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +42 +47 +47 +47 +50 +51 +55 +55 +56 +59 +58 +64 +64 +68 +68 +68 +73 +73 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +179 +179 +182 +182 +185 +185 +185 +189 +189 +190 +191 +195 +194 +194 +197 +196 +198 +198 +198 +200 +201 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +207 +207 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +202 +202 +201 +200 +200 +200 +201 +199 +198 +199 +196 +197 +195 +195 +191 +191 +191 +189 +189 +184 +184 +185 +182 +182 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +144 +143 +139 +139 +133 +134 +134 +130 +129 +125 +125 +123 +119 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +65 +59 +59 +58 +54 +54 +55 +54 +55 +51 +50 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +38 +41 +41 +42 +43 +47 +47 +47 +51 +51 +55 +55 +55 +59 +58 +59 +58 +59 +64 +65 +68 +68 +69 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +115 +116 +120 +120 +120 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +185 +189 +189 +190 +190 +191 +194 +194 +196 +196 +196 +198 +199 +200 +200 +200 +200 +201 +203 +202 +205 +205 +205 +205 +205 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +205 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +197 +197 +196 +195 +195 +190 +191 +191 +188 +189 +184 +184 +185 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +134 +133 +133 +130 +130 +125 +125 +125 +119 +119 +116 +115 +116 +110 +109 +106 +105 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +59 +58 +55 +54 +55 +50 +51 +47 +47 +43 +43 +42 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +24 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +42 +43 +47 +47 +51 +51 +51 +54 +54 +58 +59 +64 +65 +64 +69 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +116 +116 +116 +119 +120 +125 +125 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +166 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +184 +189 +189 +190 +191 +191 +195 +195 +197 +197 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +202 +202 +204 +204 +204 +204 +204 +207 +206 +206 +207 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +197 +196 +194 +195 +190 +190 +191 +189 +189 +185 +184 +185 +183 +182 +182 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +120 +115 +115 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +69 +65 +64 +64 +59 +58 +55 +55 +55 +50 +51 +47 +47 +47 +43 +44 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +51 +51 +50 +54 +54 +58 +58 +58 +64 +65 +68 +69 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +134 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +185 +185 +185 +189 +188 +190 +190 +190 +194 +195 +195 +194 +194 +196 +196 +198 +198 +199 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +205 +205 +202 +202 +200 +201 +201 +201 +200 +198 +198 +198 +196 +196 +196 +197 +196 +194 +195 +190 +191 +191 +189 +189 +185 +184 +184 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +130 +129 +125 +125 +120 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +89 +86 +86 +86 +82 +81 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +58 +55 +55 +50 +50 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +32 +33 +33 +37 +36 +41 +41 +41 +42 +43 +47 +46 +47 +50 +50 +54 +55 +55 +59 +59 +64 +64 +68 +69 +68 +72 +73 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +115 +120 +120 +119 +125 +125 +130 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +170 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +188 +189 +189 +190 +190 +195 +195 +195 +196 +197 +198 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +202 +202 +200 +200 +200 +201 +201 +199 +198 +196 +197 +195 +195 +195 +190 +190 +188 +188 +188 +184 +185 +183 +182 +183 +179 +179 +174 +175 +174 +173 +173 +169 +169 +169 +164 +165 +161 +161 +157 +156 +157 +151 +151 +147 +148 +147 +143 +143 +139 +140 +139 +134 +133 +129 +129 +129 +126 +125 +119 +120 +120 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +59 +55 +54 +54 +51 +50 +46 +47 +47 +43 +43 +40 +41 +41 +37 +37 +32 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +20 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +47 +51 +50 +54 +54 +56 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +110 +110 +109 +115 +115 +120 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +160 +165 +165 +169 +169 +169 +173 +172 +175 +175 +175 +178 +179 +183 +182 +182 +185 +185 +189 +189 +188 +190 +190 +195 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +204 +204 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +201 +200 +198 +198 +196 +196 +195 +194 +194 +190 +190 +189 +188 +188 +184 +185 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +59 +55 +55 +55 +50 +51 +47 +47 +46 +42 +43 +40 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +24 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +40 +43 +42 +47 +47 +47 +50 +50 +55 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +85 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +109 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +182 +183 +185 +184 +188 +189 +188 +190 +191 +194 +194 +195 +196 +196 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +205 +204 +204 +203 +203 +202 +200 +200 +200 +200 +198 +198 +198 +197 +196 +194 +195 +195 +191 +190 +188 +188 +188 +184 +185 +182 +182 +183 +179 +178 +175 +174 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +125 +126 +125 +120 +120 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +68 +69 +64 +64 +64 +59 +58 +54 +55 +54 +51 +50 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +77 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +120 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +182 +185 +184 +185 +189 +189 +189 +188 +188 +191 +190 +194 +194 +194 +196 +196 +198 +199 +199 +200 +201 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +201 +200 +199 +199 +198 +196 +196 +194 +194 +195 +191 +191 +189 +188 +185 +184 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +59 +58 +58 +55 +55 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +37 +37 +40 +40 +41 +43 +43 +46 +46 +47 +50 +51 +54 +55 +59 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +110 +110 +110 +115 +115 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +184 +186 +188 +189 +190 +191 +194 +194 +195 +196 +196 +198 +199 +199 +200 +200 +201 +201 +200 +200 +200 +203 +202 +203 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +204 +205 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +198 +198 +198 +197 +196 +194 +194 +194 +191 +190 +188 +188 +188 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +138 +139 +139 +133 +133 +129 +129 +130 +125 +126 +119 +120 +116 +115 +115 +109 +110 +106 +106 +106 +100 +99 +96 +96 +96 +91 +90 +86 +86 +86 +82 +82 +76 +76 +77 +73 +72 +69 +69 +65 +64 +64 +58 +59 +55 +55 +55 +51 +50 +50 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +32 +30 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +18 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +50 +51 +54 +55 +58 +59 +59 +65 +65 +68 +68 +68 +73 +72 +76 +76 +77 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +119 +126 +125 +130 +130 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +182 +184 +184 +188 +188 +188 +191 +191 +191 +191 +190 +194 +194 +197 +196 +197 +198 +199 +200 +200 +200 +201 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +207 +206 +207 +204 +204 +204 +204 +205 +203 +202 +200 +200 +200 +200 +200 +201 +201 +201 +198 +198 +197 +196 +196 +194 +194 +191 +190 +191 +188 +189 +184 +185 +183 +183 +182 +178 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +130 +129 +125 +125 +125 +126 +126 +119 +119 +115 +115 +115 +110 +110 +106 +106 +106 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +73 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +51 +51 +47 +47 +47 +42 +42 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +24 +21 +21 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +26 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +51 +51 +55 +54 +59 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +126 +129 +130 +133 +133 +134 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +188 +190 +191 +191 +194 +195 +196 +196 +197 +198 +198 +200 +201 +200 +200 +201 +203 +203 +203 +204 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +205 +204 +202 +202 +202 +200 +201 +201 +200 +200 +198 +199 +196 +196 +195 +195 +194 +191 +190 +188 +188 +189 +185 +184 +183 +183 +183 +178 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +130 +129 +125 +125 +126 +119 +119 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +73 +69 +69 +68 +64 +64 +64 +64 +64 +58 +58 +59 +55 +55 +54 +54 +55 +50 +50 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +100 +100 +100 +106 +106 +109 +110 +110 +115 +115 +119 +119 +122 +125 +125 +129 +129 +133 +134 +134 +139 +139 +143 +144 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +160 +161 +164 +164 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +184 +189 +189 +188 +190 +191 +194 +194 +195 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +202 +201 +201 +200 +201 +200 +198 +198 +196 +196 +196 +195 +194 +190 +190 +191 +188 +188 +185 +185 +183 +182 +183 +178 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +125 +120 +119 +120 +116 +116 +110 +109 +108 +106 +106 +100 +99 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +83 +77 +76 +72 +72 +73 +68 +68 +64 +64 +59 +58 +59 +55 +54 +50 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +51 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +116 +116 +116 +119 +119 +125 +125 +126 +129 +129 +130 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +189 +189 +190 +191 +190 +194 +195 +196 +196 +197 +198 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +202 +200 +201 +200 +200 +200 +198 +198 +196 +197 +195 +195 +195 +190 +190 +188 +189 +188 +185 +184 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +144 +143 +139 +139 +133 +134 +134 +129 +129 +125 +126 +126 +119 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +74 +72 +72 +68 +68 +64 +65 +64 +58 +59 +54 +54 +54 +50 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +22 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +51 +50 +50 +54 +54 +58 +58 +58 +64 +65 +64 +64 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +95 +96 +96 +100 +99 +106 +106 +106 +109 +109 +110 +110 +110 +115 +115 +120 +119 +119 +125 +126 +129 +130 +132 +133 +133 +139 +139 +142 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +160 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +185 +184 +189 +188 +191 +191 +190 +194 +194 +197 +196 +197 +198 +199 +201 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +207 +206 +204 +204 +205 +204 +204 +202 +203 +203 +200 +200 +200 +201 +198 +198 +199 +196 +196 +195 +195 +195 +190 +191 +188 +188 +188 +185 +185 +183 +183 +183 +178 +179 +174 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +134 +133 +129 +130 +129 +125 +126 +119 +119 +120 +116 +115 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +87 +86 +82 +83 +82 +76 +76 +72 +73 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +40 +41 +43 +43 +43 +47 +47 +47 +47 +47 +50 +50 +54 +54 +54 +59 +58 +64 +64 +66 +68 +68 +73 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +115 +116 +115 +120 +120 +119 +120 +120 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +189 +189 +191 +190 +195 +195 +195 +196 +197 +199 +198 +198 +201 +200 +200 +201 +200 +203 +203 +205 +204 +204 +204 +204 +206 +207 +207 +206 +206 +206 +207 +206 +207 +207 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +201 +200 +200 +200 +198 +198 +199 +196 +196 +194 +194 +190 +190 +190 +189 +188 +185 +185 +185 +183 +183 +182 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +140 +140 +133 +133 +134 +129 +130 +125 +125 +120 +119 +119 +116 +115 +109 +110 +109 +105 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +65 +64 +58 +59 +60 +54 +54 +51 +50 +50 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +50 +50 +54 +54 +59 +59 +59 +65 +64 +65 +64 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +178 +179 +182 +183 +183 +184 +184 +188 +189 +189 +190 +190 +191 +191 +190 +194 +194 +196 +197 +196 +199 +198 +200 +200 +200 +201 +201 +203 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +199 +197 +196 +197 +196 +197 +194 +195 +190 +190 +191 +189 +189 +185 +185 +185 +182 +183 +178 +179 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +156 +157 +151 +151 +147 +147 +146 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +126 +125 +120 +119 +115 +116 +116 +110 +109 +105 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +65 +58 +59 +55 +54 +55 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +47 +47 +47 +50 +51 +54 +54 +55 +58 +58 +64 +64 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +109 +109 +115 +115 +119 +119 +120 +125 +126 +129 +129 +129 +134 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +185 +189 +189 +188 +190 +190 +194 +194 +195 +196 +197 +198 +199 +201 +200 +200 +201 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +207 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +201 +201 +201 +200 +200 +200 +200 +198 +198 +198 +196 +196 +194 +195 +195 +190 +190 +188 +189 +184 +184 +184 +183 +182 +179 +178 +179 +175 +175 +175 +174 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +115 +116 +110 +109 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +69 +65 +64 +58 +58 +55 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +12 +15 +15 +17 +18 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +50 +50 +54 +55 +59 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +109 +115 +115 +119 +119 +120 +125 +125 +129 +130 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +184 +189 +189 +191 +190 +190 +194 +194 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +205 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +199 +199 +199 +196 +197 +194 +195 +194 +190 +191 +188 +188 +189 +184 +184 +184 +185 +185 +183 +182 +178 +179 +179 +175 +175 +172 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +119 +120 +120 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +69 +68 +68 +64 +65 +58 +58 +58 +55 +54 +51 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +39 +41 +40 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +58 +59 +64 +65 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +183 +182 +183 +184 +184 +188 +189 +188 +190 +190 +194 +194 +194 +197 +196 +198 +199 +198 +200 +201 +201 +200 +201 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +204 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +194 +194 +194 +191 +191 +189 +189 +189 +184 +185 +183 +182 +179 +179 +179 +175 +175 +172 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +120 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +64 +59 +58 +55 +54 +55 +51 +50 +47 +47 +47 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +50 +55 +55 +55 +58 +58 +64 +65 +65 +69 +68 +72 +72 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +178 +178 +179 +179 +179 +182 +182 +184 +185 +185 +189 +188 +191 +190 +190 +194 +195 +197 +197 +196 +198 +198 +200 +200 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +200 +200 +201 +200 +200 +200 +201 +199 +198 +199 +196 +197 +194 +194 +191 +190 +191 +189 +188 +184 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +119 +119 +115 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +58 +54 +54 +51 +50 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +51 +50 +54 +55 +54 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +99 +105 +106 +106 +109 +110 +116 +115 +115 +119 +119 +126 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +166 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +182 +183 +185 +184 +185 +188 +188 +190 +191 +195 +194 +194 +196 +196 +198 +198 +198 +200 +201 +201 +200 +200 +200 +201 +202 +203 +203 +204 +204 +204 +204 +205 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +203 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +194 +194 +191 +191 +190 +188 +189 +185 +184 +184 +182 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +126 +126 +120 +120 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +58 +55 +55 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +26 +31 +31 +33 +33 +34 +37 +36 +41 +41 +42 +43 +43 +47 +47 +51 +51 +51 +54 +54 +59 +59 +59 +64 +64 +68 +68 +69 +72 +72 +77 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +109 +110 +110 +115 +115 +119 +120 +119 +126 +125 +130 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +168 +172 +173 +174 +175 +176 +178 +178 +183 +183 +185 +184 +185 +188 +188 +191 +190 +191 +194 +194 +194 +195 +194 +196 +196 +198 +198 +199 +200 +200 +200 +201 +201 +202 +203 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +201 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +191 +191 +188 +188 +189 +185 +184 +182 +182 +178 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +126 +125 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +58 +58 +59 +65 +64 +69 +68 +73 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +182 +182 +183 +182 +183 +184 +185 +188 +189 +189 +190 +190 +194 +194 +195 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +201 +200 +200 +200 +201 +198 +198 +199 +196 +197 +194 +194 +191 +190 +191 +189 +188 +184 +185 +184 +182 +183 +179 +179 +178 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +120 +120 +116 +115 +116 +110 +110 +106 +105 +100 +100 +100 +96 +96 +89 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +72 +69 +68 +65 +64 +65 +58 +58 +55 +55 +51 +51 +51 +47 +47 +47 +47 +47 +43 +43 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +30 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +51 +51 +54 +55 +59 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +109 +110 +116 +116 +120 +120 +119 +125 +126 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +148 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +174 +178 +179 +179 +183 +183 +185 +184 +188 +188 +189 +190 +190 +194 +195 +194 +197 +196 +197 +196 +197 +198 +198 +200 +200 +201 +200 +200 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +201 +200 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +190 +189 +189 +189 +185 +185 +182 +183 +183 +179 +178 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +129 +126 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +58 +58 +58 +54 +54 +50 +51 +50 +46 +47 +43 +43 +42 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +20 +19 +19 +19 +17 +18 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +55 +58 +59 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +116 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +158 +157 +161 +161 +161 +164 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +182 +183 +182 +183 +184 +185 +188 +189 +189 +190 +191 +195 +194 +196 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +203 +202 +202 +200 +200 +200 +200 +201 +198 +199 +197 +196 +196 +194 +195 +191 +190 +188 +189 +189 +185 +185 +182 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +119 +120 +119 +116 +116 +110 +110 +111 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +61 +59 +59 +55 +54 +50 +50 +50 +46 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +59 +58 +58 +65 +64 +68 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +109 +116 +116 +120 +119 +119 +125 +125 +125 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +168 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +183 +185 +185 +189 +188 +190 +191 +191 +195 +194 +197 +196 +196 +198 +199 +200 +200 +200 +201 +201 +202 +203 +203 +204 +205 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +199 +198 +198 +197 +196 +195 +194 +194 +190 +191 +189 +189 +188 +185 +184 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +144 +143 +139 +139 +139 +133 +133 +129 +130 +130 +125 +125 +119 +119 +116 +115 +116 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +54 +54 +54 +51 +51 +46 +46 +47 +43 +42 +40 +41 +38 +36 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +26 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +42 +43 +47 +46 +51 +50 +51 +54 +54 +58 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +119 +119 +126 +125 +130 +129 +130 +133 +133 +140 +139 +143 +143 +143 +148 +147 +151 +150 +151 +157 +157 +157 +157 +157 +161 +160 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +178 +183 +183 +183 +184 +185 +188 +189 +188 +190 +190 +195 +194 +195 +197 +197 +198 +198 +199 +200 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +203 +202 +202 +200 +200 +200 +200 +200 +199 +198 +196 +196 +196 +194 +194 +191 +190 +190 +188 +189 +184 +184 +185 +182 +182 +179 +178 +176 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +130 +129 +125 +125 +120 +119 +119 +115 +115 +115 +115 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +58 +58 +59 +55 +54 +51 +51 +47 +47 +46 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +47 +46 +51 +50 +54 +54 +54 +58 +58 +64 +65 +65 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +105 +109 +110 +115 +115 +118 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +163 +165 +165 +169 +169 +173 +172 +173 +175 +174 +179 +179 +179 +182 +182 +185 +184 +185 +189 +189 +190 +190 +191 +194 +194 +196 +197 +197 +199 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +205 +204 +204 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +190 +188 +189 +185 +184 +184 +183 +182 +179 +179 +179 +174 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +126 +126 +119 +119 +120 +116 +115 +109 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +73 +73 +68 +68 +64 +64 +61 +59 +58 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +58 +64 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +95 +97 +100 +100 +106 +106 +109 +110 +109 +116 +115 +120 +120 +119 +125 +125 +126 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +174 +175 +179 +178 +179 +183 +183 +185 +185 +188 +188 +189 +191 +190 +194 +195 +194 +197 +196 +199 +198 +199 +201 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +205 +205 +205 +204 +203 +203 +200 +201 +201 +201 +201 +199 +198 +197 +197 +196 +194 +195 +191 +191 +191 +189 +189 +185 +185 +185 +183 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +50 +50 +54 +54 +59 +58 +59 +64 +64 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +109 +110 +110 +110 +110 +115 +115 +120 +120 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +178 +178 +179 +183 +183 +184 +184 +185 +188 +188 +191 +190 +191 +195 +194 +197 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +207 +206 +207 +206 +204 +204 +204 +205 +205 +202 +202 +201 +200 +201 +201 +201 +198 +199 +199 +196 +196 +195 +194 +195 +191 +191 +188 +188 +189 +185 +184 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +129 +129 +125 +125 +120 +120 +119 +115 +115 +115 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +91 +90 +89 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +55 +54 +55 +50 +51 +46 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +15 +14 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +32 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +51 +50 +54 +55 +54 +59 +58 +64 +64 +66 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +120 +119 +125 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +164 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +184 +184 +185 +188 +188 +190 +191 +191 +194 +194 +197 +196 +199 +198 +198 +200 +201 +200 +200 +200 +202 +202 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +197 +197 +194 +194 +195 +190 +190 +188 +188 +184 +184 +185 +182 +182 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +130 +129 +129 +130 +129 +125 +125 +119 +120 +120 +115 +115 +110 +109 +106 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +55 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +58 +58 +64 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +116 +115 +120 +119 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +168 +173 +172 +172 +175 +175 +178 +179 +178 +182 +183 +184 +185 +184 +188 +189 +190 +190 +195 +194 +194 +196 +196 +198 +199 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +201 +198 +198 +200 +196 +196 +194 +194 +190 +190 +191 +188 +188 +185 +184 +184 +183 +182 +183 +183 +183 +179 +178 +175 +175 +175 +173 +173 +168 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +123 +120 +119 +116 +115 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +69 +68 +64 +64 +59 +58 +58 +55 +54 +51 +50 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +50 +50 +55 +55 +58 +58 +59 +64 +64 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +120 +120 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +182 +183 +184 +184 +188 +188 +188 +190 +190 +195 +194 +195 +196 +197 +198 +198 +198 +200 +201 +200 +200 +201 +202 +202 +204 +204 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +198 +197 +196 +196 +194 +194 +191 +191 +190 +188 +188 +185 +184 +184 +183 +183 +179 +178 +177 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +137 +133 +133 +129 +130 +125 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +89 +86 +86 +82 +82 +82 +76 +77 +72 +72 +72 +69 +69 +64 +65 +65 +59 +58 +55 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +15 +16 +17 +17 +17 +19 +19 +19 +19 +19 +20 +21 +25 +25 +25 +27 +26 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +51 +50 +51 +54 +54 +59 +59 +59 +64 +64 +68 +68 +71 +73 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +115 +120 +120 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +178 +179 +183 +183 +185 +184 +185 +188 +188 +191 +191 +191 +194 +194 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +204 +204 +204 +205 +204 +202 +202 +200 +200 +200 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +194 +190 +190 +190 +188 +189 +184 +185 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +119 +116 +115 +116 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +26 +31 +31 +33 +33 +33 +37 +37 +37 +37 +36 +41 +41 +43 +43 +43 +47 +46 +50 +50 +53 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +104 +105 +106 +109 +109 +115 +116 +115 +119 +119 +125 +125 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +158 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +179 +179 +183 +183 +184 +185 +184 +189 +189 +191 +191 +194 +194 +194 +196 +196 +198 +199 +198 +200 +200 +201 +200 +200 +200 +200 +202 +202 +203 +204 +205 +205 +205 +205 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +201 +198 +198 +197 +196 +197 +194 +194 +190 +190 +190 +189 +189 +189 +188 +189 +184 +185 +182 +183 +183 +179 +178 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +65 +64 +58 +58 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +36 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +55 +55 +58 +59 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +116 +119 +119 +125 +125 +126 +129 +129 +133 +134 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +171 +173 +173 +175 +175 +178 +179 +182 +183 +183 +185 +185 +188 +188 +189 +190 +190 +194 +195 +194 +197 +196 +199 +198 +198 +201 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +200 +200 +201 +201 +198 +198 +198 +197 +197 +196 +197 +197 +194 +195 +190 +190 +191 +188 +189 +184 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +144 +139 +139 +140 +133 +133 +129 +129 +130 +126 +126 +120 +119 +120 +115 +116 +110 +109 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +55 +54 +51 +50 +51 +46 +46 +43 +42 +41 +41 +41 +37 +37 +33 +34 +33 +31 +30 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +30 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +46 +47 +51 +51 +50 +55 +54 +58 +58 +59 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +89 +96 +96 +100 +99 +100 +106 +106 +110 +110 +109 +116 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +160 +161 +165 +165 +169 +169 +173 +172 +173 +175 +174 +179 +178 +178 +182 +183 +184 +184 +185 +188 +188 +191 +190 +191 +194 +194 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +205 +205 +205 +204 +204 +205 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +201 +200 +200 +200 +201 +200 +200 +199 +199 +198 +196 +197 +195 +195 +193 +191 +191 +189 +189 +184 +184 +185 +183 +183 +178 +179 +178 +175 +174 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +140 +139 +138 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +120 +119 +115 +115 +109 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +69 +64 +64 +58 +59 +55 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +16 +15 +15 +15 +15 +15 +15 +15 +15 +14 +13 +12 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +20 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +50 +51 +51 +55 +55 +59 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +99 +106 +106 +110 +110 +109 +115 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +188 +188 +189 +191 +190 +194 +195 +195 +196 +196 +196 +197 +196 +198 +198 +200 +200 +200 +201 +202 +202 +203 +205 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +204 +205 +204 +204 +203 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +197 +196 +195 +195 +191 +190 +191 +188 +189 +185 +184 +184 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +120 +120 +115 +116 +110 +109 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +58 +54 +54 +50 +50 +50 +47 +46 +43 +43 +43 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +36 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +54 +59 +59 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +120 +125 +126 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +185 +184 +188 +188 +189 +191 +191 +194 +194 +194 +196 +197 +198 +198 +199 +200 +201 +201 +200 +202 +202 +202 +204 +204 +204 +205 +204 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +200 +199 +198 +199 +197 +196 +194 +194 +194 +190 +191 +188 +188 +184 +185 +185 +183 +183 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +134 +129 +129 +126 +126 +125 +120 +119 +115 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +64 +58 +58 +55 +54 +55 +50 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +50 +51 +55 +55 +59 +59 +65 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +115 +115 +120 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +148 +147 +151 +151 +151 +157 +157 +161 +161 +165 +164 +165 +169 +169 +173 +172 +173 +175 +175 +175 +174 +174 +179 +179 +183 +183 +183 +184 +184 +188 +188 +189 +190 +190 +195 +194 +196 +196 +196 +198 +198 +200 +201 +200 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +198 +196 +196 +197 +194 +194 +190 +191 +190 +188 +189 +185 +184 +184 +183 +183 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +164 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +126 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +75 +68 +68 +64 +64 +58 +59 +58 +54 +55 +51 +50 +50 +47 +47 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +12 +15 +15 +17 +17 +19 +19 +19 +21 +20 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +46 +50 +50 +54 +55 +55 +59 +58 +64 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +115 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +156 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +180 +182 +183 +184 +185 +188 +188 +188 +191 +191 +194 +195 +194 +197 +197 +196 +197 +196 +198 +198 +201 +201 +201 +200 +200 +203 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +199 +198 +196 +196 +195 +195 +194 +191 +191 +189 +188 +189 +185 +184 +183 +182 +182 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +126 +125 +126 +119 +120 +116 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +73 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +39 +37 +37 +33 +33 +31 +31 +30 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +47 +46 +51 +51 +51 +51 +51 +55 +54 +59 +58 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +120 +120 +126 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +178 +183 +183 +185 +184 +184 +189 +188 +189 +189 +188 +190 +190 +195 +194 +195 +197 +197 +198 +198 +200 +201 +201 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +204 +204 +205 +204 +204 +202 +202 +202 +201 +201 +200 +200 +200 +198 +198 +197 +197 +197 +195 +195 +190 +190 +191 +189 +189 +184 +185 +183 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +144 +143 +140 +139 +139 +133 +133 +129 +130 +130 +125 +125 +126 +125 +126 +120 +120 +116 +115 +116 +110 +110 +105 +105 +106 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +59 +59 +59 +55 +54 +51 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +12 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +32 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +50 +51 +55 +55 +59 +58 +65 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +99 +100 +106 +106 +110 +110 +116 +115 +116 +120 +119 +125 +125 +125 +129 +129 +130 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +173 +173 +173 +175 +175 +179 +179 +178 +183 +182 +184 +185 +185 +188 +189 +191 +190 +194 +195 +195 +196 +197 +199 +198 +198 +200 +201 +200 +201 +200 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +201 +200 +200 +200 +198 +199 +197 +196 +197 +195 +195 +190 +190 +190 +189 +188 +185 +184 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +120 +115 +116 +116 +110 +109 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +73 +72 +68 +68 +68 +65 +64 +65 +65 +64 +58 +58 +58 +59 +59 +54 +55 +50 +50 +51 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +50 +54 +55 +55 +59 +59 +65 +64 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +99 +106 +106 +109 +110 +110 +116 +115 +119 +119 +120 +125 +125 +130 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +170 +173 +173 +175 +174 +175 +178 +178 +183 +183 +182 +185 +185 +188 +188 +189 +191 +190 +195 +195 +195 +196 +196 +198 +199 +200 +200 +201 +200 +201 +202 +202 +202 +204 +205 +205 +204 +204 +207 +207 +206 +206 +206 +206 +207 +207 +206 +207 +206 +207 +207 +206 +204 +204 +205 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +199 +197 +196 +196 +194 +194 +190 +190 +191 +188 +189 +185 +185 +183 +182 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +129 +130 +126 +125 +125 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +77 +72 +72 +68 +68 +69 +65 +65 +58 +59 +55 +54 +54 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +20 +21 +19 +19 +19 +16 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +46 +51 +51 +51 +54 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +72 +77 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +120 +120 +125 +125 +125 +125 +125 +129 +129 +133 +133 +134 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +179 +182 +183 +185 +185 +188 +188 +188 +191 +191 +194 +195 +194 +196 +196 +199 +198 +199 +200 +200 +201 +200 +200 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +201 +201 +198 +199 +197 +197 +196 +194 +195 +190 +190 +190 +188 +189 +185 +185 +184 +183 +183 +179 +178 +179 +175 +175 +173 +173 +171 +169 +169 +164 +164 +161 +161 +161 +157 +158 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +128 +125 +125 +120 +119 +116 +115 +116 +110 +109 +106 +106 +105 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +80 +76 +76 +72 +73 +69 +68 +68 +64 +64 +59 +58 +59 +55 +54 +50 +51 +51 +47 +46 +43 +43 +43 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +36 +37 +38 +41 +41 +43 +43 +48 +47 +47 +51 +51 +55 +54 +54 +58 +59 +59 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +77 +82 +81 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +105 +106 +105 +110 +109 +116 +115 +116 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +168 +172 +173 +174 +175 +175 +179 +179 +182 +183 +183 +185 +184 +189 +188 +188 +190 +190 +195 +195 +194 +197 +196 +199 +199 +198 +201 +200 +201 +200 +203 +202 +203 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +203 +202 +202 +201 +201 +201 +201 +200 +198 +198 +197 +196 +196 +195 +195 +191 +191 +190 +188 +188 +185 +185 +185 +182 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +140 +139 +133 +133 +133 +129 +129 +126 +125 +125 +120 +119 +120 +119 +120 +116 +115 +110 +109 +110 +106 +106 +100 +100 +98 +96 +95 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +55 +55 +51 +50 +47 +47 +46 +43 +42 +41 +41 +41 +37 +36 +33 +33 +33 +30 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +46 +47 +50 +51 +54 +55 +56 +59 +59 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +105 +106 +105 +110 +110 +116 +115 +116 +120 +119 +126 +126 +126 +130 +130 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +178 +182 +182 +184 +185 +185 +188 +189 +190 +191 +195 +194 +194 +197 +197 +198 +198 +199 +200 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +205 +206 +207 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +201 +200 +201 +199 +198 +199 +196 +196 +195 +195 +191 +191 +191 +189 +188 +184 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +144 +143 +143 +139 +139 +139 +139 +133 +134 +130 +129 +129 +125 +125 +120 +119 +117 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +69 +64 +64 +65 +59 +59 +54 +54 +55 +51 +51 +47 +46 +47 +43 +43 +40 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +15 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +46 +47 +51 +51 +54 +54 +54 +59 +58 +65 +64 +65 +69 +68 +68 +69 +68 +72 +73 +76 +76 +77 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +119 +125 +125 +130 +129 +130 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +160 +165 +165 +170 +169 +169 +173 +173 +174 +175 +176 +179 +179 +183 +183 +185 +185 +184 +188 +189 +190 +190 +190 +194 +195 +196 +196 +197 +198 +199 +200 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +207 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +201 +199 +199 +196 +197 +197 +194 +194 +195 +194 +194 +190 +190 +188 +189 +189 +184 +184 +183 +183 +183 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +130 +129 +129 +126 +126 +120 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +73 +68 +68 +68 +64 +65 +59 +58 +59 +54 +54 +50 +51 +50 +47 +47 +43 +43 +41 +41 +41 +37 +37 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +20 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +46 +50 +50 +51 +55 +55 +59 +59 +62 +65 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +120 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +174 +179 +179 +182 +182 +182 +185 +185 +189 +188 +189 +190 +190 +195 +195 +197 +196 +197 +199 +199 +200 +200 +200 +200 +200 +203 +202 +202 +205 +204 +204 +204 +204 +207 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +197 +196 +197 +194 +194 +190 +191 +191 +189 +188 +185 +185 +184 +183 +183 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +130 +130 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +55 +55 +50 +50 +47 +46 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +30 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +45 +47 +47 +50 +50 +55 +55 +54 +58 +59 +64 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +144 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +168 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +184 +188 +189 +188 +190 +190 +194 +195 +195 +197 +196 +198 +198 +198 +201 +201 +200 +200 +200 +202 +203 +205 +204 +205 +204 +205 +207 +207 +206 +207 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +201 +201 +198 +199 +199 +196 +196 +194 +194 +194 +190 +190 +190 +191 +191 +188 +188 +184 +185 +185 +182 +183 +179 +178 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +130 +130 +125 +125 +120 +120 +119 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +69 +68 +64 +65 +59 +58 +58 +55 +54 +50 +50 +50 +47 +47 +42 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +16 +17 +17 +16 +15 +15 +15 +16 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +20 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +58 +58 +65 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +126 +126 +126 +129 +129 +134 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +172 +175 +175 +178 +179 +179 +183 +182 +185 +185 +184 +188 +189 +190 +191 +190 +194 +195 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +205 +204 +207 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +207 +207 +206 +206 +204 +205 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +200 +200 +201 +199 +198 +197 +197 +196 +195 +194 +191 +191 +189 +188 +189 +184 +185 +182 +183 +182 +178 +179 +174 +175 +175 +172 +172 +169 +169 +169 +165 +164 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +22 +21 +22 +19 +19 +18 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +20 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +47 +50 +50 +54 +54 +58 +58 +58 +64 +64 +69 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +109 +115 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +185 +189 +189 +189 +191 +190 +195 +194 +196 +196 +196 +199 +199 +200 +200 +201 +201 +200 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +207 +206 +207 +206 +206 +206 +207 +207 +207 +207 +207 +206 +206 +206 +206 +204 +204 +204 +205 +204 +204 +204 +203 +202 +202 +201 +200 +200 +200 +201 +199 +199 +196 +196 +194 +195 +194 +190 +190 +189 +189 +189 +185 +184 +183 +183 +182 +178 +179 +175 +174 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +115 +116 +116 +110 +110 +105 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +69 +68 +64 +64 +58 +58 +58 +55 +54 +51 +51 +50 +47 +47 +43 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +24 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +54 +58 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +184 +184 +185 +189 +188 +190 +191 +191 +195 +194 +195 +194 +194 +197 +196 +198 +199 +199 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +198 +198 +196 +196 +194 +195 +194 +191 +191 +188 +188 +189 +184 +185 +183 +183 +179 +178 +179 +175 +175 +173 +174 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +120 +120 +115 +115 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +68 +68 +69 +64 +64 +59 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +55 +54 +59 +59 +58 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +126 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +184 +185 +185 +188 +189 +190 +191 +191 +194 +195 +197 +197 +196 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +201 +200 +200 +199 +198 +196 +197 +197 +195 +195 +190 +190 +188 +189 +188 +184 +185 +182 +183 +183 +179 +179 +175 +175 +175 +172 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +152 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +130 +130 +129 +125 +126 +119 +119 +119 +116 +116 +109 +110 +110 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +55 +50 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +24 +22 +21 +20 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +22 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +42 +43 +47 +47 +50 +51 +54 +54 +54 +59 +58 +65 +64 +64 +69 +68 +72 +73 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +120 +120 +126 +126 +126 +129 +130 +133 +133 +133 +140 +140 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +186 +189 +189 +191 +190 +194 +194 +194 +196 +196 +198 +199 +199 +200 +201 +201 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +203 +201 +200 +200 +200 +198 +198 +199 +197 +196 +194 +194 +195 +191 +190 +188 +188 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +144 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +73 +68 +68 +64 +64 +65 +58 +58 +55 +55 +55 +51 +50 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +35 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +42 +43 +43 +47 +47 +51 +51 +50 +54 +54 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +119 +125 +125 +130 +129 +130 +133 +133 +139 +140 +143 +144 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +184 +185 +184 +189 +188 +190 +190 +190 +194 +194 +194 +194 +195 +197 +196 +198 +198 +199 +201 +200 +200 +201 +201 +202 +203 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +201 +200 +201 +200 +201 +198 +199 +197 +196 +196 +195 +195 +191 +191 +190 +189 +188 +184 +184 +185 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +143 +139 +140 +134 +134 +130 +129 +129 +125 +125 +120 +120 +120 +115 +116 +110 +110 +109 +105 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +64 +64 +65 +58 +59 +54 +55 +54 +51 +50 +47 +47 +45 +43 +43 +41 +41 +36 +37 +36 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +55 +59 +58 +64 +64 +64 +69 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +109 +115 +116 +116 +120 +119 +126 +126 +130 +129 +130 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +183 +183 +182 +184 +184 +189 +188 +189 +190 +190 +194 +194 +196 +196 +197 +198 +199 +200 +201 +200 +200 +200 +202 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +207 +207 +206 +207 +207 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +202 +200 +200 +200 +201 +201 +198 +198 +196 +197 +196 +194 +194 +190 +190 +188 +188 +188 +185 +184 +182 +183 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +134 +133 +134 +133 +129 +129 +126 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +105 +99 +100 +99 +96 +96 +90 +90 +90 +86 +86 +86 +86 +85 +82 +82 +76 +77 +76 +72 +72 +68 +68 +67 +64 +64 +58 +58 +54 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +41 +41 +43 +43 +43 +47 +46 +51 +50 +55 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +109 +110 +116 +116 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +168 +173 +172 +175 +175 +175 +179 +179 +183 +183 +184 +184 +185 +189 +189 +190 +190 +191 +194 +194 +197 +196 +196 +198 +198 +201 +200 +200 +201 +201 +202 +202 +202 +205 +204 +205 +204 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +203 +203 +200 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +190 +190 +190 +190 +189 +189 +185 +185 +184 +183 +183 +178 +179 +178 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +141 +133 +133 +130 +129 +126 +126 +125 +120 +119 +115 +115 +116 +110 +110 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +65 +65 +64 +65 +64 +59 +58 +55 +55 +55 +50 +50 +47 +47 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +20 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +26 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +42 +41 +43 +43 +43 +46 +47 +50 +51 +51 +54 +55 +59 +58 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +99 +100 +106 +106 +106 +110 +109 +116 +115 +117 +119 +120 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +185 +184 +184 +188 +189 +190 +190 +191 +194 +194 +196 +197 +198 +198 +199 +200 +201 +200 +201 +200 +203 +202 +204 +204 +204 +205 +205 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +201 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +191 +188 +189 +184 +185 +185 +183 +182 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +130 +125 +126 +119 +119 +120 +116 +116 +110 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +60 +58 +58 +55 +55 +51 +51 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +73 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +126 +126 +130 +130 +130 +129 +130 +133 +133 +140 +139 +139 +143 +143 +147 +147 +149 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +174 +179 +178 +183 +182 +183 +184 +185 +188 +188 +190 +191 +190 +195 +196 +196 +196 +197 +198 +198 +198 +198 +198 +201 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +201 +201 +201 +199 +198 +196 +197 +196 +194 +194 +191 +190 +190 +188 +189 +185 +185 +185 +183 +183 +178 +179 +178 +175 +174 +173 +172 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +130 +130 +130 +126 +125 +119 +120 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +58 +55 +55 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +46 +51 +51 +55 +55 +55 +58 +59 +65 +65 +64 +69 +68 +72 +72 +72 +76 +76 +83 +82 +82 +86 +85 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +116 +119 +119 +120 +125 +125 +130 +129 +131 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +174 +178 +179 +179 +183 +183 +185 +185 +184 +189 +188 +190 +191 +191 +195 +194 +197 +196 +196 +199 +198 +200 +200 +201 +201 +201 +203 +202 +204 +204 +204 +205 +205 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +201 +200 +200 +200 +200 +198 +199 +198 +196 +196 +194 +194 +191 +190 +189 +189 +189 +184 +184 +183 +182 +183 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +134 +129 +129 +129 +126 +125 +119 +120 +119 +115 +116 +116 +115 +115 +110 +109 +105 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +69 +64 +65 +59 +58 +59 +55 +54 +51 +50 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +34 +34 +33 +37 +37 +41 +41 +41 +43 +42 +47 +46 +47 +51 +51 +54 +54 +54 +59 +58 +64 +64 +66 +69 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +112 +115 +115 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +174 +175 +175 +175 +175 +179 +179 +183 +183 +182 +185 +185 +189 +189 +188 +191 +190 +194 +194 +196 +196 +196 +199 +198 +200 +200 +200 +200 +201 +203 +202 +202 +204 +205 +205 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +202 +200 +200 +200 +201 +201 +198 +199 +197 +197 +197 +194 +195 +190 +190 +188 +189 +189 +185 +185 +183 +183 +183 +179 +179 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +134 +133 +129 +129 +130 +125 +125 +120 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +73 +72 +68 +68 +65 +64 +64 +58 +59 +54 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +37 +37 +41 +41 +40 +42 +43 +46 +47 +46 +51 +50 +55 +54 +59 +59 +59 +64 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +77 +82 +82 +83 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +126 +125 +125 +129 +130 +133 +133 +134 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +185 +185 +189 +189 +188 +190 +190 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +201 +201 +200 +202 +202 +204 +204 +205 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +201 +200 +200 +198 +199 +196 +196 +196 +194 +195 +190 +190 +190 +188 +188 +185 +184 +184 +182 +182 +179 +178 +178 +175 +174 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +126 +126 +126 +119 +120 +115 +116 +116 +110 +110 +106 +105 +106 +100 +101 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +55 +54 +55 +50 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +16 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +55 +54 +54 +55 +55 +59 +58 +65 +64 +65 +68 +68 +72 +72 +74 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +125 +125 +127 +130 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +184 +184 +189 +188 +188 +190 +190 +194 +194 +194 +196 +197 +199 +198 +199 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +205 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +198 +198 +199 +198 +198 +197 +196 +195 +195 +194 +191 +191 +189 +188 +187 +185 +185 +183 +183 +178 +179 +179 +174 +175 +173 +173 +173 +168 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +120 +120 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +59 +58 +59 +54 +54 +51 +51 +47 +46 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +30 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +40 +40 +41 +42 +43 +47 +47 +47 +51 +51 +54 +55 +58 +58 +58 +65 +65 +68 +68 +68 +72 +73 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +104 +105 +106 +109 +110 +115 +116 +116 +119 +120 +126 +125 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +183 +185 +184 +189 +189 +191 +191 +190 +194 +195 +196 +196 +197 +198 +198 +200 +200 +200 +200 +201 +203 +202 +203 +204 +205 +204 +205 +205 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +205 +204 +205 +204 +205 +202 +202 +200 +200 +200 +201 +201 +198 +199 +196 +196 +196 +194 +195 +190 +191 +190 +189 +188 +189 +188 +188 +185 +184 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +129 +125 +126 +125 +120 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +89 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +55 +54 +50 +51 +46 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +55 +55 +59 +58 +64 +64 +65 +69 +69 +72 +72 +75 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +185 +188 +188 +189 +190 +191 +195 +194 +194 +197 +197 +198 +198 +199 +201 +200 +200 +201 +202 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +203 +202 +201 +200 +200 +201 +201 +199 +198 +199 +199 +198 +196 +196 +195 +194 +195 +190 +191 +189 +189 +189 +184 +185 +182 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +126 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +55 +51 +50 +47 +46 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +22 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +109 +115 +116 +115 +119 +120 +126 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +168 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +189 +189 +191 +190 +191 +194 +195 +196 +197 +198 +198 +198 +201 +200 +200 +200 +200 +202 +202 +204 +204 +204 +205 +205 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +203 +203 +202 +202 +200 +201 +200 +200 +200 +198 +199 +196 +196 +197 +194 +195 +191 +190 +188 +189 +189 +184 +184 +182 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +152 +151 +147 +147 +147 +142 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +116 +116 +110 +110 +106 +106 +106 +99 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +59 +58 +58 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +20 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +12 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +32 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +50 +50 +54 +54 +59 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +101 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +174 +174 +179 +179 +183 +182 +183 +185 +185 +189 +189 +191 +191 +191 +195 +195 +196 +197 +196 +198 +198 +198 +198 +199 +200 +200 +200 +200 +201 +202 +204 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +203 +202 +201 +200 +200 +200 +201 +198 +199 +198 +196 +197 +194 +195 +195 +190 +191 +189 +189 +188 +185 +185 +183 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +126 +125 +125 +120 +119 +115 +116 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +55 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +42 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +59 +58 +59 +65 +64 +68 +68 +68 +72 +73 +76 +77 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +119 +120 +120 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +178 +179 +182 +183 +184 +184 +184 +188 +189 +188 +188 +189 +191 +190 +194 +195 +194 +196 +196 +198 +198 +199 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +203 +201 +201 +201 +200 +200 +198 +198 +199 +197 +197 +194 +194 +195 +191 +191 +189 +189 +184 +185 +185 +183 +182 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +156 +157 +151 +151 +147 +147 +144 +143 +143 +139 +140 +133 +133 +134 +129 +129 +125 +125 +126 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +64 +58 +58 +54 +55 +55 +51 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +34 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +22 +25 +25 +25 +26 +27 +31 +32 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +59 +64 +65 +65 +68 +68 +73 +72 +72 +76 +76 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +109 +110 +116 +115 +119 +119 +120 +125 +125 +129 +130 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +162 +161 +161 +165 +165 +169 +169 +169 +173 +172 +173 +173 +173 +175 +176 +179 +179 +179 +182 +182 +184 +185 +185 +189 +189 +190 +190 +194 +195 +195 +196 +197 +198 +199 +198 +200 +201 +201 +201 +200 +200 +200 +202 +203 +203 +204 +204 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +205 +202 +203 +203 +201 +201 +200 +200 +198 +198 +199 +197 +196 +195 +195 +195 +191 +191 +189 +189 +188 +184 +185 +182 +182 +183 +178 +178 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +54 +55 +51 +51 +46 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +32 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +54 +54 +58 +58 +64 +65 +65 +69 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +95 +96 +100 +100 +106 +105 +106 +110 +110 +110 +110 +110 +116 +115 +119 +119 +119 +125 +125 +129 +129 +130 +134 +133 +139 +139 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +170 +173 +173 +175 +175 +179 +179 +179 +183 +182 +183 +183 +182 +185 +185 +185 +185 +185 +188 +188 +191 +190 +191 +194 +195 +197 +197 +198 +198 +198 +201 +200 +200 +200 +200 +203 +203 +204 +204 +204 +205 +204 +207 +206 +206 +206 +206 +206 +207 +207 +207 +206 +207 +206 +206 +207 +206 +204 +204 +205 +204 +204 +205 +204 +203 +202 +202 +200 +200 +201 +200 +200 +199 +199 +197 +196 +196 +194 +194 +190 +190 +188 +189 +188 +185 +184 +182 +183 +182 +179 +178 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +115 +115 +110 +110 +110 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +83 +82 +82 +82 +76 +77 +72 +72 +72 +69 +68 +64 +64 +61 +58 +59 +55 +55 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +16 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +20 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +59 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +109 +115 +115 +120 +119 +120 +126 +125 +130 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +178 +179 +178 +182 +182 +184 +185 +188 +189 +189 +190 +190 +194 +195 +195 +197 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +207 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +199 +197 +196 +196 +195 +194 +190 +191 +190 +189 +189 +185 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +132 +133 +129 +130 +126 +126 +126 +119 +119 +116 +116 +110 +109 +110 +106 +105 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +74 +72 +72 +68 +69 +64 +65 +64 +58 +58 +55 +54 +55 +51 +51 +50 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +55 +58 +59 +58 +59 +59 +64 +64 +68 +68 +68 +73 +72 +77 +76 +77 +82 +83 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +105 +110 +110 +115 +116 +116 +119 +120 +125 +125 +127 +130 +130 +133 +133 +139 +139 +139 +143 +144 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +174 +178 +179 +179 +182 +183 +183 +183 +183 +185 +185 +189 +188 +189 +191 +191 +195 +195 +195 +197 +197 +199 +199 +200 +201 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +205 +205 +205 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +196 +194 +194 +191 +190 +190 +188 +189 +184 +185 +183 +182 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +133 +130 +129 +130 +125 +125 +125 +125 +126 +120 +119 +116 +116 +115 +110 +110 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +81 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +55 +55 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +55 +55 +58 +58 +64 +64 +69 +68 +68 +73 +72 +76 +76 +76 +82 +82 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +115 +116 +120 +120 +119 +125 +125 +125 +129 +130 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +188 +189 +189 +190 +190 +194 +194 +194 +197 +196 +199 +199 +198 +200 +200 +201 +201 +200 +202 +203 +204 +205 +205 +205 +205 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +204 +204 +205 +204 +202 +203 +200 +200 +201 +201 +200 +199 +198 +197 +197 +197 +195 +194 +190 +191 +191 +188 +188 +185 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +127 +125 +125 +119 +120 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +85 +82 +82 +79 +76 +77 +72 +72 +68 +69 +68 +64 +64 +59 +58 +59 +54 +54 +51 +50 +50 +47 +46 +43 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +30 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +12 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +55 +55 +58 +59 +59 +58 +59 +65 +65 +68 +68 +68 +72 +72 +76 +76 +79 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +125 +125 +127 +130 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +178 +183 +182 +185 +185 +185 +189 +191 +191 +190 +190 +194 +194 +194 +195 +194 +197 +197 +199 +199 +200 +201 +201 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +205 +204 +204 +205 +204 +202 +202 +202 +201 +200 +201 +201 +200 +198 +198 +196 +196 +197 +194 +195 +190 +190 +191 +189 +189 +185 +185 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +148 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +130 +126 +126 +119 +120 +120 +115 +115 +109 +110 +107 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +69 +64 +64 +58 +58 +54 +54 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +20 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +12 +15 +15 +17 +16 +17 +19 +19 +21 +21 +26 +25 +24 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +36 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +97 +100 +100 +106 +106 +106 +109 +110 +115 +115 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +133 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +158 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +184 +184 +189 +188 +189 +190 +190 +194 +195 +194 +196 +197 +198 +198 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +205 +204 +204 +204 +203 +202 +200 +201 +201 +200 +200 +199 +199 +197 +196 +196 +194 +195 +190 +191 +190 +189 +189 +189 +189 +188 +185 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +158 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +132 +130 +129 +125 +126 +119 +120 +119 +115 +115 +109 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +59 +54 +55 +51 +50 +50 +46 +46 +42 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +20 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +40 +41 +43 +43 +43 +47 +47 +50 +51 +51 +54 +54 +54 +54 +55 +58 +58 +64 +64 +64 +69 +68 +72 +72 +74 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +116 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +178 +183 +183 +182 +185 +185 +189 +189 +189 +190 +190 +194 +195 +194 +196 +197 +198 +198 +199 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +205 +206 +206 +206 +207 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +197 +196 +194 +194 +191 +190 +191 +189 +189 +185 +185 +183 +182 +183 +178 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +130 +129 +129 +129 +130 +126 +125 +119 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +50 +50 +47 +46 +46 +43 +43 +41 +41 +41 +36 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +38 +41 +41 +43 +43 +43 +47 +46 +51 +51 +54 +55 +54 +58 +59 +64 +64 +64 +68 +69 +72 +73 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +105 +106 +106 +109 +110 +116 +115 +115 +120 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +165 +169 +169 +173 +173 +173 +174 +174 +179 +179 +178 +182 +183 +185 +184 +185 +188 +189 +191 +191 +195 +194 +194 +196 +197 +198 +198 +198 +200 +200 +200 +200 +200 +202 +203 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +200 +201 +199 +198 +199 +196 +197 +194 +195 +194 +190 +191 +189 +188 +188 +184 +184 +184 +185 +184 +183 +182 +179 +179 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +130 +130 +125 +125 +120 +120 +119 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +59 +55 +55 +51 +50 +51 +47 +47 +42 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +36 +40 +40 +43 +42 +47 +46 +47 +51 +50 +54 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +109 +116 +116 +116 +120 +119 +125 +125 +126 +130 +129 +133 +133 +140 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +156 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +183 +183 +183 +185 +185 +188 +188 +189 +191 +191 +194 +194 +195 +197 +197 +198 +198 +199 +200 +201 +200 +200 +201 +202 +202 +205 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +201 +200 +199 +198 +198 +196 +197 +197 +197 +196 +195 +195 +190 +190 +191 +188 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +126 +119 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +65 +59 +58 +54 +55 +55 +51 +51 +46 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +15 +15 +16 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +36 +37 +37 +41 +41 +43 +42 +43 +47 +46 +51 +51 +51 +54 +54 +59 +59 +64 +65 +65 +68 +68 +73 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +116 +116 +115 +119 +119 +125 +126 +126 +130 +129 +133 +134 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +184 +189 +189 +190 +191 +191 +195 +194 +197 +197 +197 +199 +199 +200 +201 +201 +200 +200 +200 +201 +201 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +207 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +204 +205 +202 +202 +203 +200 +200 +200 +200 +199 +198 +199 +197 +197 +194 +194 +194 +190 +191 +189 +188 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +134 +133 +129 +129 +129 +125 +125 +119 +120 +116 +116 +115 +109 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +73 +72 +68 +68 +65 +64 +65 +59 +58 +55 +55 +55 +50 +50 +47 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +26 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +54 +54 +58 +59 +58 +64 +64 +68 +68 +69 +72 +73 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +119 +125 +125 +129 +129 +129 +133 +134 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +160 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +185 +184 +184 +189 +188 +190 +191 +191 +194 +194 +195 +195 +194 +197 +196 +199 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +200 +201 +201 +200 +200 +199 +199 +199 +197 +196 +195 +194 +194 +190 +190 +188 +188 +189 +184 +184 +182 +183 +178 +179 +179 +174 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +125 +126 +120 +119 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +77 +72 +72 +72 +68 +68 +65 +65 +64 +59 +59 +54 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +40 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +14 +13 +12 +12 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +105 +110 +110 +115 +116 +116 +120 +119 +125 +125 +130 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +185 +184 +185 +185 +185 +189 +188 +191 +191 +190 +194 +194 +196 +196 +197 +199 +199 +200 +200 +200 +201 +200 +202 +203 +205 +204 +204 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +207 +204 +204 +204 +205 +204 +202 +202 +202 +201 +201 +201 +200 +201 +198 +199 +197 +197 +197 +194 +194 +191 +190 +189 +189 +189 +185 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +130 +125 +125 +120 +120 +120 +116 +115 +110 +109 +110 +106 +106 +100 +100 +96 +96 +95 +90 +91 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +59 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +22 +21 +20 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +77 +82 +83 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +116 +116 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +184 +189 +188 +190 +190 +192 +194 +195 +196 +196 +198 +199 +198 +200 +200 +200 +201 +201 +202 +202 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +203 +201 +200 +200 +200 +201 +199 +199 +196 +197 +194 +194 +195 +190 +190 +188 +189 +188 +184 +184 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +125 +125 +120 +119 +119 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +55 +54 +55 +50 +51 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +16 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +54 +54 +54 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +106 +106 +106 +109 +110 +116 +115 +116 +119 +120 +125 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +156 +157 +157 +161 +160 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +189 +190 +190 +190 +194 +194 +196 +197 +196 +198 +198 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +203 +203 +200 +200 +201 +201 +201 +198 +198 +197 +196 +196 +194 +195 +190 +191 +190 +189 +189 +184 +185 +185 +182 +182 +179 +178 +179 +174 +175 +172 +173 +170 +169 +169 +166 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +120 +119 +119 +116 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +69 +69 +68 +64 +64 +58 +58 +59 +54 +54 +54 +54 +55 +51 +51 +46 +46 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +22 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +46 +50 +51 +55 +54 +55 +58 +58 +64 +65 +64 +68 +69 +72 +72 +72 +76 +77 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +109 +116 +115 +116 +120 +120 +125 +125 +126 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +179 +178 +183 +183 +185 +184 +184 +189 +189 +189 +189 +189 +190 +191 +194 +195 +195 +197 +197 +198 +199 +199 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +207 +207 +206 +207 +206 +207 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +200 +198 +198 +197 +196 +196 +195 +194 +190 +191 +190 +189 +189 +185 +185 +182 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +130 +130 +126 +125 +119 +119 +119 +116 +115 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +83 +76 +76 +76 +72 +72 +72 +73 +72 +68 +68 +64 +64 +65 +58 +58 +54 +55 +52 +51 +50 +46 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +26 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +51 +51 +54 +54 +55 +59 +59 +64 +65 +69 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +115 +120 +120 +120 +125 +125 +130 +129 +129 +134 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +152 +152 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +179 +179 +182 +183 +183 +185 +184 +188 +188 +189 +190 +190 +195 +195 +196 +196 +196 +198 +199 +200 +200 +200 +200 +200 +203 +203 +202 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +200 +200 +197 +199 +196 +197 +195 +194 +195 +190 +191 +189 +188 +188 +184 +185 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +144 +140 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +119 +120 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +77 +77 +72 +72 +75 +68 +68 +64 +64 +58 +58 +59 +54 +55 +50 +50 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +36 +37 +41 +41 +41 +43 +43 +47 +46 +52 +51 +50 +54 +55 +58 +59 +59 +64 +64 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +110 +109 +110 +116 +116 +120 +119 +120 +125 +125 +129 +130 +130 +133 +133 +140 +140 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +178 +179 +182 +182 +183 +185 +184 +185 +184 +185 +189 +189 +191 +190 +190 +195 +194 +196 +196 +196 +196 +196 +198 +199 +200 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +200 +200 +201 +201 +201 +198 +198 +196 +196 +196 +194 +194 +190 +191 +191 +188 +189 +184 +185 +183 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +140 +140 +133 +133 +129 +129 +129 +126 +125 +125 +125 +125 +119 +119 +115 +116 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +83 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +56 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +55 +55 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +109 +115 +116 +116 +120 +119 +125 +125 +126 +129 +130 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +149 +151 +151 +157 +157 +161 +161 +160 +165 +165 +169 +168 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +183 +184 +185 +188 +189 +190 +190 +191 +195 +194 +196 +196 +196 +198 +198 +200 +200 +200 +201 +200 +202 +203 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +202 +201 +201 +200 +200 +200 +198 +199 +196 +196 +195 +194 +194 +190 +190 +188 +188 +189 +185 +184 +184 +185 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +130 +127 +125 +125 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +99 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +54 +55 +50 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +20 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +37 +41 +41 +43 +43 +48 +47 +46 +51 +51 +54 +54 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +75 +76 +82 +82 +83 +85 +86 +90 +90 +96 +96 +95 +100 +100 +105 +106 +106 +110 +110 +110 +110 +110 +116 +116 +120 +119 +119 +119 +119 +126 +125 +127 +129 +129 +133 +134 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +185 +188 +189 +188 +191 +190 +195 +195 +194 +196 +196 +199 +198 +199 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +202 +202 +202 +200 +201 +200 +200 +201 +198 +198 +199 +199 +199 +196 +197 +195 +194 +194 +191 +191 +188 +188 +188 +184 +185 +183 +183 +179 +179 +179 +175 +175 +174 +173 +173 +169 +169 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +126 +126 +125 +119 +120 +116 +116 +116 +110 +110 +106 +105 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +65 +65 +65 +58 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +50 +50 +55 +55 +58 +58 +59 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +89 +90 +90 +96 +96 +99 +100 +105 +106 +106 +110 +109 +115 +116 +116 +119 +119 +125 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +174 +175 +175 +175 +178 +178 +183 +183 +183 +184 +185 +189 +189 +191 +190 +190 +194 +194 +196 +196 +196 +198 +199 +201 +201 +201 +201 +201 +202 +202 +202 +204 +205 +204 +204 +205 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +201 +201 +200 +201 +200 +199 +199 +196 +197 +194 +194 +194 +191 +190 +189 +189 +189 +184 +184 +185 +184 +184 +183 +182 +178 +179 +178 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +129 +129 +126 +125 +125 +120 +120 +115 +116 +116 +110 +109 +106 +105 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +72 +73 +72 +68 +69 +64 +64 +65 +58 +58 +54 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +51 +55 +55 +58 +58 +58 +64 +64 +65 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +120 +120 +125 +125 +126 +130 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +182 +183 +183 +185 +185 +189 +189 +189 +191 +191 +195 +195 +194 +196 +196 +199 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +205 +205 +205 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +202 +203 +201 +201 +200 +200 +200 +199 +197 +197 +196 +196 +194 +194 +190 +190 +190 +188 +189 +185 +184 +185 +182 +183 +178 +178 +179 +175 +175 +173 +173 +168 +169 +168 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +134 +133 +133 +130 +130 +125 +126 +126 +119 +119 +115 +116 +115 +109 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +69 +68 +68 +68 +68 +64 +64 +58 +58 +58 +55 +54 +51 +51 +51 +46 +46 +43 +42 +41 +41 +41 +36 +37 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +16 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +51 +50 +54 +54 +54 +59 +58 +64 +64 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +119 +119 +119 +125 +126 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +170 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +184 +189 +189 +188 +190 +191 +194 +194 +194 +197 +196 +199 +199 +201 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +203 +202 +200 +200 +200 +200 +200 +200 +201 +199 +198 +199 +197 +197 +195 +195 +193 +191 +190 +188 +188 +184 +185 +185 +183 +182 +179 +178 +178 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +125 +126 +119 +119 +120 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +65 +58 +58 +55 +55 +55 +51 +50 +51 +51 +50 +47 +47 +43 +42 +43 +41 +41 +36 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +22 +20 +21 +19 +18 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +46 +51 +50 +55 +55 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +99 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +119 +125 +126 +129 +129 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +184 +189 +189 +191 +190 +190 +195 +194 +197 +196 +197 +199 +199 +200 +200 +201 +200 +201 +203 +202 +202 +204 +204 +204 +204 +205 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +205 +202 +202 +200 +201 +200 +200 +201 +199 +198 +196 +196 +196 +195 +194 +191 +191 +190 +188 +189 +189 +188 +188 +185 +185 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +134 +133 +129 +129 +125 +126 +125 +119 +120 +115 +116 +116 +110 +110 +106 +106 +106 +101 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +73 +72 +72 +68 +68 +65 +64 +64 +58 +58 +55 +54 +55 +50 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +16 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +36 +41 +41 +41 +42 +43 +47 +46 +47 +50 +50 +54 +55 +55 +58 +58 +64 +64 +64 +68 +68 +73 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +120 +126 +126 +130 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +146 +147 +151 +151 +157 +156 +157 +161 +161 +165 +164 +165 +169 +169 +173 +173 +175 +174 +175 +178 +179 +183 +182 +183 +185 +185 +189 +189 +189 +191 +190 +194 +194 +195 +196 +197 +198 +198 +199 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +201 +200 +200 +200 +200 +198 +199 +196 +197 +196 +194 +195 +190 +191 +189 +188 +189 +185 +184 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +115 +116 +109 +109 +109 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +59 +59 +59 +54 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +50 +54 +55 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +81 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +178 +179 +183 +182 +183 +184 +185 +188 +188 +188 +191 +190 +194 +195 +196 +196 +197 +198 +199 +200 +201 +200 +201 +201 +200 +200 +200 +203 +202 +204 +205 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +204 +204 +203 +202 +203 +200 +200 +200 +200 +198 +198 +199 +196 +197 +194 +194 +195 +190 +190 +188 +188 +188 +185 +185 +183 +182 +182 +178 +179 +175 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +130 +129 +125 +125 +120 +119 +116 +116 +116 +110 +110 +106 +106 +106 +99 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +55 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +18 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +58 +59 +64 +65 +68 +68 +69 +72 +72 +76 +77 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +116 +119 +120 +119 +125 +125 +130 +129 +129 +134 +133 +140 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +189 +191 +191 +190 +190 +191 +194 +195 +196 +197 +196 +199 +198 +200 +200 +201 +200 +200 +202 +202 +205 +205 +204 +205 +204 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +205 +204 +205 +205 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +198 +197 +196 +197 +194 +195 +191 +191 +191 +189 +188 +184 +184 +182 +183 +183 +178 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +120 +116 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +73 +69 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +16 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +51 +55 +54 +59 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +81 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +116 +115 +116 +119 +119 +125 +125 +126 +129 +130 +134 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +178 +179 +182 +183 +183 +185 +185 +189 +189 +189 +191 +191 +194 +195 +196 +197 +196 +198 +198 +200 +200 +200 +200 +201 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +198 +197 +196 +196 +195 +195 +190 +190 +191 +188 +189 +184 +184 +185 +183 +182 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +130 +125 +125 +125 +119 +120 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +16 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +46 +50 +50 +55 +54 +55 +58 +59 +64 +65 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +83 +86 +85 +90 +90 +97 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +115 +115 +119 +119 +125 +125 +126 +129 +130 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +180 +183 +183 +184 +184 +189 +189 +188 +191 +190 +195 +195 +195 +197 +196 +196 +197 +196 +199 +198 +200 +201 +200 +200 +200 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +204 +204 +205 +205 +205 +203 +202 +200 +201 +200 +200 +200 +198 +198 +198 +196 +197 +194 +194 +194 +190 +190 +189 +189 +189 +184 +185 +183 +183 +182 +179 +178 +175 +175 +173 +173 +173 +169 +169 +166 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +126 +125 +125 +120 +120 +116 +116 +115 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +31 +31 +32 +28 +27 +25 +25 +25 +21 +21 +21 +21 +20 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +40 +41 +43 +42 +47 +47 +47 +51 +51 +55 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +126 +125 +126 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +168 +170 +173 +172 +175 +175 +178 +178 +179 +183 +182 +185 +185 +185 +189 +189 +189 +189 +188 +191 +190 +194 +194 +195 +196 +196 +198 +198 +200 +200 +201 +200 +201 +202 +202 +203 +205 +205 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +205 +205 +205 +204 +204 +202 +203 +202 +200 +200 +201 +200 +200 +198 +198 +196 +197 +196 +194 +194 +190 +190 +191 +188 +189 +185 +184 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +140 +133 +133 +130 +129 +130 +125 +126 +120 +120 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +72 +72 +72 +69 +68 +64 +64 +64 +58 +59 +55 +55 +55 +51 +50 +46 +47 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +51 +54 +55 +59 +58 +65 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +175 +175 +175 +178 +179 +182 +183 +182 +184 +185 +188 +189 +190 +190 +191 +195 +194 +196 +196 +196 +198 +199 +201 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +205 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +203 +203 +202 +201 +200 +201 +200 +201 +198 +198 +196 +196 +194 +194 +194 +190 +191 +188 +188 +188 +185 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +129 +125 +125 +119 +120 +120 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +51 +51 +51 +47 +47 +46 +47 +47 +42 +43 +41 +41 +41 +37 +36 +33 +32 +31 +31 +31 +27 +27 +25 +25 +24 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +50 +51 +50 +54 +54 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +105 +106 +109 +110 +110 +115 +115 +116 +116 +116 +120 +119 +125 +126 +125 +129 +130 +133 +133 +132 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +170 +172 +173 +175 +175 +178 +179 +179 +183 +183 +185 +185 +185 +188 +189 +190 +190 +191 +195 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +201 +200 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +190 +189 +188 +188 +184 +185 +183 +182 +183 +178 +179 +174 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +134 +129 +129 +125 +125 +126 +119 +120 +116 +115 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +65 +64 +64 +59 +58 +55 +55 +54 +51 +50 +46 +47 +45 +43 +43 +41 +40 +36 +37 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +36 +36 +41 +41 +43 +43 +43 +46 +46 +50 +51 +51 +55 +54 +58 +58 +58 +64 +64 +69 +68 +67 +72 +72 +77 +76 +83 +81 +82 +86 +86 +90 +90 +90 +96 +96 +99 +99 +100 +105 +106 +110 +110 +110 +115 +115 +119 +119 +120 +126 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +185 +184 +189 +189 +189 +190 +190 +194 +194 +195 +196 +197 +199 +198 +200 +200 +200 +201 +201 +201 +200 +200 +203 +202 +205 +204 +204 +204 +204 +207 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +200 +200 +201 +201 +200 +199 +199 +199 +197 +197 +194 +194 +195 +191 +191 +189 +189 +185 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +152 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +119 +120 +115 +115 +116 +110 +110 +106 +106 +103 +100 +100 +96 +96 +90 +90 +89 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +55 +54 +54 +50 +50 +47 +46 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +19 +18 +19 +17 +16 +15 +15 +15 +15 +16 +13 +13 +13 +12 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +55 +55 +58 +59 +65 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +87 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +119 +120 +120 +126 +125 +130 +129 +130 +133 +133 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +154 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +184 +188 +188 +191 +191 +194 +195 +195 +197 +197 +198 +199 +198 +201 +200 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +207 +206 +207 +207 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +200 +200 +200 +200 +199 +198 +199 +197 +196 +194 +195 +191 +191 +190 +189 +189 +185 +185 +184 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +152 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +134 +129 +129 +126 +126 +125 +119 +120 +116 +115 +113 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +65 +65 +58 +59 +54 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +48 +51 +51 +55 +54 +59 +59 +58 +65 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +120 +119 +120 +126 +125 +129 +129 +130 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +184 +185 +185 +189 +188 +189 +189 +189 +190 +190 +195 +194 +195 +196 +196 +198 +199 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +205 +202 +202 +201 +200 +200 +200 +200 +200 +200 +200 +198 +199 +197 +196 +197 +194 +195 +190 +190 +191 +189 +189 +184 +184 +185 +183 +182 +179 +179 +175 +175 +176 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +129 +129 +129 +125 +125 +125 +125 +125 +119 +120 +115 +116 +116 +109 +109 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +65 +58 +58 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +34 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +55 +56 +59 +58 +64 +65 +68 +68 +68 +72 +72 +77 +76 +76 +83 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +109 +116 +116 +116 +119 +120 +126 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +174 +175 +179 +179 +178 +183 +183 +184 +185 +185 +189 +189 +191 +191 +194 +195 +194 +196 +196 +198 +198 +199 +200 +201 +200 +200 +201 +202 +203 +204 +204 +204 +205 +205 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +201 +200 +198 +199 +199 +196 +197 +195 +194 +190 +191 +190 +189 +189 +185 +184 +184 +183 +183 +183 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +170 +165 +165 +161 +161 +157 +156 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +91 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +71 +68 +68 +65 +64 +58 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +16 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +55 +58 +58 +59 +64 +65 +64 +65 +65 +69 +68 +73 +72 +73 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +105 +110 +110 +116 +116 +116 +119 +119 +125 +126 +126 +130 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +168 +169 +173 +173 +173 +175 +175 +178 +178 +182 +182 +182 +184 +185 +189 +189 +188 +190 +190 +195 +194 +194 +197 +196 +198 +198 +198 +201 +200 +200 +200 +201 +202 +203 +205 +205 +205 +204 +204 +206 +206 +206 +207 +207 +206 +206 +207 +207 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +205 +203 +202 +201 +200 +200 +200 +201 +199 +198 +196 +197 +197 +195 +195 +195 +195 +194 +191 +189 +189 +188 +189 +185 +185 +183 +182 +181 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +146 +147 +143 +143 +140 +139 +139 +133 +134 +129 +130 +129 +125 +126 +119 +120 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +69 +68 +64 +64 +58 +59 +59 +54 +55 +51 +50 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +14 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +15 +15 +16 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +51 +51 +55 +54 +55 +58 +58 +64 +64 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +119 +120 +120 +126 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +150 +151 +157 +157 +157 +161 +161 +165 +165 +169 +170 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +188 +189 +188 +191 +191 +194 +194 +195 +196 +197 +198 +199 +201 +200 +201 +201 +201 +202 +202 +202 +204 +204 +205 +204 +204 +207 +206 +206 +206 +207 +206 +207 +206 +207 +207 +207 +206 +206 +206 +204 +204 +204 +205 +204 +203 +202 +202 +200 +201 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +194 +195 +190 +190 +188 +189 +184 +184 +185 +183 +182 +178 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +156 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +126 +125 +119 +120 +120 +116 +115 +110 +106 +106 +106 +106 +100 +100 +95 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +59 +58 +55 +55 +54 +51 +51 +46 +47 +47 +42 +43 +41 +40 +41 +37 +36 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +40 +41 +43 +43 +43 +47 +47 +50 +50 +54 +54 +55 +59 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +179 +179 +183 +183 +185 +185 +185 +189 +189 +191 +191 +195 +194 +194 +196 +197 +198 +198 +199 +200 +201 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +207 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +197 +196 +197 +195 +194 +191 +191 +190 +189 +188 +185 +185 +185 +182 +182 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +166 +165 +165 +160 +161 +157 +157 +158 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +130 +125 +125 +120 +120 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +73 +72 +69 +69 +65 +64 +64 +58 +59 +54 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +16 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +26 +27 +27 +27 +31 +31 +32 +33 +32 +37 +37 +41 +41 +42 +43 +42 +47 +46 +51 +51 +50 +55 +54 +59 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +88 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +116 +120 +120 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +185 +184 +189 +189 +188 +190 +190 +194 +194 +195 +196 +196 +198 +198 +199 +201 +201 +200 +201 +201 +202 +202 +204 +205 +205 +204 +204 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +201 +201 +200 +201 +198 +198 +198 +196 +197 +195 +194 +194 +190 +191 +191 +190 +190 +188 +189 +185 +184 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +69 +69 +64 +64 +59 +58 +58 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +16 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +30 +31 +33 +33 +32 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +51 +54 +55 +55 +59 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +178 +182 +183 +183 +185 +185 +189 +188 +189 +191 +190 +194 +194 +195 +196 +196 +198 +198 +199 +200 +200 +200 +201 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +207 +205 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +200 +200 +200 +198 +198 +197 +197 +196 +194 +195 +190 +190 +189 +188 +189 +184 +184 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +109 +110 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +58 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +38 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +54 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +110 +110 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +182 +182 +185 +185 +188 +189 +189 +190 +191 +194 +194 +197 +196 +197 +198 +198 +200 +201 +200 +200 +200 +201 +200 +200 +202 +202 +204 +205 +204 +204 +205 +206 +206 +207 +206 +207 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +202 +202 +203 +200 +201 +200 +200 +199 +198 +199 +196 +196 +194 +194 +194 +191 +191 +188 +189 +188 +184 +185 +182 +183 +183 +178 +179 +175 +174 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +59 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +42 +43 +47 +46 +51 +51 +51 +55 +54 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +178 +178 +182 +183 +185 +184 +185 +188 +188 +190 +190 +195 +195 +194 +195 +194 +196 +196 +198 +198 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +203 +202 +200 +201 +200 +201 +200 +199 +198 +198 +197 +197 +195 +194 +195 +190 +190 +188 +189 +189 +184 +185 +183 +183 +179 +178 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +85 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +59 +59 +55 +55 +55 +50 +50 +47 +47 +47 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +55 +54 +58 +59 +59 +64 +64 +68 +68 +73 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +120 +126 +125 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +183 +183 +182 +185 +185 +188 +189 +189 +190 +190 +194 +195 +195 +196 +197 +198 +198 +200 +200 +201 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +201 +200 +200 +200 +201 +199 +198 +198 +199 +198 +196 +196 +194 +194 +194 +191 +190 +189 +189 +188 +184 +185 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +119 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +68 +65 +64 +59 +58 +54 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +189 +188 +191 +191 +191 +194 +195 +196 +197 +196 +198 +198 +199 +198 +198 +200 +201 +200 +200 +201 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +204 +205 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +196 +195 +194 +191 +191 +190 +189 +188 +185 +184 +184 +182 +182 +179 +178 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +134 +129 +129 +125 +125 +120 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +55 +55 +54 +55 +55 +50 +51 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +20 +25 +25 +25 +27 +26 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +51 +51 +54 +54 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +178 +179 +183 +182 +184 +185 +184 +188 +189 +189 +189 +188 +191 +190 +194 +195 +195 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +190 +191 +190 +188 +188 +185 +184 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +156 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +52 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +12 +15 +15 +15 +17 +17 +19 +19 +19 +20 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +46 +47 +46 +50 +51 +55 +55 +54 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +115 +120 +119 +119 +125 +126 +129 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +172 +173 +174 +175 +175 +175 +175 +178 +179 +183 +182 +182 +184 +185 +189 +188 +189 +191 +191 +194 +194 +196 +197 +196 +198 +198 +200 +200 +201 +200 +200 +203 +202 +202 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +204 +202 +202 +203 +200 +201 +200 +201 +200 +199 +199 +196 +196 +195 +195 +195 +191 +190 +188 +189 +188 +184 +184 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +89 +90 +90 +90 +90 +85 +86 +82 +82 +82 +76 +76 +72 +72 +71 +68 +68 +64 +64 +58 +58 +59 +54 +55 +50 +51 +50 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +50 +54 +55 +58 +58 +58 +64 +64 +69 +69 +69 +73 +72 +76 +76 +76 +82 +82 +86 +86 +87 +89 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +115 +115 +115 +120 +120 +125 +125 +126 +129 +129 +133 +133 +132 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +160 +161 +161 +161 +165 +164 +169 +169 +168 +173 +173 +174 +174 +177 +178 +179 +183 +183 +184 +184 +185 +188 +188 +190 +191 +190 +194 +195 +196 +196 +196 +198 +198 +200 +200 +201 +201 +200 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +205 +205 +204 +204 +203 +202 +201 +200 +201 +200 +200 +198 +198 +199 +197 +197 +195 +194 +194 +190 +191 +188 +188 +188 +184 +185 +182 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +130 +130 +125 +125 +125 +120 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +59 +58 +59 +54 +55 +50 +51 +51 +47 +46 +43 +43 +41 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +40 +43 +42 +47 +47 +47 +50 +50 +54 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +105 +110 +110 +110 +115 +115 +119 +120 +122 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +168 +173 +172 +174 +175 +175 +179 +178 +183 +183 +182 +184 +185 +189 +188 +188 +190 +190 +195 +195 +195 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +201 +200 +200 +198 +198 +196 +197 +196 +194 +195 +191 +191 +190 +188 +188 +184 +184 +184 +182 +182 +179 +179 +175 +175 +175 +172 +173 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +120 +116 +115 +116 +110 +110 +106 +105 +106 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +55 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +46 +51 +50 +54 +55 +55 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +81 +82 +86 +86 +90 +91 +90 +96 +96 +100 +99 +102 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +125 +129 +129 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +160 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +183 +183 +184 +185 +188 +188 +191 +191 +190 +194 +194 +196 +197 +197 +198 +198 +200 +201 +200 +200 +200 +203 +202 +202 +204 +205 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +202 +200 +201 +200 +200 +200 +198 +199 +196 +196 +194 +195 +194 +190 +190 +188 +189 +189 +184 +185 +183 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +119 +116 +115 +110 +110 +109 +106 +106 +100 +100 +99 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +54 +50 +51 +46 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +42 +43 +43 +47 +47 +50 +51 +50 +54 +54 +59 +59 +58 +64 +65 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +83 +83 +86 +86 +90 +90 +96 +95 +96 +99 +100 +106 +106 +106 +110 +110 +110 +110 +110 +115 +115 +119 +120 +120 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +175 +178 +179 +179 +183 +182 +184 +184 +184 +188 +188 +191 +191 +190 +195 +194 +196 +196 +196 +198 +198 +200 +200 +201 +200 +201 +202 +202 +205 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +204 +204 +204 +205 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +196 +197 +194 +194 +194 +191 +190 +189 +188 +189 +184 +185 +182 +183 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +142 +139 +139 +133 +133 +130 +129 +129 +125 +125 +120 +120 +120 +115 +115 +116 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +94 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +54 +55 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +32 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +50 +50 +55 +54 +58 +59 +61 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +115 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +160 +165 +165 +169 +169 +168 +173 +173 +174 +175 +175 +179 +178 +183 +183 +182 +185 +184 +189 +188 +188 +190 +191 +195 +194 +197 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +197 +194 +194 +191 +190 +189 +188 +189 +184 +184 +183 +182 +182 +179 +178 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +150 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +130 +129 +130 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +54 +51 +50 +47 +46 +47 +43 +43 +41 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +54 +55 +55 +59 +59 +64 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +119 +119 +119 +125 +125 +129 +130 +130 +133 +133 +139 +139 +143 +144 +143 +147 +147 +151 +151 +150 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +184 +185 +185 +189 +189 +190 +190 +191 +194 +194 +196 +196 +196 +198 +198 +201 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +201 +200 +201 +198 +198 +198 +197 +197 +194 +194 +194 +190 +190 +190 +191 +190 +188 +189 +185 +184 +184 +182 +182 +179 +179 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +137 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +59 +55 +55 +55 +51 +50 +47 +46 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +51 +50 +51 +55 +55 +59 +59 +59 +64 +64 +68 +68 +67 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +178 +183 +182 +185 +184 +185 +189 +188 +190 +190 +191 +195 +195 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +203 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +201 +200 +200 +200 +200 +199 +198 +196 +196 +196 +195 +195 +190 +190 +189 +188 +189 +185 +184 +182 +182 +182 +178 +179 +175 +175 +175 +172 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +126 +120 +120 +115 +115 +116 +109 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +52 +51 +50 +47 +46 +43 +42 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +54 +55 +54 +58 +58 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +116 +119 +120 +126 +125 +125 +129 +129 +134 +134 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +182 +185 +184 +185 +189 +189 +190 +190 +194 +195 +194 +196 +196 +198 +198 +198 +200 +200 +201 +201 +200 +202 +203 +205 +204 +205 +204 +204 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +201 +198 +199 +196 +196 +194 +194 +194 +190 +190 +188 +189 +188 +185 +184 +185 +185 +184 +182 +182 +179 +179 +179 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +130 +129 +126 +125 +119 +120 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +58 +55 +54 +50 +50 +50 +46 +47 +42 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +115 +116 +116 +119 +119 +126 +125 +125 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +183 +182 +182 +185 +184 +189 +189 +188 +190 +190 +195 +194 +194 +196 +196 +199 +198 +198 +200 +201 +200 +200 +201 +202 +203 +205 +204 +205 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +197 +196 +196 +197 +196 +194 +194 +190 +191 +191 +188 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +116 +115 +110 +109 +110 +106 +106 +100 +100 +99 +96 +95 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +58 +59 +58 +54 +55 +51 +50 +51 +47 +47 +43 +42 +41 +42 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +20 +24 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +51 +51 +54 +55 +55 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +182 +183 +184 +185 +188 +189 +188 +191 +190 +194 +194 +195 +196 +196 +199 +198 +200 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +202 +202 +200 +200 +200 +201 +200 +198 +199 +196 +197 +196 +194 +195 +191 +190 +189 +188 +188 +185 +184 +183 +182 +183 +179 +178 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +69 +68 +65 +64 +59 +58 +58 +54 +55 +50 +50 +51 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +46 +47 +50 +50 +55 +55 +54 +58 +59 +64 +64 +64 +68 +68 +72 +73 +72 +76 +77 +82 +82 +82 +86 +85 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +120 +120 +126 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +178 +179 +180 +182 +183 +185 +184 +188 +188 +188 +190 +190 +194 +194 +194 +197 +196 +197 +196 +196 +199 +198 +201 +201 +201 +201 +203 +202 +203 +204 +204 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +205 +203 +202 +203 +201 +201 +200 +200 +200 +200 +200 +199 +198 +198 +196 +197 +194 +194 +195 +191 +190 +188 +189 +189 +184 +185 +182 +183 +179 +179 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +134 +129 +129 +125 +125 +125 +119 +119 +115 +115 +115 +109 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +58 +60 +58 +54 +54 +51 +51 +51 +46 +47 +43 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +22 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +50 +54 +54 +55 +59 +58 +64 +64 +69 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +168 +168 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +178 +182 +182 +184 +184 +184 +189 +188 +190 +191 +191 +195 +194 +196 +196 +198 +198 +199 +201 +201 +201 +200 +201 +202 +202 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +201 +201 +200 +200 +201 +199 +198 +197 +196 +195 +194 +194 +190 +190 +188 +188 +189 +185 +185 +183 +183 +182 +179 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +148 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +120 +120 +119 +115 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +87 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +69 +64 +65 +58 +58 +55 +55 +55 +50 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +16 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +55 +54 +58 +58 +64 +64 +65 +68 +68 +72 +73 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +120 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +178 +179 +183 +183 +185 +185 +185 +188 +188 +191 +190 +191 +194 +194 +194 +194 +195 +196 +196 +198 +198 +199 +200 +200 +200 +201 +201 +202 +203 +205 +204 +204 +204 +204 +206 +206 +207 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +207 +205 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +199 +199 +197 +197 +196 +194 +194 +190 +191 +190 +188 +189 +184 +184 +184 +182 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +156 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +134 +133 +130 +129 +130 +126 +125 +120 +119 +119 +115 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +73 +72 +68 +68 +68 +64 +64 +64 +65 +65 +59 +59 +54 +55 +54 +50 +50 +47 +47 +45 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +22 +21 +25 +25 +25 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +46 +47 +51 +50 +54 +55 +55 +59 +59 +64 +65 +64 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +125 +129 +129 +129 +133 +132 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +183 +183 +183 +185 +185 +189 +188 +189 +190 +190 +194 +195 +195 +197 +197 +198 +199 +200 +201 +200 +200 +200 +202 +202 +202 +204 +204 +204 +205 +205 +207 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +206 +207 +206 +205 +204 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +197 +196 +196 +194 +194 +190 +190 +189 +188 +188 +185 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +134 +133 +133 +133 +129 +129 +125 +126 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +61 +58 +58 +54 +55 +50 +50 +50 +46 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +20 +19 +19 +20 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +46 +47 +51 +50 +55 +55 +55 +58 +59 +64 +64 +64 +69 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +115 +120 +120 +120 +119 +120 +125 +126 +130 +130 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +180 +183 +183 +185 +185 +188 +189 +188 +191 +191 +194 +194 +194 +196 +197 +198 +198 +199 +200 +200 +200 +200 +201 +202 +203 +204 +204 +205 +204 +204 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +203 +200 +201 +200 +200 +200 +199 +198 +196 +197 +196 +194 +195 +191 +190 +190 +188 +189 +185 +185 +185 +183 +183 +178 +179 +179 +175 +174 +173 +173 +169 +169 +169 +164 +165 +160 +161 +161 +157 +156 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +134 +129 +130 +125 +125 +120 +119 +119 +115 +116 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +58 +58 +59 +54 +55 +50 +51 +51 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +14 +15 +15 +13 +12 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +15 +16 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +58 +59 +58 +64 +64 +68 +69 +67 +73 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +109 +116 +115 +120 +119 +120 +125 +125 +129 +129 +133 +134 +133 +139 +140 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +156 +157 +161 +161 +165 +165 +166 +169 +168 +173 +173 +175 +175 +175 +178 +178 +183 +182 +182 +184 +185 +188 +189 +188 +191 +190 +195 +195 +195 +196 +196 +198 +198 +200 +200 +201 +200 +201 +203 +202 +202 +205 +204 +204 +205 +204 +207 +207 +206 +207 +206 +206 +207 +207 +206 +206 +207 +206 +206 +206 +205 +205 +204 +204 +205 +203 +202 +202 +200 +200 +200 +200 +201 +199 +198 +197 +196 +196 +194 +194 +190 +190 +191 +189 +189 +185 +185 +183 +182 +182 +178 +178 +175 +175 +175 +173 +173 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +129 +129 +129 +125 +125 +119 +119 +120 +116 +116 +109 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +59 +58 +58 +54 +54 +50 +50 +51 +46 +47 +43 +43 +43 +40 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +22 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +64 +65 +64 +68 +68 +72 +73 +72 +76 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +100 +105 +106 +109 +109 +115 +115 +115 +119 +119 +125 +125 +125 +129 +129 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +183 +185 +184 +189 +188 +189 +190 +190 +195 +194 +196 +197 +196 +198 +199 +200 +201 +200 +201 +200 +203 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +200 +198 +198 +197 +196 +195 +194 +194 +190 +191 +188 +189 +189 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +126 +122 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +99 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +54 +55 +51 +50 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +42 +43 +43 +47 +47 +50 +50 +51 +55 +55 +58 +59 +59 +64 +64 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +109 +116 +116 +120 +119 +119 +126 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +175 +175 +178 +179 +179 +182 +182 +185 +185 +184 +188 +189 +190 +191 +191 +195 +195 +197 +196 +196 +198 +198 +201 +200 +200 +201 +200 +202 +202 +205 +204 +205 +204 +204 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +201 +200 +200 +201 +200 +198 +198 +199 +196 +196 +195 +194 +194 +190 +190 +189 +188 +188 +185 +185 +182 +182 +182 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +156 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +134 +133 +129 +130 +130 +125 +125 +119 +119 +120 +115 +115 +115 +116 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +83 +82 +82 +76 +77 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +55 +55 +51 +50 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +38 +37 +37 +40 +41 +43 +43 +43 +47 +47 +47 +46 +47 +50 +51 +54 +54 +54 +59 +58 +64 +64 +66 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +115 +115 +115 +119 +119 +125 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +158 +161 +161 +164 +164 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +185 +189 +189 +190 +190 +191 +195 +195 +196 +196 +199 +198 +198 +201 +201 +200 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +207 +207 +204 +204 +204 +205 +205 +202 +203 +200 +201 +200 +200 +200 +199 +198 +199 +196 +196 +194 +194 +195 +190 +191 +188 +189 +185 +184 +184 +183 +183 +179 +179 +178 +175 +175 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +129 +125 +126 +119 +119 +119 +116 +116 +110 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +69 +65 +64 +58 +58 +55 +55 +55 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +18 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +56 +59 +59 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +87 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +109 +115 +116 +116 +120 +120 +126 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +182 +185 +185 +185 +188 +189 +190 +191 +195 +194 +194 +197 +196 +198 +198 +199 +200 +200 +200 +200 +200 +202 +203 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +203 +202 +202 +200 +201 +200 +200 +201 +198 +199 +197 +197 +194 +194 +194 +191 +191 +189 +188 +188 +185 +184 +184 +184 +184 +182 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +160 +161 +161 +157 +157 +157 +157 +157 +151 +152 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +130 +129 +126 +126 +119 +120 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +65 +58 +59 +59 +54 +55 +50 +51 +50 +47 +47 +43 +43 +43 +40 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +39 +41 +41 +43 +43 +48 +47 +47 +50 +50 +51 +50 +51 +54 +55 +54 +54 +54 +58 +58 +64 +65 +64 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +115 +116 +119 +120 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +160 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +185 +188 +188 +188 +190 +190 +195 +195 +194 +197 +196 +198 +198 +199 +200 +201 +200 +200 +203 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +207 +204 +205 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +198 +198 +196 +196 +196 +195 +195 +190 +190 +190 +188 +189 +185 +185 +184 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +125 +120 +119 +115 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +55 +54 +54 +50 +51 +47 +47 +43 +43 +43 +40 +41 +37 +36 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +58 +62 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +83 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +111 +112 +115 +115 +120 +119 +119 +119 +119 +125 +125 +129 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +182 +185 +184 +188 +189 +189 +191 +191 +194 +195 +197 +196 +196 +199 +198 +200 +201 +200 +200 +200 +202 +202 +202 +205 +205 +205 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +201 +198 +198 +197 +196 +196 +194 +195 +190 +190 +190 +189 +189 +184 +184 +185 +183 +183 +182 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +167 +164 +165 +161 +161 +156 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +130 +130 +125 +126 +119 +119 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +69 +65 +64 +65 +58 +58 +54 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +40 +36 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +18 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +51 +51 +54 +55 +58 +58 +59 +64 +64 +69 +69 +69 +72 +72 +76 +75 +76 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +100 +106 +106 +109 +110 +109 +115 +116 +120 +119 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +175 +174 +179 +178 +183 +182 +185 +184 +185 +189 +189 +190 +191 +190 +194 +194 +196 +196 +196 +198 +198 +200 +201 +200 +200 +200 +202 +202 +203 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +203 +204 +204 +203 +202 +201 +201 +201 +201 +201 +198 +198 +199 +196 +196 +195 +195 +194 +191 +190 +191 +190 +191 +188 +188 +185 +185 +185 +183 +183 +179 +179 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +59 +58 +59 +54 +54 +51 +50 +50 +46 +46 +43 +43 +43 +41 +40 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +36 +37 +37 +41 +40 +43 +43 +43 +46 +47 +51 +51 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +110 +115 +116 +120 +119 +120 +126 +125 +129 +129 +133 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +168 +169 +173 +173 +175 +175 +178 +178 +178 +183 +182 +184 +184 +185 +188 +189 +190 +190 +191 +194 +194 +197 +197 +196 +198 +198 +200 +201 +200 +200 +200 +202 +202 +204 +204 +203 +204 +204 +206 +206 +207 +207 +207 +207 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +204 +204 +202 +203 +202 +201 +201 +200 +200 +201 +198 +198 +199 +198 +198 +196 +196 +194 +195 +195 +190 +191 +189 +189 +185 +185 +185 +182 +183 +178 +179 +179 +175 +175 +172 +172 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +65 +58 +58 +55 +55 +55 +50 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +46 +47 +47 +50 +50 +54 +54 +58 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +95 +99 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +164 +165 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +186 +189 +189 +190 +191 +194 +194 +195 +196 +196 +198 +199 +198 +200 +201 +200 +200 +201 +200 +201 +203 +202 +202 +204 +204 +204 +205 +205 +206 +207 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +205 +205 +204 +202 +202 +200 +200 +200 +201 +201 +198 +199 +197 +196 +197 +195 +194 +191 +190 +190 +188 +188 +185 +184 +184 +182 +183 +179 +178 +179 +175 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +126 +119 +119 +120 +116 +116 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +73 +72 +68 +68 +64 +64 +64 +59 +59 +54 +54 +54 +50 +50 +47 +46 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +58 +58 +59 +65 +64 +68 +68 +68 +72 +73 +76 +76 +82 +83 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +120 +119 +126 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +178 +179 +183 +182 +185 +184 +185 +189 +189 +188 +189 +188 +190 +191 +194 +194 +195 +196 +197 +198 +199 +199 +201 +201 +200 +200 +202 +203 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +207 +207 +207 +204 +204 +204 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +199 +197 +197 +195 +195 +195 +191 +191 +189 +189 +187 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +130 +126 +125 +125 +120 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +72 +68 +69 +65 +64 +64 +59 +58 +55 +55 +54 +51 +50 +47 +46 +43 +42 +42 +40 +40 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +24 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +42 +43 +47 +47 +51 +51 +51 +55 +54 +58 +58 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +116 +116 +119 +120 +125 +125 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +152 +151 +157 +157 +161 +160 +166 +165 +165 +169 +169 +173 +173 +173 +175 +174 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +189 +189 +189 +191 +191 +195 +195 +196 +196 +196 +198 +199 +200 +201 +200 +200 +201 +201 +200 +200 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +197 +194 +194 +190 +191 +191 +189 +189 +185 +185 +184 +183 +183 +179 +178 +179 +175 +175 +173 +172 +173 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +69 +69 +65 +64 +59 +58 +58 +55 +55 +50 +51 +50 +47 +47 +46 +47 +47 +43 +42 +40 +41 +41 +37 +36 +33 +32 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +12 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +16 +15 +16 +17 +17 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +87 +87 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +125 +126 +130 +129 +134 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +184 +185 +189 +188 +189 +191 +190 +191 +191 +190 +194 +194 +196 +196 +197 +198 +199 +200 +200 +201 +201 +200 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +204 +205 +204 +204 +205 +202 +202 +200 +200 +201 +200 +200 +199 +199 +198 +197 +197 +195 +194 +195 +191 +191 +189 +189 +188 +185 +184 +182 +183 +179 +179 +178 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +134 +133 +134 +129 +130 +125 +125 +125 +120 +120 +115 +116 +116 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +65 +65 +58 +59 +59 +54 +55 +51 +50 +49 +47 +47 +42 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +46 +46 +50 +50 +51 +55 +54 +58 +59 +58 +64 +64 +68 +68 +71 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +111 +116 +115 +120 +119 +125 +125 +126 +129 +129 +133 +134 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +178 +182 +182 +184 +184 +184 +188 +189 +190 +190 +194 +194 +195 +196 +197 +198 +198 +198 +200 +200 +200 +201 +200 +202 +202 +205 +204 +204 +205 +205 +207 +206 +207 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +205 +204 +204 +205 +204 +202 +202 +201 +201 +200 +200 +200 +199 +198 +199 +196 +197 +195 +194 +190 +190 +191 +188 +188 +185 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +65 +59 +58 +54 +54 +50 +50 +51 +47 +47 +42 +43 +43 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +20 +20 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +18 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +40 +41 +41 +43 +43 +46 +47 +47 +50 +50 +54 +54 +59 +58 +59 +64 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +119 +126 +125 +125 +126 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +184 +185 +184 +189 +188 +190 +191 +190 +194 +194 +196 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +203 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +202 +200 +201 +201 +201 +199 +198 +198 +197 +197 +194 +194 +194 +191 +190 +189 +188 +189 +185 +185 +183 +183 +183 +179 +178 +175 +174 +175 +173 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +130 +125 +126 +119 +119 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +83 +83 +76 +76 +72 +73 +68 +68 +69 +64 +65 +58 +58 +59 +54 +55 +55 +54 +55 +51 +51 +47 +47 +46 +43 +42 +41 +41 +39 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +27 +27 +31 +31 +31 +33 +33 +36 +37 +41 +41 +41 +42 +43 +46 +47 +47 +51 +51 +55 +55 +54 +58 +58 +65 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +116 +115 +119 +119 +126 +125 +125 +129 +129 +133 +134 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +158 +157 +161 +160 +162 +165 +165 +169 +169 +170 +172 +174 +175 +175 +178 +179 +179 +183 +183 +185 +185 +184 +188 +189 +190 +191 +191 +195 +195 +196 +196 +197 +198 +198 +200 +201 +201 +200 +201 +202 +202 +204 +205 +204 +204 +204 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +204 +205 +205 +205 +203 +202 +200 +201 +201 +200 +200 +198 +199 +198 +196 +196 +195 +194 +195 +191 +191 +189 +189 +189 +185 +185 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +130 +126 +125 +125 +119 +119 +120 +120 +120 +115 +116 +110 +110 +110 +105 +106 +100 +100 +98 +96 +95 +90 +90 +86 +86 +86 +82 +83 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +55 +55 +52 +51 +51 +46 +46 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +16 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +55 +58 +59 +65 +64 +69 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +109 +110 +115 +116 +119 +119 +119 +125 +125 +130 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +174 +175 +179 +179 +179 +182 +183 +184 +185 +184 +189 +189 +190 +190 +194 +194 +195 +196 +197 +198 +198 +199 +200 +200 +200 +201 +200 +200 +200 +203 +202 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +200 +201 +200 +198 +198 +196 +197 +197 +195 +195 +191 +190 +190 +189 +189 +185 +185 +184 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +152 +147 +147 +147 +147 +148 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +119 +115 +115 +115 +110 +110 +105 +105 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +69 +69 +64 +64 +59 +58 +58 +55 +55 +51 +51 +50 +46 +47 +43 +43 +43 +41 +40 +36 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +55 +55 +58 +58 +58 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +79 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +175 +175 +175 +178 +182 +182 +183 +183 +185 +185 +188 +189 +188 +190 +191 +195 +195 +195 +196 +197 +198 +198 +199 +201 +200 +200 +201 +202 +202 +202 +204 +204 +205 +204 +204 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +205 +204 +205 +205 +203 +203 +203 +200 +200 +200 +200 +200 +198 +200 +196 +196 +196 +195 +194 +190 +191 +190 +189 +189 +185 +184 +185 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +143 +140 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +119 +116 +116 +116 +115 +116 +109 +110 +106 +106 +106 +99 +100 +96 +96 +93 +90 +90 +86 +86 +83 +82 +82 +77 +76 +72 +73 +73 +68 +68 +64 +65 +64 +58 +58 +54 +54 +55 +51 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +61 +65 +64 +68 +68 +72 +72 +73 +77 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +109 +110 +110 +115 +116 +120 +119 +120 +125 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +184 +184 +188 +189 +191 +190 +194 +194 +195 +197 +196 +198 +198 +198 +201 +201 +201 +201 +200 +202 +202 +205 +204 +204 +205 +204 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +202 +201 +200 +201 +200 +200 +198 +198 +200 +197 +197 +195 +194 +190 +190 +191 +189 +189 +185 +185 +184 +183 +182 +183 +183 +182 +179 +179 +174 +175 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +144 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +123 +120 +119 +115 +116 +109 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +69 +68 +68 +65 +64 +59 +59 +58 +55 +55 +50 +51 +50 +46 +46 +43 +43 +43 +40 +41 +37 +37 +38 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +46 +51 +50 +50 +54 +55 +58 +59 +59 +64 +65 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +99 +100 +106 +106 +106 +110 +109 +116 +115 +116 +119 +120 +125 +125 +126 +129 +130 +133 +133 +139 +139 +139 +144 +143 +147 +148 +147 +150 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +174 +175 +179 +178 +183 +183 +183 +185 +184 +188 +188 +188 +190 +191 +195 +194 +195 +196 +196 +198 +198 +198 +201 +200 +200 +201 +201 +202 +202 +205 +204 +205 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +195 +194 +194 +194 +194 +190 +190 +188 +188 +188 +184 +184 +183 +182 +181 +178 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +148 +148 +143 +143 +141 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +115 +115 +110 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +55 +50 +50 +51 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +34 +33 +31 +31 +27 +27 +27 +25 +25 +21 +22 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +47 +47 +47 +50 +50 +54 +55 +55 +58 +58 +64 +64 +68 +68 +68 +72 +72 +77 +76 +76 +82 +83 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +115 +119 +119 +119 +126 +126 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +183 +185 +185 +189 +188 +188 +191 +190 +194 +195 +195 +196 +196 +199 +199 +201 +201 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +204 +204 +205 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +200 +201 +198 +199 +198 +196 +196 +194 +194 +193 +190 +191 +188 +188 +184 +185 +185 +183 +183 +179 +179 +178 +175 +175 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +129 +125 +125 +119 +119 +120 +115 +115 +110 +109 +107 +106 +106 +101 +100 +96 +96 +96 +89 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +69 +68 +69 +64 +64 +58 +58 +55 +55 +54 +50 +50 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +48 +50 +50 +55 +54 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +77 +76 +82 +82 +86 +86 +87 +89 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +119 +125 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +149 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +183 +184 +184 +188 +189 +191 +190 +191 +195 +195 +197 +196 +196 +198 +198 +200 +201 +200 +200 +200 +202 +202 +203 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +203 +200 +200 +200 +201 +200 +199 +199 +196 +196 +197 +194 +194 +190 +190 +191 +189 +189 +189 +188 +189 +185 +184 +183 +183 +182 +179 +179 +175 +175 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +125 +125 +126 +120 +119 +115 +115 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +58 +59 +58 +55 +54 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +32 +33 +33 +38 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +54 +59 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +115 +119 +119 +125 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +172 +173 +175 +175 +175 +179 +178 +183 +182 +183 +184 +185 +189 +188 +188 +190 +190 +195 +194 +194 +196 +197 +198 +199 +199 +200 +200 +200 +200 +202 +202 +203 +204 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +203 +203 +200 +201 +200 +200 +201 +201 +200 +200 +198 +199 +197 +196 +196 +194 +194 +191 +191 +189 +188 +189 +185 +185 +183 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +59 +58 +59 +55 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +30 +31 +26 +27 +27 +25 +26 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +50 +50 +55 +54 +58 +59 +58 +65 +64 +68 +68 +69 +72 +72 +77 +76 +77 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +178 +179 +183 +182 +183 +184 +185 +188 +188 +189 +191 +190 +194 +194 +196 +196 +197 +199 +198 +200 +201 +201 +200 +201 +200 +200 +200 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +198 +198 +198 +196 +196 +194 +195 +194 +191 +191 +188 +188 +188 +185 +184 +182 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +144 +143 +140 +140 +140 +134 +133 +129 +129 +130 +125 +126 +119 +119 +115 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +55 +55 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +40 +37 +36 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +28 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +47 +47 +47 +50 +51 +54 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +77 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +116 +116 +119 +120 +125 +125 +125 +129 +130 +133 +134 +133 +139 +139 +143 +143 +148 +146 +147 +151 +151 +157 +156 +157 +161 +161 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +184 +185 +184 +189 +189 +190 +190 +191 +194 +195 +196 +196 +196 +199 +199 +201 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +205 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +207 +206 +205 +205 +204 +204 +204 +203 +202 +200 +200 +201 +200 +200 +198 +198 +196 +197 +196 +195 +194 +191 +191 +190 +188 +189 +184 +184 +184 +182 +182 +179 +179 +179 +174 +175 +173 +172 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +134 +133 +130 +129 +129 +125 +125 +119 +120 +119 +116 +115 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +58 +59 +58 +55 +54 +50 +51 +51 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +50 +51 +51 +55 +54 +58 +58 +59 +64 +65 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +115 +119 +120 +126 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +178 +179 +183 +183 +184 +185 +184 +188 +189 +190 +190 +191 +194 +194 +196 +196 +196 +199 +199 +200 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +201 +198 +199 +198 +196 +196 +195 +194 +195 +191 +190 +188 +188 +184 +184 +185 +183 +182 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +134 +134 +129 +130 +125 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +73 +68 +69 +64 +65 +65 +58 +59 +55 +54 +55 +51 +50 +46 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +16 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +50 +50 +51 +55 +55 +58 +59 +65 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +116 +116 +115 +120 +119 +125 +125 +125 +129 +130 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +184 +184 +186 +188 +189 +190 +190 +194 +195 +195 +196 +196 +198 +198 +199 +200 +201 +201 +200 +200 +200 +200 +202 +202 +203 +204 +204 +205 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +205 +204 +205 +202 +202 +203 +200 +201 +201 +201 +199 +199 +198 +196 +197 +194 +195 +195 +190 +190 +188 +189 +188 +185 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +156 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +120 +116 +115 +116 +110 +110 +106 +105 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +59 +59 +54 +55 +55 +51 +51 +47 +47 +47 +42 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +12 +12 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +110 +110 +110 +115 +115 +120 +120 +120 +126 +125 +130 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +182 +183 +183 +184 +184 +188 +189 +188 +190 +191 +190 +191 +190 +195 +194 +197 +196 +197 +198 +199 +200 +200 +200 +201 +201 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +202 +202 +203 +201 +200 +200 +200 +200 +198 +199 +197 +197 +196 +194 +194 +191 +190 +191 +188 +189 +184 +184 +183 +183 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +146 +143 +144 +140 +139 +139 +133 +133 +129 +129 +129 +125 +126 +119 +119 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +77 +72 +72 +69 +68 +68 +65 +64 +58 +58 +59 +54 +55 +50 +51 +48 +46 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +20 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +15 +15 +17 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +55 +59 +59 +58 +64 +64 +69 +68 +73 +72 +72 +76 +77 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +109 +110 +115 +116 +119 +119 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +178 +179 +178 +183 +182 +184 +184 +185 +189 +188 +191 +190 +192 +194 +195 +196 +197 +198 +198 +198 +200 +200 +201 +200 +200 +202 +202 +205 +204 +205 +204 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +201 +200 +200 +201 +198 +198 +198 +196 +196 +195 +194 +191 +190 +190 +188 +188 +184 +184 +184 +182 +183 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +160 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +130 +129 +125 +125 +126 +120 +120 +116 +115 +116 +110 +109 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +61 +58 +59 +54 +55 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +40 +41 +43 +43 +47 +47 +46 +50 +50 +54 +54 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +110 +110 +109 +116 +115 +119 +119 +119 +125 +125 +126 +125 +125 +129 +130 +134 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +169 +169 +169 +173 +172 +175 +175 +175 +179 +178 +182 +182 +184 +185 +185 +188 +188 +194 +194 +194 +196 +197 +196 +197 +196 +198 +198 +200 +201 +200 +200 +200 +203 +202 +203 +204 +205 +204 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +203 +203 +200 +201 +201 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +190 +189 +188 +189 +184 +185 +183 +182 +182 +179 +178 +175 +175 +175 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +130 +125 +125 +119 +119 +115 +115 +115 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +69 +69 +65 +64 +59 +58 +58 +55 +55 +54 +54 +54 +51 +51 +47 +46 +47 +43 +43 +41 +40 +39 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +18 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +59 +59 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +125 +127 +129 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +171 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +185 +185 +188 +188 +190 +190 +191 +194 +194 +197 +197 +196 +199 +199 +200 +200 +201 +201 +200 +202 +203 +205 +205 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +201 +198 +198 +198 +196 +196 +194 +195 +194 +190 +191 +189 +189 +188 +184 +185 +183 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +144 +143 +139 +139 +133 +133 +133 +129 +129 +126 +126 +126 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +68 +68 +68 +64 +65 +59 +58 +58 +55 +54 +50 +50 +48 +47 +47 +43 +43 +41 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +58 +58 +59 +64 +65 +68 +69 +72 +73 +72 +76 +77 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +115 +115 +119 +120 +120 +125 +125 +130 +129 +129 +133 +133 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +174 +175 +179 +179 +179 +183 +183 +184 +184 +185 +189 +189 +190 +190 +193 +194 +194 +196 +196 +199 +199 +199 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +207 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +199 +198 +198 +196 +197 +195 +194 +191 +190 +190 +189 +188 +184 +185 +185 +183 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +156 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +139 +139 +139 +133 +134 +129 +130 +130 +125 +126 +119 +119 +118 +116 +115 +110 +109 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +69 +68 +68 +64 +64 +58 +58 +59 +54 +54 +50 +50 +50 +46 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +20 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +55 +55 +54 +58 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +87 +86 +90 +90 +90 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +116 +115 +120 +119 +119 +120 +120 +125 +126 +129 +130 +129 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +170 +173 +173 +175 +175 +175 +179 +179 +183 +183 +185 +185 +184 +189 +188 +191 +191 +191 +195 +194 +197 +197 +196 +198 +198 +200 +200 +201 +201 +200 +202 +203 +202 +204 +205 +204 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +204 +205 +204 +204 +204 +202 +203 +203 +201 +200 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +191 +189 +188 +188 +185 +185 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +168 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +125 +119 +119 +119 +115 +116 +109 +110 +110 +106 +106 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +83 +83 +76 +76 +72 +72 +72 +68 +68 +65 +65 +64 +58 +59 +54 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +20 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +58 +59 +58 +64 +64 +68 +68 +69 +72 +73 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +105 +106 +106 +109 +109 +116 +115 +119 +120 +119 +125 +125 +129 +130 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +162 +165 +165 +168 +169 +169 +173 +172 +175 +175 +175 +179 +178 +183 +183 +183 +185 +184 +189 +189 +188 +191 +191 +194 +194 +195 +196 +197 +198 +199 +200 +201 +200 +200 +200 +202 +202 +202 +204 +204 +205 +205 +205 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +202 +201 +200 +201 +200 +200 +198 +198 +196 +197 +196 +194 +195 +191 +191 +189 +189 +185 +185 +182 +182 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +130 +125 +125 +126 +126 +126 +119 +120 +116 +115 +116 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +65 +65 +59 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +37 +36 +37 +40 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +116 +115 +115 +119 +120 +126 +125 +125 +130 +129 +133 +133 +133 +139 +140 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +185 +189 +189 +191 +191 +195 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +201 +201 +201 +200 +199 +198 +200 +197 +197 +194 +194 +190 +190 +190 +189 +188 +185 +185 +185 +182 +182 +183 +183 +183 +179 +179 +174 +175 +175 +173 +172 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +148 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +126 +126 +119 +120 +115 +115 +115 +110 +110 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +59 +54 +54 +50 +51 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +51 +50 +50 +54 +54 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +116 +120 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +172 +173 +175 +175 +178 +179 +179 +183 +183 +185 +185 +184 +188 +188 +190 +190 +191 +195 +195 +197 +196 +197 +198 +199 +200 +200 +201 +200 +201 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +205 +204 +202 +202 +200 +200 +200 +201 +200 +200 +201 +200 +198 +198 +197 +196 +196 +195 +195 +191 +191 +189 +189 +189 +184 +185 +182 +183 +182 +179 +179 +179 +179 +178 +175 +175 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +130 +129 +125 +125 +120 +119 +120 +115 +115 +110 +109 +106 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +73 +68 +68 +68 +64 +64 +58 +59 +54 +54 +55 +51 +50 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +16 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +51 +51 +50 +55 +55 +58 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +99 +100 +100 +106 +105 +109 +110 +110 +116 +116 +120 +119 +119 +125 +124 +129 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +178 +179 +183 +183 +184 +184 +189 +189 +188 +190 +191 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +205 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +201 +201 +200 +200 +200 +198 +198 +198 +196 +197 +194 +194 +194 +191 +190 +190 +191 +190 +188 +188 +185 +184 +185 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +77 +72 +72 +68 +69 +68 +64 +65 +59 +59 +59 +54 +54 +51 +50 +50 +47 +47 +42 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +22 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +47 +47 +50 +50 +50 +54 +54 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +78 +81 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +100 +106 +105 +110 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +179 +179 +178 +182 +183 +184 +184 +185 +189 +188 +188 +188 +189 +190 +191 +195 +194 +194 +197 +196 +199 +198 +198 +200 +201 +201 +200 +203 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +205 +204 +202 +202 +202 +200 +200 +200 +200 +201 +200 +201 +199 +199 +198 +197 +197 +194 +195 +191 +190 +191 +189 +188 +184 +184 +184 +183 +182 +179 +178 +178 +174 +175 +173 +173 +172 +168 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +120 +116 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +81 +76 +76 +72 +73 +72 +68 +68 +64 +64 +64 +58 +58 +55 +54 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +54 +54 +55 +59 +58 +65 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +89 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +152 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +184 +185 +185 +189 +188 +190 +191 +195 +195 +194 +197 +197 +196 +197 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +205 +203 +203 +200 +201 +201 +201 +200 +199 +199 +196 +196 +196 +194 +194 +191 +190 +190 +189 +188 +185 +184 +184 +182 +182 +179 +178 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +126 +119 +119 +119 +115 +115 +110 +109 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +65 +59 +59 +59 +54 +54 +50 +50 +50 +47 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +42 +43 +46 +47 +50 +51 +51 +55 +55 +59 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +184 +184 +189 +189 +188 +190 +190 +190 +190 +190 +194 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +205 +205 +205 +204 +202 +202 +203 +201 +201 +200 +200 +200 +199 +199 +197 +197 +196 +194 +194 +190 +191 +190 +188 +188 +185 +185 +182 +183 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +126 +125 +120 +120 +120 +116 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +69 +64 +64 +58 +58 +58 +55 +55 +50 +51 +49 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +47 +51 +50 +54 +54 +55 +58 +59 +65 +64 +69 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +120 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +174 +179 +179 +178 +179 +179 +183 +183 +185 +185 +185 +189 +189 +191 +191 +192 +195 +194 +197 +197 +198 +198 +199 +201 +200 +201 +201 +201 +202 +202 +203 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +201 +198 +199 +196 +197 +195 +194 +194 +190 +191 +188 +188 +188 +184 +184 +182 +182 +182 +179 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +116 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +65 +65 +59 +58 +58 +55 +54 +51 +51 +50 +46 +46 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +42 +47 +46 +47 +50 +51 +54 +55 +55 +59 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +109 +109 +115 +115 +115 +119 +120 +125 +126 +126 +129 +129 +133 +133 +134 +140 +140 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +176 +178 +178 +183 +182 +184 +184 +184 +189 +188 +191 +190 +190 +194 +195 +194 +195 +194 +196 +197 +198 +198 +198 +201 +201 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +198 +198 +196 +196 +196 +195 +195 +190 +190 +191 +188 +189 +184 +184 +185 +182 +183 +179 +178 +175 +174 +175 +173 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +130 +129 +129 +125 +125 +119 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +69 +68 +64 +64 +59 +59 +59 +54 +54 +50 +50 +51 +47 +47 +43 +43 +42 +41 +41 +37 +36 +33 +32 +33 +31 +31 +31 +31 +31 +27 +26 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +31 +31 +33 +33 +38 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +58 +59 +58 +65 +64 +68 +68 +69 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +115 +119 +120 +120 +126 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +185 +184 +184 +185 +185 +189 +188 +191 +191 +191 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +201 +200 +203 +202 +204 +204 +204 +205 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +204 +203 +203 +200 +200 +200 +201 +200 +199 +199 +199 +196 +196 +195 +195 +194 +190 +190 +188 +188 +185 +184 +185 +183 +183 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +126 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +83 +82 +76 +76 +76 +76 +76 +73 +72 +68 +68 +68 +65 +65 +59 +58 +56 +55 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +64 +65 +65 +68 +68 +73 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +125 +125 +130 +129 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +184 +188 +189 +188 +190 +190 +194 +195 +194 +197 +196 +199 +198 +199 +200 +200 +200 +200 +200 +202 +202 +204 +205 +205 +204 +205 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +203 +202 +201 +200 +201 +201 +200 +199 +199 +197 +196 +197 +195 +195 +190 +190 +190 +189 +188 +185 +185 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +148 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +126 +120 +119 +116 +116 +110 +110 +109 +105 +106 +100 +100 +100 +96 +96 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +65 +64 +58 +59 +54 +54 +54 +50 +50 +51 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +48 +46 +47 +50 +51 +55 +54 +55 +58 +58 +64 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +94 +96 +99 +99 +106 +106 +106 +110 +109 +110 +109 +109 +116 +116 +120 +119 +119 +125 +125 +130 +130 +130 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +160 +161 +164 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +182 +183 +184 +184 +189 +189 +189 +191 +191 +195 +194 +194 +196 +197 +198 +198 +199 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +203 +203 +203 +200 +200 +200 +201 +200 +198 +198 +197 +196 +196 +194 +194 +190 +190 +190 +189 +188 +184 +185 +185 +183 +182 +179 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +119 +119 +116 +116 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +69 +64 +65 +59 +58 +59 +55 +54 +51 +50 +47 +47 +47 +43 +43 +41 +40 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +16 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +32 +37 +37 +37 +41 +41 +42 +43 +43 +46 +46 +50 +50 +50 +54 +54 +59 +59 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +100 +106 +106 +110 +110 +112 +116 +116 +120 +119 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +184 +185 +189 +189 +189 +190 +191 +195 +195 +196 +196 +197 +199 +198 +200 +201 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +207 +206 +207 +207 +206 +206 +207 +207 +204 +204 +205 +205 +204 +202 +203 +202 +200 +201 +201 +201 +200 +199 +198 +197 +197 +196 +194 +195 +191 +191 +189 +189 +189 +184 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +140 +133 +133 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +113 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +66 +64 +64 +59 +59 +54 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +46 +47 +51 +51 +54 +54 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +120 +120 +120 +120 +120 +125 +125 +129 +129 +129 +134 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +182 +184 +185 +184 +189 +188 +190 +191 +190 +194 +194 +197 +197 +196 +198 +198 +201 +200 +201 +200 +200 +202 +202 +202 +204 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +201 +201 +199 +198 +198 +197 +196 +195 +194 +194 +190 +191 +189 +188 +189 +184 +185 +183 +182 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +131 +129 +129 +126 +125 +119 +120 +120 +115 +116 +110 +110 +110 +106 +105 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +69 +68 +65 +64 +65 +59 +58 +54 +54 +55 +51 +51 +47 +47 +47 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +30 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +46 +47 +51 +50 +50 +50 +50 +55 +55 +58 +59 +58 +64 +65 +68 +69 +67 +73 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +119 +119 +120 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +184 +185 +189 +189 +188 +190 +190 +195 +194 +194 +196 +196 +198 +198 +201 +201 +200 +200 +201 +202 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +205 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +196 +197 +194 +195 +190 +191 +190 +188 +189 +185 +184 +183 +183 +183 +179 +179 +175 +174 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +160 +157 +157 +157 +151 +151 +147 +147 +143 +144 +143 +139 +139 +133 +133 +134 +130 +129 +129 +129 +130 +125 +126 +119 +119 +120 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +69 +64 +65 +58 +59 +55 +54 +54 +51 +50 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +20 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +48 +50 +50 +54 +54 +58 +59 +59 +65 +64 +68 +69 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +92 +96 +96 +100 +100 +105 +105 +106 +110 +110 +115 +115 +115 +120 +119 +125 +125 +126 +129 +130 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +182 +182 +185 +185 +189 +188 +188 +191 +191 +195 +195 +194 +196 +196 +198 +198 +198 +200 +201 +200 +200 +200 +203 +202 +204 +204 +204 +204 +205 +206 +207 +207 +207 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +201 +201 +200 +201 +199 +198 +197 +196 +197 +194 +194 +190 +191 +190 +189 +189 +184 +185 +184 +183 +183 +179 +179 +179 +175 +174 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +129 +130 +125 +125 +120 +120 +115 +116 +116 +109 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +83 +76 +76 +75 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +55 +51 +51 +46 +47 +47 +43 +42 +40 +41 +41 +37 +36 +34 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +42 +43 +47 +46 +50 +51 +51 +55 +55 +58 +58 +58 +64 +64 +64 +64 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +116 +119 +119 +126 +125 +126 +129 +129 +133 +133 +138 +139 +139 +143 +143 +147 +147 +147 +151 +151 +152 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +178 +179 +183 +182 +184 +184 +185 +188 +188 +191 +191 +190 +195 +194 +197 +196 +197 +198 +199 +201 +201 +201 +201 +200 +203 +203 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +203 +202 +200 +200 +201 +200 +201 +199 +198 +198 +196 +196 +197 +197 +197 +195 +195 +190 +191 +190 +189 +188 +184 +185 +184 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +133 +130 +130 +125 +125 +125 +120 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +54 +55 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +43 +43 +43 +46 +47 +51 +51 +51 +54 +55 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +116 +119 +120 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +185 +188 +189 +190 +191 +191 +195 +195 +197 +196 +199 +198 +199 +200 +200 +200 +201 +200 +203 +202 +205 +204 +204 +205 +204 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +204 +202 +202 +202 +202 +202 +200 +201 +200 +200 +200 +198 +199 +196 +196 +196 +194 +195 +191 +190 +188 +189 +188 +185 +185 +183 +182 +183 +179 +179 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +126 +119 +119 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +64 +59 +59 +59 +55 +55 +51 +51 +51 +46 +47 +43 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +36 +37 +41 +40 +43 +43 +43 +47 +47 +51 +50 +54 +54 +55 +58 +59 +65 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +95 +95 +100 +100 +106 +106 +106 +109 +109 +116 +116 +116 +119 +119 +125 +126 +126 +129 +129 +134 +133 +133 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +178 +179 +178 +182 +183 +184 +184 +188 +188 +188 +191 +190 +194 +194 +194 +196 +197 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +204 +205 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +197 +196 +197 +194 +194 +195 +191 +191 +190 +191 +191 +189 +189 +185 +184 +185 +183 +183 +179 +178 +177 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +134 +129 +129 +129 +126 +126 +119 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +65 +64 +59 +59 +59 +54 +54 +50 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +20 +19 +17 +18 +17 +15 +15 +15 +15 +16 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +51 +51 +54 +54 +58 +58 +59 +64 +65 +69 +68 +72 +73 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +126 +126 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +179 +183 +182 +185 +185 +185 +188 +188 +190 +191 +191 +194 +194 +197 +197 +196 +198 +199 +201 +200 +201 +201 +200 +203 +202 +204 +204 +204 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +202 +202 +202 +200 +200 +200 +201 +200 +200 +201 +198 +198 +199 +196 +197 +195 +195 +191 +190 +191 +189 +188 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +120 +116 +115 +115 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +69 +68 +64 +64 +59 +58 +55 +55 +55 +50 +51 +47 +47 +47 +42 +43 +40 +41 +41 +36 +36 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +46 +50 +51 +50 +54 +55 +58 +58 +58 +64 +64 +68 +68 +69 +72 +76 +76 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +120 +120 +126 +126 +129 +129 +129 +134 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +183 +183 +183 +185 +184 +188 +188 +191 +190 +190 +195 +194 +196 +197 +197 +199 +198 +198 +198 +198 +201 +201 +200 +200 +201 +203 +202 +205 +205 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +198 +198 +199 +196 +196 +194 +195 +194 +191 +190 +188 +188 +189 +185 +184 +183 +183 +183 +178 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +129 +129 +125 +125 +120 +119 +119 +116 +115 +109 +110 +109 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +55 +54 +51 +50 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +32 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +50 +51 +55 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +120 +126 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +162 +162 +165 +165 +169 +169 +172 +172 +173 +175 +175 +179 +179 +179 +183 +183 +183 +183 +182 +185 +185 +189 +188 +188 +191 +191 +194 +194 +195 +196 +197 +199 +198 +200 +200 +201 +200 +200 +202 +202 +202 +204 +205 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +201 +200 +200 +201 +200 +199 +198 +199 +196 +196 +194 +194 +191 +190 +191 +188 +188 +184 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +150 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +120 +120 +116 +115 +116 +109 +110 +105 +105 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +64 +65 +59 +58 +54 +54 +50 +50 +50 +46 +46 +42 +43 +43 +41 +41 +41 +41 +40 +36 +37 +33 +33 +33 +31 +30 +27 +27 +26 +26 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +54 +54 +54 +58 +58 +64 +64 +64 +68 +69 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +115 +116 +120 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +186 +188 +189 +191 +191 +194 +194 +194 +196 +196 +199 +198 +198 +200 +200 +200 +200 +201 +200 +201 +202 +202 +203 +204 +205 +204 +204 +206 +207 +207 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +205 +204 +204 +204 +205 +203 +202 +203 +200 +201 +200 +200 +198 +198 +198 +196 +196 +194 +194 +195 +190 +191 +189 +188 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +119 +116 +116 +116 +110 +109 +106 +106 +106 +99 +100 +95 +96 +96 +90 +90 +87 +86 +86 +82 +82 +77 +76 +77 +72 +72 +68 +69 +65 +64 +64 +58 +59 +54 +55 +55 +50 +50 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +55 +54 +58 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +109 +116 +115 +115 +119 +120 +126 +126 +125 +129 +130 +133 +133 +133 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +166 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +184 +185 +184 +188 +189 +191 +191 +191 +194 +194 +195 +195 +195 +197 +197 +198 +198 +198 +200 +201 +200 +200 +201 +202 +203 +204 +204 +204 +204 +205 +206 +206 +207 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +204 +205 +204 +204 +204 +203 +203 +200 +200 +200 +200 +200 +198 +199 +198 +196 +196 +194 +194 +195 +190 +191 +189 +189 +188 +185 +184 +182 +182 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +148 +143 +143 +139 +139 +134 +133 +133 +130 +129 +125 +126 +126 +119 +119 +120 +119 +120 +115 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +73 +72 +72 +68 +68 +64 +64 +64 +58 +59 +54 +54 +53 +51 +50 +47 +47 +43 +43 +42 +41 +40 +37 +37 +37 +33 +32 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +18 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +51 +50 +54 +54 +59 +58 +65 +65 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +105 +110 +109 +116 +115 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +179 +179 +182 +183 +183 +185 +185 +189 +189 +191 +191 +190 +195 +194 +197 +196 +196 +199 +198 +201 +201 +200 +200 +200 +203 +202 +202 +204 +204 +204 +205 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +195 +194 +194 +190 +190 +188 +188 +189 +185 +185 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +170 +165 +165 +160 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +115 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +74 +68 +68 +64 +65 +58 +59 +59 +55 +54 +51 +51 +51 +47 +46 +47 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +31 +31 +30 +27 +27 +25 +25 +25 +20 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +50 +51 +55 +55 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +87 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +109 +116 +116 +116 +115 +116 +119 +119 +125 +125 +125 +130 +129 +133 +134 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +178 +182 +183 +185 +185 +185 +188 +189 +191 +191 +191 +195 +195 +196 +197 +196 +198 +199 +200 +201 +201 +201 +201 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +200 +200 +200 +200 +200 +199 +198 +199 +197 +196 +194 +194 +194 +190 +190 +189 +188 +188 +185 +184 +183 +183 +183 +179 +179 +174 +174 +173 +172 +173 +169 +169 +165 +165 +165 +160 +161 +161 +160 +161 +157 +157 +151 +151 +151 +148 +147 +143 +144 +143 +139 +139 +133 +133 +129 +129 +130 +125 +126 +119 +119 +120 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +65 +65 +64 +64 +65 +58 +58 +55 +55 +54 +50 +51 +46 +47 +43 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +15 +16 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +59 +58 +65 +65 +65 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +89 +90 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +112 +116 +116 +119 +120 +125 +126 +125 +129 +129 +133 +133 +133 +140 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +182 +183 +184 +185 +188 +189 +189 +191 +191 +194 +194 +196 +197 +197 +198 +199 +200 +200 +200 +201 +201 +203 +202 +202 +204 +204 +205 +205 +205 +207 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +205 +203 +202 +202 +200 +200 +200 +201 +200 +198 +199 +196 +197 +197 +195 +194 +191 +190 +189 +189 +188 +185 +185 +183 +182 +183 +179 +179 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +119 +120 +118 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +91 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +68 +68 +64 +65 +58 +58 +58 +54 +54 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +38 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +54 +54 +54 +59 +58 +64 +64 +65 +68 +68 +69 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +88 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +115 +116 +116 +119 +120 +126 +125 +125 +129 +130 +133 +133 +136 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +182 +182 +185 +185 +188 +188 +189 +191 +191 +194 +195 +194 +196 +196 +199 +199 +198 +200 +201 +201 +200 +200 +202 +202 +204 +204 +205 +205 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +201 +200 +198 +199 +196 +196 +196 +195 +194 +195 +195 +195 +190 +191 +188 +189 +188 +184 +185 +182 +182 +183 +178 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +119 +119 +116 +115 +115 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +95 +91 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +73 +73 +68 +68 +64 +64 +65 +58 +58 +54 +54 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +18 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +47 +51 +50 +55 +55 +54 +58 +58 +64 +65 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +111 +116 +115 +120 +120 +125 +125 +125 +130 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +164 +169 +168 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +189 +188 +191 +191 +191 +195 +195 +197 +196 +197 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +207 +206 +207 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +199 +199 +197 +196 +195 +194 +195 +191 +190 +189 +188 +185 +184 +185 +183 +182 +178 +179 +179 +174 +175 +173 +173 +173 +169 +170 +165 +165 +166 +161 +161 +157 +157 +158 +151 +151 +147 +147 +144 +143 +143 +139 +139 +139 +139 +139 +133 +133 +133 +133 +133 +129 +129 +125 +126 +125 +126 +125 +120 +120 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +64 +64 +59 +58 +55 +55 +54 +51 +51 +47 +46 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +47 +47 +51 +51 +54 +54 +55 +58 +58 +64 +65 +65 +68 +69 +69 +68 +68 +72 +73 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +120 +120 +120 +125 +125 +130 +129 +130 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +185 +185 +184 +188 +189 +190 +190 +190 +195 +195 +197 +197 +197 +198 +198 +200 +200 +200 +201 +200 +203 +202 +203 +204 +205 +204 +204 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +204 +204 +205 +204 +205 +202 +203 +203 +201 +200 +200 +200 +199 +199 +199 +196 +197 +194 +195 +194 +190 +191 +189 +189 +188 +184 +184 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +132 +129 +129 +125 +126 +119 +119 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +83 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +65 +59 +58 +59 +54 +54 +50 +51 +51 +46 +47 +42 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +28 +27 +25 +25 +21 +21 +21 +19 +19 +16 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +34 +37 +38 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +54 +55 +55 +58 +58 +65 +65 +65 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +116 +116 +120 +120 +125 +126 +129 +130 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +170 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +185 +189 +189 +188 +190 +190 +195 +194 +194 +197 +197 +198 +198 +198 +201 +200 +200 +201 +203 +202 +203 +204 +205 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +207 +205 +205 +204 +205 +203 +202 +203 +201 +200 +200 +200 +200 +198 +198 +197 +196 +194 +194 +195 +190 +191 +190 +189 +189 +184 +185 +185 +183 +183 +178 +179 +174 +174 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +95 +94 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +59 +59 +54 +55 +55 +51 +50 +47 +46 +43 +42 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +50 +51 +55 +55 +58 +59 +61 +65 +65 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +115 +115 +116 +119 +120 +125 +126 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +182 +183 +185 +185 +185 +189 +188 +190 +191 +191 +195 +194 +196 +196 +199 +198 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +203 +203 +201 +201 +200 +201 +200 +198 +198 +197 +196 +197 +195 +195 +191 +190 +188 +189 +189 +185 +185 +183 +182 +182 +179 +179 +179 +178 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +126 +119 +115 +116 +112 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +59 +59 +58 +54 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +16 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +47 +51 +50 +54 +54 +54 +58 +58 +65 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +119 +125 +125 +126 +130 +130 +134 +133 +133 +139 +139 +144 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +184 +185 +189 +189 +189 +191 +190 +194 +194 +194 +196 +196 +199 +198 +199 +201 +200 +200 +201 +200 +203 +203 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +200 +201 +200 +201 +198 +199 +198 +197 +196 +195 +195 +194 +190 +191 +191 +191 +190 +189 +188 +186 +185 +185 +183 +183 +178 +179 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +130 +130 +126 +126 +119 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +16 +16 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +24 +27 +27 +27 +31 +31 +33 +33 +36 +37 +36 +41 +40 +42 +43 +43 +47 +47 +51 +51 +50 +55 +55 +59 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +81 +82 +82 +86 +85 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +116 +119 +120 +120 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +156 +157 +161 +161 +161 +164 +165 +169 +169 +169 +172 +173 +175 +175 +178 +178 +179 +183 +183 +185 +184 +185 +188 +188 +190 +190 +190 +194 +194 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +198 +199 +198 +198 +196 +196 +194 +194 +195 +190 +191 +188 +188 +186 +184 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +116 +115 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +55 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +16 +15 +15 +13 +14 +12 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +16 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +50 +51 +55 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +109 +110 +115 +115 +116 +119 +120 +125 +125 +126 +130 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +174 +175 +179 +179 +178 +182 +183 +185 +184 +184 +189 +189 +191 +190 +191 +194 +194 +197 +197 +199 +199 +198 +200 +201 +201 +200 +200 +202 +202 +202 +202 +203 +204 +204 +204 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +204 +204 +204 +204 +204 +202 +202 +201 +201 +201 +201 +200 +198 +199 +197 +197 +196 +194 +194 +190 +190 +190 +188 +189 +184 +185 +184 +182 +182 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +73 +68 +68 +64 +64 +59 +59 +58 +54 +55 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +46 +50 +50 +55 +54 +55 +58 +58 +64 +64 +65 +68 +68 +73 +73 +72 +77 +76 +83 +82 +82 +86 +89 +89 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +120 +120 +125 +125 +125 +129 +130 +133 +133 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +182 +184 +185 +189 +189 +189 +190 +191 +194 +194 +194 +196 +197 +197 +197 +196 +198 +198 +201 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +204 +204 +205 +204 +205 +203 +203 +200 +200 +200 +200 +200 +199 +199 +196 +196 +197 +195 +194 +191 +190 +190 +189 +188 +185 +184 +185 +183 +183 +178 +179 +175 +175 +175 +173 +172 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +143 +143 +143 +144 +139 +139 +134 +133 +134 +129 +130 +125 +126 +125 +120 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +51 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +126 +126 +125 +129 +129 +134 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +173 +173 +173 +175 +179 +179 +178 +182 +183 +183 +182 +182 +185 +185 +188 +188 +188 +190 +191 +195 +195 +195 +197 +196 +199 +198 +200 +200 +200 +201 +200 +203 +203 +203 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +199 +197 +197 +194 +194 +191 +190 +190 +189 +188 +184 +184 +184 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +119 +120 +115 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +65 +64 +65 +58 +58 +54 +54 +51 +51 +51 +46 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +32 +30 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +51 +51 +55 +55 +55 +59 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +125 +130 +130 +134 +133 +133 +139 +140 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +168 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +183 +183 +184 +185 +189 +188 +190 +190 +191 +194 +194 +196 +196 +196 +198 +198 +199 +198 +199 +200 +200 +200 +200 +201 +203 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +205 +204 +205 +204 +205 +202 +203 +201 +200 +200 +200 +200 +198 +198 +199 +196 +196 +194 +194 +194 +191 +190 +189 +188 +188 +184 +185 +182 +182 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +130 +129 +126 +125 +125 +119 +120 +116 +115 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +73 +72 +68 +69 +64 +64 +64 +58 +58 +58 +58 +58 +55 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +43 +47 +46 +51 +50 +50 +54 +55 +58 +58 +59 +64 +64 +69 +68 +69 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +120 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +148 +147 +151 +151 +151 +158 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +179 +179 +182 +183 +184 +184 +184 +188 +189 +189 +189 +189 +190 +190 +195 +194 +194 +196 +197 +198 +198 +199 +201 +200 +201 +200 +202 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +195 +195 +190 +191 +190 +189 +189 +184 +185 +183 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +143 +143 +143 +139 +139 +140 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +58 +59 +54 +54 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +24 +24 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +50 +50 +55 +55 +58 +58 +65 +64 +64 +68 +68 +73 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +149 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +186 +188 +189 +190 +190 +194 +194 +195 +196 +196 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +201 +198 +198 +197 +196 +196 +195 +194 +190 +190 +191 +188 +188 +184 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +174 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +126 +119 +119 +116 +115 +110 +109 +110 +105 +105 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +74 +72 +72 +68 +68 +64 +64 +64 +58 +55 +54 +55 +51 +51 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +47 +46 +47 +51 +50 +55 +55 +55 +58 +58 +64 +65 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +109 +110 +110 +116 +116 +119 +119 +119 +125 +126 +130 +129 +131 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +172 +174 +175 +175 +179 +178 +182 +182 +183 +185 +185 +189 +188 +188 +191 +190 +195 +194 +195 +196 +196 +198 +198 +199 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +199 +198 +196 +196 +196 +194 +194 +190 +190 +190 +189 +189 +184 +185 +185 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +168 +165 +164 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +119 +119 +115 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +64 +64 +64 +59 +58 +55 +55 +54 +50 +50 +47 +47 +45 +43 +42 +41 +41 +37 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +59 +58 +59 +65 +64 +68 +68 +68 +72 +73 +77 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +118 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +163 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +182 +185 +184 +185 +189 +189 +191 +190 +191 +195 +195 +196 +196 +198 +198 +198 +201 +200 +201 +200 +200 +203 +202 +205 +204 +204 +205 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +199 +198 +197 +196 +194 +195 +195 +191 +190 +188 +188 +184 +185 +185 +183 +183 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +130 +129 +125 +125 +125 +119 +120 +115 +116 +116 +110 +109 +106 +105 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +55 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +55 +59 +64 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +109 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +184 +185 +185 +189 +189 +190 +190 +194 +194 +195 +197 +196 +198 +199 +198 +200 +201 +201 +200 +200 +202 +202 +205 +205 +205 +205 +204 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +201 +200 +201 +201 +200 +198 +198 +199 +196 +197 +195 +194 +191 +191 +190 +188 +189 +185 +184 +185 +183 +183 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +119 +120 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +95 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +59 +59 +58 +55 +54 +51 +50 +51 +47 +47 +42 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +51 +51 +55 +54 +55 +59 +59 +65 +64 +64 +68 +69 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +88 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +116 +116 +115 +116 +119 +119 +125 +125 +126 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +184 +185 +189 +188 +190 +190 +190 +194 +194 +197 +196 +197 +198 +198 +200 +201 +201 +200 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +201 +200 +200 +200 +200 +198 +199 +198 +196 +197 +194 +194 +195 +191 +190 +188 +189 +189 +184 +185 +183 +182 +183 +178 +179 +175 +174 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +119 +119 +116 +115 +116 +115 +116 +110 +109 +106 +105 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +64 +58 +58 +54 +54 +55 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +14 +13 +12 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +47 +47 +46 +51 +50 +54 +54 +55 +58 +58 +64 +65 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +178 +183 +182 +184 +184 +185 +188 +189 +190 +190 +190 +194 +194 +196 +196 +199 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +197 +195 +194 +190 +191 +188 +189 +189 +184 +185 +183 +182 +182 +179 +178 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +120 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +65 +64 +58 +58 +55 +55 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +34 +31 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +45 +47 +46 +51 +51 +55 +55 +54 +58 +59 +64 +65 +64 +68 +68 +69 +69 +69 +72 +72 +77 +77 +76 +82 +82 +86 +86 +89 +90 +89 +96 +95 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +185 +184 +185 +188 +189 +190 +190 +191 +195 +195 +197 +197 +197 +198 +198 +200 +201 +201 +200 +200 +202 +202 +203 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +201 +201 +200 +198 +198 +199 +196 +197 +194 +195 +194 +191 +190 +189 +188 +188 +184 +185 +182 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +140 +140 +133 +133 +131 +129 +129 +125 +125 +119 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +51 +50 +46 +47 +42 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +35 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +54 +55 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +74 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +120 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +182 +182 +185 +185 +188 +188 +188 +190 +190 +195 +195 +194 +196 +197 +198 +198 +199 +200 +201 +200 +200 +203 +202 +202 +205 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +204 +204 +205 +204 +203 +202 +203 +200 +200 +201 +201 +200 +198 +198 +198 +199 +198 +196 +197 +195 +194 +194 +191 +190 +188 +188 +187 +185 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +172 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +148 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +120 +115 +116 +109 +110 +110 +105 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +76 +76 +76 +76 +73 +73 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +16 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +40 +41 +41 +41 +41 +43 +43 +46 +47 +47 +50 +51 +54 +54 +57 +59 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +183 +185 +185 +188 +188 +189 +191 +190 +195 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +205 +206 +207 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +205 +204 +204 +202 +203 +200 +200 +200 +200 +201 +198 +199 +197 +196 +197 +195 +194 +190 +190 +191 +189 +188 +185 +185 +185 +182 +183 +183 +183 +183 +178 +178 +174 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +54 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +25 +25 +26 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +15 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +42 +43 +43 +46 +47 +50 +50 +50 +54 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +120 +125 +125 +129 +129 +130 +134 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +174 +175 +178 +179 +183 +183 +183 +182 +183 +185 +184 +188 +189 +188 +191 +191 +194 +195 +194 +196 +197 +199 +198 +198 +200 +201 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +201 +199 +198 +198 +196 +196 +197 +196 +196 +194 +194 +191 +191 +191 +189 +188 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +129 +129 +125 +126 +120 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +58 +55 +55 +51 +50 +51 +47 +47 +42 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +54 +54 +58 +59 +59 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +109 +110 +110 +116 +116 +119 +120 +125 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +174 +173 +173 +175 +175 +179 +179 +178 +182 +183 +185 +184 +185 +189 +189 +190 +190 +191 +194 +195 +196 +196 +196 +199 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +205 +205 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +205 +202 +202 +201 +200 +200 +200 +200 +200 +201 +200 +198 +199 +196 +196 +196 +194 +194 +190 +190 +189 +189 +189 +184 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +116 +115 +109 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +58 +54 +54 +50 +51 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +15 +15 +15 +16 +17 +19 +19 +20 +21 +20 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +50 +50 +54 +55 +59 +59 +59 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +110 +110 +110 +115 +115 +120 +120 +119 +125 +125 +130 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +174 +179 +179 +183 +182 +183 +184 +185 +188 +189 +189 +191 +191 +195 +194 +197 +196 +196 +198 +199 +201 +200 +200 +200 +200 +200 +200 +200 +202 +202 +205 +204 +205 +205 +204 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +204 +204 +205 +202 +202 +203 +201 +201 +200 +200 +200 +198 +199 +196 +196 +194 +195 +194 +190 +191 +188 +189 +188 +185 +185 +183 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +120 +116 +115 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +59 +59 +54 +55 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +42 +43 +43 +47 +47 +51 +51 +50 +54 +54 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +95 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +168 +169 +169 +172 +173 +175 +175 +175 +178 +179 +183 +183 +184 +185 +185 +189 +189 +191 +190 +190 +194 +195 +195 +194 +194 +197 +196 +199 +199 +199 +200 +201 +201 +200 +201 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +198 +198 +198 +197 +196 +194 +194 +195 +190 +190 +189 +189 +189 +184 +185 +183 +183 +179 +179 +178 +175 +175 +172 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +134 +129 +129 +125 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +73 +73 +68 +68 +64 +65 +65 +58 +59 +55 +54 +55 +51 +50 +47 +47 +48 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +24 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +46 +51 +50 +51 +55 +54 +58 +58 +58 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +110 +110 +116 +115 +120 +120 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +182 +182 +183 +182 +184 +184 +188 +189 +189 +191 +190 +195 +195 +195 +196 +197 +198 +198 +200 +200 +200 +200 +201 +202 +203 +202 +204 +204 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +201 +200 +200 +200 +200 +199 +198 +199 +196 +197 +194 +194 +190 +190 +190 +189 +189 +185 +185 +185 +183 +182 +179 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +125 +125 +119 +120 +115 +116 +115 +109 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +58 +55 +54 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +41 +40 +40 +37 +37 +33 +33 +33 +31 +31 +26 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +40 +41 +42 +43 +43 +47 +47 +51 +50 +56 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +125 +130 +130 +134 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +184 +185 +189 +188 +190 +191 +190 +194 +194 +197 +196 +197 +198 +199 +199 +198 +198 +200 +200 +200 +201 +201 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +201 +199 +198 +196 +197 +197 +194 +194 +191 +191 +190 +188 +188 +185 +184 +184 +183 +182 +178 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +129 +130 +126 +125 +120 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +100 +100 +96 +96 +97 +90 +90 +86 +86 +86 +81 +82 +76 +76 +72 +73 +72 +68 +68 +65 +64 +64 +58 +58 +58 +59 +59 +55 +54 +51 +51 +51 +47 +47 +43 +43 +42 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +15 +16 +17 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +54 +54 +58 +59 +58 +65 +64 +68 +68 +68 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +116 +115 +119 +119 +120 +125 +125 +130 +129 +134 +134 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +183 +183 +184 +185 +184 +184 +184 +188 +189 +190 +190 +191 +195 +195 +197 +197 +197 +199 +199 +200 +200 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +207 +207 +206 +206 +205 +204 +204 +205 +204 +202 +202 +201 +200 +200 +200 +200 +199 +198 +198 +197 +196 +194 +195 +194 +191 +190 +189 +188 +185 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +89 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +72 +68 +69 +64 +64 +64 +59 +58 +55 +55 +53 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +27 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +46 +50 +51 +54 +54 +55 +58 +59 +64 +64 +69 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +87 +90 +90 +95 +96 +96 +100 +100 +105 +105 +106 +110 +110 +116 +116 +121 +119 +119 +125 +126 +130 +130 +129 +134 +133 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +160 +165 +165 +165 +169 +169 +173 +173 +173 +175 +174 +175 +175 +175 +179 +178 +182 +183 +183 +184 +185 +188 +189 +189 +191 +190 +194 +195 +196 +196 +196 +199 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +205 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +201 +201 +200 +201 +200 +198 +198 +196 +196 +195 +194 +194 +190 +190 +189 +189 +189 +185 +184 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +130 +126 +125 +120 +120 +120 +115 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +69 +66 +64 +64 +59 +58 +55 +54 +55 +50 +50 +47 +46 +47 +43 +43 +43 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +14 +12 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +12 +15 +15 +17 +19 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +51 +50 +50 +54 +54 +58 +58 +59 +64 +64 +68 +69 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +85 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +115 +120 +120 +119 +125 +126 +130 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +178 +179 +182 +183 +183 +185 +185 +188 +189 +188 +191 +190 +195 +194 +194 +197 +197 +199 +198 +198 +200 +201 +200 +201 +201 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +205 +204 +204 +205 +204 +202 +202 +201 +201 +201 +200 +201 +199 +199 +196 +196 +197 +195 +195 +190 +190 +190 +188 +189 +185 +185 +185 +183 +182 +179 +179 +179 +174 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +134 +134 +134 +130 +129 +125 +125 +119 +120 +119 +116 +116 +109 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +69 +68 +65 +64 +59 +58 +58 +54 +55 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +40 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +26 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +44 +43 +43 +47 +46 +50 +50 +50 +54 +54 +59 +59 +59 +64 +64 +68 +68 +68 +73 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +116 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +179 +183 +182 +184 +185 +185 +188 +188 +191 +190 +190 +194 +194 +197 +197 +196 +198 +198 +201 +200 +200 +201 +200 +202 +202 +205 +204 +204 +204 +204 +207 +207 +207 +207 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +205 +202 +202 +200 +201 +200 +200 +200 +198 +198 +198 +197 +196 +195 +195 +195 +190 +190 +188 +188 +189 +185 +185 +182 +183 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +126 +119 +120 +115 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +73 +68 +68 +68 +68 +68 +65 +64 +59 +58 +59 +55 +54 +51 +51 +49 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +16 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +50 +50 +54 +55 +55 +59 +59 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +120 +126 +125 +129 +130 +129 +134 +134 +140 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +185 +185 +185 +188 +189 +190 +191 +190 +191 +190 +195 +194 +196 +196 +196 +198 +198 +201 +200 +201 +200 +201 +203 +202 +202 +204 +204 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +201 +200 +200 +198 +198 +196 +196 +197 +194 +195 +190 +191 +189 +188 +188 +185 +184 +183 +183 +183 +179 +179 +175 +174 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +134 +133 +133 +133 +133 +129 +129 +125 +125 +125 +120 +119 +116 +116 +116 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +68 +65 +64 +58 +58 +54 +54 +55 +50 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +18 +22 +21 +20 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +40 +41 +43 +43 +47 +47 +47 +50 +51 +55 +55 +59 +59 +58 +64 +64 +69 +68 +68 +72 +73 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +115 +116 +119 +119 +119 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +178 +182 +183 +185 +185 +184 +189 +188 +190 +191 +190 +195 +195 +196 +197 +197 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +205 +205 +204 +204 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +205 +204 +205 +205 +203 +202 +200 +200 +201 +200 +200 +199 +198 +197 +196 +196 +194 +194 +191 +191 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +144 +139 +139 +137 +133 +133 +129 +129 +125 +125 +125 +120 +120 +115 +115 +115 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +77 +72 +73 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +50 +51 +51 +46 +47 +42 +42 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +16 +17 +15 +15 +16 +15 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +22 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +51 +51 +54 +54 +55 +58 +59 +64 +64 +66 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +99 +100 +100 +105 +106 +109 +110 +112 +115 +116 +120 +120 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +184 +189 +189 +191 +190 +191 +194 +195 +197 +197 +199 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +202 +202 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +205 +203 +202 +202 +202 +201 +200 +201 +200 +200 +198 +199 +196 +196 +197 +194 +195 +191 +191 +189 +189 +189 +184 +184 +183 +183 +182 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +140 +133 +133 +133 +134 +133 +129 +129 +126 +126 +126 +120 +119 +116 +116 +111 +110 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +58 +58 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +21 +21 +21 +19 +19 +16 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +50 +55 +54 +59 +59 +59 +64 +64 +68 +69 +68 +72 +73 +72 +72 +72 +76 +76 +82 +82 +83 +85 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +119 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +179 +183 +182 +185 +184 +189 +189 +189 +191 +190 +194 +194 +194 +196 +197 +199 +198 +199 +200 +201 +201 +200 +200 +202 +202 +205 +204 +205 +204 +204 +206 +206 +207 +207 +207 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +201 +200 +200 +199 +199 +197 +197 +196 +194 +194 +190 +190 +191 +188 +188 +188 +188 +188 +185 +184 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +131 +129 +130 +125 +125 +119 +120 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +69 +68 +64 +64 +59 +58 +58 +55 +55 +51 +51 +51 +46 +46 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +16 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +47 +50 +50 +51 +51 +51 +54 +54 +58 +59 +59 +64 +64 +68 +68 +71 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +116 +120 +119 +124 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +172 +173 +175 +175 +178 +179 +179 +182 +183 +184 +184 +184 +188 +188 +191 +190 +190 +194 +194 +196 +196 +196 +198 +199 +200 +201 +201 +200 +200 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +207 +207 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +200 +200 +200 +200 +200 +200 +198 +199 +196 +197 +197 +195 +194 +190 +190 +189 +189 +189 +185 +185 +184 +184 +184 +183 +183 +179 +178 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +69 +64 +64 +59 +58 +55 +55 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +40 +43 +42 +47 +47 +47 +51 +50 +55 +54 +58 +58 +59 +64 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +109 +110 +115 +116 +119 +120 +119 +126 +126 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +183 +182 +185 +185 +188 +188 +191 +190 +191 +195 +194 +196 +196 +197 +198 +199 +200 +200 +201 +200 +200 +202 +202 +202 +205 +204 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +201 +201 +201 +200 +200 +198 +198 +199 +196 +196 +194 +194 +195 +191 +191 +191 +190 +190 +189 +188 +184 +184 +185 +183 +183 +179 +179 +176 +175 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +126 +120 +120 +119 +115 +116 +110 +110 +110 +105 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +36 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +46 +46 +47 +50 +50 +55 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +119 +125 +125 +130 +129 +129 +133 +133 +133 +134 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +182 +184 +185 +184 +189 +188 +190 +190 +190 +194 +195 +196 +197 +196 +198 +199 +201 +200 +200 +200 +200 +203 +202 +204 +204 +204 +204 +205 +204 +204 +205 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +201 +201 +201 +201 +199 +198 +199 +196 +196 +194 +195 +191 +190 +190 +189 +188 +185 +184 +184 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +158 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +130 +129 +125 +125 +126 +120 +120 +116 +116 +116 +110 +110 +105 +105 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +59 +58 +55 +55 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +54 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +110 +110 +110 +115 +115 +119 +120 +119 +126 +125 +129 +130 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +183 +183 +183 +185 +185 +189 +189 +190 +191 +191 +195 +194 +196 +196 +196 +198 +199 +201 +200 +201 +201 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +204 +205 +204 +205 +205 +203 +202 +200 +201 +200 +200 +201 +198 +199 +196 +197 +196 +195 +195 +191 +190 +190 +189 +189 +185 +185 +184 +183 +183 +179 +178 +179 +175 +175 +173 +173 +169 +169 +169 +165 +164 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +116 +110 +110 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +85 +86 +82 +82 +77 +76 +76 +72 +73 +68 +68 +69 +64 +64 +59 +59 +59 +55 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +32 +33 +32 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +54 +59 +58 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +116 +120 +119 +125 +125 +130 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +178 +179 +183 +182 +183 +185 +185 +185 +185 +184 +189 +189 +191 +190 +191 +194 +195 +197 +196 +196 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +201 +201 +200 +198 +199 +196 +197 +197 +195 +195 +191 +190 +190 +188 +189 +185 +184 +182 +183 +183 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +129 +130 +126 +125 +120 +119 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +54 +54 +51 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +46 +47 +50 +50 +55 +55 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +119 +120 +126 +126 +129 +130 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +162 +161 +161 +165 +164 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +184 +184 +186 +189 +189 +191 +191 +194 +195 +195 +197 +197 +198 +199 +199 +201 +200 +201 +200 +200 +200 +200 +202 +202 +203 +204 +205 +205 +205 +205 +206 +207 +207 +207 +206 +207 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +201 +201 +200 +201 +201 +198 +198 +196 +197 +196 +194 +194 +191 +191 +190 +188 +189 +185 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +170 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +129 +130 +125 +126 +120 +120 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +69 +68 +68 +64 +64 +58 +58 +58 +54 +55 +55 +55 +55 +51 +51 +47 +47 +46 +42 +43 +40 +41 +41 +37 +37 +33 +33 +31 +32 +31 +27 +27 +25 +25 +24 +21 +21 +21 +21 +21 +19 +19 +17 +18 +18 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +46 +47 +46 +50 +50 +54 +54 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +126 +125 +126 +129 +129 +133 +134 +140 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +178 +182 +183 +183 +185 +184 +189 +189 +189 +190 +191 +190 +190 +191 +194 +194 +196 +196 +196 +198 +199 +201 +201 +200 +200 +200 +203 +202 +204 +204 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +205 +205 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +196 +196 +195 +195 +194 +191 +190 +189 +189 +189 +185 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +130 +130 +125 +126 +126 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +68 +68 +68 +64 +64 +58 +59 +58 +55 +55 +51 +50 +49 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +30 +31 +31 +31 +27 +28 +25 +25 +25 +21 +21 +19 +20 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +32 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +55 +59 +59 +58 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +111 +116 +115 +120 +120 +125 +125 +126 +129 +130 +133 +134 +134 +139 +139 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +179 +183 +183 +185 +185 +185 +189 +188 +190 +191 +194 +195 +195 +197 +196 +198 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +199 +199 +196 +196 +194 +195 +191 +191 +190 +188 +188 +184 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +139 +139 +140 +134 +133 +129 +129 +129 +126 +126 +119 +119 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +74 +68 +68 +65 +64 +58 +58 +59 +54 +54 +51 +51 +50 +47 +47 +47 +46 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +31 +30 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +34 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +51 +50 +50 +55 +54 +58 +58 +59 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +116 +115 +115 +119 +119 +125 +125 +126 +130 +129 +133 +134 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +178 +179 +179 +183 +183 +184 +185 +184 +188 +188 +190 +190 +191 +195 +195 +197 +196 +196 +198 +199 +200 +200 +201 +201 +201 +202 +202 +204 +204 +204 +205 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +198 +198 +197 +196 +196 +195 +194 +190 +191 +191 +188 +189 +184 +185 +185 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +156 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +134 +129 +130 +129 +125 +125 +120 +119 +120 +115 +116 +115 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +68 +68 +69 +64 +64 +58 +59 +58 +54 +54 +51 +50 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +42 +47 +47 +50 +50 +50 +54 +54 +59 +59 +59 +64 +65 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +105 +106 +110 +110 +116 +115 +120 +119 +119 +126 +126 +129 +129 +129 +133 +133 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +154 +157 +156 +161 +161 +164 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +183 +182 +185 +184 +185 +189 +188 +190 +191 +192 +194 +194 +196 +196 +198 +199 +199 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +207 +206 +204 +205 +204 +204 +204 +202 +202 +201 +200 +200 +201 +201 +199 +198 +199 +197 +197 +195 +195 +191 +191 +190 +188 +189 +184 +184 +184 +183 +182 +178 +178 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +119 +120 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +59 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +47 +50 +51 +55 +54 +54 +58 +59 +64 +65 +64 +68 +68 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +115 +119 +120 +120 +126 +126 +130 +129 +131 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +160 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +184 +184 +189 +189 +191 +190 +191 +194 +194 +197 +197 +196 +198 +199 +200 +200 +201 +200 +201 +203 +203 +204 +205 +205 +204 +204 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +196 +196 +195 +194 +194 +191 +191 +189 +188 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +172 +173 +173 +169 +169 +169 +169 +169 +165 +165 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +126 +119 +119 +120 +119 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +51 +51 +47 +47 +46 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +37 +36 +37 +37 +37 +41 +41 +42 +43 +43 +46 +47 +50 +51 +51 +54 +54 +59 +59 +59 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +109 +110 +110 +115 +116 +120 +119 +119 +125 +125 +129 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +189 +188 +189 +190 +191 +194 +194 +196 +196 +197 +199 +198 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +204 +205 +205 +205 +204 +203 +202 +202 +200 +201 +200 +200 +200 +199 +198 +196 +197 +196 +195 +194 +190 +190 +189 +189 +189 +185 +185 +183 +182 +183 +178 +179 +178 +178 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +140 +139 +139 +133 +133 +129 +130 +130 +125 +126 +120 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +91 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +65 +64 +59 +59 +54 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +33 +31 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +48 +50 +51 +54 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +115 +116 +119 +120 +126 +125 +125 +129 +130 +134 +134 +133 +139 +139 +143 +143 +146 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +174 +178 +179 +178 +183 +182 +185 +184 +189 +188 +189 +190 +190 +194 +195 +195 +196 +197 +198 +199 +198 +200 +200 +200 +200 +200 +203 +203 +204 +204 +204 +204 +204 +206 +207 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +204 +204 +204 +205 +204 +202 +202 +203 +200 +200 +200 +200 +199 +198 +198 +196 +197 +194 +194 +194 +190 +190 +190 +190 +191 +188 +189 +185 +185 +184 +183 +182 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +125 +125 +125 +120 +119 +116 +115 +115 +110 +109 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +54 +50 +50 +47 +46 +47 +43 +42 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +22 +19 +20 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +36 +41 +41 +43 +43 +43 +47 +47 +47 +47 +46 +51 +51 +55 +54 +55 +58 +58 +65 +65 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +184 +185 +189 +188 +188 +190 +190 +194 +194 +195 +196 +197 +198 +199 +201 +201 +201 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +201 +201 +200 +201 +201 +198 +198 +199 +196 +196 +194 +195 +192 +191 +190 +189 +188 +184 +185 +185 +183 +182 +179 +178 +178 +175 +174 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +130 +130 +125 +126 +119 +119 +120 +115 +115 +110 +110 +106 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +76 +72 +72 +69 +68 +69 +64 +64 +58 +58 +55 +54 +55 +50 +50 +46 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +46 +51 +51 +54 +55 +55 +58 +58 +64 +64 +64 +69 +68 +72 +72 +73 +77 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +156 +157 +161 +161 +165 +164 +165 +169 +169 +173 +172 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +189 +189 +188 +191 +191 +195 +194 +194 +196 +197 +197 +197 +197 +198 +198 +200 +200 +200 +200 +200 +203 +202 +203 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +203 +202 +202 +200 +201 +200 +200 +200 +198 +198 +196 +197 +197 +194 +194 +195 +194 +194 +190 +190 +189 +188 +188 +184 +184 +182 +182 +179 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +156 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +99 +100 +96 +96 +95 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +55 +54 +51 +51 +46 +47 +47 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +12 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +50 +50 +54 +54 +58 +58 +59 +65 +64 +68 +68 +71 +73 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +109 +110 +116 +116 +120 +119 +126 +126 +125 +130 +129 +133 +134 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +160 +161 +164 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +179 +179 +183 +183 +182 +185 +184 +188 +188 +188 +191 +191 +194 +194 +195 +197 +196 +198 +198 +201 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +202 +200 +200 +201 +201 +201 +201 +200 +198 +198 +198 +197 +197 +195 +194 +191 +190 +191 +189 +189 +184 +184 +184 +182 +183 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +115 +116 +109 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +69 +64 +64 +64 +59 +58 +54 +54 +51 +50 +51 +47 +46 +43 +43 +43 +41 +41 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +50 +50 +55 +54 +59 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +101 +100 +100 +106 +106 +109 +109 +110 +115 +116 +119 +119 +120 +126 +125 +129 +130 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +169 +172 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +188 +190 +190 +190 +195 +194 +194 +194 +194 +196 +196 +199 +199 +198 +200 +201 +201 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +201 +201 +198 +198 +198 +198 +198 +196 +197 +194 +195 +194 +190 +191 +188 +188 +188 +185 +185 +183 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +129 +129 +126 +125 +125 +120 +119 +116 +116 +115 +110 +110 +106 +105 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +55 +55 +50 +50 +46 +47 +47 +43 +43 +41 +40 +42 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +36 +37 +40 +40 +43 +43 +43 +47 +47 +50 +50 +50 +54 +55 +58 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +77 +83 +82 +82 +86 +85 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +109 +116 +115 +119 +120 +119 +125 +126 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +148 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +185 +189 +189 +191 +191 +191 +194 +194 +197 +197 +196 +198 +198 +200 +201 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +207 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +205 +205 +205 +205 +203 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +197 +196 +195 +195 +190 +191 +191 +189 +189 +185 +184 +183 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +120 +120 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +77 +77 +72 +72 +68 +68 +68 +64 +64 +59 +59 +58 +54 +55 +51 +51 +51 +46 +47 +42 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +16 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +42 +43 +47 +46 +47 +51 +50 +54 +54 +55 +59 +59 +64 +65 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +105 +106 +109 +110 +115 +119 +119 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +179 +183 +184 +184 +185 +184 +189 +189 +191 +191 +191 +194 +195 +197 +196 +199 +199 +199 +200 +200 +200 +201 +200 +202 +203 +203 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +203 +202 +202 +201 +200 +201 +200 +201 +198 +198 +196 +196 +196 +194 +195 +190 +191 +189 +189 +189 +185 +184 +182 +182 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +160 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +54 +54 +54 +50 +50 +47 +46 +47 +43 +43 +43 +42 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +51 +51 +51 +54 +55 +59 +59 +59 +64 +64 +69 +68 +69 +73 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +119 +125 +126 +130 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +174 +179 +179 +182 +182 +183 +185 +185 +188 +189 +190 +191 +191 +194 +194 +197 +196 +196 +199 +198 +199 +198 +198 +200 +201 +200 +200 +201 +202 +203 +204 +204 +204 +204 +205 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +204 +205 +202 +203 +200 +201 +200 +200 +200 +199 +199 +197 +197 +196 +194 +195 +190 +190 +190 +189 +188 +185 +185 +185 +183 +183 +179 +178 +179 +175 +175 +173 +172 +170 +169 +168 +165 +165 +161 +161 +161 +157 +156 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +134 +133 +129 +129 +125 +125 +120 +120 +119 +116 +117 +110 +110 +110 +106 +105 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +81 +82 +76 +76 +73 +72 +72 +68 +68 +64 +65 +64 +58 +59 +58 +58 +59 +55 +55 +51 +51 +51 +46 +47 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +50 +50 +54 +54 +58 +59 +59 +65 +64 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +109 +109 +115 +116 +119 +119 +120 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +184 +185 +185 +184 +185 +188 +188 +190 +190 +191 +195 +194 +196 +196 +198 +198 +198 +200 +200 +200 +201 +200 +202 +202 +205 +204 +205 +204 +205 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +199 +201 +198 +198 +198 +196 +194 +195 +194 +191 +190 +189 +188 +185 +185 +185 +182 +183 +179 +179 +178 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +129 +125 +125 +119 +119 +119 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +100 +100 +95 +96 +89 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +69 +68 +64 +64 +58 +59 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +40 +40 +43 +43 +43 +47 +47 +50 +51 +55 +55 +54 +59 +58 +59 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +83 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +116 +115 +120 +120 +125 +126 +125 +129 +129 +133 +133 +135 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +184 +185 +189 +189 +191 +191 +190 +195 +194 +196 +196 +197 +198 +199 +200 +200 +201 +200 +201 +203 +202 +204 +205 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +205 +205 +202 +202 +201 +200 +200 +201 +200 +198 +199 +198 +196 +197 +195 +194 +194 +191 +190 +188 +188 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +137 +133 +133 +130 +129 +125 +125 +125 +120 +119 +115 +116 +116 +110 +110 +110 +110 +109 +106 +106 +100 +100 +99 +96 +96 +90 +90 +87 +87 +86 +82 +82 +76 +76 +76 +73 +73 +68 +69 +68 +64 +65 +64 +64 +64 +58 +58 +54 +54 +55 +51 +50 +46 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +47 +47 +47 +51 +51 +54 +54 +54 +58 +58 +65 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +117 +120 +119 +126 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +143 +144 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +178 +182 +183 +185 +184 +184 +189 +188 +190 +191 +191 +194 +195 +197 +196 +198 +198 +199 +200 +200 +200 +200 +200 +202 +202 +204 +205 +204 +204 +204 +207 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +194 +195 +195 +190 +191 +188 +189 +185 +185 +185 +182 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +140 +134 +133 +133 +130 +130 +129 +130 +130 +125 +125 +120 +120 +120 +115 +116 +110 +110 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +77 +76 +72 +72 +73 +68 +68 +64 +64 +59 +58 +58 +55 +55 +50 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +20 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +46 +47 +50 +50 +51 +54 +54 +58 +59 +65 +65 +64 +68 +69 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +103 +106 +106 +110 +110 +116 +116 +116 +119 +119 +125 +125 +125 +130 +129 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +175 +179 +178 +183 +182 +183 +184 +185 +189 +189 +190 +190 +190 +194 +195 +196 +197 +196 +198 +199 +200 +200 +201 +200 +200 +202 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +201 +200 +200 +200 +200 +198 +198 +196 +197 +195 +195 +194 +190 +190 +188 +188 +189 +185 +184 +183 +182 +182 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +122 +119 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +74 +72 +72 +68 +68 +64 +65 +64 +58 +59 +55 +55 +55 +51 +50 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +51 +50 +50 +55 +55 +59 +59 +58 +64 +64 +64 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +110 +109 +109 +115 +115 +119 +120 +119 +125 +125 +129 +129 +132 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +176 +179 +179 +182 +182 +184 +184 +184 +189 +189 +191 +191 +191 +194 +194 +197 +197 +197 +199 +199 +200 +200 +200 +200 +200 +202 +202 +205 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +202 +201 +201 +200 +200 +201 +198 +198 +198 +196 +196 +195 +194 +195 +191 +191 +188 +188 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +146 +143 +143 +141 +139 +139 +134 +133 +129 +129 +129 +125 +125 +119 +120 +119 +116 +115 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +55 +50 +50 +46 +47 +43 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +24 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +41 +40 +43 +43 +43 +47 +46 +50 +51 +50 +54 +54 +58 +58 +58 +65 +64 +69 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +183 +182 +184 +185 +189 +188 +189 +190 +191 +194 +195 +194 +197 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +205 +204 +204 +204 +205 +202 +202 +202 +200 +200 +200 +201 +200 +198 +198 +196 +196 +196 +194 +194 +191 +191 +191 +189 +189 +184 +185 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +173 +173 +172 +169 +169 +165 +165 +166 +161 +161 +157 +157 +157 +157 +157 +151 +151 +146 +147 +147 +143 +143 +139 +140 +139 +133 +133 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +112 +110 +109 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +81 +82 +82 +76 +76 +73 +72 +73 +68 +68 +64 +64 +58 +58 +58 +55 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +48 +51 +50 +54 +55 +58 +58 +58 +64 +64 +68 +68 +68 +73 +72 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +105 +106 +110 +109 +115 +116 +116 +120 +119 +125 +125 +125 +130 +129 +134 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +174 +178 +179 +178 +183 +183 +184 +184 +189 +189 +188 +190 +190 +194 +194 +194 +196 +197 +199 +198 +198 +201 +201 +200 +200 +200 +202 +203 +204 +204 +205 +205 +204 +206 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +205 +204 +204 +204 +205 +202 +202 +201 +200 +201 +201 +201 +199 +198 +197 +197 +197 +194 +194 +190 +190 +191 +188 +188 +185 +184 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +168 +169 +165 +165 +161 +161 +161 +156 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +130 +125 +126 +120 +119 +115 +115 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +73 +72 +68 +68 +65 +64 +64 +59 +58 +55 +55 +55 +51 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +38 +37 +41 +40 +43 +43 +47 +47 +47 +51 +51 +54 +55 +54 +59 +58 +59 +58 +58 +64 +64 +68 +68 +68 +73 +72 +76 +76 +79 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +120 +119 +120 +125 +125 +129 +129 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +182 +184 +184 +184 +188 +188 +190 +191 +191 +194 +194 +197 +197 +197 +199 +199 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +204 +205 +205 +204 +204 +205 +205 +203 +202 +203 +200 +200 +200 +200 +200 +199 +198 +197 +196 +196 +195 +194 +191 +190 +191 +188 +189 +184 +184 +184 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +146 +147 +145 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +115 +116 +109 +109 +106 +105 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +55 +54 +51 +50 +46 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +15 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +24 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +56 +58 +58 +64 +65 +69 +69 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +109 +110 +110 +116 +115 +119 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +188 +188 +190 +191 +194 +194 +197 +196 +197 +198 +198 +200 +201 +200 +201 +201 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +207 +206 +205 +204 +204 +204 +205 +204 +204 +204 +202 +202 +200 +201 +201 +200 +201 +199 +199 +200 +196 +196 +194 +194 +190 +191 +191 +188 +188 +185 +185 +184 +182 +182 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +144 +143 +139 +139 +140 +133 +133 +129 +129 +130 +126 +126 +120 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +65 +64 +64 +59 +58 +54 +55 +55 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +12 +13 +13 +14 +13 +14 +15 +15 +16 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +26 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +44 +47 +47 +51 +50 +54 +54 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +85 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +126 +125 +125 +130 +129 +133 +133 +133 +140 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +160 +160 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +185 +189 +189 +189 +190 +190 +194 +194 +195 +196 +196 +198 +199 +199 +200 +200 +200 +200 +200 +202 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +203 +201 +200 +200 +200 +200 +199 +198 +199 +196 +197 +195 +194 +194 +190 +191 +191 +190 +190 +189 +188 +184 +185 +185 +183 +183 +179 +179 +175 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +129 +129 +125 +126 +120 +120 +120 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +77 +76 +72 +72 +68 +68 +68 +64 +58 +58 +58 +58 +54 +55 +50 +51 +50 +46 +47 +43 +42 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +35 +37 +36 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +59 +59 +65 +64 +68 +68 +68 +72 +72 +77 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +109 +110 +115 +116 +119 +119 +119 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +185 +185 +188 +188 +191 +190 +190 +194 +195 +196 +197 +196 +198 +198 +200 +200 +201 +200 +200 +202 +203 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +205 +204 +205 +202 +202 +203 +200 +200 +200 +201 +200 +199 +198 +198 +198 +198 +196 +196 +194 +194 +195 +191 +191 +188 +188 +185 +185 +185 +183 +182 +178 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +126 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +65 +64 +59 +58 +54 +54 +55 +50 +51 +47 +46 +43 +42 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +14 +15 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +54 +58 +59 +65 +64 +68 +69 +69 +73 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +116 +120 +120 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +183 +185 +185 +189 +189 +188 +190 +190 +195 +194 +195 +196 +197 +198 +198 +199 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +205 +204 +204 +204 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +203 +202 +202 +200 +200 +200 +200 +201 +199 +198 +196 +197 +195 +194 +195 +190 +190 +189 +189 +188 +185 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +125 +125 +119 +119 +120 +115 +115 +109 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +55 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +26 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +46 +47 +50 +51 +51 +54 +54 +55 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +115 +119 +120 +125 +125 +125 +130 +129 +133 +133 +134 +140 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +184 +189 +188 +189 +191 +190 +194 +195 +195 +196 +196 +197 +196 +197 +198 +199 +201 +200 +200 +200 +201 +202 +202 +203 +204 +205 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +205 +204 +204 +202 +203 +200 +200 +200 +200 +200 +198 +198 +196 +196 +197 +195 +195 +191 +191 +190 +188 +189 +184 +185 +185 +182 +183 +179 +178 +175 +175 +174 +173 +172 +168 +169 +170 +165 +165 +161 +160 +162 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +120 +120 +120 +116 +115 +110 +110 +110 +106 +105 +100 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +59 +55 +55 +50 +50 +51 +47 +47 +42 +42 +44 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +54 +58 +58 +58 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +116 +115 +119 +119 +126 +125 +125 +129 +130 +134 +133 +133 +139 +139 +140 +139 +139 +144 +144 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +178 +179 +179 +179 +179 +183 +182 +184 +184 +185 +188 +188 +191 +190 +191 +194 +195 +197 +196 +198 +199 +198 +200 +200 +200 +200 +200 +202 +202 +202 +202 +202 +204 +205 +204 +204 +205 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +200 +201 +201 +198 +198 +196 +197 +195 +195 +194 +190 +190 +189 +188 +189 +184 +184 +183 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +120 +120 +115 +115 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +83 +77 +76 +72 +72 +73 +68 +68 +64 +64 +58 +58 +59 +55 +55 +51 +51 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +54 +55 +58 +59 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +120 +125 +125 +126 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +179 +179 +182 +182 +185 +184 +185 +188 +189 +189 +189 +189 +191 +191 +195 +195 +195 +197 +196 +199 +198 +200 +200 +201 +200 +200 +202 +202 +203 +204 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +205 +204 +204 +205 +204 +202 +203 +202 +200 +200 +200 +200 +201 +199 +199 +196 +196 +197 +194 +194 +191 +190 +191 +189 +188 +184 +185 +183 +182 +183 +178 +179 +175 +175 +175 +172 +173 +169 +168 +168 +165 +165 +161 +160 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +130 +125 +125 +119 +120 +119 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +64 +65 +58 +59 +59 +55 +54 +51 +51 +51 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +20 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +40 +40 +43 +43 +42 +47 +47 +51 +51 +51 +54 +54 +58 +58 +59 +64 +64 +68 +68 +73 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +111 +116 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +164 +165 +168 +169 +169 +173 +173 +175 +175 +175 +178 +179 +179 +178 +179 +183 +182 +185 +184 +185 +189 +189 +191 +191 +192 +195 +195 +197 +197 +198 +198 +198 +200 +201 +200 +200 +200 +202 +203 +205 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +196 +196 +194 +194 +190 +190 +190 +189 +189 +184 +185 +185 +183 +183 +179 +178 +178 +174 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +116 +115 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +64 +64 +58 +58 +54 +54 +55 +51 +51 +46 +46 +46 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +29 +27 +27 +25 +25 +21 +20 +21 +19 +19 +17 +17 +17 +15 +15 +15 +14 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +34 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +52 +51 +51 +55 +55 +59 +58 +59 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +91 +96 +96 +101 +100 +100 +106 +106 +110 +110 +110 +116 +116 +115 +115 +116 +119 +120 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +146 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +175 +178 +178 +179 +182 +183 +185 +185 +185 +189 +189 +190 +190 +191 +195 +194 +197 +196 +196 +198 +199 +199 +200 +201 +201 +200 +202 +202 +204 +204 +205 +204 +204 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +205 +205 +204 +205 +202 +202 +201 +200 +200 +201 +200 +198 +198 +198 +196 +197 +195 +195 +194 +191 +191 +189 +188 +188 +185 +184 +183 +183 +183 +179 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +129 +129 +125 +126 +126 +119 +120 +116 +115 +115 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +65 +64 +65 +58 +58 +54 +54 +55 +51 +51 +46 +47 +43 +43 +42 +41 +41 +42 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +55 +54 +58 +58 +58 +64 +64 +68 +68 +67 +72 +72 +76 +77 +83 +82 +82 +86 +86 +90 +91 +90 +95 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +117 +119 +120 +125 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +185 +189 +189 +191 +191 +191 +195 +195 +196 +196 +198 +198 +199 +200 +200 +200 +200 +201 +202 +203 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +205 +205 +204 +204 +203 +202 +201 +201 +200 +200 +201 +198 +198 +198 +196 +197 +194 +195 +194 +190 +190 +188 +189 +185 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +126 +119 +120 +120 +115 +115 +110 +109 +111 +106 +106 +99 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +61 +58 +58 +54 +54 +50 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +51 +54 +54 +59 +58 +64 +64 +64 +69 +68 +72 +72 +72 +76 +77 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +110 +110 +116 +116 +115 +115 +115 +119 +120 +120 +120 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +142 +143 +144 +148 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +188 +190 +191 +191 +195 +194 +197 +196 +196 +199 +198 +200 +200 +200 +200 +201 +202 +202 +203 +204 +204 +205 +204 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +203 +200 +201 +201 +200 +199 +198 +199 +196 +196 +194 +195 +194 +190 +190 +189 +188 +189 +184 +184 +182 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +131 +129 +129 +125 +125 +119 +119 +119 +116 +116 +110 +109 +110 +106 +106 +105 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +73 +72 +72 +68 +68 +69 +68 +68 +64 +64 +58 +58 +59 +54 +54 +50 +51 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +16 +15 +14 +13 +13 +12 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +50 +50 +51 +55 +54 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +105 +110 +109 +115 +115 +118 +119 +120 +125 +126 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +167 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +189 +188 +188 +190 +190 +194 +194 +195 +196 +197 +199 +198 +200 +200 +201 +200 +201 +202 +202 +202 +204 +205 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +205 +204 +204 +204 +204 +204 +205 +205 +202 +203 +200 +200 +200 +201 +201 +198 +199 +198 +196 +197 +194 +194 +195 +190 +190 +188 +189 +184 +184 +184 +183 +183 +179 +179 +179 +175 +174 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +125 +125 +120 +119 +119 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +59 +55 +55 +55 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +52 +54 +54 +58 +58 +65 +65 +64 +68 +68 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +105 +110 +110 +110 +116 +115 +119 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +140 +144 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +185 +188 +189 +190 +190 +191 +195 +194 +196 +196 +196 +198 +198 +201 +200 +200 +200 +201 +202 +203 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +203 +201 +200 +201 +200 +201 +198 +199 +196 +196 +194 +194 +194 +191 +190 +189 +188 +188 +185 +185 +185 +185 +185 +183 +182 +179 +179 +179 +174 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +134 +133 +131 +129 +129 +126 +125 +120 +120 +119 +115 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +55 +50 +50 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +54 +59 +58 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +116 +116 +119 +120 +120 +125 +125 +129 +130 +134 +133 +133 +139 +139 +143 +144 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +179 +178 +179 +183 +183 +184 +185 +185 +188 +189 +191 +191 +190 +194 +195 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +203 +201 +201 +200 +200 +201 +198 +198 +198 +196 +196 +195 +195 +194 +191 +191 +188 +188 +189 +184 +184 +182 +182 +183 +178 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +160 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +140 +139 +133 +133 +130 +129 +130 +126 +126 +120 +120 +120 +115 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +59 +55 +55 +51 +51 +50 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +20 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +51 +55 +55 +58 +58 +59 +65 +64 +69 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +87 +90 +90 +91 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +125 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +150 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +185 +188 +188 +191 +190 +191 +194 +194 +196 +197 +197 +199 +199 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +204 +203 +203 +200 +200 +200 +200 +200 +199 +198 +198 +196 +197 +195 +194 +195 +191 +190 +188 +189 +186 +185 +185 +183 +182 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +150 +147 +147 +144 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +119 +119 +116 +115 +109 +110 +110 +106 +106 +100 +99 +99 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +58 +58 +55 +54 +51 +51 +47 +46 +46 +43 +43 +40 +41 +40 +37 +37 +33 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +20 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +46 +46 +51 +51 +55 +54 +55 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +81 +86 +86 +86 +90 +89 +96 +96 +96 +100 +100 +106 +105 +110 +109 +110 +116 +116 +119 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +185 +188 +188 +188 +191 +191 +194 +195 +197 +197 +197 +198 +198 +200 +200 +201 +201 +201 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +202 +200 +201 +201 +200 +200 +199 +199 +196 +197 +195 +194 +195 +190 +190 +188 +189 +188 +184 +184 +183 +183 +183 +179 +179 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +59 +58 +58 +54 +54 +50 +50 +51 +46 +47 +43 +43 +42 +41 +41 +36 +38 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +12 +16 +15 +17 +16 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +33 +33 +33 +37 +37 +40 +41 +40 +43 +43 +47 +47 +48 +51 +50 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +126 +125 +126 +129 +130 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +184 +188 +189 +191 +191 +195 +194 +195 +196 +197 +198 +198 +198 +200 +200 +200 +200 +200 +200 +201 +203 +202 +202 +204 +205 +205 +204 +205 +207 +207 +206 +207 +207 +207 +207 +206 +206 +206 +206 +206 +207 +206 +205 +204 +204 +205 +204 +202 +202 +202 +201 +201 +200 +201 +199 +199 +199 +197 +196 +194 +195 +194 +190 +190 +189 +189 +188 +185 +185 +185 +185 +185 +183 +183 +179 +178 +179 +175 +174 +172 +173 +171 +169 +169 +165 +165 +161 +160 +161 +157 +157 +151 +150 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +130 +125 +125 +119 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +69 +68 +64 +65 +59 +58 +58 +54 +55 +50 +50 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +42 +47 +47 +47 +50 +50 +55 +54 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +87 +85 +89 +90 +96 +95 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +119 +125 +126 +125 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +183 +184 +184 +188 +189 +188 +190 +190 +194 +195 +194 +196 +196 +198 +198 +199 +201 +201 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +204 +205 +204 +205 +202 +202 +200 +200 +201 +200 +201 +198 +198 +198 +196 +196 +197 +197 +197 +194 +194 +190 +190 +191 +189 +188 +184 +185 +184 +183 +182 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +160 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +140 +134 +133 +129 +129 +129 +125 +125 +119 +119 +120 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +91 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +69 +64 +64 +58 +59 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +26 +31 +31 +31 +32 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +51 +55 +54 +58 +58 +63 +64 +64 +68 +68 +72 +72 +72 +76 +76 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +109 +109 +110 +116 +116 +119 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +188 +189 +189 +190 +190 +195 +195 +197 +197 +197 +198 +198 +200 +201 +200 +201 +201 +201 +201 +200 +202 +202 +205 +205 +204 +204 +205 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +201 +198 +198 +196 +197 +196 +195 +195 +190 +190 +190 +188 +188 +185 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +130 +125 +126 +119 +120 +119 +116 +116 +109 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +58 +54 +55 +55 +55 +55 +50 +50 +46 +47 +47 +43 +43 +41 +41 +42 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +26 +27 +27 +31 +31 +32 +33 +36 +37 +37 +40 +41 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +55 +54 +58 +59 +64 +65 +64 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +111 +116 +116 +115 +119 +119 +126 +126 +130 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +175 +175 +175 +179 +179 +182 +183 +183 +185 +184 +185 +184 +185 +188 +189 +191 +191 +191 +195 +195 +197 +196 +197 +199 +199 +200 +200 +200 +201 +201 +202 +203 +204 +205 +204 +204 +205 +205 +204 +205 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +207 +207 +206 +205 +205 +204 +204 +204 +202 +202 +202 +200 +201 +201 +200 +200 +199 +198 +196 +197 +197 +194 +195 +190 +190 +188 +189 +189 +185 +185 +182 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +148 +143 +143 +139 +139 +140 +134 +133 +129 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +59 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +40 +38 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +20 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +54 +59 +59 +59 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +119 +126 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +189 +189 +189 +190 +191 +194 +194 +196 +197 +197 +198 +199 +200 +200 +200 +200 +200 +200 +201 +201 +202 +202 +204 +204 +205 +204 +204 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +205 +204 +202 +202 +200 +200 +201 +201 +201 +199 +198 +197 +196 +196 +195 +195 +190 +190 +191 +188 +189 +185 +184 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +126 +119 +120 +116 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +77 +72 +72 +68 +68 +65 +65 +64 +59 +58 +54 +55 +54 +50 +51 +51 +51 +51 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +58 +58 +58 +65 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +119 +125 +126 +129 +130 +130 +133 +133 +139 +138 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +174 +176 +178 +179 +182 +183 +184 +184 +184 +188 +189 +191 +190 +191 +194 +194 +195 +194 +194 +196 +197 +198 +198 +199 +200 +201 +200 +201 +202 +202 +203 +204 +204 +204 +205 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +205 +205 +205 +203 +203 +203 +200 +201 +200 +200 +200 +199 +198 +197 +196 +196 +195 +195 +191 +190 +191 +188 +189 +185 +185 +185 +182 +182 +178 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +134 +133 +130 +129 +129 +125 +125 +120 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +64 +64 +65 +58 +58 +54 +54 +55 +51 +51 +47 +47 +47 +42 +43 +41 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +51 +51 +55 +55 +54 +59 +58 +64 +65 +65 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +168 +169 +172 +173 +173 +175 +175 +179 +179 +178 +182 +182 +183 +183 +182 +184 +185 +188 +189 +189 +190 +191 +195 +194 +196 +196 +197 +198 +198 +200 +201 +201 +201 +200 +203 +202 +202 +204 +204 +204 +205 +204 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +207 +205 +204 +205 +204 +204 +205 +205 +204 +202 +202 +200 +201 +200 +200 +200 +198 +199 +199 +196 +197 +194 +195 +191 +191 +190 +189 +189 +185 +185 +184 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +130 +125 +126 +125 +119 +119 +115 +115 +116 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +65 +58 +58 +55 +55 +54 +51 +50 +47 +48 +46 +43 +42 +43 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +30 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +34 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +55 +55 +55 +58 +59 +64 +64 +64 +69 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +120 +120 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +182 +182 +183 +184 +185 +188 +188 +189 +190 +190 +194 +194 +194 +196 +197 +198 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +205 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +204 +204 +204 +204 +204 +202 +203 +201 +201 +200 +201 +200 +198 +198 +198 +199 +199 +196 +196 +195 +195 +194 +190 +190 +188 +188 +188 +184 +184 +183 +183 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +125 +125 +125 +120 +119 +115 +115 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +68 +68 +69 +64 +64 +58 +58 +59 +54 +54 +51 +51 +47 +47 +47 +43 +42 +41 +40 +41 +37 +38 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +20 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +64 +64 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +116 +119 +120 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +156 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +185 +185 +189 +189 +189 +191 +191 +194 +194 +196 +196 +197 +198 +198 +200 +201 +201 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +207 +207 +207 +206 +206 +207 +204 +204 +204 +205 +204 +203 +203 +202 +200 +200 +201 +200 +200 +199 +199 +196 +196 +197 +194 +194 +190 +191 +189 +189 +188 +185 +184 +183 +183 +183 +179 +178 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +133 +133 +133 +129 +130 +126 +126 +126 +119 +119 +116 +116 +113 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +65 +64 +59 +59 +54 +54 +54 +50 +50 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +54 +59 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +101 +100 +106 +106 +110 +110 +109 +116 +116 +119 +119 +120 +126 +125 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +188 +189 +188 +190 +191 +194 +194 +194 +196 +197 +198 +198 +199 +200 +200 +200 +200 +200 +202 +203 +204 +204 +205 +204 +204 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +205 +204 +204 +202 +202 +200 +200 +200 +201 +200 +198 +198 +197 +197 +197 +194 +194 +190 +191 +190 +188 +189 +185 +184 +184 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +144 +139 +139 +139 +133 +133 +129 +129 +130 +126 +126 +119 +119 +115 +115 +115 +110 +110 +106 +105 +106 +100 +99 +100 +100 +100 +96 +96 +90 +90 +90 +86 +85 +82 +82 +77 +76 +76 +72 +73 +68 +68 +68 +64 +64 +59 +59 +58 +55 +55 +51 +50 +50 +47 +47 +43 +43 +43 +40 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +24 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +42 +47 +47 +47 +51 +50 +54 +54 +55 +58 +59 +64 +65 +65 +68 +68 +72 +72 +72 +76 +77 +82 +82 +84 +86 +85 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +109 +110 +110 +109 +115 +115 +120 +119 +120 +125 +125 +129 +129 +132 +133 +133 +140 +140 +143 +143 +143 +148 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +177 +179 +178 +182 +182 +185 +184 +185 +188 +189 +190 +191 +191 +194 +194 +196 +197 +196 +198 +199 +201 +200 +201 +200 +201 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +207 +205 +205 +204 +204 +205 +202 +202 +201 +200 +200 +200 +200 +198 +198 +199 +197 +197 +194 +195 +194 +190 +190 +189 +188 +189 +185 +185 +183 +183 +183 +178 +179 +175 +175 +172 +172 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +133 +133 +129 +129 +130 +126 +125 +120 +120 +119 +116 +115 +115 +115 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +65 +58 +58 +54 +54 +54 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +12 +15 +16 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +46 +47 +50 +51 +51 +54 +55 +58 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +115 +119 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +182 +185 +185 +189 +189 +188 +191 +191 +194 +194 +195 +197 +196 +199 +199 +200 +200 +201 +201 +200 +203 +203 +202 +205 +204 +204 +204 +204 +206 +206 +207 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +202 +200 +201 +200 +200 +200 +198 +198 +196 +196 +197 +194 +195 +190 +191 +190 +189 +188 +184 +185 +182 +183 +182 +179 +179 +175 +174 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +125 +126 +125 +126 +125 +120 +120 +115 +115 +116 +109 +110 +106 +106 +101 +99 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +65 +59 +58 +55 +54 +50 +51 +51 +46 +47 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +32 +31 +31 +32 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +58 +59 +60 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +109 +110 +110 +115 +116 +120 +119 +119 +125 +125 +130 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +160 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +183 +185 +185 +188 +188 +189 +190 +191 +195 +195 +197 +197 +197 +198 +198 +200 +200 +200 +200 +200 +203 +203 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +206 +204 +205 +204 +205 +205 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +197 +196 +197 +195 +195 +191 +191 +188 +189 +188 +185 +185 +183 +183 +183 +179 +179 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +152 +151 +151 +148 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +130 +129 +125 +126 +119 +119 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +65 +64 +64 +59 +59 +55 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +46 +51 +51 +50 +54 +54 +58 +58 +59 +64 +65 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +106 +110 +109 +115 +116 +116 +120 +120 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +184 +183 +183 +185 +185 +189 +189 +188 +190 +190 +195 +194 +195 +197 +197 +199 +198 +198 +200 +200 +200 +200 +201 +203 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +201 +201 +201 +199 +199 +196 +197 +196 +194 +194 +195 +194 +195 +190 +190 +188 +189 +188 +185 +185 +183 +183 +180 +179 +179 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +133 +134 +133 +129 +129 +126 +126 +125 +119 +119 +115 +115 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +90 +89 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +73 +69 +69 +64 +65 +65 +59 +58 +54 +54 +55 +50 +50 +47 +46 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +30 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +119 +125 +126 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +189 +190 +191 +194 +194 +197 +196 +197 +198 +198 +201 +200 +201 +200 +200 +202 +203 +202 +205 +205 +204 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +204 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +200 +200 +198 +199 +197 +196 +195 +195 +194 +191 +190 +188 +189 +189 +184 +184 +183 +182 +182 +178 +179 +179 +178 +179 +175 +175 +173 +172 +173 +169 +169 +164 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +134 +133 +129 +129 +125 +126 +120 +119 +115 +115 +109 +110 +109 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +64 +59 +58 +59 +55 +55 +50 +50 +51 +46 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +30 +31 +31 +27 +27 +24 +24 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +18 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +42 +43 +43 +46 +47 +51 +51 +51 +54 +54 +59 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +109 +115 +115 +119 +120 +120 +125 +126 +129 +129 +129 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +169 +172 +173 +175 +175 +175 +179 +178 +183 +182 +185 +184 +184 +189 +189 +190 +190 +190 +195 +194 +196 +197 +197 +199 +199 +200 +200 +200 +200 +200 +203 +202 +203 +204 +204 +204 +204 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +205 +204 +204 +205 +204 +202 +202 +201 +200 +201 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +190 +191 +190 +190 +190 +189 +189 +185 +184 +185 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +73 +68 +68 +68 +64 +65 +58 +58 +58 +54 +55 +50 +50 +50 +47 +46 +43 +42 +43 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +32 +35 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +50 +54 +54 +59 +58 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +120 +125 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +180 +179 +178 +182 +183 +184 +185 +184 +189 +189 +191 +190 +191 +194 +194 +197 +196 +197 +199 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +205 +205 +204 +202 +202 +202 +200 +201 +200 +201 +200 +198 +198 +199 +198 +198 +196 +196 +194 +195 +195 +190 +191 +188 +189 +186 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +119 +119 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +54 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +51 +54 +54 +55 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +105 +106 +106 +109 +110 +116 +115 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +189 +189 +188 +190 +191 +194 +194 +195 +197 +197 +199 +199 +200 +200 +200 +200 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +204 +207 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +197 +197 +197 +194 +194 +190 +191 +190 +188 +189 +184 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +119 +115 +115 +110 +110 +109 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +59 +58 +58 +54 +54 +51 +51 +51 +47 +47 +42 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +14 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +19 +18 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +46 +47 +51 +51 +54 +55 +55 +59 +58 +64 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +95 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +120 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +179 +182 +182 +184 +185 +189 +188 +188 +190 +191 +194 +194 +194 +196 +196 +197 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +203 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +203 +200 +200 +200 +200 +200 +198 +198 +196 +197 +196 +194 +195 +190 +190 +191 +188 +188 +185 +185 +185 +183 +183 +179 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +120 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +87 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +55 +54 +50 +50 +47 +46 +47 +43 +43 +41 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +20 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +40 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +54 +58 +58 +59 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +109 +110 +116 +116 +119 +120 +126 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +183 +183 +183 +185 +184 +188 +189 +189 +190 +190 +194 +194 +195 +196 +197 +198 +198 +200 +201 +200 +201 +200 +203 +203 +202 +205 +204 +205 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +205 +204 +204 +205 +204 +202 +202 +201 +200 +200 +200 +201 +198 +198 +198 +196 +197 +194 +194 +190 +191 +191 +188 +188 +184 +185 +184 +183 +183 +179 +178 +179 +175 +174 +173 +173 +172 +169 +170 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +133 +130 +130 +125 +125 +125 +119 +120 +116 +116 +115 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +42 +41 +41 +40 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +12 +15 +14 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +50 +51 +54 +55 +55 +59 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +106 +106 +106 +110 +109 +116 +115 +115 +119 +119 +119 +120 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +164 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +178 +180 +182 +182 +185 +184 +188 +188 +188 +190 +190 +194 +195 +195 +196 +196 +197 +196 +196 +198 +198 +200 +200 +201 +201 +200 +202 +202 +204 +205 +205 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +205 +204 +204 +204 +205 +202 +202 +200 +200 +201 +200 +200 +198 +198 +198 +197 +196 +194 +195 +194 +190 +190 +189 +188 +188 +185 +184 +182 +182 +182 +178 +179 +175 +175 +173 +173 +172 +169 +168 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +125 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +95 +96 +96 +90 +90 +87 +86 +87 +82 +82 +76 +76 +73 +72 +73 +68 +69 +64 +65 +64 +58 +58 +54 +54 +54 +51 +50 +46 +47 +47 +43 +43 +41 +42 +41 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +20 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +51 +50 +55 +55 +55 +58 +58 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +109 +115 +116 +115 +119 +120 +125 +125 +126 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +174 +175 +178 +178 +179 +183 +183 +184 +185 +185 +189 +189 +189 +189 +189 +191 +191 +194 +194 +195 +197 +196 +199 +199 +199 +200 +201 +201 +200 +202 +202 +202 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +202 +200 +201 +200 +200 +201 +199 +198 +197 +196 +196 +195 +195 +190 +191 +190 +188 +189 +185 +185 +182 +182 +182 +179 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +152 +152 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +120 +120 +116 +115 +109 +110 +110 +106 +105 +100 +100 +101 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +72 +73 +72 +68 +68 +64 +64 +65 +58 +58 +55 +54 +55 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +26 +25 +21 +20 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +115 +115 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +179 +178 +182 +183 +182 +184 +185 +188 +188 +190 +190 +191 +194 +194 +196 +196 +197 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +205 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +195 +195 +194 +191 +190 +188 +188 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +126 +125 +119 +120 +120 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +69 +68 +65 +58 +58 +58 +58 +54 +55 +51 +51 +51 +47 +47 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +51 +51 +51 +55 +54 +58 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +85 +86 +87 +90 +89 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +116 +116 +116 +115 +120 +120 +125 +125 +126 +129 +129 +133 +133 +132 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +184 +185 +189 +189 +191 +190 +190 +195 +194 +197 +196 +196 +198 +199 +200 +200 +201 +201 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +198 +197 +196 +194 +195 +194 +190 +190 +189 +188 +188 +185 +185 +183 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +134 +129 +129 +125 +125 +125 +119 +120 +116 +116 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +77 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +58 +58 +58 +55 +54 +50 +51 +51 +47 +46 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +46 +50 +50 +54 +55 +55 +59 +58 +64 +64 +64 +69 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +120 +120 +125 +125 +128 +129 +129 +134 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +171 +173 +172 +175 +174 +179 +178 +178 +183 +182 +185 +185 +185 +189 +188 +191 +191 +191 +195 +195 +196 +196 +197 +199 +199 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +198 +196 +196 +194 +194 +194 +190 +191 +188 +189 +189 +185 +184 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +125 +119 +119 +116 +116 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +65 +64 +59 +58 +58 +54 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +54 +54 +54 +58 +58 +64 +64 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +89 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +112 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +159 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +183 +183 +182 +185 +185 +189 +188 +189 +191 +191 +194 +194 +196 +197 +197 +198 +198 +200 +200 +200 +200 +200 +202 +203 +203 +204 +204 +204 +204 +204 +206 +207 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +197 +194 +194 +190 +190 +189 +188 +189 +184 +184 +182 +182 +183 +178 +179 +179 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +118 +115 +115 +110 +110 +106 +105 +106 +100 +100 +96 +95 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +65 +64 +58 +58 +58 +54 +55 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +12 +13 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +42 +43 +46 +47 +51 +51 +54 +54 +55 +59 +59 +64 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +115 +116 +119 +120 +119 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +174 +175 +179 +179 +182 +182 +184 +184 +184 +188 +188 +191 +191 +191 +194 +194 +196 +197 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +205 +205 +205 +206 +207 +207 +205 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +201 +201 +201 +200 +199 +198 +199 +196 +196 +194 +195 +195 +190 +191 +189 +189 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +168 +165 +164 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +126 +125 +120 +120 +119 +115 +115 +110 +109 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +83 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +55 +50 +50 +46 +47 +47 +43 +43 +41 +40 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +54 +54 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +182 +183 +184 +185 +189 +188 +188 +190 +190 +195 +194 +195 +196 +196 +198 +198 +198 +200 +200 +200 +200 +203 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +205 +204 +204 +203 +202 +202 +201 +200 +201 +200 +200 +198 +198 +197 +196 +196 +194 +195 +191 +191 +191 +189 +189 +185 +185 +185 +182 +183 +179 +179 +174 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +134 +133 +129 +129 +130 +125 +125 +119 +119 +120 +116 +115 +115 +116 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +54 +54 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +16 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +46 +47 +46 +47 +47 +51 +50 +54 +54 +54 +58 +58 +64 +65 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +112 +115 +116 +119 +119 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +185 +185 +189 +189 +191 +190 +191 +194 +195 +197 +197 +199 +198 +199 +201 +200 +200 +200 +200 +202 +202 +205 +205 +204 +204 +204 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +200 +201 +200 +198 +198 +199 +196 +197 +194 +194 +195 +191 +191 +188 +188 +185 +185 +184 +182 +183 +179 +178 +179 +175 +175 +175 +175 +175 +172 +173 +169 +169 +166 +166 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +134 +133 +129 +129 +125 +125 +126 +119 +119 +115 +115 +111 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +65 +64 +62 +58 +58 +54 +55 +51 +51 +51 +46 +47 +42 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +20 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +36 +41 +41 +41 +43 +43 +46 +47 +48 +50 +51 +55 +54 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +115 +115 +115 +120 +119 +125 +125 +126 +129 +129 +133 +133 +134 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +179 +179 +183 +182 +185 +184 +189 +188 +189 +190 +190 +194 +194 +195 +196 +197 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +201 +200 +201 +198 +198 +196 +196 +197 +195 +194 +190 +191 +190 +189 +188 +185 +185 +184 +182 +183 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +125 +125 +119 +119 +116 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +73 +68 +68 +68 +65 +64 +65 +64 +65 +58 +59 +58 +54 +54 +50 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +35 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +50 +55 +55 +55 +55 +54 +58 +58 +65 +65 +64 +69 +68 +72 +72 +75 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +189 +188 +189 +190 +190 +194 +194 +195 +196 +196 +198 +199 +199 +200 +201 +200 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +207 +207 +204 +205 +205 +204 +202 +202 +203 +201 +200 +200 +200 +200 +198 +198 +196 +196 +196 +195 +195 +190 +190 +190 +188 +188 +185 +184 +184 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +134 +134 +133 +129 +129 +125 +125 +125 +119 +120 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +55 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +57 +59 +59 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +105 +109 +110 +110 +116 +116 +119 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +174 +179 +178 +183 +182 +182 +184 +184 +188 +188 +189 +190 +191 +195 +194 +197 +196 +196 +199 +199 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +205 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +199 +198 +196 +197 +194 +194 +190 +190 +190 +188 +189 +184 +184 +185 +182 +183 +182 +182 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +120 +115 +116 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +75 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +54 +50 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +46 +51 +50 +50 +54 +54 +59 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +100 +105 +106 +110 +110 +110 +116 +116 +119 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +184 +185 +185 +188 +188 +191 +190 +190 +195 +194 +196 +197 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +207 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +204 +205 +204 +204 +203 +203 +201 +200 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +195 +194 +194 +190 +190 +188 +188 +189 +185 +185 +182 +183 +180 +178 +179 +175 +175 +173 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +54 +50 +50 +47 +46 +47 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +51 +51 +54 +55 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +116 +115 +120 +119 +125 +125 +129 +129 +133 +134 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +178 +183 +182 +185 +185 +185 +189 +189 +190 +190 +191 +195 +194 +197 +196 +197 +198 +198 +200 +200 +201 +201 +201 +202 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +190 +190 +189 +188 +189 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +144 +143 +139 +139 +139 +133 +133 +130 +130 +129 +125 +125 +119 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +59 +59 +54 +54 +50 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +175 +179 +178 +182 +182 +183 +185 +185 +188 +189 +189 +190 +191 +195 +194 +197 +196 +197 +198 +198 +200 +201 +200 +200 +200 +200 +200 +200 +202 +202 +205 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +199 +199 +199 +196 +196 +194 +194 +194 +190 +191 +189 +189 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +120 +120 +115 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +69 +68 +65 +64 +64 +59 +59 +55 +54 +54 +50 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +51 +51 +54 +54 +54 +58 +58 +64 +65 +64 +69 +68 +72 +72 +72 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +178 +182 +182 +182 +184 +184 +189 +189 +189 +191 +191 +190 +190 +190 +194 +195 +197 +197 +197 +198 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +202 +201 +201 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +190 +191 +191 +188 +189 +184 +185 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +134 +133 +129 +130 +129 +126 +125 +120 +119 +120 +116 +115 +109 +110 +110 +106 +106 +99 +100 +100 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +50 +50 +50 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +55 +59 +58 +58 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +126 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +174 +175 +179 +178 +178 +183 +182 +183 +183 +183 +184 +184 +189 +189 +189 +190 +191 +194 +194 +195 +196 +197 +198 +199 +200 +200 +201 +200 +200 +203 +202 +202 +204 +204 +204 +204 +205 +204 +204 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +204 +202 +202 +200 +200 +201 +200 +200 +198 +198 +199 +196 +196 +195 +194 +190 +190 +190 +188 +189 +184 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +126 +119 +119 +116 +116 +116 +110 +110 +106 +106 +100 +101 +101 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +65 +58 +58 +55 +54 +51 +51 +51 +46 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +16 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +54 +55 +54 +58 +59 +65 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +168 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +185 +184 +189 +189 +191 +190 +191 +194 +194 +196 +196 +197 +199 +198 +199 +198 +198 +201 +200 +201 +201 +201 +202 +202 +204 +205 +204 +205 +205 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +203 +200 +200 +201 +200 +200 +199 +198 +196 +196 +197 +194 +195 +191 +190 +190 +189 +189 +185 +184 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +134 +134 +129 +129 +125 +126 +120 +119 +120 +116 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +59 +59 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +26 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +18 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +32 +33 +33 +37 +36 +41 +41 +42 +43 +43 +47 +47 +50 +51 +51 +55 +55 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +115 +119 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +150 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +183 +183 +183 +184 +185 +188 +188 +188 +191 +191 +191 +191 +190 +194 +194 +197 +196 +197 +198 +199 +200 +200 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +199 +198 +196 +196 +194 +194 +195 +191 +190 +188 +188 +188 +184 +185 +183 +183 +179 +178 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +150 +151 +147 +147 +148 +143 +143 +139 +139 +134 +134 +133 +129 +129 +125 +125 +125 +119 +120 +115 +116 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +50 +49 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +58 +59 +59 +64 +65 +69 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +120 +120 +125 +126 +125 +130 +129 +133 +134 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +174 +174 +178 +179 +178 +179 +179 +182 +183 +185 +185 +184 +188 +188 +190 +190 +191 +194 +194 +196 +196 +198 +198 +198 +201 +200 +200 +201 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +207 +207 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +198 +197 +196 +194 +195 +191 +191 +190 +189 +188 +184 +185 +184 +183 +183 +183 +183 +183 +178 +179 +175 +174 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +130 +126 +126 +120 +120 +120 +115 +115 +110 +110 +106 +106 +105 +100 +100 +100 +100 +99 +96 +96 +96 +96 +95 +90 +90 +86 +86 +86 +82 +82 +76 +76 +74 +72 +72 +68 +68 +64 +64 +65 +59 +58 +55 +54 +55 +51 +50 +51 +51 +51 +47 +47 +42 +43 +43 +41 +40 +37 +37 +35 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +43 +42 +47 +47 +47 +50 +51 +55 +55 +55 +59 +59 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +83 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +106 +110 +110 +110 +110 +110 +116 +115 +120 +120 +119 +125 +125 +129 +129 +131 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +172 +174 +175 +175 +178 +179 +182 +183 +183 +185 +184 +188 +189 +188 +190 +191 +195 +194 +194 +197 +196 +198 +198 +198 +201 +201 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +205 +205 +204 +204 +202 +203 +203 +201 +200 +200 +200 +200 +198 +198 +196 +196 +197 +194 +194 +191 +191 +191 +189 +188 +185 +185 +185 +182 +183 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +164 +161 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +144 +144 +139 +139 +133 +133 +129 +129 +129 +125 +126 +120 +119 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +55 +55 +51 +51 +50 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +32 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +47 +50 +51 +54 +54 +54 +59 +58 +65 +65 +64 +68 +68 +72 +73 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +122 +125 +125 +129 +129 +133 +133 +134 +140 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +183 +184 +184 +189 +189 +189 +191 +190 +194 +194 +195 +196 +196 +198 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +203 +203 +201 +200 +201 +200 +201 +198 +198 +197 +197 +196 +195 +195 +190 +191 +191 +189 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +133 +128 +129 +130 +125 +126 +125 +126 +126 +119 +119 +115 +115 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +77 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +55 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +24 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +47 +50 +50 +54 +55 +55 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +115 +116 +119 +120 +120 +125 +125 +129 +129 +129 +133 +133 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +182 +182 +185 +184 +185 +189 +189 +191 +190 +194 +195 +195 +197 +197 +198 +199 +198 +201 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +205 +207 +206 +207 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +199 +198 +196 +197 +195 +195 +191 +190 +190 +188 +189 +184 +184 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +130 +129 +129 +126 +126 +119 +119 +118 +116 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +90 +91 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +71 +68 +68 +64 +65 +58 +59 +59 +54 +55 +50 +51 +51 +47 +47 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +54 +54 +54 +58 +58 +64 +64 +65 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +119 +120 +119 +120 +125 +126 +129 +129 +130 +134 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +185 +185 +185 +188 +188 +190 +190 +191 +194 +194 +196 +197 +196 +199 +198 +200 +200 +200 +200 +201 +202 +202 +202 +204 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +205 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +201 +199 +199 +198 +196 +196 +194 +194 +194 +190 +191 +188 +188 +189 +185 +185 +183 +183 +183 +179 +179 +174 +174 +175 +173 +173 +169 +169 +165 +165 +165 +161 +160 +157 +157 +157 +151 +151 +147 +147 +147 +143 +144 +140 +139 +139 +133 +133 +129 +129 +130 +126 +125 +120 +120 +115 +115 +115 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +73 +69 +68 +69 +64 +64 +58 +59 +59 +55 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +20 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +30 +31 +31 +33 +32 +37 +37 +37 +41 +40 +43 +43 +47 +47 +46 +50 +50 +54 +54 +54 +58 +58 +59 +59 +58 +64 +65 +68 +68 +68 +73 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +105 +110 +110 +116 +116 +116 +120 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +185 +184 +189 +189 +189 +191 +190 +195 +194 +194 +197 +197 +198 +198 +198 +201 +201 +200 +201 +203 +203 +202 +204 +204 +204 +205 +204 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +206 +207 +204 +204 +205 +204 +203 +202 +202 +201 +201 +200 +201 +200 +198 +198 +197 +196 +196 +195 +195 +191 +191 +191 +188 +189 +184 +185 +186 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +140 +133 +133 +134 +129 +129 +125 +125 +125 +120 +120 +120 +119 +119 +116 +115 +110 +109 +110 +106 +106 +100 +100 +98 +96 +96 +91 +90 +86 +86 +86 +82 +82 +76 +77 +76 +73 +73 +68 +68 +68 +64 +64 +58 +58 +59 +54 +55 +50 +50 +47 +47 +47 +42 +43 +41 +41 +41 +36 +37 +33 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +24 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +51 +50 +55 +54 +59 +58 +61 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +108 +110 +110 +116 +116 +119 +119 +119 +125 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +188 +188 +188 +191 +190 +194 +195 +196 +196 +196 +198 +199 +200 +200 +200 +201 +200 +202 +203 +202 +204 +205 +204 +204 +204 +206 +207 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +201 +200 +200 +199 +198 +200 +196 +197 +195 +194 +190 +191 +190 +188 +188 +185 +184 +184 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +150 +147 +147 +143 +143 +143 +139 +139 +139 +139 +140 +133 +133 +129 +129 +129 +126 +125 +119 +119 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +50 +55 +55 +58 +58 +59 +65 +64 +64 +63 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +109 +115 +116 +116 +120 +120 +126 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +160 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +178 +183 +182 +183 +184 +184 +188 +188 +189 +190 +190 +195 +194 +195 +196 +196 +199 +198 +198 +200 +201 +200 +200 +200 +202 +202 +204 +204 +205 +205 +204 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +198 +198 +196 +197 +196 +194 +194 +191 +191 +190 +189 +189 +184 +184 +184 +183 +183 +179 +178 +176 +174 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +134 +133 +134 +129 +129 +125 +125 +125 +119 +119 +115 +115 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +59 +54 +54 +54 +50 +51 +47 +47 +47 +42 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +12 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +20 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +50 +51 +51 +54 +54 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +178 +179 +183 +182 +184 +185 +185 +189 +189 +191 +190 +190 +195 +195 +196 +197 +196 +198 +199 +201 +200 +200 +200 +201 +203 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +205 +204 +203 +202 +201 +200 +200 +200 +201 +201 +200 +200 +198 +199 +196 +197 +196 +194 +194 +191 +190 +189 +188 +189 +184 +185 +183 +182 +182 +179 +179 +174 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +67 +68 +64 +64 +65 +58 +58 +55 +54 +51 +51 +51 +47 +47 +43 +42 +43 +41 +41 +37 +36 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +20 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +48 +50 +50 +54 +55 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +106 +106 +106 +109 +110 +116 +116 +115 +120 +119 +126 +125 +125 +129 +130 +134 +133 +133 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +178 +183 +182 +185 +184 +189 +188 +189 +191 +190 +194 +195 +195 +196 +197 +198 +198 +198 +200 +201 +200 +200 +200 +202 +202 +205 +204 +205 +204 +205 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +207 +207 +204 +204 +205 +205 +205 +203 +203 +203 +201 +200 +200 +200 +198 +198 +198 +197 +197 +194 +194 +195 +191 +191 +188 +188 +188 +184 +186 +183 +182 +183 +179 +178 +175 +175 +174 +172 +173 +169 +169 +165 +165 +165 +160 +160 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +140 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +55 +55 +50 +50 +46 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +59 +58 +59 +64 +64 +68 +68 +69 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +119 +120 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +185 +189 +189 +190 +191 +190 +195 +194 +196 +196 +196 +198 +199 +201 +200 +201 +200 +201 +203 +202 +205 +204 +204 +204 +204 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +203 +203 +200 +200 +201 +200 +200 +198 +198 +198 +197 +196 +197 +197 +196 +195 +194 +190 +191 +191 +189 +189 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +119 +120 +116 +115 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +69 +65 +65 +58 +58 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +46 +47 +51 +51 +55 +54 +55 +59 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +119 +119 +120 +125 +126 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +182 +183 +184 +185 +189 +189 +189 +191 +190 +194 +195 +195 +197 +197 +199 +198 +200 +200 +201 +201 +200 +202 +203 +203 +204 +204 +204 +204 +204 +206 +207 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +200 +200 +200 +198 +198 +199 +196 +196 +194 +194 +193 +190 +191 +188 +189 +185 +185 +185 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +130 +129 +125 +125 +125 +119 +119 +115 +115 +115 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +51 +50 +51 +47 +46 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +54 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +144 +148 +147 +151 +151 +158 +158 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +184 +185 +189 +189 +190 +191 +195 +194 +194 +197 +196 +198 +199 +199 +201 +200 +201 +200 +200 +201 +201 +202 +203 +203 +204 +204 +204 +205 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +203 +201 +201 +201 +200 +201 +198 +198 +196 +196 +196 +195 +194 +191 +191 +190 +189 +188 +184 +184 +185 +182 +183 +178 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +120 +119 +119 +115 +116 +109 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +69 +69 +64 +64 +59 +59 +59 +55 +54 +54 +54 +54 +51 +51 +47 +46 +46 +43 +43 +41 +41 +41 +37 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +27 +31 +31 +33 +32 +35 +37 +37 +41 +42 +43 +43 +43 +46 +46 +51 +50 +51 +54 +55 +59 +58 +58 +65 +64 +68 +69 +69 +72 +72 +77 +76 +81 +82 +82 +87 +86 +90 +90 +89 +96 +95 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +120 +125 +126 +130 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +178 +179 +179 +183 +183 +185 +185 +184 +189 +188 +191 +191 +191 +194 +195 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +203 +202 +204 +204 +204 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +201 +198 +199 +196 +196 +197 +195 +194 +190 +191 +191 +189 +189 +185 +185 +182 +183 +183 +179 +178 +175 +175 +175 +172 +173 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +134 +134 +130 +129 +129 +125 +125 +120 +119 +119 +115 +116 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +73 +73 +72 +68 +68 +65 +64 +64 +59 +59 +55 +55 +55 +50 +50 +47 +47 +43 +43 +43 +40 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +20 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +41 +41 +43 +44 +47 +47 +47 +50 +51 +55 +55 +59 +59 +59 +65 +65 +68 +68 +69 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +120 +119 +125 +126 +130 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +166 +169 +169 +169 +173 +173 +173 +173 +172 +175 +175 +179 +178 +179 +183 +183 +185 +185 +186 +189 +189 +191 +191 +190 +190 +190 +195 +194 +196 +196 +197 +199 +198 +199 +199 +198 +200 +201 +201 +201 +200 +202 +202 +205 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +205 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +197 +194 +194 +191 +191 +190 +189 +189 +185 +185 +185 +183 +182 +178 +179 +178 +175 +175 +173 +173 +170 +169 +169 +165 +165 +161 +161 +160 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +120 +119 +120 +116 +115 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +85 +82 +82 +79 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +59 +58 +54 +55 +54 +54 +54 +51 +50 +47 +46 +47 +43 +43 +41 +40 +39 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +14 +13 +12 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +51 +51 +55 +55 +54 +58 +58 +64 +65 +64 +68 +68 +72 +72 +73 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +115 +115 +116 +120 +119 +125 +125 +124 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +164 +165 +165 +169 +169 +172 +173 +173 +174 +175 +179 +178 +183 +183 +183 +184 +184 +189 +189 +188 +190 +190 +191 +190 +191 +194 +195 +197 +197 +197 +198 +198 +200 +200 +201 +201 +200 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +207 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +204 +202 +202 +200 +201 +201 +201 +201 +198 +199 +198 +196 +197 +194 +194 +195 +190 +191 +188 +189 +188 +185 +185 +182 +183 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +120 +120 +115 +115 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +73 +68 +68 +65 +64 +64 +58 +58 +55 +54 +54 +51 +50 +46 +47 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +46 +47 +51 +50 +54 +55 +54 +59 +58 +64 +64 +65 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +105 +110 +110 +115 +116 +116 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +144 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +182 +182 +183 +184 +185 +189 +189 +188 +191 +191 +194 +194 +196 +196 +197 +199 +198 +200 +200 +201 +201 +200 +203 +203 +203 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +207 +206 +206 +204 +204 +205 +204 +204 +202 +203 +203 +200 +201 +201 +200 +200 +199 +198 +196 +196 +196 +195 +195 +190 +190 +189 +188 +189 +185 +184 +183 +182 +182 +179 +178 +179 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +134 +130 +130 +129 +125 +125 +119 +119 +119 +115 +115 +110 +110 +105 +106 +105 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +74 +68 +68 +64 +64 +58 +58 +59 +54 +55 +51 +51 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +51 +51 +51 +55 +55 +59 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +115 +115 +115 +119 +119 +125 +126 +126 +129 +130 +133 +133 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +182 +182 +184 +184 +185 +189 +189 +190 +191 +191 +194 +195 +197 +197 +196 +198 +199 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +201 +200 +201 +200 +201 +198 +199 +198 +196 +197 +195 +194 +194 +190 +191 +188 +189 +188 +185 +184 +183 +183 +182 +178 +178 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +115 +116 +110 +110 +109 +109 +110 +106 +106 +99 +100 +100 +96 +96 +89 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +65 +65 +64 +65 +58 +58 +54 +54 +54 +50 +51 +46 +46 +45 +43 +43 +41 +41 +37 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +51 +50 +54 +55 +59 +59 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +117 +119 +120 +125 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +184 +185 +188 +189 +190 +191 +191 +194 +195 +197 +197 +198 +198 +198 +201 +201 +201 +200 +201 +202 +202 +204 +204 +205 +204 +204 +207 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +201 +200 +201 +200 +198 +199 +198 +196 +197 +194 +194 +195 +191 +190 +188 +188 +185 +184 +184 +182 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +156 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +130 +130 +129 +129 +129 +125 +126 +120 +120 +119 +115 +116 +110 +110 +108 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +73 +72 +73 +68 +68 +64 +64 +62 +59 +58 +55 +54 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +77 +82 +83 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +105 +106 +110 +110 +110 +115 +115 +120 +119 +120 +125 +126 +125 +126 +126 +129 +129 +134 +133 +134 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +184 +188 +188 +189 +190 +190 +194 +194 +195 +196 +197 +199 +199 +198 +200 +200 +200 +201 +200 +203 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +203 +200 +201 +200 +200 +199 +198 +198 +196 +197 +195 +195 +194 +191 +191 +189 +189 +189 +185 +184 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +131 +129 +130 +126 +126 +119 +120 +120 +115 +115 +110 +110 +109 +106 +106 +106 +105 +106 +100 +100 +96 +96 +96 +90 +89 +86 +86 +83 +82 +82 +76 +77 +72 +73 +73 +68 +68 +65 +64 +64 +58 +58 +54 +54 +54 +50 +50 +47 +46 +47 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +15 +15 +17 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +42 +42 +46 +47 +51 +50 +51 +54 +54 +54 +54 +54 +59 +58 +64 +64 +64 +69 +68 +72 +72 +73 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +107 +110 +110 +110 +115 +115 +120 +119 +125 +125 +125 +129 +130 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +185 +184 +188 +188 +191 +190 +191 +195 +194 +196 +197 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +207 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +201 +199 +199 +198 +197 +197 +194 +195 +195 +190 +191 +188 +189 +189 +185 +184 +183 +182 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +126 +125 +126 +119 +119 +115 +115 +116 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +89 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +65 +58 +58 +55 +55 +50 +51 +50 +47 +47 +43 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +30 +31 +26 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +20 +25 +25 +28 +27 +27 +30 +31 +33 +33 +33 +37 +36 +40 +41 +41 +43 +43 +46 +46 +47 +51 +51 +54 +55 +54 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +77 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +105 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +125 +130 +129 +133 +133 +133 +139 +140 +144 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +174 +175 +179 +179 +178 +182 +182 +185 +184 +185 +188 +189 +190 +190 +195 +194 +195 +197 +197 +198 +199 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +204 +205 +204 +204 +205 +202 +203 +200 +200 +200 +200 +200 +199 +198 +200 +196 +197 +194 +195 +191 +191 +191 +189 +189 +184 +185 +184 +182 +183 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +158 +157 +151 +151 +147 +148 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +120 +120 +120 +116 +116 +109 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +41 +42 +43 +47 +47 +47 +51 +50 +54 +54 +55 +59 +58 +58 +59 +59 +64 +64 +68 +68 +68 +73 +72 +76 +77 +79 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +99 +100 +105 +106 +110 +110 +109 +115 +115 +119 +119 +119 +125 +125 +129 +130 +132 +133 +133 +139 +139 +143 +144 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +185 +184 +188 +188 +188 +191 +190 +195 +195 +194 +196 +197 +198 +198 +198 +201 +201 +200 +200 +203 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +204 +204 +204 +204 +204 +203 +203 +202 +202 +202 +200 +200 +200 +200 +200 +200 +200 +199 +199 +198 +197 +196 +194 +194 +193 +191 +190 +188 +188 +185 +185 +185 +183 +182 +179 +179 +179 +175 +175 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +144 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +119 +119 +115 +116 +110 +109 +108 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +69 +64 +65 +59 +58 +55 +55 +54 +51 +50 +47 +46 +47 +42 +43 +41 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +26 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +37 +37 +37 +40 +41 +43 +43 +43 +47 +47 +51 +51 +54 +55 +55 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +109 +109 +116 +116 +115 +120 +120 +125 +125 +126 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +185 +184 +188 +189 +190 +191 +194 +194 +195 +197 +196 +199 +199 +198 +201 +200 +200 +200 +200 +202 +203 +205 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +205 +204 +204 +202 +202 +203 +201 +201 +200 +200 +200 +199 +198 +196 +197 +194 +194 +195 +191 +190 +188 +189 +188 +185 +184 +185 +184 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +144 +143 +144 +140 +140 +133 +133 +134 +129 +129 +126 +126 +120 +119 +119 +116 +115 +110 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +59 +55 +55 +51 +51 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +28 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +182 +183 +184 +184 +188 +189 +188 +190 +191 +195 +194 +194 +197 +196 +198 +198 +198 +201 +200 +200 +200 +201 +202 +203 +204 +205 +203 +204 +205 +206 +206 +206 +207 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +205 +205 +204 +202 +202 +201 +200 +200 +200 +200 +198 +199 +198 +197 +196 +197 +196 +196 +195 +195 +191 +190 +191 +188 +188 +185 +185 +184 +182 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +129 +125 +126 +119 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +55 +51 +50 +46 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +51 +51 +55 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +165 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +185 +184 +184 +189 +189 +191 +191 +191 +194 +194 +196 +196 +199 +198 +198 +200 +200 +200 +200 +200 +202 +202 +203 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +203 +204 +204 +204 +204 +205 +202 +202 +200 +201 +200 +200 +200 +198 +198 +197 +196 +197 +194 +194 +190 +191 +191 +188 +189 +185 +184 +184 +183 +183 +179 +179 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +134 +130 +129 +125 +125 +126 +119 +119 +116 +115 +110 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +59 +58 +58 +55 +55 +51 +51 +50 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +47 +47 +51 +50 +55 +55 +55 +58 +59 +59 +59 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +116 +119 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +174 +175 +175 +179 +178 +183 +183 +184 +185 +184 +189 +188 +190 +190 +191 +194 +194 +197 +196 +197 +198 +198 +201 +201 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +207 +206 +206 +206 +207 +206 +207 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +201 +201 +199 +198 +197 +197 +196 +194 +194 +191 +190 +191 +189 +189 +184 +184 +185 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +126 +125 +119 +119 +119 +116 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +58 +54 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +130 +130 +129 +133 +133 +139 +140 +140 +143 +143 +147 +147 +147 +151 +151 +157 +156 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +178 +178 +182 +183 +183 +184 +184 +184 +184 +185 +188 +189 +190 +191 +191 +195 +194 +196 +196 +196 +198 +199 +200 +200 +200 +200 +200 +202 +203 +204 +204 +204 +204 +204 +205 +204 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +204 +205 +205 +205 +204 +202 +203 +202 +200 +200 +201 +201 +201 +198 +199 +196 +197 +196 +195 +195 +191 +190 +189 +188 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +83 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +44 +42 +42 +47 +47 +50 +51 +51 +55 +55 +58 +59 +64 +64 +65 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +116 +115 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +174 +179 +179 +179 +182 +183 +185 +184 +184 +188 +189 +191 +191 +192 +194 +195 +197 +196 +198 +199 +198 +200 +200 +200 +200 +200 +202 +202 +202 +202 +203 +204 +204 +204 +204 +205 +206 +207 +206 +206 +207 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +201 +200 +200 +200 +201 +198 +199 +196 +197 +194 +194 +194 +191 +190 +188 +188 +189 +185 +185 +185 +184 +185 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +126 +119 +120 +116 +116 +110 +109 +109 +106 +106 +100 +100 +100 +95 +95 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +73 +69 +68 +64 +65 +58 +58 +58 +54 +55 +50 +50 +51 +46 +47 +47 +47 +47 +43 +43 +41 +40 +40 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +46 +51 +51 +54 +55 +55 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +120 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +160 +161 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +183 +185 +185 +185 +189 +188 +190 +190 +191 +194 +194 +195 +194 +195 +196 +196 +199 +198 +199 +200 +201 +201 +201 +201 +202 +203 +204 +204 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +207 +204 +204 +204 +204 +203 +202 +202 +200 +201 +200 +201 +200 +199 +198 +196 +196 +197 +195 +195 +191 +190 +190 +188 +189 +185 +185 +184 +183 +183 +179 +178 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +120 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +64 +64 +64 +59 +59 +54 +54 +54 +50 +50 +46 +46 +45 +43 +43 +41 +41 +37 +38 +37 +33 +33 +31 +32 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +14 +13 +12 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +26 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +55 +54 +59 +59 +59 +64 +64 +68 +68 +73 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +111 +115 +115 +120 +120 +126 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +178 +179 +182 +183 +183 +183 +183 +185 +184 +189 +188 +189 +191 +190 +194 +194 +196 +197 +197 +198 +199 +200 +201 +200 +200 +201 +203 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +205 +205 +204 +204 +202 +203 +202 +200 +200 +200 +201 +201 +198 +199 +196 +196 +196 +195 +194 +191 +191 +189 +189 +189 +185 +185 +182 +183 +182 +178 +178 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +87 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +61 +59 +59 +55 +55 +50 +50 +50 +47 +47 +43 +43 +42 +41 +41 +41 +41 +40 +37 +37 +33 +33 +33 +31 +30 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +18 +15 +16 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +46 +47 +50 +51 +54 +54 +59 +58 +58 +64 +64 +68 +68 +67 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +95 +97 +100 +100 +106 +106 +111 +110 +109 +115 +115 +119 +119 +119 +125 +125 +125 +125 +126 +130 +129 +133 +134 +133 +139 +139 +143 +143 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +180 +183 +183 +185 +184 +188 +189 +189 +190 +191 +194 +195 +195 +196 +196 +199 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +205 +205 +204 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +205 +205 +204 +205 +205 +202 +203 +200 +200 +201 +200 +201 +198 +198 +197 +196 +197 +195 +195 +191 +191 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +148 +143 +143 +143 +140 +139 +133 +133 +134 +130 +129 +126 +125 +120 +120 +120 +115 +115 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +58 +58 +59 +54 +54 +50 +51 +51 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +42 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +87 +86 +86 +90 +91 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +176 +175 +178 +179 +179 +183 +182 +184 +185 +185 +188 +189 +190 +191 +191 +194 +194 +197 +196 +197 +198 +198 +201 +200 +200 +201 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +195 +195 +194 +190 +191 +189 +188 +188 +185 +185 +183 +183 +179 +178 +178 +175 +175 +173 +173 +172 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +119 +119 +120 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +65 +65 +59 +58 +54 +54 +53 +51 +50 +47 +47 +43 +43 +42 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +40 +43 +43 +47 +47 +47 +51 +51 +54 +55 +55 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +87 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +120 +120 +120 +125 +126 +129 +130 +129 +134 +133 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +182 +182 +185 +184 +185 +189 +189 +190 +190 +194 +194 +194 +197 +196 +198 +198 +198 +200 +200 +200 +201 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +199 +196 +196 +194 +195 +191 +191 +191 +188 +189 +184 +184 +185 +182 +182 +183 +183 +183 +179 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +122 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +75 +72 +71 +68 +68 +65 +64 +64 +59 +58 +55 +54 +55 +50 +50 +47 +47 +47 +43 +42 +41 +41 +41 +37 +36 +33 +32 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +40 +41 +43 +42 +46 +46 +47 +50 +51 +54 +54 +54 +59 +59 +58 +58 +59 +64 +65 +68 +68 +68 +72 +72 +76 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +146 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +182 +182 +184 +184 +188 +188 +189 +190 +191 +194 +194 +195 +197 +196 +199 +198 +198 +201 +201 +200 +200 +203 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +203 +202 +202 +201 +200 +200 +201 +200 +198 +198 +197 +196 +197 +194 +195 +190 +191 +190 +188 +189 +185 +185 +185 +183 +182 +179 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +129 +129 +130 +125 +125 +119 +119 +119 +116 +116 +116 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +95 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +59 +58 +55 +55 +55 +50 +50 +47 +46 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +14 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +38 +37 +37 +40 +41 +43 +43 +43 +46 +47 +47 +47 +47 +51 +51 +55 +55 +55 +58 +59 +64 +65 +64 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +112 +115 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +182 +185 +184 +185 +188 +189 +191 +191 +191 +195 +194 +197 +197 +199 +199 +198 +200 +200 +200 +200 +201 +203 +202 +205 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +204 +205 +204 +204 +204 +203 +202 +201 +200 +200 +201 +200 +199 +199 +199 +196 +196 +195 +194 +195 +190 +190 +189 +188 +184 +185 +184 +183 +183 +178 +179 +179 +176 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +129 +129 +126 +126 +120 +120 +120 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +85 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +59 +55 +54 +54 +51 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +18 +17 +19 +19 +21 +21 +25 +25 +25 +26 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +50 +54 +54 +59 +59 +59 +64 +64 +68 +68 +68 +72 +73 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +116 +115 +115 +119 +120 +126 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +178 +183 +183 +185 +185 +188 +189 +188 +191 +191 +194 +194 +194 +197 +196 +199 +199 +198 +201 +200 +200 +200 +200 +203 +203 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +205 +205 +205 +204 +205 +203 +203 +200 +201 +200 +200 +200 +198 +198 +196 +197 +197 +195 +194 +191 +191 +191 +188 +189 +189 +189 +188 +185 +185 +183 +183 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +131 +129 +129 +125 +126 +119 +119 +120 +116 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +59 +59 +54 +55 +51 +51 +51 +47 +47 +43 +42 +43 +40 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +14 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +55 +55 +54 +58 +58 +64 +64 +65 +68 +68 +72 +73 +74 +77 +76 +82 +81 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +115 +116 +119 +120 +126 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +182 +182 +185 +184 +188 +189 +188 +190 +190 +195 +194 +194 +197 +196 +198 +198 +199 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +205 +204 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +204 +204 +204 +204 +205 +202 +202 +200 +200 +201 +200 +200 +199 +199 +198 +196 +197 +194 +195 +194 +190 +191 +189 +189 +186 +184 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +58 +59 +55 +54 +51 +50 +47 +46 +48 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +42 +43 +43 +43 +47 +47 +50 +51 +51 +54 +54 +59 +59 +64 +65 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +125 +125 +129 +130 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +182 +185 +184 +185 +189 +188 +190 +190 +190 +195 +194 +196 +196 +199 +198 +198 +200 +200 +200 +201 +201 +202 +202 +205 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +204 +204 +203 +202 +203 +202 +202 +200 +201 +200 +200 +201 +198 +199 +196 +196 +196 +195 +195 +190 +191 +189 +188 +189 +184 +184 +183 +182 +182 +179 +179 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +126 +126 +120 +120 +116 +116 +109 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +58 +58 +58 +55 +55 +50 +50 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +12 +15 +15 +18 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +40 +41 +41 +43 +42 +46 +47 +50 +51 +50 +54 +54 +58 +58 +59 +65 +65 +68 +68 +69 +73 +73 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +116 +120 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +184 +185 +189 +189 +190 +190 +190 +195 +194 +196 +197 +196 +198 +198 +198 +198 +198 +201 +200 +201 +200 +200 +202 +202 +204 +205 +205 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +203 +201 +201 +200 +201 +198 +198 +199 +197 +196 +194 +195 +195 +191 +190 +191 +190 +190 +189 +188 +184 +185 +185 +183 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +144 +143 +144 +140 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +64 +64 +65 +58 +58 +55 +54 +54 +50 +50 +46 +47 +47 +43 +42 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +55 +55 +59 +59 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +109 +115 +115 +119 +120 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +184 +184 +184 +188 +188 +191 +191 +191 +194 +195 +196 +196 +196 +199 +198 +200 +200 +201 +201 +201 +202 +202 +204 +204 +204 +204 +204 +207 +207 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +207 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +201 +200 +201 +200 +199 +198 +197 +197 +197 +195 +195 +191 +191 +189 +188 +189 +185 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +130 +130 +129 +125 +126 +119 +120 +120 +116 +115 +110 +110 +110 +106 +107 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +59 +54 +54 +51 +50 +47 +47 +46 +42 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +26 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +47 +51 +50 +54 +54 +58 +58 +58 +64 +64 +68 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +110 +110 +110 +116 +115 +119 +119 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +185 +188 +189 +191 +191 +194 +194 +195 +196 +197 +198 +199 +198 +201 +200 +201 +201 +200 +200 +200 +203 +202 +202 +204 +204 +205 +204 +205 +207 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +205 +205 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +198 +196 +196 +195 +194 +195 +191 +190 +189 +189 +189 +184 +184 +182 +182 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +129 +129 +126 +125 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +59 +59 +55 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +42 +37 +36 +33 +32 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +15 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +20 +20 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +47 +50 +50 +50 +51 +50 +54 +55 +59 +59 +58 +64 +64 +69 +69 +68 +73 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +109 +116 +115 +120 +119 +120 +126 +126 +129 +129 +134 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +178 +179 +183 +183 +185 +184 +184 +188 +188 +189 +188 +189 +191 +191 +195 +195 +195 +197 +197 +199 +198 +199 +200 +201 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +205 +202 +202 +201 +200 +200 +201 +201 +198 +198 +198 +197 +197 +194 +194 +195 +190 +191 +189 +188 +184 +184 +185 +183 +183 +179 +179 +179 +174 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +156 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +130 +129 +125 +125 +125 +119 +120 +115 +115 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +54 +55 +55 +51 +50 +47 +46 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +55 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +95 +96 +100 +100 +100 +107 +106 +110 +109 +116 +116 +116 +119 +120 +125 +126 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +185 +185 +185 +189 +188 +191 +191 +192 +194 +195 +196 +196 +198 +198 +198 +201 +201 +200 +201 +200 +202 +203 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +204 +202 +203 +203 +200 +201 +201 +200 +201 +199 +199 +197 +196 +195 +195 +194 +191 +191 +188 +189 +189 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +140 +133 +133 +129 +129 +129 +126 +125 +119 +120 +120 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +69 +69 +64 +65 +58 +58 +54 +55 +54 +51 +51 +47 +47 +47 +42 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +16 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +15 +15 +17 +17 +16 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +46 +46 +51 +51 +50 +54 +55 +59 +58 +58 +64 +65 +68 +69 +69 +73 +72 +76 +76 +76 +82 +83 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +179 +179 +180 +183 +183 +185 +185 +189 +188 +189 +190 +191 +195 +195 +194 +197 +197 +196 +196 +196 +198 +198 +200 +200 +200 +200 +201 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +204 +205 +205 +205 +204 +202 +202 +201 +200 +200 +200 +200 +198 +199 +198 +196 +196 +194 +195 +194 +191 +190 +189 +188 +189 +185 +185 +183 +182 +182 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +126 +125 +125 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +54 +54 +55 +51 +50 +47 +47 +47 +43 +43 +41 +41 +42 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +12 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +54 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +126 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +168 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +184 +185 +188 +188 +189 +188 +188 +191 +190 +194 +195 +195 +196 +196 +199 +198 +200 +201 +201 +200 +201 +202 +202 +203 +205 +204 +204 +205 +205 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +204 +205 +205 +204 +205 +202 +202 +202 +201 +201 +201 +200 +200 +199 +199 +197 +197 +196 +194 +195 +190 +190 +191 +189 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +129 +129 +126 +125 +120 +120 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +65 +65 +59 +58 +55 +55 +55 +51 +51 +47 +46 +42 +42 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +24 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +24 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +50 +51 +54 +54 +54 +58 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +105 +106 +110 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +179 +179 +183 +183 +183 +184 +184 +189 +189 +190 +190 +191 +194 +194 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +205 +205 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +204 +202 +202 +202 +200 +200 +201 +200 +201 +198 +199 +196 +197 +195 +194 +194 +190 +190 +188 +188 +188 +184 +184 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +168 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +91 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +69 +68 +64 +65 +58 +58 +58 +55 +54 +51 +51 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +20 +21 +25 +25 +27 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +51 +51 +51 +54 +55 +58 +59 +58 +65 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +101 +100 +100 +106 +105 +110 +109 +109 +115 +115 +115 +115 +115 +120 +120 +125 +126 +125 +130 +129 +133 +133 +138 +139 +139 +144 +144 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +184 +184 +185 +188 +189 +191 +190 +190 +195 +195 +197 +197 +197 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +201 +200 +200 +200 +198 +198 +198 +196 +197 +195 +194 +194 +190 +191 +189 +188 +188 +185 +185 +183 +182 +183 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +134 +130 +129 +126 +125 +125 +119 +120 +116 +115 +115 +109 +109 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +65 +65 +65 +58 +58 +54 +54 +54 +51 +51 +47 +46 +46 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +38 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +51 +50 +54 +54 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +75 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +112 +116 +116 +119 +119 +125 +125 +126 +129 +130 +134 +134 +134 +139 +139 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +184 +185 +185 +189 +189 +190 +191 +194 +194 +194 +197 +197 +199 +198 +199 +201 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +204 +205 +204 +204 +203 +202 +202 +201 +201 +200 +200 +201 +198 +198 +196 +196 +195 +194 +194 +191 +191 +188 +188 +189 +185 +185 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +170 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +148 +147 +147 +143 +143 +139 +140 +139 +133 +134 +129 +129 +127 +125 +125 +119 +120 +115 +116 +115 +109 +110 +106 +106 +105 +100 +100 +100 +100 +99 +96 +95 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +65 +59 +58 +58 +54 +54 +51 +51 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +46 +50 +51 +54 +54 +55 +58 +58 +59 +58 +59 +64 +64 +68 +68 +68 +72 +71 +77 +76 +78 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +115 +116 +120 +119 +125 +125 +129 +129 +129 +133 +133 +140 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +174 +174 +175 +178 +179 +183 +183 +183 +185 +185 +188 +189 +188 +191 +191 +195 +195 +194 +196 +196 +198 +198 +198 +200 +201 +200 +201 +203 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +204 +205 +204 +204 +203 +202 +202 +201 +200 +200 +201 +200 +198 +198 +199 +199 +198 +196 +197 +195 +195 +194 +191 +190 +188 +189 +189 +184 +184 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +125 +125 +125 +119 +119 +115 +116 +116 +109 +110 +105 +106 +103 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +69 +68 +64 +64 +65 +58 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +41 +41 +41 +43 +43 +47 +46 +47 +51 +50 +55 +55 +55 +58 +58 +64 +64 +69 +68 +68 +72 +73 +76 +76 +76 +82 +82 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +184 +185 +185 +189 +188 +190 +191 +194 +194 +194 +196 +196 +198 +198 +199 +200 +201 +201 +200 +201 +202 +203 +205 +205 +205 +204 +204 +206 +206 +207 +207 +207 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +205 +205 +202 +202 +200 +200 +200 +200 +200 +198 +199 +200 +197 +197 +195 +195 +190 +190 +190 +189 +188 +185 +185 +184 +182 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +163 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +138 +139 +139 +133 +133 +128 +130 +130 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +105 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +64 +64 +64 +58 +58 +55 +55 +54 +50 +50 +47 +46 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +27 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +51 +51 +50 +54 +54 +59 +59 +58 +65 +64 +64 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +120 +125 +125 +125 +129 +129 +133 +134 +135 +139 +139 +143 +143 +147 +147 +147 +151 +151 +156 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +172 +175 +175 +178 +179 +183 +183 +182 +184 +185 +188 +189 +189 +190 +190 +195 +194 +195 +197 +196 +198 +199 +199 +201 +201 +201 +200 +201 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +204 +205 +205 +204 +205 +202 +202 +200 +201 +200 +200 +201 +198 +198 +196 +196 +196 +194 +194 +191 +191 +191 +188 +189 +185 +185 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +126 +125 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +54 +55 +54 +51 +50 +47 +47 +47 +42 +42 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +46 +47 +50 +50 +51 +51 +50 +55 +55 +58 +59 +59 +65 +65 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +99 +100 +106 +106 +110 +110 +110 +116 +116 +119 +120 +126 +126 +125 +129 +129 +134 +133 +134 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +185 +189 +189 +191 +191 +190 +195 +195 +196 +196 +196 +198 +198 +200 +201 +201 +200 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +207 +207 +206 +207 +206 +207 +206 +206 +207 +207 +206 +205 +205 +204 +204 +204 +202 +203 +200 +200 +200 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +194 +190 +191 +189 +189 +189 +184 +184 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +119 +119 +116 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +73 +68 +68 +64 +64 +65 +59 +58 +54 +55 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +38 +41 +41 +41 +43 +43 +47 +47 +50 +50 +51 +55 +55 +58 +58 +58 +64 +65 +68 +69 +68 +73 +72 +76 +76 +76 +82 +81 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +120 +125 +125 +129 +130 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +174 +175 +175 +179 +179 +182 +183 +183 +185 +185 +189 +188 +191 +190 +191 +195 +195 +196 +196 +196 +198 +198 +200 +201 +201 +200 +201 +202 +202 +203 +204 +204 +204 +204 +205 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +200 +201 +201 +200 +201 +199 +198 +197 +196 +196 +195 +194 +191 +191 +190 +189 +188 +188 +188 +188 +185 +185 +183 +183 +182 +178 +178 +175 +174 +173 +173 +173 +169 +168 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +125 +125 +125 +120 +119 +116 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +59 +58 +55 +55 +55 +51 +50 +47 +47 +46 +43 +43 +40 +41 +41 +37 +37 +33 +33 +32 +31 +31 +26 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +59 +59 +59 +65 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +116 +120 +119 +126 +125 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +158 +157 +161 +161 +161 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +178 +182 +182 +183 +182 +183 +184 +185 +188 +189 +188 +190 +191 +195 +194 +195 +196 +197 +198 +199 +200 +200 +200 +200 +200 +202 +202 +202 +205 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +207 +207 +204 +205 +204 +204 +205 +203 +202 +202 +200 +200 +200 +201 +201 +201 +200 +199 +198 +198 +196 +196 +194 +195 +193 +190 +191 +189 +189 +184 +184 +184 +183 +182 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +125 +119 +119 +116 +115 +115 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +65 +59 +58 +55 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +26 +21 +20 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +50 +54 +54 +55 +58 +59 +65 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +126 +126 +125 +129 +129 +133 +134 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +185 +189 +188 +190 +190 +194 +195 +194 +196 +197 +198 +198 +199 +200 +200 +201 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +205 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +205 +202 +203 +201 +200 +200 +200 +200 +198 +198 +196 +197 +196 +195 +194 +190 +191 +190 +189 +188 +185 +184 +185 +182 +182 +179 +178 +179 +175 +175 +173 +173 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +129 +130 +125 +125 +123 +119 +120 +116 +116 +109 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +50 +50 +50 +47 +47 +43 +42 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +14 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +34 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +46 +50 +50 +54 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +85 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +115 +119 +119 +125 +125 +126 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +174 +175 +175 +179 +179 +183 +182 +183 +185 +184 +189 +188 +188 +191 +190 +195 +194 +194 +196 +197 +198 +198 +199 +201 +200 +200 +200 +201 +202 +203 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +204 +205 +204 +205 +203 +203 +203 +201 +200 +200 +200 +201 +198 +198 +196 +197 +196 +195 +195 +191 +190 +190 +189 +189 +185 +185 +185 +182 +183 +179 +179 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +130 +129 +125 +126 +119 +119 +119 +115 +116 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +73 +68 +69 +68 +65 +64 +58 +58 +58 +54 +54 +50 +50 +51 +47 +46 +43 +43 +43 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +16 +18 +19 +20 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +46 +47 +51 +50 +51 +55 +55 +58 +58 +59 +64 +64 +69 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +116 +120 +120 +119 +125 +126 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +179 +179 +179 +183 +182 +184 +185 +184 +188 +189 +191 +191 +191 +195 +194 +196 +197 +197 +198 +198 +200 +200 +201 +200 +200 +203 +202 +204 +204 +205 +205 +205 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +202 +201 +200 +201 +200 +200 +198 +198 +197 +196 +197 +194 +195 +190 +190 +191 +188 +189 +184 +185 +183 +182 +183 +178 +178 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +166 +161 +160 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +130 +126 +126 +126 +119 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +54 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +47 +46 +50 +51 +51 +55 +55 +57 +59 +64 +64 +65 +69 +68 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +100 +105 +106 +110 +109 +116 +115 +116 +119 +120 +126 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +175 +175 +175 +178 +178 +183 +182 +183 +185 +185 +188 +188 +189 +191 +190 +194 +194 +196 +196 +197 +198 +199 +200 +201 +200 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +200 +200 +199 +199 +196 +196 +196 +195 +194 +190 +190 +190 +188 +188 +185 +185 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +164 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +134 +133 +133 +130 +129 +126 +125 +126 +119 +120 +115 +115 +110 +109 +109 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +74 +68 +68 +64 +65 +58 +59 +58 +55 +55 +50 +50 +50 +46 +47 +46 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +48 +47 +47 +51 +51 +54 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +105 +106 +110 +109 +115 +115 +116 +119 +120 +126 +126 +125 +130 +129 +133 +133 +133 +140 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +184 +189 +188 +188 +190 +191 +194 +194 +194 +196 +196 +197 +197 +197 +198 +198 +201 +200 +201 +200 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +205 +205 +205 +202 +202 +201 +200 +200 +200 +200 +199 +198 +198 +196 +197 +194 +194 +194 +190 +190 +189 +189 +189 +184 +184 +183 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +166 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +144 +139 +139 +140 +133 +133 +129 +129 +126 +125 +125 +119 +119 +115 +115 +115 +109 +109 +106 +106 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +54 +54 +51 +50 +47 +47 +47 +43 +42 +41 +41 +39 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +87 +86 +86 +90 +91 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +115 +116 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +184 +184 +188 +188 +188 +188 +188 +190 +190 +194 +195 +194 +197 +197 +198 +199 +200 +201 +200 +200 +200 +203 +202 +202 +204 +204 +204 +205 +204 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +202 +201 +201 +201 +200 +200 +199 +199 +197 +196 +196 +194 +194 +191 +191 +191 +188 +189 +184 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +151 +151 +147 +148 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +115 +116 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +59 +56 +55 +54 +50 +50 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +54 +58 +58 +65 +65 +64 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +126 +125 +129 +129 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +148 +148 +151 +152 +157 +156 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +173 +173 +173 +175 +175 +178 +178 +179 +183 +183 +185 +184 +186 +188 +189 +191 +191 +194 +194 +195 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +203 +205 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +201 +200 +201 +198 +198 +197 +197 +197 +195 +195 +190 +190 +191 +189 +189 +185 +185 +184 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +68 +68 +64 +64 +59 +58 +58 +54 +54 +51 +51 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +18 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +40 +41 +43 +43 +47 +47 +51 +51 +51 +55 +55 +59 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +119 +126 +125 +130 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +178 +182 +183 +183 +184 +185 +188 +189 +189 +191 +190 +195 +194 +195 +196 +196 +198 +199 +199 +200 +201 +201 +201 +201 +203 +203 +204 +205 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +200 +200 +201 +201 +200 +199 +198 +196 +196 +196 +195 +194 +190 +190 +190 +188 +189 +184 +184 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +148 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +119 +120 +119 +116 +116 +110 +110 +110 +106 +106 +105 +106 +106 +100 +99 +96 +96 +96 +90 +90 +87 +87 +87 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +65 +65 +59 +59 +55 +55 +54 +51 +51 +46 +46 +47 +43 +43 +41 +42 +37 +37 +37 +33 +34 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +41 +44 +43 +43 +46 +47 +47 +46 +47 +51 +51 +54 +55 +55 +58 +58 +65 +64 +64 +68 +68 +72 +72 +73 +77 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +120 +122 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +152 +152 +157 +157 +157 +161 +161 +164 +165 +166 +169 +169 +173 +173 +175 +175 +174 +179 +178 +182 +183 +183 +185 +184 +189 +188 +189 +191 +190 +194 +194 +195 +196 +197 +198 +198 +200 +201 +201 +200 +200 +203 +202 +202 +204 +205 +205 +205 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +205 +205 +205 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +196 +195 +195 +190 +191 +191 +189 +189 +185 +185 +183 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +148 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +59 +59 +54 +55 +53 +50 +50 +47 +47 +43 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +55 +54 +55 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +120 +125 +125 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +184 +185 +188 +188 +189 +190 +190 +194 +194 +194 +197 +197 +198 +199 +198 +200 +201 +200 +200 +200 +203 +202 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +201 +201 +201 +201 +200 +198 +198 +197 +197 +196 +195 +195 +191 +191 +190 +189 +188 +185 +184 +184 +182 +182 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +148 +147 +148 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +58 +59 +54 +54 +50 +50 +51 +46 +47 +43 +43 +43 +41 +41 +37 +36 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +101 +106 +106 +106 +110 +110 +109 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +129 +131 +133 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +178 +179 +182 +183 +185 +184 +185 +188 +189 +191 +191 +191 +194 +195 +196 +197 +197 +198 +199 +201 +200 +201 +200 +201 +202 +202 +205 +205 +204 +204 +205 +206 +207 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +205 +202 +202 +201 +200 +200 +200 +201 +198 +198 +198 +196 +196 +195 +194 +195 +191 +191 +189 +188 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +160 +161 +157 +157 +151 +151 +151 +148 +147 +143 +143 +141 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +119 +115 +115 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +54 +54 +55 +50 +50 +47 +47 +43 +43 +42 +41 +40 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +25 +21 +22 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +40 +43 +43 +43 +43 +43 +46 +47 +51 +51 +50 +54 +55 +58 +59 +59 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +108 +109 +110 +116 +115 +120 +119 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +174 +175 +179 +179 +183 +183 +182 +185 +184 +189 +188 +188 +190 +190 +194 +194 +197 +197 +196 +199 +198 +200 +200 +200 +200 +201 +200 +200 +200 +202 +202 +204 +204 +204 +205 +204 +206 +207 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +203 +200 +200 +201 +201 +201 +198 +198 +199 +196 +196 +194 +194 +190 +190 +191 +188 +189 +184 +185 +185 +183 +183 +183 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +157 +157 +156 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +120 +119 +116 +115 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +91 +90 +86 +86 +86 +82 +81 +76 +77 +76 +73 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +55 +51 +51 +47 +46 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +16 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +48 +50 +50 +54 +55 +58 +59 +58 +64 +64 +64 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +115 +120 +120 +120 +125 +126 +129 +129 +130 +133 +134 +139 +139 +142 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +185 +184 +185 +189 +188 +190 +191 +191 +194 +195 +196 +196 +196 +198 +199 +200 +201 +201 +200 +200 +203 +202 +202 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +198 +198 +199 +196 +196 +195 +194 +194 +190 +191 +190 +190 +191 +188 +188 +184 +185 +184 +183 +183 +179 +179 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +144 +140 +139 +134 +134 +133 +130 +129 +125 +125 +126 +119 +120 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +69 +64 +64 +64 +58 +58 +55 +55 +55 +51 +51 +47 +47 +47 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +28 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +42 +47 +47 +50 +51 +50 +55 +54 +54 +54 +54 +59 +58 +64 +65 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +115 +116 +119 +120 +126 +125 +129 +130 +129 +133 +133 +139 +139 +140 +143 +143 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +160 +165 +165 +169 +169 +173 +173 +173 +175 +174 +178 +178 +179 +182 +183 +185 +185 +184 +189 +189 +190 +191 +190 +194 +195 +196 +197 +197 +198 +198 +200 +200 +201 +201 +200 +203 +203 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +200 +200 +200 +198 +199 +197 +196 +196 +195 +195 +190 +191 +190 +188 +189 +184 +185 +183 +183 +183 +179 +178 +174 +175 +175 +173 +173 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +155 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +134 +134 +129 +129 +125 +125 +125 +120 +120 +116 +115 +116 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +54 +55 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +36 +41 +41 +43 +43 +43 +47 +47 +50 +51 +52 +55 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +115 +119 +119 +125 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +185 +189 +188 +190 +190 +195 +194 +194 +197 +197 +198 +199 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +200 +199 +198 +197 +196 +197 +194 +194 +190 +190 +190 +188 +189 +185 +185 +185 +183 +182 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +168 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +146 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +120 +116 +115 +116 +110 +110 +105 +106 +106 +100 +101 +96 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +77 +72 +72 +68 +69 +65 +64 +64 +58 +59 +55 +55 +55 +50 +51 +47 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +39 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +55 +59 +59 +65 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +120 +119 +125 +125 +126 +130 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +183 +183 +182 +184 +185 +188 +189 +189 +190 +190 +195 +195 +194 +196 +196 +198 +198 +199 +200 +200 +201 +201 +201 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +206 +207 +207 +207 +206 +205 +204 +204 +204 +203 +202 +203 +201 +200 +200 +201 +200 +198 +198 +196 +196 +197 +194 +194 +194 +194 +194 +191 +191 +189 +189 +189 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +134 +133 +129 +129 +125 +125 +125 +120 +120 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +73 +69 +68 +64 +65 +64 +59 +59 +54 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +24 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +120 +126 +126 +125 +129 +130 +134 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +158 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +184 +188 +189 +191 +190 +190 +194 +195 +196 +196 +197 +198 +199 +200 +200 +200 +200 +200 +202 +203 +204 +204 +205 +204 +204 +205 +204 +204 +206 +206 +206 +207 +207 +206 +207 +207 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +203 +202 +200 +201 +201 +200 +200 +201 +201 +198 +199 +199 +196 +197 +194 +195 +193 +190 +191 +188 +188 +185 +185 +185 +183 +182 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +164 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +126 +126 +119 +119 +115 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +55 +54 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +26 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +28 +27 +31 +31 +31 +32 +33 +37 +37 +37 +42 +41 +43 +42 +43 +47 +46 +50 +51 +53 +55 +55 +58 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +119 +120 +126 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +185 +188 +188 +190 +191 +195 +194 +194 +196 +197 +198 +198 +198 +200 +201 +200 +200 +200 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +206 +204 +204 +205 +205 +205 +204 +204 +202 +202 +203 +200 +200 +201 +201 +199 +199 +199 +196 +196 +194 +194 +195 +191 +191 +189 +189 +188 +185 +184 +183 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +129 +125 +126 +120 +119 +116 +116 +116 +110 +111 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +65 +64 +59 +59 +54 +54 +55 +51 +51 +47 +46 +47 +43 +43 +41 +40 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +42 +43 +47 +47 +50 +51 +51 +54 +55 +58 +58 +58 +64 +64 +68 +68 +69 +72 +73 +76 +76 +77 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +115 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +184 +185 +185 +188 +189 +190 +190 +190 +194 +194 +195 +195 +194 +195 +194 +196 +196 +197 +199 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +207 +206 +206 +205 +207 +206 +207 +206 +206 +206 +205 +204 +205 +205 +204 +202 +202 +202 +200 +201 +200 +201 +200 +198 +198 +197 +197 +196 +195 +195 +190 +191 +191 +188 +189 +185 +184 +182 +183 +182 +178 +179 +175 +175 +175 +173 +173 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +134 +129 +129 +126 +125 +125 +119 +120 +116 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +55 +54 +55 +50 +50 +46 +46 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +16 +14 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +54 +59 +59 +65 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +116 +115 +115 +120 +119 +125 +125 +125 +129 +130 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +189 +189 +190 +191 +194 +195 +197 +196 +197 +199 +198 +200 +200 +200 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +207 +206 +206 +207 +206 +206 +207 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +200 +200 +200 +198 +198 +196 +196 +197 +194 +194 +191 +191 +191 +189 +189 +185 +185 +184 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +130 +129 +125 +125 +126 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +65 +64 +58 +58 +58 +55 +55 +51 +50 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +48 +47 +47 +51 +50 +54 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +109 +110 +110 +110 +115 +115 +119 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +178 +179 +182 +183 +184 +184 +185 +189 +188 +191 +191 +190 +194 +194 +195 +194 +195 +197 +196 +199 +198 +198 +200 +201 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +205 +204 +204 +203 +203 +203 +200 +201 +200 +200 +200 +198 +198 +197 +197 +196 +195 +195 +191 +190 +190 +188 +189 +185 +184 +185 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +144 +139 +139 +133 +133 +129 +130 +130 +125 +125 +119 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +83 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +64 +64 +65 +58 +58 +54 +54 +54 +51 +50 +47 +47 +45 +43 +43 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +54 +59 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +85 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +119 +126 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +174 +175 +175 +179 +179 +183 +183 +182 +185 +184 +184 +185 +184 +188 +189 +191 +191 +191 +194 +195 +197 +196 +197 +198 +199 +201 +200 +200 +201 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +201 +198 +199 +198 +196 +196 +195 +194 +195 +190 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +130 +125 +125 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +36 +37 +33 +32 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +24 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +50 +51 +50 +54 +54 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +126 +129 +129 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +184 +185 +188 +189 +188 +191 +190 +194 +194 +194 +197 +196 +198 +199 +198 +201 +200 +201 +200 +200 +202 +202 +204 +204 +205 +205 +205 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +201 +200 +198 +198 +199 +199 +199 +197 +197 +194 +195 +194 +190 +191 +189 +189 +189 +184 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +55 +55 +54 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +24 +25 +21 +21 +19 +18 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +40 +41 +43 +43 +46 +47 +47 +50 +51 +54 +55 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +109 +110 +115 +116 +120 +119 +122 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +174 +175 +175 +178 +178 +183 +183 +183 +185 +185 +189 +188 +189 +190 +191 +194 +195 +195 +197 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +201 +200 +198 +198 +196 +196 +197 +194 +194 +190 +190 +191 +189 +188 +184 +185 +183 +182 +183 +178 +178 +175 +175 +174 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +152 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +125 +126 +125 +119 +119 +115 +115 +116 +109 +110 +106 +106 +103 +100 +100 +96 +96 +89 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +58 +55 +54 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +46 +47 +50 +50 +55 +55 +55 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +109 +109 +116 +115 +116 +119 +119 +126 +125 +125 +129 +129 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +189 +188 +190 +190 +191 +195 +194 +196 +196 +197 +199 +199 +201 +200 +200 +200 +201 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +203 +203 +202 +200 +201 +200 +201 +201 +198 +198 +196 +196 +195 +194 +194 +190 +190 +188 +189 +189 +184 +185 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +119 +118 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +69 +68 +65 +64 +58 +58 +58 +55 +54 +51 +50 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +55 +55 +54 +58 +58 +64 +64 +65 +68 +68 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +116 +115 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +132 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +182 +182 +182 +185 +184 +188 +188 +188 +190 +190 +195 +194 +195 +197 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +203 +204 +204 +205 +204 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +198 +197 +196 +196 +194 +194 +191 +190 +190 +188 +188 +185 +185 +185 +182 +183 +179 +179 +179 +175 +174 +173 +173 +170 +169 +169 +165 +165 +161 +161 +161 +157 +157 +156 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +137 +133 +133 +129 +129 +125 +125 +126 +120 +119 +115 +116 +115 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +59 +54 +54 +51 +51 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +50 +51 +51 +55 +55 +58 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +105 +105 +106 +110 +110 +115 +116 +119 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +160 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +182 +184 +185 +189 +189 +188 +191 +190 +194 +194 +195 +196 +197 +198 +198 +201 +201 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +195 +190 +190 +191 +189 +188 +184 +184 +183 +183 +183 +178 +178 +175 +175 +175 +172 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +130 +129 +129 +125 +125 +119 +119 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +58 +54 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +56 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +107 +110 +110 +116 +116 +119 +120 +120 +125 +125 +130 +130 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +160 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +183 +184 +184 +188 +188 +189 +190 +190 +195 +194 +197 +197 +197 +198 +199 +200 +200 +200 +200 +200 +203 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +199 +198 +196 +197 +197 +195 +195 +190 +191 +188 +189 +189 +185 +184 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +130 +125 +125 +126 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +58 +58 +59 +54 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +17 +16 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +52 +54 +54 +58 +59 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +110 +109 +109 +116 +115 +120 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +183 +183 +183 +184 +185 +188 +188 +189 +190 +191 +194 +194 +194 +197 +196 +198 +198 +198 +200 +201 +200 +200 +200 +202 +203 +204 +204 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +197 +197 +194 +194 +191 +191 +190 +188 +189 +184 +185 +185 +182 +183 +179 +179 +179 +175 +174 +173 +173 +174 +169 +169 +165 +165 +161 +161 +160 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +126 +126 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +59 +58 +54 +55 +55 +51 +50 +47 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +32 +31 +31 +26 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +55 +58 +59 +58 +58 +58 +64 +65 +68 +68 +69 +72 +72 +76 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +109 +115 +116 +120 +120 +120 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +178 +179 +183 +183 +184 +184 +184 +188 +189 +191 +190 +190 +194 +194 +196 +197 +196 +198 +198 +200 +200 +200 +201 +200 +202 +202 +205 +205 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +205 +204 +204 +203 +202 +200 +201 +201 +200 +200 +198 +199 +198 +196 +196 +195 +194 +195 +190 +191 +189 +188 +188 +185 +184 +183 +182 +183 +179 +179 +174 +175 +172 +173 +173 +169 +168 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +142 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +89 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +59 +59 +55 +55 +50 +50 +51 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +32 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +50 +51 +51 +54 +54 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +119 +125 +125 +125 +130 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +184 +185 +188 +188 +191 +190 +190 +194 +195 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +200 +201 +200 +199 +198 +196 +196 +196 +194 +195 +191 +190 +189 +189 +188 +185 +184 +182 +182 +183 +179 +178 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +133 +133 +133 +133 +129 +130 +125 +125 +125 +120 +119 +116 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +54 +54 +51 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +58 +58 +58 +64 +64 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +184 +185 +188 +189 +190 +190 +195 +194 +195 +196 +197 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +201 +200 +198 +198 +197 +196 +196 +194 +194 +190 +191 +190 +189 +188 +184 +184 +184 +182 +183 +183 +183 +182 +178 +178 +175 +175 +174 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +115 +115 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +55 +54 +55 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +15 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +43 +43 +43 +46 +47 +50 +51 +50 +54 +54 +59 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +109 +110 +115 +115 +120 +120 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +172 +174 +175 +178 +178 +183 +182 +183 +185 +184 +189 +188 +188 +190 +190 +194 +194 +194 +196 +196 +198 +198 +198 +200 +201 +200 +200 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +196 +197 +196 +194 +194 +191 +190 +191 +188 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +65 +58 +58 +58 +55 +55 +50 +51 +51 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +12 +15 +15 +15 +15 +15 +17 +16 +19 +19 +19 +21 +21 +25 +25 +27 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +47 +50 +50 +54 +54 +55 +58 +58 +64 +65 +68 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +120 +119 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +178 +178 +183 +182 +183 +185 +185 +189 +188 +189 +190 +191 +194 +195 +195 +197 +197 +198 +198 +201 +200 +201 +201 +200 +202 +203 +202 +205 +204 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +205 +205 +205 +204 +204 +202 +202 +202 +203 +202 +200 +200 +201 +200 +200 +199 +199 +196 +196 +195 +194 +194 +190 +191 +188 +189 +188 +185 +185 +182 +182 +182 +178 +178 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +129 +125 +125 +119 +120 +120 +116 +116 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +59 +55 +55 +54 +50 +51 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +32 +31 +33 +32 +33 +37 +37 +40 +41 +41 +43 +42 +47 +47 +50 +51 +51 +54 +55 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +172 +173 +175 +175 +175 +179 +179 +182 +182 +183 +184 +185 +189 +188 +191 +190 +191 +194 +194 +196 +197 +196 +198 +198 +198 +198 +198 +201 +200 +200 +200 +200 +202 +203 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +201 +200 +198 +198 +198 +196 +196 +194 +194 +194 +191 +190 +189 +189 +188 +185 +185 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +126 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +59 +55 +54 +55 +50 +50 +46 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +18 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +58 +59 +59 +64 +65 +68 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +109 +110 +115 +116 +119 +119 +120 +126 +125 +129 +129 +134 +133 +133 +139 +139 +143 +144 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +179 +178 +179 +182 +183 +185 +184 +184 +189 +189 +189 +189 +188 +190 +190 +194 +194 +194 +196 +197 +198 +199 +199 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +205 +204 +204 +204 +205 +203 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +195 +194 +195 +190 +191 +189 +188 +184 +184 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +116 +110 +110 +105 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +58 +58 +54 +55 +55 +51 +50 +47 +46 +43 +43 +42 +40 +41 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +55 +54 +54 +58 +58 +64 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +116 +119 +120 +120 +125 +125 +129 +129 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +180 +183 +183 +185 +184 +188 +188 +189 +191 +191 +195 +195 +195 +197 +197 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +203 +203 +204 +205 +204 +204 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +205 +204 +205 +203 +202 +201 +201 +200 +200 +201 +198 +198 +199 +196 +197 +194 +194 +194 +191 +190 +188 +188 +188 +184 +185 +183 +183 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +134 +129 +129 +126 +125 +125 +119 +120 +115 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +69 +68 +64 +64 +65 +58 +58 +55 +55 +55 +50 +50 +46 +47 +46 +43 +43 +40 +40 +39 +37 +37 +33 +33 +31 +31 +30 +27 +26 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +40 +40 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +120 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +185 +184 +184 +189 +188 +191 +190 +191 +194 +195 +196 +196 +198 +198 +199 +200 +200 +200 +200 +200 +202 +202 +205 +204 +205 +204 +204 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +199 +199 +198 +197 +196 +195 +194 +195 +190 +191 +189 +189 +185 +184 +184 +183 +183 +179 +179 +178 +175 +175 +175 +175 +174 +173 +173 +169 +169 +170 +165 +165 +161 +161 +160 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +126 +125 +119 +119 +120 +115 +116 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +77 +76 +72 +72 +72 +68 +69 +64 +64 +65 +59 +58 +55 +54 +51 +50 +51 +47 +47 +43 +43 +43 +40 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +30 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +51 +51 +54 +55 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +120 +125 +125 +125 +126 +125 +130 +129 +133 +133 +134 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +182 +183 +183 +185 +185 +188 +188 +188 +191 +190 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +201 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +198 +196 +196 +195 +194 +195 +191 +191 +188 +188 +189 +184 +184 +182 +183 +182 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +141 +133 +133 +130 +130 +126 +125 +126 +119 +119 +115 +115 +115 +109 +109 +110 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +64 +64 +64 +59 +58 +54 +55 +55 +50 +50 +47 +47 +45 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +26 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +47 +46 +47 +47 +46 +50 +50 +54 +54 +54 +58 +58 +65 +64 +65 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +125 +125 +126 +129 +129 +133 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +182 +184 +185 +188 +188 +189 +191 +191 +194 +194 +196 +196 +197 +199 +198 +200 +200 +201 +200 +200 +202 +202 +202 +205 +204 +205 +204 +204 +206 +206 +206 +207 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +197 +197 +195 +194 +190 +191 +189 +188 +188 +185 +184 +182 +183 +183 +178 +178 +174 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +133 +133 +133 +129 +129 +125 +125 +125 +120 +120 +115 +116 +113 +110 +110 +105 +106 +99 +100 +100 +95 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +64 +64 +58 +58 +54 +55 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +15 +14 +15 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +59 +58 +58 +64 +64 +68 +68 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +115 +115 +120 +119 +119 +126 +125 +126 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +144 +147 +147 +151 +150 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +184 +185 +185 +188 +188 +190 +191 +191 +195 +195 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +205 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +202 +200 +200 +201 +201 +199 +198 +199 +196 +196 +194 +195 +194 +190 +191 +188 +189 +188 +185 +184 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +130 +125 +126 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +55 +50 +50 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +34 +32 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +46 +46 +47 +50 +51 +55 +54 +54 +58 +58 +59 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +79 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +100 +105 +105 +106 +106 +106 +109 +110 +115 +115 +116 +120 +119 +125 +125 +128 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +182 +185 +185 +188 +188 +189 +190 +191 +195 +194 +194 +196 +197 +198 +198 +199 +200 +201 +201 +200 +202 +203 +203 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +203 +202 +203 +201 +200 +200 +200 +200 +199 +198 +196 +197 +197 +195 +195 +190 +190 +191 +188 +188 +185 +184 +185 +183 +183 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +134 +133 +129 +129 +129 +126 +125 +119 +120 +119 +115 +115 +117 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +55 +55 +55 +51 +50 +47 +47 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +18 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +38 +37 +37 +41 +41 +43 +43 +43 +47 +47 +46 +47 +47 +51 +51 +55 +55 +55 +59 +59 +65 +64 +66 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +115 +115 +116 +120 +119 +125 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +148 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +189 +188 +190 +191 +191 +195 +194 +196 +197 +198 +198 +199 +201 +200 +201 +201 +200 +203 +202 +204 +205 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +207 +207 +207 +206 +204 +204 +204 +204 +205 +202 +203 +201 +201 +201 +201 +200 +199 +198 +199 +197 +196 +194 +194 +195 +190 +191 +189 +188 +184 +184 +185 +183 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +130 +130 +126 +126 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +65 +58 +58 +55 +55 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +55 +56 +58 +59 +65 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +115 +115 +115 +120 +120 +126 +126 +125 +130 +129 +134 +134 +133 +139 +139 +143 +143 +144 +147 +147 +152 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +185 +184 +189 +188 +190 +190 +195 +194 +195 +197 +196 +198 +198 +198 +200 +200 +201 +201 +200 +202 +202 +204 +204 +204 +205 +205 +206 +206 +207 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +205 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +197 +197 +195 +194 +191 +190 +190 +189 +189 +185 +185 +184 +183 +183 +182 +182 +183 +179 +178 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +144 +143 +139 +139 +134 +133 +134 +129 +129 +126 +125 +120 +120 +119 +116 +115 +109 +109 +110 +105 +106 +100 +100 +100 +95 +96 +89 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +69 +69 +68 +64 +65 +58 +58 +59 +55 +55 +50 +51 +50 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +43 +46 +47 +50 +50 +51 +54 +55 +59 +59 +58 +64 +64 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +126 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +175 +175 +178 +179 +183 +183 +182 +184 +185 +189 +189 +188 +190 +190 +194 +194 +194 +196 +197 +198 +198 +198 +200 +200 +200 +200 +200 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +200 +201 +200 +198 +198 +197 +197 +196 +195 +195 +191 +190 +190 +188 +188 +185 +184 +185 +182 +183 +178 +179 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +136 +134 +133 +129 +129 +125 +126 +126 +120 +119 +115 +116 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +85 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +59 +54 +54 +55 +50 +51 +47 +46 +46 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +51 +51 +51 +55 +54 +58 +58 +59 +64 +64 +69 +68 +70 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +115 +115 +119 +120 +125 +125 +126 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +183 +182 +184 +185 +185 +188 +188 +190 +190 +190 +195 +194 +196 +197 +197 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +205 +204 +205 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +206 +204 +205 +204 +204 +204 +202 +202 +200 +201 +200 +200 +200 +201 +201 +200 +198 +198 +196 +196 +197 +194 +195 +190 +191 +189 +188 +189 +185 +185 +182 +182 +183 +178 +178 +175 +175 +174 +173 +172 +173 +173 +173 +168 +168 +165 +164 +165 +161 +160 +157 +157 +152 +150 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +133 +129 +129 +125 +125 +120 +120 +119 +115 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +58 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +30 +31 +33 +32 +37 +36 +37 +41 +41 +41 +40 +41 +43 +42 +46 +46 +47 +51 +51 +55 +54 +55 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +129 +134 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +182 +184 +185 +189 +188 +189 +191 +190 +194 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +207 +205 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +205 +204 +202 +203 +202 +200 +200 +200 +200 +198 +199 +198 +197 +196 +194 +194 +195 +190 +191 +189 +188 +188 +185 +185 +185 +185 +184 +183 +182 +178 +178 +179 +174 +175 +173 +172 +171 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +126 +126 +119 +119 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +65 +65 +58 +58 +58 +55 +54 +51 +51 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +36 +33 +31 +31 +31 +27 +27 +27 +28 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +39 +41 +40 +42 +43 +46 +46 +47 +51 +50 +54 +55 +55 +58 +58 +64 +64 +65 +68 +68 +73 +72 +73 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +119 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +144 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +184 +189 +188 +191 +190 +190 +194 +195 +196 +197 +197 +199 +198 +200 +200 +201 +200 +200 +202 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +201 +200 +200 +200 +201 +198 +198 +198 +199 +198 +196 +196 +194 +194 +195 +190 +191 +188 +188 +187 +184 +185 +183 +182 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +134 +134 +129 +129 +125 +125 +125 +119 +120 +116 +115 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +55 +55 +55 +50 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +20 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +47 +51 +51 +54 +55 +55 +59 +59 +64 +64 +68 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +91 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +168 +168 +173 +173 +175 +175 +175 +178 +179 +183 +182 +183 +185 +185 +188 +188 +189 +190 +191 +195 +195 +194 +196 +196 +198 +198 +201 +200 +200 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +205 +204 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +207 +205 +205 +204 +204 +204 +203 +202 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +197 +195 +194 +195 +191 +191 +188 +189 +188 +185 +185 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +130 +129 +125 +126 +119 +120 +119 +116 +115 +110 +109 +105 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +55 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +32 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +16 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +50 +51 +51 +54 +55 +59 +59 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +91 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +182 +182 +183 +185 +185 +189 +189 +191 +191 +191 +194 +194 +196 +197 +196 +198 +199 +200 +200 +201 +201 +201 +203 +202 +202 +205 +205 +205 +204 +205 +206 +206 +206 +206 +207 +206 +207 +207 +206 +207 +207 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +201 +200 +200 +201 +198 +198 +196 +197 +196 +194 +195 +191 +191 +191 +189 +189 +184 +185 +184 +183 +183 +179 +179 +179 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +129 +126 +125 +119 +119 +115 +116 +116 +110 +109 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +54 +55 +50 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +24 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +42 +43 +43 +46 +47 +51 +51 +51 +54 +55 +58 +59 +59 +64 +65 +68 +68 +68 +73 +72 +76 +76 +77 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +116 +116 +120 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +184 +185 +185 +188 +189 +190 +190 +191 +195 +194 +195 +194 +194 +196 +197 +199 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +204 +205 +205 +204 +204 +203 +203 +201 +200 +201 +200 +201 +200 +200 +200 +198 +198 +196 +196 +197 +194 +195 +191 +191 +191 +188 +189 +184 +185 +185 +183 +183 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +119 +116 +115 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +65 +64 +58 +58 +59 +54 +54 +51 +51 +51 +47 +47 +43 +43 +40 +41 +40 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +64 +69 +69 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +115 +115 +120 +119 +120 +126 +125 +129 +130 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +172 +175 +175 +175 +179 +179 +179 +179 +179 +183 +183 +185 +185 +185 +189 +188 +190 +190 +192 +195 +194 +197 +196 +196 +196 +197 +198 +198 +201 +200 +200 +200 +200 +200 +201 +201 +202 +202 +204 +205 +204 +204 +205 +206 +206 +207 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +207 +205 +205 +204 +204 +205 +203 +202 +203 +200 +201 +201 +201 +199 +198 +198 +197 +197 +195 +195 +194 +190 +190 +188 +188 +188 +185 +185 +183 +182 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +105 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +83 +76 +76 +77 +72 +72 +68 +69 +64 +64 +64 +58 +58 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +40 +41 +41 +37 +37 +32 +33 +32 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +38 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +51 +54 +54 +58 +58 +58 +64 +64 +68 +68 +68 +73 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +125 +127 +129 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +185 +185 +189 +189 +189 +189 +189 +190 +191 +194 +195 +195 +197 +196 +198 +199 +200 +201 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +205 +204 +205 +205 +205 +203 +202 +202 +200 +201 +200 +200 +200 +198 +199 +197 +197 +196 +194 +195 +190 +190 +191 +188 +188 +185 +184 +183 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +134 +133 +129 +130 +130 +126 +126 +120 +120 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +58 +59 +54 +55 +51 +51 +51 +46 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +119 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +178 +182 +182 +185 +185 +184 +189 +189 +190 +190 +192 +194 +195 +197 +197 +199 +199 +198 +200 +201 +201 +200 +200 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +199 +199 +197 +196 +195 +195 +190 +191 +190 +188 +188 +185 +185 +185 +183 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +134 +133 +129 +129 +125 +125 +125 +119 +119 +115 +115 +116 +110 +110 +105 +105 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +65 +65 +61 +58 +58 +55 +54 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +30 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +20 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +50 +55 +54 +59 +58 +58 +65 +65 +68 +69 +69 +72 +72 +77 +76 +76 +82 +82 +86 +87 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +110 +109 +116 +115 +119 +120 +119 +125 +126 +126 +126 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +182 +183 +185 +185 +189 +189 +190 +191 +190 +194 +195 +196 +197 +196 +198 +198 +200 +200 +201 +201 +200 +202 +202 +203 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +203 +201 +201 +201 +200 +198 +198 +198 +196 +197 +194 +194 +195 +190 +191 +188 +188 +189 +185 +185 +182 +183 +183 +179 +179 +175 +175 +175 +174 +173 +169 +169 +165 +164 +165 +161 +161 +157 +158 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +130 +126 +125 +119 +119 +116 +116 +115 +110 +109 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +83 +83 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +40 +37 +37 +36 +33 +33 +31 +31 +31 +26 +27 +25 +25 +25 +21 +21 +19 +19 +19 +16 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +42 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +54 +58 +58 +64 +64 +65 +69 +69 +72 +72 +73 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +115 +115 +116 +119 +120 +126 +126 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +171 +173 +173 +175 +175 +178 +179 +179 +183 +182 +185 +185 +185 +188 +189 +191 +191 +191 +194 +195 +196 +196 +197 +199 +199 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +207 +207 +206 +206 +207 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +200 +198 +199 +198 +196 +196 +194 +194 +194 +190 +190 +188 +188 +189 +184 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +148 +148 +143 +143 +139 +140 +134 +133 +133 +129 +129 +125 +125 +125 +120 +119 +120 +120 +120 +116 +116 +109 +110 +110 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +46 +51 +51 +51 +55 +55 +58 +59 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +112 +115 +115 +119 +120 +125 +126 +126 +129 +130 +133 +133 +133 +140 +139 +139 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +182 +185 +185 +188 +189 +189 +190 +191 +194 +195 +196 +197 +197 +198 +198 +200 +200 +200 +201 +201 +202 +202 +202 +205 +204 +205 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +207 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +199 +198 +196 +196 +196 +195 +195 +190 +190 +189 +189 +188 +185 +185 +183 +183 +182 +178 +178 +174 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +130 +125 +125 +125 +119 +119 +115 +116 +112 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +64 +64 +59 +59 +54 +55 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +55 +58 +58 +58 +65 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +119 +125 +125 +125 +125 +126 +129 +130 +134 +133 +134 +139 +139 +143 +144 +148 +148 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +182 +185 +185 +188 +189 +189 +190 +190 +194 +195 +194 +196 +196 +198 +198 +198 +200 +200 +201 +201 +201 +202 +202 +204 +205 +205 +204 +204 +206 +207 +206 +207 +206 +207 +206 +206 +207 +206 +207 +207 +206 +207 +206 +205 +205 +204 +205 +204 +203 +202 +201 +200 +201 +201 +201 +199 +199 +197 +196 +196 +194 +194 +190 +191 +191 +188 +189 +185 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +156 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +120 +116 +116 +115 +109 +109 +106 +106 +105 +100 +99 +100 +100 +100 +96 +95 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +69 +69 +64 +64 +59 +58 +59 +55 +55 +50 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +26 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +20 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +44 +43 +43 +47 +47 +51 +50 +50 +54 +54 +58 +59 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +81 +82 +81 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +115 +116 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +182 +182 +184 +185 +189 +189 +189 +190 +190 +194 +195 +195 +196 +196 +199 +198 +198 +200 +200 +200 +201 +203 +202 +202 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +204 +204 +205 +204 +204 +203 +202 +200 +200 +200 +200 +200 +198 +198 +199 +196 +197 +194 +195 +195 +190 +191 +188 +189 +189 +185 +184 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +170 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +152 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +125 +125 +125 +125 +119 +119 +115 +115 +115 +109 +110 +106 +106 +103 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +72 +72 +68 +68 +65 +64 +65 +58 +58 +55 +54 +50 +50 +50 +47 +46 +43 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +28 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +36 +37 +37 +37 +41 +41 +42 +42 +43 +47 +47 +51 +51 +52 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +87 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +150 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +182 +183 +182 +185 +185 +189 +188 +191 +191 +190 +194 +194 +197 +196 +196 +199 +199 +200 +200 +201 +201 +200 +202 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +204 +204 +204 +202 +203 +202 +200 +200 +200 +201 +201 +199 +199 +196 +196 +194 +195 +194 +190 +191 +188 +188 +188 +184 +185 +185 +184 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +171 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +129 +130 +126 +125 +126 +120 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +73 +73 +68 +68 +64 +64 +65 +59 +59 +54 +54 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +24 +24 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +55 +54 +54 +59 +59 +65 +64 +64 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +115 +116 +119 +119 +125 +126 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +179 +178 +183 +183 +183 +184 +184 +189 +188 +188 +190 +190 +195 +195 +194 +197 +196 +198 +198 +198 +200 +200 +200 +200 +203 +202 +202 +204 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +201 +199 +198 +198 +198 +198 +196 +196 +194 +195 +194 +191 +191 +188 +188 +186 +184 +184 +183 +182 +178 +178 +178 +175 +175 +173 +173 +173 +169 +169 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +129 +125 +125 +119 +120 +119 +116 +116 +110 +110 +110 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +58 +58 +59 +55 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +24 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +42 +46 +47 +47 +51 +51 +55 +54 +56 +59 +59 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +109 +115 +115 +119 +119 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +178 +179 +183 +183 +182 +185 +184 +188 +188 +189 +191 +190 +194 +195 +197 +196 +197 +198 +198 +200 +200 +200 +200 +201 +202 +203 +203 +204 +204 +205 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +205 +205 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +200 +196 +196 +195 +194 +190 +190 +191 +188 +188 +184 +184 +185 +183 +182 +182 +182 +183 +178 +179 +175 +174 +175 +173 +173 +169 +169 +166 +164 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +130 +125 +125 +119 +120 +116 +116 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +91 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +64 +64 +65 +59 +58 +55 +55 +55 +51 +50 +47 +46 +47 +42 +43 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +26 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +40 +40 +42 +43 +45 +47 +46 +50 +51 +54 +54 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +105 +110 +110 +116 +115 +116 +119 +119 +125 +125 +126 +130 +130 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +168 +173 +173 +173 +174 +175 +179 +179 +179 +182 +183 +184 +184 +189 +188 +188 +191 +191 +195 +195 +194 +196 +197 +199 +198 +198 +200 +201 +201 +201 +200 +202 +202 +204 +204 +205 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +204 +202 +202 +203 +200 +201 +200 +200 +198 +198 +199 +196 +196 +195 +194 +194 +190 +190 +191 +190 +190 +189 +188 +184 +184 +185 +183 +183 +178 +178 +175 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +134 +133 +129 +129 +129 +126 +125 +119 +120 +120 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +69 +69 +68 +64 +64 +58 +58 +58 +55 +54 +50 +51 +50 +47 +47 +43 +43 +43 +41 +40 +37 +36 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +31 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +50 +55 +54 +54 +59 +59 +64 +65 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +99 +106 +105 +106 +110 +110 +116 +116 +115 +119 +119 +125 +126 +126 +129 +129 +133 +133 +138 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +183 +184 +185 +188 +188 +188 +190 +190 +194 +195 +195 +196 +196 +199 +198 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +205 +205 +202 +202 +200 +200 +200 +201 +200 +198 +199 +198 +196 +197 +196 +197 +196 +194 +194 +191 +190 +191 +188 +188 +184 +185 +183 +183 +183 +179 +178 +174 +174 +175 +172 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +120 +119 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +95 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +58 +54 +55 +51 +50 +51 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +26 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +16 +15 +14 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +50 +54 +54 +55 +58 +58 +64 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +119 +119 +119 +119 +125 +126 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +164 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +179 +179 +179 +183 +182 +185 +184 +184 +189 +189 +191 +190 +191 +195 +194 +197 +196 +199 +198 +198 +201 +201 +200 +200 +200 +202 +203 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +207 +207 +207 +207 +206 +206 +206 +206 +206 +205 +205 +204 +204 +205 +203 +202 +203 +202 +202 +200 +200 +201 +200 +201 +198 +198 +196 +196 +197 +195 +194 +191 +190 +188 +189 +189 +185 +185 +183 +182 +183 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +130 +129 +125 +125 +119 +120 +119 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +71 +68 +68 +68 +64 +64 +58 +58 +55 +54 +55 +51 +50 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +18 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +18 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +40 +41 +41 +43 +43 +47 +47 +50 +50 +51 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +120 +120 +125 +125 +130 +129 +129 +134 +133 +139 +139 +140 +143 +144 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +184 +185 +189 +188 +189 +190 +190 +194 +195 +196 +197 +197 +197 +197 +198 +198 +200 +200 +201 +201 +201 +202 +202 +203 +205 +205 +204 +204 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +204 +204 +204 +205 +203 +203 +202 +201 +201 +200 +201 +200 +199 +198 +196 +196 +196 +194 +195 +190 +191 +191 +189 +188 +184 +184 +184 +183 +182 +178 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +130 +129 +129 +125 +125 +119 +119 +119 +115 +115 +110 +110 +109 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +33 +33 +31 +31 +32 +27 +27 +25 +24 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +36 +36 +37 +41 +40 +43 +43 +43 +47 +47 +47 +46 +46 +51 +50 +55 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +73 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +115 +116 +120 +120 +125 +126 +130 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +176 +175 +175 +179 +179 +182 +183 +183 +184 +185 +185 +185 +184 +188 +188 +190 +191 +191 +194 +194 +196 +197 +197 +198 +199 +201 +200 +200 +200 +201 +203 +202 +205 +204 +205 +205 +204 +205 +204 +204 +207 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +207 +204 +204 +205 +205 +205 +202 +202 +202 +201 +200 +200 +200 +201 +198 +199 +196 +197 +197 +196 +196 +195 +194 +190 +190 +191 +189 +188 +184 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +162 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +126 +120 +119 +115 +116 +116 +110 +110 +105 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +73 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +14 +13 +12 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +12 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +59 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +109 +115 +116 +119 +119 +120 +125 +125 +130 +130 +130 +133 +133 +139 +140 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +186 +188 +189 +191 +191 +194 +194 +195 +196 +196 +199 +198 +198 +200 +200 +200 +201 +200 +200 +200 +202 +203 +202 +204 +205 +205 +205 +205 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +198 +198 +198 +197 +196 +194 +194 +195 +190 +191 +189 +188 +189 +185 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +119 +120 +115 +116 +117 +110 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +69 +68 +64 +64 +59 +59 +58 +54 +55 +55 +54 +54 +50 +50 +46 +47 +46 +43 +42 +41 +40 +39 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +22 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +73 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +106 +105 +110 +110 +116 +115 +116 +119 +119 +125 +125 +126 +129 +130 +134 +134 +139 +139 +139 +143 +144 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +179 +179 +182 +183 +185 +184 +184 +188 +189 +189 +189 +188 +190 +190 +194 +195 +195 +196 +196 +198 +198 +199 +201 +201 +201 +200 +203 +202 +202 +205 +204 +205 +204 +204 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +195 +191 +191 +190 +189 +189 +185 +185 +183 +182 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +139 +133 +133 +130 +129 +129 +126 +125 +119 +119 +120 +116 +115 +109 +109 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +54 +52 +50 +50 +47 +48 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +46 +51 +51 +55 +54 +55 +58 +59 +64 +64 +69 +68 +68 +72 +72 +76 +76 +77 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +125 +130 +130 +133 +134 +134 +139 +140 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +164 +165 +169 +169 +173 +172 +173 +175 +175 +174 +175 +174 +179 +178 +182 +182 +182 +185 +185 +188 +188 +190 +191 +191 +195 +194 +196 +197 +197 +198 +198 +200 +200 +201 +200 +201 +203 +203 +203 +204 +204 +204 +204 +204 +206 +207 +207 +206 +207 +207 +207 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +201 +200 +200 +201 +200 +199 +198 +196 +196 +195 +194 +195 +191 +191 +188 +188 +188 +185 +184 +183 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +126 +126 +120 +119 +120 +116 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +66 +64 +65 +58 +58 +54 +55 +55 +51 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +46 +46 +51 +50 +55 +54 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +109 +110 +115 +116 +115 +120 +119 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +178 +179 +180 +182 +183 +185 +185 +188 +188 +189 +190 +190 +194 +194 +195 +196 +196 +198 +198 +198 +200 +200 +200 +201 +201 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +200 +200 +199 +198 +196 +197 +196 +194 +194 +191 +191 +190 +188 +189 +184 +184 +184 +183 +183 +179 +179 +178 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +119 +119 +119 +115 +116 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +58 +58 +58 +58 +59 +55 +55 +50 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +16 +13 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +32 +33 +37 +36 +41 +41 +41 +43 +43 +47 +46 +47 +51 +50 +54 +54 +55 +59 +59 +64 +65 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +109 +110 +116 +116 +119 +119 +122 +126 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +167 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +184 +185 +189 +188 +189 +191 +190 +194 +194 +195 +196 +197 +198 +198 +199 +200 +201 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +200 +199 +199 +196 +196 +196 +194 +195 +191 +191 +190 +188 +189 +184 +184 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +130 +130 +129 +125 +125 +120 +120 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +72 +72 +72 +68 +68 +64 +64 +65 +59 +59 +54 +54 +51 +51 +51 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +16 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +26 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +50 +55 +54 +58 +59 +60 +65 +64 +68 +68 +72 +72 +72 +76 +76 +83 +82 +82 +86 +86 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +120 +119 +120 +125 +125 +129 +129 +130 +133 +134 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +185 +188 +189 +190 +191 +194 +195 +195 +197 +196 +199 +198 +198 +200 +200 +200 +200 +200 +202 +203 +204 +204 +204 +205 +205 +206 +207 +207 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +205 +205 +204 +204 +204 +203 +202 +200 +201 +201 +200 +200 +198 +198 +199 +197 +196 +195 +195 +191 +191 +191 +189 +188 +185 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +113 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +65 +64 +64 +58 +58 +54 +54 +54 +50 +51 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +16 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +55 +58 +58 +58 +65 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +116 +119 +120 +120 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +148 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +184 +185 +185 +189 +189 +190 +191 +191 +195 +195 +197 +196 +197 +199 +199 +201 +200 +201 +201 +201 +202 +202 +203 +204 +204 +205 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +202 +202 +203 +201 +200 +200 +200 +199 +198 +199 +197 +196 +195 +194 +194 +191 +191 +188 +188 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +126 +120 +119 +119 +116 +116 +110 +110 +110 +106 +105 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +64 +64 +59 +58 +54 +54 +55 +50 +51 +47 +47 +47 +43 +43 +40 +41 +40 +37 +37 +33 +32 +31 +31 +31 +27 +27 +25 +26 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +55 +54 +54 +55 +55 +59 +58 +64 +64 +65 +68 +69 +72 +73 +74 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +106 +106 +110 +109 +110 +115 +115 +120 +120 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +172 +173 +173 +175 +175 +179 +178 +179 +182 +182 +184 +185 +184 +189 +188 +191 +191 +191 +194 +194 +196 +197 +196 +199 +199 +201 +200 +201 +200 +201 +203 +202 +204 +205 +204 +205 +204 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +200 +198 +199 +199 +196 +197 +195 +194 +195 +190 +191 +189 +188 +189 +184 +184 +183 +183 +182 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +149 +147 +143 +143 +143 +139 +140 +139 +140 +139 +133 +133 +133 +129 +129 +130 +129 +129 +125 +125 +119 +119 +120 +115 +115 +109 +110 +106 +106 +106 +101 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +65 +64 +58 +59 +56 +54 +54 +50 +50 +47 +47 +46 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +50 +50 +50 +50 +54 +54 +58 +58 +58 +65 +64 +68 +68 +69 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +95 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +156 +157 +161 +161 +161 +161 +161 +165 +164 +169 +168 +169 +173 +173 +174 +175 +175 +179 +179 +183 +183 +184 +185 +185 +189 +188 +191 +190 +190 +195 +195 +197 +196 +196 +198 +198 +200 +200 +200 +201 +201 +202 +203 +202 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +201 +201 +198 +198 +198 +196 +197 +194 +194 +195 +191 +190 +191 +191 +191 +188 +189 +184 +184 +184 +183 +182 +179 +179 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +95 +96 +90 +90 +86 +85 +82 +82 +82 +76 +76 +72 +72 +72 +68 +64 +64 +64 +65 +59 +58 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +40 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +46 +46 +47 +50 +51 +55 +55 +55 +58 +58 +64 +65 +66 +68 +68 +73 +73 +76 +76 +76 +83 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +119 +120 +119 +125 +126 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +189 +189 +189 +191 +191 +194 +194 +195 +196 +197 +198 +198 +201 +200 +201 +201 +200 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +207 +207 +206 +206 +205 +205 +204 +204 +204 +203 +203 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +197 +197 +195 +194 +191 +190 +188 +189 +188 +184 +185 +183 +183 +183 +178 +179 +179 +179 +179 +174 +175 +172 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +126 +126 +119 +119 +116 +116 +109 +110 +110 +105 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +58 +58 +59 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +40 +41 +37 +38 +37 +33 +33 +31 +31 +31 +27 +27 +25 +24 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +32 +33 +37 +37 +37 +41 +40 +43 +43 +44 +47 +47 +50 +50 +54 +55 +54 +59 +59 +64 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +134 +140 +139 +143 +142 +146 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +185 +188 +188 +188 +190 +191 +195 +195 +194 +196 +196 +199 +198 +198 +201 +200 +201 +201 +200 +202 +202 +204 +204 +205 +204 +204 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +205 +205 +205 +204 +205 +202 +202 +203 +200 +201 +200 +200 +198 +198 +198 +196 +197 +194 +194 +194 +190 +190 +190 +191 +190 +189 +188 +184 +185 +185 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +129 +129 +129 +126 +125 +119 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +73 +68 +68 +68 +65 +64 +58 +59 +58 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +20 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +40 +41 +40 +43 +43 +47 +47 +47 +51 +51 +54 +54 +55 +59 +58 +64 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +116 +119 +120 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +174 +175 +175 +179 +179 +182 +183 +182 +185 +184 +189 +188 +188 +191 +191 +194 +194 +195 +197 +197 +198 +199 +199 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +207 +206 +207 +207 +206 +207 +207 +206 +206 +206 +207 +206 +206 +204 +204 +205 +204 +205 +202 +202 +200 +201 +200 +200 +200 +200 +201 +200 +198 +198 +196 +196 +197 +195 +195 +190 +190 +189 +188 +189 +185 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +125 +125 +120 +120 +119 +116 +116 +110 +110 +110 +106 +106 +100 +99 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +76 +73 +72 +68 +69 +68 +65 +64 +58 +58 +59 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +24 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +18 +19 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +54 +54 +55 +59 +58 +59 +58 +58 +65 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +115 +115 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +189 +188 +189 +191 +190 +194 +194 +195 +197 +197 +198 +198 +198 +200 +200 +200 +201 +201 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +205 +202 +203 +201 +201 +200 +201 +200 +198 +198 +198 +196 +197 +195 +195 +194 +191 +190 +189 +189 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +173 +172 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +129 +126 +126 +126 +119 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +73 +72 +72 +68 +68 +64 +65 +65 +59 +58 +58 +58 +58 +55 +54 +51 +51 +51 +47 +46 +43 +43 +44 +41 +41 +37 +38 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +54 +59 +59 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +115 +120 +119 +126 +126 +130 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +176 +175 +175 +178 +179 +183 +182 +182 +184 +184 +185 +185 +185 +189 +188 +190 +190 +194 +194 +196 +197 +196 +198 +199 +201 +200 +200 +200 +200 +203 +202 +204 +205 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +205 +204 +204 +202 +203 +202 +201 +200 +200 +200 +201 +198 +198 +197 +197 +197 +195 +195 +190 +190 +190 +188 +189 +185 +184 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +120 +119 +116 +116 +110 +110 +109 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +64 +64 +59 +58 +59 +55 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +36 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +58 +58 +59 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +172 +173 +173 +173 +175 +176 +179 +178 +179 +182 +182 +184 +185 +185 +188 +188 +191 +190 +194 +194 +194 +196 +196 +198 +199 +198 +200 +200 +201 +201 +200 +200 +201 +202 +202 +202 +204 +204 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +204 +204 +204 +205 +204 +202 +202 +203 +201 +201 +200 +200 +199 +199 +199 +196 +196 +194 +195 +194 +190 +190 +189 +189 +189 +185 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +168 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +130 +125 +125 +119 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +91 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +69 +69 +65 +65 +65 +59 +59 +55 +55 +55 +51 +50 +50 +51 +51 +47 +46 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +59 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +183 +185 +184 +189 +189 +188 +190 +191 +191 +190 +191 +195 +194 +197 +197 +197 +198 +198 +201 +200 +201 +201 +201 +202 +202 +204 +204 +205 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +198 +199 +197 +196 +197 +194 +195 +190 +190 +190 +189 +189 +184 +185 +182 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +134 +130 +129 +129 +125 +125 +126 +125 +126 +120 +120 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +59 +59 +58 +54 +55 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +36 +37 +40 +41 +41 +43 +43 +47 +46 +47 +50 +50 +54 +55 +59 +59 +59 +64 +64 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +115 +119 +120 +119 +119 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +180 +182 +183 +184 +184 +188 +188 +189 +191 +190 +194 +194 +194 +196 +197 +199 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +205 +204 +207 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +203 +202 +200 +200 +201 +201 +201 +198 +198 +198 +198 +198 +197 +197 +195 +194 +195 +190 +191 +189 +188 +188 +184 +185 +183 +183 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +141 +133 +133 +130 +129 +125 +125 +125 +120 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +77 +72 +72 +72 +68 +69 +64 +64 +65 +58 +58 +58 +58 +59 +54 +54 +50 +50 +51 +47 +47 +43 +43 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +24 +25 +25 +27 +28 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +53 +58 +58 +65 +64 +65 +68 +69 +73 +73 +72 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +105 +106 +110 +110 +115 +115 +116 +119 +119 +125 +126 +126 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +174 +175 +179 +178 +179 +183 +183 +185 +185 +185 +189 +188 +190 +190 +190 +195 +195 +197 +196 +197 +198 +199 +201 +201 +201 +200 +200 +203 +202 +204 +204 +205 +205 +204 +206 +206 +207 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +205 +204 +202 +202 +200 +200 +201 +200 +200 +198 +199 +198 +196 +196 +195 +194 +194 +191 +191 +188 +188 +188 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +134 +130 +129 +125 +126 +126 +120 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +59 +59 +59 +55 +55 +51 +51 +47 +46 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +24 +26 +27 +27 +31 +31 +34 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +47 +47 +50 +51 +55 +54 +54 +58 +58 +64 +64 +66 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +91 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +117 +119 +120 +126 +126 +130 +129 +130 +134 +134 +139 +140 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +163 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +184 +189 +189 +190 +191 +191 +195 +195 +196 +196 +197 +199 +199 +200 +201 +200 +201 +200 +202 +203 +204 +204 +204 +205 +205 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +200 +201 +201 +200 +200 +198 +199 +198 +196 +197 +195 +194 +195 +190 +191 +189 +189 +185 +185 +185 +183 +183 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +129 +130 +130 +126 +125 +119 +119 +120 +116 +115 +110 +110 +108 +105 +106 +100 +100 +96 +96 +96 +89 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +73 +69 +68 +64 +64 +61 +58 +59 +55 +54 +50 +50 +50 +46 +47 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +30 +33 +33 +37 +37 +37 +40 +40 +43 +43 +43 +47 +47 +50 +51 +51 +54 +54 +59 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +109 +110 +110 +116 +116 +120 +120 +119 +125 +125 +125 +125 +125 +130 +129 +134 +134 +134 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +156 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +182 +182 +185 +185 +186 +189 +188 +191 +190 +194 +194 +194 +197 +196 +199 +199 +198 +200 +200 +200 +200 +200 +202 +203 +204 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +205 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +201 +199 +198 +197 +196 +196 +194 +194 +191 +190 +190 +188 +188 +185 +184 +184 +182 +183 +178 +179 +179 +175 +175 +173 +173 +174 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +130 +129 +127 +125 +126 +120 +120 +115 +116 +116 +109 +109 +106 +106 +107 +100 +100 +100 +100 +100 +95 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +68 +69 +64 +65 +58 +59 +59 +55 +55 +51 +51 +50 +47 +47 +43 +43 +43 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +38 +41 +41 +43 +43 +48 +47 +46 +51 +50 +54 +54 +54 +59 +59 +59 +59 +59 +64 +64 +68 +68 +68 +73 +72 +77 +77 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +116 +116 +116 +119 +119 +125 +125 +129 +129 +130 +133 +133 +138 +139 +139 +143 +143 +147 +147 +147 +151 +151 +156 +157 +157 +161 +165 +165 +165 +165 +169 +169 +172 +173 +175 +175 +175 +178 +178 +183 +182 +183 +185 +185 +189 +188 +189 +190 +190 +194 +194 +195 +196 +196 +198 +198 +198 +200 +200 +201 +201 +203 +202 +202 +205 +205 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +206 +205 +204 +204 +203 +204 +202 +201 +201 +200 +200 +200 +198 +199 +197 +197 +197 +195 +195 +191 +190 +191 +188 +189 +185 +185 +184 +182 +183 +178 +179 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +152 +151 +147 +147 +145 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +119 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +68 +65 +65 +59 +59 +59 +55 +55 +50 +50 +47 +46 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +12 +16 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +40 +41 +41 +41 +43 +42 +47 +47 +47 +51 +51 +55 +55 +55 +59 +59 +65 +64 +68 +68 +68 +72 +73 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +115 +116 +116 +119 +120 +125 +125 +125 +130 +129 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +184 +184 +188 +188 +191 +190 +194 +194 +195 +197 +197 +198 +198 +199 +201 +201 +200 +201 +200 +202 +202 +204 +205 +204 +204 +204 +206 +206 +207 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +199 +200 +196 +196 +195 +194 +190 +191 +190 +189 +189 +185 +185 +184 +183 +183 +183 +183 +182 +179 +179 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +120 +119 +120 +116 +115 +109 +110 +109 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +69 +68 +65 +64 +58 +58 +59 +54 +55 +51 +51 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +12 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +46 +50 +50 +51 +55 +55 +58 +58 +58 +64 +64 +64 +64 +64 +68 +69 +72 +72 +73 +76 +77 +82 +82 +86 +86 +85 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +116 +116 +116 +119 +120 +125 +125 +126 +129 +130 +133 +133 +139 +139 +139 +144 +143 +147 +147 +148 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +183 +182 +184 +184 +188 +188 +188 +191 +190 +195 +195 +194 +196 +197 +198 +199 +198 +200 +201 +200 +201 +201 +202 +203 +204 +205 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +207 +207 +207 +204 +204 +204 +204 +204 +202 +202 +200 +201 +200 +201 +200 +198 +198 +197 +196 +196 +194 +194 +194 +194 +194 +190 +191 +188 +188 +189 +184 +184 +183 +183 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +126 +126 +119 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +59 +58 +55 +54 +50 +50 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +33 +31 +30 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +26 +28 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +85 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +116 +119 +119 +119 +125 +126 +130 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +168 +173 +173 +174 +174 +175 +179 +179 +183 +183 +183 +185 +184 +189 +188 +188 +191 +191 +194 +195 +195 +196 +196 +199 +198 +201 +201 +201 +200 +200 +202 +202 +202 +204 +205 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +201 +201 +198 +198 +198 +196 +196 +194 +195 +192 +191 +190 +188 +188 +185 +184 +184 +183 +183 +179 +178 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +133 +129 +130 +129 +125 +126 +120 +119 +120 +115 +115 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +69 +68 +64 +64 +59 +59 +59 +54 +54 +50 +50 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +19 +19 +19 +17 +17 +14 +16 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +46 +47 +46 +50 +51 +54 +55 +54 +58 +59 +64 +64 +65 +69 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +115 +115 +119 +120 +126 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +185 +189 +189 +189 +190 +190 +194 +195 +194 +196 +196 +198 +198 +199 +200 +200 +201 +200 +201 +202 +202 +204 +205 +205 +204 +205 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +205 +204 +205 +205 +205 +202 +203 +203 +200 +200 +201 +200 +198 +198 +198 +196 +196 +194 +194 +195 +190 +190 +191 +191 +190 +189 +189 +185 +185 +185 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +134 +133 +129 +129 +129 +126 +125 +119 +119 +120 +116 +115 +110 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +58 +54 +55 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +36 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +20 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +17 +18 +17 +19 +19 +21 +21 +21 +25 +25 +26 +27 +28 +31 +30 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +55 +58 +58 +58 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +125 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +172 +172 +173 +175 +175 +178 +178 +179 +183 +182 +185 +185 +184 +189 +189 +190 +191 +191 +194 +195 +197 +196 +196 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +204 +204 +205 +205 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +205 +205 +204 +204 +202 +202 +202 +200 +200 +200 +201 +200 +200 +200 +199 +198 +198 +196 +197 +194 +194 +192 +190 +191 +188 +188 +184 +185 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +162 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +120 +120 +115 +116 +115 +110 +109 +106 +106 +100 +100 +99 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +69 +69 +64 +64 +65 +58 +58 +54 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +50 +50 +54 +54 +58 +58 +58 +64 +64 +68 +68 +69 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +119 +119 +125 +126 +130 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +189 +188 +191 +190 +191 +195 +194 +197 +196 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +203 +202 +201 +201 +201 +201 +201 +199 +198 +196 +196 +197 +194 +194 +191 +189 +190 +188 +189 +185 +184 +184 +182 +182 +178 +179 +179 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +120 +120 +119 +115 +116 +115 +115 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +59 +54 +55 +55 +51 +50 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +58 +59 +58 +65 +64 +68 +68 +68 +72 +73 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +120 +120 +120 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +184 +188 +188 +189 +188 +189 +190 +191 +194 +194 +194 +197 +197 +199 +198 +200 +201 +200 +200 +201 +203 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +205 +204 +204 +203 +202 +200 +201 +201 +200 +201 +199 +198 +199 +197 +197 +195 +195 +195 +191 +191 +189 +189 +185 +185 +185 +182 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +160 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +120 +119 +116 +116 +116 +110 +110 +106 +105 +107 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +36 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +16 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +42 +47 +47 +51 +51 +51 +55 +55 +58 +59 +64 +64 +65 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +116 +115 +119 +120 +125 +126 +125 +130 +129 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +183 +185 +185 +188 +189 +189 +191 +191 +195 +195 +196 +197 +196 +199 +199 +200 +201 +201 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +203 +200 +200 +201 +200 +201 +198 +198 +197 +196 +197 +195 +194 +190 +190 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +120 +120 +115 +115 +109 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +89 +86 +86 +82 +82 +82 +76 +76 +72 +72 +75 +68 +68 +64 +64 +58 +58 +58 +55 +55 +51 +51 +51 +47 +47 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +48 +47 +47 +51 +50 +55 +55 +55 +59 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +120 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +184 +188 +189 +189 +190 +191 +195 +194 +194 +196 +196 +196 +197 +196 +198 +198 +201 +200 +201 +200 +200 +203 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +205 +205 +205 +202 +202 +201 +201 +200 +201 +201 +200 +200 +200 +199 +198 +196 +196 +196 +194 +194 +190 +191 +190 +189 +189 +185 +185 +184 +182 +183 +178 +179 +175 +174 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +140 +139 +133 +133 +130 +129 +129 +125 +125 +120 +119 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +91 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +69 +69 +65 +64 +65 +64 +64 +58 +58 +55 +55 +54 +50 +51 +47 +46 +45 +43 +43 +41 +41 +36 +37 +37 +33 +33 +32 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +40 +41 +43 +43 +47 +46 +47 +50 +50 +54 +54 +54 +58 +58 +64 +65 +65 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +125 +126 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +168 +169 +172 +173 +173 +175 +175 +179 +179 +179 +183 +183 +183 +183 +183 +185 +185 +188 +189 +189 +191 +190 +194 +194 +196 +196 +197 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +199 +198 +196 +196 +196 +194 +195 +190 +190 +188 +188 +189 +185 +185 +182 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +162 +157 +157 +151 +151 +148 +147 +147 +143 +144 +139 +139 +139 +133 +133 +129 +129 +130 +126 +125 +119 +120 +115 +115 +109 +110 +110 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +77 +76 +72 +72 +72 +68 +68 +64 +65 +61 +58 +59 +55 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +22 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +33 +36 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +58 +58 +59 +64 +65 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +119 +125 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +149 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +184 +185 +189 +189 +189 +191 +191 +194 +194 +194 +197 +196 +198 +198 +198 +200 +201 +201 +200 +200 +202 +203 +204 +204 +205 +205 +205 +206 +206 +206 +207 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +205 +205 +203 +202 +200 +200 +201 +201 +200 +198 +198 +197 +197 +197 +195 +195 +190 +191 +190 +189 +188 +185 +184 +184 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +130 +125 +126 +127 +120 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +74 +72 +72 +68 +68 +64 +64 +65 +58 +59 +55 +54 +55 +51 +51 +50 +51 +51 +47 +47 +43 +43 +43 +41 +40 +37 +37 +35 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +16 +15 +17 +17 +19 +19 +19 +21 +21 +25 +24 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +36 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +54 +59 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +97 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +116 +115 +119 +120 +125 +126 +125 +129 +129 +133 +134 +136 +140 +140 +143 +144 +148 +147 +147 +151 +151 +157 +157 +158 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +174 +175 +175 +179 +179 +182 +183 +182 +185 +185 +188 +189 +189 +190 +191 +195 +194 +195 +196 +197 +198 +198 +199 +201 +201 +200 +201 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +205 +203 +202 +202 +200 +200 +200 +200 +201 +198 +198 +196 +196 +196 +195 +194 +191 +191 +191 +189 +188 +184 +185 +185 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +119 +119 +116 +115 +115 +115 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +64 +58 +59 +58 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +22 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +51 +51 +54 +54 +58 +59 +59 +65 +65 +68 +69 +73 +72 +72 +76 +76 +82 +82 +82 +86 +87 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +115 +119 +120 +120 +126 +126 +129 +130 +130 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +154 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +179 +183 +183 +185 +185 +185 +189 +189 +191 +190 +193 +195 +195 +197 +197 +198 +198 +199 +201 +200 +201 +200 +200 +202 +203 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +205 +204 +203 +203 +200 +200 +201 +201 +201 +199 +199 +198 +197 +197 +194 +195 +191 +191 +190 +188 +189 +184 +184 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +139 +139 +140 +139 +133 +133 +129 +130 +130 +126 +126 +119 +119 +117 +115 +115 +110 +110 +106 +106 +106 +99 +100 +95 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +50 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +54 +55 +54 +58 +59 +64 +64 +64 +68 +68 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +116 +120 +119 +119 +125 +125 +130 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +178 +179 +179 +183 +182 +184 +185 +185 +189 +189 +191 +191 +190 +194 +194 +197 +197 +196 +199 +199 +201 +201 +201 +200 +200 +203 +202 +204 +205 +205 +204 +205 +206 +206 +207 +206 +207 +207 +207 +206 +207 +206 +206 +207 +206 +206 +207 +204 +204 +204 +205 +205 +203 +203 +201 +201 +201 +201 +200 +199 +198 +199 +197 +197 +195 +194 +195 +190 +191 +189 +189 +188 +185 +185 +183 +183 +182 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +164 +161 +161 +161 +161 +161 +157 +157 +151 +152 +151 +147 +147 +143 +143 +141 +139 +139 +133 +134 +129 +129 +129 +125 +125 +120 +119 +119 +115 +115 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +64 +65 +65 +59 +58 +54 +55 +55 +51 +50 +46 +47 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +50 +51 +55 +55 +54 +58 +58 +64 +64 +66 +68 +68 +73 +72 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +120 +120 +125 +125 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +175 +178 +179 +183 +182 +182 +184 +185 +188 +188 +189 +190 +190 +195 +194 +197 +196 +196 +198 +198 +200 +200 +200 +200 +201 +203 +203 +203 +204 +204 +204 +204 +204 +207 +206 +207 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +204 +205 +204 +205 +204 +204 +202 +203 +200 +200 +200 +201 +201 +198 +198 +200 +196 +197 +194 +194 +191 +191 +190 +189 +188 +185 +184 +184 +183 +182 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +130 +130 +130 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +55 +55 +50 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +24 +25 +21 +21 +21 +19 +18 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +34 +37 +37 +40 +41 +42 +43 +43 +47 +47 +51 +51 +51 +54 +55 +54 +55 +55 +59 +58 +64 +64 +64 +68 +68 +72 +72 +74 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +120 +119 +126 +126 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +175 +175 +175 +179 +178 +182 +183 +183 +185 +184 +189 +189 +189 +190 +191 +195 +195 +195 +196 +197 +199 +199 +199 +200 +201 +200 +200 +203 +202 +203 +205 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +207 +206 +206 +204 +204 +205 +204 +205 +202 +202 +200 +201 +201 +200 +201 +198 +198 +199 +197 +197 +195 +194 +194 +190 +190 +188 +188 +189 +185 +185 +182 +183 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +126 +120 +119 +119 +116 +115 +110 +109 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +65 +58 +58 +59 +54 +54 +50 +51 +47 +47 +47 +42 +43 +41 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +16 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +32 +33 +32 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +59 +58 +64 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +83 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +166 +165 +165 +169 +169 +172 +173 +173 +175 +175 +175 +175 +175 +179 +178 +182 +183 +183 +185 +185 +189 +189 +189 +191 +190 +195 +194 +197 +197 +196 +199 +198 +201 +200 +200 +200 +200 +200 +200 +200 +202 +202 +204 +205 +205 +205 +204 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +207 +206 +205 +204 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +200 +201 +198 +199 +196 +197 +195 +195 +194 +191 +191 +189 +188 +188 +185 +184 +183 +182 +183 +178 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +156 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +133 +133 +130 +129 +130 +125 +125 +120 +119 +115 +116 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +85 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +64 +64 +65 +59 +58 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +22 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +34 +33 +37 +37 +41 +40 +43 +43 +42 +47 +47 +50 +51 +50 +54 +54 +59 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +119 +119 +125 +125 +129 +130 +130 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +182 +183 +184 +185 +188 +189 +189 +190 +190 +195 +194 +194 +196 +196 +199 +198 +199 +200 +200 +200 +200 +201 +202 +202 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +207 +207 +207 +206 +204 +204 +204 +204 +205 +202 +202 +200 +201 +201 +201 +200 +198 +199 +198 +196 +196 +197 +197 +196 +194 +194 +190 +191 +191 +188 +188 +184 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +130 +130 +125 +126 +119 +119 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +99 +96 +96 +90 +90 +87 +86 +82 +82 +76 +77 +76 +72 +72 +72 +72 +72 +69 +68 +64 +65 +65 +58 +59 +55 +54 +55 +51 +51 +47 +46 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +24 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +16 +16 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +26 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +55 +55 +59 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +105 +105 +106 +110 +110 +115 +116 +120 +119 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +183 +184 +185 +189 +189 +189 +190 +191 +194 +194 +195 +196 +196 +198 +198 +200 +200 +200 +200 +201 +202 +202 +202 +204 +204 +205 +205 +204 +204 +204 +207 +207 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +202 +202 +203 +200 +200 +200 +200 +200 +198 +198 +196 +197 +195 +194 +195 +191 +190 +188 +188 +188 +184 +184 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +144 +143 +143 +139 +139 +133 +133 +133 +130 +129 +125 +125 +125 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +58 +58 +54 +54 +55 +54 +55 +51 +51 +47 +47 +47 +43 +42 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +42 +47 +47 +50 +51 +51 +55 +54 +58 +58 +59 +64 +64 +68 +69 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +119 +120 +125 +125 +129 +129 +130 +133 +134 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +176 +175 +175 +179 +178 +183 +183 +184 +189 +189 +190 +190 +190 +190 +191 +194 +195 +197 +196 +196 +198 +199 +200 +201 +200 +200 +201 +203 +203 +203 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +207 +206 +207 +206 +206 +206 +204 +204 +204 +205 +203 +202 +202 +201 +201 +200 +201 +200 +198 +198 +196 +196 +196 +195 +195 +190 +190 +191 +189 +189 +185 +184 +185 +182 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +130 +130 +130 +125 +126 +120 +119 +119 +116 +116 +109 +110 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +58 +55 +55 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +30 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +42 +47 +47 +50 +50 +51 +54 +54 +58 +59 +58 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +119 +125 +125 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +174 +172 +173 +175 +175 +178 +178 +179 +182 +182 +183 +183 +183 +185 +185 +188 +189 +189 +191 +190 +195 +195 +195 +196 +197 +199 +198 +200 +201 +201 +201 +201 +202 +202 +202 +204 +204 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +199 +199 +197 +196 +195 +195 +191 +190 +191 +189 +189 +185 +185 +185 +183 +183 +183 +183 +183 +179 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +160 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +134 +129 +129 +129 +125 +125 +119 +120 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +69 +69 +64 +64 +58 +58 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +42 +37 +36 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +51 +50 +51 +55 +55 +59 +59 +59 +64 +64 +68 +69 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +91 +96 +96 +101 +99 +99 +106 +106 +109 +110 +109 +116 +116 +115 +115 +115 +120 +120 +126 +126 +126 +129 +129 +133 +133 +134 +139 +139 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +174 +175 +178 +179 +183 +183 +184 +185 +185 +189 +188 +191 +190 +190 +194 +195 +195 +194 +194 +196 +197 +198 +198 +199 +200 +200 +200 +200 +201 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +205 +205 +204 +204 +202 +202 +203 +201 +200 +200 +200 +200 +198 +199 +197 +196 +196 +195 +194 +191 +191 +191 +188 +189 +185 +185 +185 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +97 +90 +90 +86 +87 +82 +82 +82 +76 +76 +72 +73 +72 +68 +68 +64 +65 +64 +58 +59 +54 +54 +55 +51 +51 +47 +47 +45 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +40 +43 +43 +47 +47 +47 +51 +51 +55 +54 +54 +58 +58 +64 +65 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +116 +116 +120 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +178 +183 +183 +183 +182 +183 +184 +185 +189 +189 +189 +190 +191 +194 +194 +196 +196 +196 +198 +198 +200 +200 +200 +201 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +201 +198 +199 +196 +196 +197 +195 +194 +191 +190 +189 +188 +188 +184 +184 +182 +183 +182 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +164 +161 +161 +160 +156 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +130 +129 +125 +125 +120 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +61 +59 +58 +54 +54 +50 +51 +50 +47 +47 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +46 +51 +51 +55 +54 +55 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +119 +120 +120 +125 +126 +129 +129 +129 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +182 +182 +183 +185 +185 +189 +188 +189 +190 +190 +194 +195 +194 +196 +197 +199 +198 +199 +200 +200 +200 +200 +201 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +201 +200 +201 +200 +198 +198 +196 +196 +196 +194 +195 +190 +191 +190 +188 +188 +184 +184 +184 +182 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +120 +119 +119 +116 +116 +110 +110 +110 +105 +106 +106 +106 +106 +99 +100 +96 +96 +96 +90 +90 +86 +86 +87 +82 +82 +77 +76 +72 +72 +73 +68 +68 +65 +64 +64 +58 +58 +59 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +42 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +18 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +55 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +73 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +99 +100 +105 +106 +110 +110 +110 +115 +115 +119 +120 +120 +125 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +184 +184 +188 +188 +189 +190 +190 +194 +194 +195 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +201 +200 +201 +200 +200 +198 +198 +196 +196 +196 +194 +195 +190 +191 +190 +189 +189 +185 +184 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +133 +133 +129 +130 +129 +125 +126 +125 +125 +125 +119 +119 +115 +115 +116 +110 +110 +106 +106 +103 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +55 +54 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +24 +20 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +54 +55 +59 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +107 +109 +110 +116 +115 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +153 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +183 +183 +184 +184 +185 +189 +189 +190 +190 +194 +194 +195 +196 +196 +198 +199 +199 +200 +200 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +201 +200 +201 +201 +198 +198 +199 +197 +197 +195 +195 +191 +190 +191 +188 +188 +185 +184 +185 +182 +182 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +164 +164 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +140 +139 +139 +139 +133 +133 +129 +130 +129 +125 +125 +119 +120 +117 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +65 +64 +58 +58 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +32 +33 +31 +31 +27 +27 +27 +25 +24 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +32 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +55 +55 +55 +58 +59 +64 +64 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +88 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +116 +115 +116 +119 +119 +125 +125 +126 +130 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +178 +183 +183 +185 +185 +185 +189 +188 +191 +190 +190 +194 +194 +197 +196 +197 +198 +199 +200 +200 +201 +201 +200 +203 +202 +205 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +207 +207 +207 +206 +206 +206 +206 +206 +207 +204 +204 +205 +205 +204 +202 +202 +201 +200 +201 +201 +201 +198 +198 +198 +197 +197 +195 +194 +195 +191 +191 +189 +188 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +129 +129 +125 +125 +125 +119 +120 +115 +116 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +69 +64 +64 +59 +58 +59 +55 +55 +51 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +16 +15 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +55 +55 +59 +59 +64 +64 +65 +69 +68 +72 +72 +73 +76 +76 +83 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +105 +106 +110 +110 +110 +116 +116 +119 +120 +122 +126 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +171 +173 +173 +175 +175 +179 +179 +178 +183 +182 +185 +185 +184 +188 +189 +191 +191 +191 +194 +195 +196 +196 +196 +199 +199 +200 +201 +200 +201 +201 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +196 +194 +194 +195 +190 +191 +189 +189 +189 +184 +185 +183 +183 +178 +178 +179 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +160 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +125 +120 +120 +119 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +59 +59 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +42 +43 +43 +47 +47 +50 +50 +51 +54 +55 +58 +59 +61 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +115 +119 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +160 +161 +160 +165 +165 +169 +169 +168 +173 +173 +175 +175 +175 +178 +179 +183 +182 +182 +184 +185 +189 +188 +188 +191 +190 +195 +195 +197 +196 +197 +199 +198 +200 +200 +201 +200 +201 +203 +202 +202 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +203 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +196 +194 +194 +190 +191 +189 +188 +189 +184 +184 +183 +182 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +134 +133 +133 +129 +130 +125 +126 +126 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +59 +58 +59 +54 +54 +50 +51 +51 +47 +47 +43 +42 +43 +41 +41 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +46 +50 +51 +52 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +98 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +175 +175 +175 +179 +179 +179 +183 +183 +184 +184 +189 +189 +188 +190 +190 +195 +195 +195 +196 +197 +198 +198 +199 +200 +200 +201 +200 +200 +202 +202 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +205 +202 +202 +200 +200 +201 +200 +200 +199 +198 +197 +197 +196 +194 +194 +191 +190 +191 +189 +189 +185 +185 +185 +182 +183 +179 +178 +178 +175 +175 +173 +173 +172 +169 +169 +165 +165 +162 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +128 +125 +126 +119 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +83 +82 +76 +76 +75 +72 +72 +68 +69 +65 +64 +64 +58 +59 +55 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +51 +51 +54 +54 +58 +58 +58 +64 +64 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +85 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +120 +119 +125 +125 +126 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +183 +182 +183 +184 +184 +188 +188 +188 +191 +190 +195 +195 +194 +196 +197 +198 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +203 +200 +200 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +191 +191 +191 +188 +189 +185 +185 +184 +183 +183 +179 +179 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +130 +129 +125 +125 +126 +120 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +59 +58 +54 +54 +54 +50 +51 +46 +47 +47 +43 +43 +41 +41 +37 +36 +37 +33 +34 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +17 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +30 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +47 +47 +46 +51 +51 +55 +54 +55 +58 +58 +65 +64 +66 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +119 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +182 +184 +185 +189 +188 +188 +190 +191 +194 +194 +195 +197 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +204 +205 +204 +204 +202 +202 +202 +200 +201 +200 +200 +200 +200 +200 +199 +198 +199 +196 +196 +194 +195 +192 +190 +191 +189 +188 +184 +184 +185 +183 +183 +178 +179 +178 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +144 +144 +139 +139 +139 +133 +133 +129 +129 +129 +126 +126 +119 +120 +120 +116 +116 +110 +110 +107 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +55 +54 +54 +51 +51 +47 +46 +47 +43 +43 +41 +41 +41 +36 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +34 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +48 +51 +51 +55 +54 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +120 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +156 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +188 +191 +190 +190 +194 +194 +196 +197 +196 +198 +198 +200 +200 +200 +200 +200 +202 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +204 +204 +204 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +197 +196 +197 +194 +195 +191 +190 +190 +189 +188 +188 +189 +188 +184 +185 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +129 +129 +126 +125 +125 +119 +119 +116 +116 +115 +110 +109 +106 +106 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +55 +54 +54 +51 +50 +47 +47 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +32 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +14 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +40 +43 +43 +47 +47 +46 +51 +50 +55 +55 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +116 +116 +115 +119 +119 +125 +125 +125 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +178 +178 +183 +183 +183 +184 +185 +189 +189 +188 +191 +190 +194 +194 +194 +196 +196 +199 +198 +199 +200 +201 +200 +200 +201 +202 +202 +204 +205 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +198 +196 +196 +196 +195 +195 +194 +194 +195 +190 +191 +188 +189 +189 +185 +185 +182 +182 +179 +178 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +119 +120 +116 +115 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +77 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +54 +54 +50 +50 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +50 +51 +51 +55 +54 +59 +59 +58 +64 +64 +68 +69 +72 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +125 +125 +125 +129 +130 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +178 +183 +183 +184 +185 +185 +188 +188 +191 +190 +190 +194 +195 +197 +196 +196 +198 +199 +200 +200 +200 +200 +201 +202 +202 +204 +204 +205 +204 +204 +204 +204 +205 +207 +206 +206 +206 +207 +207 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +200 +200 +198 +198 +199 +196 +197 +194 +194 +191 +190 +191 +188 +189 +184 +185 +185 +182 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +126 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +54 +55 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +28 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +46 +51 +51 +54 +55 +55 +58 +58 +64 +65 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +120 +126 +126 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +185 +184 +189 +188 +190 +190 +195 +194 +194 +196 +197 +199 +198 +198 +200 +200 +201 +201 +200 +201 +201 +202 +202 +202 +204 +205 +204 +205 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +205 +204 +202 +202 +200 +200 +200 +201 +201 +199 +199 +196 +196 +197 +195 +194 +191 +190 +190 +188 +189 +185 +185 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +125 +125 +125 +120 +119 +115 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +55 +54 +51 +50 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +40 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +58 +58 +58 +64 +65 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +109 +110 +115 +115 +119 +120 +120 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +168 +169 +173 +173 +175 +175 +178 +178 +179 +182 +182 +185 +184 +185 +188 +188 +189 +188 +188 +191 +190 +194 +194 +194 +197 +197 +198 +199 +199 +201 +200 +201 +200 +202 +202 +203 +204 +204 +205 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +207 +207 +206 +206 +207 +206 +206 +207 +206 +205 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +199 +198 +198 +196 +196 +195 +194 +195 +190 +190 +189 +189 +185 +185 +184 +183 +182 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +140 +139 +134 +134 +133 +129 +129 +126 +125 +126 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +65 +65 +58 +58 +54 +55 +55 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +54 +59 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +109 +110 +116 +116 +116 +119 +119 +125 +125 +126 +130 +129 +133 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +166 +165 +165 +169 +169 +172 +173 +173 +175 +175 +175 +174 +175 +178 +179 +182 +183 +183 +184 +184 +189 +189 +189 +191 +191 +195 +194 +196 +196 +196 +198 +198 +200 +200 +200 +200 +200 +200 +200 +200 +203 +202 +204 +204 +205 +205 +204 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +201 +200 +201 +201 +198 +199 +198 +196 +196 +194 +194 +195 +190 +190 +188 +188 +189 +184 +184 +183 +182 +182 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +119 +116 +115 +115 +110 +110 +105 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +73 +68 +68 +65 +64 +64 +58 +58 +54 +55 +54 +51 +51 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +35 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +18 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +73 +76 +76 +77 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +99 +106 +106 +110 +110 +110 +115 +115 +120 +119 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +182 +183 +184 +184 +184 +189 +188 +191 +190 +190 +194 +194 +194 +195 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +205 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +205 +204 +204 +202 +202 +203 +201 +200 +200 +200 +200 +198 +198 +197 +196 +196 +195 +195 +190 +190 +190 +188 +189 +185 +184 +184 +182 +183 +178 +179 +175 +175 +175 +173 +172 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +156 +157 +151 +150 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +126 +119 +119 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +69 +68 +68 +64 +64 +58 +59 +58 +55 +55 +50 +50 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +30 +31 +31 +31 +31 +27 +27 +24 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +12 +15 +15 +17 +17 +17 +19 +19 +25 +25 +25 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +46 +51 +51 +55 +54 +54 +59 +58 +64 +64 +64 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +119 +125 +125 +129 +129 +129 +133 +133 +140 +140 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +158 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +182 +183 +183 +182 +183 +185 +185 +188 +189 +189 +191 +191 +194 +195 +197 +197 +197 +198 +199 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +205 +204 +204 +204 +204 +202 +203 +202 +200 +200 +201 +200 +200 +198 +198 +196 +197 +197 +195 +194 +191 +191 +189 +188 +188 +185 +184 +182 +183 +182 +178 +179 +175 +175 +175 +173 +173 +169 +169 +168 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +140 +139 +133 +133 +133 +133 +133 +129 +130 +126 +125 +125 +120 +119 +116 +116 +116 +110 +110 +106 +105 +100 +101 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +67 +64 +64 +59 +59 +54 +55 +54 +50 +50 +47 +47 +47 +43 +43 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +20 +21 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +42 +43 +43 +47 +47 +50 +51 +55 +54 +54 +58 +58 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +105 +110 +110 +116 +115 +115 +120 +119 +120 +120 +119 +126 +126 +129 +129 +129 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +172 +173 +175 +175 +179 +179 +180 +183 +183 +185 +185 +188 +188 +189 +191 +190 +194 +195 +194 +196 +196 +199 +198 +198 +200 +200 +200 +201 +201 +203 +203 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +204 +205 +204 +204 +204 +202 +203 +200 +201 +201 +200 +201 +199 +199 +196 +196 +196 +194 +195 +191 +191 +190 +189 +189 +185 +185 +184 +182 +183 +178 +179 +179 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +140 +133 +133 +134 +129 +129 +126 +125 +119 +119 +119 +115 +116 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +59 +58 +59 +59 +55 +54 +50 +51 +51 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +20 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +26 +28 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +42 +47 +47 +51 +51 +51 +55 +54 +59 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +115 +119 +119 +120 +125 +125 +130 +130 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +183 +183 +184 +185 +189 +189 +189 +190 +191 +194 +194 +195 +197 +197 +198 +198 +200 +200 +201 +201 +200 +202 +203 +202 +204 +204 +205 +204 +204 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +204 +204 +204 +204 +204 +203 +202 +203 +201 +201 +201 +201 +200 +198 +198 +196 +197 +196 +195 +194 +191 +191 +191 +188 +189 +184 +185 +183 +182 +182 +179 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +134 +134 +129 +130 +129 +125 +125 +119 +120 +119 +116 +116 +110 +110 +110 +106 +105 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +73 +68 +68 +64 +64 +65 +59 +59 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +58 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +101 +100 +106 +106 +107 +110 +110 +115 +115 +120 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +140 +139 +144 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +172 +173 +175 +175 +175 +179 +179 +183 +182 +182 +184 +185 +188 +188 +189 +190 +191 +195 +194 +196 +196 +196 +198 +198 +200 +201 +200 +200 +200 +201 +200 +200 +202 +202 +205 +204 +204 +205 +204 +207 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +203 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +197 +196 +195 +194 +191 +190 +190 +188 +189 +184 +184 +184 +182 +183 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +151 +151 +151 +148 +147 +143 +143 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +119 +119 +117 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +58 +58 +58 +54 +54 +51 +51 +50 +46 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +54 +54 +54 +58 +58 +65 +64 +64 +68 +69 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +92 +95 +97 +100 +100 +106 +106 +106 +110 +109 +116 +116 +116 +119 +119 +119 +119 +120 +126 +125 +129 +129 +129 +133 +134 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +182 +184 +184 +185 +188 +188 +190 +191 +190 +194 +194 +196 +196 +196 +198 +198 +200 +200 +201 +201 +200 +202 +203 +202 +204 +205 +204 +204 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +204 +204 +204 +205 +205 +202 +202 +203 +200 +200 +200 +200 +199 +198 +198 +196 +197 +195 +195 +194 +190 +191 +189 +188 +189 +184 +185 +183 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +150 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +125 +119 +120 +119 +115 +115 +110 +109 +110 +106 +105 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +76 +72 +72 +68 +69 +69 +64 +64 +58 +58 +59 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +16 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +38 +41 +41 +42 +43 +46 +47 +47 +50 +51 +55 +55 +54 +58 +58 +59 +59 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +105 +106 +106 +106 +109 +110 +116 +116 +115 +119 +120 +126 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +174 +175 +175 +179 +178 +182 +182 +182 +184 +184 +188 +189 +189 +190 +190 +194 +194 +195 +197 +196 +199 +199 +198 +200 +200 +201 +200 +203 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +207 +206 +206 +207 +204 +204 +204 +204 +203 +203 +202 +200 +201 +200 +200 +200 +199 +198 +197 +197 +197 +194 +195 +191 +190 +190 +188 +188 +184 +185 +184 +183 +183 +178 +178 +174 +175 +175 +173 +173 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +133 +133 +133 +129 +129 +125 +125 +126 +120 +119 +119 +120 +120 +116 +115 +109 +110 +110 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +59 +55 +54 +51 +50 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +18 +17 +16 +16 +15 +16 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +42 +43 +43 +46 +47 +51 +51 +51 +54 +55 +59 +58 +59 +64 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +85 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +107 +109 +110 +116 +115 +119 +119 +119 +125 +126 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +174 +179 +179 +183 +182 +183 +185 +185 +189 +189 +189 +191 +190 +194 +194 +197 +197 +197 +198 +199 +200 +201 +201 +200 +201 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +205 +205 +204 +205 +205 +202 +202 +202 +201 +200 +200 +200 +201 +199 +198 +197 +196 +197 +194 +194 +190 +190 +188 +188 +188 +185 +185 +182 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +144 +143 +140 +139 +139 +133 +133 +133 +133 +133 +129 +129 +125 +125 +126 +119 +120 +115 +115 +113 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +73 +68 +69 +64 +64 +59 +59 +58 +55 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +36 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +21 +19 +19 +16 +17 +17 +16 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +40 +41 +41 +42 +42 +47 +46 +47 +50 +51 +55 +55 +58 +58 +58 +65 +64 +68 +68 +68 +72 +72 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +126 +125 +129 +130 +133 +134 +134 +139 +139 +143 +143 +147 +148 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +188 +189 +188 +191 +190 +194 +194 +194 +196 +196 +197 +196 +196 +198 +199 +200 +200 +200 +200 +201 +202 +203 +203 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +204 +204 +204 +205 +205 +203 +203 +201 +201 +200 +200 +200 +198 +198 +196 +196 +196 +194 +194 +195 +195 +194 +190 +191 +189 +188 +189 +185 +184 +183 +183 +180 +179 +179 +175 +175 +173 +173 +172 +169 +169 +169 +169 +169 +165 +165 +165 +165 +165 +161 +161 +157 +158 +157 +151 +151 +147 +148 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +116 +116 +115 +110 +109 +106 +105 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +59 +55 +55 +55 +51 +51 +47 +47 +44 +43 +42 +40 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +12 +15 +15 +15 +15 +15 +18 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +42 +43 +43 +47 +47 +51 +51 +51 +54 +54 +59 +58 +59 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +115 +115 +119 +119 +125 +125 +125 +130 +130 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +166 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +185 +184 +184 +189 +188 +190 +190 +191 +195 +195 +196 +197 +199 +198 +198 +200 +200 +201 +201 +200 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +202 +202 +202 +201 +201 +200 +201 +200 +199 +198 +196 +196 +195 +194 +195 +190 +190 +188 +189 +189 +185 +185 +185 +185 +185 +183 +183 +183 +182 +183 +179 +178 +175 +175 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +130 +130 +126 +125 +119 +120 +115 +116 +116 +110 +109 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +81 +76 +76 +72 +72 +69 +68 +69 +64 +64 +58 +58 +58 +54 +54 +51 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +14 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +24 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +40 +41 +43 +43 +47 +47 +47 +50 +51 +55 +55 +55 +59 +59 +64 +65 +64 +69 +68 +72 +72 +72 +76 +77 +82 +83 +86 +86 +86 +90 +90 +96 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +115 +115 +119 +120 +126 +126 +125 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +168 +169 +173 +173 +173 +175 +175 +178 +179 +183 +183 +182 +184 +185 +188 +189 +189 +191 +191 +195 +195 +194 +196 +196 +198 +198 +198 +200 +201 +200 +200 +201 +202 +203 +205 +204 +204 +204 +204 +206 +206 +206 +207 +206 +207 +207 +206 +206 +206 +206 +207 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +201 +200 +201 +199 +198 +198 +196 +196 +196 +196 +196 +195 +194 +191 +191 +191 +189 +189 +184 +185 +184 +183 +183 +179 +179 +175 +175 +175 +172 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +126 +125 +120 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +95 +96 +90 +90 +87 +86 +86 +83 +82 +76 +77 +76 +72 +72 +68 +69 +68 +64 +64 +58 +59 +58 +55 +54 +50 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +12 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +12 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +55 +59 +58 +64 +65 +68 +69 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +105 +105 +106 +110 +110 +116 +116 +119 +120 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +179 +179 +179 +179 +178 +182 +183 +184 +184 +185 +189 +189 +191 +190 +191 +195 +195 +197 +196 +198 +198 +199 +200 +200 +200 +201 +200 +203 +202 +202 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +204 +205 +204 +205 +202 +202 +200 +200 +200 +201 +201 +198 +198 +197 +196 +197 +195 +195 +190 +191 +191 +189 +188 +185 +185 +184 +183 +183 +179 +179 +178 +174 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +140 +133 +133 +133 +130 +129 +125 +125 +125 +119 +119 +116 +116 +109 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +59 +58 +58 +55 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +14 +13 +12 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +51 +51 +51 +55 +55 +58 +58 +59 +65 +64 +69 +69 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +116 +120 +120 +119 +125 +125 +129 +129 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +168 +169 +169 +173 +173 +176 +175 +174 +179 +179 +183 +183 +183 +185 +185 +188 +188 +190 +191 +190 +195 +194 +196 +197 +197 +198 +198 +198 +198 +198 +200 +200 +200 +201 +200 +202 +203 +204 +205 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +207 +206 +206 +206 +206 +204 +205 +205 +205 +205 +202 +202 +203 +201 +201 +200 +200 +198 +199 +198 +196 +196 +194 +194 +194 +190 +190 +189 +188 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +130 +129 +126 +125 +125 +120 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +89 +86 +86 +87 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +65 +64 +58 +59 +54 +55 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +36 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +35 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +54 +55 +59 +59 +59 +64 +64 +68 +68 +69 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +116 +116 +119 +119 +120 +126 +125 +130 +129 +134 +134 +134 +139 +139 +143 +144 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +175 +179 +179 +182 +182 +183 +184 +184 +184 +184 +185 +188 +189 +191 +190 +191 +194 +194 +196 +196 +197 +198 +198 +200 +201 +200 +200 +200 +203 +202 +204 +204 +204 +205 +205 +204 +205 +204 +206 +206 +206 +207 +207 +207 +206 +206 +206 +207 +206 +207 +207 +207 +205 +204 +204 +204 +204 +202 +202 +202 +200 +200 +201 +200 +200 +198 +199 +196 +196 +197 +194 +194 +191 +191 +188 +188 +189 +185 +184 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +140 +133 +133 +130 +130 +130 +125 +125 +119 +119 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +69 +69 +68 +64 +64 +59 +58 +59 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +23 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +73 +73 +72 +73 +77 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +115 +120 +120 +126 +125 +125 +129 +129 +133 +134 +134 +140 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +168 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +185 +185 +188 +188 +190 +190 +190 +195 +194 +196 +196 +196 +198 +198 +198 +199 +198 +201 +201 +200 +200 +201 +202 +203 +204 +204 +204 +204 +205 +207 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +198 +196 +197 +197 +194 +195 +190 +190 +191 +189 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +120 +119 +116 +116 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +69 +69 +68 +64 +64 +58 +58 +59 +55 +55 +55 +54 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +18 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +14 +14 +14 +13 +15 +15 +15 +17 +17 +19 +20 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +55 +55 +59 +58 +64 +65 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +116 +116 +120 +119 +125 +125 +126 +129 +129 +133 +133 +139 +140 +140 +143 +144 +147 +147 +147 +151 +151 +157 +157 +157 +160 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +185 +185 +189 +189 +188 +190 +190 +191 +191 +191 +194 +194 +196 +196 +197 +199 +199 +201 +200 +200 +200 +201 +203 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +207 +207 +207 +206 +207 +207 +207 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +201 +200 +198 +198 +198 +196 +196 +195 +195 +194 +191 +190 +188 +188 +188 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +164 +160 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +134 +129 +129 +126 +125 +126 +120 +120 +116 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +87 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +64 +58 +58 +55 +55 +55 +50 +50 +47 +47 +45 +43 +43 +41 +40 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +17 +15 +15 +15 +16 +13 +13 +13 +12 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +47 +47 +47 +50 +50 +54 +55 +54 +59 +59 +64 +64 +64 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +120 +120 +125 +125 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +160 +165 +165 +166 +169 +169 +173 +173 +174 +175 +174 +179 +178 +183 +183 +183 +185 +184 +185 +185 +185 +188 +189 +190 +191 +191 +195 +194 +196 +197 +198 +199 +199 +200 +201 +200 +200 +200 +202 +202 +205 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +203 +202 +201 +200 +200 +200 +200 +199 +199 +198 +197 +196 +195 +195 +194 +191 +191 +189 +189 +185 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +115 +115 +110 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +77 +76 +77 +76 +76 +73 +72 +68 +69 +68 +65 +64 +58 +59 +59 +54 +54 +51 +50 +46 +47 +46 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +22 +21 +20 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +32 +31 +31 +33 +33 +37 +36 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +51 +54 +54 +59 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +76 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +119 +120 +120 +125 +126 +125 +126 +126 +129 +130 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +164 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +185 +185 +185 +189 +188 +191 +191 +190 +195 +194 +196 +196 +196 +199 +198 +201 +200 +200 +200 +201 +202 +203 +203 +205 +205 +204 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +202 +201 +201 +201 +200 +198 +199 +198 +196 +196 +195 +194 +194 +191 +190 +189 +188 +188 +184 +185 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +158 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +139 +134 +134 +129 +129 +130 +125 +125 +119 +120 +116 +116 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +64 +65 +59 +59 +55 +55 +54 +51 +51 +51 +51 +51 +47 +47 +43 +43 +43 +40 +40 +37 +36 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +12 +12 +13 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +51 +50 +54 +54 +54 +54 +54 +58 +58 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +85 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +120 +126 +125 +126 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +174 +175 +178 +179 +178 +182 +183 +184 +185 +184 +189 +188 +190 +191 +190 +194 +195 +197 +196 +196 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +207 +205 +206 +207 +206 +206 +203 +204 +204 +205 +204 +202 +202 +200 +200 +200 +201 +200 +198 +198 +198 +197 +196 +194 +194 +194 +191 +191 +189 +188 +188 +184 +184 +183 +182 +179 +179 +178 +175 +175 +173 +172 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +130 +125 +125 +125 +120 +119 +120 +120 +119 +116 +116 +109 +109 +109 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +73 +68 +69 +64 +64 +65 +59 +59 +55 +55 +55 +50 +50 +47 +47 +43 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +59 +59 +59 +64 +65 +68 +69 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +109 +110 +115 +115 +119 +119 +119 +125 +125 +129 +129 +129 +133 +133 +133 +134 +133 +139 +139 +143 +143 +144 +147 +148 +151 +151 +154 +157 +156 +161 +161 +164 +165 +165 +169 +169 +173 +173 +172 +175 +175 +178 +179 +178 +183 +183 +184 +185 +185 +189 +189 +191 +191 +193 +194 +195 +196 +196 +198 +198 +198 +201 +200 +201 +200 +201 +202 +203 +205 +204 +204 +204 +204 +206 +206 +207 +206 +207 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +202 +201 +200 +200 +201 +201 +198 +198 +199 +196 +196 +194 +195 +191 +190 +190 +188 +188 +188 +189 +188 +185 +184 +185 +184 +185 +181 +182 +179 +179 +179 +175 +175 +173 +173 +174 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +127 +126 +125 +119 +120 +115 +116 +115 +110 +109 +106 +106 +105 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +65 +65 +58 +58 +58 +54 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +38 +41 +41 +43 +42 +47 +47 +46 +51 +50 +55 +54 +55 +58 +59 +64 +64 +64 +68 +68 +72 +73 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +129 +133 +134 +134 +139 +139 +143 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +168 +169 +173 +172 +175 +175 +178 +179 +178 +182 +182 +184 +184 +185 +189 +189 +190 +191 +190 +195 +194 +197 +197 +196 +198 +199 +201 +200 +200 +201 +200 +202 +203 +204 +204 +204 +205 +205 +206 +207 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +204 +204 +205 +205 +205 +202 +202 +201 +200 +200 +201 +200 +198 +198 +198 +196 +196 +195 +195 +195 +191 +190 +189 +189 +189 +185 +185 +183 +182 +183 +179 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +160 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +129 +129 +129 +125 +125 +126 +125 +126 +119 +120 +119 +119 +120 +115 +115 +110 +110 +110 +106 +105 +100 +100 +98 +96 +96 +90 +91 +86 +86 +86 +82 +82 +76 +76 +77 +73 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +50 +51 +51 +54 +55 +58 +59 +61 +64 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +116 +120 +119 +119 +125 +125 +129 +129 +130 +134 +134 +139 +139 +140 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +189 +188 +188 +190 +191 +194 +194 +197 +196 +196 +199 +198 +200 +201 +200 +201 +200 +202 +202 +202 +205 +205 +204 +204 +204 +206 +207 +206 +206 +206 +206 +207 +206 +207 +207 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +200 +200 +200 +198 +199 +196 +196 +197 +194 +194 +191 +191 +189 +188 +188 +184 +185 +184 +185 +184 +183 +182 +179 +178 +179 +175 +175 +173 +173 +173 +168 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +139 +140 +139 +139 +139 +134 +133 +129 +129 +129 +126 +125 +120 +120 +120 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +89 +86 +86 +87 +82 +82 +76 +76 +77 +72 +72 +68 +68 +67 +64 +64 +58 +58 +55 +54 +55 +50 +51 +47 +46 +47 +43 +43 +40 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +48 +51 +51 +54 +55 +58 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +99 +100 +100 +106 +106 +110 +110 +110 +116 +116 +120 +120 +119 +125 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +185 +184 +189 +188 +191 +190 +190 +195 +195 +196 +196 +196 +199 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +205 +204 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +201 +199 +198 +197 +196 +195 +195 +195 +191 +190 +188 +189 +188 +184 +184 +184 +185 +185 +183 +183 +178 +179 +178 +175 +175 +172 +173 +171 +169 +169 +165 +165 +160 +161 +161 +157 +157 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +140 +133 +133 +130 +129 +130 +126 +126 +119 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +99 +100 +96 +96 +90 +90 +91 +86 +85 +82 +82 +77 +76 +77 +72 +72 +68 +68 +68 +65 +64 +58 +59 +59 +55 +55 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +32 +34 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +54 +54 +54 +59 +59 +64 +64 +65 +68 +68 +72 +72 +74 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +144 +144 +143 +143 +147 +147 +151 +152 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +182 +183 +185 +185 +185 +188 +188 +191 +190 +191 +195 +194 +196 +197 +197 +199 +199 +200 +201 +201 +201 +201 +202 +202 +204 +205 +204 +204 +204 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +207 +207 +206 +204 +204 +204 +204 +204 +203 +203 +201 +201 +200 +200 +200 +200 +201 +200 +198 +198 +196 +196 +197 +194 +194 +191 +191 +191 +188 +189 +184 +184 +182 +183 +183 +179 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +162 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +120 +119 +116 +116 +115 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +59 +55 +54 +51 +50 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +31 +27 +26 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +16 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +53 +54 +54 +59 +58 +65 +64 +64 +69 +68 +72 +72 +73 +76 +76 +82 +82 +82 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +116 +116 +116 +119 +119 +125 +126 +125 +130 +129 +133 +133 +133 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +185 +189 +188 +189 +191 +190 +190 +190 +190 +194 +194 +196 +196 +196 +198 +198 +201 +200 +200 +201 +201 +202 +202 +203 +204 +205 +204 +204 +207 +207 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +205 +204 +205 +204 +205 +203 +203 +200 +200 +200 +200 +201 +198 +198 +197 +197 +196 +194 +194 +195 +195 +194 +190 +190 +189 +189 +189 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +120 +120 +115 +115 +116 +110 +110 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +73 +73 +68 +69 +64 +64 +64 +58 +59 +55 +55 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +19 +20 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +54 +54 +55 +58 +58 +64 +65 +65 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +109 +109 +116 +116 +116 +120 +120 +125 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +148 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +174 +175 +179 +179 +178 +182 +183 +185 +184 +185 +188 +188 +191 +191 +191 +195 +195 +196 +197 +196 +198 +199 +201 +201 +200 +201 +200 +203 +202 +204 +204 +204 +204 +205 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +207 +204 +204 +204 +205 +205 +202 +202 +200 +200 +201 +201 +201 +201 +201 +200 +199 +198 +196 +196 +197 +195 +195 +191 +190 +189 +189 +189 +184 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +147 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +126 +120 +120 +120 +116 +115 +109 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +54 +54 +50 +50 +47 +46 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +30 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +50 +55 +54 +58 +59 +58 +64 +64 +68 +68 +69 +73 +72 +76 +76 +77 +82 +83 +86 +86 +87 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +116 +116 +120 +120 +120 +125 +125 +125 +125 +125 +129 +129 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +179 +182 +183 +184 +184 +185 +189 +188 +190 +191 +194 +194 +195 +197 +196 +198 +199 +198 +200 +201 +201 +200 +201 +203 +202 +204 +204 +205 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +205 +205 +204 +204 +204 +204 +203 +202 +203 +200 +200 +200 +201 +199 +198 +199 +197 +197 +194 +195 +195 +191 +191 +188 +189 +188 +184 +184 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +120 +116 +116 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +69 +68 +65 +64 +64 +58 +58 +54 +54 +55 +50 +50 +46 +46 +47 +43 +43 +40 +41 +41 +37 +37 +33 +33 +34 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +42 +46 +47 +51 +50 +51 +55 +54 +58 +58 +58 +64 +64 +68 +69 +69 +72 +73 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +115 +115 +119 +119 +119 +126 +126 +130 +129 +129 +134 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +168 +173 +173 +175 +175 +175 +178 +178 +182 +182 +185 +184 +185 +189 +188 +190 +191 +191 +194 +195 +196 +197 +197 +198 +199 +201 +201 +201 +200 +200 +202 +202 +203 +205 +204 +205 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +204 +204 +205 +204 +203 +202 +203 +201 +200 +200 +201 +200 +199 +199 +196 +196 +197 +194 +194 +191 +191 +190 +188 +188 +184 +184 +185 +183 +183 +178 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +130 +130 +125 +126 +120 +120 +120 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +69 +64 +65 +58 +59 +58 +54 +55 +51 +50 +51 +47 +47 +43 +43 +44 +41 +40 +37 +37 +32 +32 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +16 +16 +13 +13 +12 +12 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +18 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +55 +59 +59 +64 +64 +64 +68 +68 +72 +72 +77 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +105 +110 +110 +115 +115 +115 +119 +120 +126 +125 +130 +129 +130 +133 +133 +140 +140 +140 +144 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +174 +174 +175 +175 +179 +179 +183 +183 +183 +185 +184 +185 +185 +184 +188 +189 +190 +191 +190 +195 +194 +196 +197 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +204 +204 +205 +204 +204 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +200 +200 +198 +199 +197 +197 +196 +194 +195 +191 +191 +189 +189 +189 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +162 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +134 +129 +129 +129 +125 +125 +119 +120 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +28 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +54 +54 +54 +59 +59 +65 +65 +64 +69 +69 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +116 +119 +119 +119 +119 +119 +125 +126 +129 +129 +129 +134 +133 +140 +139 +140 +143 +143 +148 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +174 +178 +178 +180 +183 +183 +184 +185 +188 +188 +189 +191 +191 +195 +194 +194 +196 +196 +197 +196 +197 +198 +199 +200 +201 +201 +200 +200 +202 +203 +205 +205 +204 +204 +205 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +206 +207 +207 +207 +206 +205 +204 +205 +205 +205 +203 +202 +200 +200 +201 +200 +200 +198 +199 +198 +196 +197 +195 +194 +194 +191 +190 +189 +188 +189 +184 +185 +182 +182 +182 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +166 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +126 +125 +125 +120 +119 +115 +116 +116 +110 +109 +106 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +65 +64 +59 +59 +59 +58 +59 +55 +55 +50 +50 +51 +47 +47 +43 +42 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +21 +22 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +12 +15 +16 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +55 +59 +59 +58 +64 +64 +69 +69 +69 +73 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +120 +120 +120 +125 +126 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +179 +179 +182 +183 +185 +185 +184 +188 +189 +189 +188 +189 +190 +191 +194 +194 +194 +197 +196 +199 +198 +200 +201 +201 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +204 +202 +202 +202 +201 +200 +200 +200 +200 +198 +199 +197 +197 +197 +195 +194 +190 +190 +190 +189 +189 +184 +185 +182 +183 +182 +178 +178 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +120 +120 +116 +116 +110 +110 +110 +106 +105 +100 +100 +101 +96 +96 +90 +90 +86 +87 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +69 +69 +64 +65 +64 +58 +59 +55 +55 +54 +50 +51 +47 +47 +44 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +46 +47 +51 +51 +51 +54 +55 +58 +59 +59 +64 +64 +69 +68 +72 +72 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +100 +106 +105 +110 +110 +110 +116 +116 +119 +120 +125 +126 +126 +129 +129 +133 +133 +133 +139 +139 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +179 +179 +179 +182 +183 +184 +185 +185 +188 +189 +190 +190 +194 +195 +195 +197 +196 +198 +198 +198 +201 +201 +200 +200 +201 +202 +202 +205 +205 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +201 +201 +201 +201 +200 +198 +198 +198 +197 +197 +195 +195 +191 +191 +190 +189 +188 +184 +184 +184 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +143 +139 +139 +133 +133 +134 +130 +129 +126 +125 +126 +119 +119 +116 +116 +116 +110 +109 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +66 +64 +64 +59 +59 +55 +54 +55 +51 +51 +47 +46 +47 +43 +43 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +28 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +14 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +34 +37 +36 +37 +41 +41 +43 +43 +43 +47 +46 +51 +51 +55 +54 +55 +58 +58 +65 +64 +65 +68 +68 +72 +73 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +116 +119 +120 +119 +119 +119 +125 +126 +129 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +160 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +180 +183 +183 +185 +184 +188 +189 +188 +191 +190 +194 +195 +195 +196 +197 +198 +198 +198 +200 +200 +200 +201 +201 +203 +203 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +205 +205 +204 +204 +204 +202 +203 +200 +200 +200 +200 +200 +199 +198 +196 +196 +196 +195 +195 +191 +190 +190 +189 +189 +185 +185 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +148 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +119 +120 +119 +115 +116 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +79 +76 +77 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +55 +54 +54 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +16 +15 +14 +13 +13 +13 +12 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +42 +43 +47 +47 +51 +50 +50 +54 +54 +58 +59 +59 +65 +64 +67 +68 +68 +72 +72 +77 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +106 +106 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +126 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +172 +173 +173 +175 +175 +178 +179 +178 +183 +182 +184 +184 +185 +188 +188 +191 +190 +190 +194 +194 +197 +196 +197 +198 +199 +200 +200 +200 +200 +200 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +200 +200 +201 +199 +198 +198 +196 +196 +195 +194 +194 +190 +191 +189 +189 +189 +185 +185 +182 +183 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +140 +139 +133 +133 +133 +129 +130 +126 +125 +126 +120 +119 +120 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +98 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +72 +72 +72 +72 +73 +68 +68 +64 +65 +64 +58 +58 +55 +55 +52 +51 +50 +47 +46 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +30 +31 +27 +27 +25 +25 +26 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +17 +18 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +42 +47 +47 +50 +50 +51 +54 +54 +59 +59 +59 +58 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +125 +129 +129 +129 +129 +130 +134 +134 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +182 +183 +182 +185 +185 +189 +189 +190 +190 +191 +195 +194 +196 +196 +196 +198 +199 +200 +200 +201 +200 +200 +202 +202 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +204 +205 +204 +204 +205 +203 +202 +202 +200 +200 +201 +200 +200 +198 +198 +196 +196 +194 +195 +195 +191 +191 +188 +189 +188 +185 +185 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +134 +129 +129 +126 +126 +123 +120 +119 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +77 +76 +77 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +54 +55 +51 +51 +46 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +15 +16 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +42 +43 +46 +47 +51 +50 +51 +55 +54 +59 +58 +59 +65 +64 +64 +64 +64 +69 +69 +72 +72 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +106 +110 +110 +110 +109 +110 +116 +115 +120 +119 +119 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +178 +179 +183 +183 +185 +184 +184 +189 +188 +190 +191 +191 +194 +194 +197 +196 +197 +198 +198 +201 +200 +201 +201 +201 +203 +202 +204 +204 +205 +205 +205 +206 +206 +207 +207 +206 +206 +207 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +207 +204 +204 +205 +204 +203 +202 +203 +201 +200 +200 +200 +200 +198 +199 +197 +196 +196 +194 +194 +191 +190 +191 +188 +189 +184 +185 +185 +183 +183 +178 +178 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +148 +148 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +126 +125 +120 +119 +119 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +59 +54 +54 +50 +51 +47 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +24 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +50 +51 +54 +55 +59 +58 +61 +65 +64 +68 +68 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +109 +110 +110 +116 +115 +119 +119 +120 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +174 +175 +179 +179 +183 +183 +183 +185 +185 +189 +188 +189 +190 +191 +194 +195 +196 +196 +196 +198 +199 +200 +201 +200 +200 +200 +200 +201 +200 +201 +203 +205 +204 +204 +205 +205 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +203 +200 +201 +200 +200 +201 +198 +198 +199 +196 +196 +194 +195 +190 +190 +190 +188 +188 +184 +184 +185 +183 +183 +183 +182 +183 +178 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +140 +133 +133 +134 +129 +129 +125 +125 +120 +120 +120 +115 +115 +110 +109 +110 +106 +105 +100 +100 +100 +96 +95 +90 +90 +90 +86 +87 +82 +83 +83 +76 +76 +72 +72 +69 +68 +68 +65 +64 +58 +58 +59 +54 +55 +50 +50 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +28 +25 +25 +21 +21 +21 +21 +21 +20 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +12 +14 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +51 +51 +50 +54 +54 +58 +59 +59 +65 +64 +64 +65 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +115 +119 +119 +125 +125 +126 +129 +130 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +182 +183 +183 +185 +184 +188 +189 +188 +191 +190 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +204 +205 +204 +204 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +196 +196 +194 +195 +195 +195 +194 +191 +190 +189 +188 +188 +185 +184 +183 +182 +181 +178 +179 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +141 +139 +139 +133 +133 +129 +130 +129 +125 +126 +119 +119 +119 +115 +116 +109 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +86 +87 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +65 +59 +58 +58 +55 +54 +50 +51 +51 +47 +46 +42 +43 +42 +42 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +47 +47 +47 +51 +50 +54 +55 +54 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +119 +119 +119 +125 +125 +129 +129 +130 +134 +134 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +174 +175 +175 +178 +179 +182 +182 +183 +185 +185 +189 +189 +188 +190 +191 +194 +194 +195 +197 +197 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +205 +204 +204 +204 +207 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +207 +206 +207 +204 +204 +205 +204 +205 +202 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +196 +196 +194 +195 +191 +191 +189 +188 +188 +184 +185 +182 +182 +183 +178 +178 +174 +175 +174 +172 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +152 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +115 +116 +110 +110 +105 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +54 +51 +51 +51 +47 +48 +42 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +18 +16 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +32 +37 +37 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +53 +54 +55 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +101 +100 +105 +106 +106 +110 +109 +116 +115 +116 +119 +120 +125 +125 +125 +129 +129 +133 +133 +133 +140 +140 +144 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +172 +175 +175 +179 +179 +179 +183 +183 +184 +185 +185 +189 +189 +191 +190 +195 +195 +195 +197 +197 +198 +198 +199 +200 +200 +200 +200 +200 +203 +202 +204 +204 +204 +204 +205 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +204 +205 +202 +202 +202 +201 +200 +200 +200 +201 +198 +198 +196 +197 +194 +194 +194 +191 +190 +188 +188 +188 +184 +185 +185 +185 +185 +183 +182 +179 +179 +179 +175 +175 +173 +172 +170 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +120 +120 +116 +115 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +73 +73 +69 +68 +68 +64 +64 +59 +58 +59 +54 +54 +50 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +26 +27 +31 +31 +31 +33 +33 +37 +36 +39 +41 +40 +43 +43 +46 +47 +47 +51 +51 +55 +55 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +116 +120 +120 +125 +125 +126 +129 +129 +133 +133 +138 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +183 +182 +182 +185 +185 +184 +184 +185 +189 +188 +191 +191 +190 +194 +194 +196 +197 +196 +198 +199 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +207 +207 +204 +205 +204 +204 +202 +203 +202 +200 +200 +200 +200 +200 +199 +198 +199 +198 +198 +196 +196 +194 +194 +195 +190 +191 +189 +188 +186 +185 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +156 +157 +157 +151 +151 +147 +147 +144 +143 +143 +140 +139 +133 +133 +133 +129 +129 +125 +125 +126 +119 +119 +115 +116 +116 +109 +109 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +59 +58 +55 +55 +55 +51 +51 +47 +46 +43 +42 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +22 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +24 +25 +25 +28 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +47 +47 +51 +51 +51 +55 +54 +59 +59 +64 +65 +65 +68 +68 +72 +72 +73 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +109 +115 +116 +116 +120 +120 +125 +126 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +185 +189 +189 +191 +191 +191 +194 +195 +197 +197 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +202 +202 +202 +200 +201 +201 +201 +200 +198 +199 +196 +197 +195 +194 +195 +191 +190 +188 +189 +189 +185 +185 +183 +183 +182 +179 +179 +176 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +125 +126 +120 +120 +119 +115 +116 +110 +109 +106 +105 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +83 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +55 +55 +54 +51 +50 +47 +47 +46 +43 +43 +41 +40 +41 +37 +36 +33 +33 +33 +31 +31 +27 +26 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +22 +25 +25 +26 +28 +27 +31 +31 +31 +34 +33 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +54 +55 +55 +59 +59 +65 +64 +64 +68 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +105 +106 +109 +110 +115 +116 +116 +119 +119 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +144 +147 +147 +151 +151 +158 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +184 +184 +184 +188 +189 +191 +191 +195 +194 +195 +196 +196 +198 +199 +198 +200 +201 +201 +200 +200 +200 +200 +202 +202 +202 +205 +205 +204 +204 +205 +206 +205 +206 +206 +207 +206 +207 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +205 +204 +204 +204 +205 +203 +203 +200 +200 +200 +201 +201 +198 +198 +197 +196 +197 +195 +195 +190 +190 +191 +189 +188 +185 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +126 +120 +119 +119 +115 +115 +109 +110 +110 +106 +106 +100 +100 +100 +97 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +77 +72 +72 +69 +68 +68 +65 +65 +58 +58 +59 +55 +55 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +38 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +51 +51 +55 +54 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +109 +116 +116 +115 +120 +120 +126 +125 +125 +129 +130 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +172 +173 +174 +175 +175 +179 +179 +183 +183 +183 +185 +185 +188 +189 +189 +191 +190 +194 +195 +194 +196 +196 +198 +199 +198 +201 +200 +201 +201 +201 +203 +203 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +204 +204 +205 +204 +205 +203 +202 +201 +200 +200 +200 +200 +198 +198 +198 +197 +196 +195 +194 +194 +190 +191 +189 +188 +189 +185 +185 +182 +183 +179 +179 +179 +175 +175 +173 +173 +173 +168 +169 +165 +165 +164 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +144 +139 +139 +134 +133 +133 +129 +129 +126 +125 +125 +120 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +54 +54 +54 +51 +50 +47 +46 +48 +42 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +16 +15 +15 +15 +14 +13 +12 +12 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +51 +50 +54 +55 +55 +58 +59 +64 +64 +64 +68 +68 +73 +72 +77 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +116 +119 +119 +125 +126 +130 +129 +129 +133 +133 +139 +139 +139 +143 +144 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +168 +169 +173 +173 +174 +175 +175 +179 +179 +182 +183 +182 +184 +185 +185 +184 +185 +189 +189 +191 +191 +191 +195 +194 +196 +197 +197 +198 +199 +200 +200 +200 +201 +201 +202 +202 +204 +204 +204 +204 +204 +205 +204 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +204 +204 +204 +203 +202 +203 +200 +200 +200 +201 +200 +199 +197 +197 +196 +197 +195 +194 +191 +191 +188 +188 +189 +184 +184 +183 +182 +183 +178 +179 +175 +175 +175 +172 +172 +169 +169 +169 +164 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +120 +119 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +76 +73 +72 +68 +68 +69 +64 +64 +59 +59 +59 +55 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +42 +47 +47 +47 +51 +50 +54 +54 +58 +58 +58 +65 +65 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +110 +110 +110 +115 +116 +120 +120 +119 +125 +125 +130 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +175 +178 +179 +183 +182 +182 +185 +185 +189 +189 +189 +191 +191 +194 +194 +196 +196 +196 +199 +198 +200 +200 +201 +200 +201 +201 +201 +201 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +204 +205 +204 +204 +205 +203 +203 +201 +201 +201 +200 +200 +198 +198 +196 +196 +197 +194 +194 +190 +190 +190 +189 +189 +185 +185 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +134 +129 +129 +126 +125 +126 +119 +120 +116 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +74 +68 +68 +64 +64 +59 +59 +58 +54 +54 +50 +51 +51 +47 +46 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +30 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +14 +15 +13 +13 +12 +13 +14 +14 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +43 +43 +42 +47 +46 +51 +51 +51 +54 +55 +54 +54 +55 +58 +58 +65 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +105 +110 +110 +115 +116 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +151 +151 +151 +157 +157 +162 +161 +161 +165 +165 +169 +169 +170 +173 +173 +175 +175 +178 +179 +179 +183 +182 +185 +185 +185 +189 +189 +189 +188 +188 +190 +190 +194 +195 +195 +196 +197 +199 +199 +200 +200 +201 +200 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +204 +203 +202 +202 +200 +200 +200 +201 +200 +198 +199 +197 +197 +196 +194 +195 +191 +191 +191 +189 +189 +184 +184 +182 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +130 +126 +125 +120 +119 +120 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +72 +72 +72 +69 +68 +64 +64 +64 +59 +58 +54 +55 +55 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +33 +33 +33 +31 +31 +26 +27 +27 +25 +25 +20 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +55 +55 +59 +58 +64 +64 +69 +68 +69 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +120 +119 +120 +126 +125 +129 +130 +129 +134 +134 +133 +134 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +172 +173 +175 +175 +175 +175 +174 +179 +179 +183 +183 +182 +185 +185 +189 +188 +189 +190 +191 +195 +194 +196 +196 +197 +198 +198 +201 +201 +200 +201 +200 +203 +202 +203 +204 +204 +204 +204 +205 +206 +207 +206 +207 +206 +207 +206 +206 +206 +207 +207 +206 +206 +206 +205 +205 +204 +205 +204 +202 +203 +203 +200 +200 +201 +201 +200 +198 +198 +197 +196 +195 +195 +194 +191 +190 +189 +189 +188 +185 +185 +183 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +129 +129 +125 +125 +119 +120 +120 +115 +115 +110 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +71 +68 +69 +64 +65 +59 +59 +59 +55 +55 +51 +51 +50 +47 +46 +47 +47 +47 +43 +43 +41 +41 +40 +37 +37 +33 +33 +31 +31 +30 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +42 +47 +46 +51 +51 +50 +54 +55 +58 +58 +59 +64 +65 +68 +68 +68 +72 +72 +77 +76 +77 +82 +82 +86 +86 +86 +90 +90 +96 +96 +101 +100 +100 +106 +106 +110 +110 +110 +116 +115 +115 +116 +116 +119 +119 +125 +125 +125 +129 +130 +134 +133 +132 +139 +139 +143 +144 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +176 +179 +179 +183 +183 +184 +184 +184 +189 +188 +190 +191 +191 +195 +195 +197 +197 +197 +198 +199 +201 +201 +201 +201 +201 +203 +203 +204 +205 +204 +204 +204 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +204 +205 +205 +204 +204 +202 +202 +201 +201 +200 +201 +200 +198 +198 +198 +197 +196 +194 +194 +195 +190 +190 +189 +188 +188 +185 +185 +183 +182 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +129 +129 +125 +125 +125 +119 +120 +116 +116 +115 +109 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +69 +64 +64 +64 +64 +64 +58 +58 +55 +54 +54 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +47 +51 +51 +54 +55 +55 +58 +59 +64 +64 +64 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +117 +120 +120 +125 +125 +129 +129 +129 +133 +134 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +152 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +182 +185 +185 +184 +189 +189 +191 +191 +190 +194 +194 +196 +197 +198 +198 +198 +200 +200 +200 +200 +200 +203 +203 +205 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +203 +204 +202 +202 +200 +201 +200 +200 +201 +199 +198 +198 +196 +197 +194 +195 +194 +190 +191 +189 +188 +184 +185 +185 +183 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +148 +147 +143 +143 +143 +140 +139 +134 +133 +133 +129 +129 +129 +129 +130 +125 +125 +119 +120 +119 +115 +115 +110 +110 +108 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +83 +83 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +61 +58 +58 +54 +54 +51 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +28 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +42 +43 +46 +47 +50 +50 +51 +54 +55 +58 +59 +65 +65 +64 +68 +69 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +102 +106 +105 +110 +110 +115 +116 +116 +120 +120 +125 +125 +126 +129 +129 +129 +129 +130 +134 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +176 +174 +175 +179 +179 +183 +183 +183 +185 +185 +189 +188 +190 +190 +190 +195 +194 +196 +196 +197 +198 +198 +200 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +205 +204 +204 +204 +205 +203 +202 +202 +201 +200 +200 +201 +201 +198 +199 +196 +197 +195 +194 +195 +191 +190 +188 +189 +189 +185 +184 +183 +182 +183 +178 +179 +175 +175 +174 +172 +173 +169 +169 +169 +165 +165 +161 +161 +158 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +125 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +64 +64 +59 +58 +54 +54 +54 +50 +50 +47 +47 +46 +43 +42 +41 +41 +41 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +26 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +38 +40 +41 +43 +43 +47 +47 +46 +50 +50 +54 +55 +54 +58 +58 +59 +59 +59 +65 +64 +68 +68 +68 +72 +72 +77 +77 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +105 +106 +106 +110 +110 +116 +115 +116 +119 +120 +125 +126 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +176 +175 +175 +179 +178 +183 +183 +183 +185 +185 +189 +189 +188 +191 +191 +195 +194 +194 +196 +196 +198 +198 +198 +201 +200 +201 +200 +203 +203 +203 +204 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +204 +205 +205 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +199 +198 +196 +197 +194 +195 +195 +190 +191 +189 +188 +189 +185 +185 +183 +183 +178 +179 +179 +175 +175 +173 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +139 +139 +139 +134 +133 +130 +129 +129 +126 +125 +126 +126 +125 +119 +119 +116 +116 +116 +110 +110 +106 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +87 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +59 +58 +55 +54 +51 +50 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +15 +13 +13 +12 +12 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +12 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +24 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +41 +41 +41 +43 +42 +47 +46 +46 +50 +50 +54 +54 +56 +58 +58 +65 +65 +68 +69 +69 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +109 +115 +116 +116 +120 +121 +126 +126 +125 +129 +130 +133 +133 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +178 +183 +182 +184 +185 +185 +189 +189 +191 +191 +195 +194 +195 +197 +196 +198 +198 +198 +200 +200 +201 +200 +201 +202 +202 +204 +205 +204 +205 +205 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +201 +201 +201 +200 +201 +198 +199 +200 +196 +196 +195 +195 +191 +190 +190 +188 +189 +185 +185 +185 +183 +183 +183 +183 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +144 +144 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +119 +119 +116 +115 +110 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +65 +59 +59 +59 +55 +54 +50 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +20 +19 +19 +22 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +47 +50 +50 +50 +54 +54 +59 +58 +59 +64 +64 +64 +64 +64 +69 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +111 +115 +115 +116 +120 +120 +125 +126 +126 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +160 +161 +165 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +179 +182 +182 +183 +185 +184 +188 +188 +188 +191 +190 +195 +194 +194 +196 +196 +199 +199 +198 +200 +200 +201 +200 +201 +202 +203 +204 +204 +205 +204 +204 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +204 +204 +205 +205 +205 +202 +202 +200 +200 +200 +200 +200 +198 +199 +196 +196 +197 +195 +195 +191 +190 +190 +188 +189 +185 +184 +185 +182 +183 +179 +179 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +130 +125 +125 +126 +119 +119 +116 +116 +116 +110 +110 +106 +106 +105 +100 +100 +96 +96 +97 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +68 +68 +68 +64 +65 +58 +58 +58 +54 +55 +51 +50 +51 +47 +47 +43 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +14 +14 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +18 +18 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +51 +51 +51 +50 +54 +55 +58 +58 +59 +65 +65 +68 +68 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +125 +125 +126 +130 +129 +129 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +182 +184 +184 +188 +189 +188 +190 +191 +194 +195 +194 +196 +196 +199 +199 +201 +200 +200 +201 +200 +203 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +205 +204 +204 +205 +204 +203 +202 +202 +200 +201 +201 +200 +200 +199 +199 +196 +196 +197 +194 +194 +190 +191 +189 +189 +189 +184 +184 +182 +182 +183 +178 +178 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +116 +116 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +72 +68 +69 +64 +65 +64 +58 +59 +55 +54 +51 +51 +50 +46 +47 +43 +43 +43 +41 +41 +37 +37 +38 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +13 +12 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +40 +41 +40 +43 +43 +47 +47 +49 +50 +50 +55 +55 +58 +59 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +97 +99 +100 +100 +106 +106 +110 +109 +110 +116 +116 +120 +119 +119 +125 +125 +129 +129 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +172 +174 +175 +178 +179 +179 +183 +182 +185 +185 +185 +184 +185 +189 +188 +190 +190 +190 +195 +195 +196 +196 +196 +198 +198 +200 +200 +200 +201 +201 +202 +202 +203 +205 +204 +204 +204 +207 +207 +207 +207 +206 +206 +205 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +204 +204 +204 +204 +205 +203 +203 +200 +201 +200 +200 +200 +198 +199 +196 +196 +196 +194 +194 +195 +195 +194 +190 +191 +188 +188 +189 +185 +185 +182 +183 +181 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +133 +134 +134 +129 +129 +125 +125 +126 +119 +119 +116 +116 +115 +109 +109 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +82 +82 +82 +76 +77 +72 +72 +72 +68 +68 +64 +64 +64 +58 +59 +54 +55 +54 +51 +51 +47 +47 +47 +43 +43 +41 +40 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +22 +19 +19 +19 +17 +17 +15 +15 +16 +15 +15 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +14 +14 +13 +15 +16 +15 +17 +17 +17 +17 +17 +18 +19 +21 +21 +21 +24 +25 +27 +27 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +55 +55 +59 +59 +59 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +109 +115 +115 +120 +119 +125 +125 +125 +129 +129 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +173 +173 +172 +175 +175 +179 +178 +179 +182 +182 +185 +185 +184 +189 +188 +190 +190 +190 +194 +195 +196 +196 +196 +199 +199 +200 +201 +201 +201 +200 +202 +202 +204 +204 +205 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +203 +200 +200 +201 +200 +201 +200 +200 +198 +198 +198 +197 +196 +194 +194 +191 +190 +191 +188 +188 +185 +184 +185 +182 +183 +183 +183 +182 +178 +178 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +120 +115 +115 +110 +110 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +69 +69 +64 +64 +59 +59 +58 +54 +55 +51 +50 +51 +47 +46 +47 +47 +46 +43 +43 +40 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +30 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +50 +54 +54 +59 +58 +58 +64 +64 +68 +68 +68 +73 +72 +76 +76 +76 +82 +82 +86 +87 +91 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +130 +130 +133 +134 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +183 +182 +182 +185 +185 +188 +189 +189 +191 +190 +195 +195 +195 +196 +197 +198 +198 +198 +200 +201 +200 +200 +201 +202 +203 +205 +204 +205 +204 +205 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +200 +200 +200 +200 +200 +199 +198 +198 +196 +197 +195 +194 +195 +190 +191 +189 +188 +189 +185 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +134 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +116 +110 +110 +106 +106 +106 +100 +100 +95 +96 +96 +91 +90 +86 +86 +83 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +59 +55 +55 +51 +51 +51 +47 +47 +43 +42 +42 +41 +41 +37 +37 +33 +33 +33 +31 +31 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +46 +46 +47 +50 +51 +54 +55 +55 +59 +58 +64 +64 +69 +69 +69 +72 +72 +76 +77 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +120 +119 +119 +125 +125 +129 +130 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +158 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +178 +179 +179 +182 +183 +184 +184 +185 +188 +189 +190 +191 +192 +194 +195 +197 +196 +198 +198 +199 +200 +199 +200 +200 +200 +202 +202 +203 +203 +203 +205 +204 +204 +204 +205 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +205 +204 +204 +204 +205 +203 +202 +202 +201 +200 +200 +201 +201 +198 +199 +197 +197 +195 +195 +195 +191 +190 +189 +188 +189 +185 +184 +182 +183 +182 +179 +178 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +152 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +133 +129 +130 +129 +125 +125 +120 +120 +120 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +69 +64 +64 +59 +58 +54 +54 +55 +51 +50 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +16 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +13 +13 +15 +15 +16 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +50 +51 +51 +54 +55 +59 +59 +58 +64 +64 +69 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +87 +90 +90 +95 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +120 +119 +125 +125 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +189 +189 +188 +191 +191 +194 +194 +194 +196 +196 +196 +196 +196 +198 +198 +201 +200 +201 +201 +200 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +205 +202 +203 +200 +200 +201 +200 +201 +198 +198 +199 +196 +197 +195 +195 +194 +190 +190 +189 +188 +188 +185 +185 +182 +183 +182 +178 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +133 +134 +129 +129 +126 +125 +125 +119 +119 +116 +116 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +77 +73 +72 +72 +68 +68 +68 +69 +68 +64 +64 +58 +59 +58 +54 +54 +50 +51 +51 +47 +47 +43 +42 +43 +41 +40 +37 +37 +32 +33 +32 +31 +30 +27 +27 +27 +25 +25 +25 +24 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +38 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +54 +54 +58 +59 +59 +65 +64 +68 +69 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +110 +110 +110 +115 +115 +119 +119 +120 +126 +125 +129 +130 +133 +134 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +169 +169 +173 +173 +174 +175 +174 +179 +178 +182 +183 +182 +184 +184 +185 +184 +185 +188 +188 +190 +191 +190 +194 +195 +196 +196 +198 +198 +199 +201 +200 +200 +200 +200 +202 +203 +204 +205 +204 +204 +204 +207 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +204 +205 +204 +204 +204 +203 +202 +201 +201 +200 +200 +200 +198 +199 +198 +196 +197 +195 +194 +195 +190 +191 +189 +189 +185 +185 +184 +183 +183 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +139 +139 +133 +133 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +116 +115 +116 +110 +110 +105 +106 +100 +100 +100 +96 +96 +90 +90 +90 +87 +86 +86 +86 +86 +82 +82 +76 +76 +76 +72 +73 +68 +68 +67 +64 +64 +58 +59 +55 +55 +55 +50 +50 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +37 +37 +37 +32 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +55 +55 +55 +59 +59 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +106 +106 +106 +109 +109 +116 +116 +116 +120 +120 +120 +120 +119 +126 +125 +129 +130 +129 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +180 +183 +183 +185 +184 +188 +188 +188 +190 +191 +195 +194 +194 +196 +197 +199 +198 +199 +200 +201 +200 +201 +201 +203 +203 +204 +204 +204 +204 +205 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +207 +206 +206 +207 +206 +204 +204 +204 +204 +204 +202 +203 +200 +200 +201 +200 +201 +199 +199 +196 +196 +196 +195 +195 +191 +191 +190 +189 +189 +185 +185 +184 +183 +183 +179 +179 +179 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +119 +120 +119 +116 +115 +110 +110 +110 +106 +106 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +84 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +64 +58 +58 +59 +59 +59 +54 +54 +51 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +42 +41 +41 +43 +43 +46 +47 +46 +51 +50 +51 +51 +50 +54 +54 +58 +59 +59 +65 +64 +69 +68 +68 +73 +72 +76 +76 +83 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +118 +120 +119 +125 +125 +130 +129 +130 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +162 +165 +165 +169 +169 +172 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +184 +184 +188 +188 +190 +191 +191 +195 +195 +196 +197 +198 +198 +198 +200 +200 +200 +200 +201 +203 +202 +204 +204 +204 +204 +204 +207 +207 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +206 +204 +204 +204 +205 +204 +202 +202 +201 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +194 +194 +191 +190 +188 +189 +185 +185 +185 +183 +183 +179 +179 +179 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +158 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +126 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +89 +90 +86 +86 +82 +82 +82 +76 +77 +76 +76 +76 +72 +72 +68 +69 +69 +64 +64 +58 +58 +55 +54 +54 +51 +50 +47 +47 +47 +43 +42 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +22 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +14 +14 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +51 +54 +54 +54 +58 +58 +64 +65 +69 +69 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +115 +116 +116 +120 +119 +125 +125 +125 +129 +130 +130 +129 +129 +133 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +175 +179 +178 +183 +183 +183 +185 +185 +189 +188 +190 +191 +191 +194 +194 +196 +196 +197 +199 +199 +198 +198 +198 +200 +200 +200 +200 +200 +202 +203 +204 +205 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +205 +204 +205 +205 +204 +202 +202 +200 +201 +201 +200 +201 +199 +198 +197 +197 +197 +194 +195 +190 +191 +190 +189 +189 +185 +185 +184 +182 +183 +179 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +165 +160 +161 +161 +158 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +122 +119 +120 +116 +116 +109 +109 +110 +106 +106 +100 +100 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +65 +64 +64 +59 +58 +54 +55 +55 +50 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +32 +30 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +14 +13 +12 +13 +14 +13 +14 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +13 +14 +13 +14 +14 +14 +13 +13 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +38 +41 +40 +43 +43 +47 +47 +46 +50 +51 +54 +55 +55 +59 +58 +58 +59 +58 +64 +65 +68 +68 +68 +72 +72 +76 +77 +79 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +105 +105 +105 +106 +110 +110 +116 +115 +115 +119 +119 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +166 +169 +169 +173 +172 +174 +175 +175 +179 +179 +183 +182 +182 +184 +184 +188 +189 +188 +190 +190 +195 +195 +195 +196 +196 +198 +198 +199 +200 +200 +200 +200 +202 +203 +202 +204 +205 +204 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +199 +199 +198 +196 +197 +195 +195 +194 +190 +190 +188 +189 +189 +184 +184 +182 +182 +178 +178 +179 +175 +175 +172 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +129 +129 +125 +125 +125 +125 +126 +120 +119 +116 +116 +115 +110 +110 +105 +106 +101 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +67 +68 +64 +64 +64 +59 +58 +55 +54 +51 +51 +51 +47 +46 +43 +43 +42 +41 +41 +37 +36 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +20 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +46 +50 +50 +55 +54 +56 +58 +58 +64 +64 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +99 +100 +105 +106 +106 +110 +110 +115 +115 +115 +120 +119 +125 +125 +125 +129 +129 +133 +134 +133 +140 +140 +143 +143 +144 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +172 +172 +175 +174 +179 +179 +179 +182 +183 +185 +184 +184 +189 +188 +190 +190 +195 +194 +194 +197 +196 +198 +198 +199 +200 +200 +200 +201 +201 +202 +202 +204 +204 +204 +205 +204 +206 +206 +206 +206 +207 +207 +206 +207 +207 +206 +206 +206 +207 +206 +207 +204 +204 +204 +204 +204 +202 +202 +201 +201 +200 +200 +200 +198 +198 +200 +197 +196 +195 +194 +191 +190 +191 +189 +188 +184 +185 +185 +183 +183 +179 +178 +179 +175 +175 +173 +173 +173 +168 +169 +165 +164 +165 +161 +161 +157 +157 +153 +151 +151 +147 +147 +143 +144 +143 +139 +139 +139 +139 +139 +133 +133 +129 +129 +129 +125 +125 +120 +120 +117 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +68 +64 +65 +65 +59 +58 +54 +54 +54 +50 +50 +47 +47 +46 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +26 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +12 +15 +15 +16 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +30 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +44 +47 +47 +50 +50 +55 +54 +54 +58 +58 +65 +64 +64 +68 +68 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +86 +87 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +115 +115 +119 +119 +119 +126 +125 +129 +129 +130 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +160 +161 +161 +165 +165 +169 +169 +169 +173 +173 +174 +175 +174 +179 +179 +183 +182 +185 +185 +185 +189 +189 +190 +190 +191 +194 +194 +197 +196 +197 +198 +199 +200 +201 +201 +201 +200 +202 +203 +203 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +205 +205 +202 +202 +203 +201 +201 +200 +200 +198 +198 +198 +196 +197 +195 +194 +194 +191 +190 +189 +189 +188 +184 +185 +183 +183 +183 +179 +178 +175 +175 +175 +173 +172 +169 +169 +164 +165 +164 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +132 +129 +130 +126 +126 +120 +119 +119 +116 +116 +109 +110 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +80 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +59 +54 +54 +50 +50 +51 +46 +47 +42 +43 +43 +41 +41 +37 +37 +33 +33 +32 +31 +30 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +16 +13 +13 +12 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +20 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +36 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +54 +55 +54 +55 +54 +58 +59 +65 +64 +65 +68 +68 +72 +72 +74 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +116 +116 +119 +120 +125 +125 +129 +129 +129 +134 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +174 +179 +178 +182 +183 +182 +185 +185 +188 +189 +188 +190 +190 +195 +195 +195 +196 +197 +198 +198 +198 +200 +200 +200 +200 +203 +202 +203 +204 +204 +204 +204 +204 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +203 +202 +200 +200 +200 +200 +200 +198 +198 +198 +198 +198 +196 +196 +194 +195 +194 +190 +190 +189 +189 +187 +184 +185 +183 +183 +179 +179 +179 +175 +175 +173 +173 +172 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +145 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +125 +125 +119 +120 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +64 +64 +65 +58 +58 +55 +54 +55 +51 +50 +47 +47 +44 +43 +42 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +24 +25 +25 +21 +21 +19 +19 +19 +17 +16 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +13 +15 +15 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +26 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +58 +59 +64 +65 +64 +69 +69 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +89 +96 +96 +100 +100 +100 +106 +106 +110 +110 +112 +116 +116 +119 +120 +125 +126 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +164 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +185 +184 +189 +189 +190 +190 +190 +195 +194 +196 +197 +199 +199 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +204 +204 +205 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +203 +202 +202 +201 +201 +200 +201 +201 +198 +198 +197 +197 +195 +194 +195 +191 +190 +188 +189 +189 +185 +185 +183 +183 +183 +179 +179 +178 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +126 +126 +126 +120 +119 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +77 +76 +72 +72 +72 +72 +72 +68 +69 +64 +64 +64 +58 +58 +55 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +26 +25 +25 +21 +22 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +43 +47 +47 +51 +51 +50 +54 +54 +58 +58 +59 +65 +65 +68 +68 +68 +72 +72 +76 +77 +76 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +115 +119 +120 +119 +125 +125 +129 +130 +129 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +152 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +185 +185 +185 +188 +188 +191 +191 +190 +194 +194 +197 +196 +197 +198 +199 +200 +200 +201 +201 +201 +202 +203 +203 +204 +205 +204 +205 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +205 +204 +203 +203 +203 +201 +200 +200 +200 +198 +198 +198 +197 +196 +195 +194 +195 +191 +191 +190 +191 +190 +189 +188 +184 +185 +184 +183 +183 +179 +178 +177 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +143 +139 +139 +133 +133 +129 +129 +129 +126 +125 +119 +120 +119 +115 +116 +109 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +83 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +58 +59 +59 +55 +54 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +34 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +40 +41 +42 +43 +43 +47 +47 +50 +50 +50 +54 +55 +58 +58 +58 +64 +64 +68 +68 +69 +73 +72 +77 +76 +81 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +99 +105 +106 +109 +109 +110 +115 +116 +119 +119 +120 +126 +126 +129 +129 +133 +134 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +164 +165 +169 +169 +170 +173 +173 +175 +175 +179 +179 +179 +183 +183 +185 +184 +184 +188 +188 +191 +190 +191 +194 +194 +197 +196 +197 +198 +199 +200 +200 +201 +200 +201 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +207 +206 +207 +205 +205 +205 +204 +204 +202 +202 +202 +200 +201 +200 +201 +201 +198 +199 +199 +198 +199 +197 +196 +194 +195 +195 +191 +191 +188 +188 +185 +185 +185 +182 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +125 +125 +120 +119 +116 +116 +115 +109 +110 +106 +106 +105 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +73 +73 +68 +68 +68 +64 +64 +58 +58 +58 +54 +55 +51 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +16 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +28 +27 +31 +32 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +54 +58 +58 +58 +64 +65 +69 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +110 +110 +109 +116 +116 +120 +119 +119 +125 +126 +126 +125 +126 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +158 +157 +156 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +184 +185 +185 +189 +188 +190 +191 +195 +194 +194 +196 +196 +198 +198 +199 +200 +200 +200 +200 +200 +200 +201 +202 +203 +203 +204 +205 +204 +204 +205 +206 +207 +207 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +204 +205 +204 +204 +204 +202 +202 +200 +201 +200 +201 +200 +198 +198 +196 +196 +197 +195 +195 +190 +190 +190 +189 +189 +185 +184 +185 +183 +183 +179 +178 +179 +175 +175 +173 +172 +170 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +120 +120 +120 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +83 +82 +82 +76 +76 +72 +72 +69 +68 +68 +64 +64 +59 +58 +58 +54 +54 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +13 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +42 +43 +42 +47 +47 +50 +50 +50 +54 +54 +55 +55 +54 +59 +59 +64 +65 +64 +68 +68 +73 +72 +72 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +105 +106 +110 +110 +116 +116 +115 +119 +119 +125 +125 +126 +129 +129 +133 +133 +140 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +183 +183 +184 +185 +188 +189 +189 +190 +191 +194 +195 +194 +197 +197 +198 +198 +198 +200 +200 +201 +200 +201 +202 +203 +204 +204 +205 +204 +205 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +207 +206 +207 +206 +206 +207 +204 +205 +204 +204 +205 +202 +202 +200 +201 +201 +200 +200 +198 +198 +199 +196 +196 +195 +195 +195 +191 +191 +189 +188 +189 +185 +184 +183 +183 +181 +179 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +134 +133 +133 +129 +129 +125 +126 +125 +120 +120 +115 +116 +115 +109 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +90 +86 +86 +83 +82 +82 +76 +77 +72 +72 +72 +69 +68 +65 +64 +64 +59 +58 +55 +55 +55 +51 +51 +46 +46 +47 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +26 +21 +21 +21 +19 +19 +17 +17 +18 +15 +14 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +50 +51 +54 +54 +59 +58 +59 +64 +64 +68 +69 +73 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +115 +116 +119 +119 +126 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +174 +175 +178 +179 +179 +182 +183 +182 +182 +183 +185 +184 +189 +188 +189 +191 +191 +194 +195 +195 +197 +197 +198 +198 +200 +201 +200 +200 +200 +203 +203 +202 +204 +204 +205 +204 +204 +204 +204 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +207 +205 +204 +204 +204 +204 +203 +202 +200 +200 +201 +200 +201 +198 +199 +199 +196 +197 +194 +195 +191 +191 +190 +189 +188 +184 +185 +185 +183 +182 +178 +179 +178 +175 +175 +172 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +144 +143 +139 +139 +133 +134 +133 +129 +129 +125 +126 +125 +120 +120 +115 +115 +116 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +86 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +69 +69 +64 +64 +59 +58 +55 +54 +54 +50 +51 +47 +47 +47 +43 +43 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +29 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +14 +14 +13 +13 +13 +14 +13 +14 +14 +13 +14 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +46 +51 +51 +51 +54 +55 +59 +58 +58 +64 +64 +68 +69 +69 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +116 +116 +120 +119 +119 +126 +125 +129 +129 +129 +133 +133 +140 +139 +140 +143 +143 +147 +147 +151 +151 +151 +156 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +179 +183 +183 +185 +185 +188 +189 +188 +191 +191 +195 +194 +194 +197 +197 +196 +196 +197 +199 +198 +200 +200 +201 +201 +200 +203 +202 +204 +204 +205 +204 +205 +206 +206 +206 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +201 +200 +200 +198 +198 +199 +197 +197 +197 +196 +197 +194 +195 +191 +190 +191 +188 +189 +184 +184 +184 +183 +183 +179 +179 +175 +175 +175 +173 +172 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +126 +120 +120 +119 +116 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +76 +72 +72 +68 +68 +68 +64 +64 +65 +64 +65 +59 +58 +54 +54 +55 +51 +50 +47 +46 +47 +43 +42 +40 +41 +38 +37 +37 +33 +33 +31 +31 +31 +27 +27 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +16 +15 +14 +16 +15 +13 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +13 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +46 +47 +51 +51 +54 +55 +54 +58 +58 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +106 +109 +110 +116 +115 +116 +119 +120 +125 +126 +129 +129 +129 +134 +133 +139 +140 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +162 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +182 +182 +182 +185 +184 +188 +189 +188 +190 +190 +194 +194 +196 +197 +197 +198 +198 +200 +201 +200 +200 +200 +202 +202 +203 +204 +204 +204 +204 +204 +206 +207 +206 +207 +207 +206 +206 +206 +206 +206 +206 +207 +206 +206 +204 +204 +204 +205 +205 +202 +202 +202 +200 +201 +200 +201 +200 +199 +198 +196 +196 +196 +194 +195 +190 +191 +189 +189 +189 +184 +184 +183 +182 +183 +178 +179 +175 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +144 +143 +139 +139 +139 +134 +133 +130 +129 +129 +126 +126 +119 +119 +120 +116 +116 +109 +110 +111 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +72 +72 +68 +68 +65 +64 +62 +58 +58 +55 +55 +50 +50 +51 +47 +47 +43 +43 +43 +41 +41 +40 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +16 +13 +13 +13 +12 +13 +14 +14 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +12 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +47 +50 +50 +54 +54 +59 +58 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +97 +100 +100 +106 +106 +110 +109 +110 +115 +115 +121 +119 +119 +125 +125 +125 +125 +125 +129 +129 +134 +133 +133 +139 +139 +143 +143 +145 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +172 +175 +175 +175 +179 +179 +183 +182 +184 +185 +185 +188 +188 +191 +190 +191 +194 +194 +196 +196 +196 +199 +198 +200 +200 +200 +200 +201 +202 +203 +203 +205 +204 +205 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +200 +200 +200 +201 +199 +198 +198 +196 +197 +194 +195 +195 +190 +191 +188 +188 +188 +184 +184 +183 +183 +183 +178 +179 +175 +174 +175 +173 +172 +169 +169 +165 +164 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +125 +125 +119 +119 +116 +115 +116 +109 +110 +106 +106 +106 +100 +100 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +64 +64 +59 +58 +58 +54 +54 +54 +54 +54 +51 +50 +47 +47 +47 +43 +42 +41 +40 +42 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +12 +15 +14 +17 +17 +17 +19 +19 +22 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +55 +58 +59 +59 +64 +64 +68 +69 +69 +72 +72 +76 +76 +77 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +110 +116 +116 +119 +119 +119 +126 +126 +130 +129 +131 +133 +133 +139 +139 +144 +143 +143 +147 +147 +151 +151 +151 +157 +157 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +182 +183 +183 +184 +185 +189 +189 +189 +190 +191 +195 +194 +194 +196 +196 +198 +198 +199 +200 +200 +201 +200 +202 +203 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +207 +206 +204 +204 +204 +204 +203 +202 +202 +201 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +194 +190 +190 +190 +188 +189 +185 +184 +185 +183 +183 +179 +178 +175 +175 +175 +173 +173 +168 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +130 +129 +129 +125 +126 +119 +119 +120 +116 +115 +116 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +93 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +72 +69 +68 +69 +68 +69 +64 +64 +58 +58 +59 +55 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +36 +37 +41 +41 +41 +43 +43 +47 +46 +47 +50 +51 +54 +54 +55 +58 +58 +64 +64 +65 +68 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +116 +115 +118 +120 +120 +126 +126 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +163 +165 +165 +169 +169 +173 +173 +173 +174 +174 +179 +178 +178 +182 +182 +185 +184 +185 +189 +189 +190 +190 +191 +195 +195 +197 +196 +197 +198 +199 +200 +200 +201 +200 +200 +202 +202 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +196 +197 +194 +194 +195 +190 +190 +188 +188 +185 +185 +184 +182 +183 +178 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +115 +115 +110 +110 +106 +105 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +77 +72 +72 +68 +68 +69 +64 +64 +59 +59 +55 +54 +54 +50 +51 +47 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +28 +27 +27 +31 +31 +33 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +47 +47 +50 +51 +55 +54 +55 +59 +58 +64 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +95 +100 +100 +102 +106 +106 +110 +110 +115 +116 +116 +119 +119 +125 +126 +125 +129 +129 +129 +129 +130 +133 +133 +139 +139 +140 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +164 +169 +169 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +183 +185 +185 +189 +188 +191 +190 +191 +194 +195 +196 +196 +196 +198 +198 +200 +200 +201 +200 +200 +202 +202 +202 +204 +205 +205 +204 +205 +206 +207 +206 +206 +206 +206 +207 +205 +206 +206 +206 +207 +206 +206 +204 +204 +204 +204 +204 +202 +202 +202 +201 +200 +200 +200 +201 +199 +198 +196 +196 +195 +194 +194 +190 +190 +188 +188 +189 +184 +184 +183 +183 +182 +179 +179 +175 +175 +175 +172 +172 +169 +169 +169 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +133 +129 +129 +125 +125 +123 +119 +120 +115 +116 +110 +110 +109 +106 +106 +100 +99 +100 +96 +96 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +74 +72 +72 +68 +68 +64 +64 +64 +58 +58 +55 +54 +54 +51 +51 +47 +47 +47 +43 +42 +41 +41 +41 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +13 +14 +14 +14 +13 +14 +13 +14 +13 +13 +14 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +50 +51 +50 +54 +54 +59 +59 +58 +65 +64 +64 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +83 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +110 +110 +110 +116 +115 +119 +119 +120 +126 +125 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +162 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +184 +185 +188 +189 +191 +191 +191 +194 +194 +197 +197 +197 +198 +198 +200 +200 +200 +201 +201 +202 +203 +205 +204 +204 +204 +204 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +201 +200 +200 +199 +198 +198 +196 +196 +194 +194 +194 +191 +190 +189 +189 +188 +184 +185 +183 +183 +183 +179 +179 +175 +175 +174 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +148 +143 +143 +139 +140 +141 +133 +133 +129 +129 +125 +126 +125 +120 +120 +115 +116 +116 +110 +110 +110 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +90 +91 +86 +86 +82 +82 +76 +76 +76 +72 +71 +68 +68 +68 +64 +64 +58 +59 +58 +55 +54 +51 +51 +51 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +14 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +46 +47 +51 +51 +51 +51 +51 +55 +54 +58 +59 +58 +64 +64 +68 +68 +70 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +117 +120 +120 +126 +125 +129 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +182 +185 +184 +189 +188 +188 +190 +190 +194 +194 +194 +196 +197 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +204 +204 +204 +204 +204 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +207 +205 +204 +205 +204 +204 +202 +202 +202 +200 +200 +200 +201 +200 +198 +199 +196 +196 +197 +195 +195 +191 +191 +191 +188 +189 +184 +185 +183 +183 +182 +178 +179 +175 +175 +175 +173 +173 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +154 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +133 +133 +130 +130 +129 +130 +129 +125 +125 +120 +119 +120 +116 +115 +110 +110 +106 +106 +106 +100 +100 +96 +95 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +77 +72 +72 +68 +67 +69 +65 +64 +58 +58 +55 +54 +55 +50 +51 +46 +46 +47 +43 +42 +41 +41 +40 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +50 +50 +55 +54 +56 +58 +58 +65 +65 +68 +69 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +102 +106 +105 +110 +110 +115 +115 +115 +119 +119 +126 +125 +125 +130 +129 +133 +134 +133 +139 +140 +143 +143 +143 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +182 +183 +185 +185 +185 +189 +189 +190 +190 +195 +194 +195 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +205 +205 +204 +204 +205 +206 +206 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +202 +200 +200 +200 +200 +201 +198 +198 +199 +196 +196 +194 +195 +190 +191 +191 +188 +188 +185 +185 +185 +183 +183 +182 +182 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +167 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +143 +143 +143 +139 +139 +133 +133 +134 +130 +129 +125 +125 +123 +120 +120 +116 +115 +109 +109 +109 +106 +106 +100 +100 +100 +96 +96 +90 +89 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +54 +54 +50 +51 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +12 +15 +15 +17 +17 +20 +19 +19 +21 +21 +25 +25 +25 +27 +27 +27 +27 +27 +31 +31 +33 +33 +33 +36 +36 +41 +41 +41 +43 +43 +47 +47 +51 +51 +51 +55 +54 +59 +58 +58 +64 +65 +64 +64 +65 +68 +68 +72 +72 +72 +76 +76 +82 +82 +84 +86 +86 +90 +90 +96 +96 +96 +99 +100 +106 +106 +106 +110 +110 +115 +116 +115 +119 +119 +125 +125 +126 +129 +130 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +178 +179 +183 +182 +182 +184 +184 +189 +188 +188 +190 +191 +194 +195 +194 +196 +197 +198 +198 +198 +200 +201 +200 +200 +201 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +201 +198 +199 +197 +196 +197 +194 +194 +194 +194 +194 +190 +191 +189 +189 +189 +184 +185 +182 +183 +181 +178 +178 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +140 +139 +139 +133 +133 +129 +129 +129 +125 +126 +120 +119 +119 +116 +116 +110 +109 +110 +106 +106 +99 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +73 +72 +68 +68 +68 +64 +64 +59 +58 +59 +54 +55 +51 +51 +51 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +14 +13 +14 +13 +15 +13 +13 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +29 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +46 +47 +46 +46 +47 +51 +50 +54 +54 +54 +59 +58 +65 +64 +67 +68 +68 +72 +73 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +115 +119 +119 +119 +125 +125 +129 +130 +129 +133 +133 +139 +140 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +169 +168 +169 +173 +173 +175 +174 +175 +178 +178 +183 +182 +183 +185 +185 +189 +188 +189 +190 +190 +195 +194 +194 +197 +196 +198 +198 +201 +200 +200 +200 +200 +202 +202 +203 +204 +205 +204 +204 +204 +206 +207 +206 +206 +207 +206 +206 +206 +206 +207 +206 +207 +206 +206 +204 +204 +204 +204 +204 +203 +202 +202 +200 +200 +200 +201 +200 +200 +200 +198 +198 +198 +196 +196 +194 +195 +192 +191 +191 +189 +189 +185 +185 +185 +182 +182 +179 +179 +179 +175 +175 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +119 +120 +116 +116 +110 +110 +105 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +55 +55 +54 +51 +51 +47 +47 +47 +42 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +28 +25 +25 +21 +21 +20 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +37 +37 +37 +41 +41 +43 +42 +43 +47 +46 +50 +51 +54 +54 +54 +58 +59 +64 +65 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +89 +90 +90 +96 +96 +100 +100 +105 +106 +106 +110 +109 +116 +116 +116 +119 +119 +125 +125 +125 +129 +129 +133 +133 +133 +140 +139 +143 +143 +143 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +174 +179 +179 +179 +183 +183 +184 +185 +185 +188 +189 +191 +190 +195 +194 +194 +196 +196 +198 +198 +198 +200 +201 +201 +200 +200 +203 +202 +204 +204 +205 +205 +204 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +207 +206 +204 +204 +204 +204 +204 +203 +202 +200 +200 +200 +200 +200 +199 +198 +196 +196 +196 +195 +195 +190 +190 +191 +188 +189 +188 +188 +188 +184 +185 +183 +182 +183 +178 +179 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +140 +134 +133 +130 +129 +126 +125 +125 +120 +119 +116 +115 +115 +110 +110 +106 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +73 +72 +72 +68 +68 +64 +65 +64 +58 +58 +54 +54 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +13 +14 +13 +14 +14 +13 +13 +13 +14 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +33 +36 +37 +37 +41 +42 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +59 +58 +59 +65 +64 +68 +68 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +106 +110 +110 +115 +116 +116 +119 +120 +125 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +164 +165 +169 +169 +173 +173 +174 +175 +175 +178 +179 +182 +183 +183 +185 +185 +188 +189 +188 +190 +191 +195 +195 +195 +197 +197 +198 +198 +198 +200 +200 +201 +201 +203 +202 +202 +204 +204 +204 +205 +204 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +207 +206 +207 +207 +207 +207 +204 +204 +204 +205 +204 +202 +202 +200 +200 +200 +200 +200 +200 +201 +200 +198 +198 +197 +196 +197 +195 +195 +190 +190 +189 +188 +189 +184 +185 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +134 +134 +129 +130 +129 +125 +126 +119 +120 +120 +115 +115 +110 +109 +110 +106 +106 +100 +99 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +58 +59 +59 +55 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +23 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +51 +54 +55 +58 +58 +64 +64 +64 +69 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +116 +115 +115 +119 +119 +126 +125 +126 +129 +129 +134 +133 +133 +139 +139 +143 +144 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +165 +165 +164 +169 +169 +173 +173 +173 +174 +175 +179 +179 +178 +182 +183 +184 +185 +185 +188 +188 +191 +191 +192 +194 +194 +197 +196 +198 +198 +198 +201 +200 +200 +200 +200 +202 +202 +202 +202 +202 +205 +204 +205 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +206 +206 +206 +204 +204 +204 +204 +205 +204 +204 +204 +202 +202 +201 +201 +201 +201 +200 +199 +198 +197 +196 +196 +194 +195 +190 +190 +191 +188 +188 +185 +185 +184 +183 +183 +179 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +162 +161 +161 +157 +157 +150 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +134 +133 +129 +130 +125 +126 +126 +120 +119 +115 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +64 +59 +59 +58 +55 +55 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +32 +27 +27 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +14 +14 +14 +14 +13 +13 +14 +13 +13 +14 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +46 +47 +47 +50 +50 +54 +55 +54 +59 +59 +65 +64 +65 +68 +69 +72 +72 +72 +77 +76 +82 +82 +82 +86 +86 +90 +90 +96 +96 +95 +100 +100 +106 +106 +106 +109 +110 +116 +116 +115 +119 +119 +126 +126 +125 +129 +129 +133 +133 +134 +139 +140 +143 +143 +148 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +182 +183 +185 +185 +188 +188 +189 +191 +190 +195 +194 +195 +196 +196 +198 +198 +199 +200 +201 +200 +200 +200 +203 +202 +204 +205 +204 +204 +205 +207 +207 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +203 +203 +200 +200 +200 +200 +200 +198 +198 +197 +196 +196 +194 +195 +191 +190 +190 +189 +189 +184 +184 +185 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +144 +139 +139 +133 +133 +130 +129 +130 +125 +125 +120 +119 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +101 +96 +96 +90 +90 +90 +86 +86 +82 +82 +77 +76 +77 +72 +72 +68 +68 +68 +64 +64 +58 +59 +58 +55 +55 +50 +50 +51 +47 +46 +42 +43 +43 +40 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +25 +25 +25 +22 +21 +19 +19 +19 +17 +17 +16 +15 +15 +15 +15 +13 +13 +13 +12 +13 +14 +13 +13 +14 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +13 +14 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +43 +46 +47 +47 +51 +51 +55 +55 +54 +58 +58 +64 +64 +64 +69 +68 +72 +72 +77 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +109 +110 +115 +115 +116 +120 +119 +126 +125 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +179 +183 +183 +183 +184 +185 +185 +184 +185 +189 +188 +190 +191 +191 +194 +194 +196 +197 +197 +199 +198 +200 +200 +200 +200 +201 +202 +202 +204 +204 +204 +204 +204 +204 +204 +204 +206 +206 +206 +206 +207 +206 +206 +206 +207 +206 +206 +207 +206 +206 +204 +204 +204 +204 +205 +203 +202 +202 +200 +200 +201 +200 +200 +198 +199 +197 +197 +197 +195 +195 +191 +190 +188 +188 +189 +185 +185 +182 +183 +183 +178 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +160 +161 +161 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +129 +126 +125 +120 +119 +120 +115 +116 +110 +110 +110 +106 +106 +100 +100 +97 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +69 +68 +64 +64 +58 +58 +58 +55 +55 +51 +50 +48 +47 +47 +43 +43 +41 +41 +41 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +26 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +12 +14 +13 +13 +14 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +14 +14 +13 +13 +14 +13 +13 +13 +13 +14 +14 +13 +15 +15 +15 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +46 +51 +50 +55 +54 +54 +59 +58 +64 +64 +65 +68 +68 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +91 +96 +96 +100 +100 +106 +106 +106 +110 +109 +115 +115 +116 +119 +120 +125 +125 +125 +129 +129 +133 +133 +134 +139 +139 +143 +143 +144 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +169 +169 +169 +173 +173 +175 +175 +175 +178 +178 +183 +183 +183 +185 +184 +188 +189 +190 +190 +191 +194 +194 +197 +197 +196 +198 +198 +198 +199 +199 +200 +200 +201 +201 +201 +202 +202 +204 +204 +204 +205 +205 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +204 +204 +204 +204 +205 +203 +202 +200 +200 +200 +200 +200 +199 +198 +196 +196 +196 +194 +195 +191 +190 +190 +188 +188 +185 +185 +185 +183 +183 +178 +179 +179 +175 +174 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +133 +133 +134 +129 +129 +125 +125 +120 +119 +119 +116 +116 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +83 +76 +76 +72 +72 +68 +68 +68 +64 +64 +58 +58 +58 +55 +54 +55 +54 +54 +51 +51 +46 +47 +47 +43 +43 +41 +41 +39 +37 +36 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +21 +21 +21 +19 +19 +17 +17 +18 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +13 +13 +14 +14 +13 +13 +14 +14 +13 +14 +13 +13 +13 +13 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +15 +15 +15 +17 +17 +19 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +30 +31 +33 +33 +37 +37 +40 +41 +41 +43 +43 +47 +48 +47 +51 +50 +55 +55 +55 +58 +58 +64 +64 +65 +68 +68 +72 +71 +73 +76 +76 +82 +82 +87 +86 +86 +90 +90 +96 +96 +96 +100 +100 +100 +100 +100 +105 +105 +110 +110 +110 +116 +115 +119 +120 +120 +125 +125 +129 +130 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +166 +168 +169 +173 +173 +175 +175 +175 +178 +179 +182 +183 +183 +185 +185 +185 +185 +185 +189 +188 +190 +190 +191 +195 +195 +196 +196 +197 +198 +199 +200 +200 +200 +200 +201 +203 +203 +204 +204 +204 +204 +204 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +198 +197 +196 +194 +195 +194 +191 +191 +188 +188 +185 +185 +184 +183 +183 +179 +178 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +144 +143 +143 +139 +139 +133 +134 +133 +129 +129 +125 +125 +125 +120 +119 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +76 +76 +76 +72 +72 +68 +68 +68 +65 +64 +59 +58 +56 +54 +54 +51 +51 +47 +47 +46 +43 +43 +41 +41 +40 +37 +37 +37 +37 +37 +33 +33 +31 +31 +31 +27 +28 +25 +25 +22 +21 +21 +19 +19 +17 +17 +17 +15 +15 +16 +15 +15 +13 +13 +12 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +13 +13 +12 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +36 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +51 +54 +55 +58 +58 +65 +64 +64 +68 +68 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +101 +106 +106 +110 +109 +116 +116 +116 +119 +119 +125 +125 +125 +129 +129 +130 +130 +129 +133 +134 +139 +139 +140 +143 +143 +147 +147 +149 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +173 +173 +173 +175 +175 +179 +178 +179 +182 +182 +185 +185 +188 +189 +189 +191 +190 +194 +194 +194 +196 +196 +198 +198 +198 +200 +200 +200 +200 +200 +202 +202 +204 +204 +205 +205 +205 +206 +206 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +204 +205 +204 +205 +204 +202 +202 +200 +200 +200 +200 +201 +198 +199 +197 +196 +197 +194 +195 +191 +191 +190 +188 +188 +185 +185 +184 +183 +183 +179 +179 +178 +175 +174 +173 +172 +173 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +151 +147 +147 +143 +143 +143 +140 +139 +134 +133 +133 +129 +129 +125 +125 +126 +120 +120 +115 +115 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +74 +68 +68 +65 +65 +59 +58 +58 +54 +55 +51 +50 +50 +47 +46 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +13 +13 +13 +13 +14 +13 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +13 +13 +13 +12 +15 +15 +18 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +41 +41 +41 +43 +42 +47 +46 +51 +51 +50 +55 +55 +58 +58 +58 +65 +64 +68 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +100 +100 +100 +106 +106 +110 +110 +109 +116 +116 +119 +119 +120 +126 +125 +129 +129 +129 +133 +133 +139 +140 +140 +143 +143 +147 +147 +152 +151 +151 +157 +157 +161 +161 +161 +165 +165 +165 +165 +165 +169 +169 +172 +172 +173 +175 +175 +179 +178 +181 +182 +183 +185 +185 +188 +188 +188 +190 +191 +194 +195 +195 +196 +196 +199 +198 +198 +200 +201 +200 +200 +201 +202 +202 +204 +204 +204 +205 +205 +206 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +204 +205 +205 +204 +204 +202 +202 +200 +200 +201 +201 +200 +199 +199 +196 +196 +197 +194 +194 +195 +195 +195 +191 +191 +189 +188 +189 +185 +184 +183 +183 +183 +179 +178 +175 +175 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +141 +133 +133 +130 +129 +125 +125 +126 +119 +119 +116 +116 +116 +110 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +88 +86 +86 +82 +82 +76 +76 +77 +72 +72 +69 +69 +69 +64 +64 +64 +64 +64 +59 +58 +55 +55 +55 +51 +51 +47 +47 +43 +43 +43 +41 +41 +36 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +20 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +13 +13 +14 +14 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +14 +13 +14 +14 +14 +14 +13 +12 +15 +15 +17 +17 +17 +19 +20 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +50 +51 +54 +54 +58 +59 +59 +64 +64 +68 +68 +68 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +106 +106 +109 +110 +110 +115 +116 +119 +120 +120 +126 +126 +129 +129 +133 +133 +133 +139 +139 +143 +143 +143 +147 +147 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +168 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +183 +183 +184 +185 +188 +189 +189 +191 +191 +194 +194 +195 +197 +197 +198 +198 +200 +201 +200 +200 +200 +203 +202 +203 +204 +204 +205 +204 +205 +206 +206 +207 +207 +206 +206 +206 +206 +206 +207 +207 +207 +206 +206 +205 +205 +205 +204 +204 +202 +202 +202 +201 +201 +200 +200 +201 +198 +198 +197 +196 +196 +195 +195 +191 +190 +191 +188 +189 +185 +185 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +152 +147 +147 +143 +143 +140 +139 +140 +134 +133 +130 +129 +129 +126 +125 +125 +126 +126 +120 +119 +115 +116 +116 +115 +115 +110 +109 +110 +106 +106 +100 +100 +95 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +82 +76 +76 +72 +73 +73 +69 +68 +64 +65 +59 +58 +58 +55 +54 +50 +51 +51 +46 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +14 +14 +14 +13 +13 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +14 +14 +14 +14 +14 +14 +13 +13 +15 +15 +17 +17 +17 +19 +19 +21 +21 +26 +25 +25 +27 +27 +31 +31 +31 +33 +33 +33 +33 +33 +37 +37 +41 +40 +41 +43 +43 +46 +46 +47 +51 +50 +55 +55 +58 +59 +58 +65 +64 +68 +68 +68 +72 +72 +72 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +92 +96 +96 +100 +100 +106 +105 +106 +110 +109 +115 +116 +116 +119 +120 +119 +120 +120 +126 +125 +129 +129 +130 +133 +133 +139 +139 +141 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +172 +173 +175 +175 +175 +179 +179 +183 +183 +184 +184 +184 +189 +189 +188 +189 +189 +190 +191 +191 +191 +191 +195 +195 +197 +196 +197 +199 +198 +200 +200 +200 +200 +201 +202 +202 +205 +204 +204 +205 +204 +206 +206 +207 +206 +206 +207 +206 +205 +207 +206 +207 +206 +206 +206 +206 +204 +204 +205 +204 +204 +202 +202 +201 +200 +200 +200 +200 +199 +199 +198 +196 +196 +195 +194 +194 +190 +191 +189 +188 +188 +184 +184 +183 +183 +182 +179 +178 +175 +174 +173 +173 +173 +169 +169 +165 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +140 +141 +133 +133 +129 +129 +125 +125 +125 +119 +119 +115 +116 +116 +109 +110 +110 +110 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +87 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +65 +58 +58 +59 +54 +54 +51 +51 +50 +47 +46 +43 +43 +41 +41 +41 +37 +37 +33 +33 +33 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +14 +13 +13 +12 +13 +14 +13 +14 +13 +14 +13 +14 +13 +14 +14 +13 +14 +13 +13 +14 +13 +14 +14 +13 +13 +13 +13 +14 +13 +13 +13 +13 +15 +15 +15 +17 +17 +17 +17 +17 +19 +19 +21 +21 +21 +25 +25 +27 +27 +28 +31 +31 +33 +32 +37 +37 +37 +41 +40 +43 +43 +43 +47 +47 +47 +46 +47 +50 +51 +55 +55 +55 +59 +59 +64 +64 +66 +68 +68 +72 +72 +76 +76 +76 +82 +82 +82 +82 +82 +86 +86 +86 +86 +86 +90 +90 +95 +96 +96 +100 +100 +106 +106 +107 +110 +110 +116 +116 +119 +120 +119 +125 +125 +129 +129 +129 +134 +134 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +175 +179 +179 +183 +182 +182 +185 +185 +188 +189 +188 +191 +191 +195 +194 +197 +196 +197 +199 +199 +200 +200 +201 +200 +200 +202 +202 +202 +204 +204 +205 +204 +204 +206 +206 +206 +206 +207 +207 +206 +206 +206 +207 +206 +206 +206 +207 +204 +204 +204 +205 +204 +202 +203 +202 +201 +200 +200 +200 +201 +198 +198 +197 +196 +197 +195 +194 +190 +191 +188 +189 +189 +184 +185 +182 +183 +182 +179 +179 +175 +175 +175 +173 +173 +169 +168 +169 +165 +165 +161 +161 +159 +157 +157 +151 +151 +147 +147 +147 +143 +144 +139 +139 +139 +133 +133 +133 +133 +134 +129 +129 +125 +126 +125 +120 +120 +116 +116 +116 +109 +109 +106 +106 +99 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +61 +57 +58 +54 +54 +50 +50 +51 +47 +47 +42 +43 +43 +41 +41 +37 +37 +37 +33 +33 +30 +31 +31 +27 +27 +25 +25 +21 +21 +21 +19 +19 +17 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +13 +13 +13 +14 +13 +14 +13 +13 +14 +13 +13 +14 +14 +14 +14 +14 +13 +13 +13 +13 +13 +13 +13 +13 +13 +13 +15 +15 +17 +17 +18 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +32 +33 +33 +37 +37 +41 +41 +41 +43 +43 +47 +47 +48 +51 +50 +55 +55 +58 +58 +58 +64 +64 +68 +68 +68 +72 +72 +72 +73 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +95 +96 +96 +100 +100 +105 +106 +106 +110 +110 +116 +115 +115 +120 +119 +125 +126 +126 +129 +129 +133 +134 +133 +139 +140 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +179 +179 +183 +183 +184 +185 +189 +189 +188 +191 +191 +194 +194 +194 +196 +196 +199 +199 +199 +201 +200 +201 +200 +200 +203 +202 +204 +204 +205 +204 +205 +207 +207 +207 +206 +206 +206 +206 +206 +206 +206 +206 +207 +206 +207 +206 +205 +205 +205 +204 +204 +203 +203 +201 +200 +201 +200 +200 +198 +198 +196 +197 +197 +195 +194 +191 +190 +190 +188 +188 +189 +189 +188 +184 +185 +182 +183 +183 +178 +179 +175 +175 +176 +173 +173 +169 +168 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +151 +151 +151 +147 +147 +143 +143 +143 +139 +139 +134 +134 +130 +129 +130 +125 +125 +119 +119 +119 +115 +115 +110 +109 +110 +106 +106 +100 +100 +100 +96 +96 +90 +90 +90 +86 +86 +82 +82 +76 +76 +76 +72 +72 +68 +68 +68 +65 +65 +59 +59 +59 +55 +54 +51 +51 +51 +47 +46 +43 +43 +43 +41 +40 +37 +36 +33 +33 +32 +31 +31 +27 +27 +27 +25 +25 +21 +21 +21 +19 +19 +16 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +14 +13 +14 +14 +13 +14 +14 +14 +14 +14 +13 +13 +14 +14 +13 +13 +14 +14 +14 +13 +13 +13 +14 +13 +13 +14 +13 +13 +15 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +32 +37 +37 +41 +41 +43 +43 +43 +46 +47 +51 +51 +50 +55 +54 +54 +55 +55 +58 +58 +65 +64 +65 +68 +68 +72 +72 +76 +76 +76 +82 +82 +86 +86 +86 +90 +90 +96 +96 +96 +100 +100 +106 +106 +105 +110 +110 +115 +116 +116 +119 +120 +126 +126 +129 +130 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +175 +175 +175 +178 +178 +182 +183 +183 +184 +185 +189 +188 +189 +190 +191 +194 +195 +194 +196 +196 +199 +199 +198 +201 +200 +201 +200 +203 +202 +202 +204 +204 +204 +204 +204 +207 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +204 +204 +203 +203 +202 +201 +200 +200 +200 +201 +198 +198 +198 +198 +198 +196 +197 +194 +194 +194 +190 +190 +188 +188 +186 +185 +185 +183 +183 +178 +179 +178 +175 +175 +172 +173 +173 +169 +169 +169 +169 +169 +165 +165 +161 +161 +161 +157 +157 +151 +151 +148 +147 +147 +143 +143 +139 +140 +139 +133 +133 +129 +130 +129 +125 +126 +120 +120 +119 +116 +116 +110 +110 +111 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +82 +82 +83 +76 +76 +73 +72 +72 +68 +68 +64 +64 +65 +58 +58 +54 +55 +51 +51 +50 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +18 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +14 +13 +13 +13 +14 +13 +14 +13 +14 +14 +13 +13 +14 +13 +13 +14 +14 +14 +13 +14 +13 +13 +13 +14 +13 +13 +15 +15 +15 +17 +17 +19 +19 +20 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +33 +37 +37 +36 +37 +37 +41 +41 +43 +43 +43 +47 +47 +50 +51 +54 +54 +54 +58 +59 +64 +65 +64 +69 +68 +73 +72 +72 +76 +76 +82 +82 +82 +86 +86 +91 +90 +90 +96 +96 +100 +100 +106 +105 +106 +110 +110 +115 +115 +116 +119 +120 +125 +125 +126 +129 +130 +134 +133 +133 +140 +139 +143 +143 +144 +147 +147 +151 +151 +156 +157 +157 +161 +161 +165 +165 +165 +169 +169 +173 +173 +173 +175 +175 +179 +178 +179 +183 +183 +185 +185 +184 +188 +189 +191 +190 +195 +194 +194 +197 +196 +198 +198 +198 +200 +200 +201 +200 +201 +202 +202 +205 +204 +204 +205 +205 +206 +207 +207 +207 +207 +206 +207 +206 +206 +207 +206 +206 +206 +206 +206 +204 +204 +204 +204 +204 +202 +203 +200 +201 +200 +201 +200 +198 +197 +200 +197 +197 +194 +194 +190 +190 +191 +189 +189 +185 +185 +185 +183 +183 +183 +182 +183 +179 +179 +175 +175 +175 +173 +173 +169 +169 +166 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +130 +126 +126 +120 +119 +115 +116 +115 +110 +110 +106 +106 +105 +100 +100 +96 +96 +96 +90 +90 +86 +86 +86 +82 +82 +76 +76 +76 +72 +72 +69 +68 +65 +64 +64 +58 +58 +55 +55 +55 +50 +51 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +33 +32 +33 +31 +31 +27 +27 +26 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +13 +12 +13 +13 +14 +14 +14 +13 +13 +13 +13 +14 +13 +13 +14 +14 +13 +14 +14 +13 +13 +14 +13 +13 +13 +13 +13 +13 +14 +13 +15 +16 +15 +17 +16 +19 +19 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +31 +31 +31 +33 +33 +37 +37 +37 +41 +40 +43 +43 +47 +47 +46 +51 +51 +54 +55 +54 +59 +59 +64 +64 +64 +69 +68 +72 +72 +73 +76 +76 +82 +82 +83 +86 +86 +90 +90 +93 +96 +96 +100 +99 +106 +106 +106 +110 +110 +116 +116 +115 +119 +120 +125 +125 +126 +129 +130 +134 +133 +133 +139 +139 +143 +143 +147 +147 +147 +151 +151 +157 +157 +157 +161 +161 +165 +165 +165 +169 +168 +173 +173 +173 +175 +175 +179 +179 +179 +182 +182 +185 +185 +188 +188 +189 +190 +191 +194 +195 +195 +197 +197 +199 +198 +198 +200 +200 +201 +201 +200 +202 +203 +204 +204 +205 +204 +204 +206 +207 +206 +207 +206 +206 +207 +206 +206 +207 +207 +206 +206 +206 +207 +205 +204 +204 +204 +205 +202 +202 +200 +200 +200 +200 +200 +198 +198 +196 +197 +197 +194 +194 +191 +191 +191 +188 +189 +189 +188 +189 +185 +184 +182 +182 +183 +179 +179 +175 +175 +173 +173 +173 +169 +169 +164 +165 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +147 +143 +143 +139 +139 +139 +133 +133 +129 +129 +125 +126 +126 +120 +119 +115 +115 +116 +110 +110 +106 +106 +106 +100 +100 +96 +96 +96 +90 +89 +86 +86 +86 +82 +82 +76 +77 +73 +72 +73 +68 +68 +64 +64 +64 +59 +59 +55 +54 +54 +51 +50 +47 +47 +47 +43 +43 +41 +41 +41 +37 +37 +32 +33 +32 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +19 +17 +17 +15 +15 +15 +15 +15 +13 +13 +14 +12 +14 +14 +13 +14 +14 +13 +14 +14 +14 +13 +14 +13 +13 +13 +13 +14 +13 +14 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +13 +15 +16 +15 +17 +17 +19 +19 +19 +21 +21 +21 +21 +21 +25 +25 +27 +27 +27 +31 +31 +33 +33 +34 +37 +37 +41 +41 +43 +42 +43 +47 +47 +50 +50 +51 +54 +54 +58 +58 +59 +65 +65 +69 +68 +69 +72 +72 +76 +76 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +100 +100 +105 +106 +110 +110 +110 +116 +116 +119 +119 +120 +125 +125 +129 +129 +134 +134 +133 +139 +139 +143 +143 +143 +147 +147 +151 +151 +151 +157 +157 +161 +161 +161 +165 +165 +169 +169 +169 +173 +173 +175 +175 +178 +179 +179 +182 +183 +185 +184 +184 +189 +189 +190 +191 +190 +195 +195 +196 +197 +196 +198 +199 +200 +201 +201 +201 +200 +202 +203 +205 +204 +205 +204 +204 +206 +206 +207 +206 +206 +207 +206 +206 +206 +207 +206 +206 +206 +206 +206 +206 +206 +207 +204 +204 +205 +205 +202 +203 +202 +200 +201 +200 +200 +200 +198 +199 +199 +199 +199 +196 +197 +195 +194 +194 +191 +190 +189 +188 +184 +185 +185 +183 +183 +178 +179 +179 +174 +175 +173 +173 +173 +169 +169 +165 +164 +165 +161 +161 +157 +157 +157 +151 +151 +147 +147 +143 +143 +143 +140 +139 +133 +134 +133 +129 +129 +125 +125 +125 +119 +120 +115 +116 +116 +109 +110 +106 +106 +106 +100 +100 +96 +96 +91 +90 +90 +86 +86 +82 +82 +82 +76 +76 +72 +72 +73 +68 +68 +64 +65 +64 +59 +58 +54 +55 +55 +51 +51 +47 +47 +43 +43 +43 +41 +41 +37 +37 +37 +33 +33 +31 +31 +31 +27 +27 +25 +25 +25 +21 +21 +19 +19 +20 +17 +17 +15 +15 +15 +15 +15 +13 +13 +12 +13 +13 +14 +13 +13 +14 +14 +13 +13 +13 +13 +14 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +14 +13 +14 +13 +13 +13 +14 +14 +13 +15 +15 +15 +15 +15 +17 +17 +17 +19 +19 +21 +21 +25 +25 +25 +27 +27 +31 +31 +31 +33 +33 +37 +37 +37 +41 +41 +43 +43 +43 +47 +47 +51 +51 +51 +55 +54 +58 +58 +64 +64 +64 +68 +69 +72 +72 +72 +76 +77 +82 +82 +82 +86 +86 +90 +90 +90 +96 +96 +100 +99 +100 +105 +106 +110 +110 +116 +116 +115 +119 +119 +125 +126 +125 +129 +129 +130 +129 +129 +133 +133 +139 +139 +139 +143 +143 +147 +147 +148 +151 +151 +157 +157 +161 +161 +161 +165 +165 diff --git a/Old Matlab Interface/iso_incoming.m b/Old Matlab Interface/iso_incoming.m new file mode 100644 index 00000000..9705f823 --- /dev/null +++ b/Old Matlab Interface/iso_incoming.m @@ -0,0 +1,5 @@ +command = '3'; + +driverLocation = 'c:\libusbk\examples\open-device\debug\win32'; +command = [driverLocation '\open-device "03eb" "a000" "' command '" "NULL" "NULL" "NULL" "NULL"'] +system(command); \ No newline at end of file diff --git a/Old Matlab Interface/keep_in_sync.m b/Old Matlab Interface/keep_in_sync.m new file mode 100644 index 00000000..083c5514 --- /dev/null +++ b/Old Matlab Interface/keep_in_sync.m @@ -0,0 +1,11 @@ +if libk_error + dropped_packets = dropped_packets + 1; + if (dropped_packets > 10) + break + %resynchronise + %dropped_packets = 0; + %waveform_exists = 0; + end +else + dropped_packets = 4*dropped_packets/5; +end \ No newline at end of file diff --git a/Old Matlab Interface/launchgui.m b/Old Matlab Interface/launchgui.m new file mode 100644 index 00000000..3db346e8 --- /dev/null +++ b/Old Matlab Interface/launchgui.m @@ -0,0 +1,73 @@ +global gui_scope_running +global gui_cursor_mode +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global scope_window_min +global gui_awg_waveform +global gui_awg_amplitude +global gui_awg_frequency +global gui_vo +global gui_ro +global gui_static_text_scope +global CH1_AC +global CH2_AC + +global gui_awg_waveform_aux +global gui_awg_amplitude_aux +global gui_awg_frequency_aux + +global scope_window_max + + +scope_window_min = 0; +scope_window_max = 5; + +set_gain_auto; + +global mode7_func +mode7_func = 'V'; +global Rtest; +Rtest = 1; +global scope_filter_value +scope_filter_value = 1; +global scope_filter_enabled +scope_filter_enabled = 0; +gui_scope_running = 1; +gui_cursor_mode = 1; +gui_static_text_scope = 0; + +gui_vert_cursor_a_pos = 0; +gui_vert_cursor_b_pos = 0; +gui_hori_cursor_a_pos = scope_window_min; +gui_hori_cursor_b_pos = scope_window_min; + +gui_awg_waveform = 'sin(linspace(0,2*pi,128))'; +gui_awg_amplitude = '3.3'; +gui_awg_frequency = '50' + +gui_awg_waveform_aux = 'sin(linspace(0,2*pi,128))'; +gui_awg_amplitude_aux = '3.3'; +gui_awg_frequency_aux = '50' + +gui_vo = 0; +gui_ro = 1000; + +CH1_AC = 0; +CH2_AC = 0; + +global dig0 +global dig1 +global dig2 +global dig3 + +dig0 = 0; +dig1 = 0; +dig2 = 0; +dig3 = 0; + +global scope_window_time +scope_window_time = 1 + +first_gui \ No newline at end of file diff --git a/Old Matlab Interface/lcdtoggle.m b/Old Matlab Interface/lcdtoggle.m new file mode 100644 index 00000000..6ce771ae --- /dev/null +++ b/Old Matlab Interface/lcdtoggle.m @@ -0,0 +1,7 @@ +function [] = lcdtoggle(onoff); + +mex_usb_send_control('40', 'a1', dec2hex(onoff), '0', '0', '0'); + +% driverLocation = 'c:\libusbk\examples\open-device\debug\win32'; +% command = [driverLocation '\open-device "03eb" "a000" "' command '" "' num2str(onoff) '" "NULL" "NULL" "NULL"'] +% system(command); \ No newline at end of file diff --git a/Old Matlab Interface/make_waveforms.m b/Old Matlab Interface/make_waveforms.m new file mode 100644 index 00000000..d75de892 --- /dev/null +++ b/Old Matlab Interface/make_waveforms.m @@ -0,0 +1,7 @@ +x = linspace(0, 2*pi, 512) +y = 127 * sin(x) + 128 +y = uint8(y) + +for i = 1:512 + fprintf('%d\t', y(i)); +end \ No newline at end of file diff --git a/Old Matlab Interface/mexHW.m b/Old Matlab Interface/mexHW.m new file mode 100644 index 00000000..5178aa52 --- /dev/null +++ b/Old Matlab Interface/mexHW.m @@ -0,0 +1,5 @@ +cool=1; +cool = 'cock'; + +mex helloworld.cpp +[a, b, c, d] = helloworld(cool); \ No newline at end of file diff --git a/Old Matlab Interface/mex_usb_init.m b/Old Matlab Interface/mex_usb_init.m new file mode 100644 index 00000000..cf30a774 --- /dev/null +++ b/Old Matlab Interface/mex_usb_init.m @@ -0,0 +1,5 @@ +function [] = mex_usb_init(VID, PID) + +global usb_handle + +usb_handle = USB_INIT(VID, PID); \ No newline at end of file diff --git a/Old Matlab Interface/mex_usb_iso_init.m b/Old Matlab Interface/mex_usb_iso_init.m new file mode 100644 index 00000000..e4d69f15 --- /dev/null +++ b/Old Matlab Interface/mex_usb_iso_init.m @@ -0,0 +1,14 @@ +clear all + +compile + +global usb_handle +if ~length(usb_handle) + warning('USB Handle not initialised. Initialising!') + mex_usb_init('03eb', 'a000') +end + +%mex USB_ISO_INIT.c -Iincludes -llibusbK -Lbin\lib\amd64 +%USB_ISO_INIT(usb_handle) +[stm_handle] = USB_ISO_INIT(usb_handle) +%USB_ISO_LOOP(usb_handle, isoCtx, ovlkHandle, ovlPool, isoBuffer, uint8(0)) \ No newline at end of file diff --git a/Old Matlab Interface/mex_usb_iso_loop.m b/Old Matlab Interface/mex_usb_iso_loop.m new file mode 100644 index 00000000..f434d15f --- /dev/null +++ b/Old Matlab Interface/mex_usb_iso_loop.m @@ -0,0 +1,117 @@ +%mex USB_ISO_LOOP.c -Iincludes -llibusbK -Lbin\lib\amd64 +%clear all + +global usb_handle +global scope_gain_0 +global scope_gain_1 +global scope_window_time +global scope_window_max +global scope_window_min +global scope_mode +global gui_scope_running + +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global gui_cursor_mode +global saved_waveform_ch1 +global saved_waveform_ch2 + +global refreshrate +global refreshrate_temp +global waveform_exists + +global trigger + +global sem_avail + +trigger = struct('l', 0, 'h', 0, 'state', 0, 'begin', 1, 'enabled', 0); + +dotheplot + +if ~length(usb_handle) + warning('USB Handle not initialised. Initialising!') + mex_usb_init('03eb', 'a000') +end + +[stm_handle] = USB_ISO_INIT(usb_handle) + +refreshrate = 4; +refreshrate_temp = refreshrate; + +if(isempty(max_n)) + max_n = 10 +end +saved_waveform_ch1 = int8([]); + +if isempty(scope_mode) + error('You didn''t set the scope mode!'); +end + +if isempty(scope_window_time) + error('You didn''t set the window time (x) value!'); +end + +if (scope_window_time < 1/375000) + error('Scope window size is too small!'); +end + +if(scope_mode==0) + if isempty(scope_gain_0) || isempty(scope_gain_1) + error('You didn''t set the gain!'); + end + + if isempty(scope_window_min) + error('You didn''t set the minimum window voltage value!'); + end + + if isempty(scope_window_max) + error('You didn''t set the maximum window voltage value!'); + end +end + +dropped_packets = 0; +if(isempty(waveform_exists)) + waveform_exists = 0; +end + +global extra_goes; +extra_goes = 0; + +sem_avail = 0; +timer_30ms = timer ('TimerFcn', 'timer30ms_callback', 'Period', 30e-3, 'ExecutionMode', 'fixedRate'); +start(timer_30ms); + +for n=1:max_n + %[transfer_contents_0] = USB_ISO_LOOP(usb_handle, isoCtx_0, ovlkHandle_0, ovlPool, isoBuffer, uint8(0)); + + while(sem_avail==0) + pause(0); + %timer_30ms; + end + sem_avail = sem_avail - 1; + [transfer_contents_0, libk_error] = USB_ISO_LOOP(usb_handle, stm_handle); + keep_in_sync + if scope_mode == 7 + transfer_contents_0 = double(transfer_contents_0); + end + displaypacket(transfer_contents_0) + updatescopeaxes + + %[transfer_contents_1] = USB_ISO_LOOP(usb_handle, isoCtx_1, ovlkHandle_1, ovlPool, isoBuffer, uint8(1)); + + while(sem_avail==0) + pause(0.001); + end + sem_avail = sem_avail - 1; + [transfer_contents_1, libk_error] = USB_ISO_LOOP(usb_handle, stm_handle); + keep_in_sync + if scope_mode == 7 + transfer_contents_0 = double(transfer_contents_0); + end + displaypacket(transfer_contents_1) + updatescopeaxes +end + +crash_recover \ No newline at end of file diff --git a/Old Matlab Interface/mex_usb_send_control.m b/Old Matlab Interface/mex_usb_send_control.m new file mode 100644 index 00000000..77a9c0fe --- /dev/null +++ b/Old Matlab Interface/mex_usb_send_control.m @@ -0,0 +1,8 @@ +function [OUT] = mex_usb_send_control( RequestType, Request, Value, Index, Length, LDATA) + +global usb_handle +if ~length(usb_handle) + warning('USB Handle not initialised. Initialising!') + mex_usb_init('03eb', 'a000') +end +OUT = USB_CTRL_SEND(usb_handle, RequestType, Request, Value, Index, Length, LDATA); \ No newline at end of file diff --git a/Old Matlab Interface/plotcursors.m b/Old Matlab Interface/plotcursors.m new file mode 100644 index 00000000..387016ca --- /dev/null +++ b/Old Matlab Interface/plotcursors.m @@ -0,0 +1,50 @@ +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global scope_window_time +global scope_window_max +global scope_window_min + +global gui_cursor_mode +global gui_axes +global scope_mode +global gui_delay + +global fastmode + +delay_sec = get(gui_delay, 'Max') - get(gui_delay, 'Value') + +gui_cursor_mode; + +if(scope_mode==2) + switch(gui_cursor_mode) + case 1 + plot(gui_axes, taxis_ch1, cool_waveform_ch1, 'y', taxis_ch2, cool_waveform_ch2, 'c'); + case 2 + plot(gui_axes, taxis_ch1, cool_waveform_ch1, 'y', taxis_ch2, cool_waveform_ch2, 'c', [-scope_window_time-delay_sec, -delay_sec], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time-delay_sec, -delay_sec], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + case 3 + plot(gui_axes, taxis_ch1, cool_waveform_ch1, 'y', taxis_ch2, cool_waveform_ch2, 'c', [gui_vert_cursor_a_pos-delay_sec gui_vert_cursor_a_pos-delay_sec], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos-delay_sec gui_vert_cursor_b_pos-delay_sec], [scope_window_min scope_window_max], 'w:'); + case 4 + plot(gui_axes, taxis_ch1, cool_waveform_ch1, 'y', taxis_ch2, cool_waveform_ch2, 'c', [gui_vert_cursor_a_pos-delay_sec gui_vert_cursor_a_pos-delay_sec], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos-delay_sec gui_vert_cursor_b_pos-delay_sec], [scope_window_min scope_window_max], 'w:', [-scope_window_time-delay_sec -delay_sec], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time-delay_sec -delay_sec], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + otherwise + error('Gui_axes is in an invalid state'); + end +else + switch(gui_cursor_mode) + case 1 + plot(gui_axes, taxis, cool_waveform, 'y'); + case 2 + plot(gui_axes, taxis, cool_waveform, 'y', [-scope_window_time-delay_sec, -delay_sec], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time-delay_sec, -delay_sec], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + case 3 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos-delay_sec gui_vert_cursor_a_pos-delay_sec], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos-delay_sec gui_vert_cursor_b_pos-delay_sec], [scope_window_min scope_window_max], 'w:'); + case 4 + plot(gui_axes, taxis, cool_waveform, 'y', [gui_vert_cursor_a_pos-delay_sec gui_vert_cursor_a_pos-delay_sec], [scope_window_min scope_window_max], 'w', [gui_vert_cursor_b_pos-delay_sec gui_vert_cursor_b_pos-delay_sec], [scope_window_min scope_window_max], 'w:', [-scope_window_time-delay_sec -delay_sec], [gui_hori_cursor_a_pos gui_hori_cursor_a_pos], 'w', [-scope_window_time-delay_sec -delay_sec], [gui_hori_cursor_b_pos gui_hori_cursor_b_pos], 'w:'); + otherwise + error('Gui_axes is in an invalid state'); + end +end + +set(gui_axes, 'Ylim', [scope_window_min, scope_window_max], 'Xlim', [-scope_window_time-delay_sec, -delay_sec], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1], 'ButtonDownFcn', 'axes1_ButtonDownFcn'); +%set(gui_axes, ); +%disp('SET!!!') \ No newline at end of file diff --git a/Old Matlab Interface/plotiso.m b/Old Matlab Interface/plotiso.m new file mode 100644 index 00000000..9dfcb4d4 --- /dev/null +++ b/Old Matlab Interface/plotiso.m @@ -0,0 +1,17 @@ +function [isoLog] = plotiso(mode) + +iso_incoming; + +load('isoLog.txt'); +window = 750; +switch (mode) + case 1 + for n=1:32:((length(isoLog))-window) + plot(isoLog(n:n+window)); + drawnow + pause(0.03); + end + otherwise + plot(isoLog); +end + diff --git a/Old Matlab Interface/plotmem.m b/Old Matlab Interface/plotmem.m new file mode 100644 index 00000000..d8e62241 --- /dev/null +++ b/Old Matlab Interface/plotmem.m @@ -0,0 +1,21 @@ +fid = fopen('C:\users\esposch\documents\output.hex'); + +buffer = 0; + +hexarray = []; + +while (buffer ~= -1) + buffer = fgetl(fid); + hexarray = [hexarray buffer(10:end-2)]; +end + +uintarray = []; + +for n=1:2:length(hexarray) + uintarray = [uintarray hex2dec(hexarray([n n+1]))]; +end + +typecast(uintarray, 'int8') +plot(uintarray); + +fclose(fid); \ No newline at end of file diff --git a/Old Matlab Interface/plotspeedtest.m b/Old Matlab Interface/plotspeedtest.m new file mode 100644 index 00000000..9f1d5321 --- /dev/null +++ b/Old Matlab Interface/plotspeedtest.m @@ -0,0 +1,17 @@ +% hAxes = figure() +% for n=1:1000 +% tic +% %plot(sin(a(n:n+1000))) +% plot(transfer_contents(n:n+100)) +% drawnow +% toc +% end + +hold on +tic +for n=1:10:100000 + plot((n:n+100),(n:n+100).^2); + drawnow + pause(0.01) +end +toc \ No newline at end of file diff --git a/Old Matlab Interface/plotyy_test.m b/Old Matlab Interface/plotyy_test.m new file mode 100644 index 00000000..50d5d46d --- /dev/null +++ b/Old Matlab Interface/plotyy_test.m @@ -0,0 +1,11 @@ +a = 1:100 +b = 101:200 + +for k = 1:100 + plot(1,1) +end +tic +hold on + plot(a,b) + stairs(a,b) +toc \ No newline at end of file diff --git a/Old Matlab Interface/printusb.m b/Old Matlab Interface/printusb.m new file mode 100644 index 00000000..fd54ba80 --- /dev/null +++ b/Old Matlab Interface/printusb.m @@ -0,0 +1,11 @@ +function [] = printusb(inputstring); +if length(inputstring)>21 + error('String too long. Reduce to under 21 chars.') +end + +normalisedString=' '; +normalisedString(1:length(inputstring)) = inputstring; + +driverLocation = 'c:\libusbk\examples\open-device\debug\win32'; +command = [driverLocation '\open-device "' normalisedString '" "1" "03eb" "a000"'] +system(command); \ No newline at end of file diff --git a/Old Matlab Interface/psucal.m b/Old Matlab Interface/psucal.m new file mode 100644 index 00000000..30bd56e2 --- /dev/null +++ b/Old Matlab Interface/psucal.m @@ -0,0 +1,25 @@ +%vdrop = 0 + +% for in = 1:10 +% setpsu(in) +% pause(5) +% end + +% clear all +% clc +% +% ro=22; + +vout22 = [0.38 1.32 2.26 3.25 4.19 5.12 6.12 7.05 7.93 8.94]; +iout22 = vout22/22; + +vout220 = [0.36 1.32 2.25 3.24 4.18 5.12 6.12 7.05 8.00 8.99]; + +vout_oc = [0.41 1.37 2.30 3.29 4.23 5.17 6.16 7.10 8.04 9.04]; + +p_oc = polyfit(vout_oc, 1:10, 1); +polyval(p_oc, 1:10); + +vos_22 = vout_oc - vout22; +p_ios = polyfit(1:10, (22/ro) * vos_22, 1); +polyval(p_ios, 1:10); diff --git a/Old Matlab Interface/psutest_boost.m b/Old Matlab Interface/psutest_boost.m new file mode 100644 index 00000000..b391df84 --- /dev/null +++ b/Old Matlab Interface/psutest_boost.m @@ -0,0 +1,22 @@ +clear all +clc +vex = [5 8 10 12 15]; + +v68 = vex - [4.4 6.75 8.05 9.12 10.29]; +v220 = vex - [4.53 7.14 8.74 10.11 11.97]; +vinf = vex - [4.59 8.40 9.92 10.82 12.98]; + +r68 = (1/68 + 1/250)^-1; +r220 = (1/220 + 1/250)^-1; +rinf = 250; + +magic = 1.5; +mag_exponent = 4; + +c68 = mean(v68./((vex+magic).^mag_exponent)); +c220 = mean(v220./((vex+magic).^mag_exponent)); +cinf = mean(vinf./((vex+magic).^mag_exponent)); + +c68*r68 +c220*r220 +cinf*rinf \ No newline at end of file diff --git a/Old Matlab Interface/resynchronise.m b/Old Matlab Interface/resynchronise.m new file mode 100644 index 00000000..420e7d70 --- /dev/null +++ b/Old Matlab Interface/resynchronise.m @@ -0,0 +1,5 @@ +USB_POOL_FREE(ovlPool); +pause(rand(1)); +mex_usb_init('03eb', 'a000') +[isoCtx_0, isoCtx_1, ovlkHandle_0, ovlkHandle_1, ovlPool, isoBuffer] = USB_ISO_INIT(usb_handle) + diff --git a/Old Matlab Interface/returnempty.m b/Old Matlab Interface/returnempty.m new file mode 100644 index 00000000..000f42e6 --- /dev/null +++ b/Old Matlab Interface/returnempty.m @@ -0,0 +1,2 @@ +function returnval = returnempty() + returnval = []; \ No newline at end of file diff --git a/Old Matlab Interface/samplestoshow_not_on_500.PNG b/Old Matlab Interface/samplestoshow_not_on_500.PNG new file mode 100644 index 00000000..7f2cb1cf Binary files /dev/null and b/Old Matlab Interface/samplestoshow_not_on_500.PNG differ diff --git a/Old Matlab Interface/samplestoshow_on_500.png b/Old Matlab Interface/samplestoshow_on_500.png new file mode 100644 index 00000000..6e1586a0 Binary files /dev/null and b/Old Matlab Interface/samplestoshow_on_500.png differ diff --git a/Old Matlab Interface/scroll_function.m b/Old Matlab Interface/scroll_function.m new file mode 100644 index 00000000..b0da30fb --- /dev/null +++ b/Old Matlab Interface/scroll_function.m @@ -0,0 +1,2 @@ +function [] = scroll_function(varargin) +varargin \ No newline at end of file diff --git a/Old Matlab Interface/seconds_recorded.m b/Old Matlab Interface/seconds_recorded.m new file mode 100644 index 00000000..0f49a779 --- /dev/null +++ b/Old Matlab Interface/seconds_recorded.m @@ -0,0 +1,10 @@ +function [returnval] = seconds_recorded() + +global saved_waveform_ch1 +global scope_mode + +if scope_mode == 6 | scope_mode == 7 + returnval = (length(saved_waveform_ch1)-750)/750000 +else + returnval = (length(saved_waveform_ch1)-750)/375000 +end \ No newline at end of file diff --git a/Old Matlab Interface/set_gain_auto.m b/Old Matlab Interface/set_gain_auto.m new file mode 100644 index 00000000..32d989d5 --- /dev/null +++ b/Old Matlab Interface/set_gain_auto.m @@ -0,0 +1,10 @@ +global scope_mode +global scope_window_min +global scope_window_max + +if scope_mode ~= 7 + gain = autogain(scope_window_min, scope_window_max) + setscopemode(scope_mode, gain, gain) + saved_waveform_ch1 = [] + saved_waveform_ch2 = [] +end \ No newline at end of file diff --git a/Old Matlab Interface/setpsu.m b/Old Matlab Interface/setpsu.m new file mode 100644 index 00000000..7dae927b --- /dev/null +++ b/Old Matlab Interface/setpsu.m @@ -0,0 +1,18 @@ +function [] = setpsu(vo, ro); + +vcc = 3.3; +gain = 4.22; +vdrop = 0; +PER=256; + +psucal +vdrop = polyval(p_oc, vo) + polyval(p_ios,vo) - vo; + +CCA = ((vo + vdrop)*PER)/(vcc*gain); +CCA = uint16(CCA) + +mex_usb_send_control('40', 'a3', dec2hex(CCA), '0', '0', '0'); + +% driverLocation = 'c:\libusbk\examples\open-device\debug\win32'; +% command = [driverLocation '\open-device "03eb" "a000" "' command '" "' num2str(CCA) '" "NULL" "NULL" "NULL"'] +% system(command); \ No newline at end of file diff --git a/Old Matlab Interface/setpsu_boost.m b/Old Matlab Interface/setpsu_boost.m new file mode 100644 index 00000000..b98a9911 --- /dev/null +++ b/Old Matlab Interface/setpsu_boost.m @@ -0,0 +1,12 @@ +function [] = setpsu_boost(vo) +% err = verr(vo, r) +% D = 1 - vi/(vo+err) +% if D>0.75 +% error('PSU DUTY CYCLE TOO LARGE!!! ABORTING!!!') +% end +% D = uint16(D*255) + D = expected_adc(vo) + if D>113 | D<21 + error('PSU DUTY CYCLE TOO LARGE (could underflow on SOF)!!! ABORTING!!!') + end + mex_usb_send_control('40', 'a3', dec2hex(D), '0', '0', '0'); diff --git a/Old Matlab Interface/setscopegain.m b/Old Matlab Interface/setscopegain.m new file mode 100644 index 00000000..ab2a692d --- /dev/null +++ b/Old Matlab Interface/setscopegain.m @@ -0,0 +1,22 @@ +function [] = setscopegain(channel, gain); + + +if(gain~=0.5 & gain~=1 & gain~=2 & gain~=4 & gain~=8 & gain~=16 & gain~=32 & gain~=64) + error('Valid values of gain are 0.5, 1, 2, 4, 8, 16, 32, 64'); +end + +global scope_gain +scope_gain = gain; + +gain_mask = uint8([]); + +%%FIX THIS UP +if (gain == 1/2) + gain_mask = 7*4; +else + gain_mask = log2(gain) * 4; +end + +%fprintf('%s\n', dec2bin(gain_mask,8)); + +mex_usb_send_control('40', 'a6', dec2hex(channel), dec2hex(gain_mask), '0', '0'); \ No newline at end of file diff --git a/Old Matlab Interface/setscopemode.m b/Old Matlab Interface/setscopemode.m new file mode 100644 index 00000000..5fd33a01 --- /dev/null +++ b/Old Matlab Interface/setscopemode.m @@ -0,0 +1,44 @@ +function [] = setscopemode(mode, gain0, gain1); %Mode zero for single channel analog, 1 for single digital, 2 for 2ch analog, 3 for 2ch digital +global scope_mode +scope_mode = mode; + +if(gain0~=0.5 & gain0~=1 & gain0~=2 & gain0~=4 & gain0~=8 & gain0~=16 & gain0~=32 & gain0~=64) + error('Valid values of gain are 0.5, 1, 2, 4, 8, 16, 32, 64'); +end + +if(gain1~=0.5 & gain1~=1 & gain1~=2 & gain1~=4 & gain1~=8 & gain1~=16 & gain1~=32 & gain1~=64) + error('Valid values of gain are 0.5, 1, 2, 4, 8, 16, 32, 64'); +end + + +global scope_gain_0 +scope_gain_0 = gain0; + +global scope_gain_1 +scope_gain_1 = gain1; + + +gain_mask_0 = uint16([]); + +if (gain0 == 1/2) + gain_mask_0 = 7*4; +else + gain_mask_0 = log2(gain0) * 4; +end + +gain_mask_1 = uint16([]); + +if (gain1 == 1/2) + gain_mask_1 = 7*4; +else + gain_mask_1 = log2(gain1) * 4; +end + +gain_mask = gain_mask_0 + 256*gain_mask_1; + + +mex_usb_send_control('40', 'a5', dec2hex(mode), dec2hex(gain_mask), '0', '0'); + +% driverLocation = 'c:\libusbk\examples\open-device\debug\win32'; +% command = [driverLocation '\open-device "03eb" "a000" "' command '" "' num2str(onoff) '" "NULL" "NULL" "NULL"'] +% system(command); \ No newline at end of file diff --git a/Old Matlab Interface/setscopewindowsize.m b/Old Matlab Interface/setscopewindowsize.m new file mode 100644 index 00000000..6008fdd5 --- /dev/null +++ b/Old Matlab Interface/setscopewindowsize.m @@ -0,0 +1,16 @@ +function [] = setscopewindowsize(time,vmin,vmax) +global scope_window_time +global scope_window_min +global scope_window_max + +if (vmax500) + temp_samples = dig_samples(1:length(dig_samples)/500:end); + temp_waveform = logical(bitand(temp_samples,16)); +else + temp_samples = false(1,length(dig_samples)*8); + temp_samples(1:8:length(temp_samples)) = bitand(dig_samples,1); + temp_samples(2:8:length(temp_samples)) = bitand(dig_samples,2); + temp_samples(3:8:length(temp_samples)) = bitand(dig_samples,4); + temp_samples(4:8:length(temp_samples)) = bitand(dig_samples,8); + temp_samples(5:8:length(temp_samples)) = bitand(dig_samples,16); + temp_samples(6:8:length(temp_samples)) = bitand(dig_samples,32); + temp_samples(7:8:length(temp_samples)) = bitand(dig_samples,64); + temp_samples(8:8:length(temp_samples)) = bitand(dig_samples,128); + + temp_waveform = temp_samples(1:length(temp_samples)/500:end); +end +toc + +stairs(temp_waveform); +%b = [bitand(a,128), bitand(a,64), bitand(a,32), bitand(a,16), bitand(a,8), bitand(a,4), bitand(a,2), bitand(a,1)]; +%b(logical(mod(1:500,2))) = true; + diff --git a/Old Matlab Interface/timer30ms_callback.m b/Old Matlab Interface/timer30ms_callback.m new file mode 100644 index 00000000..7c14731c --- /dev/null +++ b/Old Matlab Interface/timer30ms_callback.m @@ -0,0 +1,5 @@ +global sem_avail +sem_avail = sem_avail + 1; +timer_strap(timer_30ms, 30e-3); +%get(timer_30ms, 'AveragePeriod'); +%get(timer_30ms, 'Period'); \ No newline at end of file diff --git a/Old Matlab Interface/timer_strap.m b/Old Matlab Interface/timer_strap.m new file mode 100644 index 00000000..3da91c29 --- /dev/null +++ b/Old Matlab Interface/timer_strap.m @@ -0,0 +1,31 @@ +function timer_strap(t_handle, desired_per) +% %Function timer_strap(), by Christopher Paul Esposito ("Esposch") +% %Make sure you call this during every timer callback, and set the timer's "ExecutionMode" to "FixedRate". +% %Takes timer object t_handle and uses negative feedback to bring the steady state period of t_handle towards desired_per. +% %This means that your code will become CPU-independent, as queuing delay won't affect the period. +% %It will not, however, perfectly account for random variance in delay due to a varying CPU load. +% +% n = 500; %Times between resetting. Higher n means more accuracy (the period between the nth and n+1th execution is not considered!), but also less able to cope with a varying load. Oddly, errors seem to show in realtime application with low n. +% kp = 0.1; %Proportional gain. Well, not really. But it basically works the same way. Research "PID Controllers" to understand how this works (moral of the story: smaller kp prevents indefinite oscillation, but means it takes longer to reach steady state. Above a certain threshold kp, the whole system will diverge and fail). +% real_per = get(t_handle, 'AveragePeriod'); %%Actual (average) time between runs (in real seconds). +% if (get(t_handle, 'TasksExecuted') < n) +% return; +% end +% reference_per = get(t_handle, 'Period'); %%What Matlab has set the period to. +% reference_per = reference_per - kp*(real_per - desired_per); %%Subtracting off the error; negative feedback! +% +% stop(t_handle); %Need to reset everything to write the new period. This means that the last window of data is gone! +% set(t_handle, 'Period', reference_per); +% start(t_handle); + +global extra_goes; +tasks_exec = get(t_handle, 'TasksExecuted') + extra_goes; +average_per = get(t_handle, 'AveragePeriod') * (get(t_handle, 'TasksExecuted') / tasks_exec); + +behind = (average_per - desired_per) * tasks_exec; +if behind>desired_per + global sem_avail + sem_avail = sem_avail + 1; + extra_goes = extra_goes + 1; +end + diff --git a/Old Matlab Interface/tiny_send_auxwf.m b/Old Matlab Interface/tiny_send_auxwf.m new file mode 100644 index 00000000..03679a27 --- /dev/null +++ b/Old Matlab Interface/tiny_send_auxwf.m @@ -0,0 +1,36 @@ +function [] = tiny_send_auxwf(waveform, amplitude, frequency); + +waveform = tiny_wave_conv_aux(waveform, amplitude); +waveform = uint8(waveform); + +wave_length = length(waveform); + +f_invalid = 1; + +valid_clock_div = [1,2,4,8,64,256,1024]; +f0=24e6; + +if(frequency*wave_length)>1e6 + error('Frequency is too high') +end + +for clk_setting = 1:length(valid_clock_div) + f_test = f0 / valid_clock_div(clk_setting); + if (f_test/frequency)<65535 + f_invalid = 0; + break + end +end + +if (f_invalid) + error('Frequency is too low!') +end + +tccper = round(f_test / frequency / wave_length); +tccper = uint16(tccper); + +clk_setting = uint16(clk_setting); + +waveform +mex_usb_send_control('40', 'a2', dec2hex(tccper), dec2hex(clk_setting), dec2hex(wave_length), waveform); + diff --git a/Old Matlab Interface/tiny_send_dig.m b/Old Matlab Interface/tiny_send_dig.m new file mode 100644 index 00000000..0e819efa --- /dev/null +++ b/Old Matlab Interface/tiny_send_dig.m @@ -0,0 +1,6 @@ +function [] = tiny_send_dig(dig1, dig2, dig3, dig4) + +bitmask = dig1 * 8 + dig2 * 4 + dig3 * 2 + dig4; + + +mex_usb_send_control('40', 'a6', dec2hex(bitmask), '0', '0', '0'); diff --git a/Old Matlab Interface/tiny_send_waveform.m b/Old Matlab Interface/tiny_send_waveform.m new file mode 100644 index 00000000..47980eea --- /dev/null +++ b/Old Matlab Interface/tiny_send_waveform.m @@ -0,0 +1,66 @@ +function [] = tiny_send_waveform(waveform, amplitude, frequency); + +global scope_mode +global gui_axes + +offset = 375; +waveform = tiny_wave_conv(waveform, amplitude); +waveform = uint8(waveform); +%waveform; + +wave_length = length(waveform); + +f_invalid = 1; + +valid_clock_div = [1,2,4,8,64,256,1024]; +f0=24e6; + +if(frequency*wave_length)>1e6 + error('Frequency is too high') +end + +for clk_setting = 1:length(valid_clock_div) + f_test = f0 / valid_clock_div(clk_setting); + if (f_test/frequency)<65535 + f_invalid = 0; + break + end +end + +if (f_invalid) + error('Frequency is too low!') +end + +tccper = round(f_test / frequency / wave_length); +tccper = uint16(tccper); + +clk_setting = uint16(clk_setting); +%clk_setting; + +%stairs(uint8(waveform)); + +% wavestring = []; +% for n=1:wave_length +% wavestring = [wavestring [sprintf('%3d, ', waveform(n)) ' ']]; +% end + +%%Exception for mode 5 +if (scope_mode ==5) + mex_usb_send_control('40', 'a1', dec2hex(tccper), dec2hex(clk_setting), dec2hex(wave_length), uint8(waveform)); + stairs(gui_axes, waveform, 'y') + set(gui_axes, 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + return +end + + +mex_usb_send_control('40', 'a1', dec2hex(tccper), dec2hex(clk_setting + 16*offset), dec2hex(min(375,wave_length)), uint8(waveform(1:min(375,wave_length)))); + +if(wave_length>375) + warning('\nWave Length > 375') + mex_usb_send_control('40', 'a1', dec2hex(tccper), dec2hex(clk_setting + 16*(offset+750) + 32768), dec2hex(wave_length-375), uint8(waveform(376:end))); +end + + +% driverLocation = 'c:\libusbk\examples\open-device\debug\win32'; +% command = [driverLocation '\open-device "03eb" "a000" "' command '" "' num2str(tccper) '" "' num2str(clk_setting) '" "' num2str(wave_length) '" "' wavestring '"'] +% system(command); \ No newline at end of file diff --git a/Old Matlab Interface/tiny_wave_conv.m b/Old Matlab Interface/tiny_wave_conv.m new file mode 100644 index 00000000..a73fca5e --- /dev/null +++ b/Old Matlab Interface/tiny_wave_conv.m @@ -0,0 +1,50 @@ +function [wave] = tiny_wave_conv(wave, amplitude); + +global scope_mode +global global_dc_offset; + +% switch(scope_mode) +% case 0 +% max_length = 750; +% case 1 +% max_length = 128; +% warning('Nowhere to store scope data on device. Only frequency will be transmitted.') +% case 2 +% max_length = 128; +% warning('Nowhere to store scope data on device. Only frequency will be transmitted.') +% case 3 +% max_length = 750; +% case 4 +% max_length = 128; +% warning('Nowhere to store scope data on device. Only frequency will be transmitted.') +% case 5 +% max_length = 1500; +% case 6 +% max_length = 128; +% warning('Nowhere to store scope data on device. Only frequency will be transmitted.') +% otherwise +% error('Invalid scope_mode!') +% end + +if scope_mode == 5 + max_length = 1500; +else + max_length = 750; +end + + +if length(wave)>max_length + wave=imresize(wave,max_length/length(wave)); + warning('Vector length is greater than max_length. It has been scaled down.') +end + +if (amplitude>255 | amplitude<0 | amplitude ~= round(amplitude)) + error('Amplitude must be an integer between 0 and 255 for an 8 bit waveform!') +end + + +if var(wave) ~= 0 + wave = wave - min(wave); +end + wave = wave * (amplitude-global_dc_offset) / max(wave); + wave = round(wave) + global_dc_offset \ No newline at end of file diff --git a/Old Matlab Interface/tiny_wave_conv_aux.m b/Old Matlab Interface/tiny_wave_conv_aux.m new file mode 100644 index 00000000..5cab9c99 --- /dev/null +++ b/Old Matlab Interface/tiny_wave_conv_aux.m @@ -0,0 +1,17 @@ +function [wave] = tiny_wave_conv_aux(wave, amplitude); +global global_dc_offset + +if length(wave)>128 + wave=imresize(wave,128/length(wave)); + warning('Vector length is greater than max_length. It has been scaled down.') +end + +if (amplitude>255 | amplitude<0 | amplitude ~= round(amplitude)) + error('Amplitude must be an integer between 0 and 255 for an 8 bit waveform!') +end + +if var(wave) ~= 0 + wave = wave - min(wave); +end + wave = wave * (amplitude-global_dc_offset) / max(wave); + wave = round(wave) + global_dc_offset; \ No newline at end of file diff --git a/Old Matlab Interface/undofrontend.m b/Old Matlab Interface/undofrontend.m new file mode 100644 index 00000000..017f35eb --- /dev/null +++ b/Old Matlab Interface/undofrontend.m @@ -0,0 +1,129 @@ +function [cool_waveform] = undofrontend(temp_waveform,channel) + +Vcc = 3.3; +vref = Vcc/2; +TOP = 128; +R4 = 75e3; +R3 = 1e6; +R2 = 1e3; +R1 = 1e3; + +global scope_gain_0 +global scope_gain_1 +global CH1_AC +global CH2_AC +global scope_mode +global mode7_func +global Rtest +global scope_filter_value +global scope_filter_enabled + +if channel == 1 + scope_gain = scope_gain_1 + AC_offset = CH2_AC * 1.65 +else + scope_gain = scope_gain_0 + AC_offset = CH1_AC * 1.65 +end + +cool_waveform = double(temp_waveform); + +if scope_mode==7 + TOP = 2048; %%OVERRIDE DEFAULTS!! + switch(scope_gain) + case 0.5 + offset = -0.27; + case 1 + offset = 0; + case 2 + offset = 0.037; + case 4 + offset = 0.053; + case 8 + offset = 0.055; + case 16 + offset = 0.028; + case 32 + offset= 0.035; + case 64 + offset = 0.0355 + otherwise + error('UNDOFRONTEND failed') + end + switch(mode7_func) + case 'V' + cool_waveform = (cool_waveform * (Vcc/2)) / (R4/(R3+R4)*scope_gain*TOP); + cool_waveform = cool_waveform - AC_offset; + cool_waveform = cool_waveform - offset; + case 'I' + cool_waveform = (cool_waveform * (Vcc/2)) / (R4/(R3+R4)*scope_gain*TOP); + cool_waveform = cool_waveform - AC_offset; + cool_waveform = cool_waveform - offset; + cool_waveform = cool_waveform/Rtest + case 'R' + cool_waveform = (cool_waveform * (Vcc/2)) / (R4/(R3+R4)*scope_gain*TOP); + cool_waveform = cool_waveform - AC_offset; + cool_waveform = cool_waveform - offset; + cool_waveform = (cool_waveform * Rtest) ./ ((Vcc/2) - cool_waveform); + case 'C' + cool_waveform = (cool_waveform * (Vcc/2)) / (R4/(R3+R4)*scope_gain*TOP); + cool_waveform = cool_waveform - AC_offset; + cool_waveform = cool_waveform - offset; + + + %Capacitance calculation + tt = 2.5; + bt = 0.8; + + top_val = (tt/vref * R4/(R3+R4) * scope_gain * TOP) + bot_val = (bt/vref * R4/(R3+R4) * scope_gain * TOP) + + global saved_waveform_ch1 + global fastmode + samples_per_sec = 375000 / (3 * fastmode + 1) + range = length(saved_waveform_ch1) - samples_per_sec / 5 + + gtt = saved_waveform_ch1(range:end)>top_val; + gtb = saved_waveform_ch1(range:end)0 + cool_waveform = filter(ones(1,scope_filter_value)/scope_filter_value,1,cool_waveform); + cool_waveform = cool_waveform(scope_filter_value:end); + end +end \ No newline at end of file diff --git a/Old Matlab Interface/updatescopeaxes.m b/Old Matlab Interface/updatescopeaxes.m new file mode 100644 index 00000000..b1da4215 --- /dev/null +++ b/Old Matlab Interface/updatescopeaxes.m @@ -0,0 +1,168 @@ +global scope_window_time +global scope_window_max +global scope_window_min +global scope_mode +global gui_axes +global text_box_1 +global gui_hori_cursor_a_pos +global gui_hori_cursor_b_pos +global gui_vert_cursor_a_pos +global gui_vert_cursor_b_pos +global gui_cursor_mode +global saved_waveform_ch1 +global saved_waveform_ch2 +global gui_scope_running + +global refreshrate_temp +global refreshrate + +global waveform_exists +global gui_delay + +global fastmode + +refreshrate_temp = refreshrate_temp - 1; + +tic +delay_sec = get(gui_delay, 'Max') - get(gui_delay, 'Value'); +switch(scope_mode) + case 0 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + %if(gui_scope_running) + [taxis, cool_waveform, update_enable] = conv_ana(saved_waveform_ch1, 375000*scope_window_time, 0); + %end + plotcursors + if(cool_waveform) + waveform_exists = 1; + end + if (waveform_exists & update_enable) + if (fastmode==1) + disp('Fastmode Enabled') + else + disp('Fastmode disabled') + %set(text_box_1, 'String', sprintf(' ------------------------\n Vmin = %.2fV\n ------------------------\n Vmax = %.2f\n ------------------------\n Vmean = %.2f\n ------------------------\n Vrms = %.2f\n ------------------------\n ', min(cool_waveform), max(cool_waveform), mean(cool_waveform), rms(cool_waveform))); + set(text_box_1, 'String', sprintf(' ------------------------\n Vmin = %s\n ------------------------\n Vmax = %s\n ------------------------\n Vmean = %s\n ------------------------\n Vrms = %s\n ------------------------\n ', sisprintf(min(cool_waveform),'V',2), sisprintf(max(cool_waveform),'V',2), sisprintf(mean(cool_waveform),'V',2), sisprintf(rms(cool_waveform),'V', 2))); + %title(titlestring); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Voltage (V)') + end + drawnow + end + end + case 1 + if ~(refreshrate == 4) + error('Refreshrate assumed to be 4 for Mode 1') + end + switch(refreshrate_temp) + case 3 + %if(gui_scope_running) + [taxis, cool_waveform, update_enable] = conv_ana(saved_waveform_ch1, 375000*scope_window_time, 0); + [taxis_ch2, temp_waveform_ch2] = conv_dig(saved_waveform_ch2, 375000*scope_window_time); + temp_waveform_ch2 = (scope_window_max - (0.05*(scope_window_max - scope_window_min)) - scope_window_min) * temp_waveform_ch2 + scope_window_min + (0.025*(scope_window_max - scope_window_min)); + % end + case 2 + stairs(gui_axes, taxis_ch2, temp_waveform_ch2, 'c'); + hold(gui_axes, 'on') + plotcursors + hold(gui_axes, 'off') + if(update_enable) + set(text_box_1, 'String', sprintf(' ------------------------\n Vmin = %.2fV\n ------------------------\n Vmax = %.2f\n ------------------------\n Vmean = %.2f\n ------------------------\n Vrms = %.2f\n ------------------------\n ', min(cool_waveform), max(cool_waveform), mean(cool_waveform), rms(cool_waveform))); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Voltage (V)') + drawnow + end + case 0 + refreshrate_temp = refreshrate; + end + case 2 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + % if(gui_scope_running) + [taxis_ch1, cool_waveform_ch1, update_enable] = conv_ana(saved_waveform_ch1, 375000*scope_window_time, 0); + [taxis_ch2, cool_waveform_ch2] = conv_ana(saved_waveform_ch2, 375000*scope_window_time, 1); + %end + plotcursors + if(cool_waveform) waveform_exists = 1; end + if (waveform_exists & update_enable) + set(text_box_1, 'String', sprintf(' ------------------------\n Vmin = %.2fV\n ------------------------\n Vmax = %.2f\n ------------------------\n Vmean = %.2f\n ------------------------\n Vrms = %.2f\n ------------------------\n ', min(cool_waveform_ch1), max(cool_waveform_ch1), mean(cool_waveform_ch1), rms(cool_waveform_ch1))); + %title(titlestring); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Voltage (V)') + drawnow + end + end + case 3 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + %if(gui_scope_running) + [taxis, temp_waveform] = conv_dig(saved_waveform_ch1, 375000*scope_window_time); + % end + stairs(gui_axes, taxis, temp_waveform, 'y'); + set(gui_axes, 'Ylim', [-0.1, 1.1], 'Xlim', [-scope_window_time-delay_sec, 0-delay_sec], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + set(text_box_1, 'String', 'Scope in dig mode'); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Logic Value') + drawnow + end + case 4 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + % if(gui_scope_running) + [taxis_ch1, temp_waveform_ch1] = conv_dig(saved_waveform_ch1, 375000*scope_window_time); + [taxis_ch2, temp_waveform_ch2] = conv_dig(saved_waveform_ch2, 375000*scope_window_time); + %end + waveform_exists = 1 + elseif (refreshrate_temp == 3) && (waveform_exists) + stairs(gui_axes, taxis_ch2, temp_waveform_ch2, 'c'); + hold(gui_axes, 'on') + stairs(gui_axes, taxis_ch1, temp_waveform_ch1, 'y'); + hold(gui_axes, 'off') + set(gui_axes, 'Ylim', [-0.1, 1.1], 'Xlim', [-scope_window_time-delay_sec, 0-delay_sec], 'Color', [0 0 0], 'Box', 'on', 'XColor', [1 1 1], 'Ycolor', [1 1 1]); + set(text_box_1, 'String', 'Scope in dig mode'); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Logic Value') + drawnow + end + case 5 + set(text_box_1, 'String', 'Scope disabled'); + xlabel(gui_axes, '') + ylabel(gui_axes, '') + drawnow + pause(0.001) + case 6 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + %if(gui_scope_running) + [taxis, cool_waveform, update_enable] = conv_ana(saved_waveform_ch1, 750000*scope_window_time, 0); + %end + plotcursors + if(cool_waveform) waveform_exists = 1; end + if (waveform_exists & update_enable) + set(text_box_1, 'String', sprintf(' ------------------------\n Vmin = %.2fV\n ------------------------\n Vmax = %.2f\n ------------------------\n Vmean = %.2f\n ------------------------\n Vrms = %.2f\n ------------------------\n ', min(cool_waveform), max(cool_waveform), mean(cool_waveform), rms(cool_waveform))); + %title(titlestring); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Voltage (V)') + drawnow + end + end + case 7 + if (refreshrate_temp == 0) + refreshrate_temp = refreshrate; + %if(gui_scope_running) + [taxis, cool_waveform, update_enable] = conv_ana(saved_waveform_ch1, (375000/(3*fastmode + 1))*scope_window_time, 0); + %end + plotcursors + if(cool_waveform) waveform_exists = 1; end + if (waveform_exists & update_enable) + set(text_box_1, 'String', sprintf(' ------------------------\n Vmin = %.2fV\n ------------------------\n Vmax = %.2f\n ------------------------\n Vmean = %.2f\n ------------------------\n Vrms = %.2f\n ------------------------\n ', min(cool_waveform), max(cool_waveform), mean(cool_waveform), rms(cool_waveform))); + %title(titlestring); + xlabel(gui_axes, 'Time (s)') + ylabel(gui_axes, 'Voltage (V)') + drawnow + end + end + otherwise + error('scope_mode invalid!') +end +toc \ No newline at end of file diff --git a/Old Matlab Interface/verr.m b/Old Matlab Interface/verr.m new file mode 100644 index 00000000..335ce7f6 --- /dev/null +++ b/Old Matlab Interface/verr.m @@ -0,0 +1,11 @@ +function [err] = verr(vex, r) + +if r<50 + error('R IS TOO LOW!!!') +end + +%%FOR THE BIG BOY BOARD, remove the +0.2 also +%r = (1/r + 1/250)^-1; +err = ((vex + 1.5)^4 / (80 * r)) + 0.2 + +%err = vex^3/512 - (r/68) * (vex^1.8/(20^1.8)) - (vex-10) / 10 +vex/20 \ No newline at end of file diff --git a/Old Matlab Interface/vexconv.m b/Old Matlab Interface/vexconv.m new file mode 100644 index 00000000..8a3093e0 --- /dev/null +++ b/Old Matlab Interface/vexconv.m @@ -0,0 +1,3 @@ +function [] = vexconv(vex, r) + +r = (1/r + 1/250)^-1; diff --git a/Old Matlab Interface/weave.m b/Old Matlab Interface/weave.m new file mode 100644 index 00000000..05ad2639 --- /dev/null +++ b/Old Matlab Interface/weave.m @@ -0,0 +1,7 @@ + transfer_contents_temp = []; + for tempovar = 0:length(transfer_contents_0)/750 - 1 + transfer_contents_temp = [transfer_contents_temp transfer_contents_0((tempovar*750+1):(tempovar*750+375))]; + transfer_contents_temp = [transfer_contents_temp transfer_contents_1((tempovar*750+1):(tempovar*750+375))]; + end + + plot(transfer_contents_temp) \ No newline at end of file diff --git a/PCB/.pretty/1pin.kicad_mod b/PCB/.pretty/1pin.kicad_mod new file mode 100644 index 00000000..c06374cc --- /dev/null +++ b/PCB/.pretty/1pin.kicad_mod @@ -0,0 +1,12 @@ +(module 1pin (layer F.Cu) (tedit 0) + (descr "module 1 pin (ou trou mecanique de percage)") + (tags DEV) + (fp_text reference REF** (at 0 -3.048) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value 1pin (at 0 2.794) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 0 0) (end 0 -2.286) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole circle (at 0 0) (size 4.064 4.064) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/3M-N7E50.kicad_mod b/PCB/.pretty/3M-N7E50.kicad_mod new file mode 100644 index 00000000..103cc65b --- /dev/null +++ b/PCB/.pretty/3M-N7E50.kicad_mod @@ -0,0 +1,113 @@ +(module 3M-N7E50 (layer F.Cu) (tedit 0) + (descr "Connecteur PCMCIA + carte") + (tags CONN) + (fp_text reference REF** (at 0 4.445) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value 3M-N7E50 (at 0 7.62) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 21.59 31.115) (end 21.59 38.1) (layer F.SilkS) (width 0.15)) + (fp_line (start 21.59 27.94) (end 21.59 29.845) (layer F.SilkS) (width 0.15)) + (fp_line (start 21.59 20.32) (end 21.59 26.67) (layer F.SilkS) (width 0.15)) + (fp_line (start 21.59 17.145) (end 21.59 19.05) (layer F.SilkS) (width 0.15)) + (fp_line (start 21.59 9.525) (end 21.59 15.875) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.415 38.1) (end 20.32 38.1) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.795 38.1) (end 17.145 38.1) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 38.1) (end 9.525 38.1) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 38.1) (end 6.35 38.1) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.175 38.1) (end -1.27 38.1) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.795 38.1) (end -4.445 38.1) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.97 38.1) (end -12.065 38.1) (layer F.SilkS) (width 0.15)) + (fp_line (start -21.59 38.1) (end -15.24 38.1) (layer F.SilkS) (width 0.15)) + (fp_line (start -21.59 31.115) (end -21.59 38.1) (layer F.SilkS) (width 0.15)) + (fp_line (start -21.59 27.94) (end -21.59 29.845) (layer F.SilkS) (width 0.15)) + (fp_line (start -21.59 20.32) (end -21.59 26.67) (layer F.SilkS) (width 0.15)) + (fp_line (start -21.59 17.145) (end -21.59 19.05) (layer F.SilkS) (width 0.15)) + (fp_line (start -21.59 9.525) (end -21.59 15.875) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.5575 -0.9525) (end 14.9225 0.3175) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.9225 0.3175) (end 16.1925 0.3175) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.1925 0.3175) (end 15.5575 -0.9525) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 -0.635) (end -0.635 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 -0.635) (end 0.635 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 21.5138 8.3058) (end 21.5138 2.0066) (layer F.SilkS) (width 0.15)) + (fp_line (start 21.5138 2.0066) (end 21.1328 1.6256) (layer F.SilkS) (width 0.15)) + (fp_line (start 21.1328 1.6256) (end 20.5486 1.6256) (layer F.SilkS) (width 0.15)) + (fp_line (start -21.5138 8.3058) (end -21.5138 2.0066) (layer F.SilkS) (width 0.15)) + (fp_line (start -21.5138 2.0066) (end -21.1328 1.6256) (layer F.SilkS) (width 0.15)) + (fp_line (start -21.1328 1.6256) (end -20.5486 1.6256) (layer F.SilkS) (width 0.15)) + (fp_line (start -22.479 2.6416) (end -22.479 8.3058) (layer F.SilkS) (width 0.15)) + (fp_line (start -22.479 8.3058) (end -20.5486 8.3058) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.5486 8.3058) (end -20.5486 1.6256) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.5486 1.6256) (end 20.5486 1.6256) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.5486 1.6256) (end 20.5486 8.3058) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.5486 8.3058) (end 22.479 8.3058) (layer F.SilkS) (width 0.15)) + (fp_line (start 22.479 8.3058) (end 22.479 2.6416) (layer F.SilkS) (width 0.15)) + (fp_line (start -22.479 -3.048) (end -22.479 -5.4102) (layer F.SilkS) (width 0.15)) + (fp_line (start -22.479 -5.4102) (end -17.4244 -5.4102) (layer F.SilkS) (width 0.15)) + (fp_line (start -17.4244 -5.4102) (end -17.4244 -7.2898) (layer F.SilkS) (width 0.15)) + (fp_line (start -17.4244 -7.2898) (end -16.4084 -7.2898) (layer F.SilkS) (width 0.15)) + (fp_line (start -16.4084 -7.2898) (end -16.4084 -1.6764) (layer F.SilkS) (width 0.15)) + (fp_line (start -16.4084 -1.6764) (end 16.4084 -1.6764) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.4084 -1.6764) (end 16.4084 -7.2898) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.4084 -7.2898) (end 17.4244 -7.2898) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.4244 -7.2898) (end 17.4244 -5.4102) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.4244 -5.4102) (end 22.479 -5.4102) (layer F.SilkS) (width 0.15)) + (fp_line (start 22.479 -5.4102) (end 22.479 -3.048) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at 15.5575 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 26 smd rect (at 14.9225 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at 14.2875 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 27 smd rect (at 13.6525 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 3 smd rect (at 13.0175 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 28 smd rect (at 12.3825 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 4 smd rect (at 11.7475 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 29 smd rect (at 11.1125 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 5 smd rect (at 10.4775 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 30 smd rect (at 9.8425 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 6 smd rect (at 9.2075 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 31 smd rect (at 8.5725 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 7 smd rect (at 7.9375 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 32 smd rect (at 7.3025 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 8 smd rect (at 6.6675 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 33 smd rect (at 6.0325 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 9 smd rect (at 5.3975 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 34 smd rect (at 4.7625 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 10 smd rect (at 4.1275 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 35 smd rect (at 3.4925 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 11 smd rect (at 2.8575 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 36 smd rect (at 2.2225 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 12 smd rect (at 1.5875 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 37 smd rect (at 0.9525 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 13 smd rect (at 0.3175 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 38 smd rect (at -0.3175 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 14 smd rect (at -0.9525 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 39 smd rect (at -1.5875 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 15 smd rect (at -2.2225 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 40 smd rect (at -2.8575 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 16 smd rect (at -3.4925 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 41 smd rect (at -4.1275 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 17 smd rect (at -4.7625 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 42 smd rect (at -5.3975 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 18 smd rect (at -6.0325 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 43 smd rect (at -6.6675 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 19 smd rect (at -7.3025 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 44 smd rect (at -7.9375 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 20 smd rect (at -8.5725 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 45 smd rect (at -9.2075 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 21 smd rect (at -9.8425 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 46 smd rect (at -10.4775 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 22 smd rect (at -11.1125 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 47 smd rect (at -11.7475 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 23 smd rect (at -12.3825 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 48 smd rect (at -13.0175 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 24 smd rect (at -13.6525 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 49 smd rect (at -14.2875 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 25 smd rect (at -14.9225 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad 50 smd rect (at -15.5575 -5.8674) (size 0.4064 3.5052) (layers F.Cu F.Paste F.Mask)) + (pad "" thru_hole circle (at -19.3675 -2.8702) (size 3.9878 3.9878) (drill 2.2098) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 19.3675 -2.8702) (size 3.9878 3.9878) (drill 2.2098) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -19.3675 0.127) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 19.3675 0.127) (size 1.7018 1.7018) (drill 1.7018) (layers *.Cu *.Mask F.SilkS)) + (pad "" smd rect (at 23.3426 -0.2032) (size 2.4892 4.572) (layers F.Cu F.Paste B.SilkS F.Mask)) + (pad "" smd rect (at -23.3426 -0.2032) (size 2.4892 4.572) (layers F.Cu F.Paste B.SilkS F.Mask)) +) diff --git a/PCB/.pretty/AK300-2.kicad_mod b/PCB/.pretty/AK300-2.kicad_mod new file mode 100644 index 00000000..cab9f1dd --- /dev/null +++ b/PCB/.pretty/AK300-2.kicad_mod @@ -0,0 +1,98 @@ +(module AK300-2 (layer F.Cu) (tedit 54792136) + (descr CONNECTOR) + (tags CONNECTOR) + (attr virtual) + (fp_text reference REF** (at -1.92 -6.985) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value AK300-2 (at 2.779 7.747) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 8.363 -6.473) (end -2.83 -6.473) (layer F.CrtYd) (width 0.05)) + (fp_line (start 8.363 6.473) (end 8.363 -6.473) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.83 6.473) (end 8.363 6.473) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.83 -6.473) (end -2.83 6.473) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.2596 2.54) (end 1.2804 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.2804 2.54) (end 1.2804 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.2596 -0.254) (end 1.2804 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.2596 2.54) (end -1.2596 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.7442 2.54) (end 6.2842 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.2842 2.54) (end 6.2842 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.7442 -0.254) (end 6.2842 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.7442 2.54) (end 3.7442 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.605 -6.223) (end 7.605 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.605 -6.223) (end -2.58 -6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.605 -6.223) (end 8.113 -6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.113 -6.223) (end 8.113 -1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.113 -1.397) (end 7.605 -1.651) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.113 5.461) (end 7.605 5.207) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.605 5.207) (end 7.605 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.113 3.81) (end 7.605 4.064) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.605 4.064) (end 7.605 5.207) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.113 3.81) (end 8.113 5.461) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9822 6.223) (end 2.9822 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.0462 -0.254) (end 7.0462 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9822 6.223) (end 7.0462 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.0462 6.223) (end 7.605 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0424 6.223) (end 2.0424 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0424 6.223) (end 2.9822 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0216 -0.254) (end -2.0216 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.58 6.223) (end -2.0216 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0216 6.223) (end 2.0424 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9822 4.318) (end 7.0462 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9822 4.318) (end 2.9822 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.0462 4.318) (end 7.0462 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0424 4.318) (end -2.0216 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0424 4.318) (end 2.0424 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0216 4.318) (end -2.0216 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.6652 3.683) (end 6.6652 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.6652 3.683) (end 3.3632 3.683) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.3632 3.683) (end 3.3632 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.6614 3.683) (end 1.6614 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.6614 3.683) (end -1.6406 3.683) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.6406 3.683) (end -1.6406 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.6406 0.508) (end -1.2596 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.6614 0.508) (end 1.2804 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.3632 0.508) (end 3.7442 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.6652 0.508) (end 6.2842 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.58 6.223) (end -2.58 -0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.58 -0.635) (end -2.58 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.605 -1.651) (end 7.605 -0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.605 -0.635) (end 7.605 4.064) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.58 -3.175) (end 7.605 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.58 -3.175) (end -2.58 -6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.605 -3.175) (end 7.605 -1.651) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9822 -3.429) (end 2.9822 -5.969) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9822 -5.969) (end 7.0462 -5.969) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.0462 -5.969) (end 7.0462 -3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.0462 -3.429) (end 2.9822 -3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0424 -3.429) (end 2.0424 -5.969) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0424 -3.429) (end -2.0216 -3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0216 -3.429) (end -2.0216 -5.969) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0424 -5.969) (end -2.0216 -5.969) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.3886 -4.445) (end 6.4366 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.5156 -4.318) (end 6.5636 -4.953) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.6152 -4.445) (end 1.43534 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.4882 -4.318) (end 1.5598 -4.953) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0216 -0.254) (end -1.6406 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0424 -0.254) (end 1.6614 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.6614 -0.254) (end -1.6406 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.58 -0.635) (end -1.6406 -0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.6406 -0.635) (end 1.6614 -0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.6614 -0.635) (end 3.3632 -0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.605 -0.635) (end 6.6652 -0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.6652 -0.635) (end 3.3632 -0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.0462 -0.254) (end 6.6652 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9822 -0.254) (end 3.3632 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.3632 -0.254) (end 6.6652 -0.254) (layer F.SilkS) (width 0.15)) + (fp_arc (start 6.0302 -4.59486) (end 6.53566 -5.05206) (angle 90.5) (layer F.SilkS) (width 0.15)) + (fp_arc (start 5.065 -6.0706) (end 6.52804 -4.11734) (angle 75.5) (layer F.SilkS) (width 0.15)) + (fp_arc (start 4.98626 -3.7084) (end 3.3886 -5.0038) (angle 100) (layer F.SilkS) (width 0.15)) + (fp_arc (start 3.8712 -4.64566) (end 3.58164 -4.1275) (angle 104.2) (layer F.SilkS) (width 0.15)) + (fp_arc (start 1.0264 -4.59486) (end 1.5344 -5.05206) (angle 90.5) (layer F.SilkS) (width 0.15)) + (fp_arc (start 0.06374 -6.0706) (end 1.52678 -4.11734) (angle 75.5) (layer F.SilkS) (width 0.15)) + (fp_arc (start -0.01246 -3.7084) (end -1.6152 -5.0038) (angle 100) (layer F.SilkS) (width 0.15)) + (fp_arc (start -1.1326 -4.64566) (end -1.41962 -4.1275) (angle 104.2) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole oval (at 0 0) (size 1.9812 3.9624) (drill 1.3208) (layers *.Cu F.Paste F.SilkS F.Mask)) + (pad 2 thru_hole oval (at 5 0) (size 1.9812 3.9624) (drill 1.3208) (layers *.Cu F.Paste F.SilkS F.Mask)) +) diff --git a/PCB/.pretty/AK300-3.kicad_mod b/PCB/.pretty/AK300-3.kicad_mod new file mode 100644 index 00000000..b3eaf956 --- /dev/null +++ b/PCB/.pretty/AK300-3.kicad_mod @@ -0,0 +1,127 @@ +(module AK300-3 (layer F.Cu) (tedit 54791EF3) + (descr CONNECTOR) + (tags CONNECTOR) + (attr virtual) + (fp_text reference REF** (at -1.945 -6.995) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value AK300-3 (at 2.754 7.737) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 13.418 -6.473) (end -2.83 -6.473) (layer F.CrtYd) (width 0.05)) + (fp_line (start 13.418 6.473) (end 13.418 -6.473) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.83 6.473) (end 13.418 6.473) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.83 -6.473) (end -2.83 6.473) (layer F.CrtYd) (width 0.05)) + (fp_line (start 12.66 -0.645) (end -2.5165 -0.645) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.0245 3.9905) (end 8.0245 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.0885 6.213) (end 7.58 6.213) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.58 -3.185) (end 12.5965 -3.185) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.58 -6.233) (end 12.66 -6.233) (layer F.SilkS) (width 0.15)) + (fp_arc (start 8.9262 -4.65566) (end 8.63664 -4.1375) (angle 104.2) (layer F.SilkS) (width 0.15)) + (fp_arc (start 10.04126 -3.7184) (end 8.4436 -5.0138) (angle 100) (layer F.SilkS) (width 0.15)) + (fp_arc (start 10.12 -6.0806) (end 11.58304 -4.12734) (angle 75.5) (layer F.SilkS) (width 0.15)) + (fp_arc (start 11.0852 -4.60486) (end 11.59066 -5.06206) (angle 90.5) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.4182 -0.264) (end 11.7202 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.0372 -0.264) (end 8.4182 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.1012 -0.264) (end 11.7202 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.5706 -4.328) (end 11.6186 -4.963) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.4436 -4.455) (end 11.4916 -5.09) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.1012 -3.439) (end 8.0372 -3.439) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.1012 -5.979) (end 12.1012 -3.439) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.0372 -5.979) (end 12.1012 -5.979) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.0372 -3.439) (end 8.0372 -5.979) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.66 -3.185) (end 12.66 -1.661) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.66 -0.645) (end 12.66 4.054) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.66 -1.661) (end 12.66 -0.645) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.7202 0.498) (end 11.3392 0.498) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.4182 0.498) (end 8.7992 0.498) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.4182 3.673) (end 8.4182 0.498) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.7202 3.673) (end 8.4182 3.673) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.7202 3.673) (end 11.7202 0.498) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.1012 4.308) (end 12.1012 6.213) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.0372 4.308) (end 12.1012 4.308) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.1012 6.213) (end 12.66 6.213) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.1012 -0.264) (end 12.1012 4.308) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.0372 6.213) (end 8.0372 4.308) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.168 3.8) (end 13.168 5.451) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.66 4.054) (end 12.66 5.197) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.168 3.8) (end 12.66 4.054) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.66 5.197) (end 12.66 6.213) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.168 5.451) (end 12.66 5.197) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.168 -1.407) (end 12.66 -1.661) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.168 -6.233) (end 13.168 -1.407) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.66 -6.233) (end 13.168 -6.233) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.66 -6.233) (end 12.66 -3.185) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.7992 2.53) (end 8.7992 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.7992 -0.264) (end 11.3392 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.3392 2.53) (end 11.3392 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.7992 2.53) (end 11.3392 2.53) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.2846 2.53) (end 1.2554 2.53) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.2554 2.53) (end 1.2554 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.2846 -0.264) (end 1.2554 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.2846 2.53) (end -1.2846 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.7192 2.53) (end 6.2592 2.53) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.2592 2.53) (end 6.2592 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.7192 -0.264) (end 6.2592 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.7192 2.53) (end 3.7192 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.0245 5.197) (end 8.0245 6.213) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.0245 4.054) (end 8.0245 5.197) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9572 6.213) (end 2.9572 4.308) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.0212 -0.264) (end 7.0212 4.308) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9572 6.213) (end 7.0212 6.213) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.0212 6.213) (end 7.58 6.213) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0174 6.213) (end 2.0174 4.308) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0174 6.213) (end 2.9572 6.213) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0466 -0.264) (end -2.0466 4.308) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.58 6.213) (end -2.0466 6.213) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0466 6.213) (end 2.0174 6.213) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9572 4.308) (end 7.0212 4.308) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9572 4.308) (end 2.9572 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.0212 4.308) (end 7.0212 6.213) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0174 4.308) (end -2.0466 4.308) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0174 4.308) (end 2.0174 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0466 4.308) (end -2.0466 6.213) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.6402 3.673) (end 6.6402 0.498) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.6402 3.673) (end 3.3382 3.673) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.3382 3.673) (end 3.3382 0.498) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.6364 3.673) (end 1.6364 0.498) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.6364 3.673) (end -1.6656 3.673) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.6656 3.673) (end -1.6656 0.498) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.6656 0.498) (end -1.2846 0.498) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.6364 0.498) (end 1.2554 0.498) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.3382 0.498) (end 3.7192 0.498) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.6402 0.498) (end 6.2592 0.498) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.58 6.213) (end -2.58 -0.645) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.58 -0.645) (end -2.58 -3.185) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.58 -3.185) (end 7.58 -3.185) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.58 -3.185) (end -2.58 -6.233) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9572 -3.439) (end 2.9572 -5.979) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9572 -5.979) (end 7.0212 -5.979) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.0212 -5.979) (end 7.0212 -3.439) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.0212 -3.439) (end 2.9572 -3.439) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0174 -3.439) (end 2.0174 -5.979) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0174 -3.439) (end -2.0466 -3.439) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0466 -3.439) (end -2.0466 -5.979) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0174 -5.979) (end -2.0466 -5.979) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.3636 -4.455) (end 6.4116 -5.09) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.4906 -4.328) (end 6.5386 -4.963) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.6402 -4.455) (end 1.41034 -5.09) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5132 -4.328) (end 1.5348 -4.963) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0466 -0.264) (end -1.6656 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0174 -0.264) (end 1.6364 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.6364 -0.264) (end -1.6656 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.0212 -0.264) (end 6.6402 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9572 -0.264) (end 3.3382 -0.264) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.3382 -0.264) (end 6.6402 -0.264) (layer F.SilkS) (width 0.15)) + (fp_arc (start 6.0052 -4.60486) (end 6.51066 -5.06206) (angle 90.5) (layer F.SilkS) (width 0.15)) + (fp_arc (start 5.04 -6.0806) (end 6.50304 -4.12734) (angle 75.5) (layer F.SilkS) (width 0.15)) + (fp_arc (start 4.96126 -3.7184) (end 3.3636 -5.0138) (angle 100) (layer F.SilkS) (width 0.15)) + (fp_arc (start 3.8462 -4.65566) (end 3.55664 -4.1375) (angle 104.2) (layer F.SilkS) (width 0.15)) + (fp_arc (start 1.0014 -4.60486) (end 1.5094 -5.06206) (angle 90.5) (layer F.SilkS) (width 0.15)) + (fp_arc (start 0.03874 -6.0806) (end 1.50178 -4.12734) (angle 75.5) (layer F.SilkS) (width 0.15)) + (fp_arc (start -0.03746 -3.7184) (end -1.6402 -5.0138) (angle 100) (layer F.SilkS) (width 0.15)) + (fp_arc (start -1.1576 -4.65566) (end -1.44462 -4.1375) (angle 104.2) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole oval (at 0 0) (size 1.9812 3.9624) (drill 1.3208) (layers *.Cu F.Paste F.SilkS F.Mask)) + (pad 2 thru_hole oval (at 5 0) (size 1.9812 3.9624) (drill 1.3208) (layers *.Cu F.Paste F.SilkS F.Mask)) + (pad 3 thru_hole oval (at 10 0) (size 1.9812 3.9624) (drill 1.3208) (layers *.Cu F.Paste F.SilkS F.Mask)) +) diff --git a/PCB/.pretty/AK300-4.kicad_mod b/PCB/.pretty/AK300-4.kicad_mod new file mode 100644 index 00000000..ca53533d --- /dev/null +++ b/PCB/.pretty/AK300-4.kicad_mod @@ -0,0 +1,150 @@ +(module AK300-4 (layer F.Cu) (tedit 54791E04) + (descr CONNECTOR) + (tags CONNECTOR) + (attr virtual) + (fp_text reference REF** (at -1.945 -6.985) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value AK300-4 (at 2.754 7.747) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 18.35 -6.473) (end 18.35 6.473) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.83 -6.473) (end -2.83 6.473) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.83 6.473) (end 18.35 6.473) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.83 -6.473) (end 18.35 -6.473) (layer F.CrtYd) (width 0.05)) + (fp_line (start 8.75 -0.254) (end 8.75 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.75 2.54) (end 11.29 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.29 2.54) (end 11.29 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.9372 -3.429) (end 7.9372 -5.969) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.9372 -5.969) (end 12.0012 -5.969) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.0012 -5.969) (end 12.0012 -3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.0012 -3.429) (end 7.9372 -3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.3436 -4.445) (end 11.3916 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.4706 -4.318) (end 11.5186 -4.953) (layer F.SilkS) (width 0.15)) + (fp_arc (start 10.9852 -4.59486) (end 11.49066 -5.05206) (angle 90.5) (layer F.SilkS) (width 0.15)) + (fp_arc (start 10.02 -6.0706) (end 11.48304 -4.11734) (angle 75.5) (layer F.SilkS) (width 0.15)) + (fp_arc (start 9.94126 -3.7084) (end 8.3436 -5.0038) (angle 100) (layer F.SilkS) (width 0.15)) + (fp_arc (start 8.8262 -4.64566) (end 8.53664 -4.1275) (angle 104.2) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.988 4.318) (end 12.052 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.052 6.223) (end 12.052 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.369 0.508) (end 8.75 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.369 0.508) (end 8.369 3.683) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.369 3.683) (end 11.671 3.683) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.671 3.683) (end 11.671 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.671 0.508) (end 11.29 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.51 -0.635) (end 17.59 -0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.988 6.223) (end 7.988 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.988 -0.254) (end 12.052 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.955 6.223) (end 13.018 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.168 6.223) (end 7.072 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.59 -3.048) (end -2.58 -3.048) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.74 -6.223) (end -2.58 -6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.66 -0.635) (end -2.5165 -0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.9545 4.0005) (end 12.9545 -0.254) (layer F.SilkS) (width 0.15)) + (fp_arc (start 13.8562 -4.64566) (end 13.56664 -4.1275) (angle 104.2) (layer F.SilkS) (width 0.15)) + (fp_arc (start 14.97126 -3.7084) (end 13.3736 -5.0038) (angle 100) (layer F.SilkS) (width 0.15)) + (fp_arc (start 15.05 -6.0706) (end 16.51304 -4.11734) (angle 75.5) (layer F.SilkS) (width 0.15)) + (fp_arc (start 16.0152 -4.59486) (end 16.52066 -5.05206) (angle 90.5) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.3482 -0.254) (end 16.6502 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.9672 -0.254) (end 13.3482 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.0312 -0.254) (end 16.6502 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.5006 -4.318) (end 16.5486 -4.953) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.3736 -4.445) (end 16.4216 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.0312 -3.429) (end 12.9672 -3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.0312 -5.969) (end 17.0312 -3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.9672 -5.969) (end 17.0312 -5.969) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.9672 -3.429) (end 12.9672 -5.969) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.59 -3.175) (end 17.59 -1.651) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.59 -0.635) (end 17.59 4.064) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.59 -1.651) (end 17.59 -0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.6502 0.508) (end 16.2692 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.3482 0.508) (end 13.7292 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.3482 3.683) (end 13.3482 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.6502 3.683) (end 13.3482 3.683) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.6502 3.683) (end 16.6502 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.0312 4.318) (end 17.0312 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.9672 4.318) (end 17.0312 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.0312 6.223) (end 17.59 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.0312 -0.254) (end 17.0312 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.9672 6.223) (end 12.9672 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.098 3.81) (end 18.098 5.461) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.59 4.064) (end 17.59 5.207) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.098 3.81) (end 17.59 4.064) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.59 5.207) (end 17.59 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.098 5.461) (end 17.59 5.207) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.098 -1.397) (end 17.59 -1.651) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.098 -6.223) (end 18.098 -1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.59 -6.223) (end 18.098 -6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.59 -6.223) (end 17.59 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.7292 2.54) (end 13.7292 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.7292 -0.254) (end 16.2692 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.2692 2.54) (end 16.2692 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.7292 2.54) (end 16.2692 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.2846 2.54) (end 1.2554 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.2554 2.54) (end 1.2554 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.2846 -0.254) (end 1.2554 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.2846 2.54) (end -1.2846 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.7192 2.54) (end 6.2592 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.2592 2.54) (end 6.2592 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.7192 -0.254) (end 6.2592 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.7192 2.54) (end 3.7192 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.9545 5.207) (end 12.9545 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.9545 4.064) (end 12.9545 5.207) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9572 6.223) (end 2.9572 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.0212 -0.254) (end 7.0212 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9572 6.223) (end 7.0212 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0174 6.223) (end 2.0174 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0174 6.223) (end 2.9572 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0466 -0.254) (end -2.0466 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.58 6.223) (end -2.0466 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0466 6.223) (end 2.0174 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9572 4.318) (end 7.0212 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9572 4.318) (end 2.9572 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.0212 4.318) (end 7.0212 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0174 4.318) (end -2.0466 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0174 4.318) (end 2.0174 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0466 4.318) (end -2.0466 6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.6402 3.683) (end 6.6402 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.6402 3.683) (end 3.3382 3.683) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.3382 3.683) (end 3.3382 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.6364 3.683) (end 1.6364 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.6364 3.683) (end -1.6656 3.683) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.6656 3.683) (end -1.6656 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.6656 0.508) (end -1.2846 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.6364 0.508) (end 1.2554 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.3382 0.508) (end 3.7192 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.6402 0.508) (end 6.2592 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.58 6.223) (end -2.58 -0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.58 -0.635) (end -2.58 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.58 -3.175) (end -2.58 -6.223) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9572 -3.429) (end 2.9572 -5.969) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9572 -5.969) (end 7.0212 -5.969) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.0212 -5.969) (end 7.0212 -3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.0212 -3.429) (end 2.9572 -3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0174 -3.429) (end 2.0174 -5.969) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0174 -3.429) (end -2.0466 -3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0466 -3.429) (end -2.0466 -5.969) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0174 -5.969) (end -2.0466 -5.969) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.3636 -4.445) (end 6.4116 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.4906 -4.318) (end 6.5386 -4.953) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.6402 -4.445) (end 1.41034 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5132 -4.318) (end 1.5348 -4.953) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0466 -0.254) (end -1.6656 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0174 -0.254) (end 1.6364 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.6364 -0.254) (end -1.6656 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.0212 -0.254) (end 6.6402 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9572 -0.254) (end 3.3382 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.3382 -0.254) (end 6.6402 -0.254) (layer F.SilkS) (width 0.15)) + (fp_arc (start 6.0052 -4.59486) (end 6.51066 -5.05206) (angle 90.5) (layer F.SilkS) (width 0.15)) + (fp_arc (start 5.04 -6.0706) (end 6.50304 -4.11734) (angle 75.5) (layer F.SilkS) (width 0.15)) + (fp_arc (start 4.96126 -3.7084) (end 3.3636 -5.0038) (angle 100) (layer F.SilkS) (width 0.15)) + (fp_arc (start 3.8462 -4.64566) (end 3.55664 -4.1275) (angle 104.2) (layer F.SilkS) (width 0.15)) + (fp_arc (start 1.0014 -4.59486) (end 1.5094 -5.05206) (angle 90.5) (layer F.SilkS) (width 0.15)) + (fp_arc (start 0.03874 -6.0706) (end 1.50178 -4.11734) (angle 75.5) (layer F.SilkS) (width 0.15)) + (fp_arc (start -0.03746 -3.7084) (end -1.6402 -5.0038) (angle 100) (layer F.SilkS) (width 0.15)) + (fp_arc (start -1.1576 -4.64566) (end -1.44462 -4.1275) (angle 104.2) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole oval (at 0 0) (size 1.9812 3.9624) (drill 1.3208) (layers *.Cu F.Paste F.SilkS F.Mask)) + (pad 2 thru_hole oval (at 5 0) (size 1.9812 3.9624) (drill 1.3208) (layers *.Cu F.Paste F.SilkS F.Mask)) + (pad 4 thru_hole oval (at 15 0) (size 1.9812 3.9624) (drill 1.3208) (layers *.Cu F.Paste F.SilkS F.Mask)) + (pad 3 thru_hole oval (at 10 0) (size 1.9812 3.9624) (drill 1.3208) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/BARREL_JACK.kicad_mod b/PCB/.pretty/BARREL_JACK.kicad_mod new file mode 100644 index 00000000..c465691e --- /dev/null +++ b/PCB/.pretty/BARREL_JACK.kicad_mod @@ -0,0 +1,18 @@ +(module BARREL_JACK (layer F.Cu) (tedit 0) + (descr "DC Barrel Jack") + (tags "Power Jack") + (fp_text reference REF** (at 10.09904 0 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value BARREL_JACK (at 0 -5.99948) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.0005 -4.50088) (end -4.0005 4.50088) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.50062 -4.50088) (end -7.50062 4.50088) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.50062 4.50088) (end 7.00024 4.50088) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.00024 4.50088) (end 7.00024 -4.50088) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.00024 -4.50088) (end -7.50062 -4.50088) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 6.20014 0) (size 3.50012 3.50012) (drill oval 1.00076 2.99974) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole rect (at 0.20066 0) (size 3.50012 3.50012) (drill oval 1.00076 2.99974) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole rect (at 3.2004 4.699) (size 3.50012 3.50012) (drill oval 2.99974 1.00076) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/BUSPCI.kicad_mod b/PCB/.pretty/BUSPCI.kicad_mod new file mode 100644 index 00000000..e541a62c --- /dev/null +++ b/PCB/.pretty/BUSPCI.kicad_mod @@ -0,0 +1,257 @@ +(module BUSPCI (layer F.Cu) (tedit 0) + (descr "Connecteur Bus PCI") + (tags "PCI CONN") + (fp_text reference REF** (at -35.941 -4.699) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value BUSPCI (at -5.842 -4.699) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -63.754 -3.81) (end -63.754 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -63.754 4.445) (end -0.889 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.889 4.445) (end -0.889 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.889 -3.81) (end 0.889 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.889 -3.81) (end 0.889 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.889 4.445) (end 15.494 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.494 4.445) (end 15.494 -3.81) (layer F.SilkS) (width 0.15)) + (pad B1 connect rect (at -62.865 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B2 connect rect (at -61.595 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B3 connect rect (at -60.325 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B4 connect rect (at -59.055 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B5 connect rect (at -57.785 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B6 connect rect (at -56.515 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B7 connect rect (at -55.245 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B8 connect rect (at -53.975 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B9 connect rect (at -52.705 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B10 connect rect (at -51.435 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B11 connect rect (at -50.165 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B12 connect rect (at -48.895 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B13 connect rect (at -47.625 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B14 connect rect (at -46.355 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B15 connect rect (at -45.085 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B16 connect rect (at -43.815 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B17 connect rect (at -42.545 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B18 connect rect (at -41.275 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B19 connect rect (at -40.005 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B20 connect rect (at -38.735 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B21 connect rect (at -37.465 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B22 connect rect (at -36.195 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B23 connect rect (at -34.925 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B24 connect rect (at -33.655 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B25 connect rect (at -32.385 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B26 connect rect (at -31.115 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B27 connect rect (at -29.845 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B28 connect rect (at -28.575 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B29 connect rect (at -27.305 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B30 connect rect (at -26.035 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B31 connect rect (at -24.765 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B32 connect rect (at -23.495 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B33 connect rect (at -22.225 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B34 connect rect (at -20.955 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B35 connect rect (at -19.685 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B36 connect rect (at -18.415 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B37 connect rect (at -17.145 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B38 connect rect (at -15.875 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B39 connect rect (at -14.605 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B40 connect rect (at -13.335 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B41 connect rect (at -12.065 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B42 connect rect (at -10.795 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B43 connect rect (at -9.525 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B44 connect rect (at -8.255 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B45 connect rect (at -6.985 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B46 connect rect (at -5.715 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B47 connect rect (at -4.445 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B48 connect rect (at -3.175 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B49 connect rect (at -1.905 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B52 connect rect (at 1.905 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B53 connect rect (at 3.175 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B54 connect rect (at 4.445 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B55 connect rect (at 5.715 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B56 connect rect (at 6.985 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B57 connect rect (at 8.255 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B58 connect rect (at 9.525 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B59 connect rect (at 10.795 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B60 connect rect (at 12.065 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B61 connect rect (at 13.335 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad B62 connect rect (at 14.605 -0.254) (size 1.016 4.572) (layers F.Cu F.Mask)) + (pad A1 connect rect (at -62.865 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A2 connect rect (at -61.595 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A3 connect rect (at -60.325 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A4 connect rect (at -59.055 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A5 connect rect (at -57.785 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A6 connect rect (at -56.515 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A7 connect rect (at -55.245 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A8 connect rect (at -53.975 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A9 connect rect (at -52.705 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A10 connect rect (at -51.435 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A11 connect rect (at -50.165 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A12 connect rect (at -48.895 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A13 connect rect (at -47.625 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A14 connect rect (at -46.355 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A15 connect rect (at -45.085 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A16 connect rect (at -43.815 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A17 connect rect (at -42.545 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A18 connect rect (at -41.275 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A19 connect rect (at -40.005 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A20 connect rect (at -38.735 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A21 connect rect (at -37.465 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A22 connect rect (at -36.195 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A23 connect rect (at -34.925 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A24 connect rect (at -33.655 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A25 connect rect (at -32.385 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A26 connect rect (at -31.115 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A27 connect rect (at -29.845 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A28 connect rect (at -28.575 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A29 connect rect (at -27.305 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A30 connect rect (at -26.035 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A31 connect rect (at -24.765 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A32 connect rect (at -23.495 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A33 connect rect (at -22.225 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A34 connect rect (at -20.955 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A35 connect rect (at -19.685 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A36 connect rect (at -18.415 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A37 connect rect (at -17.145 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A38 connect rect (at -15.875 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A39 connect rect (at -14.605 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A40 connect rect (at -13.335 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A41 connect rect (at -12.065 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A42 connect rect (at -10.795 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A43 connect rect (at -9.525 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A44 connect rect (at -8.255 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A45 connect rect (at -6.985 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A46 connect rect (at -5.715 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A47 connect rect (at -4.445 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A48 connect rect (at -3.175 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A49 connect rect (at -1.905 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A52 connect rect (at 1.905 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A53 connect rect (at 3.175 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A54 connect rect (at 4.445 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A55 connect rect (at 5.715 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A56 connect rect (at 6.985 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A57 connect rect (at 8.255 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A58 connect rect (at 9.525 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A59 connect rect (at 10.795 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A60 connect rect (at 12.065 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A61 connect rect (at 13.335 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad A62 connect rect (at 14.605 -0.254) (size 1.016 4.572) (layers B.Cu B.Mask)) + (pad B2 connect rect (at -61.595 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B3 connect rect (at -60.325 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B4 connect rect (at -59.055 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B5 connect rect (at -57.785 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B6 connect rect (at -56.515 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B7 connect rect (at -55.245 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B8 connect rect (at -53.975 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B9 connect rect (at -52.705 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B10 connect rect (at -51.435 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B11 connect rect (at -50.165 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B12 connect rect (at -48.895 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B13 connect rect (at -47.625 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B14 connect rect (at -46.355 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B15 connect rect (at -45.085 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B16 connect rect (at -43.815 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B17 connect rect (at -42.545 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B18 connect rect (at -41.275 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B19 connect rect (at -40.005 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B20 connect rect (at -38.735 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B21 connect rect (at -37.465 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B22 connect rect (at -36.195 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B23 connect rect (at -34.925 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B24 connect rect (at -33.655 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B25 connect rect (at -32.385 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B26 connect rect (at -31.115 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B27 connect rect (at -29.845 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B28 connect rect (at -28.575 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B29 connect rect (at -27.305 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B30 connect rect (at -26.035 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B31 connect rect (at -24.765 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B32 connect rect (at -23.495 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B33 connect rect (at -22.225 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B34 connect rect (at -20.955 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B35 connect rect (at -19.685 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B36 connect rect (at -18.415 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B37 connect rect (at -17.145 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B38 connect rect (at -15.875 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B39 connect rect (at -14.605 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B40 connect rect (at -13.335 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B41 connect rect (at -12.065 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B42 connect rect (at -10.795 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B43 connect rect (at -9.525 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B44 connect rect (at -8.255 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B45 connect rect (at -6.985 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B46 connect rect (at -5.715 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B47 connect rect (at -4.445 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B48 connect rect (at -3.175 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B49 connect rect (at -1.905 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B52 connect rect (at 1.905 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B53 connect rect (at 3.175 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B54 connect rect (at 4.445 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B55 connect rect (at 5.715 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B56 connect rect (at 6.985 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B57 connect rect (at 8.255 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B58 connect rect (at 9.525 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B59 connect rect (at 10.795 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B60 connect rect (at 12.065 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B61 connect rect (at 13.335 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B62 connect rect (at 14.605 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad B1 connect rect (at -62.865 2.413) (size 0.508 0.762) (layers F.Cu F.Mask)) + (pad A1 connect rect (at -62.865 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A2 connect rect (at -61.595 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A3 connect rect (at -60.325 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A4 connect rect (at -59.055 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A5 connect rect (at -57.785 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A6 connect rect (at -56.515 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A7 connect rect (at -55.245 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A8 connect rect (at -53.975 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A9 connect rect (at -52.705 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A10 connect rect (at -51.435 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A11 connect rect (at -50.165 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A12 connect rect (at -48.895 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A13 connect rect (at -47.625 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A14 connect rect (at -46.355 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A15 connect rect (at -45.085 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A16 connect rect (at -43.815 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A17 connect rect (at -42.545 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A18 connect rect (at -41.275 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A19 connect rect (at -40.005 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A20 connect rect (at -38.735 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A21 connect rect (at -37.465 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A22 connect rect (at -36.195 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A23 connect rect (at -34.925 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A24 connect rect (at -33.655 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A25 connect rect (at -32.385 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A26 connect rect (at -31.115 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A27 connect rect (at -29.845 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A28 connect rect (at -28.575 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A29 connect rect (at -27.305 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A30 connect rect (at -26.035 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A31 connect rect (at -24.765 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A32 connect rect (at -23.495 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A33 connect rect (at -22.225 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A34 connect rect (at -20.955 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A35 connect rect (at -19.685 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A36 connect rect (at -18.415 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A37 connect rect (at -17.145 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A38 connect rect (at -15.875 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A39 connect rect (at -14.605 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A40 connect rect (at -13.335 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A41 connect rect (at -12.065 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A42 connect rect (at -10.795 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A43 connect rect (at -9.525 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A44 connect rect (at -8.255 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A45 connect rect (at -6.985 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A46 connect rect (at -5.715 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A47 connect rect (at -4.445 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A48 connect rect (at -3.175 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A49 connect rect (at -1.905 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A52 connect rect (at 1.905 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A53 connect rect (at 3.175 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A54 connect rect (at 4.445 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A55 connect rect (at 5.715 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A56 connect rect (at 6.985 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A57 connect rect (at 8.255 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A58 connect rect (at 9.525 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A59 connect rect (at 10.795 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A60 connect rect (at 12.065 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A61 connect rect (at 13.335 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) + (pad A62 connect rect (at 14.605 2.413) (size 0.508 0.762) (layers B.Cu B.Mask)) +) diff --git a/PCB/.pretty/BUS_AT.kicad_mod b/PCB/.pretty/BUS_AT.kicad_mod new file mode 100644 index 00000000..9fe14dd5 --- /dev/null +++ b/PCB/.pretty/BUS_AT.kicad_mod @@ -0,0 +1,116 @@ +(module BUS_AT (layer F.Cu) (tedit 0) + (descr "Connecteur Bus AT ISA 16 bits") + (tags "CONN BUS ISA") + (fp_text reference REF** (at -22.86 -6.985) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value BUS_AT (at -43.815 -6.985) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 40.64 3.81) (end -40.64 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -40.64 3.81) (end -40.64 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -40.64 -3.81) (end -45.72 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -45.72 -3.81) (end -45.72 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -45.72 3.81) (end -93.98 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -93.98 3.81) (end -93.98 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -93.98 -5.08) (end 40.64 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 40.64 -5.08) (end 40.64 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 connect rect (at 38.1 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 2 connect rect (at 35.56 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 3 connect rect (at 33.02 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 4 connect rect (at 30.48 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 5 connect rect (at 27.94 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 6 connect rect (at 25.4 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 7 connect rect (at 22.86 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 8 connect rect (at 20.32 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 9 connect rect (at 17.78 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 10 connect rect (at 15.24 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 11 connect rect (at 12.7 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 12 connect rect (at 10.16 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 13 connect rect (at 7.62 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 14 connect rect (at 5.08 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 15 connect rect (at 2.54 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 16 connect rect (at 0 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 17 connect rect (at -2.54 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 18 connect rect (at -5.08 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 19 connect rect (at -7.62 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 20 connect rect (at -10.16 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 21 connect rect (at -12.7 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 22 connect rect (at -15.24 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 23 connect rect (at -17.78 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 24 connect rect (at -20.32 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 25 connect rect (at -22.86 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 26 connect rect (at -25.4 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 27 connect rect (at -27.94 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 28 connect rect (at -30.48 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 29 connect rect (at -33.02 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 30 connect rect (at -35.56 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 31 connect rect (at -38.1 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 32 connect rect (at 38.1 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 33 connect rect (at 35.56 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 34 connect rect (at 33.02 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 35 connect rect (at 30.48 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 36 connect rect (at 27.94 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 37 connect rect (at 25.4 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 38 connect rect (at 22.86 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 39 connect rect (at 20.32 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 40 connect rect (at 17.78 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 41 connect rect (at 15.24 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 42 connect rect (at 12.7 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 43 connect rect (at 10.16 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 44 connect rect (at 7.62 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 45 connect rect (at 5.08 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 46 connect rect (at 2.54 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 47 connect rect (at 0 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 48 connect rect (at -2.54 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 49 connect rect (at -5.08 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 50 connect rect (at -7.62 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 51 connect rect (at -10.16 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 52 connect rect (at -12.7 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 53 connect rect (at -15.24 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 54 connect rect (at -17.78 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 55 connect rect (at -20.32 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 56 connect rect (at -22.86 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 57 connect rect (at -25.4 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 58 connect rect (at -27.94 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 59 connect rect (at -30.48 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 60 connect rect (at -33.02 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 61 connect rect (at -35.56 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 62 connect rect (at -38.1 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 63 connect rect (at -48.26 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 64 connect rect (at -50.8 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 65 connect rect (at -53.34 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 66 connect rect (at -55.88 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 67 connect rect (at -58.42 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 68 connect rect (at -60.96 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 69 connect rect (at -63.5 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 70 connect rect (at -66.04 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 71 connect rect (at -68.58 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 72 connect rect (at -71.12 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 73 connect rect (at -73.66 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 74 connect rect (at -76.2 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 75 connect rect (at -78.74 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 76 connect rect (at -81.28 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 77 connect rect (at -83.82 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 78 connect rect (at -86.36 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 79 connect rect (at -88.9 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 80 connect rect (at -91.44 0) (size 1.778 7.62) (layers B.Cu B.Mask)) + (pad 81 connect rect (at -48.26 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 82 connect rect (at -50.8 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 83 connect rect (at -53.34 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 84 connect rect (at -55.88 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 85 connect rect (at -58.42 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 86 connect rect (at -60.96 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 87 connect rect (at -63.5 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 88 connect rect (at -66.04 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 89 connect rect (at -68.58 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 90 connect rect (at -71.12 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 91 connect rect (at -73.66 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 92 connect rect (at -76.2 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 93 connect rect (at -78.74 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 94 connect rect (at -81.28 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 95 connect rect (at -83.82 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 96 connect rect (at -86.36 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 97 connect rect (at -88.9 0) (size 1.778 7.62) (layers F.Cu F.Mask)) + (pad 98 connect rect (at -91.44 0) (size 1.778 7.62) (layers F.Cu F.Mask)) +) diff --git a/PCB/.pretty/Banana_Jack_1Pin.kicad_mod b/PCB/.pretty/Banana_Jack_1Pin.kicad_mod new file mode 100644 index 00000000..49cea79f --- /dev/null +++ b/PCB/.pretty/Banana_Jack_1Pin.kicad_mod @@ -0,0 +1,17 @@ +(module Banana_Jack_1Pin (layer F.Cu) (tedit 0) + (descr "Single banana socket, footprint - 6mm drill") + (tags "banana socket") + (fp_text reference REF** (at 0.508 -6.858) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Banana_Jack_1Pin (at 0.762 -8.382) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 0 0) (end 0 -6.096) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole circle (at 0 0) (size 10.16 10.16) (drill 6.096) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/Banana_Jack_1Pin.wrl + (at (xyz 0 0 0)) + (scale (xyz 2 2 2)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/Banana_Jack_2Pin.kicad_mod b/PCB/.pretty/Banana_Jack_2Pin.kicad_mod new file mode 100644 index 00000000..1c13a9c9 --- /dev/null +++ b/PCB/.pretty/Banana_Jack_2Pin.kicad_mod @@ -0,0 +1,21 @@ +(module Banana_Jack_2Pin (layer F.Cu) (tedit 0) + (descr "Dual banana socket, footprint - 2 x 6mm drills") + (tags "banana socket") + (fp_text reference REF** (at 0 1.27) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Banana_Jack_2Pin (at 0 -1.27) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -21.59 -6.35) (end 21.59 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 21.59 -6.35) (end 21.59 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 21.59 6.35) (end -21.59 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -21.59 6.35) (end -21.59 -6.35) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole circle (at -14.986 0) (size 10.16 10.16) (drill 6.096) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 14.986 0) (size 10.16 10.16) (drill 6.096) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/Banana_Jack_2Pin.wrl + (at (xyz 0 0 0)) + (scale (xyz 2 2 2)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/Banana_Jack_3Pin.kicad_mod b/PCB/.pretty/Banana_Jack_3Pin.kicad_mod new file mode 100644 index 00000000..b747422e --- /dev/null +++ b/PCB/.pretty/Banana_Jack_3Pin.kicad_mod @@ -0,0 +1,22 @@ +(module Banana_Jack_3Pin (layer F.Cu) (tedit 0) + (descr "Triple banana socket, footprint - 3 x 6mm drills") + (tags "banana socket") + (fp_text reference REF** (at 10.16 -7.62) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Banana_Jack_3Pin (at -7.62 -7.62) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -21.59 -6.35) (end 21.59 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 21.59 -6.35) (end 21.59 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 21.59 6.35) (end -21.59 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -21.59 6.35) (end -21.59 -6.35) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole circle (at -14.986 0) (size 10.16 10.16) (drill 6.096) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 14.986 0) (size 10.16 10.16) (drill 6.096) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 0 0) (size 10.16 10.16) (drill 6.096) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/Banana_Jack_3Pin.wrl + (at (xyz 0 0 0)) + (scale (xyz 2 2 2)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/C96ABCFD.kicad_mod b/PCB/.pretty/C96ABCFD.kicad_mod new file mode 100644 index 00000000..44132d65 --- /dev/null +++ b/PCB/.pretty/C96ABCFD.kicad_mod @@ -0,0 +1,123 @@ +(module C96ABCFD (layer F.Cu) (tedit 0) + (descr "Connecteur DIN Europe 96 contacts ABC male droit") + (tags "CONN DIN") + (fp_text reference REF** (at -26.035 -7.62) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C96ABCFD (at 20.955 -7.62) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -46.99 5.08) (end 46.99 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 46.99 5.08) (end 46.99 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -46.99 -2.54) (end -46.99 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -41.91 -2.54) (end -41.91 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 41.91 -2.54) (end 41.91 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -46.99 -2.54) (end -46.99 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -46.99 -5.08) (end 46.99 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 46.99 -5.08) (end 46.99 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 41.91 -5.08) (end 41.91 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -41.91 -2.54) (end -41.91 -5.08) (layer F.SilkS) (width 0.15)) + (pad 65 thru_hole circle (at -44.45 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 66 thru_hole circle (at 44.45 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad A3 thru_hole circle (at -34.29 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A4 thru_hole circle (at -31.75 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A5 thru_hole circle (at -29.21 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A6 thru_hole circle (at -26.67 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A7 thru_hole circle (at -24.13 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A8 thru_hole circle (at -21.59 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A9 thru_hole circle (at -19.05 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A10 thru_hole circle (at -16.51 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A11 thru_hole circle (at -13.97 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A12 thru_hole circle (at -11.43 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A13 thru_hole circle (at -8.89 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A14 thru_hole circle (at -6.35 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A15 thru_hole circle (at -3.81 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A16 thru_hole circle (at -1.27 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A17 thru_hole circle (at 1.27 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A18 thru_hole circle (at 3.81 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A19 thru_hole circle (at 6.35 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A20 thru_hole circle (at 8.89 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A21 thru_hole circle (at 11.43 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A22 thru_hole circle (at 13.97 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A23 thru_hole circle (at 16.51 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A24 thru_hole circle (at 19.05 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A25 thru_hole circle (at 21.59 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A26 thru_hole circle (at 24.13 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A27 thru_hole circle (at 26.67 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A28 thru_hole circle (at 29.21 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A29 thru_hole circle (at 31.75 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A30 thru_hole circle (at 34.29 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A31 thru_hole circle (at 36.83 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A32 thru_hole circle (at 39.37 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A2 thru_hole circle (at -36.83 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A1 thru_hole rect (at -39.37 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B1 thru_hole circle (at -39.37 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B2 thru_hole circle (at -36.83 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B3 thru_hole circle (at -34.29 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B4 thru_hole circle (at -31.75 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B5 thru_hole circle (at -29.21 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B6 thru_hole circle (at -26.67 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B7 thru_hole circle (at -24.13 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B8 thru_hole circle (at -21.59 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B9 thru_hole circle (at -19.05 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B10 thru_hole circle (at -16.51 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B11 thru_hole circle (at -13.97 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B12 thru_hole circle (at -11.43 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B13 thru_hole circle (at -8.89 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B14 thru_hole circle (at -6.35 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B15 thru_hole circle (at -3.81 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B16 thru_hole circle (at -1.27 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B17 thru_hole circle (at 1.27 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B18 thru_hole circle (at 3.81 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B19 thru_hole circle (at 6.35 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B20 thru_hole circle (at 8.89 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B21 thru_hole circle (at 11.43 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B22 thru_hole circle (at 13.97 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B23 thru_hole circle (at 16.51 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B24 thru_hole circle (at 19.05 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B25 thru_hole circle (at 21.59 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B26 thru_hole circle (at 24.13 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B27 thru_hole circle (at 26.67 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B28 thru_hole circle (at 29.21 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B29 thru_hole circle (at 31.75 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B30 thru_hole circle (at 34.29 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B31 thru_hole circle (at 36.83 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B32 thru_hole circle (at 39.37 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C1 thru_hole circle (at -39.37 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C2 thru_hole circle (at -36.83 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C3 thru_hole circle (at -34.29 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C4 thru_hole circle (at -31.75 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C5 thru_hole circle (at -29.21 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C6 thru_hole circle (at -26.67 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C7 thru_hole circle (at -24.13 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C8 thru_hole circle (at -21.59 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C9 thru_hole circle (at -19.05 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C10 thru_hole circle (at -16.51 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C11 thru_hole circle (at -13.97 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C12 thru_hole circle (at -11.43 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C13 thru_hole circle (at -8.89 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C14 thru_hole circle (at -6.35 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C15 thru_hole circle (at -3.81 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C16 thru_hole circle (at -1.27 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C17 thru_hole circle (at 1.27 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C18 thru_hole circle (at 3.81 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C19 thru_hole circle (at 6.35 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C20 thru_hole circle (at 8.89 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C21 thru_hole circle (at 11.43 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C22 thru_hole circle (at 13.97 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C23 thru_hole circle (at 16.51 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C24 thru_hole circle (at 19.05 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C25 thru_hole circle (at 21.59 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C26 thru_hole circle (at 24.13 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C27 thru_hole circle (at 26.67 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C28 thru_hole circle (at 29.21 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C29 thru_hole circle (at 31.75 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C30 thru_hole circle (at 34.29 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C31 thru_hole circle (at 36.83 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C32 thru_hole circle (at 39.37 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/C96ABCFD.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/C96ABCMD.kicad_mod b/PCB/.pretty/C96ABCMD.kicad_mod new file mode 100644 index 00000000..babd9ce7 --- /dev/null +++ b/PCB/.pretty/C96ABCMD.kicad_mod @@ -0,0 +1,123 @@ +(module C96ABCMD (layer F.Cu) (tedit 0) + (descr "Connecteur DIN Europe 96 contacts ABC male droit") + (tags "CONN DIN") + (fp_text reference REF** (at -26.035 -7.62) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C96ABCMD (at 20.955 -7.62) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -46.99 -5.08) (end 46.99 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 46.99 -5.08) (end 46.99 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -46.99 2.54) (end -46.99 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -41.91 2.54) (end -41.91 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 41.91 2.54) (end 41.91 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -46.99 2.54) (end -46.99 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -46.99 5.08) (end 46.99 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 46.99 5.08) (end 46.99 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 41.91 5.08) (end 41.91 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -41.91 2.54) (end -41.91 5.08) (layer F.SilkS) (width 0.15)) + (pad 65 thru_hole circle (at -44.45 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 66 thru_hole circle (at 44.45 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad A3 thru_hole circle (at -34.29 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A4 thru_hole circle (at -31.75 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A5 thru_hole circle (at -29.21 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A6 thru_hole circle (at -26.67 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A7 thru_hole circle (at -24.13 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A8 thru_hole circle (at -21.59 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A9 thru_hole circle (at -19.05 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A10 thru_hole circle (at -16.51 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A11 thru_hole circle (at -13.97 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A12 thru_hole circle (at -11.43 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A13 thru_hole circle (at -8.89 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A14 thru_hole circle (at -6.35 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A15 thru_hole circle (at -3.81 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A16 thru_hole circle (at -1.27 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A17 thru_hole circle (at 1.27 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A18 thru_hole circle (at 3.81 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A19 thru_hole circle (at 6.35 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A20 thru_hole circle (at 8.89 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A21 thru_hole circle (at 11.43 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A22 thru_hole circle (at 13.97 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A23 thru_hole circle (at 16.51 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A24 thru_hole circle (at 19.05 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A25 thru_hole circle (at 21.59 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A26 thru_hole circle (at 24.13 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A27 thru_hole circle (at 26.67 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A28 thru_hole circle (at 29.21 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A29 thru_hole circle (at 31.75 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A30 thru_hole circle (at 34.29 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A31 thru_hole circle (at 36.83 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A32 thru_hole circle (at 39.37 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A2 thru_hole circle (at -36.83 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A1 thru_hole rect (at -39.37 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B1 thru_hole circle (at -39.37 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B2 thru_hole circle (at -36.83 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B3 thru_hole circle (at -34.29 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B4 thru_hole circle (at -31.75 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B5 thru_hole circle (at -29.21 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B6 thru_hole circle (at -26.67 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B7 thru_hole circle (at -24.13 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B8 thru_hole circle (at -21.59 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B9 thru_hole circle (at -19.05 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B10 thru_hole circle (at -16.51 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B11 thru_hole circle (at -13.97 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B12 thru_hole circle (at -11.43 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B13 thru_hole circle (at -8.89 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B14 thru_hole circle (at -6.35 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B15 thru_hole circle (at -3.81 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B16 thru_hole circle (at -1.27 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B17 thru_hole circle (at 1.27 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B18 thru_hole circle (at 3.81 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B19 thru_hole circle (at 6.35 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B20 thru_hole circle (at 8.89 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B21 thru_hole circle (at 11.43 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B22 thru_hole circle (at 13.97 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B23 thru_hole circle (at 16.51 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B24 thru_hole circle (at 19.05 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B25 thru_hole circle (at 21.59 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B26 thru_hole circle (at 24.13 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B27 thru_hole circle (at 26.67 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B28 thru_hole circle (at 29.21 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B29 thru_hole circle (at 31.75 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B30 thru_hole circle (at 34.29 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B31 thru_hole circle (at 36.83 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B32 thru_hole circle (at 39.37 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C1 thru_hole circle (at -39.37 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C2 thru_hole circle (at -36.83 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C3 thru_hole circle (at -34.29 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C4 thru_hole circle (at -31.75 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C5 thru_hole circle (at -29.21 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C6 thru_hole circle (at -26.67 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C7 thru_hole circle (at -24.13 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C8 thru_hole circle (at -21.59 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C9 thru_hole circle (at -19.05 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C10 thru_hole circle (at -16.51 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C11 thru_hole circle (at -13.97 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C12 thru_hole circle (at -11.43 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C13 thru_hole circle (at -8.89 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C14 thru_hole circle (at -6.35 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C15 thru_hole circle (at -3.81 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C16 thru_hole circle (at -1.27 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C17 thru_hole circle (at 1.27 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C18 thru_hole circle (at 3.81 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C19 thru_hole circle (at 6.35 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C20 thru_hole circle (at 8.89 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C21 thru_hole circle (at 11.43 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C22 thru_hole circle (at 13.97 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C23 thru_hole circle (at 16.51 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C24 thru_hole circle (at 19.05 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C25 thru_hole circle (at 21.59 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C26 thru_hole circle (at 24.13 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C27 thru_hole circle (at 26.67 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C28 thru_hole circle (at 29.21 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C29 thru_hole circle (at 31.75 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C30 thru_hole circle (at 34.29 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C31 thru_hole circle (at 36.83 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C32 thru_hole circle (at 39.37 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/C96ABCMD.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/CNT3BRCMS.kicad_mod b/PCB/.pretty/CNT3BRCMS.kicad_mod new file mode 100644 index 00000000..be921d4b --- /dev/null +++ b/PCB/.pretty/CNT3BRCMS.kicad_mod @@ -0,0 +1,26 @@ +(module CNT3BRCMS (layer F.Cu) (tedit 0) + (attr smd) + (fp_text reference REF** (at 2.54 0 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CNT3BRCMS (at 2.54 0 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 4.7625 -2.667) (end 3.81 -2.667) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -2.667) (end 3.81 2.667) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 2.667) (end 4.7625 2.667) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 0) (end 0.635 -2.794) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 -2.794) (end 1.397 -2.794) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.397 -2.794) (end 1.397 -4.826) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.397 -4.826) (end 4.7625 -4.826) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.7625 -4.826) (end 4.7625 4.826) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.7625 4.826) (end 1.397 4.826) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.397 4.826) (end 1.397 2.794) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.397 2.794) (end 0.635 2.794) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 2.794) (end 0.635 0) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at 0 -1.27) (size 1.778 0.8128) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at 0 0) (size 1.778 0.8128) (layers F.Cu F.Paste F.Mask)) + (pad 3 smd rect (at 0 1.27) (size 1.778 0.8128) (layers F.Cu F.Paste F.Mask)) + (pad "" smd rect (at 2.9845 -3.81) (size 3.048 2.032) (layers F.Cu F.Paste F.Mask)) + (pad "" smd rect (at 2.9845 3.81) (size 3.048 2.032) (layers F.Cu F.Paste F.Mask)) +) diff --git a/PCB/.pretty/CR1220.kicad_mod b/PCB/.pretty/CR1220.kicad_mod new file mode 100644 index 00000000..6b049dea --- /dev/null +++ b/PCB/.pretty/CR1220.kicad_mod @@ -0,0 +1,22 @@ +(module CR1220 (layer F.Cu) (tedit 0) + (fp_text reference REF** (at 6.858 0 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CR1220 (at 2.286 0 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -6.35 2.54) (end -2.667 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.35 -2.54) (end -2.667 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.35 2.54) (end -7.62 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 1.27) (end -7.62 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 -1.27) (end -6.35 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.001 -4.318) (end 9.525 -5.588) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.001 4.318) (end 9.525 5.588) (layer F.SilkS) (width 0.15)) + (fp_circle (center 4.445 0) (end -1.143 0) (layer F.SilkS) (width 0.15)) + (fp_circle (center 4.445 0) (end -2.667 2.54) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole circle (at -5.08 0) (size 3.556 3.556) (drill 2.54) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 4.445 0) (size 2.54 2.54) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 4.445 5.08) (size 2.159 2.159) (drill 2.032) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 8.89 -2.54) (size 2.159 2.159) (drill 2.032) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 0 -2.54) (size 2.159 2.159) (drill 2.032) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/CR2032H.kicad_mod b/PCB/.pretty/CR2032H.kicad_mod new file mode 100644 index 00000000..a768c87e --- /dev/null +++ b/PCB/.pretty/CR2032H.kicad_mod @@ -0,0 +1,23 @@ +(module CR2032H (layer F.Cu) (tedit 0) + (fp_text reference REF** (at 0 -12.7) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CR2032H (at 0 12.7) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 15.24 3.81) (end 15.24 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.605 4.445) (end 15.875 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.795 -2.54) (end 17.145 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.145 -2.54) (end 17.145 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.145 2.54) (end 10.795 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.145 -3.175) (end 17.78 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.78 -3.175) (end 17.78 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.78 3.175) (end 17.145 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.875 -3.175) (end 17.145 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.145 3.175) (end 10.795 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.795 -3.175) (end 15.875 -3.175) (layer F.SilkS) (width 0.15)) + (fp_circle (center 0 0) (end -1.27 -8.89) (layer F.SilkS) (width 0.15)) + (fp_circle (center 0 0) (end 6.35 8.89) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at -7.62 0) (size 2.286 2.286) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole circle (at 15.24 0) (size 2.286 2.286) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/CR2032V.kicad_mod b/PCB/.pretty/CR2032V.kicad_mod new file mode 100644 index 00000000..3c49cecf --- /dev/null +++ b/PCB/.pretty/CR2032V.kicad_mod @@ -0,0 +1,19 @@ +(module CR2032V (layer F.Cu) (tedit 0) + (fp_text reference REF** (at -7.62 -5.08) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CR2032V (at 0 5.08) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -12.065 -3.302) (end 12.065 -3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.778 -1.778) (end 2.794 -1.778) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.874 2.286) (end 7.874 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.366 1.778) (end 8.382 1.778) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.065 3.175) (end 12.065 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.065 -2.667) (end -12.065 -2.667) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.065 -3.175) (end -12.065 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.065 3.175) (end 12.065 3.175) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole circle (at -5.08 1.778) (size 2.286 2.286) (drill 1.27) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole circle (at 5.08 1.778) (size 2.286 2.286) (drill 1.27) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 0 -1.524) (size 2.286 2.286) (drill 1.27) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/DB15FC.kicad_mod b/PCB/.pretty/DB15FC.kicad_mod new file mode 100644 index 00000000..4344932f --- /dev/null +++ b/PCB/.pretty/DB15FC.kicad_mod @@ -0,0 +1,51 @@ +(module DB15FC (layer F.Cu) (tedit 0) + (descr "Connecteur DB15 femelle couche") + (tags "CONN DB15") + (fp_text reference REF** (at 0 -15.24) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB15FC (at 0 -6.35) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 19.812 -11.43) (end -19.812 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.812 -12.7) (end -19.812 -12.7) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.462 -8.255) (end -13.462 -8.255) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.462 -18.415) (end 13.462 -18.415) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.462 -12.7) (end 13.462 -18.415) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.462 -8.255) (end 13.462 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.097 -6.35) (end 14.097 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.446 -6.35) (end 19.812 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.446 2.54) (end 12.446 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.812 2.54) (end 12.446 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.812 2.54) (end 19.812 -12.7) (layer F.SilkS) (width 0.15)) + (fp_line (start -14.097 -11.43) (end -14.097 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.192 -6.35) (end -12.192 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.812 2.54) (end -19.812 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.812 -6.35) (end -12.192 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.462 -8.255) (end -13.462 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.462 -18.415) (end -13.462 -12.7) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.812 -12.7) (end -19.812 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.812 2.54) (end -12.192 2.54) (layer F.SilkS) (width 0.15)) + (pad "" thru_hole circle (at 16.764 -1.016) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -16.764 -1.27) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at -9.652 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -6.858 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -4.191 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -1.397 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 1.397 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 4.191 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 6.858 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 9.652 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -8.0772 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at -5.5372 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at -2.7432 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at 0 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at 2.7432 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at 5.5372 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at 8.2804 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/DB15FC.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/DB15FD.kicad_mod b/PCB/.pretty/DB15FD.kicad_mod new file mode 100644 index 00000000..095ef70c --- /dev/null +++ b/PCB/.pretty/DB15FD.kicad_mod @@ -0,0 +1,36 @@ +(module DB15FD (layer F.Cu) (tedit 0) + (descr "Connecteur DB15 femelle droit") + (tags "CONN DB15") + (fp_text reference REF** (at -10.16 -5.08 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB15FD (at 10.16 -5.08 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -18.415 -3.048) (end -18.415 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -18.415 3.302) (end 19.431 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.431 3.302) (end 19.431 -3.048) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.431 -3.048) (end -18.415 -3.048) (layer F.SilkS) (width 0.15)) + (pad 0 thru_hole circle (at -16.129 0.127) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 0 thru_hole circle (at 17.145 0.127) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at 10.16 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 7.366 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 4.699 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 1.905 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -0.889 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -3.556 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -6.35 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -9.017 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at 8.763 1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at 5.969 1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at 3.302 1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at 0.508 1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at -2.159 1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at -4.953 1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at -7.747 1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/DB15FD.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/DB15F_CI.kicad_mod b/PCB/.pretty/DB15F_CI.kicad_mod new file mode 100644 index 00000000..ba2ac1c4 --- /dev/null +++ b/PCB/.pretty/DB15F_CI.kicad_mod @@ -0,0 +1,48 @@ +(module DB15F_CI (layer F.Cu) (tedit 0) + (descr "Connecteur DB15 femelle encarte") + (tags "CONN DB15") + (fp_text reference REF** (at 0 -8.382) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB15F_CI (at 0 -2.667) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -12.7 -5.588) (end -12.7 -11.938) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.7 -11.938) (end 12.7 -11.938) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.7 -11.938) (end 12.7 -5.588) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.97 -4.318) (end -19.685 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.685 -4.318) (end -19.685 -5.588) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.685 -5.588) (end 19.685 -5.588) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.685 -5.588) (end 19.685 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.685 -4.318) (end 13.97 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.335 -1.143) (end -13.97 -1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.97 -1.143) (end -13.97 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.97 -4.318) (end 13.97 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.97 -4.318) (end 13.97 -1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.97 -1.143) (end 13.335 -1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.43 0.127) (end -13.335 0.127) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.335 0.127) (end -13.335 -1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.335 -1.143) (end 13.335 -1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.335 -1.143) (end 13.335 0.127) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.335 0.127) (end 11.43 0.127) (layer F.SilkS) (width 0.15)) + (pad 4 connect rect (at -1.397 2.667) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 3 connect rect (at -4.191 2.667) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 2 connect rect (at -6.985 2.667) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 1 connect rect (at -9.779 2.667) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 5 connect rect (at 1.397 2.667) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 6 connect rect (at 4.191 2.667) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 7 connect rect (at 6.985 2.667) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 8 connect rect (at 9.779 2.667) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 9 connect rect (at -8.382 2.667) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 10 connect rect (at -5.588 2.667) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 11 connect rect (at -2.794 2.667) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 12 connect rect (at 0 2.667) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 13 connect rect (at 2.794 2.667) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 14 connect rect (at 5.588 2.667) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 15 connect rect (at 8.382 2.667) (size 1.778 5.08) (layers B.Cu B.Mask)) + (model Connect.3dshapes/DB15F_CI.wrl + (at (xyz 0 0 -0.033)) + (scale (xyz 1 1 1)) + (rotate (xyz 90 180 0)) + ) +) diff --git a/PCB/.pretty/DB15MC.kicad_mod b/PCB/.pretty/DB15MC.kicad_mod new file mode 100644 index 00000000..ebdd164f --- /dev/null +++ b/PCB/.pretty/DB15MC.kicad_mod @@ -0,0 +1,51 @@ +(module DB15MC (layer F.Cu) (tedit 0) + (descr "Connecteur DB15 MALE couche") + (tags "CONN DB15") + (fp_text reference REF** (at 0 -15.24) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB15MC (at 0 -6.35) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 19.812 -11.43) (end -19.812 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.812 -12.7) (end -19.812 -12.7) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.462 -8.255) (end -13.462 -8.255) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.462 -18.415) (end 13.462 -18.415) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.462 -12.7) (end 13.462 -18.415) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.462 -8.255) (end 13.462 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.097 -6.35) (end 14.097 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.446 -6.35) (end 19.812 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.446 2.54) (end 12.446 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.812 2.54) (end 12.446 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.812 2.54) (end 19.812 -12.7) (layer F.SilkS) (width 0.15)) + (fp_line (start -14.097 -11.43) (end -14.097 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.192 -6.35) (end -12.192 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.812 2.54) (end -19.812 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.812 -6.35) (end -12.192 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.462 -8.255) (end -13.462 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.462 -18.415) (end -13.462 -12.7) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.812 -12.7) (end -19.812 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.812 2.54) (end -12.192 2.54) (layer F.SilkS) (width 0.15)) + (pad "" thru_hole circle (at 16.764 -1.016) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -16.764 -1.27) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -9.652 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -6.858 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -4.191 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -1.397 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 1.397 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 4.191 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 6.858 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at 9.652 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at -8.0772 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at -5.5372 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at -2.7432 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at 0 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at 2.7432 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at 5.5372 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at 8.2804 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/DB15MC.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/DB15MD.kicad_mod b/PCB/.pretty/DB15MD.kicad_mod new file mode 100644 index 00000000..a7678976 --- /dev/null +++ b/PCB/.pretty/DB15MD.kicad_mod @@ -0,0 +1,36 @@ +(module DB15MD (layer F.Cu) (tedit 0) + (descr "Connecteur DB15 male droit") + (tags "CONN DB15") + (fp_text reference REF** (at -11.43 -5.08 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB15MD (at 8.89 -5.08 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -19.558 -3.048) (end -19.558 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.558 3.302) (end 18.288 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.288 3.302) (end 18.288 -3.048) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.288 -3.048) (end -19.558 -3.048) (layer F.SilkS) (width 0.15)) + (pad 0 thru_hole circle (at -17.272 0.127) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 0 thru_hole circle (at 16.002 0.127) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at -10.16 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -7.493 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -4.699 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -2.032 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 0.762 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 3.556 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 6.223 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 9.017 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -8.89 1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at -6.096 1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at -3.302 1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at -0.635 1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at 2.159 1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at 4.826 1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at 7.62 1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/DB15MD.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/DB15M_CI.kicad_mod b/PCB/.pretty/DB15M_CI.kicad_mod new file mode 100644 index 00000000..59164808 --- /dev/null +++ b/PCB/.pretty/DB15M_CI.kicad_mod @@ -0,0 +1,48 @@ +(module DB15M_CI (layer F.Cu) (tedit 0) + (descr "Connecteur DB15 femelle encarte") + (tags "CONN DB15") + (fp_text reference REF** (at 0 -8.763) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB15M_CI (at 0 -2.667) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 12.7 -5.588) (end 12.7 -11.938) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.7 -11.938) (end -12.7 -11.938) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.7 -11.938) (end -12.7 -5.588) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.97 -4.318) (end 19.685 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.685 -4.318) (end 19.685 -5.588) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.685 -5.588) (end -19.685 -5.588) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.685 -5.588) (end -19.685 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.685 -4.318) (end -13.97 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.335 -1.143) (end 13.97 -1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.97 -1.143) (end 13.97 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.97 -4.318) (end -13.97 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.97 -4.318) (end -13.97 -1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.97 -1.143) (end -13.335 -1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.43 0.127) (end 13.335 0.127) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.335 0.127) (end 13.335 -1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.335 -1.143) (end -13.335 -1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.335 -1.143) (end -13.335 0.127) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.335 0.127) (end -11.43 0.127) (layer F.SilkS) (width 0.15)) + (pad 4 connect rect (at 1.397 2.667 180) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 3 connect rect (at 4.191 2.667 180) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 2 connect rect (at 6.985 2.667 180) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 1 connect rect (at 9.779 2.667 180) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 5 connect rect (at -1.397 2.667 180) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 6 connect rect (at -4.191 2.667 180) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 7 connect rect (at -6.985 2.667 180) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 8 connect rect (at -9.779 2.667 180) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 9 connect rect (at 8.382 2.667 180) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 10 connect rect (at 5.588 2.667 180) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 11 connect rect (at 2.794 2.667 180) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 12 connect rect (at 0 2.667 180) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 13 connect rect (at -2.794 2.667 180) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 14 connect rect (at -5.588 2.667 180) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 15 connect rect (at -8.382 2.667 180) (size 1.778 5.08) (layers B.Cu B.Mask)) + (model Connect.3dshapes/DB15M_CI.wrl + (at (xyz 0 0 -0.033)) + (scale (xyz 1 1 1)) + (rotate (xyz 90 180 0)) + ) +) diff --git a/PCB/.pretty/DB25FC.kicad_mod b/PCB/.pretty/DB25FC.kicad_mod new file mode 100644 index 00000000..41d67f03 --- /dev/null +++ b/PCB/.pretty/DB25FC.kicad_mod @@ -0,0 +1,62 @@ +(module DB25FC (layer F.Cu) (tedit 0) + (descr "Connecteur DB25 femelle couche") + (tags "CONN DB25") + (fp_text reference REF** (at 0 -15.24) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB25FC (at 0 -6.35) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 26.67 -11.43) (end 26.67 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.05 -6.35) (end 19.05 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.955 -11.43) (end 20.955 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.955 -11.43) (end -20.955 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.05 -6.35) (end -19.05 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -26.67 2.54) (end -26.67 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.67 -6.35) (end 19.05 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -26.67 -6.35) (end -19.05 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.32 -8.255) (end 20.32 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 -8.255) (end -20.32 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.32 -18.415) (end 20.32 -12.7) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 -18.415) (end -20.32 -12.7) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.67 -11.43) (end 26.67 -12.7) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.67 -12.7) (end -26.67 -12.7) (layer F.SilkS) (width 0.15)) + (fp_line (start -26.67 -12.7) (end -26.67 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start -26.67 -11.43) (end 26.67 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.05 2.54) (end 26.67 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 -8.255) (end 20.32 -8.255) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 -18.415) (end 20.32 -18.415) (layer F.SilkS) (width 0.15)) + (fp_line (start -26.67 2.54) (end -19.05 2.54) (layer F.SilkS) (width 0.15)) + (pad "" thru_hole circle (at 23.495 -1.27) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -23.495 -1.27) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at -16.51 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -13.716 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -11.049 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -8.255 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -5.461 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -2.667 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 0 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 2.794 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at 5.588 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at 8.382 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at 11.049 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at 13.843 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at 16.637 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at -14.9352 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at -12.3952 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at -9.6012 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at -6.858 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at -4.1148 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at -1.3208 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at 1.4224 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 21 thru_hole circle (at 4.1656 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 22 thru_hole circle (at 7.0104 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 23 thru_hole circle (at 9.7028 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 24 thru_hole circle (at 12.446 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 25 thru_hole circle (at 15.24 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/DB25FC.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/DB25FD.kicad_mod b/PCB/.pretty/DB25FD.kicad_mod new file mode 100644 index 00000000..991411db --- /dev/null +++ b/PCB/.pretty/DB25FD.kicad_mod @@ -0,0 +1,48 @@ +(module DB25FD (layer F.Cu) (tedit 0) + (descr "Connecteur DB25 femelle droit") + (tags "CONN DB25") + (fp_text reference REF** (at -15.24 -5.08 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB25FD (at 12.7 -5.08 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -25.654 -3.175) (end -25.654 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -25.654 -3.175) (end -25.654 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -25.654 3.175) (end 25.781 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 25.781 3.175) (end 25.781 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 25.781 -3.175) (end -25.527 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -25.527 -3.175) (end -25.654 -3.175) (layer F.SilkS) (width 0.15)) + (pad 0 thru_hole circle (at -23.495 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 0 thru_hole circle (at 23.495 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at 16.637 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 13.843 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 11.049 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 8.255 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 5.461 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 2.794 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 0 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -2.794 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -5.588 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at -8.382 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at -11.049 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at -13.843 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at -16.637 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at 15.24 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at 12.446 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at 9.652 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at 6.985 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at 4.191 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at 1.397 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at -1.397 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 21 thru_hole circle (at -4.191 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 22 thru_hole circle (at -6.858 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 23 thru_hole circle (at -9.652 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 24 thru_hole circle (at -12.446 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 25 thru_hole circle (at -15.24 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/DB25FD.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/DB25F_CI.kicad_mod b/PCB/.pretty/DB25F_CI.kicad_mod new file mode 100644 index 00000000..5286660e --- /dev/null +++ b/PCB/.pretty/DB25F_CI.kicad_mod @@ -0,0 +1,59 @@ +(module DB25F_CI (layer F.Cu) (tedit 0) + (descr "Connecteur DB25 femelle encarte") + (tags "CONN DB25") + (fp_text reference REF** (at 0 -2.54 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB25F_CI (at 0 -8.89 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 19.05 -0.508) (end 19.05 1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.05 1.143) (end 17.653 1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.05 -0.508) (end -19.05 1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.05 1.016) (end -17.78 1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.32 -0.508) (end -20.32 -0.508) (layer F.SilkS) (width 0.15)) + (fp_text user 1 (at -16.51 -1.905 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -20.32 -0.508) (end -20.32 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 -4.318) (end 20.32 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.32 -4.318) (end 20.32 -0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 -4.318) (end -25.4 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -25.4 -4.318) (end -25.4 -5.588) (layer F.SilkS) (width 0.15)) + (fp_line (start -25.4 -5.588) (end 25.4 -5.588) (layer F.SilkS) (width 0.15)) + (fp_line (start 25.4 -5.588) (end 25.4 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 25.4 -4.318) (end 20.32 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 -5.588) (end -20.32 -11.303) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 -11.303) (end 20.32 -11.303) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.32 -11.303) (end 20.32 -5.588) (layer F.SilkS) (width 0.15)) + (pad 1 connect rect (at -16.51 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 2 connect rect (at -13.716 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 3 connect rect (at -11.049 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 4 connect rect (at -8.255 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 5 connect rect (at -5.588 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 6 connect rect (at -2.794 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 7 connect rect (at 0 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 8 connect rect (at 2.667 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 9 connect rect (at 5.461 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 10 connect rect (at 8.128 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 11 connect rect (at 10.922 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 12 connect rect (at 13.716 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 13 connect rect (at 16.383 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 14 connect rect (at -15.113 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 15 connect rect (at -12.446 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 16 connect rect (at -9.652 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 17 connect rect (at -6.858 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 18 connect rect (at -4.191 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 19 connect rect (at -1.397 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 20 connect rect (at 1.27 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 21 connect rect (at 4.064 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 22 connect rect (at 6.858 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 23 connect rect (at 9.525 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 24 connect rect (at 12.319 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 25 connect rect (at 14.986 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (model Connect.3dshapes/DB25F_CI.wrl + (at (xyz 0 0 -0.033)) + (scale (xyz 0.98 1 1)) + (rotate (xyz 90 180 0)) + ) +) diff --git a/PCB/.pretty/DB25MC.kicad_mod b/PCB/.pretty/DB25MC.kicad_mod new file mode 100644 index 00000000..7987c74b --- /dev/null +++ b/PCB/.pretty/DB25MC.kicad_mod @@ -0,0 +1,62 @@ +(module DB25MC (layer F.Cu) (tedit 0) + (descr "Connecteur DB25 MALE couche") + (tags "CONN DB25") + (fp_text reference REF** (at 0 -15.24) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB25MC (at 0 -6.35) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 26.67 -11.43) (end 26.67 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.05 -6.35) (end 19.05 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.955 -11.43) (end 20.955 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.955 -11.43) (end -20.955 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.05 -6.35) (end -19.05 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -26.67 2.54) (end -26.67 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.67 -6.35) (end 19.05 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -26.67 -6.35) (end -19.05 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.32 -8.255) (end 20.32 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 -8.255) (end -20.32 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.32 -18.415) (end 20.32 -12.7) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 -18.415) (end -20.32 -12.7) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.67 -11.43) (end 26.67 -12.7) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.67 -12.7) (end -26.67 -12.7) (layer F.SilkS) (width 0.15)) + (fp_line (start -26.67 -12.7) (end -26.67 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start -26.67 -11.43) (end 26.67 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.05 2.54) (end 26.67 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 -8.255) (end 20.32 -8.255) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 -18.415) (end 20.32 -18.415) (layer F.SilkS) (width 0.15)) + (fp_line (start -26.67 2.54) (end -19.05 2.54) (layer F.SilkS) (width 0.15)) + (pad "" thru_hole circle (at 23.495 -1.27) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -23.495 -1.27) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at -16.51 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at -13.716 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at -11.049 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at -8.255 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -5.461 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -2.667 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 0 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 2.794 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 5.588 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 8.382 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 11.049 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 13.843 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at 16.637 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 25 thru_hole circle (at -14.9352 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 24 thru_hole circle (at -12.3952 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 23 thru_hole circle (at -9.6012 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 22 thru_hole circle (at -6.858 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 21 thru_hole circle (at -4.1148 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at -1.3208 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at 1.4224 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at 4.1656 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at 7.0104 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at 9.7028 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at 12.446 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at 15.24 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/DB25MC.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/DB25MD.kicad_mod b/PCB/.pretty/DB25MD.kicad_mod new file mode 100644 index 00000000..68f9bc3c --- /dev/null +++ b/PCB/.pretty/DB25MD.kicad_mod @@ -0,0 +1,48 @@ +(module DB25MD (layer F.Cu) (tedit 0) + (descr "Connecteur DB25 male droit") + (tags "CONN DB25") + (fp_text reference REF** (at -17.78 -5.08 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB25MD (at 15.24 -5.08 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -25.654 -3.175) (end -25.654 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -25.654 -3.175) (end -25.654 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -25.654 3.175) (end 25.781 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 25.781 3.175) (end 25.781 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 25.781 -3.175) (end -25.527 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -25.527 -3.175) (end -25.654 -3.175) (layer F.SilkS) (width 0.15)) + (pad 0 thru_hole circle (at -23.495 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 0 thru_hole circle (at 23.495 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at -16.637 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -13.843 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -11.049 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -8.382 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -5.588 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -2.794 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 0 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 2.794 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at 5.461 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at 8.255 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at 11.049 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at 13.843 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at 16.637 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at -15.24 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at -12.446 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at -9.652 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at -6.858 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at -4.191 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at -1.397 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at 1.397 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 21 thru_hole circle (at 4.191 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 22 thru_hole circle (at 6.985 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 23 thru_hole circle (at 9.652 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 24 thru_hole circle (at 12.446 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 25 thru_hole circle (at 15.24 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/DB25MD.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/DB25M_CI.kicad_mod b/PCB/.pretty/DB25M_CI.kicad_mod new file mode 100644 index 00000000..0004a65f --- /dev/null +++ b/PCB/.pretty/DB25M_CI.kicad_mod @@ -0,0 +1,56 @@ +(module DB25M_CI (layer F.Cu) (tedit 0) + (descr "Connecteur DB25 male couche") + (tags "CONN DB25") + (fp_text reference REF** (at 0 -2.667 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB25M_CI (at 0 -8.763 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 15.875 -0.508) (end 16.891 -3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.891 -3.302) (end 17.907 -0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -26.67 -4.318) (end 26.67 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.67 -5.588) (end -26.67 -5.588) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.67 -5.588) (end 26.67 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -26.67 -5.588) (end -26.67 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.32 -0.508) (end -20.32 -0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.05 -0.508) (end 19.05 1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.05 1.143) (end 17.78 1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.05 -0.508) (end -19.05 1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.05 1.016) (end -17.78 1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 -0.508) (end -20.32 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.32 -4.318) (end 20.32 -0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 -5.588) (end -20.32 -11.303) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 -11.303) (end 20.32 -11.303) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.32 -11.303) (end 20.32 -5.588) (layer F.SilkS) (width 0.15)) + (pad 13 connect rect (at -16.51 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 12 connect rect (at -13.716 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 11 connect rect (at -11.049 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 10 connect rect (at -8.255 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 9 connect rect (at -5.588 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 8 connect rect (at -2.794 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 7 connect rect (at 0 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 6 connect rect (at 2.667 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 5 connect rect (at 5.461 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 4 connect rect (at 8.128 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 3 connect rect (at 10.922 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 2 connect rect (at 13.716 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 1 connect rect (at 16.383 2.667 90) (size 5.08 1.524) (layers F.Cu F.Mask)) + (pad 25 connect rect (at -15.113 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 24 connect rect (at -12.446 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 23 connect rect (at -9.652 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 22 connect rect (at -6.858 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 21 connect rect (at -4.191 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 20 connect rect (at -1.397 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 19 connect rect (at 1.27 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 18 connect rect (at 4.064 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 17 connect rect (at 6.858 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 16 connect rect (at 9.525 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 15 connect rect (at 12.319 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (pad 14 connect rect (at 14.986 2.667 90) (size 5.08 1.524) (layers B.Cu B.Mask)) + (model Connect.3dshapes/DB25M_CI.wrl + (at (xyz 0 0 -0.033)) + (scale (xyz 0.98 1 1)) + (rotate (xyz 90 180 0)) + ) +) diff --git a/PCB/.pretty/DB37FC.kicad_mod b/PCB/.pretty/DB37FC.kicad_mod new file mode 100644 index 00000000..f7da29b4 --- /dev/null +++ b/PCB/.pretty/DB37FC.kicad_mod @@ -0,0 +1,63 @@ +(module DB37FC (layer F.Cu) (tedit 0) + (descr "Connecteur DB37 femelle couche") + (tags "CONN DB37") + (fp_text reference REF** (at 0 -5.08 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB37FC (at 0 -7.62 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 34.925 3.175) (end -34.925 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -34.925 3.175) (end -34.925 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start -34.925 -12.065) (end 34.925 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start 34.925 -12.065) (end 34.925 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 25.4 -12.065) (end 25.4 -19.05) (layer F.SilkS) (width 0.15)) + (fp_line (start 25.4 -19.05) (end -25.4 -19.05) (layer F.SilkS) (width 0.15)) + (fp_line (start -25.4 -19.05) (end -25.4 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start 27.305 -12.065) (end 27.305 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -27.305 -12.065) (end -27.305 3.175) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at -24.9174 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.SilkS *.Mask)) + (pad 2 thru_hole circle (at -22.1488 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -19.3802 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -16.6116 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -13.843 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -11.0744 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -8.3058 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -5.5372 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -2.7686 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad ? thru_hole circle (at -31.623 0 180) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad ? thru_hole circle (at 31.877 0 180) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at 0 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at 2.7686 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at 5.5372 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at 8.3058 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at 11.0744 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at 13.843 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at 16.6116 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at 19.3802 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at 22.1488 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at 24.9174 1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at -23.5458 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 21 thru_hole circle (at -20.7772 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 22 thru_hole circle (at -18.0086 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 23 thru_hole circle (at -15.24 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 24 thru_hole circle (at -12.4714 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 25 thru_hole circle (at -9.7028 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 26 thru_hole circle (at -6.9342 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 27 thru_hole circle (at -4.1656 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 28 thru_hole circle (at -1.397 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 29 thru_hole circle (at 1.3716 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 30 thru_hole circle (at 4.1402 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 31 thru_hole circle (at 6.9088 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 32 thru_hole circle (at 9.6774 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 33 thru_hole circle (at 12.446 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 34 thru_hole circle (at 15.2146 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 35 thru_hole circle (at 17.9832 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 36 thru_hole circle (at 20.7518 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 37 thru_hole circle (at 23.5204 -1.4224 180) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/DB37FC.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/DB37FD.kicad_mod b/PCB/.pretty/DB37FD.kicad_mod new file mode 100644 index 00000000..c51d04fc --- /dev/null +++ b/PCB/.pretty/DB37FD.kicad_mod @@ -0,0 +1,53 @@ +(module DB37FD (layer F.Cu) (tedit 0) + (descr "Connecteur DB37 femelle droit") + (tags "CONN DB37") + (fp_text reference REF** (at -13.97 -5.08) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB37FD (at 12.7 -5.08) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -34.163 -3.175) (end -34.163 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -34.163 3.175) (end 33.909 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 33.909 3.175) (end 33.909 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 33.909 -3.175) (end -34.163 -3.175) (layer F.SilkS) (width 0.15)) + (pad "" thru_hole circle (at -31.75 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 31.75 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at 24.892 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 22.098 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 19.431 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 16.637 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 13.843 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 11.049 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 8.255 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 5.588 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at 2.794 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at 0 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at -2.794 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at -5.588 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at -8.255 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at -11.049 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at -13.843 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at -16.637 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at -19.431 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at -22.098 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at -24.892 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at 23.495 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 21 thru_hole circle (at 20.701 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 22 thru_hole circle (at 17.907 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 23 thru_hole circle (at 15.24 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 24 thru_hole circle (at 12.446 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 25 thru_hole circle (at 9.652 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 26 thru_hole circle (at 6.858 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 27 thru_hole circle (at 4.064 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 28 thru_hole circle (at 1.397 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 29 thru_hole circle (at -1.397 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 30 thru_hole circle (at -4.191 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 31 thru_hole circle (at -6.985 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 32 thru_hole circle (at -9.906 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 33 thru_hole circle (at -12.446 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 34 thru_hole circle (at -15.24 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 35 thru_hole circle (at -18.034 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 36 thru_hole circle (at -20.828 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 37 thru_hole circle (at -23.622 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/DB37MD.kicad_mod b/PCB/.pretty/DB37MD.kicad_mod new file mode 100644 index 00000000..7e153664 --- /dev/null +++ b/PCB/.pretty/DB37MD.kicad_mod @@ -0,0 +1,54 @@ +(module DB37MD (layer F.Cu) (tedit 0) + (descr "Connecteur DB37 male droit") + (tags "CONN DB37") + (fp_text reference REF** (at -12.7 -5.08) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB37MD (at 12.7 -5.08) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -34.163 -3.175) (end -34.163 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -34.163 -3.175) (end -34.163 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -34.163 3.175) (end 33.909 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 33.909 3.175) (end 33.909 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 33.909 -3.175) (end -34.163 -3.175) (layer F.SilkS) (width 0.15)) + (pad "" thru_hole circle (at -31.75 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 31.75 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at -24.892 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -22.098 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -19.431 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -16.637 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -13.843 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -11.049 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -8.255 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -5.588 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -2.794 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at 0 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at 2.794 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at 5.461 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at 8.255 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at 11.049 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at 13.843 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at 16.637 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at 19.431 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at 22.098 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at 24.892 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at -23.622 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 21 thru_hole circle (at -20.828 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 22 thru_hole circle (at -18.034 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 23 thru_hole circle (at -15.24 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 24 thru_hole circle (at -12.446 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 25 thru_hole circle (at -9.906 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 26 thru_hole circle (at -6.985 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 27 thru_hole circle (at -4.191 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 28 thru_hole circle (at -1.397 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 29 thru_hole circle (at 1.397 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 30 thru_hole circle (at 4.064 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 31 thru_hole circle (at 6.858 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 32 thru_hole circle (at 9.652 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 33 thru_hole circle (at 12.446 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 34 thru_hole circle (at 15.24 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 35 thru_hole circle (at 17.907 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 36 thru_hole circle (at 20.701 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 37 thru_hole circle (at 23.495 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/DB9FC.kicad_mod b/PCB/.pretty/DB9FC.kicad_mod new file mode 100644 index 00000000..754d72ea --- /dev/null +++ b/PCB/.pretty/DB9FC.kicad_mod @@ -0,0 +1,36 @@ +(module DB9FC (layer F.Cu) (tedit 0) + (descr "Connecteur DB9 femelle couche") + (tags "CONN DB9") + (fp_text reference REF** (at 1.27 -10.16) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB9FC (at 1.27 -3.81) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -16.129 2.286) (end 16.383 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.383 2.286) (end 16.383 -15.494) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.383 -15.494) (end -16.129 -15.494) (layer F.SilkS) (width 0.15)) + (fp_line (start -16.129 -15.494) (end -16.129 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.017 -15.494) (end -9.017 -7.874) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.017 -7.874) (end 9.271 -7.874) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.271 -7.874) (end 9.271 -15.494) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.493 -15.494) (end -7.493 -24.13) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.493 -24.13) (end 7.747 -24.13) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.747 -24.13) (end 7.747 -15.494) (layer F.SilkS) (width 0.15)) + (pad "" thru_hole circle (at 12.827 -1.27) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -12.573 -1.27) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at -5.461 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -2.667 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 0 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 2.794 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 5.588 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -4.064 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -1.27 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 1.397 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at 4.191 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/DB9FC.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/DB9FD.kicad_mod b/PCB/.pretty/DB9FD.kicad_mod new file mode 100644 index 00000000..c9134750 --- /dev/null +++ b/PCB/.pretty/DB9FD.kicad_mod @@ -0,0 +1,30 @@ +(module DB9FD (layer F.Cu) (tedit 0) + (descr "Connecteur DB9 femelle droit") + (tags "CONN DB9") + (fp_text reference REF** (at -6.096 -4.826 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB9FD (at 6.096 -4.826) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -14.986 -3.302) (end -14.986 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -14.986 3.302) (end 14.986 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.986 3.302) (end 14.986 -3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.986 -3.302) (end -14.986 -3.302) (layer F.SilkS) (width 0.15)) + (pad 0 thru_hole circle (at -12.446 -0.127) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 0 thru_hole circle (at 12.573 -0.127) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at 5.461 -1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.794 -1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 0 -1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -2.667 -1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -5.461 -1.524) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 4.191 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 1.397 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -1.27 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -4.064 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/DB9FD.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/DB9F_CI.kicad_mod b/PCB/.pretty/DB9F_CI.kicad_mod new file mode 100644 index 00000000..920d7b28 --- /dev/null +++ b/PCB/.pretty/DB9F_CI.kicad_mod @@ -0,0 +1,42 @@ +(module DB9F_CI (layer F.Cu) (tedit 0) + (descr "Connecteur DB9 femelle encarte") + (tags "CONN DB9") + (fp_text reference REF** (at 0 -9.144) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB9F_CI (at 0 -3.048) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -8.509 -12.065) (end 8.636 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.271 -1.27) (end -9.144 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.906 -1.27) (end 9.271 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.906 -4.445) (end -9.779 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.621 -4.445) (end 9.906 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.494 -5.715) (end 15.621 -5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.636 -5.715) (end 8.636 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.621 -4.445) (end 15.621 -5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.906 -1.27) (end 9.906 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.366 0) (end 9.271 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.271 0) (end 9.271 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.509 -5.715) (end -8.509 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.779 -4.445) (end -15.494 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.494 -4.445) (end -15.494 -5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.144 -1.27) (end -9.779 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.779 -1.27) (end -9.779 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.239 0) (end -9.144 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.144 0) (end -9.144 -1.27) (layer F.SilkS) (width 0.15)) + (pad 4 connect rect (at 2.794 2.54) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 3 connect rect (at 0 2.54) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 2 connect rect (at -2.794 2.54) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 1 connect rect (at -5.588 2.54) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 5 connect rect (at 5.588 2.54) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 6 connect rect (at -4.191 2.54) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 7 connect rect (at -1.397 2.54) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 8 connect rect (at 1.397 2.54) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 9 connect rect (at 4.191 2.54) (size 1.778 5.08) (layers B.Cu B.Mask)) + (model Connect.3dshapes/DB9F_CI.wrl + (at (xyz 0 0 -0.033)) + (scale (xyz 1 1 1)) + (rotate (xyz 90 180 0)) + ) +) diff --git a/PCB/.pretty/DB9F_CI_INVERT.kicad_mod b/PCB/.pretty/DB9F_CI_INVERT.kicad_mod new file mode 100644 index 00000000..bab5cc53 --- /dev/null +++ b/PCB/.pretty/DB9F_CI_INVERT.kicad_mod @@ -0,0 +1,42 @@ +(module DB9F_CI_INVERT (layer F.Cu) (tedit 0) + (descr "Connecteur DB9 male encarte") + (tags "CONN DB9") + (fp_text reference REF** (at 0 -9.144) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB9F_CI_INVERT (at 0 -2.667) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -8.509 -12.065) (end 8.636 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.271 -1.27) (end -9.144 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.906 -1.27) (end 9.271 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.906 -4.445) (end -9.779 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.621 -4.445) (end 9.906 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.494 -5.715) (end 15.621 -5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.636 -5.715) (end 8.636 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.621 -4.445) (end 15.621 -5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.906 -1.27) (end 9.906 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.366 0) (end 9.271 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.271 0) (end 9.271 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.509 -5.715) (end -8.509 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.779 -4.445) (end -15.494 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.494 -4.445) (end -15.494 -5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.144 -1.27) (end -9.779 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.779 -1.27) (end -9.779 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.239 0) (end -9.144 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.144 0) (end -9.144 -1.27) (layer F.SilkS) (width 0.15)) + (pad 2 connect rect (at 2.794 2.54) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 3 connect rect (at 0 2.54) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 4 connect rect (at -2.794 2.54) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 5 connect rect (at -5.588 2.54) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 1 connect rect (at 5.588 2.54) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 9 connect rect (at -4.191 2.54) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 8 connect rect (at -1.397 2.54) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 7 connect rect (at 1.397 2.54) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 6 connect rect (at 4.191 2.54) (size 1.778 5.08) (layers F.Cu F.Mask)) + (model Connect.3dshapes/DB9F_CI_INVERT.wrl + (at (xyz 0 0 -0.033)) + (scale (xyz 1 1 1)) + (rotate (xyz 90 0 0)) + ) +) diff --git a/PCB/.pretty/DB9MC.kicad_mod b/PCB/.pretty/DB9MC.kicad_mod new file mode 100644 index 00000000..33315dd7 --- /dev/null +++ b/PCB/.pretty/DB9MC.kicad_mod @@ -0,0 +1,36 @@ +(module DB9MC (layer F.Cu) (tedit 0) + (descr "Connecteur DB9 male couche") + (tags "CONN DB9") + (fp_text reference REF** (at 1.27 -10.16) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB9MC (at 1.27 -3.81) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -16.129 2.286) (end 16.383 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.383 2.286) (end 16.383 -15.494) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.383 -15.494) (end -16.129 -15.494) (layer F.SilkS) (width 0.15)) + (fp_line (start -16.129 -15.494) (end -16.129 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.017 -15.494) (end -9.017 -7.874) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.017 -7.874) (end 9.271 -7.874) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.271 -7.874) (end 9.271 -15.494) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.493 -15.494) (end -7.493 -24.13) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.493 -24.13) (end 7.747 -24.13) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.747 -24.13) (end 7.747 -15.494) (layer F.SilkS) (width 0.15)) + (pad "" thru_hole circle (at 12.827 -1.27) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -12.573 -1.27) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at 5.588 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.794 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 0 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -2.667 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -5.461 1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -4.064 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -1.27 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 1.397 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 4.191 -1.27) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/DB9MC.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/DB9MD.kicad_mod b/PCB/.pretty/DB9MD.kicad_mod new file mode 100644 index 00000000..445e1316 --- /dev/null +++ b/PCB/.pretty/DB9MD.kicad_mod @@ -0,0 +1,30 @@ +(module DB9MD (layer F.Cu) (tedit 0) + (descr "Connecteur DB9 male droit") + (tags "CONN DB9") + (fp_text reference REF** (at -6.604 -4.572) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB9MD (at 5.08 -4.572) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -14.986 -3.175) (end -14.986 3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start -14.986 3.429) (end 14.986 3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.986 3.429) (end 14.986 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.986 -3.175) (end -14.986 -3.175) (layer F.SilkS) (width 0.15)) + (pad 0 thru_hole circle (at -12.446 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 0 thru_hole circle (at 12.573 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at -5.461 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -2.667 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 0 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 2.794 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 5.461 -1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -4.064 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -1.27 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 1.397 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at 4.191 1.397) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/DB9MD.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/DB9M_CI.kicad_mod b/PCB/.pretty/DB9M_CI.kicad_mod new file mode 100644 index 00000000..983cacad --- /dev/null +++ b/PCB/.pretty/DB9M_CI.kicad_mod @@ -0,0 +1,42 @@ +(module DB9M_CI (layer F.Cu) (tedit 0) + (descr "Connecteur DB9 male encarte") + (tags "CONN DB9") + (fp_text reference REF** (at 0 -8.382) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB9M_CI (at 0 -3.048) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -8.509 -11.938) (end 8.636 -11.938) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.271 -1.143) (end -9.144 -1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.906 -1.143) (end 9.271 -1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.906 -4.318) (end -9.779 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.621 -4.318) (end 9.906 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.494 -5.588) (end 15.621 -5.588) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.636 -5.588) (end 8.636 -11.938) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.621 -4.318) (end 15.621 -5.588) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.906 -1.143) (end 9.906 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.366 0.127) (end 9.271 0.127) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.271 0.127) (end 9.271 -1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.509 -5.588) (end -8.509 -11.938) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.779 -4.318) (end -15.494 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.494 -4.318) (end -15.494 -5.588) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.144 -1.143) (end -9.779 -1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.779 -1.143) (end -9.779 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.239 0.127) (end -9.144 0.127) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.144 0.127) (end -9.144 -1.143) (layer F.SilkS) (width 0.15)) + (pad 2 connect rect (at 2.794 2.667) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 3 connect rect (at 0 2.667) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 4 connect rect (at -2.794 2.667) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 5 connect rect (at -5.588 2.667) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 1 connect rect (at 5.588 2.667) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 9 connect rect (at -4.191 2.667) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 8 connect rect (at -1.397 2.667) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 7 connect rect (at 1.397 2.667) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 6 connect rect (at 4.191 2.667) (size 1.778 5.08) (layers B.Cu B.Mask)) + (model Connect.3dshapes/DB9M_CI.wrl + (at (xyz 0 0 -0.033)) + (scale (xyz 1 1 1)) + (rotate (xyz 90 180 0)) + ) +) diff --git a/PCB/.pretty/DB9M_CI_INVERT.kicad_mod b/PCB/.pretty/DB9M_CI_INVERT.kicad_mod new file mode 100644 index 00000000..0f9d6601 --- /dev/null +++ b/PCB/.pretty/DB9M_CI_INVERT.kicad_mod @@ -0,0 +1,42 @@ +(module DB9M_CI_INVERT (layer F.Cu) (tedit 0) + (descr "Connecteur DB9 femelle encarte") + (tags "CONN DB9") + (fp_text reference REF** (at 0 -9.144) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DB9M_CI_INVERT (at 0 -3.048) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -8.509 -12.065) (end 8.636 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.271 -1.27) (end -9.144 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.906 -1.27) (end 9.271 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.906 -4.445) (end -9.779 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.621 -4.445) (end 9.906 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.494 -5.715) (end 15.621 -5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.636 -5.715) (end 8.636 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.621 -4.445) (end 15.621 -5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.906 -1.27) (end 9.906 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.366 0) (end 9.271 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.271 0) (end 9.271 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.509 -5.715) (end -8.509 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.779 -4.445) (end -15.494 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.494 -4.445) (end -15.494 -5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.144 -1.27) (end -9.779 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.779 -1.27) (end -9.779 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.239 0) (end -9.144 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.144 0) (end -9.144 -1.27) (layer F.SilkS) (width 0.15)) + (pad 4 connect rect (at 2.794 2.54) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 3 connect rect (at 0 2.54) (size 1.778 5.08) (layers B.Cu B.SilkS)) + (pad 2 connect rect (at -2.794 2.54) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 1 connect rect (at -5.588 2.54) (size 1.778 5.08) (layers B.Cu F.Mask)) + (pad 5 connect rect (at 5.588 2.54) (size 1.778 5.08) (layers B.Cu B.Mask)) + (pad 6 connect rect (at -4.191 2.54) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 7 connect rect (at -1.397 2.54) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 8 connect rect (at 1.397 2.54) (size 1.778 5.08) (layers F.Cu F.Mask)) + (pad 9 connect rect (at 4.191 2.54) (size 1.778 5.08) (layers F.Cu F.Mask)) + (model Connect.3dshapes/DB9M_CI_INVERT.wrl + (at (xyz 0 0 -0.033)) + (scale (xyz 1 1 1)) + (rotate (xyz 90 0 0)) + ) +) diff --git a/PCB/.pretty/FMC_LPC_ASP-134604-01.kicad_mod b/PCB/.pretty/FMC_LPC_ASP-134604-01.kicad_mod new file mode 100644 index 00000000..60fceebc --- /dev/null +++ b/PCB/.pretty/FMC_LPC_ASP-134604-01.kicad_mod @@ -0,0 +1,341 @@ +(module FMC_LPC_ASP-134604-01 (layer F.Cu) (tedit 0) + (descr http://www.samtec.com/standards/vita.aspx) + (tags "FMC LPC VITA ") + (attr smd) + (fp_text reference REF** (at 29.32 -1.65 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value FMC_LPC_ASP-134604-01 (at -0.45 -5.78) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -28.5 -7.34) (end -28.5 7.34) (layer F.SilkS) (width 0.15)) + (fp_line (start -28.5 -7.34) (end 28.5 -7.34) (layer F.SilkS) (width 0.15)) + (fp_line (start 28.5 -7.34) (end 28.5 7.34) (layer F.SilkS) (width 0.15)) + (fp_line (start 28.5 7.34) (end -28.5 7.34) (layer F.SilkS) (width 0.15)) + (pad G40 thru_hole circle (at -31.19 2) (size 4 4) (drill 2.7) (layers *.Cu *.Mask) + (clearance 0.1)) + (pad C02 smd circle (at 23.495 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad "" np_thru_hole circle (at 27.19 0) (size 1.27 1.27) (drill 1.27) (layers *.Cu *.Mask F.SilkS) + (clearance 0.1)) + (pad G01 smd circle (at 24.765 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G02 smd circle (at 23.495 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H01 smd circle (at 24.765 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H02 smd circle (at 23.495 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G07 smd circle (at 17.145 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H07 smd circle (at 17.145 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H08 smd circle (at 15.875 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G08 smd circle (at 15.875 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G10 smd circle (at 13.335 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H10 smd circle (at 13.335 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H09 smd circle (at 14.605 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G09 smd circle (at 14.605 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G05 smd circle (at 19.685 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H05 smd circle (at 19.685 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H06 smd circle (at 18.415 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G06 smd circle (at 18.415 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G04 smd circle (at 20.955 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H04 smd circle (at 20.955 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H03 smd circle (at 22.225 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G03 smd circle (at 22.225 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G19 smd circle (at 1.905 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H19 smd circle (at 1.905 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H20 smd circle (at 0.635 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G20 smd circle (at 0.635 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G21 smd circle (at -0.635 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H21 smd circle (at -0.625 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G24 smd circle (at -4.445 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H24 smd circle (at -4.445 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H25 smd circle (at -5.715 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G25 smd circle (at -5.715 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G23 smd circle (at -3.175 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H23 smd circle (at -3.175 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H22 smd circle (at -1.905 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G22 smd circle (at -1.905 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G15 smd circle (at 6.985 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H15 smd circle (at 6.985 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H16 smd circle (at 5.715 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G16 smd circle (at 5.715 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G18 smd circle (at 3.175 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H18 smd circle (at 3.175 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H17 smd circle (at 4.445 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G17 smd circle (at 4.445 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G13 smd circle (at 9.525 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H13 smd circle (at 9.525 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H14 smd circle (at 8.255 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G14 smd circle (at 8.255 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G12 smd circle (at 10.795 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H12 smd circle (at 10.795 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H11 smd circle (at 12.065 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G11 smd circle (at 12.065 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G29 smd circle (at -10.795 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H29 smd circle (at -10.795 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H30 smd circle (at -12.065 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G30 smd circle (at -12.065 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G32 smd circle (at -14.605 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H32 smd circle (at -14.605 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H31 smd circle (at -13.335 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G31 smd circle (at -13.335 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H28 smd circle (at -9.525 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G28 smd circle (at -9.525 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G27 smd circle (at -8.255 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H27 smd circle (at -8.255 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H26 smd circle (at -6.985 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G26 smd circle (at -6.985 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G35 smd circle (at -18.415 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H35 smd circle (at -18.415 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H36 smd circle (at -19.685 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G36 smd circle (at -19.685 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G37 smd circle (at -20.955 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H37 smd circle (at -20.955 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G40 smd circle (at -24.765 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H40 smd circle (at -24.765 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G39 smd circle (at -23.495 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H39 smd circle (at -23.495 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H38 smd circle (at -22.225 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G38 smd circle (at -22.225 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G34 smd circle (at -17.145 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H34 smd circle (at -17.145 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad H33 smd circle (at -15.875 3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad G33 smd circle (at -15.875 1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C33 smd circle (at -15.875 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D33 smd circle (at -15.875 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D34 smd circle (at -17.145 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C34 smd circle (at -17.145 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C38 smd circle (at -22.225 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D38 smd circle (at -22.225 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D39 smd circle (at -23.495 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C39 smd circle (at -23.495 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D40 smd circle (at -24.765 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C40 smd circle (at -24.765 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D37 smd circle (at -20.955 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C37 smd circle (at -20.955 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C36 smd circle (at -19.685 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D36 smd circle (at -19.685 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D35 smd circle (at -18.415 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C35 smd circle (at -18.415 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C26 smd circle (at -6.985 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D26 smd circle (at -6.985 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D27 smd circle (at -8.255 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C27 smd circle (at -8.255 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C28 smd circle (at -9.525 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D28 smd circle (at -9.525 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C31 smd circle (at -13.335 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D31 smd circle (at -13.335 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D32 smd circle (at -14.605 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C32 smd circle (at -14.605 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C30 smd circle (at -12.065 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D30 smd circle (at -12.065 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D29 smd circle (at -10.795 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C29 smd circle (at -10.795 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C11 smd circle (at 12.065 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D11 smd circle (at 12.065 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D12 smd circle (at 10.795 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C12 smd circle (at 10.795 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C14 smd circle (at 8.255 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D14 smd circle (at 8.255 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D13 smd circle (at 9.525 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C13 smd circle (at 9.525 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C17 smd circle (at 4.445 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D17 smd circle (at 4.445 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D18 smd circle (at 3.175 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C18 smd circle (at 3.175 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C16 smd circle (at 5.715 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D16 smd circle (at 5.715 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D15 smd circle (at 6.985 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C15 smd circle (at 6.985 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C22 smd circle (at -1.905 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D22 smd circle (at -1.905 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D23 smd circle (at -3.175 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C23 smd circle (at -3.175 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C25 smd circle (at -5.715 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D25 smd circle (at -5.715 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D24 smd circle (at -4.445 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C24 smd circle (at -4.445 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D21 smd circle (at -0.625 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C21 smd circle (at -0.635 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C20 smd circle (at 0.635 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D20 smd circle (at 0.635 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D19 smd circle (at 1.905 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C19 smd circle (at 1.905 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C03 smd circle (at 22.225 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D03 smd circle (at 22.225 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D04 smd circle (at 20.955 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C04 smd circle (at 20.955 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C06 smd circle (at 18.415 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D06 smd circle (at 18.415 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D05 smd circle (at 19.685 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C05 smd circle (at 19.685 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C09 smd circle (at 14.605 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D09 smd circle (at 14.605 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D10 smd circle (at 13.335 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C10 smd circle (at 13.335 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C08 smd circle (at 15.875 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D08 smd circle (at 15.875 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D07 smd circle (at 17.145 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C07 smd circle (at 17.145 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D02 smd circle (at 23.495 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad D01 smd circle (at 24.765 -1.905) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask) + (clearance 0.1)) + (pad C01 smd circle (at 24.765 -3.175) (size 0.64 0.64) (layers F.Cu F.Paste F.Mask)) + (pad "" np_thru_hole circle (at -27.19 3.05) (size 1.27 1.27) (drill 1.27) (layers *.Cu *.Mask F.SilkS) + (clearance 0.1)) + (pad C01 thru_hole circle (at 31.19 2) (size 4 4) (drill 2.7) (layers *.Cu *.Mask)) +) diff --git a/PCB/.pretty/GS2.kicad_mod b/PCB/.pretty/GS2.kicad_mod new file mode 100644 index 00000000..81383b0a --- /dev/null +++ b/PCB/.pretty/GS2.kicad_mod @@ -0,0 +1,16 @@ +(module GS2 (layer F.Cu) (tedit 0) + (descr "Pontet Goute de soudure") + (attr virtual) + (fp_text reference REF** (at 1.778 0 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value GS2 (at 1.524 0 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -0.889 -1.27) (end -0.889 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.889 1.27) (end 0.889 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.889 1.27) (end -0.889 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.889 -1.27) (end 0.889 -1.27) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at 0 -0.635) (size 1.27 0.9652) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at 0 0.635) (size 1.27 0.9652) (layers F.Cu F.Paste F.Mask)) +) diff --git a/PCB/.pretty/GS3.kicad_mod b/PCB/.pretty/GS3.kicad_mod new file mode 100644 index 00000000..c0eef0c4 --- /dev/null +++ b/PCB/.pretty/GS3.kicad_mod @@ -0,0 +1,17 @@ +(module GS3 (layer F.Cu) (tedit 0) + (descr "Pontet Goute de soudure") + (attr virtual) + (fp_text reference REF** (at 1.524 0 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value GS3 (at 1.524 0 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -0.889 -1.905) (end -0.889 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.889 1.905) (end 0.889 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.889 1.905) (end 0.889 -1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.889 -1.905) (end 0.889 -1.905) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at 0 -1.27) (size 1.27 0.9652) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at 0 0) (size 1.27 0.9652) (layers F.Cu F.Paste F.Mask)) + (pad 3 smd rect (at 0 1.27) (size 1.27 0.9652) (layers F.Cu F.Paste F.Mask)) +) diff --git a/PCB/.pretty/GS_6x2.kicad_mod b/PCB/.pretty/GS_6x2.kicad_mod new file mode 100644 index 00000000..6b08f7c1 --- /dev/null +++ b/PCB/.pretty/GS_6x2.kicad_mod @@ -0,0 +1,26 @@ +(module GS_6x2 (layer F.Cu) (tedit 0) + (descr "Double rangee de contacts 2 x 8 pins") + (tags CONN) + (fp_text reference REF** (at -2.15646 -2.02946) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value GS_6x2 (at 3.937 -2.032) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.715 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.35 1.27) (end -5.715 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.715 1.27) (end -5.715 -1.27) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -4.445 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at -4.445 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 3 smd rect (at -2.54 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 4 smd rect (at -2.54 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 5 smd rect (at -0.635 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 6 smd rect (at -0.635 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 7 smd rect (at 1.27 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 8 smd rect (at 1.27 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 9 smd rect (at 3.175 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 10 smd rect (at 3.175 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 11 smd rect (at 5.08 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 12 smd rect (at 5.08 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) +) diff --git a/PCB/.pretty/GS_8x2.kicad_mod b/PCB/.pretty/GS_8x2.kicad_mod new file mode 100644 index 00000000..835938f8 --- /dev/null +++ b/PCB/.pretty/GS_8x2.kicad_mod @@ -0,0 +1,30 @@ +(module GS_8x2 (layer F.Cu) (tedit 0) + (descr "Double rangee de contacts 2 x 8 pins") + (tags CONN) + (fp_text reference REF** (at -3.048 -1.905) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value GS_8x2 (at 3.937 -1.905) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -7.62 -1.27) (end 8.255 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.255 -1.27) (end 8.255 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.255 1.27) (end -7.62 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 1.27) (end -7.62 -1.27) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -6.35 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at -6.35 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 3 smd rect (at -4.445 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 4 smd rect (at -4.445 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 5 smd rect (at -2.54 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 6 smd rect (at -2.54 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 7 smd rect (at -0.635 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 8 smd rect (at -0.635 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 9 smd rect (at 1.27 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 10 smd rect (at 1.27 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 11 smd rect (at 3.175 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 12 smd rect (at 3.175 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 13 smd rect (at 5.08 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 14 smd rect (at 5.08 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 15 smd rect (at 6.985 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 16 smd rect (at 6.985 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) +) diff --git a/PCB/.pretty/GS_9x2.kicad_mod b/PCB/.pretty/GS_9x2.kicad_mod new file mode 100644 index 00000000..f8e9fde7 --- /dev/null +++ b/PCB/.pretty/GS_9x2.kicad_mod @@ -0,0 +1,35 @@ +(module GS_9x2 (layer F.Cu) (tedit 0) + (descr "Double rangee de contacts 2 x 8 pins") + (tags CONN) + (fp_text reference REF** (at -3.556 -2.032) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value GS_9x2 (at 3.937 -2.15646) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -8.89 0.635) (end -8.255 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.985 -1.27) (end 8.89 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.89 -1.27) (end 8.89 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.89 1.27) (end 6.985 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.89 -1.27) (end 6.985 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.985 1.27) (end -8.89 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.89 1.27) (end -8.89 -1.27) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -7.62 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at -7.62 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 3 smd rect (at -5.715 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 4 smd rect (at -5.715 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 5 smd rect (at -3.81 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 6 smd rect (at -3.81 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 7 smd rect (at -1.905 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 8 smd rect (at -1.905 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 9 smd rect (at 0 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 10 smd rect (at 0 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 11 smd rect (at 1.905 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 12 smd rect (at 1.905 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 13 smd rect (at 3.81 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 14 smd rect (at 3.81 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 15 smd rect (at 5.715 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 16 smd rect (at 5.715 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 17 smd rect (at 7.62 0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) + (pad 18 smd rect (at 7.62 -0.635) (size 1.27 1.016) (layers F.Cu F.Paste F.Mask)) +) diff --git a/PCB/.pretty/GTK2400-H2.kicad_mod b/PCB/.pretty/GTK2400-H2.kicad_mod new file mode 100644 index 00000000..0be2e78c --- /dev/null +++ b/PCB/.pretty/GTK2400-H2.kicad_mod @@ -0,0 +1,19 @@ +(module GTK2400-H2 (layer F.Cu) (tedit 0) + (fp_text reference REF** (at -11.1125 -2.794) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value GTK2400-H2 (at 0 3.556) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.9685 0) (end 1.9685 -4.8895) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.9685 0) (end -1.9685 -4.8895) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.445 -7.62) (end -4.445 -16.51) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.445 -16.51) (end 4.445 -16.51) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.445 -16.51) (end 4.445 -7.62) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.445 -5.08) (end -4.445 -7.62) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.445 -7.62) (end 4.445 -7.62) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.445 -7.62) (end 4.445 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.445 -5.08) (end -4.445 -5.08) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole rect (at 1.9685 0) (size 2.49936 2.49936) (drill 1.80086) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at -1.9685 0) (size 2.49936 2.49936) (drill 1.80086) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/GTK2400-V2.kicad_mod b/PCB/.pretty/GTK2400-V2.kicad_mod new file mode 100644 index 00000000..b93b7702 --- /dev/null +++ b/PCB/.pretty/GTK2400-V2.kicad_mod @@ -0,0 +1,18 @@ +(module GTK2400-V2 (layer F.Cu) (tedit 0) + (fp_text reference REF** (at -6.35 0 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value GTK2400-V2 (at 0 7.62) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.445 2.54) (end 4.445 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.445 0) (end -4.445 -5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.445 -5.715) (end -4.445 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.445 -6.35) (end 4.445 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.445 -6.35) (end 4.445 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.445 0) (end 4.445 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.445 5.08) (end -4.445 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.445 5.08) (end -4.445 0) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole rect (at 1.9685 0) (size 2.49936 2.49936) (drill 1.80086) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at -1.9685 0) (size 2.49936 2.49936) (drill 1.80086) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/GoldTek_SCP20GR11.kicad_mod b/PCB/.pretty/GoldTek_SCP20GR11.kicad_mod new file mode 100644 index 00000000..1f58a389 --- /dev/null +++ b/PCB/.pretty/GoldTek_SCP20GR11.kicad_mod @@ -0,0 +1,71 @@ +(module GoldTek_SCP20GR11 (layer F.Cu) (tedit 556C2970) + (descr "GoldTek SCP20GR11") + (tags "CONN GoldTek SCP20GR11") + (fp_text reference REF** (at 3.81 -13.335) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value GoldTek_SCP20GR11 (at 24.765 -13.335) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 34.5 1.5) (end -11.65 1.5) (layer F.CrtYd) (width 0.05)) + (fp_line (start -11.65 1.5) (end -11.65 -27.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -11.65 -27.65) (end 34.5 -27.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 34.5 -27.65) (end 34.5 1.5) (layer F.CrtYd) (width 0.05)) + (fp_line (start 28.702 -2.413) (end 28.702 1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.924 -0.635) (end 30.48 -0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.842 -2.413) (end -5.842 1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 -0.635) (end -4.064 -0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 -11.43) (end 0.635 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 -11.43) (end 0 -10.795) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 -10.795) (end -0.635 -11.43) (layer F.SilkS) (width 0.15)) + (fp_line (start 33.02 -15.24) (end 33.02 -26.67) (layer F.SilkS) (width 0.15)) + (fp_line (start 33.02 -26.67) (end 32.385 -27.305) (layer F.SilkS) (width 0.15)) + (fp_line (start 32.385 -27.305) (end 31.75 -27.305) (layer F.SilkS) (width 0.15)) + (fp_line (start 31.75 -27.305) (end 26.035 -25.4) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.035 -25.4) (end 26.035 -23.495) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.035 -23.495) (end 27.305 -23.495) (layer F.SilkS) (width 0.15)) + (fp_line (start 27.305 -23.495) (end 27.94 -24.13) (layer F.SilkS) (width 0.15)) + (fp_line (start 27.94 -24.13) (end 28.575 -24.13) (layer F.SilkS) (width 0.15)) + (fp_line (start 28.575 -24.13) (end 28.575 -15.24) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.16 -15.24) (end -10.16 -26.67) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.16 -26.67) (end -9.525 -27.305) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.525 -27.305) (end -8.89 -27.305) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.89 -27.305) (end -3.175 -25.4) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.175 -25.4) (end -3.175 -23.495) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.175 -23.495) (end -4.445 -23.495) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.445 -23.495) (end -5.08 -24.13) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.08 -24.13) (end -5.715 -24.13) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.715 -24.13) (end -5.715 -15.24) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.43 1.27) (end -11.43 -8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.43 -8.89) (end -10.795 -15.24) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.795 -15.24) (end -5.08 -15.24) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.08 -15.24) (end -5.08 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start 34.29 1.27) (end 34.29 -8.255) (layer F.SilkS) (width 0.15)) + (fp_line (start 34.29 -8.255) (end 33.655 -15.24) (layer F.SilkS) (width 0.15)) + (fp_line (start 33.655 -15.24) (end 27.94 -15.24) (layer F.SilkS) (width 0.15)) + (fp_line (start 27.94 -15.24) (end 27.94 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start 27.94 -12.065) (end -5.08 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.43 1.27) (end 34.29 1.27) (layer F.SilkS) (width 0.15)) + (fp_circle (center -5.842 -0.635) (end -4.445 -0.635) (layer F.SilkS) (width 0.15)) + (fp_circle (center 28.702 -0.635) (end 30.099 -0.635) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 0 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 2.54 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 2.54 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 5.08 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 5.08 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 7.62 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 7.62 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at 10.16 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at 10.16 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at 12.7 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at 12.7 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at 15.24 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at 15.24 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at 17.78 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at 17.78 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at 20.32 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at 20.32 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at 22.86 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at 22.86 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/GoldTek_SCP20GS11.kicad_mod b/PCB/.pretty/GoldTek_SCP20GS11.kicad_mod new file mode 100644 index 00000000..0c65d93c --- /dev/null +++ b/PCB/.pretty/GoldTek_SCP20GS11.kicad_mod @@ -0,0 +1,75 @@ +(module GoldTek_SCP20GS11 (layer F.Cu) (tedit 556C2993) + (descr "GoldTek SCP20GS11") + (tags "CONN GoldTek SCP20GS11") + (fp_text reference REF** (at -1.27 -6.985) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value GoldTek_SCP20GS11 (at 20.955 -6.985) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -11.15 -5.8) (end 34 -5.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 34 -5.8) (end 34 3.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 34 3.3) (end -11.15 3.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -11.15 3.3) (end -11.15 -5.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.635 1.905) (end 0 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 1.27) (end 0.635 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 1.905) (end -0.635 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.175 -3.175) (end -2.54 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 -3.175) (end -2.54 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 0.635) (end -3.175 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.81 -3.175) (end -3.175 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.175 -3.175) (end -3.175 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.175 0.635) (end -3.81 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.445 -4.445) (end -4.445 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.67 -3.175) (end 26.035 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.035 -3.175) (end 26.035 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.035 0.635) (end 26.67 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.67 0.635) (end 26.035 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.035 0.635) (end 25.4 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 25.4 0.635) (end 25.4 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 25.4 -3.175) (end 26.035 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 27.305 -4.445) (end 27.305 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.525 -3.175) (end -9.525 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 32.385 -3.175) (end 32.385 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 0.635) (end -10.795 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 -3.175) (end -10.795 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 30.48 0.635) (end 33.655 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 30.48 -3.175) (end 33.655 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.81 -4.445) (end -7.62 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 -4.445) (end -7.62 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 1.905) (end -3.81 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.67 -4.445) (end 30.48 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 30.48 -4.445) (end 30.48 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start 30.48 1.905) (end 26.67 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.652 3.048) (end 9.652 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.652 2.286) (end -3.81 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.81 2.286) (end -3.81 -4.826) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.81 -4.826) (end 26.67 -4.826) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.67 -4.826) (end 26.67 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.67 2.286) (end 13.208 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.208 2.286) (end 13.208 3.048) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.922 -5.588) (end -10.922 3.048) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.922 3.048) (end 33.782 3.048) (layer F.SilkS) (width 0.15)) + (fp_line (start 33.782 3.048) (end 33.782 -5.588) (layer F.SilkS) (width 0.15)) + (fp_line (start 33.782 -5.588) (end -10.922 -5.588) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 0 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 2.54 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 2.54 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 5.08 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 5.08 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 7.62 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 7.62 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at 10.16 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at 10.16 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at 12.7 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at 12.7 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at 15.24 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at 15.24 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at 17.78 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at 17.78 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at 20.32 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at 20.32 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at 22.86 0) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at 22.86 -2.54) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/HE10-10C.kicad_mod b/PCB/.pretty/HE10-10C.kicad_mod new file mode 100644 index 00000000..2b5ff121 --- /dev/null +++ b/PCB/.pretty/HE10-10C.kicad_mod @@ -0,0 +1,44 @@ +(module HE10-10C (layer F.Cu) (tedit 0) + (descr "Connecteur HE10 10 contacts couche") + (tags "CONN HE10") + (fp_text reference REF** (at -1.524 5.08 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value HE10-10C (at -2.032 8.128) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -8.636 -2.54) (end -8.636 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.636 2.032) (end -9.906 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.906 3.302) (end -11.938 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.938 3.302) (end -13.208 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.208 2.032) (end -13.208 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.208 -2.54) (end 13.208 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.208 2.032) (end 11.938 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.938 3.302) (end 9.652 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.652 3.302) (end 8.382 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.382 2.032) (end 8.382 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.24 -2.54) (end 15.24 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.24 4.445) (end 12.065 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.065 14.605) (end 8.255 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.24 -2.54) (end -15.24 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.24 -2.54) (end -15.24 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.24 4.445) (end -12.065 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.065 14.605) (end -8.255 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.255 14.605) (end -6.35 10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.35 10.16) (end 6.35 10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.255 14.605) (end 6.35 10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.699 10.16) (end 3.683 8.128) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.683 8.128) (end 2.667 10.16) (layer F.SilkS) (width 0.15)) + (pad 0 thru_hole circle (at -10.922 0.508) (size 3.048 3.048) (drill 2.54) (layers *.Cu *.Mask F.SilkS)) + (pad 0 thru_hole circle (at 10.922 0.508) (size 3.048 3.048) (drill 2.54) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at 5.08 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 5.08 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 2.54 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 2.54 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 0 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 0 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -2.54 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -2.54 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -5.08 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at -5.08 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/HE10_20D.kicad_mod b/PCB/.pretty/HE10_20D.kicad_mod new file mode 100644 index 00000000..59febe55 --- /dev/null +++ b/PCB/.pretty/HE10_20D.kicad_mod @@ -0,0 +1,51 @@ +(module HE10_20D (layer F.Cu) (tedit 0) + (descr "Connecteur HE10 20 contacts droit") + (tags "CONN HE10") + (fp_text reference REF** (at -12.7 -5.715) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value HE10_20D (at 9.525 -5.715) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.778 4.318) (end -1.778 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 3.556) (end -15.24 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.24 3.556) (end -15.24 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.24 -3.556) (end 15.24 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.24 -3.556) (end 15.24 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.24 3.556) (end 1.778 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.778 3.556) (end 1.778 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.954 1.27) (end -14.224 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -14.224 0.508) (end -14.224 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -14.224 2.032) (end -12.954 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -22.352 -4.318) (end -22.352 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -22.352 4.318) (end 22.352 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 22.352 4.318) (end 22.352 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 22.352 -4.318) (end -22.352 -4.318) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at -11.43 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -11.43 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -8.89 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -8.89 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -6.35 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -6.35 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -3.81 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -3.81 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -1.27 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at -1.27 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at 1.27 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at 1.27 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at 3.81 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at 3.81 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at 6.35 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at 6.35 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at 8.89 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at 8.89 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at 11.43 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at 11.43 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -20.32 0.254) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 20.32 0.254) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/HE10_20D.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/HE10_26D.kicad_mod b/PCB/.pretty/HE10_26D.kicad_mod new file mode 100644 index 00000000..47460537 --- /dev/null +++ b/PCB/.pretty/HE10_26D.kicad_mod @@ -0,0 +1,52 @@ +(module HE10_26D (layer F.Cu) (tedit 0) + (descr "Connecteur HE10 26 contacts droit") + (tags "CONN HE10") + (fp_text reference REF** (at -15.24 -5.715) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value HE10_26D (at 13.335 -5.715) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -16.764 1.27) (end -18.034 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -18.034 0.508) (end -18.034 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -18.034 2.032) (end -16.764 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -26.162 -4.318) (end -26.162 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -26.162 4.318) (end 26.162 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.162 4.318) (end 26.162 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 26.162 -4.318) (end -26.162 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 4.318) (end -1.778 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 3.556) (end -19.05 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.05 3.556) (end -19.05 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.05 -3.556) (end 19.05 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.05 -3.556) (end 19.05 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.05 3.556) (end 1.778 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.778 3.556) (end 1.778 4.318) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at -15.24 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -15.24 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -12.7 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -12.7 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -10.16 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -10.16 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -7.62 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -7.62 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -5.08 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at -5.08 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at -2.54 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at -2.54 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at 0 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at 0 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at 2.54 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at 2.54 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at 5.08 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at 5.08 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at 7.62 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at 7.62 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -24.13 0.254) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) + (pad 21 thru_hole circle (at 10.16 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 22 thru_hole circle (at 10.16 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 23 thru_hole circle (at 12.7 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 24 thru_hole circle (at 12.7 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 25 thru_hole circle (at 15.24 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 26 thru_hole circle (at 15.24 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 24.13 0.254) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/HE10_34D.kicad_mod b/PCB/.pretty/HE10_34D.kicad_mod new file mode 100644 index 00000000..56bbcaf5 --- /dev/null +++ b/PCB/.pretty/HE10_34D.kicad_mod @@ -0,0 +1,60 @@ +(module HE10_34D (layer F.Cu) (tedit 0) + (descr "Connecteur HE10 34 contacts droit") + (tags "CONN HE10") + (fp_text reference REF** (at -8.89 -5.842) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value HE10_34D (at 9.144 -5.842) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -21.844 1.27) (end -23.114 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -23.114 0.508) (end -23.114 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -23.114 2.032) (end -21.844 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -31.242 -4.318) (end -31.242 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -31.242 4.318) (end 31.242 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 31.242 4.318) (end 31.242 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 31.242 -4.318) (end -31.242 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 4.318) (end -1.778 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 3.556) (end -24.13 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -24.13 3.556) (end -24.13 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -24.13 -3.556) (end 24.13 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 24.13 -3.556) (end 24.13 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 24.13 3.556) (end 1.778 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.778 3.556) (end 1.778 4.318) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at -20.32 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -20.32 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -17.78 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -17.78 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -15.24 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -15.24 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -12.7 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -12.7 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -10.16 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at -10.16 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at -7.62 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at -7.62 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at -5.08 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at -5.08 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at -2.54 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at -2.54 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at 0 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at 0 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at 2.54 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at 2.54 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -29.21 0.254) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) + (pad 21 thru_hole circle (at 5.08 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 22 thru_hole circle (at 5.08 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 23 thru_hole circle (at 7.62 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 24 thru_hole circle (at 7.62 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 25 thru_hole circle (at 10.16 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 26 thru_hole circle (at 10.16 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 27 thru_hole circle (at 12.7 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 28 thru_hole circle (at 12.7 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 29 thru_hole circle (at 15.24 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 30 thru_hole circle (at 15.24 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 31 thru_hole circle (at 17.78 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 32 thru_hole circle (at 17.78 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 33 thru_hole circle (at 20.32 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 34 thru_hole circle (at 20.32 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 29.21 0.254) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/HE10_40D.kicad_mod b/PCB/.pretty/HE10_40D.kicad_mod new file mode 100644 index 00000000..3ec96818 --- /dev/null +++ b/PCB/.pretty/HE10_40D.kicad_mod @@ -0,0 +1,66 @@ +(module HE10_40D (layer F.Cu) (tedit 0) + (descr "Connecteur HE10 40 contacts droit") + (tags "CONN HE10") + (fp_text reference REF** (at -17.145 -5.715) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value HE10_40D (at 17.78 -5.715) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -25.654 1.27) (end -26.924 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -26.924 0.508) (end -26.924 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -26.924 2.032) (end -25.654 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -35.052 -4.318) (end -35.052 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -35.052 4.318) (end 35.052 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 35.052 4.318) (end 35.052 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 35.052 -4.318) (end -35.052 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 4.318) (end -1.778 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 3.556) (end -27.94 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -27.94 3.556) (end -27.94 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -27.94 -3.556) (end 27.94 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 27.94 -3.556) (end 27.94 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 27.94 3.556) (end 1.778 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.778 3.556) (end 1.778 4.318) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at -24.13 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -24.13 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -21.59 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -21.59 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -19.05 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -19.05 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -16.51 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -16.51 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -13.97 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at -13.97 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at -11.43 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at -11.43 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at -8.89 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at -8.89 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at -6.35 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at -6.35 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at -3.81 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at -3.81 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at -1.27 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at -1.27 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -33.02 0.254) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) + (pad 21 thru_hole circle (at 1.27 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 22 thru_hole circle (at 1.27 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 23 thru_hole circle (at 3.81 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 24 thru_hole circle (at 3.81 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 25 thru_hole circle (at 6.35 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 26 thru_hole circle (at 6.35 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 27 thru_hole circle (at 8.89 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 28 thru_hole circle (at 8.89 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 29 thru_hole circle (at 11.43 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 30 thru_hole circle (at 11.43 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 31 thru_hole circle (at 13.97 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 32 thru_hole circle (at 13.97 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 33 thru_hole circle (at 16.51 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 34 thru_hole circle (at 16.51 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 35 thru_hole circle (at 19.05 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 36 thru_hole circle (at 19.05 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 37 thru_hole circle (at 21.59 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 38 thru_hole circle (at 21.59 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 39 thru_hole circle (at 24.13 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 40 thru_hole circle (at 24.13 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 33.02 0.254) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/HE10_50D.kicad_mod b/PCB/.pretty/HE10_50D.kicad_mod new file mode 100644 index 00000000..8ac9487f --- /dev/null +++ b/PCB/.pretty/HE10_50D.kicad_mod @@ -0,0 +1,76 @@ +(module HE10_50D (layer F.Cu) (tedit 0) + (descr "Connecteur HE10 50 contacts droit") + (tags "CONN HE10") + (fp_text reference REF** (at -8.128 -5.842) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value HE10_50D (at 11.43 -6.096) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -32.004 1.27) (end -33.274 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -33.274 0.508) (end -33.274 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -33.274 2.032) (end -32.004 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -41.402 -4.318) (end -41.402 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -41.402 4.318) (end 41.402 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 41.402 4.318) (end 41.402 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 41.402 -4.318) (end -41.402 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 4.318) (end -1.778 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 3.556) (end -34.29 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -34.29 3.556) (end -34.29 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -34.29 -3.556) (end 34.29 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 34.29 -3.556) (end 34.29 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 34.29 3.556) (end 1.778 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.778 3.556) (end 1.778 4.318) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at -30.48 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -30.48 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -27.94 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -27.94 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -25.4 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -25.4 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -22.86 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -22.86 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -20.32 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at -20.32 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at -17.78 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at -17.78 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at -15.24 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at -15.24 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at -12.7 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at -12.7 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at -10.16 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at -10.16 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at -7.62 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at -7.62 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -39.37 0.254) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) + (pad 21 thru_hole circle (at -5.08 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 22 thru_hole circle (at -5.08 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 23 thru_hole circle (at -2.54 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 24 thru_hole circle (at -2.54 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 25 thru_hole circle (at 0 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 26 thru_hole circle (at 0 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 27 thru_hole circle (at 2.54 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 28 thru_hole circle (at 2.54 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 29 thru_hole circle (at 5.08 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 30 thru_hole circle (at 5.08 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 31 thru_hole circle (at 7.62 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 32 thru_hole circle (at 7.62 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 33 thru_hole circle (at 10.16 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 34 thru_hole circle (at 10.16 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 35 thru_hole circle (at 12.7 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 36 thru_hole circle (at 12.7 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 37 thru_hole circle (at 15.24 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 38 thru_hole circle (at 15.24 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 39 thru_hole circle (at 17.78 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 40 thru_hole circle (at 17.78 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 41 thru_hole circle (at 20.32 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 42 thru_hole circle (at 20.32 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 43 thru_hole circle (at 22.86 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 44 thru_hole circle (at 22.86 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 45 thru_hole circle (at 25.4 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 46 thru_hole circle (at 25.4 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 47 thru_hole circle (at 27.94 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 48 thru_hole circle (at 27.94 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 49 thru_hole circle (at 30.48 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 50 thru_hole circle (at 30.48 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 39.37 0.254) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/HE10_60D.kicad_mod b/PCB/.pretty/HE10_60D.kicad_mod new file mode 100644 index 00000000..f58ffb68 --- /dev/null +++ b/PCB/.pretty/HE10_60D.kicad_mod @@ -0,0 +1,86 @@ +(module HE10_60D (layer F.Cu) (tedit 0) + (descr "Connecteur HE10 60 contacts droit") + (tags "CONN HE10") + (fp_text reference REF** (at -16.51 -6.35) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value HE10_60D (at 10.795 -6.35) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -38.354 1.016) (end -39.624 0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start -39.624 0.254) (end -39.624 1.778) (layer F.SilkS) (width 0.15)) + (fp_line (start -39.624 1.778) (end -38.354 1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -47.752 -4.572) (end -47.752 4.064) (layer F.SilkS) (width 0.15)) + (fp_line (start -47.752 4.064) (end 47.752 4.064) (layer F.SilkS) (width 0.15)) + (fp_line (start 47.752 4.064) (end 47.752 -4.572) (layer F.SilkS) (width 0.15)) + (fp_line (start 47.752 -4.572) (end -47.752 -4.572) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 4.064) (end -1.778 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 3.302) (end -40.64 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -40.64 3.302) (end -40.64 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -40.64 -3.81) (end 40.64 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 40.64 -3.81) (end 40.64 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 40.64 3.302) (end 1.778 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.778 3.302) (end 1.778 4.064) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at -36.83 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -36.83 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -34.29 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -34.29 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -31.75 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -31.75 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -29.21 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -29.21 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -26.67 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at -26.67 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at -24.13 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at -24.13 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at -21.59 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at -21.59 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at -19.05 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at -19.05 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at -16.51 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at -16.51 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at -13.97 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at -13.97 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -45.72 0) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) + (pad 21 thru_hole circle (at -11.43 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 22 thru_hole circle (at -11.43 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 23 thru_hole circle (at -8.89 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 24 thru_hole circle (at -8.89 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 25 thru_hole circle (at -6.35 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 26 thru_hole circle (at -6.35 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 27 thru_hole circle (at -3.81 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 28 thru_hole circle (at -3.81 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 29 thru_hole circle (at -1.27 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 30 thru_hole circle (at -1.27 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 31 thru_hole circle (at 1.27 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 32 thru_hole circle (at 1.27 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 33 thru_hole circle (at 3.81 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 34 thru_hole circle (at 3.81 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 35 thru_hole circle (at 6.35 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 36 thru_hole circle (at 6.35 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 37 thru_hole circle (at 8.89 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 38 thru_hole circle (at 8.89 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 39 thru_hole circle (at 11.43 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 40 thru_hole circle (at 11.43 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 41 thru_hole circle (at 13.97 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 42 thru_hole circle (at 13.97 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 43 thru_hole circle (at 16.51 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 44 thru_hole circle (at 16.51 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 45 thru_hole circle (at 19.05 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 46 thru_hole circle (at 19.05 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 47 thru_hole circle (at 21.59 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 48 thru_hole circle (at 21.59 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 49 thru_hole circle (at 24.13 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 50 thru_hole circle (at 24.13 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 51 thru_hole circle (at 26.67 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 52 thru_hole circle (at 26.67 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 53 thru_hole circle (at 29.21 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 54 thru_hole circle (at 29.21 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 55 thru_hole circle (at 31.75 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 56 thru_hole circle (at 31.75 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 57 thru_hole circle (at 34.29 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 58 thru_hole circle (at 34.29 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 59 thru_hole circle (at 36.83 1.016) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 60 thru_hole circle (at 36.83 -1.524) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 45.72 0) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/HE10_64D.kicad_mod b/PCB/.pretty/HE10_64D.kicad_mod new file mode 100644 index 00000000..af5435fb --- /dev/null +++ b/PCB/.pretty/HE10_64D.kicad_mod @@ -0,0 +1,90 @@ +(module HE10_64D (layer F.Cu) (tedit 0) + (descr "Connecteur HE10 64 contacts droit") + (tags "CONN HE10") + (fp_text reference REF** (at -10.922 -5.842) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value HE10_64D (at 5.334 -5.842) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -40.894 1.27) (end -42.164 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -42.164 0.508) (end -42.164 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -42.164 2.032) (end -40.894 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -50.292 -4.318) (end -50.292 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -50.292 4.318) (end 50.292 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 50.292 4.318) (end 50.292 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 50.292 -4.318) (end -50.292 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 4.318) (end -1.778 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 3.556) (end -43.18 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -43.18 3.556) (end -43.18 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -43.18 -3.556) (end 43.18 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 43.18 -3.556) (end 43.18 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 43.18 3.556) (end 1.778 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.778 3.556) (end 1.778 4.318) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at -39.37 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -39.37 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -36.83 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -36.83 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -34.29 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -34.29 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -31.75 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -31.75 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -29.21 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at -29.21 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at -26.67 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at -26.67 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at -24.13 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at -24.13 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at -21.59 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at -21.59 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at -19.05 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at -19.05 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at -16.51 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at -16.51 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -48.26 0.254) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) + (pad 21 thru_hole circle (at -13.97 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 22 thru_hole circle (at -13.97 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 23 thru_hole circle (at -11.43 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 24 thru_hole circle (at -11.43 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 25 thru_hole circle (at -8.89 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 26 thru_hole circle (at -8.89 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 27 thru_hole circle (at -6.35 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 28 thru_hole circle (at -6.35 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 29 thru_hole circle (at -3.81 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 30 thru_hole circle (at -3.81 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 31 thru_hole circle (at -1.27 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 32 thru_hole circle (at -1.27 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 33 thru_hole circle (at 1.27 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 34 thru_hole circle (at 1.27 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 35 thru_hole circle (at 3.81 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 36 thru_hole circle (at 3.81 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 37 thru_hole circle (at 6.35 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 38 thru_hole circle (at 6.35 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 39 thru_hole circle (at 8.89 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 40 thru_hole circle (at 8.89 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 41 thru_hole circle (at 11.43 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 42 thru_hole circle (at 11.43 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 43 thru_hole circle (at 13.97 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 44 thru_hole circle (at 13.97 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 45 thru_hole circle (at 16.51 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 46 thru_hole circle (at 16.51 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 47 thru_hole circle (at 19.05 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 48 thru_hole circle (at 19.05 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 49 thru_hole circle (at 21.59 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 50 thru_hole circle (at 21.59 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 51 thru_hole circle (at 24.13 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 52 thru_hole circle (at 24.13 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 53 thru_hole circle (at 26.67 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 54 thru_hole circle (at 26.67 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 55 thru_hole circle (at 29.21 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 56 thru_hole circle (at 29.21 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 57 thru_hole circle (at 31.75 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 58 thru_hole circle (at 31.75 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 59 thru_hole circle (at 34.29 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 60 thru_hole circle (at 34.29 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 61 thru_hole circle (at 36.83 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 62 thru_hole circle (at 36.83 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 63 thru_hole circle (at 39.37 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 64 thru_hole circle (at 39.37 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 48.26 0.254) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/JACK_ALIM.kicad_mod b/PCB/.pretty/JACK_ALIM.kicad_mod new file mode 100644 index 00000000..d7e77a58 --- /dev/null +++ b/PCB/.pretty/JACK_ALIM.kicad_mod @@ -0,0 +1,25 @@ +(module JACK_ALIM (layer F.Cu) (tedit 0) + (descr "module 1 pin (ou trou mecanique de percage)") + (tags "CONN JACK") + (fp_text reference REF** (at 0.254 -5.588) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value JACK_ALIM (at -5.08 5.588) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -7.112 -4.318) (end -7.874 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.874 -4.318) (end -7.874 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.874 4.318) (end -7.112 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.064 -4.318) (end -4.064 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.588 -4.318) (end 5.588 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.112 4.318) (end 5.588 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.112 -4.318) (end 5.588 -4.318) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at 0 0) (size 4.8006 4.8006) (drill oval 1.016 2.54) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at 6.096 0) (size 4.8006 4.8006) (drill oval 1.016 2.54) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 2.286 5.08) (size 4.8006 4.8006) (drill oval 2.54 1.016) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/JACK_ALIM.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.8 0.8 0.8)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/JWT_Vertical_A3963-RM3.96mm-2.kicad_mod b/PCB/.pretty/JWT_Vertical_A3963-RM3.96mm-2.kicad_mod new file mode 100644 index 00000000..08bc6e94 --- /dev/null +++ b/PCB/.pretty/JWT_Vertical_A3963-RM3.96mm-2.kicad_mod @@ -0,0 +1,31 @@ +(module JWT_Vertical_A3963-RM3.96mm-2 (layer F.Cu) (tedit 556C2ADD) + (descr "JWT A3963, 3.96mm pitch Pin head connector") + (tags "JWT A3963 pinhead") + (fp_text reference REF** (at 1.905 -5.08) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value JWT_Vertical_A3963-RM3.96mm-2 (at 1.905 6.35) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.5 -3.55) (end 6.35 -3.55) (layer F.CrtYd) (width 0.05)) + (fp_line (start 6.35 -3.55) (end 6.35 5.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start 6.35 5.05) (end -2.5 5.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.5 5.05) (end -2.5 -3.55) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.286 4.826) (end 5.969 4.826) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 4.826) (end -2.159 4.826) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 4.826) (end 1.524 4.572) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 4.572) (end 2.286 4.572) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.286 4.572) (end 2.286 4.826) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.889 -2.159) (end 4.699 -2.159) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.889 -3.048) (end 4.699 -3.048) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.969 -1.905) (end 5.969 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.159 -1.905) (end -2.159 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.889 -3.302) (end 4.699 -3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.699 -1.905) (end 4.699 -3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.889 -1.905) (end -0.889 -3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.159 -1.905) (end 5.969 -1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.159 0) (end -2.159 4.826) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.969 4.826) (end 5.969 0) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 3 3) (drill 1.75) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 3.885 0) (size 3 3) (drill 1.75) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/NMJ6HCD2.kicad_mod b/PCB/.pretty/NMJ6HCD2.kicad_mod new file mode 100644 index 00000000..45d58d6d --- /dev/null +++ b/PCB/.pretty/NMJ6HCD2.kicad_mod @@ -0,0 +1,41 @@ +(module NMJ6HCD2 (layer F.Cu) (tedit 551E8E62) + (descr "NMJ6HCD2, TRS 1/4\" jack connector, stereo, switched") + (tags "NMJ6HCD2 TRS stereo jack connector") + (fp_text reference REF** (at 0.889 18.415) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value NMJ6HCD2 (at 7.9153 -8.12) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -7.25) (end -1.75 20.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 20.15) (end 17.95 20.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 17.95 20.15) (end 17.95 -7.25) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -7.25) (end 17.95 -7.25) (layer F.CrtYd) (width 0.05)) + (fp_line (start 12.2555 16.637) (end 12.2555 19.857) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.7465 19.8755) (end 12.2325 19.8755) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.7465 16.637) (end 3.7465 19.857) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.159 -7) (end 2.159 -4) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.159 -7) (end 13.859 -7) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.859 -7) (end 13.859 -4) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.135 16.6095) (end 17.15 16.6095) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.15 16.6095) (end 17.15 14.1605) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.135 16.6095) (end -1.135 14.1605) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.135 -1.45) (end -1.135 -4) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.135 4.8895) (end -1.135 1.4605) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.135 11.2395) (end -1.135 7.8105) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.15 7.8105) (end 17.15 11.2395) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.15 1.4605) (end 17.15 4.8895) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.15 -4) (end 17.15 -1.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.135 -4) (end 17.15 -4) (layer F.SilkS) (width 0.15)) + (pad 6 thru_hole circle (at 16.23 6.35) (size 3 3) (drill 1.5) (layers *.Cu *.Mask)) + (pad 5 thru_hole circle (at 16.23 12.7) (size 3 3) (drill 1.5) (layers *.Cu *.Mask)) + (pad 4 thru_hole circle (at 16.23 0) (size 3 3) (drill 1.5) (layers *.Cu *.Mask)) + (pad 3 thru_hole circle (at 0 6.35) (size 3 3) (drill 1.5) (layers *.Cu *.Mask)) + (pad 2 thru_hole circle (at 0 12.7) (size 3 3) (drill 1.5) (layers *.Cu *.Mask)) + (pad 1 thru_hole circle (at 0 0) (size 3 3) (drill 1.5) (layers *.Cu *.Mask)) + (model Connect.3dshapes/NMJ6HCD2.wrl + (at (xyz 0.32 0.165 0)) + (scale (xyz 0.39 0.39 0.39)) + (rotate (xyz -90 0 180)) + ) +) diff --git a/PCB/.pretty/PCI-EXPRESS.kicad_mod b/PCB/.pretty/PCI-EXPRESS.kicad_mod new file mode 100644 index 00000000..d370bcac --- /dev/null +++ b/PCB/.pretty/PCI-EXPRESS.kicad_mod @@ -0,0 +1,89 @@ +(module PCI-EXPRESS (layer F.Cu) (tedit 545FBBB8) + (fp_text reference REF** (at -4.445 -3.81) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value PCI-EXPRESS (at 6.985 -3.81) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.09982 -2.49936) (end 1.09982 -5.69976) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.09982 -5.69976) (end 2.90068 -5.69976) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.90068 -5.69976) (end 2.90068 -2.49936) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.20064 -2.49936) (end 1.09982 -2.49936) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.09982 -2.49936) (end 1.09982 3.29946) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.09982 3.29946) (end -10.20064 3.29946) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.20064 3.29946) (end -10.20064 -2.49936) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.20064 -2.49936) (end 2.90068 -2.49936) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.90068 3.29946) (end 10.20064 3.29946) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.90068 -2.49936) (end 2.90068 3.29946) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.20064 -2.49936) (end 10.20064 3.29946) (layer F.SilkS) (width 0.15)) + (pad "" connect circle (at 9.4996 2.30124) (size 0.65024 0.65024) (layers F.Cu F.Mask)) + (pad B1 connect rect (at -9.4996 0) (size 0.65024 4.59994) (layers F.Cu F.Mask)) + (pad B2 connect rect (at -8.49884 0) (size 0.65024 4.59994) (layers F.Cu F.Mask)) + (pad B3 connect rect (at -7.50062 0) (size 0.65024 4.59994) (layers F.Cu F.Mask)) + (pad B4 connect rect (at -6.49986 0) (size 0.65024 4.59994) (layers F.Cu F.Mask)) + (pad B5 connect rect (at -5.4991 0) (size 0.65024 4.59994) (layers F.Cu F.Mask)) + (pad B6 connect rect (at -4.50088 0) (size 0.65024 4.59994) (layers F.Cu F.Mask)) + (pad B7 connect rect (at -3.50012 0) (size 0.65024 4.59994) (layers F.Cu F.Mask)) + (pad B8 connect rect (at -2.49936 0) (size 0.65024 4.59994) (layers F.Cu F.Mask)) + (pad B9 connect rect (at -1.50114 0) (size 0.65024 4.59994) (layers F.Cu F.Mask)) + (pad B10 connect rect (at -0.50038 0) (size 0.65024 4.59994) (layers F.Cu F.Mask)) + (pad B11 connect rect (at 0.50038 0) (size 0.65024 4.59994) (layers F.Cu F.Mask)) + (pad B14 connect rect (at 5.4991 0) (size 0.65024 4.59994) (layers F.Cu F.Mask)) + (pad B15 connect rect (at 6.49986 0) (size 0.65024 4.59994) (layers F.Cu F.Mask)) + (pad B16 connect rect (at 7.50062 0) (size 0.65024 4.59994) (layers F.Cu F.Mask)) + (pad B17 connect rect (at 8.49884 -0.50038) (size 0.65024 3.59918) (layers F.Cu F.Mask)) + (pad B18 connect rect (at 9.4996 0) (size 0.65024 4.59994) (layers F.Cu F.Mask)) + (pad B12 connect rect (at 3.50012 0) (size 0.65024 4.59994) (layers F.Cu F.Mask)) + (pad B13 connect rect (at 4.50088 0) (size 0.65024 4.59994) (layers F.Cu F.Mask)) + (pad A1 connect rect (at -9.4996 -0.50038) (size 0.65024 3.59918) (layers B.Cu B.Mask)) + (pad A2 connect rect (at -8.49884 0) (size 0.65024 4.59994) (layers B.Cu B.Mask)) + (pad A3 connect rect (at -7.50062 0) (size 0.65024 4.59994) (layers B.Cu B.Mask)) + (pad A4 connect rect (at -6.49986 0) (size 0.65024 4.59994) (layers B.Cu B.Mask)) + (pad A5 connect rect (at -5.4991 0) (size 0.65024 4.59994) (layers B.Cu B.Mask)) + (pad A6 connect rect (at -4.50088 0) (size 0.65024 4.59994) (layers B.Cu B.Mask)) + (pad A7 connect rect (at -3.50012 0) (size 0.65024 4.59994) (layers B.Cu B.Mask)) + (pad A8 connect rect (at -2.49936 0) (size 0.65024 4.59994) (layers B.Cu B.Mask)) + (pad A9 connect rect (at -1.50114 0) (size 0.65024 4.59994) (layers B.Cu B.Mask)) + (pad A10 connect rect (at -0.50038 0) (size 0.65024 4.59994) (layers B.Cu B.Mask)) + (pad A11 connect rect (at 0.50038 0) (size 0.65024 4.59994) (layers B.Cu B.Mask)) + (pad A14 connect rect (at 5.4991 0) (size 0.65024 4.59994) (layers B.Cu B.Mask)) + (pad A15 connect rect (at 6.49986 0) (size 0.65024 4.59994) (layers B.Cu B.Mask)) + (pad A16 connect rect (at 7.50062 0) (size 0.65024 4.59994) (layers B.Cu B.Mask)) + (pad A17 connect rect (at 8.49884 0) (size 0.65024 4.59994) (layers B.Cu B.Mask)) + (pad A18 connect rect (at 9.4996 0) (size 0.65024 4.59994) (layers B.Cu B.Mask)) + (pad A12 connect rect (at 3.50012 0) (size 0.65024 4.59994) (layers B.Cu B.Mask)) + (pad A13 connect rect (at 4.50088 0) (size 0.65024 4.59994) (layers B.Cu B.Mask)) + (pad "" connect circle (at -7.50062 2.30124) (size 0.65024 0.65024) (layers F.Cu F.Mask)) + (pad "" connect circle (at -6.49986 2.30124) (size 0.65024 0.65024) (layers F.Cu F.Mask)) + (pad "" connect circle (at -5.4991 2.30124) (size 0.65024 0.65024) (layers F.Cu F.Mask)) + (pad "" connect circle (at -4.50088 2.30124) (size 0.65024 0.65024) (layers F.Cu F.Mask)) + (pad "" connect circle (at -3.50012 2.30124) (size 0.65024 0.65024) (layers F.Cu F.Mask)) + (pad "" connect circle (at -2.49936 2.30124) (size 0.65024 0.65024) (layers F.Cu F.Mask)) + (pad "" connect circle (at -1.50114 2.30124) (size 0.65024 0.65024) (layers F.Cu F.Mask)) + (pad "" connect circle (at -0.50038 2.30124) (size 0.65024 0.65024) (layers F.Cu F.Mask)) + (pad "" connect circle (at 0.50038 2.30124) (size 0.65024 0.65024) (layers F.Cu F.Mask)) + (pad "" connect circle (at -9.4996 2.30124) (size 0.65024 0.65024) (layers F.Cu F.Mask)) + (pad "" connect circle (at 3.50012 2.30124) (size 0.65024 0.65024) (layers F.Cu F.Mask)) + (pad "" connect circle (at 4.50088 2.30124) (size 0.65024 0.65024) (layers F.Cu F.Mask)) + (pad "" connect circle (at 5.4991 2.30124) (size 0.65024 0.65024) (layers F.Cu F.Mask)) + (pad "" connect circle (at 6.49986 2.30124) (size 0.65024 0.65024) (layers F.Cu F.Mask)) + (pad "" connect circle (at 7.50062 2.30124) (size 0.65024 0.65024) (layers F.Cu F.Mask)) + (pad "" connect circle (at -8.49884 2.30124) (size 0.65024 0.65024) (layers F.Cu F.Mask)) + (pad "" connect oval (at -6.49986 2.30124 90) (size 0.65024 0.65024) (layers B.Cu B.Mask)) + (pad "" connect oval (at -5.4991 2.30124 90) (size 0.65024 0.65024) (layers B.Cu B.Mask)) + (pad "" connect oval (at -4.50088 2.30124 90) (size 0.65024 0.65024) (layers B.Cu B.Mask)) + (pad "" connect oval (at -3.50012 2.30124 90) (size 0.65024 0.65024) (layers B.Cu B.Mask)) + (pad "" connect oval (at -2.49936 2.30124 90) (size 0.65024 0.65024) (layers B.Cu B.Mask)) + (pad "" connect oval (at -1.50114 2.30124 90) (size 0.65024 0.65024) (layers B.Cu B.Mask)) + (pad "" connect oval (at -0.50038 2.30124 90) (size 0.65024 0.65024) (layers B.Cu B.Mask)) + (pad "" connect oval (at 5.4991 2.30124 90) (size 0.65024 0.65024) (layers B.Cu B.Mask)) + (pad "" connect oval (at 6.49986 2.30124 90) (size 0.65024 0.65024) (layers B.Cu B.Mask)) + (pad "" connect oval (at -7.50062 2.30124 90) (size 0.65024 0.65024) (layers B.Cu B.Mask)) + (pad "" connect oval (at 4.50088 2.30124 90) (size 0.65024 0.65024) (layers B.Cu B.Mask)) + (pad "" connect oval (at 7.50062 2.30124 90) (size 0.65024 0.65024) (layers B.Cu B.Mask)) + (pad "" connect oval (at 0.50038 2.30124 90) (size 0.65024 0.65024) (layers B.Cu B.Mask)) + (pad "" connect oval (at 3.50012 2.30124 90) (size 0.65024 0.65024) (layers B.Cu B.Mask)) + (pad "" connect oval (at 8.49884 2.30124 90) (size 0.65024 0.65024) (layers B.Cu B.Mask)) + (pad "" connect oval (at 9.4996 2.30124 90) (size 0.65024 0.65024) (layers B.Cu B.Mask)) + (pad "" connect oval (at -8.49884 2.30124 90) (size 0.65024 0.65024) (layers B.Cu B.Mask)) +) diff --git a/PCB/.pretty/PINHEAD1-2.kicad_mod b/PCB/.pretty/PINHEAD1-2.kicad_mod new file mode 100644 index 00000000..9c339a3d --- /dev/null +++ b/PCB/.pretty/PINHEAD1-2.kicad_mod @@ -0,0 +1,16 @@ +(module PINHEAD1-2 (layer F.Cu) (tedit 0) + (attr virtual) + (fp_text reference REF** (at 0 -3.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value PINHEAD1-2 (at 0 3.81) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 2.54 -1.27) (end -2.54 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 3.175) (end -2.54 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 -3.175) (end 2.54 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 -3.175) (end -2.54 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -3.175) (end 2.54 3.175) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole oval (at -1.27 0) (size 1.50622 3.01498) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 2 thru_hole oval (at 1.27 0) (size 1.50622 3.01498) (drill 0.99822) (layers *.Cu *.Mask)) +) diff --git a/PCB/.pretty/PINHEAD1-3.kicad_mod b/PCB/.pretty/PINHEAD1-3.kicad_mod new file mode 100644 index 00000000..a1d1849d --- /dev/null +++ b/PCB/.pretty/PINHEAD1-3.kicad_mod @@ -0,0 +1,17 @@ +(module PINHEAD1-3 (layer F.Cu) (tedit 0) + (attr virtual) + (fp_text reference REF** (at 0.05 -3.8) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value PINHEAD1-3 (at 0 3.81) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.81 -3.175) (end -3.81 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -3.175) (end 3.81 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27) (end -3.81 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.81 -3.175) (end 3.81 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 3.175) (end -3.81 3.175) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole oval (at -2.54 0) (size 1.50622 3.01498) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 2 thru_hole oval (at 0 0) (size 1.50622 3.01498) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 3 thru_hole oval (at 2.54 0) (size 1.50622 3.01498) (drill 0.99822) (layers *.Cu *.Mask)) +) diff --git a/PCB/.pretty/PINHEAD1-6.kicad_mod b/PCB/.pretty/PINHEAD1-6.kicad_mod new file mode 100644 index 00000000..b269528e --- /dev/null +++ b/PCB/.pretty/PINHEAD1-6.kicad_mod @@ -0,0 +1,23 @@ +(module PINHEAD1-6 (layer F.Cu) (tedit 0) + (attr virtual) + (fp_text reference REF** (at 0 -3.75) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value PINHEAD1-6 (at 0 3.81) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 0 3.175) (end 7.62 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 -1.27) (end 7.62 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 -3.175) (end 7.62 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 -3.175) (end -7.62 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 -3.175) (end 7.62 3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 -1.27) (end -7.62 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 -3.175) (end 0 -3.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 3.175) (end -7.62 3.175) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole oval (at -6.35 0) (size 1.50622 3.01498) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 2 thru_hole oval (at -3.81 0) (size 1.50622 3.01498) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 3 thru_hole oval (at -1.27 0) (size 1.50622 3.01498) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 4 thru_hole oval (at 1.27 0) (size 1.50622 3.01498) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 5 thru_hole oval (at 3.81 0) (size 1.50622 3.01498) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 6 thru_hole oval (at 6.35 0) (size 1.50622 3.01498) (drill 0.99822) (layers *.Cu *.Mask)) +) diff --git a/PCB/.pretty/PINTST.kicad_mod b/PCB/.pretty/PINTST.kicad_mod new file mode 100644 index 00000000..b43d6b40 --- /dev/null +++ b/PCB/.pretty/PINTST.kicad_mod @@ -0,0 +1,17 @@ +(module PINTST (layer F.Cu) (tedit 0) + (descr "module 1 pin (ou trou mecanique de percage)") + (tags DEV) + (fp_text reference REF** (at 0 -1.26746) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value PINTST (at 0 1.27) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 0 0) (end -0.254 -0.762) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole circle (at 0 0) (size 1.143 1.143) (drill 0.635) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/PINTST.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/QMS-1X52-FEMALE-SMD.kicad_mod b/PCB/.pretty/QMS-1X52-FEMALE-SMD.kicad_mod new file mode 100644 index 00000000..726b1769 --- /dev/null +++ b/PCB/.pretty/QMS-1X52-FEMALE-SMD.kicad_mod @@ -0,0 +1,94 @@ +(module QMS-1X52-FEMALE-SMD (layer F.Cu) (tedit 0) + (attr smd) + (fp_text reference REF** (at 0.4 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value QMS-1X52-FEMALE-SMD (at -0.1 2) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 9.398 -1.27) (end -9.398 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.398 1.27) (end 9.398 1.27) (layer F.SilkS) (width 0.15)) + (fp_text user 52 (at -9.4488 3.5306) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -8.636 -4.2418) (end -11.684 -4.2418) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.636 4.318) (end -11.684 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.684 -4.318) (end -11.684 4.318) (layer F.SilkS) (width 0.15)) + (fp_text user 2 (at 9.0678 3.3274) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user 1 (at 8.9916 -3.0226) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 9.398 1.27) (end 9.398 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.398 -1.27) (end -9.398 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.684 4.318) (end 11.684 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.684 -4.318) (end 8.636 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.636 -4.318) (end 8.636 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.636 -3.7338) (end -8.636 -3.7338) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.636 -3.7338) (end -8.636 -4.2418) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.636 4.318) (end -8.636 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.636 3.81) (end 8.636 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.636 3.81) (end 8.636 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.636 4.318) (end 11.684 4.318) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at 7.9375 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at 7.9375 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 3 smd rect (at 7.3025 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 4 smd rect (at 7.3025 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 5 smd rect (at 6.6675 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 6 smd rect (at 6.6675 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 7 smd rect (at 6.0325 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 8 smd rect (at 6.0325 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 9 smd rect (at 5.3975 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 10 smd rect (at 5.3975 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 11 smd rect (at 4.7625 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 12 smd rect (at 4.7625 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 13 smd rect (at 4.1275 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 14 smd rect (at 4.1275 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 15 smd rect (at 3.4925 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 16 smd rect (at 3.4925 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 17 smd rect (at 2.8575 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 18 smd rect (at 2.8575 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 19 smd rect (at 2.2225 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 20 smd rect (at 2.2225 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 21 smd rect (at 1.5875 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 22 smd rect (at 1.5875 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 23 smd rect (at 0.9525 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 24 smd rect (at 0.9525 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 25 smd rect (at 0.3175 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 26 smd rect (at 0.3175 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 27 smd rect (at -0.3175 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 28 smd rect (at -0.3175 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 29 smd rect (at -0.9525 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 30 smd rect (at -0.9525 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 31 smd rect (at -1.5875 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 32 smd rect (at -1.5875 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 33 smd rect (at -2.2225 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 34 smd rect (at -2.2225 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 35 smd rect (at -2.8575 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 36 smd rect (at -2.8575 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 37 smd rect (at -3.4925 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 38 smd rect (at -3.4925 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 39 smd rect (at -4.1275 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 40 smd rect (at -4.1275 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 41 smd rect (at -4.7625 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 42 smd rect (at -4.7625 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 43 smd rect (at -5.3975 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 44 smd rect (at -5.3975 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 45 smd rect (at -6.0325 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 46 smd rect (at -6.0325 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 47 smd rect (at -6.6675 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 48 smd rect (at -6.6675 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 49 smd rect (at -7.3025 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 50 smd rect (at -7.3025 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 51 smd rect (at -7.9375 -3.4163) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 52 smd rect (at -7.9375 3.429) (size 0.381 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 53 smd oval (at 0 0) (size 18.034 0.508) (layers F.Cu F.Paste F.Mask)) + (pad "" thru_hole circle (at -9.29132 1.78562) (size 1.524 1.524) (drill 1.27) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 9.3599 1.78562) (size 1.524 1.524) (drill 1.27) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/QMS-1X52-FEMALE-SMD.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.4 0.4 0.4)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/QMS-1X52-SMD.kicad_mod b/PCB/.pretty/QMS-1X52-SMD.kicad_mod new file mode 100644 index 00000000..72fd0c54 --- /dev/null +++ b/PCB/.pretty/QMS-1X52-SMD.kicad_mod @@ -0,0 +1,89 @@ +(module QMS-1X52-SMD (layer F.Cu) (tedit 0) + (attr smd) + (fp_text reference REF** (at 10.668 -1.651 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value QMS-1X52-SMD (at 0 -5.461) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 9.398 1.27) (end -9.398 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.398 -1.27) (end 9.398 -1.27) (layer F.SilkS) (width 0.15)) + (fp_text user 52 (at -9.2075 -2.7305) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -8.636 4.318) (end -11.684 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.636 -4.318) (end -11.684 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.684 4.318) (end -11.684 -4.318) (layer F.SilkS) (width 0.15)) + (fp_text user 2 (at 8.8265 -2.7305) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user 1 (at 8.8265 2.7305) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 9.398 -1.27) (end 9.398 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.398 1.27) (end -9.398 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.684 -4.318) (end 11.684 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.684 4.318) (end 8.636 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.636 4.318) (end 8.636 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.636 3.81) (end -8.636 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.636 3.81) (end -8.636 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.636 -4.318) (end -8.636 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.636 -3.81) (end 8.636 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.636 -3.81) (end 8.636 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.636 -4.318) (end 11.684 -4.318) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at 7.9375 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at 7.9375 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 3 smd rect (at 7.3025 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 4 smd rect (at 7.3025 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 5 smd rect (at 6.6675 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 6 smd rect (at 6.6675 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 7 smd rect (at 6.0325 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 8 smd rect (at 6.0325 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 9 smd rect (at 5.3975 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 10 smd rect (at 5.3975 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 11 smd rect (at 4.7625 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 12 smd rect (at 4.7625 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 13 smd rect (at 4.1275 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 14 smd rect (at 4.1275 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 15 smd rect (at 3.4925 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 16 smd rect (at 3.4925 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 17 smd rect (at 2.8575 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 18 smd rect (at 2.8575 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 19 smd rect (at 2.2225 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 20 smd rect (at 2.2225 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 21 smd rect (at 1.5875 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 22 smd rect (at 1.5875 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 23 smd rect (at 0.9525 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 24 smd rect (at 0.9525 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 25 smd rect (at 0.3175 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 26 smd rect (at 0.3175 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 27 smd rect (at -0.3175 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 28 smd rect (at -0.3175 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 29 smd rect (at -0.9525 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 30 smd rect (at -0.9525 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 31 smd rect (at -1.5875 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 32 smd rect (at -1.5875 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 33 smd rect (at -2.2225 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 34 smd rect (at -2.2225 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 35 smd rect (at -2.8575 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 36 smd rect (at -2.8575 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 37 smd rect (at -3.4925 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 38 smd rect (at -3.4925 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 39 smd rect (at -4.1275 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 40 smd rect (at -4.1275 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 41 smd rect (at -4.7625 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 42 smd rect (at -4.7625 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 43 smd rect (at -5.3975 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 44 smd rect (at -5.3975 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 45 smd rect (at -6.0325 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 46 smd rect (at -6.0325 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 47 smd rect (at -6.6675 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 48 smd rect (at -6.6675 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 49 smd rect (at -7.3025 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 50 smd rect (at -7.3025 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 51 smd rect (at -7.9375 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 52 smd rect (at -7.9375 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 53 smd rect (at 0 0) (size 18.034 0.508) (layers F.Cu F.Paste F.Mask)) + (pad "" thru_hole circle (at -10.287 2.032) (size 1.524 1.524) (drill 1.27) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 10.287 2.032) (size 1.524 1.524) (drill 1.27) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/QMS-2X52-SMD.kicad_mod b/PCB/.pretty/QMS-2X52-SMD.kicad_mod new file mode 100644 index 00000000..812b53c7 --- /dev/null +++ b/PCB/.pretty/QMS-2X52-SMD.kicad_mod @@ -0,0 +1,148 @@ +(module QMS-2X52-SMD (layer F.Cu) (tedit 0) + (attr smd) + (fp_text reference REF** (at 21.336 -1.397 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value QMS-2X52-SMD (at 0 -5.588) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 20.066 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 -1.27) (end 20.066 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -20.066 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.066 -1.27) (end -1.27 -1.27) (layer F.SilkS) (width 0.15)) + (fp_text user 2 (at 20.20062 -3.40106) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user 1 (at 19.99996 3.29946) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.27 1.27) (end -1.27 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.066 -1.27) (end -20.066 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.066 -1.27) (end 20.066 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 22.352 -4.318) (end 22.352 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 22.352 4.318) (end 19.304 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.304 4.318) (end 19.304 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.032 3.81) (end 2.032 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.032 4.318) (end -2.032 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.032 4.318) (end -2.032 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.304 3.81) (end -19.304 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.304 4.318) (end -22.352 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -22.352 4.318) (end -22.352 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -22.352 -4.318) (end -19.304 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.304 -4.318) (end -19.304 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.032 -3.81) (end -2.032 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.032 -4.318) (end 2.032 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.032 -4.318) (end 2.032 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.304 -3.81) (end 19.304 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.304 -4.318) (end 22.352 -4.318) (layer F.SilkS) (width 0.15)) + (fp_circle (center 0 0) (end 0 -1.143) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at 18.6055 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at 18.6055 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 3 smd rect (at 17.9705 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 4 smd rect (at 17.9705 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 5 smd rect (at 17.3355 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 6 smd rect (at 17.3355 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 7 smd rect (at 16.7005 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 8 smd rect (at 16.7005 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 9 smd rect (at 16.0655 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 10 smd rect (at 16.0655 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 11 smd rect (at 15.4305 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 12 smd rect (at 15.4305 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 13 smd rect (at 14.7955 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 14 smd rect (at 14.7955 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 15 smd rect (at 14.1605 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 16 smd rect (at 14.1605 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 17 smd rect (at 13.5255 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 18 smd rect (at 13.5255 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 19 smd rect (at 12.8905 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 20 smd rect (at 12.8905 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 21 smd rect (at 12.2555 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 22 smd rect (at 12.2555 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 23 smd rect (at 11.6205 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 24 smd rect (at 11.6205 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 25 smd rect (at 10.9855 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 26 smd rect (at 10.9855 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 27 smd rect (at 10.3505 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 28 smd rect (at 10.3505 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 29 smd rect (at 9.7155 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 30 smd rect (at 9.7155 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 31 smd rect (at 9.0805 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 32 smd rect (at 9.0805 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 33 smd rect (at 8.4455 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 34 smd rect (at 8.4455 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 35 smd rect (at 7.8105 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 36 smd rect (at 7.8105 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 37 smd rect (at 7.1755 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 38 smd rect (at 7.1755 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 39 smd rect (at 6.5405 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 40 smd rect (at 6.5405 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 41 smd rect (at 5.9055 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 42 smd rect (at 5.9055 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 43 smd rect (at 5.2705 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 44 smd rect (at 5.2705 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 45 smd rect (at 4.6355 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 46 smd rect (at 4.6355 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 47 smd rect (at 4.0005 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 48 smd rect (at 4.0005 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 49 smd rect (at 3.3655 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 50 smd rect (at 3.3655 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 51 smd rect (at 2.7305 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 52 smd rect (at 2.7305 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 53 smd rect (at -2.7305 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 54 smd rect (at -2.7305 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 55 smd rect (at -3.3655 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 56 smd rect (at -3.3655 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 57 smd rect (at -4.0005 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 58 smd rect (at -4.0005 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 59 smd rect (at -4.6355 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 60 smd rect (at -4.6355 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 61 smd rect (at -5.2705 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 62 smd rect (at -5.2705 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 63 smd rect (at -5.9055 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 64 smd rect (at -5.9055 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 65 smd rect (at -6.5405 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 66 smd rect (at -6.5405 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 67 smd rect (at -7.1755 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 68 smd rect (at -7.1755 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 69 smd rect (at -7.8105 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 70 smd rect (at -7.8105 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 71 smd rect (at -8.4455 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 72 smd rect (at -8.4455 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 73 smd rect (at -9.0805 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 74 smd rect (at -9.0805 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 75 smd rect (at -9.7155 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 76 smd rect (at -9.7155 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 77 smd rect (at -10.3505 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 78 smd rect (at -10.3505 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 79 smd rect (at -10.9855 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 80 smd rect (at -10.9855 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 81 smd rect (at -11.6205 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 82 smd rect (at -11.6205 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 83 smd rect (at -12.2555 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 84 smd rect (at -12.2555 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 85 smd rect (at -12.8905 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 86 smd rect (at -12.8905 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 87 smd rect (at -13.5255 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 88 smd rect (at -13.5255 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 89 smd rect (at -14.1605 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 90 smd rect (at -14.1605 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 91 smd rect (at -14.7955 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 92 smd rect (at -14.7955 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 93 smd rect (at -15.4305 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 94 smd rect (at -15.4305 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 95 smd rect (at -16.0655 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 96 smd rect (at -16.0655 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 97 smd rect (at -16.7005 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 98 smd rect (at -16.7005 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 99 smd rect (at -17.3355 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 100 smd rect (at -17.3355 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 101 smd rect (at -17.9705 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 102 smd rect (at -17.9705 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 103 smd rect (at -18.6055 3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 104 smd rect (at -18.6055 -3.302) (size 0.381 2.159) (layers F.Cu F.Paste F.Mask)) + (pad 106 smd rect (at -10.668 0) (size 18.034 0.508) (layers F.Cu F.Paste F.Mask)) + (pad 105 smd rect (at 10.668 0) (size 18.034 0.508) (layers F.Cu F.Paste F.Mask)) + (pad "" thru_hole circle (at -20.955 2.032) (size 1.524 1.524) (drill 1.27) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 20.955 2.032) (size 1.524 1.524) (drill 1.27) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/RJ12_E.kicad_mod b/PCB/.pretty/RJ12_E.kicad_mod new file mode 100644 index 00000000..1fc55807 --- /dev/null +++ b/PCB/.pretty/RJ12_E.kicad_mod @@ -0,0 +1,21 @@ +(module RJ12_E (layer F.Cu) (tedit 0) + (fp_text reference REF** (at 0 0) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value RJ12_E (at 0 -2.54) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -6.858 -10.922) (end -6.858 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.604 -10.922) (end 6.604 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.858 2.286) (end 6.604 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.842 -10.922) (end 6.604 -10.922) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.858 -10.922) (end 5.842 -10.922) (layer F.SilkS) (width 0.15)) + (pad 4 thru_hole circle (at 0.508 -8.89) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -2.032 -8.89) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 3.048 -8.89) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole circle (at -3.302 -6.35) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -0.762 -6.35) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 1.778 -6.35) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 6.604 -4.318) (size 2.99974 2.99974) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -6.858 -4.318) (size 2.99974 2.99974) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/RJ45_8.kicad_mod b/PCB/.pretty/RJ45_8.kicad_mod new file mode 100644 index 00000000..542aeaf0 --- /dev/null +++ b/PCB/.pretty/RJ45_8.kicad_mod @@ -0,0 +1,28 @@ +(module RJ45_8 (layer F.Cu) (tedit 0) + (tags RJ45) + (fp_text reference REF** (at 0.254 4.826) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value RJ45_8 (at 0.14224 -0.1016) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -7.62 7.874) (end 7.62 7.874) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 7.874) (end 7.62 -10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 -10.16) (end -7.62 -10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 -10.16) (end -7.62 7.874) (layer F.SilkS) (width 0.15)) + (pad Hole np_thru_hole circle (at 5.93852 0) (size 3.64998 3.64998) (drill 3.2512) (layers *.Cu *.SilkS *.Mask)) + (pad Hole np_thru_hole circle (at -5.9309 0) (size 3.64998 3.64998) (drill 3.2512) (layers *.Cu *.SilkS *.Mask)) + (pad 1 thru_hole rect (at -4.445 -6.35) (size 1.50114 1.50114) (drill 0.89916) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -3.175 -8.89) (size 1.50114 1.50114) (drill 0.89916) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -1.905 -6.35) (size 1.50114 1.50114) (drill 0.89916) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -0.635 -8.89) (size 1.50114 1.50114) (drill 0.89916) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 0.635 -6.35) (size 1.50114 1.50114) (drill 0.89916) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 1.905 -8.89) (size 1.50114 1.50114) (drill 0.89916) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 3.175 -6.35) (size 1.50114 1.50114) (drill 0.89916) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 4.445 -8.89) (size 1.50114 1.50114) (drill 0.89916) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/RJ45_8.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.4 0.4 0.4)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/RJ45_TRANSFO.kicad_mod b/PCB/.pretty/RJ45_TRANSFO.kicad_mod new file mode 100644 index 00000000..d8f913cc --- /dev/null +++ b/PCB/.pretty/RJ45_TRANSFO.kicad_mod @@ -0,0 +1,33 @@ +(module RJ45_TRANSFO (layer F.Cu) (tedit 0) + (tags RJ45) + (fp_text reference REF** (at -3.81 15.24) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value RJ45_TRANSFO (at -3.81 11.43) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 3.937 20.066) (end 3.937 8.128) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.937 4.953) (end 3.937 -4.953) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.065 20.066) (end -12.065 8.128) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.065 4.953) (end -12.065 -4.953) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.937 -4.953) (end 2.921 -4.953) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.461 -4.953) (end -2.159 -4.953) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.065 -4.953) (end -10.795 -4.953) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.065 20.11172) (end 3.937 20.11172) (layer F.SilkS) (width 0.15)) + (pad Hole thru_hole circle (at 1.905 8.89) (size 3.85064 3.85064) (drill 3.302) (layers *.Cu *.SilkS *.Mask)) + (pad Hole thru_hole circle (at -9.525 8.89) (size 3.85064 3.85064) (drill 3.302) (layers *.Cu *.SilkS *.Mask)) + (pad 8 thru_hole circle (at -8.255 2.54) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -7.62 0) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -5.715 2.54) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -5.08 0) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -3.175 2.54) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -2.54 0) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -0.635 2.54) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at 3.937 5.842) (size 2.54 2.54) (drill 1.778) (layers *.Cu *.SilkS *.Mask)) + (pad 13 thru_hole circle (at -11.557 5.842) (size 2.54 2.54) (drill 1.778) (layers *.Cu *.SilkS *.Mask)) + (pad YK thru_hole circle (at -6.731 -4.826) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad GA thru_hole circle (at -0.889 -4.826) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad YA thru_hole circle (at -9.271 -4.826) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad GK thru_hole circle (at 1.651 -4.826) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at 0 0) (size 1.524 1.524) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/RJ45_TRANSFO_ver2.kicad_mod b/PCB/.pretty/RJ45_TRANSFO_ver2.kicad_mod new file mode 100644 index 00000000..d47ea036 --- /dev/null +++ b/PCB/.pretty/RJ45_TRANSFO_ver2.kicad_mod @@ -0,0 +1,32 @@ +(module RJ45_TRANSFO_ver2 (layer F.Cu) (tedit 0) + (tags RJ45) + (fp_text reference REF** (at 0 8.128) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value RJ45_TRANSFO_ver2 (at 0.14224 -0.1016) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 8.001 12.954) (end 8.001 1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.001 -2.159) (end 8.001 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.001 12.954) (end -8.001 1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.001 -2.159) (end -8.001 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.001 -12.065) (end 6.985 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 -12.065) (end 1.524 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.001 -12.065) (end -6.731 -12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.001 12.99972) (end 8.001 12.99972) (layer F.SilkS) (width 0.15)) + (pad Hole thru_hole circle (at 5.42798 2.49936) (size 3.85064 3.85064) (drill 3.05054) (layers *.Cu *.SilkS *.Mask)) + (pad Hole thru_hole circle (at -5.42544 2.48666) (size 3.85064 3.85064) (drill 3.05054) (layers *.Cu *.SilkS *.Mask)) + (pad 1 thru_hole rect (at -3.58648 -4.572) (size 1.50114 1.50114) (drill 0.89916) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -4.85648 -7.112) (size 1.50114 1.50114) (drill 0.89916) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -1.04648 -4.572) (size 1.50114 1.50114) (drill 0.89916) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -2.31648 -7.112) (size 1.50114 1.50114) (drill 0.89916) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 1.49352 -4.572) (size 1.50114 1.50114) (drill 0.89916) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 0.22352 -7.112) (size 1.50114 1.50114) (drill 0.89916) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 4.03352 -4.572) (size 1.50114 1.50114) (drill 0.89916) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at 7.99846 -0.49276) (size 2.032 2.032) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)) + (pad 9 thru_hole circle (at -8.001 -0.49276) (size 2.032 2.032) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)) + (pad Hole thru_hole circle (at -3.048 -12.192) (size 1.5113 1.5113) (drill 0.89916) (layers *.Cu *.SilkS *.Mask)) + (pad Hole thru_hole circle (at 3.048 -12.192) (size 1.5113 1.5113) (drill 0.89916) (layers *.Cu *.SilkS *.Mask)) + (pad Hole thru_hole circle (at -5.588 -12.192) (size 1.5113 1.5113) (drill 0.89916) (layers *.Cu *.SilkS *.Mask)) + (pad Hole thru_hole circle (at 5.588 -12.192) (size 1.5113 1.5113) (drill 0.89916) (layers *.Cu *.SilkS *.Mask)) +) diff --git a/PCB/.pretty/RJHSE538X.kicad_mod b/PCB/.pretty/RJHSE538X.kicad_mod new file mode 100644 index 00000000..1ea6828f --- /dev/null +++ b/PCB/.pretty/RJHSE538X.kicad_mod @@ -0,0 +1,41 @@ +(module RJHSE538X (layer F.Cu) (tedit 55225793) + (descr "mod. jack, ethernet, 8P8C, RJ45 connector, 2 leds, shielded") + (tags "RJHSE538X 8P8C RJ45 ethernet jack") + (fp_text reference REF** (at 3.4925 -6.9215) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value RJHSE538X (at 3.937 9.2075) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.8 -8.45) (end -5.8 7.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.8 7.9) (end 12.9 7.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start 12.9 7.9) (end 12.9 -8.45) (layer F.CrtYd) (width 0.05)) + (fp_line (start 12.9 -8.45) (end -5.8 -8.45) (layer F.CrtYd) (width 0.05)) + (fp_line (start 11.8745 7.62) (end 11.8745 2.0955) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.7625 7.62) (end -4.7625 2.0955) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.8745 -8.1915) (end -4.7625 -8.1915) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.8745 -8.1915) (end 11.8745 -0.3175) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.7625 -8.1915) (end -4.7625 -0.3175) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.8745 7.62) (end -4.7625 7.62) (layer F.SilkS) (width 0.15)) + (pad "" thru_hole circle (at 11.684 0.889) (size 2 2) (drill 1.57) (layers *.Cu *.Mask)) + (pad 9 thru_hole circle (at -3.302 6.604) (size 1.50114 1.50114) (drill 0.889) (layers *.Cu *.Mask)) + (pad 10 thru_hole circle (at -1.016 6.604) (size 1.50114 1.50114) (drill 0.889) (layers *.Cu *.Mask)) + (pad 11 thru_hole circle (at 8.128 6.604) (size 1.50114 1.50114) (drill 0.889) (layers *.Cu *.Mask)) + (pad 12 thru_hole circle (at 10.414 6.604) (size 1.50114 1.50114) (drill 0.889) (layers *.Cu *.Mask)) + (pad 8 thru_hole circle (at 7.112 1.778) (size 1.50114 1.50114) (drill 0.889) (layers *.Cu *.Mask)) + (pad 6 thru_hole circle (at 5.08 1.778) (size 1.50114 1.50114) (drill 0.889) (layers *.Cu *.Mask)) + (pad 4 thru_hole circle (at 3.048 1.778) (size 1.50114 1.50114) (drill 0.889) (layers *.Cu *.Mask)) + (pad 2 thru_hole circle (at 1.016 1.778) (size 1.50114 1.50114) (drill 0.889) (layers *.Cu *.Mask)) + (pad 5 thru_hole circle (at 4.064 0) (size 1.50114 1.50114) (drill 0.889) (layers *.Cu *.Mask)) + (pad 3 thru_hole circle (at 2.032 0) (size 1.50114 1.50114) (drill 0.889) (layers *.Cu *.Mask)) + (pad 7 thru_hole circle (at 6.096 0) (size 1.50114 1.50114) (drill 0.889) (layers *.Cu *.Mask)) + (pad 1 thru_hole circle (at 0 0) (size 1.50114 1.50114) (drill 0.889) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at -2.794 -2.54) (size 3.3 3.3) (drill 3.3) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 9.906 -2.54) (size 3.3 3.3) (drill 3.3) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -4.572 0.889) (size 2 2) (drill 1.57) (layers *.Cu *.Mask)) + (model Connect.3dshapes/RJHSE538X.wrl + (at (xyz 0.138 0.06 0.125)) + (scale (xyz 0.4 0.4 0.4)) + (rotate (xyz -90 0 180)) + ) +) diff --git a/PCB/.pretty/SAS_mini_1888174.kicad_mod b/PCB/.pretty/SAS_mini_1888174.kicad_mod new file mode 100644 index 00000000..468e02e0 --- /dev/null +++ b/PCB/.pretty/SAS_mini_1888174.kicad_mod @@ -0,0 +1,66 @@ +(module SAS_mini_1888174 (layer F.Cu) (tedit 0) + (descr "36pin mini SAS connector") + (tags "SAS mini connector") + (fp_text reference REF** (at 4 -7.4) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SAS_mini_1888174 (at 0 0) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 9.5 -6.5) (end -9.5 -6.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.5 -6.5) (end -9.5 6.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.5 6.5) (end 9.5 6.5) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.5 6.5) (end 9.5 -6.5) (layer F.SilkS) (width 0.15)) + (pad B1 smd oval (at -7 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad B2 smd oval (at -6.2 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad B3 smd oval (at -5.4 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad B4 smd oval (at -4.6 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad B5 smd oval (at -3.8 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad B6 smd oval (at -3 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad B7 smd oval (at -2.2 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad B8 smd oval (at -1.4 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad B9 smd oval (at -0.6 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad B10 smd oval (at 0.2 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad B11 smd oval (at 1 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad B12 smd oval (at 1.8 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad B13 smd oval (at 2.6 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad B14 smd oval (at 3.4 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad B15 smd oval (at 4.2 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad B16 smd oval (at 5 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad B17 smd oval (at 5.8 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A1 smd oval (at -6.5 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A2 smd oval (at -5.7 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A3 smd oval (at -4.9 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A4 smd oval (at -4.1 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A5 smd oval (at -3.3 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A6 smd oval (at -2.5 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A7 smd oval (at -1.7 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A8 smd oval (at -0.9 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A9 smd oval (at -0.1 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A10 smd oval (at 0.7 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A11 smd oval (at 1.5 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A12 smd oval (at 2.3 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A13 smd oval (at 3.1 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A14 smd oval (at 3.9 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A15 smd oval (at 4.7 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A16 smd oval (at 5.5 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A17 smd oval (at 6.3 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad 1 thru_hole circle (at -8.9 -5.24) (size 1.55 1.55) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (zone_connect 2)) + (pad 2 thru_hole circle (at -8.9 -2) (size 1.55 1.55) (drill 0.8) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -8.9 4.03) (size 1.55 1.55) (drill 0.8) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -8.9 2) (size 1.55 1.55) (drill 0.8) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 8.9 -6.24) (size 1.55 1.55) (drill 0.8) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 8.9 -2) (size 1.55 1.55) (drill 0.8) (layers *.Cu *.Mask F.SilkS)) + (pad "" np_thru_hole circle (at -8 0) (size 1.55 1.55) (drill 1.55) (layers *.Mask B.Cu F.SilkS)) + (pad "" np_thru_hole circle (at 8 0) (size 1.55 1.55) (drill 1.55) (layers *.Mask B.Cu F.SilkS)) + (pad 8 thru_hole circle (at 8.9 4.03) (size 1.55 1.55) (drill 0.8) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 8.9 2) (size 1.55 1.55) (drill 0.8) (layers *.Cu *.Mask F.SilkS)) + (pad B18 smd oval (at 6.6 -2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (pad A18 smd oval (at 7.1 2.91) (size 0.35 1.8) (layers F.Cu F.Paste F.Mask)) + (model Connect.3dshapes/SAS_mini_1888174.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/SATA-22_SMD.kicad_mod b/PCB/.pretty/SATA-22_SMD.kicad_mod new file mode 100644 index 00000000..7ce64b67 --- /dev/null +++ b/PCB/.pretty/SATA-22_SMD.kicad_mod @@ -0,0 +1,64 @@ +(module SATA-22_SMD (layer F.Cu) (tedit 0) + (fp_text reference REF** (at 0 3.175) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SATA-22_SMD (at 0 5.715) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -17.145 -0.6096) (end -17.145 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.415 10.5664) (end 18.415 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.415 5.08) (end 20.32 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.32 5.08) (end 20.32 -0.6096) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.32 -0.6096) (end 17.145 -0.6096) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.145 -0.6096) (end 17.145 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start -18.415 10.5664) (end 18.415 10.5664) (layer F.SilkS) (width 0.15)) + (fp_line (start -17.145 -0.6096) (end -20.32 -0.6096) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 -0.6096) (end -20.32 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 5.08) (end -18.415 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -18.415 5.08) (end -18.415 10.5664) (layer F.SilkS) (width 0.15)) + (fp_line (start -17.145 0.635) (end 1.27 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 0.635) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 2.54 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 1.27) (end 2.54 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 0.635) (end 11.43 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.43 0.635) (end 11.43 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.43 1.27) (end 12.7 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.7 1.27) (end 12.7 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.7 0.635) (end 17.145 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.415 10.541) (end 19.05 11.811) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.05 11.811) (end 19.685 11.811) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.685 11.811) (end 20.32 10.541) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.32 10.541) (end 20.32 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.32 9.271) (end 18.415 6.731) (layer F.SilkS) (width 0.15)) + (fp_line (start -18.415 10.541) (end -19.05 11.811) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.05 11.811) (end -19.685 11.811) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.685 11.811) (end -20.32 10.541) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 10.541) (end -20.32 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 9.271) (end -18.415 6.731) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -15.875 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at -14.605 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 3 smd rect (at -13.335 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 4 smd rect (at -12.065 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 5 smd rect (at -10.795 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 6 smd rect (at -9.525 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 7 smd rect (at -8.255 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 8 smd rect (at -1.905 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 9 smd rect (at -0.635 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 10 smd rect (at 0.635 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 11 smd rect (at 1.905 0.508) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 12 smd rect (at 3.175 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 13 smd rect (at 4.445 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 14 smd rect (at 5.715 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 15 smd rect (at 6.985 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad "" thru_hole circle (at 16.5862 2.9972) (size 1.50114 1.50114) (drill 1.50114) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -16.5862 2.9972) (size 1.50114 1.50114) (drill 1.50114) (layers *.Cu *.Mask F.SilkS)) + (pad 16 smd rect (at 8.255 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 17 smd rect (at 9.525 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 18 smd rect (at 10.795 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 19 smd rect (at 12.065 0.508) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 20 smd rect (at 13.335 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 21 smd rect (at 14.605 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad 22 smd rect (at 15.875 0) (size 0.8636 2.286) (layers F.Cu F.Paste F.Mask)) + (pad "" thru_hole circle (at 18.7198 2.2352) (size 2.79908 2.79908) (drill 2.30124) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -18.7198 2.2352) (size 2.79908 2.79908) (drill 2.30124) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/SATA-7_SMD.kicad_mod b/PCB/.pretty/SATA-7_SMD.kicad_mod new file mode 100644 index 00000000..4af0efa2 --- /dev/null +++ b/PCB/.pretty/SATA-7_SMD.kicad_mod @@ -0,0 +1,127 @@ +(module SATA-7_SMD (layer F.Cu) (tedit 0) + (descr "SERIAL ATA 7P R/A SMT") + (tags "SERIAL ATA SATA") + (attr smd) + (fp_text reference REF** (at -3.81 -13.335) (layer B.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SATA-7_SMD (at 3.175 -13.335) (layer B.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -6.04774 -9.99998) (end -6.04774 -8.49884) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.74878 -8.49884) (end -6.74878 -9.99998) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.74878 -9.99998) (end 6.74878 -8.49884) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.04774 -8.49884) (end 6.04774 -9.99998) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.22706 0.35052) (end -8.22706 -5.01142) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.22706 -5.01142) (end -8.22706 -11.16838) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.22706 -11.16838) (end -7.43458 -11.16838) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.43458 -11.16838) (end -5.06222 -11.16838) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.06222 -11.16838) (end -5.06222 -6.9469) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.43458 -11.16838) (end -7.43458 -6.9469) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.43458 -6.9469) (end 5.13588 -6.9469) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.13588 -6.9469) (end 7.42442 -6.9469) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.42442 -6.9469) (end 7.42442 -11.16838) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.13588 -6.9469) (end 5.13588 -11.16838) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.13588 -11.16838) (end 6.54304 -11.16838) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.54304 -11.16838) (end 8.128 -11.16838) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.128 -11.16838) (end 8.128 -6.9469) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.128 -6.9469) (end 9.1821 -6.9469) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.1821 -6.9469) (end 9.1821 0.35052) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.1821 0.35052) (end 7.59968 0.35052) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.59968 0.35052) (end 7.16026 -0.08636) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.16026 -0.08636) (end 7.16026 -5.01142) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.16026 -5.01142) (end 5.7531 -5.01142) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.7531 -5.01142) (end 5.7531 -0.17526) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.7531 -0.17526) (end 5.7531 -0.17526) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.7531 -0.17526) (end 5.22478 0.35052) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.22478 0.35052) (end -4.07416 0.34798) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.731 0.35052) (end -8.22706 0.35052) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.20522 -0.17526) (end -6.731 0.35052) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.20522 -0.17526) (end -6.20522 -4.572) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.20522 -4.572) (end -5.7658 -5.01142) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.22706 -5.01142) (end 5.7531 -5.01142) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.6642 -0.17526) (end 4.6101 -0.17526) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.6101 -0.17526) (end -4.6228 -0.17526) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.09702 0.33782) (end -4.6228 -0.17526) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.6228 -0.17526) (end -4.6228 -4.92252) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.381 -4.953) (end -0.381 -0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.381 -0.508) (end 0.381 -0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.381 -0.508) (end 0.381 -4.953) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.651 -4.953) (end -1.651 -0.889) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.651 -0.889) (end -0.889 -0.889) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.889 -0.889) (end -0.889 -4.953) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.889 -4.953) (end 0.889 -0.889) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.889 -0.889) (end 1.651 -0.889) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.651 -0.889) (end 1.651 -4.953) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.159 -4.953) (end 2.159 -0.889) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.159 -0.889) (end 2.921 -0.889) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.921 -0.889) (end 2.921 -4.953) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.429 -4.953) (end 3.429 -0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.429 -0.508) (end 4.191 -0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.191 -0.508) (end 4.191 -4.953) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.6101 -0.17526) (end 4.6101 -4.92252) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.429 -4.953) (end -3.429 -0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.429 -0.508) (end -4.191 -0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.191 -0.508) (end -4.191 -4.953) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.921 -4.953) (end -2.921 -0.889) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.921 -0.889) (end -2.159 -0.889) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.159 -0.889) (end -2.159 -4.953) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.191 -6.985) (end -4.064 -7.23646) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.064 -7.23646) (end -4.064 -11.176) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.064 -11.176) (end -3.556 -11.176) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.556 -11.176) (end -3.556 -7.23646) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.556 -7.23646) (end -3.429 -6.985) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.921 -6.985) (end -2.794 -7.23646) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.794 -7.23646) (end -2.794 -11.176) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.794 -11.176) (end -2.286 -11.176) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.286 -11.176) (end -2.286 -7.23646) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.286 -7.23646) (end -2.159 -6.985) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.651 -6.985) (end -1.524 -7.23646) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.524 -7.23646) (end -1.524 -11.176) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.524 -11.176) (end -1.016 -11.176) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.016 -11.176) (end -1.016 -7.23646) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.016 -7.23646) (end -0.889 -6.985) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.381 -6.985) (end -0.254 -7.23646) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.254 -7.23646) (end -0.254 -11.176) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.254 -11.176) (end 0.254 -11.176) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.254 -11.176) (end 0.254 -7.23646) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.254 -7.23646) (end 0.381 -6.985) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.889 -6.985) (end 1.016 -7.23646) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.016 -7.23646) (end 1.016 -11.176) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.016 -11.176) (end 1.524 -11.176) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 -11.176) (end 1.524 -7.23646) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 -7.23646) (end 1.651 -6.985) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.159 -6.985) (end 2.286 -7.23646) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.286 -7.23646) (end 2.286 -11.176) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.286 -11.176) (end 2.794 -11.176) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -11.176) (end 2.794 -7.23646) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -7.23646) (end 2.921 -6.985) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.429 -6.985) (end 3.556 -7.23646) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.556 -7.23646) (end 3.556 -11.176) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.556 -11.176) (end 4.064 -11.176) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.064 -11.176) (end 4.064 -7.23646) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.064 -7.23646) (end 4.191 -6.985) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.55574 -11.07948) (end -6.55574 -7.73684) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.55574 -7.73684) (end -6.20522 -7.73684) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.20522 -7.73684) (end -6.20522 -11.07948) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.19252 -11.07948) (end 6.19252 -7.73684) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.19252 -7.73684) (end 6.54304 -7.73684) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.54304 -7.73684) (end 6.54304 -11.16838) (layer F.SilkS) (width 0.15)) + (fp_arc (start -6.39826 -9.99998) (end -6.74878 -9.99998) (angle 90) (layer F.SilkS) (width 0.15)) + (fp_arc (start -6.39826 -9.99998) (end -6.39826 -10.34796) (angle 90) (layer F.SilkS) (width 0.15)) + (fp_arc (start -6.39826 -8.49884) (end -6.04774 -8.49884) (angle 90) (layer F.SilkS) (width 0.15)) + (fp_arc (start -6.39826 -8.49884) (end -6.39826 -8.14832) (angle 90) (layer F.SilkS) (width 0.15)) + (fp_arc (start 6.39826 -9.99998) (end 6.04774 -9.99998) (angle 90) (layer F.SilkS) (width 0.15)) + (fp_arc (start 6.39826 -9.99998) (end 6.39826 -10.34796) (angle 90) (layer F.SilkS) (width 0.15)) + (fp_arc (start 6.39826 -8.49884) (end 6.74878 -8.49884) (angle 90) (layer F.SilkS) (width 0.15)) + (fp_arc (start 6.39826 -8.49884) (end 6.39826 -8.14832) (angle 90) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.81 -11.19886) (size 0.99822 2.09804) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at -2.54 -11.19886) (size 0.99822 2.09804) (layers F.Cu F.Paste F.Mask)) + (pad 3 smd rect (at -1.27 -11.19886) (size 0.99822 2.09804) (layers F.Cu F.Paste F.Mask)) + (pad 4 smd rect (at 0 -11.19886) (size 0.99822 2.09804) (layers F.Cu F.Paste F.Mask)) + (pad 5 smd rect (at 1.27 -11.19886) (size 0.99822 2.09804) (layers F.Cu F.Paste F.Mask)) + (pad 6 smd rect (at 2.54 -11.19886) (size 0.99822 2.09804) (layers F.Cu F.Paste F.Mask)) + (pad 7 smd rect (at 3.81 -11.19886) (size 0.99822 2.09804) (layers F.Cu F.Paste F.Mask)) + (pad M1 thru_hole oval (at -6.39826 -9.24814) (size 1.27 2.54) (drill 0.6985) (layers F&B.Cu F.Paste F.SilkS F.Mask)) + (pad M2 thru_hole oval (at 6.39826 -9.24814) (size 1.27 2.54) (drill 0.6985) (layers F&B.Cu F.Paste F.SilkS F.Mask)) +) diff --git a/PCB/.pretty/SATA-7_THT_VERT_1.kicad_mod b/PCB/.pretty/SATA-7_THT_VERT_1.kicad_mod new file mode 100644 index 00000000..ccfc7164 --- /dev/null +++ b/PCB/.pretty/SATA-7_THT_VERT_1.kicad_mod @@ -0,0 +1,21 @@ +(module SATA-7_THT_VERT_1 (layer F.Cu) (tedit 0) + (fp_text reference REF** (at 0 -4.191) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SATA-7_THT_VERT_1 (at 0 -2.286) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -8.45 -3.225) (end 8.45 -3.225) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.45 -3.225) (end 8.45 3.225) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.45 3.225) (end -8.45 3.225) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.45 3.225) (end -8.45 -3.225) (layer F.SilkS) (width 0.15)) + (pad 9 thru_hole circle (at 6.48 0) (size 2.5 2.5) (drill 1.35) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole oval (at 2.54 -0.5) (size 1.1 1.3) (drill 0.74) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -6.48 0) (size 2.5 2.5) (drill 1.35) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole oval (at 1.27 -0.5) (size 1.1 1.3) (drill 0.74) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole oval (at -1.27 -0.5) (size 1.1 1.3) (drill 0.74) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole oval (at -2.54 -0.5) (size 1.1 1.3) (drill 0.74) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole oval (at -3.81 0.5) (size 1.1 1.3) (drill 0.74) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole oval (at 0 0.5) (size 1.1 1.3) (drill 0.74) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole oval (at 3.81 0.5) (size 1.1 1.3) (drill 0.74) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/SATA-7_THT_VERT_2.kicad_mod b/PCB/.pretty/SATA-7_THT_VERT_2.kicad_mod new file mode 100644 index 00000000..3926c10d --- /dev/null +++ b/PCB/.pretty/SATA-7_THT_VERT_2.kicad_mod @@ -0,0 +1,21 @@ +(module SATA-7_THT_VERT_2 (layer F.Cu) (tedit 0) + (fp_text reference REF** (at 0.6 -3.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SATA-7_THT_VERT_2 (at 0.5 -1.7) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -8.3 -2.5) (end 8.3 -2.5) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.3 -2.5) (end 8.3 2.5) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.3 2.5) (end -8.3 2.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.3 2.5) (end -8.3 -2.5) (layer F.SilkS) (width 0.15)) + (pad 9 thru_hole circle (at 6.27 0) (size 2.5 2.5) (drill 1.35) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole oval (at 2.54 0) (size 1.1 1.3) (drill 0.74) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -6.56 -1) (size 2.5 2.5) (drill 1.35) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole oval (at 1.27 0) (size 1.1 1.3) (drill 0.74) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole oval (at -1.27 0) (size 1.1 1.3) (drill 0.74) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole oval (at -2.54 0) (size 1.1 1.3) (drill 0.74) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole oval (at -3.81 1.5) (size 1.1 1.3) (drill 0.74) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole oval (at 0 1.5) (size 1.1 1.3) (drill 0.74) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole oval (at 3.81 1.5) (size 1.1 1.3) (drill 0.74) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/SDS-50J.kicad_mod b/PCB/.pretty/SDS-50J.kicad_mod new file mode 100644 index 00000000..0c9283b3 --- /dev/null +++ b/PCB/.pretty/SDS-50J.kicad_mod @@ -0,0 +1,32 @@ +(module SDS-50J (layer F.Cu) (tedit 5602A6D3) + (descr "SDS-50J, standard DIN connector, 5 pins, midi") + (tags "SDS-50J DIN 5-pins connector midi") + (fp_text reference REF** (at 0 4.75) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SDS-50J (at 7.493 -4.2672 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 17.75 3.9) (end 17.75 -12.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 17.75 -12.8) (end -2.75 -12.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.75 -12.8) (end -2.75 3.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start 17.75 3.9) (end -2.75 3.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.46 3.389) (end -2.5 3.389) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.444 3.389) (end 3.57 3.389) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.5 3.389) (end -2.5 -12.538) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.5 -12.538) (end -2.5 -12.538) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.5 3.389) (end 17.5 -12.538) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.5 3.389) (end 13.5395 3.389) (layer F.SilkS) (width 0.15)) + (pad 5 thru_hole circle (at 12.5 2.5) (size 2.3 2.3) (drill 1.3) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at 5 -10) (size 2 2) (drill 1.3) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 15 0) (size 2.3 2.3) (drill 1.3) (layers *.Cu *.Mask)) + (pad 2 thru_hole circle (at 7.5 0) (size 2.3 2.3) (drill 1.3) (layers *.Cu *.Mask)) + (pad 1 thru_hole circle (at 0 0) (size 2.3 2.3) (drill 1.3) (layers *.Cu *.Mask)) + (pad 4 thru_hole circle (at 2.5 2.5) (size 2.3 2.3) (drill 1.3) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at 10 -10) (size 2 2) (drill 1.3) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/SDS-50J.wrl + (at (xyz 0.295 0.495 0)) + (scale (xyz 0.39 0.39 0.39)) + (rotate (xyz -90 0 180)) + ) +) diff --git a/PCB/.pretty/SD_Card_Receptacle.kicad_mod b/PCB/.pretty/SD_Card_Receptacle.kicad_mod new file mode 100644 index 00000000..563fcd80 --- /dev/null +++ b/PCB/.pretty/SD_Card_Receptacle.kicad_mod @@ -0,0 +1,39 @@ +(module SD_Card_Receptacle (layer F.Cu) (tedit 54A89A84) + (fp_text reference REF** (at 9.96386 19.9312) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SD_Card_Receptacle (at -1.2 9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -14.7 41.05) (end 15.5 41.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start 15.5 41.05) (end 15.5 -1.25) (layer F.CrtYd) (width 0.05)) + (fp_line (start 15.5 -1.25) (end -14.7 -1.25) (layer F.CrtYd) (width 0.05)) + (fp_line (start -14.7 -1.25) (end -14.7 41.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start 7.9 0) (end 8.4 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.4 0) (end 5.9 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.1 0) (end -1.6 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.6 0) (end -4.1 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -7 0) (end -6.6 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.1 0) (end -10.7 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -14 20.6) (end -14 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.9 19.4) (end 14.9 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.9 0) (end 10.4 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.9 29.8) (end -14 29.8) (layer F.SilkS) (width 0.15)) + (fp_line (start -14 29.8) (end -14 23.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.9 29.8) (end 14.9 22.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at 6.875 0) (size 1 1.5) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at 4.375 0) (size 1 1.5) (layers F.Cu F.Paste F.Mask)) + (pad 3 smd rect (at 1.075 0) (size 1 1.5) (layers F.Cu F.Paste F.Mask)) + (pad 4 smd rect (at -0.625 0) (size 1 1.5) (layers F.Cu F.Paste F.Mask)) + (pad 5 smd rect (at -3.125 0) (size 1 1.5) (layers F.Cu F.Paste F.Mask)) + (pad 6 smd rect (at -5.625 0) (size 1 1.5) (layers F.Cu F.Paste F.Mask)) + (pad 7 smd rect (at -8.05 0) (size 1 1.5) (layers F.Cu F.Paste F.Mask)) + (pad 8 smd rect (at -9.75 0) (size 1 1.5) (layers F.Cu F.Paste F.Mask)) + (pad 9 smd rect (at 9.375 0) (size 1 1.5) (layers F.Cu F.Paste F.Mask)) + (pad 10 smd rect (at 2.725 0) (size 1 1.5) (layers F.Cu F.Paste F.Mask)) + (pad 11 smd rect (at -13.1 0) (size 1 1.5) (layers F.Cu F.Paste F.Mask)) + (pad 12 smd rect (at 14.4 21) (size 1.2 2.2) (layers F.Cu F.Paste F.Mask)) + (pad 13 smd rect (at -13.6 22.2) (size 1.2 2.2) (layers F.Cu F.Paste F.Mask)) + (pad "" np_thru_hole circle (at 12.1 24.3) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask F.SilkS)) + (pad "" np_thru_hole circle (at -12.1 24.3) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/SMB_Straight.kicad_mod b/PCB/.pretty/SMB_Straight.kicad_mod new file mode 100644 index 00000000..4ce4041d --- /dev/null +++ b/PCB/.pretty/SMB_Straight.kicad_mod @@ -0,0 +1,32 @@ +(module SMB_Straight (layer F.Cu) (tedit 5541ED7C) + (descr "SMB pcb mounting jack") + (tags "SMB Jack Striaght") + (fp_text reference REF** (at -2 -5) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SMB_Straight (at 0.25 0) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.25 -4.25) (end 4.25 -4.25) (layer B.CrtYd) (width 0.05)) + (fp_line (start 4.25 -4.25) (end 4.25 4.25) (layer B.CrtYd) (width 0.05)) + (fp_line (start 4.25 4.25) (end -4.25 4.25) (layer B.CrtYd) (width 0.05)) + (fp_line (start -4.25 4.25) (end -4.25 -4.25) (layer B.CrtYd) (width 0.05)) + (fp_line (start 4.25 4.25) (end -4.25 4.25) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.25 4.25) (end -4.25 -4.25) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.25 -4.25) (end 4.25 4.25) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.25 -4.25) (end 4.25 -4.25) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1 -3.5052) (end 1 -3.5052) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.5052 -1) (end 3.5052 1) (layer F.SilkS) (width 0.15)) + (fp_line (start 1 3.5052) (end -1 3.5052) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.5052 1) (end -3.5052 -1) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at -2.54 2.54) (size 2.74 2.74) (drill 1.7) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.54 2.54) (size 2.74 2.74) (drill 1.7) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.54 -2.54) (size 2.74 2.74) (drill 1.7) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -2.54 -2.54) (size 2.74 2.74) (drill 1.7) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole circle (at 0 0) (size 2.24 2.24) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/SMB_Straight.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/SOC676BR.kicad_mod b/PCB/.pretty/SOC676BR.kicad_mod new file mode 100644 index 00000000..5d24e597 --- /dev/null +++ b/PCB/.pretty/SOC676BR.kicad_mod @@ -0,0 +1,29 @@ +(module SOC676BR (layer F.Cu) (tedit 0) + (descr "SOCAPEX 6 pins vertical shape - large") + (tags "SOCAPEX CONN") + (fp_text reference REF** (at 4.953 -2.54) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SOC676BR (at -6.858 -2.667) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 3.81 0) (end 3.81 -1.016) (layer F.SilkS) (width 0.15)) + (fp_circle (center -1.27 0) (end -1.27 -1.016) (layer F.SilkS) (width 0.15)) + (fp_circle (center -6.35 0) (end -6.35 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 2.159) (end -10.16 2.159) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.16 2.159) (end -10.16 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 2.159) (end 10.16 2.159) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.16 2.159) (end 10.16 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.065 -1.397) (end 12.065 -1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.065 -1.397) (end 12.065 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.065 1.397) (end -12.065 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.065 1.397) (end -12.065 -1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 2.159) (end -7.62 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 1.397) (end 7.62 2.159) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at -6.35 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -1.27 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 1.27 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 6.35 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/SOC676C.kicad_mod b/PCB/.pretty/SOC676C.kicad_mod new file mode 100644 index 00000000..11c5a38d --- /dev/null +++ b/PCB/.pretty/SOC676C.kicad_mod @@ -0,0 +1,45 @@ +(module SOC676C (layer F.Cu) (tedit 0) + (descr "SOCAPEX 6 pins horizontal shape") + (tags "SOCAPEX CONN") + (fp_text reference REF** (at 0 7.366 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SOC676C (at 0 4.318 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 6.35 0) (end 6.35 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 0) (end 3.81 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 0) (end 1.27 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 0) (end -1.27 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.81 0) (end -3.81 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.35 0) (end -6.35 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 12.065) (end 2.794 14.478) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 14.478) (end 4.826 14.478) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.826 14.478) (end 4.826 12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.366 14.478) (end -5.334 14.478) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.334 14.478) (end -5.334 12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.366 12.065) (end -7.366 14.478) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.254 12.065) (end -0.254 14.478) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.254 14.478) (end -2.286 14.478) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.286 14.478) (end -2.286 12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 6.985) (end -10.795 6.985) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.065 10.795) (end -12.065 8.255) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.795 12.065) (end -10.795 12.065) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.065 8.255) (end 12.065 10.795) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 6.985) (end 10.795 6.985) (layer F.SilkS) (width 0.15)) + (fp_arc (start -10.795 10.795) (end -10.795 12.065) (angle 90) (layer F.SilkS) (width 0.15)) + (fp_arc (start -10.795 8.255) (end -12.065 8.255) (angle 90) (layer F.SilkS) (width 0.15)) + (fp_arc (start 10.795 8.255) (end 10.795 6.985) (angle 90) (layer F.SilkS) (width 0.15)) + (fp_arc (start 10.795 10.795) (end 12.065 10.795) (angle 90) (layer F.SilkS) (width 0.15)) + (fp_circle (center -9.017 9.525) (end -9.017 8.255) (layer F.SilkS) (width 0.15)) + (fp_circle (center 9.017 9.525) (end 10.287 9.525) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 1.905) (end 7.62 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 1.905) (end 7.62 6.985) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 6.985) (end -7.62 1.905) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at -6.35 0 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -3.81 0 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -1.27 0 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 1.27 0 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 3.81 0 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 6.35 0 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/SOC676NY.kicad_mod b/PCB/.pretty/SOC676NY.kicad_mod new file mode 100644 index 00000000..6b39dd34 --- /dev/null +++ b/PCB/.pretty/SOC676NY.kicad_mod @@ -0,0 +1,27 @@ +(module SOC676NY (layer F.Cu) (tedit 0) + (descr "SOCAPEX 6 pins vertical shape - narrow") + (tags "SOCAPEX CONN") + (fp_text reference REF** (at 4.826 -2.413) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SOC676NY (at -5.461 -2.667) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -8.89 -0.127) (end -8.89 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.89 1.397) (end 8.89 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.89 1.397) (end 8.89 -1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.89 -1.397) (end -8.89 -1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.89 -1.397) (end -8.89 -0.127) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.89 1.397) (end -8.89 2.159) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.89 2.159) (end -7.62 2.159) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 2.159) (end -7.62 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 1.397) (end 7.62 2.159) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 2.159) (end 8.89 2.159) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.89 2.159) (end 8.89 1.397) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at -6.35 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -1.27 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 1.27 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 3.81 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 6.35 0) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/SUBCLICK.kicad_mod b/PCB/.pretty/SUBCLICK.kicad_mod new file mode 100644 index 00000000..5b092a9f --- /dev/null +++ b/PCB/.pretty/SUBCLICK.kicad_mod @@ -0,0 +1,34 @@ +(module SUBCLICK (layer F.Cu) (tedit 0) + (descr "Connecteur Subclick") + (tags "CONN DEV") + (fp_text reference REF** (at 0 6.35) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SUBCLICK (at -0.254 -6.35) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.54 -1.27) (end -1.27 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 -2.54) (end 17.78 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.78 -2.54) (end 17.78 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.78 2.54) (end -1.27 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 2.54) (end -2.54 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 1.27) (end -2.54 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.81 -5.08) (end 3.81 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -5.08) (end 5.08 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.08 -3.81) (end 5.08 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.08 3.81) (end 3.81 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 5.08) (end -3.81 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.81 5.08) (end -5.08 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.08 3.81) (end -5.08 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.08 -3.81) (end -3.81 -5.08) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole circle (at 0 0) (size 1.778 1.778) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -2.54 -2.54) (size 3.048 3.048) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.54 -2.54) (size 3.048 3.048) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.54 2.54) (size 3.048 3.048) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -2.54 2.54) (size 3.048 3.048) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/SUBCLICK.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/TE_Futurebus+_5536607-1.kicad_mod b/PCB/.pretty/TE_Futurebus+_5536607-1.kicad_mod new file mode 100644 index 00000000..fec071f6 --- /dev/null +++ b/PCB/.pretty/TE_Futurebus+_5536607-1.kicad_mod @@ -0,0 +1,43 @@ +(module TE_Futurebus+_5536607-1 (layer F.Cu) (tedit 5448B92E) + (tags connector) + (fp_text reference REF** (at 0 -3) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value TE_Futurebus+_5536607-1 (at 0 13) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -13.7 -1.25) (end 7.25 -1.25) (layer F.CrtYd) (width 0.05)) + (fp_line (start 7.25 -1.25) (end 7.25 11.25) (layer F.CrtYd) (width 0.05)) + (fp_line (start 7.25 11.25) (end -13.7 11.25) (layer F.CrtYd) (width 0.05)) + (fp_line (start -13.7 11.25) (end -13.7 -1.25) (layer F.CrtYd) (width 0.05)) + (fp_line (start 7 11) (end -1 11) (layer F.SilkS) (width 0.15)) + (fp_line (start -7 -1) (end 7 -1) (layer F.SilkS) (width 0.15)) + (fp_line (start 7 -1) (end 7 11) (layer F.SilkS) (width 0.15)) + (pad "" thru_hole circle (at -4 5) (size 2.05 2.05) (drill 2.05) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at -4 1) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask)) + (pad "" thru_hole circle (at -4 9) (size 1.5 1.5) (drill 1.5) (layers *.Cu *.Mask)) + (pad 1 thru_hole rect (at 0 4) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at 0 2) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at 0 0) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2 4) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2 2) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2 0) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 4 4) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 4 2) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 4 0) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 6 4) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 6 2) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 6 0) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 0 6) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 0 8) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 0 10) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 2 10) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 2 8) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 2 6) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 4 6) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 4 8) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 4 10) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 6 10) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 6 8) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 6 6) (size 1.25 1.25) (drill 0.725) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/USB_A.kicad_mod b/PCB/.pretty/USB_A.kicad_mod new file mode 100644 index 00000000..e53d8601 --- /dev/null +++ b/PCB/.pretty/USB_A.kicad_mod @@ -0,0 +1,29 @@ +(module USB_A (layer F.Cu) (tedit 5543E289) + (descr "USB A connector") + (tags "USB USB_A") + (fp_text reference REF** (at 0 -2.35) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value USB_A (at 3.83794 7.43458) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.3 13.2) (end -5.3 -1.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 11.95 -1.4) (end 11.95 13.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.3 13.2) (end 11.95 13.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.3 -1.4) (end 11.95 -1.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 11.04986 -1.14512) (end 11.04986 12.95188) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.93614 12.95188) (end -3.93614 -1.14512) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.04986 -1.14512) (end -3.93614 -1.14512) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.04986 12.95188) (end -3.93614 12.95188) (layer F.SilkS) (width 0.15)) + (pad 4 thru_hole circle (at 7.11286 -0.00212 270) (size 1.50114 1.50114) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 4.57286 -0.00212 270) (size 1.50114 1.50114) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.54086 -0.00212 270) (size 1.50114 1.50114) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole circle (at 0.00086 -0.00212 270) (size 1.50114 1.50114) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 10.16086 2.66488 270) (size 2.99974 2.99974) (drill 2.30124) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -3.55514 2.66488 270) (size 2.99974 2.99974) (drill 2.30124) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/USB_A.wrl + (at (xyz 0.14 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) +) diff --git a/PCB/.pretty/USB_A_Vertical.kicad_mod b/PCB/.pretty/USB_A_Vertical.kicad_mod new file mode 100644 index 00000000..080d9b10 --- /dev/null +++ b/PCB/.pretty/USB_A_Vertical.kicad_mod @@ -0,0 +1,33 @@ +(module USB_A_Vertical (layer F.Cu) (tedit 554409CC) + (descr "USB A vertical female connector, right angle") + (tags "USB_A_Vertical female connector angled 73725-0110BLF") + (fp_text reference REF** (at 0 8.95) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value USB_A_Vertical (at -0.05 -5.8) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 3.9 -12.75) (end 3.9 7.55) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.9 7.55) (end -3.9 7.55) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.9 7.55) (end -3.9 -12.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.9 -12.75) (end 3.9 -12.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3 -1.82) (end 3 -12.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -3 -1.82) (end -3 -12.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -3 -12.5) (end 3 -12.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -3 0.36) (end -3 5.18) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.2 7.2735) (end -2.2 7.2735) (layer F.SilkS) (width 0.15)) + (fp_line (start 3 0.36) (end 3 5.18) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole circle (at 0 0) (size 1.62 1.62) (drill 0.92) (layers *.Cu *.Mask)) + (pad 2 thru_hole circle (at 0 2) (size 1.62 1.62) (drill 0.92) (layers *.Cu *.Mask)) + (pad 3 thru_hole circle (at 0 4) (size 1.62 1.62) (drill 0.92) (layers *.Cu *.Mask)) + (pad 5 thru_hole circle (at 2.72 -0.73) (size 1.85 1.85) (drill 1.35) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 0 6) (size 1.62 1.62) (drill 0.92) (layers *.Cu *.Mask)) + (pad 5 thru_hole circle (at 2.72 6.27) (size 1.85 1.85) (drill 1.35) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -2.72 -0.73) (size 1.85 1.85) (drill 1.35) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -2.72 6.27) (size 1.85 1.85) (drill 1.35) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/USB_A_Vertical.wrl + (at (xyz 0.015 -0.02 0.05)) + (scale (xyz 0.412 0.412 0.412)) + (rotate (xyz 0 -90 180)) + ) +) diff --git a/PCB/.pretty/USB_B.kicad_mod b/PCB/.pretty/USB_B.kicad_mod new file mode 100644 index 00000000..f63ca566 --- /dev/null +++ b/PCB/.pretty/USB_B.kicad_mod @@ -0,0 +1,31 @@ +(module USB_B (layer F.Cu) (tedit 55B36073) + (descr "USB B connector") + (tags "USB_B USB_DEV") + (fp_text reference REF** (at 11.049 1.27 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value USB_B (at 4.699 1.27 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 15.25 8.9) (end -2.3 8.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.3 8.9) (end -2.3 -6.35) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.3 -6.35) (end 15.25 -6.35) (layer F.CrtYd) (width 0.05)) + (fp_line (start 15.25 -6.35) (end 15.25 8.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start 6.35 7.366) (end 14.986 7.366) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.032 7.366) (end 3.048 7.366) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.35 -4.826) (end 14.986 -4.826) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.032 -4.826) (end 3.048 -4.826) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.986 -4.826) (end 14.986 7.366) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.032 7.366) (end -2.032 -4.826) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at 0 2.54 270) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole circle (at 0 0 270) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 1.99898 0 270) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 1.99898 2.54 270) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 4.699 7.26948 270) (size 2.70002 2.70002) (drill 2.30124) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 4.699 -4.72948 270) (size 2.70002 2.70002) (drill 2.30124) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/USB_B.wrl + (at (xyz 0.185 -0.05 0.001)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 -90)) + ) +) diff --git a/PCB/.pretty/USB_Micro-B.kicad_mod b/PCB/.pretty/USB_Micro-B.kicad_mod new file mode 100644 index 00000000..708accf9 --- /dev/null +++ b/PCB/.pretty/USB_Micro-B.kicad_mod @@ -0,0 +1,29 @@ +(module USB_Micro-B (layer F.Cu) (tedit 5543E447) + (descr "Micro USB Type B Receptacle") + (tags "USB USB_B USB_micro USB_OTG") + (attr smd) + (fp_text reference REF** (at 0 -3.45) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value USB_Micro-B (at 0 4.8) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.6 -2.8) (end 4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 -2.8) (end 4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 4.05) (end -4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.6 4.05) (end -4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3509 3.81746) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 -2.58754) (end 4.3491 -2.58754) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 -2.58754) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 2.58746) (end -4.3509 2.58746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 3.81746) (end -4.3509 -2.58754) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.3009 -1.56254 90) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at -0.6509 -1.56254 90) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask)) + (pad 3 smd rect (at -0.0009 -1.56254 90) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask)) + (pad 4 smd rect (at 0.6491 -1.56254 90) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask)) + (pad 5 smd rect (at 1.2991 -1.56254 90) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask)) + (pad 6 thru_hole oval (at -2.5009 -1.56254 90) (size 0.95 1.25) (drill oval 0.55 0.85) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole oval (at 2.4991 -1.56254 90) (size 0.95 1.25) (drill oval 0.55 0.85) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole oval (at -3.5009 1.13746 90) (size 1.55 1) (drill oval 1.15 0.5) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole oval (at 3.4991 1.13746 90) (size 1.55 1) (drill oval 1.15 0.5) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/USB_Micro-B_WIDE.kicad_mod b/PCB/.pretty/USB_Micro-B_WIDE.kicad_mod new file mode 100644 index 00000000..658d273b --- /dev/null +++ b/PCB/.pretty/USB_Micro-B_WIDE.kicad_mod @@ -0,0 +1,29 @@ +(module USB_Micro-B_WIDE (layer F.Cu) (tedit 56F1EFCA) + (descr "Micro USB Type B Receptacle") + (tags "USB USB_B USB_micro USB_OTG") + (attr smd) + (fp_text reference REF** (at 0 -3.45) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value USB_Micro-B (at 0 4.8) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.6 -2.8) (end 4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 -2.8) (end 4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 4.05) (end -4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.6 4.05) (end -4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3509 3.81746) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 -2.58754) (end 4.3491 -2.58754) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 -2.58754) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 2.58746) (end -4.3509 2.58746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 3.81746) (end -4.3509 -2.58754) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.3009 -1.56254 90) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at -0.6509 -1.56254 90) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask)) + (pad 3 smd rect (at -0.0009 -1.56254 90) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask)) + (pad 4 smd rect (at 0.6491 -1.56254 90) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask)) + (pad 5 smd rect (at 1.2991 -1.56254 90) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask)) + (pad 6 thru_hole oval (at -2.5009 -1.56254 90) (size 0.95 1.4) (drill oval 0.55 1) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole oval (at 2.4991 -1.56254 90) (size 0.95 1.4) (drill oval 0.55 1) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole oval (at -3.5009 1.13746 90) (size 1.55 1.2) (drill oval 1.15 0.7) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole oval (at 3.4991 1.13746 90) (size 1.55 1.2) (drill oval 1.15 0.7) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/USB_Mini-B.kicad_mod b/PCB/.pretty/USB_Mini-B.kicad_mod new file mode 100644 index 00000000..ceb45e0b --- /dev/null +++ b/PCB/.pretty/USB_Mini-B.kicad_mod @@ -0,0 +1,31 @@ +(module USB_Mini-B (layer F.Cu) (tedit 5543E571) + (descr "USB Mini-B 5-pin SMD connector") + (tags "USB USB_B USB_Mini connector") + (attr smd) + (fp_text reference REF** (at 0 6.90118) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value USB_Mini-B (at 0 -7.0993) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.85 -5.7) (end 4.85 -5.7) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.85 -5.7) (end 4.85 5.7) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.85 5.7) (end -4.85 5.7) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.85 5.7) (end -4.85 -5.7) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.59918 -3.85064) (end -3.59918 3.85064) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.59994 -3.85064) (end -4.59994 3.85064) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.59994 3.85064) (end 4.59994 3.85064) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.59994 3.85064) (end 4.59994 -3.85064) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.59994 -3.85064) (end -4.59994 -3.85064) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at 3.44932 -1.6002) (size 2.30124 0.50038) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at 3.44932 -0.8001) (size 2.30124 0.50038) (layers F.Cu F.Paste F.Mask)) + (pad 3 smd rect (at 3.44932 0) (size 2.30124 0.50038) (layers F.Cu F.Paste F.Mask)) + (pad 4 smd rect (at 3.44932 0.8001) (size 2.30124 0.50038) (layers F.Cu F.Paste F.Mask)) + (pad 5 smd rect (at 3.44932 1.6002) (size 2.30124 0.50038) (layers F.Cu F.Paste F.Mask)) + (pad 6 smd rect (at 3.35026 -4.45008) (size 2.49936 1.99898) (layers F.Cu F.Paste F.Mask)) + (pad 6 smd rect (at -2.14884 -4.45008) (size 2.49936 1.99898) (layers F.Cu F.Paste F.Mask)) + (pad 6 smd rect (at 3.35026 4.45008) (size 2.49936 1.99898) (layers F.Cu F.Paste F.Mask)) + (pad 6 smd rect (at -2.14884 4.45008) (size 2.49936 1.99898) (layers F.Cu F.Paste F.Mask)) + (pad "" np_thru_hole circle (at 0.8509 -2.19964) (size 0.89916 0.89916) (drill 0.89916) (layers *.Cu *.Mask F.SilkS)) + (pad "" np_thru_hole circle (at 0.8509 2.19964) (size 0.89916 0.89916) (drill 0.89916) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/VASCH10x2.kicad_mod b/PCB/.pretty/VASCH10x2.kicad_mod new file mode 100644 index 00000000..8bb4d8d4 --- /dev/null +++ b/PCB/.pretty/VASCH10x2.kicad_mod @@ -0,0 +1,49 @@ +(module VASCH10x2 (layer F.Cu) (tedit 0) + (descr CONNECTOR) + (tags CONNECTOR) + (attr virtual) + (fp_text reference REF** (at -15.875 -5.715) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value VASCH10x2 (at 0 6.35) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 15.875 3.81) (end 16.51 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.875 -3.81) (end 16.51 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.875 3.81) (end -16.51 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -16.51 -4.445) (end -15.875 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.875 -3.81) (end -15.875 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.875 3.81) (end -1.905 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.905 3.81) (end -1.905 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.875 -3.81) (end 15.875 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.875 -3.81) (end 15.875 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.875 3.81) (end 1.905 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.905 3.81) (end 1.905 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.51 -4.445) (end -16.51 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -16.51 4.445) (end 16.51 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -16.51 -4.445) (end -16.51 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.51 -4.445) (end 16.51 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.84808 1.9685) (end -13.14958 3.03784) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.14958 3.03784) (end -12.44854 1.9685) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.44854 1.9685) (end -13.84808 1.9685) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole circle (at -11.43 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 2 thru_hole circle (at -11.43 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 3 thru_hole circle (at -8.89 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 4 thru_hole circle (at -8.89 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 5 thru_hole circle (at -6.35 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 6 thru_hole circle (at -6.35 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 7 thru_hole circle (at -3.81 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 8 thru_hole circle (at -3.81 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 9 thru_hole circle (at -1.27 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 10 thru_hole circle (at -1.27 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 11 thru_hole circle (at 1.27 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 12 thru_hole circle (at 1.27 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 13 thru_hole circle (at 3.81 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 14 thru_hole circle (at 3.81 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 15 thru_hole circle (at 6.35 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 16 thru_hole circle (at 6.35 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 17 thru_hole circle (at 8.89 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 18 thru_hole circle (at 8.89 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 19 thru_hole circle (at 11.43 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 20 thru_hole circle (at 11.43 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) +) diff --git a/PCB/.pretty/VASCH5x2.kicad_mod b/PCB/.pretty/VASCH5x2.kicad_mod new file mode 100644 index 00000000..aba72806 --- /dev/null +++ b/PCB/.pretty/VASCH5x2.kicad_mod @@ -0,0 +1,39 @@ +(module VASCH5x2 (layer F.Cu) (tedit 0) + (descr CONNECTOR) + (tags CONNECTOR) + (attr virtual) + (fp_text reference REF** (at -8.89 -5.08) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value VASCH5x2 (at 1.27 6.35) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -9.525 -3.81) (end -10.16 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.525 3.81) (end -10.16 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.525 3.81) (end 10.16 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.525 -3.81) (end 10.16 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.905 4.445) (end 1.905 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.905 3.81) (end 9.525 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.525 3.81) (end 9.525 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.525 -3.81) (end -9.525 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.525 -3.81) (end -9.525 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.525 3.81) (end -1.905 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.905 3.81) (end -1.905 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.16 4.445) (end 10.16 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.16 -4.445) (end -10.16 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.16 -4.445) (end -10.16 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.16 -4.445) (end 10.16 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.49808 1.9685) (end -6.79958 3.03784) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.79958 3.03784) (end -6.09854 1.9685) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.09854 1.9685) (end -7.49808 1.9685) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole circle (at -5.08 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 2 thru_hole circle (at -5.08 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 3 thru_hole circle (at -2.54 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 4 thru_hole circle (at -2.54 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 5 thru_hole circle (at 0 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 6 thru_hole circle (at 0 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 7 thru_hole circle (at 2.54 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 8 thru_hole circle (at 2.54 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 9 thru_hole circle (at 5.08 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 10 thru_hole circle (at 5.08 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) +) diff --git a/PCB/.pretty/VASCH8x2.kicad_mod b/PCB/.pretty/VASCH8x2.kicad_mod new file mode 100644 index 00000000..eb20eda3 --- /dev/null +++ b/PCB/.pretty/VASCH8x2.kicad_mod @@ -0,0 +1,45 @@ +(module VASCH8x2 (layer F.Cu) (tedit 0) + (descr CONNECTOR) + (tags CONNECTOR) + (attr virtual) + (fp_text reference REF** (at -12.7 -5.08) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value VASCH8x2 (at 0 6.35) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 13.335 3.81) (end 13.97 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.335 -3.81) (end 13.97 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.335 -3.81) (end -13.97 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.905 4.445) (end 1.905 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.905 3.81) (end 13.335 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.335 3.81) (end 13.335 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.335 -3.81) (end -13.335 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.335 -3.81) (end -13.335 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.335 3.81) (end -13.97 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.335 3.81) (end -1.905 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.905 3.81) (end -1.905 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.97 4.445) (end -13.97 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.97 -4.445) (end 13.97 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.97 -4.445) (end -13.97 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.97 -4.445) (end 13.97 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.30808 1.9685) (end -10.60958 3.03784) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.60958 3.03784) (end -9.90854 1.9685) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.90854 1.9685) (end -11.30808 1.9685) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole circle (at -8.89 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 2 thru_hole circle (at -8.89 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 3 thru_hole circle (at -6.35 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 4 thru_hole circle (at -6.35 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 5 thru_hole circle (at -3.81 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 6 thru_hole circle (at -3.81 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 7 thru_hole circle (at -1.27 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 8 thru_hole circle (at -1.27 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 9 thru_hole circle (at 1.27 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 10 thru_hole circle (at 1.27 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 11 thru_hole circle (at 3.81 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 12 thru_hole circle (at 3.81 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 13 thru_hole circle (at 6.35 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 14 thru_hole circle (at 6.35 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 15 thru_hole circle (at 8.89 1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) + (pad 16 thru_hole circle (at 8.89 -1.27) (size 1.50622 1.50622) (drill 0.99822) (layers *.Cu *.Mask)) +) diff --git a/PCB/.pretty/Wafer_Horizontal10x5.8x7RM2.5-3.kicad_mod b/PCB/.pretty/Wafer_Horizontal10x5.8x7RM2.5-3.kicad_mod new file mode 100644 index 00000000..84d93058 --- /dev/null +++ b/PCB/.pretty/Wafer_Horizontal10x5.8x7RM2.5-3.kicad_mod @@ -0,0 +1,38 @@ +(module Wafer_Horizontal10x5.8x7RM2.5-3 (layer F.Cu) (tedit 556C2A14) + (descr "Gold-Tek horizontal wafer connector with 2.5mm pitch") + (tags "wafer connector horizontal") + (fp_text reference REF** (at 2.54 -3.81) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Wafer_Horizontal10x5.8x7RM2.5-3 (at 2.54 10.414) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.75 -2.75) (end 7.85 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 7.85 -2.75) (end 7.85 9.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 7.85 9.65) (end -2.75 9.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.75 9.65) (end -2.75 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.413 9.271) (end 7.493 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.413 2.286) (end 7.493 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.5819 2.286) (end 7.5819 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.0419 2.159) (end 5.0419 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.5019 2.286) (end 2.5019 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.0889 1.397) (end 0.0889 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.4511 2.286) (end -2.4511 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.4069 9.271) (end 4.4069 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.4069 5.715) (end 5.6769 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.6769 5.715) (end 5.6769 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5461 9.271) (end -0.5461 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5461 5.715) (end 0.7239 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.7239 5.715) (end 0.7239 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.5819 2.286) (end 7.5819 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.5819 -2.413) (end 6.4389 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.4389 -2.413) (end 6.4389 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.4511 -2.413) (end -1.3081 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.3081 -2.413) (end -1.3081 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.4511 2.413) (end -2.4511 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.5819 2.286) (end 7.5819 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.4511 9.271) (end -2.4511 2.286) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.54 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 5.04 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/Wafer_Horizontal15x5.8x7RM2.5-5.kicad_mod b/PCB/.pretty/Wafer_Horizontal15x5.8x7RM2.5-5.kicad_mod new file mode 100644 index 00000000..48fafcf1 --- /dev/null +++ b/PCB/.pretty/Wafer_Horizontal15x5.8x7RM2.5-5.kicad_mod @@ -0,0 +1,45 @@ +(module Wafer_Horizontal15x5.8x7RM2.5-5 (layer F.Cu) (tedit 556C2A29) + (descr "Gold-Tek horizontal wafer connector with 2.5mm pitch") + (tags "wafer connector horizontal") + (fp_text reference REF** (at 5.0165 -3.81) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Wafer_Horizontal15x5.8x7RM2.5-5 (at 5.08 10.414) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.75 -2.75) (end 12.95 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 12.95 -2.75) (end 12.95 9.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 12.95 9.65) (end -2.75 9.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.75 9.65) (end -2.75 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 10.0584 2.286) (end 10.0584 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.5184 2.159) (end 7.5184 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.9784 2.286) (end 4.9784 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.5654 1.397) (end 2.5654 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.0254 2.286) (end 0.0254 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.4234 9.271) (end 9.4234 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.4234 5.715) (end 10.6934 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.6934 5.715) (end 10.6934 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.6096 9.271) (end -0.6096 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.6096 5.715) (end 0.6604 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.6604 5.715) (end 0.6604 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.5984 2.286) (end 12.5984 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.5984 -2.413) (end 11.4554 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.4554 -2.413) (end 11.4554 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.5146 -2.413) (end -1.3716 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.3716 -2.413) (end -1.3716 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.5146 2.413) (end -2.5146 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.5146 2.286) (end 12.5984 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.5984 2.286) (end 12.5984 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.5984 9.271) (end -2.5146 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.5146 9.271) (end -2.5146 2.286) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.5165 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 5.0165 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 7.5165 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 10.0165 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/Wafer_Horizontal15x5.8x7RM2.5-5.wrl + (at (xyz 0 0 0)) + (scale (xyz 4 4 4)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/Wafer_Horizontal17.5x5.8x7RM2.5-6.kicad_mod b/PCB/.pretty/Wafer_Horizontal17.5x5.8x7RM2.5-6.kicad_mod new file mode 100644 index 00000000..3da8ef40 --- /dev/null +++ b/PCB/.pretty/Wafer_Horizontal17.5x5.8x7RM2.5-6.kicad_mod @@ -0,0 +1,48 @@ +(module Wafer_Horizontal17.5x5.8x7RM2.5-6 (layer F.Cu) (tedit 556C2A3A) + (descr "Gold-Tek horizontal wafer connector with 2.5mm pitch") + (tags "wafer connector horizontal") + (fp_text reference REF** (at 6.4135 -3.81) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Wafer_Horizontal17.5x5.8x7RM2.5-6 (at 6.35 10.414) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.75 -2.75) (end 15.45 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 15.45 -2.75) (end 15.45 9.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 15.45 9.65) (end -2.75 9.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.75 9.65) (end -2.75 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 15.0495 2.286) (end 15.0495 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.0495 -2.413) (end 13.7795 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.7795 -2.413) (end 13.7795 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.4765 2.286) (end -2.4765 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.4765 -2.413) (end -1.4605 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.4605 -2.413) (end -1.2065 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.2065 -2.413) (end -1.2065 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.4765 2.286) (end 15.0495 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.4765 9.271) (end 15.0495 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.4445 5.842) (end -0.4445 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.0495 2.286) (end 15.0495 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.4765 2.286) (end -2.4765 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.0015 9.271) (end 12.0015 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.0015 5.715) (end 13.2715 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.2715 5.715) (end 13.2715 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.4445 5.842) (end 0.6985 5.842) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.6985 5.842) (end 0.6985 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.6365 2.286) (end 12.6365 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.9695 2.286) (end 9.9695 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.5565 2.286) (end 7.5565 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.0165 2.286) (end 5.0165 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.6035 2.286) (end 2.6035 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.0635 2.286) (end 0.0635 1.397) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.5365 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 5.0365 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 7.5365 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 10.0365 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 12.5365 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/Wafer_Horizontal17.5x5.8x7RM2.5-6.wrl + (at (xyz 0 0 0)) + (scale (xyz 4 4 4)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/Wafer_Horizontal20x5.8x7RM2.5-7.kicad_mod b/PCB/.pretty/Wafer_Horizontal20x5.8x7RM2.5-7.kicad_mod new file mode 100644 index 00000000..3b18d9d7 --- /dev/null +++ b/PCB/.pretty/Wafer_Horizontal20x5.8x7RM2.5-7.kicad_mod @@ -0,0 +1,49 @@ +(module Wafer_Horizontal20x5.8x7RM2.5-7 (layer F.Cu) (tedit 556C2A51) + (descr "Gold-Tek horizontal wafer connector with 2.5mm pitch") + (tags "wafer connector horizontal") + (fp_text reference REF** (at 7.62 -3.81) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Wafer_Horizontal20x5.8x7RM2.5-7 (at 7.62 10.414) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.5 -2.75) (end 18 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 18 -2.75) (end 18 9.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 18 9.65) (end -2.5 9.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.5 9.65) (end -2.5 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 14.351 9.271) (end 14.351 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.351 5.715) (end 15.621 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.621 5.715) (end 15.621 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.508 9.271) (end -0.508 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.508 5.715) (end 0.635 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 5.715) (end 0.635 9.144) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.986 2.286) (end 14.986 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.573 2.286) (end 12.573 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.906 2.286) (end 9.906 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.493 2.286) (end 7.493 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.953 2.286) (end 4.953 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 2.286) (end 2.54 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 2.286) (end 0 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.653 2.413) (end 17.653 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.653 -2.413) (end 16.383 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.383 -2.413) (end 16.383 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.286 2.286) (end -2.286 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.286 -2.413) (end -1.397 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.397 -2.413) (end -1.397 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.286 2.286) (end 17.653 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.653 2.286) (end 17.653 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.653 9.271) (end -2.286 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.286 9.271) (end -2.286 2.286) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.493 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 4.993 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 7.493 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 9.993 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 12.493 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 14.993 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/Wafer_Horizontal20x5.8x7RM2.5-7.wrl + (at (xyz 0 0 0)) + (scale (xyz 4 4 4)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/Wafer_Horizontal22.5x5.8x7RM2.5-8.kicad_mod b/PCB/.pretty/Wafer_Horizontal22.5x5.8x7RM2.5-8.kicad_mod new file mode 100644 index 00000000..b9c4460e --- /dev/null +++ b/PCB/.pretty/Wafer_Horizontal22.5x5.8x7RM2.5-8.kicad_mod @@ -0,0 +1,51 @@ +(module Wafer_Horizontal22.5x5.8x7RM2.5-8 (layer F.Cu) (tedit 556C2A63) + (descr "Gold-Tek horizontal wafer connector with 2.5mm pitch") + (tags "wafer connector horizontal") + (fp_text reference REF** (at 8.89 -3.81) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Wafer_Horizontal22.5x5.8x7RM2.5-8 (at 8.89 10.414) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.75 -2.75) (end 20.3 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 20.3 -2.75) (end 20.3 9.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 20.3 9.65) (end -2.75 9.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.75 9.65) (end -2.75 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 17.526 2.286) (end 17.526 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.066 -2.413) (end 18.796 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.796 -2.413) (end 18.796 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 -2.413) (end -1.27 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 -2.413) (end -1.27 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 2.286) (end 20.066 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 9.271) (end 20.066 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 9.271) (end -2.54 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 2.286) (end -2.54 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.066 2.286) (end 20.066 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.066 9.271) (end 20.066 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.891 9.271) (end 16.891 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.891 5.715) (end 18.161 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.161 5.715) (end 18.161 9.271) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.508 9.271) (end -0.508 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.508 5.715) (end 0.635 5.715) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 5.715) (end 0.635 9.144) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.986 2.286) (end 14.986 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.573 2.286) (end 12.573 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 9.906 2.286) (end 9.906 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.493 2.286) (end 7.493 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.953 2.286) (end 4.953 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 2.286) (end 2.54 1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 2.286) (end 0 1.397) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.513 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 5.013 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 7.513 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 10.013 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 12.513 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 15.013 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 17.513 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/Wafer_Horizontal22.5x5.8x7RM2.5-8.wrl + (at (xyz 0 0 0)) + (scale (xyz 4 4 4)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/Wafer_Vertical10x5.8x7RM2.5-3.kicad_mod b/PCB/.pretty/Wafer_Vertical10x5.8x7RM2.5-3.kicad_mod new file mode 100644 index 00000000..5f108816 --- /dev/null +++ b/PCB/.pretty/Wafer_Vertical10x5.8x7RM2.5-3.kicad_mod @@ -0,0 +1,26 @@ +(module Wafer_Vertical10x5.8x7RM2.5-3 (layer F.Cu) (tedit 556C2A89) + (descr "Gold-Tek vertical wafer connector with 2.5mm pitch") + (tags "wafer connector vertical") + (fp_text reference REF** (at 2.54 -3.81) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Wafer_Vertical10x5.8x7RM2.5-3 (at 2.54 5.08) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.75 -2.75) (end 7.85 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 7.85 -2.75) (end 7.85 3.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 7.85 3.8) (end -2.75 3.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.75 3.8) (end -2.75 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 7.62 3.429) (end -2.54 3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 -2.413) (end 7.62 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 -2.413) (end 7.62 3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 -2.413) (end -2.54 3.429) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.54 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 5.04 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/Wafer_Vertical10x5.8x7RM2.5-3.wrl + (at (xyz 0 0 0)) + (scale (xyz 4 4 4)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/Wafer_Vertical15x5.8x7RM2.5-5.kicad_mod b/PCB/.pretty/Wafer_Vertical15x5.8x7RM2.5-5.kicad_mod new file mode 100644 index 00000000..7787720a --- /dev/null +++ b/PCB/.pretty/Wafer_Vertical15x5.8x7RM2.5-5.kicad_mod @@ -0,0 +1,28 @@ +(module Wafer_Vertical15x5.8x7RM2.5-5 (layer F.Cu) (tedit 556C2A98) + (descr "Gold-Tek vertical wafer connector with 2.5mm pitch") + (tags "wafer connector vertical") + (fp_text reference REF** (at 5.0165 -3.81) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Wafer_Vertical15x5.8x7RM2.5-5 (at 5.0165 5.08) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3 -2.75) (end 12.95 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 12.95 -2.75) (end 12.95 3.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 12.95 3.8) (end -3 3.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3 3.8) (end -3 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 12.6365 3.429) (end -2.6035 3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6035 -2.413) (end 12.6365 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.6365 -2.413) (end 12.6365 3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6035 -2.413) (end -2.6035 3.429) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.5165 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 5.0165 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 7.5165 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 10.0165 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/Wafer_Vertical15x5.8x7RM2.5-5.wrl + (at (xyz 0 0 0)) + (scale (xyz 4 4 4)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/Wafer_Vertical17.5x5.8x7RM2.5-6.kicad_mod b/PCB/.pretty/Wafer_Vertical17.5x5.8x7RM2.5-6.kicad_mod new file mode 100644 index 00000000..786c93dc --- /dev/null +++ b/PCB/.pretty/Wafer_Vertical17.5x5.8x7RM2.5-6.kicad_mod @@ -0,0 +1,29 @@ +(module Wafer_Vertical17.5x5.8x7RM2.5-6 (layer F.Cu) (tedit 556C2AA9) + (descr "Gold-Tek vertical wafer connector with 2.5mm pitch") + (tags "wafer connector vertical") + (fp_text reference REF** (at 6.2865 -3.81) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Wafer_Vertical17.5x5.8x7RM2.5-6 (at 6.2865 5.08) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.75 -2.75) (end 15.2 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 15.2 -2.75) (end 15.2 3.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 15.2 3.8) (end -2.75 3.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.75 3.8) (end -2.75 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 15.0495 3.429) (end -2.4765 3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.4765 -2.413) (end 15.0495 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.0495 -2.413) (end 15.0495 3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.4765 -2.413) (end -2.4765 3.429) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.5365 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 5.0365 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 7.5365 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 10.0365 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 12.5365 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/Wafer_Vertical17.5x5.8x7RM2.5-6.wrl + (at (xyz 0 0 0)) + (scale (xyz 4 4 4)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/Wafer_Vertical20x5.8x7RM2.5-7.kicad_mod b/PCB/.pretty/Wafer_Vertical20x5.8x7RM2.5-7.kicad_mod new file mode 100644 index 00000000..9978f869 --- /dev/null +++ b/PCB/.pretty/Wafer_Vertical20x5.8x7RM2.5-7.kicad_mod @@ -0,0 +1,30 @@ +(module Wafer_Vertical20x5.8x7RM2.5-7 (layer F.Cu) (tedit 556C2ABA) + (descr "Gold-Tek vertical wafer connector with 2.5mm pitch") + (tags "wafer connector vertical") + (fp_text reference REF** (at 7.493 -3.81) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Wafer_Vertical20x5.8x7RM2.5-7 (at 7.493 5.08) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.75 -2.75) (end 17.75 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 17.75 -2.75) (end 17.75 3.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 17.75 3.8) (end -2.75 3.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.75 3.8) (end -2.75 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.54 -2.413) (end -2.54 3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 3.429) (end 17.526 3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.526 3.429) (end 17.526 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.526 -2.413) (end -2.54 -2.413) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.493 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 4.993 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 7.493 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 9.993 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 12.493 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 14.993 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/Wafer_Vertical20x5.8x7RM2.5-7.wrl + (at (xyz 0 0 0)) + (scale (xyz 4 4 4)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/Wafer_Vertical22.5x5.8x7RM2.5-8.kicad_mod b/PCB/.pretty/Wafer_Vertical22.5x5.8x7RM2.5-8.kicad_mod new file mode 100644 index 00000000..2d439de8 --- /dev/null +++ b/PCB/.pretty/Wafer_Vertical22.5x5.8x7RM2.5-8.kicad_mod @@ -0,0 +1,35 @@ +(module Wafer_Vertical22.5x5.8x7RM2.5-8 (layer F.Cu) (tedit 556C2AC9) + (descr "Gold-Tek vertical wafer connector with 2.5mm pitch") + (tags "wafer connector vertical") + (fp_text reference REF** (at 8.763 -3.81) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Wafer_Vertical22.5x5.8x7RM2.5-8 (at 8.763 5.08) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.75 -2.75) (end 20.3 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 20.3 -2.75) (end 20.3 3.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 20.3 3.8) (end -2.75 3.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.75 3.8) (end -2.75 -2.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 -2.413) (end -2.54 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 -2.413) (end -2.54 3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 3.429) (end -1.27 3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.796 -2.413) (end 20.066 -2.413) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.796 3.429) (end 20.066 3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.066 -2.413) (end 20.066 3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.429) (end 18.796 3.429) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.796 -2.413) (end -1.27 -2.413) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.513 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 5.013 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 7.513 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 10.013 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 12.513 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 15.013 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 17.513 0) (size 2 2) (drill 1.2) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/Wafer_Vertical22.5x5.8x7RM2.5-8.wrl + (at (xyz 0 0 0)) + (scale (xyz 4 4 4)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/XLR3MC.kicad_mod b/PCB/.pretty/XLR3MC.kicad_mod new file mode 100644 index 00000000..5bc81e97 --- /dev/null +++ b/PCB/.pretty/XLR3MC.kicad_mod @@ -0,0 +1,32 @@ +(module XLR3MC (layer F.Cu) (tedit 0) + (fp_text reference REF** (at 0 10.16) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value XLR3MC (at 0 15.24) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -11.43 22.225) (end -11.43 24.13) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.43 24.13) (end -11.43 24.765) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.43 24.765) (end 11.43 24.765) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.43 24.765) (end 11.43 22.225) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 0) (end -1.27 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 -5.08) (end 1.27 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 -5.08) (end 1.27 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.335 20.32) (end -13.335 22.225) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.335 22.225) (end 13.335 22.225) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.335 22.225) (end 13.335 20.32) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.335 20.32) (end -13.335 20.32) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.43 0) (end -11.43 20.32) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.43 0) (end 11.43 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.43 0) (end 11.43 20.32) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole circle (at -4.064 0) (size 2.794 2.794) (drill 1.778) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 4.064 0) (size 2.794 2.794) (drill 1.778) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 0 -5.08) (size 2.54 2.54) (drill 1.27) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 0 0) (size 2.794 2.794) (drill 1.778) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 0 5.08) (size 3.81 3.81) (drill 3.2004) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/XLR3MC.wrl + (at (xyz 0 0 0)) + (scale (xyz 2 2 2)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/XLR5MC.kicad_mod b/PCB/.pretty/XLR5MC.kicad_mod new file mode 100644 index 00000000..969b532a --- /dev/null +++ b/PCB/.pretty/XLR5MC.kicad_mod @@ -0,0 +1,31 @@ +(module XLR5MC (layer F.Cu) (tedit 0) + (fp_text reference REF** (at -5.08 6.35) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value XLR5MC (at 5.08 20.32) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 11.43 25.4) (end 11.43 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.43 25.4) (end -11.43 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.335 27.305) (end -13.335 27.305) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.335 27.305) (end -13.335 25.4) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.335 25.4) (end 13.335 25.4) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.43 27.305) (end 11.43 29.845) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.43 29.845) (end -11.43 29.845) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.43 29.845) (end -11.43 27.305) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.335 27.305) (end 13.335 25.4) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.43 0) (end 11.43 0) (layer F.SilkS) (width 0.15)) + (pad 4 thru_hole circle (at 5.08 0) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 10.16 0) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 0 0) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 0 12.7) (size 3.81 3.81) (drill 3.302) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -5.08 0) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole circle (at -10.16 0) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 5.08 5.08) (size 2.54 2.54) (drill 2.1082) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at -5.08 17.78) (size 2.54 2.54) (drill 2.1082) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/XLR5MC.wrl + (at (xyz 0 0 0)) + (scale (xyz 2 2 2)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/bnc-ci.kicad_mod b/PCB/.pretty/bnc-ci.kicad_mod new file mode 100644 index 00000000..38375636 --- /dev/null +++ b/PCB/.pretty/bnc-ci.kicad_mod @@ -0,0 +1,19 @@ +(module bnc-ci (layer F.Cu) (tedit 0) + (fp_text reference REF** (at 0 -8.89) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value bnc-ci (at 0 8.89) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 0 0) (end -6.985 0) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at -3.175 -3.175) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole circle (at 0 0) (size 3.556 3.556) (drill 1.27) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 3.175 -3.175) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -3.175 3.175) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 3.175 3.175) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/bnc-ci.wrl + (at (xyz 0 0 0)) + (scale (xyz 2 2 2)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/bnc.kicad_mod b/PCB/.pretty/bnc.kicad_mod new file mode 100644 index 00000000..acfb16d7 --- /dev/null +++ b/PCB/.pretty/bnc.kicad_mod @@ -0,0 +1,21 @@ +(module bnc (layer F.Cu) (tedit 0) + (fp_text reference REF** (at -2.54 -10.16) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value bnc (at -3.81 11.43) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 7.62 3.81) (end 13.97 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.97 3.81) (end 16.51 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.51 1.27) (end 16.51 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.51 -1.27) (end 13.97 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.97 -3.81) (end 7.62 -3.81) (layer F.SilkS) (width 0.15)) + (fp_circle (center 0 0) (end 7.62 3.81) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at 0 0) (size 15.24 15.24) (drill 9.652) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole circle (at 12.7 0) (size 5.08 5.08) (drill 2.54) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/bnc.wrl + (at (xyz 0 0 0)) + (scale (xyz 2 2 2)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/bornier2.kicad_mod b/PCB/.pretty/bornier2.kicad_mod new file mode 100644 index 00000000..a0acef3f --- /dev/null +++ b/PCB/.pretty/bornier2.kicad_mod @@ -0,0 +1,22 @@ +(module bornier2 (layer F.Cu) (tedit 0) + (descr "Bornier d'alimentation 2 pins") + (tags DEV) + (fp_text reference REF** (at 0 -5.08) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value bornier2 (at 0 5.08) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 5.08 2.54) (end -5.08 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.08 3.81) (end 5.08 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.08 -3.81) (end -5.08 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.08 -3.81) (end -5.08 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.08 3.81) (end 5.08 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at -2.54 0) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 2.54 0) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/bornier2.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/bornier3.kicad_mod b/PCB/.pretty/bornier3.kicad_mod new file mode 100644 index 00000000..f9c4347a --- /dev/null +++ b/PCB/.pretty/bornier3.kicad_mod @@ -0,0 +1,23 @@ +(module bornier3 (layer F.Cu) (tedit 0) + (descr "Bornier d'alimentation 3 pins") + (tags DEV) + (fp_text reference REF** (at 0 -5.08) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value bornier3 (at 0 5.08) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -7.62 3.81) (end -7.62 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 3.81) (end 7.62 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 2.54) (end 7.62 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 -3.81) (end 7.62 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 3.81) (end 7.62 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at -5.08 0) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 0 0) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 5.08 0) (size 2.54 2.54) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/bornier3.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/bornier4.kicad_mod b/PCB/.pretty/bornier4.kicad_mod new file mode 100644 index 00000000..fdb69a67 --- /dev/null +++ b/PCB/.pretty/bornier4.kicad_mod @@ -0,0 +1,24 @@ +(module bornier4 (layer F.Cu) (tedit 0) + (descr "Bornier d'alimentation 4 pins") + (tags DEV) + (fp_text reference REF** (at 0 -6.35) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value bornier4 (at 0 5.08) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -10.16 -3.81) (end -10.16 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.16 3.81) (end 10.16 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.16 2.54) (end -10.16 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.16 -3.81) (end 10.16 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.16 3.81) (end 10.16 3.81) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at -2.54 0) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 2.54 0) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at -7.62 0) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 7.62 0) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/bornier4.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/bornier5.kicad_mod b/PCB/.pretty/bornier5.kicad_mod new file mode 100644 index 00000000..844956ab --- /dev/null +++ b/PCB/.pretty/bornier5.kicad_mod @@ -0,0 +1,25 @@ +(module bornier5 (layer F.Cu) (tedit 0) + (descr "Bornier d'alimentation 4 pins") + (tags DEV) + (fp_text reference REF** (at 0 -5.08) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value bornier5 (at 0 5.08) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -12.7 3.81) (end 12.7 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.7 2.54) (end 12.7 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.7 -3.81) (end 12.7 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.7 -3.81) (end 12.7 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.7 -3.81) (end -12.7 3.81) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at -5.08 0) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 0 0) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at -10.16 0) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 5.08 0) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 10.16 0) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/bornier5.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/bornier6.kicad_mod b/PCB/.pretty/bornier6.kicad_mod new file mode 100644 index 00000000..f338fdb1 --- /dev/null +++ b/PCB/.pretty/bornier6.kicad_mod @@ -0,0 +1,26 @@ +(module bornier6 (layer F.Cu) (tedit 0) + (descr "Bornier d'alimentation 4 pins") + (tags DEV) + (fp_text reference REF** (at 1.27 -7.62) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value bornier6 (at 0 7.62) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -15.24 -3.81) (end -15.24 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.24 3.81) (end 15.24 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.24 2.54) (end 15.24 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.24 -3.81) (end 15.24 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.24 3.81) (end 15.24 3.81) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at -7.62 0) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -2.54 0) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at -12.7 0) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 2.54 0) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 7.62 0) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 12.7 0) (size 3.81 3.81) (drill 1.524) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/bornier6.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/c64abfd.kicad_mod b/PCB/.pretty/c64abfd.kicad_mod new file mode 100644 index 00000000..50ca5635 --- /dev/null +++ b/PCB/.pretty/c64abfd.kicad_mod @@ -0,0 +1,87 @@ +(module c64abfd (layer F.Cu) (tedit 0) + (descr "Connecteur DIN Europe 64 contatcts Femelle Droit") + (tags "CONN DIN") + (fp_text reference REF** (at -20.955 -5.715) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value c64abfd (at 24.13 -5.715) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -46.99 -3.81) (end 46.99 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 46.99 -3.81) (end 46.99 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 46.99 3.81) (end -46.99 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -46.99 3.81) (end -46.99 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -41.91 3.81) (end -41.91 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 41.91 3.81) (end 41.91 -3.81) (layer F.SilkS) (width 0.15)) + (pad A1 thru_hole rect (at -39.37 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A2 thru_hole circle (at -36.83 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A3 thru_hole circle (at -34.29 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A4 thru_hole circle (at -31.75 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A5 thru_hole circle (at -29.21 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A6 thru_hole circle (at -26.67 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A7 thru_hole circle (at -24.13 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A8 thru_hole circle (at -21.59 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A9 thru_hole circle (at -19.05 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A10 thru_hole circle (at -16.51 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A11 thru_hole circle (at -13.97 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A12 thru_hole circle (at -11.43 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A13 thru_hole circle (at -8.89 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A14 thru_hole circle (at -6.35 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A15 thru_hole circle (at -3.81 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A16 thru_hole circle (at -1.27 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A17 thru_hole circle (at 1.27 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A18 thru_hole circle (at 3.81 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A19 thru_hole circle (at 6.35 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A20 thru_hole circle (at 8.89 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A21 thru_hole circle (at 11.43 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A22 thru_hole circle (at 13.97 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A23 thru_hole circle (at 16.51 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A24 thru_hole circle (at 19.05 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A25 thru_hole circle (at 21.59 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A26 thru_hole circle (at 24.13 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A27 thru_hole circle (at 26.67 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A28 thru_hole circle (at 29.21 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A29 thru_hole circle (at 31.75 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A30 thru_hole circle (at 34.29 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A31 thru_hole circle (at 36.83 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A32 thru_hole circle (at 39.37 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B1 thru_hole circle (at -39.37 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B2 thru_hole circle (at -36.83 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B3 thru_hole circle (at -34.29 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B4 thru_hole circle (at -31.75 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B5 thru_hole circle (at -29.21 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B6 thru_hole circle (at -26.67 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B7 thru_hole circle (at -24.13 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B8 thru_hole circle (at -21.59 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B9 thru_hole circle (at -19.05 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B10 thru_hole circle (at -16.51 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B11 thru_hole circle (at -13.97 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B12 thru_hole circle (at -11.43 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B13 thru_hole circle (at -8.89 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B14 thru_hole circle (at -6.35 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B15 thru_hole circle (at -3.81 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B16 thru_hole circle (at -1.27 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B17 thru_hole circle (at 1.27 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B18 thru_hole circle (at 3.81 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B19 thru_hole circle (at 6.35 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B20 thru_hole circle (at 8.89 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B21 thru_hole circle (at 11.43 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B22 thru_hole circle (at 13.97 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B23 thru_hole circle (at 16.51 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B24 thru_hole circle (at 19.05 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B25 thru_hole circle (at 21.59 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B26 thru_hole circle (at 24.13 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B27 thru_hole circle (at 26.67 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B28 thru_hole circle (at 29.21 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B29 thru_hole circle (at 31.75 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B30 thru_hole circle (at 34.29 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B31 thru_hole circle (at 36.83 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B32 thru_hole circle (at 39.37 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 65 thru_hole circle (at -44.45 -1.27) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 66 thru_hole circle (at 44.45 -1.27) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/c64abfd.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/c64abmd.kicad_mod b/PCB/.pretty/c64abmd.kicad_mod new file mode 100644 index 00000000..21bbd59d --- /dev/null +++ b/PCB/.pretty/c64abmd.kicad_mod @@ -0,0 +1,87 @@ +(module c64abmd (layer F.Cu) (tedit 0) + (descr "Connecteur DIN Europe 64 contacts Male Droit") + (tags "CONN DIN") + (fp_text reference REF** (at -21.59 -5.715) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value c64abmd (at 24.13 -5.715) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -46.99 -3.81) (end 46.99 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 46.99 -3.81) (end 46.99 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -46.99 3.81) (end -46.99 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -41.91 3.81) (end -41.91 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 41.91 3.81) (end 41.91 -3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -46.99 3.81) (end 46.99 3.81) (layer F.SilkS) (width 0.15)) + (pad 65 thru_hole circle (at -44.45 1.27) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 66 thru_hole circle (at 44.45 1.27) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad A3 thru_hole circle (at -34.29 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A4 thru_hole circle (at -31.75 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A5 thru_hole circle (at -29.21 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A6 thru_hole circle (at -26.67 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A7 thru_hole circle (at -24.13 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A8 thru_hole circle (at -21.59 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A9 thru_hole circle (at -19.05 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A10 thru_hole circle (at -16.51 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A11 thru_hole circle (at -13.97 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A12 thru_hole circle (at -11.43 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A13 thru_hole circle (at -8.89 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A14 thru_hole circle (at -6.35 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A15 thru_hole circle (at -3.81 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A16 thru_hole circle (at -1.27 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A17 thru_hole circle (at 1.27 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A18 thru_hole circle (at 3.81 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A19 thru_hole circle (at 6.35 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A20 thru_hole circle (at 8.89 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A21 thru_hole circle (at 11.43 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A22 thru_hole circle (at 13.97 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A23 thru_hole circle (at 16.51 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A24 thru_hole circle (at 19.05 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A25 thru_hole circle (at 21.59 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A26 thru_hole circle (at 24.13 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A27 thru_hole circle (at 26.67 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A28 thru_hole circle (at 29.21 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A29 thru_hole circle (at 31.75 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A30 thru_hole circle (at 34.29 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A31 thru_hole circle (at 36.83 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A32 thru_hole circle (at 39.37 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A2 thru_hole circle (at -36.83 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A1 thru_hole rect (at -39.37 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B1 thru_hole circle (at -39.37 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B2 thru_hole circle (at -36.83 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B3 thru_hole circle (at -34.29 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B4 thru_hole circle (at -31.75 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B5 thru_hole circle (at -29.21 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B6 thru_hole circle (at -26.67 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B7 thru_hole circle (at -24.13 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B8 thru_hole circle (at -21.59 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B9 thru_hole circle (at -19.05 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B10 thru_hole circle (at -16.51 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B11 thru_hole circle (at -13.97 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B12 thru_hole circle (at -11.43 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B13 thru_hole circle (at -8.89 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B14 thru_hole circle (at -6.35 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B15 thru_hole circle (at -3.81 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B16 thru_hole circle (at -1.27 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B17 thru_hole circle (at 1.27 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B18 thru_hole circle (at 3.81 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B19 thru_hole circle (at 6.35 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B20 thru_hole circle (at 8.89 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B21 thru_hole circle (at 11.43 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B22 thru_hole circle (at 13.97 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B23 thru_hole circle (at 16.51 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B24 thru_hole circle (at 19.05 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B25 thru_hole circle (at 21.59 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B26 thru_hole circle (at 24.13 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B27 thru_hole circle (at 26.67 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B28 thru_hole circle (at 29.21 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B29 thru_hole circle (at 31.75 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B30 thru_hole circle (at 34.29 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B31 thru_hole circle (at 36.83 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B32 thru_hole circle (at 39.37 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/c64abmd.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/c64acfd.kicad_mod b/PCB/.pretty/c64acfd.kicad_mod new file mode 100644 index 00000000..8fb52aaa --- /dev/null +++ b/PCB/.pretty/c64acfd.kicad_mod @@ -0,0 +1,89 @@ +(module c64acfd (layer F.Cu) (tedit 0) + (descr "Connecteur DIN Europe 96 contacts AC femelle droit") + (tags "CONN DIN") + (fp_text reference REF** (at 20.955 6.985) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value c64acfd (at -24.765 6.985) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 46.99 5.08) (end -46.99 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 46.99 -2.54) (end 46.99 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 41.91 -2.54) (end 41.91 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 46.99 -2.54) (end 46.99 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 46.99 -5.08) (end -46.99 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 41.91 -2.54) (end 41.91 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -41.91 -5.08) (end -41.91 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -46.99 5.08) (end -46.99 -5.08) (layer F.SilkS) (width 0.15)) + (pad 65 thru_hole circle (at 44.45 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 66 thru_hole circle (at -44.45 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad A1 thru_hole rect (at -39.37 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A2 thru_hole circle (at -36.83 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A3 thru_hole circle (at -34.29 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A4 thru_hole circle (at -31.75 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A5 thru_hole circle (at -29.21 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A6 thru_hole circle (at -26.67 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A7 thru_hole circle (at -24.13 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A8 thru_hole circle (at -21.59 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A9 thru_hole circle (at -19.05 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A10 thru_hole circle (at -16.51 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A11 thru_hole circle (at -13.97 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A12 thru_hole circle (at -11.43 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A13 thru_hole circle (at -8.89 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A14 thru_hole circle (at -6.35 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A15 thru_hole circle (at -3.81 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A16 thru_hole circle (at -1.27 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A17 thru_hole circle (at 1.27 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A18 thru_hole circle (at 3.81 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A19 thru_hole circle (at 6.35 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A20 thru_hole circle (at 8.89 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A21 thru_hole circle (at 11.43 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A22 thru_hole circle (at 13.97 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A23 thru_hole circle (at 16.51 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A24 thru_hole circle (at 19.05 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A25 thru_hole circle (at 21.59 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A26 thru_hole circle (at 24.13 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A27 thru_hole circle (at 26.67 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A28 thru_hole circle (at 29.21 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A29 thru_hole circle (at 31.75 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A30 thru_hole circle (at 34.29 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A31 thru_hole circle (at 36.83 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A32 thru_hole circle (at 39.37 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C1 thru_hole circle (at -39.37 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C2 thru_hole circle (at -36.83 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C3 thru_hole circle (at -34.29 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C4 thru_hole circle (at -31.75 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C5 thru_hole circle (at -29.21 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C6 thru_hole circle (at -26.67 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C7 thru_hole circle (at -24.13 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C8 thru_hole circle (at -21.59 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C9 thru_hole circle (at -19.05 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C10 thru_hole circle (at -16.51 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C11 thru_hole circle (at -13.97 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C12 thru_hole circle (at -11.43 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C13 thru_hole circle (at -8.89 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C14 thru_hole circle (at -6.35 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C15 thru_hole circle (at -3.81 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C16 thru_hole circle (at -1.27 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C17 thru_hole circle (at 1.27 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C18 thru_hole circle (at 3.81 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C19 thru_hole circle (at 6.35 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C20 thru_hole circle (at 8.89 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C21 thru_hole circle (at 11.43 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C22 thru_hole circle (at 13.97 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C23 thru_hole circle (at 16.51 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C24 thru_hole circle (at 19.05 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C25 thru_hole circle (at 21.59 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C26 thru_hole circle (at 24.13 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C27 thru_hole circle (at 26.67 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C28 thru_hole circle (at 29.21 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C29 thru_hole circle (at 31.75 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C30 thru_hole circle (at 34.29 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C31 thru_hole circle (at 36.83 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C32 thru_hole circle (at 39.37 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/c64acfd.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/he10-10d.kicad_mod b/PCB/.pretty/he10-10d.kicad_mod new file mode 100644 index 00000000..17f2c541 --- /dev/null +++ b/PCB/.pretty/he10-10d.kicad_mod @@ -0,0 +1,41 @@ +(module he10-10d (layer F.Cu) (tedit 0) + (descr "Connecteur HE10 10 contacts droit") + (tags "CONN HE10") + (fp_text reference REF** (at -6.096 -5.842) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value he10-10d (at 6.096 5.842) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 16.002 -4.318) (end 16.002 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.002 4.318) (end -16.002 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -16.002 -4.318) (end 16.002 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.89 3.556) (end -8.89 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.89 3.556) (end 8.89 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 4.318) (end -2.54 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 3.556) (end -8.89 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.89 -3.556) (end 8.89 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.89 3.556) (end 2.54 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 3.556) (end 2.54 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -16.002 4.318) (end -16.002 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.604 1.27) (end -7.874 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.874 0.508) (end -7.874 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.874 2.032) (end -6.604 1.27) (layer F.SilkS) (width 0.15)) + (pad "" thru_hole circle (at -13.97 0) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) + (pad "" thru_hole circle (at 13.97 0) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at -5.08 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -5.08 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -2.54 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -2.54 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 0 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 0 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 2.54 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 2.54 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at 5.08 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at 5.08 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/he10-10d.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/PCB/.pretty/he10-14c.kicad_mod b/PCB/.pretty/he10-14c.kicad_mod new file mode 100644 index 00000000..9797dbde --- /dev/null +++ b/PCB/.pretty/he10-14c.kicad_mod @@ -0,0 +1,48 @@ +(module he10-14c (layer F.Cu) (tedit 0) + (descr "Connecteur HE10 14 contacts couche") + (tags "CONN HE10") + (fp_text reference REF** (at 0 3.81) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value he10-14c (at -2.54 7.62) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -11.176 -2.54) (end -11.176 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.176 2.032) (end -12.446 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.446 3.302) (end -14.478 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -14.478 3.302) (end -15.748 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.748 2.032) (end -15.748 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.446 3.302) (end 11.176 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.176 2.032) (end 11.176 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.748 -2.54) (end 15.748 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.748 2.032) (end 14.478 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.478 3.302) (end 12.446 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -17.78 -2.54) (end -17.78 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -17.78 4.445) (end -14.605 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start -14.605 14.605) (end -10.795 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.795 14.605) (end -8.89 10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start -17.78 -2.54) (end 18.415 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.24 14.605) (end 11.43 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.415 -2.54) (end 18.415 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.415 4.445) (end 15.24 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.89 10.16) (end 8.763 10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.43 14.605) (end 8.763 10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.112 10.16) (end 6.096 8.128) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.096 8.128) (end 5.08 10.16) (layer F.SilkS) (width 0.15)) + (pad 0 thru_hole circle (at -13.462 0.508) (size 3.048 3.048) (drill 2.54) (layers *.Cu *.Mask F.SilkS)) + (pad 0 thru_hole circle (at 13.462 0.508) (size 3.048 3.048) (drill 2.54) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at 7.62 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 7.62 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 5.08 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 5.08 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 2.54 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 0 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 0 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 2.54 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -2.54 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at -2.54 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at -5.08 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at -5.08 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at -7.62 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at -7.62 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/he10-14d.kicad_mod b/PCB/.pretty/he10-14d.kicad_mod new file mode 100644 index 00000000..97b787e0 --- /dev/null +++ b/PCB/.pretty/he10-14d.kicad_mod @@ -0,0 +1,40 @@ +(module he10-14d (layer F.Cu) (tedit 0) + (descr "Connecteur HE10 14 contacts droit") + (tags "CONN HE10") + (fp_text reference REF** (at -7.874 -5.842) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value he10-14d (at 8.382 5.842) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -18.796 -4.318) (end 18.542 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.542 -4.318) (end 18.542 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.542 4.318) (end -18.796 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 4.318) (end -2.54 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 3.556) (end -11.43 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.43 3.556) (end -11.43 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.43 -3.556) (end 11.43 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.43 -3.556) (end 11.43 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.43 3.556) (end 2.54 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 3.556) (end 2.54 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -18.796 4.318) (end -18.796 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -9.144 1.27) (end -10.414 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.414 0.508) (end -10.414 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.414 2.032) (end -9.144 1.27) (layer F.SilkS) (width 0.15)) + (pad 0 thru_hole circle (at -16.51 0) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) + (pad 0 thru_hole circle (at 16.51 0) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at -7.62 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -7.62 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -5.08 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -5.08 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -2.54 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -2.54 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 0 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 0 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at 2.54 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at 2.54 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at 5.08 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at 5.08 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at 7.62 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at 7.62 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/he10-16c.kicad_mod b/PCB/.pretty/he10-16c.kicad_mod new file mode 100644 index 00000000..1c2eac4d --- /dev/null +++ b/PCB/.pretty/he10-16c.kicad_mod @@ -0,0 +1,50 @@ +(module he10-16c (layer F.Cu) (tedit 0) + (descr "Connecteur HE10 16 contacts couche") + (tags "CONN HE10") + (fp_text reference REF** (at 0 3.81) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value he10-16c (at -1.27 7.62) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -12.446 -2.54) (end -12.446 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.446 2.032) (end -13.716 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -13.716 3.302) (end -15.748 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.748 3.302) (end -17.018 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -17.018 2.032) (end -17.018 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.018 -2.54) (end 17.018 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start 17.018 2.032) (end 15.748 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.748 3.302) (end 13.716 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 13.716 3.302) (end 12.446 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.446 2.032) (end 12.446 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.05 -2.54) (end -19.05 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.05 4.445) (end -15.875 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start -15.875 14.605) (end -12.065 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.065 14.605) (end -10.16 10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.05 -2.54) (end 19.05 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.05 -2.54) (end 19.05 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.05 4.445) (end 15.875 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.875 14.605) (end 12.065 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.16 10.16) (end 9.906 10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.065 14.605) (end 9.906 10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.636 10.16) (end 7.62 8.128) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 8.128) (end 6.604 10.16) (layer F.SilkS) (width 0.15)) + (pad 0 thru_hole circle (at -14.732 0.508) (size 3.048 3.048) (drill 2.54) (layers *.Cu *.Mask F.SilkS)) + (pad 0 thru_hole circle (at 14.732 0.508) (size 3.048 3.048) (drill 2.54) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at 8.89 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 8.89 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 6.35 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 6.35 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 3.81 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 3.81 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 1.27 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 1.27 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -1.27 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at -1.27 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at -3.81 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at -3.81 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at -6.35 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at -6.35 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at -8.89 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at -8.89 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/he10-16d.kicad_mod b/PCB/.pretty/he10-16d.kicad_mod new file mode 100644 index 00000000..a52f4114 --- /dev/null +++ b/PCB/.pretty/he10-16d.kicad_mod @@ -0,0 +1,42 @@ +(module he10-16d (layer F.Cu) (tedit 0) + (descr "Connecteur HE10 16 contacts droit") + (tags "CONN HE10") + (fp_text reference REF** (at -5.588 -6.096) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value he10-16d (at 12.7 6.096) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.54 4.318) (end -2.54 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.54 3.556) (end -12.7 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.7 3.556) (end -12.7 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.7 -3.556) (end 12.7 -3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.7 -3.556) (end 12.7 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 12.7 3.556) (end 2.54 3.556) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 3.556) (end 2.54 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.812 4.318) (end -19.812 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.812 -4.318) (end 19.812 -4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.812 -4.318) (end 19.812 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.812 4.318) (end -19.812 4.318) (layer F.SilkS) (width 0.15)) + (fp_line (start -10.414 1.27) (end -11.684 0.508) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.684 0.508) (end -11.684 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -11.684 2.032) (end -10.414 1.27) (layer F.SilkS) (width 0.15)) + (pad 0 thru_hole circle (at -17.78 0) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) + (pad 0 thru_hole circle (at 17.78 0) (size 5.461 5.461) (drill 2.6924) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at -8.89 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -8.89 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -6.35 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -6.35 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -3.81 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -3.81 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -1.27 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -1.27 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at 1.27 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at 1.27 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at 3.81 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at 3.81 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at 6.35 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at 6.35 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at 8.89 1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at 8.89 -1.27) (size 1.524 1.524) (drill 0.9144) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/he10-20c.kicad_mod b/PCB/.pretty/he10-20c.kicad_mod new file mode 100644 index 00000000..3376b648 --- /dev/null +++ b/PCB/.pretty/he10-20c.kicad_mod @@ -0,0 +1,54 @@ +(module he10-20c (layer F.Cu) (tedit 0) + (descr "Connecteur HE10 20 contacts couche") + (tags "CONN HE10") + (fp_text reference REF** (at 0 3.81) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value he10-20c (at -1.27 7.62) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -14.986 -2.54) (end -14.986 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -14.986 2.032) (end -16.256 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -16.256 3.302) (end -18.288 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -18.288 3.302) (end -19.558 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -19.558 2.032) (end -19.558 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.558 -2.54) (end 19.558 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start 19.558 2.032) (end 18.288 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.288 3.302) (end 16.256 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.256 3.302) (end 14.986 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.986 2.032) (end 14.986 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -21.59 -2.54) (end -21.59 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -21.59 4.445) (end -18.415 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start -18.415 14.605) (end -14.605 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start -14.605 14.605) (end -12.7 10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start -21.59 -2.54) (end 21.59 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 21.59 -2.54) (end 21.59 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 21.59 4.445) (end 18.415 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.415 14.605) (end 14.605 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start -12.7 10.16) (end 12.573 10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.605 14.605) (end 12.573 10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start 11.43 10.16) (end 10.414 8.128) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.414 8.128) (end 9.398 10.16) (layer F.SilkS) (width 0.15)) + (pad 0 thru_hole circle (at -17.272 0.508) (size 3.048 3.048) (drill 2.54) (layers *.Cu *.Mask F.SilkS)) + (pad 0 thru_hole circle (at 17.272 0.508) (size 3.048 3.048) (drill 2.54) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at 11.43 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.SilkS *.Mask)) + (pad 2 thru_hole circle (at 11.43 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 8.89 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 8.89 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 6.35 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 6.35 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 3.81 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 3.81 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at 1.27 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at 1.27 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at -1.27 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at -1.27 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at -3.81 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at -3.81 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at -6.35 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at -6.35 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at -8.89 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at -8.89 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at -11.43 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at -11.43 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/he10-26c.kicad_mod b/PCB/.pretty/he10-26c.kicad_mod new file mode 100644 index 00000000..7036b938 --- /dev/null +++ b/PCB/.pretty/he10-26c.kicad_mod @@ -0,0 +1,60 @@ +(module he10-26c (layer F.Cu) (tedit 0) + (descr "Connecteur HE10 26 contacts couche") + (tags "CONN HE10") + (fp_text reference REF** (at -0.508 4.572) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value he10-26c (at -2.54 8.128) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -18.796 -2.54) (end -18.796 1.778) (layer F.SilkS) (width 0.15)) + (fp_line (start -18.796 1.778) (end -20.066 3.048) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.066 3.048) (end -22.098 3.048) (layer F.SilkS) (width 0.15)) + (fp_line (start -22.098 3.048) (end -23.368 1.778) (layer F.SilkS) (width 0.15)) + (fp_line (start -23.368 1.778) (end -23.368 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 23.368 -2.54) (end 23.368 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start 23.368 2.032) (end 22.098 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 22.098 3.302) (end 20.066 3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 20.066 3.302) (end 18.796 2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.796 2.032) (end 18.796 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -25.4 -2.54) (end -25.4 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -25.4 4.445) (end -22.225 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start -22.225 14.605) (end -18.415 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start -18.415 14.605) (end -16.51 10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start -25.4 -2.54) (end 25.4 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 25.4 -2.54) (end 25.4 4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 25.4 4.445) (end 22.225 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start 22.225 14.605) (end 18.415 14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start 16.256 10.16) (end -16.51 10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start 18.415 14.605) (end 16.256 10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start 15.113 10.16) (end 14.097 8.128) (layer F.SilkS) (width 0.15)) + (fp_line (start 14.097 8.128) (end 13.081 10.16) (layer F.SilkS) (width 0.15)) + (pad 0 thru_hole circle (at -21.082 0.508) (size 3.048 3.048) (drill 2.54) (layers *.Cu *.Mask F.SilkS)) + (pad 0 thru_hole circle (at 21.082 0.508) (size 3.048 3.048) (drill 2.54) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at 15.24 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at 15.24 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 12.7 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at 12.7 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at 10.16 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at 10.16 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at 7.62 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at 7.62 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at 5.08 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at 5.08 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at 2.54 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at 2.54 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at 0 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at 0 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at -2.54 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at -2.54 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at -5.08 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at -5.08 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at -7.62 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at -7.62 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 21 thru_hole circle (at -10.16 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 22 thru_hole circle (at -10.16 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 23 thru_hole circle (at -12.7 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 24 thru_hole circle (at -12.7 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 25 thru_hole circle (at -15.24 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 26 thru_hole circle (at -15.24 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/he10-34c.kicad_mod b/PCB/.pretty/he10-34c.kicad_mod new file mode 100644 index 00000000..947d5ed3 --- /dev/null +++ b/PCB/.pretty/he10-34c.kicad_mod @@ -0,0 +1,68 @@ +(module he10-34c (layer F.Cu) (tedit 0) + (descr "Connecteur HE10 34 contacts couche") + (tags "CONN HE10") + (fp_text reference REF** (at -15.24 -5.08) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value he10-34c (at 12.7 -5.08) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 23.876 -2.032) (end 25.146 -3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 25.146 -3.302) (end 27.178 -3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 27.178 -3.302) (end 28.448 -2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -28.448 -2.032) (end -27.178 -3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -27.178 -3.302) (end -25.146 -3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -25.146 -3.302) (end -23.876 -2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -23.876 2.54) (end -23.876 -2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -31.115 2.54) (end 31.115 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 31.115 2.54) (end 31.115 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 31.115 -4.445) (end 28.575 -14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start -31.115 -4.445) (end -31.115 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -28.575 -14.605) (end -31.115 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -28.448 2.54) (end -28.448 -2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start 23.876 2.54) (end 23.876 -2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start 28.448 -2.032) (end 28.448 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -21.59 -10.16) (end -20.32 -7.62) (layer F.SilkS) (width 0.15)) + (fp_line (start -20.32 -7.62) (end -19.05 -10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start -23.495 -10.16) (end 23.495 -10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start -28.575 -14.605) (end -24.765 -14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start -24.765 -14.605) (end -23.495 -10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start 28.575 -14.605) (end 24.765 -14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start 24.765 -14.605) (end 23.495 -10.16) (layer F.SilkS) (width 0.15)) + (pad 0 thru_hole circle (at -26.162 -0.508) (size 3.048 3.048) (drill 2.54) (layers *.Cu *.Mask F.SilkS)) + (pad 0 thru_hole circle (at 26.162 -0.508) (size 3.048 3.048) (drill 2.54) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at -20.32 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -20.32 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -17.78 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -17.78 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -15.24 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -15.24 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -12.7 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -12.7 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -10.16 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at -10.16 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at -7.62 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at -7.62 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at -5.08 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at -5.08 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at -2.54 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at -2.54 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at 0 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at 0 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at 2.54 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at 2.54 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 21 thru_hole circle (at 5.08 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 22 thru_hole circle (at 5.08 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 23 thru_hole circle (at 7.62 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 24 thru_hole circle (at 7.62 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 25 thru_hole circle (at 10.16 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 26 thru_hole circle (at 10.16 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 27 thru_hole circle (at 12.7 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 28 thru_hole circle (at 12.7 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 29 thru_hole circle (at 15.24 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 30 thru_hole circle (at 15.24 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 31 thru_hole circle (at 17.78 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 32 thru_hole circle (at 17.78 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 33 thru_hole circle (at 20.32 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 34 thru_hole circle (at 20.32 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/.pretty/he10-40c.kicad_mod b/PCB/.pretty/he10-40c.kicad_mod new file mode 100644 index 00000000..af3407e6 --- /dev/null +++ b/PCB/.pretty/he10-40c.kicad_mod @@ -0,0 +1,74 @@ +(module he10-40c (layer F.Cu) (tedit 0) + (descr "Connecteur HE10 40 contacts couche") + (tags "CONN HE10") + (fp_text reference REF** (at -16.51 -5.08) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value he10-40c (at 15.24 -5.08) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 32.258 -2.032) (end 32.258 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 27.686 -2.032) (end 28.956 -3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 28.956 -3.302) (end 30.988 -3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start 30.988 -3.302) (end 32.258 -2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -32.258 -2.032) (end -30.988 -3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -30.988 -3.302) (end -28.956 -3.302) (layer F.SilkS) (width 0.15)) + (fp_line (start -28.956 -3.302) (end -27.686 -2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -34.925 2.54) (end 34.925 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 34.925 2.54) (end 34.925 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start 34.925 -4.445) (end 32.385 -14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start -32.385 -14.605) (end -34.925 -4.445) (layer F.SilkS) (width 0.15)) + (fp_line (start -34.925 -4.445) (end -34.925 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -32.258 2.54) (end -32.258 -2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -27.686 -2.032) (end -27.686 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 27.686 2.54) (end 27.686 -2.032) (layer F.SilkS) (width 0.15)) + (fp_line (start -25.4 -10.16) (end -24.13 -7.62) (layer F.SilkS) (width 0.15)) + (fp_line (start -24.13 -7.62) (end -22.86 -10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start 27.305 -10.16) (end -27.305 -10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start -32.385 -14.605) (end -28.575 -14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start -28.575 -14.605) (end -27.305 -10.16) (layer F.SilkS) (width 0.15)) + (fp_line (start 32.385 -14.605) (end 28.575 -14.605) (layer F.SilkS) (width 0.15)) + (fp_line (start 28.575 -14.605) (end 27.305 -10.16) (layer F.SilkS) (width 0.15)) + (pad 0 thru_hole circle (at -29.972 -0.508) (size 3.048 3.048) (drill 2.54) (layers *.Cu *.Mask F.SilkS)) + (pad 0 thru_hole circle (at 29.972 -0.508) (size 3.048 3.048) (drill 2.54) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole rect (at -24.13 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole circle (at -24.13 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at -21.59 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -21.59 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 5 thru_hole circle (at -19.05 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 6 thru_hole circle (at -19.05 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 7 thru_hole circle (at -16.51 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 8 thru_hole circle (at -16.51 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 9 thru_hole circle (at -13.97 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 10 thru_hole circle (at -13.97 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 11 thru_hole circle (at -11.43 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 12 thru_hole circle (at -11.43 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 13 thru_hole circle (at -8.89 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 14 thru_hole circle (at -8.89 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 15 thru_hole circle (at -6.35 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 16 thru_hole circle (at -6.35 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 17 thru_hole circle (at -3.81 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 18 thru_hole circle (at -3.81 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 19 thru_hole circle (at -1.27 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 20 thru_hole circle (at -1.27 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 21 thru_hole circle (at 1.27 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 22 thru_hole circle (at 1.27 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 23 thru_hole circle (at 3.81 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 24 thru_hole circle (at 3.81 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 25 thru_hole circle (at 6.35 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 26 thru_hole circle (at 6.35 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 27 thru_hole circle (at 8.89 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 28 thru_hole circle (at 8.89 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 29 thru_hole circle (at 11.43 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 30 thru_hole circle (at 11.43 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 31 thru_hole circle (at 13.97 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 32 thru_hole circle (at 13.97 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 33 thru_hole circle (at 16.51 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 34 thru_hole circle (at 16.51 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 35 thru_hole circle (at 19.05 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 36 thru_hole circle (at 19.05 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 37 thru_hole circle (at 21.59 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 38 thru_hole circle (at 21.59 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 39 thru_hole circle (at 24.13 1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 40 thru_hole circle (at 24.13 -1.27) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) +) diff --git a/PCB/BACKUP_OLD_PCB b/PCB/BACKUP_OLD_PCB new file mode 100644 index 00000000..5cc153bd --- /dev/null +++ b/PCB/BACKUP_OLD_PCB @@ -0,0 +1,1874 @@ +(kicad_pcb (version 4) (host pcbnew "(2015-08-05 BZR 6055, Git fa29c62)-product") + + (general + (links 92) + (no_connects 92) + (area 57.15 53.264999 240.105001 147.395001) + (thickness 1.6) + (drawings 4) + (tracks 0) + (zones 0) + (modules 47) + (nets 69) + ) + + (page A4) + (layers + (0 F.Cu mixed) + (31 B.Cu mixed) + (32 B.Adhes user) + (33 F.Adhes user) + (34 B.Paste user) + (35 F.Paste user) + (36 B.SilkS user) + (37 F.SilkS user) + (38 B.Mask user) + (39 F.Mask user) + (40 Dwgs.User user) + (41 Cmts.User user) + (42 Eco1.User user) + (43 Eco2.User user) + (44 Edge.Cuts user) + (45 Margin user) + (46 B.CrtYd user) + (47 F.CrtYd user) + (48 B.Fab user) + (49 F.Fab user) + ) + + (setup + (last_trace_width 0.25) + (trace_clearance 0.2) + (zone_clearance 0.508) + (zone_45_only no) + (trace_min 0.2) + (segment_width 0.2) + (edge_width 0.15) + (via_size 0.6) + (via_drill 0.4) + (via_min_size 0.4) + (via_min_drill 0.3) + (uvia_size 0.3) + (uvia_drill 0.1) + (uvias_allowed no) + (uvia_min_size 0.2) + (uvia_min_drill 0.1) + (pcb_text_width 0.3) + (pcb_text_size 1.5 1.5) + (mod_edge_width 0.15) + (mod_text_size 1 1) + (mod_text_width 0.15) + (pad_size 1.524 1.524) + (pad_drill 0.762) + (pad_to_mask_clearance 0.2) + (aux_axis_origin 0 0) + (visible_elements 7FFFF7FF) + (pcbplotparams + (layerselection 0x00030_80000001) + (usegerberextensions false) + (excludeedgelayer true) + (linewidth 0.100000) + (plotframeref false) + (viasonmask false) + (mode 1) + (useauxorigin false) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15) + (hpglpenoverlay 2) + (psnegative false) + (psa4output false) + (plotreference true) + (plotvalue true) + (plotinvisibletext false) + (padsonsilk false) + (subtractmaskfromsilk false) + (outputformat 1) + (mirror false) + (drillshape 1) + (scaleselection 1) + (outputdirectory "")) + ) + + (net 0 "") + (net 1 "Net-(C1-Pad1)") + (net 2 "Net-(C1-Pad2)") + (net 3 "Net-(C2-Pad1)") + (net 4 "Net-(C2-Pad2)") + (net 5 +5V) + (net 6 GND) + (net 7 /VCC_3V3) + (net 8 /AVCC) + (net 9 /AGND) + (net 10 "Net-(C6-Pad1)") + (net 11 "Net-(C7-Pad1)") + (net 12 "Net-(C7-Pad2)") + (net 13 /LM324_VCC) + (net 14 /VGND) + (net 15 /VSENSE_OCP) + (net 16 "Net-(C9-Pad1)") + (net 17 "Net-(IC1-Pad1)") + (net 18 "Net-(IC1-Pad2)") + (net 19 "Net-(IC1-Pad3)") + (net 20 "Net-(IC1-Pad4)") + (net 21 "Net-(IC1-Pad5)") + (net 22 /DAC_OUT) + (net 23 "Net-(IC1-Pad7)") + (net 24 "Net-(IC1-Pad10)") + (net 25 /XCK) + (net 26 /DIG_CH2) + (net 27 "Net-(IC1-Pad13)") + (net 28 "Net-(IC1-Pad16)") + (net 29 /DIG_CH1) + (net 30 "Net-(IC1-Pad20)") + (net 31 "Net-(IC1-Pad21)") + (net 32 "Net-(IC1-Pad22)") + (net 33 "Net-(IC1-Pad23)") + (net 34 /PSU_PWM) + (net 35 "Net-(IC1-Pad25)") + (net 36 /D-) + (net 37 /D+) + (net 38 "Net-(IC1-Pad28)") + (net 39 "Net-(IC1-Pad29)") + (net 40 "Net-(IC1-Pad32)") + (net 41 "Net-(IC1-Pad33)") + (net 42 "Net-(IC1-Pad34)") + (net 43 "Net-(IC1-Pad35)") + (net 44 "Net-(IC1-Pad36)") + (net 45 "Net-(IC1-Pad37)") + (net 46 /CH1) + (net 47 /CH2) + (net 48 /AVCC_ON_2) + (net 49 "Net-(P2-Pad4)") + (net 50 "Net-(P3-Pad1)") + (net 51 "Net-(P3-Pad2)") + (net 52 "Net-(P3-Pad3)") + (net 53 "Net-(P3-Pad4)") + (net 54 +12V) + (net 55 "Net-(P4-Pad3)") + (net 56 "Net-(P8-Pad1)") + (net 57 "Net-(P8-Pad2)") + (net 58 "Net-(R1-Pad1)") + (net 59 "Net-(R2-Pad1)") + (net 60 "Net-(R11-Pad2)") + (net 61 "Net-(R12-Pad2)") + (net 62 "Net-(R13-Pad2)") + (net 63 "Net-(R10-Pad1)") + (net 64 "Net-(R16-Pad1)") + (net 65 "Net-(R18-Pad1)") + (net 66 "Net-(R18-Pad2)") + (net 67 "Net-(R21-Pad1)") + (net 68 "Net-(R22-Pad1)") + + (net_class Default "This is the default net class." + (clearance 0.2) + (trace_width 0.25) + (via_dia 0.6) + (via_drill 0.4) + (uvia_dia 0.3) + (uvia_drill 0.1) + (add_net +12V) + (add_net +5V) + (add_net /AGND) + (add_net /AVCC) + (add_net /AVCC_ON_2) + (add_net /CH1) + (add_net /CH2) + (add_net /D+) + (add_net /D-) + (add_net /DAC_OUT) + (add_net /DIG_CH1) + (add_net /DIG_CH2) + (add_net /LM324_VCC) + (add_net /PSU_PWM) + (add_net /VCC_3V3) + (add_net /VGND) + (add_net /VSENSE_OCP) + (add_net /XCK) + (add_net GND) + (add_net "Net-(C1-Pad1)") + (add_net "Net-(C1-Pad2)") + (add_net "Net-(C2-Pad1)") + (add_net "Net-(C2-Pad2)") + (add_net "Net-(C6-Pad1)") + (add_net "Net-(C7-Pad1)") + (add_net "Net-(C7-Pad2)") + (add_net "Net-(C9-Pad1)") + (add_net "Net-(IC1-Pad1)") + (add_net "Net-(IC1-Pad10)") + (add_net "Net-(IC1-Pad13)") + (add_net "Net-(IC1-Pad16)") + (add_net "Net-(IC1-Pad2)") + (add_net "Net-(IC1-Pad20)") + (add_net "Net-(IC1-Pad21)") + (add_net "Net-(IC1-Pad22)") + (add_net "Net-(IC1-Pad23)") + (add_net "Net-(IC1-Pad25)") + (add_net "Net-(IC1-Pad28)") + (add_net "Net-(IC1-Pad29)") + (add_net "Net-(IC1-Pad3)") + (add_net "Net-(IC1-Pad32)") + (add_net "Net-(IC1-Pad33)") + (add_net "Net-(IC1-Pad34)") + (add_net "Net-(IC1-Pad35)") + (add_net "Net-(IC1-Pad36)") + (add_net "Net-(IC1-Pad37)") + (add_net "Net-(IC1-Pad4)") + (add_net "Net-(IC1-Pad5)") + (add_net "Net-(IC1-Pad7)") + (add_net "Net-(P2-Pad4)") + (add_net "Net-(P3-Pad1)") + (add_net "Net-(P3-Pad2)") + (add_net "Net-(P3-Pad3)") + (add_net "Net-(P3-Pad4)") + (add_net "Net-(P4-Pad3)") + (add_net "Net-(P8-Pad1)") + (add_net "Net-(P8-Pad2)") + (add_net "Net-(R1-Pad1)") + (add_net "Net-(R10-Pad1)") + (add_net "Net-(R11-Pad2)") + (add_net "Net-(R12-Pad2)") + (add_net "Net-(R13-Pad2)") + (add_net "Net-(R16-Pad1)") + (add_net "Net-(R18-Pad1)") + (add_net "Net-(R18-Pad2)") + (add_net "Net-(R2-Pad1)") + (add_net "Net-(R21-Pad1)") + (add_net "Net-(R22-Pad1)") + ) + + (module Capacitors_SMD:C_1812_HandSoldering (layer F.Cu) (tedit 541A9C88) (tstamp 55D58AED) + (at 154.875001 101.445) + (descr "Capacitor SMD 1812, hand soldering") + (tags "capacitor 1812") + (path /55CAB611) + (attr smd) + (fp_text reference C1 (at 0 -3) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 3) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.3 -1.85) (end 4.3 -1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3 1.85) (end 4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3 -1.85) (end -4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.85) (end 4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.8 -1.725) (end -1.8 -1.725) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.8 1.725) (end 1.8 1.725) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2.9 0) (size 2.2 3) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (pad 2 smd rect (at 2.9 0) (size 2.2 3) (layers F.Cu F.Paste F.Mask) + (net 2 "Net-(C1-Pad2)")) + (model Capacitors_SMD.3dshapes/C_1812_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_1812 (layer F.Cu) (tedit 5415D8C7) (tstamp 55D58AF9) + (at 157.525001 117.645) + (descr "Capacitor SMD 1812, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 1812") + (path /55CAB4DE) + (attr smd) + (fp_text reference C2 (at 0 -3) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 3) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.1 -1.85) (end 3.1 -1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.1 1.85) (end 3.1 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.1 -1.85) (end -3.1 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.1 -1.85) (end 3.1 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.8 -1.725) (end -1.8 -1.725) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.8 1.725) (end 1.8 1.725) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2.3 0) (size 1 3) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (pad 2 smd rect (at 2.3 0) (size 1 3) (layers F.Cu F.Paste F.Mask) + (net 4 "Net-(C2-Pad2)")) + (model Capacitors_SMD.3dshapes/C_1812.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_1812_HandSoldering (layer F.Cu) (tedit 541A9C88) (tstamp 55D58B05) + (at 119.38 132.08) + (descr "Capacitor SMD 1812, hand soldering") + (tags "capacitor 1812") + (path /55CB13E1) + (attr smd) + (fp_text reference C3 (at 0 -3) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 3) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.3 -1.85) (end 4.3 -1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3 1.85) (end 4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3 -1.85) (end -4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.85) (end 4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.8 -1.725) (end -1.8 -1.725) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.8 1.725) (end 1.8 1.725) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2.9 0) (size 2.2 3) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at 2.9 0) (size 2.2 3) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (model Capacitors_SMD.3dshapes/C_1812_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_1812_HandSoldering (layer F.Cu) (tedit 541A9C88) (tstamp 55D58B11) + (at 138.735001 116.695) + (descr "Capacitor SMD 1812, hand soldering") + (tags "capacitor 1812") + (path /55CB147C) + (attr smd) + (fp_text reference C4 (at 0 -3) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 3) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.3 -1.85) (end 4.3 -1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3 1.85) (end 4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3 -1.85) (end -4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.85) (end 4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.8 -1.725) (end -1.8 -1.725) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.8 1.725) (end 1.8 1.725) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2.9 0) (size 2.2 3) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 2 smd rect (at 2.9 0) (size 2.2 3) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (model Capacitors_SMD.3dshapes/C_1812_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_1812_HandSoldering (layer F.Cu) (tedit 541A9C88) (tstamp 55D58B1D) + (at 149.675001 124.795) + (descr "Capacitor SMD 1812, hand soldering") + (tags "capacitor 1812") + (path /55D60181) + (attr smd) + (fp_text reference C5 (at 0 -3) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 3) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.3 -1.85) (end 4.3 -1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3 1.85) (end 4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3 -1.85) (end -4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.85) (end 4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.8 -1.725) (end -1.8 -1.725) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.8 1.725) (end 1.8 1.725) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2.9 0) (size 2.2 3) (layers F.Cu F.Paste F.Mask) + (net 8 /AVCC)) + (pad 2 smd rect (at 2.9 0) (size 2.2 3) (layers F.Cu F.Paste F.Mask) + (net 9 /AGND)) + (model Capacitors_SMD.3dshapes/C_1812_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_1812_HandSoldering (layer F.Cu) (tedit 541A9C88) (tstamp 55D58B29) + (at 156.845 109.855) + (descr "Capacitor SMD 1812, hand soldering") + (tags "capacitor 1812") + (path /55CC1A1C) + (attr smd) + (fp_text reference C6 (at 0 -3) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 3) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.3 -1.85) (end 4.3 -1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3 1.85) (end 4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3 -1.85) (end -4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.85) (end 4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.8 -1.725) (end -1.8 -1.725) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.8 1.725) (end 1.8 1.725) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2.9 0) (size 2.2 3) (layers F.Cu F.Paste F.Mask) + (net 10 "Net-(C6-Pad1)")) + (pad 2 smd rect (at 2.9 0) (size 2.2 3) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (model Capacitors_SMD.3dshapes/C_1812_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_1812_HandSoldering (layer F.Cu) (tedit 541A9C88) (tstamp 55D58B35) + (at 140.625001 124.795) + (descr "Capacitor SMD 1812, hand soldering") + (tags "capacitor 1812") + (path /55CB630B) + (attr smd) + (fp_text reference C7 (at 0 -3) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 3) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.3 -1.85) (end 4.3 -1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3 1.85) (end 4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3 -1.85) (end -4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.85) (end 4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.8 -1.725) (end -1.8 -1.725) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.8 1.725) (end 1.8 1.725) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2.9 0) (size 2.2 3) (layers F.Cu F.Paste F.Mask) + (net 11 "Net-(C7-Pad1)")) + (pad 2 smd rect (at 2.9 0) (size 2.2 3) (layers F.Cu F.Paste F.Mask) + (net 12 "Net-(C7-Pad2)")) + (model Capacitors_SMD.3dshapes/C_1812_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_1812_HandSoldering (layer F.Cu) (tedit 541A9C88) (tstamp 55D58B41) + (at 147.785001 116.695) + (descr "Capacitor SMD 1812, hand soldering") + (tags "capacitor 1812") + (path /55D75F49) + (attr smd) + (fp_text reference C8 (at 0 -3) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 3) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.3 -1.85) (end 4.3 -1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3 1.85) (end 4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3 -1.85) (end -4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.85) (end 4.3 1.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.8 -1.725) (end -1.8 -1.725) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.8 1.725) (end 1.8 1.725) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2.9 0) (size 2.2 3) (layers F.Cu F.Paste F.Mask) + (net 13 /LM324_VCC)) + (pad 2 smd rect (at 2.9 0) (size 2.2 3) (layers F.Cu F.Paste F.Mask) + (net 14 /VGND)) + (model Capacitors_SMD.3dshapes/C_1812_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_Elko_ThroughHole:Elko_vert_11.2x6.3mm_RM2.5_CopperClear (layer F.Cu) (tedit 5454A12B) (tstamp 55D58B4D) + (at 209.55 83.82 270) + (descr "Electrolytic Capacitor, vertical, diameter 6,3mm, RM 2,5mm, CopperClear, radial,") + (tags "Electrolytic Capacitor, vertical, diameter 6,3mm, RM 2,5mm, Elko, Electrolytkondensator, Kondensator gepolt, Durchmesser 6,3mm, CopperClear, radial,") + (path /55CC64C3) + (fp_text reference C9 (at 1.27 -5.08 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.27 5.08 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 0.26924 -1.69926) (end 0.76962 -1.69926) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.26924 -1.69926) (end 0.26924 -2.19964) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.23114 -1.69926) (end 0.26924 -1.69926) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.26924 -1.69926) (end 0.26924 -1.30048) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.26924 -1.30048) (end 0.26924 -1.19888) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.27 0) (end 4.4196 0) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at 2.54 0 270) (size 1.50114 1.50114) (drill 0.8001) (layers *.Cu *.Mask F.SilkS) + (net 15 /VSENSE_OCP)) + (pad 1 thru_hole circle (at 0 0 270) (size 1.50114 1.50114) (drill 0.8001) (layers *.Cu *.Mask F.SilkS) + (net 16 "Net-(C9-Pad1)")) + (model Capacitors_Elko_ThroughHole.3dshapes/Elko_vert_11.2x6.3mm_RM2.5_CopperClear.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58B59) + (at 120.65 88.9) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55D739F3) + (attr smd) + (fp_text reference F1 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value F_Small (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 14 /VGND)) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm (layer F.Cu) (tedit 54130A77) (tstamp 55D58B96) + (at 111.76 107.95 270) + (descr "LQFP44 (see Appnote_PCB_Guidelines_TRINAMIC_packages.pdf)") + (tags "QFP 0.8") + (path /55CA8F25) + (attr smd) + (fp_text reference IC1 (at 0 -7.65 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value ATXMEGA16A4U-A (at 0 7.65 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -6.9 -6.9) (end -6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start 6.9 -6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 -6.9) (end 6.9 -6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.175 -5.175) (end -5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -5.175) (end -4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -4.505) (end -6.65 -4.505) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -5.85 -4 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 17 "Net-(IC1-Pad1)")) + (pad 2 smd rect (at -5.85 -3.2 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 18 "Net-(IC1-Pad2)")) + (pad 3 smd rect (at -5.85 -2.4 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 19 "Net-(IC1-Pad3)")) + (pad 4 smd rect (at -5.85 -1.6 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 20 "Net-(IC1-Pad4)")) + (pad 5 smd rect (at -5.85 -0.8 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 21 "Net-(IC1-Pad5)")) + (pad 6 smd rect (at -5.85 0 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 22 /DAC_OUT)) + (pad 7 smd rect (at -5.85 0.8 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 23 "Net-(IC1-Pad7)")) + (pad 8 smd rect (at -5.85 1.6 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 9 smd rect (at -5.85 2.4 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 10 smd rect (at -5.85 3.2 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 24 "Net-(IC1-Pad10)")) + (pad 11 smd rect (at -5.85 4 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 25 /XCK)) + (pad 12 smd rect (at -4 5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 26 /DIG_CH2)) + (pad 13 smd rect (at -3.2 5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 27 "Net-(IC1-Pad13)")) + (pad 14 smd rect (at -2.4 5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 15 smd rect (at -1.6 5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 25 /XCK)) + (pad 16 smd rect (at -0.8 5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 28 "Net-(IC1-Pad16)")) + (pad 17 smd rect (at 0 5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 29 /DIG_CH1)) + (pad 18 smd rect (at 0.8 5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 19 smd rect (at 1.6 5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 20 smd rect (at 2.4 5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 30 "Net-(IC1-Pad20)")) + (pad 21 smd rect (at 3.2 5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 31 "Net-(IC1-Pad21)")) + (pad 22 smd rect (at 4 5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 32 "Net-(IC1-Pad22)")) + (pad 23 smd rect (at 5.85 4 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 33 "Net-(IC1-Pad23)")) + (pad 24 smd rect (at 5.85 3.2 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 34 /PSU_PWM)) + (pad 25 smd rect (at 5.85 2.4 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 35 "Net-(IC1-Pad25)")) + (pad 26 smd rect (at 5.85 1.6 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 36 /D-)) + (pad 27 smd rect (at 5.85 0.8 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 37 /D+)) + (pad 28 smd rect (at 5.85 0 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 38 "Net-(IC1-Pad28)")) + (pad 29 smd rect (at 5.85 -0.8 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 39 "Net-(IC1-Pad29)")) + (pad 30 smd rect (at 5.85 -1.6 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 31 smd rect (at 5.85 -2.4 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 32 smd rect (at 5.85 -3.2 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 40 "Net-(IC1-Pad32)")) + (pad 33 smd rect (at 5.85 -4 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 41 "Net-(IC1-Pad33)")) + (pad 34 smd rect (at 4 -5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 42 "Net-(IC1-Pad34)")) + (pad 35 smd rect (at 3.2 -5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 43 "Net-(IC1-Pad35)")) + (pad 36 smd rect (at 2.4 -5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 44 "Net-(IC1-Pad36)")) + (pad 37 smd rect (at 1.6 -5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 45 "Net-(IC1-Pad37)")) + (pad 38 smd rect (at 0.8 -5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 9 /AGND)) + (pad 39 smd rect (at 0 -5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 8 /AVCC)) + (pad 40 smd rect (at -0.8 -5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 46 /CH1)) + (pad 41 smd rect (at -1.6 -5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 15 /VSENSE_OCP)) + (pad 42 smd rect (at -2.4 -5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 47 /CH2)) + (pad 43 smd rect (at -3.2 -5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 14 /VGND)) + (pad 44 smd rect (at -4 -5.85) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 48 /AVCC_ON_2)) + (model Housings_QFP.3dshapes/LQFP-44_10x10mm_Pitch0.8mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 (layer F.Cu) (tedit 0) (tstamp 55D58BA9) + (at 75.270238 91.445) + (descr "Through hole pin header") + (tags "pin header") + (path /55CAB35C) + (fp_text reference P1 (at 0 -5.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SCOPE_IN (at 0 -3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 3 "Net-(C2-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 4 "Net-(C2-Pad2)")) + (pad 3 thru_hole oval (at 0 5.08) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 2 "Net-(C1-Pad2)")) + (pad 4 thru_hole oval (at 0 7.62) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 1 "Net-(C1-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Connect:USB_Micro-B (layer F.Cu) (tedit 5543E447) (tstamp 55D58BBF) + (at 86.995 85.09 270) + (descr "Micro USB Type B Receptacle") + (tags "USB USB_B USB_micro USB_OTG") + (path /55CA90D2) + (attr smd) + (fp_text reference P2 (at 0 -3.45 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value USB_OTG (at 0 4.8 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.6 -2.8) (end 4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 -2.8) (end 4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 4.05) (end -4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.6 4.05) (end -4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3509 3.81746) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 -2.58754) (end 4.3491 -2.58754) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 -2.58754) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 2.58746) (end -4.3509 2.58746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 3.81746) (end -4.3509 -2.58754) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.3009 -1.56254) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 2 smd rect (at -0.6509 -1.56254) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 36 /D-)) + (pad 3 smd rect (at -0.0009 -1.56254) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 37 /D+)) + (pad 4 smd rect (at 0.6491 -1.56254) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 49 "Net-(P2-Pad4)")) + (pad 5 smd rect (at 1.2991 -1.56254) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 6 thru_hole oval (at -2.5009 -1.56254) (size 0.95 1.25) (drill oval 0.55 0.85) (layers *.Cu *.Mask F.SilkS) + (net 5 +5V)) + (pad 6 thru_hole oval (at 2.4991 -1.56254) (size 0.95 1.25) (drill oval 0.55 0.85) (layers *.Cu *.Mask F.SilkS) + (net 5 +5V)) + (pad 6 thru_hole oval (at -3.5009 1.13746) (size 1.55 1) (drill oval 1.15 0.5) (layers *.Cu *.Mask F.SilkS) + (net 5 +5V)) + (pad 6 thru_hole oval (at 3.4991 1.13746) (size 1.55 1) (drill oval 1.15 0.5) (layers *.Cu *.Mask F.SilkS) + (net 5 +5V)) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 (layer F.Cu) (tedit 0) (tstamp 55D58BD2) + (at 180.34 143.51 90) + (descr "Through hole pin header") + (tags "pin header") + (path /55CBF4D5) + (fp_text reference P3 (at 0 -5.1 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DIG_OUT (at 0 -3.1 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 90) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 50 "Net-(P3-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 90) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 51 "Net-(P3-Pad2)")) + (pad 3 thru_hole oval (at 0 5.08 90) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 52 "Net-(P3-Pad3)")) + (pad 4 thru_hole oval (at 0 7.62 90) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 53 "Net-(P3-Pad4)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x03 (layer F.Cu) (tedit 0) (tstamp 55D58BE4) + (at 190.5 77.47) + (descr "Through hole pin header") + (tags "pin header") + (path /55CD757A) + (fp_text reference P4 (at 0 -5.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value OPAMP_JUMPER (at 0 -3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 6.85) (end 1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 6.35) (end 1.27 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 6.35) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 54 +12V)) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 13 /LM324_VCC)) + (pad 3 thru_hole oval (at 0 5.08) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 55 "Net-(P4-Pad3)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x03.wrl + (at (xyz 0 -0.1 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 54EA090C) (tstamp 55D58BF5) + (at 212.09 68.58 90) + (descr "Through hole pin header") + (tags "pin header") + (path /55CDECCE) + (fp_text reference P5 (at 0 -5.1 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value HVI (at 0 -3.1 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 90) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 54 +12V)) + (pad 2 thru_hole oval (at 0 2.54 90) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 14 /VGND)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 54EA090C) (tstamp 55D58C06) + (at 130.634524 116.345) + (descr "Through hole pin header") + (tags "pin header") + (path /55CB63F0) + (fp_text reference P6 (at 0 -5.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value AWG_OUT (at 0 -3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 12 "Net-(C7-Pad2)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 11 "Net-(C7-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 54EA090C) (tstamp 55D58C17) + (at 223.52 83.82) + (descr "Through hole pin header") + (tags "pin header") + (path /55CC540F) + (fp_text reference P7 (at 0 -5.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value HVO (at 0 -3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 16 "Net-(C9-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 15 /VSENSE_OCP)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 54EA090C) (tstamp 55D58C28) + (at 141.355952 108.045) + (descr "Through hole pin header") + (tags "pin header") + (path /55D6DB77) + (fp_text reference P8 (at 0 -5.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DIG_IN (at 0 -3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 56 "Net-(P8-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 57 "Net-(P8-Pad2)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58C34) + (at 109.575001 89.445) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CAAB95) + (attr smd) + (fp_text reference R1 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58C40) + (at 97.925001 89.445) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CAAD4C) + (attr smd) + (fp_text reference R2 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R2-Pad1)")) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58C4C) + (at 86.275001 104.045) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CAABF4) + (attr smd) + (fp_text reference R3 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 48 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58C58) + (at 74.625001 120.145) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CAAD11) + (attr smd) + (fp_text reference R4 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 48 /AVCC_ON_2)) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R2-Pad1)")) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58C64) + (at 121.225001 122.645) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CAAC5F) + (attr smd) + (fp_text reference R5 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 8 /AVCC)) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 48 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58C70) + (at 62.975001 120.145) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CAACD2) + (attr smd) + (fp_text reference R6 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 9 /AGND)) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 48 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58C7C) + (at 198.12 138.43) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CBCDA5) + (attr smd) + (fp_text reference R7 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R11-Pad2)")) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 53 "Net-(P3-Pad4)")) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58C88) + (at 97.925001 106.045) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CBE401) + (attr smd) + (fp_text reference R8 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R12-Pad2)")) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 52 "Net-(P3-Pad3)")) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58C94) + (at 160.02 138.43) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CBE16B) + (attr smd) + (fp_text reference R9 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R13-Pad2)")) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 51 "Net-(P3-Pad2)")) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58CA0) + (at 179.07 134.62) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CBE2C7) + (attr smd) + (fp_text reference R10 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R10-Pad1)")) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 50 "Net-(P3-Pad1)")) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58CAC) + (at 212.09 134.62) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CBCD2A) + (attr smd) + (fp_text reference R11 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 38 "Net-(IC1-Pad28)")) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R11-Pad2)")) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58CB8) + (at 86.275001 114.345) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CBE362) + (attr smd) + (fp_text reference R12 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 39 "Net-(IC1-Pad29)")) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R12-Pad2)")) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58CC4) + (at 142.24 137.16) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CBE0F4) + (attr smd) + (fp_text reference R13 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 40 "Net-(IC1-Pad32)")) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R13-Pad2)")) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58CD0) + (at 109.575001 114.345) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CBE21C) + (attr smd) + (fp_text reference R14 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 41 "Net-(IC1-Pad33)")) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R10-Pad1)")) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58CDC) + (at 121.225001 114.345) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55D84EF6) + (attr smd) + (fp_text reference R15 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 43 "Net-(IC1-Pad35)")) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58CE8) + (at 165.735 82.55 180) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55D592A5) + (attr smd) + (fp_text reference R16 (at 0 -3.1 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0 180) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R16-Pad1)")) + (pad 2 smd rect (at 3.95 0 180) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58CF4) + (at 179.705 82.55 180) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55D4D96A) + (attr smd) + (fp_text reference R17 (at 0 -3.1 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0 180) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 55 "Net-(P4-Pad3)")) + (pad 2 smd rect (at 3.95 0 180) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R16-Pad1)")) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58D00) + (at 144.525001 97.745) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CB4680) + (attr smd) + (fp_text reference R18 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R18-Pad1)")) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R18-Pad2)")) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58D0C) + (at 109.575001 122.645) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CC18B5) + (attr smd) + (fp_text reference R19 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 10 "Net-(C6-Pad1)")) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 34 /PSU_PWM)) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58D18) + (at 109.575001 97.745) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CB9020) + (attr smd) + (fp_text reference R20 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 12 "Net-(C7-Pad2)")) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R18-Pad1)")) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58D24) + (at 97.925001 122.645) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CC31EA) + (attr smd) + (fp_text reference R21 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R21-Pad1)")) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58D30) + (at 97.925001 97.745) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CC344F) + (attr smd) + (fp_text reference R22 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R22-Pad1)")) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R21-Pad1)")) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58D3C) + (at 218.44 85.09 270) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55CC774D) + (attr smd) + (fp_text reference R23 (at 0 -3.1 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0 270) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 16 "Net-(C9-Pad1)")) + (pad 2 smd rect (at 3.95 0 270) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 15 /VSENSE_OCP)) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_2512_HandSoldering (layer F.Cu) (tedit 5418A1CA) (tstamp 55D58D48) + (at 132.875001 89.445) + (descr "Resistor SMD 2512, hand soldering") + (tags "resistor 2512") + (path /55D44B0B) + (attr smd) + (fp_text reference R24 (at 0 -3.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -5.6 -1.95) (end 5.6 -1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.6 -1.95) (end -5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 5.6 -1.95) (end 5.6 1.95) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.6 1.825) (end -2.6 1.825) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.6 -1.825) (end 2.6 -1.825) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 15 /VSENSE_OCP)) + (pad 2 smd rect (at 3.95 0) (size 2.7 3.2) (layers F.Cu F.Paste F.Mask) + (net 14 /VGND)) + (model Resistors_SMD.3dshapes/R_2512_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Connect:C96ABCFD (layer F.Cu) (tedit 0) (tstamp 55D58DB8) + (at 138.43 63.5) + (descr "Connecteur DIN Europe 96 contacts ABC male droit") + (tags "CONN DIN") + (path /55CC4BD0) + (fp_text reference T1 (at -26.035 -7.62) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value TIP29A (at 20.955 -7.62) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -46.99 5.08) (end 46.99 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 46.99 5.08) (end 46.99 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -46.99 -2.54) (end -46.99 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -41.91 -2.54) (end -41.91 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 41.91 -2.54) (end 41.91 5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -46.99 -2.54) (end -46.99 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start -46.99 -5.08) (end 46.99 -5.08) (layer F.SilkS) (width 0.15)) + (fp_line (start 46.99 -5.08) (end 46.99 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start 41.91 -5.08) (end 41.91 -2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -41.91 -2.54) (end -41.91 -5.08) (layer F.SilkS) (width 0.15)) + (pad 65 thru_hole circle (at -44.45 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad 66 thru_hole circle (at 44.45 0) (size 3.81 3.81) (drill 3.048) (layers *.Cu *.Mask F.SilkS)) + (pad A3 thru_hole circle (at -34.29 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A4 thru_hole circle (at -31.75 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A5 thru_hole circle (at -29.21 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A6 thru_hole circle (at -26.67 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A7 thru_hole circle (at -24.13 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A8 thru_hole circle (at -21.59 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A9 thru_hole circle (at -19.05 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A10 thru_hole circle (at -16.51 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A11 thru_hole circle (at -13.97 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A12 thru_hole circle (at -11.43 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A13 thru_hole circle (at -8.89 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A14 thru_hole circle (at -6.35 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A15 thru_hole circle (at -3.81 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A16 thru_hole circle (at -1.27 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A17 thru_hole circle (at 1.27 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A18 thru_hole circle (at 3.81 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A19 thru_hole circle (at 6.35 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A20 thru_hole circle (at 8.89 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A21 thru_hole circle (at 11.43 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A22 thru_hole circle (at 13.97 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A23 thru_hole circle (at 16.51 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A24 thru_hole circle (at 19.05 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A25 thru_hole circle (at 21.59 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A26 thru_hole circle (at 24.13 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A27 thru_hole circle (at 26.67 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A28 thru_hole circle (at 29.21 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A29 thru_hole circle (at 31.75 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A30 thru_hole circle (at 34.29 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A31 thru_hole circle (at 36.83 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A32 thru_hole circle (at 39.37 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A2 thru_hole circle (at -36.83 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad A1 thru_hole rect (at -39.37 2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B1 thru_hole circle (at -39.37 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B2 thru_hole circle (at -36.83 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B3 thru_hole circle (at -34.29 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B4 thru_hole circle (at -31.75 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B5 thru_hole circle (at -29.21 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B6 thru_hole circle (at -26.67 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B7 thru_hole circle (at -24.13 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B8 thru_hole circle (at -21.59 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B9 thru_hole circle (at -19.05 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B10 thru_hole circle (at -16.51 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B11 thru_hole circle (at -13.97 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B12 thru_hole circle (at -11.43 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B13 thru_hole circle (at -8.89 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B14 thru_hole circle (at -6.35 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B15 thru_hole circle (at -3.81 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B16 thru_hole circle (at -1.27 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B17 thru_hole circle (at 1.27 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B18 thru_hole circle (at 3.81 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B19 thru_hole circle (at 6.35 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B20 thru_hole circle (at 8.89 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B21 thru_hole circle (at 11.43 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B22 thru_hole circle (at 13.97 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B23 thru_hole circle (at 16.51 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B24 thru_hole circle (at 19.05 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B25 thru_hole circle (at 21.59 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B26 thru_hole circle (at 24.13 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B27 thru_hole circle (at 26.67 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B28 thru_hole circle (at 29.21 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B29 thru_hole circle (at 31.75 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B30 thru_hole circle (at 34.29 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B31 thru_hole circle (at 36.83 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad B32 thru_hole circle (at 39.37 0) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C1 thru_hole circle (at -39.37 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C2 thru_hole circle (at -36.83 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C3 thru_hole circle (at -34.29 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C4 thru_hole circle (at -31.75 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C5 thru_hole circle (at -29.21 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C6 thru_hole circle (at -26.67 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C7 thru_hole circle (at -24.13 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C8 thru_hole circle (at -21.59 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C9 thru_hole circle (at -19.05 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C10 thru_hole circle (at -16.51 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C11 thru_hole circle (at -13.97 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C12 thru_hole circle (at -11.43 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C13 thru_hole circle (at -8.89 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C14 thru_hole circle (at -6.35 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C15 thru_hole circle (at -3.81 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C16 thru_hole circle (at -1.27 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C17 thru_hole circle (at 1.27 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C18 thru_hole circle (at 3.81 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C19 thru_hole circle (at 6.35 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C20 thru_hole circle (at 8.89 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C21 thru_hole circle (at 11.43 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C22 thru_hole circle (at 13.97 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C23 thru_hole circle (at 16.51 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C24 thru_hole circle (at 19.05 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C25 thru_hole circle (at 21.59 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C26 thru_hole circle (at 24.13 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C27 thru_hole circle (at 26.67 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C28 thru_hole circle (at 29.21 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C29 thru_hole circle (at 31.75 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C30 thru_hole circle (at 34.29 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C31 thru_hole circle (at 36.83 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad C32 thru_hole circle (at 39.37 -2.54) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (model Connect.3dshapes/C96ABCFD.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module SMD:SOT-23-3 (layer F.Cu) (tedit 5508E933) (tstamp 55D58DC4) + (at 67.345 126.804524) + (path /55CA99FA) + (fp_text reference U1 (at 2.5 0 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value 78L05 (at -2.2 0 90) (layer F.Fab) hide + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 1 -0.4) (end 1.1 -0.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 -0.8) (end -1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 0.8) (end 1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 0.8) (end 1.5 -0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 -0.8) (end -1.5 -0.8) (layer F.SilkS) (width 0.15)) + (pad 3 smd rect (at 0 1.4) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at -0.95 -1.4) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask)) + (pad 1 smd rect (at 0.95 -1.4) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask)) + (model 3D/SMD/SOT-23-3.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm (layer F.Cu) (tedit 54130A77) (tstamp 55D58DE1) + (at 177.8 110.49 180) + (descr "14-Lead Plastic Small Outline (SL) - Narrow, 3.90 mm Body [SOIC] (see Microchip Packaging Specification 00000049BS.pdf)") + (tags "SOIC 1.27") + (path /55CA87E2) + (attr smd) + (fp_text reference U2 (at 0 -5.375 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value LM324 (at 0 5.375 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.7 -4.65) (end -3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.7 -4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 -4.65) (end 3.7 -4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.075 -4.45) (end -2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 -4.45) (end 2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 4.45) (end 2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end -2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.45) (end 2.075 -4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end 2.075 4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.335) (end -3.45 -4.335) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2.7 -3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 46 /CH1)) + (pad 2 smd rect (at -2.7 -2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 46 /CH1)) + (pad 3 smd rect (at -2.7 -1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R1-Pad1)")) + (pad 4 smd rect (at -2.7 0 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 13 /LM324_VCC)) + (pad 5 smd rect (at -2.7 1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R2-Pad1)")) + (pad 6 smd rect (at -2.7 2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 47 /CH2)) + (pad 7 smd rect (at -2.7 3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 47 /CH2)) + (pad 8 smd rect (at 2.7 3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R18-Pad2)")) + (pad 9 smd rect (at 2.7 2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R18-Pad2)")) + (pad 10 smd rect (at 2.7 1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 22 /DAC_OUT)) + (pad 11 smd rect (at 2.7 0 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 14 /VGND)) + (pad 12 smd rect (at 2.7 -1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 10 "Net-(C6-Pad1)")) + (pad 13 smd rect (at 2.7 -2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R21-Pad1)")) + (pad 14 smd rect (at 2.7 -3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R22-Pad1)")) + (model Housings_SOIC.3dshapes/SOIC-14_3.9x8.7mm_Pitch1.27mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Footprints:SOT363 (layer F.Cu) (tedit 5070B96C) (tstamp 55D58DEF) + (at 60.5885 126.64504) + (descr SOT363) + (path /55D6ACFD) + (attr smd) + (fp_text reference U3 (at 0.09906 1.69926) (layer F.SilkS) hide + (effects (font (size 0.762 0.635) (thickness 0.127))) + ) + (fp_text value DMN63D8LDW (at 0 -1.50114) (layer F.SilkS) + (effects (font (size 0.762 0.635) (thickness 0.127))) + ) + (fp_line (start 0.635 1.016) (end 0.635 -1.016) (layer F.SilkS) (width 0.1524)) + (fp_line (start 0.635 -1.016) (end -0.635 -1.016) (layer F.SilkS) (width 0.1524)) + (fp_line (start -0.635 -1.016) (end -0.635 1.016) (layer F.SilkS) (width 0.1524)) + (fp_line (start -0.635 1.016) (end 0.635 1.016) (layer F.SilkS) (width 0.1524)) + (pad 1 smd rect (at -1.016 -0.635) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 3 smd rect (at -1.016 0.635) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 26 /DIG_CH2)) + (pad 5 smd rect (at 1.016 0) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 56 "Net-(P8-Pad1)")) + (pad 2 smd rect (at -1.016 0) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 57 "Net-(P8-Pad2)")) + (pad 4 smd rect (at 1.016 0.635) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 6 smd rect (at 1.016 -0.635) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 29 /DIG_CH1)) + (model 3D/SOT-363.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 0)) + ) + ) + + (gr_line (start 240.03 53.34) (end 81.28 53.34) (angle 90) (layer Edge.Cuts) (width 0.15)) + (gr_line (start 240.03 147.32) (end 240.03 53.34) (angle 90) (layer Edge.Cuts) (width 0.15)) + (gr_line (start 81.28 147.32) (end 240.03 147.32) (angle 90) (layer Edge.Cuts) (width 0.15)) + (gr_line (start 81.28 53.34) (end 81.28 147.32) (angle 90) (layer Edge.Cuts) (width 0.15)) + +) diff --git a/PCB/OUTPUT/OUTPUT.zip b/PCB/OUTPUT/OUTPUT.zip new file mode 100644 index 00000000..e6c8fbfd Binary files /dev/null and b/PCB/OUTPUT/OUTPUT.zip differ diff --git a/PCB/OUTPUT/Tinylab_proto1-B_Cu.gbl b/PCB/OUTPUT/Tinylab_proto1-B_Cu.gbl new file mode 100644 index 00000000..15866d75 --- /dev/null +++ b/PCB/OUTPUT/Tinylab_proto1-B_Cu.gbl @@ -0,0 +1,480 @@ +G04 #@! TF.FileFunction,Copper,L2,Bot,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 28/09/2015 1:15:09 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.150000*% +%ADD11C,1.501140*% +%ADD12C,1.998980*% +%ADD13R,1.998980X1.998980*% +%ADD14R,2.032000X1.727200*% +%ADD15O,2.032000X1.727200*% +%ADD16O,0.950000X1.250000*% +%ADD17O,1.550000X1.000000*% +%ADD18R,1.727200X2.032000*% +%ADD19O,1.727200X2.032000*% +%ADD20R,1.727200X1.727200*% +%ADD21O,1.727200X1.727200*% +%ADD22R,2.032000X2.032000*% +%ADD23O,2.032000X2.032000*% +%ADD24C,0.600000*% +%ADD25C,1.160000*% +%ADD26C,0.580000*% +%ADD27C,0.254000*% +G04 APERTURE END LIST* +D10* +D11* +X70855840Y-128137920D03* +X70855840Y-125597920D03* +X69230240Y-141175740D03* +X69230240Y-138635740D03* +D12* +X63820040Y-134800340D03* +D13* +X73980040Y-134800340D03* +D12* +X74117200Y-131899660D03* +D13* +X63957200Y-131899660D03* +D14* +X36258500Y-146100800D03* +D15* +X36258500Y-148640800D03* +X36258500Y-151180800D03* +X36258500Y-153720800D03* +D16* +X40127360Y-133399260D03* +X40127360Y-138399260D03* +D17* +X37427360Y-132399260D03* +X37427360Y-139399260D03* +D18* +X64861440Y-154310080D03* +D19* +X67401440Y-154310080D03* +X69941440Y-154310080D03* +X72481440Y-154310080D03* +D20* +X57718960Y-123718320D03* +D21* +X57718960Y-126258320D03* +X55178960Y-123718320D03* +X55178960Y-126258320D03* +D18* +X49342040Y-125089920D03* +D19* +X46802040Y-125089920D03* +X44262040Y-125089920D03* +D22* +X61328300Y-154012900D03* +D23* +X58788300Y-154012900D03* +D22* +X73741280Y-144505680D03* +D23* +X71201280Y-144505680D03* +D22* +X65714880Y-122570240D03* +D23* +X63174880Y-122570240D03* +D24* +X49890680Y-149565360D03* +X55636160Y-147949920D03* +X46583600Y-149489160D03* +X46431200Y-134172960D03* +X53213000Y-126862840D03* +X49946560Y-128727200D03* +X63261240Y-126908560D03* +X63362840Y-128930400D03* +X51450240Y-144231360D03* +X45496480Y-149270720D03* +X54218840Y-133852920D03* +X52466240Y-133868160D03* +X55544720Y-144200880D03* +X45577760Y-151079200D03* +X48381920Y-142179040D03* +X51628040Y-149618700D03* +X43665140Y-144449800D03* +X65603120Y-128579880D03* +X57708800Y-146177000D03* +X61305440Y-144912080D03* +X56306720Y-141046200D03* +X48823880Y-144795240D03* +X55707280Y-150850600D03* +X56687720Y-146212560D03* +X55859680Y-128635760D03* +X57246520Y-128625600D03* +X58968640Y-128595120D03* +X60071000Y-126959360D03* +X60858400Y-130210560D03* +X58440320Y-132730240D03* +X54193440Y-133014720D03* +X50942240Y-133278880D03* +X45326300Y-135536940D03* +X42057320Y-135559800D03* +X45453300Y-136692640D03* +X42092880Y-136486900D03* +X71241920Y-147243800D03* +X51099720Y-137353040D03* +X68813680Y-147106640D03* +X50678080Y-138054080D03* +X66212720Y-147050760D03* +X49982120Y-139420600D03* +X63113920Y-146324320D03* +X50881280Y-139476480D03* +X51551840Y-132344160D03* +X55011320Y-127955040D03* +X57383680Y-133664960D03* +X55265320Y-136585960D03* +X52491640Y-136652000D03* +X56509920Y-144028160D03* +X52202080Y-147177760D03* +X57952640Y-141041120D03* +X48828960Y-143804640D03* +X45557440Y-145796000D03* +X44500800Y-147096480D03* +X64119760Y-127284480D03* +X61132720Y-128452880D03* +X60192920Y-147203160D03* +X57876440Y-149839680D03* +D25* +X46583600Y-144424400D02* +X46583600Y-134325360D01* +X46583600Y-134325360D02* +X46431200Y-134172960D01* +X49342040Y-125089920D02* +X49342040Y-127086360D01* +X49342040Y-127086360D02* +X48061880Y-128366520D01* +X48061880Y-128366520D02* +X46126400Y-128366520D01* +X46126400Y-128366520D02* +X45029120Y-129463800D01* +X45029120Y-129463800D02* +X45029120Y-132557520D01* +X45029120Y-132557520D02* +X46431200Y-133959600D01* +X46431200Y-133959600D02* +X46431200Y-134172960D01* +D26* +X49890680Y-149565360D02* +X51384200Y-148071840D01* +X51384200Y-148071840D02* +X55514240Y-148071840D01* +X55514240Y-148071840D02* +X55636160Y-147949920D01* +D27* +X55514240Y-148071840D02* +X51384200Y-148071840D01* +X55636160Y-147949920D02* +X55514240Y-148071840D01* +D26* +X46431200Y-134172960D02* +X46431200Y-133959600D01* +X48061880Y-128366520D02* +X49342040Y-127086360D01* +X46126400Y-128366520D02* +X48061880Y-128366520D01* +X45029120Y-129463800D02* +X46126400Y-128366520D01* +X45029120Y-132557520D02* +X45029120Y-129463800D01* +X46431200Y-133959600D02* +X45029120Y-132557520D01* +X46583600Y-144424400D02* +X46583600Y-149489160D01* +X46431200Y-134172960D02* +X46583600Y-134325360D01* +D27* +X53213000Y-126862840D02* +X53213000Y-125547120D01* +X53213000Y-125547120D02* +X55041800Y-123718320D01* +X55041800Y-123718320D02* +X55178960Y-123718320D01* +D25* +X51810920Y-126862840D02* +X53213000Y-126862840D01* +X49946560Y-128727200D02* +X51810920Y-126862840D01* +D27* +X63362840Y-127010160D02* +X63362840Y-128930400D01* +X63261240Y-126908560D02* +X63362840Y-127010160D01* +X50596800Y-145084800D02* +X51450240Y-144231360D01* +X50596800Y-146690080D02* +X50596800Y-145084800D01* +X46959520Y-150327360D02* +X50596800Y-146690080D01* +X46248320Y-150327360D02* +X46959520Y-150327360D01* +X45943520Y-150022560D02* +X46248320Y-150327360D01* +X45943520Y-149717760D02* +X45943520Y-150022560D01* +X45496480Y-149270720D02* +X45943520Y-149717760D01* +D26* +X52481480Y-133852920D02* +X54218840Y-133852920D01* +X52466240Y-133868160D02* +X52481480Y-133852920D01* +D27* +X53492400Y-144200880D02* +X55544720Y-144200880D01* +X51673760Y-146019520D02* +X53492400Y-144200880D01* +X51673760Y-146588480D02* +X51673760Y-146019520D01* +X48585120Y-149677120D02* +X51673760Y-146588480D01* +X48585120Y-150591520D02* +X48585120Y-149677120D01* +X47589440Y-151587200D02* +X48585120Y-150591520D01* +X46085760Y-151587200D02* +X47589440Y-151587200D01* +X45577760Y-151079200D02* +X46085760Y-151587200D01* +D25* +X74117200Y-131899660D02* +X74117200Y-128859280D01* +X74117200Y-128859280D02* +X70855840Y-125597920D01* +X50068480Y-134701280D02* +X50068480Y-135397240D01* +X50078640Y-135407400D02* +X51120040Y-135407400D01* +X50068480Y-135397240D02* +X50078640Y-135407400D01* +X48381920Y-142179040D02* +X48381920Y-136387840D01* +X57297320Y-135407400D02* +X62585600Y-130119120D01* +X51120040Y-135407400D02* +X57297320Y-135407400D01* +X48381920Y-136387840D02* +X50068480Y-134701280D01* +X62585600Y-130119120D02* +X64063880Y-130119120D01* +D26* +X48381920Y-142179040D02* +X48768000Y-141792960D01* +X48768000Y-141792960D02* +X48768000Y-136387840D01* +X48768000Y-136387840D02* +X50434240Y-134721600D01* +X50434240Y-134721600D02* +X57972960Y-134721600D01* +X57972960Y-134721600D02* +X57983120Y-134721600D01* +X57983120Y-134721600D02* +X61501020Y-131203700D01* +X61501020Y-131203700D02* +X62585600Y-130119120D01* +X62585600Y-130119120D02* +X63809880Y-130119120D01* +X63809880Y-130119120D02* +X64063880Y-130119120D01* +D25* +X51628040Y-151770080D02* +X51628040Y-149618700D01* +X49001680Y-154396440D02* +X51628040Y-151770080D01* +X43190160Y-154396440D02* +X49001680Y-154396440D01* +X42044620Y-153250900D02* +X43190160Y-154396440D01* +X42044620Y-146070320D02* +X42044620Y-153250900D01* +X43665140Y-144449800D02* +X42044620Y-146070320D01* +X64063880Y-130119120D02* +X65603120Y-128579880D01* +X66045080Y-128137920D02* +X65603120Y-128579880D01* +D27* +X66045080Y-128137920D02* +X65603120Y-128579880D01* +D26* +X64063880Y-130119120D02* +X65603120Y-128579880D01* +D25* +X61305440Y-144988280D02* +X61305440Y-144912080D01* +X60431680Y-145862040D02* +X61305440Y-144988280D01* +X58023760Y-145862040D02* +X60431680Y-145862040D01* +D26* +X57708800Y-146177000D02* +X58023760Y-145862040D01* +D25* +X70855840Y-128137920D02* +X66045080Y-128137920D01* +X73741280Y-144505680D02* +X73741280Y-143146780D01* +X73741280Y-143146780D02* +X69230240Y-138635740D01* +D26* +X73741280Y-143146780D02* +X69230240Y-138635740D01* +D25* +X63820040Y-134800340D02* +X63820040Y-132036820D01* +X63820040Y-132036820D02* +X63957200Y-131899660D01* +D27* +X53868320Y-143484600D02* +X56306720Y-141046200D01* +X50134520Y-143484600D02* +X53868320Y-143484600D01* +X48823880Y-144795240D02* +X50134520Y-143484600D01* +X56769000Y-149788880D02* +X55707280Y-150850600D01* +X56769000Y-146293840D02* +X56769000Y-149788880D01* +X56687720Y-146212560D02* +X56769000Y-146293840D01* +X57236360Y-128635760D02* +X55859680Y-128635760D01* +X57246520Y-128625600D02* +X57236360Y-128635760D01* +X58968640Y-128061720D02* +X58968640Y-128595120D01* +X60071000Y-126959360D02* +X58968640Y-128061720D01* +X60858400Y-130312160D02* +X60858400Y-130210560D01* +X58440320Y-132730240D02* +X60858400Y-130312160D01* +X51206400Y-133014720D02* +X54193440Y-133014720D01* +X50942240Y-133278880D02* +X51206400Y-133014720D01* +X42080180Y-135536940D02* +X45326300Y-135536940D01* +X42057320Y-135559800D02* +X42080180Y-135536940D01* +X42298620Y-136692640D02* +X45453300Y-136692640D01* +X42092880Y-136486900D02* +X42298620Y-136692640D01* +X70434200Y-147243800D02* +X71241920Y-147243800D01* +X69093080Y-145902680D02* +X70434200Y-147243800D01* +X66771520Y-145902680D02* +X69093080Y-145902680D01* +X66492120Y-145623280D02* +X66771520Y-145902680D01* +X66492120Y-145150840D02* +X66492120Y-145623280D01* +X58806080Y-137464800D02* +X66492120Y-145150840D01* +X51211480Y-137464800D02* +X58806080Y-137464800D01* +X51099720Y-137353040D02* +X51211480Y-137464800D01* +X67919600Y-147106640D02* +X68813680Y-147106640D01* +X67218560Y-146405600D02* +X67919600Y-147106640D01* +X65735200Y-146405600D02* +X67218560Y-146405600D01* +X65405000Y-146075400D02* +X65735200Y-146405600D01* +X65405000Y-145125440D02* +X65405000Y-146075400D01* +X58303160Y-138023600D02* +X65405000Y-145125440D01* +X50708560Y-138023600D02* +X58303160Y-138023600D01* +X50678080Y-138054080D02* +X50708560Y-138023600D01* +X65039240Y-147050760D02* +X66212720Y-147050760D01* +X64201040Y-146212560D02* +X65039240Y-147050760D01* +X64201040Y-144896840D02* +X64201040Y-146212560D01* +X58084720Y-138780520D02* +X64201040Y-144896840D01* +X50622200Y-138780520D02* +X58084720Y-138780520D01* +X49982120Y-139420600D02* +X50622200Y-138780520D01* +X63113920Y-144790160D02* +X63113920Y-146324320D01* +X57912000Y-139588240D02* +X63113920Y-144790160D01* +X50993040Y-139588240D02* +X57912000Y-139588240D01* +X50881280Y-139476480D02* +X50993040Y-139588240D01* +X51551840Y-129682240D02* +X51551840Y-132344160D01* +X51876960Y-129357120D02* +X51551840Y-129682240D01* +X53609240Y-129357120D02* +X51876960Y-129357120D01* +X55011320Y-127955040D02* +X53609240Y-129357120D01* +X58216800Y-126756160D02* +X57718960Y-126258320D01* +X56774080Y-127853440D02* +X55178960Y-126258320D01* +X57663080Y-127853440D02* +X56774080Y-127853440D01* +X58054240Y-128244600D02* +X57663080Y-127853440D01* +X58054240Y-129590800D02* +X58054240Y-128244600D01* +X57216040Y-130429000D02* +X58054240Y-129590800D01* +X57216040Y-133497320D02* +X57216040Y-130429000D01* +X57383680Y-133664960D02* +X57216040Y-133497320D01* +X52557680Y-136585960D02* +X55265320Y-136585960D01* +X52491640Y-136652000D02* +X52557680Y-136585960D01* +X56509920Y-144962880D02* +X56509920Y-144028160D01* +X54457600Y-147015200D02* +X56509920Y-144962880D01* +X52364640Y-147015200D02* +X54457600Y-147015200D01* +X52202080Y-147177760D02* +X52364640Y-147015200D01* +X57038240Y-140126720D02* +X57952640Y-141041120D01* +X52506880Y-140126720D02* +X57038240Y-140126720D01* +X48828960Y-143804640D02* +X52506880Y-140126720D01* +X45557440Y-146039840D02* +X45557440Y-145796000D01* +X44500800Y-147096480D02* +X45557440Y-146039840D01* +X65714880Y-125689360D02* +X65714880Y-122570240D01* +X64119760Y-127284480D02* +X65714880Y-125689360D01* +X61427360Y-124317760D02* +X63174880Y-122570240D01* +X61427360Y-128158240D02* +X61427360Y-124317760D01* +X61132720Y-128452880D02* +X61427360Y-128158240D01* +X60192920Y-147523200D02* +X60192920Y-147203160D01* +X57876440Y-149839680D02* +X60192920Y-147523200D01* +M02* diff --git a/PCB/OUTPUT/Tinylab_proto1-B_Mask.gbs b/PCB/OUTPUT/Tinylab_proto1-B_Mask.gbs new file mode 100644 index 00000000..f613d718 --- /dev/null +++ b/PCB/OUTPUT/Tinylab_proto1-B_Mask.gbs @@ -0,0 +1,78 @@ +G04 #@! TF.FileFunction,Soldermask,Bot* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 28/09/2015 1:15:09 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.150000*% +%ADD11C,1.501140*% +%ADD12C,1.998980*% +%ADD13R,1.998980X1.998980*% +%ADD14R,2.032000X1.727200*% +%ADD15O,2.032000X1.727200*% +%ADD16O,0.950000X1.250000*% +%ADD17O,1.550000X1.000000*% +%ADD18R,1.727200X2.032000*% +%ADD19O,1.727200X2.032000*% +%ADD20R,1.727200X1.727200*% +%ADD21O,1.727200X1.727200*% +%ADD22R,2.032000X2.032000*% +%ADD23O,2.032000X2.032000*% +G04 APERTURE END LIST* +D10* +D11* +X70855840Y-128137920D03* +X70855840Y-125597920D03* +X69230240Y-141175740D03* +X69230240Y-138635740D03* +D12* +X63820040Y-134800340D03* +D13* +X73980040Y-134800340D03* +D12* +X74117200Y-131899660D03* +D13* +X63957200Y-131899660D03* +D14* +X36258500Y-146100800D03* +D15* +X36258500Y-148640800D03* +X36258500Y-151180800D03* +X36258500Y-153720800D03* +D16* +X40127360Y-133399260D03* +X40127360Y-138399260D03* +D17* +X37427360Y-132399260D03* +X37427360Y-139399260D03* +D18* +X64861440Y-154310080D03* +D19* +X67401440Y-154310080D03* +X69941440Y-154310080D03* +X72481440Y-154310080D03* +D20* +X57718960Y-123718320D03* +D21* +X57718960Y-126258320D03* +X55178960Y-123718320D03* +X55178960Y-126258320D03* +D18* +X49342040Y-125089920D03* +D19* +X46802040Y-125089920D03* +X44262040Y-125089920D03* +D22* +X61328300Y-154012900D03* +D23* +X58788300Y-154012900D03* +D22* +X73741280Y-144505680D03* +D23* +X71201280Y-144505680D03* +D22* +X65714880Y-122570240D03* +D23* +X63174880Y-122570240D03* +M02* diff --git a/PCB/OUTPUT/Tinylab_proto1-B_SilkS.gbo b/PCB/OUTPUT/Tinylab_proto1-B_SilkS.gbo new file mode 100644 index 00000000..8f3574b8 --- /dev/null +++ b/PCB/OUTPUT/Tinylab_proto1-B_SilkS.gbo @@ -0,0 +1,11 @@ +G04 #@! TF.FileFunction,Legend,Bot* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 28/09/2015 1:15:09 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.150000*% +G04 APERTURE END LIST* +D10* +M02* diff --git a/PCB/OUTPUT/Tinylab_proto1-Edge_Cuts.gm1 b/PCB/OUTPUT/Tinylab_proto1-Edge_Cuts.gm1 new file mode 100644 index 00000000..ecb2ce90 --- /dev/null +++ b/PCB/OUTPUT/Tinylab_proto1-Edge_Cuts.gm1 @@ -0,0 +1,23 @@ +G04 #@! TF.FileFunction,Profile,NP* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 28/09/2015 1:15:09 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.150000*% +%ADD11C,0.100000*% +G04 APERTURE END LIST* +D10* +D11* +X33197800Y-117612160D02* +X33197800Y-157236160D01* +X76885800Y-117612160D02* +X33197800Y-117612160D01* +X76885800Y-157109160D02* +X76885800Y-117612160D01* +X33197800Y-157109160D02* +X76885800Y-157109160D01* +X33639760Y-117850920D02* +X33639760Y-118521480D01* +M02* diff --git a/PCB/OUTPUT/Tinylab_proto1-F_Cu.gtl b/PCB/OUTPUT/Tinylab_proto1-F_Cu.gtl new file mode 100644 index 00000000..2cc35b67 --- /dev/null +++ b/PCB/OUTPUT/Tinylab_proto1-F_Cu.gtl @@ -0,0 +1,1265 @@ +G04 #@! TF.FileFunction,Copper,L1,Top,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 28/09/2015 1:15:09 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.150000*% +%ADD11C,0.250000*% +%ADD12R,0.750000X0.800000*% +%ADD13R,0.800000X0.750000*% +%ADD14C,1.501140*% +%ADD15C,1.998980*% +%ADD16R,1.998980X1.998980*% +%ADD17R,2.000000X2.000000*% +%ADD18R,1.600000X0.560000*% +%ADD19R,0.560000X1.600000*% +%ADD20R,2.032000X1.727200*% +%ADD21O,2.032000X1.727200*% +%ADD22R,1.350000X0.400000*% +%ADD23O,0.950000X1.250000*% +%ADD24O,1.550000X1.000000*% +%ADD25R,1.727200X2.032000*% +%ADD26O,1.727200X2.032000*% +%ADD27R,1.727200X1.727200*% +%ADD28O,1.727200X1.727200*% +%ADD29R,2.032000X2.032000*% +%ADD30O,2.032000X2.032000*% +%ADD31R,0.900000X0.600000*% +%ADD32R,0.500000X0.900000*% +%ADD33R,0.900000X0.500000*% +%ADD34R,0.600000X0.900000*% +%ADD35R,1.500000X0.600000*% +%ADD36R,0.508000X0.304800*% +%ADD37C,0.600000*% +%ADD38C,0.254000*% +%ADD39C,0.580000*% +%ADD40C,1.160000*% +G04 APERTURE END LIST* +D10* +D11* +X33988644Y-118352821D02* +X34560073Y-118352821D01* +X34274358Y-119352821D02* +X34274358Y-118352821D01* +X34893406Y-119352821D02* +X34893406Y-118352821D01* +X35369596Y-119352821D02* +X35369596Y-118352821D01* +X35941025Y-119352821D01* +X35941025Y-118352821D01* +X36607691Y-118876630D02* +X36607691Y-119352821D01* +X36274358Y-118352821D02* +X36607691Y-118876630D01* +X36941025Y-118352821D01* +X37750549Y-119352821D02* +X37274358Y-119352821D01* +X37274358Y-118352821D01* +X38036263Y-119067107D02* +X38512454Y-119067107D01* +X37941025Y-119352821D02* +X38274358Y-118352821D01* +X38607692Y-119352821D01* +X39274359Y-118829011D02* +X39417216Y-118876630D01* +X39464835Y-118924250D01* +X39512454Y-119019488D01* +X39512454Y-119162345D01* +X39464835Y-119257583D01* +X39417216Y-119305202D01* +X39321978Y-119352821D01* +X38941025Y-119352821D01* +X38941025Y-118352821D01* +X39274359Y-118352821D01* +X39369597Y-118400440D01* +X39417216Y-118448059D01* +X39464835Y-118543297D01* +X39464835Y-118638535D01* +X39417216Y-118733773D01* +X39369597Y-118781392D01* +X39274359Y-118829011D01* +X38941025Y-118829011D01* +X40702930Y-119352821D02* +X40702930Y-118352821D01* +X41083883Y-118352821D01* +X41179121Y-118400440D01* +X41226740Y-118448059D01* +X41274359Y-118543297D01* +X41274359Y-118686154D01* +X41226740Y-118781392D01* +X41179121Y-118829011D01* +X41083883Y-118876630D01* +X40702930Y-118876630D01* +X42274359Y-119257583D02* +X42226740Y-119305202D01* +X42083883Y-119352821D01* +X41988645Y-119352821D01* +X41845787Y-119305202D01* +X41750549Y-119209964D01* +X41702930Y-119114726D01* +X41655311Y-118924250D01* +X41655311Y-118781392D01* +X41702930Y-118590916D01* +X41750549Y-118495678D01* +X41845787Y-118400440D01* +X41988645Y-118352821D01* +X42083883Y-118352821D01* +X42226740Y-118400440D01* +X42274359Y-118448059D01* +X43036264Y-118829011D02* +X43179121Y-118876630D01* +X43226740Y-118924250D01* +X43274359Y-119019488D01* +X43274359Y-119162345D01* +X43226740Y-119257583D01* +X43179121Y-119305202D01* +X43083883Y-119352821D01* +X42702930Y-119352821D01* +X42702930Y-118352821D01* +X43036264Y-118352821D01* +X43131502Y-118400440D01* +X43179121Y-118448059D01* +X43226740Y-118543297D01* +X43226740Y-118638535D01* +X43179121Y-118733773D01* +X43131502Y-118781392D01* +X43036264Y-118829011D01* +X42702930Y-118829011D01* +X35631501Y-121002821D02* +X35631501Y-120002821D01* +X36012454Y-120002821D01* +X36107692Y-120050440D01* +X36155311Y-120098059D01* +X36202930Y-120193297D01* +X36202930Y-120336154D01* +X36155311Y-120431392D01* +X36107692Y-120479011D01* +X36012454Y-120526630D01* +X35631501Y-120526630D01* +X37202930Y-121002821D02* +X36869596Y-120526630D01* +X36631501Y-121002821D02* +X36631501Y-120002821D01* +X37012454Y-120002821D01* +X37107692Y-120050440D01* +X37155311Y-120098059D01* +X37202930Y-120193297D01* +X37202930Y-120336154D01* +X37155311Y-120431392D01* +X37107692Y-120479011D01* +X37012454Y-120526630D01* +X36631501Y-120526630D01* +X37821977Y-120002821D02* +X38012454Y-120002821D01* +X38107692Y-120050440D01* +X38202930Y-120145678D01* +X38250549Y-120336154D01* +X38250549Y-120669488D01* +X38202930Y-120859964D01* +X38107692Y-120955202D01* +X38012454Y-121002821D01* +X37821977Y-121002821D01* +X37726739Y-120955202D01* +X37631501Y-120859964D01* +X37583882Y-120669488D01* +X37583882Y-120336154D01* +X37631501Y-120145678D01* +X37726739Y-120050440D01* +X37821977Y-120002821D01* +X38536263Y-120002821D02* +X39107692Y-120002821D01* +X38821977Y-121002821D02* +X38821977Y-120002821D01* +X39631501Y-120002821D02* +X39821978Y-120002821D01* +X39917216Y-120050440D01* +X40012454Y-120145678D01* +X40060073Y-120336154D01* +X40060073Y-120669488D01* +X40012454Y-120859964D01* +X39917216Y-120955202D01* +X39821978Y-121002821D01* +X39631501Y-121002821D01* +X39536263Y-120955202D01* +X39441025Y-120859964D01* +X39393406Y-120669488D01* +X39393406Y-120336154D01* +X39441025Y-120145678D01* +X39536263Y-120050440D01* +X39631501Y-120002821D01* +X41774359Y-121002821D02* +X41202930Y-121002821D01* +X41488644Y-121002821D02* +X41488644Y-120002821D01* +X41393406Y-120145678D01* +X41298168Y-120240916D01* +X41202930Y-120288535D01* +D12* +X39319200Y-152682640D03* +X39319200Y-151182640D03* +X39278560Y-147088160D03* +X39278560Y-148588160D03* +X43682920Y-135526080D03* +X43682920Y-137026080D03* +D13* +X42864340Y-129816860D03* +X44364340Y-129816860D03* +D12* +X44226480Y-150805580D03* +X44226480Y-149305580D03* +D14* +X70855840Y-128137920D03* +X70855840Y-125597920D03* +D13* +X58795220Y-150964900D03* +X60295220Y-150964900D03* +D12* +X75072240Y-126224600D03* +X75072240Y-127724600D03* +X56596280Y-147961920D03* +X56596280Y-149461920D03* +D14* +X69230240Y-141175740D03* +X69230240Y-138635740D03* +D12* +X73941940Y-139143040D03* +X73941940Y-140643040D03* +D15* +X63820040Y-134800340D03* +D16* +X73980040Y-134800340D03* +D17* +X43665140Y-139105840D03* +X43665140Y-142305840D03* +D18* +X59977400Y-140626600D03* +X59977400Y-139826600D03* +X59977400Y-139026600D03* +X59977400Y-138226600D03* +X59977400Y-137426600D03* +X59977400Y-136626600D03* +X59977400Y-135826600D03* +X59977400Y-135026600D03* +X59977400Y-134226600D03* +X59977400Y-133426600D03* +X59977400Y-132626600D03* +D19* +X58127400Y-130776600D03* +X57327400Y-130776600D03* +X56527400Y-130776600D03* +X55727400Y-130776600D03* +X54927400Y-130776600D03* +X54127400Y-130776600D03* +X53327400Y-130776600D03* +X52527400Y-130776600D03* +X51727400Y-130776600D03* +X50927400Y-130776600D03* +X50127400Y-130776600D03* +D18* +X48277400Y-132626600D03* +X48277400Y-133426600D03* +X48277400Y-134226600D03* +X48277400Y-135026600D03* +X48277400Y-135826600D03* +X48277400Y-136626600D03* +X48277400Y-137426600D03* +X48277400Y-138226600D03* +X48277400Y-139026600D03* +X48277400Y-139826600D03* +X48277400Y-140626600D03* +D19* +X50127400Y-142476600D03* +X50927400Y-142476600D03* +X51727400Y-142476600D03* +X52527400Y-142476600D03* +X53327400Y-142476600D03* +X54127400Y-142476600D03* +X54927400Y-142476600D03* +X55727400Y-142476600D03* +X56527400Y-142476600D03* +X57327400Y-142476600D03* +X58127400Y-142476600D03* +D15* +X74117200Y-131899660D03* +D16* +X63957200Y-131899660D03* +D20* +X36258500Y-146100800D03* +D21* +X36258500Y-148640800D03* +X36258500Y-151180800D03* +X36258500Y-153720800D03* +D22* +X40127360Y-134599260D03* +X40127360Y-135249260D03* +X40127360Y-135899260D03* +X40127360Y-136549260D03* +X40127360Y-137199260D03* +D23* +X40127360Y-133399260D03* +X40127360Y-138399260D03* +D24* +X37427360Y-132399260D03* +X37427360Y-139399260D03* +D25* +X64861440Y-154310080D03* +D26* +X67401440Y-154310080D03* +X69941440Y-154310080D03* +X72481440Y-154310080D03* +D27* +X57718960Y-123718320D03* +D28* +X57718960Y-126258320D03* +X55178960Y-123718320D03* +X55178960Y-126258320D03* +D25* +X49342040Y-125089920D03* +D26* +X46802040Y-125089920D03* +X44262040Y-125089920D03* +D29* +X61328300Y-154012900D03* +D30* +X58788300Y-154012900D03* +D29* +X73741280Y-144505680D03* +D30* +X71201280Y-144505680D03* +D29* +X65714880Y-122570240D03* +D30* +X63174880Y-122570240D03* +D31* +X68435680Y-126309120D03* +X65635680Y-127259120D03* +X65635680Y-125359120D03* +D32* +X40983600Y-154289760D03* +X39483600Y-154289760D03* +X40968360Y-145481040D03* +X39468360Y-145481040D03* +D33* +X42484040Y-154338720D03* +X42484040Y-152838720D03* +X42400220Y-147272440D03* +X42400220Y-145772440D03* +D32* +X42827640Y-151102060D03* +X41327640Y-151102060D03* +X42771760Y-149009100D03* +X41271760Y-149009100D03* +D33* +X72517000Y-150209820D03* +X72517000Y-151709820D03* +X70081140Y-150059960D03* +X70081140Y-151559960D03* +X67487800Y-150133620D03* +X67487800Y-151633620D03* +X64823340Y-150019320D03* +X64823340Y-151519320D03* +X72478900Y-147352320D03* +X72478900Y-148852320D03* +X70004940Y-147088160D03* +X70004940Y-148588160D03* +X67449700Y-147047520D03* +X67449700Y-148547520D03* +X64785240Y-147009420D03* +X64785240Y-148509420D03* +D32* +X58673300Y-146011900D03* +X60173300Y-146011900D03* +X60198700Y-148577300D03* +X58698700Y-148577300D03* +X64608140Y-137822940D03* +X63108140Y-137822940D03* +X63146240Y-139816840D03* +X64646240Y-139816840D03* +X64608140Y-141988540D03* +X63108140Y-141988540D03* +D34* +X43642280Y-134191200D03* +X42692280Y-131391200D03* +X44592280Y-131391200D03* +D35* +X48417500Y-145770600D03* +X48417500Y-147040600D03* +X48417500Y-148310600D03* +X48417500Y-149580600D03* +X48417500Y-150850600D03* +X48417500Y-152120600D03* +X48417500Y-153390600D03* +X53817500Y-153390600D03* +X53817500Y-152120600D03* +X53817500Y-150850600D03* +X53817500Y-149580600D03* +X53817500Y-148310600D03* +X53817500Y-147040600D03* +X53817500Y-145770600D03* +D36* +X60243720Y-127838200D03* +X60243720Y-129108200D03* +X62275720Y-128473200D03* +X60243720Y-128473200D03* +X62275720Y-129108200D03* +X62275720Y-127838200D03* +D13* +X52036280Y-128427480D03* +X53536280Y-128427480D03* +X54445600Y-144200880D03* +X52945600Y-144200880D03* +D37* +X49890680Y-149565360D03* +X55636160Y-147949920D03* +X46583600Y-149489160D03* +X46431200Y-134172960D03* +X53213000Y-126862840D03* +X49946560Y-128727200D03* +X63261240Y-126908560D03* +X63362840Y-128930400D03* +X51450240Y-144231360D03* +X45496480Y-149270720D03* +X54218840Y-133852920D03* +X52466240Y-133868160D03* +X55544720Y-144200880D03* +X45577760Y-151079200D03* +X48381920Y-142179040D03* +X51628040Y-149618700D03* +X43665140Y-144449800D03* +X65603120Y-128579880D03* +X57708800Y-146177000D03* +X61305440Y-144912080D03* +X56306720Y-141046200D03* +X48823880Y-144795240D03* +X55707280Y-150850600D03* +X56687720Y-146212560D03* +X55859680Y-128635760D03* +X57246520Y-128625600D03* +X58968640Y-128595120D03* +X60071000Y-126959360D03* +X60858400Y-130210560D03* +X58440320Y-132730240D03* +X54193440Y-133014720D03* +X50942240Y-133278880D03* +X45326300Y-135536940D03* +X42057320Y-135559800D03* +X45453300Y-136692640D03* +X42092880Y-136486900D03* +X71241920Y-147243800D03* +X51099720Y-137353040D03* +X68813680Y-147106640D03* +X50678080Y-138054080D03* +X66212720Y-147050760D03* +X49982120Y-139420600D03* +X63113920Y-146324320D03* +X50881280Y-139476480D03* +X51551840Y-132344160D03* +X55011320Y-127955040D03* +X57383680Y-133664960D03* +X55265320Y-136585960D03* +X52491640Y-136652000D03* +X56509920Y-144028160D03* +X52202080Y-147177760D03* +X57952640Y-141041120D03* +X48828960Y-143804640D03* +X45557440Y-145796000D03* +X44500800Y-147096480D03* +X64119760Y-127284480D03* +X61132720Y-128452880D03* +X60192920Y-147203160D03* +X57876440Y-149839680D03* +D11* +X39483600Y-154289760D02* +X36827460Y-154289760D01* +X36827460Y-154289760D02* +X36258500Y-153720800D01* +X39483600Y-154289760D02* +X39483600Y-152847040D01* +X39483600Y-152847040D02* +X39319200Y-152682640D01* +X39319200Y-151182640D02* +X36260340Y-151182640D01* +X36260340Y-151182640D02* +X36258500Y-151180800D01* +X39468360Y-145481040D02* +X39468360Y-146898360D01* +X39468360Y-146898360D02* +X39278560Y-147088160D01* +X39468360Y-145481040D02* +X36878260Y-145481040D01* +X36878260Y-145481040D02* +X36258500Y-146100800D01* +X39278560Y-148588160D02* +X36311140Y-148588160D01* +X36311140Y-148588160D02* +X36258500Y-148640800D01* +D38* +X56596280Y-147961920D02* +X55648160Y-147961920D01* +X49875440Y-149580600D02* +X48417500Y-149580600D01* +X49890680Y-149565360D02* +X49875440Y-149580600D01* +X55648160Y-147961920D02* +X55636160Y-147949920D01* +D39* +X43642280Y-134191200D02* +X46412960Y-134191200D01* +X46675040Y-149580600D02* +X48417500Y-149580600D01* +X46583600Y-149489160D02* +X46675040Y-149580600D01* +X46412960Y-134191200D02* +X46431200Y-134172960D01* +D38* +X43682920Y-135526080D02* +X43682920Y-134231840D01* +X43682920Y-134231840D02* +X43642280Y-134191200D01* +X40127360Y-134599260D02* +X43234220Y-134599260D01* +X43234220Y-134599260D02* +X43642280Y-134191200D01* +X56527400Y-130776600D02* +X56527400Y-128277920D01* +X56967120Y-127838200D02* +X58643520Y-127838200D01* +X56527400Y-128277920D02* +X56967120Y-127838200D01* +D40* +X46370240Y-129804160D02* +X48869600Y-129804160D01* +X53536280Y-127186120D02* +X53536280Y-128427480D01* +X53213000Y-126862840D02* +X53536280Y-127186120D01* +X48869600Y-129804160D02* +X49946560Y-128727200D01* +D39* +X53327400Y-142476600D02* +X53327400Y-132359400D01* +X53327400Y-132359400D02* +X53327400Y-132267960D01* +X53327400Y-132267960D02* +X53327400Y-130796598D01* +X53327400Y-130796598D02* +X53307402Y-130776600D01* +X53307402Y-130776600D02* +X53327400Y-130776600D01* +X53327400Y-130776600D02* +X53327400Y-128636360D01* +X53327400Y-128636360D02* +X53536280Y-128427480D01* +D40* +X44592280Y-131391200D02* +X44592280Y-130044800D01* +X44592280Y-130044800D02* +X44364340Y-129816860D01* +X46410880Y-129804160D02* +X46370240Y-129804160D01* +X46370240Y-129804160D02* +X44377040Y-129804160D01* +X44377040Y-129804160D02* +X44364340Y-129816860D01* +X43665140Y-139105840D02* +X43665140Y-137043860D01* +X43665140Y-137043860D02* +X43682920Y-137026080D01* +D38* +X62585600Y-126232920D02* +X63261240Y-126908560D01* +X59877960Y-126232920D02* +X62585600Y-126232920D01* +X63185040Y-129108200D02* +X62275720Y-129108200D01* +X63362840Y-128930400D02* +X63185040Y-129108200D01* +X59888120Y-126232920D02* +X59877960Y-126232920D01* +X58643520Y-127467360D02* +X59877960Y-126232920D01* +X59877960Y-126232920D02* +X59888120Y-126232920D01* +X58643520Y-127838200D02* +X58643520Y-127467360D01* +X60243720Y-127838200D02* +X58643520Y-127838200D01* +X55178960Y-123718320D02* +X55158640Y-123718320D01* +X46398180Y-129816860D02* +X44364340Y-129816860D01* +X46410880Y-129804160D02* +X46398180Y-129816860D01* +D39* +X43665140Y-137043860D02* +X43682920Y-137026080D01* +D38* +X44592280Y-130044800D02* +X44364340Y-129816860D01* +X40127360Y-137199260D02* +X43509740Y-137199260D01* +X43509740Y-137199260D02* +X43682920Y-137026080D01* +X40127360Y-138399260D02* +X40127360Y-137199260D01* +X37427360Y-139399260D02* +X37427360Y-132399260D01* +D39* +X40127360Y-133399260D02* +X41190180Y-133399260D01* +X44592280Y-132313640D02* +X44592280Y-131391200D01* +X44094400Y-132811520D02* +X44592280Y-132313640D01* +X41777920Y-132811520D02* +X44094400Y-132811520D01* +X41190180Y-133399260D02* +X41777920Y-132811520D01* +X40127360Y-133399260D02* +X39942500Y-133399260D01* +X39942500Y-133399260D02* +X38942500Y-132399260D01* +X38942500Y-132399260D02* +X37427360Y-132399260D01* +X40127360Y-138399260D02* +X40127360Y-138505760D01* +X40127360Y-138505760D02* +X39233860Y-139399260D01* +X39233860Y-139399260D02* +X37427360Y-139399260D01* +X53327400Y-142476600D02* +X53327400Y-143819080D01* +X53327400Y-143819080D02* +X52945600Y-144200880D01* +X52945600Y-144200880D02* +X51480720Y-144200880D01* +X51480720Y-144200880D02* +X51450240Y-144231360D01* +D38* +X44226480Y-149305580D02* +X45461620Y-149305580D01* +X51450240Y-144231360D02* +X51480720Y-144200880D01* +X45461620Y-149305580D02* +X45496480Y-149270720D01* +X52945600Y-144200880D02* +X52945600Y-144000920D01* +X52945600Y-144000920D02* +X53327400Y-143619120D01* +X53327400Y-143619120D02* +X53327400Y-142476600D01* +D11* +X42771760Y-149009100D02* +X43930000Y-149009100D01* +X43930000Y-149009100D02* +X44226480Y-149305580D01* +D39* +X52527400Y-130776600D02* +X52527400Y-133807000D01* +X54107402Y-133964358D02* +X54107402Y-142476600D01* +X54218840Y-133852920D02* +X54107402Y-133964358D01* +X52527400Y-133807000D02* +X52466240Y-133868160D01* +X54107402Y-142476600D02* +X54127400Y-142476600D01* +X54107402Y-142476600D02* +X54127400Y-142476600D01* +D40* +X42692280Y-131391200D02* +X42692280Y-129988920D01* +X42692280Y-129988920D02* +X42864340Y-129816860D01* +X52036280Y-128427480D02* +X52036280Y-128419160D01* +X52036280Y-128419160D02* +X51257200Y-127640080D01* +D39* +X52036280Y-128427480D02* +X52036280Y-128652840D01* +X52036280Y-128652840D02* +X52527400Y-129143960D01* +X52527400Y-129143960D02* +X52527400Y-130776600D01* +X57718960Y-123718320D02* +X57718960Y-122763280D01* +X57718960Y-122763280D02* +X57058560Y-122102880D01* +X57058560Y-122102880D02* +X54538880Y-122102880D01* +X54538880Y-122102880D02* +X51734720Y-124907040D01* +X51734720Y-124907040D02* +X51734720Y-127162560D01* +X51734720Y-127162560D02* +X51257200Y-127640080D01* +D40* +X44145200Y-127071120D02* +X50688240Y-127071120D01* +X50688240Y-127071120D02* +X51257200Y-127640080D01* +X42864340Y-129816860D02* +X42864340Y-128351980D01* +X42864340Y-128351980D02* +X44145200Y-127071120D01* +X44145200Y-127071120D02* +X44145200Y-125206760D01* +X44145200Y-125206760D02* +X44262040Y-125089920D01* +D38* +X51734720Y-124907040D02* +X51734720Y-128117600D01* +X54538880Y-122102880D02* +X51734720Y-124907040D01* +X57058560Y-122102880D02* +X54538880Y-122102880D01* +X57718960Y-122763280D02* +X57058560Y-122102880D01* +D39* +X50688240Y-127071120D02* +X51734720Y-128117600D01* +X42864340Y-128351980D02* +X44145200Y-127071120D01* +X44145200Y-127071120D02* +X44262040Y-126954280D01* +X44262040Y-126954280D02* +X44262040Y-125089920D01* +D38* +X42692280Y-129988920D02* +X42864340Y-129816860D01* +D39* +X54127400Y-142476600D02* +X54127400Y-143882680D01* +X54127400Y-143882680D02* +X54445600Y-144200880D01* +X54445600Y-144200880D02* +X55544720Y-144200880D01* +D38* +X44226480Y-150805580D02* +X45304140Y-150805580D01* +X45304140Y-150805580D02* +X45577760Y-151079200D01* +X54445600Y-144200880D02* +X54234080Y-144200880D01* +X54234080Y-144200880D02* +X54127400Y-144094200D01* +X54127400Y-144094200D02* +X54127400Y-142476600D01* +D11* +X42827640Y-151102060D02* +X43930000Y-151102060D01* +X43930000Y-151102060D02* +X44226480Y-150805580D01* +D40* +X70855840Y-125597920D02* +X74445560Y-125597920D01* +X74445560Y-125597920D02* +X75072240Y-126224600D01* +X46802040Y-125089920D02* +X46802040Y-123987560D01* +X70855840Y-122646440D02* +X70855840Y-125597920D01* +X68112640Y-119903240D02* +X70855840Y-122646440D01* +X50886360Y-119903240D02* +X68112640Y-119903240D01* +X46802040Y-123987560D02* +X50886360Y-119903240D01* +D38* +X74445560Y-125597920D02* +X75072240Y-126224600D01* +D39* +X58795220Y-150964900D02* +X58795220Y-154005980D01* +X58795220Y-154005980D02* +X58788300Y-154012900D01* +D38* +X58788300Y-154012900D02* +X58788300Y-150971820D01* +X58788300Y-150971820D02* +X58795220Y-150964900D01* +D39* +X60295220Y-150964900D02* +X60439300Y-150964900D01* +X60439300Y-150964900D02* +X61328300Y-151853900D01* +X61328300Y-151853900D02* +X61328300Y-154012900D01* +X60198700Y-148577300D02* +X60198700Y-150868380D01* +X60198700Y-150868380D02* +X60295220Y-150964900D01* +D38* +X60198700Y-150868380D02* +X60295220Y-150964900D01* +X60286900Y-150956580D02* +X60295220Y-150964900D01* +X60439300Y-150964900D02* +X61328300Y-151853900D01* +X61328300Y-151853900D02* +X61328300Y-154012900D01* +D39* +X56596280Y-149461920D02* +X57106120Y-149461920D01* +X57106120Y-149461920D02* +X57708800Y-148859240D01* +X51628040Y-149618700D02* +X53779400Y-149618700D01* +X53779400Y-149618700D02* +X53936180Y-149461920D01* +X53936180Y-149461920D02* +X56596280Y-149461920D01* +X56596280Y-149461920D02* +X53936180Y-149461920D01* +X53936180Y-149461920D02* +X53817500Y-149580600D01* +D40* +X43665140Y-142305840D02* +X48255120Y-142305840D01* +X48255120Y-142305840D02* +X48381920Y-142179040D01* +D39* +X48255120Y-142305840D02* +X48381920Y-142179040D01* +D38* +X53817500Y-149580600D02* +X56477600Y-149580600D01* +X56477600Y-149580600D02* +X56596280Y-149461920D01* +D40* +X43665140Y-142305840D02* +X43665140Y-144449800D01* +D39* +X51666140Y-149580600D02* +X53817500Y-149580600D01* +X51628040Y-149618700D02* +X51666140Y-149580600D01* +X57708800Y-148859240D02* +X57708800Y-146177000D01* +X65603120Y-128579880D02* +X65635680Y-128547320D01* +D40* +X63108140Y-143109380D02* +X63108140Y-143080040D01* +X61305440Y-144912080D02* +X63108140Y-143109380D01* +X63108140Y-141988540D02* +X63108140Y-143080040D01* +X63108140Y-143080040D02* +X63553340Y-143525240D01* +X63553340Y-143525240D02* +X66880740Y-143525240D01* +X66880740Y-143525240D02* +X69230240Y-141175740D01* +X69230240Y-141175740D02* +X73409240Y-141175740D01* +X73409240Y-141175740D02* +X73941940Y-140643040D01* +X71201280Y-144505680D02* +X69829680Y-144505680D01* +X69829680Y-144505680D02* +X69230240Y-143906240D01* +X69230240Y-143906240D02* +X69230240Y-141175740D01* +D39* +X69230240Y-141175740D02* +X66880740Y-143525240D01* +X66880740Y-143525240D02* +X63553340Y-143525240D01* +X63553340Y-143525240D02* +X63108140Y-143080040D01* +X73409240Y-141175740D02* +X73941940Y-140643040D01* +X69230240Y-143906240D02* +X69230240Y-141175740D01* +X69829680Y-144505680D02* +X69230240Y-143906240D01* +D38* +X63108140Y-141988540D02* +X62923420Y-141988540D01* +D40* +X70855840Y-128137920D02* +X74658920Y-128137920D01* +X74658920Y-128137920D02* +X75072240Y-127724600D01* +D39* +X65635680Y-128547320D02* +X65635680Y-127259120D01* +D38* +X74658920Y-128137920D02* +X75072240Y-127724600D01* +X73409240Y-141175740D02* +X73941940Y-140643040D01* +X63553340Y-143525240D02* +X66880740Y-143525240D01* +X63108140Y-143080040D02* +X63553340Y-143525240D01* +X63108140Y-141988540D02* +X63108140Y-143080040D01* +D40* +X73941940Y-139143040D02* +X73727880Y-139143040D01* +X73727880Y-139143040D02* +X73220580Y-138635740D01* +X73220580Y-138635740D02* +X69230240Y-138635740D01* +X73941940Y-139143040D02* +X73941940Y-134838440D01* +X73941940Y-134838440D02* +X73980040Y-134800340D01* +D39* +X73941940Y-134838440D02* +X73980040Y-134800340D01* +X64608140Y-137822940D02* +X67579240Y-137822940D01* +X67579240Y-137822940D02* +X68392040Y-138635740D01* +X68392040Y-138635740D02* +X69230240Y-138635740D01* +X73727880Y-139143040D02* +X73220580Y-138635740D01* +X73220580Y-138635740D02* +X69230240Y-138635740D01* +D38* +X73941940Y-134838440D02* +X73980040Y-134800340D01* +X69230240Y-138635740D02* +X73434640Y-138635740D01* +X73434640Y-138635740D02* +X73941940Y-139143040D01* +X69230240Y-138635740D02* +X68392040Y-138635740D01* +X68392040Y-138635740D02* +X67579240Y-137822940D01* +X68435680Y-126309120D02* +X68435680Y-127421180D01* +X68435680Y-127421180D02* +X63957200Y-131899660D01* +X48417500Y-145770600D02* +X48417500Y-145201620D01* +X56047640Y-140787120D02* +X55849520Y-140787120D01* +X56306720Y-141046200D02* +X56047640Y-140787120D01* +X48417500Y-145201620D02* +X48823880Y-144795240D01* +X54927400Y-142476600D02* +X54927400Y-141709240D01* +X54927400Y-141709240D02* +X55849520Y-140787120D01* +X55849520Y-140787120D02* +X55902860Y-140733780D01* +X55902860Y-140733780D02* +X55902860Y-139423140D01* +X55902860Y-139423140D02* +X56512460Y-138813540D01* +X56512460Y-138813540D02* +X57419240Y-138813540D01* +X57419240Y-138813540D02* +X58432300Y-139826600D01* +X58432300Y-139826600D02* +X59977400Y-139826600D01* +X48417500Y-145770600D02* +X48854360Y-145770600D01* +X48417500Y-147040600D02* +X48417500Y-145770600D01* +X59977400Y-136626600D02* +X61300360Y-136626600D01* +X55707280Y-150850600D02* +X53817500Y-150850600D01* +X61610240Y-141290040D02* +X56687720Y-146212560D01* +X61610240Y-136936480D02* +X61610240Y-141290040D01* +X61300360Y-136626600D02* +X61610240Y-136936480D01* +X55727400Y-130776600D02* +X55727400Y-131846120D01* +X59339360Y-131988560D02* +X59977400Y-132626600D01* +X55869840Y-131988560D02* +X59339360Y-131988560D01* +X55727400Y-131846120D02* +X55869840Y-131988560D01* +X58127400Y-130776600D02* +X58127400Y-130487920D01* +X58127400Y-130487920D02* +X59507120Y-129108200D01* +X59507120Y-129108200D02* +X60243720Y-129108200D01* +X62275720Y-127838200D02* +X62275720Y-127213360D01* +X54127400Y-129479040D02* +X54127400Y-130776600D01* +X54935120Y-128671320D02* +X54127400Y-129479040D01* +X55824120Y-128671320D02* +X54935120Y-128671320D01* +X55859680Y-128635760D02* +X55824120Y-128671320D01* +X58938160Y-128625600D02* +X57246520Y-128625600D01* +X58968640Y-128595120D02* +X58938160Y-128625600D01* +X62021720Y-126959360D02* +X60071000Y-126959360D01* +X62275720Y-127213360D02* +X62021720Y-126959360D01* +X48277400Y-133426600D02* +X50794520Y-133426600D01* +X64597320Y-125359120D02* +X65635680Y-125359120D01* +X64490600Y-125465840D02* +X64597320Y-125359120D01* +X64490600Y-126171960D02* +X64490600Y-125465840D01* +X64759840Y-126441200D02* +X64490600Y-126171960D01* +X64759840Y-128117600D02* +X64759840Y-126441200D01* +X64698880Y-128178560D02* +X64759840Y-128117600D01* +X64698880Y-129092960D02* +X64698880Y-128178560D01* +X63799720Y-129992120D02* +X64698880Y-129092960D01* +X61076840Y-129992120D02* +X63799720Y-129992120D01* +X60858400Y-130210560D02* +X61076840Y-129992120D01* +X54477920Y-132730240D02* +X58440320Y-132730240D01* +X54193440Y-133014720D02* +X54477920Y-132730240D01* +X50794520Y-133426600D02* +X50942240Y-133278880D01* +X40127360Y-135249260D02* +X41746780Y-135249260D01* +X45836640Y-135026600D02* +X48277400Y-135026600D01* +X45326300Y-135536940D02* +X45836640Y-135026600D01* +X41746780Y-135249260D02* +X42057320Y-135559800D01* +X40127360Y-135899260D02* +X41505240Y-135899260D01* +X46319340Y-135826600D02* +X48277400Y-135826600D01* +X45453300Y-136692640D02* +X46319340Y-135826600D01* +X41505240Y-135899260D02* +X42092880Y-136486900D01* +X48277400Y-136626600D02* +X50373280Y-136626600D01* +X71350440Y-147352320D02* +X72478900Y-147352320D01* +X71241920Y-147243800D02* +X71350440Y-147352320D01* +X50373280Y-136626600D02* +X51099720Y-137353040D01* +X48277400Y-137426600D02* +X50050600Y-137426600D01* +X68832160Y-147088160D02* +X70004940Y-147088160D01* +X68813680Y-147106640D02* +X68832160Y-147088160D01* +X50050600Y-137426600D02* +X50678080Y-138054080D01* +X48277400Y-139826600D02* +X49576120Y-139826600D01* +X66215960Y-147047520D02* +X67449700Y-147047520D01* +X66212720Y-147050760D02* +X66215960Y-147047520D01* +X49576120Y-139826600D02* +X49982120Y-139420600D01* +X48277400Y-140626600D02* +X49731160Y-140626600D01* +X63799020Y-147009420D02* +X64785240Y-147009420D01* +X63113920Y-146324320D02* +X63799020Y-147009420D01* +X49731160Y-140626600D02* +X50881280Y-139476480D01* +X57718960Y-126258320D02* +X57546240Y-126258320D01* +X57546240Y-126258320D02* +X55849520Y-127955040D01* +X50127400Y-141007600D02* +X50127400Y-142476600D01* +X50149760Y-140985240D02* +X50127400Y-141007600D01* +X50764440Y-140985240D02* +X50149760Y-140985240D01* +X51739800Y-140009880D02* +X50764440Y-140985240D01* +X51739800Y-132532120D02* +X51739800Y-140009880D01* +X51551840Y-132344160D02* +X51739800Y-132532120D01* +X55849520Y-127955040D02* +X55011320Y-127955040D01* +X50927400Y-142476600D02* +X50927400Y-141731600D01* +X50927400Y-141731600D02* +X52496720Y-140162280D01* +X57383680Y-134467600D02* +X57383680Y-133664960D01* +X55265320Y-136585960D02* +X57383680Y-134467600D01* +X52496720Y-136657080D02* +X52491640Y-136652000D01* +X52496720Y-140162280D02* +X52496720Y-136657080D01* +X50927400Y-142476600D02* +X50927400Y-141696040D01* +X50927400Y-142476600D02* +X50927400Y-141716360D01* +X48417500Y-152120600D02* +X48686720Y-152120600D01* +X48686720Y-152120600D02* +X50820320Y-149987000D01* +X56527400Y-144010680D02* +X56527400Y-142476600D01* +X56509920Y-144028160D02* +X56527400Y-144010680D01* +X50820320Y-148559520D02* +X52202080Y-147177760D01* +X50820320Y-149987000D02* +X50820320Y-148559520D01* +X48417500Y-153390600D02* +X48417500Y-152120600D01* +X42400220Y-147272440D02* +X44324840Y-147272440D01* +X58127400Y-141215880D02* +X58127400Y-142476600D01* +X57952640Y-141041120D02* +X58127400Y-141215880D01* +X47548800Y-143804640D02* +X48828960Y-143804640D01* +X45557440Y-145796000D02* +X47548800Y-143804640D01* +X44324840Y-147272440D02* +X44500800Y-147096480D01* +X58196480Y-142407520D02* +X58127400Y-142476600D01* +D11* +X41271760Y-149009100D02* +X41271760Y-148400900D01* +X41271760Y-148400900D02* +X42400220Y-147272440D01* +X41327640Y-151102060D02* +X41327640Y-149064980D01* +X41327640Y-149064980D02* +X41271760Y-149009100D01* +X42484040Y-152838720D02* +X41728960Y-152838720D01* +X41327640Y-152437400D02* +X41327640Y-151102060D01* +X41728960Y-152838720D02* +X41327640Y-152437400D01* +D38* +X64897000Y-153995120D02* +X64897000Y-151592980D01* +X64897000Y-151592980D02* +X64823340Y-151519320D01* +X67437000Y-151684420D02* +X67487800Y-151633620D01* +X67437000Y-153995120D02* +X67437000Y-151684420D01* +X69977000Y-153995120D02* +X69977000Y-151664100D01* +X69977000Y-151664100D02* +X70081140Y-151559960D01* +X72517000Y-153995120D02* +X72517000Y-151709820D01* +X62931040Y-128473200D02* +X64119760Y-127284480D01* +X62275720Y-128473200D02* +X62931040Y-128473200D01* +X60243720Y-128473200D02* +X61112400Y-128473200D01* +X61112400Y-128473200D02* +X61132720Y-128452880D01* +D11* +X42484040Y-154338720D02* +X43387580Y-154338720D01* +X46875700Y-150850600D02* +X48417500Y-150850600D01* +X43387580Y-154338720D02* +X46875700Y-150850600D01* +X40983600Y-154289760D02* +X42435080Y-154289760D01* +X42435080Y-154289760D02* +X42484040Y-154338720D01* +X42400220Y-145772440D02* +X44345160Y-145772440D01* +X46883320Y-148310600D02* +X48417500Y-148310600D01* +X44345160Y-145772440D02* +X46883320Y-148310600D01* +X40968360Y-145481040D02* +X42108820Y-145481040D01* +X42108820Y-145481040D02* +X42400220Y-145772440D01* +D38* +X72478900Y-148852320D02* +X72478900Y-150171720D01* +X72478900Y-150171720D02* +X72517000Y-150209820D01* +X70004940Y-148588160D02* +X70004940Y-149983760D01* +X70004940Y-149983760D02* +X70081140Y-150059960D01* +X67449700Y-148547520D02* +X67449700Y-150095520D01* +X67449700Y-150095520D02* +X67487800Y-150133620D01* +X64785240Y-148509420D02* +X64785240Y-149981220D01* +X64785240Y-149981220D02* +X64823340Y-150019320D01* +D39* +X58673300Y-146011900D02* +X58673300Y-148551900D01* +X58673300Y-148551900D02* +X58698700Y-148577300D01* +D38* +X58673300Y-148551900D02* +X58698700Y-148577300D01* +X53817500Y-152120600D02* +X55874920Y-152120600D01* +X60223400Y-147203160D02* +X60223400Y-147218400D01* +X60192920Y-147203160D02* +X60223400Y-147203160D01* +X57876440Y-150119080D02* +X57876440Y-149839680D01* +X55874920Y-152120600D02* +X57876440Y-150119080D01* +D39* +X60223400Y-147218400D02* +X60223400Y-146062000D01* +X60223400Y-146062000D02* +X60173300Y-146011900D01* +D38* +X53817500Y-153390600D02* +X53817500Y-152120600D01* +X53817500Y-152120600D02* +X53893700Y-152044400D01* +X60223400Y-147218400D02* +X60173300Y-147168300D01* +X60173300Y-147168300D02* +X60173300Y-146011900D01* +X63146240Y-139816840D02* +X63146240Y-137861040D01* +X63146240Y-137861040D02* +X63108140Y-137822940D01* +X64608140Y-141988540D02* +X64608140Y-139854940D01* +X64608140Y-139854940D02* +X64646240Y-139816840D01* +M02* diff --git a/PCB/OUTPUT/Tinylab_proto1-F_Mask.gts b/PCB/OUTPUT/Tinylab_proto1-F_Mask.gts new file mode 100644 index 00000000..fdb600b7 --- /dev/null +++ b/PCB/OUTPUT/Tinylab_proto1-F_Mask.gts @@ -0,0 +1,250 @@ +G04 #@! TF.FileFunction,Soldermask,Top* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 28/09/2015 1:15:09 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.150000*% +%ADD11R,0.750000X0.800000*% +%ADD12R,0.800000X0.750000*% +%ADD13C,1.501140*% +%ADD14C,1.998980*% +%ADD15R,1.998980X1.998980*% +%ADD16R,2.000000X2.000000*% +%ADD17R,1.600000X0.560000*% +%ADD18R,0.560000X1.600000*% +%ADD19R,2.032000X1.727200*% +%ADD20O,2.032000X1.727200*% +%ADD21R,1.350000X0.400000*% +%ADD22O,0.950000X1.250000*% +%ADD23O,1.550000X1.000000*% +%ADD24R,1.727200X2.032000*% +%ADD25O,1.727200X2.032000*% +%ADD26R,1.727200X1.727200*% +%ADD27O,1.727200X1.727200*% +%ADD28R,2.032000X2.032000*% +%ADD29O,2.032000X2.032000*% +%ADD30R,0.900000X0.600000*% +%ADD31R,0.500000X0.900000*% +%ADD32R,0.900000X0.500000*% +%ADD33R,0.600000X0.900000*% +%ADD34R,1.500000X0.600000*% +%ADD35R,0.508000X0.304800*% +G04 APERTURE END LIST* +D10* +D11* +X39319200Y-152682640D03* +X39319200Y-151182640D03* +X39278560Y-147088160D03* +X39278560Y-148588160D03* +X43682920Y-135526080D03* +X43682920Y-137026080D03* +D12* +X42864340Y-129816860D03* +X44364340Y-129816860D03* +D11* +X44226480Y-150805580D03* +X44226480Y-149305580D03* +D13* +X70855840Y-128137920D03* +X70855840Y-125597920D03* +D12* +X58795220Y-150964900D03* +X60295220Y-150964900D03* +D11* +X75072240Y-126224600D03* +X75072240Y-127724600D03* +X56596280Y-147961920D03* +X56596280Y-149461920D03* +D13* +X69230240Y-141175740D03* +X69230240Y-138635740D03* +D11* +X73941940Y-139143040D03* +X73941940Y-140643040D03* +D14* +X63820040Y-134800340D03* +D15* +X73980040Y-134800340D03* +D16* +X43665140Y-139105840D03* +X43665140Y-142305840D03* +D17* +X59977400Y-140626600D03* +X59977400Y-139826600D03* +X59977400Y-139026600D03* +X59977400Y-138226600D03* +X59977400Y-137426600D03* +X59977400Y-136626600D03* +X59977400Y-135826600D03* +X59977400Y-135026600D03* +X59977400Y-134226600D03* +X59977400Y-133426600D03* +X59977400Y-132626600D03* +D18* +X58127400Y-130776600D03* +X57327400Y-130776600D03* +X56527400Y-130776600D03* +X55727400Y-130776600D03* +X54927400Y-130776600D03* +X54127400Y-130776600D03* +X53327400Y-130776600D03* +X52527400Y-130776600D03* +X51727400Y-130776600D03* +X50927400Y-130776600D03* +X50127400Y-130776600D03* +D17* +X48277400Y-132626600D03* +X48277400Y-133426600D03* +X48277400Y-134226600D03* +X48277400Y-135026600D03* +X48277400Y-135826600D03* +X48277400Y-136626600D03* +X48277400Y-137426600D03* +X48277400Y-138226600D03* +X48277400Y-139026600D03* +X48277400Y-139826600D03* +X48277400Y-140626600D03* +D18* +X50127400Y-142476600D03* +X50927400Y-142476600D03* +X51727400Y-142476600D03* +X52527400Y-142476600D03* +X53327400Y-142476600D03* +X54127400Y-142476600D03* +X54927400Y-142476600D03* +X55727400Y-142476600D03* +X56527400Y-142476600D03* +X57327400Y-142476600D03* +X58127400Y-142476600D03* +D14* +X74117200Y-131899660D03* +D15* +X63957200Y-131899660D03* +D19* +X36258500Y-146100800D03* +D20* +X36258500Y-148640800D03* +X36258500Y-151180800D03* +X36258500Y-153720800D03* +D21* +X40127360Y-134599260D03* +X40127360Y-135249260D03* +X40127360Y-135899260D03* +X40127360Y-136549260D03* +X40127360Y-137199260D03* +D22* +X40127360Y-133399260D03* +X40127360Y-138399260D03* +D23* +X37427360Y-132399260D03* +X37427360Y-139399260D03* +D24* +X64861440Y-154310080D03* +D25* +X67401440Y-154310080D03* +X69941440Y-154310080D03* +X72481440Y-154310080D03* +D26* +X57718960Y-123718320D03* +D27* +X57718960Y-126258320D03* +X55178960Y-123718320D03* +X55178960Y-126258320D03* +D24* +X49342040Y-125089920D03* +D25* +X46802040Y-125089920D03* +X44262040Y-125089920D03* +D28* +X61328300Y-154012900D03* +D29* +X58788300Y-154012900D03* +D28* +X73741280Y-144505680D03* +D29* +X71201280Y-144505680D03* +D28* +X65714880Y-122570240D03* +D29* +X63174880Y-122570240D03* +D30* +X68435680Y-126309120D03* +X65635680Y-127259120D03* +X65635680Y-125359120D03* +D31* +X40983600Y-154289760D03* +X39483600Y-154289760D03* +X40968360Y-145481040D03* +X39468360Y-145481040D03* +D32* +X42484040Y-154338720D03* +X42484040Y-152838720D03* +X42400220Y-147272440D03* +X42400220Y-145772440D03* +D31* +X42827640Y-151102060D03* +X41327640Y-151102060D03* +X42771760Y-149009100D03* +X41271760Y-149009100D03* +D32* +X72517000Y-150209820D03* +X72517000Y-151709820D03* +X70081140Y-150059960D03* +X70081140Y-151559960D03* +X67487800Y-150133620D03* +X67487800Y-151633620D03* +X64823340Y-150019320D03* +X64823340Y-151519320D03* +X72478900Y-147352320D03* +X72478900Y-148852320D03* +X70004940Y-147088160D03* +X70004940Y-148588160D03* +X67449700Y-147047520D03* +X67449700Y-148547520D03* +X64785240Y-147009420D03* +X64785240Y-148509420D03* +D31* +X58673300Y-146011900D03* +X60173300Y-146011900D03* +X60198700Y-148577300D03* +X58698700Y-148577300D03* +X64608140Y-137822940D03* +X63108140Y-137822940D03* +X63146240Y-139816840D03* +X64646240Y-139816840D03* +X64608140Y-141988540D03* +X63108140Y-141988540D03* +D33* +X43642280Y-134191200D03* +X42692280Y-131391200D03* +X44592280Y-131391200D03* +D34* +X48417500Y-145770600D03* +X48417500Y-147040600D03* +X48417500Y-148310600D03* +X48417500Y-149580600D03* +X48417500Y-150850600D03* +X48417500Y-152120600D03* +X48417500Y-153390600D03* +X53817500Y-153390600D03* +X53817500Y-152120600D03* +X53817500Y-150850600D03* +X53817500Y-149580600D03* +X53817500Y-148310600D03* +X53817500Y-147040600D03* +X53817500Y-145770600D03* +D35* +X60243720Y-127838200D03* +X60243720Y-129108200D03* +X62275720Y-128473200D03* +X60243720Y-128473200D03* +X62275720Y-129108200D03* +X62275720Y-127838200D03* +D12* +X52036280Y-128427480D03* +X53536280Y-128427480D03* +X54445600Y-144200880D03* +X52945600Y-144200880D03* +M02* diff --git a/PCB/OUTPUT/Tinylab_proto1-F_SilkS.gto b/PCB/OUTPUT/Tinylab_proto1-F_SilkS.gto new file mode 100644 index 00000000..dd95c161 --- /dev/null +++ b/PCB/OUTPUT/Tinylab_proto1-F_SilkS.gto @@ -0,0 +1,1883 @@ +G04 #@! TF.FileFunction,Legend,Top* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 28/09/2015 1:15:09 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.150000*% +%ADD11C,0.152400*% +%ADD12C,0.127000*% +G04 APERTURE END LIST* +D10* +X38719200Y-152282640D02* +X38719200Y-151582640D01* +X39919200Y-151582640D02* +X39919200Y-152282640D01* +X39878560Y-147488160D02* +X39878560Y-148188160D01* +X38678560Y-148188160D02* +X38678560Y-147488160D01* +X44282920Y-135926080D02* +X44282920Y-136626080D01* +X43082920Y-136626080D02* +X43082920Y-135926080D01* +X43264340Y-129216860D02* +X43964340Y-129216860D01* +X43964340Y-130416860D02* +X43264340Y-130416860D01* +X43626480Y-150405580D02* +X43626480Y-149705580D01* +X44826480Y-149705580D02* +X44826480Y-150405580D01* +X72555100Y-125867160D02* +X72555100Y-126367540D01* +X72555100Y-125867160D02* +X73055480Y-125867160D01* +X72555100Y-125366780D02* +X72555100Y-125867160D01* +X72555100Y-125867160D02* +X72156320Y-125867160D01* +X72156320Y-125867160D02* +X72054720Y-125867160D01* +X74005440Y-126867920D02* +G75* +G03X74005440Y-126867920I-3149600J0D01* +G01* +X59195220Y-150364900D02* +X59895220Y-150364900D01* +X59895220Y-151564900D02* +X59195220Y-151564900D01* +X75672240Y-126624600D02* +X75672240Y-127324600D01* +X74472240Y-127324600D02* +X74472240Y-126624600D01* +X57196280Y-148361920D02* +X57196280Y-149061920D01* +X55996280Y-149061920D02* +X55996280Y-148361920D01* +X70929500Y-138904980D02* +X70929500Y-139405360D01* +X70929500Y-138904980D02* +X71429880Y-138904980D01* +X70929500Y-138404600D02* +X70929500Y-138904980D01* +X70929500Y-138904980D02* +X70530720Y-138904980D01* +X70530720Y-138904980D02* +X70429120Y-138904980D01* +X72379840Y-139905740D02* +G75* +G03X72379840Y-139905740I-3149600J0D01* +G01* +X74541940Y-139543040D02* +X74541940Y-140243040D01* +X73341940Y-140243040D02* +X73341940Y-139543040D01* +X66360040Y-134800340D02* +X65344040Y-134800340D01* +X71186040Y-134800340D02* +X72456040Y-134800340D01* +X70932040Y-136070340D02* +X70932040Y-133530340D01* +X70678040Y-136070340D02* +X70678040Y-133530340D01* +X70424040Y-136070340D02* +X70424040Y-133530340D01* +X71186040Y-136070340D02* +X71186040Y-133530340D01* +X70170040Y-136070340D02* +X71440040Y-133530340D01* +X71440040Y-136070340D02* +X70170040Y-133530340D01* +X70170040Y-136070340D02* +X70170040Y-133530340D01* +X70805040Y-136070340D02* +X70805040Y-133530340D01* +X71440040Y-133530340D02* +X71440040Y-136070340D01* +X71440040Y-136070340D02* +X66360040Y-136070340D01* +X66360040Y-136070340D02* +X66360040Y-133530340D01* +X66360040Y-133530340D02* +X71440040Y-133530340D01* +X42865140Y-139105840D02* +X44465140Y-139105840D01* +X44465140Y-139105840D02* +X44465140Y-142305840D01* +X44465140Y-142305840D02* +X42865140Y-142305840D01* +X42865140Y-142305840D02* +X42865140Y-139105840D01* +X59302400Y-141801600D02* +X59302400Y-141131600D01* +X48952400Y-141801600D02* +X48952400Y-141131600D01* +X48952400Y-131451600D02* +X48952400Y-132121600D01* +X59302400Y-131451600D02* +X59302400Y-132121600D01* +X59302400Y-141801600D02* +X58632400Y-141801600D01* +X59302400Y-131451600D02* +X58632400Y-131451600D01* +X48952400Y-131451600D02* +X49622400Y-131451600D01* +X48952400Y-141801600D02* +X49622400Y-141801600D01* +X59302400Y-141131600D02* +X60777400Y-141131600D01* +X71577200Y-131899660D02* +X72593200Y-131899660D01* +X66751200Y-131899660D02* +X65481200Y-131899660D01* +X67005200Y-130629660D02* +X67005200Y-133169660D01* +X67259200Y-130629660D02* +X67259200Y-133169660D01* +X67513200Y-130629660D02* +X67513200Y-133169660D01* +X66751200Y-130629660D02* +X66751200Y-133169660D01* +X67767200Y-130629660D02* +X66497200Y-133169660D01* +X66497200Y-130629660D02* +X67767200Y-133169660D01* +X67767200Y-130629660D02* +X67767200Y-133169660D01* +X67132200Y-130629660D02* +X67132200Y-133169660D01* +X66497200Y-133169660D02* +X66497200Y-130629660D01* +X66497200Y-130629660D02* +X71577200Y-130629660D01* +X71577200Y-130629660D02* +X71577200Y-133169660D01* +X71577200Y-133169660D02* +X66497200Y-133169660D01* +X34988500Y-147370800D02* +X34988500Y-154990800D01* +X37528500Y-147370800D02* +X37528500Y-154990800D01* +X37808500Y-144550800D02* +X37808500Y-146100800D01* +X34988500Y-154990800D02* +X37528500Y-154990800D01* +X37528500Y-147370800D02* +X34988500Y-147370800D01* +X34708500Y-146100800D02* +X34708500Y-144550800D01* +X34708500Y-144550800D02* +X37808500Y-144550800D01* +X34747360Y-131549260D02* +X34747360Y-140249260D01* +X41152360Y-131549260D02* +X41152360Y-140249260D01* +X41152360Y-140249260D02* +X34747360Y-140249260D01* +X35977360Y-140249260D02* +X35977360Y-131549260D01* +X34747360Y-131549260D02* +X41152360Y-131549260D01* +X66131440Y-155580080D02* +X73751440Y-155580080D01* +X66131440Y-153040080D02* +X73751440Y-153040080D01* +X63311440Y-152760080D02* +X64861440Y-152760080D01* +X73751440Y-155580080D02* +X73751440Y-153040080D01* +X66131440Y-153040080D02* +X66131440Y-155580080D01* +X64861440Y-155860080D02* +X63311440Y-155860080D01* +X63311440Y-155860080D02* +X63311440Y-152760080D01* +X57718960Y-122168320D02* +X59268960Y-122168320D01* +X59268960Y-123718320D02* +X59268960Y-122168320D01* +X56448960Y-122448320D02* +X56448960Y-124988320D01* +X56448960Y-124988320D02* +X58988960Y-124988320D01* +X58988960Y-124988320D02* +X58988960Y-127528320D01* +X58988960Y-127528320D02* +X53908960Y-127528320D01* +X53908960Y-127528320D02* +X53908960Y-122448320D01* +X53908960Y-122448320D02* +X56448960Y-122448320D01* +X48072040Y-123819920D02* +X42992040Y-123819920D01* +X42992040Y-123819920D02* +X42992040Y-126359920D01* +X42992040Y-126359920D02* +X48072040Y-126359920D01* +X50892040Y-126639920D02* +X49342040Y-126639920D01* +X48072040Y-126359920D02* +X48072040Y-123819920D01* +X49342040Y-123539920D02* +X50892040Y-123539920D01* +X50892040Y-123539920D02* +X50892040Y-126639920D01* +X60058300Y-155282900D02* +X57518300Y-155282900D01* +X62878300Y-155562900D02* +X61328300Y-155562900D01* +X60058300Y-155282900D02* +X60058300Y-152742900D01* +X61328300Y-152462900D02* +X62878300Y-152462900D01* +X62878300Y-152462900D02* +X62878300Y-155562900D01* +X60058300Y-152742900D02* +X57518300Y-152742900D01* +X57518300Y-152742900D02* +X57518300Y-155282900D01* +X72471280Y-145775680D02* +X69931280Y-145775680D01* +X75291280Y-146055680D02* +X73741280Y-146055680D01* +X72471280Y-145775680D02* +X72471280Y-143235680D01* +X73741280Y-142955680D02* +X75291280Y-142955680D01* +X75291280Y-142955680D02* +X75291280Y-146055680D01* +X72471280Y-143235680D02* +X69931280Y-143235680D01* +X69931280Y-143235680D02* +X69931280Y-145775680D01* +X64444880Y-123840240D02* +X61904880Y-123840240D01* +X67264880Y-124120240D02* +X65714880Y-124120240D01* +X64444880Y-123840240D02* +X64444880Y-121300240D01* +X65714880Y-121020240D02* +X67264880Y-121020240D01* +X67264880Y-121020240D02* +X67264880Y-124120240D01* +X64444880Y-121300240D02* +X61904880Y-121300240D01* +X61904880Y-121300240D02* +X61904880Y-123840240D01* +X66777101Y-125309120D02* +G75* +G03X66777101Y-125309120I-141421J0D01* +G01* +X66235680Y-127809120D02* +X67835680Y-127809120D01* +X67835680Y-127809120D02* +X67835680Y-124809120D01* +X67835680Y-124809120D02* +X66235680Y-124809120D01* +X66235680Y-124809120D02* +X66235680Y-127809120D01* +X39733600Y-153614760D02* +X40733600Y-153614760D01* +X40733600Y-154964760D02* +X39733600Y-154964760D01* +X39718360Y-144806040D02* +X40718360Y-144806040D01* +X40718360Y-146156040D02* +X39718360Y-146156040D01* +X43159040Y-153088720D02* +X43159040Y-154088720D01* +X41809040Y-154088720D02* +X41809040Y-153088720D01* +X43075220Y-146022440D02* +X43075220Y-147022440D01* +X41725220Y-147022440D02* +X41725220Y-146022440D01* +X41577640Y-150427060D02* +X42577640Y-150427060D01* +X42577640Y-151777060D02* +X41577640Y-151777060D01* +X41521760Y-148334100D02* +X42521760Y-148334100D01* +X42521760Y-149684100D02* +X41521760Y-149684100D01* +X71842000Y-151459820D02* +X71842000Y-150459820D01* +X73192000Y-150459820D02* +X73192000Y-151459820D01* +X69406140Y-151309960D02* +X69406140Y-150309960D01* +X70756140Y-150309960D02* +X70756140Y-151309960D01* +X66812800Y-151383620D02* +X66812800Y-150383620D01* +X68162800Y-150383620D02* +X68162800Y-151383620D01* +X64148340Y-151269320D02* +X64148340Y-150269320D01* +X65498340Y-150269320D02* +X65498340Y-151269320D01* +X71803900Y-148602320D02* +X71803900Y-147602320D01* +X73153900Y-147602320D02* +X73153900Y-148602320D01* +X69329940Y-148338160D02* +X69329940Y-147338160D01* +X70679940Y-147338160D02* +X70679940Y-148338160D01* +X66774700Y-148297520D02* +X66774700Y-147297520D01* +X68124700Y-147297520D02* +X68124700Y-148297520D01* +X64110240Y-148259420D02* +X64110240Y-147259420D01* +X65460240Y-147259420D02* +X65460240Y-148259420D01* +X59923300Y-146686900D02* +X58923300Y-146686900D01* +X58923300Y-145336900D02* +X59923300Y-145336900D01* +X58948700Y-147902300D02* +X59948700Y-147902300D01* +X59948700Y-149252300D02* +X58948700Y-149252300D01* +X63358140Y-137147940D02* +X64358140Y-137147940D01* +X64358140Y-138497940D02* +X63358140Y-138497940D01* +X64396240Y-140491840D02* +X63396240Y-140491840D01* +X63396240Y-139141840D02* +X64396240Y-139141840D01* +X63358140Y-141313540D02* +X64358140Y-141313540D01* +X64358140Y-142663540D02* +X63358140Y-142663540D01* +X44783701Y-132391200D02* +G75* +G03X44783701Y-132391200I-141421J0D01* +G01* +X42142280Y-131991200D02* +X42142280Y-133591200D01* +X42142280Y-133591200D02* +X45142280Y-133591200D01* +X45142280Y-133591200D02* +X45142280Y-131991200D01* +X45142280Y-131991200D02* +X42142280Y-131991200D01* +X49042500Y-145130600D02* +X49042500Y-145245600D01* +X53192500Y-145130600D02* +X53192500Y-145245600D01* +X53192500Y-154030600D02* +X53192500Y-153915600D01* +X49042500Y-154030600D02* +X49042500Y-153915600D01* +X49042500Y-145130600D02* +X53192500Y-145130600D01* +X49042500Y-154030600D02* +X53192500Y-154030600D01* +X49042500Y-145245600D02* +X47667500Y-145245600D01* +D11* +X61894720Y-129489200D02* +X61894720Y-127457200D01* +X61894720Y-127457200D02* +X60624720Y-127457200D01* +X60624720Y-127457200D02* +X60624720Y-129489200D01* +X60624720Y-129489200D02* +X61894720Y-129489200D01* +D10* +X52436280Y-127827480D02* +X53136280Y-127827480D01* +X53136280Y-129027480D02* +X52436280Y-129027480D01* +X54045600Y-144800880D02* +X53345600Y-144800880D01* +X53345600Y-143600880D02* +X54045600Y-143600880D01* +X41058103Y-152790186D02* +X41105722Y-152837805D01* +X41153341Y-152980662D01* +X41153341Y-153075900D01* +X41105722Y-153218758D01* +X41010484Y-153313996D01* +X40915246Y-153361615D01* +X40724770Y-153409234D01* +X40581912Y-153409234D01* +X40391436Y-153361615D01* +X40296198Y-153313996D01* +X40200960Y-153218758D01* +X40153341Y-153075900D01* +X40153341Y-152980662D01* +X40200960Y-152837805D01* +X40248579Y-152790186D01* +X41153341Y-151837805D02* +X41153341Y-152409234D01* +X41153341Y-152123520D02* +X40153341Y-152123520D01* +X40296198Y-152218758D01* +X40391436Y-152313996D01* +X40439055Y-152409234D01* +X41063183Y-147567946D02* +X41110802Y-147615565D01* +X41158421Y-147758422D01* +X41158421Y-147853660D01* +X41110802Y-147996518D01* +X41015564Y-148091756D01* +X40920326Y-148139375D01* +X40729850Y-148186994D01* +X40586992Y-148186994D01* +X40396516Y-148139375D01* +X40301278Y-148091756D01* +X40206040Y-147996518D01* +X40158421Y-147853660D01* +X40158421Y-147758422D01* +X40206040Y-147615565D01* +X40253659Y-147567946D01* +X40253659Y-147186994D02* +X40206040Y-147139375D01* +X40158421Y-147044137D01* +X40158421Y-146806041D01* +X40206040Y-146710803D01* +X40253659Y-146663184D01* +X40348897Y-146615565D01* +X40444135Y-146615565D01* +X40586992Y-146663184D01* +X41158421Y-147234613D01* +X41158421Y-146615565D01* +X45736783Y-136391946D02* +X45784402Y-136439565D01* +X45832021Y-136582422D01* +X45832021Y-136677660D01* +X45784402Y-136820518D01* +X45689164Y-136915756D01* +X45593926Y-136963375D01* +X45403450Y-137010994D01* +X45260592Y-137010994D01* +X45070116Y-136963375D01* +X44974878Y-136915756D01* +X44879640Y-136820518D01* +X44832021Y-136677660D01* +X44832021Y-136582422D01* +X44879640Y-136439565D01* +X44927259Y-136391946D01* +X44832021Y-136058613D02* +X44832021Y-135439565D01* +X45212973Y-135772899D01* +X45212973Y-135630041D01* +X45260592Y-135534803D01* +X45308211Y-135487184D01* +X45403450Y-135439565D01* +X45641545Y-135439565D01* +X45736783Y-135487184D01* +X45784402Y-135534803D01* +X45832021Y-135630041D01* +X45832021Y-135915756D01* +X45784402Y-136010994D01* +X45736783Y-136058613D01* +X43460374Y-128794783D02* +X43412755Y-128842402D01* +X43269898Y-128890021D01* +X43174660Y-128890021D01* +X43031802Y-128842402D01* +X42936564Y-128747164D01* +X42888945Y-128651926D01* +X42841326Y-128461450D01* +X42841326Y-128318592D01* +X42888945Y-128128116D01* +X42936564Y-128032878D01* +X43031802Y-127937640D01* +X43174660Y-127890021D01* +X43269898Y-127890021D01* +X43412755Y-127937640D01* +X43460374Y-127985259D01* +X44317517Y-128223354D02* +X44317517Y-128890021D01* +X44079421Y-127842402D02* +X43841326Y-128556688D01* +X44460374Y-128556688D01* +X45970463Y-150189226D02* +X46018082Y-150236845D01* +X46065701Y-150379702D01* +X46065701Y-150474940D01* +X46018082Y-150617798D01* +X45922844Y-150713036D01* +X45827606Y-150760655D01* +X45637130Y-150808274D01* +X45494272Y-150808274D01* +X45303796Y-150760655D01* +X45208558Y-150713036D01* +X45113320Y-150617798D01* +X45065701Y-150474940D01* +X45065701Y-150379702D01* +X45113320Y-150236845D01* +X45160939Y-150189226D01* +X45065701Y-149284464D02* +X45065701Y-149760655D01* +X45541891Y-149808274D01* +X45494272Y-149760655D01* +X45446653Y-149665417D01* +X45446653Y-149427321D01* +X45494272Y-149332083D01* +X45541891Y-149284464D01* +X45637130Y-149236845D01* +X45875225Y-149236845D01* +X45970463Y-149284464D01* +X46018082Y-149332083D01* +X46065701Y-149427321D01* +X46065701Y-149665417D01* +X46018082Y-149760655D01* +X45970463Y-149808274D01* +X72832934Y-124593623D02* +X72785315Y-124641242D01* +X72642458Y-124688861D01* +X72547220Y-124688861D01* +X72404362Y-124641242D01* +X72309124Y-124546004D01* +X72261505Y-124450766D01* +X72213886Y-124260290D01* +X72213886Y-124117432D01* +X72261505Y-123926956D01* +X72309124Y-123831718D01* +X72404362Y-123736480D01* +X72547220Y-123688861D01* +X72642458Y-123688861D01* +X72785315Y-123736480D01* +X72832934Y-123784099D01* +X73690077Y-123688861D02* +X73499600Y-123688861D01* +X73404362Y-123736480D01* +X73356743Y-123784099D01* +X73261505Y-123926956D01* +X73213886Y-124117432D01* +X73213886Y-124498385D01* +X73261505Y-124593623D01* +X73309124Y-124641242D01* +X73404362Y-124688861D01* +X73594839Y-124688861D01* +X73690077Y-124641242D01* +X73737696Y-124593623D01* +X73785315Y-124498385D01* +X73785315Y-124260290D01* +X73737696Y-124165051D01* +X73690077Y-124117432D01* +X73594839Y-124069813D01* +X73404362Y-124069813D01* +X73309124Y-124117432D01* +X73261505Y-124165051D01* +X73213886Y-124260290D01* +X61692494Y-151446503D02* +X61644875Y-151494122D01* +X61502018Y-151541741D01* +X61406780Y-151541741D01* +X61263922Y-151494122D01* +X61168684Y-151398884D01* +X61121065Y-151303646D01* +X61073446Y-151113170D01* +X61073446Y-150970312D01* +X61121065Y-150779836D01* +X61168684Y-150684598D01* +X61263922Y-150589360D01* +X61406780Y-150541741D01* +X61502018Y-150541741D01* +X61644875Y-150589360D01* +X61692494Y-150636979D01* +X62025827Y-150541741D02* +X62692494Y-150541741D01* +X62263922Y-151541741D01* +X74712534Y-130054623D02* +X74664915Y-130102242D01* +X74522058Y-130149861D01* +X74426820Y-130149861D01* +X74283962Y-130102242D01* +X74188724Y-130007004D01* +X74141105Y-129911766D01* +X74093486Y-129721290D01* +X74093486Y-129578432D01* +X74141105Y-129387956D01* +X74188724Y-129292718D01* +X74283962Y-129197480D01* +X74426820Y-129149861D01* +X74522058Y-129149861D01* +X74664915Y-129197480D01* +X74712534Y-129245099D01* +X75283962Y-129578432D02* +X75188724Y-129530813D01* +X75141105Y-129483194D01* +X75093486Y-129387956D01* +X75093486Y-129340337D01* +X75141105Y-129245099D01* +X75188724Y-129197480D01* +X75283962Y-129149861D01* +X75474439Y-129149861D01* +X75569677Y-129197480D01* +X75617296Y-129245099D01* +X75664915Y-129340337D01* +X75664915Y-129387956D01* +X75617296Y-129483194D01* +X75569677Y-129530813D01* +X75474439Y-129578432D01* +X75283962Y-129578432D01* +X75188724Y-129626051D01* +X75141105Y-129673670D01* +X75093486Y-129768909D01* +X75093486Y-129959385D01* +X75141105Y-130054623D01* +X75188724Y-130102242D01* +X75283962Y-130149861D01* +X75474439Y-130149861D01* +X75569677Y-130102242D01* +X75617296Y-130054623D01* +X75664915Y-129959385D01* +X75664915Y-129768909D01* +X75617296Y-129673670D01* +X75569677Y-129626051D01* +X75474439Y-129578432D01* +X55759623Y-148746506D02* +X55807242Y-148794125D01* +X55854861Y-148936982D01* +X55854861Y-149032220D01* +X55807242Y-149175078D01* +X55712004Y-149270316D01* +X55616766Y-149317935D01* +X55426290Y-149365554D01* +X55283432Y-149365554D01* +X55092956Y-149317935D01* +X54997718Y-149270316D01* +X54902480Y-149175078D01* +X54854861Y-149032220D01* +X54854861Y-148936982D01* +X54902480Y-148794125D01* +X54950099Y-148746506D01* +X55854861Y-148270316D02* +X55854861Y-148079840D01* +X55807242Y-147984601D01* +X55759623Y-147936982D01* +X55616766Y-147841744D01* +X55426290Y-147794125D01* +X55045337Y-147794125D01* +X54950099Y-147841744D01* +X54902480Y-147889363D01* +X54854861Y-147984601D01* +X54854861Y-148175078D01* +X54902480Y-148270316D01* +X54950099Y-148317935D01* +X55045337Y-148365554D01* +X55283432Y-148365554D01* +X55378670Y-148317935D01* +X55426290Y-148270316D01* +X55473909Y-148175078D01* +X55473909Y-147984601D01* +X55426290Y-147889363D01* +X55378670Y-147841744D01* +X55283432Y-147794125D01* +X70802263Y-138081023D02* +X70754644Y-138128642D01* +X70611787Y-138176261D01* +X70516549Y-138176261D01* +X70373691Y-138128642D01* +X70278453Y-138033404D01* +X70230834Y-137938166D01* +X70183215Y-137747690D01* +X70183215Y-137604832D01* +X70230834Y-137414356D01* +X70278453Y-137319118D01* +X70373691Y-137223880D01* +X70516549Y-137176261D01* +X70611787Y-137176261D01* +X70754644Y-137223880D01* +X70802263Y-137271499D01* +X71754644Y-138176261D02* +X71183215Y-138176261D01* +X71468929Y-138176261D02* +X71468929Y-137176261D01* +X71373691Y-137319118D01* +X71278453Y-137414356D01* +X71183215Y-137461975D01* +X72707025Y-138176261D02* +X72135596Y-138176261D01* +X72421310Y-138176261D02* +X72421310Y-137176261D01* +X72326072Y-137319118D01* +X72230834Y-137414356D01* +X72135596Y-137461975D01* +X75764663Y-140515577D02* +X75812282Y-140563196D01* +X75859901Y-140706053D01* +X75859901Y-140801291D01* +X75812282Y-140944149D01* +X75717044Y-141039387D01* +X75621806Y-141087006D01* +X75431330Y-141134625D01* +X75288472Y-141134625D01* +X75097996Y-141087006D01* +X75002758Y-141039387D01* +X74907520Y-140944149D01* +X74859901Y-140801291D01* +X74859901Y-140706053D01* +X74907520Y-140563196D01* +X74955139Y-140515577D01* +X75859901Y-139563196D02* +X75859901Y-140134625D01* +X75859901Y-139848911D02* +X74859901Y-139848911D01* +X75002758Y-139944149D01* +X75097996Y-140039387D01* +X75145615Y-140134625D01* +X74955139Y-139182244D02* +X74907520Y-139134625D01* +X74859901Y-139039387D01* +X74859901Y-138801291D01* +X74907520Y-138706053D01* +X74955139Y-138658434D01* +X75050377Y-138610815D01* +X75145615Y-138610815D01* +X75288472Y-138658434D01* +X75859901Y-139229863D01* +X75859901Y-138610815D01* +X68847745Y-132339341D02* +X68847745Y-131339341D01* +X69085840Y-131339341D01* +X69228698Y-131386960D01* +X69323936Y-131482198D01* +X69371555Y-131577436D01* +X69419174Y-131767912D01* +X69419174Y-131910770D01* +X69371555Y-132101246D01* +X69323936Y-132196484D01* +X69228698Y-132291722D01* +X69085840Y-132339341D01* +X68847745Y-132339341D01* +X70371555Y-132339341D02* +X69800126Y-132339341D01* +X70085840Y-132339341D02* +X70085840Y-131339341D01* +X69990602Y-131482198D01* +X69895364Y-131577436D01* +X69800126Y-131625055D01* +X45602851Y-140968053D02* +X45602851Y-141301387D01* +X46126661Y-141301387D02* +X45126661Y-141301387D01* +X45126661Y-140825196D01* +X46126661Y-139920434D02* +X46126661Y-140491863D01* +X46126661Y-140206149D02* +X45126661Y-140206149D01* +X45269518Y-140301387D01* +X45364756Y-140396625D01* +X45412375Y-140491863D01* +X52937850Y-137272021D02* +X52937850Y-136272021D01* +X53985469Y-137176783D02* +X53937850Y-137224402D01* +X53794993Y-137272021D01* +X53699755Y-137272021D01* +X53556897Y-137224402D01* +X53461659Y-137129164D01* +X53414040Y-137033926D01* +X53366421Y-136843450D01* +X53366421Y-136700592D01* +X53414040Y-136510116D01* +X53461659Y-136414878D01* +X53556897Y-136319640D01* +X53699755Y-136272021D01* +X53794993Y-136272021D01* +X53937850Y-136319640D01* +X53985469Y-136367259D01* +X54937850Y-137272021D02* +X54366421Y-137272021D01* +X54652135Y-137272021D02* +X54652135Y-136272021D01* +X54556897Y-136414878D01* +X54461659Y-136510116D01* +X54366421Y-136557735D01* +X68367614Y-135356861D02* +X67891423Y-135356861D01* +X67891423Y-134356861D01* +X69224757Y-135356861D02* +X68653328Y-135356861D01* +X68939042Y-135356861D02* +X68939042Y-134356861D01* +X68843804Y-134499718D01* +X68748566Y-134594956D01* +X68653328Y-134642575D01* +X35614385Y-144287501D02* +X35614385Y-143287501D01* +X35995338Y-143287501D01* +X36090576Y-143335120D01* +X36138195Y-143382739D01* +X36185814Y-143477977D01* +X36185814Y-143620834D01* +X36138195Y-143716072D01* +X36090576Y-143763691D01* +X35995338Y-143811310D01* +X35614385Y-143811310D01* +X37138195Y-144287501D02* +X36566766Y-144287501D01* +X36852480Y-144287501D02* +X36852480Y-143287501D01* +X36757242Y-143430358D01* +X36662004Y-143525596D01* +X36566766Y-143573215D01* +X42467201Y-136638255D02* +X41467201Y-136638255D01* +X41467201Y-136257302D01* +X41514820Y-136162064D01* +X41562439Y-136114445D01* +X41657677Y-136066826D01* +X41800534Y-136066826D01* +X41895772Y-136114445D01* +X41943391Y-136162064D01* +X41991010Y-136257302D01* +X41991010Y-136638255D01* +X41562439Y-135685874D02* +X41514820Y-135638255D01* +X41467201Y-135543017D01* +X41467201Y-135304921D01* +X41514820Y-135209683D01* +X41562439Y-135162064D01* +X41657677Y-135114445D01* +X41752915Y-135114445D01* +X41895772Y-135162064D01* +X42467201Y-135733493D01* +X42467201Y-135114445D01* +X60213821Y-155048175D02* +X59213821Y-155048175D01* +X59213821Y-154667222D01* +X59261440Y-154571984D01* +X59309059Y-154524365D01* +X59404297Y-154476746D01* +X59547154Y-154476746D01* +X59642392Y-154524365D01* +X59690011Y-154571984D01* +X59737630Y-154667222D01* +X59737630Y-155048175D01* +X59213821Y-154143413D02* +X59213821Y-153524365D01* +X59594773Y-153857699D01* +X59594773Y-153714841D01* +X59642392Y-153619603D01* +X59690011Y-153571984D01* +X59785250Y-153524365D01* +X60023345Y-153524365D01* +X60118583Y-153571984D01* +X60166202Y-153619603D01* +X60213821Y-153714841D01* +X60213821Y-154000556D01* +X60166202Y-154095794D01* +X60118583Y-154143413D01* +X59673265Y-125826781D02* +X59673265Y-124826781D01* +X60054218Y-124826781D01* +X60149456Y-124874400D01* +X60197075Y-124922019D01* +X60244694Y-125017257D01* +X60244694Y-125160114D01* +X60197075Y-125255352D01* +X60149456Y-125302971D01* +X60054218Y-125350590D01* +X59673265Y-125350590D01* +X61101837Y-125160114D02* +X61101837Y-125826781D01* +X60863741Y-124779162D02* +X60625646Y-125493448D01* +X61244694Y-125493448D01* +X41080465Y-125461021D02* +X41080465Y-124461021D01* +X41461418Y-124461021D01* +X41556656Y-124508640D01* +X41604275Y-124556259D01* +X41651894Y-124651497D01* +X41651894Y-124794354D01* +X41604275Y-124889592D01* +X41556656Y-124937211D01* +X41461418Y-124984830D01* +X41080465Y-124984830D01* +X42556656Y-124461021D02* +X42080465Y-124461021D01* +X42032846Y-124937211D01* +X42080465Y-124889592D01* +X42175703Y-124841973D01* +X42413799Y-124841973D01* +X42509037Y-124889592D01* +X42556656Y-124937211D01* +X42604275Y-125032450D01* +X42604275Y-125270545D01* +X42556656Y-125365783D01* +X42509037Y-125413402D01* +X42413799Y-125461021D01* +X42175703Y-125461021D01* +X42080465Y-125413402D01* +X42032846Y-125365783D01* +X66880681Y-154750995D02* +X65880681Y-154750995D01* +X65880681Y-154370042D01* +X65928300Y-154274804D01* +X65975919Y-154227185D01* +X66071157Y-154179566D01* +X66214014Y-154179566D01* +X66309252Y-154227185D01* +X66356871Y-154274804D01* +X66404490Y-154370042D01* +X66404490Y-154750995D01* +X65880681Y-153322423D02* +X65880681Y-153512900D01* +X65928300Y-153608138D01* +X65975919Y-153655757D01* +X66118776Y-153750995D01* +X66309252Y-153798614D01* +X66690205Y-153798614D01* +X66785443Y-153750995D01* +X66833062Y-153703376D01* +X66880681Y-153608138D01* +X66880681Y-153417661D01* +X66833062Y-153322423D01* +X66785443Y-153274804D01* +X66690205Y-153227185D01* +X66452110Y-153227185D01* +X66356871Y-153274804D01* +X66309252Y-153322423D01* +X66261633Y-153417661D01* +X66261633Y-153608138D01* +X66309252Y-153703376D01* +X66356871Y-153750995D01* +X66452110Y-153798614D01* +X67938425Y-145125701D02* +X67938425Y-144125701D01* +X68319378Y-144125701D01* +X68414616Y-144173320D01* +X68462235Y-144220939D01* +X68509854Y-144316177D01* +X68509854Y-144459034D01* +X68462235Y-144554272D01* +X68414616Y-144601891D01* +X68319378Y-144649510D01* +X67938425Y-144649510D01* +X68843187Y-144125701D02* +X69509854Y-144125701D01* +X69081282Y-145125701D01* +X67521865Y-122098061D02* +X67521865Y-121098061D01* +X67902818Y-121098061D01* +X67998056Y-121145680D01* +X68045675Y-121193299D01* +X68093294Y-121288537D01* +X68093294Y-121431394D01* +X68045675Y-121526632D01* +X67998056Y-121574251D01* +X67902818Y-121621870D01* +X67521865Y-121621870D01* +X68664722Y-121526632D02* +X68569484Y-121479013D01* +X68521865Y-121431394D01* +X68474246Y-121336156D01* +X68474246Y-121288537D01* +X68521865Y-121193299D01* +X68569484Y-121145680D01* +X68664722Y-121098061D01* +X68855199Y-121098061D01* +X68950437Y-121145680D01* +X68998056Y-121193299D01* +X69045675Y-121288537D01* +X69045675Y-121336156D01* +X68998056Y-121431394D01* +X68950437Y-121479013D01* +X68855199Y-121526632D01* +X68664722Y-121526632D01* +X68569484Y-121574251D01* +X68521865Y-121621870D01* +X68474246Y-121717109D01* +X68474246Y-121907585D01* +X68521865Y-122002823D01* +X68569484Y-122050442D01* +X68664722Y-122098061D01* +X68855199Y-122098061D01* +X68950437Y-122050442D01* +X68998056Y-122002823D01* +X69045675Y-121907585D01* +X69045675Y-121717109D01* +X68998056Y-121621870D01* +X68950437Y-121574251D01* +X68855199Y-121526632D01* +X66747402Y-129188459D02* +X66652164Y-129140840D01* +X66556926Y-129045602D01* +X66414069Y-128902745D01* +X66318830Y-128855126D01* +X66223592Y-128855126D01* +X66271211Y-129093221D02* +X66175973Y-129045602D01* +X66080735Y-128950364D01* +X66033116Y-128759888D01* +X66033116Y-128426554D01* +X66080735Y-128236078D01* +X66175973Y-128140840D01* +X66271211Y-128093221D01* +X66461688Y-128093221D01* +X66556926Y-128140840D01* +X66652164Y-128236078D01* +X66699783Y-128426554D01* +X66699783Y-128759888D01* +X66652164Y-128950364D01* +X66556926Y-129045602D01* +X66461688Y-129093221D01* +X66271211Y-129093221D01* +X67652164Y-129093221D02* +X67080735Y-129093221D01* +X67366449Y-129093221D02* +X67366449Y-128093221D01* +X67271211Y-128236078D01* +X67175973Y-128331316D01* +X67080735Y-128378935D01* +X40392054Y-156205181D02* +X40058720Y-155728990D01* +X39820625Y-156205181D02* +X39820625Y-155205181D01* +X40201578Y-155205181D01* +X40296816Y-155252800D01* +X40344435Y-155300419D01* +X40392054Y-155395657D01* +X40392054Y-155538514D01* +X40344435Y-155633752D01* +X40296816Y-155681371D01* +X40201578Y-155728990D01* +X39820625Y-155728990D01* +X41344435Y-156205181D02* +X40773006Y-156205181D01* +X41058720Y-156205181D02* +X41058720Y-155205181D01* +X40963482Y-155348038D01* +X40868244Y-155443276D01* +X40773006Y-155490895D01* +X39945014Y-144561821D02* +X39611680Y-144085630D01* +X39373585Y-144561821D02* +X39373585Y-143561821D01* +X39754538Y-143561821D01* +X39849776Y-143609440D01* +X39897395Y-143657059D01* +X39945014Y-143752297D01* +X39945014Y-143895154D01* +X39897395Y-143990392D01* +X39849776Y-144038011D01* +X39754538Y-144085630D01* +X39373585Y-144085630D01* +X40325966Y-143657059D02* +X40373585Y-143609440D01* +X40468823Y-143561821D01* +X40706919Y-143561821D01* +X40802157Y-143609440D01* +X40849776Y-143657059D01* +X40897395Y-143752297D01* +X40897395Y-143847535D01* +X40849776Y-143990392D01* +X40278347Y-144561821D01* +X40897395Y-144561821D01* +X44445181Y-153704586D02* +X43968990Y-154037920D01* +X44445181Y-154276015D02* +X43445181Y-154276015D01* +X43445181Y-153895062D01* +X43492800Y-153799824D01* +X43540419Y-153752205D01* +X43635657Y-153704586D01* +X43778514Y-153704586D01* +X43873752Y-153752205D01* +X43921371Y-153799824D01* +X43968990Y-153895062D01* +X43968990Y-154276015D01* +X43445181Y-153371253D02* +X43445181Y-152752205D01* +X43826133Y-153085539D01* +X43826133Y-152942681D01* +X43873752Y-152847443D01* +X43921371Y-152799824D01* +X44016610Y-152752205D01* +X44254705Y-152752205D01* +X44349943Y-152799824D01* +X44397562Y-152847443D01* +X44445181Y-152942681D01* +X44445181Y-153228396D01* +X44397562Y-153323634D01* +X44349943Y-153371253D01* +X44358821Y-146744986D02* +X43882630Y-147078320D01* +X44358821Y-147316415D02* +X43358821Y-147316415D01* +X43358821Y-146935462D01* +X43406440Y-146840224D01* +X43454059Y-146792605D01* +X43549297Y-146744986D01* +X43692154Y-146744986D01* +X43787392Y-146792605D01* +X43835011Y-146840224D01* +X43882630Y-146935462D01* +X43882630Y-147316415D01* +X43692154Y-145887843D02* +X44358821Y-145887843D01* +X43311202Y-146125939D02* +X44025488Y-146364034D01* +X44025488Y-145744986D01* +X44273174Y-152486621D02* +X43939840Y-152010430D01* +X43701745Y-152486621D02* +X43701745Y-151486621D01* +X44082698Y-151486621D01* +X44177936Y-151534240D01* +X44225555Y-151581859D01* +X44273174Y-151677097D01* +X44273174Y-151819954D01* +X44225555Y-151915192D01* +X44177936Y-151962811D01* +X44082698Y-152010430D01* +X43701745Y-152010430D01* +X45177936Y-151486621D02* +X44701745Y-151486621D01* +X44654126Y-151962811D01* +X44701745Y-151915192D01* +X44796983Y-151867573D01* +X45035079Y-151867573D01* +X45130317Y-151915192D01* +X45177936Y-151962811D01* +X45225555Y-152058050D01* +X45225555Y-152296145D01* +X45177936Y-152391383D01* +X45130317Y-152439002D01* +X45035079Y-152486621D01* +X44796983Y-152486621D01* +X44701745Y-152439002D01* +X44654126Y-152391383D01* +X44090294Y-148625821D02* +X43756960Y-148149630D01* +X43518865Y-148625821D02* +X43518865Y-147625821D01* +X43899818Y-147625821D01* +X43995056Y-147673440D01* +X44042675Y-147721059D01* +X44090294Y-147816297D01* +X44090294Y-147959154D01* +X44042675Y-148054392D01* +X43995056Y-148102011D01* +X43899818Y-148149630D01* +X43518865Y-148149630D01* +X44947437Y-147625821D02* +X44756960Y-147625821D01* +X44661722Y-147673440D01* +X44614103Y-147721059D01* +X44518865Y-147863916D01* +X44471246Y-148054392D01* +X44471246Y-148435345D01* +X44518865Y-148530583D01* +X44566484Y-148578202D01* +X44661722Y-148625821D01* +X44852199Y-148625821D01* +X44947437Y-148578202D01* +X44995056Y-148530583D01* +X45042675Y-148435345D01* +X45042675Y-148197250D01* +X44995056Y-148102011D01* +X44947437Y-148054392D01* +X44852199Y-148006773D01* +X44661722Y-148006773D01* +X44566484Y-148054392D01* +X44518865Y-148102011D01* +X44471246Y-148197250D01* +X74381621Y-151179826D02* +X73905430Y-151513160D01* +X74381621Y-151751255D02* +X73381621Y-151751255D01* +X73381621Y-151370302D01* +X73429240Y-151275064D01* +X73476859Y-151227445D01* +X73572097Y-151179826D01* +X73714954Y-151179826D01* +X73810192Y-151227445D01* +X73857811Y-151275064D01* +X73905430Y-151370302D01* +X73905430Y-151751255D01* +X73381621Y-150846493D02* +X73381621Y-150179826D01* +X74381621Y-150608398D01* +X71806061Y-150981706D02* +X71329870Y-151315040D01* +X71806061Y-151553135D02* +X70806061Y-151553135D01* +X70806061Y-151172182D01* +X70853680Y-151076944D01* +X70901299Y-151029325D01* +X70996537Y-150981706D01* +X71139394Y-150981706D01* +X71234632Y-151029325D01* +X71282251Y-151076944D01* +X71329870Y-151172182D01* +X71329870Y-151553135D01* +X71234632Y-150410278D02* +X71187013Y-150505516D01* +X71139394Y-150553135D01* +X71044156Y-150600754D01* +X70996537Y-150600754D01* +X70901299Y-150553135D01* +X70853680Y-150505516D01* +X70806061Y-150410278D01* +X70806061Y-150219801D01* +X70853680Y-150124563D01* +X70901299Y-150076944D01* +X70996537Y-150029325D01* +X71044156Y-150029325D01* +X71139394Y-150076944D01* +X71187013Y-150124563D01* +X71234632Y-150219801D01* +X71234632Y-150410278D01* +X71282251Y-150505516D01* +X71329870Y-150553135D01* +X71425109Y-150600754D01* +X71615585Y-150600754D01* +X71710823Y-150553135D01* +X71758442Y-150505516D01* +X71806061Y-150410278D01* +X71806061Y-150219801D01* +X71758442Y-150124563D01* +X71710823Y-150076944D01* +X71615585Y-150029325D01* +X71425109Y-150029325D01* +X71329870Y-150076944D01* +X71282251Y-150124563D01* +X71234632Y-150219801D01* +X69260981Y-151149346D02* +X68784790Y-151482680D01* +X69260981Y-151720775D02* +X68260981Y-151720775D01* +X68260981Y-151339822D01* +X68308600Y-151244584D01* +X68356219Y-151196965D01* +X68451457Y-151149346D01* +X68594314Y-151149346D01* +X68689552Y-151196965D01* +X68737171Y-151244584D01* +X68784790Y-151339822D01* +X68784790Y-151720775D01* +X69260981Y-150673156D02* +X69260981Y-150482680D01* +X69213362Y-150387441D01* +X69165743Y-150339822D01* +X69022886Y-150244584D01* +X68832410Y-150196965D01* +X68451457Y-150196965D01* +X68356219Y-150244584D01* +X68308600Y-150292203D01* +X68260981Y-150387441D01* +X68260981Y-150577918D01* +X68308600Y-150673156D01* +X68356219Y-150720775D01* +X68451457Y-150768394D01* +X68689552Y-150768394D01* +X68784790Y-150720775D01* +X68832410Y-150673156D01* +X68880029Y-150577918D01* +X68880029Y-150387441D01* +X68832410Y-150292203D01* +X68784790Y-150244584D01* +X68689552Y-150196965D01* +X66614301Y-151376617D02* +X66138110Y-151709951D01* +X66614301Y-151948046D02* +X65614301Y-151948046D01* +X65614301Y-151567093D01* +X65661920Y-151471855D01* +X65709539Y-151424236D01* +X65804777Y-151376617D01* +X65947634Y-151376617D01* +X66042872Y-151424236D01* +X66090491Y-151471855D01* +X66138110Y-151567093D01* +X66138110Y-151948046D01* +X66614301Y-150424236D02* +X66614301Y-150995665D01* +X66614301Y-150709951D02* +X65614301Y-150709951D01* +X65757158Y-150805189D01* +X65852396Y-150900427D01* +X65900015Y-150995665D01* +X65614301Y-149805189D02* +X65614301Y-149709950D01* +X65661920Y-149614712D01* +X65709539Y-149567093D01* +X65804777Y-149519474D01* +X65995253Y-149471855D01* +X66233349Y-149471855D01* +X66423825Y-149519474D01* +X66519063Y-149567093D01* +X66566682Y-149614712D01* +X66614301Y-149709950D01* +X66614301Y-149805189D01* +X66566682Y-149900427D01* +X66519063Y-149948046D01* +X66423825Y-149995665D01* +X66233349Y-150043284D01* +X65995253Y-150043284D01* +X65804777Y-149995665D01* +X65709539Y-149948046D01* +X65661920Y-149900427D01* +X65614301Y-149805189D01* +X74305421Y-148638497D02* +X73829230Y-148971831D01* +X74305421Y-149209926D02* +X73305421Y-149209926D01* +X73305421Y-148828973D01* +X73353040Y-148733735D01* +X73400659Y-148686116D01* +X73495897Y-148638497D01* +X73638754Y-148638497D01* +X73733992Y-148686116D01* +X73781611Y-148733735D01* +X73829230Y-148828973D01* +X73829230Y-149209926D01* +X74305421Y-147686116D02* +X74305421Y-148257545D01* +X74305421Y-147971831D02* +X73305421Y-147971831D01* +X73448278Y-148067069D01* +X73543516Y-148162307D01* +X73591135Y-148257545D01* +X74305421Y-146733735D02* +X74305421Y-147305164D01* +X74305421Y-147019450D02* +X73305421Y-147019450D01* +X73448278Y-147114688D01* +X73543516Y-147209926D01* +X73591135Y-147305164D01* +X71714621Y-148425137D02* +X71238430Y-148758471D01* +X71714621Y-148996566D02* +X70714621Y-148996566D01* +X70714621Y-148615613D01* +X70762240Y-148520375D01* +X70809859Y-148472756D01* +X70905097Y-148425137D01* +X71047954Y-148425137D01* +X71143192Y-148472756D01* +X71190811Y-148520375D01* +X71238430Y-148615613D01* +X71238430Y-148996566D01* +X71714621Y-147472756D02* +X71714621Y-148044185D01* +X71714621Y-147758471D02* +X70714621Y-147758471D01* +X70857478Y-147853709D01* +X70952716Y-147948947D01* +X71000335Y-148044185D01* +X70809859Y-147091804D02* +X70762240Y-147044185D01* +X70714621Y-146948947D01* +X70714621Y-146710851D01* +X70762240Y-146615613D01* +X70809859Y-146567994D01* +X70905097Y-146520375D01* +X71000335Y-146520375D01* +X71143192Y-146567994D01* +X71714621Y-147139423D01* +X71714621Y-146520375D01* +X69215261Y-148333697D02* +X68739070Y-148667031D01* +X69215261Y-148905126D02* +X68215261Y-148905126D01* +X68215261Y-148524173D01* +X68262880Y-148428935D01* +X68310499Y-148381316D01* +X68405737Y-148333697D01* +X68548594Y-148333697D01* +X68643832Y-148381316D01* +X68691451Y-148428935D01* +X68739070Y-148524173D01* +X68739070Y-148905126D01* +X69215261Y-147381316D02* +X69215261Y-147952745D01* +X69215261Y-147667031D02* +X68215261Y-147667031D01* +X68358118Y-147762269D01* +X68453356Y-147857507D01* +X68500975Y-147952745D01* +X68215261Y-147047983D02* +X68215261Y-146428935D01* +X68596213Y-146762269D01* +X68596213Y-146619411D01* +X68643832Y-146524173D01* +X68691451Y-146476554D01* +X68786690Y-146428935D01* +X69024785Y-146428935D01* +X69120023Y-146476554D01* +X69167642Y-146524173D01* +X69215261Y-146619411D01* +X69215261Y-146905126D01* +X69167642Y-147000364D01* +X69120023Y-147047983D01* +X66573661Y-148247337D02* +X66097470Y-148580671D01* +X66573661Y-148818766D02* +X65573661Y-148818766D01* +X65573661Y-148437813D01* +X65621280Y-148342575D01* +X65668899Y-148294956D01* +X65764137Y-148247337D01* +X65906994Y-148247337D01* +X66002232Y-148294956D01* +X66049851Y-148342575D01* +X66097470Y-148437813D01* +X66097470Y-148818766D01* +X66573661Y-147294956D02* +X66573661Y-147866385D01* +X66573661Y-147580671D02* +X65573661Y-147580671D01* +X65716518Y-147675909D01* +X65811756Y-147771147D01* +X65859375Y-147866385D01* +X65906994Y-146437813D02* +X66573661Y-146437813D01* +X65526042Y-146675909D02* +X66240328Y-146914004D01* +X66240328Y-146294956D01* +X61521103Y-146497301D02* +X61187769Y-146021110D01* +X60949674Y-146497301D02* +X60949674Y-145497301D01* +X61330627Y-145497301D01* +X61425865Y-145544920D01* +X61473484Y-145592539D01* +X61521103Y-145687777D01* +X61521103Y-145830634D01* +X61473484Y-145925872D01* +X61425865Y-145973491D01* +X61330627Y-146021110D01* +X60949674Y-146021110D01* +X62473484Y-146497301D02* +X61902055Y-146497301D01* +X62187769Y-146497301D02* +X62187769Y-145497301D01* +X62092531Y-145640158D01* +X61997293Y-145735396D01* +X61902055Y-145783015D01* +X63378246Y-145497301D02* +X62902055Y-145497301D01* +X62854436Y-145973491D01* +X62902055Y-145925872D01* +X62997293Y-145878253D01* +X63235389Y-145878253D01* +X63330627Y-145925872D01* +X63378246Y-145973491D01* +X63425865Y-146068730D01* +X63425865Y-146306825D01* +X63378246Y-146402063D01* +X63330627Y-146449682D01* +X63235389Y-146497301D01* +X62997293Y-146497301D01* +X62902055Y-146449682D01* +X62854436Y-146402063D01* +X61378863Y-149098261D02* +X61045529Y-148622070D01* +X60807434Y-149098261D02* +X60807434Y-148098261D01* +X61188387Y-148098261D01* +X61283625Y-148145880D01* +X61331244Y-148193499D01* +X61378863Y-148288737D01* +X61378863Y-148431594D01* +X61331244Y-148526832D01* +X61283625Y-148574451D01* +X61188387Y-148622070D01* +X60807434Y-148622070D01* +X62331244Y-149098261D02* +X61759815Y-149098261D01* +X62045529Y-149098261D02* +X62045529Y-148098261D01* +X61950291Y-148241118D01* +X61855053Y-148336356D01* +X61759815Y-148383975D01* +X63188387Y-148098261D02* +X62997910Y-148098261D01* +X62902672Y-148145880D01* +X62855053Y-148193499D01* +X62759815Y-148336356D01* +X62712196Y-148526832D01* +X62712196Y-148907785D01* +X62759815Y-149003023D01* +X62807434Y-149050642D01* +X62902672Y-149098261D01* +X63093149Y-149098261D01* +X63188387Y-149050642D01* +X63236006Y-149003023D01* +X63283625Y-148907785D01* +X63283625Y-148669690D01* +X63236006Y-148574451D01* +X63188387Y-148526832D01* +X63093149Y-148479213D01* +X62902672Y-148479213D01* +X62807434Y-148526832D01* +X62759815Y-148574451D01* +X62712196Y-148669690D01* +X65854343Y-140238741D02* +X65521009Y-139762550D01* +X65282914Y-140238741D02* +X65282914Y-139238741D01* +X65663867Y-139238741D01* +X65759105Y-139286360D01* +X65806724Y-139333979D01* +X65854343Y-139429217D01* +X65854343Y-139572074D01* +X65806724Y-139667312D01* +X65759105Y-139714931D01* +X65663867Y-139762550D01* +X65282914Y-139762550D01* +X66806724Y-140238741D02* +X66235295Y-140238741D01* +X66521009Y-140238741D02* +X66521009Y-139238741D01* +X66425771Y-139381598D01* +X66330533Y-139476836D01* +X66235295Y-139524455D01* +X67140057Y-139238741D02* +X67806724Y-139238741D01* +X67378152Y-140238741D01* +X65854343Y-138308341D02* +X65521009Y-137832150D01* +X65282914Y-138308341D02* +X65282914Y-137308341D01* +X65663867Y-137308341D01* +X65759105Y-137355960D01* +X65806724Y-137403579D01* +X65854343Y-137498817D01* +X65854343Y-137641674D01* +X65806724Y-137736912D01* +X65759105Y-137784531D01* +X65663867Y-137832150D01* +X65282914Y-137832150D01* +X66806724Y-138308341D02* +X66235295Y-138308341D01* +X66521009Y-138308341D02* +X66521009Y-137308341D01* +X66425771Y-137451198D01* +X66330533Y-137546436D01* +X66235295Y-137594055D01* +X67378152Y-137736912D02* +X67282914Y-137689293D01* +X67235295Y-137641674D01* +X67187676Y-137546436D01* +X67187676Y-137498817D01* +X67235295Y-137403579D01* +X67282914Y-137355960D01* +X67378152Y-137308341D01* +X67568629Y-137308341D01* +X67663867Y-137355960D01* +X67711486Y-137403579D01* +X67759105Y-137498817D01* +X67759105Y-137546436D01* +X67711486Y-137641674D01* +X67663867Y-137689293D01* +X67568629Y-137736912D01* +X67378152Y-137736912D01* +X67282914Y-137784531D01* +X67235295Y-137832150D01* +X67187676Y-137927389D01* +X67187676Y-138117865D01* +X67235295Y-138213103D01* +X67282914Y-138260722D01* +X67378152Y-138308341D01* +X67568629Y-138308341D01* +X67663867Y-138260722D01* +X67711486Y-138213103D01* +X67759105Y-138117865D01* +X67759105Y-137927389D01* +X67711486Y-137832150D01* +X67663867Y-137784531D01* +X67568629Y-137736912D01* +X65955943Y-142489181D02* +X65622609Y-142012990D01* +X65384514Y-142489181D02* +X65384514Y-141489181D01* +X65765467Y-141489181D01* +X65860705Y-141536800D01* +X65908324Y-141584419D01* +X65955943Y-141679657D01* +X65955943Y-141822514D01* +X65908324Y-141917752D01* +X65860705Y-141965371D01* +X65765467Y-142012990D01* +X65384514Y-142012990D01* +X66908324Y-142489181D02* +X66336895Y-142489181D01* +X66622609Y-142489181D02* +X66622609Y-141489181D01* +X66527371Y-141632038D01* +X66432133Y-141727276D01* +X66336895Y-141774895D01* +X67384514Y-142489181D02* +X67574990Y-142489181D01* +X67670229Y-142441562D01* +X67717848Y-142393943D01* +X67813086Y-142251086D01* +X67860705Y-142060610D01* +X67860705Y-141679657D01* +X67813086Y-141584419D01* +X67765467Y-141536800D01* +X67670229Y-141489181D01* +X67479752Y-141489181D01* +X67384514Y-141536800D01* +X67336895Y-141584419D01* +X67289276Y-141679657D01* +X67289276Y-141917752D01* +X67336895Y-142012990D01* +X67384514Y-142060610D01* +X67479752Y-142108229D01* +X67670229Y-142108229D01* +X67765467Y-142060610D01* +X67813086Y-142012990D01* +X67860705Y-141917752D01* +X45594661Y-133553105D02* +X46404185Y-133553105D01* +X46499423Y-133505486D01* +X46547042Y-133457867D01* +X46594661Y-133362629D01* +X46594661Y-133172152D01* +X46547042Y-133076914D01* +X46499423Y-133029295D01* +X46404185Y-132981676D01* +X45594661Y-132981676D01* +X46594661Y-131981676D02* +X46594661Y-132553105D01* +X46594661Y-132267391D02* +X45594661Y-132267391D01* +X45737518Y-132362629D01* +X45832756Y-132457867D01* +X45880375Y-132553105D01* +X49875535Y-148845021D02* +X49875535Y-149654545D01* +X49923154Y-149749783D01* +X49970773Y-149797402D01* +X50066011Y-149845021D01* +X50256488Y-149845021D01* +X50351726Y-149797402D01* +X50399345Y-149749783D01* +X50446964Y-149654545D01* +X50446964Y-148845021D01* +X50875535Y-148940259D02* +X50923154Y-148892640D01* +X51018392Y-148845021D01* +X51256488Y-148845021D01* +X51351726Y-148892640D01* +X51399345Y-148940259D01* +X51446964Y-149035497D01* +X51446964Y-149130735D01* +X51399345Y-149273592D01* +X50827916Y-149845021D01* +X51446964Y-149845021D01* +D12* +X58235910Y-127316774D02* +X58235910Y-126554774D01* +X58387101Y-126554774D01* +X58477815Y-126591060D01* +X58538291Y-126663631D01* +X58568530Y-126736203D01* +X58598768Y-126881346D01* +X58598768Y-126990203D01* +X58568530Y-127135346D01* +X58538291Y-127207917D01* +X58477815Y-127280489D01* +X58387101Y-127316774D01* +X58235910Y-127316774D01* +X58870910Y-127316774D02* +X58870910Y-126554774D01* +X59082577Y-127099060D01* +X59294244Y-126554774D01* +X59294244Y-127316774D01* +X59596624Y-127316774D02* +X59596624Y-126554774D01* +X59959482Y-127316774D01* +X59959482Y-126554774D01* +X60534005Y-126554774D02* +X60413053Y-126554774D01* +X60352577Y-126591060D01* +X60322339Y-126627346D01* +X60261862Y-126736203D01* +X60231624Y-126881346D01* +X60231624Y-127171631D01* +X60261862Y-127244203D01* +X60292101Y-127280489D01* +X60352577Y-127316774D01* +X60473529Y-127316774D01* +X60534005Y-127280489D01* +X60564243Y-127244203D01* +X60594482Y-127171631D01* +X60594482Y-126990203D01* +X60564243Y-126917631D01* +X60534005Y-126881346D01* +X60473529Y-126845060D01* +X60352577Y-126845060D01* +X60292101Y-126881346D01* +X60261862Y-126917631D01* +X60231624Y-126990203D01* +X60806148Y-126554774D02* +X61199244Y-126554774D01* +X60987577Y-126845060D01* +X61078291Y-126845060D01* +X61138767Y-126881346D01* +X61169005Y-126917631D01* +X61199244Y-126990203D01* +X61199244Y-127171631D01* +X61169005Y-127244203D01* +X61138767Y-127280489D01* +X61078291Y-127316774D01* +X60896863Y-127316774D01* +X60836386Y-127280489D01* +X60806148Y-127244203D01* +X61471386Y-127316774D02* +X61471386Y-126554774D01* +X61622577Y-126554774D01* +X61713291Y-126591060D01* +X61773767Y-126663631D01* +X61804006Y-126736203D01* +X61834244Y-126881346D01* +X61834244Y-126990203D01* +X61804006Y-127135346D01* +X61773767Y-127207917D01* +X61713291Y-127280489D01* +X61622577Y-127316774D01* +X61471386Y-127316774D01* +X62197101Y-126881346D02* +X62136625Y-126845060D01* +X62106386Y-126808774D01* +X62076148Y-126736203D01* +X62076148Y-126699917D01* +X62106386Y-126627346D01* +X62136625Y-126591060D01* +X62197101Y-126554774D01* +X62318053Y-126554774D01* +X62378529Y-126591060D01* +X62408767Y-126627346D01* +X62439006Y-126699917D01* +X62439006Y-126736203D01* +X62408767Y-126808774D01* +X62378529Y-126845060D01* +X62318053Y-126881346D01* +X62197101Y-126881346D01* +X62136625Y-126917631D01* +X62106386Y-126953917D01* +X62076148Y-127026489D01* +X62076148Y-127171631D01* +X62106386Y-127244203D01* +X62136625Y-127280489D01* +X62197101Y-127316774D01* +X62318053Y-127316774D01* +X62378529Y-127280489D01* +X62408767Y-127244203D01* +X62439006Y-127171631D01* +X62439006Y-127026489D01* +X62408767Y-126953917D01* +X62378529Y-126917631D01* +X62318053Y-126881346D01* +X63013529Y-127316774D02* +X62711148Y-127316774D01* +X62711148Y-126554774D01* +X63225196Y-127316774D02* +X63225196Y-126554774D01* +X63376387Y-126554774D01* +X63467101Y-126591060D01* +X63527577Y-126663631D01* +X63557816Y-126736203D01* +X63588054Y-126881346D01* +X63588054Y-126990203D01* +X63557816Y-127135346D01* +X63527577Y-127207917D01* +X63467101Y-127280489D01* +X63376387Y-127316774D01* +X63225196Y-127316774D01* +X63799720Y-126554774D02* +X63950911Y-127316774D01* +X64071863Y-126772489D01* +X64192816Y-127316774D01* +X64344006Y-126554774D01* +D10* +X48958263Y-128738903D02* +X48910644Y-128786522D01* +X48767787Y-128834141D01* +X48672549Y-128834141D01* +X48529691Y-128786522D01* +X48434453Y-128691284D01* +X48386834Y-128596046D01* +X48339215Y-128405570D01* +X48339215Y-128262712D01* +X48386834Y-128072236D01* +X48434453Y-127976998D01* +X48529691Y-127881760D01* +X48672549Y-127834141D01* +X48767787Y-127834141D01* +X48910644Y-127881760D01* +X48958263Y-127929379D01* +X49910644Y-128834141D02* +X49339215Y-128834141D01* +X49624929Y-128834141D02* +X49624929Y-127834141D01* +X49529691Y-127976998D01* +X49434453Y-128072236D01* +X49339215Y-128119855D01* +X50243977Y-127834141D02* +X50863025Y-127834141D01* +X50529691Y-128215093D01* +X50672549Y-128215093D01* +X50767787Y-128262712D01* +X50815406Y-128310331D01* +X50863025Y-128405570D01* +X50863025Y-128643665D01* +X50815406Y-128738903D01* +X50767787Y-128786522D01* +X50672549Y-128834141D01* +X50386834Y-128834141D01* +X50291596Y-128786522D01* +X50243977Y-128738903D01* +X56242983Y-144679943D02* +X56195364Y-144727562D01* +X56052507Y-144775181D01* +X55957269Y-144775181D01* +X55814411Y-144727562D01* +X55719173Y-144632324D01* +X55671554Y-144537086D01* +X55623935Y-144346610D01* +X55623935Y-144203752D01* +X55671554Y-144013276D01* +X55719173Y-143918038D01* +X55814411Y-143822800D01* +X55957269Y-143775181D01* +X56052507Y-143775181D01* +X56195364Y-143822800D01* +X56242983Y-143870419D01* +X57195364Y-144775181D02* +X56623935Y-144775181D01* +X56909649Y-144775181D02* +X56909649Y-143775181D01* +X56814411Y-143918038D01* +X56719173Y-144013276D01* +X56623935Y-144060895D01* +X57814411Y-143775181D02* +X57909650Y-143775181D01* +X58004888Y-143822800D01* +X58052507Y-143870419D01* +X58100126Y-143965657D01* +X58147745Y-144156133D01* +X58147745Y-144394229D01* +X58100126Y-144584705D01* +X58052507Y-144679943D01* +X58004888Y-144727562D01* +X57909650Y-144775181D01* +X57814411Y-144775181D01* +X57719173Y-144727562D01* +X57671554Y-144679943D01* +X57623935Y-144584705D01* +X57576316Y-144394229D01* +X57576316Y-144156133D01* +X57623935Y-143965657D01* +X57671554Y-143870419D01* +X57719173Y-143822800D01* +X57814411Y-143775181D01* +M02* diff --git a/PCB/OUTPUT/Tinylab_proto1.drl b/PCB/OUTPUT/Tinylab_proto1.drl new file mode 100644 index 00000000..af50d9a7 --- /dev/null +++ b/PCB/OUTPUT/Tinylab_proto1.drl @@ -0,0 +1,121 @@ +M48 +;DRILL file {KiCad (2015-08-05 BZR 6055, Git fa29c62)-product} date 28/09/2015 1:01:46 PM +;FORMAT={2:4/ absolute / inch / keep zeros} +FMAT,2 +INCH,TZ +T1C0.016 +T2C0.020 +T3C0.022 +T4C0.032 +T5C0.039 +T6C0.040 +T7C0.050 +% +G90 +G05 +M72 +T1 +X016558Y-053370 +X016572Y-053735 +X017191Y-056870 +X017520Y-057912 +X017845Y-053361 +X017895Y-053816 +X017912Y-058768 +X017936Y-057400 +X017944Y-059480 +X018280Y-052824 +X018340Y-058854 +X019048Y-055976 +X019222Y-057006 +X019224Y-056616 +X019642Y-058884 +X019664Y-050680 +X019678Y-054890 +X019952Y-054352 +X020032Y-054912 +X020056Y-052472 +X020118Y-054076 +X020256Y-056784 +X020296Y-052104 +X020326Y-058905 +X020552Y-057944 +X020656Y-052704 +X020666Y-053800 +X020950Y-049946 +X021336Y-052368 +X021346Y-052698 +X021658Y-050376 +X021758Y-053774 +X021868Y-056772 +X021904Y-058248 +X021932Y-059390 +X021992Y-050644 +X022168Y-055530 +X022248Y-056704 +X022318Y-057564 +X022538Y-050640 +X022592Y-052624 +X022720Y-057550 +X022786Y-058992 +X022816Y-055528 +X023008Y-052256 +X023216Y-050628 +X023650Y-049984 +X023698Y-057954 +X023960Y-051264 +X024068Y-050572 +X024136Y-057052 +X024848Y-057608 +X024906Y-049964 +X024946Y-050760 +X025244Y-050112 +X025828Y-050622 +X026068Y-057894 +X027092Y-057916 +X028048Y-057970 +T4 +X027256Y-054581 +X027256Y-055581 +X027896Y-049448 +X027896Y-050448 +T5 +X025180Y-051929 +X029126Y-053071 +T6 +X014275Y-057520 +X014275Y-058520 +X014275Y-059520 +X014275Y-060520 +X017426Y-049248 +X018426Y-049248 +X019426Y-049248 +X021724Y-048708 +X021724Y-049708 +X022724Y-048708 +X022724Y-049708 +X023145Y-060635 +X024145Y-060635 +X024872Y-048256 +X025536Y-060752 +X025872Y-048256 +X026536Y-060752 +X027536Y-060752 +X028032Y-056892 +X028536Y-060752 +X029032Y-056892 +T7 +X025126Y-053071 +X029180Y-051929 +T2 +X014607Y-052126G85X014863Y-052126 +G05 +X014607Y-054882G85X014863Y-054882 +G05 +T3 +X015798Y-052460G85X015798Y-052578 +G05 +X015798Y-054429G85X015798Y-054547 +G05 +T0 +M30 diff --git a/PCB/OUTPUT_V2/OUTPUT.zip b/PCB/OUTPUT_V2/OUTPUT.zip new file mode 100644 index 00000000..6aa0399c Binary files /dev/null and b/PCB/OUTPUT_V2/OUTPUT.zip differ diff --git a/PCB/OUTPUT_V2/Tinylab_proto1-B_Cu.gbr b/PCB/OUTPUT_V2/Tinylab_proto1-B_Cu.gbr new file mode 100644 index 00000000..c5f3e596 --- /dev/null +++ b/PCB/OUTPUT_V2/Tinylab_proto1-B_Cu.gbr @@ -0,0 +1,305 @@ +G04 #@! TF.FileFunction,Copper,L2,Bot,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 24/12/2015 2:00:31 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11C,1.300000*% +%ADD12R,1.300000X1.300000*% +%ADD13C,1.998980*% +%ADD14R,1.998980X1.998980*% +%ADD15R,2.032000X1.727200*% +%ADD16O,2.032000X1.727200*% +%ADD17O,1.250000X0.950000*% +%ADD18O,1.000000X1.550000*% +%ADD19R,1.727200X1.727200*% +%ADD20O,1.727200X1.727200*% +%ADD21R,2.032000X2.032000*% +%ADD22O,2.032000X2.032000*% +%ADD23C,0.600000*% +%ADD24C,1.016000*% +%ADD25C,0.250000*% +%ADD26C,0.508000*% +%ADD27C,0.254000*% +G04 APERTURE END LIST* +D10* +D11* +X76494000Y-136906000D03* +D12* +X78994000Y-136906000D03* +D11* +X93345000Y-141391000D03* +D12* +X93345000Y-143891000D03* +D11* +X116078000Y-146518000D03* +D12* +X116078000Y-144018000D03* +D13* +X92710000Y-135125460D03* +D14* +X82550000Y-135125460D03* +D13* +X82296000Y-137924540D03* +D14* +X92456000Y-137924540D03* +D15* +X94488000Y-159512000D03* +D16* +X94488000Y-156972000D03* +X94488000Y-154432000D03* +X94488000Y-151892000D03* +D17* +X117054900Y-139230540D03* +X112054900Y-139230540D03* +D18* +X118054900Y-136530540D03* +X111054900Y-136530540D03* +D15* +X76200000Y-149860000D03* +D16* +X76200000Y-147320000D03* +X76200000Y-144780000D03* +X76200000Y-142240000D03* +D19* +X105156000Y-135382000D03* +D20* +X107696000Y-135382000D03* +X105156000Y-137922000D03* +X107696000Y-137922000D03* +D15* +X100330000Y-140462000D03* +D16* +X100330000Y-137922000D03* +X100330000Y-135382000D03* +D15* +X76200000Y-152400000D03* +D16* +X76200000Y-154940000D03* +X76200000Y-157480000D03* +X76200000Y-160020000D03* +D19* +X86360000Y-143510000D03* +D20* +X83820000Y-143510000D03* +X86360000Y-140970000D03* +X83820000Y-140970000D03* +D21* +X116840000Y-157480000D03* +D22* +X116840000Y-160020000D03* +D23* +X85598000Y-155829000D03* +X96012000Y-140843000D03* +X111125000Y-141605000D03* +X115443000Y-140970000D03* +X103759000Y-144653000D03* +X103759000Y-146685000D03* +X112649000Y-155321000D03* +X112649000Y-153416000D03* +X114681000Y-135636000D03* +X90805000Y-142367000D03* +X102997000Y-142113000D03* +X100965000Y-142113000D03* +X83820000Y-156845000D03* +X89408000Y-137922000D03* +X85344000Y-135128000D03* +X99949000Y-143891000D03* +X101346000Y-157988000D03* +X99314000Y-161036000D03* +X86233000Y-159766000D03* +X98425000Y-139319000D03* +X99822000Y-147955000D03* +X106045000Y-140081000D03* +X105029000Y-143764000D03* +X103505000Y-149987000D03* +X107569000Y-139954000D03* +X106045000Y-143764000D03* +X105283000Y-149987000D03* +X97282000Y-156083000D03* +X87757000Y-152146000D03* +X91567000Y-153162000D03* +X97663000Y-158242000D03* +X91567000Y-157734000D03* +D24* +X100330000Y-140462000D02* +X103505000Y-140462000D01* +X103505000Y-140462000D02* +X104648000Y-141605000D01* +X104648000Y-141605000D02* +X111125000Y-141605000D01* +X111125000Y-141605000D02* +X114808000Y-141605000D01* +X114808000Y-141605000D02* +X115443000Y-140970000D01* +X85598000Y-152273000D02* +X85598000Y-155829000D01* +X87249000Y-150622000D02* +X85598000Y-152273000D01* +X90551000Y-150622000D02* +X87249000Y-150622000D01* +X95123000Y-146050000D02* +X90551000Y-150622000D01* +X95123000Y-141732000D02* +X95123000Y-146050000D01* +X96012000Y-140843000D02* +X95123000Y-141732000D01* +D25* +X112649000Y-141605000D02* +X111125000Y-141605000D01* +X115443000Y-140970000D02* +X114808000Y-141605000D01* +X114808000Y-141605000D02* +X112649000Y-141605000D01* +X111125000Y-141605000D02* +X104648000Y-141605000D01* +X104648000Y-141605000D02* +X103505000Y-140462000D01* +D24* +X103759000Y-144653000D02* +X103759000Y-146685000D01* +D26* +X112649000Y-153416000D02* +X112649000Y-155321000D01* +X115443000Y-139065000D02* +X115443000Y-139319000D01* +X116459000Y-143002000D02* +X116078000Y-143383000D01* +X116459000Y-140335000D02* +X116459000Y-143002000D01* +X115443000Y-139319000D02* +X116459000Y-140335000D01* +X116078000Y-143383000D02* +X116078000Y-144018000D01* +X115443000Y-139065000D02* +X115443000Y-136398000D01* +X115443000Y-136398000D02* +X114681000Y-135636000D01* +D25* +X116459000Y-140081000D02* +X116459000Y-143637000D01* +X114681000Y-135636000D02* +X115443000Y-136398000D01* +X115443000Y-139065000D02* +X116459000Y-140081000D01* +X116459000Y-143637000D02* +X116078000Y-144018000D01* +D24* +X83820000Y-146558000D02* +X86614000Y-146558000D01* +X86614000Y-146558000D02* +X90805000Y-142367000D01* +X83820000Y-156845000D02* +X83820000Y-146558000D01* +X83820000Y-146558000D02* +X83820000Y-143510000D01* +D25* +X100965000Y-142113000D02* +X102997000Y-142113000D01* +D24* +X100330000Y-137922000D02* +X96647000Y-137922000D01* +X96647000Y-137922000D02* +X94869000Y-139700000D01* +X94869000Y-139700000D02* +X90678000Y-139700000D01* +X90678000Y-139700000D02* +X90170000Y-139192000D01* +X90170000Y-139192000D02* +X90170000Y-138684000D01* +X90170000Y-138684000D02* +X89452564Y-137966564D01* +X89452564Y-137966564D02* +X89363436Y-137966564D01* +X89363436Y-137966564D02* +X89408000Y-137922000D01* +D27* +X90170000Y-138684000D02* +X89408000Y-137922000D01* +X90170000Y-139192000D02* +X90170000Y-138684000D01* +X90678000Y-139700000D02* +X90170000Y-139192000D01* +X94869000Y-139700000D02* +X90678000Y-139700000D01* +X96647000Y-137922000D02* +X94869000Y-139700000D01* +D24* +X86360000Y-143510000D02* +X87757000Y-143510000D01* +X87757000Y-143510000D02* +X88900000Y-142367000D01* +X88900000Y-142367000D02* +X88900000Y-139446000D01* +X88900000Y-139446000D02* +X85344000Y-135890000D01* +X85344000Y-135890000D02* +X85344000Y-135128000D01* +D27* +X88900000Y-142367000D02* +X87757000Y-143510000D01* +X88900000Y-138684000D02* +X88900000Y-142367000D01* +X85344000Y-135128000D02* +X88900000Y-138684000D01* +X99949000Y-143891000D02* +X101346000Y-145288000D01* +X101346000Y-145288000D02* +X101346000Y-157988000D01* +X98933000Y-161417000D02* +X99314000Y-161036000D01* +X86233000Y-161417000D02* +X98933000Y-161417000D01* +X85852000Y-161036000D02* +X86233000Y-161417000D01* +X85852000Y-160147000D02* +X85852000Y-161036000D01* +X86233000Y-159766000D02* +X85852000Y-160147000D01* +D25* +X98425000Y-146558000D02* +X98425000Y-139319000D01* +X99822000Y-147955000D02* +X98425000Y-146558000D01* +X106426000Y-136652000D02* +X107696000Y-135382000D01* +X106426000Y-139700000D02* +X106426000Y-136652000D01* +X106045000Y-140081000D02* +X106426000Y-139700000D01* +X105029000Y-148463000D02* +X105029000Y-143764000D01* +X103505000Y-149987000D02* +X105029000Y-148463000D01* +X107696000Y-139827000D02* +X107696000Y-137922000D01* +X107569000Y-139954000D02* +X107696000Y-139827000D01* +X106045000Y-149225000D02* +X106045000Y-143764000D01* +X105283000Y-149987000D02* +X106045000Y-149225000D01* +D27* +X97282000Y-155067000D02* +X97282000Y-156083000D01* +X95377000Y-153162000D02* +X97282000Y-155067000D01* +X92837000Y-153162000D02* +X95377000Y-153162000D01* +X91440000Y-151765000D02* +X92837000Y-153162000D01* +X88138000Y-151765000D02* +X91440000Y-151765000D01* +X87757000Y-152146000D02* +X88138000Y-151765000D01* +X91567000Y-157734000D02* +X91567000Y-153162000D01* +X91567000Y-157734000D02* +X92202000Y-157734000D01* +X92710000Y-158242000D02* +X97663000Y-158242000D01* +X92202000Y-157734000D02* +X92710000Y-158242000D01* +M02* diff --git a/PCB/OUTPUT_V2/Tinylab_proto1-B_Mask.gbr b/PCB/OUTPUT_V2/Tinylab_proto1-B_Mask.gbr new file mode 100644 index 00000000..0d3b6ab2 --- /dev/null +++ b/PCB/OUTPUT_V2/Tinylab_proto1-B_Mask.gbr @@ -0,0 +1,88 @@ +G04 #@! TF.FileFunction,Soldermask,Bot* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 24/12/2015 2:00:31 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11C,1.300000*% +%ADD12R,1.300000X1.300000*% +%ADD13C,1.998980*% +%ADD14R,1.998980X1.998980*% +%ADD15R,2.032000X1.727200*% +%ADD16O,2.032000X1.727200*% +%ADD17O,1.250000X0.950000*% +%ADD18O,1.000000X1.550000*% +%ADD19R,1.727200X1.727200*% +%ADD20O,1.727200X1.727200*% +%ADD21R,2.032000X2.032000*% +%ADD22O,2.032000X2.032000*% +G04 APERTURE END LIST* +D10* +D11* +X76494000Y-136906000D03* +D12* +X78994000Y-136906000D03* +D11* +X93345000Y-141391000D03* +D12* +X93345000Y-143891000D03* +D11* +X116078000Y-146518000D03* +D12* +X116078000Y-144018000D03* +D13* +X92710000Y-135125460D03* +D14* +X82550000Y-135125460D03* +D13* +X82296000Y-137924540D03* +D14* +X92456000Y-137924540D03* +D15* +X94488000Y-159512000D03* +D16* +X94488000Y-156972000D03* +X94488000Y-154432000D03* +X94488000Y-151892000D03* +D17* +X117054900Y-139230540D03* +X112054900Y-139230540D03* +D18* +X118054900Y-136530540D03* +X111054900Y-136530540D03* +D15* +X76200000Y-149860000D03* +D16* +X76200000Y-147320000D03* +X76200000Y-144780000D03* +X76200000Y-142240000D03* +D19* +X105156000Y-135382000D03* +D20* +X107696000Y-135382000D03* +X105156000Y-137922000D03* +X107696000Y-137922000D03* +D15* +X100330000Y-140462000D03* +D16* +X100330000Y-137922000D03* +X100330000Y-135382000D03* +D15* +X76200000Y-152400000D03* +D16* +X76200000Y-154940000D03* +X76200000Y-157480000D03* +X76200000Y-160020000D03* +D19* +X86360000Y-143510000D03* +D20* +X83820000Y-143510000D03* +X86360000Y-140970000D03* +X83820000Y-140970000D03* +D21* +X116840000Y-157480000D03* +D22* +X116840000Y-160020000D03* +M02* diff --git a/PCB/OUTPUT_V2/Tinylab_proto1-B_SilkS.gbr b/PCB/OUTPUT_V2/Tinylab_proto1-B_SilkS.gbr new file mode 100644 index 00000000..95dc0d04 --- /dev/null +++ b/PCB/OUTPUT_V2/Tinylab_proto1-B_SilkS.gbr @@ -0,0 +1,11 @@ +G04 #@! TF.FileFunction,Legend,Bot* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 24/12/2015 2:00:31 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +G04 APERTURE END LIST* +D10* +M02* diff --git a/PCB/OUTPUT_V2/Tinylab_proto1-Edge_Cuts.gbr b/PCB/OUTPUT_V2/Tinylab_proto1-Edge_Cuts.gbr new file mode 100644 index 00000000..e027d1e1 --- /dev/null +++ b/PCB/OUTPUT_V2/Tinylab_proto1-Edge_Cuts.gbr @@ -0,0 +1,21 @@ +G04 #@! TF.FileFunction,Profile,NP* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 24/12/2015 2:00:31 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +G04 APERTURE END LIST* +D10* +X119126000Y-133604000D02* +X119126000Y-162560000D01* +X74295000Y-162560000D02* +X74295000Y-161417000D01* +X119126000Y-162560000D02* +X74295000Y-162560000D01* +X74295000Y-133604000D02* +X74295000Y-162306000D01* +X119126000Y-133604000D02* +X74295000Y-133604000D01* +M02* diff --git a/PCB/OUTPUT_V2/Tinylab_proto1-F_Cu.gbr b/PCB/OUTPUT_V2/Tinylab_proto1-F_Cu.gbr new file mode 100644 index 00000000..a7827f1b --- /dev/null +++ b/PCB/OUTPUT_V2/Tinylab_proto1-F_Cu.gbr @@ -0,0 +1,1180 @@ +G04 #@! TF.FileFunction,Copper,L1,Top,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 24/12/2015 2:00:31 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,0.800000X0.750000*% +%ADD12R,0.750000X0.800000*% +%ADD13C,1.300000*% +%ADD14R,1.300000X1.300000*% +%ADD15C,1.998980*% +%ADD16R,1.998980X1.998980*% +%ADD17R,1.000000X1.600000*% +%ADD18R,0.560000X1.600000*% +%ADD19R,1.600000X0.560000*% +%ADD20R,2.032000X1.727200*% +%ADD21O,2.032000X1.727200*% +%ADD22R,0.400000X1.350000*% +%ADD23O,1.250000X0.950000*% +%ADD24O,1.000000X1.550000*% +%ADD25R,1.727200X1.727200*% +%ADD26O,1.727200X1.727200*% +%ADD27R,2.032000X2.032000*% +%ADD28O,2.032000X2.032000*% +%ADD29R,0.900000X0.600000*% +%ADD30R,0.500000X0.900000*% +%ADD31R,0.900000X0.500000*% +%ADD32R,0.600000X0.900000*% +%ADD33R,1.500000X0.600000*% +%ADD34R,0.304800X0.508000*% +%ADD35C,0.600000*% +%ADD36C,0.254000*% +%ADD37C,1.016000*% +%ADD38C,0.250000*% +%ADD39C,0.508000*% +G04 APERTURE END LIST* +D10* +D11* +X90436000Y-156591000D03* +X91936000Y-156591000D03* +D12* +X91948000Y-160516000D03* +X91948000Y-159016000D03* +D11* +X111137000Y-142621000D03* +X112637000Y-142621000D03* +X112256000Y-147193000D03* +X110756000Y-147193000D03* +D12* +X91821000Y-151753000D03* +X91821000Y-150253000D03* +D13* +X76494000Y-136906000D03* +D14* +X78994000Y-136906000D03* +D12* +X78740000Y-155182000D03* +X78740000Y-153682000D03* +X81280000Y-142760000D03* +X81280000Y-144260000D03* +X97536000Y-140601000D03* +X97536000Y-142101000D03* +X97790000Y-153785000D03* +X97790000Y-152285000D03* +D13* +X93345000Y-141391000D03* +D14* +X93345000Y-143891000D03* +D12* +X88900000Y-143879000D03* +X88900000Y-142379000D03* +X114427000Y-151777000D03* +X114427000Y-153277000D03* +X78740000Y-160516000D03* +X78740000Y-159016000D03* +D13* +X116078000Y-146518000D03* +D14* +X116078000Y-144018000D03* +D15* +X92710000Y-135125460D03* +D16* +X82550000Y-135125460D03* +D17* +X107291000Y-142113000D03* +X104291000Y-142113000D03* +D18* +X101410000Y-159901000D03* +X102210000Y-159901000D03* +X103010000Y-159901000D03* +X103810000Y-159901000D03* +X104610000Y-159901000D03* +X105410000Y-159901000D03* +X106210000Y-159901000D03* +X107010000Y-159901000D03* +X107810000Y-159901000D03* +X108610000Y-159901000D03* +X109410000Y-159901000D03* +D19* +X111260000Y-158051000D03* +X111260000Y-157251000D03* +X111260000Y-156451000D03* +X111260000Y-155651000D03* +X111260000Y-154851000D03* +X111260000Y-154051000D03* +X111260000Y-153251000D03* +X111260000Y-152451000D03* +X111260000Y-151651000D03* +X111260000Y-150851000D03* +X111260000Y-150051000D03* +D18* +X109410000Y-148201000D03* +X108610000Y-148201000D03* +X107810000Y-148201000D03* +X107010000Y-148201000D03* +X106210000Y-148201000D03* +X105410000Y-148201000D03* +X104610000Y-148201000D03* +X103810000Y-148201000D03* +X103010000Y-148201000D03* +X102210000Y-148201000D03* +X101410000Y-148201000D03* +D19* +X99560000Y-150051000D03* +X99560000Y-150851000D03* +X99560000Y-151651000D03* +X99560000Y-152451000D03* +X99560000Y-153251000D03* +X99560000Y-154051000D03* +X99560000Y-154851000D03* +X99560000Y-155651000D03* +X99560000Y-156451000D03* +X99560000Y-157251000D03* +X99560000Y-158051000D03* +D15* +X82296000Y-137924540D03* +D16* +X92456000Y-137924540D03* +D20* +X94488000Y-159512000D03* +D21* +X94488000Y-156972000D03* +X94488000Y-154432000D03* +X94488000Y-151892000D03* +D22* +X115854900Y-139230540D03* +X115204900Y-139230540D03* +X114554900Y-139230540D03* +X113904900Y-139230540D03* +X113254900Y-139230540D03* +D23* +X117054900Y-139230540D03* +X112054900Y-139230540D03* +D24* +X118054900Y-136530540D03* +X111054900Y-136530540D03* +D20* +X76200000Y-149860000D03* +D21* +X76200000Y-147320000D03* +X76200000Y-144780000D03* +X76200000Y-142240000D03* +D25* +X105156000Y-135382000D03* +D26* +X107696000Y-135382000D03* +X105156000Y-137922000D03* +X107696000Y-137922000D03* +D20* +X100330000Y-140462000D03* +D21* +X100330000Y-137922000D03* +X100330000Y-135382000D03* +D20* +X76200000Y-152400000D03* +D21* +X76200000Y-154940000D03* +X76200000Y-157480000D03* +X76200000Y-160020000D03* +D25* +X86360000Y-143510000D03* +D26* +X83820000Y-143510000D03* +X86360000Y-140970000D03* +X83820000Y-140970000D03* +D27* +X116840000Y-157480000D03* +D28* +X116840000Y-160020000D03* +D29* +X94485000Y-137922000D03* +X97285000Y-136972000D03* +X97285000Y-138872000D03* +D30* +X89166000Y-155067000D03* +X90666000Y-155067000D03* +X89166000Y-160528000D03* +X90666000Y-160528000D03* +X89166000Y-153416000D03* +X90666000Y-153416000D03* +X90666000Y-158877000D03* +X89166000Y-158877000D03* +X90539000Y-151765000D03* +X89039000Y-151765000D03* +X90539000Y-150114000D03* +X89039000Y-150114000D03* +X80506000Y-146050000D03* +X79006000Y-146050000D03* +X80506000Y-147701000D03* +X79006000Y-147701000D03* +X80506000Y-149352000D03* +X79006000Y-149352000D03* +X83046000Y-151003000D03* +X81546000Y-151003000D03* +X83173000Y-146050000D03* +X81673000Y-146050000D03* +X83173000Y-147701000D03* +X81673000Y-147701000D03* +X83173000Y-149352000D03* +X81673000Y-149352000D03* +D31* +X84455000Y-149491000D03* +X84455000Y-150991000D03* +X80391000Y-153555000D03* +X80391000Y-155055000D03* +D30* +X78498000Y-152146000D03* +X79998000Y-152146000D03* +D31* +X80391000Y-158889000D03* +X80391000Y-160389000D03* +D30* +X78498000Y-157480000D03* +X79998000Y-157480000D03* +X97421000Y-143891000D03* +X98921000Y-143891000D03* +X100850000Y-143891000D03* +X102350000Y-143891000D03* +D32* +X109982000Y-142999000D03* +X110932000Y-145799000D03* +X109032000Y-145799000D03* +D33* +X87663000Y-160782000D03* +X87663000Y-159512000D03* +X87663000Y-158242000D03* +X87663000Y-156972000D03* +X87663000Y-155702000D03* +X87663000Y-154432000D03* +X87663000Y-153162000D03* +X82263000Y-153162000D03* +X82263000Y-154432000D03* +X82263000Y-155702000D03* +X82263000Y-156972000D03* +X82263000Y-158242000D03* +X82263000Y-159512000D03* +X82263000Y-160782000D03* +D34* +X113030000Y-160147000D03* +X114300000Y-160147000D03* +X113030000Y-158115000D03* +X113665000Y-160147000D03* +X114300000Y-158115000D03* +X113665000Y-158115000D03* +D35* +X85598000Y-155829000D03* +X96012000Y-140843000D03* +X111125000Y-141605000D03* +X115443000Y-140970000D03* +X103759000Y-144653000D03* +X103759000Y-146685000D03* +X112649000Y-155321000D03* +X112649000Y-153416000D03* +X114681000Y-135636000D03* +X90805000Y-142367000D03* +X102997000Y-142113000D03* +X100965000Y-142113000D03* +X83820000Y-156845000D03* +X89408000Y-137922000D03* +X85344000Y-135128000D03* +X99949000Y-143891000D03* +X101346000Y-157988000D03* +X99314000Y-161036000D03* +X86233000Y-159766000D03* +X98425000Y-139319000D03* +X99822000Y-147955000D03* +X106045000Y-140081000D03* +X105029000Y-143764000D03* +X103505000Y-149987000D03* +X107569000Y-139954000D03* +X106045000Y-143764000D03* +X105283000Y-149987000D03* +X97282000Y-156083000D03* +X87757000Y-152146000D03* +X91567000Y-153162000D03* +X97663000Y-158242000D03* +X91567000Y-157734000D03* +D36* +X90666000Y-155067000D02* +X92583000Y-155067000D01* +X93091000Y-153543000D02* +X94488000Y-152146000D01* +X93091000Y-154559000D02* +X93091000Y-153543000D01* +X92583000Y-155067000D02* +X93091000Y-154559000D01* +X94488000Y-152146000D02* +X94488000Y-151892000D01* +X90666000Y-155067000D02* +X90805000Y-155067000D01* +X94488000Y-151892000D02* +X94488000Y-152019000D01* +X90436000Y-156591000D02* +X90436000Y-155297000D01* +X90436000Y-155297000D02* +X90666000Y-155067000D01* +X91936000Y-156591000D02* +X92329000Y-156591000D01* +X92329000Y-156591000D02* +X94488000Y-154432000D01* +X90666000Y-160528000D02* +X91936000Y-160528000D01* +X91936000Y-160528000D02* +X91948000Y-160516000D01* +X91948000Y-160516000D02* +X93484000Y-160516000D01* +X93484000Y-160516000D02* +X94488000Y-159512000D01* +X93726000Y-156972000D02* +X94488000Y-156972000D01* +X92964000Y-157734000D02* +X93726000Y-156972000D01* +X92964000Y-158369000D02* +X92964000Y-157734000D01* +X92317000Y-159016000D02* +X92964000Y-158369000D01* +X91948000Y-159016000D02* +X92317000Y-159016000D01* +D37* +X109982000Y-142999000D02* +X110759000Y-142999000D01* +X110759000Y-142999000D02* +X111137000Y-142621000D01* +X111137000Y-142621000D02* +X111137000Y-141815002D01* +X111125000Y-141803002D02* +X111137000Y-141803002D01* +X111137000Y-141815002D02* +X111125000Y-141803002D01* +X97536000Y-140601000D02* +X100191000Y-140601000D01* +X100191000Y-140601000D02* +X100330000Y-140462000D01* +X97536000Y-140601000D02* +X96254000Y-140601000D01* +X86106000Y-156972000D02* +X87663000Y-156972000D01* +X86106000Y-156337000D02* +X86106000Y-156972000D01* +X85598000Y-155829000D02* +X86106000Y-156337000D01* +X96254000Y-140601000D02* +X96012000Y-140843000D01* +D38* +X111137000Y-141803002D02* +X111137000Y-141617000D01* +X111137000Y-141617000D02* +X111125000Y-141605000D01* +X110759000Y-142999000D02* +X111137000Y-142621000D01* +X115854900Y-139230540D02* +X115854900Y-140558100D01* +X115854900Y-140558100D02* +X115443000Y-140970000D01* +X100191000Y-140601000D02* +X100330000Y-140462000D01* +D39* +X107291000Y-142113000D02* +X107569000Y-142113000D01* +X107569000Y-142113000D02* +X109220000Y-140462000D01* +X109220000Y-140462000D02* +X109220000Y-139230540D01* +X102350000Y-143891000D02* +X102350000Y-143498000D01* +X102350000Y-143498000D02* +X101981000Y-143129000D01* +X102108000Y-139827000D02* +X102108000Y-139954000D01* +X101981000Y-139954000D02* +X102108000Y-139827000D01* +X101981000Y-143129000D02* +X101981000Y-139954000D01* +D37* +X105156000Y-137922000D02* +X104140000Y-137922000D01* +X104140000Y-137922000D02* +X102108000Y-139954000D01* +X102108000Y-139954000D02* +X102350000Y-139712000D01* +X102350000Y-143891000D02* +X103070002Y-143891000D01* +X103759000Y-144579998D02* +X103759000Y-144653000D01* +X103070002Y-143891000D02* +X103759000Y-144579998D01* +D39* +X111260000Y-156451000D02* +X112382000Y-156451000D01* +X112382000Y-156451000D02* +X112649000Y-156184000D01* +X112649000Y-156184000D02* +X112649000Y-155321000D01* +X111260000Y-153251000D02* +X112484000Y-153251000D01* +X112484000Y-153251000D02* +X112649000Y-153416000D01* +X111260000Y-153251000D02* +X114401000Y-153251000D01* +X114401000Y-153251000D02* +X114427000Y-153277000D01* +X114427000Y-153277000D02* +X114566000Y-153277000D01* +X114566000Y-153277000D02* +X116078000Y-151765000D01* +X116078000Y-151765000D02* +X116078000Y-146518000D01* +X116078000Y-146518000D02* +X116499000Y-146518000D01* +X116499000Y-146518000D02* +X117221000Y-145796000D01* +X117221000Y-145796000D02* +X117221000Y-140667200D01* +X112637000Y-142621000D02* +X114935000Y-142621000D01* +X114935000Y-142621000D02* +X117054900Y-140501100D01* +X117054900Y-140501100D02* +X117054900Y-139230540D01* +X109032000Y-145799000D02* +X109032000Y-145476000D01* +X109032000Y-145476000D02* +X110236000Y-144272000D01* +X110236000Y-144272000D02* +X111887000Y-144272000D01* +X111887000Y-144272000D02* +X112637000Y-143522000D01* +X112637000Y-143522000D02* +X112637000Y-142621000D01* +X110756000Y-147193000D02* +X110426000Y-147193000D01* +X110426000Y-147193000D02* +X109032000Y-145799000D01* +D38* +X109032000Y-145476000D02* +X110236000Y-144272000D01* +X112637000Y-143522000D02* +X112637000Y-142621000D01* +X111887000Y-144272000D02* +X112637000Y-143522000D01* +X110236000Y-144272000D02* +X111887000Y-144272000D01* +X116078000Y-146518000D02* +X116078000Y-151765000D01* +X116078000Y-151765000D02* +X114566000Y-153277000D01* +X116499000Y-146518000D02* +X117221000Y-145796000D01* +X117221000Y-145796000D02* +X117221000Y-140667200D01* +X117221000Y-140667200D02* +X117054900Y-140501100D01* +X110426000Y-147193000D02* +X109032000Y-145799000D01* +X117054900Y-140501100D02* +X117054900Y-139230540D01* +X114935000Y-142621000D02* +X117054900Y-140501100D01* +X91821000Y-150253000D02* +X92952000Y-150253000D01* +X97167000Y-152285000D02* +X97790000Y-152285000D01* +X96901000Y-152019000D02* +X97167000Y-152285000D01* +X96901000Y-150749000D02* +X96901000Y-152019000D01* +X95885000Y-149733000D02* +X96901000Y-150749000D01* +X93472000Y-149733000D02* +X95885000Y-149733000D01* +X92952000Y-150253000D02* +X93472000Y-149733000D01* +X99560000Y-153251000D02* +X98756000Y-153251000D01* +X98756000Y-153251000D02* +X97790000Y-152285000D01* +X114427000Y-153277000D02* +X112788000Y-153277000D01* +X112788000Y-153277000D02* +X112649000Y-153416000D01* +X107569000Y-142113000D02* +X109220000Y-140462000D01* +X109220000Y-140462000D02* +X109220000Y-139230540D01* +X111054900Y-136530540D02* +X118054900Y-136530540D01* +X113254900Y-139230540D02* +X112054900Y-139230540D01* +X112054900Y-139230540D02* +X109220000Y-139230540D01* +X109220000Y-139230540D02* +X105448540Y-139230540D01* +X105156000Y-138938000D02* +X105156000Y-137922000D01* +X105448540Y-139230540D02* +X105156000Y-138938000D01* +X112054900Y-139230540D02* +X111671540Y-139230540D01* +X111671540Y-139230540D02* +X111054900Y-138613900D01* +X111054900Y-138613900D02* +X111054900Y-136530540D01* +X117054900Y-139230540D02* +X117182460Y-139230540D01* +X117182460Y-139230540D02* +X118054900Y-138358100D01* +X118054900Y-138358100D02* +X118054900Y-136530540D01* +X103810000Y-146736000D02* +X103810000Y-148201000D01* +X103759000Y-146685000D02* +X103810000Y-146736000D01* +X104140000Y-137922000D02* +X102350000Y-139712000D01* +X102350000Y-139712000D02* +X102350000Y-143891000D01* +X112522000Y-156464000D02* +X112522000Y-156591000D01* +X112649000Y-155321000D02* +X112649000Y-156337000D01* +X112649000Y-156337000D02* +X112522000Y-156464000D01* +X112484000Y-153251000D02* +X112649000Y-153416000D01* +X113030000Y-159004000D02* +X112903000Y-159004000D01* +X112522000Y-156591000D02* +X112382000Y-156451000D01* +X112522000Y-158623000D02* +X112522000Y-156591000D01* +X112903000Y-159004000D02* +X112522000Y-158623000D01* +X113030000Y-160147000D02* +X113030000Y-159004000D01* +X114300000Y-158623000D02* +X114300000Y-158115000D01* +X114173000Y-158750000D02* +X114300000Y-158623000D01* +X113284000Y-158750000D02* +X114173000Y-158750000D01* +X113030000Y-159004000D02* +X113284000Y-158750000D01* +D36* +X91821000Y-150253000D02* +X90678000Y-150253000D01* +X90678000Y-150253000D02* +X90539000Y-150114000D01* +D39* +X113030000Y-133985000D02* +X114681000Y-135636000D01* +X105156000Y-135382000D02* +X105156000Y-135255000D01* +X105156000Y-135255000D02* +X106426000Y-133985000D01* +X106426000Y-133985000D02* +X113030000Y-133985000D01* +D37* +X100330000Y-135382000D02* +X105156000Y-135382000D01* +D39* +X110932000Y-145799000D02* +X110932000Y-145869000D01* +X110932000Y-145869000D02* +X112256000Y-147193000D01* +X116078000Y-144018000D02* +X114808000Y-144018000D01* +X114808000Y-144018000D02* +X113027000Y-145799000D01* +X113027000Y-145799000D02* +X110932000Y-145799000D01* +X114427000Y-151777000D02* +X114427000Y-146177000D01* +X114427000Y-146177000D02* +X116078000Y-144526000D01* +X116078000Y-144526000D02* +X116078000Y-144018000D01* +X111260000Y-152451000D02* +X112598000Y-152451000D01* +X112598000Y-152451000D02* +X113272000Y-151777000D01* +X113272000Y-151777000D02* +X114427000Y-151777000D01* +D38* +X105156000Y-135255000D02* +X106426000Y-133985000D01* +X106426000Y-133985000D02* +X113030000Y-133985000D01* +X116078000Y-144018000D02* +X116078000Y-144526000D01* +X116078000Y-144526000D02* +X114427000Y-146177000D01* +X110932000Y-145799000D02* +X113027000Y-145799000D01* +X113027000Y-145799000D02* +X114808000Y-144018000D01* +X110932000Y-145869000D02* +X112256000Y-147193000D01* +X97790000Y-153785000D02* +X97397000Y-153785000D01* +X92341000Y-151753000D02* +X91821000Y-151753000D01* +X93726000Y-150368000D02* +X92341000Y-151753000D01* +X95377000Y-150368000D02* +X93726000Y-150368000D01* +X96266000Y-151257000D02* +X95377000Y-150368000D01* +X96266000Y-152654000D02* +X96266000Y-151257000D01* +X97397000Y-153785000D02* +X96266000Y-152654000D01* +X97790000Y-153785000D02* +X98159000Y-153785000D01* +X98159000Y-153785000D02* +X98425000Y-154051000D01* +X98425000Y-154051000D02* +X99560000Y-154051000D01* +X114427000Y-151777000D02* +X113272000Y-151777000D01* +X113272000Y-151777000D02* +X112598000Y-152451000D01* +D36* +X91821000Y-151753000D02* +X90551000Y-151753000D01* +X90551000Y-151753000D02* +X90539000Y-151765000D01* +D37* +X81280000Y-144260000D02* +X83070000Y-144260000D01* +X83070000Y-144260000D02* +X83820000Y-143510000D01* +X76494000Y-136906000D02* +X76494000Y-137581000D01* +X76494000Y-137581000D02* +X78994000Y-140081000D01* +X80506000Y-144260000D02* +X81280000Y-144260000D01* +X78994000Y-142748000D02* +X80506000Y-144260000D01* +X78994000Y-140081000D02* +X78994000Y-142748000D01* +X90805000Y-142367000D02* +X90805000Y-142379000D01* +X90805000Y-142379000D02* +X90805000Y-142367000D01* +X90805000Y-142367000D02* +X90805000Y-142379000D01* +X82263000Y-156972000D02* +X83693000Y-156972000D01* +X83693000Y-156972000D02* +X83820000Y-156845000D01* +X93345000Y-141391000D02* +X94020000Y-141391000D01* +X94020000Y-141391000D02* +X94730000Y-142101000D01* +X94730000Y-142101000D02* +X97536000Y-142101000D01* +X93345000Y-141391000D02* +X95758000Y-138978000D01* +X95758000Y-138978000D02* +X95758000Y-137922000D01* +X95758000Y-137922000D02* +X96708000Y-136972000D01* +X96708000Y-136972000D02* +X97285000Y-136972000D01* +X88900000Y-142379000D02* +X90805000Y-142379000D01* +X90805000Y-142379000D02* +X92357000Y-142379000D01* +X92357000Y-142379000D02* +X93345000Y-141391000D01* +X86360000Y-140970000D02* +X87884000Y-140970000D01* +X87884000Y-140970000D02* +X88900000Y-141986000D01* +X88900000Y-141986000D02* +X88900000Y-142379000D01* +X83820000Y-140970000D02* +X83820000Y-143510000D01* +X86360000Y-140970000D02* +X83820000Y-140970000D01* +D38* +X97536000Y-142101000D02* +X100953000Y-142101000D01* +X102997000Y-142113000D02* +X104291000Y-142113000D01* +X100953000Y-142101000D02* +X100965000Y-142113000D01* +X97536000Y-142101000D02* +X94730000Y-142101000D01* +X94730000Y-142101000D02* +X94020000Y-141391000D01* +D36* +X83693000Y-156972000D02* +X83820000Y-156845000D01* +X97285000Y-136972000D02* +X96708000Y-136972000D01* +X95758000Y-137922000D02* +X95758000Y-138978000D01* +X96708000Y-136972000D02* +X95758000Y-137922000D01* +X92357000Y-142379000D02* +X93345000Y-141391000D01* +X81280000Y-144260000D02* +X79998000Y-144260000D01* +X78486000Y-139573000D02* +X76494000Y-137581000D01* +X78486000Y-142748000D02* +X78486000Y-139573000D01* +X79998000Y-144260000D02* +X78486000Y-142748000D01* +X88900000Y-142379000D02* +X88900000Y-141986000D01* +X88900000Y-141986000D02* +X87884000Y-140970000D01* +X83070000Y-144260000D02* +X83820000Y-143510000D01* +D37* +X82296000Y-137924540D02* +X81280000Y-138940540D01* +X81280000Y-138940540D02* +X81280000Y-142760000D01* +X82296000Y-137924540D02* +X80774540Y-137924540D01* +X80774540Y-137924540D02* +X79756000Y-136906000D01* +X79756000Y-136906000D02* +X78994000Y-136906000D01* +X89408000Y-137922000D02* +X82298540Y-137922000D01* +X82298540Y-137922000D02* +X82296000Y-137924540D01* +D36* +X89405460Y-137924540D02* +X82296000Y-137924540D01* +X89408000Y-137922000D02* +X89405460Y-137924540D01* +X78994000Y-136906000D02* +X79756000Y-136906000D01* +X79756000Y-136906000D02* +X80774540Y-137924540D01* +X81280000Y-142760000D02* +X81280000Y-138940540D01* +X78740000Y-155182000D02* +X76442000Y-155182000D01* +X76442000Y-155182000D02* +X76200000Y-154940000D01* +X78498000Y-152146000D02* +X76454000Y-152146000D01* +X76454000Y-152146000D02* +X76200000Y-152400000D01* +X78740000Y-153682000D02* +X78740000Y-153289000D01* +X78740000Y-153289000D02* +X78498000Y-153047000D01* +X78498000Y-153047000D02* +X78498000Y-152146000D01* +D37* +X93345000Y-143891000D02* +X97421000Y-143891000D01* +X88900000Y-143879000D02* +X93333000Y-143879000D01* +X93333000Y-143879000D02* +X93345000Y-143891000D01* +X88900000Y-143879000D02* +X86729000Y-143879000D01* +X86729000Y-143879000D02* +X86360000Y-143510000D01* +X82550000Y-135125460D02* +X85341460Y-135125460D01* +X85341460Y-135125460D02* +X85344000Y-135128000D01* +D36* +X93333000Y-143879000D02* +X93345000Y-143891000D01* +X85341460Y-135125460D02* +X85344000Y-135128000D01* +X86360000Y-143510000D02* +X86741000Y-143510000D01* +X86741000Y-143510000D02* +X87110000Y-143879000D01* +X87110000Y-143879000D02* +X88900000Y-143879000D01* +X78740000Y-160516000D02* +X76696000Y-160516000D01* +X76696000Y-160516000D02* +X76200000Y-160020000D01* +X78498000Y-157480000D02* +X78498000Y-158774000D01* +X78498000Y-158774000D02* +X78740000Y-159016000D01* +X78498000Y-157480000D02* +X76200000Y-157480000D01* +D37* +X94485000Y-137922000D02* +X92458540Y-137922000D01* +X92458540Y-137922000D02* +X92456000Y-137924540D01* +D39* +X92458540Y-137922000D02* +X92456000Y-137924540D01* +D37* +X92456000Y-137924540D02* +X92456000Y-135379460D01* +X92456000Y-135379460D02* +X92710000Y-135125460D01* +D36* +X92458540Y-137922000D02* +X92456000Y-137924540D01* +X92456000Y-135379460D02* +X92710000Y-135125460D01* +D37* +X98921000Y-143891000D02* +X100850000Y-143891000D01* +D36* +X101410000Y-158052000D02* +X101410000Y-159901000D01* +X101346000Y-157988000D02* +X101410000Y-158052000D01* +X100850000Y-143891000D02* +X99949000Y-143891000D01* +X98921000Y-143891000D02* +X99949000Y-143891000D01* +X102210000Y-159901000D02* +X102210000Y-155473000D01* +X101600000Y-154863000D02* +X99572000Y-154863000D01* +X102210000Y-155473000D02* +X101600000Y-154863000D01* +X99572000Y-154863000D02* +X99560000Y-154851000D01* +X87663000Y-159512000D02* +X86487000Y-159512000D01* +X102210000Y-160934000D02* +X102210000Y-159901000D01* +X101927002Y-161216998D02* +X102210000Y-160934000D01* +X100383998Y-161216998D02* +X101927002Y-161216998D01* +X100203000Y-161036000D02* +X100383998Y-161216998D01* +X99314000Y-161036000D02* +X100203000Y-161036000D01* +X86487000Y-159512000D02* +X86233000Y-159766000D01* +X87663000Y-159512000D02* +X87663000Y-160782000D01* +X82263000Y-155702000D02* +X84201000Y-155702000D01* +X105410000Y-161036000D02* +X105410000Y-159901000D01* +X104721002Y-161724998D02* +X105410000Y-161036000D01* +X86032998Y-161724998D02* +X104721002Y-161724998D01* +X85090000Y-160782000D02* +X86032998Y-161724998D01* +X85090000Y-156591000D02* +X85090000Y-160782000D01* +X84201000Y-155702000D02* +X85090000Y-156591000D01* +X82263000Y-158242000D02* +X83185000Y-158242000D01* +X106210000Y-161125000D02* +X106210000Y-159901000D01* +X105156000Y-162179000D02* +X106210000Y-161125000D01* +X84709000Y-162179000D02* +X105156000Y-162179000D01* +X83693000Y-161163000D02* +X84709000Y-162179000D01* +X83693000Y-158750000D02* +X83693000Y-161163000D01* +X83185000Y-158242000D02* +X83693000Y-158750000D01* +D38* +X109410000Y-159901000D02* +X109410000Y-156020000D01* +X109779000Y-155651000D02* +X111260000Y-155651000D01* +X109410000Y-156020000D02* +X109779000Y-155651000D01* +X114300000Y-160147000D02* +X114300000Y-160401000D01* +X114300000Y-160401000D02* +X113919000Y-160782000D01* +X113919000Y-160782000D02* +X112649000Y-160782000D01* +X112649000Y-160782000D02* +X111260000Y-159393000D01* +X111260000Y-159393000D02* +X111260000Y-158051000D01* +X113030000Y-158115000D02* +X113030000Y-157353000D01* +X112776000Y-154051000D02* +X111260000Y-154051000D01* +X113284000Y-154559000D02* +X112776000Y-154051000D01* +X113284000Y-157099000D02* +X113284000Y-154559000D01* +X113030000Y-157353000D02* +X113284000Y-157099000D01* +X108610000Y-148201000D02* +X108610000Y-149327000D01* +X97978000Y-138872000D02* +X97285000Y-138872000D01* +X98425000Y-139319000D02* +X97978000Y-138872000D01* +X99822000Y-148463000D02* +X99822000Y-147955000D01* +X99822000Y-148590000D02* +X99822000Y-148463000D01* +X100584000Y-149352000D02* +X99822000Y-148590000D01* +X108585000Y-149352000D02* +X100584000Y-149352000D01* +X108610000Y-149327000D02* +X108585000Y-149352000D01* +X97285000Y-138872000D02* +X97285000Y-139062000D01* +X108585000Y-148226000D02* +X108610000Y-148201000D01* +X107010000Y-148201000D02* +X107010000Y-144958000D01* +X115189000Y-140335000D02* +X115189000Y-139246440D01* +X114554000Y-140970000D02* +X115189000Y-140335000D01* +X110490000Y-140970000D02* +X114554000Y-140970000D01* +X108966000Y-142494000D02* +X110490000Y-140970000D01* +X108966000Y-143383000D02* +X108966000Y-142494000D01* +X107823000Y-144526000D02* +X108966000Y-143383000D01* +X107442000Y-144526000D02* +X107823000Y-144526000D01* +X107010000Y-144958000D02* +X107442000Y-144526000D01* +X115189000Y-139246440D02* +X115204900Y-139230540D01* +X114554900Y-139230540D02* +X114554900Y-139953100D01* +X106210000Y-144488000D02* +X106210000Y-148201000D01* +X106934000Y-143764000D02* +X106210000Y-144488000D01* +X107696000Y-143764000D02* +X106934000Y-143764000D01* +X108331000Y-143129000D02* +X107696000Y-143764000D01* +X108331000Y-142240000D02* +X108331000Y-143129000D01* +X110109000Y-140462000D02* +X108331000Y-142240000D01* +X114046000Y-140462000D02* +X110109000Y-140462000D01* +X114554900Y-139953100D02* +X114046000Y-140462000D01* +D36* +X83173000Y-146050000D02* +X83566000Y-146050000D01* +X105410000Y-146431000D02* +X105410000Y-148201000D01* +X104394000Y-145415000D02* +X105410000Y-146431000D01* +X84201000Y-145415000D02* +X104394000Y-145415000D01* +X83566000Y-146050000D02* +X84201000Y-145415000D01* +X83173000Y-147701000D02* +X83173000Y-147459000D01* +X83173000Y-147459000D02* +X84582000Y-146050000D01* +X84582000Y-146050000D02* +X104140000Y-146050000D01* +X104140000Y-146050000D02* +X104610000Y-146520000D01* +X104610000Y-146520000D02* +X104610000Y-148201000D01* +X102210000Y-148201000D02* +X102210000Y-147041000D01* +X83947000Y-148578000D02* +X83173000Y-149352000D01* +X83947000Y-147701000D02* +X83947000Y-148578000D01* +X84963000Y-146685000D02* +X83947000Y-147701000D01* +X101854000Y-146685000D02* +X84963000Y-146685000D01* +X102210000Y-147041000D02* +X101854000Y-146685000D01* +X100529000Y-147320000D02* +X101410000Y-148201000D01* +X85217000Y-147320000D02* +X100529000Y-147320000D01* +X84455000Y-148082000D02* +X85217000Y-147320000D01* +X84455000Y-149491000D02* +X84455000Y-148082000D01* +D38* +X99560000Y-150051000D02* +X103441000Y-150051000D01* +X105664000Y-140462000D02* +X106045000Y-140081000D01* +X105664000Y-143129000D02* +X105664000Y-140462000D01* +X105029000Y-143764000D02* +X105664000Y-143129000D01* +X103441000Y-150051000D02* +X103505000Y-149987000D01* +X99560000Y-150851000D02* +X104038000Y-150851000D01* +X106299000Y-141224000D02* +X107569000Y-139954000D01* +X106299000Y-143510000D02* +X106299000Y-141224000D01* +X106045000Y-143764000D02* +X106299000Y-143510000D01* +X104902000Y-149987000D02* +X105283000Y-149987000D01* +X104038000Y-150851000D02* +X104902000Y-149987000D01* +D36* +X87663000Y-153162000D02* +X87663000Y-152240000D01* +X97650000Y-156451000D02* +X99560000Y-156451000D01* +X97282000Y-156083000D02* +X97650000Y-156451000D01* +X87663000Y-152240000D02* +X87757000Y-152146000D01* +X87663000Y-154432000D02* +X87663000Y-153162000D01* +X90932000Y-152781000D02* +X90666000Y-153047000D01* +X91186000Y-152781000D02* +X90932000Y-152781000D01* +X91567000Y-153162000D02* +X91186000Y-152781000D01* +X90666000Y-153047000D02* +X90666000Y-153416000D01* +X97854000Y-158051000D02* +X99560000Y-158051000D01* +X97663000Y-158242000D02* +X97854000Y-158051000D01* +X90666000Y-158508000D02* +X91440000Y-157734000D01* +X91440000Y-157734000D02* +X91567000Y-157734000D01* +X89039000Y-150114000D02* +X89039000Y-151765000D01* +X90666000Y-153416000D02* +X90666000Y-153404000D01* +X90666000Y-153404000D02* +X89039000Y-151777000D01* +X89039000Y-151777000D02* +X89039000Y-151765000D01* +X90666000Y-158877000D02* +X90666000Y-158508000D01* +X76200000Y-149860000D02* +X77597000Y-149860000D01* +X78740000Y-151003000D02* +X81546000Y-151003000D01* +X77597000Y-149860000D02* +X78740000Y-151003000D01* +X79006000Y-149352000D02* +X78486000Y-149352000D01* +X77470000Y-148590000D02* +X76200000Y-147320000D01* +X77724000Y-148590000D02* +X77470000Y-148590000D01* +X78486000Y-149352000D02* +X77724000Y-148590000D01* +X79006000Y-147701000D02* +X78867000Y-147701000D01* +X78867000Y-147701000D02* +X77851000Y-146685000D01* +X77851000Y-146685000D02* +X77851000Y-145034000D01* +X77851000Y-145034000D02* +X77597000Y-144780000D01* +X77597000Y-144780000D02* +X76200000Y-144780000D01* +X76454000Y-144780000D02* +X76200000Y-144780000D01* +X79006000Y-146050000D02* +X79006000Y-144030000D01* +X79006000Y-144030000D02* +X77216000Y-142240000D01* +X77216000Y-142240000D02* +X76200000Y-142240000D01* +D38* +X113665000Y-158115000D02* +X113665000Y-157861000D01* +X113665000Y-157861000D02* +X114046000Y-157480000D01* +X114046000Y-157480000D02* +X116840000Y-157480000D01* +X113665000Y-160147000D02* +X113665000Y-159639000D01* +X113792000Y-159512000D02* +X116332000Y-159512000D01* +X113665000Y-159639000D02* +X113792000Y-159512000D01* +X116332000Y-159512000D02* +X116840000Y-160020000D01* +D36* +X89166000Y-155067000D02* +X89166000Y-153416000D01* +X87663000Y-155702000D02* +X88531000Y-155702000D01* +X88531000Y-155702000D02* +X89166000Y-155067000D01* +X89166000Y-160528000D02* +X89166000Y-158877000D01* +X89166000Y-158877000D02* +X89166000Y-158635000D01* +X89166000Y-158635000D02* +X88773000Y-158242000D01* +X88773000Y-158242000D02* +X87663000Y-158242000D01* +X87790000Y-158115000D02* +X87663000Y-158242000D01* +X84455000Y-150991000D02* +X83058000Y-150991000D01* +X83058000Y-150991000D02* +X83046000Y-151003000D01* +X80391000Y-153555000D02* +X80391000Y-153543000D01* +X80391000Y-153543000D02* +X79998000Y-153150000D01* +X79998000Y-153150000D02* +X79998000Y-152146000D01* +X82263000Y-154432000D02* +X82263000Y-153162000D01* +X80911000Y-155055000D02* +X81534000Y-154432000D01* +X81534000Y-154432000D02* +X82263000Y-154432000D01* +X80391000Y-155055000D02* +X80911000Y-155055000D01* +X80391000Y-158889000D02* +X80391000Y-158750000D01* +X80391000Y-158750000D02* +X79998000Y-158357000D01* +X79998000Y-158357000D02* +X79998000Y-157480000D01* +X82263000Y-159512000D02* +X82263000Y-160782000D01* +X80391000Y-160389000D02* +X80887000Y-160389000D01* +X81280000Y-160782000D02* +X82263000Y-160782000D01* +X80887000Y-160389000D02* +X81280000Y-160782000D01* +M02* diff --git a/PCB/OUTPUT_V2/Tinylab_proto1-F_Mask.gbr b/PCB/OUTPUT_V2/Tinylab_proto1-F_Mask.gbr new file mode 100644 index 00000000..15cf453a --- /dev/null +++ b/PCB/OUTPUT_V2/Tinylab_proto1-F_Mask.gbr @@ -0,0 +1,262 @@ +G04 #@! TF.FileFunction,Soldermask,Top* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 24/12/2015 2:00:31 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,0.800000X0.750000*% +%ADD12R,0.750000X0.800000*% +%ADD13C,1.300000*% +%ADD14R,1.300000X1.300000*% +%ADD15C,1.998980*% +%ADD16R,1.998980X1.998980*% +%ADD17R,1.000000X1.600000*% +%ADD18R,0.560000X1.600000*% +%ADD19R,1.600000X0.560000*% +%ADD20R,2.032000X1.727200*% +%ADD21O,2.032000X1.727200*% +%ADD22R,0.400000X1.350000*% +%ADD23O,1.250000X0.950000*% +%ADD24O,1.000000X1.550000*% +%ADD25R,1.727200X1.727200*% +%ADD26O,1.727200X1.727200*% +%ADD27R,2.032000X2.032000*% +%ADD28O,2.032000X2.032000*% +%ADD29R,0.900000X0.600000*% +%ADD30R,0.500000X0.900000*% +%ADD31R,0.900000X0.500000*% +%ADD32R,0.600000X0.900000*% +%ADD33R,1.500000X0.600000*% +%ADD34R,0.304800X0.508000*% +G04 APERTURE END LIST* +D10* +D11* +X90436000Y-156591000D03* +X91936000Y-156591000D03* +D12* +X91948000Y-160516000D03* +X91948000Y-159016000D03* +D11* +X111137000Y-142621000D03* +X112637000Y-142621000D03* +X112256000Y-147193000D03* +X110756000Y-147193000D03* +D12* +X91821000Y-151753000D03* +X91821000Y-150253000D03* +D13* +X76494000Y-136906000D03* +D14* +X78994000Y-136906000D03* +D12* +X78740000Y-155182000D03* +X78740000Y-153682000D03* +X81280000Y-142760000D03* +X81280000Y-144260000D03* +X97536000Y-140601000D03* +X97536000Y-142101000D03* +X97790000Y-153785000D03* +X97790000Y-152285000D03* +D13* +X93345000Y-141391000D03* +D14* +X93345000Y-143891000D03* +D12* +X88900000Y-143879000D03* +X88900000Y-142379000D03* +X114427000Y-151777000D03* +X114427000Y-153277000D03* +X78740000Y-160516000D03* +X78740000Y-159016000D03* +D13* +X116078000Y-146518000D03* +D14* +X116078000Y-144018000D03* +D15* +X92710000Y-135125460D03* +D16* +X82550000Y-135125460D03* +D17* +X107291000Y-142113000D03* +X104291000Y-142113000D03* +D18* +X101410000Y-159901000D03* +X102210000Y-159901000D03* +X103010000Y-159901000D03* +X103810000Y-159901000D03* +X104610000Y-159901000D03* +X105410000Y-159901000D03* +X106210000Y-159901000D03* +X107010000Y-159901000D03* +X107810000Y-159901000D03* +X108610000Y-159901000D03* +X109410000Y-159901000D03* +D19* +X111260000Y-158051000D03* +X111260000Y-157251000D03* +X111260000Y-156451000D03* +X111260000Y-155651000D03* +X111260000Y-154851000D03* +X111260000Y-154051000D03* +X111260000Y-153251000D03* +X111260000Y-152451000D03* +X111260000Y-151651000D03* +X111260000Y-150851000D03* +X111260000Y-150051000D03* +D18* +X109410000Y-148201000D03* +X108610000Y-148201000D03* +X107810000Y-148201000D03* +X107010000Y-148201000D03* +X106210000Y-148201000D03* +X105410000Y-148201000D03* +X104610000Y-148201000D03* +X103810000Y-148201000D03* +X103010000Y-148201000D03* +X102210000Y-148201000D03* +X101410000Y-148201000D03* +D19* +X99560000Y-150051000D03* +X99560000Y-150851000D03* +X99560000Y-151651000D03* +X99560000Y-152451000D03* +X99560000Y-153251000D03* +X99560000Y-154051000D03* +X99560000Y-154851000D03* +X99560000Y-155651000D03* +X99560000Y-156451000D03* +X99560000Y-157251000D03* +X99560000Y-158051000D03* +D15* +X82296000Y-137924540D03* +D16* +X92456000Y-137924540D03* +D20* +X94488000Y-159512000D03* +D21* +X94488000Y-156972000D03* +X94488000Y-154432000D03* +X94488000Y-151892000D03* +D22* +X115854900Y-139230540D03* +X115204900Y-139230540D03* +X114554900Y-139230540D03* +X113904900Y-139230540D03* +X113254900Y-139230540D03* +D23* +X117054900Y-139230540D03* +X112054900Y-139230540D03* +D24* +X118054900Y-136530540D03* +X111054900Y-136530540D03* +D20* +X76200000Y-149860000D03* +D21* +X76200000Y-147320000D03* +X76200000Y-144780000D03* +X76200000Y-142240000D03* +D25* +X105156000Y-135382000D03* +D26* +X107696000Y-135382000D03* +X105156000Y-137922000D03* +X107696000Y-137922000D03* +D20* +X100330000Y-140462000D03* +D21* +X100330000Y-137922000D03* +X100330000Y-135382000D03* +D20* +X76200000Y-152400000D03* +D21* +X76200000Y-154940000D03* +X76200000Y-157480000D03* +X76200000Y-160020000D03* +D25* +X86360000Y-143510000D03* +D26* +X83820000Y-143510000D03* +X86360000Y-140970000D03* +X83820000Y-140970000D03* +D27* +X116840000Y-157480000D03* +D28* +X116840000Y-160020000D03* +D29* +X94485000Y-137922000D03* +X97285000Y-136972000D03* +X97285000Y-138872000D03* +D30* +X89166000Y-155067000D03* +X90666000Y-155067000D03* +X89166000Y-160528000D03* +X90666000Y-160528000D03* +X89166000Y-153416000D03* +X90666000Y-153416000D03* +X90666000Y-158877000D03* +X89166000Y-158877000D03* +X90539000Y-151765000D03* +X89039000Y-151765000D03* +X90539000Y-150114000D03* +X89039000Y-150114000D03* +X80506000Y-146050000D03* +X79006000Y-146050000D03* +X80506000Y-147701000D03* +X79006000Y-147701000D03* +X80506000Y-149352000D03* +X79006000Y-149352000D03* +X83046000Y-151003000D03* +X81546000Y-151003000D03* +X83173000Y-146050000D03* +X81673000Y-146050000D03* +X83173000Y-147701000D03* +X81673000Y-147701000D03* +X83173000Y-149352000D03* +X81673000Y-149352000D03* +D31* +X84455000Y-149491000D03* +X84455000Y-150991000D03* +X80391000Y-153555000D03* +X80391000Y-155055000D03* +D30* +X78498000Y-152146000D03* +X79998000Y-152146000D03* +D31* +X80391000Y-158889000D03* +X80391000Y-160389000D03* +D30* +X78498000Y-157480000D03* +X79998000Y-157480000D03* +X97421000Y-143891000D03* +X98921000Y-143891000D03* +X100850000Y-143891000D03* +X102350000Y-143891000D03* +D32* +X109982000Y-142999000D03* +X110932000Y-145799000D03* +X109032000Y-145799000D03* +D33* +X87663000Y-160782000D03* +X87663000Y-159512000D03* +X87663000Y-158242000D03* +X87663000Y-156972000D03* +X87663000Y-155702000D03* +X87663000Y-154432000D03* +X87663000Y-153162000D03* +X82263000Y-153162000D03* +X82263000Y-154432000D03* +X82263000Y-155702000D03* +X82263000Y-156972000D03* +X82263000Y-158242000D03* +X82263000Y-159512000D03* +X82263000Y-160782000D03* +D34* +X113030000Y-160147000D03* +X114300000Y-160147000D03* +X113030000Y-158115000D03* +X113665000Y-160147000D03* +X114300000Y-158115000D03* +X113665000Y-158115000D03* +M02* diff --git a/PCB/OUTPUT_V2/Tinylab_proto1-F_SilkS.gbr b/PCB/OUTPUT_V2/Tinylab_proto1-F_SilkS.gbr new file mode 100644 index 00000000..46c89ff2 --- /dev/null +++ b/PCB/OUTPUT_V2/Tinylab_proto1-F_SilkS.gbr @@ -0,0 +1,2109 @@ +G04 #@! TF.FileFunction,Legend,Top* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 24/12/2015 2:00:31 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11C,0.150000*% +G04 APERTURE END LIST* +D10* +D11* +X90836000Y-155991000D02* +X91536000Y-155991000D01* +X91536000Y-157191000D02* +X90836000Y-157191000D01* +X91348000Y-160116000D02* +X91348000Y-159416000D01* +X92548000Y-159416000D02* +X92548000Y-160116000D01* +X111537000Y-142021000D02* +X112237000Y-142021000D01* +X112237000Y-143221000D02* +X111537000Y-143221000D01* +X111856000Y-147793000D02* +X111156000Y-147793000D01* +X111156000Y-146593000D02* +X111856000Y-146593000D01* +X91221000Y-151353000D02* +X91221000Y-150653000D01* +X92421000Y-150653000D02* +X92421000Y-151353000D01* +X77669000Y-140055000D02* +X77669000Y-133757000D01* +X77529000Y-140049000D02* +X77529000Y-133763000D01* +X77389000Y-140036000D02* +X77389000Y-137352000D01* +X77389000Y-136460000D02* +X77389000Y-133776000D01* +X77249000Y-140017000D02* +X77249000Y-137562000D01* +X77249000Y-136250000D02* +X77249000Y-133795000D01* +X77109000Y-139991000D02* +X77109000Y-137695000D01* +X77109000Y-136117000D02* +X77109000Y-133821000D01* +X76969000Y-139959000D02* +X76969000Y-137786000D01* +X76969000Y-136026000D02* +X76969000Y-133853000D01* +X76829000Y-139920000D02* +X76829000Y-137848000D01* +X76829000Y-135964000D02* +X76829000Y-133892000D01* +X76689000Y-139874000D02* +X76689000Y-137887000D01* +X76689000Y-135925000D02* +X76689000Y-133938000D01* +X76549000Y-139821000D02* +X76549000Y-137904000D01* +X76549000Y-135908000D02* +X76549000Y-133991000D01* +X76409000Y-139759000D02* +X76409000Y-137902000D01* +X76409000Y-135910000D02* +X76409000Y-134053000D01* +X76269000Y-139689000D02* +X76269000Y-137880000D01* +X76269000Y-135932000D02* +X76269000Y-134123000D01* +X76129000Y-139610000D02* +X76129000Y-137837000D01* +X76129000Y-135975000D02* +X76129000Y-134202000D01* +X75989000Y-139522000D02* +X75989000Y-137769000D01* +X75989000Y-136043000D02* +X75989000Y-134290000D01* +X75849000Y-139422000D02* +X75849000Y-137670000D01* +X75849000Y-136142000D02* +X75849000Y-134390000D01* +X75709000Y-139310000D02* +X75709000Y-137525000D01* +X75709000Y-136287000D02* +X75709000Y-134502000D01* +X75569000Y-139185000D02* +X75569000Y-137286000D01* +X75569000Y-136526000D02* +X75569000Y-134627000D01* +X75429000Y-139042000D02* +X75429000Y-134770000D01* +X75289000Y-138880000D02* +X75289000Y-134932000D01* +X75149000Y-138692000D02* +X75149000Y-135120000D01* +X75009000Y-138469000D02* +X75009000Y-135343000D01* +X74869000Y-138193000D02* +X74869000Y-135619000D01* +X74729000Y-137818000D02* +X74729000Y-135994000D01* +X77494000Y-136906000D02* +G75* +G03X77494000Y-136906000I-1000000J0D01* +G01* +X80931500Y-136906000D02* +G75* +G03X80931500Y-136906000I-3187500J0D01* +G01* +X78140000Y-154782000D02* +X78140000Y-154082000D01* +X79340000Y-154082000D02* +X79340000Y-154782000D01* +X81880000Y-143160000D02* +X81880000Y-143860000D01* +X80680000Y-143860000D02* +X80680000Y-143160000D01* +X98136000Y-141001000D02* +X98136000Y-141701000D01* +X96936000Y-141701000D02* +X96936000Y-141001000D01* +X97190000Y-153385000D02* +X97190000Y-152685000D01* +X98390000Y-152685000D02* +X98390000Y-153385000D01* +X90196000Y-142566000D02* +X96494000Y-142566000D01* +X90202000Y-142426000D02* +X96488000Y-142426000D01* +X90215000Y-142286000D02* +X92899000Y-142286000D01* +X93791000Y-142286000D02* +X96475000Y-142286000D01* +X90234000Y-142146000D02* +X92689000Y-142146000D01* +X94001000Y-142146000D02* +X96456000Y-142146000D01* +X90260000Y-142006000D02* +X92556000Y-142006000D01* +X94134000Y-142006000D02* +X96430000Y-142006000D01* +X90292000Y-141866000D02* +X92465000Y-141866000D01* +X94225000Y-141866000D02* +X96398000Y-141866000D01* +X90331000Y-141726000D02* +X92403000Y-141726000D01* +X94287000Y-141726000D02* +X96359000Y-141726000D01* +X90377000Y-141586000D02* +X92364000Y-141586000D01* +X94326000Y-141586000D02* +X96313000Y-141586000D01* +X90430000Y-141446000D02* +X92347000Y-141446000D01* +X94343000Y-141446000D02* +X96260000Y-141446000D01* +X90492000Y-141306000D02* +X92349000Y-141306000D01* +X94341000Y-141306000D02* +X96198000Y-141306000D01* +X90562000Y-141166000D02* +X92371000Y-141166000D01* +X94319000Y-141166000D02* +X96128000Y-141166000D01* +X90641000Y-141026000D02* +X92414000Y-141026000D01* +X94276000Y-141026000D02* +X96049000Y-141026000D01* +X90729000Y-140886000D02* +X92482000Y-140886000D01* +X94208000Y-140886000D02* +X95961000Y-140886000D01* +X90829000Y-140746000D02* +X92581000Y-140746000D01* +X94109000Y-140746000D02* +X95861000Y-140746000D01* +X90941000Y-140606000D02* +X92726000Y-140606000D01* +X93964000Y-140606000D02* +X95749000Y-140606000D01* +X91066000Y-140466000D02* +X92965000Y-140466000D01* +X93725000Y-140466000D02* +X95624000Y-140466000D01* +X91209000Y-140326000D02* +X95481000Y-140326000D01* +X91371000Y-140186000D02* +X95319000Y-140186000D01* +X91559000Y-140046000D02* +X95131000Y-140046000D01* +X91782000Y-139906000D02* +X94908000Y-139906000D01* +X92058000Y-139766000D02* +X94632000Y-139766000D01* +X92433000Y-139626000D02* +X94257000Y-139626000D01* +X94345000Y-141391000D02* +G75* +G03X94345000Y-141391000I-1000000J0D01* +G01* +X96532500Y-142641000D02* +G75* +G03X96532500Y-142641000I-3187500J0D01* +G01* +X88300000Y-143479000D02* +X88300000Y-142779000D01* +X89500000Y-142779000D02* +X89500000Y-143479000D01* +X115027000Y-152177000D02* +X115027000Y-152877000D01* +X113827000Y-152877000D02* +X113827000Y-152177000D01* +X78140000Y-160116000D02* +X78140000Y-159416000D01* +X79340000Y-159416000D02* +X79340000Y-160116000D01* +X119227000Y-145343000D02* +X112929000Y-145343000D01* +X119221000Y-145483000D02* +X112935000Y-145483000D01* +X119208000Y-145623000D02* +X116524000Y-145623000D01* +X115632000Y-145623000D02* +X112948000Y-145623000D01* +X119189000Y-145763000D02* +X116734000Y-145763000D01* +X115422000Y-145763000D02* +X112967000Y-145763000D01* +X119163000Y-145903000D02* +X116867000Y-145903000D01* +X115289000Y-145903000D02* +X112993000Y-145903000D01* +X119131000Y-146043000D02* +X116958000Y-146043000D01* +X115198000Y-146043000D02* +X113025000Y-146043000D01* +X119092000Y-146183000D02* +X117020000Y-146183000D01* +X115136000Y-146183000D02* +X113064000Y-146183000D01* +X119046000Y-146323000D02* +X117059000Y-146323000D01* +X115097000Y-146323000D02* +X113110000Y-146323000D01* +X118993000Y-146463000D02* +X117076000Y-146463000D01* +X115080000Y-146463000D02* +X113163000Y-146463000D01* +X118931000Y-146603000D02* +X117074000Y-146603000D01* +X115082000Y-146603000D02* +X113225000Y-146603000D01* +X118861000Y-146743000D02* +X117052000Y-146743000D01* +X115104000Y-146743000D02* +X113295000Y-146743000D01* +X118782000Y-146883000D02* +X117009000Y-146883000D01* +X115147000Y-146883000D02* +X113374000Y-146883000D01* +X118694000Y-147023000D02* +X116941000Y-147023000D01* +X115215000Y-147023000D02* +X113462000Y-147023000D01* +X118594000Y-147163000D02* +X116842000Y-147163000D01* +X115314000Y-147163000D02* +X113562000Y-147163000D01* +X118482000Y-147303000D02* +X116697000Y-147303000D01* +X115459000Y-147303000D02* +X113674000Y-147303000D01* +X118357000Y-147443000D02* +X116458000Y-147443000D01* +X115698000Y-147443000D02* +X113799000Y-147443000D01* +X118214000Y-147583000D02* +X113942000Y-147583000D01* +X118052000Y-147723000D02* +X114104000Y-147723000D01* +X117864000Y-147863000D02* +X114292000Y-147863000D01* +X117641000Y-148003000D02* +X114515000Y-148003000D01* +X117365000Y-148143000D02* +X114791000Y-148143000D01* +X116990000Y-148283000D02* +X115166000Y-148283000D01* +X117078000Y-146518000D02* +G75* +G03X117078000Y-146518000I-1000000J0D01* +G01* +X119265500Y-145268000D02* +G75* +G03X119265500Y-145268000I-3187500J0D01* +G01* +X90170000Y-135125460D02* +X91186000Y-135125460D01* +X85344000Y-135125460D02* +X84074000Y-135125460D01* +X85598000Y-133855460D02* +X85598000Y-136395460D01* +X85852000Y-133855460D02* +X85852000Y-136395460D01* +X86106000Y-133855460D02* +X86106000Y-136395460D01* +X85344000Y-133855460D02* +X85344000Y-136395460D01* +X86360000Y-133855460D02* +X85090000Y-136395460D01* +X85090000Y-133855460D02* +X86360000Y-136395460D01* +X86360000Y-133855460D02* +X86360000Y-136395460D01* +X85725000Y-133855460D02* +X85725000Y-136395460D01* +X85090000Y-136395460D02* +X85090000Y-133855460D01* +X85090000Y-133855460D02* +X90170000Y-133855460D01* +X90170000Y-133855460D02* +X90170000Y-136395460D01* +X90170000Y-136395460D02* +X85090000Y-136395460D01* +X104791000Y-143138000D02* +X106791000Y-143138000D01* +X106791000Y-141088000D02* +X104791000Y-141088000D01* +X100235000Y-159226000D02* +X100905000Y-159226000D01* +X100235000Y-148876000D02* +X100905000Y-148876000D01* +X110585000Y-148876000D02* +X109915000Y-148876000D01* +X110585000Y-159226000D02* +X109915000Y-159226000D01* +X100235000Y-159226000D02* +X100235000Y-158556000D01* +X110585000Y-159226000D02* +X110585000Y-158556000D01* +X110585000Y-148876000D02* +X110585000Y-149546000D01* +X100235000Y-148876000D02* +X100235000Y-149546000D01* +X100905000Y-159226000D02* +X100905000Y-160701000D01* +X84836000Y-137924540D02* +X83820000Y-137924540D01* +X89662000Y-137924540D02* +X90932000Y-137924540D01* +X89408000Y-139194540D02* +X89408000Y-136654540D01* +X89154000Y-139194540D02* +X89154000Y-136654540D01* +X88900000Y-139194540D02* +X88900000Y-136654540D01* +X89662000Y-139194540D02* +X89662000Y-136654540D01* +X88646000Y-139194540D02* +X89916000Y-136654540D01* +X89916000Y-139194540D02* +X88646000Y-136654540D01* +X88646000Y-139194540D02* +X88646000Y-136654540D01* +X89281000Y-139194540D02* +X89281000Y-136654540D01* +X89916000Y-136654540D02* +X89916000Y-139194540D01* +X89916000Y-139194540D02* +X84836000Y-139194540D01* +X84836000Y-139194540D02* +X84836000Y-136654540D01* +X84836000Y-136654540D02* +X89916000Y-136654540D01* +X95758000Y-158242000D02* +X95758000Y-150622000D01* +X93218000Y-158242000D02* +X93218000Y-150622000D01* +X92938000Y-161062000D02* +X92938000Y-159512000D01* +X95758000Y-150622000D02* +X93218000Y-150622000D01* +X93218000Y-158242000D02* +X95758000Y-158242000D01* +X96038000Y-159512000D02* +X96038000Y-161062000D01* +X96038000Y-161062000D02* +X92938000Y-161062000D01* +X118904900Y-133850540D02* +X110204900Y-133850540D01* +X118904900Y-140255540D02* +X110204900Y-140255540D01* +X110204900Y-140255540D02* +X110204900Y-133850540D01* +X110204900Y-135080540D02* +X118904900Y-135080540D01* +X118904900Y-133850540D02* +X118904900Y-140255540D01* +X77470000Y-148590000D02* +X77470000Y-140970000D01* +X74930000Y-148590000D02* +X74930000Y-140970000D01* +X74650000Y-151410000D02* +X74650000Y-149860000D01* +X77470000Y-140970000D02* +X74930000Y-140970000D01* +X74930000Y-148590000D02* +X77470000Y-148590000D01* +X77750000Y-149860000D02* +X77750000Y-151410000D01* +X77750000Y-151410000D02* +X74650000Y-151410000D01* +X103606000Y-135382000D02* +X103606000Y-133832000D01* +X105156000Y-133832000D02* +X103606000Y-133832000D01* +X103886000Y-136652000D02* +X106426000Y-136652000D01* +X106426000Y-136652000D02* +X106426000Y-134112000D01* +X106426000Y-134112000D02* +X108966000Y-134112000D01* +X108966000Y-134112000D02* +X108966000Y-139192000D01* +X108966000Y-139192000D02* +X103886000Y-139192000D01* +X103886000Y-139192000D02* +X103886000Y-136652000D01* +X101600000Y-139192000D02* +X101600000Y-134112000D01* +X101600000Y-134112000D02* +X99060000Y-134112000D01* +X99060000Y-134112000D02* +X99060000Y-139192000D01* +X98780000Y-142012000D02* +X98780000Y-140462000D01* +X99060000Y-139192000D02* +X101600000Y-139192000D01* +X101880000Y-140462000D02* +X101880000Y-142012000D01* +X101880000Y-142012000D02* +X98780000Y-142012000D01* +X74930000Y-153670000D02* +X74930000Y-161290000D01* +X77470000Y-153670000D02* +X77470000Y-161290000D01* +X77750000Y-150850000D02* +X77750000Y-152400000D01* +X74930000Y-161290000D02* +X77470000Y-161290000D01* +X77470000Y-153670000D02* +X74930000Y-153670000D01* +X74650000Y-152400000D02* +X74650000Y-150850000D01* +X74650000Y-150850000D02* +X77750000Y-150850000D01* +X87910000Y-143510000D02* +X87910000Y-145060000D01* +X86360000Y-145060000D02* +X87910000Y-145060000D01* +X87630000Y-142240000D02* +X85090000Y-142240000D01* +X85090000Y-142240000D02* +X85090000Y-144780000D01* +X85090000Y-144780000D02* +X82550000Y-144780000D01* +X82550000Y-144780000D02* +X82550000Y-139700000D01* +X82550000Y-139700000D02* +X87630000Y-139700000D01* +X87630000Y-139700000D02* +X87630000Y-142240000D01* +X118110000Y-158750000D02* +X118110000Y-161290000D01* +X118390000Y-155930000D02* +X118390000Y-157480000D01* +X118110000Y-158750000D02* +X115570000Y-158750000D01* +X115290000Y-157480000D02* +X115290000Y-155930000D01* +X115290000Y-155930000D02* +X118390000Y-155930000D01* +X115570000Y-158750000D02* +X115570000Y-161290000D01* +X115570000Y-161290000D02* +X118110000Y-161290000D01* +X96426421Y-138922000D02* +G75* +G03X96426421Y-138922000I-141421J0D01* +G01* +X96685000Y-136422000D02* +X95085000Y-136422000D01* +X95085000Y-136422000D02* +X95085000Y-139422000D01* +X95085000Y-139422000D02* +X96685000Y-139422000D01* +X96685000Y-139422000D02* +X96685000Y-136422000D01* +X90416000Y-155742000D02* +X89416000Y-155742000D01* +X89416000Y-154392000D02* +X90416000Y-154392000D01* +X90416000Y-161203000D02* +X89416000Y-161203000D01* +X89416000Y-159853000D02* +X90416000Y-159853000D01* +X90416000Y-154091000D02* +X89416000Y-154091000D01* +X89416000Y-152741000D02* +X90416000Y-152741000D01* +X89416000Y-158202000D02* +X90416000Y-158202000D01* +X90416000Y-159552000D02* +X89416000Y-159552000D01* +X89289000Y-151090000D02* +X90289000Y-151090000D01* +X90289000Y-152440000D02* +X89289000Y-152440000D01* +X89289000Y-149439000D02* +X90289000Y-149439000D01* +X90289000Y-150789000D02* +X89289000Y-150789000D01* +X79256000Y-145375000D02* +X80256000Y-145375000D01* +X80256000Y-146725000D02* +X79256000Y-146725000D01* +X79256000Y-147026000D02* +X80256000Y-147026000D01* +X80256000Y-148376000D02* +X79256000Y-148376000D01* +X79256000Y-148677000D02* +X80256000Y-148677000D01* +X80256000Y-150027000D02* +X79256000Y-150027000D01* +X81796000Y-150328000D02* +X82796000Y-150328000D01* +X82796000Y-151678000D02* +X81796000Y-151678000D01* +X81923000Y-145375000D02* +X82923000Y-145375000D01* +X82923000Y-146725000D02* +X81923000Y-146725000D01* +X81923000Y-147026000D02* +X82923000Y-147026000D01* +X82923000Y-148376000D02* +X81923000Y-148376000D01* +X81923000Y-148677000D02* +X82923000Y-148677000D01* +X82923000Y-150027000D02* +X81923000Y-150027000D01* +X83780000Y-150741000D02* +X83780000Y-149741000D01* +X85130000Y-149741000D02* +X85130000Y-150741000D01* +X79716000Y-154805000D02* +X79716000Y-153805000D01* +X81066000Y-153805000D02* +X81066000Y-154805000D01* +X79748000Y-152821000D02* +X78748000Y-152821000D01* +X78748000Y-151471000D02* +X79748000Y-151471000D01* +X79716000Y-160139000D02* +X79716000Y-159139000D01* +X81066000Y-159139000D02* +X81066000Y-160139000D01* +X79748000Y-158155000D02* +X78748000Y-158155000D01* +X78748000Y-156805000D02* +X79748000Y-156805000D01* +X98671000Y-144566000D02* +X97671000Y-144566000D01* +X97671000Y-143216000D02* +X98671000Y-143216000D01* +X102100000Y-144566000D02* +X101100000Y-144566000D01* +X101100000Y-143216000D02* +X102100000Y-143216000D01* +X109123421Y-144799000D02* +G75* +G03X109123421Y-144799000I-141421J0D01* +G01* +X111482000Y-145199000D02* +X111482000Y-143599000D01* +X111482000Y-143599000D02* +X108482000Y-143599000D01* +X108482000Y-143599000D02* +X108482000Y-145199000D01* +X108482000Y-145199000D02* +X111482000Y-145199000D01* +X87038000Y-161422000D02* +X87038000Y-161307000D01* +X82888000Y-161422000D02* +X82888000Y-161307000D01* +X82888000Y-152522000D02* +X82888000Y-152637000D01* +X87038000Y-152522000D02* +X87038000Y-152637000D01* +X87038000Y-161422000D02* +X82888000Y-161422000D01* +X87038000Y-152522000D02* +X82888000Y-152522000D01* +X87038000Y-161307000D02* +X88413000Y-161307000D01* +X114681000Y-158496000D02* +X112649000Y-158496000D01* +X112649000Y-158496000D02* +X112649000Y-159766000D01* +X112649000Y-159766000D02* +X114681000Y-159766000D01* +X114681000Y-159766000D02* +X114681000Y-158496000D01* +X92035334Y-155652743D02* +X91987715Y-155700362D01* +X91844858Y-155747981D01* +X91749620Y-155747981D01* +X91606762Y-155700362D01* +X91511524Y-155605124D01* +X91463905Y-155509886D01* +X91416286Y-155319410D01* +X91416286Y-155176552D01* +X91463905Y-154986076D01* +X91511524Y-154890838D01* +X91606762Y-154795600D01* +X91749620Y-154747981D01* +X91844858Y-154747981D01* +X91987715Y-154795600D01* +X92035334Y-154843219D01* +X92987715Y-155747981D02* +X92416286Y-155747981D01* +X92702000Y-155747981D02* +X92702000Y-154747981D01* +X92606762Y-154890838D01* +X92511524Y-154986076D01* +X92416286Y-155033695D01* +X92065814Y-162343103D02* +X92018195Y-162390722D01* +X91875338Y-162438341D01* +X91780100Y-162438341D01* +X91637242Y-162390722D01* +X91542004Y-162295484D01* +X91494385Y-162200246D01* +X91446766Y-162009770D01* +X91446766Y-161866912D01* +X91494385Y-161676436D01* +X91542004Y-161581198D01* +X91637242Y-161485960D01* +X91780100Y-161438341D01* +X91875338Y-161438341D01* +X92018195Y-161485960D01* +X92065814Y-161533579D01* +X92446766Y-161533579D02* +X92494385Y-161485960D01* +X92589623Y-161438341D01* +X92827719Y-161438341D01* +X92922957Y-161485960D01* +X92970576Y-161533579D01* +X93018195Y-161628817D01* +X93018195Y-161724055D01* +X92970576Y-161866912D01* +X92399147Y-162438341D01* +X93018195Y-162438341D01* +X111745734Y-141682743D02* +X111698115Y-141730362D01* +X111555258Y-141777981D01* +X111460020Y-141777981D01* +X111317162Y-141730362D01* +X111221924Y-141635124D01* +X111174305Y-141539886D01* +X111126686Y-141349410D01* +X111126686Y-141206552D01* +X111174305Y-141016076D01* +X111221924Y-140920838D01* +X111317162Y-140825600D01* +X111460020Y-140777981D01* +X111555258Y-140777981D01* +X111698115Y-140825600D01* +X111745734Y-140873219D01* +X112079067Y-140777981D02* +X112698115Y-140777981D01* +X112364781Y-141158933D01* +X112507639Y-141158933D01* +X112602877Y-141206552D01* +X112650496Y-141254171D01* +X112698115Y-141349410D01* +X112698115Y-141587505D01* +X112650496Y-141682743D01* +X112602877Y-141730362D01* +X112507639Y-141777981D01* +X112221924Y-141777981D01* +X112126686Y-141730362D01* +X112079067Y-141682743D01* +X111491734Y-148845543D02* +X111444115Y-148893162D01* +X111301258Y-148940781D01* +X111206020Y-148940781D01* +X111063162Y-148893162D01* +X110967924Y-148797924D01* +X110920305Y-148702686D01* +X110872686Y-148512210D01* +X110872686Y-148369352D01* +X110920305Y-148178876D01* +X110967924Y-148083638D01* +X111063162Y-147988400D01* +X111206020Y-147940781D01* +X111301258Y-147940781D01* +X111444115Y-147988400D01* +X111491734Y-148036019D01* +X112348877Y-148274114D02* +X112348877Y-148940781D01* +X112110781Y-147893162D02* +X111872686Y-148607448D01* +X112491734Y-148607448D01* +X92492534Y-149455143D02* +X92444915Y-149502762D01* +X92302058Y-149550381D01* +X92206820Y-149550381D01* +X92063962Y-149502762D01* +X91968724Y-149407524D01* +X91921105Y-149312286D01* +X91873486Y-149121810D01* +X91873486Y-148978952D01* +X91921105Y-148788476D01* +X91968724Y-148693238D01* +X92063962Y-148598000D01* +X92206820Y-148550381D01* +X92302058Y-148550381D01* +X92444915Y-148598000D01* +X92492534Y-148645619D01* +X93397296Y-148550381D02* +X92921105Y-148550381D01* +X92873486Y-149026571D01* +X92921105Y-148978952D01* +X93016343Y-148931333D01* +X93254439Y-148931333D01* +X93349677Y-148978952D01* +X93397296Y-149026571D01* +X93444915Y-149121810D01* +X93444915Y-149359905D01* +X93397296Y-149455143D01* +X93349677Y-149502762D01* +X93254439Y-149550381D01* +X93016343Y-149550381D01* +X92921105Y-149502762D01* +X92873486Y-149455143D01* +X78700334Y-138914143D02* +X78652715Y-138961762D01* +X78509858Y-139009381D01* +X78414620Y-139009381D01* +X78271762Y-138961762D01* +X78176524Y-138866524D01* +X78128905Y-138771286D01* +X78081286Y-138580810D01* +X78081286Y-138437952D01* +X78128905Y-138247476D01* +X78176524Y-138152238D01* +X78271762Y-138057000D01* +X78414620Y-138009381D01* +X78509858Y-138009381D01* +X78652715Y-138057000D01* +X78700334Y-138104619D01* +X79557477Y-138009381D02* +X79367000Y-138009381D01* +X79271762Y-138057000D01* +X79224143Y-138104619D01* +X79128905Y-138247476D01* +X79081286Y-138437952D01* +X79081286Y-138818905D01* +X79128905Y-138914143D01* +X79176524Y-138961762D01* +X79271762Y-139009381D01* +X79462239Y-139009381D01* +X79557477Y-138961762D01* +X79605096Y-138914143D01* +X79652715Y-138818905D01* +X79652715Y-138580810D01* +X79605096Y-138485571D01* +X79557477Y-138437952D01* +X79462239Y-138390333D01* +X79271762Y-138390333D01* +X79176524Y-138437952D01* +X79128905Y-138485571D01* +X79081286Y-138580810D01* +X77197143Y-154598666D02* +X77244762Y-154646285D01* +X77292381Y-154789142D01* +X77292381Y-154884380D01* +X77244762Y-155027238D01* +X77149524Y-155122476D01* +X77054286Y-155170095D01* +X76863810Y-155217714D01* +X76720952Y-155217714D01* +X76530476Y-155170095D01* +X76435238Y-155122476D01* +X76340000Y-155027238D01* +X76292381Y-154884380D01* +X76292381Y-154789142D01* +X76340000Y-154646285D01* +X76387619Y-154598666D01* +X76292381Y-154265333D02* +X76292381Y-153598666D01* +X77292381Y-154027238D01* +X80240143Y-143625866D02* +X80287762Y-143673485D01* +X80335381Y-143816342D01* +X80335381Y-143911580D01* +X80287762Y-144054438D01* +X80192524Y-144149676D01* +X80097286Y-144197295D01* +X79906810Y-144244914D01* +X79763952Y-144244914D01* +X79573476Y-144197295D01* +X79478238Y-144149676D01* +X79383000Y-144054438D01* +X79335381Y-143911580D01* +X79335381Y-143816342D01* +X79383000Y-143673485D01* +X79430619Y-143625866D01* +X79763952Y-143054438D02* +X79716333Y-143149676D01* +X79668714Y-143197295D01* +X79573476Y-143244914D01* +X79525857Y-143244914D01* +X79430619Y-143197295D01* +X79383000Y-143149676D01* +X79335381Y-143054438D01* +X79335381Y-142863961D01* +X79383000Y-142768723D01* +X79430619Y-142721104D01* +X79525857Y-142673485D01* +X79573476Y-142673485D01* +X79668714Y-142721104D01* +X79716333Y-142768723D01* +X79763952Y-142863961D01* +X79763952Y-143054438D01* +X79811571Y-143149676D01* +X79859190Y-143197295D01* +X79954429Y-143244914D01* +X80144905Y-143244914D01* +X80240143Y-143197295D01* +X80287762Y-143149676D01* +X80335381Y-143054438D01* +X80335381Y-142863961D01* +X80287762Y-142768723D01* +X80240143Y-142721104D01* +X80144905Y-142673485D01* +X79954429Y-142673485D01* +X79859190Y-142721104D01* +X79811571Y-142768723D01* +X79763952Y-142863961D01* +X98147143Y-139104666D02* +X98194762Y-139152285D01* +X98242381Y-139295142D01* +X98242381Y-139390380D01* +X98194762Y-139533238D01* +X98099524Y-139628476D01* +X98004286Y-139676095D01* +X97813810Y-139723714D01* +X97670952Y-139723714D01* +X97480476Y-139676095D01* +X97385238Y-139628476D01* +X97290000Y-139533238D01* +X97242381Y-139390380D01* +X97242381Y-139295142D01* +X97290000Y-139152285D01* +X97337619Y-139104666D01* +X98242381Y-138628476D02* +X98242381Y-138438000D01* +X98194762Y-138342761D01* +X98147143Y-138295142D01* +X98004286Y-138199904D01* +X97813810Y-138152285D01* +X97432857Y-138152285D01* +X97337619Y-138199904D01* +X97290000Y-138247523D01* +X97242381Y-138342761D01* +X97242381Y-138533238D01* +X97290000Y-138628476D01* +X97337619Y-138676095D01* +X97432857Y-138723714D01* +X97670952Y-138723714D01* +X97766190Y-138676095D01* +X97813810Y-138628476D01* +X97861429Y-138533238D01* +X97861429Y-138342761D01* +X97813810Y-138247523D01* +X97766190Y-138199904D01* +X97670952Y-138152285D01* +X96877143Y-153754057D02* +X96924762Y-153801676D01* +X96972381Y-153944533D01* +X96972381Y-154039771D01* +X96924762Y-154182629D01* +X96829524Y-154277867D01* +X96734286Y-154325486D01* +X96543810Y-154373105D01* +X96400952Y-154373105D01* +X96210476Y-154325486D01* +X96115238Y-154277867D01* +X96020000Y-154182629D01* +X95972381Y-154039771D01* +X95972381Y-153944533D01* +X96020000Y-153801676D01* +X96067619Y-153754057D01* +X96972381Y-152801676D02* +X96972381Y-153373105D01* +X96972381Y-153087391D02* +X95972381Y-153087391D01* +X96115238Y-153182629D01* +X96210476Y-153277867D01* +X96258095Y-153373105D01* +X95972381Y-152182629D02* +X95972381Y-152087390D01* +X96020000Y-151992152D01* +X96067619Y-151944533D01* +X96162857Y-151896914D01* +X96353333Y-151849295D01* +X96591429Y-151849295D01* +X96781905Y-151896914D01* +X96877143Y-151944533D01* +X96924762Y-151992152D01* +X96972381Y-152087390D01* +X96972381Y-152182629D01* +X96924762Y-152277867D01* +X96877143Y-152325486D01* +X96781905Y-152373105D01* +X96591429Y-152420724D01* +X96353333Y-152420724D01* +X96162857Y-152373105D01* +X96067619Y-152325486D01* +X96020000Y-152277867D01* +X95972381Y-152182629D01* +X92829143Y-145721343D02* +X92781524Y-145768962D01* +X92638667Y-145816581D01* +X92543429Y-145816581D01* +X92400571Y-145768962D01* +X92305333Y-145673724D01* +X92257714Y-145578486D01* +X92210095Y-145388010D01* +X92210095Y-145245152D01* +X92257714Y-145054676D01* +X92305333Y-144959438D01* +X92400571Y-144864200D01* +X92543429Y-144816581D01* +X92638667Y-144816581D01* +X92781524Y-144864200D01* +X92829143Y-144911819D01* +X93781524Y-145816581D02* +X93210095Y-145816581D01* +X93495809Y-145816581D02* +X93495809Y-144816581D01* +X93400571Y-144959438D01* +X93305333Y-145054676D01* +X93210095Y-145102295D01* +X94733905Y-145816581D02* +X94162476Y-145816581D01* +X94448190Y-145816581D02* +X94448190Y-144816581D01* +X94352952Y-144959438D01* +X94257714Y-145054676D01* +X94162476Y-145102295D01* +X88663543Y-145594343D02* +X88615924Y-145641962D01* +X88473067Y-145689581D01* +X88377829Y-145689581D01* +X88234971Y-145641962D01* +X88139733Y-145546724D01* +X88092114Y-145451486D01* +X88044495Y-145261010D01* +X88044495Y-145118152D01* +X88092114Y-144927676D01* +X88139733Y-144832438D01* +X88234971Y-144737200D01* +X88377829Y-144689581D01* +X88473067Y-144689581D01* +X88615924Y-144737200D01* +X88663543Y-144784819D01* +X89615924Y-145689581D02* +X89044495Y-145689581D01* +X89330209Y-145689581D02* +X89330209Y-144689581D01* +X89234971Y-144832438D01* +X89139733Y-144927676D01* +X89044495Y-144975295D01* +X89996876Y-144784819D02* +X90044495Y-144737200D01* +X90139733Y-144689581D01* +X90377829Y-144689581D01* +X90473067Y-144737200D01* +X90520686Y-144784819D01* +X90568305Y-144880057D01* +X90568305Y-144975295D01* +X90520686Y-145118152D01* +X89949257Y-145689581D01* +X90568305Y-145689581D01* +X116684143Y-153169857D02* +X116731762Y-153217476D01* +X116779381Y-153360333D01* +X116779381Y-153455571D01* +X116731762Y-153598429D01* +X116636524Y-153693667D01* +X116541286Y-153741286D01* +X116350810Y-153788905D01* +X116207952Y-153788905D01* +X116017476Y-153741286D01* +X115922238Y-153693667D01* +X115827000Y-153598429D01* +X115779381Y-153455571D01* +X115779381Y-153360333D01* +X115827000Y-153217476D01* +X115874619Y-153169857D01* +X116779381Y-152217476D02* +X116779381Y-152788905D01* +X116779381Y-152503191D02* +X115779381Y-152503191D01* +X115922238Y-152598429D01* +X116017476Y-152693667D01* +X116065095Y-152788905D01* +X115779381Y-151884143D02* +X115779381Y-151265095D01* +X116160333Y-151598429D01* +X116160333Y-151455571D01* +X116207952Y-151360333D01* +X116255571Y-151312714D01* +X116350810Y-151265095D01* +X116588905Y-151265095D01* +X116684143Y-151312714D01* +X116731762Y-151360333D01* +X116779381Y-151455571D01* +X116779381Y-151741286D01* +X116731762Y-151836524D01* +X116684143Y-151884143D01* +X84828143Y-146508743D02* +X84780524Y-146556362D01* +X84637667Y-146603981D01* +X84542429Y-146603981D01* +X84399571Y-146556362D01* +X84304333Y-146461124D01* +X84256714Y-146365886D01* +X84209095Y-146175410D01* +X84209095Y-146032552D01* +X84256714Y-145842076D01* +X84304333Y-145746838D01* +X84399571Y-145651600D01* +X84542429Y-145603981D01* +X84637667Y-145603981D01* +X84780524Y-145651600D01* +X84828143Y-145699219D01* +X85780524Y-146603981D02* +X85209095Y-146603981D01* +X85494809Y-146603981D02* +X85494809Y-145603981D01* +X85399571Y-145746838D01* +X85304333Y-145842076D01* +X85209095Y-145889695D01* +X86637667Y-145937314D02* +X86637667Y-146603981D01* +X86399571Y-145556362D02* +X86161476Y-146270648D01* +X86780524Y-146270648D01* +X117832143Y-144406857D02* +X117879762Y-144454476D01* +X117927381Y-144597333D01* +X117927381Y-144692571D01* +X117879762Y-144835429D01* +X117784524Y-144930667D01* +X117689286Y-144978286D01* +X117498810Y-145025905D01* +X117355952Y-145025905D01* +X117165476Y-144978286D01* +X117070238Y-144930667D01* +X116975000Y-144835429D01* +X116927381Y-144692571D01* +X116927381Y-144597333D01* +X116975000Y-144454476D01* +X117022619Y-144406857D01* +X117927381Y-143454476D02* +X117927381Y-144025905D01* +X117927381Y-143740191D02* +X116927381Y-143740191D01* +X117070238Y-143835429D01* +X117165476Y-143930667D01* +X117213095Y-144025905D01* +X116927381Y-142549714D02* +X116927381Y-143025905D01* +X117403571Y-143073524D01* +X117355952Y-143025905D01* +X117308333Y-142930667D01* +X117308333Y-142692571D01* +X117355952Y-142597333D01* +X117403571Y-142549714D01* +X117498810Y-142502095D01* +X117736905Y-142502095D01* +X117832143Y-142549714D01* +X117879762Y-142597333D01* +X117927381Y-142692571D01* +X117927381Y-142930667D01* +X117879762Y-143025905D01* +X117832143Y-143073524D01* +X86256905Y-138501381D02* +X86256905Y-137501381D01* +X86495000Y-137501381D01* +X86637858Y-137549000D01* +X86733096Y-137644238D01* +X86780715Y-137739476D01* +X86828334Y-137929952D01* +X86828334Y-138072810D01* +X86780715Y-138263286D01* +X86733096Y-138358524D01* +X86637858Y-138453762D01* +X86495000Y-138501381D01* +X86256905Y-138501381D01* +X87780715Y-138501381D02* +X87209286Y-138501381D01* +X87495000Y-138501381D02* +X87495000Y-137501381D01* +X87399762Y-137644238D01* +X87304524Y-137739476D01* +X87209286Y-137787095D01* +X105457667Y-144341571D02* +X105124333Y-144341571D01* +X105124333Y-144865381D02* +X105124333Y-143865381D01* +X105600524Y-143865381D01* +X106505286Y-144865381D02* +X105933857Y-144865381D01* +X106219571Y-144865381D02* +X106219571Y-143865381D01* +X106124333Y-144008238D01* +X106029095Y-144103476D01* +X105933857Y-144151095D01* +X104738610Y-154579581D02* +X104738610Y-153579581D01* +X105786229Y-154484343D02* +X105738610Y-154531962D01* +X105595753Y-154579581D01* +X105500515Y-154579581D01* +X105357657Y-154531962D01* +X105262419Y-154436724D01* +X105214800Y-154341486D01* +X105167181Y-154151010D01* +X105167181Y-154008152D01* +X105214800Y-153817676D01* +X105262419Y-153722438D01* +X105357657Y-153627200D01* +X105500515Y-153579581D01* +X105595753Y-153579581D01* +X105738610Y-153627200D01* +X105786229Y-153674819D01* +X106738610Y-154579581D02* +X106167181Y-154579581D01* +X106452895Y-154579581D02* +X106452895Y-153579581D01* +X106357657Y-153722438D01* +X106262419Y-153817676D01* +X106167181Y-153865295D01* +X87717334Y-135707381D02* +X87241143Y-135707381D01* +X87241143Y-134707381D01* +X88574477Y-135707381D02* +X88003048Y-135707381D01* +X88288762Y-135707381D02* +X88288762Y-134707381D01* +X88193524Y-134850238D01* +X88098286Y-134945476D01* +X88003048Y-134993095D01* +X97480381Y-160504095D02* +X96480381Y-160504095D01* +X96480381Y-160123142D01* +X96528000Y-160027904D01* +X96575619Y-159980285D01* +X96670857Y-159932666D01* +X96813714Y-159932666D01* +X96908952Y-159980285D01* +X96956571Y-160027904D01* +X97004190Y-160123142D01* +X97004190Y-160504095D01* +X97480381Y-158980285D02* +X97480381Y-159551714D01* +X97480381Y-159266000D02* +X96480381Y-159266000D01* +X96623238Y-159361238D01* +X96718476Y-159456476D01* +X96766095Y-159551714D01* +X113815905Y-137358381D02* +X113815905Y-136358381D01* +X114196858Y-136358381D01* +X114292096Y-136406000D01* +X114339715Y-136453619D01* +X114387334Y-136548857D01* +X114387334Y-136691714D01* +X114339715Y-136786952D01* +X114292096Y-136834571D01* +X114196858Y-136882190D01* +X113815905Y-136882190D01* +X114768286Y-136453619D02* +X114815905Y-136406000D01* +X114911143Y-136358381D01* +X115149239Y-136358381D01* +X115244477Y-136406000D01* +X115292096Y-136453619D01* +X115339715Y-136548857D01* +X115339715Y-136644095D01* +X115292096Y-136786952D01* +X114720667Y-137358381D01* +X115339715Y-137358381D01* +X78531981Y-150115495D02* +X77531981Y-150115495D01* +X77531981Y-149734542D01* +X77579600Y-149639304D01* +X77627219Y-149591685D01* +X77722457Y-149544066D01* +X77865314Y-149544066D01* +X77960552Y-149591685D01* +X78008171Y-149639304D01* +X78055790Y-149734542D01* +X78055790Y-150115495D01* +X77531981Y-149210733D02* +X77531981Y-148591685D01* +X77912933Y-148925019D01* +X77912933Y-148782161D01* +X77960552Y-148686923D01* +X78008171Y-148639304D01* +X78103410Y-148591685D01* +X78341505Y-148591685D01* +X78436743Y-148639304D01* +X78484362Y-148686923D01* +X78531981Y-148782161D01* +X78531981Y-149067876D01* +X78484362Y-149163114D01* +X78436743Y-149210733D01* +X103449381Y-135993095D02* +X102449381Y-135993095D01* +X102449381Y-135612142D01* +X102497000Y-135516904D01* +X102544619Y-135469285D01* +X102639857Y-135421666D01* +X102782714Y-135421666D01* +X102877952Y-135469285D01* +X102925571Y-135516904D01* +X102973190Y-135612142D01* +X102973190Y-135993095D01* +X102782714Y-134564523D02* +X103449381Y-134564523D01* +X102401762Y-134802619D02* +X103116048Y-135040714D01* +X103116048Y-134421666D01* +X102687381Y-140057095D02* +X101687381Y-140057095D01* +X101687381Y-139676142D01* +X101735000Y-139580904D01* +X101782619Y-139533285D01* +X101877857Y-139485666D01* +X102020714Y-139485666D01* +X102115952Y-139533285D01* +X102163571Y-139580904D01* +X102211190Y-139676142D01* +X102211190Y-140057095D01* +X101687381Y-138580904D02* +X101687381Y-139057095D01* +X102163571Y-139104714D01* +X102115952Y-139057095D01* +X102068333Y-138961857D01* +X102068333Y-138723761D01* +X102115952Y-138628523D01* +X102163571Y-138580904D01* +X102258810Y-138533285D01* +X102496905Y-138533285D01* +X102592143Y-138580904D01* +X102639762Y-138628523D01* +X102687381Y-138723761D01* +X102687381Y-138961857D01* +X102639762Y-139057095D01* +X102592143Y-139104714D01* +X84529705Y-146680181D02* +X84529705Y-145680181D01* +X84910658Y-145680181D01* +X85005896Y-145727800D01* +X85053515Y-145775419D01* +X85101134Y-145870657D01* +X85101134Y-146013514D01* +X85053515Y-146108752D01* +X85005896Y-146156371D01* +X84910658Y-146203990D01* +X84529705Y-146203990D01* +X85958277Y-145680181D02* +X85767800Y-145680181D01* +X85672562Y-145727800D01* +X85624943Y-145775419D01* +X85529705Y-145918276D01* +X85482086Y-146108752D01* +X85482086Y-146489705D01* +X85529705Y-146584943D01* +X85577324Y-146632562D01* +X85672562Y-146680181D01* +X85863039Y-146680181D01* +X85958277Y-146632562D01* +X86005896Y-146584943D01* +X86053515Y-146489705D01* +X86053515Y-146251610D01* +X86005896Y-146156371D01* +X85958277Y-146108752D01* +X85863039Y-146061133D01* +X85672562Y-146061133D01* +X85577324Y-146108752D01* +X85529705Y-146156371D01* +X85482086Y-146251610D01* +X87882505Y-140838181D02* +X87882505Y-139838181D01* +X88263458Y-139838181D01* +X88358696Y-139885800D01* +X88406315Y-139933419D01* +X88453934Y-140028657D01* +X88453934Y-140171514D01* +X88406315Y-140266752D01* +X88358696Y-140314371D01* +X88263458Y-140361990D01* +X87882505Y-140361990D01* +X88787267Y-139838181D02* +X89453934Y-139838181D01* +X89025362Y-140838181D01* +X116355905Y-155595581D02* +X116355905Y-154595581D01* +X116736858Y-154595581D01* +X116832096Y-154643200D01* +X116879715Y-154690819D01* +X116927334Y-154786057D01* +X116927334Y-154928914D01* +X116879715Y-155024152D01* +X116832096Y-155071771D01* +X116736858Y-155119390D01* +X116355905Y-155119390D01* +X117498762Y-155024152D02* +X117403524Y-154976533D01* +X117355905Y-154928914D01* +X117308286Y-154833676D01* +X117308286Y-154786057D01* +X117355905Y-154690819D01* +X117403524Y-154643200D01* +X117498762Y-154595581D01* +X117689239Y-154595581D01* +X117784477Y-154643200D01* +X117832096Y-154690819D01* +X117879715Y-154786057D01* +X117879715Y-154833676D01* +X117832096Y-154928914D01* +X117784477Y-154976533D01* +X117689239Y-155024152D01* +X117498762Y-155024152D01* +X117403524Y-155071771D01* +X117355905Y-155119390D01* +X117308286Y-155214629D01* +X117308286Y-155405105D01* +X117355905Y-155500343D01* +X117403524Y-155547962D01* +X117498762Y-155595581D01* +X117689239Y-155595581D01* +X117784477Y-155547962D01* +X117832096Y-155500343D01* +X117879715Y-155405105D01* +X117879715Y-155214629D01* +X117832096Y-155119390D01* +X117784477Y-155071771D01* +X117689239Y-155024152D01* +X95789762Y-140969619D02* +X95694524Y-140922000D01* +X95599286Y-140826762D01* +X95456429Y-140683905D01* +X95361190Y-140636286D01* +X95265952Y-140636286D01* +X95313571Y-140874381D02* +X95218333Y-140826762D01* +X95123095Y-140731524D01* +X95075476Y-140541048D01* +X95075476Y-140207714D01* +X95123095Y-140017238D01* +X95218333Y-139922000D01* +X95313571Y-139874381D01* +X95504048Y-139874381D01* +X95599286Y-139922000D01* +X95694524Y-140017238D01* +X95742143Y-140207714D01* +X95742143Y-140541048D01* +X95694524Y-140731524D01* +X95599286Y-140826762D01* +X95504048Y-140874381D01* +X95313571Y-140874381D01* +X96694524Y-140874381D02* +X96123095Y-140874381D01* +X96408809Y-140874381D02* +X96408809Y-139874381D01* +X96313571Y-140017238D01* +X96218333Y-140112476D01* +X96123095Y-140160095D01* +X85355134Y-146578581D02* +X85021800Y-146102390D01* +X84783705Y-146578581D02* +X84783705Y-145578581D01* +X85164658Y-145578581D01* +X85259896Y-145626200D01* +X85307515Y-145673819D01* +X85355134Y-145769057D01* +X85355134Y-145911914D01* +X85307515Y-146007152D01* +X85259896Y-146054771D01* +X85164658Y-146102390D01* +X84783705Y-146102390D01* +X86307515Y-146578581D02* +X85736086Y-146578581D01* +X86021800Y-146578581D02* +X86021800Y-145578581D01* +X85926562Y-145721438D01* +X85831324Y-145816676D01* +X85736086Y-145864295D01* +X85553254Y-146410941D02* +X85219920Y-145934750D01* +X84981825Y-146410941D02* +X84981825Y-145410941D01* +X85362778Y-145410941D01* +X85458016Y-145458560D01* +X85505635Y-145506179D01* +X85553254Y-145601417D01* +X85553254Y-145744274D01* +X85505635Y-145839512D01* +X85458016Y-145887131D01* +X85362778Y-145934750D01* +X84981825Y-145934750D01* +X85934206Y-145506179D02* +X85981825Y-145458560D01* +X86077063Y-145410941D01* +X86315159Y-145410941D01* +X86410397Y-145458560D01* +X86458016Y-145506179D01* +X86505635Y-145601417D01* +X86505635Y-145696655D01* +X86458016Y-145839512D01* +X85886587Y-146410941D01* +X86505635Y-146410941D01* +X85240834Y-146946881D02* +X84907500Y-146470690D01* +X84669405Y-146946881D02* +X84669405Y-145946881D01* +X85050358Y-145946881D01* +X85145596Y-145994500D01* +X85193215Y-146042119D01* +X85240834Y-146137357D01* +X85240834Y-146280214D01* +X85193215Y-146375452D01* +X85145596Y-146423071D01* +X85050358Y-146470690D01* +X84669405Y-146470690D01* +X85574167Y-145946881D02* +X86193215Y-145946881D01* +X85859881Y-146327833D01* +X86002739Y-146327833D01* +X86097977Y-146375452D01* +X86145596Y-146423071D01* +X86193215Y-146518310D01* +X86193215Y-146756405D01* +X86145596Y-146851643D01* +X86097977Y-146899262D01* +X86002739Y-146946881D01* +X85717024Y-146946881D01* +X85621786Y-146899262D01* +X85574167Y-146851643D01* +X85736134Y-146756381D02* +X85402800Y-146280190D01* +X85164705Y-146756381D02* +X85164705Y-145756381D01* +X85545658Y-145756381D01* +X85640896Y-145804000D01* +X85688515Y-145851619D01* +X85736134Y-145946857D01* +X85736134Y-146089714D01* +X85688515Y-146184952D01* +X85640896Y-146232571D01* +X85545658Y-146280190D01* +X85164705Y-146280190D01* +X86593277Y-146089714D02* +X86593277Y-146756381D01* +X86355181Y-145708762D02* +X86117086Y-146423048D01* +X86736134Y-146423048D01* +X85357674Y-146969741D02* +X85024340Y-146493550D01* +X84786245Y-146969741D02* +X84786245Y-145969741D01* +X85167198Y-145969741D01* +X85262436Y-146017360D01* +X85310055Y-146064979D01* +X85357674Y-146160217D01* +X85357674Y-146303074D01* +X85310055Y-146398312D01* +X85262436Y-146445931D01* +X85167198Y-146493550D01* +X84786245Y-146493550D01* +X86262436Y-145969741D02* +X85786245Y-145969741D01* +X85738626Y-146445931D01* +X85786245Y-146398312D01* +X85881483Y-146350693D01* +X86119579Y-146350693D01* +X86214817Y-146398312D01* +X86262436Y-146445931D01* +X86310055Y-146541170D01* +X86310055Y-146779265D01* +X86262436Y-146874503D01* +X86214817Y-146922122D01* +X86119579Y-146969741D01* +X85881483Y-146969741D01* +X85786245Y-146922122D01* +X85738626Y-146874503D01* +X85245914Y-146718281D02* +X84912580Y-146242090D01* +X84674485Y-146718281D02* +X84674485Y-145718281D01* +X85055438Y-145718281D01* +X85150676Y-145765900D01* +X85198295Y-145813519D01* +X85245914Y-145908757D01* +X85245914Y-146051614D01* +X85198295Y-146146852D01* +X85150676Y-146194471D01* +X85055438Y-146242090D01* +X84674485Y-146242090D01* +X86103057Y-145718281D02* +X85912580Y-145718281D01* +X85817342Y-145765900D01* +X85769723Y-145813519D01* +X85674485Y-145956376D01* +X85626866Y-146146852D01* +X85626866Y-146527805D01* +X85674485Y-146623043D01* +X85722104Y-146670662D01* +X85817342Y-146718281D01* +X86007819Y-146718281D01* +X86103057Y-146670662D01* +X86150676Y-146623043D01* +X86198295Y-146527805D01* +X86198295Y-146289710D01* +X86150676Y-146194471D01* +X86103057Y-146146852D01* +X86007819Y-146099233D01* +X85817342Y-146099233D01* +X85722104Y-146146852D01* +X85674485Y-146194471D01* +X85626866Y-146289710D01* +X85126534Y-146857981D02* +X84793200Y-146381790D01* +X84555105Y-146857981D02* +X84555105Y-145857981D01* +X84936058Y-145857981D01* +X85031296Y-145905600D01* +X85078915Y-145953219D01* +X85126534Y-146048457D01* +X85126534Y-146191314D01* +X85078915Y-146286552D01* +X85031296Y-146334171D01* +X84936058Y-146381790D01* +X84555105Y-146381790D01* +X85459867Y-145857981D02* +X86126534Y-145857981D01* +X85697962Y-146857981D01* +X85024934Y-146680181D02* +X84691600Y-146203990D01* +X84453505Y-146680181D02* +X84453505Y-145680181D01* +X84834458Y-145680181D01* +X84929696Y-145727800D01* +X84977315Y-145775419D01* +X85024934Y-145870657D01* +X85024934Y-146013514D01* +X84977315Y-146108752D01* +X84929696Y-146156371D01* +X84834458Y-146203990D01* +X84453505Y-146203990D01* +X85596362Y-146108752D02* +X85501124Y-146061133D01* +X85453505Y-146013514D01* +X85405886Y-145918276D01* +X85405886Y-145870657D01* +X85453505Y-145775419D01* +X85501124Y-145727800D01* +X85596362Y-145680181D01* +X85786839Y-145680181D01* +X85882077Y-145727800D01* +X85929696Y-145775419D01* +X85977315Y-145870657D01* +X85977315Y-145918276D01* +X85929696Y-146013514D01* +X85882077Y-146061133D01* +X85786839Y-146108752D01* +X85596362Y-146108752D01* +X85501124Y-146156371D01* +X85453505Y-146203990D01* +X85405886Y-146299229D01* +X85405886Y-146489705D01* +X85453505Y-146584943D01* +X85501124Y-146632562D01* +X85596362Y-146680181D01* +X85786839Y-146680181D01* +X85882077Y-146632562D01* +X85929696Y-146584943D01* +X85977315Y-146489705D01* +X85977315Y-146299229D01* +X85929696Y-146203990D01* +X85882077Y-146156371D01* +X85786839Y-146108752D01* +X84948734Y-146502381D02* +X84615400Y-146026190D01* +X84377305Y-146502381D02* +X84377305Y-145502381D01* +X84758258Y-145502381D01* +X84853496Y-145550000D01* +X84901115Y-145597619D01* +X84948734Y-145692857D01* +X84948734Y-145835714D01* +X84901115Y-145930952D01* +X84853496Y-145978571D01* +X84758258Y-146026190D01* +X84377305Y-146026190D01* +X85424924Y-146502381D02* +X85615400Y-146502381D01* +X85710639Y-146454762D01* +X85758258Y-146407143D01* +X85853496Y-146264286D01* +X85901115Y-146073810D01* +X85901115Y-145692857D01* +X85853496Y-145597619D01* +X85805877Y-145550000D01* +X85710639Y-145502381D01* +X85520162Y-145502381D01* +X85424924Y-145550000D01* +X85377305Y-145597619D01* +X85329686Y-145692857D01* +X85329686Y-145930952D01* +X85377305Y-146026190D01* +X85424924Y-146073810D01* +X85520162Y-146121429D01* +X85710639Y-146121429D01* +X85805877Y-146073810D01* +X85853496Y-146026190D01* +X85901115Y-145930952D01* +X84447143Y-146603981D02* +X84113809Y-146127790D01* +X83875714Y-146603981D02* +X83875714Y-145603981D01* +X84256667Y-145603981D01* +X84351905Y-145651600D01* +X84399524Y-145699219D01* +X84447143Y-145794457D01* +X84447143Y-145937314D01* +X84399524Y-146032552D01* +X84351905Y-146080171D01* +X84256667Y-146127790D01* +X83875714Y-146127790D01* +X85399524Y-146603981D02* +X84828095Y-146603981D01* +X85113809Y-146603981D02* +X85113809Y-145603981D01* +X85018571Y-145746838D01* +X84923333Y-145842076D01* +X84828095Y-145889695D01* +X86018571Y-145603981D02* +X86113810Y-145603981D01* +X86209048Y-145651600D01* +X86256667Y-145699219D01* +X86304286Y-145794457D01* +X86351905Y-145984933D01* +X86351905Y-146223029D01* +X86304286Y-146413505D01* +X86256667Y-146508743D01* +X86209048Y-146556362D01* +X86113810Y-146603981D01* +X86018571Y-146603981D01* +X85923333Y-146556362D01* +X85875714Y-146508743D01* +X85828095Y-146413505D01* +X85780476Y-146223029D01* +X85780476Y-145984933D01* +X85828095Y-145794457D01* +X85875714Y-145699219D01* +X85923333Y-145651600D01* +X86018571Y-145603981D01* +X84650343Y-146578581D02* +X84317009Y-146102390D01* +X84078914Y-146578581D02* +X84078914Y-145578581D01* +X84459867Y-145578581D01* +X84555105Y-145626200D01* +X84602724Y-145673819D01* +X84650343Y-145769057D01* +X84650343Y-145911914D01* +X84602724Y-146007152D01* +X84555105Y-146054771D01* +X84459867Y-146102390D01* +X84078914Y-146102390D01* +X85602724Y-146578581D02* +X85031295Y-146578581D01* +X85317009Y-146578581D02* +X85317009Y-145578581D01* +X85221771Y-145721438D01* +X85126533Y-145816676D01* +X85031295Y-145864295D01* +X86555105Y-146578581D02* +X85983676Y-146578581D01* +X86269390Y-146578581D02* +X86269390Y-145578581D01* +X86174152Y-145721438D01* +X86078914Y-145816676D01* +X85983676Y-145864295D01* +X84726543Y-146527781D02* +X84393209Y-146051590D01* +X84155114Y-146527781D02* +X84155114Y-145527781D01* +X84536067Y-145527781D01* +X84631305Y-145575400D01* +X84678924Y-145623019D01* +X84726543Y-145718257D01* +X84726543Y-145861114D01* +X84678924Y-145956352D01* +X84631305Y-146003971D01* +X84536067Y-146051590D01* +X84155114Y-146051590D01* +X85678924Y-146527781D02* +X85107495Y-146527781D01* +X85393209Y-146527781D02* +X85393209Y-145527781D01* +X85297971Y-145670638D01* +X85202733Y-145765876D01* +X85107495Y-145813495D01* +X86059876Y-145623019D02* +X86107495Y-145575400D01* +X86202733Y-145527781D01* +X86440829Y-145527781D01* +X86536067Y-145575400D01* +X86583686Y-145623019D01* +X86631305Y-145718257D01* +X86631305Y-145813495D01* +X86583686Y-145956352D01* +X86012257Y-146527781D01* +X86631305Y-146527781D01* +X84878943Y-146680181D02* +X84545609Y-146203990D01* +X84307514Y-146680181D02* +X84307514Y-145680181D01* +X84688467Y-145680181D01* +X84783705Y-145727800D01* +X84831324Y-145775419D01* +X84878943Y-145870657D01* +X84878943Y-146013514D01* +X84831324Y-146108752D01* +X84783705Y-146156371D01* +X84688467Y-146203990D01* +X84307514Y-146203990D01* +X85831324Y-146680181D02* +X85259895Y-146680181D01* +X85545609Y-146680181D02* +X85545609Y-145680181D01* +X85450371Y-145823038D01* +X85355133Y-145918276D01* +X85259895Y-145965895D01* +X86164657Y-145680181D02* +X86783705Y-145680181D01* +X86450371Y-146061133D01* +X86593229Y-146061133D01* +X86688467Y-146108752D01* +X86736086Y-146156371D01* +X86783705Y-146251610D01* +X86783705Y-146489705D01* +X86736086Y-146584943D01* +X86688467Y-146632562D01* +X86593229Y-146680181D01* +X86307514Y-146680181D01* +X86212276Y-146632562D01* +X86164657Y-146584943D01* +X84701143Y-146629381D02* +X84367809Y-146153190D01* +X84129714Y-146629381D02* +X84129714Y-145629381D01* +X84510667Y-145629381D01* +X84605905Y-145677000D01* +X84653524Y-145724619D01* +X84701143Y-145819857D01* +X84701143Y-145962714D01* +X84653524Y-146057952D01* +X84605905Y-146105571D01* +X84510667Y-146153190D01* +X84129714Y-146153190D01* +X85653524Y-146629381D02* +X85082095Y-146629381D01* +X85367809Y-146629381D02* +X85367809Y-145629381D01* +X85272571Y-145772238D01* +X85177333Y-145867476D01* +X85082095Y-145915095D01* +X86510667Y-145962714D02* +X86510667Y-146629381D01* +X86272571Y-145581762D02* +X86034476Y-146296048D01* +X86653524Y-146296048D01* +X82743381Y-154947857D02* +X82267190Y-155281191D01* +X82743381Y-155519286D02* +X81743381Y-155519286D01* +X81743381Y-155138333D01* +X81791000Y-155043095D01* +X81838619Y-154995476D01* +X81933857Y-154947857D01* +X82076714Y-154947857D01* +X82171952Y-154995476D01* +X82219571Y-155043095D01* +X82267190Y-155138333D01* +X82267190Y-155519286D01* +X82743381Y-153995476D02* +X82743381Y-154566905D01* +X82743381Y-154281191D02* +X81743381Y-154281191D01* +X81886238Y-154376429D01* +X81981476Y-154471667D01* +X82029095Y-154566905D01* +X81743381Y-153090714D02* +X81743381Y-153566905D01* +X82219571Y-153614524D01* +X82171952Y-153566905D01* +X82124333Y-153471667D01* +X82124333Y-153233571D01* +X82171952Y-153138333D01* +X82219571Y-153090714D01* +X82314810Y-153043095D01* +X82552905Y-153043095D01* +X82648143Y-153090714D01* +X82695762Y-153138333D01* +X82743381Y-153233571D01* +X82743381Y-153471667D01* +X82695762Y-153566905D01* +X82648143Y-153614524D01* +X78833743Y-151277581D02* +X78500409Y-150801390D01* +X78262314Y-151277581D02* +X78262314Y-150277581D01* +X78643267Y-150277581D01* +X78738505Y-150325200D01* +X78786124Y-150372819D01* +X78833743Y-150468057D01* +X78833743Y-150610914D01* +X78786124Y-150706152D01* +X78738505Y-150753771D01* +X78643267Y-150801390D01* +X78262314Y-150801390D01* +X79786124Y-151277581D02* +X79214695Y-151277581D01* +X79500409Y-151277581D02* +X79500409Y-150277581D01* +X79405171Y-150420438D01* +X79309933Y-150515676D01* +X79214695Y-150563295D01* +X80643267Y-150277581D02* +X80452790Y-150277581D01* +X80357552Y-150325200D01* +X80309933Y-150372819D01* +X80214695Y-150515676D01* +X80167076Y-150706152D01* +X80167076Y-151087105D01* +X80214695Y-151182343D01* +X80262314Y-151229962D01* +X80357552Y-151277581D01* +X80548029Y-151277581D01* +X80643267Y-151229962D01* +X80690886Y-151182343D01* +X80738505Y-151087105D01* +X80738505Y-150849010D01* +X80690886Y-150753771D01* +X80643267Y-150706152D01* +X80548029Y-150658533D01* +X80357552Y-150658533D01* +X80262314Y-150706152D01* +X80214695Y-150753771D01* +X80167076Y-150849010D01* +X84599543Y-146807181D02* +X84266209Y-146330990D01* +X84028114Y-146807181D02* +X84028114Y-145807181D01* +X84409067Y-145807181D01* +X84504305Y-145854800D01* +X84551924Y-145902419D01* +X84599543Y-145997657D01* +X84599543Y-146140514D01* +X84551924Y-146235752D01* +X84504305Y-146283371D01* +X84409067Y-146330990D01* +X84028114Y-146330990D01* +X85551924Y-146807181D02* +X84980495Y-146807181D01* +X85266209Y-146807181D02* +X85266209Y-145807181D01* +X85170971Y-145950038D01* +X85075733Y-146045276D01* +X84980495Y-146092895D01* +X85885257Y-145807181D02* +X86551924Y-145807181D01* +X86123352Y-146807181D01* +X84701143Y-146644621D02* +X84367809Y-146168430D01* +X84129714Y-146644621D02* +X84129714Y-145644621D01* +X84510667Y-145644621D01* +X84605905Y-145692240D01* +X84653524Y-145739859D01* +X84701143Y-145835097D01* +X84701143Y-145977954D01* +X84653524Y-146073192D01* +X84605905Y-146120811D01* +X84510667Y-146168430D01* +X84129714Y-146168430D01* +X85653524Y-146644621D02* +X85082095Y-146644621D01* +X85367809Y-146644621D02* +X85367809Y-145644621D01* +X85272571Y-145787478D01* +X85177333Y-145882716D01* +X85082095Y-145930335D01* +X86224952Y-146073192D02* +X86129714Y-146025573D01* +X86082095Y-145977954D01* +X86034476Y-145882716D01* +X86034476Y-145835097D01* +X86082095Y-145739859D01* +X86129714Y-145692240D01* +X86224952Y-145644621D01* +X86415429Y-145644621D01* +X86510667Y-145692240D01* +X86558286Y-145739859D01* +X86605905Y-145835097D01* +X86605905Y-145882716D01* +X86558286Y-145977954D01* +X86510667Y-146025573D01* +X86415429Y-146073192D01* +X86224952Y-146073192D01* +X86129714Y-146120811D01* +X86082095Y-146168430D01* +X86034476Y-146263669D01* +X86034476Y-146454145D01* +X86082095Y-146549383D01* +X86129714Y-146597002D01* +X86224952Y-146644621D01* +X86415429Y-146644621D01* +X86510667Y-146597002D01* +X86558286Y-146549383D01* +X86605905Y-146454145D01* +X86605905Y-146263669D01* +X86558286Y-146168430D01* +X86510667Y-146120811D01* +X86415429Y-146073192D01* +X97705943Y-145943581D02* +X97372609Y-145467390D01* +X97134514Y-145943581D02* +X97134514Y-144943581D01* +X97515467Y-144943581D01* +X97610705Y-144991200D01* +X97658324Y-145038819D01* +X97705943Y-145134057D01* +X97705943Y-145276914D01* +X97658324Y-145372152D01* +X97610705Y-145419771D01* +X97515467Y-145467390D01* +X97134514Y-145467390D01* +X98658324Y-145943581D02* +X98086895Y-145943581D01* +X98372609Y-145943581D02* +X98372609Y-144943581D01* +X98277371Y-145086438D01* +X98182133Y-145181676D01* +X98086895Y-145229295D01* +X99134514Y-145943581D02* +X99324990Y-145943581D01* +X99420229Y-145895962D01* +X99467848Y-145848343D01* +X99563086Y-145705486D01* +X99610705Y-145515010D01* +X99610705Y-145134057D01* +X99563086Y-145038819D01* +X99515467Y-144991200D01* +X99420229Y-144943581D01* +X99229752Y-144943581D01* +X99134514Y-144991200D01* +X99086895Y-145038819D01* +X99039276Y-145134057D01* +X99039276Y-145372152D01* +X99086895Y-145467390D01* +X99134514Y-145515010D01* +X99229752Y-145562629D01* +X99420229Y-145562629D01* +X99515467Y-145515010D01* +X99563086Y-145467390D01* +X99610705Y-145372152D01* +X101363543Y-145994381D02* +X101030209Y-145518190D01* +X100792114Y-145994381D02* +X100792114Y-144994381D01* +X101173067Y-144994381D01* +X101268305Y-145042000D01* +X101315924Y-145089619D01* +X101363543Y-145184857D01* +X101363543Y-145327714D01* +X101315924Y-145422952D01* +X101268305Y-145470571D01* +X101173067Y-145518190D01* +X100792114Y-145518190D01* +X101744495Y-145089619D02* +X101792114Y-145042000D01* +X101887352Y-144994381D01* +X102125448Y-144994381D01* +X102220686Y-145042000D01* +X102268305Y-145089619D01* +X102315924Y-145184857D01* +X102315924Y-145280095D01* +X102268305Y-145422952D01* +X101696876Y-145994381D01* +X102315924Y-145994381D01* +X102934971Y-144994381D02* +X103030210Y-144994381D01* +X103125448Y-145042000D01* +X103173067Y-145089619D01* +X103220686Y-145184857D01* +X103268305Y-145375333D01* +X103268305Y-145613429D01* +X103220686Y-145803905D01* +X103173067Y-145899143D01* +X103125448Y-145946762D01* +X103030210Y-145994381D01* +X102934971Y-145994381D01* +X102839733Y-145946762D01* +X102792114Y-145899143D01* +X102744495Y-145803905D01* +X102696876Y-145613429D01* +X102696876Y-145375333D01* +X102744495Y-145184857D01* +X102792114Y-145089619D01* +X102839733Y-145042000D01* +X102934971Y-144994381D01* +X109321695Y-143876781D02* +X109321695Y-144686305D01* +X109369314Y-144781543D01* +X109416933Y-144829162D01* +X109512171Y-144876781D01* +X109702648Y-144876781D01* +X109797886Y-144829162D01* +X109845505Y-144781543D01* +X109893124Y-144686305D01* +X109893124Y-143876781D01* +X110893124Y-144876781D02* +X110321695Y-144876781D01* +X110607409Y-144876781D02* +X110607409Y-143876781D01* +X110512171Y-144019638D01* +X110416933Y-144114876D01* +X110321695Y-144162495D01* +X84008055Y-157648661D02* +X84008055Y-158458185D01* +X84055674Y-158553423D01* +X84103293Y-158601042D01* +X84198531Y-158648661D01* +X84389008Y-158648661D01* +X84484246Y-158601042D01* +X84531865Y-158553423D01* +X84579484Y-158458185D01* +X84579484Y-157648661D01* +X85008055Y-157743899D02* +X85055674Y-157696280D01* +X85150912Y-157648661D01* +X85389008Y-157648661D01* +X85484246Y-157696280D01* +X85531865Y-157743899D01* +X85579484Y-157839137D01* +X85579484Y-157934375D01* +X85531865Y-158077232D01* +X84960436Y-158648661D01* +X85579484Y-158648661D01* +X112928495Y-158659581D02* +X112928495Y-159469105D01* +X112976114Y-159564343D01* +X113023733Y-159611962D01* +X113118971Y-159659581D01* +X113309448Y-159659581D01* +X113404686Y-159611962D01* +X113452305Y-159564343D01* +X113499924Y-159469105D01* +X113499924Y-158659581D01* +X113880876Y-158659581D02* +X114499924Y-158659581D01* +X114166590Y-159040533D01* +X114309448Y-159040533D01* +X114404686Y-159088152D01* +X114452305Y-159135771D01* +X114499924Y-159231010D01* +X114499924Y-159469105D01* +X114452305Y-159564343D01* +X114404686Y-159611962D01* +X114309448Y-159659581D01* +X114023733Y-159659581D01* +X113928495Y-159611962D01* +X113880876Y-159564343D01* +M02* diff --git a/PCB/OUTPUT_V2/Tinylab_proto1.drl b/PCB/OUTPUT_V2/Tinylab_proto1.drl new file mode 100644 index 00000000..98655d26 --- /dev/null +++ b/PCB/OUTPUT_V2/Tinylab_proto1.drl @@ -0,0 +1,100 @@ +M48 +;DRILL file {KiCad (2015-08-05 BZR 6055, Git fa29c62)-product} date 24/12/2015 1:45:37 PM +;FORMAT={2:4/ absolute / inch / keep zeros} +FMAT,2 +INCH,TZ +T1C0.016 +T2C0.020 +T3C0.022 +T4C0.031 +T5C0.039 +T6C0.040 +T7C0.050 +% +G90 +G05 +M72 +T1 +X033000Y-061750 +X033600Y-053200 +X033700Y-061350 +X033950Y-062900 +X034550Y-059900 +X035200Y-054300 +X035750Y-056050 +X036050Y-060300 +X036050Y-062100 +X037800Y-055450 +X038300Y-061450 +X038450Y-062300 +X038750Y-054850 +X039100Y-063400 +X039300Y-058250 +X039350Y-056650 +X039750Y-055950 +X039900Y-062200 +X040550Y-055950 +X040750Y-059050 +X040850Y-056950 +X040850Y-057750 +X041350Y-056600 +X041450Y-059050 +X041750Y-055150 +X041750Y-056600 +X042350Y-055100 +X043750Y-055750 +X044350Y-060400 +X044350Y-061150 +X045150Y-053400 +X045450Y-055500 +T4 +X030116Y-053900 +X031100Y-053900 +X036750Y-055666 +X036750Y-056650 +X045700Y-056700 +X045700Y-057684 +T5 +X032500Y-053199 +X036400Y-054301 +T6 +X030000Y-056000 +X030000Y-057000 +X030000Y-058000 +X030000Y-059000 +X030000Y-060000 +X030000Y-061000 +X030000Y-062000 +X030000Y-063000 +X033000Y-055500 +X033000Y-056500 +X034000Y-055500 +X034000Y-056500 +X037200Y-059800 +X037200Y-060800 +X037200Y-061800 +X037200Y-062800 +X039500Y-053300 +X039500Y-054300 +X039500Y-055300 +X041400Y-053300 +X041400Y-054300 +X042400Y-053300 +X042400Y-054300 +X046000Y-062000 +X046000Y-063000 +T7 +X032400Y-054301 +X036500Y-053199 +T2 +X043722Y-053624G85X043722Y-053880 +G05 +X046478Y-053624G85X046478Y-053880 +G05 +T3 +X044175Y-054815G85X044057Y-054815 +G05 +X046144Y-054815G85X046026Y-054815 +G05 +T0 +M30 diff --git a/PCB/OUTPUT_V2/Tinylab_proto1.net b/PCB/OUTPUT_V2/Tinylab_proto1.net new file mode 100644 index 00000000..d0c1a6c7 --- /dev/null +++ b/PCB/OUTPUT_V2/Tinylab_proto1.net @@ -0,0 +1,935 @@ +(export (version D) + (design + (source C:\Users\Esposch\Documents\KiCAD\Tinylab_proto1\Tinylab_proto1.sch) + (date "01/02/2016 10:44:42 AM") + (tool "Eeschema (2015-08-05 BZR 6055, Git fa29c62)-product") + (sheet (number 1) (name /) (tstamps /) + (title_block + (title) + (company) + (rev) + (date) + (source Tinylab_proto1.sch) + (comment (number 1) (value "")) + (comment (number 2) (value "")) + (comment (number 3) (value "")) + (comment (number 4) (value ""))))) + (components + (comp (ref U2) + (value LM324) + (footprint Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm) + (libsource (lib linear) (part LM324)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CA87E2)) + (comp (ref IC1) + (value ATXMEGA16A4U-A) + (footprint Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm) + (libsource (lib atmel) (part ATXMEGA16A4U-A)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CA8F25)) + (comp (ref P2) + (value USB_OTG) + (footprint Connect:USB_Micro-B) + (libsource (lib conn) (part USB_OTG)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CA90D2)) + (comp (ref U1) + (value 78L05) + (footprint SMD:SOT-23-3) + (libsource (lib regul) (part 78L05)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CA99FA)) + (comp (ref R1) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAAB95)) + (comp (ref R3) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAABF4)) + (comp (ref R5) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAAC5F)) + (comp (ref R6) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAACD2)) + (comp (ref R4) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAAD11)) + (comp (ref R2) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAAD4C)) + (comp (ref P1) + (value SCOPE_IN) + (footprint Pin_Headers:Pin_Header_Straight_1x04) + (libsource (lib conn) (part CONN_01X04)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAB35C)) + (comp (ref C2) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAB4DE)) + (comp (ref C1) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAB611)) + (comp (ref C3) + (value C_Small) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB13E1)) + (comp (ref C4) + (value C_Small) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB147C)) + (comp (ref R22) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB4680)) + (comp (ref C13) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB630B)) + (comp (ref R24) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB9020)) + (comp (ref R11) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBCD2A)) + (comp (ref R7) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBCDA5)) + (comp (ref R13) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE0F4)) + (comp (ref R9) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE16B)) + (comp (ref R14) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE21C)) + (comp (ref R10) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE2C7)) + (comp (ref R12) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE362)) + (comp (ref R8) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE401)) + (comp (ref P3) + (value DIG_OUT) + (footprint Pin_Headers:Pin_Header_Straight_1x04) + (libsource (lib conn) (part CONN_01X04)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBF4D5)) + (comp (ref P7) + (value HVO) + (footprint Pin_Headers:Pin_Header_Straight_2x02) + (libsource (lib conn) (part CONN_02X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CC540F)) + (comp (ref C5) + (value C_Small) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D60181)) + (comp (ref U4) + (value DMN63D8LDW) + (footprint TO_SOT_Packages_SMD:SOT-363) + (libsource (lib ESPO_PART) (part DMN63D8LDW)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D6ACFD)) + (comp (ref P8) + (value DIG_IN) + (footprint Pin_Headers:Pin_Header_Straight_1x02) + (libsource (lib conn) (part CONN_01X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D6DB77)) + (comp (ref F1) + (value F_Small) + (footprint Capacitors_SMD:C_1206) + (libsource (lib device) (part F_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D739F3)) + (comp (ref C12) + (value C_Small) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D75F49)) + (comp (ref P5) + (value CONN_01X03) + (footprint Pin_Headers:Pin_Header_Straight_1x03) + (libsource (lib conn) (part CONN_01X03)) + (sheetpath (names /) (tstamps /)) + (tstamp 56065DA8)) + (comp (ref L1) + (value INDUCTOR) + (footprint Inductors:INDUCTOR_V) + (libsource (lib device) (part INDUCTOR)) + (sheetpath (names /) (tstamps /)) + (tstamp 5606EE9E)) + (comp (ref D1) + (value D_Schottky) + (footprint Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10) + (libsource (lib device) (part D_Schottky)) + (sheetpath (names /) (tstamps /)) + (tstamp 5606FDB4)) + (comp (ref C9) + (value CP1) + (footprint Capacitors_ThroughHole:C_Radial_D5_L11_P2.5) + (libsource (lib device) (part CP1)) + (sheetpath (names /) (tstamps /)) + (tstamp 560719D9)) + (comp (ref C10) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 56071A50)) + (comp (ref C16) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 5607355F)) + (comp (ref C15) + (value CP1) + (footprint Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5) + (libsource (lib device) (part CP1)) + (sheetpath (names /) (tstamps /)) + (tstamp 560735FE)) + (comp (ref P4) + (value PDI) + (footprint Pin_Headers:Pin_Header_Straight_2x02) + (libsource (lib conn) (part CONN_02X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 56069A87)) + (comp (ref Q1) + (value Q_NMOS_GSD) + (footprint SMD:SOT-23-3) + (libsource (lib device) (part Q_NMOS_GSD)) + (sheetpath (names /) (tstamps /)) + (tstamp 5606F6D4)) + (comp (ref C7) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 5609699F)) + (comp (ref R23) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 566DE721)) + (comp (ref R25) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 566DE7E8)) + (comp (ref C14) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 566DF655)) + (comp (ref P6) + (value DAC_OUT) + (footprint Pin_Headers:Pin_Header_Straight_1x04) + (libsource (lib conn) (part CONN_01X04)) + (sheetpath (names /) (tstamps /)) + (tstamp 566DF832)) + (comp (ref R26) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 566E5C29)) + (comp (ref R27) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 566E5CBE)) + (comp (ref C6) + (value CP1) + (footprint Capacitors_ThroughHole:C_Radial_D5_L11_P2.5) + (libsource (lib device) (part CP1)) + (sheetpath (names /) (tstamps /)) + (tstamp 566F5A75)) + (comp (ref R19) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AECD86)) + (comp (ref R21) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AF0DE2)) + (comp (ref C11) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 5608B4BE)) + (comp (ref C8) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AF91A3)) + (comp (ref R17) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AFE83E)) + (comp (ref R18) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AFE8F3)) + (comp (ref U3) + (value DMN63D8LDW) + (footprint TO_SOT_Packages_SMD:SOT-363) + (libsource (lib ESPO_PART) (part DMN63D8LDW)) + (sheetpath (names /) (tstamps /)) + (tstamp 56B012DD)) + (comp (ref R20) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56B0C682)) + (comp (ref R15) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56B0C779)) + (comp (ref R16) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56B0C86E))) + (libparts + (libpart (lib device) (part C) + (description "Unpolarized capacitor") + (footprints + (fp C?) + (fp C_????_*) + (fp C_????) + (fp SMD*_c) + (fp Capacitor*)) + (fields + (field (name Reference) C) + (field (name Value) C)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib device) (part CP1) + (description "Polarised capacitor") + (footprints + (fp SMD*_Pol) + (fp c_elec*) + (fp C*elec) + (fp TantalC*) + (fp Elko*) + (fp CP*)) + (fields + (field (name Reference) C) + (field (name Value) CP1)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib device) (part C_Small) + (description "Unpolarized capacitor") + (footprints + (fp C?) + (fp C_????_*) + (fp C_????) + (fp SMD*_c) + (fp Capacitor*)) + (fields + (field (name Reference) C) + (field (name Value) C_Small)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib device) (part D_Schottky) + (description "Diode schottky") + (footprints + (fp D-Pak_TO252AA) + (fp Diode_*) + (fp *SingleDiode) + (fp *SingleDiode*) + (fp *_Diode_*)) + (fields + (field (name Reference) D) + (field (name Value) D_Schottky)) + (pins + (pin (num 1) (name K) (type passive)) + (pin (num 2) (name A) (type passive)))) + (libpart (lib device) (part F_Small) + (description Fuse) + (footprints + (fp CP*) + (fp SM*)) + (fields + (field (name Reference) F) + (field (name Value) F_Small)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib device) (part INDUCTOR) + (fields + (field (name Reference) L) + (field (name Value) INDUCTOR)) + (pins + (pin (num 1) (name 1) (type passive)) + (pin (num 2) (name 2) (type passive)))) + (libpart (lib device) (part Q_NMOS_GSD) + (description "Transistor N-MOSFET (general)") + (fields + (field (name Reference) Q) + (field (name Value) Q_NMOS_GSD)) + (pins + (pin (num 1) (name G) (type input)) + (pin (num 2) (name S) (type passive)) + (pin (num 3) (name D) (type passive)))) + (libpart (lib device) (part R) + (description Resistor) + (footprints + (fp R_*) + (fp Resistor_*)) + (fields + (field (name Reference) R) + (field (name Value) R)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib conn) (part CONN_01X02) + (footprints + (fp Pin_Header_Straight_1X02) + (fp Pin_Header_Angled_1X02) + (fp Socket_Strip_Straight_1X02) + (fp Socket_Strip_Angled_1X02)) + (fields + (field (name Reference) P) + (field (name Value) CONN_01X02)) + (pins + (pin (num 1) (name P1) (type passive)) + (pin (num 2) (name P2) (type passive)))) + (libpart (lib conn) (part CONN_01X03) + (footprints + (fp Pin_Header_Straight_1X03) + (fp Pin_Header_Angled_1X03) + (fp Socket_Strip_Straight_1X03) + (fp Socket_Strip_Angled_1X03)) + (fields + (field (name Reference) P) + (field (name Value) CONN_01X03)) + (pins + (pin (num 1) (name P1) (type passive)) + (pin (num 2) (name P2) (type passive)) + (pin (num 3) (name P3) (type passive)))) + (libpart (lib conn) (part CONN_01X04) + (footprints + (fp Pin_Header_Straight_1X04) + (fp Pin_Header_Angled_1X04) + (fp Socket_Strip_Straight_1X04) + (fp Socket_Strip_Angled_1X04)) + (fields + (field (name Reference) P) + (field (name Value) CONN_01X04)) + (pins + (pin (num 1) (name P1) (type passive)) + (pin (num 2) (name P2) (type passive)) + (pin (num 3) (name P3) (type passive)) + (pin (num 4) (name P4) (type passive)))) + (libpart (lib conn) (part CONN_02X02) + (footprints + (fp Pin_Header_Straight_2X02) + (fp Pin_Header_Angled_2X02) + (fp Socket_Strip_Straight_2X02) + (fp Socket_Strip_Angled_2X02)) + (fields + (field (name Reference) P) + (field (name Value) CONN_02X02)) + (pins + (pin (num 1) (name P1) (type passive)) + (pin (num 2) (name P2) (type passive)) + (pin (num 3) (name P3) (type passive)) + (pin (num 4) (name P4) (type passive)))) + (libpart (lib conn) (part USB_OTG) + (description "micro/mini connector") + (footprints + (fp USB*)) + (fields + (field (name Reference) P) + (field (name Value) USB_OTG)) + (pins + (pin (num 1) (name VCC) (type power_out)) + (pin (num 2) (name D-) (type passive)) + (pin (num 3) (name D+) (type passive)) + (pin (num 4) (name ID) (type power_in)) + (pin (num 5) (name GND) (type power_in)) + (pin (num 6) (name shield) (type passive)))) + (libpart (lib linear) (part LM2902N) + (aliases + (alias LM324) + (alias TLC274) + (alias TL074) + (alias LM324N) + (alias LM324AN)) + (description "Quad Op amp.") + (docs op_amps/lm324.pdf) + (fields + (field (name Reference) U) + (field (name Value) LM2902N)) + (pins + (pin (num 1) (name ~) (type output)) + (pin (num 2) (name -) (type input)) + (pin (num 3) (name +) (type input)) + (pin (num 4) (name V+) (type power_in)) + (pin (num 5) (name +) (type input)) + (pin (num 6) (name -) (type input)) + (pin (num 7) (name ~) (type output)) + (pin (num 8) (name ~) (type output)) + (pin (num 9) (name -) (type input)) + (pin (num 10) (name +) (type input)) + (pin (num 11) (name V-) (type power_in)) + (pin (num 12) (name +) (type input)) + (pin (num 13) (name -) (type input)) + (pin (num 14) (name ~) (type output)))) + (libpart (lib regul) (part 7805) + (aliases + (alias LM7805) + (alias LM7812) + (alias 78L05)) + (description "Linear Regulator +5V") + (docs regulator\lm78xx.pdf) + (fields + (field (name Reference) U) + (field (name Value) 7805)) + (pins + (pin (num 1) (name GND) (type input)) + (pin (num 2) (name VO) (type power_out)) + (pin (num 3) (name VI) (type input)))) + (libpart (lib atmel) (part ATXMEGA16A4U-A) + (aliases + (alias ATXMEGA32A4U-A) + (alias ATXMEGA64A4U-A) + (alias ATXMEGA128A4U-A)) + (description "TQFP44, 16k Flash, 4k Boot, 2k SRAM, 1k EEPROM, JTAG, USB") + (docs http://www.atmel.com/Images/Atmel-8387-8-and16-bit-AVR-Microcontroller-XMEGA-A4U_Datasheet.pdf) + (fields + (field (name Reference) IC) + (field (name Value) ATXMEGA16A4U-A) + (field (name Footprint) TQFP44)) + (pins + (pin (num 1) (name AC5/ADC5/PA5) (type BiDi)) + (pin (num 2) (name AC1OUT/AC6/ADC6/PA6) (type BiDi)) + (pin (num 3) (name AC0OUT/AC7/ADC7/PA7) (type BiDi)) + (pin (num 4) (name AREFB/ADC8/PB0) (type BiDi)) + (pin (num 5) (name ADC9/PB1) (type BiDi)) + (pin (num 6) (name DAC0/ADC10/PB2) (type BiDi)) + (pin (num 7) (name DAC1/ACD11/PB3) (type BiDi)) + (pin (num 8) (name GND) (type power_in)) + (pin (num 9) (name VCC) (type power_in)) + (pin (num 10) (name SDAIN/SDA/~OC0ALS~/OC0A/PC0) (type BiDi)) + (pin (num 11) (name SCLIN/SCL/XCK0/OC0AHS/OC0B/PC1) (type BiDi)) + (pin (num 12) (name SDAOUT/RXD0/~OC0BLS~/OC0C/PC2) (type BiDi)) + (pin (num 13) (name SCLOUT/TXD0/OC0BHS/OC0D/PC3) (type BiDi)) + (pin (num 14) (name ~SS~/~OC0CLS~/OC1A/PC4) (type BiDi)) + (pin (num 15) (name MOSI/XCK1/OC0CHS/OC1B/PC5) (type BiDi)) + (pin (num 16) (name CLKRTC/MISO/RXD1/~OC0DLS~/PC6) (type BiDi)) + (pin (num 17) (name EVOUT/CLKOUT/SCK/TXD1/OC0DHS/PC7) (type BiDi)) + (pin (num 18) (name GND) (type power_in)) + (pin (num 19) (name VCC) (type power_in)) + (pin (num 20) (name PD0/OC0A) (type BiDi)) + (pin (num 21) (name PD1/OC0B/XCK0) (type BiDi)) + (pin (num 22) (name PD2/OC0C/RXD0) (type BiDi)) + (pin (num 23) (name PD3/OC0D/TXD0) (type BiDi)) + (pin (num 24) (name PD4/OC1A/~SS~) (type BiDi)) + (pin (num 25) (name PD5/OC1B/XCK1/MOSI) (type BiDi)) + (pin (num 26) (name PD6/D-/RXD1/MISO) (type BiDi)) + (pin (num 27) (name PD7/D+/TXD1/SCK/CLKOUT/EVOUT) (type BiDi)) + (pin (num 28) (name PE0/OC0A/SDA) (type BiDi)) + (pin (num 29) (name PE1/OC0B/XCK0/SCL) (type BiDi)) + (pin (num 30) (name GND) (type power_in)) + (pin (num 31) (name VCC) (type power_in)) + (pin (num 32) (name PE2/OC0C/RXD0) (type BiDi)) + (pin (num 33) (name PE3/OC0D/TXD0) (type BiDi)) + (pin (num 34) (name PDI_DATA) (type input)) + (pin (num 35) (name ~RESET~/PDI_CLK) (type input)) + (pin (num 36) (name PR0/XTAL2/TOSC2) (type BiDi)) + (pin (num 37) (name PR1/XTAL1/TOSC1) (type BiDi)) + (pin (num 38) (name GND) (type power_in)) + (pin (num 39) (name AVCC) (type power_in)) + (pin (num 40) (name AREFA/AC0/ADC0/PA0) (type BiDi)) + (pin (num 41) (name AC1/ADC1/PA1) (type BiDi)) + (pin (num 42) (name AC2/ADC2/PA2) (type BiDi)) + (pin (num 43) (name AC3/ADC3/PA3) (type BiDi)) + (pin (num 44) (name AC4/ADC4/PA4) (type BiDi)))) + (libpart (lib ESPO_PART) (part DMN63D8LDW) + (fields + (field (name Reference) U) + (field (name Value) DMN63D8LDW)) + (pins + (pin (num 1) (name S1) (type input)) + (pin (num 2) (name G1) (type input)) + (pin (num 3) (name D2) (type input)) + (pin (num 4) (name S2) (type input)) + (pin (num 5) (name G2) (type input)) + (pin (num 6) (name D1) (type input))))) + (libraries + (library (logical device) + (uri C:\KiCad\share\kicad\library\device.lib)) + (library (logical conn) + (uri C:\KiCad\share\kicad\library\conn.lib)) + (library (logical linear) + (uri C:\KiCad\share\kicad\library\linear.lib)) + (library (logical regul) + (uri C:\KiCad\share\kicad\library\regul.lib)) + (library (logical atmel) + (uri C:\KiCad\share\kicad\library\atmel.lib)) + (library (logical ESPO_PART) + (uri C:\Users\Esposch\Documents\KiCAD\ESPO_PART.lib))) + (nets + (net (code 1) (name "Net-(IC1-Pad32)") + (node (ref IC1) (pin 32)) + (node (ref R13) (pin 1))) + (net (code 2) (name "Net-(P3-Pad1)") + (node (ref P3) (pin 1)) + (node (ref R10) (pin 2))) + (net (code 3) (name "Net-(P3-Pad2)") + (node (ref R9) (pin 2)) + (node (ref P3) (pin 2))) + (net (code 4) (name "Net-(P3-Pad3)") + (node (ref P3) (pin 3)) + (node (ref R8) (pin 2))) + (net (code 5) (name "Net-(P3-Pad4)") + (node (ref R7) (pin 2)) + (node (ref P3) (pin 4))) + (net (code 6) (name "Net-(IC1-Pad33)") + (node (ref R14) (pin 1)) + (node (ref IC1) (pin 33))) + (net (code 7) (name "Net-(IC1-Pad29)") + (node (ref R12) (pin 1)) + (node (ref IC1) (pin 29))) + (net (code 8) (name "Net-(IC1-Pad28)") + (node (ref R11) (pin 1)) + (node (ref IC1) (pin 28))) + (net (code 9) (name "Net-(R10-Pad1)") + (node (ref R14) (pin 2)) + (node (ref R10) (pin 1))) + (net (code 10) (name "Net-(R13-Pad2)") + (node (ref R9) (pin 1)) + (node (ref R13) (pin 2))) + (net (code 11) (name "Net-(R12-Pad2)") + (node (ref R12) (pin 2)) + (node (ref R8) (pin 1))) + (net (code 12) (name "Net-(R11-Pad2)") + (node (ref R11) (pin 2)) + (node (ref R7) (pin 1))) + (net (code 13) (name "Net-(R22-Pad1)") + (node (ref R22) (pin 1)) + (node (ref R24) (pin 2))) + (net (code 14) (name "Net-(D1-Pad2)") + (node (ref L1) (pin 1)) + (node (ref Q1) (pin 3)) + (node (ref D1) (pin 2))) + (net (code 15) (name "Net-(P8-Pad2)") + (node (ref P8) (pin 2)) + (node (ref U4) (pin 2))) + (net (code 16) (name "Net-(P8-Pad1)") + (node (ref P8) (pin 1)) + (node (ref U4) (pin 5))) + (net (code 17) (name /D-) + (node (ref P2) (pin 2)) + (node (ref IC1) (pin 26))) + (net (code 18) (name /D+) + (node (ref IC1) (pin 27)) + (node (ref P2) (pin 3))) + (net (code 19) (name /VCC_3V3) + (node (ref C4) (pin 1)) + (node (ref U1) (pin 2)) + (node (ref IC1) (pin 31)) + (node (ref IC1) (pin 19)) + (node (ref P5) (pin 3)) + (node (ref C11) (pin 1)) + (node (ref R21) (pin 1)) + (node (ref P4) (pin 1)) + (node (ref C6) (pin 1))) + (net (code 20) (name "Net-(R2-Pad1)") + (node (ref R4) (pin 2)) + (node (ref U2) (pin 5)) + (node (ref R2) (pin 1))) + (net (code 21) (name "Net-(R17-Pad1)") + (node (ref R19) (pin 2)) + (node (ref R17) (pin 1)) + (node (ref U2) (pin 13))) + (net (code 22) (name /AGND) + (node (ref IC1) (pin 30)) + (node (ref C7) (pin 2)) + (node (ref P4) (pin 3)) + (node (ref C5) (pin 2)) + (node (ref U4) (pin 1)) + (node (ref F1) (pin 1)) + (node (ref U4) (pin 4)) + (node (ref C8) (pin 2)) + (node (ref C4) (pin 2)) + (node (ref IC1) (pin 18)) + (node (ref R27) (pin 2)) + (node (ref IC1) (pin 14)) + (node (ref R6) (pin 1)) + (node (ref U1) (pin 1)) + (node (ref P2) (pin 6)) + (node (ref P2) (pin 5)) + (node (ref C3) (pin 2)) + (node (ref IC1) (pin 38)) + (node (ref U3) (pin 4)) + (node (ref C6) (pin 2)) + (node (ref C11) (pin 2)) + (node (ref U3) (pin 1))) + (net (code 23) (name /PSU_FEEDBACK) + (node (ref IC1) (pin 1)) + (node (ref R26) (pin 2)) + (node (ref R27) (pin 1))) + (net (code 24) (name "Net-(R1-Pad1)") + (node (ref U2) (pin 3)) + (node (ref R1) (pin 1)) + (node (ref R3) (pin 1))) + (net (code 25) (name "Net-(C2-Pad2)") + (node (ref C2) (pin 2)) + (node (ref P1) (pin 2))) + (net (code 26) (name "Net-(C1-Pad2)") + (node (ref C1) (pin 2)) + (node (ref P1) (pin 3))) + (net (code 27) (name /VCC_PSU) + (node (ref C9) (pin 1)) + (node (ref L1) (pin 2)) + (node (ref C10) (pin 1)) + (node (ref P5) (pin 2))) + (net (code 28) (name "Net-(C1-Pad1)") + (node (ref P1) (pin 4)) + (node (ref C1) (pin 1)) + (node (ref R1) (pin 2))) + (net (code 29) (name "Net-(C2-Pad1)") + (node (ref P1) (pin 1)) + (node (ref C2) (pin 1)) + (node (ref R2) (pin 2))) + (net (code 30) (name "Net-(R18-Pad2)") + (node (ref R18) (pin 2)) + (node (ref U3) (pin 3))) + (net (code 31) (name "Net-(R19-Pad1)") + (node (ref R22) (pin 2)) + (node (ref U2) (pin 14)) + (node (ref R19) (pin 1))) + (net (code 32) (name "Net-(R17-Pad2)") + (node (ref R17) (pin 2)) + (node (ref R18) (pin 1))) + (net (code 33) (name "Net-(C14-Pad1)") + (node (ref C14) (pin 1)) + (node (ref P6) (pin 4))) + (net (code 34) (name "Net-(C14-Pad2)") + (node (ref P6) (pin 3)) + (node (ref R25) (pin 1)) + (node (ref C14) (pin 2))) + (net (code 35) (name "Net-(C13-Pad1)") + (node (ref P6) (pin 2)) + (node (ref C13) (pin 1))) + (net (code 36) (name "Net-(C13-Pad2)") + (node (ref R24) (pin 1)) + (node (ref P6) (pin 1)) + (node (ref C13) (pin 2))) + (net (code 37) (name "Net-(R20-Pad1)") + (node (ref R23) (pin 2)) + (node (ref R20) (pin 1)) + (node (ref U2) (pin 8))) + (net (code 38) (name "Net-(R16-Pad2)") + (node (ref U3) (pin 6)) + (node (ref R16) (pin 2))) + (net (code 39) (name /AVCC) + (node (ref C8) (pin 1)) + (node (ref R5) (pin 1)) + (node (ref C7) (pin 1)) + (node (ref R21) (pin 2)) + (node (ref C5) (pin 1)) + (node (ref IC1) (pin 39))) + (net (code 40) (name "Net-(R15-Pad1)") + (node (ref R20) (pin 2)) + (node (ref U2) (pin 9)) + (node (ref R15) (pin 1))) + (net (code 41) (name "Net-(R15-Pad2)") + (node (ref R15) (pin 2)) + (node (ref R16) (pin 1))) + (net (code 42) (name "Net-(IC1-Pad35)") + (node (ref P4) (pin 4)) + (node (ref IC1) (pin 35))) + (net (code 43) (name /PSU_PWM) + (node (ref IC1) (pin 24)) + (node (ref Q1) (pin 1))) + (net (code 44) (name "Net-(IC1-Pad34)") + (node (ref IC1) (pin 34)) + (node (ref P4) (pin 2))) + (net (code 45) (name "Net-(P2-Pad4)") + (node (ref P2) (pin 4))) + (net (code 46) (name "Net-(IC1-Pad10)") + (node (ref IC1) (pin 10))) + (net (code 47) (name "Net-(IC1-Pad9)") + (node (ref IC1) (pin 9))) + (net (code 48) (name "Net-(IC1-Pad8)") + (node (ref IC1) (pin 8))) + (net (code 49) (name /DAC_OUT2) + (node (ref U2) (pin 10)) + (node (ref IC1) (pin 7))) + (net (code 50) (name /DAC_OUT) + (node (ref U2) (pin 12)) + (node (ref IC1) (pin 6))) + (net (code 51) (name /TO_B1) + (node (ref IC1) (pin 5)) + (node (ref U3) (pin 5))) + (net (code 52) (name /TO_B0) + (node (ref U3) (pin 2)) + (node (ref IC1) (pin 4))) + (net (code 53) (name "Net-(IC1-Pad3)") + (node (ref IC1) (pin 3))) + (net (code 54) (name /VGND) + (node (ref C16) (pin 2)) + (node (ref C10) (pin 2)) + (node (ref F1) (pin 2)) + (node (ref C15) (pin 2)) + (node (ref C9) (pin 2)) + (node (ref Q1) (pin 2)) + (node (ref C12) (pin 2)) + (node (ref U2) (pin 11)) + (node (ref P7) (pin 2)) + (node (ref P7) (pin 3)) + (node (ref P7) (pin 4))) + (net (code 55) (name "Net-(IC1-Pad20)") + (node (ref IC1) (pin 20))) + (net (code 56) (name /PSU_OUT) + (node (ref U2) (pin 4)) + (node (ref P7) (pin 1)) + (node (ref R26) (pin 1)) + (node (ref C15) (pin 1)) + (node (ref C16) (pin 1)) + (node (ref D1) (pin 1))) + (net (code 57) (name "Net-(IC1-Pad37)") + (node (ref IC1) (pin 37))) + (net (code 58) (name /DIG_CH1) + (node (ref U4) (pin 6)) + (node (ref IC1) (pin 17))) + (net (code 59) (name "Net-(IC1-Pad36)") + (node (ref IC1) (pin 36))) + (net (code 60) (name "Net-(IC1-Pad16)") + (node (ref IC1) (pin 16))) + (net (code 61) (name "Net-(IC1-Pad25)") + (node (ref IC1) (pin 25))) + (net (code 62) (name /XCK) + (node (ref IC1) (pin 15)) + (node (ref IC1) (pin 11))) + (net (code 63) (name /AVCC_ON_2) + (node (ref R5) (pin 2)) + (node (ref IC1) (pin 44)) + (node (ref R6) (pin 2)) + (node (ref R4) (pin 1)) + (node (ref R3) (pin 2))) + (net (code 64) (name "Net-(IC1-Pad43)") + (node (ref IC1) (pin 43))) + (net (code 65) (name "Net-(IC1-Pad23)") + (node (ref IC1) (pin 23))) + (net (code 66) (name "Net-(IC1-Pad13)") + (node (ref IC1) (pin 13))) + (net (code 67) (name /CH1) + (node (ref U2) (pin 2)) + (node (ref IC1) (pin 42)) + (node (ref U2) (pin 1))) + (net (code 68) (name "Net-(IC1-Pad22)") + (node (ref IC1) (pin 22))) + (net (code 69) (name /DIG_CH2) + (node (ref IC1) (pin 12)) + (node (ref U4) (pin 3))) + (net (code 70) (name "Net-(IC1-Pad41)") + (node (ref IC1) (pin 41))) + (net (code 71) (name "Net-(IC1-Pad21)") + (node (ref IC1) (pin 21))) + (net (code 72) (name /CH2) + (node (ref U2) (pin 7)) + (node (ref IC1) (pin 2)) + (node (ref IC1) (pin 40)) + (node (ref U2) (pin 6))) + (net (code 73) (name +5V) + (node (ref U1) (pin 3)) + (node (ref P2) (pin 1)) + (node (ref C12) (pin 1)) + (node (ref P5) (pin 1)) + (node (ref C3) (pin 1))) + (net (code 74) (name "Net-(R23-Pad1)") + (node (ref R23) (pin 1)) + (node (ref R25) (pin 2))))) \ No newline at end of file diff --git a/PCB/OUTPUT_V3/OUTPUT_V3.zip b/PCB/OUTPUT_V3/OUTPUT_V3.zip new file mode 100644 index 00000000..0979e69b Binary files /dev/null and b/PCB/OUTPUT_V3/OUTPUT_V3.zip differ diff --git a/PCB/OUTPUT_V3/Tinylab_proto1-B_Cu.gbr b/PCB/OUTPUT_V3/Tinylab_proto1-B_Cu.gbr new file mode 100644 index 00000000..bd5d0fbd --- /dev/null +++ b/PCB/OUTPUT_V3/Tinylab_proto1-B_Cu.gbr @@ -0,0 +1,631 @@ +G04 #@! TF.FileFunction,Copper,L2,Bot,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 02/02/2016 11:58:15 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,1.300000X1.300000*% +%ADD12C,1.300000*% +%ADD13C,1.998980*% +%ADD14R,1.998980X1.998980*% +%ADD15R,1.905000X1.905000*% +%ADD16C,1.905000*% +%ADD17R,2.032000X1.727200*% +%ADD18O,2.032000X1.727200*% +%ADD19O,1.250000X0.950000*% +%ADD20O,1.000000X1.550000*% +%ADD21R,1.727200X1.727200*% +%ADD22O,1.727200X1.727200*% +%ADD23R,1.727200X2.032000*% +%ADD24O,1.727200X2.032000*% +%ADD25R,2.032000X2.032000*% +%ADD26O,2.032000X2.032000*% +%ADD27C,0.600000*% +%ADD28C,0.508000*% +%ADD29C,0.250000*% +%ADD30C,1.016000*% +G04 APERTURE END LIST* +D10* +D11* +X94805500Y-147510500D03* +D12* +X94805500Y-145010500D03* +D11* +X93281500Y-127190500D03* +D12* +X95781500Y-127190500D03* +X76350500Y-124269500D03* +D11* +X73850500Y-124269500D03* +D13* +X65595500Y-119446040D03* +D14* +X75755500Y-119446040D03* +D15* +X65468500Y-125222000D03* +D16* +X70548500Y-125222000D03* +D17* +X90043000Y-126301500D03* +D18* +X90043000Y-128841500D03* +X90043000Y-131381500D03* +X90043000Y-133921500D03* +D19* +X92607400Y-123228540D03* +X87607400Y-123228540D03* +D20* +X93607400Y-120528540D03* +X86607400Y-120528540D03* +D17* +X66040000Y-148590000D03* +D18* +X66040000Y-146050000D03* +X66040000Y-143510000D03* +X66040000Y-140970000D03* +D21* +X90106500Y-149860000D03* +D22* +X87566500Y-149860000D03* +X90106500Y-147320000D03* +X87566500Y-147320000D03* +D23* +X83693000Y-119380000D03* +D24* +X81153000Y-119380000D03* +X78613000Y-119380000D03* +D17* +X66040000Y-130810000D03* +D18* +X66040000Y-133350000D03* +X66040000Y-135890000D03* +X66040000Y-138430000D03* +D21* +X73660000Y-132080000D03* +D22* +X73660000Y-129540000D03* +X76200000Y-132080000D03* +X76200000Y-129540000D03* +D25* +X91249500Y-142113000D03* +D26* +X91249500Y-139573000D03* +D27* +X78054200Y-147701000D03* +X77165200Y-145415000D03* +X89052400Y-138480800D03* +X90551000Y-136334500D03* +X92583000Y-136461500D03* +X96164400Y-125399800D03* +X83883500Y-137858500D03* +X83108800Y-140182600D03* +X82118200Y-148005800D03* +X80391000Y-151003000D03* +X84836000Y-124206000D03* +X75374500Y-126111000D03* +X82359500Y-123444000D03* +X90805000Y-121602500D03* +X94805500Y-137731500D03* +X72072500Y-127254000D03* +X87020400Y-141986000D03* +X84429600Y-137210800D03* +X79679800Y-144983200D03* +X83375500Y-145796000D03* +X82740500Y-127000000D03* +X79502000Y-140563600D03* +X86055200Y-145237200D03* +X89509600Y-140614400D03* +X86309200Y-143662400D03* +X87680800Y-141325600D03* +X80365600Y-131876800D03* +X83413600Y-143611600D03* +X81838800Y-134975600D03* +X83058000Y-141071600D03* +X82931000Y-136398000D03* +X90805000Y-135509000D03* +X88455500Y-135509000D03* +X82423000Y-135636000D03* +X81178400Y-125526800D03* +X74879200Y-139344400D03* +X75184000Y-142113000D03* +X91376500Y-124714000D03* +X90017600Y-124612400D03* +X80873600Y-141655800D03* +X81229200Y-144272000D03* +X78943200Y-143713200D03* +X74345800Y-146761200D03* +X70815200Y-147320000D03* +X73126600Y-148412200D03* +X71678800Y-149783800D03* +X82867500Y-146431000D03* +X78943200Y-145719800D03* +X78536800Y-146634200D03* +X80137000Y-141173200D03* +X82994500Y-133350000D03* +X94030800Y-141808200D03* +X92252800Y-144373600D03* +X84404200Y-149987000D03* +X86741000Y-126238000D03* +X86741000Y-133413500D03* +X90373200Y-138074400D03* +X80467200Y-128727200D03* +X71564500Y-140144500D03* +X74041000Y-137033000D03* +X86131400Y-142367000D03* +X81635600Y-141376400D03* +X76936600Y-142951200D03* +X76301600Y-144678400D03* +X74726800Y-144932400D03* +X71145400Y-141630400D03* +X88188800Y-139954000D03* +X71818500Y-135001000D03* +X71831200Y-135940800D03* +X80213200Y-127355600D03* +D28* +X89052400Y-138480800D02* +X89052400Y-138176000D01* +X89966800Y-137261600D02* +X89966800Y-136918700D01* +X89052400Y-138176000D02* +X89966800Y-137261600D01* +X89966800Y-136918700D02* +X90551000Y-136334500D01* +X92583000Y-136461500D02* +X90678000Y-136461500D01* +X90678000Y-136461500D02* +X90551000Y-136334500D01* +D29* +X77800200Y-147447000D02* +X78054200Y-147701000D01* +X77800200Y-145770600D02* +X77800200Y-147447000D01* +X77317600Y-145288000D02* +X77800200Y-145770600D01* +X77292200Y-145288000D02* +X77317600Y-145288000D01* +X77165200Y-145415000D02* +X77292200Y-145288000D01* +X89966800Y-136918700D02* +X90551000Y-136334500D01* +X90551000Y-136334500D02* +X90678000Y-136461500D01* +D28* +X93878400Y-118999000D02* +X94310200Y-118999000D01* +X96164400Y-125247400D02* +X96164400Y-125399800D01* +X95250000Y-124333000D02* +X96164400Y-125247400D01* +X95250000Y-120345200D02* +X95250000Y-124333000D01* +X94894400Y-119989600D02* +X95250000Y-120345200D01* +X94894400Y-119583200D02* +X94894400Y-119989600D01* +X94310200Y-118999000D02* +X94894400Y-119583200D01* +X93878400Y-118999000D02* +X86309200Y-118999000D01* +X85293200Y-118059200D02* +X85115400Y-117881400D01* +X85394800Y-118160800D02* +X85293200Y-118059200D01* +X85471000Y-118160800D02* +X85394800Y-118160800D01* +X86309200Y-118999000D02* +X85471000Y-118160800D01* +X85115400Y-117881400D02* +X85445600Y-118211600D01* +D29* +X80111600Y-117881400D02* +X78613000Y-119380000D01* +X85115400Y-117881400D02* +X80111600Y-117881400D01* +X86233000Y-118999000D02* +X85445600Y-118211600D01* +X85445600Y-118211600D02* +X85115400Y-117881400D01* +X93878400Y-118999000D02* +X86233000Y-118999000D01* +X83883500Y-137858500D02* +X83388200Y-138938000D01* +X83388200Y-138938000D02* +X83108800Y-140182600D01* +X82118200Y-148005800D02* +X82169000Y-149796500D01* +X82169000Y-149796500D02* +X80962500Y-151003000D01* +X80962500Y-151003000D02* +X80391000Y-151003000D01* +D30* +X70548500Y-125222000D02* +X71310500Y-125984000D01* +X81153000Y-119380000D02* +X81153000Y-122377200D01* +X82219800Y-123444000D02* +X82359500Y-123444000D01* +X81153000Y-122377200D02* +X82219800Y-123444000D01* +D29* +X93281500Y-127190500D02* +X93281500Y-124206000D01* +X85979000Y-124206000D02* +X84836000Y-124206000D01* +X86487000Y-123698000D02* +X85979000Y-124206000D01* +X86487000Y-122872500D02* +X86487000Y-123698000D01* +X87058500Y-122301000D02* +X86487000Y-122872500D01* +X93091000Y-122301000D02* +X87058500Y-122301000D01* +X93662500Y-122872500D02* +X93091000Y-122301000D01* +X93662500Y-123825000D02* +X93662500Y-122872500D01* +X93281500Y-124206000D02* +X93662500Y-123825000D01* +X75374500Y-126111000D02* +X75247500Y-125984000D01* +X75247500Y-125984000D02* +X71310500Y-125984000D01* +D28* +X94195900Y-126072900D02* +X94195900Y-124498100D01* +X94195900Y-124498100D02* +X94170500Y-124472700D01* +X95781500Y-127190500D02* +X95313500Y-127190500D01* +X95313500Y-127190500D02* +X94195900Y-126072900D01* +X94195900Y-126072900D02* +X94170500Y-126047500D01* +X90805000Y-121602500D02* +X92646500Y-121602500D01* +X92646500Y-121602500D02* +X92684600Y-121640600D01* +D30* +X73660000Y-129540000D02* +X73660000Y-127508000D01* +X73660000Y-127508000D02* +X73406000Y-127254000D01* +X73406000Y-127254000D02* +X72072500Y-127254000D01* +X76200000Y-129540000D02* +X73660000Y-129540000D01* +X76200000Y-132080000D02* +X76200000Y-129540000D01* +X76200000Y-129540000D02* +X76200000Y-128498600D01* +X76200000Y-128498600D02* +X76657200Y-128041400D01* +X76657200Y-128041400D02* +X76657200Y-124576200D01* +X76657200Y-124576200D02* +X76350500Y-124269500D01* +D29* +X94170500Y-126047500D02* +X95313500Y-127190500D01* +X94170500Y-122618500D02* +X94170500Y-124472700D01* +X90805000Y-121602500D02* +X90995500Y-121793000D01* +X90995500Y-121793000D02* +X93345000Y-121793000D01* +X93345000Y-121793000D02* +X94170500Y-122618500D01* +X94170500Y-124472700D02* +X94170500Y-126047500D01* +X95885000Y-137160000D02* +X95885000Y-127294000D01* +X95313500Y-137731500D02* +X95885000Y-137160000D01* +X94805500Y-137731500D02* +X95313500Y-137731500D01* +X95885000Y-127294000D02* +X95781500Y-127190500D01* +X72072500Y-127254000D02* +X72136000Y-127190500D01* +X73342500Y-127190500D02* +X73660000Y-127508000D01* +X72136000Y-127190500D02* +X73342500Y-127190500D01* +X76200000Y-129540000D02* +X76200000Y-124420000D01* +X76200000Y-124420000D02* +X76350500Y-124269500D01* +X76033000Y-129373000D02* +X76200000Y-129540000D01* +D30* +X73850500Y-124269500D02* +X73850500Y-123634500D01* +X73850500Y-123634500D02* +X75755500Y-121729500D01* +X75755500Y-121729500D02* +X75755500Y-119446040D01* +D29* +X86461600Y-141427200D02* +X87020400Y-141986000D01* +X86461600Y-139242800D02* +X86461600Y-141427200D01* +X84429600Y-137210800D02* +X86461600Y-139242800D01* +X73850500Y-123634500D02* +X75755500Y-121729500D01* +X75755500Y-121729500D02* +X75755500Y-119446040D01* +X73660000Y-132080000D02* +X73596500Y-132080000D01* +X83312000Y-145732500D02* +X79679800Y-144983200D01* +X83375500Y-145796000D02* +X83312000Y-145732500D01* +X81978500Y-127762000D02* +X82740500Y-127000000D01* +X81978500Y-131318000D02* +X81978500Y-127762000D01* +X79692500Y-133604000D02* +X81978500Y-131318000D01* +X79502000Y-140563600D02* +X79692500Y-133604000D01* +X86207600Y-145084800D02* +X86055200Y-145237200D01* +X86715600Y-145084800D02* +X86207600Y-145084800D01* +X89408000Y-142392400D02* +X86715600Y-145084800D01* +X89408000Y-140716000D02* +X89408000Y-142392400D01* +X89509600Y-140614400D02* +X89408000Y-140716000D01* +X86360000Y-143662400D02* +X86309200Y-143662400D01* +X87680800Y-142341600D02* +X86360000Y-143662400D01* +X87680800Y-141325600D02* +X87680800Y-142341600D01* +X80365600Y-132232400D02* +X80365600Y-131876800D01* +X78943200Y-133654800D02* +X80365600Y-132232400D01* +X78638400Y-141986000D02* +X78943200Y-133654800D01* +X79806800Y-142341600D02* +X78638400Y-141986000D01* +X81330800Y-142494000D02* +X79806800Y-142341600D01* +X82811049Y-143452151D02* +X81330800Y-142494000D01* +X83254151Y-143452151D02* +X82811049Y-143452151D01* +X83413600Y-143611600D02* +X83254151Y-143452151D01* +X81838800Y-134975600D02* +X81788000Y-135026400D01* +X81788000Y-135026400D02* +X81788000Y-140462000D01* +X81788000Y-140462000D02* +X82346800Y-141122400D01* +X82346800Y-141122400D02* +X83058000Y-141071600D01* +X88646000Y-136398000D02* +X82931000Y-136398000D01* +X89662000Y-135382000D02* +X88646000Y-136398000D01* +X90678000Y-135382000D02* +X89662000Y-135382000D01* +X90805000Y-135509000D02* +X90678000Y-135382000D01* +X82550000Y-135509000D02* +X88455500Y-135509000D01* +X82423000Y-135636000D02* +X82550000Y-135509000D01* +X81178400Y-129184400D02* +X81178400Y-125526800D01* +X78892400Y-131470400D02* +X81178400Y-129184400D01* +X78892400Y-133045200D02* +X78892400Y-131470400D01* +X76403200Y-135534400D02* +X78892400Y-133045200D01* +X76403200Y-137820400D02* +X76403200Y-135534400D01* +X74879200Y-139344400D02* +X76403200Y-137820400D01* +X75628500Y-142557500D02* +X75184000Y-142113000D01* +X75628500Y-147510500D02* +X75628500Y-142557500D01* +X76327000Y-148209000D02* +X75628500Y-147510500D01* +X76327000Y-149542500D02* +X76327000Y-148209000D01* +X78486000Y-151701500D02* +X76327000Y-149542500D01* +X90487500Y-151701500D02* +X78486000Y-151701500D01* +X93345000Y-148844000D02* +X90487500Y-151701500D01* +X93345000Y-136017000D02* +X93345000Y-148844000D01* +X91694000Y-134366000D02* +X93345000Y-136017000D01* +X91694000Y-125031500D02* +X91694000Y-134366000D01* +X91376500Y-124714000D02* +X91694000Y-125031500D01* +X89103200Y-124612400D02* +X90017600Y-124612400D01* +X88392000Y-125323600D02* +X89103200Y-124612400D01* +X88392000Y-133705600D02* +X88392000Y-125323600D01* +X87833200Y-134264400D02* +X88392000Y-133705600D01* +X83007200Y-134264400D02* +X87833200Y-134264400D01* +X82651600Y-133908800D02* +X83007200Y-134264400D01* +X81686400Y-133908800D02* +X82651600Y-133908800D01* +X81178400Y-134416800D02* +X81686400Y-133908800D01* +X80924400Y-141605000D02* +X81178400Y-134416800D01* +X80873600Y-141655800D02* +X80924400Y-141605000D01* +X79502000Y-144272000D02* +X81229200Y-144272000D01* +X78943200Y-143713200D02* +X79502000Y-144272000D01* +X74345800Y-147015200D02* +X74345800Y-146761200D01* +X74041000Y-147574000D02* +X74345800Y-147015200D01* +X71005700Y-147510500D02* +X74041000Y-147574000D01* +X70815200Y-147320000D02* +X71005700Y-147510500D01* +X73152000Y-148437600D02* +X73126600Y-148412200D01* +X73152000Y-149352000D02* +X73152000Y-148437600D01* +X72517000Y-149987000D02* +X73152000Y-149352000D01* +X71882000Y-149987000D02* +X72517000Y-149987000D01* +X71678800Y-149783800D02* +X71882000Y-149987000D01* +X78943200Y-145719800D02* +X82867500Y-146431000D01* +X86804500Y-148082000D02* +X87566500Y-147320000D01* +X85153500Y-148082000D02* +X86804500Y-148082000D01* +X84772500Y-148463000D02* +X85153500Y-148082000D01* +X84201000Y-148463000D02* +X84772500Y-148463000D01* +X82867500Y-147129500D02* +X84201000Y-148463000D01* +X78536800Y-146634200D02* +X82867500Y-147129500D01* +X80391000Y-133921500D02* +X80137000Y-141173200D01* +X80962500Y-133350000D02* +X80391000Y-133921500D01* +X82994500Y-133350000D02* +X80962500Y-133350000D01* +X86741000Y-126060200D02* +X86741000Y-126238000D01* +X88925400Y-123875800D02* +X86741000Y-126060200D01* +X91770200Y-123875800D02* +X88925400Y-123875800D01* +X92176600Y-124282200D02* +X91770200Y-123875800D01* +X92176600Y-133578600D02* +X92176600Y-124282200D01* +X93954600Y-135356600D02* +X92176600Y-133578600D01* +X93954600Y-141732000D02* +X93954600Y-135356600D01* +X94030800Y-141808200D02* +X93954600Y-141732000D01* +X92252800Y-147548600D02* +X92252800Y-144373600D01* +X91135200Y-148666200D02* +X92252800Y-147548600D01* +X85725000Y-148666200D02* +X91135200Y-148666200D01* +X84404200Y-149987000D02* +X85725000Y-148666200D01* +X86741000Y-133413500D02* +X86741000Y-126238000D01* +X91249500Y-142113000D02* +X91249500Y-141973300D01* +X91249500Y-141973300D02* +X92760800Y-140462000D01* +X91998800Y-138074400D02* +X90373200Y-138074400D01* +X92760800Y-138836400D02* +X91998800Y-138074400D01* +X92760800Y-140462000D02* +X92760800Y-138836400D01* +X74041000Y-134747000D02* +X74041000Y-137033000D01* +X74320400Y-134467600D02* +X74041000Y-134747000D01* +X76504800Y-134467600D02* +X74320400Y-134467600D01* +X78079600Y-132892800D02* +X76504800Y-134467600D01* +X78079600Y-130200400D02* +X78079600Y-132892800D01* +X78689200Y-129590800D02* +X78079600Y-130200400D01* +X79603600Y-129590800D02* +X78689200Y-129590800D01* +X80467200Y-128727200D02* +X79603600Y-129590800D01* +X74041000Y-137033000D02* +X72326500Y-137033000D01* +X71564500Y-137795000D02* +X71564500Y-140144500D01* +X72326500Y-137033000D02* +X71564500Y-137795000D01* +X86131400Y-142367000D02* +X85801200Y-142697200D01* +X85801200Y-142697200D02* +X82956400Y-142697200D01* +X82956400Y-142697200D02* +X81635600Y-141376400D01* +X76936600Y-142951200D02* +X76504800Y-143383000D01* +X76504800Y-143383000D02* +X76504800Y-144475200D01* +X76504800Y-144475200D02* +X76301600Y-144678400D01* +X74726800Y-144932400D02* +X71424800Y-141630400D01* +X71424800Y-141630400D02* +X71145400Y-141630400D01* +X88722200Y-142367000D02* +X88188800Y-139954000D01* +X86423500Y-144526000D02* +X88722200Y-142367000D01* +X82296000Y-144729200D02* +X86423500Y-144526000D01* +X81280000Y-143154400D02* +X82296000Y-144729200D01* +X78841600Y-143002000D02* +X81280000Y-143154400D01* +X75184000Y-141325600D02* +X78841600Y-143002000D01* +X71374000Y-140970000D02* +X75184000Y-141325600D01* +X70802500Y-140398500D02* +X71374000Y-140970000D01* +X70802500Y-136017000D02* +X70802500Y-140398500D01* +X71818500Y-135001000D02* +X70802500Y-136017000D01* +X71983600Y-135940800D02* +X71831200Y-135940800D01* +X74218800Y-133705600D02* +X71983600Y-135940800D01* +X76352400Y-133705600D02* +X74218800Y-133705600D01* +X77520800Y-132537200D02* +X76352400Y-133705600D01* +X77520800Y-128930400D02* +X77520800Y-132537200D01* +X77724000Y-128727200D02* +X77520800Y-128930400D01* +X78841600Y-128727200D02* +X77724000Y-128727200D01* +X80213200Y-127355600D02* +X78841600Y-128727200D01* +M02* diff --git a/PCB/OUTPUT_V3/Tinylab_proto1-B_Mask.gbr b/PCB/OUTPUT_V3/Tinylab_proto1-B_Mask.gbr new file mode 100644 index 00000000..db03c737 --- /dev/null +++ b/PCB/OUTPUT_V3/Tinylab_proto1-B_Mask.gbr @@ -0,0 +1,91 @@ +G04 #@! TF.FileFunction,Soldermask,Bot* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 02/02/2016 11:58:15 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,1.300000X1.300000*% +%ADD12C,1.300000*% +%ADD13C,1.998980*% +%ADD14R,1.998980X1.998980*% +%ADD15R,1.905000X1.905000*% +%ADD16C,1.905000*% +%ADD17R,2.032000X1.727200*% +%ADD18O,2.032000X1.727200*% +%ADD19O,1.250000X0.950000*% +%ADD20O,1.000000X1.550000*% +%ADD21R,1.727200X1.727200*% +%ADD22O,1.727200X1.727200*% +%ADD23R,1.727200X2.032000*% +%ADD24O,1.727200X2.032000*% +%ADD25R,2.032000X2.032000*% +%ADD26O,2.032000X2.032000*% +G04 APERTURE END LIST* +D10* +D11* +X94805500Y-147510500D03* +D12* +X94805500Y-145010500D03* +D11* +X93281500Y-127190500D03* +D12* +X95781500Y-127190500D03* +X76350500Y-124269500D03* +D11* +X73850500Y-124269500D03* +D13* +X65595500Y-119446040D03* +D14* +X75755500Y-119446040D03* +D15* +X65468500Y-125222000D03* +D16* +X70548500Y-125222000D03* +D17* +X90043000Y-126301500D03* +D18* +X90043000Y-128841500D03* +X90043000Y-131381500D03* +X90043000Y-133921500D03* +D19* +X92607400Y-123228540D03* +X87607400Y-123228540D03* +D20* +X93607400Y-120528540D03* +X86607400Y-120528540D03* +D17* +X66040000Y-148590000D03* +D18* +X66040000Y-146050000D03* +X66040000Y-143510000D03* +X66040000Y-140970000D03* +D21* +X90106500Y-149860000D03* +D22* +X87566500Y-149860000D03* +X90106500Y-147320000D03* +X87566500Y-147320000D03* +D23* +X83693000Y-119380000D03* +D24* +X81153000Y-119380000D03* +X78613000Y-119380000D03* +D17* +X66040000Y-130810000D03* +D18* +X66040000Y-133350000D03* +X66040000Y-135890000D03* +X66040000Y-138430000D03* +D21* +X73660000Y-132080000D03* +D22* +X73660000Y-129540000D03* +X76200000Y-132080000D03* +X76200000Y-129540000D03* +D25* +X91249500Y-142113000D03* +D26* +X91249500Y-139573000D03* +M02* diff --git a/PCB/OUTPUT_V3/Tinylab_proto1-Edge_Cuts.gbr b/PCB/OUTPUT_V3/Tinylab_proto1-Edge_Cuts.gbr new file mode 100644 index 00000000..25d22b74 --- /dev/null +++ b/PCB/OUTPUT_V3/Tinylab_proto1-Edge_Cuts.gbr @@ -0,0 +1,31 @@ +G04 #@! TF.FileFunction,Profile,NP* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 02/02/2016 11:58:15 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +G04 APERTURE END LIST* +D10* +X97409000Y-152044400D02* +X97409000Y-117576600D01* +X97409000Y-117602000D02* +X96596200Y-117602000D01* +X97409000Y-152222200D02* +X97409000Y-151993600D01* +X96596200Y-152222200D02* +X97409000Y-152222200D01* +X64236600Y-152222200D02* +X96621600Y-152222200D01* +X96621600Y-117602000D02* +X64211200Y-117602000D01* +X64211200Y-117627400D02* +X64236600Y-117627400D01* +X64211200Y-152222200D02* +X64211200Y-117627400D01* +X64287400Y-152222200D02* +X64236600Y-152222200D01* +X64287400Y-152222200D02* +X64312800Y-152222200D01* +M02* diff --git a/PCB/OUTPUT_V3/Tinylab_proto1-F_Cu.gbr b/PCB/OUTPUT_V3/Tinylab_proto1-F_Cu.gbr new file mode 100644 index 00000000..228f9d08 --- /dev/null +++ b/PCB/OUTPUT_V3/Tinylab_proto1-F_Cu.gbr @@ -0,0 +1,1461 @@ +G04 #@! TF.FileFunction,Copper,L1,Top,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 02/02/2016 11:58:15 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,0.800000X0.750000*% +%ADD12R,0.750000X0.800000*% +%ADD13R,1.300000X1.300000*% +%ADD14C,1.300000*% +%ADD15C,1.998980*% +%ADD16R,1.998980X1.998980*% +%ADD17R,1.600000X1.000000*% +%ADD18R,1.600000X0.560000*% +%ADD19R,0.560000X1.600000*% +%ADD20R,1.905000X1.905000*% +%ADD21C,1.905000*% +%ADD22R,2.032000X1.727200*% +%ADD23O,2.032000X1.727200*% +%ADD24R,0.400000X1.350000*% +%ADD25O,1.250000X0.950000*% +%ADD26O,1.000000X1.550000*% +%ADD27R,1.727200X1.727200*% +%ADD28O,1.727200X1.727200*% +%ADD29R,1.727200X2.032000*% +%ADD30O,1.727200X2.032000*% +%ADD31R,2.032000X2.032000*% +%ADD32O,2.032000X2.032000*% +%ADD33R,0.900000X0.600000*% +%ADD34R,0.500000X0.900000*% +%ADD35R,0.900000X0.500000*% +%ADD36R,0.600000X0.900000*% +%ADD37R,1.500000X0.600000*% +%ADD38R,0.508000X0.304800*% +%ADD39C,0.600000*% +%ADD40C,0.250000*% +%ADD41C,0.508000*% +%ADD42C,1.016000*% +G04 APERTURE END LIST* +D10* +D11* +X86054500Y-130492500D03* +X87554500Y-130492500D03* +X86054500Y-128968500D03* +X87554500Y-128968500D03* +D12* +X92519500Y-130885500D03* +X92519500Y-132385500D03* +D11* +X95619000Y-135064500D03* +X94119000Y-135064500D03* +X87554500Y-138430000D03* +X86054500Y-138430000D03* +D13* +X94805500Y-147510500D03* +D14* +X94805500Y-145010500D03* +D11* +X79363000Y-151003000D03* +X77863000Y-151003000D03* +D13* +X93281500Y-127190500D03* +D14* +X95781500Y-127190500D03* +D12* +X83502500Y-124194000D03* +X83502500Y-122694000D03* +X71374000Y-146292000D03* +X71374000Y-144792000D03* +X95504000Y-122249500D03* +X95504000Y-123749500D03* +X68707000Y-133338000D03* +X68707000Y-131838000D03* +X68707000Y-136259000D03* +X68707000Y-134759000D03* +D14* +X76350500Y-124269500D03* +D13* +X73850500Y-124269500D03* +D12* +X71437500Y-129972500D03* +X71437500Y-128472500D03* +D15* +X65595500Y-119446040D03* +D16* +X75755500Y-119446040D03* +D17* +X94551500Y-139485500D03* +X94551500Y-136485500D03* +D18* +X84717000Y-147510000D03* +X84717000Y-146710000D03* +X84717000Y-145910000D03* +X84717000Y-145110000D03* +X84717000Y-144310000D03* +X84717000Y-143510000D03* +X84717000Y-142710000D03* +X84717000Y-141910000D03* +X84717000Y-141110000D03* +X84717000Y-140310000D03* +X84717000Y-139510000D03* +D19* +X82867000Y-137660000D03* +X82067000Y-137660000D03* +X81267000Y-137660000D03* +X80467000Y-137660000D03* +X79667000Y-137660000D03* +X78867000Y-137660000D03* +X78067000Y-137660000D03* +X77267000Y-137660000D03* +X76467000Y-137660000D03* +X75667000Y-137660000D03* +X74867000Y-137660000D03* +D18* +X73017000Y-139510000D03* +X73017000Y-140310000D03* +X73017000Y-141110000D03* +X73017000Y-141910000D03* +X73017000Y-142710000D03* +X73017000Y-143510000D03* +X73017000Y-144310000D03* +X73017000Y-145110000D03* +X73017000Y-145910000D03* +X73017000Y-146710000D03* +X73017000Y-147510000D03* +D19* +X74867000Y-149360000D03* +X75667000Y-149360000D03* +X76467000Y-149360000D03* +X77267000Y-149360000D03* +X78067000Y-149360000D03* +X78867000Y-149360000D03* +X79667000Y-149360000D03* +X80467000Y-149360000D03* +X81267000Y-149360000D03* +X82067000Y-149360000D03* +X82867000Y-149360000D03* +D20* +X65468500Y-125222000D03* +D21* +X70548500Y-125222000D03* +D22* +X90043000Y-126301500D03* +D23* +X90043000Y-128841500D03* +X90043000Y-131381500D03* +X90043000Y-133921500D03* +D24* +X91407400Y-123228540D03* +X90757400Y-123228540D03* +X90107400Y-123228540D03* +X89457400Y-123228540D03* +X88807400Y-123228540D03* +D25* +X92607400Y-123228540D03* +X87607400Y-123228540D03* +D26* +X93607400Y-120528540D03* +X86607400Y-120528540D03* +D22* +X66040000Y-148590000D03* +D23* +X66040000Y-146050000D03* +X66040000Y-143510000D03* +X66040000Y-140970000D03* +D27* +X90106500Y-149860000D03* +D28* +X87566500Y-149860000D03* +X90106500Y-147320000D03* +X87566500Y-147320000D03* +D29* +X83693000Y-119380000D03* +D30* +X81153000Y-119380000D03* +X78613000Y-119380000D03* +D22* +X66040000Y-130810000D03* +D23* +X66040000Y-133350000D03* +X66040000Y-135890000D03* +X66040000Y-138430000D03* +D27* +X73660000Y-132080000D03* +D28* +X73660000Y-129540000D03* +X76200000Y-132080000D03* +X76200000Y-129540000D03* +D31* +X91249500Y-142113000D03* +D32* +X91249500Y-139573000D03* +D33* +X79245000Y-123444000D03* +X82045000Y-122494000D03* +X82045000Y-124394000D03* +D34* +X85927500Y-132080000D03* +X87427500Y-132080000D03* +X85927500Y-127381000D03* +X87427500Y-127381000D03* +X85927500Y-133731000D03* +X87427500Y-133731000D03* +X87427500Y-125793500D03* +X85927500Y-125793500D03* +X85927500Y-135318500D03* +X87427500Y-135318500D03* +X85927500Y-136906000D03* +X87427500Y-136906000D03* +D35* +X67970400Y-142036800D03* +X67970400Y-140536800D03* +X68453000Y-144641000D03* +X68453000Y-143141000D03* +X68453000Y-147244500D03* +X68453000Y-145744500D03* +X68643500Y-149848000D03* +X68643500Y-148348000D03* +X69748400Y-140536800D03* +X69748400Y-142036800D03* +X70040500Y-143141000D03* +X70040500Y-144641000D03* +X69786500Y-145744500D03* +X69786500Y-147244500D03* +X70231000Y-148348000D03* +X70231000Y-149848000D03* +X68707000Y-137553000D03* +X68707000Y-139053000D03* +D34* +X71616000Y-138938000D03* +X70116000Y-138938000D03* +D35* +X75057000Y-135878000D03* +X75057000Y-134378000D03* +X76708000Y-135878000D03* +X76708000Y-134378000D03* +X73406000Y-134378000D03* +X73406000Y-135878000D03* +X72961500Y-138545000D03* +X72961500Y-137045000D03* +D34* +X82093500Y-151066500D03* +X80593500Y-151066500D03* +D35* +X70358000Y-131711000D03* +X70358000Y-133211000D03* +D34* +X70116000Y-137287000D03* +X71616000Y-137287000D03* +X68719000Y-130302000D03* +X70219000Y-130302000D03* +D35* +X70358000Y-134378000D03* +X70358000Y-135878000D03* +D34* +X88888000Y-143129000D03* +X87388000Y-143129000D03* +X87388000Y-144716500D03* +X88888000Y-144716500D03* +D36* +X94869000Y-130870500D03* +X95819000Y-133670500D03* +X93919000Y-133670500D03* +D37* +X84361000Y-134620000D03* +X84361000Y-133350000D03* +X84361000Y-132080000D03* +X84361000Y-130810000D03* +X84361000Y-129540000D03* +X84361000Y-128270000D03* +X84361000Y-127000000D03* +X78961000Y-127000000D03* +X78961000Y-128270000D03* +X78961000Y-129540000D03* +X78961000Y-130810000D03* +X78961000Y-132080000D03* +X78961000Y-133350000D03* +X78961000Y-134620000D03* +D38* +X88900000Y-141147800D03* +X88900000Y-139877800D03* +X86868000Y-141147800D03* +X88900000Y-140512800D03* +X86868000Y-139877800D03* +X86868000Y-140512800D03* +X91313000Y-137414000D03* +X91313000Y-136144000D03* +X89281000Y-137414000D03* +X91313000Y-136779000D03* +X89281000Y-136144000D03* +X89281000Y-136779000D03* +D39* +X78054200Y-147701000D03* +X77165200Y-145415000D03* +X89052400Y-138480800D03* +X90551000Y-136334500D03* +X92583000Y-136461500D03* +X96164400Y-125399800D03* +X83883500Y-137858500D03* +X83108800Y-140182600D03* +X82118200Y-148005800D03* +X80391000Y-151003000D03* +X84836000Y-124206000D03* +X75374500Y-126111000D03* +X82359500Y-123444000D03* +X90805000Y-121602500D03* +X94805500Y-137731500D03* +X72072500Y-127254000D03* +X87020400Y-141986000D03* +X84429600Y-137210800D03* +X79679800Y-144983200D03* +X83375500Y-145796000D03* +X82740500Y-127000000D03* +X79502000Y-140563600D03* +X86055200Y-145237200D03* +X89509600Y-140614400D03* +X86309200Y-143662400D03* +X87680800Y-141325600D03* +X80365600Y-131876800D03* +X83413600Y-143611600D03* +X81838800Y-134975600D03* +X83058000Y-141071600D03* +X82931000Y-136398000D03* +X90805000Y-135509000D03* +X88455500Y-135509000D03* +X82423000Y-135636000D03* +X81178400Y-125526800D03* +X74879200Y-139344400D03* +X75184000Y-142113000D03* +X91376500Y-124714000D03* +X90017600Y-124612400D03* +X80873600Y-141655800D03* +X81229200Y-144272000D03* +X78943200Y-143713200D03* +X74345800Y-146761200D03* +X70815200Y-147320000D03* +X73126600Y-148412200D03* +X71678800Y-149783800D03* +X82867500Y-146431000D03* +X78943200Y-145719800D03* +X78536800Y-146634200D03* +X80137000Y-141173200D03* +X82994500Y-133350000D03* +X94030800Y-141808200D03* +X92252800Y-144373600D03* +X84404200Y-149987000D03* +X86741000Y-126238000D03* +X86741000Y-133413500D03* +X90373200Y-138074400D03* +X80467200Y-128727200D03* +X71564500Y-140144500D03* +X74041000Y-137033000D03* +X86131400Y-142367000D03* +X81635600Y-141376400D03* +X76936600Y-142951200D03* +X76301600Y-144678400D03* +X74726800Y-144932400D03* +X71145400Y-141630400D03* +X88188800Y-139954000D03* +X71818500Y-135001000D03* +X71831200Y-135940800D03* +X80213200Y-127355600D03* +D40* +X90043000Y-133921500D02* +X90043000Y-133794500D01* +X90043000Y-133794500D02* +X88328500Y-132080000D01* +X88328500Y-132080000D02* +X87427500Y-132080000D01* +X86054500Y-130492500D02* +X86054500Y-130822000D01* +X86054500Y-130822000D02* +X86677500Y-131445000D01* +X86677500Y-131445000D02* +X86792500Y-131445000D01* +X86792500Y-131445000D02* +X87427500Y-132080000D01* +X90043000Y-131381500D02* +X89598500Y-131381500D01* +X89598500Y-131381500D02* +X88709500Y-130492500D01* +X88709500Y-130492500D02* +X87554500Y-130492500D01* +X87427500Y-127381000D02* +X87693500Y-127381000D01* +X88773000Y-126301500D02* +X90043000Y-126301500D01* +X87693500Y-127381000D02* +X88773000Y-126301500D01* +X86054500Y-128968500D02* +X86054500Y-128829500D01* +X86054500Y-128829500D02* +X86741000Y-128143000D01* +X86741000Y-128143000D02* +X86741000Y-127571500D01* +X86741000Y-127571500D02* +X86931500Y-127381000D01* +X86931500Y-127381000D02* +X87427500Y-127381000D01* +X90043000Y-128841500D02* +X87681500Y-128841500D01* +X87681500Y-128841500D02* +X87554500Y-128968500D01* +X94869000Y-130870500D02* +X94869000Y-129730500D01* +X94615000Y-122491500D02* +X94373000Y-122249500D01* +X94615000Y-129476500D02* +X94615000Y-122491500D01* +X94869000Y-129730500D02* +X94615000Y-129476500D01* +X92519500Y-130885500D02* +X94854000Y-130885500D01* +X94854000Y-130885500D02* +X94869000Y-130870500D01* +X83693000Y-119380000D02* +X89852500Y-119380000D01* +X91503500Y-122110500D02* +X91407400Y-122110500D01* +X91503500Y-121031000D02* +X91503500Y-122110500D01* +X89852500Y-119380000D02* +X91503500Y-121031000D01* +X91407400Y-123228540D02* +X91407400Y-122110500D01* +X91407400Y-122110500D02* +X91407400Y-122016100D01* +X93928500Y-122249500D02* +X94373000Y-122249500D01* +X93599000Y-121920000D02* +X93928500Y-122249500D01* +X91503500Y-121920000D02* +X93599000Y-121920000D01* +X91407400Y-122016100D02* +X91503500Y-121920000D01* +X94373000Y-122249500D02* +X95504000Y-122249500D01* +X83693000Y-119380000D02* +X84518500Y-119380000D01* +D41* +X86054500Y-138430000D02* +X86054500Y-137033000D01* +X86054500Y-137033000D02* +X85927500Y-136906000D01* +X94119000Y-135064500D02* +X93154500Y-135064500D01* +X93154500Y-135064500D02* +X93027500Y-135191500D01* +X93027500Y-135191500D02* +X93027500Y-136017000D01* +X93027500Y-136017000D02* +X92583000Y-136461500D01* +X94805500Y-145010500D02* +X94805500Y-139739500D01* +X94805500Y-139739500D02* +X94551500Y-139485500D01* +D40* +X73017000Y-145110000D02* +X73863000Y-145110000D01* +X78067000Y-147713800D02* +X78067000Y-149360000D01* +X78054200Y-147701000D02* +X78067000Y-147713800D01* +X76987400Y-145592800D02* +X77165200Y-145415000D01* +X74345800Y-145592800D02* +X76987400Y-145592800D01* +X73863000Y-145110000D02* +X74345800Y-145592800D01* +X88900000Y-141147800D02* +X88417400Y-141147800D01* +X87477600Y-140208000D02* +X87477600Y-139446000D01* +X88417400Y-141147800D02* +X87477600Y-140208000D01* +X88888000Y-144716500D02* +X88888000Y-146038000D01* +X88888000Y-146038000D02* +X90106500Y-147256500D01* +X90106500Y-147256500D02* +X90106500Y-147320000D01* +X89115900Y-141160500D02* +X89115900Y-141287500D01* +X89115900Y-141287500D02* +X89662000Y-141833600D01* +X89662000Y-141833600D02* +X89662000Y-145010500D01* +X89662000Y-145010500D02* +X89638500Y-145034000D01* +X89638500Y-145034000D02* +X89611200Y-145034000D01* +X89611200Y-145034000D02* +X89611200Y-145010500D01* +X88595200Y-139293600D02* +X88595200Y-138938000D01* +X88595200Y-139293600D02* +X87630000Y-139293600D01* +X87630000Y-139293600D02* +X87477600Y-139446000D01* +X87477600Y-139446000D02* +X87033100Y-139890500D01* +X88595200Y-138938000D02* +X89052400Y-138480800D01* +X87033100Y-139890500D02* +X86487000Y-139890500D01* +X86054500Y-138430000D02* +X86054500Y-139394500D01* +X86054500Y-139394500D02* +X86487000Y-139827000D01* +X86487000Y-139827000D02* +X86487000Y-139890500D01* +X88807400Y-123228540D02* +X87607400Y-123228540D01* +X92519500Y-132385500D02* +X91999500Y-132385500D01* +X91999500Y-132385500D02* +X91694000Y-132080000D01* +X91694000Y-132080000D02* +X91694000Y-125476000D01* +X91694000Y-125476000D02* +X92607400Y-124562600D01* +X92607400Y-124562600D02* +X92607400Y-123228540D01* +X94551500Y-139485500D02* +X95224600Y-142036800D01* +X95224600Y-142036800D02* +X94805500Y-145010500D01* +X89598500Y-136144000D02* +X90360500Y-136144000D01* +X90360500Y-136144000D02* +X90551000Y-136334500D01* +X92583000Y-136461500D02* +X93027500Y-136017000D01* +X93027500Y-136017000D02* +X93027500Y-135191500D01* +X93027500Y-135191500D02* +X93154500Y-135064500D01* +X89281000Y-136144000D02* +X89598500Y-136144000D01* +X89598500Y-136144000D02* +X89663398Y-136144000D01* +X90614500Y-137414000D02* +X91313000Y-137414000D01* +X90487500Y-137287000D02* +X90614500Y-137414000D01* +X90487500Y-136968102D02* +X90487500Y-137287000D01* +X89663398Y-136144000D02* +X90487500Y-136968102D01* +X94805500Y-145010500D02* +X89611200Y-145010500D01* +X89611200Y-145010500D02* +X89182000Y-145010500D01* +X89182000Y-145010500D02* +X88888000Y-144716500D01* +X93919000Y-133670500D02* +X93919000Y-134864500D01* +X93919000Y-134864500D02* +X94119000Y-135064500D01* +X92519500Y-132385500D02* +X92519500Y-133159500D01* +X93030500Y-133670500D02* +X93919000Y-133670500D01* +X92519500Y-133159500D02* +X93030500Y-133670500D01* +X71640000Y-144792000D02* +X71958000Y-145110000D01* +X71958000Y-145110000D02* +X73017000Y-145110000D01* +X71374000Y-144792000D02* +X71640000Y-144792000D01* +X71310500Y-144792000D02* +X71640000Y-144792000D01* +X81267000Y-137660000D02* +X81267000Y-138824000D01* +X84137500Y-138430000D02* +X86054500Y-138430000D01* +X83629500Y-138938000D02* +X84137500Y-138430000D01* +X81381000Y-138938000D02* +X83629500Y-138938000D01* +X81267000Y-138824000D02* +X81381000Y-138938000D01* +X86054500Y-137033000D02* +X85927500Y-136906000D01* +X77799500Y-151066500D02* +X77799500Y-150737000D01* +X77799500Y-150737000D02* +X78067000Y-150469500D01* +X78067000Y-150469500D02* +X78067000Y-149360000D01* +X85927500Y-136906000D02* +X85725000Y-136906000D01* +D41* +X95619000Y-135064500D02* +X95910400Y-135355900D01* +X95910400Y-135355900D02* +X95910400Y-146304000D01* +X95910400Y-146304000D02* +X94805500Y-147408900D01* +X94805500Y-147408900D02* +X94805500Y-147510500D01* +X95619000Y-135064500D02* +X95619000Y-133870500D01* +X95619000Y-133870500D02* +X95819000Y-133670500D01* +X95819000Y-133670500D02* +X95819000Y-129479000D01* +X95819000Y-129479000D02* +X96672400Y-128625600D01* +X96164400Y-125577600D02* +X96164400Y-125399800D01* +X96951800Y-126365000D02* +X96164400Y-125577600D01* +X96951800Y-127990600D02* +X96951800Y-126365000D01* +X96672400Y-128270000D02* +X96951800Y-127990600D01* +X96672400Y-128625600D02* +X96672400Y-128270000D01* +X71526400Y-148539200D02* +X71526400Y-147929600D01* +X71526400Y-148539200D02* +X71704200Y-148539200D01* +X71704200Y-148539200D02* +X73329800Y-150164800D01* +D42* +X76365100Y-151193500D02* +X76365100Y-151295100D01* +X76708000Y-151638000D02* +X76708000Y-151536400D01* +X76365100Y-151295100D02* +X76708000Y-151638000D01* +X74180700Y-151193500D02* +X74180700Y-151015700D01* +X74180700Y-151015700D02* +X73329800Y-150164800D01* +X73329800Y-150164800D02* +X73329800Y-150139400D01* +X76365100Y-151193500D02* +X74180700Y-151193500D01* +X74180700Y-151193500D02* +X74142600Y-151155400D01* +X90106500Y-150812500D02* +X89369900Y-150812500D01* +X82677000Y-151434800D02* +X82473800Y-151231600D01* +X84302600Y-151434800D02* +X82677000Y-151434800D01* +X84378800Y-151511000D02* +X84302600Y-151434800D01* +X88671400Y-151511000D02* +X84378800Y-151511000D01* +X89369900Y-150812500D02* +X88671400Y-151511000D01* +X90106500Y-149860000D02* +X90106500Y-150812500D01* +X90106500Y-150812500D02* +X89852500Y-151066500D01* +X90106500Y-149860000D02* +X91757500Y-149860000D01* +X91757500Y-149860000D02* +X94107000Y-147510500D01* +X94107000Y-147510500D02* +X94805500Y-147510500D01* +D40* +X96164400Y-125730000D02* +X96164400Y-125399800D01* +X96799400Y-126365000D02* +X96164400Y-125730000D01* +X96799400Y-127863600D02* +X96799400Y-126365000D01* +X96697800Y-127965200D02* +X96799400Y-127863600D01* +X96697800Y-128600200D02* +X96697800Y-127965200D01* +X95819000Y-129479000D02* +X96697800Y-128600200D01* +X71374000Y-146292000D02* +X71374000Y-146989800D01* +X71374000Y-146989800D02* +X71526400Y-147142200D01* +X71526400Y-147142200D02* +X71526400Y-147929600D01* +X81191800Y-151968200D02* +X82093500Y-151066500D01* +X77139800Y-151968200D02* +X81191800Y-151968200D01* +X76708000Y-151536400D02* +X77139800Y-151968200D01* +X71526400Y-148539200D02* +X74142600Y-151155400D01* +X94805500Y-147510500D02* +X94805500Y-147408900D01* +X94805500Y-147408900D02* +X95910400Y-146304000D01* +X95910400Y-146304000D02* +X95910400Y-135355900D01* +X94805500Y-147510500D02* +X94107000Y-147510500D01* +X94107000Y-147510500D02* +X91757500Y-149860000D01* +X95819000Y-133670500D02* +X95819000Y-134864500D01* +X95819000Y-134864500D02* +X95619000Y-135064500D01* +X82093500Y-151066500D02* +X89852500Y-151066500D01* +X89852500Y-151066500D02* +X90106500Y-150812500D01* +X71449500Y-146292000D02* +X71831500Y-145910000D01* +X71831500Y-145910000D02* +X73017000Y-145910000D01* +X71374000Y-146292000D02* +X71449500Y-146292000D01* +X73016000Y-145911000D02* +X73017000Y-145910000D01* +D42* +X80593500Y-151066500D02* +X79426500Y-151066500D01* +X79426500Y-151066500D02* +X79363000Y-151003000D01* +D40* +X85725000Y-135318500D02* +X85090000Y-135953500D01* +X85090000Y-135953500D02* +X85090000Y-137604500D01* +X85090000Y-137604500D02* +X84836000Y-137858500D01* +X84836000Y-137858500D02* +X83883500Y-137858500D01* +X83108800Y-140182600D02* +X82346800Y-140766800D01* +X82346800Y-140766800D02* +X82118200Y-148005800D01* +X80391000Y-151003000D02* +X80327500Y-151066500D01* +X80327500Y-151066500D02* +X79299500Y-151066500D01* +X85927500Y-135318500D02* +X85725000Y-135318500D01* +X87554500Y-138430000D02* +X87439500Y-138430000D01* +X87439500Y-138430000D02* +X86677500Y-137668000D01* +X86677500Y-137668000D02* +X86677500Y-135826500D01* +X86677500Y-135826500D02* +X86169500Y-135318500D01* +X86169500Y-135318500D02* +X85927500Y-135318500D01* +X79299500Y-151066500D02* +X79299500Y-150927500D01* +X79299500Y-150927500D02* +X78867000Y-150495000D01* +X78867000Y-150495000D02* +X78867000Y-149360000D01* +X84824000Y-124194000D02* +X83502500Y-124194000D01* +X84836000Y-124206000D02* +X84824000Y-124194000D01* +X82359500Y-123444000D02* +X81661000Y-123444000D01* +X81661000Y-123444000D02* +X79692500Y-125412500D01* +X79692500Y-125412500D02* +X77406500Y-125412500D01* +X77406500Y-125412500D02* +X76708000Y-126111000D01* +X76708000Y-126111000D02* +X75374500Y-126111000D01* +X83502500Y-124194000D02* +X83109500Y-124194000D01* +X83109500Y-124194000D02* +X82359500Y-123444000D01* +D41* +X94551500Y-136485500D02* +X94551500Y-137477500D01* +X94551500Y-137477500D02* +X94805500Y-137731500D01* +X83502500Y-122694000D02* +X86157500Y-122694000D01* +X86157500Y-122694000D02* +X87249000Y-121602500D01* +X87249000Y-121602500D02* +X90924498Y-121602500D01* +X90924498Y-121602500D02* +X90805000Y-121602500D01* +X82045000Y-122494000D02* +X83302500Y-122494000D01* +X83302500Y-122494000D02* +X83502500Y-122694000D01* +X80645000Y-123634500D02* +X80645000Y-122872500D01* +X80645000Y-122872500D02* +X81023500Y-122494000D01* +X81023500Y-122494000D02* +X82045000Y-122494000D01* +X80010000Y-124269500D02* +X80645000Y-123634500D01* +X76350500Y-124269500D02* +X77177900Y-124269500D01* +X79705200Y-124383800D02* +X79781400Y-124460000D01* +X77292200Y-124383800D02* +X79705200Y-124383800D01* +X77177900Y-124269500D02* +X77292200Y-124383800D01* +D42* +X71437500Y-128472500D02* +X71437500Y-127596900D01* +X71780400Y-127254000D02* +X72072500Y-127254000D01* +X71437500Y-127596900D02* +X71780400Y-127254000D01* +D40* +X87249000Y-121602500D02* +X90805000Y-121602500D01* +X86157500Y-122694000D02* +X87249000Y-121602500D01* +X94551500Y-137477500D02* +X94805500Y-137731500D01* +X95504000Y-123749500D02* +X95504000Y-126913000D01* +X95504000Y-126913000D02* +X95781500Y-127190500D01* +X76350500Y-124269500D02* +X80010000Y-124269500D01* +X81023500Y-122494000D02* +X82045000Y-122494000D01* +X80645000Y-122872500D02* +X81023500Y-122494000D01* +X83302500Y-122494000D02* +X83502500Y-122694000D01* +X78961000Y-130810000D02* +X77470000Y-130810000D01* +X77470000Y-130810000D02* +X76200000Y-132080000D01* +X68707000Y-133338000D02* +X66052000Y-133338000D01* +X66052000Y-133338000D02* +X66040000Y-133350000D01* +X68719000Y-130302000D02* +X68719000Y-131826000D01* +X68719000Y-131826000D02* +X68707000Y-131838000D01* +X68719000Y-130302000D02* +X66548000Y-130302000D01* +X66548000Y-130302000D02* +X66040000Y-130810000D01* +X68707000Y-130314000D02* +X68719000Y-130302000D01* +X66802000Y-130048000D02* +X66040000Y-130810000D01* +X68707000Y-136259000D02* +X68211000Y-136259000D01* +X68211000Y-136259000D02* +X66040000Y-138430000D01* +X68707000Y-136259000D02* +X68707000Y-136398000D01* +X66675000Y-138430000D02* +X66040000Y-138430000D01* +X68707000Y-134759000D02* +X69977000Y-134759000D01* +X69977000Y-134759000D02* +X70358000Y-134378000D01* +X68707000Y-134759000D02* +X67171000Y-134759000D01* +X67171000Y-134759000D02* +X66040000Y-135890000D01* +X68707000Y-134759000D02* +X68949000Y-134759000D01* +X68707000Y-134759000D02* +X68441000Y-134759000D01* +D42* +X74358500Y-127762000D02* +X74358500Y-125793500D01* +X74358500Y-125793500D02* +X73850500Y-125285500D01* +X73850500Y-125285500D02* +X73850500Y-124269500D01* +D40* +X82677000Y-130175000D02* +X82677000Y-131851400D01* +X88888000Y-142532800D02* +X88888000Y-143129000D01* +X88595200Y-142240000D02* +X88888000Y-142532800D01* +X88392000Y-142240000D02* +X88595200Y-142240000D01* +X88138000Y-141986000D02* +X88392000Y-142240000D01* +X87020400Y-141986000D02* +X88138000Y-141986000D01* +X84429600Y-136702800D02* +X84429600Y-137210800D01* +X83108800Y-135382000D02* +X84429600Y-136702800D01* +X83108800Y-134975600D02* +X83108800Y-135382000D01* +X82042000Y-133908800D02* +X83108800Y-134975600D01* +X82042000Y-132486400D02* +X82042000Y-133908800D01* +X82677000Y-131851400D02* +X82042000Y-132486400D01* +X73850500Y-125285500D02* +X73850500Y-124269500D01* +X74358500Y-125793500D02* +X73850500Y-125285500D01* +X71437500Y-129972500D02* +X71437500Y-131064000D01* +X72453500Y-132080000D02* +X73660000Y-132080000D01* +X71437500Y-131064000D02* +X72453500Y-132080000D01* +X73989500Y-124003500D02* +X73533000Y-124460000D01* +X73660000Y-132080000D02* +X72390000Y-130810000D01* +X83312000Y-130810000D02* +X84361000Y-130810000D01* +X82613500Y-130111500D02* +X82677000Y-130175000D01* +X82677000Y-130175000D02* +X83312000Y-130810000D01* +X82613500Y-128651000D02* +X82613500Y-130111500D01* +X80010000Y-126047500D02* +X82613500Y-128651000D01* +X77851000Y-126047500D02* +X80010000Y-126047500D01* +X76136500Y-127762000D02* +X77851000Y-126047500D01* +X72961500Y-127762000D02* +X74358500Y-127762000D01* +X74358500Y-127762000D02* +X76136500Y-127762000D01* +X72390000Y-128333500D02* +X72961500Y-127762000D01* +X72390000Y-130810000D02* +X72390000Y-128333500D01* +X73660000Y-132080000D02* +X73660000Y-131508500D01* +D41* +X78486000Y-121970800D02* +X78486000Y-122685000D01* +X78486000Y-122685000D02* +X79245000Y-123444000D01* +D42* +X78917800Y-122402600D02* +X78486000Y-121970800D01* +X78486000Y-121970800D02* +X79222600Y-122707400D01* +X78359000Y-122402600D02* +X78917800Y-122402600D01* +X65468500Y-125222000D02* +X66738500Y-125222000D01* +X66738500Y-125222000D02* +X68961000Y-122999500D01* +X68961000Y-122999500D02* +X69049900Y-122999500D01* +X69049900Y-122999500D02* +X69646800Y-122402600D01* +X69646800Y-122402600D02* +X78359000Y-122402600D01* +X78359000Y-122402600D02* +X78409800Y-122402600D01* +X65468500Y-125222000D02* +X65468500Y-119573040D01* +X65468500Y-119573040D02* +X65595500Y-119446040D01* +D40* +X79245000Y-123444000D02* +X78994000Y-123444000D01* +X78994000Y-123444000D02* +X78549500Y-122999500D01* +X78549500Y-122999500D02* +X68961000Y-122999500D01* +X68961000Y-122999500D02* +X66738500Y-125222000D01* +X65468500Y-119573040D02* +X65595500Y-119446040D01* +X84717000Y-147510000D02* +X85598500Y-147510000D01* +X86804500Y-145300000D02* +X87388000Y-144716500D01* +X86804500Y-146304000D02* +X86804500Y-145300000D01* +X85598500Y-147510000D02* +X86804500Y-146304000D01* +X87388000Y-143129000D02* +X87388000Y-144716500D01* +X84717000Y-146710000D02* +X83845000Y-146710000D01* +X79679800Y-144983200D02* +X79654300Y-144983200D01* +X83502500Y-145923000D02* +X83375500Y-145796000D01* +X83502500Y-146367500D02* +X83502500Y-145923000D01* +X83845000Y-146710000D02* +X83502500Y-146367500D01* +X79679800Y-144792700D02* +X79654300Y-144792700D01* +X79654300Y-144792700D02* +X79679800Y-144792700D01* +X79679800Y-144792700D02* +X79654300Y-144792700D01* +X79667000Y-149360000D02* +X79654300Y-144983200D01* +X79654300Y-144983200D02* +X79654300Y-144792700D01* +X79654300Y-144792700D02* +X79476500Y-140589100D01* +X82740500Y-127000000D02* +X84361000Y-127000000D01* +X79476500Y-140589100D02* +X79502000Y-140563600D01* +X84361000Y-128270000D02* +X84361000Y-127000000D01* +X88798400Y-140512800D02* +X89420700Y-140525500D01* +X85928000Y-145110000D02* +X84717000Y-145110000D01* +X86055200Y-145237200D02* +X85928000Y-145110000D01* +X89420700Y-140525500D02* +X89509600Y-140614400D01* +X86868000Y-140512800D02* +X87146002Y-140512800D01* +X85814000Y-144310000D02* +X84717000Y-144310000D01* +X85902800Y-144221200D02* +X85814000Y-144310000D01* +X85902800Y-144068800D02* +X85902800Y-144221200D01* +X86309200Y-143662400D02* +X85902800Y-144068800D01* +X87680800Y-141047598D02* +X87680800Y-141325600D01* +X87146002Y-140512800D02* +X87680800Y-141047598D01* +X84717000Y-143510000D02* +X83515200Y-143510000D01* +X79418200Y-131622800D02* +X78961000Y-132080000D01* +X80111600Y-131622800D02* +X79418200Y-131622800D01* +X80365600Y-131876800D02* +X80111600Y-131622800D01* +X83515200Y-143510000D02* +X83413600Y-143611600D01* +X78961000Y-129540000D02* +X79908400Y-129540000D01* +X79908400Y-129540000D02* +X80264000Y-129895600D01* +X80264000Y-129895600D02* +X80264000Y-130759200D01* +X80264000Y-130759200D02* +X81026000Y-131521200D01* +X81026000Y-131521200D02* +X81026000Y-134162800D01* +X81026000Y-134162800D02* +X81838800Y-134975600D01* +X83058000Y-141071600D02* +X83528000Y-142710000D01* +X83528000Y-142710000D02* +X84717000Y-142710000D01* +X80467000Y-137660000D02* +X80467000Y-139141000D01* +X80836000Y-139510000D02* +X84717000Y-139510000D01* +X80467000Y-139141000D02* +X80836000Y-139510000D01* +X82867000Y-136462000D02* +X82867000Y-137660000D01* +X82931000Y-136398000D02* +X82867000Y-136462000D01* +X91313000Y-136017000D02* +X90805000Y-135509000D01* +X91313000Y-136144000D02* +X91313000Y-136017000D01* +X78867000Y-137660000D02* +X78867000Y-136652000D01* +X88582500Y-137414000D02* +X89281000Y-137414000D01* +X88582500Y-135636000D02* +X88582500Y-137414000D01* +X88455500Y-135509000D02* +X88582500Y-135636000D01* +X81724500Y-136334500D02* +X82423000Y-135636000D01* +X79184500Y-136334500D02* +X81724500Y-136334500D01* +X78867000Y-136652000D02* +X79184500Y-136334500D01* +X78867000Y-137660000D02* +X78867000Y-136906000D01* +X73017000Y-140310000D02* +X73913600Y-140310000D01* +X81280000Y-125159000D02* +X82045000Y-124394000D01* +X81280000Y-125425200D02* +X81280000Y-125159000D01* +X81178400Y-125526800D02* +X81280000Y-125425200D01* +X73913600Y-140310000D02* +X74879200Y-139344400D01* +X90757400Y-123228540D02* +X90757400Y-124094900D01* +X74981000Y-141910000D02* +X73017000Y-141910000D01* +X75184000Y-142113000D02* +X74981000Y-141910000D01* +X90757400Y-124094900D02* +X91376500Y-124714000D01* +X73017000Y-142710000D02* +X74384000Y-142710000D01* +X90107400Y-124522600D02* +X90107400Y-123228540D01* +X90017600Y-124612400D02* +X90107400Y-124522600D01* +X81127600Y-144170400D02* +X80873600Y-141655800D01* +X81229200Y-144272000D02* +X81127600Y-144170400D01* +X75387200Y-143713200D02* +X78943200Y-143713200D01* +X74384000Y-142710000D02* +X75387200Y-143713200D01* +X73017000Y-143510000D02* +X72136000Y-143510000D01* +X72136000Y-143510000D02* +X71818500Y-143192500D01* +X71818500Y-143192500D02* +X71818500Y-141287500D01* +X71818500Y-141287500D02* +X71068500Y-140537500D01* +X71068500Y-140537500D02* +X69749100Y-140537500D01* +X69749100Y-140537500D02* +X69748400Y-140536800D01* +X71068500Y-140537500D02* +X70231000Y-140537500D01* +X71818500Y-141287500D02* +X71068500Y-140537500D01* +X71818500Y-143192500D02* +X71818500Y-141287500D01* +X72136000Y-143510000D02* +X71818500Y-143192500D01* +X70040500Y-143141000D02* +X70941500Y-143141000D01* +X70941500Y-143141000D02* +X72110500Y-144310000D01* +X72110500Y-144310000D02* +X73017000Y-144310000D01* +X70231000Y-143141000D02* +X70624000Y-143141000D01* +X69786500Y-145744500D02* +X69786500Y-146367500D01* +X74244200Y-146532600D02* +X73169000Y-146558000D01* +X74345800Y-146761200D02* +X74244200Y-146532600D01* +X70548500Y-146875500D02* +X70815200Y-147320000D01* +X70548500Y-146685000D02* +X70548500Y-146875500D01* +X70358000Y-146494500D02* +X70548500Y-146685000D01* +X69913500Y-146494500D02* +X70358000Y-146494500D01* +X69786500Y-146367500D02* +X69913500Y-146494500D01* +X73169000Y-146558000D02* +X73017000Y-146710000D01* +X72992000Y-146685000D02* +X73017000Y-146710000D01* +X70231000Y-148348000D02* +X70231000Y-148691600D01* +X73017000Y-148302600D02* +X73017000Y-147510000D01* +X73126600Y-148412200D02* +X73017000Y-148302600D01* +X71678800Y-149529800D02* +X71678800Y-149783800D01* +X71272400Y-149123400D02* +X71678800Y-149529800D01* +X70662800Y-149123400D02* +X71272400Y-149123400D01* +X70231000Y-148691600D02* +X70662800Y-149123400D01* +X74867000Y-149360000D02* +X74867000Y-147573500D01* +X85344000Y-149860000D02* +X87566500Y-149860000D01* +X83502500Y-148018500D02* +X85344000Y-149860000D01* +X83502500Y-147066000D02* +X83502500Y-148018500D01* +X82867500Y-146431000D02* +X83502500Y-147066000D01* +X76009500Y-146431000D02* +X78943200Y-145719800D01* +X74867000Y-147573500D02* +X76009500Y-146431000D01* +X75667000Y-149360000D02* +X75667000Y-147853000D01* +X75667000Y-147853000D02* +X78536800Y-146634200D01* +X84361000Y-133350000D02* +X82994500Y-133350000D01* +X81267000Y-148005500D02* +X81267000Y-149360000D01* +X80454500Y-147193000D02* +X81267000Y-148005500D01* +X80200500Y-141236700D02* +X80454500Y-147193000D01* +X80137000Y-141173200D02* +X80200500Y-141236700D01* +X84361000Y-133350000D02* +X84361000Y-134620000D01* +X82867000Y-149360000D02* +X82867000Y-150329400D01* +X94030800Y-142595600D02* +X94030800Y-141808200D01* +X92252800Y-144373600D02* +X94030800Y-142595600D01* +X84099400Y-150291800D02* +X84404200Y-149987000D01* +X82904600Y-150291800D02* +X84099400Y-150291800D01* +X82867000Y-150329400D02* +X82904600Y-150291800D01* +X87427500Y-135624000D02* +X87427500Y-135318500D01* +X87427500Y-133731000D02* +X87058500Y-133731000D01* +X86741000Y-126238000D02* +X87185500Y-125793500D01* +X87058500Y-133731000D02* +X86741000Y-133413500D01* +X87185500Y-125793500D02* +X87427500Y-125793500D01* +X87427500Y-135318500D02* +X87427500Y-136906000D01* +X87427500Y-135318500D02* +X87427500Y-133731000D01* +X68643500Y-148348000D02* +X66282000Y-148348000D01* +X66282000Y-148348000D02* +X66040000Y-148590000D01* +X66040000Y-146050000D02* +X68147500Y-146050000D01* +X68147500Y-146050000D02* +X68453000Y-145744500D01* +X66345500Y-145744500D02* +X66040000Y-146050000D01* +X68453000Y-143141000D02* +X66409000Y-143141000D01* +X66409000Y-143141000D02* +X66040000Y-143510000D01* +X66409000Y-143141000D02* +X66040000Y-143510000D01* +X67970400Y-140536800D02* +X66473200Y-140536800D01* +X66473200Y-140536800D02* +X66040000Y-140970000D01* +X66472500Y-140537500D02* +X66040000Y-140970000D01* +X66472500Y-140537500D02* +X66040000Y-140970000D01* +X89585800Y-136779000D02* +X89281000Y-136779000D01* +X89966800Y-137160000D02* +X89585800Y-136779000D01* +X89966800Y-137668000D02* +X89966800Y-137160000D01* +X90373200Y-138074400D02* +X89966800Y-137668000D01* +X91249500Y-142113000D02* +X90805000Y-142113000D01* +X91249500Y-142113000D02* +X90741500Y-142113000D01* +X91313000Y-136779000D02* +X91821000Y-136779000D01* +X91948000Y-136906000D02* +X91948000Y-138874500D01* +X91821000Y-136779000D02* +X91948000Y-136906000D01* +X91948000Y-138874500D02* +X91249500Y-139573000D01* +X85927500Y-133731000D02* +X85927500Y-132080000D01* +X85927500Y-132080000D02* +X84361000Y-132080000D01* +X85927500Y-125793500D02* +X82740500Y-125793500D01* +X83312000Y-129540000D02* +X84361000Y-129540000D01* +X83127002Y-129355002D02* +X83312000Y-129540000D01* +X83127002Y-128339002D02* +X83127002Y-129355002D01* +X82042000Y-127254000D02* +X83127002Y-128339002D01* +X82042000Y-126492000D02* +X82042000Y-127254000D01* +X82740500Y-125793500D02* +X82042000Y-126492000D01* +X85927500Y-127381000D02* +X85927500Y-125793500D01* +X84424500Y-129476500D02* +X84361000Y-129540000D01* +X67970400Y-142036800D02* +X69748400Y-142036800D01* +X68453000Y-144641000D02* +X70040500Y-144641000D01* +X68453000Y-147244500D02* +X69786500Y-147244500D01* +X68643500Y-149848000D02* +X70231000Y-149848000D01* +X78961000Y-128270000D02* +X80010000Y-128270000D01* +X80010000Y-128270000D02* +X80467200Y-128727200D01* +X71616000Y-138938000D02* +X71501000Y-138938000D01* +X71501000Y-138938000D02* +X70675500Y-138112500D01* +X69266500Y-138112500D02* +X68707000Y-137553000D01* +X70675500Y-138112500D02* +X69266500Y-138112500D01* +X71616000Y-140093000D02* +X71616000Y-138938000D01* +X71564500Y-140144500D02* +X71616000Y-140093000D01* +X72961500Y-137045000D02* +X74029000Y-137045000D01* +X74029000Y-137045000D02* +X74041000Y-137033000D01* +X79024500Y-128333500D02* +X78961000Y-128270000D01* +X86868000Y-141147800D02* +X86690200Y-141147800D01* +X86690200Y-141147800D02* +X86131400Y-141706600D01* +X86131400Y-141706600D02* +X86131400Y-142367000D01* +X81635600Y-141376400D02* +X80594200Y-140335000D01* +X80594200Y-140335000D02* +X80416400Y-140335000D01* +X80416400Y-140335000D02* +X79984600Y-139903200D01* +X79984600Y-139903200D02* +X78867000Y-139903200D01* +X78867000Y-139903200D02* +X76936600Y-141833600D01* +X76936600Y-141833600D02* +X76936600Y-142951200D01* +X76301600Y-144678400D02* +X76047600Y-144932400D01* +X76047600Y-144932400D02* +X74726800Y-144932400D01* +X71145400Y-141630400D02* +X70789800Y-141274800D01* +X70789800Y-141274800D02* +X69088000Y-141274800D01* +X69088000Y-141274800D02* +X68884800Y-141071600D01* +X68884800Y-141071600D02* +X68884800Y-140004800D01* +X68884800Y-140004800D02* +X69469000Y-139420600D01* +X69469000Y-139420600D02* +X69469000Y-138938000D01* +X70116000Y-138938000D02* +X69469000Y-138938000D01* +X69469000Y-138938000D02* +X68822000Y-138938000D01* +X68822000Y-138938000D02* +X68707000Y-139053000D01* +X76708000Y-135878000D02* +X79704500Y-135878000D01* +X80073500Y-133350000D02* +X78961000Y-133350000D01* +X80264000Y-133540500D02* +X80073500Y-133350000D01* +X80264000Y-135318500D02* +X80264000Y-133540500D01* +X79704500Y-135878000D02* +X80264000Y-135318500D01* +X75057000Y-135878000D02* +X76708000Y-135878000D01* +X73406000Y-135878000D02* +X75057000Y-135878000D01* +X74981500Y-134378000D02* +X74358500Y-135001000D01* +X88201500Y-139890500D02* +X88849200Y-139903200D01* +X88188800Y-139954000D02* +X88201500Y-139890500D01* +X88239600Y-140208000D02* +X88239600Y-139954000D01* +X88239600Y-139954000D02* +X88239600Y-140208000D01* +X74358500Y-135001000D02* +X71818500Y-135001000D01* +X76708000Y-134378000D02* +X74981500Y-134378000D01* +X75057000Y-134378000D02* +X76708000Y-134378000D01* +X78961000Y-134620000D02* +X78549500Y-134620000D01* +X78549500Y-134620000D02* +X77533500Y-133604000D01* +X77533500Y-133604000D02* +X74180000Y-133604000D01* +X74180000Y-133604000D02* +X73406000Y-134378000D01* +X70358000Y-133211000D02* +X70854000Y-133211000D01* +X72021000Y-134378000D02* +X73406000Y-134378000D01* +X70854000Y-133211000D02* +X72021000Y-134378000D01* +X73406000Y-134378000D02* +X73013000Y-134378000D01* +X78961000Y-127000000D02* +X79857600Y-127000000D01* +X71616000Y-136156000D02* +X71616000Y-137287000D01* +X71831200Y-135940800D02* +X71616000Y-136156000D01* +X79857600Y-127000000D02* +X80213200Y-127355600D01* +X71616000Y-137287000D02* +X71616000Y-137783000D01* +X71616000Y-137783000D02* +X72378000Y-138545000D01* +X72378000Y-138545000D02* +X72961500Y-138545000D01* +X79024500Y-127063500D02* +X78961000Y-127000000D01* +X70358000Y-131711000D02* +X70358000Y-130441000D01* +X70358000Y-130441000D02* +X70219000Y-130302000D01* +X70358000Y-130441000D02* +X70219000Y-130302000D01* +X70116000Y-137287000D02* +X70116000Y-136120000D01* +X70116000Y-136120000D02* +X70358000Y-135878000D01* +M02* diff --git a/PCB/OUTPUT_V3/Tinylab_proto1-F_Mask.gbr b/PCB/OUTPUT_V3/Tinylab_proto1-F_Mask.gbr new file mode 100644 index 00000000..011397c1 --- /dev/null +++ b/PCB/OUTPUT_V3/Tinylab_proto1-F_Mask.gbr @@ -0,0 +1,290 @@ +G04 #@! TF.FileFunction,Soldermask,Top* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 02/02/2016 11:58:15 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,0.800000X0.750000*% +%ADD12R,0.750000X0.800000*% +%ADD13R,1.300000X1.300000*% +%ADD14C,1.300000*% +%ADD15C,1.998980*% +%ADD16R,1.998980X1.998980*% +%ADD17R,1.600000X1.000000*% +%ADD18R,1.600000X0.560000*% +%ADD19R,0.560000X1.600000*% +%ADD20R,1.905000X1.905000*% +%ADD21C,1.905000*% +%ADD22R,2.032000X1.727200*% +%ADD23O,2.032000X1.727200*% +%ADD24R,0.400000X1.350000*% +%ADD25O,1.250000X0.950000*% +%ADD26O,1.000000X1.550000*% +%ADD27R,1.727200X1.727200*% +%ADD28O,1.727200X1.727200*% +%ADD29R,1.727200X2.032000*% +%ADD30O,1.727200X2.032000*% +%ADD31R,2.032000X2.032000*% +%ADD32O,2.032000X2.032000*% +%ADD33R,0.900000X0.600000*% +%ADD34R,0.500000X0.900000*% +%ADD35R,0.900000X0.500000*% +%ADD36R,0.600000X0.900000*% +%ADD37R,1.500000X0.600000*% +%ADD38R,0.508000X0.304800*% +G04 APERTURE END LIST* +D10* +D11* +X86054500Y-130492500D03* +X87554500Y-130492500D03* +X86054500Y-128968500D03* +X87554500Y-128968500D03* +D12* +X92519500Y-130885500D03* +X92519500Y-132385500D03* +D11* +X95619000Y-135064500D03* +X94119000Y-135064500D03* +X87554500Y-138430000D03* +X86054500Y-138430000D03* +D13* +X94805500Y-147510500D03* +D14* +X94805500Y-145010500D03* +D11* +X79363000Y-151003000D03* +X77863000Y-151003000D03* +D13* +X93281500Y-127190500D03* +D14* +X95781500Y-127190500D03* +D12* +X83502500Y-124194000D03* +X83502500Y-122694000D03* +X71374000Y-146292000D03* +X71374000Y-144792000D03* +X95504000Y-122249500D03* +X95504000Y-123749500D03* +X68707000Y-133338000D03* +X68707000Y-131838000D03* +X68707000Y-136259000D03* +X68707000Y-134759000D03* +D14* +X76350500Y-124269500D03* +D13* +X73850500Y-124269500D03* +D12* +X71437500Y-129972500D03* +X71437500Y-128472500D03* +D15* +X65595500Y-119446040D03* +D16* +X75755500Y-119446040D03* +D17* +X94551500Y-139485500D03* +X94551500Y-136485500D03* +D18* +X84717000Y-147510000D03* +X84717000Y-146710000D03* +X84717000Y-145910000D03* +X84717000Y-145110000D03* +X84717000Y-144310000D03* +X84717000Y-143510000D03* +X84717000Y-142710000D03* +X84717000Y-141910000D03* +X84717000Y-141110000D03* +X84717000Y-140310000D03* +X84717000Y-139510000D03* +D19* +X82867000Y-137660000D03* +X82067000Y-137660000D03* +X81267000Y-137660000D03* +X80467000Y-137660000D03* +X79667000Y-137660000D03* +X78867000Y-137660000D03* +X78067000Y-137660000D03* +X77267000Y-137660000D03* +X76467000Y-137660000D03* +X75667000Y-137660000D03* +X74867000Y-137660000D03* +D18* +X73017000Y-139510000D03* +X73017000Y-140310000D03* +X73017000Y-141110000D03* +X73017000Y-141910000D03* +X73017000Y-142710000D03* +X73017000Y-143510000D03* +X73017000Y-144310000D03* +X73017000Y-145110000D03* +X73017000Y-145910000D03* +X73017000Y-146710000D03* +X73017000Y-147510000D03* +D19* +X74867000Y-149360000D03* +X75667000Y-149360000D03* +X76467000Y-149360000D03* +X77267000Y-149360000D03* +X78067000Y-149360000D03* +X78867000Y-149360000D03* +X79667000Y-149360000D03* +X80467000Y-149360000D03* +X81267000Y-149360000D03* +X82067000Y-149360000D03* +X82867000Y-149360000D03* +D20* +X65468500Y-125222000D03* +D21* +X70548500Y-125222000D03* +D22* +X90043000Y-126301500D03* +D23* +X90043000Y-128841500D03* +X90043000Y-131381500D03* +X90043000Y-133921500D03* +D24* +X91407400Y-123228540D03* +X90757400Y-123228540D03* +X90107400Y-123228540D03* +X89457400Y-123228540D03* +X88807400Y-123228540D03* +D25* +X92607400Y-123228540D03* +X87607400Y-123228540D03* +D26* +X93607400Y-120528540D03* +X86607400Y-120528540D03* +D22* +X66040000Y-148590000D03* +D23* +X66040000Y-146050000D03* +X66040000Y-143510000D03* +X66040000Y-140970000D03* +D27* +X90106500Y-149860000D03* +D28* +X87566500Y-149860000D03* +X90106500Y-147320000D03* +X87566500Y-147320000D03* +D29* +X83693000Y-119380000D03* +D30* +X81153000Y-119380000D03* +X78613000Y-119380000D03* +D22* +X66040000Y-130810000D03* +D23* +X66040000Y-133350000D03* +X66040000Y-135890000D03* +X66040000Y-138430000D03* +D27* +X73660000Y-132080000D03* +D28* +X73660000Y-129540000D03* +X76200000Y-132080000D03* +X76200000Y-129540000D03* +D31* +X91249500Y-142113000D03* +D32* +X91249500Y-139573000D03* +D33* +X79245000Y-123444000D03* +X82045000Y-122494000D03* +X82045000Y-124394000D03* +D34* +X85927500Y-132080000D03* +X87427500Y-132080000D03* +X85927500Y-127381000D03* +X87427500Y-127381000D03* +X85927500Y-133731000D03* +X87427500Y-133731000D03* +X87427500Y-125793500D03* +X85927500Y-125793500D03* +X85927500Y-135318500D03* +X87427500Y-135318500D03* +X85927500Y-136906000D03* +X87427500Y-136906000D03* +D35* +X67970400Y-142036800D03* +X67970400Y-140536800D03* +X68453000Y-144641000D03* +X68453000Y-143141000D03* +X68453000Y-147244500D03* +X68453000Y-145744500D03* +X68643500Y-149848000D03* +X68643500Y-148348000D03* +X69748400Y-140536800D03* +X69748400Y-142036800D03* +X70040500Y-143141000D03* +X70040500Y-144641000D03* +X69786500Y-145744500D03* +X69786500Y-147244500D03* +X70231000Y-148348000D03* +X70231000Y-149848000D03* +X68707000Y-137553000D03* +X68707000Y-139053000D03* +D34* +X71616000Y-138938000D03* +X70116000Y-138938000D03* +D35* +X75057000Y-135878000D03* +X75057000Y-134378000D03* +X76708000Y-135878000D03* +X76708000Y-134378000D03* +X73406000Y-134378000D03* +X73406000Y-135878000D03* +X72961500Y-138545000D03* +X72961500Y-137045000D03* +D34* +X82093500Y-151066500D03* +X80593500Y-151066500D03* +D35* +X70358000Y-131711000D03* +X70358000Y-133211000D03* +D34* +X70116000Y-137287000D03* +X71616000Y-137287000D03* +X68719000Y-130302000D03* +X70219000Y-130302000D03* +D35* +X70358000Y-134378000D03* +X70358000Y-135878000D03* +D34* +X88888000Y-143129000D03* +X87388000Y-143129000D03* +X87388000Y-144716500D03* +X88888000Y-144716500D03* +D36* +X94869000Y-130870500D03* +X95819000Y-133670500D03* +X93919000Y-133670500D03* +D37* +X84361000Y-134620000D03* +X84361000Y-133350000D03* +X84361000Y-132080000D03* +X84361000Y-130810000D03* +X84361000Y-129540000D03* +X84361000Y-128270000D03* +X84361000Y-127000000D03* +X78961000Y-127000000D03* +X78961000Y-128270000D03* +X78961000Y-129540000D03* +X78961000Y-130810000D03* +X78961000Y-132080000D03* +X78961000Y-133350000D03* +X78961000Y-134620000D03* +D38* +X88900000Y-141147800D03* +X88900000Y-139877800D03* +X86868000Y-141147800D03* +X88900000Y-140512800D03* +X86868000Y-139877800D03* +X86868000Y-140512800D03* +X91313000Y-137414000D03* +X91313000Y-136144000D03* +X89281000Y-137414000D03* +X91313000Y-136779000D03* +X89281000Y-136144000D03* +X89281000Y-136779000D03* +M02* diff --git a/PCB/OUTPUT_V3/Tinylab_proto1.drl b/PCB/OUTPUT_V3/Tinylab_proto1.drl new file mode 100644 index 00000000..2c0f4e56 --- /dev/null +++ b/PCB/OUTPUT_V3/Tinylab_proto1.drl @@ -0,0 +1,140 @@ +M48 +;DRILL file {KiCad (2015-08-05 BZR 6055, Git fa29c62)-product} date 02/02/2016 11:58:21 AM +;FORMAT={2:4/ absolute / inch / keep zeros} +FMAT,2 +INCH,TZ +T1C0.016 +T2C0.020 +T3C0.022 +T4C0.031 +T5C0.032 +T6C0.039 +T7C0.040 +T8C0.050 +% +G90 +G05 +M72 +T1 +X027880Y-058000 +X028010Y-055760 +X028175Y-055175 +X028220Y-058970 +X028275Y-053150 +X028280Y-053520 +X028375Y-050100 +X028790Y-058430 +X029150Y-053950 +X029270Y-057780 +X029420Y-057060 +X029480Y-054860 +X029600Y-055950 +X029675Y-049650 +X030040Y-056960 +X030290Y-056280 +X030380Y-057250 +X030730Y-058150 +X030920Y-057730 +X031080Y-056580 +X031080Y-057370 +X031300Y-055340 +X031370Y-057080 +X031550Y-055580 +X031580Y-050140 +X031640Y-051920 +X031650Y-059450 +X031680Y-050680 +X031840Y-055770 +X031960Y-049420 +X031980Y-056800 +X032140Y-055660 +X032220Y-053140 +X032330Y-058270 +X032425Y-048600 +X032450Y-053400 +X032575Y-050000 +X032625Y-057650 +X032650Y-053700 +X032675Y-052500 +X032700Y-055540 +X032720Y-055190 +X032825Y-057400 +X032840Y-056540 +X033025Y-054275 +X033230Y-059050 +X033240Y-054020 +X033400Y-048900 +X033880Y-057180 +X033910Y-056050 +X033980Y-056560 +X034150Y-049700 +X034150Y-052525 +X034260Y-055900 +X034520Y-055640 +X034720Y-055100 +X034825Y-053350 +X035060Y-054520 +X035240Y-055360 +X035440Y-049060 +X035580Y-054360 +X035650Y-053675 +X035750Y-047875 +X035750Y-053350 +X035975Y-049100 +X036320Y-056840 +X036450Y-053725 +X037020Y-055830 +X037325Y-054225 +X037860Y-049370 +T4 +X029075Y-048925 +X030059Y-048925 +X036725Y-050075 +X037325Y-057091 +X037325Y-058075 +X037709Y-050075 +T5 +X025775Y-049300 +X027775Y-049300 +T6 +X029825Y-047026 +T7 +X026000Y-051500 +X026000Y-052500 +X026000Y-053500 +X026000Y-054500 +X026000Y-055500 +X026000Y-056500 +X026000Y-057500 +X026000Y-058500 +X029000Y-051000 +X029000Y-052000 +X030000Y-051000 +X030000Y-052000 +X030950Y-047000 +X031950Y-047000 +X032950Y-047000 +X034475Y-058000 +X034475Y-059000 +X035450Y-049725 +X035450Y-050725 +X035450Y-051725 +X035450Y-052725 +X035475Y-058000 +X035475Y-059000 +X035925Y-054950 +X035925Y-055950 +T8 +X025825Y-047026 +T2 +X034097Y-047324G85X034097Y-047580 +G05 +X036853Y-047324G85X036853Y-047580 +G05 +T3 +X034550Y-048515G85X034432Y-048515 +G05 +X036519Y-048515G85X036401Y-048515 +G05 +T0 +M30 diff --git a/PCB/OUTPUT_V35/Tinylab_proto1-B_Cu.gbr b/PCB/OUTPUT_V35/Tinylab_proto1-B_Cu.gbr new file mode 100644 index 00000000..d89619c3 --- /dev/null +++ b/PCB/OUTPUT_V35/Tinylab_proto1-B_Cu.gbr @@ -0,0 +1,631 @@ +G04 #@! TF.FileFunction,Copper,L2,Bot,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 02/02/2016 11:58:07 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,1.300000X1.300000*% +%ADD12C,1.300000*% +%ADD13C,1.998980*% +%ADD14R,1.998980X1.998980*% +%ADD15R,1.905000X1.905000*% +%ADD16C,1.905000*% +%ADD17R,2.032000X1.727200*% +%ADD18O,2.032000X1.727200*% +%ADD19O,1.250000X0.950000*% +%ADD20O,1.000000X1.550000*% +%ADD21R,1.727200X1.727200*% +%ADD22O,1.727200X1.727200*% +%ADD23R,1.727200X2.032000*% +%ADD24O,1.727200X2.032000*% +%ADD25R,2.032000X2.032000*% +%ADD26O,2.032000X2.032000*% +%ADD27C,0.600000*% +%ADD28C,0.508000*% +%ADD29C,0.250000*% +%ADD30C,1.016000*% +G04 APERTURE END LIST* +D10* +D11* +X94805500Y-147510500D03* +D12* +X94805500Y-145010500D03* +D11* +X93281500Y-127190500D03* +D12* +X95781500Y-127190500D03* +X76350500Y-124269500D03* +D11* +X73850500Y-124269500D03* +D13* +X65595500Y-119446040D03* +D14* +X75755500Y-119446040D03* +D15* +X65468500Y-125222000D03* +D16* +X70548500Y-125222000D03* +D17* +X90043000Y-126301500D03* +D18* +X90043000Y-128841500D03* +X90043000Y-131381500D03* +X90043000Y-133921500D03* +D19* +X92607400Y-123228540D03* +X87607400Y-123228540D03* +D20* +X93607400Y-120528540D03* +X86607400Y-120528540D03* +D17* +X66040000Y-148590000D03* +D18* +X66040000Y-146050000D03* +X66040000Y-143510000D03* +X66040000Y-140970000D03* +D21* +X90106500Y-149860000D03* +D22* +X87566500Y-149860000D03* +X90106500Y-147320000D03* +X87566500Y-147320000D03* +D23* +X83693000Y-119380000D03* +D24* +X81153000Y-119380000D03* +X78613000Y-119380000D03* +D17* +X66040000Y-130810000D03* +D18* +X66040000Y-133350000D03* +X66040000Y-135890000D03* +X66040000Y-138430000D03* +D21* +X73660000Y-132080000D03* +D22* +X73660000Y-129540000D03* +X76200000Y-132080000D03* +X76200000Y-129540000D03* +D25* +X91249500Y-142113000D03* +D26* +X91249500Y-139573000D03* +D27* +X78054200Y-147701000D03* +X77165200Y-145415000D03* +X89052400Y-138480800D03* +X90551000Y-136334500D03* +X92583000Y-136461500D03* +X96164400Y-125399800D03* +X83883500Y-137858500D03* +X83108800Y-140182600D03* +X82118200Y-148005800D03* +X80391000Y-151003000D03* +X84836000Y-124206000D03* +X75374500Y-126111000D03* +X82359500Y-123444000D03* +X90805000Y-121602500D03* +X94805500Y-137731500D03* +X72072500Y-127254000D03* +X87020400Y-141986000D03* +X84429600Y-137210800D03* +X79679800Y-144983200D03* +X83375500Y-145796000D03* +X82740500Y-127000000D03* +X79502000Y-140563600D03* +X86055200Y-145237200D03* +X89509600Y-140614400D03* +X86309200Y-143662400D03* +X87680800Y-141325600D03* +X80365600Y-131876800D03* +X83413600Y-143611600D03* +X81838800Y-134975600D03* +X83058000Y-141071600D03* +X82931000Y-136398000D03* +X90805000Y-135509000D03* +X88455500Y-135509000D03* +X82423000Y-135636000D03* +X81178400Y-125526800D03* +X74879200Y-139344400D03* +X75184000Y-142113000D03* +X91376500Y-124714000D03* +X90017600Y-124612400D03* +X80873600Y-141655800D03* +X81229200Y-144272000D03* +X78943200Y-143713200D03* +X74345800Y-146761200D03* +X70815200Y-147320000D03* +X73126600Y-148412200D03* +X71678800Y-149783800D03* +X82867500Y-146431000D03* +X78943200Y-145719800D03* +X78536800Y-146634200D03* +X80137000Y-141173200D03* +X82994500Y-133350000D03* +X94030800Y-141808200D03* +X92252800Y-144373600D03* +X84404200Y-149987000D03* +X86741000Y-126238000D03* +X86741000Y-133413500D03* +X90373200Y-138074400D03* +X80467200Y-128727200D03* +X71564500Y-140144500D03* +X74041000Y-137033000D03* +X86131400Y-142367000D03* +X81635600Y-141376400D03* +X76936600Y-142951200D03* +X76301600Y-144678400D03* +X74726800Y-144932400D03* +X71145400Y-141630400D03* +X88188800Y-139954000D03* +X71818500Y-135001000D03* +X71831200Y-135940800D03* +X80213200Y-127355600D03* +D28* +X89052400Y-138480800D02* +X89052400Y-138176000D01* +X89966800Y-137261600D02* +X89966800Y-136918700D01* +X89052400Y-138176000D02* +X89966800Y-137261600D01* +X89966800Y-136918700D02* +X90551000Y-136334500D01* +X92583000Y-136461500D02* +X90678000Y-136461500D01* +X90678000Y-136461500D02* +X90551000Y-136334500D01* +D29* +X77800200Y-147447000D02* +X78054200Y-147701000D01* +X77800200Y-145770600D02* +X77800200Y-147447000D01* +X77317600Y-145288000D02* +X77800200Y-145770600D01* +X77292200Y-145288000D02* +X77317600Y-145288000D01* +X77165200Y-145415000D02* +X77292200Y-145288000D01* +X89966800Y-136918700D02* +X90551000Y-136334500D01* +X90551000Y-136334500D02* +X90678000Y-136461500D01* +D28* +X93878400Y-118999000D02* +X94310200Y-118999000D01* +X96164400Y-125247400D02* +X96164400Y-125399800D01* +X95250000Y-124333000D02* +X96164400Y-125247400D01* +X95250000Y-120345200D02* +X95250000Y-124333000D01* +X94894400Y-119989600D02* +X95250000Y-120345200D01* +X94894400Y-119583200D02* +X94894400Y-119989600D01* +X94310200Y-118999000D02* +X94894400Y-119583200D01* +X93878400Y-118999000D02* +X86309200Y-118999000D01* +X85293200Y-118059200D02* +X85115400Y-117881400D01* +X85394800Y-118160800D02* +X85293200Y-118059200D01* +X85471000Y-118160800D02* +X85394800Y-118160800D01* +X86309200Y-118999000D02* +X85471000Y-118160800D01* +X85115400Y-117881400D02* +X85445600Y-118211600D01* +D29* +X80111600Y-117881400D02* +X78613000Y-119380000D01* +X85115400Y-117881400D02* +X80111600Y-117881400D01* +X86233000Y-118999000D02* +X85445600Y-118211600D01* +X85445600Y-118211600D02* +X85115400Y-117881400D01* +X93878400Y-118999000D02* +X86233000Y-118999000D01* +X83883500Y-137858500D02* +X83388200Y-138938000D01* +X83388200Y-138938000D02* +X83108800Y-140182600D01* +X82118200Y-148005800D02* +X82169000Y-149796500D01* +X82169000Y-149796500D02* +X80962500Y-151003000D01* +X80962500Y-151003000D02* +X80391000Y-151003000D01* +D30* +X70548500Y-125222000D02* +X71310500Y-125984000D01* +X81153000Y-119380000D02* +X81153000Y-122377200D01* +X82219800Y-123444000D02* +X82359500Y-123444000D01* +X81153000Y-122377200D02* +X82219800Y-123444000D01* +D29* +X93281500Y-127190500D02* +X93281500Y-124206000D01* +X85979000Y-124206000D02* +X84836000Y-124206000D01* +X86487000Y-123698000D02* +X85979000Y-124206000D01* +X86487000Y-122872500D02* +X86487000Y-123698000D01* +X87058500Y-122301000D02* +X86487000Y-122872500D01* +X93091000Y-122301000D02* +X87058500Y-122301000D01* +X93662500Y-122872500D02* +X93091000Y-122301000D01* +X93662500Y-123825000D02* +X93662500Y-122872500D01* +X93281500Y-124206000D02* +X93662500Y-123825000D01* +X75374500Y-126111000D02* +X75247500Y-125984000D01* +X75247500Y-125984000D02* +X71310500Y-125984000D01* +D28* +X94195900Y-126072900D02* +X94195900Y-124498100D01* +X94195900Y-124498100D02* +X94170500Y-124472700D01* +X95781500Y-127190500D02* +X95313500Y-127190500D01* +X95313500Y-127190500D02* +X94195900Y-126072900D01* +X94195900Y-126072900D02* +X94170500Y-126047500D01* +X90805000Y-121602500D02* +X92646500Y-121602500D01* +X92646500Y-121602500D02* +X92684600Y-121640600D01* +D30* +X73660000Y-129540000D02* +X73660000Y-127508000D01* +X73660000Y-127508000D02* +X73406000Y-127254000D01* +X73406000Y-127254000D02* +X72072500Y-127254000D01* +X76200000Y-129540000D02* +X73660000Y-129540000D01* +X76200000Y-132080000D02* +X76200000Y-129540000D01* +X76200000Y-129540000D02* +X76200000Y-128498600D01* +X76200000Y-128498600D02* +X76657200Y-128041400D01* +X76657200Y-128041400D02* +X76657200Y-124576200D01* +X76657200Y-124576200D02* +X76350500Y-124269500D01* +D29* +X94170500Y-126047500D02* +X95313500Y-127190500D01* +X94170500Y-122618500D02* +X94170500Y-124472700D01* +X90805000Y-121602500D02* +X90995500Y-121793000D01* +X90995500Y-121793000D02* +X93345000Y-121793000D01* +X93345000Y-121793000D02* +X94170500Y-122618500D01* +X94170500Y-124472700D02* +X94170500Y-126047500D01* +X95885000Y-137160000D02* +X95885000Y-127294000D01* +X95313500Y-137731500D02* +X95885000Y-137160000D01* +X94805500Y-137731500D02* +X95313500Y-137731500D01* +X95885000Y-127294000D02* +X95781500Y-127190500D01* +X72072500Y-127254000D02* +X72136000Y-127190500D01* +X73342500Y-127190500D02* +X73660000Y-127508000D01* +X72136000Y-127190500D02* +X73342500Y-127190500D01* +X76200000Y-129540000D02* +X76200000Y-124420000D01* +X76200000Y-124420000D02* +X76350500Y-124269500D01* +X76033000Y-129373000D02* +X76200000Y-129540000D01* +D30* +X73850500Y-124269500D02* +X73850500Y-123634500D01* +X73850500Y-123634500D02* +X75755500Y-121729500D01* +X75755500Y-121729500D02* +X75755500Y-119446040D01* +D29* +X86461600Y-141427200D02* +X87020400Y-141986000D01* +X86461600Y-139242800D02* +X86461600Y-141427200D01* +X84429600Y-137210800D02* +X86461600Y-139242800D01* +X73850500Y-123634500D02* +X75755500Y-121729500D01* +X75755500Y-121729500D02* +X75755500Y-119446040D01* +X73660000Y-132080000D02* +X73596500Y-132080000D01* +X83312000Y-145732500D02* +X79679800Y-144983200D01* +X83375500Y-145796000D02* +X83312000Y-145732500D01* +X81978500Y-127762000D02* +X82740500Y-127000000D01* +X81978500Y-131318000D02* +X81978500Y-127762000D01* +X79692500Y-133604000D02* +X81978500Y-131318000D01* +X79502000Y-140563600D02* +X79692500Y-133604000D01* +X86207600Y-145084800D02* +X86055200Y-145237200D01* +X86715600Y-145084800D02* +X86207600Y-145084800D01* +X89408000Y-142392400D02* +X86715600Y-145084800D01* +X89408000Y-140716000D02* +X89408000Y-142392400D01* +X89509600Y-140614400D02* +X89408000Y-140716000D01* +X86360000Y-143662400D02* +X86309200Y-143662400D01* +X87680800Y-142341600D02* +X86360000Y-143662400D01* +X87680800Y-141325600D02* +X87680800Y-142341600D01* +X80365600Y-132232400D02* +X80365600Y-131876800D01* +X78943200Y-133654800D02* +X80365600Y-132232400D01* +X78638400Y-141986000D02* +X78943200Y-133654800D01* +X79806800Y-142341600D02* +X78638400Y-141986000D01* +X81330800Y-142494000D02* +X79806800Y-142341600D01* +X82811049Y-143452151D02* +X81330800Y-142494000D01* +X83254151Y-143452151D02* +X82811049Y-143452151D01* +X83413600Y-143611600D02* +X83254151Y-143452151D01* +X81838800Y-134975600D02* +X81788000Y-135026400D01* +X81788000Y-135026400D02* +X81788000Y-140462000D01* +X81788000Y-140462000D02* +X82346800Y-141122400D01* +X82346800Y-141122400D02* +X83058000Y-141071600D01* +X88646000Y-136398000D02* +X82931000Y-136398000D01* +X89662000Y-135382000D02* +X88646000Y-136398000D01* +X90678000Y-135382000D02* +X89662000Y-135382000D01* +X90805000Y-135509000D02* +X90678000Y-135382000D01* +X82550000Y-135509000D02* +X88455500Y-135509000D01* +X82423000Y-135636000D02* +X82550000Y-135509000D01* +X81178400Y-129184400D02* +X81178400Y-125526800D01* +X78892400Y-131470400D02* +X81178400Y-129184400D01* +X78892400Y-133045200D02* +X78892400Y-131470400D01* +X76403200Y-135534400D02* +X78892400Y-133045200D01* +X76403200Y-137820400D02* +X76403200Y-135534400D01* +X74879200Y-139344400D02* +X76403200Y-137820400D01* +X75628500Y-142557500D02* +X75184000Y-142113000D01* +X75628500Y-147510500D02* +X75628500Y-142557500D01* +X76327000Y-148209000D02* +X75628500Y-147510500D01* +X76327000Y-149542500D02* +X76327000Y-148209000D01* +X78486000Y-151701500D02* +X76327000Y-149542500D01* +X90487500Y-151701500D02* +X78486000Y-151701500D01* +X93345000Y-148844000D02* +X90487500Y-151701500D01* +X93345000Y-136017000D02* +X93345000Y-148844000D01* +X91694000Y-134366000D02* +X93345000Y-136017000D01* +X91694000Y-125031500D02* +X91694000Y-134366000D01* +X91376500Y-124714000D02* +X91694000Y-125031500D01* +X89103200Y-124612400D02* +X90017600Y-124612400D01* +X88392000Y-125323600D02* +X89103200Y-124612400D01* +X88392000Y-133705600D02* +X88392000Y-125323600D01* +X87833200Y-134264400D02* +X88392000Y-133705600D01* +X83007200Y-134264400D02* +X87833200Y-134264400D01* +X82651600Y-133908800D02* +X83007200Y-134264400D01* +X81686400Y-133908800D02* +X82651600Y-133908800D01* +X81178400Y-134416800D02* +X81686400Y-133908800D01* +X80924400Y-141605000D02* +X81178400Y-134416800D01* +X80873600Y-141655800D02* +X80924400Y-141605000D01* +X79502000Y-144272000D02* +X81229200Y-144272000D01* +X78943200Y-143713200D02* +X79502000Y-144272000D01* +X74345800Y-147015200D02* +X74345800Y-146761200D01* +X74041000Y-147574000D02* +X74345800Y-147015200D01* +X71005700Y-147510500D02* +X74041000Y-147574000D01* +X70815200Y-147320000D02* +X71005700Y-147510500D01* +X73152000Y-148437600D02* +X73126600Y-148412200D01* +X73152000Y-149352000D02* +X73152000Y-148437600D01* +X72517000Y-149987000D02* +X73152000Y-149352000D01* +X71882000Y-149987000D02* +X72517000Y-149987000D01* +X71678800Y-149783800D02* +X71882000Y-149987000D01* +X78943200Y-145719800D02* +X82867500Y-146431000D01* +X86804500Y-148082000D02* +X87566500Y-147320000D01* +X85153500Y-148082000D02* +X86804500Y-148082000D01* +X84772500Y-148463000D02* +X85153500Y-148082000D01* +X84201000Y-148463000D02* +X84772500Y-148463000D01* +X82867500Y-147129500D02* +X84201000Y-148463000D01* +X78536800Y-146634200D02* +X82867500Y-147129500D01* +X80391000Y-133921500D02* +X80137000Y-141173200D01* +X80962500Y-133350000D02* +X80391000Y-133921500D01* +X82994500Y-133350000D02* +X80962500Y-133350000D01* +X86741000Y-126060200D02* +X86741000Y-126238000D01* +X88925400Y-123875800D02* +X86741000Y-126060200D01* +X91770200Y-123875800D02* +X88925400Y-123875800D01* +X92176600Y-124282200D02* +X91770200Y-123875800D01* +X92176600Y-133578600D02* +X92176600Y-124282200D01* +X93954600Y-135356600D02* +X92176600Y-133578600D01* +X93954600Y-141732000D02* +X93954600Y-135356600D01* +X94030800Y-141808200D02* +X93954600Y-141732000D01* +X92252800Y-147548600D02* +X92252800Y-144373600D01* +X91135200Y-148666200D02* +X92252800Y-147548600D01* +X85725000Y-148666200D02* +X91135200Y-148666200D01* +X84404200Y-149987000D02* +X85725000Y-148666200D01* +X86741000Y-133413500D02* +X86741000Y-126238000D01* +X91249500Y-142113000D02* +X91249500Y-141973300D01* +X91249500Y-141973300D02* +X92760800Y-140462000D01* +X91998800Y-138074400D02* +X90373200Y-138074400D01* +X92760800Y-138836400D02* +X91998800Y-138074400D01* +X92760800Y-140462000D02* +X92760800Y-138836400D01* +X74041000Y-134747000D02* +X74041000Y-137033000D01* +X74320400Y-134467600D02* +X74041000Y-134747000D01* +X76504800Y-134467600D02* +X74320400Y-134467600D01* +X78079600Y-132892800D02* +X76504800Y-134467600D01* +X78079600Y-130200400D02* +X78079600Y-132892800D01* +X78689200Y-129590800D02* +X78079600Y-130200400D01* +X79603600Y-129590800D02* +X78689200Y-129590800D01* +X80467200Y-128727200D02* +X79603600Y-129590800D01* +X74041000Y-137033000D02* +X72326500Y-137033000D01* +X71564500Y-137795000D02* +X71564500Y-140144500D01* +X72326500Y-137033000D02* +X71564500Y-137795000D01* +X86131400Y-142367000D02* +X85801200Y-142697200D01* +X85801200Y-142697200D02* +X82956400Y-142697200D01* +X82956400Y-142697200D02* +X81635600Y-141376400D01* +X76936600Y-142951200D02* +X76504800Y-143383000D01* +X76504800Y-143383000D02* +X76504800Y-144475200D01* +X76504800Y-144475200D02* +X76301600Y-144678400D01* +X74726800Y-144932400D02* +X71424800Y-141630400D01* +X71424800Y-141630400D02* +X71145400Y-141630400D01* +X88722200Y-142367000D02* +X88188800Y-139954000D01* +X86423500Y-144526000D02* +X88722200Y-142367000D01* +X82296000Y-144729200D02* +X86423500Y-144526000D01* +X81280000Y-143154400D02* +X82296000Y-144729200D01* +X78841600Y-143002000D02* +X81280000Y-143154400D01* +X75184000Y-141325600D02* +X78841600Y-143002000D01* +X71374000Y-140970000D02* +X75184000Y-141325600D01* +X70802500Y-140398500D02* +X71374000Y-140970000D01* +X70802500Y-136017000D02* +X70802500Y-140398500D01* +X71818500Y-135001000D02* +X70802500Y-136017000D01* +X71983600Y-135940800D02* +X71831200Y-135940800D01* +X74218800Y-133705600D02* +X71983600Y-135940800D01* +X76352400Y-133705600D02* +X74218800Y-133705600D01* +X77520800Y-132537200D02* +X76352400Y-133705600D01* +X77520800Y-128930400D02* +X77520800Y-132537200D01* +X77724000Y-128727200D02* +X77520800Y-128930400D01* +X78841600Y-128727200D02* +X77724000Y-128727200D01* +X80213200Y-127355600D02* +X78841600Y-128727200D01* +M02* diff --git a/PCB/OUTPUT_V35/Tinylab_proto1-B_Mask.gbr b/PCB/OUTPUT_V35/Tinylab_proto1-B_Mask.gbr new file mode 100644 index 00000000..dc8815dd --- /dev/null +++ b/PCB/OUTPUT_V35/Tinylab_proto1-B_Mask.gbr @@ -0,0 +1,91 @@ +G04 #@! TF.FileFunction,Soldermask,Bot* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 02/02/2016 11:58:07 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,1.300000X1.300000*% +%ADD12C,1.300000*% +%ADD13C,1.998980*% +%ADD14R,1.998980X1.998980*% +%ADD15R,1.905000X1.905000*% +%ADD16C,1.905000*% +%ADD17R,2.032000X1.727200*% +%ADD18O,2.032000X1.727200*% +%ADD19O,1.250000X0.950000*% +%ADD20O,1.000000X1.550000*% +%ADD21R,1.727200X1.727200*% +%ADD22O,1.727200X1.727200*% +%ADD23R,1.727200X2.032000*% +%ADD24O,1.727200X2.032000*% +%ADD25R,2.032000X2.032000*% +%ADD26O,2.032000X2.032000*% +G04 APERTURE END LIST* +D10* +D11* +X94805500Y-147510500D03* +D12* +X94805500Y-145010500D03* +D11* +X93281500Y-127190500D03* +D12* +X95781500Y-127190500D03* +X76350500Y-124269500D03* +D11* +X73850500Y-124269500D03* +D13* +X65595500Y-119446040D03* +D14* +X75755500Y-119446040D03* +D15* +X65468500Y-125222000D03* +D16* +X70548500Y-125222000D03* +D17* +X90043000Y-126301500D03* +D18* +X90043000Y-128841500D03* +X90043000Y-131381500D03* +X90043000Y-133921500D03* +D19* +X92607400Y-123228540D03* +X87607400Y-123228540D03* +D20* +X93607400Y-120528540D03* +X86607400Y-120528540D03* +D17* +X66040000Y-148590000D03* +D18* +X66040000Y-146050000D03* +X66040000Y-143510000D03* +X66040000Y-140970000D03* +D21* +X90106500Y-149860000D03* +D22* +X87566500Y-149860000D03* +X90106500Y-147320000D03* +X87566500Y-147320000D03* +D23* +X83693000Y-119380000D03* +D24* +X81153000Y-119380000D03* +X78613000Y-119380000D03* +D17* +X66040000Y-130810000D03* +D18* +X66040000Y-133350000D03* +X66040000Y-135890000D03* +X66040000Y-138430000D03* +D21* +X73660000Y-132080000D03* +D22* +X73660000Y-129540000D03* +X76200000Y-132080000D03* +X76200000Y-129540000D03* +D25* +X91249500Y-142113000D03* +D26* +X91249500Y-139573000D03* +M02* diff --git a/PCB/OUTPUT_V35/Tinylab_proto1-Edge_Cuts.gbr b/PCB/OUTPUT_V35/Tinylab_proto1-Edge_Cuts.gbr new file mode 100644 index 00000000..59d9d01d --- /dev/null +++ b/PCB/OUTPUT_V35/Tinylab_proto1-Edge_Cuts.gbr @@ -0,0 +1,31 @@ +G04 #@! TF.FileFunction,Profile,NP* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 02/02/2016 11:58:07 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +G04 APERTURE END LIST* +D10* +X97409000Y-152044400D02* +X97409000Y-117576600D01* +X97409000Y-117602000D02* +X96596200Y-117602000D01* +X97409000Y-152222200D02* +X97409000Y-151993600D01* +X96596200Y-152222200D02* +X97409000Y-152222200D01* +X64236600Y-152222200D02* +X96621600Y-152222200D01* +X96621600Y-117602000D02* +X64211200Y-117602000D01* +X64211200Y-117627400D02* +X64236600Y-117627400D01* +X64211200Y-152222200D02* +X64211200Y-117627400D01* +X64287400Y-152222200D02* +X64236600Y-152222200D01* +X64287400Y-152222200D02* +X64312800Y-152222200D01* +M02* diff --git a/PCB/OUTPUT_V35/Tinylab_proto1-F_Cu.gbr b/PCB/OUTPUT_V35/Tinylab_proto1-F_Cu.gbr new file mode 100644 index 00000000..e07fb7e3 --- /dev/null +++ b/PCB/OUTPUT_V35/Tinylab_proto1-F_Cu.gbr @@ -0,0 +1,1461 @@ +G04 #@! TF.FileFunction,Copper,L1,Top,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 02/02/2016 11:58:07 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,0.800000X0.750000*% +%ADD12R,0.750000X0.800000*% +%ADD13R,1.300000X1.300000*% +%ADD14C,1.300000*% +%ADD15C,1.998980*% +%ADD16R,1.998980X1.998980*% +%ADD17R,1.600000X1.000000*% +%ADD18R,1.600000X0.560000*% +%ADD19R,0.560000X1.600000*% +%ADD20R,1.905000X1.905000*% +%ADD21C,1.905000*% +%ADD22R,2.032000X1.727200*% +%ADD23O,2.032000X1.727200*% +%ADD24R,0.400000X1.350000*% +%ADD25O,1.250000X0.950000*% +%ADD26O,1.000000X1.550000*% +%ADD27R,1.727200X1.727200*% +%ADD28O,1.727200X1.727200*% +%ADD29R,1.727200X2.032000*% +%ADD30O,1.727200X2.032000*% +%ADD31R,2.032000X2.032000*% +%ADD32O,2.032000X2.032000*% +%ADD33R,0.900000X0.600000*% +%ADD34R,0.500000X0.900000*% +%ADD35R,0.900000X0.500000*% +%ADD36R,0.600000X0.900000*% +%ADD37R,1.500000X0.600000*% +%ADD38R,0.508000X0.304800*% +%ADD39C,0.600000*% +%ADD40C,0.250000*% +%ADD41C,0.508000*% +%ADD42C,1.016000*% +G04 APERTURE END LIST* +D10* +D11* +X86054500Y-130492500D03* +X87554500Y-130492500D03* +X86054500Y-128968500D03* +X87554500Y-128968500D03* +D12* +X92519500Y-130885500D03* +X92519500Y-132385500D03* +D11* +X95619000Y-135064500D03* +X94119000Y-135064500D03* +X87554500Y-138430000D03* +X86054500Y-138430000D03* +D13* +X94805500Y-147510500D03* +D14* +X94805500Y-145010500D03* +D11* +X79363000Y-151003000D03* +X77863000Y-151003000D03* +D13* +X93281500Y-127190500D03* +D14* +X95781500Y-127190500D03* +D12* +X83502500Y-124194000D03* +X83502500Y-122694000D03* +X71374000Y-146292000D03* +X71374000Y-144792000D03* +X95504000Y-122249500D03* +X95504000Y-123749500D03* +X68707000Y-133338000D03* +X68707000Y-131838000D03* +X68707000Y-136259000D03* +X68707000Y-134759000D03* +D14* +X76350500Y-124269500D03* +D13* +X73850500Y-124269500D03* +D12* +X71437500Y-129972500D03* +X71437500Y-128472500D03* +D15* +X65595500Y-119446040D03* +D16* +X75755500Y-119446040D03* +D17* +X94551500Y-139485500D03* +X94551500Y-136485500D03* +D18* +X84717000Y-147510000D03* +X84717000Y-146710000D03* +X84717000Y-145910000D03* +X84717000Y-145110000D03* +X84717000Y-144310000D03* +X84717000Y-143510000D03* +X84717000Y-142710000D03* +X84717000Y-141910000D03* +X84717000Y-141110000D03* +X84717000Y-140310000D03* +X84717000Y-139510000D03* +D19* +X82867000Y-137660000D03* +X82067000Y-137660000D03* +X81267000Y-137660000D03* +X80467000Y-137660000D03* +X79667000Y-137660000D03* +X78867000Y-137660000D03* +X78067000Y-137660000D03* +X77267000Y-137660000D03* +X76467000Y-137660000D03* +X75667000Y-137660000D03* +X74867000Y-137660000D03* +D18* +X73017000Y-139510000D03* +X73017000Y-140310000D03* +X73017000Y-141110000D03* +X73017000Y-141910000D03* +X73017000Y-142710000D03* +X73017000Y-143510000D03* +X73017000Y-144310000D03* +X73017000Y-145110000D03* +X73017000Y-145910000D03* +X73017000Y-146710000D03* +X73017000Y-147510000D03* +D19* +X74867000Y-149360000D03* +X75667000Y-149360000D03* +X76467000Y-149360000D03* +X77267000Y-149360000D03* +X78067000Y-149360000D03* +X78867000Y-149360000D03* +X79667000Y-149360000D03* +X80467000Y-149360000D03* +X81267000Y-149360000D03* +X82067000Y-149360000D03* +X82867000Y-149360000D03* +D20* +X65468500Y-125222000D03* +D21* +X70548500Y-125222000D03* +D22* +X90043000Y-126301500D03* +D23* +X90043000Y-128841500D03* +X90043000Y-131381500D03* +X90043000Y-133921500D03* +D24* +X91407400Y-123228540D03* +X90757400Y-123228540D03* +X90107400Y-123228540D03* +X89457400Y-123228540D03* +X88807400Y-123228540D03* +D25* +X92607400Y-123228540D03* +X87607400Y-123228540D03* +D26* +X93607400Y-120528540D03* +X86607400Y-120528540D03* +D22* +X66040000Y-148590000D03* +D23* +X66040000Y-146050000D03* +X66040000Y-143510000D03* +X66040000Y-140970000D03* +D27* +X90106500Y-149860000D03* +D28* +X87566500Y-149860000D03* +X90106500Y-147320000D03* +X87566500Y-147320000D03* +D29* +X83693000Y-119380000D03* +D30* +X81153000Y-119380000D03* +X78613000Y-119380000D03* +D22* +X66040000Y-130810000D03* +D23* +X66040000Y-133350000D03* +X66040000Y-135890000D03* +X66040000Y-138430000D03* +D27* +X73660000Y-132080000D03* +D28* +X73660000Y-129540000D03* +X76200000Y-132080000D03* +X76200000Y-129540000D03* +D31* +X91249500Y-142113000D03* +D32* +X91249500Y-139573000D03* +D33* +X79245000Y-123444000D03* +X82045000Y-122494000D03* +X82045000Y-124394000D03* +D34* +X85927500Y-132080000D03* +X87427500Y-132080000D03* +X85927500Y-127381000D03* +X87427500Y-127381000D03* +X85927500Y-133731000D03* +X87427500Y-133731000D03* +X87427500Y-125793500D03* +X85927500Y-125793500D03* +X85927500Y-135318500D03* +X87427500Y-135318500D03* +X85927500Y-136906000D03* +X87427500Y-136906000D03* +D35* +X67970400Y-142036800D03* +X67970400Y-140536800D03* +X68453000Y-144641000D03* +X68453000Y-143141000D03* +X68453000Y-147244500D03* +X68453000Y-145744500D03* +X68643500Y-149848000D03* +X68643500Y-148348000D03* +X69748400Y-140536800D03* +X69748400Y-142036800D03* +X70040500Y-143141000D03* +X70040500Y-144641000D03* +X69786500Y-145744500D03* +X69786500Y-147244500D03* +X70231000Y-148348000D03* +X70231000Y-149848000D03* +X68707000Y-137553000D03* +X68707000Y-139053000D03* +D34* +X71616000Y-138938000D03* +X70116000Y-138938000D03* +D35* +X75057000Y-135878000D03* +X75057000Y-134378000D03* +X76708000Y-135878000D03* +X76708000Y-134378000D03* +X73406000Y-134378000D03* +X73406000Y-135878000D03* +X72961500Y-138545000D03* +X72961500Y-137045000D03* +D34* +X82093500Y-151066500D03* +X80593500Y-151066500D03* +D35* +X70358000Y-131711000D03* +X70358000Y-133211000D03* +D34* +X70116000Y-137287000D03* +X71616000Y-137287000D03* +X68719000Y-130302000D03* +X70219000Y-130302000D03* +D35* +X70358000Y-134378000D03* +X70358000Y-135878000D03* +D34* +X88888000Y-143129000D03* +X87388000Y-143129000D03* +X87388000Y-144716500D03* +X88888000Y-144716500D03* +D36* +X94869000Y-130870500D03* +X95819000Y-133670500D03* +X93919000Y-133670500D03* +D37* +X84361000Y-134620000D03* +X84361000Y-133350000D03* +X84361000Y-132080000D03* +X84361000Y-130810000D03* +X84361000Y-129540000D03* +X84361000Y-128270000D03* +X84361000Y-127000000D03* +X78961000Y-127000000D03* +X78961000Y-128270000D03* +X78961000Y-129540000D03* +X78961000Y-130810000D03* +X78961000Y-132080000D03* +X78961000Y-133350000D03* +X78961000Y-134620000D03* +D38* +X88900000Y-141147800D03* +X88900000Y-139877800D03* +X86868000Y-141147800D03* +X88900000Y-140512800D03* +X86868000Y-139877800D03* +X86868000Y-140512800D03* +X91313000Y-137414000D03* +X91313000Y-136144000D03* +X89281000Y-137414000D03* +X91313000Y-136779000D03* +X89281000Y-136144000D03* +X89281000Y-136779000D03* +D39* +X78054200Y-147701000D03* +X77165200Y-145415000D03* +X89052400Y-138480800D03* +X90551000Y-136334500D03* +X92583000Y-136461500D03* +X96164400Y-125399800D03* +X83883500Y-137858500D03* +X83108800Y-140182600D03* +X82118200Y-148005800D03* +X80391000Y-151003000D03* +X84836000Y-124206000D03* +X75374500Y-126111000D03* +X82359500Y-123444000D03* +X90805000Y-121602500D03* +X94805500Y-137731500D03* +X72072500Y-127254000D03* +X87020400Y-141986000D03* +X84429600Y-137210800D03* +X79679800Y-144983200D03* +X83375500Y-145796000D03* +X82740500Y-127000000D03* +X79502000Y-140563600D03* +X86055200Y-145237200D03* +X89509600Y-140614400D03* +X86309200Y-143662400D03* +X87680800Y-141325600D03* +X80365600Y-131876800D03* +X83413600Y-143611600D03* +X81838800Y-134975600D03* +X83058000Y-141071600D03* +X82931000Y-136398000D03* +X90805000Y-135509000D03* +X88455500Y-135509000D03* +X82423000Y-135636000D03* +X81178400Y-125526800D03* +X74879200Y-139344400D03* +X75184000Y-142113000D03* +X91376500Y-124714000D03* +X90017600Y-124612400D03* +X80873600Y-141655800D03* +X81229200Y-144272000D03* +X78943200Y-143713200D03* +X74345800Y-146761200D03* +X70815200Y-147320000D03* +X73126600Y-148412200D03* +X71678800Y-149783800D03* +X82867500Y-146431000D03* +X78943200Y-145719800D03* +X78536800Y-146634200D03* +X80137000Y-141173200D03* +X82994500Y-133350000D03* +X94030800Y-141808200D03* +X92252800Y-144373600D03* +X84404200Y-149987000D03* +X86741000Y-126238000D03* +X86741000Y-133413500D03* +X90373200Y-138074400D03* +X80467200Y-128727200D03* +X71564500Y-140144500D03* +X74041000Y-137033000D03* +X86131400Y-142367000D03* +X81635600Y-141376400D03* +X76936600Y-142951200D03* +X76301600Y-144678400D03* +X74726800Y-144932400D03* +X71145400Y-141630400D03* +X88188800Y-139954000D03* +X71818500Y-135001000D03* +X71831200Y-135940800D03* +X80213200Y-127355600D03* +D40* +X90043000Y-133921500D02* +X90043000Y-133794500D01* +X90043000Y-133794500D02* +X88328500Y-132080000D01* +X88328500Y-132080000D02* +X87427500Y-132080000D01* +X86054500Y-130492500D02* +X86054500Y-130822000D01* +X86054500Y-130822000D02* +X86677500Y-131445000D01* +X86677500Y-131445000D02* +X86792500Y-131445000D01* +X86792500Y-131445000D02* +X87427500Y-132080000D01* +X90043000Y-131381500D02* +X89598500Y-131381500D01* +X89598500Y-131381500D02* +X88709500Y-130492500D01* +X88709500Y-130492500D02* +X87554500Y-130492500D01* +X87427500Y-127381000D02* +X87693500Y-127381000D01* +X88773000Y-126301500D02* +X90043000Y-126301500D01* +X87693500Y-127381000D02* +X88773000Y-126301500D01* +X86054500Y-128968500D02* +X86054500Y-128829500D01* +X86054500Y-128829500D02* +X86741000Y-128143000D01* +X86741000Y-128143000D02* +X86741000Y-127571500D01* +X86741000Y-127571500D02* +X86931500Y-127381000D01* +X86931500Y-127381000D02* +X87427500Y-127381000D01* +X90043000Y-128841500D02* +X87681500Y-128841500D01* +X87681500Y-128841500D02* +X87554500Y-128968500D01* +X94869000Y-130870500D02* +X94869000Y-129730500D01* +X94615000Y-122491500D02* +X94373000Y-122249500D01* +X94615000Y-129476500D02* +X94615000Y-122491500D01* +X94869000Y-129730500D02* +X94615000Y-129476500D01* +X92519500Y-130885500D02* +X94854000Y-130885500D01* +X94854000Y-130885500D02* +X94869000Y-130870500D01* +X83693000Y-119380000D02* +X89852500Y-119380000D01* +X91503500Y-122110500D02* +X91407400Y-122110500D01* +X91503500Y-121031000D02* +X91503500Y-122110500D01* +X89852500Y-119380000D02* +X91503500Y-121031000D01* +X91407400Y-123228540D02* +X91407400Y-122110500D01* +X91407400Y-122110500D02* +X91407400Y-122016100D01* +X93928500Y-122249500D02* +X94373000Y-122249500D01* +X93599000Y-121920000D02* +X93928500Y-122249500D01* +X91503500Y-121920000D02* +X93599000Y-121920000D01* +X91407400Y-122016100D02* +X91503500Y-121920000D01* +X94373000Y-122249500D02* +X95504000Y-122249500D01* +X83693000Y-119380000D02* +X84518500Y-119380000D01* +D41* +X86054500Y-138430000D02* +X86054500Y-137033000D01* +X86054500Y-137033000D02* +X85927500Y-136906000D01* +X94119000Y-135064500D02* +X93154500Y-135064500D01* +X93154500Y-135064500D02* +X93027500Y-135191500D01* +X93027500Y-135191500D02* +X93027500Y-136017000D01* +X93027500Y-136017000D02* +X92583000Y-136461500D01* +X94805500Y-145010500D02* +X94805500Y-139739500D01* +X94805500Y-139739500D02* +X94551500Y-139485500D01* +D40* +X73017000Y-145110000D02* +X73863000Y-145110000D01* +X78067000Y-147713800D02* +X78067000Y-149360000D01* +X78054200Y-147701000D02* +X78067000Y-147713800D01* +X76987400Y-145592800D02* +X77165200Y-145415000D01* +X74345800Y-145592800D02* +X76987400Y-145592800D01* +X73863000Y-145110000D02* +X74345800Y-145592800D01* +X88900000Y-141147800D02* +X88417400Y-141147800D01* +X87477600Y-140208000D02* +X87477600Y-139446000D01* +X88417400Y-141147800D02* +X87477600Y-140208000D01* +X88888000Y-144716500D02* +X88888000Y-146038000D01* +X88888000Y-146038000D02* +X90106500Y-147256500D01* +X90106500Y-147256500D02* +X90106500Y-147320000D01* +X89115900Y-141160500D02* +X89115900Y-141287500D01* +X89115900Y-141287500D02* +X89662000Y-141833600D01* +X89662000Y-141833600D02* +X89662000Y-145010500D01* +X89662000Y-145010500D02* +X89638500Y-145034000D01* +X89638500Y-145034000D02* +X89611200Y-145034000D01* +X89611200Y-145034000D02* +X89611200Y-145010500D01* +X88595200Y-139293600D02* +X88595200Y-138938000D01* +X88595200Y-139293600D02* +X87630000Y-139293600D01* +X87630000Y-139293600D02* +X87477600Y-139446000D01* +X87477600Y-139446000D02* +X87033100Y-139890500D01* +X88595200Y-138938000D02* +X89052400Y-138480800D01* +X87033100Y-139890500D02* +X86487000Y-139890500D01* +X86054500Y-138430000D02* +X86054500Y-139394500D01* +X86054500Y-139394500D02* +X86487000Y-139827000D01* +X86487000Y-139827000D02* +X86487000Y-139890500D01* +X88807400Y-123228540D02* +X87607400Y-123228540D01* +X92519500Y-132385500D02* +X91999500Y-132385500D01* +X91999500Y-132385500D02* +X91694000Y-132080000D01* +X91694000Y-132080000D02* +X91694000Y-125476000D01* +X91694000Y-125476000D02* +X92607400Y-124562600D01* +X92607400Y-124562600D02* +X92607400Y-123228540D01* +X94551500Y-139485500D02* +X95224600Y-142036800D01* +X95224600Y-142036800D02* +X94805500Y-145010500D01* +X89598500Y-136144000D02* +X90360500Y-136144000D01* +X90360500Y-136144000D02* +X90551000Y-136334500D01* +X92583000Y-136461500D02* +X93027500Y-136017000D01* +X93027500Y-136017000D02* +X93027500Y-135191500D01* +X93027500Y-135191500D02* +X93154500Y-135064500D01* +X89281000Y-136144000D02* +X89598500Y-136144000D01* +X89598500Y-136144000D02* +X89663398Y-136144000D01* +X90614500Y-137414000D02* +X91313000Y-137414000D01* +X90487500Y-137287000D02* +X90614500Y-137414000D01* +X90487500Y-136968102D02* +X90487500Y-137287000D01* +X89663398Y-136144000D02* +X90487500Y-136968102D01* +X94805500Y-145010500D02* +X89611200Y-145010500D01* +X89611200Y-145010500D02* +X89182000Y-145010500D01* +X89182000Y-145010500D02* +X88888000Y-144716500D01* +X93919000Y-133670500D02* +X93919000Y-134864500D01* +X93919000Y-134864500D02* +X94119000Y-135064500D01* +X92519500Y-132385500D02* +X92519500Y-133159500D01* +X93030500Y-133670500D02* +X93919000Y-133670500D01* +X92519500Y-133159500D02* +X93030500Y-133670500D01* +X71640000Y-144792000D02* +X71958000Y-145110000D01* +X71958000Y-145110000D02* +X73017000Y-145110000D01* +X71374000Y-144792000D02* +X71640000Y-144792000D01* +X71310500Y-144792000D02* +X71640000Y-144792000D01* +X81267000Y-137660000D02* +X81267000Y-138824000D01* +X84137500Y-138430000D02* +X86054500Y-138430000D01* +X83629500Y-138938000D02* +X84137500Y-138430000D01* +X81381000Y-138938000D02* +X83629500Y-138938000D01* +X81267000Y-138824000D02* +X81381000Y-138938000D01* +X86054500Y-137033000D02* +X85927500Y-136906000D01* +X77799500Y-151066500D02* +X77799500Y-150737000D01* +X77799500Y-150737000D02* +X78067000Y-150469500D01* +X78067000Y-150469500D02* +X78067000Y-149360000D01* +X85927500Y-136906000D02* +X85725000Y-136906000D01* +D41* +X95619000Y-135064500D02* +X95910400Y-135355900D01* +X95910400Y-135355900D02* +X95910400Y-146304000D01* +X95910400Y-146304000D02* +X94805500Y-147408900D01* +X94805500Y-147408900D02* +X94805500Y-147510500D01* +X95619000Y-135064500D02* +X95619000Y-133870500D01* +X95619000Y-133870500D02* +X95819000Y-133670500D01* +X95819000Y-133670500D02* +X95819000Y-129479000D01* +X95819000Y-129479000D02* +X96672400Y-128625600D01* +X96164400Y-125577600D02* +X96164400Y-125399800D01* +X96951800Y-126365000D02* +X96164400Y-125577600D01* +X96951800Y-127990600D02* +X96951800Y-126365000D01* +X96672400Y-128270000D02* +X96951800Y-127990600D01* +X96672400Y-128625600D02* +X96672400Y-128270000D01* +X71526400Y-148539200D02* +X71526400Y-147929600D01* +X71526400Y-148539200D02* +X71704200Y-148539200D01* +X71704200Y-148539200D02* +X73329800Y-150164800D01* +D42* +X76365100Y-151193500D02* +X76365100Y-151295100D01* +X76708000Y-151638000D02* +X76708000Y-151536400D01* +X76365100Y-151295100D02* +X76708000Y-151638000D01* +X74180700Y-151193500D02* +X74180700Y-151015700D01* +X74180700Y-151015700D02* +X73329800Y-150164800D01* +X73329800Y-150164800D02* +X73329800Y-150139400D01* +X76365100Y-151193500D02* +X74180700Y-151193500D01* +X74180700Y-151193500D02* +X74142600Y-151155400D01* +X90106500Y-150812500D02* +X89369900Y-150812500D01* +X82677000Y-151434800D02* +X82473800Y-151231600D01* +X84302600Y-151434800D02* +X82677000Y-151434800D01* +X84378800Y-151511000D02* +X84302600Y-151434800D01* +X88671400Y-151511000D02* +X84378800Y-151511000D01* +X89369900Y-150812500D02* +X88671400Y-151511000D01* +X90106500Y-149860000D02* +X90106500Y-150812500D01* +X90106500Y-150812500D02* +X89852500Y-151066500D01* +X90106500Y-149860000D02* +X91757500Y-149860000D01* +X91757500Y-149860000D02* +X94107000Y-147510500D01* +X94107000Y-147510500D02* +X94805500Y-147510500D01* +D40* +X96164400Y-125730000D02* +X96164400Y-125399800D01* +X96799400Y-126365000D02* +X96164400Y-125730000D01* +X96799400Y-127863600D02* +X96799400Y-126365000D01* +X96697800Y-127965200D02* +X96799400Y-127863600D01* +X96697800Y-128600200D02* +X96697800Y-127965200D01* +X95819000Y-129479000D02* +X96697800Y-128600200D01* +X71374000Y-146292000D02* +X71374000Y-146989800D01* +X71374000Y-146989800D02* +X71526400Y-147142200D01* +X71526400Y-147142200D02* +X71526400Y-147929600D01* +X81191800Y-151968200D02* +X82093500Y-151066500D01* +X77139800Y-151968200D02* +X81191800Y-151968200D01* +X76708000Y-151536400D02* +X77139800Y-151968200D01* +X71526400Y-148539200D02* +X74142600Y-151155400D01* +X94805500Y-147510500D02* +X94805500Y-147408900D01* +X94805500Y-147408900D02* +X95910400Y-146304000D01* +X95910400Y-146304000D02* +X95910400Y-135355900D01* +X94805500Y-147510500D02* +X94107000Y-147510500D01* +X94107000Y-147510500D02* +X91757500Y-149860000D01* +X95819000Y-133670500D02* +X95819000Y-134864500D01* +X95819000Y-134864500D02* +X95619000Y-135064500D01* +X82093500Y-151066500D02* +X89852500Y-151066500D01* +X89852500Y-151066500D02* +X90106500Y-150812500D01* +X71449500Y-146292000D02* +X71831500Y-145910000D01* +X71831500Y-145910000D02* +X73017000Y-145910000D01* +X71374000Y-146292000D02* +X71449500Y-146292000D01* +X73016000Y-145911000D02* +X73017000Y-145910000D01* +D42* +X80593500Y-151066500D02* +X79426500Y-151066500D01* +X79426500Y-151066500D02* +X79363000Y-151003000D01* +D40* +X85725000Y-135318500D02* +X85090000Y-135953500D01* +X85090000Y-135953500D02* +X85090000Y-137604500D01* +X85090000Y-137604500D02* +X84836000Y-137858500D01* +X84836000Y-137858500D02* +X83883500Y-137858500D01* +X83108800Y-140182600D02* +X82346800Y-140766800D01* +X82346800Y-140766800D02* +X82118200Y-148005800D01* +X80391000Y-151003000D02* +X80327500Y-151066500D01* +X80327500Y-151066500D02* +X79299500Y-151066500D01* +X85927500Y-135318500D02* +X85725000Y-135318500D01* +X87554500Y-138430000D02* +X87439500Y-138430000D01* +X87439500Y-138430000D02* +X86677500Y-137668000D01* +X86677500Y-137668000D02* +X86677500Y-135826500D01* +X86677500Y-135826500D02* +X86169500Y-135318500D01* +X86169500Y-135318500D02* +X85927500Y-135318500D01* +X79299500Y-151066500D02* +X79299500Y-150927500D01* +X79299500Y-150927500D02* +X78867000Y-150495000D01* +X78867000Y-150495000D02* +X78867000Y-149360000D01* +X84824000Y-124194000D02* +X83502500Y-124194000D01* +X84836000Y-124206000D02* +X84824000Y-124194000D01* +X82359500Y-123444000D02* +X81661000Y-123444000D01* +X81661000Y-123444000D02* +X79692500Y-125412500D01* +X79692500Y-125412500D02* +X77406500Y-125412500D01* +X77406500Y-125412500D02* +X76708000Y-126111000D01* +X76708000Y-126111000D02* +X75374500Y-126111000D01* +X83502500Y-124194000D02* +X83109500Y-124194000D01* +X83109500Y-124194000D02* +X82359500Y-123444000D01* +D41* +X94551500Y-136485500D02* +X94551500Y-137477500D01* +X94551500Y-137477500D02* +X94805500Y-137731500D01* +X83502500Y-122694000D02* +X86157500Y-122694000D01* +X86157500Y-122694000D02* +X87249000Y-121602500D01* +X87249000Y-121602500D02* +X90924498Y-121602500D01* +X90924498Y-121602500D02* +X90805000Y-121602500D01* +X82045000Y-122494000D02* +X83302500Y-122494000D01* +X83302500Y-122494000D02* +X83502500Y-122694000D01* +X80645000Y-123634500D02* +X80645000Y-122872500D01* +X80645000Y-122872500D02* +X81023500Y-122494000D01* +X81023500Y-122494000D02* +X82045000Y-122494000D01* +X80010000Y-124269500D02* +X80645000Y-123634500D01* +X76350500Y-124269500D02* +X77177900Y-124269500D01* +X79705200Y-124383800D02* +X79781400Y-124460000D01* +X77292200Y-124383800D02* +X79705200Y-124383800D01* +X77177900Y-124269500D02* +X77292200Y-124383800D01* +D42* +X71437500Y-128472500D02* +X71437500Y-127596900D01* +X71780400Y-127254000D02* +X72072500Y-127254000D01* +X71437500Y-127596900D02* +X71780400Y-127254000D01* +D40* +X87249000Y-121602500D02* +X90805000Y-121602500D01* +X86157500Y-122694000D02* +X87249000Y-121602500D01* +X94551500Y-137477500D02* +X94805500Y-137731500D01* +X95504000Y-123749500D02* +X95504000Y-126913000D01* +X95504000Y-126913000D02* +X95781500Y-127190500D01* +X76350500Y-124269500D02* +X80010000Y-124269500D01* +X81023500Y-122494000D02* +X82045000Y-122494000D01* +X80645000Y-122872500D02* +X81023500Y-122494000D01* +X83302500Y-122494000D02* +X83502500Y-122694000D01* +X78961000Y-130810000D02* +X77470000Y-130810000D01* +X77470000Y-130810000D02* +X76200000Y-132080000D01* +X68707000Y-133338000D02* +X66052000Y-133338000D01* +X66052000Y-133338000D02* +X66040000Y-133350000D01* +X68719000Y-130302000D02* +X68719000Y-131826000D01* +X68719000Y-131826000D02* +X68707000Y-131838000D01* +X68719000Y-130302000D02* +X66548000Y-130302000D01* +X66548000Y-130302000D02* +X66040000Y-130810000D01* +X68707000Y-130314000D02* +X68719000Y-130302000D01* +X66802000Y-130048000D02* +X66040000Y-130810000D01* +X68707000Y-136259000D02* +X68211000Y-136259000D01* +X68211000Y-136259000D02* +X66040000Y-138430000D01* +X68707000Y-136259000D02* +X68707000Y-136398000D01* +X66675000Y-138430000D02* +X66040000Y-138430000D01* +X68707000Y-134759000D02* +X69977000Y-134759000D01* +X69977000Y-134759000D02* +X70358000Y-134378000D01* +X68707000Y-134759000D02* +X67171000Y-134759000D01* +X67171000Y-134759000D02* +X66040000Y-135890000D01* +X68707000Y-134759000D02* +X68949000Y-134759000D01* +X68707000Y-134759000D02* +X68441000Y-134759000D01* +D42* +X74358500Y-127762000D02* +X74358500Y-125793500D01* +X74358500Y-125793500D02* +X73850500Y-125285500D01* +X73850500Y-125285500D02* +X73850500Y-124269500D01* +D40* +X82677000Y-130175000D02* +X82677000Y-131851400D01* +X88888000Y-142532800D02* +X88888000Y-143129000D01* +X88595200Y-142240000D02* +X88888000Y-142532800D01* +X88392000Y-142240000D02* +X88595200Y-142240000D01* +X88138000Y-141986000D02* +X88392000Y-142240000D01* +X87020400Y-141986000D02* +X88138000Y-141986000D01* +X84429600Y-136702800D02* +X84429600Y-137210800D01* +X83108800Y-135382000D02* +X84429600Y-136702800D01* +X83108800Y-134975600D02* +X83108800Y-135382000D01* +X82042000Y-133908800D02* +X83108800Y-134975600D01* +X82042000Y-132486400D02* +X82042000Y-133908800D01* +X82677000Y-131851400D02* +X82042000Y-132486400D01* +X73850500Y-125285500D02* +X73850500Y-124269500D01* +X74358500Y-125793500D02* +X73850500Y-125285500D01* +X71437500Y-129972500D02* +X71437500Y-131064000D01* +X72453500Y-132080000D02* +X73660000Y-132080000D01* +X71437500Y-131064000D02* +X72453500Y-132080000D01* +X73989500Y-124003500D02* +X73533000Y-124460000D01* +X73660000Y-132080000D02* +X72390000Y-130810000D01* +X83312000Y-130810000D02* +X84361000Y-130810000D01* +X82613500Y-130111500D02* +X82677000Y-130175000D01* +X82677000Y-130175000D02* +X83312000Y-130810000D01* +X82613500Y-128651000D02* +X82613500Y-130111500D01* +X80010000Y-126047500D02* +X82613500Y-128651000D01* +X77851000Y-126047500D02* +X80010000Y-126047500D01* +X76136500Y-127762000D02* +X77851000Y-126047500D01* +X72961500Y-127762000D02* +X74358500Y-127762000D01* +X74358500Y-127762000D02* +X76136500Y-127762000D01* +X72390000Y-128333500D02* +X72961500Y-127762000D01* +X72390000Y-130810000D02* +X72390000Y-128333500D01* +X73660000Y-132080000D02* +X73660000Y-131508500D01* +D41* +X78486000Y-121970800D02* +X78486000Y-122685000D01* +X78486000Y-122685000D02* +X79245000Y-123444000D01* +D42* +X78917800Y-122402600D02* +X78486000Y-121970800D01* +X78486000Y-121970800D02* +X79222600Y-122707400D01* +X78359000Y-122402600D02* +X78917800Y-122402600D01* +X65468500Y-125222000D02* +X66738500Y-125222000D01* +X66738500Y-125222000D02* +X68961000Y-122999500D01* +X68961000Y-122999500D02* +X69049900Y-122999500D01* +X69049900Y-122999500D02* +X69646800Y-122402600D01* +X69646800Y-122402600D02* +X78359000Y-122402600D01* +X78359000Y-122402600D02* +X78409800Y-122402600D01* +X65468500Y-125222000D02* +X65468500Y-119573040D01* +X65468500Y-119573040D02* +X65595500Y-119446040D01* +D40* +X79245000Y-123444000D02* +X78994000Y-123444000D01* +X78994000Y-123444000D02* +X78549500Y-122999500D01* +X78549500Y-122999500D02* +X68961000Y-122999500D01* +X68961000Y-122999500D02* +X66738500Y-125222000D01* +X65468500Y-119573040D02* +X65595500Y-119446040D01* +X84717000Y-147510000D02* +X85598500Y-147510000D01* +X86804500Y-145300000D02* +X87388000Y-144716500D01* +X86804500Y-146304000D02* +X86804500Y-145300000D01* +X85598500Y-147510000D02* +X86804500Y-146304000D01* +X87388000Y-143129000D02* +X87388000Y-144716500D01* +X84717000Y-146710000D02* +X83845000Y-146710000D01* +X79679800Y-144983200D02* +X79654300Y-144983200D01* +X83502500Y-145923000D02* +X83375500Y-145796000D01* +X83502500Y-146367500D02* +X83502500Y-145923000D01* +X83845000Y-146710000D02* +X83502500Y-146367500D01* +X79679800Y-144792700D02* +X79654300Y-144792700D01* +X79654300Y-144792700D02* +X79679800Y-144792700D01* +X79679800Y-144792700D02* +X79654300Y-144792700D01* +X79667000Y-149360000D02* +X79654300Y-144983200D01* +X79654300Y-144983200D02* +X79654300Y-144792700D01* +X79654300Y-144792700D02* +X79476500Y-140589100D01* +X82740500Y-127000000D02* +X84361000Y-127000000D01* +X79476500Y-140589100D02* +X79502000Y-140563600D01* +X84361000Y-128270000D02* +X84361000Y-127000000D01* +X88798400Y-140512800D02* +X89420700Y-140525500D01* +X85928000Y-145110000D02* +X84717000Y-145110000D01* +X86055200Y-145237200D02* +X85928000Y-145110000D01* +X89420700Y-140525500D02* +X89509600Y-140614400D01* +X86868000Y-140512800D02* +X87146002Y-140512800D01* +X85814000Y-144310000D02* +X84717000Y-144310000D01* +X85902800Y-144221200D02* +X85814000Y-144310000D01* +X85902800Y-144068800D02* +X85902800Y-144221200D01* +X86309200Y-143662400D02* +X85902800Y-144068800D01* +X87680800Y-141047598D02* +X87680800Y-141325600D01* +X87146002Y-140512800D02* +X87680800Y-141047598D01* +X84717000Y-143510000D02* +X83515200Y-143510000D01* +X79418200Y-131622800D02* +X78961000Y-132080000D01* +X80111600Y-131622800D02* +X79418200Y-131622800D01* +X80365600Y-131876800D02* +X80111600Y-131622800D01* +X83515200Y-143510000D02* +X83413600Y-143611600D01* +X78961000Y-129540000D02* +X79908400Y-129540000D01* +X79908400Y-129540000D02* +X80264000Y-129895600D01* +X80264000Y-129895600D02* +X80264000Y-130759200D01* +X80264000Y-130759200D02* +X81026000Y-131521200D01* +X81026000Y-131521200D02* +X81026000Y-134162800D01* +X81026000Y-134162800D02* +X81838800Y-134975600D01* +X83058000Y-141071600D02* +X83528000Y-142710000D01* +X83528000Y-142710000D02* +X84717000Y-142710000D01* +X80467000Y-137660000D02* +X80467000Y-139141000D01* +X80836000Y-139510000D02* +X84717000Y-139510000D01* +X80467000Y-139141000D02* +X80836000Y-139510000D01* +X82867000Y-136462000D02* +X82867000Y-137660000D01* +X82931000Y-136398000D02* +X82867000Y-136462000D01* +X91313000Y-136017000D02* +X90805000Y-135509000D01* +X91313000Y-136144000D02* +X91313000Y-136017000D01* +X78867000Y-137660000D02* +X78867000Y-136652000D01* +X88582500Y-137414000D02* +X89281000Y-137414000D01* +X88582500Y-135636000D02* +X88582500Y-137414000D01* +X88455500Y-135509000D02* +X88582500Y-135636000D01* +X81724500Y-136334500D02* +X82423000Y-135636000D01* +X79184500Y-136334500D02* +X81724500Y-136334500D01* +X78867000Y-136652000D02* +X79184500Y-136334500D01* +X78867000Y-137660000D02* +X78867000Y-136906000D01* +X73017000Y-140310000D02* +X73913600Y-140310000D01* +X81280000Y-125159000D02* +X82045000Y-124394000D01* +X81280000Y-125425200D02* +X81280000Y-125159000D01* +X81178400Y-125526800D02* +X81280000Y-125425200D01* +X73913600Y-140310000D02* +X74879200Y-139344400D01* +X90757400Y-123228540D02* +X90757400Y-124094900D01* +X74981000Y-141910000D02* +X73017000Y-141910000D01* +X75184000Y-142113000D02* +X74981000Y-141910000D01* +X90757400Y-124094900D02* +X91376500Y-124714000D01* +X73017000Y-142710000D02* +X74384000Y-142710000D01* +X90107400Y-124522600D02* +X90107400Y-123228540D01* +X90017600Y-124612400D02* +X90107400Y-124522600D01* +X81127600Y-144170400D02* +X80873600Y-141655800D01* +X81229200Y-144272000D02* +X81127600Y-144170400D01* +X75387200Y-143713200D02* +X78943200Y-143713200D01* +X74384000Y-142710000D02* +X75387200Y-143713200D01* +X73017000Y-143510000D02* +X72136000Y-143510000D01* +X72136000Y-143510000D02* +X71818500Y-143192500D01* +X71818500Y-143192500D02* +X71818500Y-141287500D01* +X71818500Y-141287500D02* +X71068500Y-140537500D01* +X71068500Y-140537500D02* +X69749100Y-140537500D01* +X69749100Y-140537500D02* +X69748400Y-140536800D01* +X71068500Y-140537500D02* +X70231000Y-140537500D01* +X71818500Y-141287500D02* +X71068500Y-140537500D01* +X71818500Y-143192500D02* +X71818500Y-141287500D01* +X72136000Y-143510000D02* +X71818500Y-143192500D01* +X70040500Y-143141000D02* +X70941500Y-143141000D01* +X70941500Y-143141000D02* +X72110500Y-144310000D01* +X72110500Y-144310000D02* +X73017000Y-144310000D01* +X70231000Y-143141000D02* +X70624000Y-143141000D01* +X69786500Y-145744500D02* +X69786500Y-146367500D01* +X74244200Y-146532600D02* +X73169000Y-146558000D01* +X74345800Y-146761200D02* +X74244200Y-146532600D01* +X70548500Y-146875500D02* +X70815200Y-147320000D01* +X70548500Y-146685000D02* +X70548500Y-146875500D01* +X70358000Y-146494500D02* +X70548500Y-146685000D01* +X69913500Y-146494500D02* +X70358000Y-146494500D01* +X69786500Y-146367500D02* +X69913500Y-146494500D01* +X73169000Y-146558000D02* +X73017000Y-146710000D01* +X72992000Y-146685000D02* +X73017000Y-146710000D01* +X70231000Y-148348000D02* +X70231000Y-148691600D01* +X73017000Y-148302600D02* +X73017000Y-147510000D01* +X73126600Y-148412200D02* +X73017000Y-148302600D01* +X71678800Y-149529800D02* +X71678800Y-149783800D01* +X71272400Y-149123400D02* +X71678800Y-149529800D01* +X70662800Y-149123400D02* +X71272400Y-149123400D01* +X70231000Y-148691600D02* +X70662800Y-149123400D01* +X74867000Y-149360000D02* +X74867000Y-147573500D01* +X85344000Y-149860000D02* +X87566500Y-149860000D01* +X83502500Y-148018500D02* +X85344000Y-149860000D01* +X83502500Y-147066000D02* +X83502500Y-148018500D01* +X82867500Y-146431000D02* +X83502500Y-147066000D01* +X76009500Y-146431000D02* +X78943200Y-145719800D01* +X74867000Y-147573500D02* +X76009500Y-146431000D01* +X75667000Y-149360000D02* +X75667000Y-147853000D01* +X75667000Y-147853000D02* +X78536800Y-146634200D01* +X84361000Y-133350000D02* +X82994500Y-133350000D01* +X81267000Y-148005500D02* +X81267000Y-149360000D01* +X80454500Y-147193000D02* +X81267000Y-148005500D01* +X80200500Y-141236700D02* +X80454500Y-147193000D01* +X80137000Y-141173200D02* +X80200500Y-141236700D01* +X84361000Y-133350000D02* +X84361000Y-134620000D01* +X82867000Y-149360000D02* +X82867000Y-150329400D01* +X94030800Y-142595600D02* +X94030800Y-141808200D01* +X92252800Y-144373600D02* +X94030800Y-142595600D01* +X84099400Y-150291800D02* +X84404200Y-149987000D01* +X82904600Y-150291800D02* +X84099400Y-150291800D01* +X82867000Y-150329400D02* +X82904600Y-150291800D01* +X87427500Y-135624000D02* +X87427500Y-135318500D01* +X87427500Y-133731000D02* +X87058500Y-133731000D01* +X86741000Y-126238000D02* +X87185500Y-125793500D01* +X87058500Y-133731000D02* +X86741000Y-133413500D01* +X87185500Y-125793500D02* +X87427500Y-125793500D01* +X87427500Y-135318500D02* +X87427500Y-136906000D01* +X87427500Y-135318500D02* +X87427500Y-133731000D01* +X68643500Y-148348000D02* +X66282000Y-148348000D01* +X66282000Y-148348000D02* +X66040000Y-148590000D01* +X66040000Y-146050000D02* +X68147500Y-146050000D01* +X68147500Y-146050000D02* +X68453000Y-145744500D01* +X66345500Y-145744500D02* +X66040000Y-146050000D01* +X68453000Y-143141000D02* +X66409000Y-143141000D01* +X66409000Y-143141000D02* +X66040000Y-143510000D01* +X66409000Y-143141000D02* +X66040000Y-143510000D01* +X67970400Y-140536800D02* +X66473200Y-140536800D01* +X66473200Y-140536800D02* +X66040000Y-140970000D01* +X66472500Y-140537500D02* +X66040000Y-140970000D01* +X66472500Y-140537500D02* +X66040000Y-140970000D01* +X89585800Y-136779000D02* +X89281000Y-136779000D01* +X89966800Y-137160000D02* +X89585800Y-136779000D01* +X89966800Y-137668000D02* +X89966800Y-137160000D01* +X90373200Y-138074400D02* +X89966800Y-137668000D01* +X91249500Y-142113000D02* +X90805000Y-142113000D01* +X91249500Y-142113000D02* +X90741500Y-142113000D01* +X91313000Y-136779000D02* +X91821000Y-136779000D01* +X91948000Y-136906000D02* +X91948000Y-138874500D01* +X91821000Y-136779000D02* +X91948000Y-136906000D01* +X91948000Y-138874500D02* +X91249500Y-139573000D01* +X85927500Y-133731000D02* +X85927500Y-132080000D01* +X85927500Y-132080000D02* +X84361000Y-132080000D01* +X85927500Y-125793500D02* +X82740500Y-125793500D01* +X83312000Y-129540000D02* +X84361000Y-129540000D01* +X83127002Y-129355002D02* +X83312000Y-129540000D01* +X83127002Y-128339002D02* +X83127002Y-129355002D01* +X82042000Y-127254000D02* +X83127002Y-128339002D01* +X82042000Y-126492000D02* +X82042000Y-127254000D01* +X82740500Y-125793500D02* +X82042000Y-126492000D01* +X85927500Y-127381000D02* +X85927500Y-125793500D01* +X84424500Y-129476500D02* +X84361000Y-129540000D01* +X67970400Y-142036800D02* +X69748400Y-142036800D01* +X68453000Y-144641000D02* +X70040500Y-144641000D01* +X68453000Y-147244500D02* +X69786500Y-147244500D01* +X68643500Y-149848000D02* +X70231000Y-149848000D01* +X78961000Y-128270000D02* +X80010000Y-128270000D01* +X80010000Y-128270000D02* +X80467200Y-128727200D01* +X71616000Y-138938000D02* +X71501000Y-138938000D01* +X71501000Y-138938000D02* +X70675500Y-138112500D01* +X69266500Y-138112500D02* +X68707000Y-137553000D01* +X70675500Y-138112500D02* +X69266500Y-138112500D01* +X71616000Y-140093000D02* +X71616000Y-138938000D01* +X71564500Y-140144500D02* +X71616000Y-140093000D01* +X72961500Y-137045000D02* +X74029000Y-137045000D01* +X74029000Y-137045000D02* +X74041000Y-137033000D01* +X79024500Y-128333500D02* +X78961000Y-128270000D01* +X86868000Y-141147800D02* +X86690200Y-141147800D01* +X86690200Y-141147800D02* +X86131400Y-141706600D01* +X86131400Y-141706600D02* +X86131400Y-142367000D01* +X81635600Y-141376400D02* +X80594200Y-140335000D01* +X80594200Y-140335000D02* +X80416400Y-140335000D01* +X80416400Y-140335000D02* +X79984600Y-139903200D01* +X79984600Y-139903200D02* +X78867000Y-139903200D01* +X78867000Y-139903200D02* +X76936600Y-141833600D01* +X76936600Y-141833600D02* +X76936600Y-142951200D01* +X76301600Y-144678400D02* +X76047600Y-144932400D01* +X76047600Y-144932400D02* +X74726800Y-144932400D01* +X71145400Y-141630400D02* +X70789800Y-141274800D01* +X70789800Y-141274800D02* +X69088000Y-141274800D01* +X69088000Y-141274800D02* +X68884800Y-141071600D01* +X68884800Y-141071600D02* +X68884800Y-140004800D01* +X68884800Y-140004800D02* +X69469000Y-139420600D01* +X69469000Y-139420600D02* +X69469000Y-138938000D01* +X70116000Y-138938000D02* +X69469000Y-138938000D01* +X69469000Y-138938000D02* +X68822000Y-138938000D01* +X68822000Y-138938000D02* +X68707000Y-139053000D01* +X76708000Y-135878000D02* +X79704500Y-135878000D01* +X80073500Y-133350000D02* +X78961000Y-133350000D01* +X80264000Y-133540500D02* +X80073500Y-133350000D01* +X80264000Y-135318500D02* +X80264000Y-133540500D01* +X79704500Y-135878000D02* +X80264000Y-135318500D01* +X75057000Y-135878000D02* +X76708000Y-135878000D01* +X73406000Y-135878000D02* +X75057000Y-135878000D01* +X74981500Y-134378000D02* +X74358500Y-135001000D01* +X88201500Y-139890500D02* +X88849200Y-139903200D01* +X88188800Y-139954000D02* +X88201500Y-139890500D01* +X88239600Y-140208000D02* +X88239600Y-139954000D01* +X88239600Y-139954000D02* +X88239600Y-140208000D01* +X74358500Y-135001000D02* +X71818500Y-135001000D01* +X76708000Y-134378000D02* +X74981500Y-134378000D01* +X75057000Y-134378000D02* +X76708000Y-134378000D01* +X78961000Y-134620000D02* +X78549500Y-134620000D01* +X78549500Y-134620000D02* +X77533500Y-133604000D01* +X77533500Y-133604000D02* +X74180000Y-133604000D01* +X74180000Y-133604000D02* +X73406000Y-134378000D01* +X70358000Y-133211000D02* +X70854000Y-133211000D01* +X72021000Y-134378000D02* +X73406000Y-134378000D01* +X70854000Y-133211000D02* +X72021000Y-134378000D01* +X73406000Y-134378000D02* +X73013000Y-134378000D01* +X78961000Y-127000000D02* +X79857600Y-127000000D01* +X71616000Y-136156000D02* +X71616000Y-137287000D01* +X71831200Y-135940800D02* +X71616000Y-136156000D01* +X79857600Y-127000000D02* +X80213200Y-127355600D01* +X71616000Y-137287000D02* +X71616000Y-137783000D01* +X71616000Y-137783000D02* +X72378000Y-138545000D01* +X72378000Y-138545000D02* +X72961500Y-138545000D01* +X79024500Y-127063500D02* +X78961000Y-127000000D01* +X70358000Y-131711000D02* +X70358000Y-130441000D01* +X70358000Y-130441000D02* +X70219000Y-130302000D01* +X70358000Y-130441000D02* +X70219000Y-130302000D01* +X70116000Y-137287000D02* +X70116000Y-136120000D01* +X70116000Y-136120000D02* +X70358000Y-135878000D01* +M02* diff --git a/PCB/OUTPUT_V35/Tinylab_proto1-F_Mask.gbr b/PCB/OUTPUT_V35/Tinylab_proto1-F_Mask.gbr new file mode 100644 index 00000000..f88be37e --- /dev/null +++ b/PCB/OUTPUT_V35/Tinylab_proto1-F_Mask.gbr @@ -0,0 +1,290 @@ +G04 #@! TF.FileFunction,Soldermask,Top* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 02/02/2016 11:58:07 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,0.800000X0.750000*% +%ADD12R,0.750000X0.800000*% +%ADD13R,1.300000X1.300000*% +%ADD14C,1.300000*% +%ADD15C,1.998980*% +%ADD16R,1.998980X1.998980*% +%ADD17R,1.600000X1.000000*% +%ADD18R,1.600000X0.560000*% +%ADD19R,0.560000X1.600000*% +%ADD20R,1.905000X1.905000*% +%ADD21C,1.905000*% +%ADD22R,2.032000X1.727200*% +%ADD23O,2.032000X1.727200*% +%ADD24R,0.400000X1.350000*% +%ADD25O,1.250000X0.950000*% +%ADD26O,1.000000X1.550000*% +%ADD27R,1.727200X1.727200*% +%ADD28O,1.727200X1.727200*% +%ADD29R,1.727200X2.032000*% +%ADD30O,1.727200X2.032000*% +%ADD31R,2.032000X2.032000*% +%ADD32O,2.032000X2.032000*% +%ADD33R,0.900000X0.600000*% +%ADD34R,0.500000X0.900000*% +%ADD35R,0.900000X0.500000*% +%ADD36R,0.600000X0.900000*% +%ADD37R,1.500000X0.600000*% +%ADD38R,0.508000X0.304800*% +G04 APERTURE END LIST* +D10* +D11* +X86054500Y-130492500D03* +X87554500Y-130492500D03* +X86054500Y-128968500D03* +X87554500Y-128968500D03* +D12* +X92519500Y-130885500D03* +X92519500Y-132385500D03* +D11* +X95619000Y-135064500D03* +X94119000Y-135064500D03* +X87554500Y-138430000D03* +X86054500Y-138430000D03* +D13* +X94805500Y-147510500D03* +D14* +X94805500Y-145010500D03* +D11* +X79363000Y-151003000D03* +X77863000Y-151003000D03* +D13* +X93281500Y-127190500D03* +D14* +X95781500Y-127190500D03* +D12* +X83502500Y-124194000D03* +X83502500Y-122694000D03* +X71374000Y-146292000D03* +X71374000Y-144792000D03* +X95504000Y-122249500D03* +X95504000Y-123749500D03* +X68707000Y-133338000D03* +X68707000Y-131838000D03* +X68707000Y-136259000D03* +X68707000Y-134759000D03* +D14* +X76350500Y-124269500D03* +D13* +X73850500Y-124269500D03* +D12* +X71437500Y-129972500D03* +X71437500Y-128472500D03* +D15* +X65595500Y-119446040D03* +D16* +X75755500Y-119446040D03* +D17* +X94551500Y-139485500D03* +X94551500Y-136485500D03* +D18* +X84717000Y-147510000D03* +X84717000Y-146710000D03* +X84717000Y-145910000D03* +X84717000Y-145110000D03* +X84717000Y-144310000D03* +X84717000Y-143510000D03* +X84717000Y-142710000D03* +X84717000Y-141910000D03* +X84717000Y-141110000D03* +X84717000Y-140310000D03* +X84717000Y-139510000D03* +D19* +X82867000Y-137660000D03* +X82067000Y-137660000D03* +X81267000Y-137660000D03* +X80467000Y-137660000D03* +X79667000Y-137660000D03* +X78867000Y-137660000D03* +X78067000Y-137660000D03* +X77267000Y-137660000D03* +X76467000Y-137660000D03* +X75667000Y-137660000D03* +X74867000Y-137660000D03* +D18* +X73017000Y-139510000D03* +X73017000Y-140310000D03* +X73017000Y-141110000D03* +X73017000Y-141910000D03* +X73017000Y-142710000D03* +X73017000Y-143510000D03* +X73017000Y-144310000D03* +X73017000Y-145110000D03* +X73017000Y-145910000D03* +X73017000Y-146710000D03* +X73017000Y-147510000D03* +D19* +X74867000Y-149360000D03* +X75667000Y-149360000D03* +X76467000Y-149360000D03* +X77267000Y-149360000D03* +X78067000Y-149360000D03* +X78867000Y-149360000D03* +X79667000Y-149360000D03* +X80467000Y-149360000D03* +X81267000Y-149360000D03* +X82067000Y-149360000D03* +X82867000Y-149360000D03* +D20* +X65468500Y-125222000D03* +D21* +X70548500Y-125222000D03* +D22* +X90043000Y-126301500D03* +D23* +X90043000Y-128841500D03* +X90043000Y-131381500D03* +X90043000Y-133921500D03* +D24* +X91407400Y-123228540D03* +X90757400Y-123228540D03* +X90107400Y-123228540D03* +X89457400Y-123228540D03* +X88807400Y-123228540D03* +D25* +X92607400Y-123228540D03* +X87607400Y-123228540D03* +D26* +X93607400Y-120528540D03* +X86607400Y-120528540D03* +D22* +X66040000Y-148590000D03* +D23* +X66040000Y-146050000D03* +X66040000Y-143510000D03* +X66040000Y-140970000D03* +D27* +X90106500Y-149860000D03* +D28* +X87566500Y-149860000D03* +X90106500Y-147320000D03* +X87566500Y-147320000D03* +D29* +X83693000Y-119380000D03* +D30* +X81153000Y-119380000D03* +X78613000Y-119380000D03* +D22* +X66040000Y-130810000D03* +D23* +X66040000Y-133350000D03* +X66040000Y-135890000D03* +X66040000Y-138430000D03* +D27* +X73660000Y-132080000D03* +D28* +X73660000Y-129540000D03* +X76200000Y-132080000D03* +X76200000Y-129540000D03* +D31* +X91249500Y-142113000D03* +D32* +X91249500Y-139573000D03* +D33* +X79245000Y-123444000D03* +X82045000Y-122494000D03* +X82045000Y-124394000D03* +D34* +X85927500Y-132080000D03* +X87427500Y-132080000D03* +X85927500Y-127381000D03* +X87427500Y-127381000D03* +X85927500Y-133731000D03* +X87427500Y-133731000D03* +X87427500Y-125793500D03* +X85927500Y-125793500D03* +X85927500Y-135318500D03* +X87427500Y-135318500D03* +X85927500Y-136906000D03* +X87427500Y-136906000D03* +D35* +X67970400Y-142036800D03* +X67970400Y-140536800D03* +X68453000Y-144641000D03* +X68453000Y-143141000D03* +X68453000Y-147244500D03* +X68453000Y-145744500D03* +X68643500Y-149848000D03* +X68643500Y-148348000D03* +X69748400Y-140536800D03* +X69748400Y-142036800D03* +X70040500Y-143141000D03* +X70040500Y-144641000D03* +X69786500Y-145744500D03* +X69786500Y-147244500D03* +X70231000Y-148348000D03* +X70231000Y-149848000D03* +X68707000Y-137553000D03* +X68707000Y-139053000D03* +D34* +X71616000Y-138938000D03* +X70116000Y-138938000D03* +D35* +X75057000Y-135878000D03* +X75057000Y-134378000D03* +X76708000Y-135878000D03* +X76708000Y-134378000D03* +X73406000Y-134378000D03* +X73406000Y-135878000D03* +X72961500Y-138545000D03* +X72961500Y-137045000D03* +D34* +X82093500Y-151066500D03* +X80593500Y-151066500D03* +D35* +X70358000Y-131711000D03* +X70358000Y-133211000D03* +D34* +X70116000Y-137287000D03* +X71616000Y-137287000D03* +X68719000Y-130302000D03* +X70219000Y-130302000D03* +D35* +X70358000Y-134378000D03* +X70358000Y-135878000D03* +D34* +X88888000Y-143129000D03* +X87388000Y-143129000D03* +X87388000Y-144716500D03* +X88888000Y-144716500D03* +D36* +X94869000Y-130870500D03* +X95819000Y-133670500D03* +X93919000Y-133670500D03* +D37* +X84361000Y-134620000D03* +X84361000Y-133350000D03* +X84361000Y-132080000D03* +X84361000Y-130810000D03* +X84361000Y-129540000D03* +X84361000Y-128270000D03* +X84361000Y-127000000D03* +X78961000Y-127000000D03* +X78961000Y-128270000D03* +X78961000Y-129540000D03* +X78961000Y-130810000D03* +X78961000Y-132080000D03* +X78961000Y-133350000D03* +X78961000Y-134620000D03* +D38* +X88900000Y-141147800D03* +X88900000Y-139877800D03* +X86868000Y-141147800D03* +X88900000Y-140512800D03* +X86868000Y-139877800D03* +X86868000Y-140512800D03* +X91313000Y-137414000D03* +X91313000Y-136144000D03* +X89281000Y-137414000D03* +X91313000Y-136779000D03* +X89281000Y-136144000D03* +X89281000Y-136779000D03* +M02* diff --git a/PCB/OUTPUT_V35/Tinylab_proto1.kicad_pcb b/PCB/OUTPUT_V35/Tinylab_proto1.kicad_pcb new file mode 100644 index 00000000..accffff3 --- /dev/null +++ b/PCB/OUTPUT_V35/Tinylab_proto1.kicad_pcb @@ -0,0 +1,3082 @@ +(kicad_pcb (version 4) (host pcbnew "(2015-08-05 BZR 6055, Git fa29c62)-product") + + (general + (links 128) + (no_connects 6) + (area 62.526905 115.741 100.356691 155.935) + (thickness 1.6) + (drawings 10) + (tracks 837) + (zones 0) + (modules 59) + (nets 73) + ) + + (page A4) + (layers + (0 F.Cu signal) + (31 B.Cu signal) + (32 B.Adhes user) + (33 F.Adhes user) + (34 B.Paste user) + (35 F.Paste user) + (36 B.SilkS user) + (37 F.SilkS user) + (38 B.Mask user) + (39 F.Mask user) + (40 Dwgs.User user) + (41 Cmts.User user) + (42 Eco1.User user) + (43 Eco2.User user) + (44 Edge.Cuts user) + (45 Margin user) + (46 B.CrtYd user) + (47 F.CrtYd user) + (48 B.Fab user) + (49 F.Fab user) + ) + + (setup + (last_trace_width 0.25) + (user_trace_width 0.508) + (user_trace_width 1.016) + (trace_clearance 0.2) + (zone_clearance 0.508) + (zone_45_only no) + (trace_min 0.2) + (segment_width 0.2) + (edge_width 0.1) + (via_size 0.6) + (via_drill 0.4) + (via_min_size 0.4) + (via_min_drill 0.3) + (uvia_size 0.3) + (uvia_drill 0.1) + (uvias_allowed no) + (uvia_min_size 0.2) + (uvia_min_drill 0.1) + (pcb_text_width 0.3) + (pcb_text_size 1.5 1.5) + (mod_edge_width 0.15) + (mod_text_size 1 1) + (mod_text_width 0.15) + (pad_size 1.5 1.5) + (pad_drill 0.6) + (pad_to_mask_clearance 0) + (aux_axis_origin 0 0) + (visible_elements 7FFFFFDF) + (pcbplotparams + (layerselection 0x010c0_80000001) + (usegerberextensions false) + (excludeedgelayer true) + (linewidth 0.100000) + (plotframeref false) + (viasonmask false) + (mode 1) + (useauxorigin false) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15) + (hpglpenoverlay 2) + (psnegative false) + (psa4output false) + (plotreference true) + (plotvalue true) + (plotinvisibletext false) + (padsonsilk false) + (subtractmaskfromsilk false) + (outputformat 1) + (mirror false) + (drillshape 0) + (scaleselection 1) + (outputdirectory OUTPUT_V3/)) + ) + + (net 0 "") + (net 1 "Net-(C1-Pad1)") + (net 2 "Net-(C1-Pad2)") + (net 3 "Net-(C2-Pad1)") + (net 4 "Net-(C2-Pad2)") + (net 5 +5V) + (net 6 /AGND) + (net 7 /VCC_3V3) + (net 8 /AVCC) + (net 9 /VCC_PSU) + (net 10 /VGND) + (net 11 "Net-(C13-Pad1)") + (net 12 "Net-(C13-Pad2)") + (net 13 "Net-(C14-Pad1)") + (net 14 "Net-(C14-Pad2)") + (net 15 /PSU_OUT) + (net 16 "Net-(D1-Pad2)") + (net 17 /PSU_FEEDBACK) + (net 18 /CH2) + (net 19 "Net-(IC1-Pad3)") + (net 20 /TO_B0) + (net 21 /TO_B1) + (net 22 /DAC_OUT) + (net 23 /DAC_OUT2) + (net 24 "Net-(IC1-Pad8)") + (net 25 "Net-(IC1-Pad9)") + (net 26 "Net-(IC1-Pad10)") + (net 27 /XCK) + (net 28 /DIG_CH2) + (net 29 "Net-(IC1-Pad13)") + (net 30 "Net-(IC1-Pad16)") + (net 31 /DIG_CH1) + (net 32 "Net-(IC1-Pad20)") + (net 33 "Net-(IC1-Pad21)") + (net 34 "Net-(IC1-Pad22)") + (net 35 "Net-(IC1-Pad23)") + (net 36 /PSU_PWM) + (net 37 "Net-(IC1-Pad25)") + (net 38 /D-) + (net 39 /D+) + (net 40 "Net-(IC1-Pad28)") + (net 41 "Net-(IC1-Pad29)") + (net 42 "Net-(IC1-Pad32)") + (net 43 "Net-(IC1-Pad33)") + (net 44 "Net-(IC1-Pad34)") + (net 45 "Net-(IC1-Pad35)") + (net 46 "Net-(IC1-Pad36)") + (net 47 "Net-(IC1-Pad37)") + (net 48 "Net-(IC1-Pad41)") + (net 49 /CH1) + (net 50 "Net-(IC1-Pad43)") + (net 51 /AVCC_ON_2) + (net 52 "Net-(P2-Pad4)") + (net 53 "Net-(P3-Pad1)") + (net 54 "Net-(P3-Pad2)") + (net 55 "Net-(P3-Pad3)") + (net 56 "Net-(P3-Pad4)") + (net 57 "Net-(P8-Pad1)") + (net 58 "Net-(P8-Pad2)") + (net 59 "Net-(R1-Pad1)") + (net 60 "Net-(R2-Pad1)") + (net 61 "Net-(R11-Pad2)") + (net 62 "Net-(R12-Pad2)") + (net 63 "Net-(R13-Pad2)") + (net 64 "Net-(R10-Pad1)") + (net 65 "Net-(R15-Pad1)") + (net 66 "Net-(R15-Pad2)") + (net 67 "Net-(R17-Pad1)") + (net 68 "Net-(R17-Pad2)") + (net 69 "Net-(R19-Pad1)") + (net 70 "Net-(R20-Pad1)") + (net 71 "Net-(R22-Pad1)") + (net 72 "Net-(R23-Pad1)") + + (net_class Default "This is the default net class." + (clearance 0.2) + (trace_width 0.25) + (via_dia 0.6) + (via_drill 0.4) + (uvia_dia 0.3) + (uvia_drill 0.1) + (add_net +5V) + (add_net /AGND) + (add_net /AVCC) + (add_net /AVCC_ON_2) + (add_net /CH1) + (add_net /CH2) + (add_net /D+) + (add_net /D-) + (add_net /DAC_OUT) + (add_net /DAC_OUT2) + (add_net /DIG_CH1) + (add_net /DIG_CH2) + (add_net /PSU_FEEDBACK) + (add_net /PSU_OUT) + (add_net /PSU_PWM) + (add_net /TO_B0) + (add_net /TO_B1) + (add_net /VCC_3V3) + (add_net /VCC_PSU) + (add_net /VGND) + (add_net /XCK) + (add_net "Net-(C1-Pad1)") + (add_net "Net-(C1-Pad2)") + (add_net "Net-(C13-Pad1)") + (add_net "Net-(C13-Pad2)") + (add_net "Net-(C14-Pad1)") + (add_net "Net-(C14-Pad2)") + (add_net "Net-(C2-Pad1)") + (add_net "Net-(C2-Pad2)") + (add_net "Net-(D1-Pad2)") + (add_net "Net-(IC1-Pad10)") + (add_net "Net-(IC1-Pad13)") + (add_net "Net-(IC1-Pad16)") + (add_net "Net-(IC1-Pad20)") + (add_net "Net-(IC1-Pad21)") + (add_net "Net-(IC1-Pad22)") + (add_net "Net-(IC1-Pad23)") + (add_net "Net-(IC1-Pad25)") + (add_net "Net-(IC1-Pad28)") + (add_net "Net-(IC1-Pad29)") + (add_net "Net-(IC1-Pad3)") + (add_net "Net-(IC1-Pad32)") + (add_net "Net-(IC1-Pad33)") + (add_net "Net-(IC1-Pad34)") + (add_net "Net-(IC1-Pad35)") + (add_net "Net-(IC1-Pad36)") + (add_net "Net-(IC1-Pad37)") + (add_net "Net-(IC1-Pad41)") + (add_net "Net-(IC1-Pad43)") + (add_net "Net-(IC1-Pad8)") + (add_net "Net-(IC1-Pad9)") + (add_net "Net-(P2-Pad4)") + (add_net "Net-(P3-Pad1)") + (add_net "Net-(P3-Pad2)") + (add_net "Net-(P3-Pad3)") + (add_net "Net-(P3-Pad4)") + (add_net "Net-(P8-Pad1)") + (add_net "Net-(P8-Pad2)") + (add_net "Net-(R1-Pad1)") + (add_net "Net-(R10-Pad1)") + (add_net "Net-(R11-Pad2)") + (add_net "Net-(R12-Pad2)") + (add_net "Net-(R13-Pad2)") + (add_net "Net-(R15-Pad1)") + (add_net "Net-(R15-Pad2)") + (add_net "Net-(R17-Pad1)") + (add_net "Net-(R17-Pad2)") + (add_net "Net-(R19-Pad1)") + (add_net "Net-(R2-Pad1)") + (add_net "Net-(R20-Pad1)") + (add_net "Net-(R22-Pad1)") + (add_net "Net-(R23-Pad1)") + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA51F) + (at 86.8045 130.4925) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CAB611) + (attr smd) + (fp_text reference C1 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 2 "Net-(C1-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA525) + (at 86.8045 128.9685) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CAB4DE) + (attr smd) + (fp_text reference C2 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 4 "Net-(C2-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA52B) + (at 92.5195 131.6355 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB13E1) + (attr smd) + (fp_text reference C3 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA531) + (at 94.869 135.0645 180) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB147C) + (attr smd) + (fp_text reference C4 (at 0 -1.9 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 2 smd rect (at 0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA537) + (at 86.8045 138.43 180) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55D60181) + (attr smd) + (fp_text reference C5 (at 0 -1.9 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 8 /AVCC)) + (pad 2 smd rect (at 0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_ThroughHole:C_Radial_D5_L11_P2.5 (layer F.Cu) (tedit 0) (tstamp 56AEA53D) + (at 94.8055 147.5105 90) + (descr "Radial Electrolytic Capacitor Diameter 5mm x Length 11mm, Pitch 2.5mm") + (tags "Electrolytic Capacitor") + (path /566F5A75) + (fp_text reference C6 (at 1.25 -3.8 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.25 3.8 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.325 -2.499) (end 1.325 2.499) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.465 -2.491) (end 1.465 2.491) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 -2.475) (end 1.605 -0.095) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 0.095) (end 1.605 2.475) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 -2.451) (end 1.745 -0.49) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 0.49) (end 1.745 2.451) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 -2.418) (end 1.885 -0.657) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 0.657) (end 1.885 2.418) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 -2.377) (end 2.025 -0.764) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 0.764) (end 2.025 2.377) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 -2.327) (end 2.165 -0.835) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 0.835) (end 2.165 2.327) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 -2.266) (end 2.305 -0.879) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 0.879) (end 2.305 2.266) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 -2.196) (end 2.445 -0.898) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 0.898) (end 2.445 2.196) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 -2.114) (end 2.585 -0.896) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 0.896) (end 2.585 2.114) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 -2.019) (end 2.725 -0.871) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 0.871) (end 2.725 2.019) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 -1.908) (end 2.865 -0.823) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 0.823) (end 2.865 1.908) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 -1.78) (end 3.005 -0.745) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 0.745) (end 3.005 1.78) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 -1.631) (end 3.145 -0.628) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 0.628) (end 3.145 1.631) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 -1.452) (end 3.285 -0.44) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 0.44) (end 3.285 1.452) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 -1.233) (end 3.425 1.233) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.565 -0.944) (end 3.565 0.944) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.705 -0.472) (end 3.705 0.472) (layer F.SilkS) (width 0.15)) + (fp_circle (center 2.5 0) (end 2.5 -0.9) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -2.5375) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -2.8) (layer F.CrtYd) (width 0.05)) + (pad 1 thru_hole rect (at 0 0 90) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 7 /VCC_3V3)) + (pad 2 thru_hole circle (at 2.5 0 90) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (model Capacitors_ThroughHole.3dshapes/C_Radial_D5_L11_P2.5.wrl + (at (xyz 0.049213 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA549) + (at 78.613 151.003 180) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /56AF91A3) + (attr smd) + (fp_text reference C8 (at 0 -1.9 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 8 /AVCC)) + (pad 2 smd rect (at 0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_ThroughHole:C_Radial_D5_L11_P2.5 (layer F.Cu) (tedit 0) (tstamp 56AEA54F) + (at 93.2815 127.1905) + (descr "Radial Electrolytic Capacitor Diameter 5mm x Length 11mm, Pitch 2.5mm") + (tags "Electrolytic Capacitor") + (path /560719D9) + (fp_text reference C9 (at 1.25 -3.8) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.25 3.8) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.325 -2.499) (end 1.325 2.499) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.465 -2.491) (end 1.465 2.491) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 -2.475) (end 1.605 -0.095) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 0.095) (end 1.605 2.475) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 -2.451) (end 1.745 -0.49) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 0.49) (end 1.745 2.451) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 -2.418) (end 1.885 -0.657) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 0.657) (end 1.885 2.418) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 -2.377) (end 2.025 -0.764) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 0.764) (end 2.025 2.377) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 -2.327) (end 2.165 -0.835) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 0.835) (end 2.165 2.327) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 -2.266) (end 2.305 -0.879) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 0.879) (end 2.305 2.266) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 -2.196) (end 2.445 -0.898) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 0.898) (end 2.445 2.196) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 -2.114) (end 2.585 -0.896) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 0.896) (end 2.585 2.114) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 -2.019) (end 2.725 -0.871) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 0.871) (end 2.725 2.019) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 -1.908) (end 2.865 -0.823) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 0.823) (end 2.865 1.908) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 -1.78) (end 3.005 -0.745) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 0.745) (end 3.005 1.78) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 -1.631) (end 3.145 -0.628) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 0.628) (end 3.145 1.631) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 -1.452) (end 3.285 -0.44) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 0.44) (end 3.285 1.452) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 -1.233) (end 3.425 1.233) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.565 -0.944) (end 3.565 0.944) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.705 -0.472) (end 3.705 0.472) (layer F.SilkS) (width 0.15)) + (fp_circle (center 2.5 0) (end 2.5 -0.9) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -2.5375) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -2.8) (layer F.CrtYd) (width 0.05)) + (pad 1 thru_hole rect (at 0 0) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 9 /VCC_PSU)) + (pad 2 thru_hole circle (at 2.5 0) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 10 /VGND)) + (model Capacitors_ThroughHole.3dshapes/C_Radial_D5_L11_P2.5.wrl + (at (xyz 0.049213 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA555) + (at 83.5025 123.444 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /56071A50) + (attr smd) + (fp_text reference C10 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VCC_PSU)) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 10 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA55B) + (at 71.374 145.542 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /5608B4BE) + (attr smd) + (fp_text reference C11 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA561) + (at 95.504 122.9995 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55D75F49) + (attr smd) + (fp_text reference C12 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 10 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA567) + (at 68.707 132.588 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB630B) + (attr smd) + (fp_text reference C13 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 11 "Net-(C13-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 12 "Net-(C13-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA56D) + (at 68.707 135.509 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /566DF655) + (attr smd) + (fp_text reference C14 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 13 "Net-(C14-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 14 "Net-(C14-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5 (layer F.Cu) (tedit 0) (tstamp 56AEA573) + (at 73.8505 124.2695) + (descr "Radial Electrolytic Capacitor, Diameter 6.3mm x Length 11.2mm, Pitch 2.5mm") + (tags "Electrolytic Capacitor") + (path /560735FE) + (fp_text reference C15 (at 1.25 -4.4) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.25 4.4) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.325 -3.149) (end 1.325 3.149) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.465 -3.143) (end 1.465 3.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 -3.13) (end 1.605 -0.446) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 0.446) (end 1.605 3.13) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 -3.111) (end 1.745 -0.656) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 0.656) (end 1.745 3.111) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 -3.085) (end 1.885 -0.789) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 0.789) (end 1.885 3.085) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 -3.053) (end 2.025 -0.88) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 0.88) (end 2.025 3.053) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 -3.014) (end 2.165 -0.942) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 0.942) (end 2.165 3.014) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 -2.968) (end 2.305 -0.981) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 0.981) (end 2.305 2.968) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 -2.915) (end 2.445 -0.998) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 0.998) (end 2.445 2.915) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 -2.853) (end 2.585 -0.996) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 0.996) (end 2.585 2.853) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 -2.783) (end 2.725 -0.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 0.974) (end 2.725 2.783) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 -2.704) (end 2.865 -0.931) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 0.931) (end 2.865 2.704) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 -2.616) (end 3.005 -0.863) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 0.863) (end 3.005 2.616) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 -2.516) (end 3.145 -0.764) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 0.764) (end 3.145 2.516) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 -2.404) (end 3.285 -0.619) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 0.619) (end 3.285 2.404) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 -2.279) (end 3.425 -0.38) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 0.38) (end 3.425 2.279) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.565 -2.136) (end 3.565 2.136) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.705 -1.974) (end 3.705 1.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.845 -1.786) (end 3.845 1.786) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.985 -1.563) (end 3.985 1.563) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.125 -1.287) (end 4.125 1.287) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.265 -0.912) (end 4.265 0.912) (layer F.SilkS) (width 0.15)) + (fp_circle (center 2.5 0) (end 2.5 -1) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.1875) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.4) (layer F.CrtYd) (width 0.05)) + (pad 2 thru_hole circle (at 2.5 0) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 10 /VGND)) + (pad 1 thru_hole rect (at 0 0) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 15 /PSU_OUT)) + (model Capacitors_ThroughHole.3dshapes/C_Radial_D6.3_L11.2_P2.5.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA579) + (at 71.4375 129.2225 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /5607355F) + (attr smd) + (fp_text reference C16 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 15 /PSU_OUT)) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 10 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10 (layer F.Cu) (tedit 552FFCCE) (tstamp 56AEA57F) + (at 75.7555 119.4435 180) + (descr "Diode, DO-41, SOD81, Horizontal, RM 10mm,") + (tags "Diode, DO-41, SOD81, Horizontal, RM 10mm, 1N4007, SB140,") + (path /5606FDB4) + (fp_text reference D1 (at 5.38734 2.53746 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value D_Schottky (at 4.37134 -3.55854 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 7.62 -0.00254) (end 8.636 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -0.00254) (end 1.524 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.048 -1.27254) (end 3.048 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.302 -1.27254) (end 3.302 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.556 -1.27254) (end 3.556 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -1.27254) (end 2.794 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.175 -1.27254) (end 3.175 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 1.26746) (end 2.54 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 7.62 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 -1.27254) (end 7.62 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 1.26746) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at 10.16 -0.00254) (size 1.99898 1.99898) (drill 1.27) (layers *.Cu *.Mask F.SilkS) + (net 16 "Net-(D1-Pad2)")) + (pad 1 thru_hole rect (at 0 -0.00254) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.Mask F.SilkS) + (net 15 /PSU_OUT)) + ) + + (module Capacitors_SMD:C_1206 (layer F.Cu) (tedit 5415D7BD) (tstamp 56AEA585) + (at 94.5515 137.9855 90) + (descr "Capacitor SMD 1206, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 1206") + (path /55D739F3) + (attr smd) + (fp_text reference F1 (at 0 -2.3 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value F_Small (at 0 2.3 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.3 -1.15) (end 2.3 -1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.3 1.15) (end 2.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.3 -1.15) (end -2.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.3 -1.15) (end 2.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 -1.025) (end -1 -1.025) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 1.025) (end 1 1.025) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.5 0 90) (size 1 1.6) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 2 smd rect (at 1.5 0 90) (size 1 1.6) (layers F.Cu F.Paste F.Mask) + (net 10 /VGND)) + (model Capacitors_SMD.3dshapes/C_1206.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm (layer F.Cu) (tedit 54130A77) (tstamp 56AEA5B5) + (at 78.867 143.51 180) + (descr "LQFP44 (see Appnote_PCB_Guidelines_TRINAMIC_packages.pdf)") + (tags "QFP 0.8") + (path /55CA8F25) + (attr smd) + (fp_text reference IC1 (at 0 -7.65 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value ATXMEGA16A4U-A (at 0 7.65 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -6.9 -6.9) (end -6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start 6.9 -6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 -6.9) (end 6.9 -6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.175 -5.175) (end -5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -5.175) (end -4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -4.505) (end -6.65 -4.505) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -5.85 -4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 17 /PSU_FEEDBACK)) + (pad 2 smd rect (at -5.85 -3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 18 /CH2)) + (pad 3 smd rect (at -5.85 -2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 19 "Net-(IC1-Pad3)")) + (pad 4 smd rect (at -5.85 -1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 20 /TO_B0)) + (pad 5 smd rect (at -5.85 -0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 21 /TO_B1)) + (pad 6 smd rect (at -5.85 0 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 22 /DAC_OUT)) + (pad 7 smd rect (at -5.85 0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 23 /DAC_OUT2)) + (pad 8 smd rect (at -5.85 1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 24 "Net-(IC1-Pad8)")) + (pad 9 smd rect (at -5.85 2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 25 "Net-(IC1-Pad9)")) + (pad 10 smd rect (at -5.85 3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 26 "Net-(IC1-Pad10)")) + (pad 11 smd rect (at -5.85 4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 27 /XCK)) + (pad 12 smd rect (at -4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 28 /DIG_CH2)) + (pad 13 smd rect (at -3.2 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 29 "Net-(IC1-Pad13)")) + (pad 14 smd rect (at -2.4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 15 smd rect (at -1.6 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 27 /XCK)) + (pad 16 smd rect (at -0.8 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 30 "Net-(IC1-Pad16)")) + (pad 17 smd rect (at 0 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 31 /DIG_CH1)) + (pad 18 smd rect (at 0.8 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 19 smd rect (at 1.6 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 20 smd rect (at 2.4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 32 "Net-(IC1-Pad20)")) + (pad 21 smd rect (at 3.2 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 33 "Net-(IC1-Pad21)")) + (pad 22 smd rect (at 4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 34 "Net-(IC1-Pad22)")) + (pad 23 smd rect (at 5.85 4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 35 "Net-(IC1-Pad23)")) + (pad 24 smd rect (at 5.85 3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 36 /PSU_PWM)) + (pad 25 smd rect (at 5.85 2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 37 "Net-(IC1-Pad25)")) + (pad 26 smd rect (at 5.85 1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 38 /D-)) + (pad 27 smd rect (at 5.85 0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 39 /D+)) + (pad 28 smd rect (at 5.85 0 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 40 "Net-(IC1-Pad28)")) + (pad 29 smd rect (at 5.85 -0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 41 "Net-(IC1-Pad29)")) + (pad 30 smd rect (at 5.85 -1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 31 smd rect (at 5.85 -2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 32 smd rect (at 5.85 -3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 42 "Net-(IC1-Pad32)")) + (pad 33 smd rect (at 5.85 -4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 43 "Net-(IC1-Pad33)")) + (pad 34 smd rect (at 4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 44 "Net-(IC1-Pad34)")) + (pad 35 smd rect (at 3.2 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 45 "Net-(IC1-Pad35)")) + (pad 36 smd rect (at 2.4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 46 "Net-(IC1-Pad36)")) + (pad 37 smd rect (at 1.6 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 47 "Net-(IC1-Pad37)")) + (pad 38 smd rect (at 0.8 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 39 smd rect (at 0 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 8 /AVCC)) + (pad 40 smd rect (at -0.8 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 18 /CH2)) + (pad 41 smd rect (at -1.6 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 48 "Net-(IC1-Pad41)")) + (pad 42 smd rect (at -2.4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 49 /CH1)) + (pad 43 smd rect (at -3.2 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 50 "Net-(IC1-Pad43)")) + (pad 44 smd rect (at -4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 51 /AVCC_ON_2)) + (model Housings_QFP.3dshapes/LQFP-44_10x10mm_Pitch0.8mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Inductors:INDUCTOR_V (layer F.Cu) (tedit 0) (tstamp 56AEA5BB) + (at 68.0085 125.222) + (descr "Inductor (vertical)") + (tags INDUCTOR) + (path /5606EE9E) + (fp_text reference L1 (at 0 1.99898) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value INDUCTOR (at 0.09906 -1.99898) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 0 0) (end 3.81 0) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at -2.54 0) (size 1.905 1.905) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) + (net 16 "Net-(D1-Pad2)")) + (pad 2 thru_hole circle (at 2.54 0) (size 1.905 1.905) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) + (net 9 /VCC_PSU)) + (model Inductors.3dshapes/INDUCTOR_V.wrl + (at (xyz 0 0 0)) + (scale (xyz 2 2 2)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 (layer F.Cu) (tedit 0) (tstamp 56AEA5C3) + (at 90.043 126.3015) + (descr "Through hole pin header") + (tags "pin header") + (path /55CAB35C) + (fp_text reference P1 (at 0 -5.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SCOPE_IN (at 0 -3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 3 "Net-(C2-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 4 "Net-(C2-Pad2)")) + (pad 3 thru_hole oval (at 0 5.08) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 2 "Net-(C1-Pad2)")) + (pad 4 thru_hole oval (at 0 7.62) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 1 "Net-(C1-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Connect:USB_Micro-B (layer F.Cu) (tedit 5543E447) (tstamp 56AEA5D0) + (at 90.1065 121.666 180) + (descr "Micro USB Type B Receptacle") + (tags "USB USB_B USB_micro USB_OTG") + (path /55CA90D2) + (attr smd) + (fp_text reference P2 (at 0 -3.45 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value USB_OTG (at 0 4.8 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.6 -2.8) (end 4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 -2.8) (end 4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 4.05) (end -4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.6 4.05) (end -4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3509 3.81746) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 -2.58754) (end 4.3491 -2.58754) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 -2.58754) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 2.58746) (end -4.3509 2.58746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 3.81746) (end -4.3509 -2.58754) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.3009 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -0.6509 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 38 /D-)) + (pad 3 smd rect (at -0.0009 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 39 /D+)) + (pad 4 smd rect (at 0.6491 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 52 "Net-(P2-Pad4)")) + (pad 5 smd rect (at 1.2991 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 6 thru_hole oval (at -2.5009 -1.56254 270) (size 0.95 1.25) (drill oval 0.55 0.85) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 6 thru_hole oval (at 2.4991 -1.56254 270) (size 0.95 1.25) (drill oval 0.55 0.85) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 6 thru_hole oval (at -3.5009 1.13746 270) (size 1.55 1) (drill oval 1.15 0.5) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 6 thru_hole oval (at 3.4991 1.13746 270) (size 1.55 1) (drill oval 1.15 0.5) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 locked (layer F.Cu) (tedit 0) (tstamp 56AEA5D8) + (at 66.04 148.59 180) + (descr "Through hole pin header") + (tags "pin header") + (path /55CBF4D5) + (fp_text reference P3 (at 0 -5.1 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DIG_OUT (at 0 -3.1 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 53 "Net-(P3-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 54 "Net-(P3-Pad2)")) + (pad 3 thru_hole oval (at 0 5.08 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 55 "Net-(P3-Pad3)")) + (pad 4 thru_hole oval (at 0 7.62 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 56 "Net-(P3-Pad4)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_2x02 (layer F.Cu) (tedit 0) (tstamp 56AEA5E0) + (at 90.1065 149.86 180) + (descr "Through hole pin header") + (tags "pin header") + (path /56069A87) + (fp_text reference P4 (at 0 -5.1 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value PDI (at 0 -3.1 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.75) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 4.3 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 -1.55) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 -1.27) (end 3.81 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27) (end 3.81 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 3.81) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 7 /VCC_3V3)) + (pad 2 thru_hole oval (at 2.54 0 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 44 "Net-(IC1-Pad34)")) + (pad 3 thru_hole oval (at 0 2.54 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 4 thru_hole oval (at 2.54 2.54 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 45 "Net-(IC1-Pad35)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_2x02.wrl + (at (xyz 0.05 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x03 (layer F.Cu) (tedit 0) (tstamp 56AEA5E7) + (at 83.693 119.38 270) + (descr "Through hole pin header") + (tags "pin header") + (path /56065DA8) + (fp_text reference P5 (at 0 -5.1 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CONN_01X03 (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 6.85) (end 1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 6.35) (end 1.27 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 6.35) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 5 +5V)) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 9 /VCC_PSU)) + (pad 3 thru_hole oval (at 0 5.08 270) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 7 /VCC_3V3)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x03.wrl + (at (xyz 0 -0.1 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 locked (layer F.Cu) (tedit 0) (tstamp 56AEA5EF) + (at 66.04 130.81) + (descr "Through hole pin header") + (tags "pin header") + (path /566DF832) + (fp_text reference P6 (at 0 -5.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DAC_OUT (at 0 -3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 12 "Net-(C13-Pad2)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 11 "Net-(C13-Pad1)")) + (pad 3 thru_hole oval (at 0 5.08) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 14 "Net-(C14-Pad2)")) + (pad 4 thru_hole oval (at 0 7.62) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 13 "Net-(C14-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_2x02 (layer F.Cu) (tedit 0) (tstamp 56AEA5F7) + (at 73.66 132.08 90) + (descr "Through hole pin header") + (tags "pin header") + (path /55CC540F) + (fp_text reference P7 (at 0 -5.1 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value HVO (at 0 -3.1 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.75) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 4.3 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 -1.55) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 -1.27) (end 3.81 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27) (end 3.81 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 3.81) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 90) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 15 /PSU_OUT)) + (pad 2 thru_hole oval (at 2.54 0 90) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 10 /VGND)) + (pad 3 thru_hole oval (at 0 2.54 90) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 10 /VGND)) + (pad 4 thru_hole oval (at 2.54 2.54 90) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 10 /VGND)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_2x02.wrl + (at (xyz 0.05 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 54EA090C) (tstamp 56AEA5FD) + (at 91.2495 142.113 180) + (descr "Through hole pin header") + (tags "pin header") + (path /55D6DB77) + (fp_text reference P8 (at 0 -5.1 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DIG_IN (at 0 -3.1 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 57 "Net-(P8-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 180) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 58 "Net-(P8-Pad2)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module SMD:SOT-23-3 (layer F.Cu) (tedit 5508E933) (tstamp 56AEA604) + (at 80.645 123.444 270) + (path /5606F6D4) + (fp_text reference Q1 (at 2.5 0 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Q_NMOS_GSD (at -2.2 0 360) (layer F.Fab) hide + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 1 -0.4) (end 1.1 -0.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 -0.8) (end -1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 0.8) (end 1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 0.8) (end 1.5 -0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 -0.8) (end -1.5 -0.8) (layer F.SilkS) (width 0.15)) + (pad 3 smd rect (at 0 1.4 270) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 16 "Net-(D1-Pad2)")) + (pad 2 smd rect (at -0.95 -1.4 270) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 10 /VGND)) + (pad 1 smd rect (at 0.95 -1.4 270) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 36 /PSU_PWM)) + (model 3D/SMD/SOT-23-3.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA60A) + (at 86.6775 132.08) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAB95) + (attr smd) + (fp_text reference R1 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA610) + (at 86.6775 127.381) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAD4C) + (attr smd) + (fp_text reference R2 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R2-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA616) + (at 86.6775 133.731) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAABF4) + (attr smd) + (fp_text reference R3 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 51 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA61C) + (at 86.6775 125.7935 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAD11) + (attr smd) + (fp_text reference R4 (at 0 -1.9 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 51 /AVCC_ON_2)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R2-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA622) + (at 86.6775 135.3185) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAC5F) + (attr smd) + (fp_text reference R5 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 8 /AVCC)) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 51 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA628) + (at 86.6775 136.906) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAACD2) + (attr smd) + (fp_text reference R6 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 51 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA62E) + (at 67.9704 141.2868 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBCDA5) + (attr smd) + (fp_text reference R7 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R11-Pad2)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 56 "Net-(P3-Pad4)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA634) + (at 68.453 143.891 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE401) + (attr smd) + (fp_text reference R8 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R12-Pad2)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 55 "Net-(P3-Pad3)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA63A) + (at 68.453 146.4945 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE16B) + (attr smd) + (fp_text reference R9 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R13-Pad2)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 54 "Net-(P3-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA640) + (at 68.6435 149.098 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE2C7) + (attr smd) + (fp_text reference R10 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R10-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 53 "Net-(P3-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA646) + (at 69.7484 141.2868 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBCD2A) + (attr smd) + (fp_text reference R11 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 40 "Net-(IC1-Pad28)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R11-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA64C) + (at 70.0405 143.891 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE362) + (attr smd) + (fp_text reference R12 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 41 "Net-(IC1-Pad29)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R12-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA652) + (at 69.7865 146.4945 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE0F4) + (attr smd) + (fp_text reference R13 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 42 "Net-(IC1-Pad32)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R13-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA658) + (at 70.231 149.098 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE21C) + (attr smd) + (fp_text reference R14 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 43 "Net-(IC1-Pad33)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R10-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA65E) + (at 68.707 138.303 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56B0C779) + (attr smd) + (fp_text reference R15 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R15-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R15-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA664) + (at 70.866 138.938 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56B0C86E) + (attr smd) + (fp_text reference R16 (at 0 -1.9 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R15-Pad1)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R15-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA66A) + (at 75.057 135.128 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56AFE83E) + (attr smd) + (fp_text reference R17 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R17-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R17-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA670) + (at 76.708 135.128 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56AFE8F3) + (attr smd) + (fp_text reference R18 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R17-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R17-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA676) + (at 73.406 135.128 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56AECD86) + (attr smd) + (fp_text reference R19 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 69 "Net-(R19-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R17-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA67C) + (at 72.9615 137.795 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56B0C682) + (attr smd) + (fp_text reference R20 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 70 "Net-(R20-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R15-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA682) + (at 81.3435 151.0665 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56AF0DE2) + (attr smd) + (fp_text reference R21 (at 0 -1.9 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 8 /AVCC)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA688) + (at 70.358 132.461 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CB4680) + (attr smd) + (fp_text reference R22 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 71 "Net-(R22-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 69 "Net-(R19-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA68E) + (at 70.866 137.287) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566DE721) + (attr smd) + (fp_text reference R23 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 72 "Net-(R23-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 70 "Net-(R20-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA694) + (at 69.469 130.302) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CB9020) + (attr smd) + (fp_text reference R24 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 12 "Net-(C13-Pad2)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 71 "Net-(R22-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA69A) + (at 70.358 135.128 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566DE7E8) + (attr smd) + (fp_text reference R25 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 14 "Net-(C14-Pad2)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 72 "Net-(R23-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA6A0) + (at 88.138 143.129 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566E5C29) + (attr smd) + (fp_text reference R26 (at 0 -1.9 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 15 /PSU_OUT)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 17 /PSU_FEEDBACK)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA6A6) + (at 88.138 144.7165) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566E5CBE) + (attr smd) + (fp_text reference R27 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 17 /PSU_FEEDBACK)) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module SMD:SOT-23-3 (layer F.Cu) (tedit 5508E933) (tstamp 56AEA6AD) + (at 94.869 132.2705 180) + (path /55CA99FA) + (fp_text reference U1 (at 2.5 0 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value 78L05 (at -2.2 0 270) (layer F.Fab) hide + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 1 -0.4) (end 1.1 -0.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 -0.8) (end -1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 0.8) (end 1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 0.8) (end 1.5 -0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 -0.8) (end -1.5 -0.8) (layer F.SilkS) (width 0.15)) + (pad 3 smd rect (at 0 1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -0.95 -1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 1 smd rect (at 0.95 -1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model 3D/SMD/SOT-23-3.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm (layer F.Cu) (tedit 54130A77) (tstamp 56AEA6BF) + (at 81.661 130.81 180) + (descr "14-Lead Plastic Small Outline (SL) - Narrow, 3.90 mm Body [SOIC] (see Microchip Packaging Specification 00000049BS.pdf)") + (tags "SOIC 1.27") + (path /55CA87E2) + (attr smd) + (fp_text reference U2 (at 0 -5.375 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value LM324 (at 0 5.375 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.7 -4.65) (end -3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.7 -4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 -4.65) (end 3.7 -4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.075 -4.45) (end -2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 -4.45) (end 2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 4.45) (end 2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end -2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.45) (end 2.075 -4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end 2.075 4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.335) (end -3.45 -4.335) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2.7 -3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 49 /CH1)) + (pad 2 smd rect (at -2.7 -2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 49 /CH1)) + (pad 3 smd rect (at -2.7 -1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R1-Pad1)")) + (pad 4 smd rect (at -2.7 0 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 15 /PSU_OUT)) + (pad 5 smd rect (at -2.7 1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R2-Pad1)")) + (pad 6 smd rect (at -2.7 2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 18 /CH2)) + (pad 7 smd rect (at -2.7 3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 18 /CH2)) + (pad 8 smd rect (at 2.7 3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 70 "Net-(R20-Pad1)")) + (pad 9 smd rect (at 2.7 2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R15-Pad1)")) + (pad 10 smd rect (at 2.7 1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 23 /DAC_OUT2)) + (pad 11 smd rect (at 2.7 0 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 10 /VGND)) + (pad 12 smd rect (at 2.7 -1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 22 /DAC_OUT)) + (pad 13 smd rect (at 2.7 -2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R17-Pad1)")) + (pad 14 smd rect (at 2.7 -3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 69 "Net-(R19-Pad1)")) + (model Housings_SOIC.3dshapes/SOIC-14_3.9x8.7mm_Pitch1.27mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module TO_SOT_Packages_SMD:SOT-363 (layer F.Cu) (tedit 56735562) (tstamp 56AEA6C9) + (at 87.884 140.5128 180) + (descr SOT353) + (path /56B012DD) + (attr smd) + (fp_text reference U3 (at 0.09906 0 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DMN63D8LDW (at 0.09906 0 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 0.635 1.016) (end 0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 -1.016) (end -0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 -1.016) (end -0.635 1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 1.016) (end 0.635 1.016) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.016 -0.635 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 3 smd rect (at -1.016 0.635 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R17-Pad2)")) + (pad 6 smd rect (at 1.016 -0.635 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R15-Pad2)")) + (pad 2 smd rect (at -1.016 0 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 20 /TO_B0)) + (pad 4 smd rect (at 1.016 0.635 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 5 smd rect (at 1.016 0 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 21 /TO_B1)) + (model TO_SOT_Packages_SMD.3dshapes/SOT-353.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.07000000000000001 0.09 0.08)) + (rotate (xyz 0 0 90)) + ) + ) + + (module TO_SOT_Packages_SMD:SOT-363 (layer F.Cu) (tedit 56735562) (tstamp 56AEA6D3) + (at 90.297 136.779 180) + (descr SOT353) + (path /55D6ACFD) + (attr smd) + (fp_text reference U4 (at 0.09906 0 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DMN63D8LDW (at 0.09906 0 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 0.635 1.016) (end 0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 -1.016) (end -0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 -1.016) (end -0.635 1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 1.016) (end 0.635 1.016) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.016 -0.635 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 3 smd rect (at -1.016 0.635 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 28 /DIG_CH2)) + (pad 6 smd rect (at 1.016 -0.635 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 31 /DIG_CH1)) + (pad 2 smd rect (at -1.016 0 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(P8-Pad2)")) + (pad 4 smd rect (at 1.016 0.635 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 5 smd rect (at 1.016 0 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 57 "Net-(P8-Pad1)")) + (model TO_SOT_Packages_SMD.3dshapes/SOT-353.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.07000000000000001 0.09 0.08)) + (rotate (xyz 0 0 90)) + ) + ) + + (gr_line (start 97.409 152.0444) (end 97.409 117.5766) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 97.409 117.602) (end 96.5962 117.602) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 97.409 152.2222) (end 97.409 151.9936) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 96.5962 152.2222) (end 97.409 152.2222) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 64.2366 152.2222) (end 96.6216 152.2222) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 96.6216 117.602) (end 64.2112 117.602) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 64.2112 117.6274) (end 64.2366 117.6274) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 64.2112 152.2222) (end 64.2112 117.6274) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 64.2874 152.2222) (end 64.2366 152.2222) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 64.2874 152.2222) (end 64.3128 152.2222) (angle 90) (layer Edge.Cuts) (width 0.1)) + + (segment (start 90.043 133.9215) (end 90.043 133.7945) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 90.043 133.7945) (end 88.3285 132.08) (width 0.25) (layer F.Cu) (net 1) (tstamp 56AEB8C0)) + (segment (start 88.3285 132.08) (end 87.4275 132.08) (width 0.25) (layer F.Cu) (net 1) (tstamp 56AEB8C1)) + (segment (start 86.0545 130.4925) (end 86.0545 130.822) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 86.0545 130.822) (end 86.6775 131.445) (width 0.25) (layer F.Cu) (net 1) (tstamp 56AEB850)) + (segment (start 86.6775 131.445) (end 86.7925 131.445) (width 0.25) (layer F.Cu) (net 1) (tstamp 56AEB851)) + (segment (start 86.7925 131.445) (end 87.4275 132.08) (width 0.25) (layer F.Cu) (net 1) (tstamp 56AEB852)) + (segment (start 90.043 131.3815) (end 89.5985 131.3815) (width 0.25) (layer F.Cu) (net 2)) + (segment (start 89.5985 131.3815) (end 88.7095 130.4925) (width 0.25) (layer F.Cu) (net 2) (tstamp 56AEB8BC)) + (segment (start 88.7095 130.4925) (end 87.5545 130.4925) (width 0.25) (layer F.Cu) (net 2) (tstamp 56AEB8BD)) + (segment (start 87.4275 127.381) (end 87.6935 127.381) (width 0.25) (layer F.Cu) (net 3)) + (segment (start 88.773 126.3015) (end 90.043 126.3015) (width 0.25) (layer F.Cu) (net 3) (tstamp 56AEB8B5)) + (segment (start 87.6935 127.381) (end 88.773 126.3015) (width 0.25) (layer F.Cu) (net 3) (tstamp 56AEB8B4)) + (segment (start 86.0545 128.9685) (end 86.0545 128.8295) (width 0.25) (layer F.Cu) (net 3)) + (segment (start 86.0545 128.8295) (end 86.741 128.143) (width 0.25) (layer F.Cu) (net 3) (tstamp 56AEB84A)) + (segment (start 86.741 128.143) (end 86.741 127.5715) (width 0.25) (layer F.Cu) (net 3) (tstamp 56AEB84B)) + (segment (start 86.741 127.5715) (end 86.9315 127.381) (width 0.25) (layer F.Cu) (net 3) (tstamp 56AEB84C)) + (segment (start 86.9315 127.381) (end 87.4275 127.381) (width 0.25) (layer F.Cu) (net 3) (tstamp 56AEB84D)) + (segment (start 90.043 128.8415) (end 87.6815 128.8415) (width 0.25) (layer F.Cu) (net 4)) + (segment (start 87.6815 128.8415) (end 87.5545 128.9685) (width 0.25) (layer F.Cu) (net 4) (tstamp 56AEB8B9)) + (segment (start 94.869 130.8705) (end 94.869 129.7305) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 94.615 122.4915) (end 94.373 122.2495) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED403)) + (segment (start 94.615 129.4765) (end 94.615 122.4915) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED402)) + (segment (start 94.869 129.7305) (end 94.615 129.4765) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED401)) + (segment (start 92.5195 130.8855) (end 94.854 130.8855) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 94.854 130.8855) (end 94.869 130.8705) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED3F0)) + (segment (start 83.693 119.38) (end 89.8525 119.38) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 91.5035 122.1105) (end 91.4074 122.1105) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED38E)) + (segment (start 91.5035 121.031) (end 91.5035 122.1105) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED38B)) + (segment (start 89.8525 119.38) (end 91.5035 121.031) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED38A)) + (segment (start 91.4074 123.22854) (end 91.4074 122.1105) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 91.4074 122.1105) (end 91.4074 122.0161) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED38F)) + (segment (start 93.9285 122.2495) (end 94.373 122.2495) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED375)) + (segment (start 93.599 121.92) (end 93.9285 122.2495) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED374)) + (segment (start 91.5035 121.92) (end 93.599 121.92) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED373)) + (segment (start 91.4074 122.0161) (end 91.5035 121.92) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED372)) + (segment (start 94.373 122.2495) (end 95.504 122.2495) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED406)) + (segment (start 83.693 119.38) (end 84.5185 119.38) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 86.0545 138.43) (end 86.0545 137.033) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 86.0545 137.033) (end 85.9275 136.906) (width 0.508) (layer F.Cu) (net 6) (tstamp 56AF2430)) + (segment (start 89.0524 138.4808) (end 89.0524 138.176) (width 0.508) (layer B.Cu) (net 6)) + (segment (start 89.9668 137.2616) (end 89.9668 136.9187) (width 0.508) (layer B.Cu) (net 6) (tstamp 56AF2428)) + (segment (start 89.0524 138.176) (end 89.9668 137.2616) (width 0.508) (layer B.Cu) (net 6) (tstamp 56AF2427)) + (segment (start 89.9668 136.9187) (end 90.551 136.3345) (width 0.508) (layer B.Cu) (net 6) (tstamp 56AF2429)) + (segment (start 92.583 136.4615) (end 90.678 136.4615) (width 0.508) (layer B.Cu) (net 6)) + (segment (start 90.678 136.4615) (end 90.551 136.3345) (width 0.508) (layer B.Cu) (net 6) (tstamp 56AF2422)) + (segment (start 94.119 135.0645) (end 93.1545 135.0645) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 93.1545 135.0645) (end 93.0275 135.1915) (width 0.508) (layer F.Cu) (net 6) (tstamp 56AF241C)) + (segment (start 93.0275 135.1915) (end 93.0275 136.017) (width 0.508) (layer F.Cu) (net 6) (tstamp 56AF241D)) + (segment (start 93.0275 136.017) (end 92.583 136.4615) (width 0.508) (layer F.Cu) (net 6) (tstamp 56AF241E)) + (segment (start 94.8055 145.0105) (end 94.8055 139.7395) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 94.8055 139.7395) (end 94.5515 139.4855) (width 0.508) (layer F.Cu) (net 6) (tstamp 56AF2411)) + (segment (start 73.017 145.11) (end 73.863 145.11) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 78.067 147.7138) (end 78.067 149.36) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF1D98)) + (segment (start 78.0542 147.701) (end 78.067 147.7138) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF1D97)) + (via (at 78.0542 147.701) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 77.8002 147.447) (end 78.0542 147.701) (width 0.25) (layer B.Cu) (net 6) (tstamp 56AF1D95)) + (segment (start 77.8002 145.7706) (end 77.8002 147.447) (width 0.25) (layer B.Cu) (net 6) (tstamp 56AF1D94)) + (segment (start 77.3176 145.288) (end 77.8002 145.7706) (width 0.25) (layer B.Cu) (net 6) (tstamp 56AF1D93)) + (segment (start 77.2922 145.288) (end 77.3176 145.288) (width 0.25) (layer B.Cu) (net 6) (tstamp 56AF1D92)) + (segment (start 77.1652 145.415) (end 77.2922 145.288) (width 0.25) (layer B.Cu) (net 6) (tstamp 56AF1D91)) + (via (at 77.1652 145.415) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 76.9874 145.5928) (end 77.1652 145.415) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF1D8E)) + (segment (start 74.3458 145.5928) (end 76.9874 145.5928) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF1D8C)) + (segment (start 73.863 145.11) (end 74.3458 145.5928) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF1D8B)) + (segment (start 88.9 141.1478) (end 88.4174 141.1478) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 87.4776 140.208) (end 87.4776 139.446) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF1A15)) + (segment (start 88.4174 141.1478) (end 87.4776 140.208) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF1A14)) + (segment (start 88.888 144.7165) (end 88.888 146.038) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 88.888 146.038) (end 90.1065 147.2565) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF189C)) + (segment (start 90.1065 147.2565) (end 90.1065 147.32) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF189D)) + (segment (start 89.1159 141.1605) (end 89.1159 141.2875) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 89.1159 141.2875) (end 89.662 141.8336) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED74C)) + (segment (start 89.662 141.8336) (end 89.662 145.0105) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED74D)) + (segment (start 89.662 145.0105) (end 89.6385 145.034) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED74E)) + (segment (start 89.6385 145.034) (end 89.6112 145.034) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED74F)) + (segment (start 89.6112 145.034) (end 89.6112 145.0105) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED750)) + (segment (start 88.5952 139.2936) (end 88.5952 138.938) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 88.5952 139.2936) (end 87.63 139.2936) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED5A0)) + (segment (start 87.63 139.2936) (end 87.4776 139.446) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED59C)) + (segment (start 87.4776 139.446) (end 87.0331 139.8905) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF1A1A)) + (segment (start 88.5952 138.938) (end 89.0524 138.4808) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED5A2)) + (via (at 89.0524 138.4808) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 89.9668 136.9187) (end 90.551 136.3345) (width 0.25) (layer B.Cu) (net 6) (tstamp 56AED5A6)) + (segment (start 87.0331 139.8905) (end 86.487 139.8905) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED59D)) + (segment (start 86.0545 138.43) (end 86.0545 139.3945) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 86.0545 139.3945) (end 86.487 139.827) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED551)) + (segment (start 86.487 139.827) (end 86.487 139.8905) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED552)) + (segment (start 88.8074 123.22854) (end 87.6074 123.22854) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 92.5195 132.3855) (end 91.9995 132.3855) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 91.9995 132.3855) (end 91.694 132.08) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED4B3)) + (segment (start 91.694 132.08) (end 91.694 125.476) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED4B4)) + (segment (start 91.694 125.476) (end 92.6074 124.5626) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED4B5)) + (segment (start 92.6074 124.5626) (end 92.6074 123.22854) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED4B6)) + (segment (start 94.5515 139.4855) (end 95.2246 142.0368) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 95.2246 142.0368) (end 94.8055 145.0105) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED4B0)) + (segment (start 89.5985 136.144) (end 90.3605 136.144) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 90.3605 136.144) (end 90.551 136.3345) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED495)) + (via (at 90.551 136.3345) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 90.551 136.3345) (end 90.678 136.4615) (width 0.25) (layer B.Cu) (net 6) (tstamp 56AED499)) + (via (at 92.583 136.4615) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 92.583 136.4615) (end 93.0275 136.017) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED49D)) + (segment (start 93.0275 136.017) (end 93.0275 135.1915) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED49E)) + (segment (start 93.0275 135.1915) (end 93.1545 135.0645) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED49F)) + (segment (start 89.281 136.144) (end 89.5985 136.144) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 89.5985 136.144) (end 89.663398 136.144) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED493)) + (segment (start 90.6145 137.414) (end 91.313 137.414) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED490)) + (segment (start 90.4875 137.287) (end 90.6145 137.414) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED48F)) + (segment (start 90.4875 136.968102) (end 90.4875 137.287) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED48E)) + (segment (start 89.663398 136.144) (end 90.4875 136.968102) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED48D)) + (segment (start 94.8055 145.0105) (end 89.6112 145.0105) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 89.6112 145.0105) (end 89.182 145.0105) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED751)) + (segment (start 89.182 145.0105) (end 88.888 144.7165) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED431)) + (segment (start 93.919 133.6705) (end 93.919 134.8645) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 93.919 134.8645) (end 94.119 135.0645) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED3F7)) + (segment (start 92.5195 132.3855) (end 92.5195 133.1595) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 93.0305 133.6705) (end 93.919 133.6705) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED3F4)) + (segment (start 92.5195 133.1595) (end 93.0305 133.6705) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED3F3)) + (segment (start 71.64 144.792) (end 71.958 145.11) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEC62B)) + (segment (start 71.958 145.11) (end 73.017 145.11) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEC62C)) + (segment (start 71.374 144.792) (end 71.64 144.792) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 71.3105 144.792) (end 71.64 144.792) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 81.267 137.66) (end 81.267 138.824) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 84.1375 138.43) (end 86.0545 138.43) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEB902)) + (segment (start 83.6295 138.938) (end 84.1375 138.43) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEB901)) + (segment (start 81.381 138.938) (end 83.6295 138.938) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEB900)) + (segment (start 81.267 138.824) (end 81.381 138.938) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEB8FF)) + (segment (start 86.0545 137.033) (end 85.9275 136.906) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEB8A3)) + (segment (start 77.7995 151.0665) (end 77.7995 150.737) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 77.7995 150.737) (end 78.067 150.4695) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEB7B3)) + (segment (start 78.067 150.4695) (end 78.067 149.36) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEB7B4)) + (segment (start 85.9275 136.906) (end 85.725 136.906) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 95.619 135.0645) (end 95.9104 135.3559) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 95.9104 135.3559) (end 95.9104 146.304) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF2408)) + (segment (start 95.9104 146.304) (end 94.8055 147.4089) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF2409)) + (segment (start 94.8055 147.4089) (end 94.8055 147.5105) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF240D)) + (segment (start 95.619 135.0645) (end 95.619 133.8705) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 95.619 133.8705) (end 95.819 133.6705) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF2405)) + (segment (start 95.819 133.6705) (end 95.819 129.479) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 95.819 129.479) (end 96.6724 128.6256) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF23F7)) + (segment (start 96.1644 125.5776) (end 96.1644 125.3998) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF2401)) + (segment (start 96.9518 126.365) (end 96.1644 125.5776) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF2400)) + (segment (start 96.9518 127.9906) (end 96.9518 126.365) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF23FC)) + (segment (start 96.6724 128.27) (end 96.9518 127.9906) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF23FA)) + (segment (start 96.6724 128.6256) (end 96.6724 128.27) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF23F9)) + (segment (start 93.8784 118.999) (end 94.3102 118.999) (width 0.508) (layer B.Cu) (net 7)) + (segment (start 96.1644 125.2474) (end 96.1644 125.3998) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF23AC)) + (segment (start 95.25 124.333) (end 96.1644 125.2474) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF23AB)) + (segment (start 95.25 120.3452) (end 95.25 124.333) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF23AA)) + (segment (start 94.8944 119.9896) (end 95.25 120.3452) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF23A9)) + (segment (start 94.8944 119.5832) (end 94.8944 119.9896) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF23A8)) + (segment (start 94.3102 118.999) (end 94.8944 119.5832) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF23A7)) + (segment (start 93.8784 118.999) (end 86.3092 118.999) (width 0.508) (layer B.Cu) (net 7)) + (segment (start 85.2932 118.0592) (end 85.1154 117.8814) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF239A)) + (segment (start 85.3948 118.1608) (end 85.2932 118.0592) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF2399)) + (segment (start 85.471 118.1608) (end 85.3948 118.1608) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF2398)) + (segment (start 86.3092 118.999) (end 85.471 118.1608) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF2397)) + (segment (start 85.1154 117.8814) (end 85.4456 118.2116) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF239B)) + (segment (start 71.5264 148.5392) (end 71.5264 147.9296) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 71.5264 148.5392) (end 71.7042 148.5392) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 71.7042 148.5392) (end 73.3298 150.1648) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF234F)) + (segment (start 76.3651 151.1935) (end 76.3651 151.2951) (width 1.016) (layer F.Cu) (net 7)) + (segment (start 76.708 151.638) (end 76.708 151.5364) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2347)) + (segment (start 76.3651 151.2951) (end 76.708 151.638) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2345)) + (segment (start 74.1807 151.1935) (end 74.1807 151.0157) (width 1.016) (layer F.Cu) (net 7)) + (segment (start 74.1807 151.0157) (end 73.3298 150.1648) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2342)) + (segment (start 73.3298 150.1648) (end 73.3298 150.1394) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2343)) + (segment (start 76.3651 151.1935) (end 74.1807 151.1935) (width 1.016) (layer F.Cu) (net 7)) + (segment (start 74.1807 151.1935) (end 74.1426 151.1554) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF233F)) + (segment (start 90.1065 150.8125) (end 89.3699 150.8125) (width 1.016) (layer F.Cu) (net 7)) + (segment (start 82.677 151.4348) (end 82.4738 151.2316) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2337)) + (segment (start 84.3026 151.4348) (end 82.677 151.4348) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2336)) + (segment (start 84.3788 151.511) (end 84.3026 151.4348) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2335)) + (segment (start 88.6714 151.511) (end 84.3788 151.511) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2334)) + (segment (start 89.3699 150.8125) (end 88.6714 151.511) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2333)) + (segment (start 90.1065 149.86) (end 90.1065 150.8125) (width 1.016) (layer F.Cu) (net 7)) + (segment (start 90.1065 150.8125) (end 89.8525 151.0665) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2330)) + (segment (start 90.1065 149.86) (end 91.7575 149.86) (width 1.016) (layer F.Cu) (net 7)) + (segment (start 91.7575 149.86) (end 94.107 147.5105) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2321)) + (segment (start 94.107 147.5105) (end 94.8055 147.5105) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2322)) + (segment (start 80.1116 117.8814) (end 78.613 119.38) (width 0.25) (layer B.Cu) (net 7) (tstamp 56AF1DF1)) + (segment (start 85.1154 117.8814) (end 80.1116 117.8814) (width 0.25) (layer B.Cu) (net 7) (tstamp 56AF1DEF)) + (segment (start 86.233 118.999) (end 85.4456 118.2116) (width 0.25) (layer B.Cu) (net 7) (tstamp 56AF1DED)) + (segment (start 85.4456 118.2116) (end 85.1154 117.8814) (width 0.25) (layer B.Cu) (net 7) (tstamp 56AF239E)) + (segment (start 93.8784 118.999) (end 86.233 118.999) (width 0.25) (layer B.Cu) (net 7) (tstamp 56AF2395)) + (via (at 96.1644 125.3998) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 7)) + (segment (start 96.1644 125.73) (end 96.1644 125.3998) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1DE3)) + (segment (start 96.7994 126.365) (end 96.1644 125.73) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1DE2)) + (segment (start 96.7994 127.8636) (end 96.7994 126.365) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1DE1)) + (segment (start 96.6978 127.9652) (end 96.7994 127.8636) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1DDC)) + (segment (start 96.6978 128.6002) (end 96.6978 127.9652) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1DDB)) + (segment (start 95.819 129.479) (end 96.6978 128.6002) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1DD9)) + (segment (start 71.374 146.292) (end 71.374 146.9898) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 71.374 146.9898) (end 71.5264 147.1422) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1D9C)) + (segment (start 71.5264 147.1422) (end 71.5264 147.9296) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1D9D)) + (segment (start 81.1918 151.9682) (end 82.0935 151.0665) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1DA4)) + (segment (start 77.1398 151.9682) (end 81.1918 151.9682) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1DA3)) + (segment (start 76.708 151.5364) (end 77.1398 151.9682) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF2348)) + (segment (start 71.5264 148.5392) (end 74.1426 151.1554) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1D9E)) + (segment (start 94.8055 147.5105) (end 94.8055 147.4089) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 94.8055 147.4089) (end 95.9104 146.304) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF181E)) + (segment (start 95.9104 146.304) (end 95.9104 135.3559) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1820)) + (segment (start 94.8055 147.5105) (end 94.107 147.5105) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 94.107 147.5105) (end 91.7575 149.86) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AED434)) + (segment (start 95.819 133.6705) (end 95.819 134.8645) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 95.819 134.8645) (end 95.619 135.0645) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AED3FD)) + (segment (start 82.0935 151.0665) (end 89.8525 151.0665) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 89.8525 151.0665) (end 90.1065 150.8125) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AED003)) + (segment (start 71.4495 146.292) (end 71.8315 145.91) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AEC62F)) + (segment (start 71.8315 145.91) (end 73.017 145.91) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AEC630)) + (segment (start 71.374 146.292) (end 71.4495 146.292) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 73.016 145.911) (end 73.017 145.91) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AEC5D2)) + (segment (start 80.5935 151.0665) (end 79.4265 151.0665) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 79.4265 151.0665) (end 79.363 151.003) (width 1.016) (layer F.Cu) (net 8) (tstamp 56AF2464)) + (segment (start 85.725 135.3185) (end 85.09 135.9535) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB946)) + (segment (start 85.09 135.9535) (end 85.09 137.6045) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB947)) + (segment (start 85.09 137.6045) (end 84.836 137.8585) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB949)) + (segment (start 84.836 137.8585) (end 83.8835 137.8585) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB94A)) + (via (at 83.8835 137.8585) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 8)) + (segment (start 83.8835 137.8585) (end 83.3882 138.938) (width 0.25) (layer B.Cu) (net 8) (tstamp 56AEB94E)) + (segment (start 83.3882 138.938) (end 83.1088 140.1826) (width 0.25) (layer B.Cu) (net 8) (tstamp 56AEB94F)) + (via (at 83.1088 140.1826) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 8)) + (segment (start 83.1088 140.1826) (end 82.3468 140.7668) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB953)) + (segment (start 82.3468 140.7668) (end 82.1182 148.0058) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB954)) + (via (at 82.1182 148.0058) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 8)) + (segment (start 82.1182 148.0058) (end 82.169 149.7965) (width 0.25) (layer B.Cu) (net 8) (tstamp 56AEB957)) + (segment (start 82.169 149.7965) (end 80.9625 151.003) (width 0.25) (layer B.Cu) (net 8) (tstamp 56AEB958)) + (segment (start 80.9625 151.003) (end 80.391 151.003) (width 0.25) (layer B.Cu) (net 8) (tstamp 56AEB95F)) + (via (at 80.391 151.003) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 8)) + (segment (start 80.391 151.003) (end 80.3275 151.0665) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB961)) + (segment (start 80.3275 151.0665) (end 79.2995 151.0665) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB962)) + (segment (start 85.9275 135.3185) (end 85.725 135.3185) (width 0.25) (layer F.Cu) (net 8)) + (segment (start 87.5545 138.43) (end 87.4395 138.43) (width 0.25) (layer F.Cu) (net 8)) + (segment (start 87.4395 138.43) (end 86.6775 137.668) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB8A6)) + (segment (start 86.6775 137.668) (end 86.6775 135.8265) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB8A7)) + (segment (start 86.6775 135.8265) (end 86.1695 135.3185) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB8A8)) + (segment (start 86.1695 135.3185) (end 85.9275 135.3185) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB8A9)) + (segment (start 79.2995 151.0665) (end 79.2995 150.9275) (width 0.25) (layer F.Cu) (net 8)) + (segment (start 79.2995 150.9275) (end 78.867 150.495) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB7AF)) + (segment (start 78.867 150.495) (end 78.867 149.36) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB7B0)) + (segment (start 70.5485 125.222) (end 71.3105 125.984) (width 1.016) (layer B.Cu) (net 9)) + (segment (start 81.153 119.38) (end 81.153 122.3772) (width 1.016) (layer B.Cu) (net 9)) + (segment (start 82.2198 123.444) (end 82.3595 123.444) (width 1.016) (layer B.Cu) (net 9) (tstamp 56AF2245)) + (segment (start 81.153 122.3772) (end 82.2198 123.444) (width 1.016) (layer B.Cu) (net 9) (tstamp 56AF2244)) + (segment (start 93.2815 127.1905) (end 93.2815 124.206) (width 0.25) (layer B.Cu) (net 9)) + (segment (start 84.824 124.194) (end 83.5025 124.194) (width 0.25) (layer F.Cu) (net 9) (tstamp 56AED4E6)) + (segment (start 84.836 124.206) (end 84.824 124.194) (width 0.25) (layer F.Cu) (net 9) (tstamp 56AED4E5)) + (via (at 84.836 124.206) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 85.979 124.206) (end 84.836 124.206) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AED4E3)) + (segment (start 86.487 123.698) (end 85.979 124.206) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AED4E2)) + (segment (start 86.487 122.8725) (end 86.487 123.698) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AED4E1)) + (segment (start 87.0585 122.301) (end 86.487 122.8725) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AED4E0)) + (segment (start 93.091 122.301) (end 87.0585 122.301) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AED4DF)) + (segment (start 93.6625 122.8725) (end 93.091 122.301) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AED4DE)) + (segment (start 93.6625 123.825) (end 93.6625 122.8725) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AED4DD)) + (segment (start 93.2815 124.206) (end 93.6625 123.825) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AED4DC)) + (segment (start 82.3595 123.444) (end 81.661 123.444) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 81.661 123.444) (end 79.6925 125.4125) (width 0.25) (layer F.Cu) (net 9) (tstamp 56AEC2A1)) + (segment (start 79.6925 125.4125) (end 77.4065 125.4125) (width 0.25) (layer F.Cu) (net 9) (tstamp 56AEC2A2)) + (segment (start 77.4065 125.4125) (end 76.708 126.111) (width 0.25) (layer F.Cu) (net 9) (tstamp 56AEC2AE)) + (segment (start 76.708 126.111) (end 75.3745 126.111) (width 0.25) (layer F.Cu) (net 9) (tstamp 56AEC2AF)) + (via (at 75.3745 126.111) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 75.3745 126.111) (end 75.2475 125.984) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AEC2B1)) + (segment (start 75.2475 125.984) (end 71.3105 125.984) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AEC2B2)) + (segment (start 83.5025 124.194) (end 83.1095 124.194) (width 0.25) (layer F.Cu) (net 9)) + (via (at 82.3595 123.444) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 83.1095 124.194) (end 82.3595 123.444) (width 0.25) (layer F.Cu) (net 9) (tstamp 56AEC255)) + (segment (start 94.5515 136.4855) (end 94.5515 137.4775) (width 0.508) (layer F.Cu) (net 10)) + (segment (start 94.5515 137.4775) (end 94.8055 137.7315) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF2419)) + (segment (start 94.1959 126.0729) (end 94.1959 124.4981) (width 0.508) (layer B.Cu) (net 10)) + (segment (start 94.1959 124.4981) (end 94.1705 124.4727) (width 0.508) (layer B.Cu) (net 10) (tstamp 56AF2306)) + (segment (start 95.7815 127.1905) (end 95.3135 127.1905) (width 0.508) (layer B.Cu) (net 10)) + (segment (start 95.3135 127.1905) (end 94.1959 126.0729) (width 0.508) (layer B.Cu) (net 10) (tstamp 56AF2301)) + (segment (start 94.1959 126.0729) (end 94.1705 126.0475) (width 0.508) (layer B.Cu) (net 10) (tstamp 56AF2304)) + (segment (start 90.805 121.6025) (end 92.6465 121.6025) (width 0.508) (layer B.Cu) (net 10)) + (segment (start 92.6465 121.6025) (end 92.6846 121.6406) (width 0.508) (layer B.Cu) (net 10) (tstamp 56AF22FB)) + (segment (start 83.5025 122.694) (end 86.1575 122.694) (width 0.508) (layer F.Cu) (net 10)) + (segment (start 86.1575 122.694) (end 87.249 121.6025) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22F6)) + (segment (start 87.249 121.6025) (end 90.924498 121.6025) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22F7)) + (segment (start 90.924498 121.6025) (end 90.805 121.6025) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22F9)) + (segment (start 82.045 122.494) (end 83.3025 122.494) (width 0.508) (layer F.Cu) (net 10)) + (segment (start 83.3025 122.494) (end 83.5025 122.694) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22F3)) + (segment (start 80.645 123.6345) (end 80.645 122.8725) (width 0.508) (layer F.Cu) (net 10)) + (segment (start 80.645 122.8725) (end 81.0235 122.494) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22EF)) + (segment (start 81.0235 122.494) (end 82.045 122.494) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22F0)) + (segment (start 80.01 124.2695) (end 80.645 123.6345) (width 0.508) (layer F.Cu) (net 10)) + (segment (start 76.3505 124.2695) (end 77.1779 124.2695) (width 0.508) (layer F.Cu) (net 10)) + (segment (start 79.7052 124.3838) (end 79.7814 124.46) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22EA)) + (segment (start 77.2922 124.3838) (end 79.7052 124.3838) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22E9)) + (segment (start 77.1779 124.2695) (end 77.2922 124.3838) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22E8)) + (segment (start 71.4375 128.4725) (end 71.4375 127.5969) (width 1.016) (layer F.Cu) (net 10)) + (segment (start 71.7804 127.254) (end 72.0725 127.254) (width 1.016) (layer F.Cu) (net 10) (tstamp 56AF22A0)) + (segment (start 71.4375 127.5969) (end 71.7804 127.254) (width 1.016) (layer F.Cu) (net 10) (tstamp 56AF229F)) + (segment (start 73.66 129.54) (end 73.66 127.508) (width 1.016) (layer B.Cu) (net 10)) + (segment (start 73.66 127.508) (end 73.406 127.254) (width 1.016) (layer B.Cu) (net 10) (tstamp 56AF229B)) + (segment (start 73.406 127.254) (end 72.0725 127.254) (width 1.016) (layer B.Cu) (net 10) (tstamp 56AF229C)) + (segment (start 76.2 129.54) (end 73.66 129.54) (width 1.016) (layer B.Cu) (net 10)) + (segment (start 76.2 132.08) (end 76.2 129.54) (width 1.016) (layer B.Cu) (net 10)) + (segment (start 76.2 129.54) (end 76.2 128.4986) (width 1.016) (layer B.Cu) (net 10)) + (segment (start 76.2 128.4986) (end 76.6572 128.0414) (width 1.016) (layer B.Cu) (net 10) (tstamp 56AF2291)) + (segment (start 76.6572 128.0414) (end 76.6572 124.5762) (width 1.016) (layer B.Cu) (net 10) (tstamp 56AF2292)) + (segment (start 76.6572 124.5762) (end 76.3505 124.2695) (width 1.016) (layer B.Cu) (net 10) (tstamp 56AF2293)) + (segment (start 94.1705 126.0475) (end 95.3135 127.1905) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4F2)) + (segment (start 94.1705 122.6185) (end 94.1705 124.4727) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4F1)) + (segment (start 90.805 121.6025) (end 90.9955 121.793) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4EE)) + (segment (start 90.9955 121.793) (end 93.345 121.793) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4EF)) + (segment (start 93.345 121.793) (end 94.1705 122.6185) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4F0)) + (segment (start 94.1705 124.4727) (end 94.1705 126.0475) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AF2309)) + (via (at 90.805 121.6025) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 10)) + (segment (start 87.249 121.6025) (end 90.805 121.6025) (width 0.25) (layer F.Cu) (net 10) (tstamp 56AED4EA)) + (segment (start 86.1575 122.694) (end 87.249 121.6025) (width 0.25) (layer F.Cu) (net 10) (tstamp 56AED4E9)) + (segment (start 95.885 137.16) (end 95.885 127.294) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4A9)) + (segment (start 95.3135 137.7315) (end 95.885 137.16) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4A8)) + (segment (start 94.8055 137.7315) (end 95.3135 137.7315) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4A7)) + (via (at 94.8055 137.7315) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 10)) + (segment (start 94.5515 137.4775) (end 94.8055 137.7315) (width 0.25) (layer F.Cu) (net 10) (tstamp 56AED4A5)) + (segment (start 95.885 127.294) (end 95.7815 127.1905) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4AA)) + (segment (start 95.504 123.7495) (end 95.504 126.913) (width 0.25) (layer F.Cu) (net 10)) + (segment (start 95.504 126.913) (end 95.7815 127.1905) (width 0.25) (layer F.Cu) (net 10) (tstamp 56AED378)) + (segment (start 76.3505 124.2695) (end 80.01 124.2695) (width 0.25) (layer F.Cu) (net 10)) + (segment (start 81.0235 122.494) (end 82.045 122.494) (width 0.25) (layer F.Cu) (net 10) (tstamp 56AEC22C)) + (segment (start 80.645 122.8725) (end 81.0235 122.494) (width 0.25) (layer F.Cu) (net 10) (tstamp 56AEC22B)) + (segment (start 83.3025 122.494) (end 83.5025 122.694) (width 0.25) (layer F.Cu) (net 10) (tstamp 56AEC21E)) + (via (at 72.0725 127.254) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 10)) + (segment (start 72.0725 127.254) (end 72.136 127.1905) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AEC17A)) + (segment (start 73.3425 127.1905) (end 73.66 127.508) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AEC17C)) + (segment (start 72.136 127.1905) (end 73.3425 127.1905) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AEC17B)) + (segment (start 76.2 129.54) (end 76.2 124.42) (width 0.25) (layer B.Cu) (net 10)) + (segment (start 76.2 124.42) (end 76.3505 124.2695) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AEC150)) + (segment (start 76.033 129.373) (end 76.2 129.54) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AEC084)) + (segment (start 78.961 130.81) (end 77.47 130.81) (width 0.25) (layer F.Cu) (net 10)) + (segment (start 77.47 130.81) (end 76.2 132.08) (width 0.25) (layer F.Cu) (net 10) (tstamp 56AEB555)) + (segment (start 68.707 133.338) (end 66.052 133.338) (width 0.25) (layer F.Cu) (net 11)) + (segment (start 66.052 133.338) (end 66.04 133.35) (width 0.25) (layer F.Cu) (net 11) (tstamp 56AEB25F)) + (segment (start 68.719 130.302) (end 68.719 131.826) (width 0.25) (layer F.Cu) (net 12)) + (segment (start 68.719 131.826) (end 68.707 131.838) (width 0.25) (layer F.Cu) (net 12) (tstamp 56AEB259)) + (segment (start 68.719 130.302) (end 66.548 130.302) (width 0.25) (layer F.Cu) (net 12)) + (segment (start 66.548 130.302) (end 66.04 130.81) (width 0.25) (layer F.Cu) (net 12) (tstamp 56AEB256)) + (segment (start 68.707 130.314) (end 68.719 130.302) (width 0.25) (layer F.Cu) (net 12) (tstamp 56AEAAD5)) + (segment (start 66.802 130.048) (end 66.04 130.81) (width 0.25) (layer F.Cu) (net 12) (tstamp 56AEAACE)) + (segment (start 68.707 136.259) (end 68.211 136.259) (width 0.25) (layer F.Cu) (net 13)) + (segment (start 68.211 136.259) (end 66.04 138.43) (width 0.25) (layer F.Cu) (net 13) (tstamp 56AEB266)) + (segment (start 68.707 136.259) (end 68.707 136.398) (width 0.25) (layer F.Cu) (net 13)) + (segment (start 66.675 138.43) (end 66.04 138.43) (width 0.25) (layer F.Cu) (net 13) (tstamp 56AEAAF5)) + (segment (start 68.707 134.759) (end 69.977 134.759) (width 0.25) (layer F.Cu) (net 14)) + (segment (start 69.977 134.759) (end 70.358 134.378) (width 0.25) (layer F.Cu) (net 14) (tstamp 56AEB269)) + (segment (start 68.707 134.759) (end 67.171 134.759) (width 0.25) (layer F.Cu) (net 14)) + (segment (start 67.171 134.759) (end 66.04 135.89) (width 0.25) (layer F.Cu) (net 14) (tstamp 56AEB262)) + (segment (start 68.707 134.759) (end 68.949 134.759) (width 0.25) (layer F.Cu) (net 14)) + (segment (start 68.707 134.759) (end 68.441 134.759) (width 0.25) (layer F.Cu) (net 14)) + (segment (start 74.3585 127.762) (end 74.3585 125.7935) (width 1.016) (layer F.Cu) (net 15)) + (segment (start 74.3585 125.7935) (end 73.8505 125.2855) (width 1.016) (layer F.Cu) (net 15) (tstamp 56AF22A6)) + (segment (start 73.8505 125.2855) (end 73.8505 124.2695) (width 1.016) (layer F.Cu) (net 15) (tstamp 56AF22A7)) + (segment (start 73.8505 124.2695) (end 73.8505 123.6345) (width 1.016) (layer B.Cu) (net 15)) + (segment (start 73.8505 123.6345) (end 75.7555 121.7295) (width 1.016) (layer B.Cu) (net 15) (tstamp 56AF223E)) + (segment (start 75.7555 121.7295) (end 75.7555 119.44604) (width 1.016) (layer B.Cu) (net 15) (tstamp 56AF223F)) + (segment (start 82.677 130.175) (end 82.677 131.8514) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 88.888 142.5328) (end 88.888 143.129) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1928)) + (segment (start 88.5952 142.24) (end 88.888 142.5328) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1927)) + (segment (start 88.392 142.24) (end 88.5952 142.24) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1926)) + (segment (start 88.138 141.986) (end 88.392 142.24) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1925)) + (segment (start 87.0204 141.986) (end 88.138 141.986) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1924)) + (via (at 87.0204 141.986) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 15)) + (segment (start 86.4616 141.4272) (end 87.0204 141.986) (width 0.25) (layer B.Cu) (net 15) (tstamp 56AF1920)) + (segment (start 86.4616 139.2428) (end 86.4616 141.4272) (width 0.25) (layer B.Cu) (net 15) (tstamp 56AF191E)) + (segment (start 84.4296 137.2108) (end 86.4616 139.2428) (width 0.25) (layer B.Cu) (net 15) (tstamp 56AF191D)) + (via (at 84.4296 137.2108) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 15)) + (segment (start 84.4296 136.7028) (end 84.4296 137.2108) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1917)) + (segment (start 83.1088 135.382) (end 84.4296 136.7028) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1916)) + (segment (start 83.1088 134.9756) (end 83.1088 135.382) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1914)) + (segment (start 82.042 133.9088) (end 83.1088 134.9756) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1913)) + (segment (start 82.042 132.4864) (end 82.042 133.9088) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1912)) + (segment (start 82.677 131.8514) (end 82.042 132.4864) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1911)) + (segment (start 73.8505 123.6345) (end 75.7555 121.7295) (width 0.25) (layer B.Cu) (net 15) (tstamp 56AEC1B5)) + (segment (start 75.7555 121.7295) (end 75.7555 119.44604) (width 0.25) (layer B.Cu) (net 15) (tstamp 56AEC1B7)) + (segment (start 73.8505 125.2855) (end 73.8505 124.2695) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC18B)) + (segment (start 74.3585 125.7935) (end 73.8505 125.2855) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC18A)) + (segment (start 71.4375 129.9725) (end 71.4375 131.064) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 72.4535 132.08) (end 73.66 132.08) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC164)) + (segment (start 71.4375 131.064) (end 72.4535 132.08) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC163)) + (segment (start 73.66 132.08) (end 73.5965 132.08) (width 0.25) (layer B.Cu) (net 15)) + (segment (start 73.9895 124.0035) (end 73.533 124.46) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC08D)) + (segment (start 73.66 132.08) (end 72.39 130.81) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 83.312 130.81) (end 84.361 130.81) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC079)) + (segment (start 82.6135 130.1115) (end 82.677 130.175) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC078)) + (segment (start 82.677 130.175) (end 83.312 130.81) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF190F)) + (segment (start 82.6135 128.651) (end 82.6135 130.1115) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC076)) + (segment (start 80.01 126.0475) (end 82.6135 128.651) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC074)) + (segment (start 77.851 126.0475) (end 80.01 126.0475) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC072)) + (segment (start 76.1365 127.762) (end 77.851 126.0475) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC070)) + (segment (start 72.9615 127.762) (end 74.3585 127.762) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC06F)) + (segment (start 74.3585 127.762) (end 76.1365 127.762) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC188)) + (segment (start 72.39 128.3335) (end 72.9615 127.762) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC06E)) + (segment (start 72.39 130.81) (end 72.39 128.3335) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC06D)) + (segment (start 73.66 132.08) (end 73.66 131.5085) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 78.486 121.9708) (end 78.486 122.685) (width 0.508) (layer F.Cu) (net 16)) + (segment (start 78.486 122.685) (end 79.245 123.444) (width 0.508) (layer F.Cu) (net 16) (tstamp 56AF22E5)) + (segment (start 78.9178 122.4026) (end 78.486 121.9708) (width 1.016) (layer F.Cu) (net 16) (tstamp 56AF22D1)) + (segment (start 78.486 121.9708) (end 79.2226 122.7074) (width 1.016) (layer F.Cu) (net 16) (tstamp 56AF22E3)) + (segment (start 78.359 122.4026) (end 78.9178 122.4026) (width 1.016) (layer F.Cu) (net 16)) + (segment (start 65.4685 125.222) (end 66.7385 125.222) (width 1.016) (layer F.Cu) (net 16)) + (segment (start 66.7385 125.222) (end 68.961 122.9995) (width 1.016) (layer F.Cu) (net 16) (tstamp 56AF22C7)) + (segment (start 68.961 122.9995) (end 69.0499 122.9995) (width 1.016) (layer F.Cu) (net 16) (tstamp 56AF22C8)) + (segment (start 69.0499 122.9995) (end 69.6468 122.4026) (width 1.016) (layer F.Cu) (net 16) (tstamp 56AF22C9)) + (segment (start 69.6468 122.4026) (end 78.359 122.4026) (width 1.016) (layer F.Cu) (net 16) (tstamp 56AF22CA)) + (segment (start 78.359 122.4026) (end 78.4098 122.4026) (width 1.016) (layer F.Cu) (net 16) (tstamp 56AF22CF)) + (segment (start 65.4685 125.222) (end 65.4685 119.57304) (width 1.016) (layer F.Cu) (net 16)) + (segment (start 65.4685 119.57304) (end 65.5955 119.44604) (width 1.016) (layer F.Cu) (net 16) (tstamp 56AF22BB)) + (segment (start 79.245 123.444) (end 78.994 123.444) (width 0.25) (layer F.Cu) (net 16)) + (segment (start 78.994 123.444) (end 78.5495 122.9995) (width 0.25) (layer F.Cu) (net 16) (tstamp 56AEC1BB)) + (segment (start 78.5495 122.9995) (end 68.961 122.9995) (width 0.25) (layer F.Cu) (net 16) (tstamp 56AEC1BC)) + (segment (start 68.961 122.9995) (end 66.7385 125.222) (width 0.25) (layer F.Cu) (net 16) (tstamp 56AEC1BD)) + (segment (start 65.4685 119.57304) (end 65.5955 119.44604) (width 0.25) (layer F.Cu) (net 16) (tstamp 56AEC197)) + (segment (start 84.717 147.51) (end 85.5985 147.51) (width 0.25) (layer F.Cu) (net 17)) + (segment (start 86.8045 145.3) (end 87.388 144.7165) (width 0.25) (layer F.Cu) (net 17) (tstamp 56AEC46C)) + (segment (start 86.8045 146.304) (end 86.8045 145.3) (width 0.25) (layer F.Cu) (net 17) (tstamp 56AEC46B)) + (segment (start 85.5985 147.51) (end 86.8045 146.304) (width 0.25) (layer F.Cu) (net 17) (tstamp 56AEC46A)) + (segment (start 87.388 143.129) (end 87.388 144.7165) (width 0.25) (layer F.Cu) (net 17)) + (segment (start 84.717 146.71) (end 83.845 146.71) (width 0.25) (layer F.Cu) (net 18)) + (segment (start 79.6798 144.9832) (end 79.6543 144.9832) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AECE5E)) + (via (at 79.6798 144.9832) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 18)) + (segment (start 83.312 145.7325) (end 79.6798 144.9832) (width 0.25) (layer B.Cu) (net 18) (tstamp 56AECE5C)) + (segment (start 83.3755 145.796) (end 83.312 145.7325) (width 0.25) (layer B.Cu) (net 18) (tstamp 56AECE5B)) + (via (at 83.3755 145.796) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 18)) + (segment (start 83.5025 145.923) (end 83.3755 145.796) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AECE57)) + (segment (start 83.5025 146.3675) (end 83.5025 145.923) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AECE55)) + (segment (start 83.845 146.71) (end 83.5025 146.3675) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AECE4D)) + (segment (start 79.6798 144.7927) (end 79.6543 144.7927) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AEC488)) + (segment (start 79.6543 144.7927) (end 79.6798 144.7927) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AEC489)) + (segment (start 79.6798 144.7927) (end 79.6543 144.7927) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AEC48B)) + (segment (start 79.667 149.36) (end 79.6543 144.9832) (width 0.25) (layer F.Cu) (net 18)) + (segment (start 79.6543 144.9832) (end 79.6543 144.7927) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AECE61)) + (segment (start 79.6543 144.7927) (end 79.4765 140.5891) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AEC48C)) + (segment (start 82.7405 127) (end 84.361 127) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AEB70A)) + (via (at 82.7405 127) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 18)) + (segment (start 81.9785 127.762) (end 82.7405 127) (width 0.25) (layer B.Cu) (net 18) (tstamp 56AEB708)) + (segment (start 81.9785 131.318) (end 81.9785 127.762) (width 0.25) (layer B.Cu) (net 18) (tstamp 56AEB707)) + (segment (start 79.6925 133.604) (end 81.9785 131.318) (width 0.25) (layer B.Cu) (net 18) (tstamp 56AEB706)) + (segment (start 79.502 140.5636) (end 79.6925 133.604) (width 0.25) (layer B.Cu) (net 18) (tstamp 56AEB705)) + (via (at 79.502 140.5636) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 18)) + (segment (start 79.4765 140.5891) (end 79.502 140.5636) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AEB703)) + (segment (start 84.361 128.27) (end 84.361 127) (width 0.25) (layer F.Cu) (net 18)) + (segment (start 88.7984 140.5128) (end 89.4207 140.5255) (width 0.25) (layer F.Cu) (net 20)) + (segment (start 85.928 145.11) (end 84.717 145.11) (width 0.25) (layer F.Cu) (net 20) (tstamp 56AF1899)) + (segment (start 86.0552 145.2372) (end 85.928 145.11) (width 0.25) (layer F.Cu) (net 20) (tstamp 56AF1898)) + (via (at 86.0552 145.2372) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 20)) + (segment (start 86.2076 145.0848) (end 86.0552 145.2372) (width 0.25) (layer B.Cu) (net 20) (tstamp 56AF1894)) + (segment (start 86.7156 145.0848) (end 86.2076 145.0848) (width 0.25) (layer B.Cu) (net 20) (tstamp 56AF1893)) + (segment (start 89.408 142.3924) (end 86.7156 145.0848) (width 0.25) (layer B.Cu) (net 20) (tstamp 56AF1892)) + (segment (start 89.408 140.716) (end 89.408 142.3924) (width 0.25) (layer B.Cu) (net 20) (tstamp 56AF1891)) + (segment (start 89.5096 140.6144) (end 89.408 140.716) (width 0.25) (layer B.Cu) (net 20) (tstamp 56AF1890)) + (via (at 89.5096 140.6144) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 20)) + (segment (start 89.4207 140.5255) (end 89.5096 140.6144) (width 0.25) (layer F.Cu) (net 20) (tstamp 56AF1888)) + (segment (start 86.868 140.5128) (end 87.146002 140.5128) (width 0.25) (layer F.Cu) (net 21)) + (segment (start 85.814 144.31) (end 84.717 144.31) (width 0.25) (layer F.Cu) (net 21) (tstamp 56AF1A41)) + (segment (start 85.9028 144.2212) (end 85.814 144.31) (width 0.25) (layer F.Cu) (net 21) (tstamp 56AF1A40)) + (segment (start 85.9028 144.0688) (end 85.9028 144.2212) (width 0.25) (layer F.Cu) (net 21) (tstamp 56AF1A3F)) + (segment (start 86.3092 143.6624) (end 85.9028 144.0688) (width 0.25) (layer F.Cu) (net 21) (tstamp 56AF1A3E)) + (via (at 86.3092 143.6624) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 21)) + (segment (start 86.36 143.6624) (end 86.3092 143.6624) (width 0.25) (layer B.Cu) (net 21) (tstamp 56AF1A3C)) + (segment (start 87.6808 142.3416) (end 86.36 143.6624) (width 0.25) (layer B.Cu) (net 21) (tstamp 56AF1A3B)) + (segment (start 87.6808 141.3256) (end 87.6808 142.3416) (width 0.25) (layer B.Cu) (net 21) (tstamp 56AF1A3A)) + (via (at 87.6808 141.3256) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 21)) + (segment (start 87.6808 141.047598) (end 87.6808 141.3256) (width 0.25) (layer F.Cu) (net 21) (tstamp 56AF1A37)) + (segment (start 87.146002 140.5128) (end 87.6808 141.047598) (width 0.25) (layer F.Cu) (net 21) (tstamp 56AF1A2F)) + (segment (start 84.717 143.51) (end 83.5152 143.51) (width 0.25) (layer F.Cu) (net 22)) + (segment (start 79.4182 131.6228) (end 78.961 132.08) (width 0.25) (layer F.Cu) (net 22) (tstamp 56AED6F7)) + (segment (start 80.1116 131.6228) (end 79.4182 131.6228) (width 0.25) (layer F.Cu) (net 22) (tstamp 56AED6F6)) + (segment (start 80.3656 131.8768) (end 80.1116 131.6228) (width 0.25) (layer F.Cu) (net 22) (tstamp 56AED6F5)) + (via (at 80.3656 131.8768) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 22)) + (segment (start 80.3656 132.2324) (end 80.3656 131.8768) (width 0.25) (layer B.Cu) (net 22) (tstamp 56AED6F2)) + (segment (start 78.9432 133.6548) (end 80.3656 132.2324) (width 0.25) (layer B.Cu) (net 22) (tstamp 56AED6EF)) + (segment (start 78.6384 141.986) (end 78.9432 133.6548) (width 0.25) (layer B.Cu) (net 22) (tstamp 56AED6E6)) + (segment (start 79.8068 142.3416) (end 78.6384 141.986) (width 0.25) (layer B.Cu) (net 22) (tstamp 56AED6E3)) + (segment (start 81.3308 142.494) (end 79.8068 142.3416) (width 0.25) (layer B.Cu) (net 22) (tstamp 56AED6E2)) + (segment (start 82.811049 143.452151) (end 81.3308 142.494) (width 0.25) (layer B.Cu) (net 22) (tstamp 56AED6DF)) + (segment (start 83.254151 143.452151) (end 82.811049 143.452151) (width 0.25) (layer B.Cu) (net 22) (tstamp 56AED6DE)) + (segment (start 83.4136 143.6116) (end 83.254151 143.452151) (width 0.25) (layer B.Cu) (net 22) (tstamp 56AED6DD)) + (via (at 83.4136 143.6116) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 22)) + (segment (start 83.5152 143.51) (end 83.4136 143.6116) (width 0.25) (layer F.Cu) (net 22) (tstamp 56AED6DB)) + (segment (start 78.961 129.54) (end 79.9084 129.54) (width 0.25) (layer F.Cu) (net 23)) + (segment (start 79.9084 129.54) (end 80.264 129.8956) (width 0.25) (layer F.Cu) (net 23) (tstamp 56AF1868)) + (segment (start 80.264 129.8956) (end 80.264 130.7592) (width 0.25) (layer F.Cu) (net 23) (tstamp 56AF1869)) + (segment (start 80.264 130.7592) (end 81.026 131.5212) (width 0.25) (layer F.Cu) (net 23) (tstamp 56AF186A)) + (segment (start 81.026 131.5212) (end 81.026 134.1628) (width 0.25) (layer F.Cu) (net 23) (tstamp 56AF186B)) + (segment (start 81.026 134.1628) (end 81.8388 134.9756) (width 0.25) (layer F.Cu) (net 23) (tstamp 56AF186E)) + (via (at 81.8388 134.9756) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 23)) + (segment (start 81.8388 134.9756) (end 81.788 135.0264) (width 0.25) (layer B.Cu) (net 23) (tstamp 56AF1873)) + (segment (start 81.788 135.0264) (end 81.788 140.462) (width 0.25) (layer B.Cu) (net 23) (tstamp 56AF1874)) + (segment (start 81.788 140.462) (end 82.3468 141.1224) (width 0.25) (layer B.Cu) (net 23) (tstamp 56AF1875)) + (segment (start 82.3468 141.1224) (end 83.058 141.0716) (width 0.25) (layer B.Cu) (net 23) (tstamp 56AF1879)) + (via (at 83.058 141.0716) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 23)) + (segment (start 83.058 141.0716) (end 83.528 142.71) (width 0.25) (layer F.Cu) (net 23) (tstamp 56AF187E)) + (segment (start 83.528 142.71) (end 84.717 142.71) (width 0.25) (layer F.Cu) (net 23) (tstamp 56AF187F)) + (segment (start 80.467 137.66) (end 80.467 139.141) (width 0.25) (layer F.Cu) (net 27)) + (segment (start 80.836 139.51) (end 84.717 139.51) (width 0.25) (layer F.Cu) (net 27) (tstamp 56AEB57C)) + (segment (start 80.467 139.141) (end 80.836 139.51) (width 0.25) (layer F.Cu) (net 27) (tstamp 56AEB57B)) + (segment (start 82.867 136.462) (end 82.867 137.66) (width 0.25) (layer F.Cu) (net 28) (tstamp 56AED0EE)) + (segment (start 82.931 136.398) (end 82.867 136.462) (width 0.25) (layer F.Cu) (net 28) (tstamp 56AED0ED)) + (via (at 82.931 136.398) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 28)) + (segment (start 88.646 136.398) (end 82.931 136.398) (width 0.25) (layer B.Cu) (net 28) (tstamp 56AED0E5)) + (segment (start 89.662 135.382) (end 88.646 136.398) (width 0.25) (layer B.Cu) (net 28) (tstamp 56AED0E4)) + (segment (start 90.678 135.382) (end 89.662 135.382) (width 0.25) (layer B.Cu) (net 28) (tstamp 56AED0E3)) + (segment (start 90.805 135.509) (end 90.678 135.382) (width 0.25) (layer B.Cu) (net 28) (tstamp 56AED0E2)) + (via (at 90.805 135.509) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 28)) + (segment (start 91.313 136.017) (end 90.805 135.509) (width 0.25) (layer F.Cu) (net 28) (tstamp 56AED0DC)) + (segment (start 91.313 136.144) (end 91.313 136.017) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 78.867 137.66) (end 78.867 136.652) (width 0.25) (layer F.Cu) (net 31)) + (segment (start 88.5825 137.414) (end 89.281 137.414) (width 0.25) (layer F.Cu) (net 31) (tstamp 56AED1CF)) + (segment (start 88.5825 135.636) (end 88.5825 137.414) (width 0.25) (layer F.Cu) (net 31) (tstamp 56AED1CE)) + (segment (start 88.4555 135.509) (end 88.5825 135.636) (width 0.25) (layer F.Cu) (net 31) (tstamp 56AED1CD)) + (via (at 88.4555 135.509) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 31)) + (segment (start 82.55 135.509) (end 88.4555 135.509) (width 0.25) (layer B.Cu) (net 31) (tstamp 56AED1CB)) + (segment (start 82.423 135.636) (end 82.55 135.509) (width 0.25) (layer B.Cu) (net 31) (tstamp 56AED1CA)) + (via (at 82.423 135.636) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 31)) + (segment (start 81.7245 136.3345) (end 82.423 135.636) (width 0.25) (layer F.Cu) (net 31) (tstamp 56AED1C6)) + (segment (start 79.1845 136.3345) (end 81.7245 136.3345) (width 0.25) (layer F.Cu) (net 31) (tstamp 56AED1C5)) + (segment (start 78.867 136.652) (end 79.1845 136.3345) (width 0.25) (layer F.Cu) (net 31) (tstamp 56AED1C4)) + (segment (start 78.867 137.66) (end 78.867 136.906) (width 0.25) (layer F.Cu) (net 31)) + (segment (start 73.017 140.31) (end 73.9136 140.31) (width 0.25) (layer F.Cu) (net 36)) + (segment (start 81.28 125.159) (end 82.045 124.394) (width 0.25) (layer F.Cu) (net 36) (tstamp 56AED6A2)) + (segment (start 81.28 125.4252) (end 81.28 125.159) (width 0.25) (layer F.Cu) (net 36) (tstamp 56AED6A1)) + (segment (start 81.1784 125.5268) (end 81.28 125.4252) (width 0.25) (layer F.Cu) (net 36) (tstamp 56AED6A0)) + (via (at 81.1784 125.5268) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 36)) + (segment (start 81.1784 129.1844) (end 81.1784 125.5268) (width 0.25) (layer B.Cu) (net 36) (tstamp 56AED69D)) + (segment (start 78.8924 131.4704) (end 81.1784 129.1844) (width 0.25) (layer B.Cu) (net 36) (tstamp 56AED69B)) + (segment (start 78.8924 133.0452) (end 78.8924 131.4704) (width 0.25) (layer B.Cu) (net 36) (tstamp 56AED699)) + (segment (start 76.4032 135.5344) (end 78.8924 133.0452) (width 0.25) (layer B.Cu) (net 36) (tstamp 56AED697)) + (segment (start 76.4032 137.8204) (end 76.4032 135.5344) (width 0.25) (layer B.Cu) (net 36) (tstamp 56AED695)) + (segment (start 74.8792 139.3444) (end 76.4032 137.8204) (width 0.25) (layer B.Cu) (net 36) (tstamp 56AED694)) + (via (at 74.8792 139.3444) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 36)) + (segment (start 73.9136 140.31) (end 74.8792 139.3444) (width 0.25) (layer F.Cu) (net 36) (tstamp 56AED690)) + (segment (start 90.7574 123.22854) (end 90.7574 124.0949) (width 0.25) (layer F.Cu) (net 38)) + (segment (start 74.981 141.91) (end 73.017 141.91) (width 0.25) (layer F.Cu) (net 38) (tstamp 56AED50D)) + (segment (start 75.184 142.113) (end 74.981 141.91) (width 0.25) (layer F.Cu) (net 38) (tstamp 56AED50C)) + (via (at 75.184 142.113) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 38)) + (segment (start 75.6285 142.5575) (end 75.184 142.113) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED50A)) + (segment (start 75.6285 147.5105) (end 75.6285 142.5575) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED509)) + (segment (start 76.327 148.209) (end 75.6285 147.5105) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED508)) + (segment (start 76.327 149.5425) (end 76.327 148.209) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED506)) + (segment (start 78.486 151.7015) (end 76.327 149.5425) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED504)) + (segment (start 90.4875 151.7015) (end 78.486 151.7015) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED502)) + (segment (start 93.345 148.844) (end 90.4875 151.7015) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED500)) + (segment (start 93.345 136.017) (end 93.345 148.844) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED4FE)) + (segment (start 91.694 134.366) (end 93.345 136.017) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED4FC)) + (segment (start 91.694 125.0315) (end 91.694 134.366) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED4FB)) + (segment (start 91.3765 124.714) (end 91.694 125.0315) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED4FA)) + (via (at 91.3765 124.714) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 38)) + (segment (start 90.7574 124.0949) (end 91.3765 124.714) (width 0.25) (layer F.Cu) (net 38) (tstamp 56AED4F8)) + (segment (start 73.017 142.71) (end 74.384 142.71) (width 0.25) (layer F.Cu) (net 39)) + (segment (start 90.1074 124.5226) (end 90.1074 123.22854) (width 0.25) (layer F.Cu) (net 39) (tstamp 56AED729)) + (segment (start 90.0176 124.6124) (end 90.1074 124.5226) (width 0.25) (layer F.Cu) (net 39) (tstamp 56AED728)) + (via (at 90.0176 124.6124) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 39)) + (segment (start 89.1032 124.6124) (end 90.0176 124.6124) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED726)) + (segment (start 88.392 125.3236) (end 89.1032 124.6124) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED725)) + (segment (start 88.392 133.7056) (end 88.392 125.3236) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED722)) + (segment (start 87.8332 134.2644) (end 88.392 133.7056) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED71D)) + (segment (start 83.0072 134.2644) (end 87.8332 134.2644) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED71C)) + (segment (start 82.6516 133.9088) (end 83.0072 134.2644) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED71B)) + (segment (start 81.6864 133.9088) (end 82.6516 133.9088) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED71A)) + (segment (start 81.1784 134.4168) (end 81.6864 133.9088) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED719)) + (segment (start 80.9244 141.605) (end 81.1784 134.4168) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED718)) + (segment (start 80.8736 141.6558) (end 80.9244 141.605) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED717)) + (via (at 80.8736 141.6558) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 39)) + (segment (start 81.1276 144.1704) (end 80.8736 141.6558) (width 0.25) (layer F.Cu) (net 39) (tstamp 56AED710)) + (segment (start 81.2292 144.272) (end 81.1276 144.1704) (width 0.25) (layer F.Cu) (net 39) (tstamp 56AED70F)) + (via (at 81.2292 144.272) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 39)) + (segment (start 79.502 144.272) (end 81.2292 144.272) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED70B)) + (segment (start 78.9432 143.7132) (end 79.502 144.272) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED70A)) + (via (at 78.9432 143.7132) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 39)) + (segment (start 75.3872 143.7132) (end 78.9432 143.7132) (width 0.25) (layer F.Cu) (net 39) (tstamp 56AED706)) + (segment (start 74.384 142.71) (end 75.3872 143.7132) (width 0.25) (layer F.Cu) (net 39) (tstamp 56AED6FC)) + (segment (start 73.017 143.51) (end 72.136 143.51) (width 0.25) (layer F.Cu) (net 40)) + (segment (start 72.136 143.51) (end 71.8185 143.1925) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AF1DAD)) + (segment (start 71.8185 143.1925) (end 71.8185 141.2875) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AF1DAE)) + (segment (start 71.8185 141.2875) (end 71.0685 140.5375) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AF1DAF)) + (segment (start 71.0685 140.5375) (end 69.7491 140.5375) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AF1DB0)) + (segment (start 69.7491 140.5375) (end 69.7484 140.5368) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AF1DB1)) + (segment (start 71.0685 140.5375) (end 70.231 140.5375) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AEB604)) + (segment (start 71.8185 141.2875) (end 71.0685 140.5375) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AEB603)) + (segment (start 71.8185 143.1925) (end 71.8185 141.2875) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AEB602)) + (segment (start 72.136 143.51) (end 71.8185 143.1925) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AEB601)) + (segment (start 70.0405 143.141) (end 70.9415 143.141) (width 0.25) (layer F.Cu) (net 41)) + (segment (start 70.9415 143.141) (end 72.1105 144.31) (width 0.25) (layer F.Cu) (net 41) (tstamp 56AEC5EC)) + (segment (start 72.1105 144.31) (end 73.017 144.31) (width 0.25) (layer F.Cu) (net 41) (tstamp 56AEC5ED)) + (segment (start 70.231 143.141) (end 70.624 143.141) (width 0.25) (layer F.Cu) (net 41)) + (segment (start 69.7865 145.7445) (end 69.7865 146.3675) (width 0.25) (layer F.Cu) (net 42)) + (segment (start 74.2442 146.5326) (end 73.169 146.558) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC662)) + (segment (start 74.3458 146.7612) (end 74.2442 146.5326) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC661)) + (via (at 74.3458 146.7612) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 42)) + (segment (start 74.3458 147.0152) (end 74.3458 146.7612) (width 0.25) (layer B.Cu) (net 42) (tstamp 56AEC65F)) + (segment (start 74.041 147.574) (end 74.3458 147.0152) (width 0.25) (layer B.Cu) (net 42) (tstamp 56AEC65E)) + (segment (start 71.0057 147.5105) (end 74.041 147.574) (width 0.25) (layer B.Cu) (net 42) (tstamp 56AEC65D)) + (segment (start 70.8152 147.32) (end 71.0057 147.5105) (width 0.25) (layer B.Cu) (net 42) (tstamp 56AEC65C)) + (via (at 70.8152 147.32) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 42)) + (segment (start 70.5485 146.8755) (end 70.8152 147.32) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC657)) + (segment (start 70.5485 146.685) (end 70.5485 146.8755) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC656)) + (segment (start 70.358 146.4945) (end 70.5485 146.685) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC651)) + (segment (start 69.9135 146.4945) (end 70.358 146.4945) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC650)) + (segment (start 69.7865 146.3675) (end 69.9135 146.4945) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC64D)) + (segment (start 73.169 146.558) (end 73.017 146.71) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC663)) + (segment (start 72.992 146.685) (end 73.017 146.71) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC5CF)) + (segment (start 70.231 148.348) (end 70.231 148.6916) (width 0.25) (layer F.Cu) (net 43)) + (segment (start 73.017 148.3026) (end 73.017 147.51) (width 0.25) (layer F.Cu) (net 43) (tstamp 56AF1E10)) + (segment (start 73.1266 148.4122) (end 73.017 148.3026) (width 0.25) (layer F.Cu) (net 43) (tstamp 56AF1E0F)) + (via (at 73.1266 148.4122) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 43)) + (segment (start 73.152 148.4376) (end 73.1266 148.4122) (width 0.25) (layer B.Cu) (net 43) (tstamp 56AF1E0D)) + (segment (start 73.152 149.352) (end 73.152 148.4376) (width 0.25) (layer B.Cu) (net 43) (tstamp 56AF1E0C)) + (segment (start 72.517 149.987) (end 73.152 149.352) (width 0.25) (layer B.Cu) (net 43) (tstamp 56AF1E0B)) + (segment (start 71.882 149.987) (end 72.517 149.987) (width 0.25) (layer B.Cu) (net 43) (tstamp 56AF1E0A)) + (segment (start 71.6788 149.7838) (end 71.882 149.987) (width 0.25) (layer B.Cu) (net 43) (tstamp 56AF1E09)) + (via (at 71.6788 149.7838) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 43)) + (segment (start 71.6788 149.5298) (end 71.6788 149.7838) (width 0.25) (layer F.Cu) (net 43) (tstamp 56AF1E07)) + (segment (start 71.2724 149.1234) (end 71.6788 149.5298) (width 0.25) (layer F.Cu) (net 43) (tstamp 56AF1E06)) + (segment (start 70.6628 149.1234) (end 71.2724 149.1234) (width 0.25) (layer F.Cu) (net 43) (tstamp 56AF1DFF)) + (segment (start 70.231 148.6916) (end 70.6628 149.1234) (width 0.25) (layer F.Cu) (net 43) (tstamp 56AF1DFE)) + (segment (start 74.867 149.36) (end 74.867 147.5735) (width 0.25) (layer F.Cu) (net 44)) + (segment (start 85.344 149.86) (end 87.5665 149.86) (width 0.25) (layer F.Cu) (net 44) (tstamp 56AEC3BE)) + (segment (start 83.5025 148.0185) (end 85.344 149.86) (width 0.25) (layer F.Cu) (net 44) (tstamp 56AEC3BD)) + (segment (start 83.5025 147.066) (end 83.5025 148.0185) (width 0.25) (layer F.Cu) (net 44) (tstamp 56AEC3BC)) + (segment (start 82.8675 146.431) (end 83.5025 147.066) (width 0.25) (layer F.Cu) (net 44) (tstamp 56AEC3BB)) + (via (at 82.8675 146.431) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 44)) + (segment (start 78.9432 145.7198) (end 82.8675 146.431) (width 0.25) (layer B.Cu) (net 44) (tstamp 56AEC3B8)) + (via (at 78.9432 145.7198) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 44)) + (segment (start 76.0095 146.431) (end 78.9432 145.7198) (width 0.25) (layer F.Cu) (net 44) (tstamp 56AEC3B3)) + (segment (start 74.867 147.5735) (end 76.0095 146.431) (width 0.25) (layer F.Cu) (net 44) (tstamp 56AEC3B1)) + (segment (start 75.667 149.36) (end 75.667 147.853) (width 0.25) (layer F.Cu) (net 45)) + (segment (start 86.8045 148.082) (end 87.5665 147.32) (width 0.25) (layer B.Cu) (net 45) (tstamp 56AEC548)) + (segment (start 85.1535 148.082) (end 86.8045 148.082) (width 0.25) (layer B.Cu) (net 45) (tstamp 56AEC547)) + (segment (start 84.7725 148.463) (end 85.1535 148.082) (width 0.25) (layer B.Cu) (net 45) (tstamp 56AEC546)) + (segment (start 84.201 148.463) (end 84.7725 148.463) (width 0.25) (layer B.Cu) (net 45) (tstamp 56AEC545)) + (segment (start 82.8675 147.1295) (end 84.201 148.463) (width 0.25) (layer B.Cu) (net 45) (tstamp 56AEC544)) + (segment (start 78.5368 146.6342) (end 82.8675 147.1295) (width 0.25) (layer B.Cu) (net 45) (tstamp 56AEC543)) + (via (at 78.5368 146.6342) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 45)) + (segment (start 75.667 147.853) (end 78.5368 146.6342) (width 0.25) (layer F.Cu) (net 45) (tstamp 56AEC53C)) + (segment (start 84.361 133.35) (end 82.9945 133.35) (width 0.25) (layer F.Cu) (net 49)) + (segment (start 81.267 148.0055) (end 81.267 149.36) (width 0.25) (layer F.Cu) (net 49) (tstamp 56AEBA1A)) + (segment (start 80.4545 147.193) (end 81.267 148.0055) (width 0.25) (layer F.Cu) (net 49) (tstamp 56AEBA19)) + (segment (start 80.2005 141.2367) (end 80.4545 147.193) (width 0.25) (layer F.Cu) (net 49) (tstamp 56AEBA17)) + (segment (start 80.137 141.1732) (end 80.2005 141.2367) (width 0.25) (layer F.Cu) (net 49) (tstamp 56AEBA16)) + (via (at 80.137 141.1732) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 49)) + (segment (start 80.391 133.9215) (end 80.137 141.1732) (width 0.25) (layer B.Cu) (net 49) (tstamp 56AEBA12)) + (segment (start 80.9625 133.35) (end 80.391 133.9215) (width 0.25) (layer B.Cu) (net 49) (tstamp 56AEBA11)) + (segment (start 82.9945 133.35) (end 80.9625 133.35) (width 0.25) (layer B.Cu) (net 49) (tstamp 56AEBA10)) + (via (at 82.9945 133.35) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 49)) + (segment (start 84.361 133.35) (end 84.361 134.62) (width 0.25) (layer F.Cu) (net 49)) + (segment (start 82.867 149.36) (end 82.867 150.3294) (width 0.25) (layer F.Cu) (net 51)) + (segment (start 86.741 126.0602) (end 86.741 126.238) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F4D)) + (segment (start 88.9254 123.8758) (end 86.741 126.0602) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F4B)) + (segment (start 91.7702 123.8758) (end 88.9254 123.8758) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F4A)) + (segment (start 92.1766 124.2822) (end 91.7702 123.8758) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F49)) + (segment (start 92.1766 133.5786) (end 92.1766 124.2822) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F45)) + (segment (start 93.9546 135.3566) (end 92.1766 133.5786) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F39)) + (segment (start 93.9546 141.732) (end 93.9546 135.3566) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F32)) + (segment (start 94.0308 141.8082) (end 93.9546 141.732) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F31)) + (via (at 94.0308 141.8082) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 51)) + (segment (start 94.0308 142.5956) (end 94.0308 141.8082) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AF1F2F)) + (segment (start 92.2528 144.3736) (end 94.0308 142.5956) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AF1F2E)) + (via (at 92.2528 144.3736) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 51)) + (segment (start 92.2528 147.5486) (end 92.2528 144.3736) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F2A)) + (segment (start 91.1352 148.6662) (end 92.2528 147.5486) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F29)) + (segment (start 85.725 148.6662) (end 91.1352 148.6662) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F27)) + (segment (start 84.4042 149.987) (end 85.725 148.6662) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F26)) + (via (at 84.4042 149.987) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 51)) + (segment (start 84.0994 150.2918) (end 84.4042 149.987) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AF1F24)) + (segment (start 82.9046 150.2918) (end 84.0994 150.2918) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AF1F23)) + (segment (start 82.867 150.3294) (end 82.9046 150.2918) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AF1F21)) + (segment (start 87.4275 135.624) (end 87.4275 135.3185) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AEC535)) + (segment (start 87.4275 133.731) (end 87.0585 133.731) (width 0.25) (layer F.Cu) (net 51)) + (segment (start 86.741 126.238) (end 87.1855 125.7935) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AEB889)) + (via (at 86.741 126.238) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 51)) + (segment (start 86.741 133.4135) (end 86.741 126.238) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AEB882)) + (via (at 86.741 133.4135) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 51)) + (segment (start 87.0585 133.731) (end 86.741 133.4135) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AEB87F)) + (segment (start 87.1855 125.7935) (end 87.4275 125.7935) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AEB88A)) + (segment (start 87.4275 135.3185) (end 87.4275 136.906) (width 0.25) (layer F.Cu) (net 51)) + (segment (start 87.4275 135.3185) (end 87.4275 133.731) (width 0.25) (layer F.Cu) (net 51)) + (segment (start 68.6435 148.348) (end 66.282 148.348) (width 0.25) (layer F.Cu) (net 53)) + (segment (start 66.282 148.348) (end 66.04 148.59) (width 0.25) (layer F.Cu) (net 53) (tstamp 56AEB282)) + (segment (start 66.04 146.05) (end 68.1475 146.05) (width 0.25) (layer F.Cu) (net 54)) + (segment (start 68.1475 146.05) (end 68.453 145.7445) (width 0.25) (layer F.Cu) (net 54) (tstamp 56AECE66)) + (segment (start 66.3455 145.7445) (end 66.04 146.05) (width 0.25) (layer F.Cu) (net 54) (tstamp 56AEB27C)) + (segment (start 68.453 143.141) (end 66.409 143.141) (width 0.25) (layer F.Cu) (net 55)) + (segment (start 66.409 143.141) (end 66.04 143.51) (width 0.25) (layer F.Cu) (net 55) (tstamp 56AECE63)) + (segment (start 66.409 143.141) (end 66.04 143.51) (width 0.25) (layer F.Cu) (net 55) (tstamp 56AEB276)) + (segment (start 67.9704 140.5368) (end 66.4732 140.5368) (width 0.25) (layer F.Cu) (net 56)) + (segment (start 66.4732 140.5368) (end 66.04 140.97) (width 0.25) (layer F.Cu) (net 56) (tstamp 56AF1B67)) + (segment (start 66.4725 140.5375) (end 66.04 140.97) (width 0.25) (layer F.Cu) (net 56) (tstamp 56AEB617)) + (segment (start 66.4725 140.5375) (end 66.04 140.97) (width 0.25) (layer F.Cu) (net 56) (tstamp 56AEB271)) + (segment (start 91.2495 142.113) (end 91.2495 141.9733) (width 0.25) (layer B.Cu) (net 57)) + (segment (start 91.2495 141.9733) (end 92.7608 140.462) (width 0.25) (layer B.Cu) (net 57) (tstamp 56AF1B09)) + (segment (start 89.5858 136.779) (end 89.281 136.779) (width 0.25) (layer F.Cu) (net 57) (tstamp 56AF1B13)) + (segment (start 89.9668 137.16) (end 89.5858 136.779) (width 0.25) (layer F.Cu) (net 57) (tstamp 56AF1B12)) + (segment (start 89.9668 137.668) (end 89.9668 137.16) (width 0.25) (layer F.Cu) (net 57) (tstamp 56AF1B11)) + (segment (start 90.3732 138.0744) (end 89.9668 137.668) (width 0.25) (layer F.Cu) (net 57) (tstamp 56AF1B10)) + (via (at 90.3732 138.0744) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 57)) + (segment (start 91.9988 138.0744) (end 90.3732 138.0744) (width 0.25) (layer B.Cu) (net 57) (tstamp 56AF1B0D)) + (segment (start 92.7608 138.8364) (end 91.9988 138.0744) (width 0.25) (layer B.Cu) (net 57) (tstamp 56AF1B0C)) + (segment (start 92.7608 140.462) (end 92.7608 138.8364) (width 0.25) (layer B.Cu) (net 57) (tstamp 56AF1B0A)) + (segment (start 91.2495 142.113) (end 90.805 142.113) (width 0.25) (layer F.Cu) (net 57)) + (segment (start 91.2495 142.113) (end 90.7415 142.113) (width 0.25) (layer F.Cu) (net 57)) + (segment (start 91.313 136.779) (end 91.821 136.779) (width 0.25) (layer F.Cu) (net 58)) + (segment (start 91.948 136.906) (end 91.948 138.8745) (width 0.25) (layer F.Cu) (net 58) (tstamp 56AED202)) + (segment (start 91.821 136.779) (end 91.948 136.906) (width 0.25) (layer F.Cu) (net 58) (tstamp 56AED201)) + (segment (start 91.948 138.8745) (end 91.2495 139.573) (width 0.25) (layer F.Cu) (net 58) (tstamp 56AED203)) + (segment (start 85.9275 133.731) (end 85.9275 132.08) (width 0.25) (layer F.Cu) (net 59)) + (segment (start 85.9275 132.08) (end 84.361 132.08) (width 0.25) (layer F.Cu) (net 59)) + (segment (start 85.9275 125.7935) (end 82.7405 125.7935) (width 0.25) (layer F.Cu) (net 60)) + (segment (start 83.312 129.54) (end 84.361 129.54) (width 0.25) (layer F.Cu) (net 60) (tstamp 56AEB847)) + (segment (start 83.127002 129.355002) (end 83.312 129.54) (width 0.25) (layer F.Cu) (net 60) (tstamp 56AEB846)) + (segment (start 83.127002 128.339002) (end 83.127002 129.355002) (width 0.25) (layer F.Cu) (net 60) (tstamp 56AEB845)) + (segment (start 82.042 127.254) (end 83.127002 128.339002) (width 0.25) (layer F.Cu) (net 60) (tstamp 56AEB844)) + (segment (start 82.042 126.492) (end 82.042 127.254) (width 0.25) (layer F.Cu) (net 60) (tstamp 56AEB843)) + (segment (start 82.7405 125.7935) (end 82.042 126.492) (width 0.25) (layer F.Cu) (net 60) (tstamp 56AEB842)) + (segment (start 85.9275 127.381) (end 85.9275 125.7935) (width 0.25) (layer F.Cu) (net 60)) + (segment (start 84.4245 129.4765) (end 84.361 129.54) (width 0.25) (layer F.Cu) (net 60) (tstamp 56AEB752)) + (segment (start 67.9704 142.0368) (end 69.7484 142.0368) (width 0.25) (layer F.Cu) (net 61)) + (segment (start 68.453 144.641) (end 70.0405 144.641) (width 0.25) (layer F.Cu) (net 62)) + (segment (start 68.453 147.2445) (end 69.7865 147.2445) (width 0.25) (layer F.Cu) (net 63)) + (segment (start 68.6435 149.848) (end 70.231 149.848) (width 0.25) (layer F.Cu) (net 64)) + (segment (start 78.961 128.27) (end 80.01 128.27) (width 0.25) (layer F.Cu) (net 65)) + (segment (start 74.041 134.747) (end 74.041 137.033) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AED68C)) + (segment (start 74.3204 134.4676) (end 74.041 134.747) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AED68B)) + (segment (start 76.5048 134.4676) (end 74.3204 134.4676) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AED689)) + (segment (start 78.0796 132.8928) (end 76.5048 134.4676) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AED686)) + (segment (start 78.0796 130.2004) (end 78.0796 132.8928) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AED685)) + (segment (start 78.6892 129.5908) (end 78.0796 130.2004) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AED683)) + (segment (start 79.6036 129.5908) (end 78.6892 129.5908) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AED682)) + (segment (start 80.4672 128.7272) (end 79.6036 129.5908) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AED681)) + (via (at 80.4672 128.7272) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 65)) + (segment (start 80.01 128.27) (end 80.4672 128.7272) (width 0.25) (layer F.Cu) (net 65) (tstamp 56AED67D)) + (segment (start 71.616 138.938) (end 71.501 138.938) (width 0.25) (layer F.Cu) (net 65)) + (segment (start 71.501 138.938) (end 70.6755 138.1125) (width 0.25) (layer F.Cu) (net 65) (tstamp 56AEB5F6)) + (segment (start 69.2665 138.1125) (end 68.707 137.553) (width 0.25) (layer F.Cu) (net 65) (tstamp 56AEB5F8)) + (segment (start 70.6755 138.1125) (end 69.2665 138.1125) (width 0.25) (layer F.Cu) (net 65) (tstamp 56AEB5F7)) + (segment (start 74.041 137.033) (end 72.3265 137.033) (width 0.25) (layer B.Cu) (net 65)) + (segment (start 71.616 140.093) (end 71.616 138.938) (width 0.25) (layer F.Cu) (net 65) (tstamp 56AEB5F3)) + (segment (start 71.5645 140.1445) (end 71.616 140.093) (width 0.25) (layer F.Cu) (net 65) (tstamp 56AEB5F2)) + (via (at 71.5645 140.1445) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 65)) + (segment (start 71.5645 137.795) (end 71.5645 140.1445) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AEB5F0)) + (segment (start 72.3265 137.033) (end 71.5645 137.795) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AEB5E6)) + (segment (start 72.9615 137.045) (end 74.029 137.045) (width 0.25) (layer F.Cu) (net 65)) + (via (at 74.041 137.033) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 65)) + (segment (start 74.029 137.045) (end 74.041 137.033) (width 0.25) (layer F.Cu) (net 65) (tstamp 56AEB593)) + (segment (start 79.0245 128.3335) (end 78.961 128.27) (width 0.25) (layer F.Cu) (net 65) (tstamp 56AEB59E)) + (segment (start 86.868 141.1478) (end 86.6902 141.1478) (width 0.25) (layer F.Cu) (net 66)) + (segment (start 86.6902 141.1478) (end 86.1314 141.7066) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1BF1)) + (segment (start 86.1314 141.7066) (end 86.1314 142.367) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1BF3)) + (via (at 86.1314 142.367) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 66)) + (segment (start 86.1314 142.367) (end 85.8012 142.6972) (width 0.25) (layer B.Cu) (net 66) (tstamp 56AF1BF5)) + (segment (start 85.8012 142.6972) (end 82.9564 142.6972) (width 0.25) (layer B.Cu) (net 66) (tstamp 56AF1BF6)) + (segment (start 82.9564 142.6972) (end 81.6356 141.3764) (width 0.25) (layer B.Cu) (net 66) (tstamp 56AF1BF7)) + (via (at 81.6356 141.3764) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 66)) + (segment (start 81.6356 141.3764) (end 80.5942 140.335) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1BFC)) + (segment (start 80.5942 140.335) (end 80.4164 140.335) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1BFD)) + (segment (start 80.4164 140.335) (end 79.9846 139.9032) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1BFE)) + (segment (start 79.9846 139.9032) (end 78.867 139.9032) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1BFF)) + (segment (start 78.867 139.9032) (end 76.9366 141.8336) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C00)) + (segment (start 76.9366 141.8336) (end 76.9366 142.9512) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C02)) + (via (at 76.9366 142.9512) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 66)) + (segment (start 76.9366 142.9512) (end 76.5048 143.383) (width 0.25) (layer B.Cu) (net 66) (tstamp 56AF1C05)) + (segment (start 76.5048 143.383) (end 76.5048 144.4752) (width 0.25) (layer B.Cu) (net 66) (tstamp 56AF1C06)) + (segment (start 76.5048 144.4752) (end 76.3016 144.6784) (width 0.25) (layer B.Cu) (net 66) (tstamp 56AF1C07)) + (via (at 76.3016 144.6784) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 66)) + (segment (start 76.3016 144.6784) (end 76.0476 144.9324) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C09)) + (segment (start 76.0476 144.9324) (end 74.7268 144.9324) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C0A)) + (via (at 74.7268 144.9324) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 66)) + (segment (start 74.7268 144.9324) (end 71.4248 141.6304) (width 0.25) (layer B.Cu) (net 66) (tstamp 56AF1C0C)) + (segment (start 71.4248 141.6304) (end 71.1454 141.6304) (width 0.25) (layer B.Cu) (net 66) (tstamp 56AF1C0D)) + (via (at 71.1454 141.6304) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 66)) + (segment (start 71.1454 141.6304) (end 70.7898 141.2748) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C10)) + (segment (start 70.7898 141.2748) (end 69.088 141.2748) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C11)) + (segment (start 69.088 141.2748) (end 68.8848 141.0716) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C12)) + (segment (start 68.8848 141.0716) (end 68.8848 140.0048) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C13)) + (segment (start 68.8848 140.0048) (end 69.469 139.4206) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C14)) + (segment (start 69.469 139.4206) (end 69.469 138.938) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C15)) + (segment (start 70.116 138.938) (end 69.469 138.938) (width 0.25) (layer F.Cu) (net 66)) + (segment (start 69.469 138.938) (end 68.822 138.938) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AECF5F)) + (segment (start 68.822 138.938) (end 68.707 139.053) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AEB5FB)) + (segment (start 76.708 135.878) (end 79.7045 135.878) (width 0.25) (layer F.Cu) (net 67)) + (segment (start 80.0735 133.35) (end 78.961 133.35) (width 0.25) (layer F.Cu) (net 67) (tstamp 56AEB5A5)) + (segment (start 80.264 133.5405) (end 80.0735 133.35) (width 0.25) (layer F.Cu) (net 67) (tstamp 56AEB5A4)) + (segment (start 80.264 135.3185) (end 80.264 133.5405) (width 0.25) (layer F.Cu) (net 67) (tstamp 56AEB5A3)) + (segment (start 79.7045 135.878) (end 80.264 135.3185) (width 0.25) (layer F.Cu) (net 67) (tstamp 56AEB5A2)) + (segment (start 75.057 135.878) (end 76.708 135.878) (width 0.25) (layer F.Cu) (net 67)) + (segment (start 73.406 135.878) (end 75.057 135.878) (width 0.25) (layer F.Cu) (net 67)) + (segment (start 74.9815 134.378) (end 74.3585 135.001) (width 0.25) (layer F.Cu) (net 68) (tstamp 56AECDDD)) + (segment (start 88.2015 139.8905) (end 88.8492 139.9032) (width 0.25) (layer F.Cu) (net 68) (tstamp 56AECE13)) + (segment (start 88.1888 139.954) (end 88.2015 139.8905) (width 0.25) (layer F.Cu) (net 68) (tstamp 56AECE12)) + (segment (start 88.2396 140.208) (end 88.2396 139.954) (width 0.25) (layer F.Cu) (net 68) (tstamp 56AECE11)) + (segment (start 88.2396 139.954) (end 88.2396 140.208) (width 0.25) (layer F.Cu) (net 68) (tstamp 56AECE10)) + (via (at 88.1888 139.954) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 68)) + (segment (start 88.7222 142.367) (end 88.1888 139.954) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECE0A)) + (segment (start 86.4235 144.526) (end 88.7222 142.367) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECE05)) + (segment (start 82.296 144.7292) (end 86.4235 144.526) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECDFE)) + (segment (start 81.28 143.1544) (end 82.296 144.7292) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECDFD)) + (segment (start 78.8416 143.002) (end 81.28 143.1544) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECDFC)) + (segment (start 75.184 141.3256) (end 78.8416 143.002) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECDFB)) + (segment (start 71.374 140.97) (end 75.184 141.3256) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECDF5)) + (segment (start 70.8025 140.3985) (end 71.374 140.97) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECDF2)) + (segment (start 70.8025 136.017) (end 70.8025 140.3985) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECDF1)) + (segment (start 71.8185 135.001) (end 70.8025 136.017) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECDF0)) + (via (at 71.8185 135.001) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 68)) + (segment (start 74.3585 135.001) (end 71.8185 135.001) (width 0.25) (layer F.Cu) (net 68) (tstamp 56AECDEB)) + (segment (start 76.708 134.378) (end 74.9815 134.378) (width 0.25) (layer F.Cu) (net 68)) + (segment (start 75.057 134.378) (end 76.708 134.378) (width 0.25) (layer F.Cu) (net 68)) + (segment (start 78.961 134.62) (end 78.5495 134.62) (width 0.25) (layer F.Cu) (net 69)) + (segment (start 78.5495 134.62) (end 77.5335 133.604) (width 0.25) (layer F.Cu) (net 69) (tstamp 56AEB573)) + (segment (start 77.5335 133.604) (end 74.18 133.604) (width 0.25) (layer F.Cu) (net 69) (tstamp 56AEB574)) + (segment (start 74.18 133.604) (end 73.406 134.378) (width 0.25) (layer F.Cu) (net 69) (tstamp 56AEB576)) + (segment (start 70.358 133.211) (end 70.854 133.211) (width 0.25) (layer F.Cu) (net 69)) + (segment (start 72.021 134.378) (end 73.406 134.378) (width 0.25) (layer F.Cu) (net 69) (tstamp 56AEB56F)) + (segment (start 70.854 133.211) (end 72.021 134.378) (width 0.25) (layer F.Cu) (net 69) (tstamp 56AEB56E)) + (segment (start 73.406 134.378) (end 73.013 134.378) (width 0.25) (layer F.Cu) (net 69)) + (segment (start 78.961 127) (end 79.8576 127) (width 0.25) (layer F.Cu) (net 70)) + (segment (start 71.616 136.156) (end 71.616 137.287) (width 0.25) (layer F.Cu) (net 70) (tstamp 56AED67A)) + (segment (start 71.8312 135.9408) (end 71.616 136.156) (width 0.25) (layer F.Cu) (net 70) (tstamp 56AED679)) + (via (at 71.8312 135.9408) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 70)) + (segment (start 71.9836 135.9408) (end 71.8312 135.9408) (width 0.25) (layer B.Cu) (net 70) (tstamp 56AED677)) + (segment (start 74.2188 133.7056) (end 71.9836 135.9408) (width 0.25) (layer B.Cu) (net 70) (tstamp 56AED675)) + (segment (start 76.3524 133.7056) (end 74.2188 133.7056) (width 0.25) (layer B.Cu) (net 70) (tstamp 56AED670)) + (segment (start 77.5208 132.5372) (end 76.3524 133.7056) (width 0.25) (layer B.Cu) (net 70) (tstamp 56AED66D)) + (segment (start 77.5208 128.9304) (end 77.5208 132.5372) (width 0.25) (layer B.Cu) (net 70) (tstamp 56AED66A)) + (segment (start 77.724 128.7272) (end 77.5208 128.9304) (width 0.25) (layer B.Cu) (net 70) (tstamp 56AED665)) + (segment (start 78.8416 128.7272) (end 77.724 128.7272) (width 0.25) (layer B.Cu) (net 70) (tstamp 56AED664)) + (segment (start 80.2132 127.3556) (end 78.8416 128.7272) (width 0.25) (layer B.Cu) (net 70) (tstamp 56AED663)) + (via (at 80.2132 127.3556) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 70)) + (segment (start 79.8576 127) (end 80.2132 127.3556) (width 0.25) (layer F.Cu) (net 70) (tstamp 56AED661)) + (segment (start 71.616 137.287) (end 71.616 137.783) (width 0.25) (layer F.Cu) (net 70)) + (segment (start 71.616 137.783) (end 72.378 138.545) (width 0.25) (layer F.Cu) (net 70) (tstamp 56AEB58F)) + (segment (start 72.378 138.545) (end 72.9615 138.545) (width 0.25) (layer F.Cu) (net 70) (tstamp 56AEB590)) + (segment (start 79.0245 127.0635) (end 78.961 127) (width 0.25) (layer F.Cu) (net 70) (tstamp 56AEB56B)) + (segment (start 70.358 131.711) (end 70.358 130.441) (width 0.25) (layer F.Cu) (net 71)) + (segment (start 70.358 130.441) (end 70.219 130.302) (width 0.25) (layer F.Cu) (net 71) (tstamp 56AEB26E)) + (segment (start 70.358 130.441) (end 70.219 130.302) (width 0.25) (layer F.Cu) (net 71) (tstamp 56AEAAD8)) + (segment (start 70.116 137.287) (end 70.116 136.12) (width 0.25) (layer F.Cu) (net 72)) + (segment (start 70.116 136.12) (end 70.358 135.878) (width 0.25) (layer F.Cu) (net 72) (tstamp 56AEB29A)) + +) diff --git a/PCB/OUTPUT_V35/Tinylab_proto1.kicad_pcb-bak b/PCB/OUTPUT_V35/Tinylab_proto1.kicad_pcb-bak new file mode 100644 index 00000000..be9f547d --- /dev/null +++ b/PCB/OUTPUT_V35/Tinylab_proto1.kicad_pcb-bak @@ -0,0 +1,3082 @@ +(kicad_pcb (version 4) (host pcbnew "(2015-08-05 BZR 6055, Git fa29c62)-product") + + (general + (links 128) + (no_connects 6) + (area 62.526905 115.741 100.356691 155.935) + (thickness 1.6) + (drawings 10) + (tracks 837) + (zones 0) + (modules 59) + (nets 73) + ) + + (page A4) + (layers + (0 F.Cu signal) + (31 B.Cu signal) + (32 B.Adhes user) + (33 F.Adhes user) + (34 B.Paste user) + (35 F.Paste user) + (36 B.SilkS user) + (37 F.SilkS user) + (38 B.Mask user) + (39 F.Mask user) + (40 Dwgs.User user) + (41 Cmts.User user) + (42 Eco1.User user) + (43 Eco2.User user) + (44 Edge.Cuts user) + (45 Margin user) + (46 B.CrtYd user) + (47 F.CrtYd user) + (48 B.Fab user) + (49 F.Fab user) + ) + + (setup + (last_trace_width 1.016) + (user_trace_width 0.508) + (user_trace_width 1.016) + (trace_clearance 0.2) + (zone_clearance 0.508) + (zone_45_only no) + (trace_min 0.2) + (segment_width 0.2) + (edge_width 0.1) + (via_size 0.6) + (via_drill 0.4) + (via_min_size 0.4) + (via_min_drill 0.3) + (uvia_size 0.3) + (uvia_drill 0.1) + (uvias_allowed no) + (uvia_min_size 0.2) + (uvia_min_drill 0.1) + (pcb_text_width 0.3) + (pcb_text_size 1.5 1.5) + (mod_edge_width 0.15) + (mod_text_size 1 1) + (mod_text_width 0.15) + (pad_size 1.5 1.5) + (pad_drill 0.6) + (pad_to_mask_clearance 0) + (aux_axis_origin 0 0) + (visible_elements 7FFFFFDF) + (pcbplotparams + (layerselection 0x00030_80000001) + (usegerberextensions false) + (excludeedgelayer true) + (linewidth 0.100000) + (plotframeref false) + (viasonmask false) + (mode 1) + (useauxorigin false) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15) + (hpglpenoverlay 2) + (psnegative false) + (psa4output false) + (plotreference true) + (plotvalue true) + (plotinvisibletext false) + (padsonsilk false) + (subtractmaskfromsilk false) + (outputformat 1) + (mirror false) + (drillshape 1) + (scaleselection 1) + (outputdirectory "")) + ) + + (net 0 "") + (net 1 "Net-(C1-Pad1)") + (net 2 "Net-(C1-Pad2)") + (net 3 "Net-(C2-Pad1)") + (net 4 "Net-(C2-Pad2)") + (net 5 +5V) + (net 6 /AGND) + (net 7 /VCC_3V3) + (net 8 /AVCC) + (net 9 /VCC_PSU) + (net 10 /VGND) + (net 11 "Net-(C13-Pad1)") + (net 12 "Net-(C13-Pad2)") + (net 13 "Net-(C14-Pad1)") + (net 14 "Net-(C14-Pad2)") + (net 15 /PSU_OUT) + (net 16 "Net-(D1-Pad2)") + (net 17 /PSU_FEEDBACK) + (net 18 /CH2) + (net 19 "Net-(IC1-Pad3)") + (net 20 /TO_B0) + (net 21 /TO_B1) + (net 22 /DAC_OUT) + (net 23 /DAC_OUT2) + (net 24 "Net-(IC1-Pad8)") + (net 25 "Net-(IC1-Pad9)") + (net 26 "Net-(IC1-Pad10)") + (net 27 /XCK) + (net 28 /DIG_CH2) + (net 29 "Net-(IC1-Pad13)") + (net 30 "Net-(IC1-Pad16)") + (net 31 /DIG_CH1) + (net 32 "Net-(IC1-Pad20)") + (net 33 "Net-(IC1-Pad21)") + (net 34 "Net-(IC1-Pad22)") + (net 35 "Net-(IC1-Pad23)") + (net 36 /PSU_PWM) + (net 37 "Net-(IC1-Pad25)") + (net 38 /D-) + (net 39 /D+) + (net 40 "Net-(IC1-Pad28)") + (net 41 "Net-(IC1-Pad29)") + (net 42 "Net-(IC1-Pad32)") + (net 43 "Net-(IC1-Pad33)") + (net 44 "Net-(IC1-Pad34)") + (net 45 "Net-(IC1-Pad35)") + (net 46 "Net-(IC1-Pad36)") + (net 47 "Net-(IC1-Pad37)") + (net 48 "Net-(IC1-Pad41)") + (net 49 /CH1) + (net 50 "Net-(IC1-Pad43)") + (net 51 /AVCC_ON_2) + (net 52 "Net-(P2-Pad4)") + (net 53 "Net-(P3-Pad1)") + (net 54 "Net-(P3-Pad2)") + (net 55 "Net-(P3-Pad3)") + (net 56 "Net-(P3-Pad4)") + (net 57 "Net-(P8-Pad1)") + (net 58 "Net-(P8-Pad2)") + (net 59 "Net-(R1-Pad1)") + (net 60 "Net-(R2-Pad1)") + (net 61 "Net-(R11-Pad2)") + (net 62 "Net-(R12-Pad2)") + (net 63 "Net-(R13-Pad2)") + (net 64 "Net-(R10-Pad1)") + (net 65 "Net-(R15-Pad1)") + (net 66 "Net-(R15-Pad2)") + (net 67 "Net-(R17-Pad1)") + (net 68 "Net-(R17-Pad2)") + (net 69 "Net-(R19-Pad1)") + (net 70 "Net-(R20-Pad1)") + (net 71 "Net-(R22-Pad1)") + (net 72 "Net-(R23-Pad1)") + + (net_class Default "This is the default net class." + (clearance 0.2) + (trace_width 0.25) + (via_dia 0.6) + (via_drill 0.4) + (uvia_dia 0.3) + (uvia_drill 0.1) + (add_net +5V) + (add_net /AGND) + (add_net /AVCC) + (add_net /AVCC_ON_2) + (add_net /CH1) + (add_net /CH2) + (add_net /D+) + (add_net /D-) + (add_net /DAC_OUT) + (add_net /DAC_OUT2) + (add_net /DIG_CH1) + (add_net /DIG_CH2) + (add_net /PSU_FEEDBACK) + (add_net /PSU_OUT) + (add_net /PSU_PWM) + (add_net /TO_B0) + (add_net /TO_B1) + (add_net /VCC_3V3) + (add_net /VCC_PSU) + (add_net /VGND) + (add_net /XCK) + (add_net "Net-(C1-Pad1)") + (add_net "Net-(C1-Pad2)") + (add_net "Net-(C13-Pad1)") + (add_net "Net-(C13-Pad2)") + (add_net "Net-(C14-Pad1)") + (add_net "Net-(C14-Pad2)") + (add_net "Net-(C2-Pad1)") + (add_net "Net-(C2-Pad2)") + (add_net "Net-(D1-Pad2)") + (add_net "Net-(IC1-Pad10)") + (add_net "Net-(IC1-Pad13)") + (add_net "Net-(IC1-Pad16)") + (add_net "Net-(IC1-Pad20)") + (add_net "Net-(IC1-Pad21)") + (add_net "Net-(IC1-Pad22)") + (add_net "Net-(IC1-Pad23)") + (add_net "Net-(IC1-Pad25)") + (add_net "Net-(IC1-Pad28)") + (add_net "Net-(IC1-Pad29)") + (add_net "Net-(IC1-Pad3)") + (add_net "Net-(IC1-Pad32)") + (add_net "Net-(IC1-Pad33)") + (add_net "Net-(IC1-Pad34)") + (add_net "Net-(IC1-Pad35)") + (add_net "Net-(IC1-Pad36)") + (add_net "Net-(IC1-Pad37)") + (add_net "Net-(IC1-Pad41)") + (add_net "Net-(IC1-Pad43)") + (add_net "Net-(IC1-Pad8)") + (add_net "Net-(IC1-Pad9)") + (add_net "Net-(P2-Pad4)") + (add_net "Net-(P3-Pad1)") + (add_net "Net-(P3-Pad2)") + (add_net "Net-(P3-Pad3)") + (add_net "Net-(P3-Pad4)") + (add_net "Net-(P8-Pad1)") + (add_net "Net-(P8-Pad2)") + (add_net "Net-(R1-Pad1)") + (add_net "Net-(R10-Pad1)") + (add_net "Net-(R11-Pad2)") + (add_net "Net-(R12-Pad2)") + (add_net "Net-(R13-Pad2)") + (add_net "Net-(R15-Pad1)") + (add_net "Net-(R15-Pad2)") + (add_net "Net-(R17-Pad1)") + (add_net "Net-(R17-Pad2)") + (add_net "Net-(R19-Pad1)") + (add_net "Net-(R2-Pad1)") + (add_net "Net-(R20-Pad1)") + (add_net "Net-(R22-Pad1)") + (add_net "Net-(R23-Pad1)") + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA51F) + (at 86.8045 130.4925) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CAB611) + (attr smd) + (fp_text reference C1 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 2 "Net-(C1-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA525) + (at 86.8045 128.9685) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CAB4DE) + (attr smd) + (fp_text reference C2 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 4 "Net-(C2-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA52B) + (at 92.5195 131.6355 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB13E1) + (attr smd) + (fp_text reference C3 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA531) + (at 94.869 135.0645 180) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB147C) + (attr smd) + (fp_text reference C4 (at 0 -1.9 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 2 smd rect (at 0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA537) + (at 86.8045 138.43 180) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55D60181) + (attr smd) + (fp_text reference C5 (at 0 -1.9 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 8 /AVCC)) + (pad 2 smd rect (at 0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_ThroughHole:C_Radial_D5_L11_P2.5 (layer F.Cu) (tedit 0) (tstamp 56AEA53D) + (at 94.8055 147.5105 90) + (descr "Radial Electrolytic Capacitor Diameter 5mm x Length 11mm, Pitch 2.5mm") + (tags "Electrolytic Capacitor") + (path /566F5A75) + (fp_text reference C6 (at 1.25 -3.8 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.25 3.8 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.325 -2.499) (end 1.325 2.499) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.465 -2.491) (end 1.465 2.491) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 -2.475) (end 1.605 -0.095) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 0.095) (end 1.605 2.475) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 -2.451) (end 1.745 -0.49) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 0.49) (end 1.745 2.451) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 -2.418) (end 1.885 -0.657) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 0.657) (end 1.885 2.418) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 -2.377) (end 2.025 -0.764) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 0.764) (end 2.025 2.377) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 -2.327) (end 2.165 -0.835) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 0.835) (end 2.165 2.327) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 -2.266) (end 2.305 -0.879) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 0.879) (end 2.305 2.266) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 -2.196) (end 2.445 -0.898) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 0.898) (end 2.445 2.196) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 -2.114) (end 2.585 -0.896) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 0.896) (end 2.585 2.114) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 -2.019) (end 2.725 -0.871) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 0.871) (end 2.725 2.019) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 -1.908) (end 2.865 -0.823) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 0.823) (end 2.865 1.908) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 -1.78) (end 3.005 -0.745) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 0.745) (end 3.005 1.78) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 -1.631) (end 3.145 -0.628) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 0.628) (end 3.145 1.631) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 -1.452) (end 3.285 -0.44) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 0.44) (end 3.285 1.452) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 -1.233) (end 3.425 1.233) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.565 -0.944) (end 3.565 0.944) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.705 -0.472) (end 3.705 0.472) (layer F.SilkS) (width 0.15)) + (fp_circle (center 2.5 0) (end 2.5 -0.9) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -2.5375) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -2.8) (layer F.CrtYd) (width 0.05)) + (pad 1 thru_hole rect (at 0 0 90) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 7 /VCC_3V3)) + (pad 2 thru_hole circle (at 2.5 0 90) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (model Capacitors_ThroughHole.3dshapes/C_Radial_D5_L11_P2.5.wrl + (at (xyz 0.049213 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA549) + (at 78.613 151.003 180) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /56AF91A3) + (attr smd) + (fp_text reference C8 (at 0 -1.9 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 8 /AVCC)) + (pad 2 smd rect (at 0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_ThroughHole:C_Radial_D5_L11_P2.5 (layer F.Cu) (tedit 0) (tstamp 56AEA54F) + (at 93.2815 127.1905) + (descr "Radial Electrolytic Capacitor Diameter 5mm x Length 11mm, Pitch 2.5mm") + (tags "Electrolytic Capacitor") + (path /560719D9) + (fp_text reference C9 (at 1.25 -3.8) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.25 3.8) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.325 -2.499) (end 1.325 2.499) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.465 -2.491) (end 1.465 2.491) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 -2.475) (end 1.605 -0.095) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 0.095) (end 1.605 2.475) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 -2.451) (end 1.745 -0.49) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 0.49) (end 1.745 2.451) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 -2.418) (end 1.885 -0.657) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 0.657) (end 1.885 2.418) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 -2.377) (end 2.025 -0.764) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 0.764) (end 2.025 2.377) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 -2.327) (end 2.165 -0.835) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 0.835) (end 2.165 2.327) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 -2.266) (end 2.305 -0.879) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 0.879) (end 2.305 2.266) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 -2.196) (end 2.445 -0.898) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 0.898) (end 2.445 2.196) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 -2.114) (end 2.585 -0.896) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 0.896) (end 2.585 2.114) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 -2.019) (end 2.725 -0.871) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 0.871) (end 2.725 2.019) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 -1.908) (end 2.865 -0.823) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 0.823) (end 2.865 1.908) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 -1.78) (end 3.005 -0.745) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 0.745) (end 3.005 1.78) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 -1.631) (end 3.145 -0.628) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 0.628) (end 3.145 1.631) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 -1.452) (end 3.285 -0.44) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 0.44) (end 3.285 1.452) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 -1.233) (end 3.425 1.233) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.565 -0.944) (end 3.565 0.944) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.705 -0.472) (end 3.705 0.472) (layer F.SilkS) (width 0.15)) + (fp_circle (center 2.5 0) (end 2.5 -0.9) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -2.5375) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -2.8) (layer F.CrtYd) (width 0.05)) + (pad 1 thru_hole rect (at 0 0) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 9 /VCC_PSU)) + (pad 2 thru_hole circle (at 2.5 0) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 10 /VGND)) + (model Capacitors_ThroughHole.3dshapes/C_Radial_D5_L11_P2.5.wrl + (at (xyz 0.049213 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA555) + (at 83.5025 123.444 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /56071A50) + (attr smd) + (fp_text reference C10 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VCC_PSU)) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 10 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA55B) + (at 71.374 145.542 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /5608B4BE) + (attr smd) + (fp_text reference C11 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA561) + (at 95.504 122.9995 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55D75F49) + (attr smd) + (fp_text reference C12 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 10 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA567) + (at 68.707 132.588 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB630B) + (attr smd) + (fp_text reference C13 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 11 "Net-(C13-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 12 "Net-(C13-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA56D) + (at 68.707 135.509 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /566DF655) + (attr smd) + (fp_text reference C14 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 13 "Net-(C14-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 14 "Net-(C14-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5 (layer F.Cu) (tedit 0) (tstamp 56AEA573) + (at 73.8505 124.2695) + (descr "Radial Electrolytic Capacitor, Diameter 6.3mm x Length 11.2mm, Pitch 2.5mm") + (tags "Electrolytic Capacitor") + (path /560735FE) + (fp_text reference C15 (at 1.25 -4.4) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.25 4.4) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.325 -3.149) (end 1.325 3.149) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.465 -3.143) (end 1.465 3.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 -3.13) (end 1.605 -0.446) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 0.446) (end 1.605 3.13) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 -3.111) (end 1.745 -0.656) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 0.656) (end 1.745 3.111) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 -3.085) (end 1.885 -0.789) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 0.789) (end 1.885 3.085) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 -3.053) (end 2.025 -0.88) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 0.88) (end 2.025 3.053) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 -3.014) (end 2.165 -0.942) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 0.942) (end 2.165 3.014) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 -2.968) (end 2.305 -0.981) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 0.981) (end 2.305 2.968) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 -2.915) (end 2.445 -0.998) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 0.998) (end 2.445 2.915) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 -2.853) (end 2.585 -0.996) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 0.996) (end 2.585 2.853) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 -2.783) (end 2.725 -0.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 0.974) (end 2.725 2.783) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 -2.704) (end 2.865 -0.931) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 0.931) (end 2.865 2.704) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 -2.616) (end 3.005 -0.863) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 0.863) (end 3.005 2.616) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 -2.516) (end 3.145 -0.764) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 0.764) (end 3.145 2.516) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 -2.404) (end 3.285 -0.619) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 0.619) (end 3.285 2.404) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 -2.279) (end 3.425 -0.38) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 0.38) (end 3.425 2.279) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.565 -2.136) (end 3.565 2.136) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.705 -1.974) (end 3.705 1.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.845 -1.786) (end 3.845 1.786) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.985 -1.563) (end 3.985 1.563) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.125 -1.287) (end 4.125 1.287) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.265 -0.912) (end 4.265 0.912) (layer F.SilkS) (width 0.15)) + (fp_circle (center 2.5 0) (end 2.5 -1) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.1875) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.4) (layer F.CrtYd) (width 0.05)) + (pad 2 thru_hole circle (at 2.5 0) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 10 /VGND)) + (pad 1 thru_hole rect (at 0 0) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 15 /PSU_OUT)) + (model Capacitors_ThroughHole.3dshapes/C_Radial_D6.3_L11.2_P2.5.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56AEA579) + (at 71.4375 129.2225 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /5607355F) + (attr smd) + (fp_text reference C16 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 15 /PSU_OUT)) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 10 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10 (layer F.Cu) (tedit 552FFCCE) (tstamp 56AEA57F) + (at 75.7555 119.4435 180) + (descr "Diode, DO-41, SOD81, Horizontal, RM 10mm,") + (tags "Diode, DO-41, SOD81, Horizontal, RM 10mm, 1N4007, SB140,") + (path /5606FDB4) + (fp_text reference D1 (at 5.38734 2.53746 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value D_Schottky (at 4.37134 -3.55854 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 7.62 -0.00254) (end 8.636 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -0.00254) (end 1.524 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.048 -1.27254) (end 3.048 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.302 -1.27254) (end 3.302 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.556 -1.27254) (end 3.556 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -1.27254) (end 2.794 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.175 -1.27254) (end 3.175 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 1.26746) (end 2.54 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 7.62 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 -1.27254) (end 7.62 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 1.26746) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at 10.16 -0.00254) (size 1.99898 1.99898) (drill 1.27) (layers *.Cu *.Mask F.SilkS) + (net 16 "Net-(D1-Pad2)")) + (pad 1 thru_hole rect (at 0 -0.00254) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.Mask F.SilkS) + (net 15 /PSU_OUT)) + ) + + (module Capacitors_SMD:C_1206 (layer F.Cu) (tedit 5415D7BD) (tstamp 56AEA585) + (at 94.5515 137.9855 90) + (descr "Capacitor SMD 1206, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 1206") + (path /55D739F3) + (attr smd) + (fp_text reference F1 (at 0 -2.3 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value F_Small (at 0 2.3 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.3 -1.15) (end 2.3 -1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.3 1.15) (end 2.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.3 -1.15) (end -2.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.3 -1.15) (end 2.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 -1.025) (end -1 -1.025) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 1.025) (end 1 1.025) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.5 0 90) (size 1 1.6) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 2 smd rect (at 1.5 0 90) (size 1 1.6) (layers F.Cu F.Paste F.Mask) + (net 10 /VGND)) + (model Capacitors_SMD.3dshapes/C_1206.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm (layer F.Cu) (tedit 54130A77) (tstamp 56AEA5B5) + (at 78.867 143.51 180) + (descr "LQFP44 (see Appnote_PCB_Guidelines_TRINAMIC_packages.pdf)") + (tags "QFP 0.8") + (path /55CA8F25) + (attr smd) + (fp_text reference IC1 (at 0 -7.65 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value ATXMEGA16A4U-A (at 0 7.65 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -6.9 -6.9) (end -6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start 6.9 -6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 -6.9) (end 6.9 -6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.175 -5.175) (end -5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -5.175) (end -4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -4.505) (end -6.65 -4.505) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -5.85 -4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 17 /PSU_FEEDBACK)) + (pad 2 smd rect (at -5.85 -3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 18 /CH2)) + (pad 3 smd rect (at -5.85 -2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 19 "Net-(IC1-Pad3)")) + (pad 4 smd rect (at -5.85 -1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 20 /TO_B0)) + (pad 5 smd rect (at -5.85 -0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 21 /TO_B1)) + (pad 6 smd rect (at -5.85 0 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 22 /DAC_OUT)) + (pad 7 smd rect (at -5.85 0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 23 /DAC_OUT2)) + (pad 8 smd rect (at -5.85 1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 24 "Net-(IC1-Pad8)")) + (pad 9 smd rect (at -5.85 2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 25 "Net-(IC1-Pad9)")) + (pad 10 smd rect (at -5.85 3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 26 "Net-(IC1-Pad10)")) + (pad 11 smd rect (at -5.85 4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 27 /XCK)) + (pad 12 smd rect (at -4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 28 /DIG_CH2)) + (pad 13 smd rect (at -3.2 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 29 "Net-(IC1-Pad13)")) + (pad 14 smd rect (at -2.4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 15 smd rect (at -1.6 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 27 /XCK)) + (pad 16 smd rect (at -0.8 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 30 "Net-(IC1-Pad16)")) + (pad 17 smd rect (at 0 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 31 /DIG_CH1)) + (pad 18 smd rect (at 0.8 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 19 smd rect (at 1.6 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 20 smd rect (at 2.4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 32 "Net-(IC1-Pad20)")) + (pad 21 smd rect (at 3.2 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 33 "Net-(IC1-Pad21)")) + (pad 22 smd rect (at 4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 34 "Net-(IC1-Pad22)")) + (pad 23 smd rect (at 5.85 4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 35 "Net-(IC1-Pad23)")) + (pad 24 smd rect (at 5.85 3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 36 /PSU_PWM)) + (pad 25 smd rect (at 5.85 2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 37 "Net-(IC1-Pad25)")) + (pad 26 smd rect (at 5.85 1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 38 /D-)) + (pad 27 smd rect (at 5.85 0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 39 /D+)) + (pad 28 smd rect (at 5.85 0 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 40 "Net-(IC1-Pad28)")) + (pad 29 smd rect (at 5.85 -0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 41 "Net-(IC1-Pad29)")) + (pad 30 smd rect (at 5.85 -1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 31 smd rect (at 5.85 -2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 32 smd rect (at 5.85 -3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 42 "Net-(IC1-Pad32)")) + (pad 33 smd rect (at 5.85 -4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 43 "Net-(IC1-Pad33)")) + (pad 34 smd rect (at 4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 44 "Net-(IC1-Pad34)")) + (pad 35 smd rect (at 3.2 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 45 "Net-(IC1-Pad35)")) + (pad 36 smd rect (at 2.4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 46 "Net-(IC1-Pad36)")) + (pad 37 smd rect (at 1.6 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 47 "Net-(IC1-Pad37)")) + (pad 38 smd rect (at 0.8 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 39 smd rect (at 0 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 8 /AVCC)) + (pad 40 smd rect (at -0.8 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 18 /CH2)) + (pad 41 smd rect (at -1.6 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 48 "Net-(IC1-Pad41)")) + (pad 42 smd rect (at -2.4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 49 /CH1)) + (pad 43 smd rect (at -3.2 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 50 "Net-(IC1-Pad43)")) + (pad 44 smd rect (at -4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 51 /AVCC_ON_2)) + (model Housings_QFP.3dshapes/LQFP-44_10x10mm_Pitch0.8mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Inductors:INDUCTOR_V (layer F.Cu) (tedit 0) (tstamp 56AEA5BB) + (at 68.0085 125.222) + (descr "Inductor (vertical)") + (tags INDUCTOR) + (path /5606EE9E) + (fp_text reference L1 (at 0 1.99898) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value INDUCTOR (at 0.09906 -1.99898) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 0 0) (end 3.81 0) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at -2.54 0) (size 1.905 1.905) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) + (net 16 "Net-(D1-Pad2)")) + (pad 2 thru_hole circle (at 2.54 0) (size 1.905 1.905) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) + (net 9 /VCC_PSU)) + (model Inductors.3dshapes/INDUCTOR_V.wrl + (at (xyz 0 0 0)) + (scale (xyz 2 2 2)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 (layer F.Cu) (tedit 0) (tstamp 56AEA5C3) + (at 90.043 126.3015) + (descr "Through hole pin header") + (tags "pin header") + (path /55CAB35C) + (fp_text reference P1 (at 0 -5.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SCOPE_IN (at 0 -3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 3 "Net-(C2-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 4 "Net-(C2-Pad2)")) + (pad 3 thru_hole oval (at 0 5.08) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 2 "Net-(C1-Pad2)")) + (pad 4 thru_hole oval (at 0 7.62) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 1 "Net-(C1-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Connect:USB_Micro-B (layer F.Cu) (tedit 5543E447) (tstamp 56AEA5D0) + (at 90.1065 121.666 180) + (descr "Micro USB Type B Receptacle") + (tags "USB USB_B USB_micro USB_OTG") + (path /55CA90D2) + (attr smd) + (fp_text reference P2 (at 0 -3.45 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value USB_OTG (at 0 4.8 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.6 -2.8) (end 4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 -2.8) (end 4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 4.05) (end -4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.6 4.05) (end -4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3509 3.81746) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 -2.58754) (end 4.3491 -2.58754) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 -2.58754) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 2.58746) (end -4.3509 2.58746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 3.81746) (end -4.3509 -2.58754) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.3009 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -0.6509 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 38 /D-)) + (pad 3 smd rect (at -0.0009 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 39 /D+)) + (pad 4 smd rect (at 0.6491 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 52 "Net-(P2-Pad4)")) + (pad 5 smd rect (at 1.2991 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 6 thru_hole oval (at -2.5009 -1.56254 270) (size 0.95 1.25) (drill oval 0.55 0.85) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 6 thru_hole oval (at 2.4991 -1.56254 270) (size 0.95 1.25) (drill oval 0.55 0.85) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 6 thru_hole oval (at -3.5009 1.13746 270) (size 1.55 1) (drill oval 1.15 0.5) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 6 thru_hole oval (at 3.4991 1.13746 270) (size 1.55 1) (drill oval 1.15 0.5) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 locked (layer F.Cu) (tedit 0) (tstamp 56AEA5D8) + (at 66.04 148.59 180) + (descr "Through hole pin header") + (tags "pin header") + (path /55CBF4D5) + (fp_text reference P3 (at 0 -5.1 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DIG_OUT (at 0 -3.1 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 53 "Net-(P3-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 54 "Net-(P3-Pad2)")) + (pad 3 thru_hole oval (at 0 5.08 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 55 "Net-(P3-Pad3)")) + (pad 4 thru_hole oval (at 0 7.62 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 56 "Net-(P3-Pad4)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_2x02 (layer F.Cu) (tedit 0) (tstamp 56AEA5E0) + (at 90.1065 149.86 180) + (descr "Through hole pin header") + (tags "pin header") + (path /56069A87) + (fp_text reference P4 (at 0 -5.1 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value PDI (at 0 -3.1 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.75) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 4.3 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 -1.55) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 -1.27) (end 3.81 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27) (end 3.81 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 3.81) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 7 /VCC_3V3)) + (pad 2 thru_hole oval (at 2.54 0 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 44 "Net-(IC1-Pad34)")) + (pad 3 thru_hole oval (at 0 2.54 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 4 thru_hole oval (at 2.54 2.54 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 45 "Net-(IC1-Pad35)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_2x02.wrl + (at (xyz 0.05 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x03 (layer F.Cu) (tedit 0) (tstamp 56AEA5E7) + (at 83.693 119.38 270) + (descr "Through hole pin header") + (tags "pin header") + (path /56065DA8) + (fp_text reference P5 (at 0 -5.1 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CONN_01X03 (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 6.85) (end 1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 6.35) (end 1.27 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 6.35) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 5 +5V)) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 9 /VCC_PSU)) + (pad 3 thru_hole oval (at 0 5.08 270) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 7 /VCC_3V3)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x03.wrl + (at (xyz 0 -0.1 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 locked (layer F.Cu) (tedit 0) (tstamp 56AEA5EF) + (at 66.04 130.81) + (descr "Through hole pin header") + (tags "pin header") + (path /566DF832) + (fp_text reference P6 (at 0 -5.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DAC_OUT (at 0 -3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 12 "Net-(C13-Pad2)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 11 "Net-(C13-Pad1)")) + (pad 3 thru_hole oval (at 0 5.08) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 14 "Net-(C14-Pad2)")) + (pad 4 thru_hole oval (at 0 7.62) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 13 "Net-(C14-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_2x02 (layer F.Cu) (tedit 0) (tstamp 56AEA5F7) + (at 73.66 132.08 90) + (descr "Through hole pin header") + (tags "pin header") + (path /55CC540F) + (fp_text reference P7 (at 0 -5.1 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value HVO (at 0 -3.1 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.75) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 4.3 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 -1.55) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 -1.27) (end 3.81 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27) (end 3.81 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 3.81) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 90) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 15 /PSU_OUT)) + (pad 2 thru_hole oval (at 2.54 0 90) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 10 /VGND)) + (pad 3 thru_hole oval (at 0 2.54 90) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 10 /VGND)) + (pad 4 thru_hole oval (at 2.54 2.54 90) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 10 /VGND)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_2x02.wrl + (at (xyz 0.05 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 54EA090C) (tstamp 56AEA5FD) + (at 91.2495 142.113 180) + (descr "Through hole pin header") + (tags "pin header") + (path /55D6DB77) + (fp_text reference P8 (at 0 -5.1 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DIG_IN (at 0 -3.1 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 57 "Net-(P8-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 180) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 58 "Net-(P8-Pad2)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module SMD:SOT-23-3 (layer F.Cu) (tedit 5508E933) (tstamp 56AEA604) + (at 80.645 123.444 270) + (path /5606F6D4) + (fp_text reference Q1 (at 2.5 0 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Q_NMOS_GSD (at -2.2 0 360) (layer F.Fab) hide + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 1 -0.4) (end 1.1 -0.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 -0.8) (end -1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 0.8) (end 1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 0.8) (end 1.5 -0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 -0.8) (end -1.5 -0.8) (layer F.SilkS) (width 0.15)) + (pad 3 smd rect (at 0 1.4 270) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 16 "Net-(D1-Pad2)")) + (pad 2 smd rect (at -0.95 -1.4 270) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 10 /VGND)) + (pad 1 smd rect (at 0.95 -1.4 270) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 36 /PSU_PWM)) + (model 3D/SMD/SOT-23-3.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA60A) + (at 86.6775 132.08) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAB95) + (attr smd) + (fp_text reference R1 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA610) + (at 86.6775 127.381) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAD4C) + (attr smd) + (fp_text reference R2 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R2-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA616) + (at 86.6775 133.731) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAABF4) + (attr smd) + (fp_text reference R3 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 51 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA61C) + (at 86.6775 125.7935 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAD11) + (attr smd) + (fp_text reference R4 (at 0 -1.9 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 51 /AVCC_ON_2)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R2-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA622) + (at 86.6775 135.3185) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAC5F) + (attr smd) + (fp_text reference R5 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 8 /AVCC)) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 51 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA628) + (at 86.6775 136.906) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAACD2) + (attr smd) + (fp_text reference R6 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 51 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA62E) + (at 67.9704 141.2868 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBCDA5) + (attr smd) + (fp_text reference R7 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R11-Pad2)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 56 "Net-(P3-Pad4)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA634) + (at 68.453 143.891 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE401) + (attr smd) + (fp_text reference R8 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R12-Pad2)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 55 "Net-(P3-Pad3)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA63A) + (at 68.453 146.4945 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE16B) + (attr smd) + (fp_text reference R9 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R13-Pad2)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 54 "Net-(P3-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA640) + (at 68.6435 149.098 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE2C7) + (attr smd) + (fp_text reference R10 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R10-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 53 "Net-(P3-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA646) + (at 69.7484 141.2868 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBCD2A) + (attr smd) + (fp_text reference R11 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 40 "Net-(IC1-Pad28)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R11-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA64C) + (at 70.0405 143.891 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE362) + (attr smd) + (fp_text reference R12 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 41 "Net-(IC1-Pad29)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R12-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA652) + (at 69.7865 146.4945 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE0F4) + (attr smd) + (fp_text reference R13 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 42 "Net-(IC1-Pad32)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R13-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA658) + (at 70.231 149.098 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE21C) + (attr smd) + (fp_text reference R14 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 43 "Net-(IC1-Pad33)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R10-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA65E) + (at 68.707 138.303 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56B0C779) + (attr smd) + (fp_text reference R15 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R15-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R15-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA664) + (at 70.866 138.938 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56B0C86E) + (attr smd) + (fp_text reference R16 (at 0 -1.9 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R15-Pad1)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R15-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA66A) + (at 75.057 135.128 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56AFE83E) + (attr smd) + (fp_text reference R17 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R17-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R17-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA670) + (at 76.708 135.128 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56AFE8F3) + (attr smd) + (fp_text reference R18 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R17-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R17-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA676) + (at 73.406 135.128 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56AECD86) + (attr smd) + (fp_text reference R19 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 69 "Net-(R19-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R17-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA67C) + (at 72.9615 137.795 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56B0C682) + (attr smd) + (fp_text reference R20 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 70 "Net-(R20-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R15-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA682) + (at 81.3435 151.0665 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56AF0DE2) + (attr smd) + (fp_text reference R21 (at 0 -1.9 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 8 /AVCC)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA688) + (at 70.358 132.461 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CB4680) + (attr smd) + (fp_text reference R22 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 71 "Net-(R22-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 69 "Net-(R19-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA68E) + (at 70.866 137.287) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566DE721) + (attr smd) + (fp_text reference R23 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 72 "Net-(R23-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 70 "Net-(R20-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA694) + (at 69.469 130.302) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CB9020) + (attr smd) + (fp_text reference R24 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 12 "Net-(C13-Pad2)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 71 "Net-(R22-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA69A) + (at 70.358 135.128 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566DE7E8) + (attr smd) + (fp_text reference R25 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 14 "Net-(C14-Pad2)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 72 "Net-(R23-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA6A0) + (at 88.138 143.129 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566E5C29) + (attr smd) + (fp_text reference R26 (at 0 -1.9 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 15 /PSU_OUT)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 17 /PSU_FEEDBACK)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56AEA6A6) + (at 88.138 144.7165) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566E5CBE) + (attr smd) + (fp_text reference R27 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 17 /PSU_FEEDBACK)) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module SMD:SOT-23-3 (layer F.Cu) (tedit 5508E933) (tstamp 56AEA6AD) + (at 94.869 132.2705 180) + (path /55CA99FA) + (fp_text reference U1 (at 2.5 0 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value 78L05 (at -2.2 0 270) (layer F.Fab) hide + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 1 -0.4) (end 1.1 -0.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 -0.8) (end -1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 0.8) (end 1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 0.8) (end 1.5 -0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 -0.8) (end -1.5 -0.8) (layer F.SilkS) (width 0.15)) + (pad 3 smd rect (at 0 1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -0.95 -1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 1 smd rect (at 0.95 -1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model 3D/SMD/SOT-23-3.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm (layer F.Cu) (tedit 54130A77) (tstamp 56AEA6BF) + (at 81.661 130.81 180) + (descr "14-Lead Plastic Small Outline (SL) - Narrow, 3.90 mm Body [SOIC] (see Microchip Packaging Specification 00000049BS.pdf)") + (tags "SOIC 1.27") + (path /55CA87E2) + (attr smd) + (fp_text reference U2 (at 0 -5.375 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value LM324 (at 0 5.375 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.7 -4.65) (end -3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.7 -4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 -4.65) (end 3.7 -4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.075 -4.45) (end -2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 -4.45) (end 2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 4.45) (end 2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end -2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.45) (end 2.075 -4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end 2.075 4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.335) (end -3.45 -4.335) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2.7 -3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 49 /CH1)) + (pad 2 smd rect (at -2.7 -2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 49 /CH1)) + (pad 3 smd rect (at -2.7 -1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R1-Pad1)")) + (pad 4 smd rect (at -2.7 0 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 15 /PSU_OUT)) + (pad 5 smd rect (at -2.7 1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R2-Pad1)")) + (pad 6 smd rect (at -2.7 2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 18 /CH2)) + (pad 7 smd rect (at -2.7 3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 18 /CH2)) + (pad 8 smd rect (at 2.7 3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 70 "Net-(R20-Pad1)")) + (pad 9 smd rect (at 2.7 2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R15-Pad1)")) + (pad 10 smd rect (at 2.7 1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 23 /DAC_OUT2)) + (pad 11 smd rect (at 2.7 0 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 10 /VGND)) + (pad 12 smd rect (at 2.7 -1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 22 /DAC_OUT)) + (pad 13 smd rect (at 2.7 -2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R17-Pad1)")) + (pad 14 smd rect (at 2.7 -3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 69 "Net-(R19-Pad1)")) + (model Housings_SOIC.3dshapes/SOIC-14_3.9x8.7mm_Pitch1.27mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module TO_SOT_Packages_SMD:SOT-363 (layer F.Cu) (tedit 56735562) (tstamp 56AEA6C9) + (at 87.884 140.5128 180) + (descr SOT353) + (path /56B012DD) + (attr smd) + (fp_text reference U3 (at 0.09906 0 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DMN63D8LDW (at 0.09906 0 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 0.635 1.016) (end 0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 -1.016) (end -0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 -1.016) (end -0.635 1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 1.016) (end 0.635 1.016) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.016 -0.635 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 3 smd rect (at -1.016 0.635 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R17-Pad2)")) + (pad 6 smd rect (at 1.016 -0.635 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R15-Pad2)")) + (pad 2 smd rect (at -1.016 0 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 20 /TO_B0)) + (pad 4 smd rect (at 1.016 0.635 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 5 smd rect (at 1.016 0 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 21 /TO_B1)) + (model TO_SOT_Packages_SMD.3dshapes/SOT-353.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.07000000000000001 0.09 0.08)) + (rotate (xyz 0 0 90)) + ) + ) + + (module TO_SOT_Packages_SMD:SOT-363 (layer F.Cu) (tedit 56735562) (tstamp 56AEA6D3) + (at 90.297 136.779 180) + (descr SOT353) + (path /55D6ACFD) + (attr smd) + (fp_text reference U4 (at 0.09906 0 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DMN63D8LDW (at 0.09906 0 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 0.635 1.016) (end 0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 -1.016) (end -0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 -1.016) (end -0.635 1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 1.016) (end 0.635 1.016) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.016 -0.635 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 3 smd rect (at -1.016 0.635 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 28 /DIG_CH2)) + (pad 6 smd rect (at 1.016 -0.635 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 31 /DIG_CH1)) + (pad 2 smd rect (at -1.016 0 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(P8-Pad2)")) + (pad 4 smd rect (at 1.016 0.635 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 5 smd rect (at 1.016 0 180) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 57 "Net-(P8-Pad1)")) + (model TO_SOT_Packages_SMD.3dshapes/SOT-353.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.07000000000000001 0.09 0.08)) + (rotate (xyz 0 0 90)) + ) + ) + + (gr_line (start 97.409 152.0444) (end 97.409 117.5766) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 97.409 117.602) (end 96.5962 117.602) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 97.409 152.2222) (end 97.409 151.9936) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 96.5962 152.2222) (end 97.409 152.2222) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 64.2366 152.2222) (end 96.6216 152.2222) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 96.6216 117.602) (end 64.2112 117.602) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 64.2112 117.6274) (end 64.2366 117.6274) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 64.2112 152.2222) (end 64.2112 117.6274) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 64.2874 152.2222) (end 64.2366 152.2222) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 64.2874 152.2222) (end 64.3128 152.2222) (angle 90) (layer Edge.Cuts) (width 0.1)) + + (segment (start 90.043 133.9215) (end 90.043 133.7945) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 90.043 133.7945) (end 88.3285 132.08) (width 0.25) (layer F.Cu) (net 1) (tstamp 56AEB8C0)) + (segment (start 88.3285 132.08) (end 87.4275 132.08) (width 0.25) (layer F.Cu) (net 1) (tstamp 56AEB8C1)) + (segment (start 86.0545 130.4925) (end 86.0545 130.822) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 86.0545 130.822) (end 86.6775 131.445) (width 0.25) (layer F.Cu) (net 1) (tstamp 56AEB850)) + (segment (start 86.6775 131.445) (end 86.7925 131.445) (width 0.25) (layer F.Cu) (net 1) (tstamp 56AEB851)) + (segment (start 86.7925 131.445) (end 87.4275 132.08) (width 0.25) (layer F.Cu) (net 1) (tstamp 56AEB852)) + (segment (start 90.043 131.3815) (end 89.5985 131.3815) (width 0.25) (layer F.Cu) (net 2)) + (segment (start 89.5985 131.3815) (end 88.7095 130.4925) (width 0.25) (layer F.Cu) (net 2) (tstamp 56AEB8BC)) + (segment (start 88.7095 130.4925) (end 87.5545 130.4925) (width 0.25) (layer F.Cu) (net 2) (tstamp 56AEB8BD)) + (segment (start 87.4275 127.381) (end 87.6935 127.381) (width 0.25) (layer F.Cu) (net 3)) + (segment (start 88.773 126.3015) (end 90.043 126.3015) (width 0.25) (layer F.Cu) (net 3) (tstamp 56AEB8B5)) + (segment (start 87.6935 127.381) (end 88.773 126.3015) (width 0.25) (layer F.Cu) (net 3) (tstamp 56AEB8B4)) + (segment (start 86.0545 128.9685) (end 86.0545 128.8295) (width 0.25) (layer F.Cu) (net 3)) + (segment (start 86.0545 128.8295) (end 86.741 128.143) (width 0.25) (layer F.Cu) (net 3) (tstamp 56AEB84A)) + (segment (start 86.741 128.143) (end 86.741 127.5715) (width 0.25) (layer F.Cu) (net 3) (tstamp 56AEB84B)) + (segment (start 86.741 127.5715) (end 86.9315 127.381) (width 0.25) (layer F.Cu) (net 3) (tstamp 56AEB84C)) + (segment (start 86.9315 127.381) (end 87.4275 127.381) (width 0.25) (layer F.Cu) (net 3) (tstamp 56AEB84D)) + (segment (start 90.043 128.8415) (end 87.6815 128.8415) (width 0.25) (layer F.Cu) (net 4)) + (segment (start 87.6815 128.8415) (end 87.5545 128.9685) (width 0.25) (layer F.Cu) (net 4) (tstamp 56AEB8B9)) + (segment (start 94.869 130.8705) (end 94.869 129.7305) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 94.615 122.4915) (end 94.373 122.2495) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED403)) + (segment (start 94.615 129.4765) (end 94.615 122.4915) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED402)) + (segment (start 94.869 129.7305) (end 94.615 129.4765) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED401)) + (segment (start 92.5195 130.8855) (end 94.854 130.8855) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 94.854 130.8855) (end 94.869 130.8705) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED3F0)) + (segment (start 83.693 119.38) (end 89.8525 119.38) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 91.5035 122.1105) (end 91.4074 122.1105) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED38E)) + (segment (start 91.5035 121.031) (end 91.5035 122.1105) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED38B)) + (segment (start 89.8525 119.38) (end 91.5035 121.031) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED38A)) + (segment (start 91.4074 123.22854) (end 91.4074 122.1105) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 91.4074 122.1105) (end 91.4074 122.0161) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED38F)) + (segment (start 93.9285 122.2495) (end 94.373 122.2495) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED375)) + (segment (start 93.599 121.92) (end 93.9285 122.2495) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED374)) + (segment (start 91.5035 121.92) (end 93.599 121.92) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED373)) + (segment (start 91.4074 122.0161) (end 91.5035 121.92) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED372)) + (segment (start 94.373 122.2495) (end 95.504 122.2495) (width 0.25) (layer F.Cu) (net 5) (tstamp 56AED406)) + (segment (start 83.693 119.38) (end 84.5185 119.38) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 86.0545 138.43) (end 86.0545 137.033) (width 0.508) (layer F.Cu) (net 6) (status C00000)) + (segment (start 86.0545 137.033) (end 85.9275 136.906) (width 0.508) (layer F.Cu) (net 6) (tstamp 56AF2430) (status C00000)) + (segment (start 89.0524 138.4808) (end 89.0524 138.176) (width 0.508) (layer B.Cu) (net 6)) + (segment (start 89.9668 137.2616) (end 89.9668 136.9187) (width 0.508) (layer B.Cu) (net 6) (tstamp 56AF2428)) + (segment (start 89.0524 138.176) (end 89.9668 137.2616) (width 0.508) (layer B.Cu) (net 6) (tstamp 56AF2427)) + (segment (start 89.9668 136.9187) (end 90.551 136.3345) (width 0.508) (layer B.Cu) (net 6) (tstamp 56AF2429)) + (segment (start 92.583 136.4615) (end 90.678 136.4615) (width 0.508) (layer B.Cu) (net 6)) + (segment (start 90.678 136.4615) (end 90.551 136.3345) (width 0.508) (layer B.Cu) (net 6) (tstamp 56AF2422)) + (segment (start 94.119 135.0645) (end 93.1545 135.0645) (width 0.508) (layer F.Cu) (net 6) (status 400000)) + (segment (start 93.1545 135.0645) (end 93.0275 135.1915) (width 0.508) (layer F.Cu) (net 6) (tstamp 56AF241C)) + (segment (start 93.0275 135.1915) (end 93.0275 136.017) (width 0.508) (layer F.Cu) (net 6) (tstamp 56AF241D)) + (segment (start 93.0275 136.017) (end 92.583 136.4615) (width 0.508) (layer F.Cu) (net 6) (tstamp 56AF241E)) + (segment (start 94.8055 145.0105) (end 94.8055 139.7395) (width 0.508) (layer F.Cu) (net 6) (status C00000)) + (segment (start 94.8055 139.7395) (end 94.5515 139.4855) (width 0.508) (layer F.Cu) (net 6) (tstamp 56AF2411) (status C00000)) + (segment (start 73.017 145.11) (end 73.863 145.11) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 78.067 147.7138) (end 78.067 149.36) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF1D98)) + (segment (start 78.0542 147.701) (end 78.067 147.7138) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF1D97)) + (via (at 78.0542 147.701) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 77.8002 147.447) (end 78.0542 147.701) (width 0.25) (layer B.Cu) (net 6) (tstamp 56AF1D95)) + (segment (start 77.8002 145.7706) (end 77.8002 147.447) (width 0.25) (layer B.Cu) (net 6) (tstamp 56AF1D94)) + (segment (start 77.3176 145.288) (end 77.8002 145.7706) (width 0.25) (layer B.Cu) (net 6) (tstamp 56AF1D93)) + (segment (start 77.2922 145.288) (end 77.3176 145.288) (width 0.25) (layer B.Cu) (net 6) (tstamp 56AF1D92)) + (segment (start 77.1652 145.415) (end 77.2922 145.288) (width 0.25) (layer B.Cu) (net 6) (tstamp 56AF1D91)) + (via (at 77.1652 145.415) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 76.9874 145.5928) (end 77.1652 145.415) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF1D8E)) + (segment (start 74.3458 145.5928) (end 76.9874 145.5928) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF1D8C)) + (segment (start 73.863 145.11) (end 74.3458 145.5928) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF1D8B)) + (segment (start 88.9 141.1478) (end 88.4174 141.1478) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 87.4776 140.208) (end 87.4776 139.446) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF1A15)) + (segment (start 88.4174 141.1478) (end 87.4776 140.208) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF1A14)) + (segment (start 88.888 144.7165) (end 88.888 146.038) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 88.888 146.038) (end 90.1065 147.2565) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF189C)) + (segment (start 90.1065 147.2565) (end 90.1065 147.32) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF189D)) + (segment (start 89.1159 141.1605) (end 89.1159 141.2875) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 89.1159 141.2875) (end 89.662 141.8336) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED74C)) + (segment (start 89.662 141.8336) (end 89.662 145.0105) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED74D)) + (segment (start 89.662 145.0105) (end 89.6385 145.034) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED74E)) + (segment (start 89.6385 145.034) (end 89.6112 145.034) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED74F)) + (segment (start 89.6112 145.034) (end 89.6112 145.0105) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED750)) + (segment (start 88.5952 139.2936) (end 88.5952 138.938) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 88.5952 139.2936) (end 87.63 139.2936) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED5A0)) + (segment (start 87.63 139.2936) (end 87.4776 139.446) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED59C)) + (segment (start 87.4776 139.446) (end 87.0331 139.8905) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AF1A1A)) + (segment (start 88.5952 138.938) (end 89.0524 138.4808) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED5A2)) + (via (at 89.0524 138.4808) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 89.9668 136.9187) (end 90.551 136.3345) (width 0.25) (layer B.Cu) (net 6) (tstamp 56AED5A6)) + (segment (start 87.0331 139.8905) (end 86.487 139.8905) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED59D)) + (segment (start 86.0545 138.43) (end 86.0545 139.3945) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 86.0545 139.3945) (end 86.487 139.827) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED551)) + (segment (start 86.487 139.827) (end 86.487 139.8905) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED552)) + (segment (start 88.8074 123.22854) (end 87.6074 123.22854) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 92.5195 132.3855) (end 91.9995 132.3855) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 91.9995 132.3855) (end 91.694 132.08) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED4B3)) + (segment (start 91.694 132.08) (end 91.694 125.476) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED4B4)) + (segment (start 91.694 125.476) (end 92.6074 124.5626) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED4B5)) + (segment (start 92.6074 124.5626) (end 92.6074 123.22854) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED4B6)) + (segment (start 94.5515 139.4855) (end 95.2246 142.0368) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 95.2246 142.0368) (end 94.8055 145.0105) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED4B0)) + (segment (start 89.5985 136.144) (end 90.3605 136.144) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 90.3605 136.144) (end 90.551 136.3345) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED495)) + (via (at 90.551 136.3345) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 90.551 136.3345) (end 90.678 136.4615) (width 0.25) (layer B.Cu) (net 6) (tstamp 56AED499)) + (via (at 92.583 136.4615) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 92.583 136.4615) (end 93.0275 136.017) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED49D)) + (segment (start 93.0275 136.017) (end 93.0275 135.1915) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED49E)) + (segment (start 93.0275 135.1915) (end 93.1545 135.0645) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED49F)) + (segment (start 89.281 136.144) (end 89.5985 136.144) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 89.5985 136.144) (end 89.663398 136.144) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED493)) + (segment (start 90.6145 137.414) (end 91.313 137.414) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED490)) + (segment (start 90.4875 137.287) (end 90.6145 137.414) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED48F)) + (segment (start 90.4875 136.968102) (end 90.4875 137.287) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED48E)) + (segment (start 89.663398 136.144) (end 90.4875 136.968102) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED48D)) + (segment (start 94.8055 145.0105) (end 89.6112 145.0105) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 89.6112 145.0105) (end 89.182 145.0105) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED751)) + (segment (start 89.182 145.0105) (end 88.888 144.7165) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED431)) + (segment (start 93.919 133.6705) (end 93.919 134.8645) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 93.919 134.8645) (end 94.119 135.0645) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED3F7)) + (segment (start 92.5195 132.3855) (end 92.5195 133.1595) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 93.0305 133.6705) (end 93.919 133.6705) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED3F4)) + (segment (start 92.5195 133.1595) (end 93.0305 133.6705) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AED3F3)) + (segment (start 71.64 144.792) (end 71.958 145.11) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEC62B)) + (segment (start 71.958 145.11) (end 73.017 145.11) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEC62C)) + (segment (start 71.374 144.792) (end 71.64 144.792) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 71.3105 144.792) (end 71.64 144.792) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 81.267 137.66) (end 81.267 138.824) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 84.1375 138.43) (end 86.0545 138.43) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEB902)) + (segment (start 83.6295 138.938) (end 84.1375 138.43) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEB901)) + (segment (start 81.381 138.938) (end 83.6295 138.938) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEB900)) + (segment (start 81.267 138.824) (end 81.381 138.938) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEB8FF)) + (segment (start 86.0545 137.033) (end 85.9275 136.906) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEB8A3)) + (segment (start 77.7995 151.0665) (end 77.7995 150.737) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 77.7995 150.737) (end 78.067 150.4695) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEB7B3)) + (segment (start 78.067 150.4695) (end 78.067 149.36) (width 0.25) (layer F.Cu) (net 6) (tstamp 56AEB7B4)) + (segment (start 85.9275 136.906) (end 85.725 136.906) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 95.619 135.0645) (end 95.9104 135.3559) (width 0.508) (layer F.Cu) (net 7) (status C00000)) + (segment (start 95.9104 135.3559) (end 95.9104 146.304) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF2408) (status 400000)) + (segment (start 95.9104 146.304) (end 94.8055 147.4089) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF2409) (status 800000)) + (segment (start 94.8055 147.4089) (end 94.8055 147.5105) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF240D) (status C00000)) + (segment (start 95.619 135.0645) (end 95.619 133.8705) (width 0.508) (layer F.Cu) (net 7) (status C00000)) + (segment (start 95.619 133.8705) (end 95.819 133.6705) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF2405) (status C00000)) + (segment (start 95.819 133.6705) (end 95.819 129.479) (width 0.508) (layer F.Cu) (net 7) (status 400000)) + (segment (start 95.819 129.479) (end 96.6724 128.6256) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF23F7)) + (segment (start 96.1644 125.5776) (end 96.1644 125.3998) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF2401)) + (segment (start 96.9518 126.365) (end 96.1644 125.5776) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF2400)) + (segment (start 96.9518 127.9906) (end 96.9518 126.365) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF23FC)) + (segment (start 96.6724 128.27) (end 96.9518 127.9906) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF23FA)) + (segment (start 96.6724 128.6256) (end 96.6724 128.27) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF23F9)) + (segment (start 93.8784 118.999) (end 94.3102 118.999) (width 0.508) (layer B.Cu) (net 7)) + (segment (start 96.1644 125.2474) (end 96.1644 125.3998) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF23AC)) + (segment (start 95.25 124.333) (end 96.1644 125.2474) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF23AB)) + (segment (start 95.25 120.3452) (end 95.25 124.333) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF23AA)) + (segment (start 94.8944 119.9896) (end 95.25 120.3452) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF23A9)) + (segment (start 94.8944 119.5832) (end 94.8944 119.9896) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF23A8)) + (segment (start 94.3102 118.999) (end 94.8944 119.5832) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF23A7)) + (segment (start 93.8784 118.999) (end 86.3092 118.999) (width 0.508) (layer B.Cu) (net 7)) + (segment (start 85.2932 118.0592) (end 85.1154 117.8814) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF239A)) + (segment (start 85.3948 118.1608) (end 85.2932 118.0592) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF2399)) + (segment (start 85.471 118.1608) (end 85.3948 118.1608) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF2398)) + (segment (start 86.3092 118.999) (end 85.471 118.1608) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF2397)) + (segment (start 85.1154 117.8814) (end 85.4456 118.2116) (width 0.508) (layer B.Cu) (net 7) (tstamp 56AF239B)) + (segment (start 71.5264 148.5392) (end 71.5264 147.9296) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 71.5264 148.5392) (end 71.7042 148.5392) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 71.7042 148.5392) (end 73.3298 150.1648) (width 0.508) (layer F.Cu) (net 7) (tstamp 56AF234F)) + (segment (start 76.3651 151.1935) (end 76.3651 151.2951) (width 1.016) (layer F.Cu) (net 7)) + (segment (start 76.708 151.638) (end 76.708 151.5364) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2347)) + (segment (start 76.3651 151.2951) (end 76.708 151.638) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2345)) + (segment (start 74.1807 151.1935) (end 74.1807 151.0157) (width 1.016) (layer F.Cu) (net 7)) + (segment (start 74.1807 151.0157) (end 73.3298 150.1648) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2342)) + (segment (start 73.3298 150.1648) (end 73.3298 150.1394) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2343)) + (segment (start 76.3651 151.1935) (end 74.1807 151.1935) (width 1.016) (layer F.Cu) (net 7)) + (segment (start 74.1807 151.1935) (end 74.1426 151.1554) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF233F)) + (segment (start 90.1065 150.8125) (end 89.3699 150.8125) (width 1.016) (layer F.Cu) (net 7)) + (segment (start 82.677 151.4348) (end 82.4738 151.2316) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2337)) + (segment (start 84.3026 151.4348) (end 82.677 151.4348) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2336)) + (segment (start 84.3788 151.511) (end 84.3026 151.4348) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2335)) + (segment (start 88.6714 151.511) (end 84.3788 151.511) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2334)) + (segment (start 89.3699 150.8125) (end 88.6714 151.511) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2333)) + (segment (start 90.1065 149.86) (end 90.1065 150.8125) (width 1.016) (layer F.Cu) (net 7) (status 400000)) + (segment (start 90.1065 150.8125) (end 89.8525 151.0665) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2330)) + (segment (start 90.1065 149.86) (end 91.7575 149.86) (width 1.016) (layer F.Cu) (net 7) (status 400000)) + (segment (start 91.7575 149.86) (end 94.107 147.5105) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2321)) + (segment (start 94.107 147.5105) (end 94.8055 147.5105) (width 1.016) (layer F.Cu) (net 7) (tstamp 56AF2322) (status 800000)) + (segment (start 80.1116 117.8814) (end 78.613 119.38) (width 0.25) (layer B.Cu) (net 7) (tstamp 56AF1DF1)) + (segment (start 85.1154 117.8814) (end 80.1116 117.8814) (width 0.25) (layer B.Cu) (net 7) (tstamp 56AF1DEF)) + (segment (start 86.233 118.999) (end 85.4456 118.2116) (width 0.25) (layer B.Cu) (net 7) (tstamp 56AF1DED)) + (segment (start 85.4456 118.2116) (end 85.1154 117.8814) (width 0.25) (layer B.Cu) (net 7) (tstamp 56AF239E)) + (segment (start 93.8784 118.999) (end 86.233 118.999) (width 0.25) (layer B.Cu) (net 7) (tstamp 56AF2395)) + (via (at 96.1644 125.3998) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 7)) + (segment (start 96.1644 125.73) (end 96.1644 125.3998) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1DE3)) + (segment (start 96.7994 126.365) (end 96.1644 125.73) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1DE2)) + (segment (start 96.7994 127.8636) (end 96.7994 126.365) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1DE1)) + (segment (start 96.6978 127.9652) (end 96.7994 127.8636) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1DDC)) + (segment (start 96.6978 128.6002) (end 96.6978 127.9652) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1DDB)) + (segment (start 95.819 129.479) (end 96.6978 128.6002) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1DD9)) + (segment (start 71.374 146.292) (end 71.374 146.9898) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 71.374 146.9898) (end 71.5264 147.1422) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1D9C)) + (segment (start 71.5264 147.1422) (end 71.5264 147.9296) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1D9D)) + (segment (start 81.1918 151.9682) (end 82.0935 151.0665) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1DA4)) + (segment (start 77.1398 151.9682) (end 81.1918 151.9682) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1DA3)) + (segment (start 76.708 151.5364) (end 77.1398 151.9682) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF2348)) + (segment (start 71.5264 148.5392) (end 74.1426 151.1554) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1D9E)) + (segment (start 94.8055 147.5105) (end 94.8055 147.4089) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 94.8055 147.4089) (end 95.9104 146.304) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF181E)) + (segment (start 95.9104 146.304) (end 95.9104 135.3559) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AF1820)) + (segment (start 94.8055 147.5105) (end 94.107 147.5105) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 94.107 147.5105) (end 91.7575 149.86) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AED434)) + (segment (start 95.819 133.6705) (end 95.819 134.8645) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 95.819 134.8645) (end 95.619 135.0645) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AED3FD)) + (segment (start 82.0935 151.0665) (end 89.8525 151.0665) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 89.8525 151.0665) (end 90.1065 150.8125) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AED003)) + (segment (start 71.4495 146.292) (end 71.8315 145.91) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AEC62F)) + (segment (start 71.8315 145.91) (end 73.017 145.91) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AEC630)) + (segment (start 71.374 146.292) (end 71.4495 146.292) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 73.016 145.911) (end 73.017 145.91) (width 0.25) (layer F.Cu) (net 7) (tstamp 56AEC5D2)) + (segment (start 80.5935 151.0665) (end 79.4265 151.0665) (width 1.016) (layer F.Cu) (net 8) (status C00000)) + (segment (start 79.4265 151.0665) (end 79.363 151.003) (width 1.016) (layer F.Cu) (net 8) (tstamp 56AF2464) (status C00000)) + (segment (start 85.725 135.3185) (end 85.09 135.9535) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB946)) + (segment (start 85.09 135.9535) (end 85.09 137.6045) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB947)) + (segment (start 85.09 137.6045) (end 84.836 137.8585) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB949)) + (segment (start 84.836 137.8585) (end 83.8835 137.8585) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB94A)) + (via (at 83.8835 137.8585) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 8)) + (segment (start 83.8835 137.8585) (end 83.3882 138.938) (width 0.25) (layer B.Cu) (net 8) (tstamp 56AEB94E)) + (segment (start 83.3882 138.938) (end 83.1088 140.1826) (width 0.25) (layer B.Cu) (net 8) (tstamp 56AEB94F)) + (via (at 83.1088 140.1826) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 8)) + (segment (start 83.1088 140.1826) (end 82.3468 140.7668) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB953)) + (segment (start 82.3468 140.7668) (end 82.1182 148.0058) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB954)) + (via (at 82.1182 148.0058) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 8)) + (segment (start 82.1182 148.0058) (end 82.169 149.7965) (width 0.25) (layer B.Cu) (net 8) (tstamp 56AEB957)) + (segment (start 82.169 149.7965) (end 80.9625 151.003) (width 0.25) (layer B.Cu) (net 8) (tstamp 56AEB958)) + (segment (start 80.9625 151.003) (end 80.391 151.003) (width 0.25) (layer B.Cu) (net 8) (tstamp 56AEB95F)) + (via (at 80.391 151.003) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 8)) + (segment (start 80.391 151.003) (end 80.3275 151.0665) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB961)) + (segment (start 80.3275 151.0665) (end 79.2995 151.0665) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB962)) + (segment (start 85.9275 135.3185) (end 85.725 135.3185) (width 0.25) (layer F.Cu) (net 8)) + (segment (start 87.5545 138.43) (end 87.4395 138.43) (width 0.25) (layer F.Cu) (net 8)) + (segment (start 87.4395 138.43) (end 86.6775 137.668) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB8A6)) + (segment (start 86.6775 137.668) (end 86.6775 135.8265) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB8A7)) + (segment (start 86.6775 135.8265) (end 86.1695 135.3185) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB8A8)) + (segment (start 86.1695 135.3185) (end 85.9275 135.3185) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB8A9)) + (segment (start 79.2995 151.0665) (end 79.2995 150.9275) (width 0.25) (layer F.Cu) (net 8)) + (segment (start 79.2995 150.9275) (end 78.867 150.495) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB7AF)) + (segment (start 78.867 150.495) (end 78.867 149.36) (width 0.25) (layer F.Cu) (net 8) (tstamp 56AEB7B0)) + (segment (start 70.5485 125.222) (end 71.3105 125.984) (width 1.016) (layer B.Cu) (net 9)) + (segment (start 81.153 119.38) (end 81.153 122.3772) (width 1.016) (layer B.Cu) (net 9)) + (segment (start 82.2198 123.444) (end 82.3595 123.444) (width 1.016) (layer B.Cu) (net 9) (tstamp 56AF2245)) + (segment (start 81.153 122.3772) (end 82.2198 123.444) (width 1.016) (layer B.Cu) (net 9) (tstamp 56AF2244)) + (segment (start 93.2815 127.1905) (end 93.2815 124.206) (width 0.25) (layer B.Cu) (net 9)) + (segment (start 84.824 124.194) (end 83.5025 124.194) (width 0.25) (layer F.Cu) (net 9) (tstamp 56AED4E6)) + (segment (start 84.836 124.206) (end 84.824 124.194) (width 0.25) (layer F.Cu) (net 9) (tstamp 56AED4E5)) + (via (at 84.836 124.206) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 85.979 124.206) (end 84.836 124.206) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AED4E3)) + (segment (start 86.487 123.698) (end 85.979 124.206) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AED4E2)) + (segment (start 86.487 122.8725) (end 86.487 123.698) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AED4E1)) + (segment (start 87.0585 122.301) (end 86.487 122.8725) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AED4E0)) + (segment (start 93.091 122.301) (end 87.0585 122.301) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AED4DF)) + (segment (start 93.6625 122.8725) (end 93.091 122.301) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AED4DE)) + (segment (start 93.6625 123.825) (end 93.6625 122.8725) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AED4DD)) + (segment (start 93.2815 124.206) (end 93.6625 123.825) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AED4DC)) + (segment (start 82.3595 123.444) (end 81.661 123.444) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 81.661 123.444) (end 79.6925 125.4125) (width 0.25) (layer F.Cu) (net 9) (tstamp 56AEC2A1)) + (segment (start 79.6925 125.4125) (end 77.4065 125.4125) (width 0.25) (layer F.Cu) (net 9) (tstamp 56AEC2A2)) + (segment (start 77.4065 125.4125) (end 76.708 126.111) (width 0.25) (layer F.Cu) (net 9) (tstamp 56AEC2AE)) + (segment (start 76.708 126.111) (end 75.3745 126.111) (width 0.25) (layer F.Cu) (net 9) (tstamp 56AEC2AF)) + (via (at 75.3745 126.111) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 75.3745 126.111) (end 75.2475 125.984) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AEC2B1)) + (segment (start 75.2475 125.984) (end 71.3105 125.984) (width 0.25) (layer B.Cu) (net 9) (tstamp 56AEC2B2)) + (segment (start 83.5025 124.194) (end 83.1095 124.194) (width 0.25) (layer F.Cu) (net 9)) + (via (at 82.3595 123.444) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 83.1095 124.194) (end 82.3595 123.444) (width 0.25) (layer F.Cu) (net 9) (tstamp 56AEC255)) + (segment (start 94.5515 136.4855) (end 94.5515 137.4775) (width 0.508) (layer F.Cu) (net 10) (status 400000)) + (segment (start 94.5515 137.4775) (end 94.8055 137.7315) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF2419)) + (segment (start 94.1959 126.0729) (end 94.1959 124.4981) (width 0.508) (layer B.Cu) (net 10)) + (segment (start 94.1959 124.4981) (end 94.1705 124.4727) (width 0.508) (layer B.Cu) (net 10) (tstamp 56AF2306)) + (segment (start 95.7815 127.1905) (end 95.3135 127.1905) (width 0.508) (layer B.Cu) (net 10) (status C00000)) + (segment (start 95.3135 127.1905) (end 94.1959 126.0729) (width 0.508) (layer B.Cu) (net 10) (tstamp 56AF2301) (status 400000)) + (segment (start 94.1959 126.0729) (end 94.1705 126.0475) (width 0.508) (layer B.Cu) (net 10) (tstamp 56AF2304)) + (segment (start 90.805 121.6025) (end 92.6465 121.6025) (width 0.508) (layer B.Cu) (net 10)) + (segment (start 92.6465 121.6025) (end 92.6846 121.6406) (width 0.508) (layer B.Cu) (net 10) (tstamp 56AF22FB)) + (segment (start 83.5025 122.694) (end 86.1575 122.694) (width 0.508) (layer F.Cu) (net 10) (status 400000)) + (segment (start 86.1575 122.694) (end 87.249 121.6025) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22F6)) + (segment (start 87.249 121.6025) (end 90.924498 121.6025) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22F7)) + (segment (start 90.924498 121.6025) (end 90.805 121.6025) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22F9)) + (segment (start 82.045 122.494) (end 83.3025 122.494) (width 0.508) (layer F.Cu) (net 10) (status C00000)) + (segment (start 83.3025 122.494) (end 83.5025 122.694) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22F3) (status C00000)) + (segment (start 80.645 123.6345) (end 80.645 122.8725) (width 0.508) (layer F.Cu) (net 10)) + (segment (start 80.645 122.8725) (end 81.0235 122.494) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22EF)) + (segment (start 81.0235 122.494) (end 82.045 122.494) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22F0) (status 800000)) + (segment (start 80.01 124.2695) (end 80.645 123.6345) (width 0.508) (layer F.Cu) (net 10)) + (segment (start 76.3505 124.2695) (end 77.1779 124.2695) (width 0.508) (layer F.Cu) (net 10) (status 400000)) + (segment (start 79.7052 124.3838) (end 79.7814 124.46) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22EA)) + (segment (start 77.2922 124.3838) (end 79.7052 124.3838) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22E9)) + (segment (start 77.1779 124.2695) (end 77.2922 124.3838) (width 0.508) (layer F.Cu) (net 10) (tstamp 56AF22E8)) + (segment (start 71.4375 128.4725) (end 71.4375 127.5969) (width 1.016) (layer F.Cu) (net 10)) + (segment (start 71.7804 127.254) (end 72.0725 127.254) (width 1.016) (layer F.Cu) (net 10) (tstamp 56AF22A0)) + (segment (start 71.4375 127.5969) (end 71.7804 127.254) (width 1.016) (layer F.Cu) (net 10) (tstamp 56AF229F)) + (segment (start 73.66 129.54) (end 73.66 127.508) (width 1.016) (layer B.Cu) (net 10)) + (segment (start 73.66 127.508) (end 73.406 127.254) (width 1.016) (layer B.Cu) (net 10) (tstamp 56AF229B)) + (segment (start 73.406 127.254) (end 72.0725 127.254) (width 1.016) (layer B.Cu) (net 10) (tstamp 56AF229C)) + (segment (start 76.2 129.54) (end 73.66 129.54) (width 1.016) (layer B.Cu) (net 10)) + (segment (start 76.2 132.08) (end 76.2 129.54) (width 1.016) (layer B.Cu) (net 10)) + (segment (start 76.2 129.54) (end 76.2 128.4986) (width 1.016) (layer B.Cu) (net 10)) + (segment (start 76.2 128.4986) (end 76.6572 128.0414) (width 1.016) (layer B.Cu) (net 10) (tstamp 56AF2291)) + (segment (start 76.6572 128.0414) (end 76.6572 124.5762) (width 1.016) (layer B.Cu) (net 10) (tstamp 56AF2292)) + (segment (start 76.6572 124.5762) (end 76.3505 124.2695) (width 1.016) (layer B.Cu) (net 10) (tstamp 56AF2293)) + (segment (start 94.1705 126.0475) (end 95.3135 127.1905) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4F2)) + (segment (start 94.1705 122.6185) (end 94.1705 124.4727) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4F1)) + (segment (start 90.805 121.6025) (end 90.9955 121.793) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4EE)) + (segment (start 90.9955 121.793) (end 93.345 121.793) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4EF)) + (segment (start 93.345 121.793) (end 94.1705 122.6185) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4F0)) + (segment (start 94.1705 124.4727) (end 94.1705 126.0475) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AF2309)) + (via (at 90.805 121.6025) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 10)) + (segment (start 87.249 121.6025) (end 90.805 121.6025) (width 0.25) (layer F.Cu) (net 10) (tstamp 56AED4EA)) + (segment (start 86.1575 122.694) (end 87.249 121.6025) (width 0.25) (layer F.Cu) (net 10) (tstamp 56AED4E9)) + (segment (start 95.885 137.16) (end 95.885 127.294) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4A9)) + (segment (start 95.3135 137.7315) (end 95.885 137.16) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4A8)) + (segment (start 94.8055 137.7315) (end 95.3135 137.7315) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4A7)) + (via (at 94.8055 137.7315) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 10)) + (segment (start 94.5515 137.4775) (end 94.8055 137.7315) (width 0.25) (layer F.Cu) (net 10) (tstamp 56AED4A5)) + (segment (start 95.885 127.294) (end 95.7815 127.1905) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AED4AA)) + (segment (start 95.504 123.7495) (end 95.504 126.913) (width 0.25) (layer F.Cu) (net 10)) + (segment (start 95.504 126.913) (end 95.7815 127.1905) (width 0.25) (layer F.Cu) (net 10) (tstamp 56AED378)) + (segment (start 76.3505 124.2695) (end 80.01 124.2695) (width 0.25) (layer F.Cu) (net 10)) + (segment (start 81.0235 122.494) (end 82.045 122.494) (width 0.25) (layer F.Cu) (net 10) (tstamp 56AEC22C)) + (segment (start 80.645 122.8725) (end 81.0235 122.494) (width 0.25) (layer F.Cu) (net 10) (tstamp 56AEC22B)) + (segment (start 83.3025 122.494) (end 83.5025 122.694) (width 0.25) (layer F.Cu) (net 10) (tstamp 56AEC21E)) + (via (at 72.0725 127.254) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 10)) + (segment (start 72.0725 127.254) (end 72.136 127.1905) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AEC17A)) + (segment (start 73.3425 127.1905) (end 73.66 127.508) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AEC17C)) + (segment (start 72.136 127.1905) (end 73.3425 127.1905) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AEC17B)) + (segment (start 76.2 129.54) (end 76.2 124.42) (width 0.25) (layer B.Cu) (net 10)) + (segment (start 76.2 124.42) (end 76.3505 124.2695) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AEC150)) + (segment (start 76.033 129.373) (end 76.2 129.54) (width 0.25) (layer B.Cu) (net 10) (tstamp 56AEC084)) + (segment (start 78.961 130.81) (end 77.47 130.81) (width 0.25) (layer F.Cu) (net 10)) + (segment (start 77.47 130.81) (end 76.2 132.08) (width 0.25) (layer F.Cu) (net 10) (tstamp 56AEB555)) + (segment (start 68.707 133.338) (end 66.052 133.338) (width 0.25) (layer F.Cu) (net 11)) + (segment (start 66.052 133.338) (end 66.04 133.35) (width 0.25) (layer F.Cu) (net 11) (tstamp 56AEB25F)) + (segment (start 68.719 130.302) (end 68.719 131.826) (width 0.25) (layer F.Cu) (net 12)) + (segment (start 68.719 131.826) (end 68.707 131.838) (width 0.25) (layer F.Cu) (net 12) (tstamp 56AEB259)) + (segment (start 68.719 130.302) (end 66.548 130.302) (width 0.25) (layer F.Cu) (net 12)) + (segment (start 66.548 130.302) (end 66.04 130.81) (width 0.25) (layer F.Cu) (net 12) (tstamp 56AEB256)) + (segment (start 68.707 130.314) (end 68.719 130.302) (width 0.25) (layer F.Cu) (net 12) (tstamp 56AEAAD5)) + (segment (start 66.802 130.048) (end 66.04 130.81) (width 0.25) (layer F.Cu) (net 12) (tstamp 56AEAACE)) + (segment (start 68.707 136.259) (end 68.211 136.259) (width 0.25) (layer F.Cu) (net 13)) + (segment (start 68.211 136.259) (end 66.04 138.43) (width 0.25) (layer F.Cu) (net 13) (tstamp 56AEB266)) + (segment (start 68.707 136.259) (end 68.707 136.398) (width 0.25) (layer F.Cu) (net 13)) + (segment (start 66.675 138.43) (end 66.04 138.43) (width 0.25) (layer F.Cu) (net 13) (tstamp 56AEAAF5)) + (segment (start 68.707 134.759) (end 69.977 134.759) (width 0.25) (layer F.Cu) (net 14)) + (segment (start 69.977 134.759) (end 70.358 134.378) (width 0.25) (layer F.Cu) (net 14) (tstamp 56AEB269)) + (segment (start 68.707 134.759) (end 67.171 134.759) (width 0.25) (layer F.Cu) (net 14)) + (segment (start 67.171 134.759) (end 66.04 135.89) (width 0.25) (layer F.Cu) (net 14) (tstamp 56AEB262)) + (segment (start 68.707 134.759) (end 68.949 134.759) (width 0.25) (layer F.Cu) (net 14)) + (segment (start 68.707 134.759) (end 68.441 134.759) (width 0.25) (layer F.Cu) (net 14)) + (segment (start 74.3585 127.762) (end 74.3585 125.7935) (width 1.016) (layer F.Cu) (net 15)) + (segment (start 74.3585 125.7935) (end 73.8505 125.2855) (width 1.016) (layer F.Cu) (net 15) (tstamp 56AF22A6)) + (segment (start 73.8505 125.2855) (end 73.8505 124.2695) (width 1.016) (layer F.Cu) (net 15) (tstamp 56AF22A7)) + (segment (start 73.8505 124.2695) (end 73.8505 123.6345) (width 1.016) (layer B.Cu) (net 15)) + (segment (start 73.8505 123.6345) (end 75.7555 121.7295) (width 1.016) (layer B.Cu) (net 15) (tstamp 56AF223E)) + (segment (start 75.7555 121.7295) (end 75.7555 119.44604) (width 1.016) (layer B.Cu) (net 15) (tstamp 56AF223F)) + (segment (start 82.677 130.175) (end 82.677 131.8514) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 88.888 142.5328) (end 88.888 143.129) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1928)) + (segment (start 88.5952 142.24) (end 88.888 142.5328) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1927)) + (segment (start 88.392 142.24) (end 88.5952 142.24) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1926)) + (segment (start 88.138 141.986) (end 88.392 142.24) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1925)) + (segment (start 87.0204 141.986) (end 88.138 141.986) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1924)) + (via (at 87.0204 141.986) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 15)) + (segment (start 86.4616 141.4272) (end 87.0204 141.986) (width 0.25) (layer B.Cu) (net 15) (tstamp 56AF1920)) + (segment (start 86.4616 139.2428) (end 86.4616 141.4272) (width 0.25) (layer B.Cu) (net 15) (tstamp 56AF191E)) + (segment (start 84.4296 137.2108) (end 86.4616 139.2428) (width 0.25) (layer B.Cu) (net 15) (tstamp 56AF191D)) + (via (at 84.4296 137.2108) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 15)) + (segment (start 84.4296 136.7028) (end 84.4296 137.2108) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1917)) + (segment (start 83.1088 135.382) (end 84.4296 136.7028) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1916)) + (segment (start 83.1088 134.9756) (end 83.1088 135.382) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1914)) + (segment (start 82.042 133.9088) (end 83.1088 134.9756) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1913)) + (segment (start 82.042 132.4864) (end 82.042 133.9088) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1912)) + (segment (start 82.677 131.8514) (end 82.042 132.4864) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF1911)) + (segment (start 73.8505 123.6345) (end 75.7555 121.7295) (width 0.25) (layer B.Cu) (net 15) (tstamp 56AEC1B5)) + (segment (start 75.7555 121.7295) (end 75.7555 119.44604) (width 0.25) (layer B.Cu) (net 15) (tstamp 56AEC1B7)) + (segment (start 73.8505 125.2855) (end 73.8505 124.2695) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC18B)) + (segment (start 74.3585 125.7935) (end 73.8505 125.2855) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC18A)) + (segment (start 71.4375 129.9725) (end 71.4375 131.064) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 72.4535 132.08) (end 73.66 132.08) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC164)) + (segment (start 71.4375 131.064) (end 72.4535 132.08) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC163)) + (segment (start 73.66 132.08) (end 73.5965 132.08) (width 0.25) (layer B.Cu) (net 15)) + (segment (start 73.9895 124.0035) (end 73.533 124.46) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC08D)) + (segment (start 73.66 132.08) (end 72.39 130.81) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 83.312 130.81) (end 84.361 130.81) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC079)) + (segment (start 82.6135 130.1115) (end 82.677 130.175) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC078)) + (segment (start 82.677 130.175) (end 83.312 130.81) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AF190F)) + (segment (start 82.6135 128.651) (end 82.6135 130.1115) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC076)) + (segment (start 80.01 126.0475) (end 82.6135 128.651) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC074)) + (segment (start 77.851 126.0475) (end 80.01 126.0475) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC072)) + (segment (start 76.1365 127.762) (end 77.851 126.0475) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC070)) + (segment (start 72.9615 127.762) (end 74.3585 127.762) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC06F)) + (segment (start 74.3585 127.762) (end 76.1365 127.762) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC188)) + (segment (start 72.39 128.3335) (end 72.9615 127.762) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC06E)) + (segment (start 72.39 130.81) (end 72.39 128.3335) (width 0.25) (layer F.Cu) (net 15) (tstamp 56AEC06D)) + (segment (start 73.66 132.08) (end 73.66 131.5085) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 78.486 121.9708) (end 78.486 122.685) (width 0.508) (layer F.Cu) (net 16)) + (segment (start 78.486 122.685) (end 79.245 123.444) (width 0.508) (layer F.Cu) (net 16) (tstamp 56AF22E5) (status 800000)) + (segment (start 78.9178 122.4026) (end 78.486 121.9708) (width 1.016) (layer F.Cu) (net 16) (tstamp 56AF22D1)) + (segment (start 78.486 121.9708) (end 79.2226 122.7074) (width 1.016) (layer F.Cu) (net 16) (tstamp 56AF22E3)) + (segment (start 78.359 122.4026) (end 78.9178 122.4026) (width 1.016) (layer F.Cu) (net 16)) + (segment (start 65.4685 125.222) (end 66.7385 125.222) (width 1.016) (layer F.Cu) (net 16)) + (segment (start 66.7385 125.222) (end 68.961 122.9995) (width 1.016) (layer F.Cu) (net 16) (tstamp 56AF22C7)) + (segment (start 68.961 122.9995) (end 69.0499 122.9995) (width 1.016) (layer F.Cu) (net 16) (tstamp 56AF22C8)) + (segment (start 69.0499 122.9995) (end 69.6468 122.4026) (width 1.016) (layer F.Cu) (net 16) (tstamp 56AF22C9)) + (segment (start 69.6468 122.4026) (end 78.359 122.4026) (width 1.016) (layer F.Cu) (net 16) (tstamp 56AF22CA)) + (segment (start 78.359 122.4026) (end 78.4098 122.4026) (width 1.016) (layer F.Cu) (net 16) (tstamp 56AF22CF)) + (segment (start 65.4685 125.222) (end 65.4685 119.57304) (width 1.016) (layer F.Cu) (net 16)) + (segment (start 65.4685 119.57304) (end 65.5955 119.44604) (width 1.016) (layer F.Cu) (net 16) (tstamp 56AF22BB)) + (segment (start 79.245 123.444) (end 78.994 123.444) (width 0.25) (layer F.Cu) (net 16)) + (segment (start 78.994 123.444) (end 78.5495 122.9995) (width 0.25) (layer F.Cu) (net 16) (tstamp 56AEC1BB)) + (segment (start 78.5495 122.9995) (end 68.961 122.9995) (width 0.25) (layer F.Cu) (net 16) (tstamp 56AEC1BC)) + (segment (start 68.961 122.9995) (end 66.7385 125.222) (width 0.25) (layer F.Cu) (net 16) (tstamp 56AEC1BD)) + (segment (start 65.4685 119.57304) (end 65.5955 119.44604) (width 0.25) (layer F.Cu) (net 16) (tstamp 56AEC197)) + (segment (start 84.717 147.51) (end 85.5985 147.51) (width 0.25) (layer F.Cu) (net 17)) + (segment (start 86.8045 145.3) (end 87.388 144.7165) (width 0.25) (layer F.Cu) (net 17) (tstamp 56AEC46C)) + (segment (start 86.8045 146.304) (end 86.8045 145.3) (width 0.25) (layer F.Cu) (net 17) (tstamp 56AEC46B)) + (segment (start 85.5985 147.51) (end 86.8045 146.304) (width 0.25) (layer F.Cu) (net 17) (tstamp 56AEC46A)) + (segment (start 87.388 143.129) (end 87.388 144.7165) (width 0.25) (layer F.Cu) (net 17)) + (segment (start 84.717 146.71) (end 83.845 146.71) (width 0.25) (layer F.Cu) (net 18)) + (segment (start 79.6798 144.9832) (end 79.6543 144.9832) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AECE5E)) + (via (at 79.6798 144.9832) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 18)) + (segment (start 83.312 145.7325) (end 79.6798 144.9832) (width 0.25) (layer B.Cu) (net 18) (tstamp 56AECE5C)) + (segment (start 83.3755 145.796) (end 83.312 145.7325) (width 0.25) (layer B.Cu) (net 18) (tstamp 56AECE5B)) + (via (at 83.3755 145.796) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 18)) + (segment (start 83.5025 145.923) (end 83.3755 145.796) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AECE57)) + (segment (start 83.5025 146.3675) (end 83.5025 145.923) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AECE55)) + (segment (start 83.845 146.71) (end 83.5025 146.3675) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AECE4D)) + (segment (start 79.6798 144.7927) (end 79.6543 144.7927) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AEC488)) + (segment (start 79.6543 144.7927) (end 79.6798 144.7927) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AEC489)) + (segment (start 79.6798 144.7927) (end 79.6543 144.7927) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AEC48B)) + (segment (start 79.667 149.36) (end 79.6543 144.9832) (width 0.25) (layer F.Cu) (net 18)) + (segment (start 79.6543 144.9832) (end 79.6543 144.7927) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AECE61)) + (segment (start 79.6543 144.7927) (end 79.4765 140.5891) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AEC48C)) + (segment (start 82.7405 127) (end 84.361 127) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AEB70A)) + (via (at 82.7405 127) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 18)) + (segment (start 81.9785 127.762) (end 82.7405 127) (width 0.25) (layer B.Cu) (net 18) (tstamp 56AEB708)) + (segment (start 81.9785 131.318) (end 81.9785 127.762) (width 0.25) (layer B.Cu) (net 18) (tstamp 56AEB707)) + (segment (start 79.6925 133.604) (end 81.9785 131.318) (width 0.25) (layer B.Cu) (net 18) (tstamp 56AEB706)) + (segment (start 79.502 140.5636) (end 79.6925 133.604) (width 0.25) (layer B.Cu) (net 18) (tstamp 56AEB705)) + (via (at 79.502 140.5636) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 18)) + (segment (start 79.4765 140.5891) (end 79.502 140.5636) (width 0.25) (layer F.Cu) (net 18) (tstamp 56AEB703)) + (segment (start 84.361 128.27) (end 84.361 127) (width 0.25) (layer F.Cu) (net 18)) + (segment (start 88.7984 140.5128) (end 89.4207 140.5255) (width 0.25) (layer F.Cu) (net 20)) + (segment (start 85.928 145.11) (end 84.717 145.11) (width 0.25) (layer F.Cu) (net 20) (tstamp 56AF1899)) + (segment (start 86.0552 145.2372) (end 85.928 145.11) (width 0.25) (layer F.Cu) (net 20) (tstamp 56AF1898)) + (via (at 86.0552 145.2372) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 20)) + (segment (start 86.2076 145.0848) (end 86.0552 145.2372) (width 0.25) (layer B.Cu) (net 20) (tstamp 56AF1894)) + (segment (start 86.7156 145.0848) (end 86.2076 145.0848) (width 0.25) (layer B.Cu) (net 20) (tstamp 56AF1893)) + (segment (start 89.408 142.3924) (end 86.7156 145.0848) (width 0.25) (layer B.Cu) (net 20) (tstamp 56AF1892)) + (segment (start 89.408 140.716) (end 89.408 142.3924) (width 0.25) (layer B.Cu) (net 20) (tstamp 56AF1891)) + (segment (start 89.5096 140.6144) (end 89.408 140.716) (width 0.25) (layer B.Cu) (net 20) (tstamp 56AF1890)) + (via (at 89.5096 140.6144) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 20)) + (segment (start 89.4207 140.5255) (end 89.5096 140.6144) (width 0.25) (layer F.Cu) (net 20) (tstamp 56AF1888)) + (segment (start 86.868 140.5128) (end 87.146002 140.5128) (width 0.25) (layer F.Cu) (net 21)) + (segment (start 85.814 144.31) (end 84.717 144.31) (width 0.25) (layer F.Cu) (net 21) (tstamp 56AF1A41)) + (segment (start 85.9028 144.2212) (end 85.814 144.31) (width 0.25) (layer F.Cu) (net 21) (tstamp 56AF1A40)) + (segment (start 85.9028 144.0688) (end 85.9028 144.2212) (width 0.25) (layer F.Cu) (net 21) (tstamp 56AF1A3F)) + (segment (start 86.3092 143.6624) (end 85.9028 144.0688) (width 0.25) (layer F.Cu) (net 21) (tstamp 56AF1A3E)) + (via (at 86.3092 143.6624) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 21)) + (segment (start 86.36 143.6624) (end 86.3092 143.6624) (width 0.25) (layer B.Cu) (net 21) (tstamp 56AF1A3C)) + (segment (start 87.6808 142.3416) (end 86.36 143.6624) (width 0.25) (layer B.Cu) (net 21) (tstamp 56AF1A3B)) + (segment (start 87.6808 141.3256) (end 87.6808 142.3416) (width 0.25) (layer B.Cu) (net 21) (tstamp 56AF1A3A)) + (via (at 87.6808 141.3256) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 21)) + (segment (start 87.6808 141.047598) (end 87.6808 141.3256) (width 0.25) (layer F.Cu) (net 21) (tstamp 56AF1A37)) + (segment (start 87.146002 140.5128) (end 87.6808 141.047598) (width 0.25) (layer F.Cu) (net 21) (tstamp 56AF1A2F)) + (segment (start 84.717 143.51) (end 83.5152 143.51) (width 0.25) (layer F.Cu) (net 22)) + (segment (start 79.4182 131.6228) (end 78.961 132.08) (width 0.25) (layer F.Cu) (net 22) (tstamp 56AED6F7)) + (segment (start 80.1116 131.6228) (end 79.4182 131.6228) (width 0.25) (layer F.Cu) (net 22) (tstamp 56AED6F6)) + (segment (start 80.3656 131.8768) (end 80.1116 131.6228) (width 0.25) (layer F.Cu) (net 22) (tstamp 56AED6F5)) + (via (at 80.3656 131.8768) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 22)) + (segment (start 80.3656 132.2324) (end 80.3656 131.8768) (width 0.25) (layer B.Cu) (net 22) (tstamp 56AED6F2)) + (segment (start 78.9432 133.6548) (end 80.3656 132.2324) (width 0.25) (layer B.Cu) (net 22) (tstamp 56AED6EF)) + (segment (start 78.6384 141.986) (end 78.9432 133.6548) (width 0.25) (layer B.Cu) (net 22) (tstamp 56AED6E6)) + (segment (start 79.8068 142.3416) (end 78.6384 141.986) (width 0.25) (layer B.Cu) (net 22) (tstamp 56AED6E3)) + (segment (start 81.3308 142.494) (end 79.8068 142.3416) (width 0.25) (layer B.Cu) (net 22) (tstamp 56AED6E2)) + (segment (start 82.811049 143.452151) (end 81.3308 142.494) (width 0.25) (layer B.Cu) (net 22) (tstamp 56AED6DF)) + (segment (start 83.254151 143.452151) (end 82.811049 143.452151) (width 0.25) (layer B.Cu) (net 22) (tstamp 56AED6DE)) + (segment (start 83.4136 143.6116) (end 83.254151 143.452151) (width 0.25) (layer B.Cu) (net 22) (tstamp 56AED6DD)) + (via (at 83.4136 143.6116) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 22)) + (segment (start 83.5152 143.51) (end 83.4136 143.6116) (width 0.25) (layer F.Cu) (net 22) (tstamp 56AED6DB)) + (segment (start 78.961 129.54) (end 79.9084 129.54) (width 0.25) (layer F.Cu) (net 23)) + (segment (start 79.9084 129.54) (end 80.264 129.8956) (width 0.25) (layer F.Cu) (net 23) (tstamp 56AF1868)) + (segment (start 80.264 129.8956) (end 80.264 130.7592) (width 0.25) (layer F.Cu) (net 23) (tstamp 56AF1869)) + (segment (start 80.264 130.7592) (end 81.026 131.5212) (width 0.25) (layer F.Cu) (net 23) (tstamp 56AF186A)) + (segment (start 81.026 131.5212) (end 81.026 134.1628) (width 0.25) (layer F.Cu) (net 23) (tstamp 56AF186B)) + (segment (start 81.026 134.1628) (end 81.8388 134.9756) (width 0.25) (layer F.Cu) (net 23) (tstamp 56AF186E)) + (via (at 81.8388 134.9756) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 23)) + (segment (start 81.8388 134.9756) (end 81.788 135.0264) (width 0.25) (layer B.Cu) (net 23) (tstamp 56AF1873)) + (segment (start 81.788 135.0264) (end 81.788 140.462) (width 0.25) (layer B.Cu) (net 23) (tstamp 56AF1874)) + (segment (start 81.788 140.462) (end 82.3468 141.1224) (width 0.25) (layer B.Cu) (net 23) (tstamp 56AF1875)) + (segment (start 82.3468 141.1224) (end 83.058 141.0716) (width 0.25) (layer B.Cu) (net 23) (tstamp 56AF1879)) + (via (at 83.058 141.0716) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 23)) + (segment (start 83.058 141.0716) (end 83.528 142.71) (width 0.25) (layer F.Cu) (net 23) (tstamp 56AF187E)) + (segment (start 83.528 142.71) (end 84.717 142.71) (width 0.25) (layer F.Cu) (net 23) (tstamp 56AF187F)) + (segment (start 80.467 137.66) (end 80.467 139.141) (width 0.25) (layer F.Cu) (net 27)) + (segment (start 80.836 139.51) (end 84.717 139.51) (width 0.25) (layer F.Cu) (net 27) (tstamp 56AEB57C)) + (segment (start 80.467 139.141) (end 80.836 139.51) (width 0.25) (layer F.Cu) (net 27) (tstamp 56AEB57B)) + (segment (start 82.867 136.462) (end 82.867 137.66) (width 0.25) (layer F.Cu) (net 28) (tstamp 56AED0EE)) + (segment (start 82.931 136.398) (end 82.867 136.462) (width 0.25) (layer F.Cu) (net 28) (tstamp 56AED0ED)) + (via (at 82.931 136.398) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 28)) + (segment (start 88.646 136.398) (end 82.931 136.398) (width 0.25) (layer B.Cu) (net 28) (tstamp 56AED0E5)) + (segment (start 89.662 135.382) (end 88.646 136.398) (width 0.25) (layer B.Cu) (net 28) (tstamp 56AED0E4)) + (segment (start 90.678 135.382) (end 89.662 135.382) (width 0.25) (layer B.Cu) (net 28) (tstamp 56AED0E3)) + (segment (start 90.805 135.509) (end 90.678 135.382) (width 0.25) (layer B.Cu) (net 28) (tstamp 56AED0E2)) + (via (at 90.805 135.509) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 28)) + (segment (start 91.313 136.017) (end 90.805 135.509) (width 0.25) (layer F.Cu) (net 28) (tstamp 56AED0DC)) + (segment (start 91.313 136.144) (end 91.313 136.017) (width 0.25) (layer F.Cu) (net 28)) + (segment (start 78.867 137.66) (end 78.867 136.652) (width 0.25) (layer F.Cu) (net 31)) + (segment (start 88.5825 137.414) (end 89.281 137.414) (width 0.25) (layer F.Cu) (net 31) (tstamp 56AED1CF)) + (segment (start 88.5825 135.636) (end 88.5825 137.414) (width 0.25) (layer F.Cu) (net 31) (tstamp 56AED1CE)) + (segment (start 88.4555 135.509) (end 88.5825 135.636) (width 0.25) (layer F.Cu) (net 31) (tstamp 56AED1CD)) + (via (at 88.4555 135.509) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 31)) + (segment (start 82.55 135.509) (end 88.4555 135.509) (width 0.25) (layer B.Cu) (net 31) (tstamp 56AED1CB)) + (segment (start 82.423 135.636) (end 82.55 135.509) (width 0.25) (layer B.Cu) (net 31) (tstamp 56AED1CA)) + (via (at 82.423 135.636) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 31)) + (segment (start 81.7245 136.3345) (end 82.423 135.636) (width 0.25) (layer F.Cu) (net 31) (tstamp 56AED1C6)) + (segment (start 79.1845 136.3345) (end 81.7245 136.3345) (width 0.25) (layer F.Cu) (net 31) (tstamp 56AED1C5)) + (segment (start 78.867 136.652) (end 79.1845 136.3345) (width 0.25) (layer F.Cu) (net 31) (tstamp 56AED1C4)) + (segment (start 78.867 137.66) (end 78.867 136.906) (width 0.25) (layer F.Cu) (net 31)) + (segment (start 73.017 140.31) (end 73.9136 140.31) (width 0.25) (layer F.Cu) (net 36)) + (segment (start 81.28 125.159) (end 82.045 124.394) (width 0.25) (layer F.Cu) (net 36) (tstamp 56AED6A2)) + (segment (start 81.28 125.4252) (end 81.28 125.159) (width 0.25) (layer F.Cu) (net 36) (tstamp 56AED6A1)) + (segment (start 81.1784 125.5268) (end 81.28 125.4252) (width 0.25) (layer F.Cu) (net 36) (tstamp 56AED6A0)) + (via (at 81.1784 125.5268) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 36)) + (segment (start 81.1784 129.1844) (end 81.1784 125.5268) (width 0.25) (layer B.Cu) (net 36) (tstamp 56AED69D)) + (segment (start 78.8924 131.4704) (end 81.1784 129.1844) (width 0.25) (layer B.Cu) (net 36) (tstamp 56AED69B)) + (segment (start 78.8924 133.0452) (end 78.8924 131.4704) (width 0.25) (layer B.Cu) (net 36) (tstamp 56AED699)) + (segment (start 76.4032 135.5344) (end 78.8924 133.0452) (width 0.25) (layer B.Cu) (net 36) (tstamp 56AED697)) + (segment (start 76.4032 137.8204) (end 76.4032 135.5344) (width 0.25) (layer B.Cu) (net 36) (tstamp 56AED695)) + (segment (start 74.8792 139.3444) (end 76.4032 137.8204) (width 0.25) (layer B.Cu) (net 36) (tstamp 56AED694)) + (via (at 74.8792 139.3444) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 36)) + (segment (start 73.9136 140.31) (end 74.8792 139.3444) (width 0.25) (layer F.Cu) (net 36) (tstamp 56AED690)) + (segment (start 90.7574 123.22854) (end 90.7574 124.0949) (width 0.25) (layer F.Cu) (net 38)) + (segment (start 74.981 141.91) (end 73.017 141.91) (width 0.25) (layer F.Cu) (net 38) (tstamp 56AED50D)) + (segment (start 75.184 142.113) (end 74.981 141.91) (width 0.25) (layer F.Cu) (net 38) (tstamp 56AED50C)) + (via (at 75.184 142.113) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 38)) + (segment (start 75.6285 142.5575) (end 75.184 142.113) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED50A)) + (segment (start 75.6285 147.5105) (end 75.6285 142.5575) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED509)) + (segment (start 76.327 148.209) (end 75.6285 147.5105) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED508)) + (segment (start 76.327 149.5425) (end 76.327 148.209) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED506)) + (segment (start 78.486 151.7015) (end 76.327 149.5425) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED504)) + (segment (start 90.4875 151.7015) (end 78.486 151.7015) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED502)) + (segment (start 93.345 148.844) (end 90.4875 151.7015) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED500)) + (segment (start 93.345 136.017) (end 93.345 148.844) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED4FE)) + (segment (start 91.694 134.366) (end 93.345 136.017) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED4FC)) + (segment (start 91.694 125.0315) (end 91.694 134.366) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED4FB)) + (segment (start 91.3765 124.714) (end 91.694 125.0315) (width 0.25) (layer B.Cu) (net 38) (tstamp 56AED4FA)) + (via (at 91.3765 124.714) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 38)) + (segment (start 90.7574 124.0949) (end 91.3765 124.714) (width 0.25) (layer F.Cu) (net 38) (tstamp 56AED4F8)) + (segment (start 73.017 142.71) (end 74.384 142.71) (width 0.25) (layer F.Cu) (net 39)) + (segment (start 90.1074 124.5226) (end 90.1074 123.22854) (width 0.25) (layer F.Cu) (net 39) (tstamp 56AED729)) + (segment (start 90.0176 124.6124) (end 90.1074 124.5226) (width 0.25) (layer F.Cu) (net 39) (tstamp 56AED728)) + (via (at 90.0176 124.6124) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 39)) + (segment (start 89.1032 124.6124) (end 90.0176 124.6124) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED726)) + (segment (start 88.392 125.3236) (end 89.1032 124.6124) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED725)) + (segment (start 88.392 133.7056) (end 88.392 125.3236) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED722)) + (segment (start 87.8332 134.2644) (end 88.392 133.7056) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED71D)) + (segment (start 83.0072 134.2644) (end 87.8332 134.2644) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED71C)) + (segment (start 82.6516 133.9088) (end 83.0072 134.2644) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED71B)) + (segment (start 81.6864 133.9088) (end 82.6516 133.9088) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED71A)) + (segment (start 81.1784 134.4168) (end 81.6864 133.9088) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED719)) + (segment (start 80.9244 141.605) (end 81.1784 134.4168) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED718)) + (segment (start 80.8736 141.6558) (end 80.9244 141.605) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED717)) + (via (at 80.8736 141.6558) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 39)) + (segment (start 81.1276 144.1704) (end 80.8736 141.6558) (width 0.25) (layer F.Cu) (net 39) (tstamp 56AED710)) + (segment (start 81.2292 144.272) (end 81.1276 144.1704) (width 0.25) (layer F.Cu) (net 39) (tstamp 56AED70F)) + (via (at 81.2292 144.272) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 39)) + (segment (start 79.502 144.272) (end 81.2292 144.272) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED70B)) + (segment (start 78.9432 143.7132) (end 79.502 144.272) (width 0.25) (layer B.Cu) (net 39) (tstamp 56AED70A)) + (via (at 78.9432 143.7132) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 39)) + (segment (start 75.3872 143.7132) (end 78.9432 143.7132) (width 0.25) (layer F.Cu) (net 39) (tstamp 56AED706)) + (segment (start 74.384 142.71) (end 75.3872 143.7132) (width 0.25) (layer F.Cu) (net 39) (tstamp 56AED6FC)) + (segment (start 73.017 143.51) (end 72.136 143.51) (width 0.25) (layer F.Cu) (net 40)) + (segment (start 72.136 143.51) (end 71.8185 143.1925) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AF1DAD)) + (segment (start 71.8185 143.1925) (end 71.8185 141.2875) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AF1DAE)) + (segment (start 71.8185 141.2875) (end 71.0685 140.5375) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AF1DAF)) + (segment (start 71.0685 140.5375) (end 69.7491 140.5375) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AF1DB0)) + (segment (start 69.7491 140.5375) (end 69.7484 140.5368) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AF1DB1)) + (segment (start 71.0685 140.5375) (end 70.231 140.5375) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AEB604)) + (segment (start 71.8185 141.2875) (end 71.0685 140.5375) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AEB603)) + (segment (start 71.8185 143.1925) (end 71.8185 141.2875) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AEB602)) + (segment (start 72.136 143.51) (end 71.8185 143.1925) (width 0.25) (layer F.Cu) (net 40) (tstamp 56AEB601)) + (segment (start 70.0405 143.141) (end 70.9415 143.141) (width 0.25) (layer F.Cu) (net 41)) + (segment (start 70.9415 143.141) (end 72.1105 144.31) (width 0.25) (layer F.Cu) (net 41) (tstamp 56AEC5EC)) + (segment (start 72.1105 144.31) (end 73.017 144.31) (width 0.25) (layer F.Cu) (net 41) (tstamp 56AEC5ED)) + (segment (start 70.231 143.141) (end 70.624 143.141) (width 0.25) (layer F.Cu) (net 41)) + (segment (start 69.7865 145.7445) (end 69.7865 146.3675) (width 0.25) (layer F.Cu) (net 42)) + (segment (start 74.2442 146.5326) (end 73.169 146.558) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC662)) + (segment (start 74.3458 146.7612) (end 74.2442 146.5326) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC661)) + (via (at 74.3458 146.7612) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 42)) + (segment (start 74.3458 147.0152) (end 74.3458 146.7612) (width 0.25) (layer B.Cu) (net 42) (tstamp 56AEC65F)) + (segment (start 74.041 147.574) (end 74.3458 147.0152) (width 0.25) (layer B.Cu) (net 42) (tstamp 56AEC65E)) + (segment (start 71.0057 147.5105) (end 74.041 147.574) (width 0.25) (layer B.Cu) (net 42) (tstamp 56AEC65D)) + (segment (start 70.8152 147.32) (end 71.0057 147.5105) (width 0.25) (layer B.Cu) (net 42) (tstamp 56AEC65C)) + (via (at 70.8152 147.32) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 42)) + (segment (start 70.5485 146.8755) (end 70.8152 147.32) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC657)) + (segment (start 70.5485 146.685) (end 70.5485 146.8755) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC656)) + (segment (start 70.358 146.4945) (end 70.5485 146.685) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC651)) + (segment (start 69.9135 146.4945) (end 70.358 146.4945) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC650)) + (segment (start 69.7865 146.3675) (end 69.9135 146.4945) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC64D)) + (segment (start 73.169 146.558) (end 73.017 146.71) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC663)) + (segment (start 72.992 146.685) (end 73.017 146.71) (width 0.25) (layer F.Cu) (net 42) (tstamp 56AEC5CF)) + (segment (start 70.231 148.348) (end 70.231 148.6916) (width 0.25) (layer F.Cu) (net 43)) + (segment (start 73.017 148.3026) (end 73.017 147.51) (width 0.25) (layer F.Cu) (net 43) (tstamp 56AF1E10)) + (segment (start 73.1266 148.4122) (end 73.017 148.3026) (width 0.25) (layer F.Cu) (net 43) (tstamp 56AF1E0F)) + (via (at 73.1266 148.4122) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 43)) + (segment (start 73.152 148.4376) (end 73.1266 148.4122) (width 0.25) (layer B.Cu) (net 43) (tstamp 56AF1E0D)) + (segment (start 73.152 149.352) (end 73.152 148.4376) (width 0.25) (layer B.Cu) (net 43) (tstamp 56AF1E0C)) + (segment (start 72.517 149.987) (end 73.152 149.352) (width 0.25) (layer B.Cu) (net 43) (tstamp 56AF1E0B)) + (segment (start 71.882 149.987) (end 72.517 149.987) (width 0.25) (layer B.Cu) (net 43) (tstamp 56AF1E0A)) + (segment (start 71.6788 149.7838) (end 71.882 149.987) (width 0.25) (layer B.Cu) (net 43) (tstamp 56AF1E09)) + (via (at 71.6788 149.7838) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 43)) + (segment (start 71.6788 149.5298) (end 71.6788 149.7838) (width 0.25) (layer F.Cu) (net 43) (tstamp 56AF1E07)) + (segment (start 71.2724 149.1234) (end 71.6788 149.5298) (width 0.25) (layer F.Cu) (net 43) (tstamp 56AF1E06)) + (segment (start 70.6628 149.1234) (end 71.2724 149.1234) (width 0.25) (layer F.Cu) (net 43) (tstamp 56AF1DFF)) + (segment (start 70.231 148.6916) (end 70.6628 149.1234) (width 0.25) (layer F.Cu) (net 43) (tstamp 56AF1DFE)) + (segment (start 74.867 149.36) (end 74.867 147.5735) (width 0.25) (layer F.Cu) (net 44)) + (segment (start 85.344 149.86) (end 87.5665 149.86) (width 0.25) (layer F.Cu) (net 44) (tstamp 56AEC3BE)) + (segment (start 83.5025 148.0185) (end 85.344 149.86) (width 0.25) (layer F.Cu) (net 44) (tstamp 56AEC3BD)) + (segment (start 83.5025 147.066) (end 83.5025 148.0185) (width 0.25) (layer F.Cu) (net 44) (tstamp 56AEC3BC)) + (segment (start 82.8675 146.431) (end 83.5025 147.066) (width 0.25) (layer F.Cu) (net 44) (tstamp 56AEC3BB)) + (via (at 82.8675 146.431) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 44)) + (segment (start 78.9432 145.7198) (end 82.8675 146.431) (width 0.25) (layer B.Cu) (net 44) (tstamp 56AEC3B8)) + (via (at 78.9432 145.7198) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 44)) + (segment (start 76.0095 146.431) (end 78.9432 145.7198) (width 0.25) (layer F.Cu) (net 44) (tstamp 56AEC3B3)) + (segment (start 74.867 147.5735) (end 76.0095 146.431) (width 0.25) (layer F.Cu) (net 44) (tstamp 56AEC3B1)) + (segment (start 75.667 149.36) (end 75.667 147.853) (width 0.25) (layer F.Cu) (net 45)) + (segment (start 86.8045 148.082) (end 87.5665 147.32) (width 0.25) (layer B.Cu) (net 45) (tstamp 56AEC548)) + (segment (start 85.1535 148.082) (end 86.8045 148.082) (width 0.25) (layer B.Cu) (net 45) (tstamp 56AEC547)) + (segment (start 84.7725 148.463) (end 85.1535 148.082) (width 0.25) (layer B.Cu) (net 45) (tstamp 56AEC546)) + (segment (start 84.201 148.463) (end 84.7725 148.463) (width 0.25) (layer B.Cu) (net 45) (tstamp 56AEC545)) + (segment (start 82.8675 147.1295) (end 84.201 148.463) (width 0.25) (layer B.Cu) (net 45) (tstamp 56AEC544)) + (segment (start 78.5368 146.6342) (end 82.8675 147.1295) (width 0.25) (layer B.Cu) (net 45) (tstamp 56AEC543)) + (via (at 78.5368 146.6342) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 45)) + (segment (start 75.667 147.853) (end 78.5368 146.6342) (width 0.25) (layer F.Cu) (net 45) (tstamp 56AEC53C)) + (segment (start 84.361 133.35) (end 82.9945 133.35) (width 0.25) (layer F.Cu) (net 49)) + (segment (start 81.267 148.0055) (end 81.267 149.36) (width 0.25) (layer F.Cu) (net 49) (tstamp 56AEBA1A)) + (segment (start 80.4545 147.193) (end 81.267 148.0055) (width 0.25) (layer F.Cu) (net 49) (tstamp 56AEBA19)) + (segment (start 80.2005 141.2367) (end 80.4545 147.193) (width 0.25) (layer F.Cu) (net 49) (tstamp 56AEBA17)) + (segment (start 80.137 141.1732) (end 80.2005 141.2367) (width 0.25) (layer F.Cu) (net 49) (tstamp 56AEBA16)) + (via (at 80.137 141.1732) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 49)) + (segment (start 80.391 133.9215) (end 80.137 141.1732) (width 0.25) (layer B.Cu) (net 49) (tstamp 56AEBA12)) + (segment (start 80.9625 133.35) (end 80.391 133.9215) (width 0.25) (layer B.Cu) (net 49) (tstamp 56AEBA11)) + (segment (start 82.9945 133.35) (end 80.9625 133.35) (width 0.25) (layer B.Cu) (net 49) (tstamp 56AEBA10)) + (via (at 82.9945 133.35) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 49)) + (segment (start 84.361 133.35) (end 84.361 134.62) (width 0.25) (layer F.Cu) (net 49)) + (segment (start 82.867 149.36) (end 82.867 150.3294) (width 0.25) (layer F.Cu) (net 51)) + (segment (start 86.741 126.0602) (end 86.741 126.238) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F4D)) + (segment (start 88.9254 123.8758) (end 86.741 126.0602) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F4B)) + (segment (start 91.7702 123.8758) (end 88.9254 123.8758) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F4A)) + (segment (start 92.1766 124.2822) (end 91.7702 123.8758) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F49)) + (segment (start 92.1766 133.5786) (end 92.1766 124.2822) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F45)) + (segment (start 93.9546 135.3566) (end 92.1766 133.5786) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F39)) + (segment (start 93.9546 141.732) (end 93.9546 135.3566) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F32)) + (segment (start 94.0308 141.8082) (end 93.9546 141.732) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F31)) + (via (at 94.0308 141.8082) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 51)) + (segment (start 94.0308 142.5956) (end 94.0308 141.8082) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AF1F2F)) + (segment (start 92.2528 144.3736) (end 94.0308 142.5956) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AF1F2E)) + (via (at 92.2528 144.3736) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 51)) + (segment (start 92.2528 147.5486) (end 92.2528 144.3736) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F2A)) + (segment (start 91.1352 148.6662) (end 92.2528 147.5486) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F29)) + (segment (start 85.725 148.6662) (end 91.1352 148.6662) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F27)) + (segment (start 84.4042 149.987) (end 85.725 148.6662) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AF1F26)) + (via (at 84.4042 149.987) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 51)) + (segment (start 84.0994 150.2918) (end 84.4042 149.987) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AF1F24)) + (segment (start 82.9046 150.2918) (end 84.0994 150.2918) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AF1F23)) + (segment (start 82.867 150.3294) (end 82.9046 150.2918) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AF1F21)) + (segment (start 87.4275 135.624) (end 87.4275 135.3185) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AEC535)) + (segment (start 87.4275 133.731) (end 87.0585 133.731) (width 0.25) (layer F.Cu) (net 51)) + (segment (start 86.741 126.238) (end 87.1855 125.7935) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AEB889)) + (via (at 86.741 126.238) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 51)) + (segment (start 86.741 133.4135) (end 86.741 126.238) (width 0.25) (layer B.Cu) (net 51) (tstamp 56AEB882)) + (via (at 86.741 133.4135) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 51)) + (segment (start 87.0585 133.731) (end 86.741 133.4135) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AEB87F)) + (segment (start 87.1855 125.7935) (end 87.4275 125.7935) (width 0.25) (layer F.Cu) (net 51) (tstamp 56AEB88A)) + (segment (start 87.4275 135.3185) (end 87.4275 136.906) (width 0.25) (layer F.Cu) (net 51)) + (segment (start 87.4275 135.3185) (end 87.4275 133.731) (width 0.25) (layer F.Cu) (net 51)) + (segment (start 68.6435 148.348) (end 66.282 148.348) (width 0.25) (layer F.Cu) (net 53)) + (segment (start 66.282 148.348) (end 66.04 148.59) (width 0.25) (layer F.Cu) (net 53) (tstamp 56AEB282)) + (segment (start 66.04 146.05) (end 68.1475 146.05) (width 0.25) (layer F.Cu) (net 54)) + (segment (start 68.1475 146.05) (end 68.453 145.7445) (width 0.25) (layer F.Cu) (net 54) (tstamp 56AECE66)) + (segment (start 66.3455 145.7445) (end 66.04 146.05) (width 0.25) (layer F.Cu) (net 54) (tstamp 56AEB27C)) + (segment (start 68.453 143.141) (end 66.409 143.141) (width 0.25) (layer F.Cu) (net 55)) + (segment (start 66.409 143.141) (end 66.04 143.51) (width 0.25) (layer F.Cu) (net 55) (tstamp 56AECE63)) + (segment (start 66.409 143.141) (end 66.04 143.51) (width 0.25) (layer F.Cu) (net 55) (tstamp 56AEB276)) + (segment (start 67.9704 140.5368) (end 66.4732 140.5368) (width 0.25) (layer F.Cu) (net 56)) + (segment (start 66.4732 140.5368) (end 66.04 140.97) (width 0.25) (layer F.Cu) (net 56) (tstamp 56AF1B67)) + (segment (start 66.4725 140.5375) (end 66.04 140.97) (width 0.25) (layer F.Cu) (net 56) (tstamp 56AEB617)) + (segment (start 66.4725 140.5375) (end 66.04 140.97) (width 0.25) (layer F.Cu) (net 56) (tstamp 56AEB271)) + (segment (start 91.2495 142.113) (end 91.2495 141.9733) (width 0.25) (layer B.Cu) (net 57)) + (segment (start 91.2495 141.9733) (end 92.7608 140.462) (width 0.25) (layer B.Cu) (net 57) (tstamp 56AF1B09)) + (segment (start 89.5858 136.779) (end 89.281 136.779) (width 0.25) (layer F.Cu) (net 57) (tstamp 56AF1B13)) + (segment (start 89.9668 137.16) (end 89.5858 136.779) (width 0.25) (layer F.Cu) (net 57) (tstamp 56AF1B12)) + (segment (start 89.9668 137.668) (end 89.9668 137.16) (width 0.25) (layer F.Cu) (net 57) (tstamp 56AF1B11)) + (segment (start 90.3732 138.0744) (end 89.9668 137.668) (width 0.25) (layer F.Cu) (net 57) (tstamp 56AF1B10)) + (via (at 90.3732 138.0744) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 57)) + (segment (start 91.9988 138.0744) (end 90.3732 138.0744) (width 0.25) (layer B.Cu) (net 57) (tstamp 56AF1B0D)) + (segment (start 92.7608 138.8364) (end 91.9988 138.0744) (width 0.25) (layer B.Cu) (net 57) (tstamp 56AF1B0C)) + (segment (start 92.7608 140.462) (end 92.7608 138.8364) (width 0.25) (layer B.Cu) (net 57) (tstamp 56AF1B0A)) + (segment (start 91.2495 142.113) (end 90.805 142.113) (width 0.25) (layer F.Cu) (net 57)) + (segment (start 91.2495 142.113) (end 90.7415 142.113) (width 0.25) (layer F.Cu) (net 57)) + (segment (start 91.313 136.779) (end 91.821 136.779) (width 0.25) (layer F.Cu) (net 58)) + (segment (start 91.948 136.906) (end 91.948 138.8745) (width 0.25) (layer F.Cu) (net 58) (tstamp 56AED202)) + (segment (start 91.821 136.779) (end 91.948 136.906) (width 0.25) (layer F.Cu) (net 58) (tstamp 56AED201)) + (segment (start 91.948 138.8745) (end 91.2495 139.573) (width 0.25) (layer F.Cu) (net 58) (tstamp 56AED203)) + (segment (start 85.9275 133.731) (end 85.9275 132.08) (width 0.25) (layer F.Cu) (net 59)) + (segment (start 85.9275 132.08) (end 84.361 132.08) (width 0.25) (layer F.Cu) (net 59)) + (segment (start 85.9275 125.7935) (end 82.7405 125.7935) (width 0.25) (layer F.Cu) (net 60)) + (segment (start 83.312 129.54) (end 84.361 129.54) (width 0.25) (layer F.Cu) (net 60) (tstamp 56AEB847)) + (segment (start 83.127002 129.355002) (end 83.312 129.54) (width 0.25) (layer F.Cu) (net 60) (tstamp 56AEB846)) + (segment (start 83.127002 128.339002) (end 83.127002 129.355002) (width 0.25) (layer F.Cu) (net 60) (tstamp 56AEB845)) + (segment (start 82.042 127.254) (end 83.127002 128.339002) (width 0.25) (layer F.Cu) (net 60) (tstamp 56AEB844)) + (segment (start 82.042 126.492) (end 82.042 127.254) (width 0.25) (layer F.Cu) (net 60) (tstamp 56AEB843)) + (segment (start 82.7405 125.7935) (end 82.042 126.492) (width 0.25) (layer F.Cu) (net 60) (tstamp 56AEB842)) + (segment (start 85.9275 127.381) (end 85.9275 125.7935) (width 0.25) (layer F.Cu) (net 60)) + (segment (start 84.4245 129.4765) (end 84.361 129.54) (width 0.25) (layer F.Cu) (net 60) (tstamp 56AEB752)) + (segment (start 67.9704 142.0368) (end 69.7484 142.0368) (width 0.25) (layer F.Cu) (net 61)) + (segment (start 68.453 144.641) (end 70.0405 144.641) (width 0.25) (layer F.Cu) (net 62)) + (segment (start 68.453 147.2445) (end 69.7865 147.2445) (width 0.25) (layer F.Cu) (net 63)) + (segment (start 68.6435 149.848) (end 70.231 149.848) (width 0.25) (layer F.Cu) (net 64)) + (segment (start 78.961 128.27) (end 80.01 128.27) (width 0.25) (layer F.Cu) (net 65)) + (segment (start 74.041 134.747) (end 74.041 137.033) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AED68C)) + (segment (start 74.3204 134.4676) (end 74.041 134.747) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AED68B)) + (segment (start 76.5048 134.4676) (end 74.3204 134.4676) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AED689)) + (segment (start 78.0796 132.8928) (end 76.5048 134.4676) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AED686)) + (segment (start 78.0796 130.2004) (end 78.0796 132.8928) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AED685)) + (segment (start 78.6892 129.5908) (end 78.0796 130.2004) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AED683)) + (segment (start 79.6036 129.5908) (end 78.6892 129.5908) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AED682)) + (segment (start 80.4672 128.7272) (end 79.6036 129.5908) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AED681)) + (via (at 80.4672 128.7272) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 65)) + (segment (start 80.01 128.27) (end 80.4672 128.7272) (width 0.25) (layer F.Cu) (net 65) (tstamp 56AED67D)) + (segment (start 71.616 138.938) (end 71.501 138.938) (width 0.25) (layer F.Cu) (net 65)) + (segment (start 71.501 138.938) (end 70.6755 138.1125) (width 0.25) (layer F.Cu) (net 65) (tstamp 56AEB5F6)) + (segment (start 69.2665 138.1125) (end 68.707 137.553) (width 0.25) (layer F.Cu) (net 65) (tstamp 56AEB5F8)) + (segment (start 70.6755 138.1125) (end 69.2665 138.1125) (width 0.25) (layer F.Cu) (net 65) (tstamp 56AEB5F7)) + (segment (start 74.041 137.033) (end 72.3265 137.033) (width 0.25) (layer B.Cu) (net 65)) + (segment (start 71.616 140.093) (end 71.616 138.938) (width 0.25) (layer F.Cu) (net 65) (tstamp 56AEB5F3)) + (segment (start 71.5645 140.1445) (end 71.616 140.093) (width 0.25) (layer F.Cu) (net 65) (tstamp 56AEB5F2)) + (via (at 71.5645 140.1445) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 65)) + (segment (start 71.5645 137.795) (end 71.5645 140.1445) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AEB5F0)) + (segment (start 72.3265 137.033) (end 71.5645 137.795) (width 0.25) (layer B.Cu) (net 65) (tstamp 56AEB5E6)) + (segment (start 72.9615 137.045) (end 74.029 137.045) (width 0.25) (layer F.Cu) (net 65)) + (via (at 74.041 137.033) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 65)) + (segment (start 74.029 137.045) (end 74.041 137.033) (width 0.25) (layer F.Cu) (net 65) (tstamp 56AEB593)) + (segment (start 79.0245 128.3335) (end 78.961 128.27) (width 0.25) (layer F.Cu) (net 65) (tstamp 56AEB59E)) + (segment (start 86.868 141.1478) (end 86.6902 141.1478) (width 0.25) (layer F.Cu) (net 66)) + (segment (start 86.6902 141.1478) (end 86.1314 141.7066) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1BF1)) + (segment (start 86.1314 141.7066) (end 86.1314 142.367) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1BF3)) + (via (at 86.1314 142.367) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 66)) + (segment (start 86.1314 142.367) (end 85.8012 142.6972) (width 0.25) (layer B.Cu) (net 66) (tstamp 56AF1BF5)) + (segment (start 85.8012 142.6972) (end 82.9564 142.6972) (width 0.25) (layer B.Cu) (net 66) (tstamp 56AF1BF6)) + (segment (start 82.9564 142.6972) (end 81.6356 141.3764) (width 0.25) (layer B.Cu) (net 66) (tstamp 56AF1BF7)) + (via (at 81.6356 141.3764) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 66)) + (segment (start 81.6356 141.3764) (end 80.5942 140.335) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1BFC)) + (segment (start 80.5942 140.335) (end 80.4164 140.335) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1BFD)) + (segment (start 80.4164 140.335) (end 79.9846 139.9032) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1BFE)) + (segment (start 79.9846 139.9032) (end 78.867 139.9032) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1BFF)) + (segment (start 78.867 139.9032) (end 76.9366 141.8336) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C00)) + (segment (start 76.9366 141.8336) (end 76.9366 142.9512) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C02)) + (via (at 76.9366 142.9512) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 66)) + (segment (start 76.9366 142.9512) (end 76.5048 143.383) (width 0.25) (layer B.Cu) (net 66) (tstamp 56AF1C05)) + (segment (start 76.5048 143.383) (end 76.5048 144.4752) (width 0.25) (layer B.Cu) (net 66) (tstamp 56AF1C06)) + (segment (start 76.5048 144.4752) (end 76.3016 144.6784) (width 0.25) (layer B.Cu) (net 66) (tstamp 56AF1C07)) + (via (at 76.3016 144.6784) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 66)) + (segment (start 76.3016 144.6784) (end 76.0476 144.9324) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C09)) + (segment (start 76.0476 144.9324) (end 74.7268 144.9324) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C0A)) + (via (at 74.7268 144.9324) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 66)) + (segment (start 74.7268 144.9324) (end 71.4248 141.6304) (width 0.25) (layer B.Cu) (net 66) (tstamp 56AF1C0C)) + (segment (start 71.4248 141.6304) (end 71.1454 141.6304) (width 0.25) (layer B.Cu) (net 66) (tstamp 56AF1C0D)) + (via (at 71.1454 141.6304) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 66)) + (segment (start 71.1454 141.6304) (end 70.7898 141.2748) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C10)) + (segment (start 70.7898 141.2748) (end 69.088 141.2748) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C11)) + (segment (start 69.088 141.2748) (end 68.8848 141.0716) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C12)) + (segment (start 68.8848 141.0716) (end 68.8848 140.0048) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C13)) + (segment (start 68.8848 140.0048) (end 69.469 139.4206) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C14)) + (segment (start 69.469 139.4206) (end 69.469 138.938) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AF1C15)) + (segment (start 70.116 138.938) (end 69.469 138.938) (width 0.25) (layer F.Cu) (net 66)) + (segment (start 69.469 138.938) (end 68.822 138.938) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AECF5F)) + (segment (start 68.822 138.938) (end 68.707 139.053) (width 0.25) (layer F.Cu) (net 66) (tstamp 56AEB5FB)) + (segment (start 76.708 135.878) (end 79.7045 135.878) (width 0.25) (layer F.Cu) (net 67)) + (segment (start 80.0735 133.35) (end 78.961 133.35) (width 0.25) (layer F.Cu) (net 67) (tstamp 56AEB5A5)) + (segment (start 80.264 133.5405) (end 80.0735 133.35) (width 0.25) (layer F.Cu) (net 67) (tstamp 56AEB5A4)) + (segment (start 80.264 135.3185) (end 80.264 133.5405) (width 0.25) (layer F.Cu) (net 67) (tstamp 56AEB5A3)) + (segment (start 79.7045 135.878) (end 80.264 135.3185) (width 0.25) (layer F.Cu) (net 67) (tstamp 56AEB5A2)) + (segment (start 75.057 135.878) (end 76.708 135.878) (width 0.25) (layer F.Cu) (net 67)) + (segment (start 73.406 135.878) (end 75.057 135.878) (width 0.25) (layer F.Cu) (net 67)) + (segment (start 74.9815 134.378) (end 74.3585 135.001) (width 0.25) (layer F.Cu) (net 68) (tstamp 56AECDDD)) + (segment (start 88.2015 139.8905) (end 88.8492 139.9032) (width 0.25) (layer F.Cu) (net 68) (tstamp 56AECE13)) + (segment (start 88.1888 139.954) (end 88.2015 139.8905) (width 0.25) (layer F.Cu) (net 68) (tstamp 56AECE12)) + (segment (start 88.2396 140.208) (end 88.2396 139.954) (width 0.25) (layer F.Cu) (net 68) (tstamp 56AECE11)) + (segment (start 88.2396 139.954) (end 88.2396 140.208) (width 0.25) (layer F.Cu) (net 68) (tstamp 56AECE10)) + (via (at 88.1888 139.954) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 68)) + (segment (start 88.7222 142.367) (end 88.1888 139.954) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECE0A)) + (segment (start 86.4235 144.526) (end 88.7222 142.367) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECE05)) + (segment (start 82.296 144.7292) (end 86.4235 144.526) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECDFE)) + (segment (start 81.28 143.1544) (end 82.296 144.7292) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECDFD)) + (segment (start 78.8416 143.002) (end 81.28 143.1544) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECDFC)) + (segment (start 75.184 141.3256) (end 78.8416 143.002) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECDFB)) + (segment (start 71.374 140.97) (end 75.184 141.3256) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECDF5)) + (segment (start 70.8025 140.3985) (end 71.374 140.97) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECDF2)) + (segment (start 70.8025 136.017) (end 70.8025 140.3985) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECDF1)) + (segment (start 71.8185 135.001) (end 70.8025 136.017) (width 0.25) (layer B.Cu) (net 68) (tstamp 56AECDF0)) + (via (at 71.8185 135.001) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 68)) + (segment (start 74.3585 135.001) (end 71.8185 135.001) (width 0.25) (layer F.Cu) (net 68) (tstamp 56AECDEB)) + (segment (start 76.708 134.378) (end 74.9815 134.378) (width 0.25) (layer F.Cu) (net 68)) + (segment (start 75.057 134.378) (end 76.708 134.378) (width 0.25) (layer F.Cu) (net 68)) + (segment (start 78.961 134.62) (end 78.5495 134.62) (width 0.25) (layer F.Cu) (net 69)) + (segment (start 78.5495 134.62) (end 77.5335 133.604) (width 0.25) (layer F.Cu) (net 69) (tstamp 56AEB573)) + (segment (start 77.5335 133.604) (end 74.18 133.604) (width 0.25) (layer F.Cu) (net 69) (tstamp 56AEB574)) + (segment (start 74.18 133.604) (end 73.406 134.378) (width 0.25) (layer F.Cu) (net 69) (tstamp 56AEB576)) + (segment (start 70.358 133.211) (end 70.854 133.211) (width 0.25) (layer F.Cu) (net 69)) + (segment (start 72.021 134.378) (end 73.406 134.378) (width 0.25) (layer F.Cu) (net 69) (tstamp 56AEB56F)) + (segment (start 70.854 133.211) (end 72.021 134.378) (width 0.25) (layer F.Cu) (net 69) (tstamp 56AEB56E)) + (segment (start 73.406 134.378) (end 73.013 134.378) (width 0.25) (layer F.Cu) (net 69)) + (segment (start 78.961 127) (end 79.8576 127) (width 0.25) (layer F.Cu) (net 70)) + (segment (start 71.616 136.156) (end 71.616 137.287) (width 0.25) (layer F.Cu) (net 70) (tstamp 56AED67A)) + (segment (start 71.8312 135.9408) (end 71.616 136.156) (width 0.25) (layer F.Cu) (net 70) (tstamp 56AED679)) + (via (at 71.8312 135.9408) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 70)) + (segment (start 71.9836 135.9408) (end 71.8312 135.9408) (width 0.25) (layer B.Cu) (net 70) (tstamp 56AED677)) + (segment (start 74.2188 133.7056) (end 71.9836 135.9408) (width 0.25) (layer B.Cu) (net 70) (tstamp 56AED675)) + (segment (start 76.3524 133.7056) (end 74.2188 133.7056) (width 0.25) (layer B.Cu) (net 70) (tstamp 56AED670)) + (segment (start 77.5208 132.5372) (end 76.3524 133.7056) (width 0.25) (layer B.Cu) (net 70) (tstamp 56AED66D)) + (segment (start 77.5208 128.9304) (end 77.5208 132.5372) (width 0.25) (layer B.Cu) (net 70) (tstamp 56AED66A)) + (segment (start 77.724 128.7272) (end 77.5208 128.9304) (width 0.25) (layer B.Cu) (net 70) (tstamp 56AED665)) + (segment (start 78.8416 128.7272) (end 77.724 128.7272) (width 0.25) (layer B.Cu) (net 70) (tstamp 56AED664)) + (segment (start 80.2132 127.3556) (end 78.8416 128.7272) (width 0.25) (layer B.Cu) (net 70) (tstamp 56AED663)) + (via (at 80.2132 127.3556) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 70)) + (segment (start 79.8576 127) (end 80.2132 127.3556) (width 0.25) (layer F.Cu) (net 70) (tstamp 56AED661)) + (segment (start 71.616 137.287) (end 71.616 137.783) (width 0.25) (layer F.Cu) (net 70)) + (segment (start 71.616 137.783) (end 72.378 138.545) (width 0.25) (layer F.Cu) (net 70) (tstamp 56AEB58F)) + (segment (start 72.378 138.545) (end 72.9615 138.545) (width 0.25) (layer F.Cu) (net 70) (tstamp 56AEB590)) + (segment (start 79.0245 127.0635) (end 78.961 127) (width 0.25) (layer F.Cu) (net 70) (tstamp 56AEB56B)) + (segment (start 70.358 131.711) (end 70.358 130.441) (width 0.25) (layer F.Cu) (net 71)) + (segment (start 70.358 130.441) (end 70.219 130.302) (width 0.25) (layer F.Cu) (net 71) (tstamp 56AEB26E)) + (segment (start 70.358 130.441) (end 70.219 130.302) (width 0.25) (layer F.Cu) (net 71) (tstamp 56AEAAD8)) + (segment (start 70.116 137.287) (end 70.116 136.12) (width 0.25) (layer F.Cu) (net 72)) + (segment (start 70.116 136.12) (end 70.358 135.878) (width 0.25) (layer F.Cu) (net 72) (tstamp 56AEB29A)) + +) diff --git a/PCB/OUTPUT_V35/Tinylab_proto1.net b/PCB/OUTPUT_V35/Tinylab_proto1.net new file mode 100644 index 00000000..43380509 --- /dev/null +++ b/PCB/OUTPUT_V35/Tinylab_proto1.net @@ -0,0 +1,925 @@ +(export (version D) + (design + (source C:\Users\Esposch\Documents\KiCAD\Tinylab_proto1\Tinylab_proto1.sch) + (date "01/02/2016 1:02:52 PM") + (tool "Eeschema (2015-08-05 BZR 6055, Git fa29c62)-product") + (sheet (number 1) (name /) (tstamps /) + (title_block + (title) + (company) + (rev) + (date) + (source Tinylab_proto1.sch) + (comment (number 1) (value "")) + (comment (number 2) (value "")) + (comment (number 3) (value "")) + (comment (number 4) (value ""))))) + (components + (comp (ref U2) + (value LM324) + (footprint Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm) + (libsource (lib linear) (part LM324)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CA87E2)) + (comp (ref IC1) + (value ATXMEGA16A4U-A) + (footprint Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm) + (libsource (lib atmel) (part ATXMEGA16A4U-A)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CA8F25)) + (comp (ref P2) + (value USB_OTG) + (footprint Connect:USB_Micro-B) + (libsource (lib conn) (part USB_OTG)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CA90D2)) + (comp (ref U1) + (value 78L05) + (footprint SMD:SOT-23-3) + (libsource (lib regul) (part 78L05)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CA99FA)) + (comp (ref R1) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAAB95)) + (comp (ref R3) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAABF4)) + (comp (ref R5) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAAC5F)) + (comp (ref R6) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAACD2)) + (comp (ref R4) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAAD11)) + (comp (ref R2) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAAD4C)) + (comp (ref P1) + (value SCOPE_IN) + (footprint Pin_Headers:Pin_Header_Straight_1x04) + (libsource (lib conn) (part CONN_01X04)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAB35C)) + (comp (ref C2) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAB4DE)) + (comp (ref C1) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAB611)) + (comp (ref C3) + (value C_Small) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB13E1)) + (comp (ref C4) + (value C_Small) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB147C)) + (comp (ref R22) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB4680)) + (comp (ref C13) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB630B)) + (comp (ref R24) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB9020)) + (comp (ref R11) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBCD2A)) + (comp (ref R7) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBCDA5)) + (comp (ref R13) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE0F4)) + (comp (ref R9) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE16B)) + (comp (ref R14) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE21C)) + (comp (ref R10) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE2C7)) + (comp (ref R12) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE362)) + (comp (ref R8) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE401)) + (comp (ref P3) + (value DIG_OUT) + (footprint Pin_Headers:Pin_Header_Straight_1x04) + (libsource (lib conn) (part CONN_01X04)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBF4D5)) + (comp (ref P7) + (value HVO) + (footprint Pin_Headers:Pin_Header_Straight_2x02) + (libsource (lib conn) (part CONN_02X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CC540F)) + (comp (ref C5) + (value C_Small) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D60181)) + (comp (ref U4) + (value DMN63D8LDW) + (footprint TO_SOT_Packages_SMD:SOT-363) + (libsource (lib ESPO_PART) (part DMN63D8LDW)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D6ACFD)) + (comp (ref P8) + (value DIG_IN) + (footprint Pin_Headers:Pin_Header_Straight_1x02) + (libsource (lib conn) (part CONN_01X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D6DB77)) + (comp (ref F1) + (value F_Small) + (footprint Capacitors_SMD:C_1206) + (libsource (lib device) (part F_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D739F3)) + (comp (ref C12) + (value C_Small) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D75F49)) + (comp (ref P5) + (value CONN_01X03) + (footprint Pin_Headers:Pin_Header_Straight_1x03) + (libsource (lib conn) (part CONN_01X03)) + (sheetpath (names /) (tstamps /)) + (tstamp 56065DA8)) + (comp (ref L1) + (value INDUCTOR) + (footprint Inductors:INDUCTOR_V) + (libsource (lib device) (part INDUCTOR)) + (sheetpath (names /) (tstamps /)) + (tstamp 5606EE9E)) + (comp (ref D1) + (value D_Schottky) + (footprint Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10) + (libsource (lib device) (part D_Schottky)) + (sheetpath (names /) (tstamps /)) + (tstamp 5606FDB4)) + (comp (ref C9) + (value CP1) + (footprint Capacitors_ThroughHole:C_Radial_D5_L11_P2.5) + (libsource (lib device) (part CP1)) + (sheetpath (names /) (tstamps /)) + (tstamp 560719D9)) + (comp (ref C10) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 56071A50)) + (comp (ref C16) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 5607355F)) + (comp (ref C15) + (value CP1) + (footprint Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5) + (libsource (lib device) (part CP1)) + (sheetpath (names /) (tstamps /)) + (tstamp 560735FE)) + (comp (ref P4) + (value PDI) + (footprint Pin_Headers:Pin_Header_Straight_2x02) + (libsource (lib conn) (part CONN_02X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 56069A87)) + (comp (ref Q1) + (value Q_NMOS_GSD) + (footprint SMD:SOT-23-3) + (libsource (lib device) (part Q_NMOS_GSD)) + (sheetpath (names /) (tstamps /)) + (tstamp 5606F6D4)) + (comp (ref R23) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 566DE721)) + (comp (ref R25) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 566DE7E8)) + (comp (ref C14) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 566DF655)) + (comp (ref P6) + (value DAC_OUT) + (footprint Pin_Headers:Pin_Header_Straight_1x04) + (libsource (lib conn) (part CONN_01X04)) + (sheetpath (names /) (tstamps /)) + (tstamp 566DF832)) + (comp (ref R26) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 566E5C29)) + (comp (ref R27) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 566E5CBE)) + (comp (ref C6) + (value CP1) + (footprint Capacitors_ThroughHole:C_Radial_D5_L11_P2.5) + (libsource (lib device) (part CP1)) + (sheetpath (names /) (tstamps /)) + (tstamp 566F5A75)) + (comp (ref R19) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AECD86)) + (comp (ref R21) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AF0DE2)) + (comp (ref C11) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 5608B4BE)) + (comp (ref C8) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AF91A3)) + (comp (ref R17) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AFE83E)) + (comp (ref R18) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AFE8F3)) + (comp (ref U3) + (value DMN63D8LDW) + (footprint TO_SOT_Packages_SMD:SOT-363) + (libsource (lib ESPO_PART) (part DMN63D8LDW)) + (sheetpath (names /) (tstamps /)) + (tstamp 56B012DD)) + (comp (ref R20) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56B0C682)) + (comp (ref R15) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56B0C779)) + (comp (ref R16) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56B0C86E))) + (libparts + (libpart (lib ESPO_PART) (part DMN63D8LDW) + (fields + (field (name Reference) U) + (field (name Value) DMN63D8LDW)) + (pins + (pin (num 1) (name S1) (type input)) + (pin (num 2) (name G1) (type input)) + (pin (num 3) (name D2) (type input)) + (pin (num 4) (name S2) (type input)) + (pin (num 5) (name G2) (type input)) + (pin (num 6) (name D1) (type input)))) + (libpart (lib device) (part R) + (description Resistor) + (footprints + (fp R_*) + (fp Resistor_*)) + (fields + (field (name Reference) R) + (field (name Value) R)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib conn) (part CONN_01X02) + (footprints + (fp Pin_Header_Straight_1X02) + (fp Pin_Header_Angled_1X02) + (fp Socket_Strip_Straight_1X02) + (fp Socket_Strip_Angled_1X02)) + (fields + (field (name Reference) P) + (field (name Value) CONN_01X02)) + (pins + (pin (num 1) (name P1) (type passive)) + (pin (num 2) (name P2) (type passive)))) + (libpart (lib conn) (part CONN_01X03) + (footprints + (fp Pin_Header_Straight_1X03) + (fp Pin_Header_Angled_1X03) + (fp Socket_Strip_Straight_1X03) + (fp Socket_Strip_Angled_1X03)) + (fields + (field (name Reference) P) + (field (name Value) CONN_01X03)) + (pins + (pin (num 1) (name P1) (type passive)) + (pin (num 2) (name P2) (type passive)) + (pin (num 3) (name P3) (type passive)))) + (libpart (lib conn) (part CONN_01X04) + (footprints + (fp Pin_Header_Straight_1X04) + (fp Pin_Header_Angled_1X04) + (fp Socket_Strip_Straight_1X04) + (fp Socket_Strip_Angled_1X04)) + (fields + (field (name Reference) P) + (field (name Value) CONN_01X04)) + (pins + (pin (num 1) (name P1) (type passive)) + (pin (num 2) (name P2) (type passive)) + (pin (num 3) (name P3) (type passive)) + (pin (num 4) (name P4) (type passive)))) + (libpart (lib conn) (part CONN_02X02) + (footprints + (fp Pin_Header_Straight_2X02) + (fp Pin_Header_Angled_2X02) + (fp Socket_Strip_Straight_2X02) + (fp Socket_Strip_Angled_2X02)) + (fields + (field (name Reference) P) + (field (name Value) CONN_02X02)) + (pins + (pin (num 1) (name P1) (type passive)) + (pin (num 2) (name P2) (type passive)) + (pin (num 3) (name P3) (type passive)) + (pin (num 4) (name P4) (type passive)))) + (libpart (lib regul) (part 7805) + (aliases + (alias LM7805) + (alias LM7812) + (alias 78L05)) + (description "Linear Regulator +5V") + (docs regulator\lm78xx.pdf) + (fields + (field (name Reference) U) + (field (name Value) 7805)) + (pins + (pin (num 1) (name GND) (type input)) + (pin (num 2) (name VO) (type power_out)) + (pin (num 3) (name VI) (type input)))) + (libpart (lib conn) (part USB_OTG) + (description "micro/mini connector") + (footprints + (fp USB*)) + (fields + (field (name Reference) P) + (field (name Value) USB_OTG)) + (pins + (pin (num 1) (name VCC) (type power_out)) + (pin (num 2) (name D-) (type passive)) + (pin (num 3) (name D+) (type passive)) + (pin (num 4) (name ID) (type power_in)) + (pin (num 5) (name GND) (type power_in)) + (pin (num 6) (name shield) (type passive)))) + (libpart (lib linear) (part LM2902N) + (aliases + (alias LM324) + (alias TLC274) + (alias TL074) + (alias LM324N) + (alias LM324AN)) + (description "Quad Op amp.") + (docs op_amps/lm324.pdf) + (fields + (field (name Reference) U) + (field (name Value) LM2902N)) + (pins + (pin (num 1) (name ~) (type output)) + (pin (num 2) (name -) (type input)) + (pin (num 3) (name +) (type input)) + (pin (num 4) (name V+) (type power_in)) + (pin (num 5) (name +) (type input)) + (pin (num 6) (name -) (type input)) + (pin (num 7) (name ~) (type output)) + (pin (num 8) (name ~) (type output)) + (pin (num 9) (name -) (type input)) + (pin (num 10) (name +) (type input)) + (pin (num 11) (name V-) (type power_in)) + (pin (num 12) (name +) (type input)) + (pin (num 13) (name -) (type input)) + (pin (num 14) (name ~) (type output)))) + (libpart (lib device) (part Q_NMOS_GSD) + (description "Transistor N-MOSFET (general)") + (fields + (field (name Reference) Q) + (field (name Value) Q_NMOS_GSD)) + (pins + (pin (num 1) (name G) (type input)) + (pin (num 2) (name S) (type passive)) + (pin (num 3) (name D) (type passive)))) + (libpart (lib device) (part F_Small) + (description Fuse) + (footprints + (fp CP*) + (fp SM*)) + (fields + (field (name Reference) F) + (field (name Value) F_Small)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib device) (part INDUCTOR) + (fields + (field (name Reference) L) + (field (name Value) INDUCTOR)) + (pins + (pin (num 1) (name 1) (type passive)) + (pin (num 2) (name 2) (type passive)))) + (libpart (lib device) (part D_Schottky) + (description "Diode schottky") + (footprints + (fp D-Pak_TO252AA) + (fp Diode_*) + (fp *SingleDiode) + (fp *SingleDiode*) + (fp *_Diode_*)) + (fields + (field (name Reference) D) + (field (name Value) D_Schottky)) + (pins + (pin (num 1) (name K) (type passive)) + (pin (num 2) (name A) (type passive)))) + (libpart (lib device) (part C_Small) + (description "Unpolarized capacitor") + (footprints + (fp C?) + (fp C_????_*) + (fp C_????) + (fp SMD*_c) + (fp Capacitor*)) + (fields + (field (name Reference) C) + (field (name Value) C_Small)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib device) (part CP1) + (description "Polarised capacitor") + (footprints + (fp SMD*_Pol) + (fp c_elec*) + (fp C*elec) + (fp TantalC*) + (fp Elko*) + (fp CP*)) + (fields + (field (name Reference) C) + (field (name Value) CP1)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib device) (part C) + (description "Unpolarized capacitor") + (footprints + (fp C?) + (fp C_????_*) + (fp C_????) + (fp SMD*_c) + (fp Capacitor*)) + (fields + (field (name Reference) C) + (field (name Value) C)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib atmel) (part ATXMEGA16A4U-A) + (aliases + (alias ATXMEGA32A4U-A) + (alias ATXMEGA64A4U-A) + (alias ATXMEGA128A4U-A)) + (description "TQFP44, 16k Flash, 4k Boot, 2k SRAM, 1k EEPROM, JTAG, USB") + (docs http://www.atmel.com/Images/Atmel-8387-8-and16-bit-AVR-Microcontroller-XMEGA-A4U_Datasheet.pdf) + (fields + (field (name Reference) IC) + (field (name Value) ATXMEGA16A4U-A) + (field (name Footprint) TQFP44)) + (pins + (pin (num 1) (name AC5/ADC5/PA5) (type BiDi)) + (pin (num 2) (name AC1OUT/AC6/ADC6/PA6) (type BiDi)) + (pin (num 3) (name AC0OUT/AC7/ADC7/PA7) (type BiDi)) + (pin (num 4) (name AREFB/ADC8/PB0) (type BiDi)) + (pin (num 5) (name ADC9/PB1) (type BiDi)) + (pin (num 6) (name DAC0/ADC10/PB2) (type BiDi)) + (pin (num 7) (name DAC1/ACD11/PB3) (type BiDi)) + (pin (num 8) (name GND) (type power_in)) + (pin (num 9) (name VCC) (type power_in)) + (pin (num 10) (name SDAIN/SDA/~OC0ALS~/OC0A/PC0) (type BiDi)) + (pin (num 11) (name SCLIN/SCL/XCK0/OC0AHS/OC0B/PC1) (type BiDi)) + (pin (num 12) (name SDAOUT/RXD0/~OC0BLS~/OC0C/PC2) (type BiDi)) + (pin (num 13) (name SCLOUT/TXD0/OC0BHS/OC0D/PC3) (type BiDi)) + (pin (num 14) (name ~SS~/~OC0CLS~/OC1A/PC4) (type BiDi)) + (pin (num 15) (name MOSI/XCK1/OC0CHS/OC1B/PC5) (type BiDi)) + (pin (num 16) (name CLKRTC/MISO/RXD1/~OC0DLS~/PC6) (type BiDi)) + (pin (num 17) (name EVOUT/CLKOUT/SCK/TXD1/OC0DHS/PC7) (type BiDi)) + (pin (num 18) (name GND) (type power_in)) + (pin (num 19) (name VCC) (type power_in)) + (pin (num 20) (name PD0/OC0A) (type BiDi)) + (pin (num 21) (name PD1/OC0B/XCK0) (type BiDi)) + (pin (num 22) (name PD2/OC0C/RXD0) (type BiDi)) + (pin (num 23) (name PD3/OC0D/TXD0) (type BiDi)) + (pin (num 24) (name PD4/OC1A/~SS~) (type BiDi)) + (pin (num 25) (name PD5/OC1B/XCK1/MOSI) (type BiDi)) + (pin (num 26) (name PD6/D-/RXD1/MISO) (type BiDi)) + (pin (num 27) (name PD7/D+/TXD1/SCK/CLKOUT/EVOUT) (type BiDi)) + (pin (num 28) (name PE0/OC0A/SDA) (type BiDi)) + (pin (num 29) (name PE1/OC0B/XCK0/SCL) (type BiDi)) + (pin (num 30) (name GND) (type power_in)) + (pin (num 31) (name VCC) (type power_in)) + (pin (num 32) (name PE2/OC0C/RXD0) (type BiDi)) + (pin (num 33) (name PE3/OC0D/TXD0) (type BiDi)) + (pin (num 34) (name PDI_DATA) (type input)) + (pin (num 35) (name ~RESET~/PDI_CLK) (type input)) + (pin (num 36) (name PR0/XTAL2/TOSC2) (type BiDi)) + (pin (num 37) (name PR1/XTAL1/TOSC1) (type BiDi)) + (pin (num 38) (name GND) (type power_in)) + (pin (num 39) (name AVCC) (type power_in)) + (pin (num 40) (name AREFA/AC0/ADC0/PA0) (type BiDi)) + (pin (num 41) (name AC1/ADC1/PA1) (type BiDi)) + (pin (num 42) (name AC2/ADC2/PA2) (type BiDi)) + (pin (num 43) (name AC3/ADC3/PA3) (type BiDi)) + (pin (num 44) (name AC4/ADC4/PA4) (type BiDi))))) + (libraries + (library (logical device) + (uri C:\KiCad\share\kicad\library\device.lib)) + (library (logical linear) + (uri C:\KiCad\share\kicad\library\linear.lib)) + (library (logical regul) + (uri C:\KiCad\share\kicad\library\regul.lib)) + (library (logical atmel) + (uri C:\KiCad\share\kicad\library\atmel.lib)) + (library (logical conn) + (uri C:\KiCad\share\kicad\library\conn.lib)) + (library (logical ESPO_PART) + (uri C:\Users\Esposch\Documents\KiCAD\ESPO_PART.lib))) + (nets + (net (code 1) (name "Net-(IC1-Pad33)") + (node (ref R14) (pin 1)) + (node (ref IC1) (pin 33))) + (net (code 2) (name /D-) + (node (ref P2) (pin 2)) + (node (ref IC1) (pin 26))) + (net (code 3) (name /D+) + (node (ref IC1) (pin 27)) + (node (ref P2) (pin 3))) + (net (code 4) (name "Net-(P3-Pad1)") + (node (ref P3) (pin 1)) + (node (ref R10) (pin 2))) + (net (code 5) (name "Net-(P3-Pad2)") + (node (ref R9) (pin 2)) + (node (ref P3) (pin 2))) + (net (code 6) (name "Net-(P3-Pad3)") + (node (ref R8) (pin 2)) + (node (ref P3) (pin 3))) + (net (code 7) (name "Net-(P3-Pad4)") + (node (ref P3) (pin 4)) + (node (ref R7) (pin 2))) + (net (code 8) (name "Net-(IC1-Pad32)") + (node (ref IC1) (pin 32)) + (node (ref R13) (pin 1))) + (net (code 9) (name "Net-(IC1-Pad29)") + (node (ref IC1) (pin 29)) + (node (ref R12) (pin 1))) + (net (code 10) (name "Net-(IC1-Pad28)") + (node (ref IC1) (pin 28)) + (node (ref R11) (pin 1))) + (net (code 11) (name "Net-(R10-Pad1)") + (node (ref R10) (pin 1)) + (node (ref R14) (pin 2))) + (net (code 12) (name "Net-(R13-Pad2)") + (node (ref R13) (pin 2)) + (node (ref R9) (pin 1))) + (net (code 13) (name "Net-(R12-Pad2)") + (node (ref R12) (pin 2)) + (node (ref R8) (pin 1))) + (net (code 14) (name /VCC_PSU) + (node (ref L1) (pin 2)) + (node (ref C9) (pin 1)) + (node (ref P5) (pin 2)) + (node (ref C10) (pin 1))) + (net (code 15) (name "Net-(D1-Pad2)") + (node (ref L1) (pin 1)) + (node (ref Q1) (pin 3)) + (node (ref D1) (pin 2))) + (net (code 16) (name "Net-(R11-Pad2)") + (node (ref R11) (pin 2)) + (node (ref R7) (pin 1))) + (net (code 17) (name "Net-(P8-Pad2)") + (node (ref P8) (pin 2)) + (node (ref U4) (pin 2))) + (net (code 18) (name "Net-(P8-Pad1)") + (node (ref U4) (pin 5)) + (node (ref P8) (pin 1))) + (net (code 19) (name "Net-(R2-Pad1)") + (node (ref R2) (pin 1)) + (node (ref U2) (pin 5)) + (node (ref R4) (pin 2))) + (net (code 20) (name "Net-(C13-Pad1)") + (node (ref C13) (pin 1)) + (node (ref P6) (pin 2))) + (net (code 21) (name /VCC_3V3) + (node (ref C6) (pin 1)) + (node (ref C11) (pin 1)) + (node (ref IC1) (pin 19)) + (node (ref R21) (pin 1)) + (node (ref U1) (pin 2)) + (node (ref P4) (pin 1)) + (node (ref P5) (pin 3)) + (node (ref IC1) (pin 31)) + (node (ref C4) (pin 1))) + (net (code 22) (name /AGND) + (node (ref C8) (pin 2)) + (node (ref U4) (pin 4)) + (node (ref IC1) (pin 38)) + (node (ref R27) (pin 2)) + (node (ref IC1) (pin 30)) + (node (ref P4) (pin 3)) + (node (ref IC1) (pin 18)) + (node (ref IC1) (pin 14)) + (node (ref C5) (pin 2)) + (node (ref C3) (pin 2)) + (node (ref U4) (pin 1)) + (node (ref C4) (pin 2)) + (node (ref P2) (pin 5)) + (node (ref P2) (pin 6)) + (node (ref U1) (pin 1)) + (node (ref R6) (pin 1)) + (node (ref F1) (pin 1)) + (node (ref U3) (pin 4)) + (node (ref U3) (pin 1)) + (node (ref C11) (pin 2)) + (node (ref C6) (pin 2))) + (net (code 23) (name "Net-(C2-Pad2)") + (node (ref C2) (pin 2)) + (node (ref P1) (pin 2))) + (net (code 24) (name "Net-(R22-Pad1)") + (node (ref R22) (pin 1)) + (node (ref R24) (pin 2))) + (net (code 25) (name "Net-(R1-Pad1)") + (node (ref R1) (pin 1)) + (node (ref R3) (pin 1)) + (node (ref U2) (pin 3))) + (net (code 26) (name "Net-(C1-Pad2)") + (node (ref P1) (pin 3)) + (node (ref C1) (pin 2))) + (net (code 27) (name "Net-(C1-Pad1)") + (node (ref C1) (pin 1)) + (node (ref P1) (pin 4)) + (node (ref R1) (pin 2))) + (net (code 28) (name "Net-(C2-Pad1)") + (node (ref P1) (pin 1)) + (node (ref R2) (pin 2)) + (node (ref C2) (pin 1))) + (net (code 29) (name "Net-(R15-Pad1)") + (node (ref U2) (pin 9)) + (node (ref R20) (pin 2)) + (node (ref R15) (pin 1)) + (node (ref R16) (pin 1))) + (net (code 30) (name "Net-(R17-Pad2)") + (node (ref R17) (pin 2)) + (node (ref U3) (pin 3)) + (node (ref R18) (pin 2))) + (net (code 31) (name "Net-(R19-Pad1)") + (node (ref R22) (pin 2)) + (node (ref R19) (pin 1)) + (node (ref U2) (pin 14))) + (net (code 32) (name "Net-(R17-Pad1)") + (node (ref U2) (pin 13)) + (node (ref R17) (pin 1)) + (node (ref R19) (pin 2)) + (node (ref R18) (pin 1))) + (net (code 33) (name "Net-(R15-Pad2)") + (node (ref R16) (pin 2)) + (node (ref U3) (pin 6)) + (node (ref R15) (pin 2))) + (net (code 34) (name "Net-(C14-Pad1)") + (node (ref C14) (pin 1)) + (node (ref P6) (pin 4))) + (net (code 35) (name "Net-(C14-Pad2)") + (node (ref R25) (pin 1)) + (node (ref C14) (pin 2)) + (node (ref P6) (pin 3))) + (net (code 36) (name "Net-(C13-Pad2)") + (node (ref C13) (pin 2)) + (node (ref R24) (pin 1)) + (node (ref P6) (pin 1))) + (net (code 37) (name "Net-(R20-Pad1)") + (node (ref R23) (pin 2)) + (node (ref U2) (pin 8)) + (node (ref R20) (pin 1))) + (net (code 38) (name "Net-(IC1-Pad34)") + (node (ref IC1) (pin 34)) + (node (ref P4) (pin 2))) + (net (code 39) (name "Net-(IC1-Pad35)") + (node (ref IC1) (pin 35)) + (node (ref P4) (pin 4))) + (net (code 40) (name /PSU_PWM) + (node (ref IC1) (pin 24)) + (node (ref Q1) (pin 1))) + (net (code 41) (name +5V) + (node (ref P2) (pin 1)) + (node (ref P5) (pin 1)) + (node (ref C12) (pin 1)) + (node (ref C3) (pin 1)) + (node (ref U1) (pin 3))) + (net (code 42) (name /AVCC) + (node (ref C5) (pin 1)) + (node (ref C8) (pin 1)) + (node (ref R21) (pin 2)) + (node (ref IC1) (pin 39)) + (node (ref R5) (pin 1))) + (net (code 43) (name /DAC_OUT2) + (node (ref IC1) (pin 7)) + (node (ref U2) (pin 10))) + (net (code 44) (name "Net-(P2-Pad4)") + (node (ref P2) (pin 4))) + (net (code 45) (name "Net-(IC1-Pad10)") + (node (ref IC1) (pin 10))) + (net (code 46) (name "Net-(IC1-Pad9)") + (node (ref IC1) (pin 9))) + (net (code 47) (name "Net-(IC1-Pad8)") + (node (ref IC1) (pin 8))) + (net (code 48) (name /DAC_OUT) + (node (ref U2) (pin 12)) + (node (ref IC1) (pin 6))) + (net (code 49) (name /TO_B1) + (node (ref IC1) (pin 5)) + (node (ref U3) (pin 5))) + (net (code 50) (name /TO_B0) + (node (ref U3) (pin 2)) + (node (ref IC1) (pin 4))) + (net (code 51) (name "Net-(IC1-Pad3)") + (node (ref IC1) (pin 3))) + (net (code 52) (name /VGND) + (node (ref C12) (pin 2)) + (node (ref C9) (pin 2)) + (node (ref P7) (pin 2)) + (node (ref P7) (pin 3)) + (node (ref P7) (pin 4)) + (node (ref Q1) (pin 2)) + (node (ref F1) (pin 2)) + (node (ref U2) (pin 11)) + (node (ref C15) (pin 2)) + (node (ref C16) (pin 2)) + (node (ref C10) (pin 2))) + (net (code 53) (name "Net-(IC1-Pad20)") + (node (ref IC1) (pin 20))) + (net (code 54) (name "Net-(IC1-Pad37)") + (node (ref IC1) (pin 37))) + (net (code 55) (name /DIG_CH1) + (node (ref IC1) (pin 17)) + (node (ref U4) (pin 6))) + (net (code 56) (name "Net-(IC1-Pad36)") + (node (ref IC1) (pin 36))) + (net (code 57) (name "Net-(IC1-Pad16)") + (node (ref IC1) (pin 16))) + (net (code 58) (name "Net-(IC1-Pad25)") + (node (ref IC1) (pin 25))) + (net (code 59) (name /XCK) + (node (ref IC1) (pin 11)) + (node (ref IC1) (pin 15))) + (net (code 60) (name /AVCC_ON_2) + (node (ref R5) (pin 2)) + (node (ref R3) (pin 2)) + (node (ref IC1) (pin 44)) + (node (ref R4) (pin 1)) + (node (ref R6) (pin 2))) + (net (code 61) (name "Net-(IC1-Pad43)") + (node (ref IC1) (pin 43))) + (net (code 62) (name "Net-(IC1-Pad23)") + (node (ref IC1) (pin 23))) + (net (code 63) (name "Net-(IC1-Pad13)") + (node (ref IC1) (pin 13))) + (net (code 64) (name /CH1) + (node (ref IC1) (pin 42)) + (node (ref U2) (pin 2)) + (node (ref U2) (pin 1))) + (net (code 65) (name "Net-(IC1-Pad22)") + (node (ref IC1) (pin 22))) + (net (code 66) (name /DIG_CH2) + (node (ref IC1) (pin 12)) + (node (ref U4) (pin 3))) + (net (code 67) (name "Net-(IC1-Pad41)") + (node (ref IC1) (pin 41))) + (net (code 68) (name "Net-(IC1-Pad21)") + (node (ref IC1) (pin 21))) + (net (code 69) (name /CH2) + (node (ref U2) (pin 7)) + (node (ref U2) (pin 6)) + (node (ref IC1) (pin 40)) + (node (ref IC1) (pin 2))) + (net (code 70) (name /PSU_FEEDBACK) + (node (ref IC1) (pin 1)) + (node (ref R27) (pin 1)) + (node (ref R26) (pin 2))) + (net (code 71) (name "Net-(R23-Pad1)") + (node (ref R25) (pin 2)) + (node (ref R23) (pin 1))) + (net (code 72) (name /PSU_OUT) + (node (ref U2) (pin 4)) + (node (ref R26) (pin 1)) + (node (ref D1) (pin 1)) + (node (ref C15) (pin 1)) + (node (ref C16) (pin 1)) + (node (ref P7) (pin 1))))) \ No newline at end of file diff --git a/PCB/OUTPUT_V35/Tinylab_proto1.pro b/PCB/OUTPUT_V35/Tinylab_proto1.pro new file mode 100644 index 00000000..804cf83d --- /dev/null +++ b/PCB/OUTPUT_V35/Tinylab_proto1.pro @@ -0,0 +1,62 @@ +update=22/05/2015 07:44:53 +version=1 +last_client=kicad +[general] +version=1 +RootSch= +BoardNm= +[pcbnew] +version=1 +LastNetListRead= +UseCmpFile=1 +PadDrill=0.600000000000 +PadDrillOvalY=0.600000000000 +PadSizeH=1.500000000000 +PadSizeV=1.500000000000 +PcbTextSizeV=1.500000000000 +PcbTextSizeH=1.500000000000 +PcbTextThickness=0.300000000000 +ModuleTextSizeV=1.000000000000 +ModuleTextSizeH=1.000000000000 +ModuleTextSizeThickness=0.150000000000 +SolderMaskClearance=0.000000000000 +SolderMaskMinWidth=0.000000000000 +DrawSegmentWidth=0.200000000000 +BoardOutlineThickness=0.100000000000 +ModuleOutlineThickness=0.150000000000 +[cvpcb] +version=1 +NetIExt=net +[eeschema] +version=1 +LibDir= +[eeschema/libraries] +LibName1=power +LibName2=device +LibName3=transistors +LibName4=conn +LibName5=linear +LibName6=regul +LibName7=74xx +LibName8=cmos4000 +LibName9=adc-dac +LibName10=memory +LibName11=xilinx +LibName12=microcontrollers +LibName13=dsp +LibName14=microchip +LibName15=analog_switches +LibName16=motorola +LibName17=texas +LibName18=intel +LibName19=audio +LibName20=interface +LibName21=digital-audio +LibName22=philips +LibName23=display +LibName24=cypress +LibName25=siliconi +LibName26=opto +LibName27=atmel +LibName28=contrib +LibName29=valves diff --git a/PCB/OUTPUT_V4/BOM/Tinylab_proto1.csv b/PCB/OUTPUT_V4/BOM/Tinylab_proto1.csv new file mode 100644 index 00000000..25b71349 --- /dev/null +++ b/PCB/OUTPUT_V4/BOM/Tinylab_proto1.csv @@ -0,0 +1,67 @@ +Reference;Mounting; Value; Footprint; Datasheet +C1;SMD;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C2;SMD;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C3;SMD;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C4;SMD;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C5;SMD;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C6;SMD;Electrolytic 4mm 33uF;Capacitors_SMD:c_elec_5x5.3; +C7;SMD;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C8;SMD;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C9;SMD;Electrolytic 4mm 33uF;Capacitors_SMD:c_elec_4x5.3; +C10;SMD;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C11;SMD;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C13;SMD;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C14;SMD;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C15;Thru Hole;Electrolytic 6.3mm 220uF;Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5; +C16;SMD;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +D1;Thru Hole;Schottky 0.45V 1A;Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10; +F1;SMD;PTC 400mA;Capacitors_SMD:C_1206; +IC1;SMD;QFN ATXMEGA16A4U-A;Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm; +L1;Thru Hole;Bourns Radial 220uH;Inductors:INDUCTOR_V; +L2;SMD;10uH 1210;Resistors_SMD:R_1210; +L3;SMD;10uH 1210;Resistors_SMD:R_1210; +P1;Thru Hole;Female Header 1x2;Pin_Headers:Pin_Header_Straight_1x02; +P2;Thru Hole/SMD;Micro USB-B Connector (F);Connect:USB_Micro-B_WIDE; +P3;Thru Hole;Male header 1x4;Pin_Headers:Pin_Header_Straight_1x04; +P4;Thru Hole;Male header 2x2;Pin_Headers:Pin_Header_Straight_2x02; +P5;Thru Hole;Female Header 1x2;Pin_Headers:Pin_Header_Straight_1x02; +P6;Thru Hole;Male header 1x4;Pin_Headers:Pin_Header_Straight_1x04; +P7;Thru Hole;Male header 1x2;Pin_Headers:Pin_Header_Straight_2x02; +P8;Thru Hole;Feamle Header 1x2;Pin_Headers:Pin_Header_Straight_1x02; +P9;Thru Hole;Female Header 1x2;Pin_Headers:Pin_Header_Straight_1x02; +P10;Thru Hole;Female Header 1x2;Pin_Headers:Pin_Header_Straight_1x02; +Q1;SMD;SMD nMOS Transistor TSM2302CX ;SMD:SOT-23-3; +R1;SMD;SMD 1M? 20V 0603;Resistors_SMD:R_0603; +R2;SMD;SMD 1M? 20V 0603;Resistors_SMD:R_0603; +R3;SMD;SMD 75k? 6.3V 0603;Resistors_SMD:R_0603; +R4;SMD;SMD 75k? 6.3V 0603;Resistors_SMD:R_0603; +R5;SMD;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R6;SMD;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R7;SMD;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R8;SMD;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R9;SMD;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R10;SMD;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R11;SMD;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R12;SMD;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R13;SMD;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R14;SMD;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R15;SMD;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R16;SMD;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R17;SMD;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R18;SMD;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R19;SMD;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R20;SMD;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R21;SMD;SMD 100? 16V 0603;Resistors_SMD:R_0603; +R22;SMD;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R23;SMD;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R24;SMD;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R25;SMD;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R26;SMD;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R27;SMD;SMD 100? 16V 0603;Resistors_SMD:R_0603; +R28;SMD;SMD 100? 16V 0603;Resistors_SMD:R_0603; +R29;SMD;SMD 100? 16V 0603;Resistors_SMD:R_0603; +R30;SMD;SMD 100? 16V 0603;Resistors_SMD:R_0603; +U1;SMD;3.3V Reg RT9161A-33GV;SMD:SOT-23-3; +U2;SMD;LM324;Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm; +U3;SMD;DMN63D8LDW;TO_SOT_Packages_SMD:SOT-363; +U4;SMD;DMN63D8LDW;TO_SOT_Packages_SMD:SOT-363; diff --git a/PCB/OUTPUT_V4/BOM/Tinylab_proto1_Elecrow.csv b/PCB/OUTPUT_V4/BOM/Tinylab_proto1_Elecrow.csv new file mode 100644 index 00000000..1b80aa2e --- /dev/null +++ b/PCB/OUTPUT_V4/BOM/Tinylab_proto1_Elecrow.csv @@ -0,0 +1,67 @@ +Type;Reference;Mounting; Value;Qty; Footprint; Datasheet +C;C6;SMD;Electrolytic 4mm 33uF;2;Capacitors_SMD:c_elec_5x5.3; +C;C9;SMD;Electrolytic 4mm 33uF;2;Capacitors_SMD:c_elec_4x5.3; +C;C15;Thru Hole;Electrolytic 6.3mm 220uF;1;Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5; +C;C1;SMD;SMD MLCC 1uF 16V 0603;12;Capacitors_SMD:C_0603; +C;C2;SMD;SMD MLCC 1uF 16V 0603;12;Capacitors_SMD:C_0603; +C;C3;SMD;SMD MLCC 1uF 16V 0603;12;Capacitors_SMD:C_0603; +C;C4;SMD;SMD MLCC 1uF 16V 0603;12;Capacitors_SMD:C_0603; +C;C5;SMD;SMD MLCC 1uF 16V 0603;12;Capacitors_SMD:C_0603; +C;C7;SMD;SMD MLCC 1uF 16V 0603;12;Capacitors_SMD:C_0603; +C;C8;SMD;SMD MLCC 1uF 16V 0603;12;Capacitors_SMD:C_0603; +C;C10;SMD;SMD MLCC 1uF 16V 0603;12;Capacitors_SMD:C_0603; +C;C11;SMD;SMD MLCC 1uF 16V 0603;12;Capacitors_SMD:C_0603; +C;C13;SMD;SMD MLCC 1uF 16V 0603;12;Capacitors_SMD:C_0603; +C;C14;SMD;SMD MLCC 1uF 16V 0603;12;Capacitors_SMD:C_0603; +C;C16;SMD;SMD MLCC 1uF 16V 0603;12;Capacitors_SMD:C_0603; +D;D1;Thru Hole;Schottky 0.45V 1A;1;Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10; +F;F1;SMD;PTC 400mA;1;Capacitors_SMD:C_1206; +IC;IC1;SMD;QFN ATXMEGA16A4U-A;1;Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm; +L;L2;SMD;10uH 1210;2;Resistors_SMD:R_1210; +L;L3;SMD;10uH 1210;2;Resistors_SMD:R_1210; +L;L1;Thru Hole;Bourns Radial 220uH;1;Inductors:INDUCTOR_V; +P;P8;Thru Hole;Feamle Header 1x2;5;Pin_Headers:Pin_Header_Straight_1x02; +P;P1;Thru Hole;Female Header 1x2;5;Pin_Headers:Pin_Header_Straight_1x02; +P;P5;Thru Hole;Female Header 1x2;5;Pin_Headers:Pin_Header_Straight_1x02; +P;P9;Thru Hole;Female Header 1x2;5;Pin_Headers:Pin_Header_Straight_1x02; +P;P10;Thru Hole;Female Header 1x2;5;Pin_Headers:Pin_Header_Straight_1x02; +P;P7;Thru Hole;Male header 1x2;1;Pin_Headers:Pin_Header_Straight_2x02; +P;P3;Thru Hole;Male header 1x4;2;Pin_Headers:Pin_Header_Straight_1x04; +P;P6;Thru Hole;Male header 1x4;2;Pin_Headers:Pin_Header_Straight_1x04; +P;P4;Thru Hole;Male header 2x2;1;Pin_Headers:Pin_Header_Straight_2x02; +P;P2;Thru Hole/SMD;Micro USB-B Connector (F);1;Connect:USB_Micro-B_WIDE; +Q;Q1;SMD;SMD nMOS Transistor TSM2302CX ;1;SMD:SOT-23-3; +R;R21;SMD;SMD 100? 16V 0603;5;Resistors_SMD:R_0603; +R;R27;SMD;SMD 100? 16V 0603;5;Resistors_SMD:R_0603; +R;R28;SMD;SMD 100? 16V 0603;5;Resistors_SMD:R_0603; +R;R29;SMD;SMD 100? 16V 0603;5;Resistors_SMD:R_0603; +R;R30;SMD;SMD 100? 16V 0603;5;Resistors_SMD:R_0603; +R;R5;SMD;SMD 1k? 16V 0603;9;Resistors_SMD:R_0603; +R;R6;SMD;SMD 1k? 16V 0603;9;Resistors_SMD:R_0603; +R;R15;SMD;SMD 1k? 16V 0603;9;Resistors_SMD:R_0603; +R;R16;SMD;SMD 1k? 16V 0603;9;Resistors_SMD:R_0603; +R;R17;SMD;SMD 1k? 16V 0603;9;Resistors_SMD:R_0603; +R;R18;SMD;SMD 1k? 16V 0603;9;Resistors_SMD:R_0603; +R;R19;SMD;SMD 1k? 16V 0603;9;Resistors_SMD:R_0603; +R;R20;SMD;SMD 1k? 16V 0603;9;Resistors_SMD:R_0603; +R;R26;SMD;SMD 1k? 16V 0603;9;Resistors_SMD:R_0603; +R;R1;SMD;SMD 1M? 20V 0603;2;Resistors_SMD:R_0603; +R;R2;SMD;SMD 1M? 20V 0603;2;Resistors_SMD:R_0603; +R;R7;SMD;SMD 28? 6.3V 0603;14;Resistors_SMD:R_0603; +R;R8;SMD;SMD 28? 6.3V 0603;14;Resistors_SMD:R_0603; +R;R9;SMD;SMD 28? 6.3V 0603;14;Resistors_SMD:R_0603; +R;R10;SMD;SMD 28? 6.3V 0603;14;Resistors_SMD:R_0603; +R;R11;SMD;SMD 28? 6.3V 0603;14;Resistors_SMD:R_0603; +R;R12;SMD;SMD 28? 6.3V 0603;14;Resistors_SMD:R_0603; +R;R13;SMD;SMD 28? 6.3V 0603;14;Resistors_SMD:R_0603; +R;R14;SMD;SMD 28? 6.3V 0603;14;Resistors_SMD:R_0603; +R;R22;SMD;SMD 28? 6.3V 0603;14;Resistors_SMD:R_0603; +R;R23;SMD;SMD 28? 6.3V 0603;14;Resistors_SMD:R_0603; +R;R24;SMD;SMD 28? 6.3V 0603;14;Resistors_SMD:R_0603; +R;R25;SMD;SMD 28? 6.3V 0603;14;Resistors_SMD:R_0603; +R;R3;SMD;SMD 75k? 6.3V 0603;14;Resistors_SMD:R_0603; +R;R4;SMD;SMD 75k? 6.3V 0603;14;Resistors_SMD:R_0603; +U;U1;SMD;3.3V Reg RT9161A-33GV;1;SMD:SOT-23-3; +U;U3;SMD;DMN63D8LDW;2;TO_SOT_Packages_SMD:SOT-363; +U;U4;SMD;DMN63D8LDW;2;TO_SOT_Packages_SMD:SOT-363; +U;U2;SMD;LM324;1;Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm; diff --git a/PCB/OUTPUT_V4/Drill/Tinylab_proto1.drl b/PCB/OUTPUT_V4/Drill/Tinylab_proto1.drl new file mode 100644 index 00000000..dab9c8e9 --- /dev/null +++ b/PCB/OUTPUT_V4/Drill/Tinylab_proto1.drl @@ -0,0 +1,124 @@ +M48 +;DRILL file {KiCad 4.0.1-stable} date 24/03/2016 3:42:36 PM +;FORMAT={2:4/ absolute / inch / keep zeros} +FMAT,2 +INCH,TZ +T1C0.016 +T2C0.020 +T3C0.022 +T4C0.031 +T5C0.032 +T6C0.039 +T7C0.040 +T8C0.050 +% +G90 +G05 +M72 +T1 +X033690Y-041650 +X033710Y-047630 +X033999Y-045270 +X034220Y-049260 +X034524Y-040092 +X035030Y-046800 +X035119Y-048259 +X035581Y-046763 +X035610Y-045900 +X035620Y-048920 +X035630Y-048270 +X035700Y-049250 +X035750Y-040062 +X035956Y-038700 +X036025Y-042575 +X036150Y-042900 +X036772Y-045948 +X036814Y-047798 +X037200Y-048700 +X037600Y-041025 +X037625Y-041450 +X037676Y-047820 +X037992Y-042960 +X038586Y-045300 +X038707Y-044058 +X038796Y-044770 +X038811Y-040650 +X038944Y-039358 +X039246Y-040195 +X039300Y-045625 +X039878Y-042572 +X040075Y-047200 +X040113Y-044749 +X040200Y-039225 +X040654Y-042520 +X040686Y-044430 +X041101Y-043915 +X041124Y-041284 +X041149Y-040969 +X041387Y-044438 +X041450Y-039225 +X041545Y-040708 +X041852Y-040924 +X042134Y-041446 +X042175Y-045325 +X042308Y-042548 +X042476Y-043930 +X042486Y-045406 +X043087Y-045406 +X043116Y-043743 +X043331Y-039990 +X043360Y-038360 +X043386Y-039615 +X043456Y-037964 +X043571Y-044595 +X043946Y-042040 +X044277Y-042513 +X044326Y-040140 +X045136Y-045335 +T4 +X034516Y-044000 +X035500Y-044000 +T5 +X031671Y-038550 +X031671Y-040550 +T6 +X036749Y-042000 +T7 +X031671Y-042050 +X031671Y-043050 +X031671Y-044050 +X031671Y-045050 +X031671Y-046050 +X031671Y-047050 +X031671Y-048050 +X031671Y-049050 +X034671Y-041050 +X034671Y-042050 +X035671Y-041050 +X035671Y-042050 +X040700Y-046000 +X040700Y-047000 +X040700Y-048000 +X040700Y-049000 +X041700Y-046000 +X041700Y-049000 +X043766Y-046545 +X043801Y-047940 +X043801Y-048940 +X044766Y-046545 +X044801Y-047940 +X044801Y-048940 +T8 +X036749Y-038000 +T2 +X045026Y-038232G85X044770Y-038232 +G05 +X045026Y-040988G85X044770Y-040988 +G05 +T3 +X043835Y-038685G85X043835Y-038567 +G05 +X043835Y-040654G85X043835Y-040536 +G05 +T0 +M30 diff --git a/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-B.Cu.gbr b/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-B.Cu.gbr new file mode 100644 index 00000000..81a7e906 --- /dev/null +++ b/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-B.Cu.gbr @@ -0,0 +1,496 @@ +G04 #@! TF.FileFunction,Copper,L2,Bot,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 24/03/2016 3:42:33 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11C,1.300000*% +%ADD12R,1.300000X1.300000*% +%ADD13C,1.998980*% +%ADD14R,1.998980X1.998980*% +%ADD15R,1.905000X1.905000*% +%ADD16C,1.905000*% +%ADD17R,2.032000X2.032000*% +%ADD18O,2.032000X2.032000*% +%ADD19O,0.950000X1.250000*% +%ADD20O,1.550000X1.000000*% +%ADD21R,2.032000X1.727200*% +%ADD22O,2.032000X1.727200*% +%ADD23R,1.727200X1.727200*% +%ADD24O,1.727200X1.727200*% +%ADD25C,0.600000*% +%ADD26C,0.635000*% +%ADD27C,1.270000*% +%ADD28C,0.400000*% +%ADD29C,0.250000*% +G04 APERTURE END LIST* +D10* +D11* +X87670000Y-111760000D03* +D12* +X90170000Y-111760000D03* +D13* +X93342460Y-96520000D03* +D14* +X93342460Y-106680000D03* +D15* +X80444800Y-97917000D03* +D16* +X80444800Y-102997000D03* +D17* +X105918000Y-124460000D03* +D18* +X103378000Y-124460000D03* +D19* +X111340460Y-103110300D03* +X111340460Y-98110300D03* +D20* +X114040460Y-104110300D03* +X114040460Y-97110300D03* +D21* +X80444800Y-114427000D03* +D22* +X80444800Y-111887000D03* +X80444800Y-109347000D03* +X80444800Y-106807000D03* +D23* +X113795000Y-124307600D03* +D24* +X111255000Y-124307600D03* +X113795000Y-121767600D03* +X111255000Y-121767600D03* +D17* +X105918000Y-116840000D03* +D18* +X103378000Y-116840000D03* +D21* +X80444800Y-116967000D03* +D22* +X80444800Y-119507000D03* +X80444800Y-122047000D03* +X80444800Y-124587000D03* +D17* +X113706100Y-118224300D03* +D18* +X111166100Y-118224300D03* +D17* +X103378000Y-119380000D03* +D18* +X103378000Y-121920000D03* +D17* +X90604800Y-106807000D03* +D18* +X88064800Y-106807000D03* +D17* +X90604800Y-104267000D03* +D18* +X88064800Y-104267000D03* +D25* +X112588500Y-101955600D03* +X91328700Y-98298000D03* +X112464800Y-107982000D03* +X105123440Y-112872520D03* +X101886498Y-113662460D03* +X111623300Y-106781600D03* +X103261620Y-108000800D03* +X102108000Y-99631500D03* +X105283000Y-99631500D03* +X94488000Y-123698000D03* +X99822000Y-115887500D03* +X85623400Y-120980200D03* +X85572600Y-105791000D03* +X110670800Y-113271300D03* +X98008900Y-115062000D03* +X114645900Y-115150900D03* +X90805000Y-101757598D03* +X107462780Y-108071920D03* +X104455420Y-104861360D03* +X98918220Y-99969320D03* +X87691420Y-101833680D03* +X103342900Y-112852200D03* +X98542300Y-113715800D03* +X107020820Y-105272840D03* +X90376200Y-118778020D03* +X106304540Y-103946960D03* +X89202720Y-122577860D03* +X105524760Y-103398320D03* +X93401340Y-116707920D03* +X104518920Y-104061260D03* +X93508020Y-121406920D03* +X99685300Y-102095300D03* +X110061200Y-101574600D03* +X110200900Y-100622100D03* +X98580400Y-103251000D03* +X95504000Y-104203500D03* +X91503500Y-108140500D03* +X95567500Y-105283000D03* +X91821000Y-108966000D03* +X96500140Y-109118400D03* +X86357920Y-114985800D03* +X107914800Y-115332000D03* +X107889800Y-111582000D03* +X98314800Y-111907000D03* +X101289800Y-108132000D03* +X109514800Y-111107000D03* +X109439800Y-115332000D03* +X104397000Y-111544100D03* +X95697500Y-121462800D03* +X107124500Y-115125500D03* +X101790500Y-119888000D03* +X110378700Y-96428560D03* +X110134860Y-97434400D03* +X90500200Y-122605800D03* +X90474800Y-124256800D03* +X88976200Y-118872000D03* +X90449400Y-116586000D03* +X90678000Y-125095000D03* +X86918800Y-125120400D03* +D26* +X112588500Y-101523800D02* +X112588500Y-101955600D01* +X109438900Y-98374200D02* +X112588500Y-101523800D01* +D27* +X91404900Y-98374200D02* +X109438900Y-98374200D01* +D26* +X91328700Y-98298000D02* +X91404900Y-98374200D01* +D27* +X105123440Y-112872520D02* +X109399280Y-112872520D01* +X112464800Y-110132000D02* +X112464800Y-107982000D01* +X111014800Y-111582000D02* +X112464800Y-110132000D01* +X110689800Y-111582000D02* +X111014800Y-111582000D01* +X109399280Y-112872520D02* +X110689800Y-111582000D01* +D26* +X104300480Y-113695480D02* +X105123440Y-112872520D01* +X101919518Y-113695480D02* +X104300480Y-113695480D01* +X101886498Y-113662460D02* +X101919518Y-113695480D01* +X114040460Y-104110300D02* +X112340460Y-104110300D01* +X112340460Y-104110300D02* +X111340460Y-103110300D01* +X109146800Y-109258100D02* +X111623300Y-106781600D01* +X107145280Y-109258100D02* +X109146800Y-109258100D01* +X105860040Y-107972860D02* +X107145280Y-109258100D01* +X103289560Y-107972860D02* +X105860040Y-107972860D01* +X103261620Y-108000800D02* +X103289560Y-107972860D01* +D28* +X102298500Y-99822000D02* +X102108000Y-99631500D01* +X105092500Y-99822000D02* +X102298500Y-99822000D01* +X105283000Y-99631500D02* +X105092500Y-99822000D01* +D26* +X95631000Y-123698000D02* +X94488000Y-123698000D01* +X96139000Y-124206000D02* +X95631000Y-123698000D01* +X97028000Y-124206000D02* +X96139000Y-124206000D01* +X98171000Y-123063000D02* +X97028000Y-124206000D01* +X98171000Y-116713000D02* +X98171000Y-123063000D01* +X99060000Y-115887500D02* +X98171000Y-116713000D01* +X99822000Y-115887500D02* +X99060000Y-115887500D01* +D29* +X85623400Y-105841800D02* +X85623400Y-120980200D01* +X85572600Y-105791000D02* +X85623400Y-105841800D01* +D26* +X109896100Y-114046000D02* +X110670800Y-113271300D01* +X106721100Y-114046000D02* +X109896100Y-114046000D01* +X106213100Y-114554000D02* +X106721100Y-114046000D01* +X98516900Y-114554000D02* +X106213100Y-114554000D01* +X98008900Y-115062000D02* +X98516900Y-114554000D01* +D28* +X113795000Y-124307600D02* +X114049000Y-124307600D01* +X114049000Y-124307600D02* +X115687300Y-122669300D01* +X115687300Y-122669300D02* +X115687300Y-116192300D01* +X115687300Y-116192300D02* +X114645900Y-115150900D01* +D27* +X90805000Y-101757598D02* +X90805000Y-103505000D01* +X90805000Y-103505000D02* +X90170000Y-104140000D01* +X87630000Y-104140000D02* +X90170000Y-104140000D01* +X87630000Y-106680000D02* +X87630000Y-104140000D01* +X87670000Y-111760000D02* +X87670000Y-106720000D01* +X87670000Y-106720000D02* +X87630000Y-106680000D01* +X90170000Y-106680000D02* +X93342460Y-106680000D01* +X90170000Y-111760000D02* +X90170000Y-106680000D01* +X93342460Y-96520000D02* +X81280000Y-96520000D01* +X81280000Y-96520000D02* +X80010000Y-97790000D01* +D29* +X107157980Y-107767120D02* +X107462780Y-108071920D01* +X107157980Y-106324400D02* +X107157980Y-107767120D01* +X105796540Y-104962960D02* +X107157980Y-106324400D01* +X104557020Y-104962960D02* +X105796540Y-104962960D01* +X104455420Y-104861360D02* +X104557020Y-104962960D01* +X94371620Y-99969320D02* +X98918220Y-99969320D01* +X93726460Y-100614480D02* +X94371620Y-99969320D01* +X88910620Y-100614480D02* +X93726460Y-100614480D01* +X87691420Y-101833680D02* +X88910620Y-100614480D01* +X102733300Y-112242600D02* +X103342900Y-112852200D01* +X100015500Y-112242600D02* +X102733300Y-112242600D01* +X98542300Y-113715800D02* +X100015500Y-112242600D01* +X107020820Y-102816660D02* +X107020820Y-105272840D01* +X106477260Y-102273100D02* +X107020820Y-102816660D01* +X101067060Y-102273100D02* +X106477260Y-102273100D01* +X98895360Y-104444800D02* +X101067060Y-102273100D01* +X98895360Y-107759500D02* +X98895360Y-104444800D01* +X91389660Y-115265200D02* +X98895360Y-107759500D01* +X91389660Y-117764560D02* +X91389660Y-115265200D01* +X90376200Y-118778020D02* +X91389660Y-117764560D01* +X106304540Y-102971600D02* +X106304540Y-103946960D01* +X106081020Y-102748080D02* +X106304540Y-102971600D01* +X101305820Y-102748080D02* +X106081020Y-102748080D01* +X99444000Y-104609900D02* +X101305820Y-102748080D01* +X99444000Y-107950000D02* +X99444000Y-104609900D01* +X91839662Y-115554338D02* +X99444000Y-107950000D01* +X91839662Y-118259438D02* +X91839662Y-115554338D01* +X90493040Y-119606060D02* +X91839662Y-118259438D01* +X89065560Y-119606060D02* +X90493040Y-119606060D01* +X88059720Y-120611900D02* +X89065560Y-119606060D01* +X88059720Y-121983500D02* +X88059720Y-120611900D01* +X88595660Y-122519440D02* +X88059720Y-121983500D01* +X89144300Y-122519440D02* +X88595660Y-122519440D01* +X89202720Y-122577860D02* +X89144300Y-122519440D01* +X101846840Y-103398320D02* +X105524760Y-103398320D01* +X100076460Y-105168700D02* +X101846840Y-103398320D01* +X100076460Y-108280200D02* +X100076460Y-105168700D01* +X93624860Y-114731800D02* +X100076460Y-108280200D01* +X93624860Y-116484400D02* +X93624860Y-114731800D01* +X93401340Y-116707920D02* +X93624860Y-116484400D01* +X102395480Y-104061260D02* +X104518920Y-104061260D01* +X100647960Y-105808780D02* +X102395480Y-104061260D01* +X100647960Y-108597700D02* +X100647960Y-105808780D01* +X94323360Y-114922300D02* +X100647960Y-108597700D01* +X94323360Y-120591580D02* +X94323360Y-114922300D01* +X93508020Y-121406920D02* +X94323360Y-120591580D01* +D28* +X99685300Y-101831702D02* +X99685300Y-102095300D01* +X100294900Y-101222102D02* +X99685300Y-101831702D01* +X109708702Y-101222102D02* +X100294900Y-101222102D01* +X110061200Y-101574600D02* +X109708702Y-101222102D01* +X99863100Y-100622100D02* +X110200900Y-100622100D01* +X98885200Y-101600000D02* +X99863100Y-100622100D01* +X98885200Y-102946200D02* +X98885200Y-101600000D01* +X98580400Y-103251000D02* +X98885200Y-102946200D01* +D29* +X94932500Y-104775000D02* +X95504000Y-104203500D01* +X94932500Y-107823000D02* +X94932500Y-104775000D01* +X94678500Y-108077000D02* +X94932500Y-107823000D01* +X91567000Y-108077000D02* +X94678500Y-108077000D01* +X91503500Y-108140500D02* +X91567000Y-108077000D01* +X95567500Y-107886500D02* +X95567500Y-105283000D01* +X94926998Y-108527002D02* +X95567500Y-107886500D01* +X92259998Y-108527002D02* +X94926998Y-108527002D01* +X91821000Y-108966000D02* +X92259998Y-108527002D01* +X94851680Y-110766860D02* +X96500140Y-109118400D01* +X93314980Y-110766860D02* +X94851680Y-110766860D01* +X90381280Y-113700560D02* +X93314980Y-110766860D01* +X87643160Y-113700560D02* +X90381280Y-113700560D01* +X86357920Y-114985800D02* +X87643160Y-113700560D01* +X111255000Y-124307600D02* +X110865400Y-124307600D01* +X110865400Y-124307600D02* +X107914800Y-121357000D01* +X107914800Y-121357000D02* +X107914800Y-115332000D01* +X107889800Y-111582000D02* +X106964800Y-110657000D01* +X106964800Y-110657000D02* +X99514800Y-110657000D01* +X99514800Y-110657000D02* +X98447171Y-111724629D01* +X98447171Y-111724629D02* +X98447171Y-111774629D01* +X98447171Y-111774629D02* +X98314800Y-111907000D01* +X111255000Y-121767600D02* +X111255000Y-120772200D01* +X103189800Y-110032000D02* +X101289800Y-108132000D01* +X108439800Y-110032000D02* +X103189800Y-110032000D01* +X109514800Y-111107000D02* +X108439800Y-110032000D01* +X109439800Y-118957000D02* +X109439800Y-115332000D01* +X111255000Y-120772200D02* +X109439800Y-118957000D01* +X99825000Y-111544100D02* +X104397000Y-111544100D01* +X95189500Y-116179600D02* +X99825000Y-111544100D01* +X95189500Y-120954800D02* +X95189500Y-116179600D01* +X95697500Y-121462800D02* +X95189500Y-120954800D01* +D28* +X106870500Y-115379500D02* +X107124500Y-115125500D01* +X102489000Y-115379500D02* +X106870500Y-115379500D01* +X101917500Y-115951000D02* +X102489000Y-115379500D01* +X101917500Y-119761000D02* +X101917500Y-115951000D01* +X101790500Y-119888000D02* +X101917500Y-119761000D01* +D29* +X113706100Y-118224300D02* +X113706100Y-112379760D01* +X112116060Y-96428560D02* +X110378700Y-96428560D01* +X112764182Y-97076682D02* +X112116060Y-96428560D01* +X112764182Y-98204442D02* +X112764182Y-97076682D01* +X116002260Y-101442520D02* +X112764182Y-98204442D01* +X116002260Y-110083600D02* +X116002260Y-101442520D01* +X113706100Y-112379760D02* +X116002260Y-110083600D01* +X111166100Y-118224300D02* +X111166100Y-114066320D01* +X110515860Y-97053400D02* +X110134860Y-97434400D01* +X111872220Y-97053400D02* +X110515860Y-97053400D01* +X112314180Y-97495360D02* +X111872220Y-97053400D01* +X112314180Y-98668840D02* +X112314180Y-97495360D01* +X115346940Y-101701600D02* +X112314180Y-98668840D01* +X115346940Y-109885480D02* +X115346940Y-101701600D01* +X111166100Y-114066320D02* +X115346940Y-109885480D01* +X90500200Y-124231400D02* +X90500200Y-122605800D01* +X90474800Y-124256800D02* +X90500200Y-124231400D01* +X89103200Y-118745000D02* +X88976200Y-118872000D01* +X89433400Y-118745000D02* +X89103200Y-118745000D01* +X90525600Y-117652800D02* +X89433400Y-118745000D01* +X90525600Y-116662200D02* +X90525600Y-117652800D01* +X90449400Y-116586000D02* +X90525600Y-116662200D01* +X86944200Y-125095000D02* +X90678000Y-125095000D01* +X86918800Y-125120400D02* +X86944200Y-125095000D01* +M02* diff --git a/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-B.Mask.gbr b/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-B.Mask.gbr new file mode 100644 index 00000000..3630af90 --- /dev/null +++ b/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-B.Mask.gbr @@ -0,0 +1,85 @@ +G04 #@! TF.FileFunction,Soldermask,Bot* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 24/03/2016 3:42:33 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11C,1.300000*% +%ADD12R,1.300000X1.300000*% +%ADD13C,1.998980*% +%ADD14R,1.998980X1.998980*% +%ADD15R,1.905000X1.905000*% +%ADD16C,1.905000*% +%ADD17R,2.032000X2.032000*% +%ADD18O,2.032000X2.032000*% +%ADD19O,0.950000X1.250000*% +%ADD20O,1.550000X1.000000*% +%ADD21R,2.032000X1.727200*% +%ADD22O,2.032000X1.727200*% +%ADD23R,1.727200X1.727200*% +%ADD24O,1.727200X1.727200*% +G04 APERTURE END LIST* +D10* +D11* +X87670000Y-111760000D03* +D12* +X90170000Y-111760000D03* +D13* +X93342460Y-96520000D03* +D14* +X93342460Y-106680000D03* +D15* +X80444800Y-97917000D03* +D16* +X80444800Y-102997000D03* +D17* +X105918000Y-124460000D03* +D18* +X103378000Y-124460000D03* +D19* +X111340460Y-103110300D03* +X111340460Y-98110300D03* +D20* +X114040460Y-104110300D03* +X114040460Y-97110300D03* +D21* +X80444800Y-114427000D03* +D22* +X80444800Y-111887000D03* +X80444800Y-109347000D03* +X80444800Y-106807000D03* +D23* +X113795000Y-124307600D03* +D24* +X111255000Y-124307600D03* +X113795000Y-121767600D03* +X111255000Y-121767600D03* +D17* +X105918000Y-116840000D03* +D18* +X103378000Y-116840000D03* +D21* +X80444800Y-116967000D03* +D22* +X80444800Y-119507000D03* +X80444800Y-122047000D03* +X80444800Y-124587000D03* +D17* +X113706100Y-118224300D03* +D18* +X111166100Y-118224300D03* +D17* +X103378000Y-119380000D03* +D18* +X103378000Y-121920000D03* +D17* +X90604800Y-106807000D03* +D18* +X88064800Y-106807000D03* +D17* +X90604800Y-104267000D03* +D18* +X88064800Y-104267000D03* +M02* diff --git a/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-Edge.Cuts.gbr b/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-Edge.Cuts.gbr new file mode 100644 index 00000000..6a8dc7fe --- /dev/null +++ b/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-Edge.Cuts.gbr @@ -0,0 +1,21 @@ +G04 #@! TF.FileFunction,Profile,NP* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 24/03/2016 3:42:33 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +G04 APERTURE END LIST* +D10* +X78791260Y-126093220D02* +X116936980Y-126093220D01* +X78783640Y-95196660D02* +X116942060Y-95196660D01* +X78786180Y-126090680D02* +X78786180Y-95201740D01* +X116939800Y-95882000D02* +X116939800Y-95207000D01* +X116939800Y-95882000D02* +X116939800Y-126107000D01* +M02* diff --git a/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-F.Cu.gbr b/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-F.Cu.gbr new file mode 100644 index 00000000..741a10d6 --- /dev/null +++ b/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-F.Cu.gbr @@ -0,0 +1,1495 @@ +G04 #@! TF.FileFunction,Copper,L1,Top,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 24/03/2016 3:42:33 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,0.800000X0.750000*% +%ADD12R,0.750000X0.800000*% +%ADD13C,1.300000*% +%ADD14R,1.300000X1.300000*% +%ADD15C,1.998980*% +%ADD16R,1.998980X1.998980*% +%ADD17R,1.600000X1.000000*% +%ADD18R,1.600000X0.560000*% +%ADD19R,0.560000X1.600000*% +%ADD20R,1.905000X1.905000*% +%ADD21C,1.905000*% +%ADD22R,0.900000X2.500000*% +%ADD23R,2.500000X0.900000*% +%ADD24R,2.032000X2.032000*% +%ADD25O,2.032000X2.032000*% +%ADD26R,1.350000X0.400000*% +%ADD27O,0.950000X1.250000*% +%ADD28O,1.550000X1.000000*% +%ADD29R,2.032000X1.727200*% +%ADD30O,2.032000X1.727200*% +%ADD31R,1.727200X1.727200*% +%ADD32O,1.727200X1.727200*% +%ADD33R,0.600000X0.900000*% +%ADD34R,0.900000X0.500000*% +%ADD35R,0.500000X0.900000*% +%ADD36R,0.900000X0.600000*% +%ADD37R,1.500000X0.600000*% +%ADD38R,0.304800X0.508000*% +%ADD39R,1.600200X2.999740*% +%ADD40R,1.600200X2.600960*% +%ADD41C,0.600000*% +%ADD42C,0.250000*% +%ADD43C,0.635000*% +%ADD44C,1.270000*% +%ADD45C,0.400000*% +G04 APERTURE END LIST* +D10* +X108411229Y-125110571D02* +X108839800Y-125110571D01* +X108925514Y-125139143D01* +X108982657Y-125196286D01* +X109011229Y-125282000D01* +X109011229Y-125339143D01* +X108696943Y-124824857D02* +X108696943Y-124624857D01* +X109011229Y-124539143D02* +X109011229Y-124824857D01* +X108411229Y-124824857D01* +X108411229Y-124539143D01* +X109011229Y-124282000D02* +X108411229Y-124282000D01* +X109011229Y-123939143D01* +X108411229Y-123939143D01* +X108411229Y-123282000D02* +X108411229Y-122939143D01* +X109011229Y-123110572D02* +X108411229Y-123110572D01* +X109011229Y-122739143D02* +X108411229Y-122739143D01* +X109011229Y-122453429D02* +X108411229Y-122453429D01* +X109011229Y-122110572D01* +X108411229Y-122110572D01* +X108725514Y-121710572D02* +X109011229Y-121710572D01* +X108411229Y-121910572D02* +X108725514Y-121710572D01* +X108411229Y-121510572D01* +X109011229Y-121024858D02* +X109011229Y-121310572D01* +X108411229Y-121310572D01* +X108839800Y-120853429D02* +X108839800Y-120567715D01* +X109011229Y-120910572D02* +X108411229Y-120710572D01* +X109011229Y-120510572D01* +X108696943Y-120110572D02* +X108725514Y-120024858D01* +X108754086Y-119996286D01* +X108811229Y-119967715D01* +X108896943Y-119967715D01* +X108954086Y-119996286D01* +X108982657Y-120024858D01* +X109011229Y-120082000D01* +X109011229Y-120310572D01* +X108411229Y-120310572D01* +X108411229Y-120110572D01* +X108439800Y-120053429D01* +X108468371Y-120024858D01* +X108525514Y-119996286D01* +X108582657Y-119996286D01* +X108639800Y-120024858D01* +X108668371Y-120053429D01* +X108696943Y-120110572D01* +X108696943Y-120310572D01* +X108411229Y-119339143D02* +X109011229Y-119139143D01* +X108411229Y-118939143D01* +X108611229Y-118482000D02* +X109011229Y-118482000D01* +X108382657Y-118624857D02* +X108811229Y-118767714D01* +X108811229Y-118396286D01* +X108782657Y-117710571D02* +X108782657Y-117253428D01* +X109011229Y-116510571D02* +X108411229Y-116510571D01* +X108411229Y-116367714D01* +X108439800Y-116281999D01* +X108496943Y-116224857D01* +X108554086Y-116196285D01* +X108668371Y-116167714D01* +X108754086Y-116167714D01* +X108868371Y-116196285D01* +X108925514Y-116224857D01* +X108982657Y-116281999D01* +X109011229Y-116367714D01* +X109011229Y-116510571D01* +X108696943Y-115910571D02* +X108696943Y-115710571D01* +X109011229Y-115624857D02* +X109011229Y-115910571D01* +X108411229Y-115910571D01* +X108411229Y-115624857D01* +X108696943Y-114910571D02* +X108696943Y-114710571D01* +X109011229Y-114624857D02* +X109011229Y-114910571D01* +X108411229Y-114910571D01* +X108411229Y-114624857D01* +X108982657Y-114396285D02* +X109011229Y-114310571D01* +X109011229Y-114167714D01* +X108982657Y-114110571D01* +X108954086Y-114082000D01* +X108896943Y-114053428D01* +X108839800Y-114053428D01* +X108782657Y-114082000D01* +X108754086Y-114110571D01* +X108725514Y-114167714D01* +X108696943Y-114282000D01* +X108668371Y-114339142D01* +X108639800Y-114367714D01* +X108582657Y-114396285D01* +X108525514Y-114396285D01* +X108468371Y-114367714D01* +X108439800Y-114339142D01* +X108411229Y-114282000D01* +X108411229Y-114139142D01* +X108439800Y-114053428D01* +X109011229Y-113796285D02* +X108411229Y-113796285D01* +X108411229Y-113567713D01* +X108439800Y-113510571D01* +X108468371Y-113481999D01* +X108525514Y-113453428D01* +X108611229Y-113453428D01* +X108668371Y-113481999D01* +X108696943Y-113510571D01* +X108725514Y-113567713D01* +X108725514Y-113796285D01* +X108411229Y-113081999D02* +X108411229Y-112967713D01* +X108439800Y-112910571D01* +X108496943Y-112853428D01* +X108611229Y-112824856D01* +X108811229Y-112824856D01* +X108925514Y-112853428D01* +X108982657Y-112910571D01* +X109011229Y-112967713D01* +X109011229Y-113081999D01* +X108982657Y-113139142D01* +X108925514Y-113196285D01* +X108811229Y-113224856D01* +X108611229Y-113224856D01* +X108496943Y-113196285D01* +X108439800Y-113139142D01* +X108411229Y-113081999D01* +X108954086Y-112224857D02* +X108982657Y-112253428D01* +X109011229Y-112339142D01* +X109011229Y-112396285D01* +X108982657Y-112482000D01* +X108925514Y-112539142D01* +X108868371Y-112567714D01* +X108754086Y-112596285D01* +X108668371Y-112596285D01* +X108554086Y-112567714D01* +X108496943Y-112539142D01* +X108439800Y-112482000D01* +X108411229Y-112396285D01* +X108411229Y-112339142D01* +X108439800Y-112253428D01* +X108468371Y-112224857D01* +X108268371Y-112482000D02* +X108182657Y-112367714D01* +X108268371Y-112253428D01* +X108411229Y-111796285D02* +X108839800Y-111796285D01* +X108925514Y-111824857D01* +X108982657Y-111882000D01* +X109011229Y-111967714D01* +X109011229Y-112024857D01* +X108839800Y-111539142D02* +X108839800Y-111253428D01* +X109011229Y-111596285D02* +X108411229Y-111396285D01* +X109011229Y-111196285D01* +D11* +X106795000Y-122555000D03* +X105295000Y-122555000D03* +X106795000Y-118745000D03* +X105295000Y-118745000D03* +D12* +X114887200Y-107633200D03* +X114887200Y-106133200D03* +D11* +X114213400Y-109029500D03* +X115713400Y-109029500D03* +D12* +X104521000Y-114351500D03* +X104521000Y-112851500D03* +D11* +X95238000Y-115316000D03* +X93738000Y-115316000D03* +X102604000Y-111760000D03* +X101104000Y-111760000D03* +D12* +X86360000Y-98945000D03* +X86360000Y-100445000D03* +X95059500Y-107557000D03* +X95059500Y-106057000D03* +X82423000Y-118098000D03* +X82423000Y-116598000D03* +X82550000Y-124956000D03* +X82550000Y-123456000D03* +D13* +X87670000Y-111760000D03* +D14* +X90170000Y-111760000D03* +D12* +X92456000Y-113804000D03* +X92456000Y-115304000D03* +D15* +X93342460Y-96520000D03* +D16* +X93342460Y-106680000D03* +D17* +X93345000Y-103100000D03* +X93345000Y-100100000D03* +D18* +X108720000Y-108140000D03* +X108720000Y-107340000D03* +X108720000Y-106540000D03* +X108720000Y-105740000D03* +X108720000Y-104940000D03* +X108720000Y-104140000D03* +X108720000Y-103340000D03* +X108720000Y-102540000D03* +X108720000Y-101740000D03* +X108720000Y-100940000D03* +X108720000Y-100140000D03* +D19* +X106870000Y-98290000D03* +X106070000Y-98290000D03* +X105270000Y-98290000D03* +X104470000Y-98290000D03* +X103670000Y-98290000D03* +X102870000Y-98290000D03* +X102070000Y-98290000D03* +X101270000Y-98290000D03* +X100470000Y-98290000D03* +X99670000Y-98290000D03* +X98870000Y-98290000D03* +D18* +X97020000Y-100140000D03* +X97020000Y-100940000D03* +X97020000Y-101740000D03* +X97020000Y-102540000D03* +X97020000Y-103340000D03* +X97020000Y-104140000D03* +X97020000Y-104940000D03* +X97020000Y-105740000D03* +X97020000Y-106540000D03* +X97020000Y-107340000D03* +X97020000Y-108140000D03* +D19* +X98870000Y-109990000D03* +X99670000Y-109990000D03* +X100470000Y-109990000D03* +X101270000Y-109990000D03* +X102070000Y-109990000D03* +X102870000Y-109990000D03* +X103670000Y-109990000D03* +X104470000Y-109990000D03* +X105270000Y-109990000D03* +X106070000Y-109990000D03* +X106870000Y-109990000D03* +D20* +X80444800Y-97917000D03* +D21* +X80444800Y-102997000D03* +D22* +X96721000Y-112649000D03* +X99621000Y-112649000D03* +D23* +X93980000Y-112321000D03* +X93980000Y-109421000D03* +D24* +X105918000Y-124460000D03* +D25* +X103378000Y-124460000D03* +D26* +X111340460Y-101910300D03* +X111340460Y-101260300D03* +X111340460Y-100610300D03* +X111340460Y-99960300D03* +X111340460Y-99310300D03* +D27* +X111340460Y-103110300D03* +X111340460Y-98110300D03* +D28* +X114040460Y-104110300D03* +X114040460Y-97110300D03* +D29* +X80444800Y-114427000D03* +D30* +X80444800Y-111887000D03* +X80444800Y-109347000D03* +X80444800Y-106807000D03* +D31* +X113795000Y-124307600D03* +D32* +X111255000Y-124307600D03* +X113795000Y-121767600D03* +X111255000Y-121767600D03* +D24* +X105918000Y-116840000D03* +D25* +X103378000Y-116840000D03* +D29* +X80444800Y-116967000D03* +D30* +X80444800Y-119507000D03* +X80444800Y-122047000D03* +X80444800Y-124587000D03* +D24* +X113706100Y-118224300D03* +D25* +X111166100Y-118224300D03* +D24* +X103378000Y-119380000D03* +D25* +X103378000Y-121920000D03* +D33* +X96139000Y-96136000D03* +X97089000Y-98936000D03* +X95189000Y-98936000D03* +D34* +X99060000Y-122670000D03* +X99060000Y-121170000D03* +X99060000Y-118566500D03* +X99060000Y-120066500D03* +X100647500Y-122670000D03* +X100647500Y-121170000D03* +X100647500Y-120066500D03* +X100647500Y-118566500D03* +D35* +X105676000Y-114300000D03* +X107176000Y-114300000D03* +X105676000Y-112903000D03* +X107176000Y-112903000D03* +D34* +X82550000Y-105930000D03* +X82550000Y-107430000D03* +X82550000Y-108470000D03* +X82550000Y-109970000D03* +X82550000Y-111010000D03* +X82550000Y-112510000D03* +X82550000Y-113550000D03* +X82550000Y-115050000D03* +X84328000Y-107430000D03* +X84328000Y-105930000D03* +X84328000Y-109970000D03* +X84328000Y-108470000D03* +X84328000Y-112510000D03* +X84328000Y-111010000D03* +X84328000Y-115050000D03* +X84328000Y-113550000D03* +X89395300Y-123570300D03* +X89395300Y-125070300D03* +X87871300Y-123570300D03* +X87871300Y-125070300D03* +X89281000Y-117971000D03* +X89281000Y-116471000D03* +X87630000Y-117971000D03* +X87630000Y-116471000D03* +D35* +X86372000Y-119634000D03* +X87872000Y-119634000D03* +X86372000Y-121920000D03* +X87872000Y-121920000D03* +X98818000Y-124079000D03* +X100318000Y-124079000D03* +D34* +X84455000Y-117971000D03* +X84455000Y-116471000D03* +X84709000Y-123583000D03* +X84709000Y-125083000D03* +D35* +X83324000Y-119634000D03* +X84824000Y-119634000D03* +X83324000Y-121920000D03* +X84824000Y-121920000D03* +X85332000Y-102946200D03* +X83832000Y-102946200D03* +X83832000Y-104546400D03* +X85332000Y-104546400D03* +X100318000Y-116840000D03* +X98818000Y-116840000D03* +D34* +X85979000Y-116471000D03* +X85979000Y-117971000D03* +X86233000Y-123583000D03* +X86233000Y-125083000D03* +D36* +X113464800Y-106807000D03* +X110664800Y-107757000D03* +X110664800Y-105857000D03* +D37* +X97213400Y-124485400D03* +X97213400Y-123215400D03* +X97213400Y-121945400D03* +X97213400Y-120675400D03* +X97213400Y-119405400D03* +X97213400Y-118135400D03* +X97213400Y-116865400D03* +X91813400Y-116865400D03* +X91813400Y-118135400D03* +X91813400Y-119405400D03* +X91813400Y-120675400D03* +X91813400Y-121945400D03* +X91813400Y-123215400D03* +X91813400Y-124485400D03* +D38* +X90195400Y-119710200D03* +X88925400Y-119710200D03* +X90195400Y-121742200D03* +X89560400Y-119710200D03* +X88925400Y-121742200D03* +X89560400Y-121742200D03* +X108140500Y-98488500D03* +X109410500Y-98488500D03* +X108140500Y-96456500D03* +X108775500Y-98488500D03* +X109410500Y-96456500D03* +X108775500Y-96456500D03* +D39* +X112448800Y-114696240D03* +X112448800Y-110296960D03* +D40* +X89535000Y-97259140D03* +X89535000Y-100860860D03* +D24* +X90604800Y-106807000D03* +D25* +X88064800Y-106807000D03* +D24* +X90604800Y-104267000D03* +D25* +X88064800Y-104267000D03* +D41* +X112588500Y-101955600D03* +X91328700Y-98298000D03* +X112464800Y-107982000D03* +X105123440Y-112872520D03* +X101886498Y-113662460D03* +X111623300Y-106781600D03* +X103261620Y-108000800D03* +X102108000Y-99631500D03* +X105283000Y-99631500D03* +X94488000Y-123698000D03* +X99822000Y-115887500D03* +X85623400Y-120980200D03* +X85572600Y-105791000D03* +X110670800Y-113271300D03* +X98008900Y-115062000D03* +X114645900Y-115150900D03* +X90805000Y-101757598D03* +X107462780Y-108071920D03* +X104455420Y-104861360D03* +X98918220Y-99969320D03* +X87691420Y-101833680D03* +X103342900Y-112852200D03* +X98542300Y-113715800D03* +X107020820Y-105272840D03* +X90376200Y-118778020D03* +X106304540Y-103946960D03* +X89202720Y-122577860D03* +X105524760Y-103398320D03* +X93401340Y-116707920D03* +X104518920Y-104061260D03* +X93508020Y-121406920D03* +X99685300Y-102095300D03* +X110061200Y-101574600D03* +X110200900Y-100622100D03* +X98580400Y-103251000D03* +X95504000Y-104203500D03* +X91503500Y-108140500D03* +X95567500Y-105283000D03* +X91821000Y-108966000D03* +X96500140Y-109118400D03* +X86357920Y-114985800D03* +X107914800Y-115332000D03* +X107889800Y-111582000D03* +X98314800Y-111907000D03* +X101289800Y-108132000D03* +X109514800Y-111107000D03* +X109439800Y-115332000D03* +X104397000Y-111544100D03* +X95697500Y-121462800D03* +X107124500Y-115125500D03* +X101790500Y-119888000D03* +X110378700Y-96428560D03* +X110134860Y-97434400D03* +X90500200Y-122605800D03* +X90474800Y-124256800D03* +X88976200Y-118872000D03* +X90449400Y-116586000D03* +X90678000Y-125095000D03* +X86918800Y-125120400D03* +D42* +X99060000Y-121170000D02* +X99060000Y-121412000D01* +X99060000Y-121412000D02* +X99568000Y-121920000D01* +X99568000Y-121920000D02* +X101473000Y-121920000D01* +X101473000Y-121920000D02* +X101854000Y-122301000D01* +X101854000Y-122301000D02* +X101854000Y-122936000D01* +X101854000Y-122936000D02* +X103378000Y-124460000D01* +D43* +X106795000Y-122555000D02* +X106795000Y-123583000D01* +X105918000Y-124460000D02* +X103378000Y-124460000D01* +X106795000Y-123583000D02* +X105918000Y-124460000D01* +X104660000Y-121920000D02* +X105295000Y-122555000D01* +X103378000Y-121920000D02* +X104660000Y-121920000D01* +D42* +X99060000Y-120066500D02* +X99135500Y-120066500D01* +X99135500Y-120066500D02* +X99822000Y-119380000D01* +X99822000Y-119380000D02* +X101346000Y-119380000D01* +X101346000Y-119380000D02* +X101981000Y-118745000D01* +X101981000Y-118745000D02* +X101981000Y-117221000D01* +X101981000Y-117221000D02* +X102362000Y-116840000D01* +X102362000Y-116840000D02* +X103378000Y-116840000D01* +D43* +X106795000Y-118745000D02* +X106795000Y-117717000D01* +X106795000Y-117717000D02* +X105918000Y-116840000D01* +X105918000Y-116840000D02* +X103378000Y-116840000D01* +X104660000Y-119380000D02* +X105295000Y-118745000D01* +X103378000Y-119380000D02* +X104660000Y-119380000D01* +X89535000Y-97259140D02* +X90289840Y-97259140D01* +D44* +X90289840Y-97259140D02* +X91328700Y-98298000D01* +D43* +X112543200Y-101910300D02* +X112530500Y-101910300D01* +X112588500Y-101955600D02* +X112543200Y-101910300D01* +D45* +X113464800Y-106807000D02* +X113464800Y-107315000D01* +X113783000Y-107633200D02* +X114887200Y-107633200D01* +X113464800Y-107315000D02* +X113783000Y-107633200D01* +X111340460Y-101910300D02* +X112530500Y-101910300D01* +X113464800Y-105765600D02* +X113464800Y-106807000D01* +X112677400Y-104978200D02* +X113464800Y-105765600D01* +X112677400Y-102057200D02* +X112677400Y-104978200D01* +X112530500Y-101910300D02* +X112677400Y-102057200D01* +D44* +X86360000Y-98945000D02* +X87849140Y-98945000D01* +X87849140Y-98945000D02* +X89535000Y-97259140D01* +X80391000Y-102870000D02* +X84316000Y-98945000D01* +X84316000Y-98945000D02* +X86360000Y-98945000D01* +X112448800Y-107982000D02* +X112448800Y-110296960D01* +X112464800Y-107982000D02* +X112448800Y-107982000D01* +D43* +X99822000Y-115887500D02* +X99822000Y-115547600D01* +X101707140Y-113662460D02* +X101886498Y-113662460D01* +X99822000Y-115547600D02* +X101707140Y-113662460D01* +X105123440Y-112872520D02* +X105123440Y-112851500D01* +X105123440Y-112851500D02* +X105123440Y-112872520D01* +X105123440Y-112872520D02* +X105123440Y-112851500D01* +X114040460Y-104110300D02* +X114040460Y-97110300D01* +X111340460Y-98110300D02* +X113040460Y-98110300D01* +X113040460Y-98110300D02* +X114040460Y-97110300D01* +X97020000Y-105740000D02* +X100182940Y-105740000D01* +X102443740Y-108000800D02* +X102507240Y-108000800D01* +X100182940Y-105740000D02* +X102443740Y-108000800D01* +X102070000Y-109990000D02* +X102070000Y-108438040D01* +X102070000Y-108438040D02* +X102507240Y-108000800D01* +X102507240Y-108000800D02* +X103261620Y-108000800D01* +X111623300Y-106781600D02* +X111606350Y-106798550D01* +X111606350Y-106798550D02* +X111623300Y-106781600D01* +X111623300Y-106781600D02* +X111623300Y-106815500D01* +D45* +X113795000Y-121767600D02* +X113795000Y-121742200D01* +X113795000Y-121742200D02* +X115713400Y-119823800D01* +X115713400Y-119823800D02* +X115713400Y-109029500D01* +D43* +X114887200Y-106133200D02* +X115458000Y-106133200D01* +X116119100Y-108623800D02* +X115713400Y-109029500D01* +X116119100Y-106794300D02* +X116119100Y-108623800D01* +X115458000Y-106133200D02* +X116119100Y-106794300D01* +X112448800Y-110296960D02* +X112448800Y-107641000D01* +X112448800Y-107641000D02* +X111623300Y-106815500D01* +X111623300Y-106815500D02* +X110664800Y-105857000D01* +D44* +X110664800Y-105857000D02* +X110664800Y-103785960D01* +X110664800Y-103785960D02* +X111340460Y-103110300D01* +D45* +X111340460Y-99310300D02* +X111340460Y-98110300D01* +X114887200Y-106133200D02* +X114887200Y-104957040D01* +X114887200Y-104957040D02* +X114040460Y-104110300D01* +D42* +X95059500Y-106057000D02* +X95695200Y-106057000D01* +X96012200Y-105740000D02* +X97020000Y-105740000D01* +X95695200Y-106057000D02* +X96012200Y-105740000D01* +D45* +X105270000Y-98290000D02* +X105270000Y-99618500D01* +X102070000Y-99593500D02* +X102070000Y-98290000D01* +X102108000Y-99631500D02* +X102070000Y-99593500D01* +X105270000Y-99618500D02* +X105283000Y-99631500D01* +D43* +X93738000Y-120003000D02* +X93801500Y-120003000D01* +X93738000Y-115836000D02* +X93738000Y-115316000D01* +X94402998Y-116500998D02* +X93738000Y-115836000D01* +X94402998Y-119401502D02* +X94402998Y-116500998D01* +X93801500Y-120003000D02* +X94402998Y-119401502D01* +D42* +X108140500Y-98488500D02* +X107950000Y-98488500D01* +X105270000Y-97295000D02* +X105270000Y-98290000D01* +X105600500Y-96964500D02* +X105270000Y-97295000D01* +X107442000Y-96964500D02* +X105600500Y-96964500D01* +X107632500Y-97155000D02* +X107442000Y-96964500D01* +X107632500Y-98171000D02* +X107632500Y-97155000D01* +X107950000Y-98488500D02* +X107632500Y-98171000D01* +X108140500Y-98488500D02* +X108140500Y-98107500D01* +X109410500Y-97028000D02* +X109410500Y-96456500D01* +X109156500Y-97282000D02* +X109410500Y-97028000D01* +X108966000Y-97282000D02* +X109156500Y-97282000D01* +X108140500Y-98107500D02* +X108966000Y-97282000D01* +X101104000Y-111760000D02* +X101219000Y-111760000D01* +X101219000Y-111760000D02* +X102070000Y-110909000D01* +X102070000Y-110909000D02* +X102070000Y-109990000D01* +X95059500Y-106057000D02* +X95059500Y-105918000D01* +X95059500Y-105918000D02* +X94742000Y-105600500D01* +D43* +X93789500Y-104711500D02* +X94107000Y-104711500D01* +X94107000Y-104711500D02* +X94678500Y-105283000D01* +D45* +X93853000Y-104711500D02* +X93789500Y-104711500D01* +X94107000Y-104711500D02* +X94678500Y-105283000D01* +D44* +X93345000Y-103100000D02* +X93345000Y-104203500D01* +X93345000Y-104203500D02* +X93853000Y-104711500D01* +D42* +X95059500Y-106057000D02* +X95059500Y-105664000D01* +X95059500Y-105664000D02* +X94678500Y-105283000D01* +X94678500Y-105283000D02* +X94107000Y-104711500D01* +X93853000Y-104711500D02* +X93345000Y-104203500D01* +D43* +X104521000Y-112851500D02* +X105123440Y-112851500D01* +X105123440Y-112851500D02* +X105624500Y-112851500D01* +X105624500Y-112851500D02* +X105676000Y-112903000D01* +X100318000Y-116840000D02* +X100318000Y-116193000D01* +X94488000Y-123698000D02* +X94361000Y-123698000D01* +X100318000Y-116193000D02* +X99822000Y-115887500D01* +X100318000Y-124079000D02* +X100318000Y-124726000D01* +X94361000Y-120626000D02* +X93738000Y-120003000D01* +X94361000Y-123698000D02* +X94361000Y-120626000D01* +X96012000Y-125349000D02* +X94361000Y-123698000D01* +X99695000Y-125349000D02* +X96012000Y-125349000D01* +X100318000Y-124726000D02* +X99695000Y-125349000D01* +X91813400Y-120675400D02* +X93065600Y-120675400D01* +X93065600Y-120675400D02* +X93738000Y-120003000D01* +D42* +X85332000Y-104546400D02* +X85332000Y-105550400D01* +X85623400Y-120980200D02* +X85623400Y-120954800D01* +X85332000Y-105550400D02* +X85572600Y-105791000D01* +X91813400Y-120675400D02* +X89738200Y-120675400D01* +X89712800Y-120700800D02* +X89712800Y-120726200D01* +X89738200Y-120675400D02* +X89712800Y-120700800D01* +X88366600Y-120954800D02* +X89484200Y-120954800D01* +X90195400Y-120243600D02* +X90195400Y-119710200D01* +X89484200Y-120954800D02* +X89712800Y-120726200D01* +X89712800Y-120726200D02* +X90195400Y-120243600D01* +X88925400Y-121742200D02* +X88925400Y-121513600D01* +X88925400Y-121513600D02* +X88366600Y-120954800D01* +X88366600Y-120954800D02* +X85623400Y-120954800D01* +X86233000Y-123367800D02* +X85623400Y-122758200D01* +X85979000Y-118338600D02* +X85979000Y-117971000D01* +X85623400Y-118694200D02* +X85979000Y-118338600D01* +X85623400Y-122758200D02* +X85623400Y-120954800D01* +X85623400Y-120954800D02* +X85623400Y-118694200D01* +X86233000Y-123583000D02* +X86233000Y-123367800D01* +D43* +X96721000Y-112649000D02* +X96721000Y-114231300D01* +X110664800Y-113265300D02* +X110664800Y-112912240D01* +X110670800Y-113271300D02* +X110664800Y-113265300D01* +X97551700Y-115062000D02* +X98008900Y-115062000D01* +X96721000Y-114231300D02* +X97551700Y-115062000D01* +D45* +X114645900Y-115150900D02* +X113364470Y-113869470D01* +X113364470Y-113869470D02* +X113364470Y-113780570D01* +D44* +X114213400Y-109029500D02* +X114213400Y-112931640D01* +X114213400Y-112931640D02* +X113364470Y-113780570D01* +X113364470Y-113780570D02* +X112448800Y-114696240D01* +X110664800Y-107757000D02* +X110664800Y-112912240D01* +X110664800Y-112912240D02* +X112448800Y-114696240D01* +D42* +X96721000Y-112649000D02* +X96721000Y-110797000D01* +X98031000Y-106540000D02* +X97020000Y-106540000D01* +X98171000Y-106680000D02* +X98031000Y-106540000D01* +X98171000Y-109347000D02* +X98171000Y-106680000D01* +X96721000Y-110797000D02* +X98171000Y-109347000D01* +X97020000Y-106540000D02* +X95961500Y-106540000D01* +X95961500Y-106540000D02* +X95059500Y-107442000D01* +X95059500Y-107442000D02* +X95059500Y-107557000D01* +D45* +X99621000Y-112649000D02* +X102604000Y-112649000D01* +X102604000Y-112649000D02* +X102362000Y-112649000D01* +X104521000Y-114351500D02* +X103239000Y-114351500D01* +X102604000Y-113716500D02* +X102604000Y-111760000D01* +X103239000Y-114351500D02* +X102604000Y-113716500D01* +D42* +X102604000Y-111760000D02* +X102604000Y-111454500D01* +X102604000Y-111454500D02* +X102870000Y-111188500D01* +X102870000Y-111188500D02* +X102870000Y-109990000D01* +X102362000Y-112649000D02* +X102604000Y-112407000D01* +X102604000Y-112407000D02* +X102604000Y-111760000D01* +D43* +X104521000Y-114351500D02* +X105624500Y-114351500D01* +X105624500Y-114351500D02* +X105676000Y-114300000D01* +X97213400Y-120675400D02* +X95973900Y-120675400D01* +X95238000Y-119939500D02* +X95238000Y-115316000D01* +X95973900Y-120675400D02* +X95238000Y-119939500D01* +D44* +X93980000Y-112321000D02* +X93980000Y-112649000D01* +X93980000Y-112649000D02* +X95238000Y-113907000D01* +X95238000Y-113907000D02* +X95238000Y-115316000D01* +D43* +X93345000Y-100100000D02* +X93345000Y-98933000D01* +X97089000Y-98359000D02* +X97089000Y-98936000D01* +X96520000Y-97790000D02* +X97089000Y-98359000D01* +X94488000Y-97790000D02* +X96520000Y-97790000D01* +X93345000Y-98933000D02* +X94488000Y-97790000D01* +D44* +X93345000Y-100100000D02* +X90295860Y-100100000D01* +X90295860Y-100100000D02* +X89535000Y-100860860D01* +X86360000Y-100445000D02* +X89119140Y-100445000D01* +X89119140Y-100445000D02* +X89535000Y-100860860D01* +D43* +X92456000Y-115304000D02* +X91428000Y-115304000D01* +X90424000Y-115062000D02* +X87670000Y-112308000D01* +X91186000Y-115062000D02* +X90424000Y-115062000D01* +X91428000Y-115304000D02* +X91186000Y-115062000D01* +X87670000Y-112308000D02* +X87670000Y-111760000D01* +D44* +X89535000Y-100860860D02* +X89908262Y-100860860D01* +X89908262Y-100860860D02* +X90805000Y-101757598D01* +D42* +X90170000Y-106172000D02* +X91592400Y-104749600D01* +X91592400Y-104749600D02* +X91592400Y-103454200D01* +X91592400Y-103454200D02* +X90855800Y-102717600D01* +X90855800Y-102717600D02* +X85699600Y-102717600D01* +X81141000Y-119380000D02* +X82423000Y-118098000D01* +X80010000Y-119380000D02* +X81141000Y-119380000D01* +X83286600Y-117041800D02* +X83286600Y-119596600D01* +X82842800Y-116598000D02* +X83286600Y-117041800D01* +X82423000Y-116598000D02* +X82842800Y-116598000D01* +X83286600Y-119596600D02* +X83324000Y-119634000D01* +X80010000Y-116840000D02* +X82181000Y-116840000D01* +X82181000Y-116840000D02* +X82423000Y-116598000D01* +X80010000Y-124460000D02* +X80797400Y-124460000D01* +X80797400Y-124460000D02* +X81293400Y-124956000D01* +X81293400Y-124956000D02* +X82550000Y-124956000D01* +X83324000Y-121920000D02* +X83324000Y-122682000D01* +X83324000Y-122682000D02* +X82550000Y-123456000D01* +X80010000Y-121920000D02* +X83324000Y-121920000D01* +X85699600Y-102717600D02* +X85471000Y-102946200D01* +X85471000Y-102946200D02* +X85332000Y-102946200D01* +D44* +X93980000Y-109421000D02* +X93980000Y-109220000D01* +X93980000Y-109220000D02* +X93342460Y-108582460D01* +X93342460Y-108582460D02* +X93342460Y-106680000D01* +X92456000Y-113804000D02* +X90944000Y-113804000D01* +X90170000Y-113030000D02* +X90170000Y-111760000D01* +X90944000Y-113804000D02* +X90170000Y-113030000D01* +D42* +X90170000Y-106680000D02* +X90170000Y-106172000D01* +D43* +X96139000Y-96136000D02* +X93726460Y-96136000D01* +X93726460Y-96136000D02* +X93342460Y-96520000D01* +D42* +X83832000Y-102946200D02* +X83832000Y-102482540D01* +X107530860Y-108140000D02* +X108720000Y-108140000D01* +X107462780Y-108071920D02* +X107530860Y-108140000D01* +X103810260Y-104861360D02* +X104455420Y-104861360D01* +X98918220Y-99969320D02* +X103810260Y-104861360D01* +X84480860Y-101833680D02* +X87691420Y-101833680D01* +X83832000Y-102482540D02* +X84480860Y-101833680D01* +D43* +X83832000Y-104546400D02* +X83832000Y-102946200D01* +D42* +X98818000Y-116840000D02* +X98818000Y-114740800D01* +X103673100Y-112522000D02* +X103673100Y-109993100D01* +X103342900Y-112852200D02* +X103673100Y-112522000D01* +X98288300Y-113969800D02* +X98542300Y-113715800D01* +X98288300Y-114211100D02* +X98288300Y-113969800D01* +X98818000Y-114740800D02* +X98288300Y-114211100D01* +X103673100Y-109993100D02* +X103670000Y-109990000D01* +D45* +X103670000Y-109990000D02* +X103670000Y-108610500D01* +X103670000Y-108610500D02* +X104940500Y-107340000D01* +X104940500Y-107340000D02* +X108720000Y-107340000D01* +X103695500Y-110015500D02* +X103670000Y-109990000D01* +X98818000Y-116840000D02* +X97238800Y-116840000D01* +X97238800Y-116840000D02* +X97213400Y-116865400D01* +D43* +X97213400Y-118135400D02* +X97213400Y-116865400D01* +D42* +X89560400Y-119710200D02* +X89560400Y-119311880D01* +X107422140Y-105674160D02* +X108654160Y-105674160D01* +X107020820Y-105272840D02* +X107422140Y-105674160D01* +X90094260Y-118778020D02* +X90376200Y-118778020D01* +X89560400Y-119311880D02* +X90094260Y-118778020D01* +X108654160Y-105674160D02* +X108720000Y-105740000D01* +X89560400Y-121742200D02* +X89560400Y-122220180D01* +X107645660Y-104902000D02* +X108682000Y-104902000D01* +X107361180Y-104617520D02* +X107645660Y-104902000D01* +X106975100Y-104617520D02* +X107361180Y-104617520D01* +X106304540Y-103946960D02* +X106975100Y-104617520D01* +X89560400Y-122220180D02* +X89202720Y-122577860D01* +X108682000Y-104902000D02* +X108720000Y-104940000D01* +X91813400Y-119405400D02* +X92613940Y-119405400D01* +X107432300Y-104140000D02* +X108720000Y-104140000D01* +X107307840Y-104015540D02* +X107432300Y-104140000D01* +X107307840Y-103489760D02* +X107307840Y-104015540D01* +X106952240Y-103134160D02* +X107307840Y-103489760D01* +X105788920Y-103134160D02* +X106952240Y-103134160D01* +X105524760Y-103398320D02* +X105788920Y-103134160D01* +X93401340Y-118618000D02* +X93401340Y-116707920D01* +X92613940Y-119405400D02* +X93401340Y-118618000D01* +D45* +X91813400Y-119405400D02* +X92557600Y-119405400D01* +D42* +X91813400Y-121945400D02* +X92969540Y-121945400D01* +X107742180Y-103220520D02* +X108600520Y-103220520D01* +X107122420Y-102600760D02* +X107742180Y-103220520D01* +X105204720Y-102600760D02* +X107122420Y-102600760D01* +X104882140Y-102923340D02* +X105204720Y-102600760D01* +X104882140Y-103698040D02* +X104882140Y-102923340D01* +X104518920Y-104061260D02* +X104882140Y-103698040D01* +X92969540Y-121945400D02* +X93508020Y-121406920D01* +X108600520Y-103220520D02* +X108720000Y-103340000D01* +D45* +X108694500Y-103314500D02* +X108720000Y-103340000D01* +X104470000Y-98290000D02* +X104470000Y-99898000D01* +X106425500Y-100140000D02* +X108720000Y-100140000D01* +X106172000Y-100393500D02* +X106425500Y-100140000D01* +X104965500Y-100393500D02* +X106172000Y-100393500D01* +X104470000Y-99898000D02* +X104965500Y-100393500D01* +D42* +X109410500Y-98488500D02* +X109410500Y-98806000D01* +X107767000Y-99187000D02* +X106870000Y-98290000D01* +X109029500Y-99187000D02* +X107767000Y-99187000D01* +X109410500Y-98806000D02* +X109029500Y-99187000D01* +X108140500Y-96456500D02* +X103568500Y-96456500D01* +X102870000Y-97155000D02* +X102870000Y-98290000D01* +X103568500Y-96456500D02* +X102870000Y-97155000D01* +D43* +X95189000Y-98936000D02* +X95189000Y-100142000D01* +X95987000Y-100940000D02* +X97020000Y-100940000D01* +X95189000Y-100142000D02* +X95987000Y-100940000D01* +D45* +X111340460Y-101260300D02* +X110540600Y-101260300D01* +X99240600Y-102540000D02* +X97020000Y-102540000D01* +X99685300Y-102095300D02* +X99240600Y-102540000D01* +X110226300Y-101574600D02* +X110061200Y-101574600D01* +X110540600Y-101260300D02* +X110226300Y-101574600D01* +X110212700Y-100610300D02* +X111340460Y-100610300D01* +X110200900Y-100622100D02* +X110212700Y-100610300D01* +X98491400Y-103340000D02* +X98580400Y-103251000D01* +X97020000Y-103340000D02* +X98491400Y-103340000D01* +D42* +X84328000Y-107430000D02* +X85776500Y-107430000D01* +X95567500Y-104140000D02* +X97020000Y-104140000D01* +X95504000Y-104203500D02* +X95567500Y-104140000D01* +X86487000Y-108140500D02* +X91503500Y-108140500D01* +X85776500Y-107430000D02* +X86487000Y-108140500D01* +X84328000Y-109970000D02* +X90817000Y-109970000D01* +X95910500Y-104940000D02* +X97020000Y-104940000D01* +X95567500Y-105283000D02* +X95910500Y-104940000D01* +X90817000Y-109970000D02* +X91821000Y-108966000D01* +X84328000Y-112510000D02* +X84328000Y-112452002D01* +X84328000Y-112452002D02* +X86226502Y-110553500D01* +X86226502Y-110553500D02* +X95250000Y-110553500D01* +X95250000Y-110553500D02* +X95758000Y-110045500D01* +X95758000Y-110045500D02* +X95758000Y-107505500D01* +X95758000Y-107505500D02* +X95923500Y-107340000D01* +X95923500Y-107340000D02* +X97020000Y-107340000D01* +X84328000Y-115050000D02* +X86293720Y-115050000D01* +X97020000Y-108598540D02* +X97020000Y-108140000D01* +X96500140Y-109118400D02* +X97020000Y-108598540D01* +X86293720Y-115050000D02* +X86357920Y-114985800D01* +X107914800Y-115332000D02* +X107889800Y-115307000D01* +X107889800Y-115307000D02* +X107889800Y-111582000D01* +X98314800Y-111907000D02* +X97989800Y-111582000D01* +X97989800Y-111582000D02* +X97989800Y-110707000D01* +X97989800Y-110707000D02* +X98389800Y-110307000D01* +X98389800Y-110307000D02* +X98553000Y-110307000D01* +X98553000Y-110307000D02* +X98870000Y-109990000D01* +X99670000Y-108401800D02* +X99670000Y-109990000D01* +X99914800Y-108157000D02* +X99670000Y-108401800D01* +X101264800Y-108157000D02* +X99914800Y-108157000D01* +X101289800Y-108132000D02* +X101264800Y-108157000D01* +X109514800Y-115257000D02* +X109514800Y-111107000D01* +X109439800Y-115332000D02* +X109514800Y-115257000D01* +X97213400Y-123215400D02* +X96281700Y-123215400D01* +X105270000Y-110899700D02* +X105270000Y-109990000D01* +X104841500Y-111328200D02* +X105270000Y-110899700D01* +X104612900Y-111328200D02* +X104841500Y-111328200D01* +X104397000Y-111544100D02* +X104612900Y-111328200D01* +X95697500Y-122631200D02* +X95697500Y-121462800D01* +X96281700Y-123215400D02* +X95697500Y-122631200D01* +D45* +X105283000Y-110003000D02* +X105270000Y-109990000D01* +X96997500Y-122999500D02* +X97213400Y-123215400D01* +D43* +X97213400Y-124485400D02* +X98411600Y-124485400D01* +X98411600Y-124485400D02* +X98818000Y-124079000D01* +X97213400Y-123215400D02* +X97213400Y-124485400D01* +D45* +X107176000Y-112903000D02* +X107176000Y-110296000D01* +X107176000Y-110296000D02* +X106870000Y-109990000D01* +X100647500Y-120066500D02* +X101612000Y-120066500D01* +X107176000Y-115074000D02* +X107176000Y-114300000D01* +X107124500Y-115125500D02* +X107176000Y-115074000D01* +X101612000Y-120066500D02* +X101790500Y-119888000D01* +D43* +X107176000Y-112903000D02* +X107176000Y-114300000D01* +X100647500Y-121170000D02* +X100647500Y-120066500D01* +D42* +X82550000Y-115050000D02* +X82182400Y-115050000D01* +X82182400Y-115050000D02* +X81432400Y-114300000D01* +X81432400Y-114300000D02* +X80010000Y-114300000D01* +X82550000Y-112510000D02* +X82385600Y-112510000D01* +X82385600Y-112510000D02* +X81635600Y-111760000D01* +X81635600Y-111760000D02* +X80010000Y-111760000D01* +X82550000Y-109970000D02* +X82309400Y-109970000D01* +X82309400Y-109970000D02* +X81559400Y-109220000D01* +X81559400Y-109220000D02* +X80010000Y-109220000D01* +X82550000Y-107430000D02* +X81318800Y-107430000D01* +X81318800Y-107430000D02* +X80568800Y-106680000D01* +X80568800Y-106680000D02* +X80010000Y-106680000D01* +X108775500Y-96096280D02* +X108775500Y-96456500D01* +X109083300Y-95788480D02* +X108775500Y-96096280D01* +X109784340Y-95788480D02* +X109083300Y-95788480D01* +X109982460Y-95986600D02* +X109784340Y-95788480D01* +X109982460Y-96032320D02* +X109982460Y-95986600D01* +X110378700Y-96428560D02* +X109982460Y-96032320D01* +X108775500Y-98108898D02* +X108775500Y-98488500D01* +X109129958Y-97754440D02* +X108775500Y-98108898D01* +X109814820Y-97754440D02* +X109129958Y-97754440D01* +X110134860Y-97434400D02* +X109814820Y-97754440D01* +D43* +X99060000Y-122670000D02* +X100647500Y-122670000D01* +X97213400Y-121945400D02* +X98335400Y-121945400D01* +X98335400Y-121945400D02* +X99060000Y-122670000D01* +X97213400Y-119405400D02* +X98221100Y-119405400D01* +X98221100Y-119405400D02* +X99060000Y-118566500D01* +X100647500Y-118566500D02* +X99060000Y-118566500D01* +D42* +X82550000Y-105930000D02* +X84328000Y-105930000D01* +X82550000Y-108470000D02* +X84328000Y-108470000D01* +X82550000Y-111010000D02* +X84328000Y-111010000D01* +X82550000Y-113550000D02* +X84328000Y-113550000D01* +X89395300Y-123570300D02* +X90475500Y-123570300D01* +X90830400Y-123215400D02* +X91813400Y-123215400D01* +X90475500Y-123570300D02* +X90830400Y-123215400D01* +X87871300Y-123570300D02* +X87871300Y-121920700D01* +X87871300Y-121920700D02* +X87872000Y-121920000D01* +X87871300Y-123570300D02* +X89395300Y-123570300D01* +X89395300Y-125070300D02* +X89661300Y-125070300D01* +X89661300Y-125070300D02* +X90474800Y-124256800D01* +X90220800Y-122326400D02* +X90220800Y-121767600D01* +X90500200Y-122605800D02* +X90220800Y-122326400D01* +X90220800Y-121767600D02* +X90195400Y-121742200D01* +X87871300Y-125070300D02* +X89395300Y-125070300D01* +X91813400Y-118135400D02* +X90271600Y-118135400D01* +X90107200Y-117971000D02* +X89281000Y-117971000D01* +X90271600Y-118135400D02* +X90107200Y-117971000D01* +X87872000Y-119634000D02* +X87872000Y-118213000D01* +X87872000Y-118213000D02* +X87630000Y-117971000D01* +X87630000Y-117971000D02* +X89281000Y-117971000D01* +X89281000Y-116471000D02* +X90334400Y-116471000D01* +X88925400Y-118922800D02* +X88925400Y-119710200D01* +X88976200Y-118872000D02* +X88925400Y-118922800D01* +X90334400Y-116471000D02* +X90449400Y-116586000D01* +X87630000Y-116471000D02* +X89281000Y-116471000D01* +X85979000Y-116471000D02* +X86195600Y-116471000D01* +X86195600Y-116471000D02* +X86817200Y-115849400D01* +X90805000Y-115849400D02* +X91813400Y-116857800D01* +X86817200Y-115849400D02* +X90805000Y-115849400D01* +X91813400Y-116857800D02* +X91813400Y-116865400D01* +X85979000Y-116471000D02* +X86067200Y-116471000D01* +X86067200Y-116471000D02* +X86791800Y-117195600D01* +X86372000Y-119012400D02* +X86372000Y-119634000D01* +X86512400Y-118872000D02* +X86372000Y-119012400D01* +X86537800Y-118872000D02* +X86512400Y-118872000D01* +X86791800Y-118618000D02* +X86537800Y-118872000D01* +X86791800Y-117195600D02* +X86791800Y-118618000D01* +X84455000Y-116471000D02* +X85979000Y-116471000D01* +X86233000Y-125083000D02* +X86881400Y-125083000D01* +X91305400Y-124993400D02* +X91813400Y-124485400D01* +X90779600Y-124993400D02* +X91305400Y-124993400D01* +X90678000Y-125095000D02* +X90779600Y-124993400D01* +X86881400Y-125083000D02* +X86918800Y-125120400D01* +X86372000Y-121920000D02* +X86372000Y-122516200D01* +X86233000Y-124815600D02* +X86233000Y-125083000D01* +X86436200Y-124612400D02* +X86233000Y-124815600D01* +X86614000Y-124612400D02* +X86436200Y-124612400D01* +X87045800Y-124180600D02* +X86791800Y-124434600D01* +X86791800Y-124434600D02* +X86614000Y-124612400D01* +X87045800Y-123190000D02* +X87045800Y-124180600D01* +X86372000Y-122516200D02* +X87045800Y-123190000D01* +X84709000Y-125083000D02* +X86233000Y-125083000D01* +X84824000Y-119634000D02* +X84824000Y-119037800D01* +X84455000Y-118668800D02* +X84455000Y-117971000D01* +X84824000Y-119037800D02* +X84455000Y-118668800D01* +X84824000Y-121920000D02* +X84824000Y-123468000D01* +X84824000Y-123468000D02* +X84709000Y-123583000D01* +M02* diff --git a/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-F.Mask.gbr b/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-F.Mask.gbr new file mode 100644 index 00000000..1c0c5483 --- /dev/null +++ b/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-F.Mask.gbr @@ -0,0 +1,304 @@ +G04 #@! TF.FileFunction,Soldermask,Top* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 24/03/2016 3:42:33 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,0.800000X0.750000*% +%ADD12R,0.750000X0.800000*% +%ADD13C,1.300000*% +%ADD14R,1.300000X1.300000*% +%ADD15C,1.998980*% +%ADD16R,1.998980X1.998980*% +%ADD17R,1.600000X1.000000*% +%ADD18R,1.600000X0.560000*% +%ADD19R,0.560000X1.600000*% +%ADD20R,1.905000X1.905000*% +%ADD21C,1.905000*% +%ADD22R,0.900000X2.500000*% +%ADD23R,2.500000X0.900000*% +%ADD24R,2.032000X2.032000*% +%ADD25O,2.032000X2.032000*% +%ADD26R,1.350000X0.400000*% +%ADD27O,0.950000X1.250000*% +%ADD28O,1.550000X1.000000*% +%ADD29R,2.032000X1.727200*% +%ADD30O,2.032000X1.727200*% +%ADD31R,1.727200X1.727200*% +%ADD32O,1.727200X1.727200*% +%ADD33R,0.600000X0.900000*% +%ADD34R,0.900000X0.500000*% +%ADD35R,0.500000X0.900000*% +%ADD36R,0.900000X0.600000*% +%ADD37R,1.500000X0.600000*% +%ADD38R,0.304800X0.508000*% +%ADD39R,1.600200X2.999740*% +%ADD40R,1.600200X2.600960*% +G04 APERTURE END LIST* +D10* +D11* +X106795000Y-122555000D03* +X105295000Y-122555000D03* +X106795000Y-118745000D03* +X105295000Y-118745000D03* +D12* +X114887200Y-107633200D03* +X114887200Y-106133200D03* +D11* +X114213400Y-109029500D03* +X115713400Y-109029500D03* +D12* +X104521000Y-114351500D03* +X104521000Y-112851500D03* +D11* +X95238000Y-115316000D03* +X93738000Y-115316000D03* +X102604000Y-111760000D03* +X101104000Y-111760000D03* +D12* +X86360000Y-98945000D03* +X86360000Y-100445000D03* +X95059500Y-107557000D03* +X95059500Y-106057000D03* +X82423000Y-118098000D03* +X82423000Y-116598000D03* +X82550000Y-124956000D03* +X82550000Y-123456000D03* +D13* +X87670000Y-111760000D03* +D14* +X90170000Y-111760000D03* +D12* +X92456000Y-113804000D03* +X92456000Y-115304000D03* +D15* +X93342460Y-96520000D03* +D16* +X93342460Y-106680000D03* +D17* +X93345000Y-103100000D03* +X93345000Y-100100000D03* +D18* +X108720000Y-108140000D03* +X108720000Y-107340000D03* +X108720000Y-106540000D03* +X108720000Y-105740000D03* +X108720000Y-104940000D03* +X108720000Y-104140000D03* +X108720000Y-103340000D03* +X108720000Y-102540000D03* +X108720000Y-101740000D03* +X108720000Y-100940000D03* +X108720000Y-100140000D03* +D19* +X106870000Y-98290000D03* +X106070000Y-98290000D03* +X105270000Y-98290000D03* +X104470000Y-98290000D03* +X103670000Y-98290000D03* +X102870000Y-98290000D03* +X102070000Y-98290000D03* +X101270000Y-98290000D03* +X100470000Y-98290000D03* +X99670000Y-98290000D03* +X98870000Y-98290000D03* +D18* +X97020000Y-100140000D03* +X97020000Y-100940000D03* +X97020000Y-101740000D03* +X97020000Y-102540000D03* +X97020000Y-103340000D03* +X97020000Y-104140000D03* +X97020000Y-104940000D03* +X97020000Y-105740000D03* +X97020000Y-106540000D03* +X97020000Y-107340000D03* +X97020000Y-108140000D03* +D19* +X98870000Y-109990000D03* +X99670000Y-109990000D03* +X100470000Y-109990000D03* +X101270000Y-109990000D03* +X102070000Y-109990000D03* +X102870000Y-109990000D03* +X103670000Y-109990000D03* +X104470000Y-109990000D03* +X105270000Y-109990000D03* +X106070000Y-109990000D03* +X106870000Y-109990000D03* +D20* +X80444800Y-97917000D03* +D21* +X80444800Y-102997000D03* +D22* +X96721000Y-112649000D03* +X99621000Y-112649000D03* +D23* +X93980000Y-112321000D03* +X93980000Y-109421000D03* +D24* +X105918000Y-124460000D03* +D25* +X103378000Y-124460000D03* +D26* +X111340460Y-101910300D03* +X111340460Y-101260300D03* +X111340460Y-100610300D03* +X111340460Y-99960300D03* +X111340460Y-99310300D03* +D27* +X111340460Y-103110300D03* +X111340460Y-98110300D03* +D28* +X114040460Y-104110300D03* +X114040460Y-97110300D03* +D29* +X80444800Y-114427000D03* +D30* +X80444800Y-111887000D03* +X80444800Y-109347000D03* +X80444800Y-106807000D03* +D31* +X113795000Y-124307600D03* +D32* +X111255000Y-124307600D03* +X113795000Y-121767600D03* +X111255000Y-121767600D03* +D24* +X105918000Y-116840000D03* +D25* +X103378000Y-116840000D03* +D29* +X80444800Y-116967000D03* +D30* +X80444800Y-119507000D03* +X80444800Y-122047000D03* +X80444800Y-124587000D03* +D24* +X113706100Y-118224300D03* +D25* +X111166100Y-118224300D03* +D24* +X103378000Y-119380000D03* +D25* +X103378000Y-121920000D03* +D33* +X96139000Y-96136000D03* +X97089000Y-98936000D03* +X95189000Y-98936000D03* +D34* +X99060000Y-122670000D03* +X99060000Y-121170000D03* +X99060000Y-118566500D03* +X99060000Y-120066500D03* +X100647500Y-122670000D03* +X100647500Y-121170000D03* +X100647500Y-120066500D03* +X100647500Y-118566500D03* +D35* +X105676000Y-114300000D03* +X107176000Y-114300000D03* +X105676000Y-112903000D03* +X107176000Y-112903000D03* +D34* +X82550000Y-105930000D03* +X82550000Y-107430000D03* +X82550000Y-108470000D03* +X82550000Y-109970000D03* +X82550000Y-111010000D03* +X82550000Y-112510000D03* +X82550000Y-113550000D03* +X82550000Y-115050000D03* +X84328000Y-107430000D03* +X84328000Y-105930000D03* +X84328000Y-109970000D03* +X84328000Y-108470000D03* +X84328000Y-112510000D03* +X84328000Y-111010000D03* +X84328000Y-115050000D03* +X84328000Y-113550000D03* +X89395300Y-123570300D03* +X89395300Y-125070300D03* +X87871300Y-123570300D03* +X87871300Y-125070300D03* +X89281000Y-117971000D03* +X89281000Y-116471000D03* +X87630000Y-117971000D03* +X87630000Y-116471000D03* +D35* +X86372000Y-119634000D03* +X87872000Y-119634000D03* +X86372000Y-121920000D03* +X87872000Y-121920000D03* +X98818000Y-124079000D03* +X100318000Y-124079000D03* +D34* +X84455000Y-117971000D03* +X84455000Y-116471000D03* +X84709000Y-123583000D03* +X84709000Y-125083000D03* +D35* +X83324000Y-119634000D03* +X84824000Y-119634000D03* +X83324000Y-121920000D03* +X84824000Y-121920000D03* +X85332000Y-102946200D03* +X83832000Y-102946200D03* +X83832000Y-104546400D03* +X85332000Y-104546400D03* +X100318000Y-116840000D03* +X98818000Y-116840000D03* +D34* +X85979000Y-116471000D03* +X85979000Y-117971000D03* +X86233000Y-123583000D03* +X86233000Y-125083000D03* +D36* +X113464800Y-106807000D03* +X110664800Y-107757000D03* +X110664800Y-105857000D03* +D37* +X97213400Y-124485400D03* +X97213400Y-123215400D03* +X97213400Y-121945400D03* +X97213400Y-120675400D03* +X97213400Y-119405400D03* +X97213400Y-118135400D03* +X97213400Y-116865400D03* +X91813400Y-116865400D03* +X91813400Y-118135400D03* +X91813400Y-119405400D03* +X91813400Y-120675400D03* +X91813400Y-121945400D03* +X91813400Y-123215400D03* +X91813400Y-124485400D03* +D38* +X90195400Y-119710200D03* +X88925400Y-119710200D03* +X90195400Y-121742200D03* +X89560400Y-119710200D03* +X88925400Y-121742200D03* +X89560400Y-121742200D03* +X108140500Y-98488500D03* +X109410500Y-98488500D03* +X108140500Y-96456500D03* +X108775500Y-98488500D03* +X109410500Y-96456500D03* +X108775500Y-96456500D03* +D39* +X112448800Y-114696240D03* +X112448800Y-110296960D03* +D40* +X89535000Y-97259140D03* +X89535000Y-100860860D03* +D24* +X90604800Y-106807000D03* +D25* +X88064800Y-106807000D03* +D24* +X90604800Y-104267000D03* +D25* +X88064800Y-104267000D03* +M02* diff --git a/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-F.SilkS.gbr b/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-F.SilkS.gbr new file mode 100644 index 00000000..307bf880 --- /dev/null +++ b/PCB/OUTPUT_V4/Gerber/Tinylab_proto1-F.SilkS.gbr @@ -0,0 +1,2602 @@ +G04 #@! TF.FileFunction,Legend,Top* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 24/03/2016 3:42:33 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11C,0.150000*% +G04 APERTURE END LIST* +D10* +D11* +X106395000Y-123155000D02* +X105695000Y-123155000D01* +X105695000Y-121955000D02* +X106395000Y-121955000D01* +X106395000Y-119345000D02* +X105695000Y-119345000D01* +X105695000Y-118145000D02* +X106395000Y-118145000D01* +X114287200Y-107233200D02* +X114287200Y-106533200D01* +X115487200Y-106533200D02* +X115487200Y-107233200D01* +X114613400Y-108429500D02* +X115313400Y-108429500D01* +X115313400Y-109629500D02* +X114613400Y-109629500D01* +X103921000Y-113951500D02* +X103921000Y-113251500D01* +X105121000Y-113251500D02* +X105121000Y-113951500D01* +X94838000Y-115916000D02* +X94138000Y-115916000D01* +X94138000Y-114716000D02* +X94838000Y-114716000D01* +X102204000Y-112360000D02* +X101504000Y-112360000D01* +X101504000Y-111160000D02* +X102204000Y-111160000D01* +X86960000Y-99345000D02* +X86960000Y-100045000D01* +X85760000Y-100045000D02* +X85760000Y-99345000D01* +X94459500Y-107157000D02* +X94459500Y-106457000D01* +X95659500Y-106457000D02* +X95659500Y-107157000D01* +X81823000Y-117698000D02* +X81823000Y-116998000D01* +X83023000Y-116998000D02* +X83023000Y-117698000D01* +X81950000Y-124556000D02* +X81950000Y-123856000D01* +X83150000Y-123856000D02* +X83150000Y-124556000D01* +X88845000Y-114909000D02* +X88845000Y-108611000D01* +X88705000Y-114903000D02* +X88705000Y-108617000D01* +X88565000Y-114890000D02* +X88565000Y-112206000D01* +X88565000Y-111314000D02* +X88565000Y-108630000D01* +X88425000Y-114871000D02* +X88425000Y-112416000D01* +X88425000Y-111104000D02* +X88425000Y-108649000D01* +X88285000Y-114845000D02* +X88285000Y-112549000D01* +X88285000Y-110971000D02* +X88285000Y-108675000D01* +X88145000Y-114813000D02* +X88145000Y-112640000D01* +X88145000Y-110880000D02* +X88145000Y-108707000D01* +X88005000Y-114774000D02* +X88005000Y-112702000D01* +X88005000Y-110818000D02* +X88005000Y-108746000D01* +X87865000Y-114728000D02* +X87865000Y-112741000D01* +X87865000Y-110779000D02* +X87865000Y-108792000D01* +X87725000Y-114675000D02* +X87725000Y-112758000D01* +X87725000Y-110762000D02* +X87725000Y-108845000D01* +X87585000Y-114613000D02* +X87585000Y-112756000D01* +X87585000Y-110764000D02* +X87585000Y-108907000D01* +X87445000Y-114543000D02* +X87445000Y-112734000D01* +X87445000Y-110786000D02* +X87445000Y-108977000D01* +X87305000Y-114464000D02* +X87305000Y-112691000D01* +X87305000Y-110829000D02* +X87305000Y-109056000D01* +X87165000Y-114376000D02* +X87165000Y-112623000D01* +X87165000Y-110897000D02* +X87165000Y-109144000D01* +X87025000Y-114276000D02* +X87025000Y-112524000D01* +X87025000Y-110996000D02* +X87025000Y-109244000D01* +X86885000Y-114164000D02* +X86885000Y-112379000D01* +X86885000Y-111141000D02* +X86885000Y-109356000D01* +X86745000Y-114039000D02* +X86745000Y-112140000D01* +X86745000Y-111380000D02* +X86745000Y-109481000D01* +X86605000Y-113896000D02* +X86605000Y-109624000D01* +X86465000Y-113734000D02* +X86465000Y-109786000D01* +X86325000Y-113546000D02* +X86325000Y-109974000D01* +X86185000Y-113323000D02* +X86185000Y-110197000D01* +X86045000Y-113047000D02* +X86045000Y-110473000D01* +X85905000Y-112672000D02* +X85905000Y-110848000D01* +X88670000Y-111760000D02* +G75* +G03X88670000Y-111760000I-1000000J0D01* +G01* +X92107500Y-111760000D02* +G75* +G03X92107500Y-111760000I-3187500J0D01* +G01* +X93056000Y-114204000D02* +X93056000Y-114904000D01* +X91856000Y-114904000D02* +X91856000Y-114204000D01* +X93342460Y-99060000D02* +X93342460Y-98044000D01* +X93342460Y-103886000D02* +X93342460Y-105156000D01* +X92072460Y-103632000D02* +X94612460Y-103632000D01* +X92072460Y-103378000D02* +X94612460Y-103378000D01* +X92072460Y-103124000D02* +X94612460Y-103124000D01* +X92072460Y-103886000D02* +X94612460Y-103886000D01* +X92072460Y-102870000D02* +X94612460Y-104140000D01* +X92072460Y-104140000D02* +X94612460Y-102870000D01* +X92072460Y-102870000D02* +X94612460Y-102870000D01* +X92072460Y-103505000D02* +X94612460Y-103505000D01* +X94612460Y-104140000D02* +X92072460Y-104140000D01* +X92072460Y-104140000D02* +X92072460Y-99060000D01* +X92072460Y-99060000D02* +X94612460Y-99060000D01* +X94612460Y-99060000D02* +X94612460Y-104140000D01* +X92320000Y-100600000D02* +X92320000Y-102600000D01* +X94370000Y-102600000D02* +X94370000Y-100600000D01* +X108045000Y-109315000D02* +X108045000Y-108645000D01* +X97695000Y-109315000D02* +X97695000Y-108645000D01* +X97695000Y-98965000D02* +X97695000Y-99635000D01* +X108045000Y-98965000D02* +X108045000Y-99635000D01* +X108045000Y-109315000D02* +X107375000Y-109315000D01* +X108045000Y-98965000D02* +X107375000Y-98965000D01* +X97695000Y-98965000D02* +X98365000Y-98965000D01* +X97695000Y-109315000D02* +X98365000Y-109315000D01* +X108045000Y-108645000D02* +X109520000Y-108645000D01* +X84254800Y-100457000D02* +G75* +G03X84254800Y-100457000I-3810000J0D01* +G01* +X99171000Y-114124000D02* +X97171000Y-114124000D01* +X97171000Y-111174000D02* +X99171000Y-111174000D01* +X95455000Y-109871000D02* +X95455000Y-111871000D01* +X92505000Y-111871000D02* +X92505000Y-109871000D01* +X104648000Y-125730000D02* +X102108000Y-125730000D01* +X107468000Y-126010000D02* +X105918000Y-126010000D01* +X104648000Y-125730000D02* +X104648000Y-123190000D01* +X105918000Y-122910000D02* +X107468000Y-122910000D01* +X107468000Y-122910000D02* +X107468000Y-126010000D01* +X104648000Y-123190000D02* +X102108000Y-123190000D01* +X102108000Y-123190000D02* +X102108000Y-125730000D01* +X116720460Y-104960300D02* +X116720460Y-96260300D01* +X110315460Y-104960300D02* +X110315460Y-96260300D01* +X110315460Y-96260300D02* +X116720460Y-96260300D01* +X115490460Y-96260300D02* +X115490460Y-104960300D01* +X116720460Y-104960300D02* +X110315460Y-104960300D01* +X81714800Y-113157000D02* +X81714800Y-105537000D01* +X79174800Y-113157000D02* +X79174800Y-105537000D01* +X78894800Y-115977000D02* +X78894800Y-114427000D01* +X81714800Y-105537000D02* +X79174800Y-105537000D01* +X79174800Y-113157000D02* +X81714800Y-113157000D01* +X81994800Y-114427000D02* +X81994800Y-115977000D01* +X81994800Y-115977000D02* +X78894800Y-115977000D01* +X115345000Y-124307600D02* +X115345000Y-125857600D01* +X113795000Y-125857600D02* +X115345000Y-125857600D01* +X115065000Y-123037600D02* +X112525000Y-123037600D01* +X112525000Y-123037600D02* +X112525000Y-125577600D01* +X112525000Y-125577600D02* +X109985000Y-125577600D01* +X109985000Y-125577600D02* +X109985000Y-120497600D01* +X109985000Y-120497600D02* +X115065000Y-120497600D01* +X115065000Y-120497600D02* +X115065000Y-123037600D01* +X104648000Y-118110000D02* +X102108000Y-118110000D01* +X107468000Y-118390000D02* +X105918000Y-118390000D01* +X104648000Y-118110000D02* +X104648000Y-115570000D01* +X105918000Y-115290000D02* +X107468000Y-115290000D01* +X107468000Y-115290000D02* +X107468000Y-118390000D01* +X104648000Y-115570000D02* +X102108000Y-115570000D01* +X102108000Y-115570000D02* +X102108000Y-118110000D01* +X79174800Y-118237000D02* +X79174800Y-125857000D01* +X81714800Y-118237000D02* +X81714800Y-125857000D01* +X81994800Y-115417000D02* +X81994800Y-116967000D01* +X79174800Y-125857000D02* +X81714800Y-125857000D01* +X81714800Y-118237000D02* +X79174800Y-118237000D01* +X78894800Y-116967000D02* +X78894800Y-115417000D01* +X78894800Y-115417000D02* +X81994800Y-115417000D01* +X112436100Y-119494300D02* +X109896100Y-119494300D01* +X115256100Y-119774300D02* +X113706100Y-119774300D01* +X112436100Y-119494300D02* +X112436100Y-116954300D01* +X113706100Y-116674300D02* +X115256100Y-116674300D01* +X115256100Y-116674300D02* +X115256100Y-119774300D01* +X112436100Y-116954300D02* +X109896100Y-116954300D01* +X109896100Y-116954300D02* +X109896100Y-119494300D01* +X104648000Y-120650000D02* +X104648000Y-123190000D01* +X104928000Y-117830000D02* +X104928000Y-119380000D01* +X104648000Y-120650000D02* +X102108000Y-120650000D01* +X101828000Y-119380000D02* +X101828000Y-117830000D01* +X101828000Y-117830000D02* +X104928000Y-117830000D01* +X102108000Y-120650000D02* +X102108000Y-123190000D01* +X102108000Y-123190000D02* +X104648000Y-123190000D01* +X95280421Y-97936000D02* +G75* +G03X95280421Y-97936000I-141421J0D01* +G01* +X97639000Y-98336000D02* +X97639000Y-96736000D01* +X97639000Y-96736000D02* +X94639000Y-96736000D01* +X94639000Y-96736000D02* +X94639000Y-98336000D01* +X94639000Y-98336000D02* +X97639000Y-98336000D01* +X99735000Y-121420000D02* +X99735000Y-122420000D01* +X98385000Y-122420000D02* +X98385000Y-121420000D01* +X98385000Y-119816500D02* +X98385000Y-118816500D01* +X99735000Y-118816500D02* +X99735000Y-119816500D01* +X101322500Y-121420000D02* +X101322500Y-122420000D01* +X99972500Y-122420000D02* +X99972500Y-121420000D01* +X101322500Y-118816500D02* +X101322500Y-119816500D01* +X99972500Y-119816500D02* +X99972500Y-118816500D01* +X106926000Y-114975000D02* +X105926000Y-114975000D01* +X105926000Y-113625000D02* +X106926000Y-113625000D01* +X106926000Y-113578000D02* +X105926000Y-113578000D01* +X105926000Y-112228000D02* +X106926000Y-112228000D01* +X81875000Y-107180000D02* +X81875000Y-106180000D01* +X83225000Y-106180000D02* +X83225000Y-107180000D01* +X81875000Y-109720000D02* +X81875000Y-108720000D01* +X83225000Y-108720000D02* +X83225000Y-109720000D01* +X81875000Y-112260000D02* +X81875000Y-111260000D01* +X83225000Y-111260000D02* +X83225000Y-112260000D01* +X81875000Y-114800000D02* +X81875000Y-113800000D01* +X83225000Y-113800000D02* +X83225000Y-114800000D01* +X85003000Y-106180000D02* +X85003000Y-107180000D01* +X83653000Y-107180000D02* +X83653000Y-106180000D01* +X85003000Y-108720000D02* +X85003000Y-109720000D01* +X83653000Y-109720000D02* +X83653000Y-108720000D01* +X85003000Y-111260000D02* +X85003000Y-112260000D01* +X83653000Y-112260000D02* +X83653000Y-111260000D01* +X85003000Y-113800000D02* +X85003000Y-114800000D01* +X83653000Y-114800000D02* +X83653000Y-113800000D01* +X88720300Y-124820300D02* +X88720300Y-123820300D01* +X90070300Y-123820300D02* +X90070300Y-124820300D01* +X87196300Y-124820300D02* +X87196300Y-123820300D01* +X88546300Y-123820300D02* +X88546300Y-124820300D01* +X89956000Y-116721000D02* +X89956000Y-117721000D01* +X88606000Y-117721000D02* +X88606000Y-116721000D01* +X88305000Y-116721000D02* +X88305000Y-117721000D01* +X86955000Y-117721000D02* +X86955000Y-116721000D01* +X87622000Y-120309000D02* +X86622000Y-120309000D01* +X86622000Y-118959000D02* +X87622000Y-118959000D01* +X87622000Y-122595000D02* +X86622000Y-122595000D01* +X86622000Y-121245000D02* +X87622000Y-121245000D01* +X100068000Y-124754000D02* +X99068000Y-124754000D01* +X99068000Y-123404000D02* +X100068000Y-123404000D01* +X85130000Y-116721000D02* +X85130000Y-117721000D01* +X83780000Y-117721000D02* +X83780000Y-116721000D01* +X84034000Y-124833000D02* +X84034000Y-123833000D01* +X85384000Y-123833000D02* +X85384000Y-124833000D01* +X84574000Y-120309000D02* +X83574000Y-120309000D01* +X83574000Y-118959000D02* +X84574000Y-118959000D01* +X84574000Y-122595000D02* +X83574000Y-122595000D01* +X83574000Y-121245000D02* +X84574000Y-121245000D01* +X84082000Y-102271200D02* +X85082000Y-102271200D01* +X85082000Y-103621200D02* +X84082000Y-103621200D01* +X85082000Y-105221400D02* +X84082000Y-105221400D01* +X84082000Y-103871400D02* +X85082000Y-103871400D01* +X99068000Y-116165000D02* +X100068000Y-116165000D01* +X100068000Y-117515000D02* +X99068000Y-117515000D01* +X85304000Y-117721000D02* +X85304000Y-116721000D01* +X86654000Y-116721000D02* +X86654000Y-117721000D01* +X85558000Y-124833000D02* +X85558000Y-123833000D01* +X86908000Y-123833000D02* +X86908000Y-124833000D01* +X111806221Y-105807000D02* +G75* +G03X111806221Y-105807000I-141421J0D01* +G01* +X111264800Y-108307000D02* +X112864800Y-108307000D01* +X112864800Y-108307000D02* +X112864800Y-105307000D01* +X112864800Y-105307000D02* +X111264800Y-105307000D01* +X111264800Y-105307000D02* +X111264800Y-108307000D01* +X96588400Y-125125400D02* +X96588400Y-125010400D01* +X92438400Y-125125400D02* +X92438400Y-125010400D01* +X92438400Y-116225400D02* +X92438400Y-116340400D01* +X96588400Y-116225400D02* +X96588400Y-116340400D01* +X96588400Y-125125400D02* +X92438400Y-125125400D01* +X96588400Y-116225400D02* +X92438400Y-116225400D01* +X96588400Y-125010400D02* +X97963400Y-125010400D01* +X88544400Y-121361200D02* +X90576400Y-121361200D01* +X90576400Y-121361200D02* +X90576400Y-120091200D01* +X90576400Y-120091200D02* +X88544400Y-120091200D01* +X88544400Y-120091200D02* +X88544400Y-121361200D01* +X109791500Y-96837500D02* +X107759500Y-96837500D01* +X107759500Y-96837500D02* +X107759500Y-98107500D01* +X107759500Y-98107500D02* +X109791500Y-98107500D01* +X109791500Y-98107500D02* +X109791500Y-96837500D01* +X113083800Y-110210600D02* +X111686800Y-110210600D01* +X113337800Y-110337600D02* +X111559800Y-110337600D01* +X113718800Y-110464600D02* +X111178800Y-110464600D01* +X111051800Y-110591600D02* +X113845800Y-110591600D01* +X113972800Y-110718600D02* +X110924800Y-110718600D01* +X110797800Y-110845600D02* +X114099800Y-110845600D01* +X114226800Y-110972600D02* +X110670800Y-110972600D01* +X115115800Y-109829600D02* +X115115800Y-114401600D01* +X115115800Y-114401600D02* +X114353800Y-115163600D01* +X114353800Y-115163600D02* +X110543800Y-115163600D01* +X110543800Y-115163600D02* +X109781800Y-114401600D01* +X109781800Y-114401600D02* +X109781800Y-109829600D01* +X109781800Y-109829600D02* +X115115800Y-109829600D01* +X112448800Y-114655600D02* +X112448800Y-113893600D01* +X112829800Y-114274600D02* +X112067800Y-114274600D01* +X114861800Y-112496600D02* +G75* +G03X114861800Y-112496600I-2413000J0D01* +G01* +X89535000Y-97409000D02* +X89535000Y-98171000D01* +X89154000Y-97790000D02* +X89916000Y-97790000D01* +X91821000Y-97536000D02* +X91821000Y-101346000D01* +X88011000Y-96774000D02* +X91059000Y-96774000D01* +X91821000Y-97536000D02* +X91059000Y-96774000D01* +X87249000Y-97536000D02* +X87249000Y-101346000D01* +X87249000Y-97536000D02* +X88011000Y-96774000D01* +X89662000Y-101092000D02* +X89408000Y-101092000D01* +X88900000Y-100965000D02* +X90170000Y-100965000D01* +X90424000Y-100838000D02* +X88646000Y-100838000D01* +X90678000Y-100711000D02* +X88392000Y-100711000D01* +X88265000Y-100584000D02* +X90805000Y-100584000D01* +X90932000Y-100457000D02* +X88138000Y-100457000D01* +X88011000Y-100330000D02* +X91059000Y-100330000D01* +X87884000Y-100203000D02* +X91186000Y-100203000D01* +X87249000Y-101346000D02* +X91821000Y-101346000D01* +X91567000Y-99060000D02* +G75* +G03X91567000Y-99060000I-2032000J0D01* +G01* +X89334800Y-108077000D02* +X86794800Y-108077000D01* +X92154800Y-108357000D02* +X90604800Y-108357000D01* +X89334800Y-108077000D02* +X89334800Y-105537000D01* +X90604800Y-105257000D02* +X92154800Y-105257000D01* +X92154800Y-105257000D02* +X92154800Y-108357000D01* +X89334800Y-105537000D02* +X86794800Y-105537000D01* +X86794800Y-105537000D02* +X86794800Y-108077000D01* +X89334800Y-105537000D02* +X86794800Y-105537000D01* +X92154800Y-105817000D02* +X90604800Y-105817000D01* +X89334800Y-105537000D02* +X89334800Y-102997000D01* +X90604800Y-102717000D02* +X92154800Y-102717000D01* +X92154800Y-102717000D02* +X92154800Y-105817000D01* +X89334800Y-102997000D02* +X86794800Y-102997000D01* +X86794800Y-102997000D02* +X86794800Y-105537000D01* +X105962927Y-122718794D02* +X105924832Y-122756890D01* +X105810546Y-122794985D01* +X105734356Y-122794985D01* +X105620070Y-122756890D01* +X105543879Y-122680699D01* +X105505784Y-122604509D01* +X105467689Y-122452128D01* +X105467689Y-122337842D01* +X105505784Y-122185461D01* +X105543879Y-122109270D01* +X105620070Y-122033080D01* +X105734356Y-121994985D01* +X105810546Y-121994985D01* +X105924832Y-122033080D01* +X105962927Y-122071175D01* +X106724832Y-122794985D02* +X106267689Y-122794985D01* +X106496260Y-122794985D02* +X106496260Y-121994985D01* +X106420070Y-122109270D01* +X106343879Y-122185461D01* +X106267689Y-122223556D01* +X105945147Y-119195814D02* +X105907052Y-119233910D01* +X105792766Y-119272005D01* +X105716576Y-119272005D01* +X105602290Y-119233910D01* +X105526099Y-119157719D01* +X105488004Y-119081529D01* +X105449909Y-118929148D01* +X105449909Y-118814862D01* +X105488004Y-118662481D01* +X105526099Y-118586290D01* +X105602290Y-118510100D01* +X105716576Y-118472005D01* +X105792766Y-118472005D01* +X105907052Y-118510100D01* +X105945147Y-118548195D01* +X106249909Y-118548195D02* +X106288004Y-118510100D01* +X106364195Y-118472005D01* +X106554671Y-118472005D01* +X106630861Y-118510100D01* +X106668957Y-118548195D01* +X106707052Y-118624386D01* +X106707052Y-118700576D01* +X106668957Y-118814862D01* +X106211814Y-119272005D01* +X106707052Y-119272005D01* +X115221174Y-107067333D02* +X115259270Y-107105428D01* +X115297365Y-107219714D01* +X115297365Y-107295904D01* +X115259270Y-107410190D01* +X115183079Y-107486381D01* +X115106889Y-107524476D01* +X114954508Y-107562571D01* +X114840222Y-107562571D01* +X114687841Y-107524476D01* +X114611650Y-107486381D01* +X114535460Y-107410190D01* +X114497365Y-107295904D01* +X114497365Y-107219714D01* +X114535460Y-107105428D01* +X114573555Y-107067333D01* +X114497365Y-106800666D02* +X114497365Y-106305428D01* +X114802127Y-106572095D01* +X114802127Y-106457809D01* +X114840222Y-106381619D01* +X114878317Y-106343523D01* +X114954508Y-106305428D01* +X115144984Y-106305428D01* +X115221174Y-106343523D01* +X115259270Y-106381619D01* +X115297365Y-106457809D01* +X115297365Y-106686381D01* +X115259270Y-106762571D01* +X115221174Y-106800666D01* +X114819907Y-109358394D02* +X114781812Y-109396490D01* +X114667526Y-109434585D01* +X114591336Y-109434585D01* +X114477050Y-109396490D01* +X114400859Y-109320299D01* +X114362764Y-109244109D01* +X114324669Y-109091728D01* +X114324669Y-108977442D01* +X114362764Y-108825061D01* +X114400859Y-108748870D01* +X114477050Y-108672680D01* +X114591336Y-108634585D01* +X114667526Y-108634585D01* +X114781812Y-108672680D01* +X114819907Y-108710775D01* +X115505621Y-108901251D02* +X115505621Y-109434585D01* +X115315145Y-108596490D02* +X115124669Y-109167918D01* +X115619907Y-109167918D01* +X104893534Y-113717053D02* +X104931630Y-113755148D01* +X104969725Y-113869434D01* +X104969725Y-113945624D01* +X104931630Y-114059910D01* +X104855439Y-114136101D01* +X104779249Y-114174196D01* +X104626868Y-114212291D01* +X104512582Y-114212291D01* +X104360201Y-114174196D01* +X104284010Y-114136101D01* +X104207820Y-114059910D01* +X104169725Y-113945624D01* +X104169725Y-113869434D01* +X104207820Y-113755148D01* +X104245915Y-113717053D01* +X104169725Y-112993243D02* +X104169725Y-113374196D01* +X104550677Y-113412291D01* +X104512582Y-113374196D01* +X104474487Y-113298005D01* +X104474487Y-113107529D01* +X104512582Y-113031339D01* +X104550677Y-112993243D01* +X104626868Y-112955148D01* +X104817344Y-112955148D01* +X104893534Y-112993243D01* +X104931630Y-113031339D01* +X104969725Y-113107529D01* +X104969725Y-113298005D01* +X104931630Y-113374196D01* +X104893534Y-113412291D01* +X94324647Y-115690614D02* +X94286552Y-115728710D01* +X94172266Y-115766805D01* +X94096076Y-115766805D01* +X93981790Y-115728710D01* +X93905599Y-115652519D01* +X93867504Y-115576329D01* +X93829409Y-115423948D01* +X93829409Y-115309662D01* +X93867504Y-115157281D01* +X93905599Y-115081090D01* +X93981790Y-115004900D01* +X94096076Y-114966805D01* +X94172266Y-114966805D01* +X94286552Y-115004900D01* +X94324647Y-115042995D01* +X94591314Y-114966805D02* +X95124647Y-114966805D01* +X94781790Y-115766805D01* +X101708427Y-112099054D02* +X101670332Y-112137150D01* +X101556046Y-112175245D01* +X101479856Y-112175245D01* +X101365570Y-112137150D01* +X101289379Y-112060959D01* +X101251284Y-111984769D01* +X101213189Y-111832388D01* +X101213189Y-111718102D01* +X101251284Y-111565721D01* +X101289379Y-111489530D01* +X101365570Y-111413340D01* +X101479856Y-111375245D01* +X101556046Y-111375245D01* +X101670332Y-111413340D01* +X101708427Y-111451435D01* +X102165570Y-111718102D02* +X102089379Y-111680007D01* +X102051284Y-111641911D01* +X102013189Y-111565721D01* +X102013189Y-111527626D01* +X102051284Y-111451435D01* +X102089379Y-111413340D01* +X102165570Y-111375245D01* +X102317951Y-111375245D01* +X102394141Y-111413340D01* +X102432237Y-111451435D01* +X102470332Y-111527626D01* +X102470332Y-111565721D01* +X102432237Y-111641911D01* +X102394141Y-111680007D01* +X102317951Y-111718102D01* +X102165570Y-111718102D01* +X102089379Y-111756197D01* +X102051284Y-111794292D01* +X102013189Y-111870483D01* +X102013189Y-112022864D01* +X102051284Y-112099054D01* +X102089379Y-112137150D01* +X102165570Y-112175245D01* +X102317951Y-112175245D01* +X102394141Y-112137150D01* +X102432237Y-112099054D01* +X102470332Y-112022864D01* +X102470332Y-111870483D01* +X102432237Y-111794292D01* +X102394141Y-111756197D01* +X102317951Y-111718102D01* +X86648714Y-100323586D02* +X86686810Y-100361681D01* +X86724905Y-100475967D01* +X86724905Y-100552157D01* +X86686810Y-100666443D01* +X86610619Y-100742634D01* +X86534429Y-100780729D01* +X86382048Y-100818824D01* +X86267762Y-100818824D01* +X86115381Y-100780729D01* +X86039190Y-100742634D01* +X85963000Y-100666443D01* +X85924905Y-100552157D01* +X85924905Y-100475967D01* +X85963000Y-100361681D01* +X86001095Y-100323586D01* +X86724905Y-99561681D02* +X86724905Y-100018824D01* +X86724905Y-99790253D02* +X85924905Y-99790253D01* +X86039190Y-99866443D01* +X86115381Y-99942634D01* +X86153476Y-100018824D01* +X85924905Y-99066443D02* +X85924905Y-98990252D01* +X85963000Y-98914062D01* +X86001095Y-98875967D01* +X86077286Y-98837871D01* +X86229667Y-98799776D01* +X86420143Y-98799776D01* +X86572524Y-98837871D01* +X86648714Y-98875967D01* +X86686810Y-98914062D01* +X86724905Y-98990252D01* +X86724905Y-99066443D01* +X86686810Y-99142633D01* +X86648714Y-99180729D01* +X86572524Y-99218824D01* +X86420143Y-99256919D01* +X86229667Y-99256919D01* +X86077286Y-99218824D01* +X86001095Y-99180729D01* +X85963000Y-99142633D01* +X85924905Y-99066443D01* +X95330434Y-107209526D02* +X95368530Y-107247621D01* +X95406625Y-107361907D01* +X95406625Y-107438097D01* +X95368530Y-107552383D01* +X95292339Y-107628574D01* +X95216149Y-107666669D01* +X95063768Y-107704764D01* +X94949482Y-107704764D01* +X94797101Y-107666669D01* +X94720910Y-107628574D01* +X94644720Y-107552383D01* +X94606625Y-107438097D01* +X94606625Y-107361907D01* +X94644720Y-107247621D01* +X94682815Y-107209526D01* +X95406625Y-106447621D02* +X95406625Y-106904764D01* +X95406625Y-106676193D02* +X94606625Y-106676193D01* +X94720910Y-106752383D01* +X94797101Y-106828574D01* +X94835196Y-106904764D01* +X95406625Y-105685716D02* +X95406625Y-106142859D01* +X95406625Y-105914288D02* +X94606625Y-105914288D01* +X94720910Y-105990478D01* +X94797101Y-106066669D01* +X94835196Y-106142859D01* +X82762514Y-117915626D02* +X82800610Y-117953721D01* +X82838705Y-118068007D01* +X82838705Y-118144197D01* +X82800610Y-118258483D01* +X82724419Y-118334674D01* +X82648229Y-118372769D01* +X82495848Y-118410864D01* +X82381562Y-118410864D01* +X82229181Y-118372769D01* +X82152990Y-118334674D01* +X82076800Y-118258483D01* +X82038705Y-118144197D01* +X82038705Y-118068007D01* +X82076800Y-117953721D01* +X82114895Y-117915626D01* +X82838705Y-117153721D02* +X82838705Y-117610864D01* +X82838705Y-117382293D02* +X82038705Y-117382293D01* +X82152990Y-117458483D01* +X82229181Y-117534674D01* +X82267276Y-117610864D01* +X82038705Y-116887054D02* +X82038705Y-116391816D01* +X82343467Y-116658483D01* +X82343467Y-116544197D01* +X82381562Y-116468007D01* +X82419657Y-116429911D01* +X82495848Y-116391816D01* +X82686324Y-116391816D01* +X82762514Y-116429911D01* +X82800610Y-116468007D01* +X82838705Y-116544197D01* +X82838705Y-116772769D01* +X82800610Y-116848959D01* +X82762514Y-116887054D01* +X82856494Y-124697426D02* +X82894590Y-124735521D01* +X82932685Y-124849807D01* +X82932685Y-124925997D01* +X82894590Y-125040283D01* +X82818399Y-125116474D01* +X82742209Y-125154569D01* +X82589828Y-125192664D01* +X82475542Y-125192664D01* +X82323161Y-125154569D01* +X82246970Y-125116474D01* +X82170780Y-125040283D01* +X82132685Y-124925997D01* +X82132685Y-124849807D01* +X82170780Y-124735521D01* +X82208875Y-124697426D01* +X82932685Y-123935521D02* +X82932685Y-124392664D01* +X82932685Y-124164093D02* +X82132685Y-124164093D01* +X82246970Y-124240283D01* +X82323161Y-124316474D01* +X82361256Y-124392664D01* +X82399351Y-123249807D02* +X82932685Y-123249807D01* +X82094590Y-123440283D02* +X82666018Y-123630759D01* +X82666018Y-123135521D01* +X89882234Y-112520694D02* +X89844139Y-112558790D01* +X89729853Y-112596885D01* +X89653663Y-112596885D01* +X89539377Y-112558790D01* +X89463186Y-112482599D01* +X89425091Y-112406409D01* +X89386996Y-112254028D01* +X89386996Y-112139742D01* +X89425091Y-111987361D01* +X89463186Y-111911170D01* +X89539377Y-111834980D01* +X89653663Y-111796885D01* +X89729853Y-111796885D01* +X89844139Y-111834980D01* +X89882234Y-111873075D01* +X90644139Y-112596885D02* +X90186996Y-112596885D01* +X90415567Y-112596885D02* +X90415567Y-111796885D01* +X90339377Y-111911170D01* +X90263186Y-111987361D01* +X90186996Y-112025456D01* +X91367949Y-111796885D02* +X90986996Y-111796885D01* +X90948901Y-112177837D01* +X90986996Y-112139742D01* +X91063187Y-112101647D01* +X91253663Y-112101647D01* +X91329853Y-112139742D01* +X91367949Y-112177837D01* +X91406044Y-112254028D01* +X91406044Y-112444504D01* +X91367949Y-112520694D01* +X91329853Y-112558790D01* +X91253663Y-112596885D01* +X91063187Y-112596885D01* +X90986996Y-112558790D01* +X90948901Y-112520694D01* +X92732014Y-115149566D02* +X92770110Y-115187661D01* +X92808205Y-115301947D01* +X92808205Y-115378137D01* +X92770110Y-115492423D01* +X92693919Y-115568614D01* +X92617729Y-115606709D01* +X92465348Y-115644804D01* +X92351062Y-115644804D01* +X92198681Y-115606709D01* +X92122490Y-115568614D01* +X92046300Y-115492423D01* +X92008205Y-115378137D01* +X92008205Y-115301947D01* +X92046300Y-115187661D01* +X92084395Y-115149566D01* +X92808205Y-114387661D02* +X92808205Y-114844804D01* +X92808205Y-114616233D02* +X92008205Y-114616233D01* +X92122490Y-114692423D01* +X92198681Y-114768614D01* +X92236776Y-114844804D01* +X92008205Y-113701947D02* +X92008205Y-113854328D01* +X92046300Y-113930518D01* +X92084395Y-113968613D01* +X92198681Y-114044804D01* +X92351062Y-114082899D01* +X92655824Y-114082899D01* +X92732014Y-114044804D01* +X92770110Y-114006709D01* +X92808205Y-113930518D01* +X92808205Y-113778137D01* +X92770110Y-113701947D01* +X92732014Y-113663851D01* +X92655824Y-113625756D01* +X92465348Y-113625756D01* +X92389157Y-113663851D01* +X92351062Y-113701947D01* +X92312967Y-113778137D01* +X92312967Y-113930518D01* +X92351062Y-114006709D01* +X92389157Y-114044804D01* +X92465348Y-114082899D01* +X93694665Y-106216376D02* +X92894665Y-106216376D01* +X92894665Y-106025900D01* +X92932760Y-105911614D01* +X93008950Y-105835423D01* +X93085141Y-105797328D01* +X93237522Y-105759233D01* +X93351808Y-105759233D01* +X93504189Y-105797328D01* +X93580379Y-105835423D01* +X93656570Y-105911614D01* +X93694665Y-106025900D01* +X93694665Y-106216376D01* +X93694665Y-104997328D02* +X93694665Y-105454471D01* +X93694665Y-105225900D02* +X92894665Y-105225900D01* +X93008950Y-105302090D01* +X93085141Y-105378281D01* +X93123236Y-105454471D01* +X93379757Y-101826026D02* +X93379757Y-102092693D01* +X93798805Y-102092693D02* +X92998805Y-102092693D01* +X92998805Y-101711740D01* +X93798805Y-100987931D02* +X93798805Y-101445074D01* +X93798805Y-101216503D02* +X92998805Y-101216503D01* +X93113090Y-101292693D01* +X93189281Y-101368884D01* +X93227376Y-101445074D01* +X102234288Y-104438405D02* +X102234288Y-103638405D01* +X103072383Y-104362214D02* +X103034288Y-104400310D01* +X102920002Y-104438405D01* +X102843812Y-104438405D01* +X102729526Y-104400310D01* +X102653335Y-104324119D01* +X102615240Y-104247929D01* +X102577145Y-104095548D01* +X102577145Y-103981262D01* +X102615240Y-103828881D01* +X102653335Y-103752690D01* +X102729526Y-103676500D01* +X102843812Y-103638405D01* +X102920002Y-103638405D01* +X103034288Y-103676500D01* +X103072383Y-103714595D01* +X103834288Y-104438405D02* +X103377145Y-104438405D01* +X103605716Y-104438405D02* +X103605716Y-103638405D01* +X103529526Y-103752690D01* +X103453335Y-103828881D01* +X103377145Y-103866976D01* +X80760985Y-100422693D02* +X80760985Y-100803646D01* +X79960985Y-100803646D01* +X80760985Y-99736979D02* +X80760985Y-100194122D01* +X80760985Y-99965551D02* +X79960985Y-99965551D01* +X80075270Y-100041741D01* +X80151461Y-100117932D01* +X80189556Y-100194122D01* +X98553685Y-112787413D02* +X98553685Y-113168366D01* +X97753685Y-113168366D01* +X97829875Y-112558842D02* +X97791780Y-112520747D01* +X97753685Y-112444556D01* +X97753685Y-112254080D01* +X97791780Y-112177890D01* +X97829875Y-112139794D01* +X97906066Y-112101699D01* +X97982256Y-112101699D01* +X98096542Y-112139794D01* +X98553685Y-112596937D01* +X98553685Y-112101699D01* +X94322045Y-110978933D02* +X94322045Y-111359886D01* +X93522045Y-111359886D01* +X93522045Y-110788457D02* +X93522045Y-110293219D01* +X93826807Y-110559886D01* +X93826807Y-110445600D01* +X93864902Y-110369410D01* +X93902997Y-110331314D01* +X93979188Y-110293219D01* +X94169664Y-110293219D01* +X94245854Y-110331314D01* +X94283950Y-110369410D01* +X94322045Y-110445600D01* +X94322045Y-110674172D01* +X94283950Y-110750362D01* +X94245854Y-110788457D01* +X106298145Y-125047936D02* +X105498145Y-125047936D01* +X105498145Y-124743174D01* +X105536240Y-124666983D01* +X105574335Y-124628888D01* +X105650526Y-124590793D01* +X105764811Y-124590793D01* +X105841002Y-124628888D01* +X105879097Y-124666983D01* +X105917192Y-124743174D01* +X105917192Y-125047936D01* +X106298145Y-123828888D02* +X106298145Y-124286031D01* +X106298145Y-124057460D02* +X105498145Y-124057460D01* +X105612430Y-124133650D01* +X105688621Y-124209841D01* +X105726716Y-124286031D01* +X113641285Y-101133836D02* +X112841285Y-101133836D01* +X112841285Y-100829074D01* +X112879380Y-100752883D01* +X112917475Y-100714788D01* +X112993666Y-100676693D01* +X113107951Y-100676693D01* +X113184142Y-100714788D01* +X113222237Y-100752883D01* +X113260332Y-100829074D01* +X113260332Y-101133836D01* +X112917475Y-100371931D02* +X112879380Y-100333836D01* +X112841285Y-100257645D01* +X112841285Y-100067169D01* +X112879380Y-99990979D01* +X112917475Y-99952883D01* +X112993666Y-99914788D01* +X113069856Y-99914788D01* +X113184142Y-99952883D01* +X113641285Y-100410026D01* +X113641285Y-99914788D01* +X79887344Y-114870185D02* +X79887344Y-114070185D01* +X80192106Y-114070185D01* +X80268297Y-114108280D01* +X80306392Y-114146375D01* +X80344487Y-114222566D01* +X80344487Y-114336851D01* +X80306392Y-114413042D01* +X80268297Y-114451137D01* +X80192106Y-114489232D01* +X79887344Y-114489232D01* +X80611154Y-114070185D02* +X81106392Y-114070185D01* +X80839725Y-114374947D01* +X80954011Y-114374947D01* +X81030201Y-114413042D01* +X81068297Y-114451137D01* +X81106392Y-114527328D01* +X81106392Y-114717804D01* +X81068297Y-114793994D01* +X81030201Y-114832090D01* +X80954011Y-114870185D01* +X80725439Y-114870185D01* +X80649249Y-114832090D01* +X80611154Y-114793994D01* +X113168964Y-124674585D02* +X113168964Y-123874585D01* +X113473726Y-123874585D01* +X113549917Y-123912680D01* +X113588012Y-123950775D01* +X113626107Y-124026966D01* +X113626107Y-124141251D01* +X113588012Y-124217442D01* +X113549917Y-124255537D01* +X113473726Y-124293632D01* +X113168964Y-124293632D01* +X114311821Y-124141251D02* +X114311821Y-124674585D01* +X114121345Y-123836490D02* +X113930869Y-124407918D01* +X114426107Y-124407918D01* +X106422605Y-117491436D02* +X105622605Y-117491436D01* +X105622605Y-117186674D01* +X105660700Y-117110483D01* +X105698795Y-117072388D01* +X105774986Y-117034293D01* +X105889271Y-117034293D01* +X105965462Y-117072388D01* +X106003557Y-117110483D01* +X106041652Y-117186674D01* +X106041652Y-117491436D01* +X105622605Y-116310483D02* +X105622605Y-116691436D01* +X106003557Y-116729531D01* +X105965462Y-116691436D01* +X105927367Y-116615245D01* +X105927367Y-116424769D01* +X105965462Y-116348579D01* +X106003557Y-116310483D01* +X106079748Y-116272388D01* +X106270224Y-116272388D01* +X106346414Y-116310483D01* +X106384510Y-116348579D01* +X106422605Y-116424769D01* +X106422605Y-116615245D01* +X106384510Y-116691436D01* +X106346414Y-116729531D01* +X79925444Y-117377165D02* +X79925444Y-116577165D01* +X80230206Y-116577165D01* +X80306397Y-116615260D01* +X80344492Y-116653355D01* +X80382587Y-116729546D01* +X80382587Y-116843831D01* +X80344492Y-116920022D01* +X80306397Y-116958117D01* +X80230206Y-116996212D01* +X79925444Y-116996212D01* +X81068301Y-116577165D02* +X80915920Y-116577165D01* +X80839730Y-116615260D01* +X80801635Y-116653355D01* +X80725444Y-116767641D01* +X80687349Y-116920022D01* +X80687349Y-117224784D01* +X80725444Y-117300974D01* +X80763539Y-117339070D01* +X80839730Y-117377165D01* +X80992111Y-117377165D01* +X81068301Y-117339070D01* +X81106397Y-117300974D01* +X81144492Y-117224784D01* +X81144492Y-117034308D01* +X81106397Y-116958117D01* +X81068301Y-116920022D01* +X80992111Y-116881927D01* +X80839730Y-116881927D01* +X80763539Y-116920022D01* +X80725444Y-116958117D01* +X80687349Y-117034308D01* +X114212785Y-118875736D02* +X113412785Y-118875736D01* +X113412785Y-118570974D01* +X113450880Y-118494783D01* +X113488975Y-118456688D01* +X113565166Y-118418593D01* +X113679451Y-118418593D01* +X113755642Y-118456688D01* +X113793737Y-118494783D01* +X113831832Y-118570974D01* +X113831832Y-118875736D01* +X113755642Y-117961450D02* +X113717547Y-118037641D01* +X113679451Y-118075736D01* +X113603261Y-118113831D01* +X113565166Y-118113831D01* +X113488975Y-118075736D01* +X113450880Y-118037641D01* +X113412785Y-117961450D01* +X113412785Y-117809069D01* +X113450880Y-117732879D01* +X113488975Y-117694783D01* +X113565166Y-117656688D01* +X113603261Y-117656688D01* +X113679451Y-117694783D01* +X113717547Y-117732879D01* +X113755642Y-117809069D01* +X113755642Y-117961450D01* +X113793737Y-118037641D01* +X113831832Y-118075736D01* +X113908023Y-118113831D01* +X114060404Y-118113831D01* +X114136594Y-118075736D01* +X114174690Y-118037641D01* +X114212785Y-117961450D01* +X114212785Y-117809069D01* +X114174690Y-117732879D01* +X114136594Y-117694783D01* +X114060404Y-117656688D01* +X113908023Y-117656688D01* +X113831832Y-117694783D01* +X113793737Y-117732879D01* +X113755642Y-117809069D01* +X102777824Y-119813025D02* +X102777824Y-119013025D01* +X103082586Y-119013025D01* +X103158777Y-119051120D01* +X103196872Y-119089215D01* +X103234967Y-119165406D01* +X103234967Y-119279691D01* +X103196872Y-119355882D01* +X103158777Y-119393977D01* +X103082586Y-119432072D01* +X102777824Y-119432072D01* +X103615919Y-119813025D02* +X103768300Y-119813025D01* +X103844491Y-119774930D01* +X103882586Y-119736834D01* +X103958777Y-119622549D01* +X103996872Y-119470168D01* +X103996872Y-119165406D01* +X103958777Y-119089215D01* +X103920681Y-119051120D01* +X103844491Y-119013025D01* +X103692110Y-119013025D01* +X103615919Y-119051120D01* +X103577824Y-119089215D01* +X103539729Y-119165406D01* +X103539729Y-119355882D01* +X103577824Y-119432072D01* +X103615919Y-119470168D01* +X103692110Y-119508263D01* +X103844491Y-119508263D01* +X103920681Y-119470168D01* +X103958777Y-119432072D01* +X103996872Y-119355882D01* +X96103910Y-97994415D02* +X96027719Y-97956320D01* +X95951529Y-97880130D01* +X95837243Y-97765844D01* +X95761052Y-97727749D01* +X95684862Y-97727749D01* +X95722957Y-97918225D02* +X95646767Y-97880130D01* +X95570576Y-97803939D01* +X95532481Y-97651558D01* +X95532481Y-97384891D01* +X95570576Y-97232510D01* +X95646767Y-97156320D01* +X95722957Y-97118225D01* +X95875338Y-97118225D01* +X95951529Y-97156320D01* +X96027719Y-97232510D01* +X96065814Y-97384891D01* +X96065814Y-97651558D01* +X96027719Y-97803939D01* +X95951529Y-97880130D01* +X95875338Y-97918225D01* +X95722957Y-97918225D01* +X96827719Y-97918225D02* +X96370576Y-97918225D01* +X96599147Y-97918225D02* +X96599147Y-97118225D01* +X96522957Y-97232510D01* +X96446766Y-97308701D01* +X96370576Y-97346796D01* +X99506185Y-122007613D02* +X99125232Y-122274280D01* +X99506185Y-122464756D02* +X98706185Y-122464756D01* +X98706185Y-122159994D01* +X98744280Y-122083803D01* +X98782375Y-122045708D01* +X98858566Y-122007613D01* +X98972851Y-122007613D01* +X99049042Y-122045708D01* +X99087137Y-122083803D01* +X99125232Y-122159994D01* +X99125232Y-122464756D01* +X99506185Y-121245708D02* +X99506185Y-121702851D01* +X99506185Y-121474280D02* +X98706185Y-121474280D01* +X98820470Y-121550470D01* +X98896661Y-121626661D01* +X98934756Y-121702851D01* +X99498565Y-119416813D02* +X99117612Y-119683480D01* +X99498565Y-119873956D02* +X98698565Y-119873956D01* +X98698565Y-119569194D01* +X98736660Y-119493003D01* +X98774755Y-119454908D01* +X98850946Y-119416813D01* +X98965231Y-119416813D01* +X99041422Y-119454908D01* +X99079517Y-119493003D01* +X99117612Y-119569194D01* +X99117612Y-119873956D01* +X98774755Y-119112051D02* +X98736660Y-119073956D01* +X98698565Y-118997765D01* +X98698565Y-118807289D01* +X98736660Y-118731099D01* +X98774755Y-118693003D01* +X98850946Y-118654908D01* +X98927136Y-118654908D01* +X99041422Y-118693003D01* +X99498565Y-119150146D01* +X99498565Y-118654908D01* +X101091145Y-121923793D02* +X100710192Y-122190460D01* +X101091145Y-122380936D02* +X100291145Y-122380936D01* +X100291145Y-122076174D01* +X100329240Y-121999983D01* +X100367335Y-121961888D01* +X100443526Y-121923793D01* +X100557811Y-121923793D01* +X100634002Y-121961888D01* +X100672097Y-121999983D01* +X100710192Y-122076174D01* +X100710192Y-122380936D01* +X100291145Y-121657126D02* +X100291145Y-121161888D01* +X100595907Y-121428555D01* +X100595907Y-121314269D01* +X100634002Y-121238079D01* +X100672097Y-121199983D01* +X100748288Y-121161888D01* +X100938764Y-121161888D01* +X101014954Y-121199983D01* +X101053050Y-121238079D01* +X101091145Y-121314269D01* +X101091145Y-121542841D01* +X101053050Y-121619031D01* +X101014954Y-121657126D01* +X101068285Y-119310133D02* +X100687332Y-119576800D01* +X101068285Y-119767276D02* +X100268285Y-119767276D01* +X100268285Y-119462514D01* +X100306380Y-119386323D01* +X100344475Y-119348228D01* +X100420666Y-119310133D01* +X100534951Y-119310133D01* +X100611142Y-119348228D01* +X100649237Y-119386323D01* +X100687332Y-119462514D01* +X100687332Y-119767276D01* +X100534951Y-118624419D02* +X101068285Y-118624419D01* +X100230190Y-118814895D02* +X100801618Y-119005371D01* +X100801618Y-118510133D01* +X106232167Y-114654285D02* +X105965500Y-114273332D01* +X105775024Y-114654285D02* +X105775024Y-113854285D01* +X106079786Y-113854285D01* +X106155977Y-113892380D01* +X106194072Y-113930475D01* +X106232167Y-114006666D01* +X106232167Y-114120951D01* +X106194072Y-114197142D01* +X106155977Y-114235237D01* +X106079786Y-114273332D01* +X105775024Y-114273332D01* +X106955977Y-113854285D02* +X106575024Y-113854285D01* +X106536929Y-114235237D01* +X106575024Y-114197142D01* +X106651215Y-114159047D01* +X106841691Y-114159047D01* +X106917881Y-114197142D01* +X106955977Y-114235237D01* +X106994072Y-114311428D01* +X106994072Y-114501904D01* +X106955977Y-114578094D01* +X106917881Y-114616190D01* +X106841691Y-114654285D01* +X106651215Y-114654285D01* +X106575024Y-114616190D01* +X106536929Y-114578094D01* +X106346467Y-113280145D02* +X106079800Y-112899192D01* +X105889324Y-113280145D02* +X105889324Y-112480145D01* +X106194086Y-112480145D01* +X106270277Y-112518240D01* +X106308372Y-112556335D01* +X106346467Y-112632526D01* +X106346467Y-112746811D01* +X106308372Y-112823002D01* +X106270277Y-112861097D01* +X106194086Y-112899192D01* +X105889324Y-112899192D01* +X107032181Y-112480145D02* +X106879800Y-112480145D01* +X106803610Y-112518240D01* +X106765515Y-112556335D01* +X106689324Y-112670621D01* +X106651229Y-112823002D01* +X106651229Y-113127764D01* +X106689324Y-113203954D01* +X106727419Y-113242050D01* +X106803610Y-113280145D01* +X106955991Y-113280145D01* +X107032181Y-113242050D01* +X107070277Y-113203954D01* +X107108372Y-113127764D01* +X107108372Y-112937288D01* +X107070277Y-112861097D01* +X107032181Y-112823002D01* +X106955991Y-112784907D01* +X106803610Y-112784907D01* +X106727419Y-112823002D01* +X106689324Y-112861097D01* +X106651229Y-112937288D01* +X82937765Y-106691413D02* +X82556812Y-106958080D01* +X82937765Y-107148556D02* +X82137765Y-107148556D01* +X82137765Y-106843794D01* +X82175860Y-106767603D01* +X82213955Y-106729508D01* +X82290146Y-106691413D01* +X82404431Y-106691413D01* +X82480622Y-106729508D01* +X82518717Y-106767603D01* +X82556812Y-106843794D01* +X82556812Y-107148556D01* +X82137765Y-106424746D02* +X82137765Y-105891413D01* +X82937765Y-106234270D01* +X82983485Y-109358413D02* +X82602532Y-109625080D01* +X82983485Y-109815556D02* +X82183485Y-109815556D01* +X82183485Y-109510794D01* +X82221580Y-109434603D01* +X82259675Y-109396508D01* +X82335866Y-109358413D01* +X82450151Y-109358413D01* +X82526342Y-109396508D01* +X82564437Y-109434603D01* +X82602532Y-109510794D01* +X82602532Y-109815556D01* +X82526342Y-108901270D02* +X82488247Y-108977461D01* +X82450151Y-109015556D01* +X82373961Y-109053651D01* +X82335866Y-109053651D01* +X82259675Y-109015556D01* +X82221580Y-108977461D01* +X82183485Y-108901270D01* +X82183485Y-108748889D01* +X82221580Y-108672699D01* +X82259675Y-108634603D01* +X82335866Y-108596508D01* +X82373961Y-108596508D01* +X82450151Y-108634603D01* +X82488247Y-108672699D01* +X82526342Y-108748889D01* +X82526342Y-108901270D01* +X82564437Y-108977461D01* +X82602532Y-109015556D01* +X82678723Y-109053651D01* +X82831104Y-109053651D01* +X82907294Y-109015556D01* +X82945390Y-108977461D01* +X82983485Y-108901270D01* +X82983485Y-108748889D01* +X82945390Y-108672699D01* +X82907294Y-108634603D01* +X82831104Y-108596508D01* +X82678723Y-108596508D01* +X82602532Y-108634603D01* +X82564437Y-108672699D01* +X82526342Y-108748889D01* +X82935225Y-111898413D02* +X82554272Y-112165080D01* +X82935225Y-112355556D02* +X82135225Y-112355556D01* +X82135225Y-112050794D01* +X82173320Y-111974603D01* +X82211415Y-111936508D01* +X82287606Y-111898413D01* +X82401891Y-111898413D01* +X82478082Y-111936508D01* +X82516177Y-111974603D01* +X82554272Y-112050794D01* +X82554272Y-112355556D01* +X82935225Y-111517461D02* +X82935225Y-111365080D01* +X82897130Y-111288889D01* +X82859034Y-111250794D01* +X82744749Y-111174603D01* +X82592368Y-111136508D01* +X82287606Y-111136508D01* +X82211415Y-111174603D01* +X82173320Y-111212699D01* +X82135225Y-111288889D01* +X82135225Y-111441270D01* +X82173320Y-111517461D01* +X82211415Y-111555556D01* +X82287606Y-111593651D01* +X82478082Y-111593651D01* +X82554272Y-111555556D01* +X82592368Y-111517461D01* +X82630463Y-111441270D01* +X82630463Y-111288889D01* +X82592368Y-111212699D01* +X82554272Y-111174603D01* +X82478082Y-111136508D01* +X82980945Y-114824446D02* +X82599992Y-115091113D01* +X82980945Y-115281589D02* +X82180945Y-115281589D01* +X82180945Y-114976827D01* +X82219040Y-114900636D01* +X82257135Y-114862541D01* +X82333326Y-114824446D01* +X82447611Y-114824446D01* +X82523802Y-114862541D01* +X82561897Y-114900636D01* +X82599992Y-114976827D01* +X82599992Y-115281589D01* +X82980945Y-114062541D02* +X82980945Y-114519684D01* +X82980945Y-114291113D02* +X82180945Y-114291113D01* +X82295230Y-114367303D01* +X82371421Y-114443494D01* +X82409516Y-114519684D01* +X82180945Y-113567303D02* +X82180945Y-113491112D01* +X82219040Y-113414922D01* +X82257135Y-113376827D01* +X82333326Y-113338731D01* +X82485707Y-113300636D01* +X82676183Y-113300636D01* +X82828564Y-113338731D01* +X82904754Y-113376827D01* +X82942850Y-113414922D01* +X82980945Y-113491112D01* +X82980945Y-113567303D01* +X82942850Y-113643493D01* +X82904754Y-113681589D01* +X82828564Y-113719684D01* +X82676183Y-113757779D01* +X82485707Y-113757779D01* +X82333326Y-113719684D01* +X82257135Y-113681589D01* +X82219040Y-113643493D01* +X82180945Y-113567303D01* +X84736085Y-107024106D02* +X84355132Y-107290773D01* +X84736085Y-107481249D02* +X83936085Y-107481249D01* +X83936085Y-107176487D01* +X83974180Y-107100296D01* +X84012275Y-107062201D01* +X84088466Y-107024106D01* +X84202751Y-107024106D01* +X84278942Y-107062201D01* +X84317037Y-107100296D01* +X84355132Y-107176487D01* +X84355132Y-107481249D01* +X84736085Y-106262201D02* +X84736085Y-106719344D01* +X84736085Y-106490773D02* +X83936085Y-106490773D01* +X84050370Y-106566963D01* +X84126561Y-106643154D01* +X84164656Y-106719344D01* +X84736085Y-105500296D02* +X84736085Y-105957439D01* +X84736085Y-105728868D02* +X83936085Y-105728868D01* +X84050370Y-105805058D01* +X84126561Y-105881249D01* +X84164656Y-105957439D01* +X84736085Y-109668246D02* +X84355132Y-109934913D01* +X84736085Y-110125389D02* +X83936085Y-110125389D01* +X83936085Y-109820627D01* +X83974180Y-109744436D01* +X84012275Y-109706341D01* +X84088466Y-109668246D01* +X84202751Y-109668246D01* +X84278942Y-109706341D01* +X84317037Y-109744436D01* +X84355132Y-109820627D01* +X84355132Y-110125389D01* +X84736085Y-108906341D02* +X84736085Y-109363484D01* +X84736085Y-109134913D02* +X83936085Y-109134913D01* +X84050370Y-109211103D01* +X84126561Y-109287294D01* +X84164656Y-109363484D01* +X84012275Y-108601579D02* +X83974180Y-108563484D01* +X83936085Y-108487293D01* +X83936085Y-108296817D01* +X83974180Y-108220627D01* +X84012275Y-108182531D01* +X84088466Y-108144436D01* +X84164656Y-108144436D01* +X84278942Y-108182531D01* +X84736085Y-108639674D01* +X84736085Y-108144436D01* +X84690365Y-112256506D02* +X84309412Y-112523173D01* +X84690365Y-112713649D02* +X83890365Y-112713649D01* +X83890365Y-112408887D01* +X83928460Y-112332696D01* +X83966555Y-112294601D01* +X84042746Y-112256506D01* +X84157031Y-112256506D01* +X84233222Y-112294601D01* +X84271317Y-112332696D01* +X84309412Y-112408887D01* +X84309412Y-112713649D01* +X84690365Y-111494601D02* +X84690365Y-111951744D01* +X84690365Y-111723173D02* +X83890365Y-111723173D01* +X84004650Y-111799363D01* +X84080841Y-111875554D01* +X84118936Y-111951744D01* +X83890365Y-111227934D02* +X83890365Y-110732696D01* +X84195127Y-110999363D01* +X84195127Y-110885077D01* +X84233222Y-110808887D01* +X84271317Y-110770791D01* +X84347508Y-110732696D01* +X84537984Y-110732696D01* +X84614174Y-110770791D01* +X84652270Y-110808887D01* +X84690365Y-110885077D01* +X84690365Y-111113649D01* +X84652270Y-111189839D01* +X84614174Y-111227934D01* +X84715765Y-114979386D02* +X84334812Y-115246053D01* +X84715765Y-115436529D02* +X83915765Y-115436529D01* +X83915765Y-115131767D01* +X83953860Y-115055576D01* +X83991955Y-115017481D01* +X84068146Y-114979386D01* +X84182431Y-114979386D01* +X84258622Y-115017481D01* +X84296717Y-115055576D01* +X84334812Y-115131767D01* +X84334812Y-115436529D01* +X84715765Y-114217481D02* +X84715765Y-114674624D01* +X84715765Y-114446053D02* +X83915765Y-114446053D01* +X84030050Y-114522243D01* +X84106241Y-114598434D01* +X84144336Y-114674624D01* +X84182431Y-113531767D02* +X84715765Y-113531767D01* +X83877670Y-113722243D02* +X84449098Y-113912719D01* +X84449098Y-113417481D01* +X89800845Y-124826966D02* +X89419892Y-125093633D01* +X89800845Y-125284109D02* +X89000845Y-125284109D01* +X89000845Y-124979347D01* +X89038940Y-124903156D01* +X89077035Y-124865061D01* +X89153226Y-124826966D01* +X89267511Y-124826966D01* +X89343702Y-124865061D01* +X89381797Y-124903156D01* +X89419892Y-124979347D01* +X89419892Y-125284109D01* +X89800845Y-124065061D02* +X89800845Y-124522204D01* +X89800845Y-124293633D02* +X89000845Y-124293633D01* +X89115130Y-124369823D01* +X89191321Y-124446014D01* +X89229416Y-124522204D01* +X89000845Y-123341251D02* +X89000845Y-123722204D01* +X89381797Y-123760299D01* +X89343702Y-123722204D01* +X89305607Y-123646013D01* +X89305607Y-123455537D01* +X89343702Y-123379347D01* +X89381797Y-123341251D01* +X89457988Y-123303156D01* +X89648464Y-123303156D01* +X89724654Y-123341251D01* +X89762750Y-123379347D01* +X89800845Y-123455537D01* +X89800845Y-123646013D01* +X89762750Y-123722204D01* +X89724654Y-123760299D01* +X88271765Y-124826966D02* +X87890812Y-125093633D01* +X88271765Y-125284109D02* +X87471765Y-125284109D01* +X87471765Y-124979347D01* +X87509860Y-124903156D01* +X87547955Y-124865061D01* +X87624146Y-124826966D01* +X87738431Y-124826966D01* +X87814622Y-124865061D01* +X87852717Y-124903156D01* +X87890812Y-124979347D01* +X87890812Y-125284109D01* +X88271765Y-124065061D02* +X88271765Y-124522204D01* +X88271765Y-124293633D02* +X87471765Y-124293633D01* +X87586050Y-124369823D01* +X87662241Y-124446014D01* +X87700336Y-124522204D01* +X87471765Y-123379347D02* +X87471765Y-123531728D01* +X87509860Y-123607918D01* +X87547955Y-123646013D01* +X87662241Y-123722204D01* +X87814622Y-123760299D01* +X88119384Y-123760299D01* +X88195574Y-123722204D01* +X88233670Y-123684109D01* +X88271765Y-123607918D01* +X88271765Y-123455537D01* +X88233670Y-123379347D01* +X88195574Y-123341251D01* +X88119384Y-123303156D01* +X87928908Y-123303156D01* +X87852717Y-123341251D01* +X87814622Y-123379347D01* +X87776527Y-123455537D01* +X87776527Y-123607918D01* +X87814622Y-123684109D01* +X87852717Y-123722204D01* +X87928908Y-123760299D01* +X89671305Y-117753066D02* +X89290352Y-118019733D01* +X89671305Y-118210209D02* +X88871305Y-118210209D01* +X88871305Y-117905447D01* +X88909400Y-117829256D01* +X88947495Y-117791161D01* +X89023686Y-117753066D01* +X89137971Y-117753066D01* +X89214162Y-117791161D01* +X89252257Y-117829256D01* +X89290352Y-117905447D01* +X89290352Y-118210209D01* +X89671305Y-116991161D02* +X89671305Y-117448304D01* +X89671305Y-117219733D02* +X88871305Y-117219733D01* +X88985590Y-117295923D01* +X89061781Y-117372114D01* +X89099876Y-117448304D01* +X88871305Y-116724494D02* +X88871305Y-116191161D01* +X89671305Y-116534018D01* +X88030465Y-117793706D02* +X87649512Y-118060373D01* +X88030465Y-118250849D02* +X87230465Y-118250849D01* +X87230465Y-117946087D01* +X87268560Y-117869896D01* +X87306655Y-117831801D01* +X87382846Y-117793706D01* +X87497131Y-117793706D01* +X87573322Y-117831801D01* +X87611417Y-117869896D01* +X87649512Y-117946087D01* +X87649512Y-118250849D01* +X88030465Y-117031801D02* +X88030465Y-117488944D01* +X88030465Y-117260373D02* +X87230465Y-117260373D01* +X87344750Y-117336563D01* +X87420941Y-117412754D01* +X87459036Y-117488944D01* +X87573322Y-116574658D02* +X87535227Y-116650849D01* +X87497131Y-116688944D01* +X87420941Y-116727039D01* +X87382846Y-116727039D01* +X87306655Y-116688944D01* +X87268560Y-116650849D01* +X87230465Y-116574658D01* +X87230465Y-116422277D01* +X87268560Y-116346087D01* +X87306655Y-116307991D01* +X87382846Y-116269896D01* +X87420941Y-116269896D01* +X87497131Y-116307991D01* +X87535227Y-116346087D01* +X87573322Y-116422277D01* +X87573322Y-116574658D01* +X87611417Y-116650849D01* +X87649512Y-116688944D01* +X87725703Y-116727039D01* +X87878084Y-116727039D01* +X87954274Y-116688944D01* +X87992370Y-116650849D01* +X88030465Y-116574658D01* +X88030465Y-116422277D01* +X87992370Y-116346087D01* +X87954274Y-116307991D01* +X87878084Y-116269896D01* +X87725703Y-116269896D01* +X87649512Y-116307991D01* +X87611417Y-116346087D01* +X87573322Y-116422277D01* +X86727554Y-119980665D02* +X86460887Y-119599712D01* +X86270411Y-119980665D02* +X86270411Y-119180665D01* +X86575173Y-119180665D01* +X86651364Y-119218760D01* +X86689459Y-119256855D01* +X86727554Y-119333046D01* +X86727554Y-119447331D01* +X86689459Y-119523522D01* +X86651364Y-119561617D01* +X86575173Y-119599712D01* +X86270411Y-119599712D01* +X87489459Y-119980665D02* +X87032316Y-119980665D01* +X87260887Y-119980665D02* +X87260887Y-119180665D01* +X87184697Y-119294950D01* +X87108506Y-119371141D01* +X87032316Y-119409236D01* +X87870411Y-119980665D02* +X88022792Y-119980665D01* +X88098983Y-119942570D01* +X88137078Y-119904474D01* +X88213269Y-119790189D01* +X88251364Y-119637808D01* +X88251364Y-119333046D01* +X88213269Y-119256855D01* +X88175173Y-119218760D01* +X88098983Y-119180665D01* +X87946602Y-119180665D01* +X87870411Y-119218760D01* +X87832316Y-119256855D01* +X87794221Y-119333046D01* +X87794221Y-119523522D01* +X87832316Y-119599712D01* +X87870411Y-119637808D01* +X87946602Y-119675903D01* +X88098983Y-119675903D01* +X88175173Y-119637808D01* +X88213269Y-119599712D01* +X88251364Y-119523522D01* +X86615794Y-122342865D02* +X86349127Y-121961912D01* +X86158651Y-122342865D02* +X86158651Y-121542865D01* +X86463413Y-121542865D01* +X86539604Y-121580960D01* +X86577699Y-121619055D01* +X86615794Y-121695246D01* +X86615794Y-121809531D01* +X86577699Y-121885722D01* +X86539604Y-121923817D01* +X86463413Y-121961912D01* +X86158651Y-121961912D01* +X86920556Y-121619055D02* +X86958651Y-121580960D01* +X87034842Y-121542865D01* +X87225318Y-121542865D01* +X87301508Y-121580960D01* +X87339604Y-121619055D01* +X87377699Y-121695246D01* +X87377699Y-121771436D01* +X87339604Y-121885722D01* +X86882461Y-122342865D01* +X87377699Y-122342865D01* +X87872937Y-121542865D02* +X87949128Y-121542865D01* +X88025318Y-121580960D01* +X88063413Y-121619055D01* +X88101509Y-121695246D01* +X88139604Y-121847627D01* +X88139604Y-122038103D01* +X88101509Y-122190484D01* +X88063413Y-122266674D01* +X88025318Y-122304770D01* +X87949128Y-122342865D01* +X87872937Y-122342865D01* +X87796747Y-122304770D01* +X87758651Y-122266674D01* +X87720556Y-122190484D01* +X87682461Y-122038103D01* +X87682461Y-121847627D01* +X87720556Y-121695246D01* +X87758651Y-121619055D01* +X87796747Y-121580960D01* +X87872937Y-121542865D01* +X99056714Y-124476465D02* +X98790047Y-124095512D01* +X98599571Y-124476465D02* +X98599571Y-123676465D01* +X98904333Y-123676465D01* +X98980524Y-123714560D01* +X99018619Y-123752655D01* +X99056714Y-123828846D01* +X99056714Y-123943131D01* +X99018619Y-124019322D01* +X98980524Y-124057417D01* +X98904333Y-124095512D01* +X98599571Y-124095512D01* +X99361476Y-123752655D02* +X99399571Y-123714560D01* +X99475762Y-123676465D01* +X99666238Y-123676465D01* +X99742428Y-123714560D01* +X99780524Y-123752655D01* +X99818619Y-123828846D01* +X99818619Y-123905036D01* +X99780524Y-124019322D01* +X99323381Y-124476465D01* +X99818619Y-124476465D01* +X100580524Y-124476465D02* +X100123381Y-124476465D01* +X100351952Y-124476465D02* +X100351952Y-123676465D01* +X100275762Y-123790750D01* +X100199571Y-123866941D01* +X100123381Y-123905036D01* +X84855465Y-117730206D02* +X84474512Y-117996873D01* +X84855465Y-118187349D02* +X84055465Y-118187349D01* +X84055465Y-117882587D01* +X84093560Y-117806396D01* +X84131655Y-117768301D01* +X84207846Y-117730206D01* +X84322131Y-117730206D01* +X84398322Y-117768301D01* +X84436417Y-117806396D01* +X84474512Y-117882587D01* +X84474512Y-118187349D01* +X84131655Y-117425444D02* +X84093560Y-117387349D01* +X84055465Y-117311158D01* +X84055465Y-117120682D01* +X84093560Y-117044492D01* +X84131655Y-117006396D01* +X84207846Y-116968301D01* +X84284036Y-116968301D01* +X84398322Y-117006396D01* +X84855465Y-117463539D01* +X84855465Y-116968301D01* +X84131655Y-116663539D02* +X84093560Y-116625444D01* +X84055465Y-116549253D01* +X84055465Y-116358777D01* +X84093560Y-116282587D01* +X84131655Y-116244491D01* +X84207846Y-116206396D01* +X84284036Y-116206396D01* +X84398322Y-116244491D01* +X84855465Y-116701634D01* +X84855465Y-116206396D01* +X85112005Y-124887926D02* +X84731052Y-125154593D01* +X85112005Y-125345069D02* +X84312005Y-125345069D01* +X84312005Y-125040307D01* +X84350100Y-124964116D01* +X84388195Y-124926021D01* +X84464386Y-124887926D01* +X84578671Y-124887926D01* +X84654862Y-124926021D01* +X84692957Y-124964116D01* +X84731052Y-125040307D01* +X84731052Y-125345069D01* +X84388195Y-124583164D02* +X84350100Y-124545069D01* +X84312005Y-124468878D01* +X84312005Y-124278402D01* +X84350100Y-124202212D01* +X84388195Y-124164116D01* +X84464386Y-124126021D01* +X84540576Y-124126021D01* +X84654862Y-124164116D01* +X85112005Y-124621259D01* +X85112005Y-124126021D01* +X84312005Y-123859354D02* +X84312005Y-123364116D01* +X84616767Y-123630783D01* +X84616767Y-123516497D01* +X84654862Y-123440307D01* +X84692957Y-123402211D01* +X84769148Y-123364116D01* +X84959624Y-123364116D01* +X85035814Y-123402211D01* +X85073910Y-123440307D01* +X85112005Y-123516497D01* +X85112005Y-123745069D01* +X85073910Y-123821259D01* +X85035814Y-123859354D01* +X83636374Y-120036545D02* +X83369707Y-119655592D01* +X83179231Y-120036545D02* +X83179231Y-119236545D01* +X83483993Y-119236545D01* +X83560184Y-119274640D01* +X83598279Y-119312735D01* +X83636374Y-119388926D01* +X83636374Y-119503211D01* +X83598279Y-119579402D01* +X83560184Y-119617497D01* +X83483993Y-119655592D01* +X83179231Y-119655592D01* +X83941136Y-119312735D02* +X83979231Y-119274640D01* +X84055422Y-119236545D01* +X84245898Y-119236545D01* +X84322088Y-119274640D01* +X84360184Y-119312735D01* +X84398279Y-119388926D01* +X84398279Y-119465116D01* +X84360184Y-119579402D01* +X83903041Y-120036545D01* +X84398279Y-120036545D01* +X85083993Y-119503211D02* +X85083993Y-120036545D01* +X84893517Y-119198450D02* +X84703041Y-119769878D01* +X85198279Y-119769878D01* +X83610974Y-122309845D02* +X83344307Y-121928892D01* +X83153831Y-122309845D02* +X83153831Y-121509845D01* +X83458593Y-121509845D01* +X83534784Y-121547940D01* +X83572879Y-121586035D01* +X83610974Y-121662226D01* +X83610974Y-121776511D01* +X83572879Y-121852702D01* +X83534784Y-121890797D01* +X83458593Y-121928892D01* +X83153831Y-121928892D01* +X83915736Y-121586035D02* +X83953831Y-121547940D01* +X84030022Y-121509845D01* +X84220498Y-121509845D01* +X84296688Y-121547940D01* +X84334784Y-121586035D01* +X84372879Y-121662226D01* +X84372879Y-121738416D01* +X84334784Y-121852702D01* +X83877641Y-122309845D01* +X84372879Y-122309845D01* +X85096689Y-121509845D02* +X84715736Y-121509845D01* +X84677641Y-121890797D01* +X84715736Y-121852702D01* +X84791927Y-121814607D01* +X84982403Y-121814607D01* +X85058593Y-121852702D01* +X85096689Y-121890797D01* +X85134784Y-121966988D01* +X85134784Y-122157464D01* +X85096689Y-122233654D01* +X85058593Y-122271750D01* +X84982403Y-122309845D01* +X84791927Y-122309845D01* +X84715736Y-122271750D01* +X84677641Y-122233654D01* +X84096114Y-103336045D02* +X83829447Y-102955092D01* +X83638971Y-103336045D02* +X83638971Y-102536045D01* +X83943733Y-102536045D01* +X84019924Y-102574140D01* +X84058019Y-102612235D01* +X84096114Y-102688426D01* +X84096114Y-102802711D01* +X84058019Y-102878902D01* +X84019924Y-102916997D01* +X83943733Y-102955092D01* +X83638971Y-102955092D01* +X84400876Y-102612235D02* +X84438971Y-102574140D01* +X84515162Y-102536045D01* +X84705638Y-102536045D01* +X84781828Y-102574140D01* +X84819924Y-102612235D01* +X84858019Y-102688426D01* +X84858019Y-102764616D01* +X84819924Y-102878902D01* +X84362781Y-103336045D01* +X84858019Y-103336045D01* +X85543733Y-102536045D02* +X85391352Y-102536045D01* +X85315162Y-102574140D01* +X85277067Y-102612235D01* +X85200876Y-102726521D01* +X85162781Y-102878902D01* +X85162781Y-103183664D01* +X85200876Y-103259854D01* +X85238971Y-103297950D01* +X85315162Y-103336045D01* +X85467543Y-103336045D01* +X85543733Y-103297950D01* +X85581829Y-103259854D01* +X85619924Y-103183664D01* +X85619924Y-102993188D01* +X85581829Y-102916997D01* +X85543733Y-102878902D01* +X85467543Y-102840807D01* +X85315162Y-102840807D01* +X85238971Y-102878902D01* +X85200876Y-102916997D01* +X85162781Y-102993188D01* +X84040234Y-104938785D02* +X83773567Y-104557832D01* +X83583091Y-104938785D02* +X83583091Y-104138785D01* +X83887853Y-104138785D01* +X83964044Y-104176880D01* +X84002139Y-104214975D01* +X84040234Y-104291166D01* +X84040234Y-104405451D01* +X84002139Y-104481642D01* +X83964044Y-104519737D01* +X83887853Y-104557832D01* +X83583091Y-104557832D01* +X84344996Y-104214975D02* +X84383091Y-104176880D01* +X84459282Y-104138785D01* +X84649758Y-104138785D01* +X84725948Y-104176880D01* +X84764044Y-104214975D01* +X84802139Y-104291166D01* +X84802139Y-104367356D01* +X84764044Y-104481642D01* +X84306901Y-104938785D01* +X84802139Y-104938785D01* +X85068806Y-104138785D02* +X85602139Y-104138785D01* +X85259282Y-104938785D01* +X99110054Y-117252705D02* +X98843387Y-116871752D01* +X98652911Y-117252705D02* +X98652911Y-116452705D01* +X98957673Y-116452705D01* +X99033864Y-116490800D01* +X99071959Y-116528895D01* +X99110054Y-116605086D01* +X99110054Y-116719371D01* +X99071959Y-116795562D01* +X99033864Y-116833657D01* +X98957673Y-116871752D01* +X98652911Y-116871752D01* +X99414816Y-116528895D02* +X99452911Y-116490800D01* +X99529102Y-116452705D01* +X99719578Y-116452705D01* +X99795768Y-116490800D01* +X99833864Y-116528895D01* +X99871959Y-116605086D01* +X99871959Y-116681276D01* +X99833864Y-116795562D01* +X99376721Y-117252705D01* +X99871959Y-117252705D01* +X100329102Y-116795562D02* +X100252911Y-116757467D01* +X100214816Y-116719371D01* +X100176721Y-116643181D01* +X100176721Y-116605086D01* +X100214816Y-116528895D01* +X100252911Y-116490800D01* +X100329102Y-116452705D01* +X100481483Y-116452705D01* +X100557673Y-116490800D01* +X100595769Y-116528895D01* +X100633864Y-116605086D01* +X100633864Y-116643181D01* +X100595769Y-116719371D01* +X100557673Y-116757467D01* +X100481483Y-116795562D01* +X100329102Y-116795562D01* +X100252911Y-116833657D01* +X100214816Y-116871752D01* +X100176721Y-116947943D01* +X100176721Y-117100324D01* +X100214816Y-117176514D01* +X100252911Y-117214610D01* +X100329102Y-117252705D01* +X100481483Y-117252705D01* +X100557673Y-117214610D01* +X100595769Y-117176514D01* +X100633864Y-117100324D01* +X100633864Y-116947943D01* +X100595769Y-116871752D01* +X100557673Y-116833657D01* +X100481483Y-116795562D01* +X86394705Y-117768306D02* +X86013752Y-118034973D01* +X86394705Y-118225449D02* +X85594705Y-118225449D01* +X85594705Y-117920687D01* +X85632800Y-117844496D01* +X85670895Y-117806401D01* +X85747086Y-117768306D01* +X85861371Y-117768306D01* +X85937562Y-117806401D01* +X85975657Y-117844496D01* +X86013752Y-117920687D01* +X86013752Y-118225449D01* +X85670895Y-117463544D02* +X85632800Y-117425449D01* +X85594705Y-117349258D01* +X85594705Y-117158782D01* +X85632800Y-117082592D01* +X85670895Y-117044496D01* +X85747086Y-117006401D01* +X85823276Y-117006401D01* +X85937562Y-117044496D01* +X86394705Y-117501639D01* +X86394705Y-117006401D01* +X86394705Y-116625449D02* +X86394705Y-116473068D01* +X86356610Y-116396877D01* +X86318514Y-116358782D01* +X86204229Y-116282591D01* +X86051848Y-116244496D01* +X85747086Y-116244496D01* +X85670895Y-116282591D01* +X85632800Y-116320687D01* +X85594705Y-116396877D01* +X85594705Y-116549258D01* +X85632800Y-116625449D01* +X85670895Y-116663544D01* +X85747086Y-116701639D01* +X85937562Y-116701639D01* +X86013752Y-116663544D01* +X86051848Y-116625449D01* +X86089943Y-116549258D01* +X86089943Y-116396877D01* +X86051848Y-116320687D01* +X86013752Y-116282591D01* +X85937562Y-116244496D01* +X86651245Y-124908246D02* +X86270292Y-125174913D01* +X86651245Y-125365389D02* +X85851245Y-125365389D01* +X85851245Y-125060627D01* +X85889340Y-124984436D01* +X85927435Y-124946341D01* +X86003626Y-124908246D01* +X86117911Y-124908246D01* +X86194102Y-124946341D01* +X86232197Y-124984436D01* +X86270292Y-125060627D01* +X86270292Y-125365389D01* +X85851245Y-124641579D02* +X85851245Y-124146341D01* +X86156007Y-124413008D01* +X86156007Y-124298722D01* +X86194102Y-124222532D01* +X86232197Y-124184436D01* +X86308388Y-124146341D01* +X86498864Y-124146341D01* +X86575054Y-124184436D01* +X86613150Y-124222532D01* +X86651245Y-124298722D01* +X86651245Y-124527294D01* +X86613150Y-124603484D01* +X86575054Y-124641579D01* +X85851245Y-123651103D02* +X85851245Y-123574912D01* +X85889340Y-123498722D01* +X85927435Y-123460627D01* +X86003626Y-123422531D01* +X86156007Y-123384436D01* +X86346483Y-123384436D01* +X86498864Y-123422531D01* +X86575054Y-123460627D01* +X86613150Y-123498722D01* +X86651245Y-123574912D01* +X86651245Y-123651103D01* +X86613150Y-123727293D01* +X86575054Y-123765389D01* +X86498864Y-123803484D01* +X86346483Y-123841579D01* +X86156007Y-123841579D01* +X86003626Y-123803484D01* +X85927435Y-123765389D01* +X85889340Y-123727293D01* +X85851245Y-123651103D01* +X111493836Y-106440025D02* +X111493836Y-107087644D01* +X111531931Y-107163834D01* +X111570027Y-107201930D01* +X111646217Y-107240025D01* +X111798598Y-107240025D01* +X111874789Y-107201930D01* +X111912884Y-107163834D01* +X111950979Y-107087644D01* +X111950979Y-106440025D01* +X112750979Y-107240025D02* +X112293836Y-107240025D01* +X112522407Y-107240025D02* +X112522407Y-106440025D01* +X112446217Y-106554310D01* +X112370026Y-106630501D01* +X112293836Y-106668596D01* +X93884016Y-120237305D02* +X93884016Y-120884924D01* +X93922111Y-120961114D01* +X93960207Y-120999210D01* +X94036397Y-121037305D01* +X94188778Y-121037305D01* +X94264969Y-120999210D01* +X94303064Y-120961114D01* +X94341159Y-120884924D01* +X94341159Y-120237305D01* +X94684016Y-120313495D02* +X94722111Y-120275400D01* +X94798302Y-120237305D01* +X94988778Y-120237305D01* +X95064968Y-120275400D01* +X95103064Y-120313495D01* +X95141159Y-120389686D01* +X95141159Y-120465876D01* +X95103064Y-120580162D01* +X94645921Y-121037305D01* +X95141159Y-121037305D01* +X88950876Y-120387165D02* +X88950876Y-121034784D01* +X88988971Y-121110974D01* +X89027067Y-121149070D01* +X89103257Y-121187165D01* +X89255638Y-121187165D01* +X89331829Y-121149070D01* +X89369924Y-121110974D01* +X89408019Y-121034784D01* +X89408019Y-120387165D01* +X89712781Y-120387165D02* +X90208019Y-120387165D01* +X89941352Y-120691927D01* +X90055638Y-120691927D01* +X90131828Y-120730022D01* +X90169924Y-120768117D01* +X90208019Y-120844308D01* +X90208019Y-121034784D01* +X90169924Y-121110974D01* +X90131828Y-121149070D01* +X90055638Y-121187165D01* +X89827066Y-121187165D01* +X89750876Y-121149070D01* +X89712781Y-121110974D01* +X108151196Y-97069965D02* +X108151196Y-97717584D01* +X108189291Y-97793774D01* +X108227387Y-97831870D01* +X108303577Y-97869965D01* +X108455958Y-97869965D01* +X108532149Y-97831870D01* +X108570244Y-97793774D01* +X108608339Y-97717584D01* +X108608339Y-97069965D01* +X109332148Y-97336631D02* +X109332148Y-97869965D01* +X109141672Y-97031870D02* +X108951196Y-97603298D01* +X109446434Y-97603298D01* +X112864054Y-112607073D02* +X112902150Y-112645168D01* +X112940245Y-112759454D01* +X112940245Y-112835644D01* +X112902150Y-112949930D01* +X112825959Y-113026121D01* +X112749769Y-113064216D01* +X112597388Y-113102311D01* +X112483102Y-113102311D01* +X112330721Y-113064216D01* +X112254530Y-113026121D01* +X112178340Y-112949930D01* +X112140245Y-112835644D01* +X112140245Y-112759454D01* +X112178340Y-112645168D01* +X112216435Y-112607073D01* +X112140245Y-111921359D02* +X112140245Y-112073740D01* +X112178340Y-112149930D01* +X112216435Y-112188025D01* +X112330721Y-112264216D01* +X112483102Y-112302311D01* +X112787864Y-112302311D01* +X112864054Y-112264216D01* +X112902150Y-112226121D01* +X112940245Y-112149930D01* +X112940245Y-111997549D01* +X112902150Y-111921359D01* +X112864054Y-111883263D01* +X112787864Y-111845168D01* +X112597388Y-111845168D01* +X112521197Y-111883263D01* +X112483102Y-111921359D01* +X112445007Y-111997549D01* +X112445007Y-112149930D01* +X112483102Y-112226121D01* +X112521197Y-112264216D01* +X112597388Y-112302311D01* +X89887214Y-99198413D02* +X89925310Y-99236508D01* +X89963405Y-99350794D01* +X89963405Y-99426984D01* +X89925310Y-99541270D01* +X89849119Y-99617461D01* +X89772929Y-99655556D01* +X89620548Y-99693651D01* +X89506262Y-99693651D01* +X89353881Y-99655556D01* +X89277690Y-99617461D01* +X89201500Y-99541270D01* +X89163405Y-99426984D01* +X89163405Y-99350794D01* +X89201500Y-99236508D01* +X89239595Y-99198413D01* +X89963405Y-98817461D02* +X89963405Y-98665080D01* +X89925310Y-98588889D01* +X89887214Y-98550794D01* +X89772929Y-98474603D01* +X89620548Y-98436508D01* +X89315786Y-98436508D01* +X89239595Y-98474603D01* +X89201500Y-98512699D01* +X89163405Y-98588889D01* +X89163405Y-98741270D01* +X89201500Y-98817461D01* +X89239595Y-98855556D01* +X89315786Y-98893651D01* +X89506262Y-98893651D01* +X89582452Y-98855556D01* +X89620548Y-98817461D01* +X89658643Y-98741270D01* +X89658643Y-98588889D01* +X89620548Y-98512699D01* +X89582452Y-98474603D01* +X89506262Y-98436508D01* +X91124185Y-107382236D02* +X90324185Y-107382236D01* +X90324185Y-107077474D01* +X90362280Y-107001283D01* +X90400375Y-106963188D01* +X90476566Y-106925093D01* +X90590851Y-106925093D01* +X90667042Y-106963188D01* +X90705137Y-107001283D01* +X90743232Y-107077474D01* +X90743232Y-107382236D01* +X90324185Y-106658426D02* +X90324185Y-106125093D01* +X91124185Y-106467950D01* +X91149585Y-105086029D02* +X90349585Y-105086029D01* +X90349585Y-104781267D01* +X90387680Y-104705076D01* +X90425775Y-104666981D01* +X90501966Y-104628886D01* +X90616251Y-104628886D01* +X90692442Y-104666981D01* +X90730537Y-104705076D01* +X90768632Y-104781267D01* +X90768632Y-105086029D01* +X91149585Y-103866981D02* +X91149585Y-104324124D01* +X91149585Y-104095553D02* +X90349585Y-104095553D01* +X90463870Y-104171743D01* +X90540061Y-104247934D01* +X90578156Y-104324124D01* +X90349585Y-103371743D02* +X90349585Y-103295552D01* +X90387680Y-103219362D01* +X90425775Y-103181267D01* +X90501966Y-103143171D01* +X90654347Y-103105076D01* +X90844823Y-103105076D01* +X90997204Y-103143171D01* +X91073394Y-103181267D01* +X91111490Y-103219362D01* +X91149585Y-103295552D01* +X91149585Y-103371743D01* +X91111490Y-103447933D01* +X91073394Y-103486029D01* +X90997204Y-103524124D01* +X90844823Y-103562219D01* +X90654347Y-103562219D01* +X90501966Y-103524124D01* +X90425775Y-103486029D01* +X90387680Y-103447933D01* +X90349585Y-103371743D01* +M02* diff --git a/PCB/OUTPUT_V4/OUTPUT_V4.zip b/PCB/OUTPUT_V4/OUTPUT_V4.zip new file mode 100644 index 00000000..8e2a84d5 Binary files /dev/null and b/PCB/OUTPUT_V4/OUTPUT_V4.zip differ diff --git a/PCB/OUTPUT_V4/Tinylab_proto1.net b/PCB/OUTPUT_V4/Tinylab_proto1.net new file mode 100644 index 00000000..be518cf1 --- /dev/null +++ b/PCB/OUTPUT_V4/Tinylab_proto1.net @@ -0,0 +1,956 @@ +(export (version D) + (design + (source C:/Users/Esposch/Documents/KiCAD/Tinylab_proto1/Tinylab_proto1.sch) + (date "18/03/2016 11:27:57 AM") + (tool "Eeschema (2015-08-05 BZR 6055, Git fa29c62)-product") + (sheet (number 1) (name /) (tstamps /) + (title_block + (title) + (company) + (rev) + (date) + (source Tinylab_proto1.sch) + (comment (number 1) (value "")) + (comment (number 2) (value "")) + (comment (number 3) (value "")) + (comment (number 4) (value ""))))) + (components + (comp (ref U2) + (value LM324) + (footprint Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm) + (libsource (lib linear) (part LM324)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CA87E2)) + (comp (ref IC1) + (value ATXMEGA16A4U-A) + (footprint Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm) + (libsource (lib atmel) (part ATXMEGA16A4U-A)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CA8F25)) + (comp (ref P2) + (value USB_OTG) + (footprint Connect:USB_Micro-B) + (libsource (lib conn) (part USB_OTG)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CA90D2)) + (comp (ref U1) + (value 78L05) + (footprint SMD:SOT-23-3) + (libsource (lib regul) (part 78L05)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CA99FA)) + (comp (ref R1) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAAB95)) + (comp (ref R3) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAABF4)) + (comp (ref R5) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAAC5F)) + (comp (ref R6) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAACD2)) + (comp (ref R4) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAAD11)) + (comp (ref R2) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAAD4C)) + (comp (ref C2) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAB4DE)) + (comp (ref C1) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAB611)) + (comp (ref C3) + (value C_Small) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB13E1)) + (comp (ref C4) + (value C_Small) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB147C)) + (comp (ref R22) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB4680)) + (comp (ref C13) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB630B)) + (comp (ref R24) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB9020)) + (comp (ref R11) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBCD2A)) + (comp (ref R7) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBCDA5)) + (comp (ref R13) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE0F4)) + (comp (ref R9) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE16B)) + (comp (ref R14) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE21C)) + (comp (ref R10) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE2C7)) + (comp (ref R12) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE362)) + (comp (ref R8) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE401)) + (comp (ref P3) + (value DIG_OUT) + (footprint Pin_Headers:Pin_Header_Straight_1x04) + (libsource (lib conn) (part CONN_01X04)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBF4D5)) + (comp (ref P7) + (value HVO) + (footprint Pin_Headers:Pin_Header_Straight_2x02) + (libsource (lib conn) (part CONN_02X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CC540F)) + (comp (ref C5) + (value C_Small) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D60181)) + (comp (ref U4) + (value DMN63D8LDW) + (footprint TO_SOT_Packages_SMD:SOT-363) + (libsource (lib ESPO_PART) (part DMN63D8LDW)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D6ACFD)) + (comp (ref P8) + (value DIG_IN) + (footprint Pin_Headers:Pin_Header_Straight_1x02) + (libsource (lib conn) (part CONN_01X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D6DB77)) + (comp (ref F1) + (value F_Small) + (footprint Capacitors_SMD:C_1206) + (libsource (lib device) (part F_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D739F3)) + (comp (ref L1) + (value INDUCTOR) + (footprint Inductors:INDUCTOR_V) + (libsource (lib device) (part INDUCTOR)) + (sheetpath (names /) (tstamps /)) + (tstamp 5606EE9E)) + (comp (ref D1) + (value D_Schottky) + (footprint Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10) + (libsource (lib device) (part D_Schottky)) + (sheetpath (names /) (tstamps /)) + (tstamp 5606FDB4)) + (comp (ref C9) + (value CP1) + (footprint Capacitors_SMD:c_elec_4x5.3) + (libsource (lib device) (part CP1)) + (sheetpath (names /) (tstamps /)) + (tstamp 560719D9)) + (comp (ref C10) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 56071A50)) + (comp (ref C16) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 5607355F)) + (comp (ref C15) + (value CP1) + (footprint Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5) + (libsource (lib device) (part CP1)) + (sheetpath (names /) (tstamps /)) + (tstamp 560735FE)) + (comp (ref P4) + (value PDI) + (footprint Pin_Headers:Pin_Header_Straight_2x02) + (libsource (lib conn) (part CONN_02X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 56069A87)) + (comp (ref Q1) + (value Q_NMOS_GSD) + (footprint SMD:SOT-23-3) + (libsource (lib device) (part Q_NMOS_GSD)) + (sheetpath (names /) (tstamps /)) + (tstamp 5606F6D4)) + (comp (ref R23) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 566DE721)) + (comp (ref R25) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 566DE7E8)) + (comp (ref C14) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 566DF655)) + (comp (ref P6) + (value DAC_OUT) + (footprint Pin_Headers:Pin_Header_Straight_1x04) + (libsource (lib conn) (part CONN_01X04)) + (sheetpath (names /) (tstamps /)) + (tstamp 566DF832)) + (comp (ref R26) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 566E5C29)) + (comp (ref R27) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 566E5CBE)) + (comp (ref C6) + (value CP1) + (footprint Capacitors_SMD:c_elec_5x5.3) + (libsource (lib device) (part CP1)) + (sheetpath (names /) (tstamps /)) + (tstamp 566F5A75)) + (comp (ref R19) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AECD86)) + (comp (ref C11) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 5608B4BE)) + (comp (ref C8) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AF91A3)) + (comp (ref R17) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AFE83E)) + (comp (ref R18) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AFE8F3)) + (comp (ref U3) + (value DMN63D8LDW) + (footprint TO_SOT_Packages_SMD:SOT-363) + (libsource (lib ESPO_PART) (part DMN63D8LDW)) + (sheetpath (names /) (tstamps /)) + (tstamp 56B012DD)) + (comp (ref R20) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56B0C682)) + (comp (ref R15) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56B0C779)) + (comp (ref R16) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56B0C86E)) + (comp (ref L2) + (value INDUCTOR) + (footprint Resistors_SMD:R_1210) + (libsource (lib device) (part INDUCTOR)) + (sheetpath (names /) (tstamps /)) + (tstamp 56E88440)) + (comp (ref L3) + (value INDUCTOR) + (footprint Resistors_SMD:R_1210) + (libsource (lib device) (part INDUCTOR)) + (sheetpath (names /) (tstamps /)) + (tstamp 56E8DA35)) + (comp (ref C7) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 56E8E263)) + (comp (ref R21) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56E9851A)) + (comp (ref R28) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56E985EF)) + (comp (ref R29) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56E9888A)) + (comp (ref R30) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56E98921)) + (comp (ref P1) + (value SCOPE_IN_CH1) + (footprint Pin_Headers:Pin_Header_Straight_1x02) + (libsource (lib conn) (part CONN_01X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 56EA2C80)) + (comp (ref P9) + (value SCOPE_IN_AC) + (footprint Pin_Headers:Pin_Header_Straight_1x02) + (libsource (lib conn) (part CONN_01X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 56EA2D2D)) + (comp (ref P5) + (value SCOPE_IN_CH2) + (footprint Pin_Headers:Pin_Header_Straight_1x02) + (libsource (lib conn) (part CONN_01X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 56EA3310))) + (libparts + (libpart (lib device) (part C) + (description "Unpolarized capacitor") + (footprints + (fp C?) + (fp C_????_*) + (fp C_????) + (fp SMD*_c) + (fp Capacitor*)) + (fields + (field (name Reference) C) + (field (name Value) C)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib device) (part CP1) + (description "Polarised capacitor") + (footprints + (fp SMD*_Pol) + (fp c_elec*) + (fp C*elec) + (fp TantalC*) + (fp Elko*) + (fp CP*)) + (fields + (field (name Reference) C) + (field (name Value) CP1)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib device) (part C_Small) + (description "Unpolarized capacitor") + (footprints + (fp C?) + (fp C_????_*) + (fp C_????) + (fp SMD*_c) + (fp Capacitor*)) + (fields + (field (name Reference) C) + (field (name Value) C_Small)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib device) (part D_Schottky) + (description "Diode schottky") + (footprints + (fp D-Pak_TO252AA) + (fp Diode_*) + (fp *SingleDiode) + (fp *SingleDiode*) + (fp *_Diode_*)) + (fields + (field (name Reference) D) + (field (name Value) D_Schottky)) + (pins + (pin (num 1) (name K) (type passive)) + (pin (num 2) (name A) (type passive)))) + (libpart (lib device) (part F_Small) + (description Fuse) + (footprints + (fp CP*) + (fp SM*)) + (fields + (field (name Reference) F) + (field (name Value) F_Small)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib device) (part INDUCTOR) + (fields + (field (name Reference) L) + (field (name Value) INDUCTOR)) + (pins + (pin (num 1) (name 1) (type passive)) + (pin (num 2) (name 2) (type passive)))) + (libpart (lib device) (part Q_NMOS_GSD) + (description "Transistor N-MOSFET (general)") + (fields + (field (name Reference) Q) + (field (name Value) Q_NMOS_GSD)) + (pins + (pin (num 1) (name G) (type input)) + (pin (num 2) (name S) (type passive)) + (pin (num 3) (name D) (type passive)))) + (libpart (lib device) (part R) + (description Resistor) + (footprints + (fp R_*) + (fp Resistor_*)) + (fields + (field (name Reference) R) + (field (name Value) R)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib conn) (part CONN_01X02) + (footprints + (fp Pin_Header_Straight_1X02) + (fp Pin_Header_Angled_1X02) + (fp Socket_Strip_Straight_1X02) + (fp Socket_Strip_Angled_1X02)) + (fields + (field (name Reference) P) + (field (name Value) CONN_01X02)) + (pins + (pin (num 1) (name P1) (type passive)) + (pin (num 2) (name P2) (type passive)))) + (libpart (lib conn) (part CONN_01X04) + (footprints + (fp Pin_Header_Straight_1X04) + (fp Pin_Header_Angled_1X04) + (fp Socket_Strip_Straight_1X04) + (fp Socket_Strip_Angled_1X04)) + (fields + (field (name Reference) P) + (field (name Value) CONN_01X04)) + (pins + (pin (num 1) (name P1) (type passive)) + (pin (num 2) (name P2) (type passive)) + (pin (num 3) (name P3) (type passive)) + (pin (num 4) (name P4) (type passive)))) + (libpart (lib conn) (part CONN_02X02) + (footprints + (fp Pin_Header_Straight_2X02) + (fp Pin_Header_Angled_2X02) + (fp Socket_Strip_Straight_2X02) + (fp Socket_Strip_Angled_2X02)) + (fields + (field (name Reference) P) + (field (name Value) CONN_02X02)) + (pins + (pin (num 1) (name P1) (type passive)) + (pin (num 2) (name P2) (type passive)) + (pin (num 3) (name P3) (type passive)) + (pin (num 4) (name P4) (type passive)))) + (libpart (lib conn) (part USB_OTG) + (description "micro/mini connector") + (footprints + (fp USB*)) + (fields + (field (name Reference) P) + (field (name Value) USB_OTG)) + (pins + (pin (num 1) (name VCC) (type power_out)) + (pin (num 2) (name D-) (type passive)) + (pin (num 3) (name D+) (type passive)) + (pin (num 4) (name ID) (type power_in)) + (pin (num 5) (name GND) (type power_in)) + (pin (num 6) (name shield) (type passive)))) + (libpart (lib linear) (part LM2902N) + (aliases + (alias LM324) + (alias TLC274) + (alias TL074) + (alias LM324N) + (alias LM324AN)) + (description "Quad Op amp.") + (docs op_amps/lm324.pdf) + (fields + (field (name Reference) U) + (field (name Value) LM2902N)) + (pins + (pin (num 1) (name ~) (type output)) + (pin (num 2) (name -) (type input)) + (pin (num 3) (name +) (type input)) + (pin (num 4) (name V+) (type power_in)) + (pin (num 5) (name +) (type input)) + (pin (num 6) (name -) (type input)) + (pin (num 7) (name ~) (type output)) + (pin (num 8) (name ~) (type output)) + (pin (num 9) (name -) (type input)) + (pin (num 10) (name +) (type input)) + (pin (num 11) (name V-) (type power_in)) + (pin (num 12) (name +) (type input)) + (pin (num 13) (name -) (type input)) + (pin (num 14) (name ~) (type output)))) + (libpart (lib regul) (part 7805) + (aliases + (alias LM7805) + (alias LM7812) + (alias 78L05)) + (description "Linear Regulator +5V") + (docs regulator\lm78xx.pdf) + (fields + (field (name Reference) U) + (field (name Value) 7805)) + (pins + (pin (num 1) (name GND) (type input)) + (pin (num 2) (name VO) (type power_out)) + (pin (num 3) (name VI) (type input)))) + (libpart (lib atmel) (part ATXMEGA16A4U-A) + (aliases + (alias ATXMEGA32A4U-A) + (alias ATXMEGA64A4U-A) + (alias ATXMEGA128A4U-A)) + (description "TQFP44, 16k Flash, 4k Boot, 2k SRAM, 1k EEPROM, JTAG, USB") + (docs http://www.atmel.com/Images/Atmel-8387-8-and16-bit-AVR-Microcontroller-XMEGA-A4U_Datasheet.pdf) + (fields + (field (name Reference) IC) + (field (name Value) ATXMEGA16A4U-A) + (field (name Footprint) TQFP44)) + (pins + (pin (num 1) (name AC5/ADC5/PA5) (type BiDi)) + (pin (num 2) (name AC1OUT/AC6/ADC6/PA6) (type BiDi)) + (pin (num 3) (name AC0OUT/AC7/ADC7/PA7) (type BiDi)) + (pin (num 4) (name AREFB/ADC8/PB0) (type BiDi)) + (pin (num 5) (name ADC9/PB1) (type BiDi)) + (pin (num 6) (name DAC0/ADC10/PB2) (type BiDi)) + (pin (num 7) (name DAC1/ACD11/PB3) (type BiDi)) + (pin (num 8) (name GND) (type power_in)) + (pin (num 9) (name VCC) (type power_in)) + (pin (num 10) (name SDAIN/SDA/~OC0ALS~/OC0A/PC0) (type BiDi)) + (pin (num 11) (name SCLIN/SCL/XCK0/OC0AHS/OC0B/PC1) (type BiDi)) + (pin (num 12) (name SDAOUT/RXD0/~OC0BLS~/OC0C/PC2) (type BiDi)) + (pin (num 13) (name SCLOUT/TXD0/OC0BHS/OC0D/PC3) (type BiDi)) + (pin (num 14) (name ~SS~/~OC0CLS~/OC1A/PC4) (type BiDi)) + (pin (num 15) (name MOSI/XCK1/OC0CHS/OC1B/PC5) (type BiDi)) + (pin (num 16) (name CLKRTC/MISO/RXD1/~OC0DLS~/PC6) (type BiDi)) + (pin (num 17) (name EVOUT/CLKOUT/SCK/TXD1/OC0DHS/PC7) (type BiDi)) + (pin (num 18) (name GND) (type power_in)) + (pin (num 19) (name VCC) (type power_in)) + (pin (num 20) (name PD0/OC0A) (type BiDi)) + (pin (num 21) (name PD1/OC0B/XCK0) (type BiDi)) + (pin (num 22) (name PD2/OC0C/RXD0) (type BiDi)) + (pin (num 23) (name PD3/OC0D/TXD0) (type BiDi)) + (pin (num 24) (name PD4/OC1A/~SS~) (type BiDi)) + (pin (num 25) (name PD5/OC1B/XCK1/MOSI) (type BiDi)) + (pin (num 26) (name PD6/D-/RXD1/MISO) (type BiDi)) + (pin (num 27) (name PD7/D+/TXD1/SCK/CLKOUT/EVOUT) (type BiDi)) + (pin (num 28) (name PE0/OC0A/SDA) (type BiDi)) + (pin (num 29) (name PE1/OC0B/XCK0/SCL) (type BiDi)) + (pin (num 30) (name GND) (type power_in)) + (pin (num 31) (name VCC) (type power_in)) + (pin (num 32) (name PE2/OC0C/RXD0) (type BiDi)) + (pin (num 33) (name PE3/OC0D/TXD0) (type BiDi)) + (pin (num 34) (name PDI_DATA) (type input)) + (pin (num 35) (name ~RESET~/PDI_CLK) (type input)) + (pin (num 36) (name PR0/XTAL2/TOSC2) (type BiDi)) + (pin (num 37) (name PR1/XTAL1/TOSC1) (type BiDi)) + (pin (num 38) (name GND) (type power_in)) + (pin (num 39) (name AVCC) (type power_in)) + (pin (num 40) (name AREFA/AC0/ADC0/PA0) (type BiDi)) + (pin (num 41) (name AC1/ADC1/PA1) (type BiDi)) + (pin (num 42) (name AC2/ADC2/PA2) (type BiDi)) + (pin (num 43) (name AC3/ADC3/PA3) (type BiDi)) + (pin (num 44) (name AC4/ADC4/PA4) (type BiDi)))) + (libpart (lib ESPO_PART) (part DMN63D8LDW) + (fields + (field (name Reference) U) + (field (name Value) DMN63D8LDW)) + (pins + (pin (num 1) (name S1) (type input)) + (pin (num 2) (name G1) (type input)) + (pin (num 3) (name D2) (type input)) + (pin (num 4) (name S2) (type input)) + (pin (num 5) (name G2) (type input)) + (pin (num 6) (name D1) (type input))))) + (libraries + (library (logical device) + (uri C:\KiCad\share\kicad\library\device.lib)) + (library (logical conn) + (uri C:\KiCad\share\kicad\library\conn.lib)) + (library (logical linear) + (uri C:\KiCad\share\kicad\library\linear.lib)) + (library (logical regul) + (uri C:\KiCad\share\kicad\library\regul.lib)) + (library (logical atmel) + (uri C:\KiCad\share\kicad\library\atmel.lib)) + (library (logical ESPO_PART) + (uri C:\Users\Esposch\Documents\KiCAD\ESPO_PART.lib))) + (nets + (net (code 1) (name "Net-(IC1-Pad28)") + (node (ref IC1) (pin 28)) + (node (ref R11) (pin 1))) + (net (code 2) (name "Net-(P3-Pad3)") + (node (ref R8) (pin 2)) + (node (ref P3) (pin 3))) + (net (code 3) (name "Net-(P3-Pad4)") + (node (ref R7) (pin 2)) + (node (ref P3) (pin 4))) + (net (code 4) (name "Net-(IC1-Pad33)") + (node (ref R14) (pin 1)) + (node (ref IC1) (pin 33))) + (net (code 5) (name "Net-(IC1-Pad32)") + (node (ref R13) (pin 1)) + (node (ref IC1) (pin 32))) + (net (code 6) (name "Net-(IC1-Pad29)") + (node (ref R12) (pin 1)) + (node (ref IC1) (pin 29))) + (net (code 7) (name "Net-(R10-Pad1)") + (node (ref R14) (pin 2)) + (node (ref R10) (pin 1))) + (net (code 8) (name "Net-(R13-Pad2)") + (node (ref R13) (pin 2)) + (node (ref R9) (pin 1))) + (net (code 9) (name "Net-(R12-Pad2)") + (node (ref R12) (pin 2)) + (node (ref R8) (pin 1))) + (net (code 10) (name "Net-(R11-Pad2)") + (node (ref R11) (pin 2)) + (node (ref R7) (pin 1))) + (net (code 11) (name "Net-(R22-Pad1)") + (node (ref R24) (pin 2)) + (node (ref R22) (pin 1))) + (net (code 12) (name "Net-(R1-Pad1)") + (node (ref R3) (pin 1)) + (node (ref R1) (pin 1)) + (node (ref U2) (pin 3))) + (net (code 13) (name "Net-(P8-Pad1)") + (node (ref U4) (pin 5)) + (node (ref P8) (pin 1))) + (net (code 14) (name "Net-(D1-Pad2)") + (node (ref D1) (pin 2)) + (node (ref L1) (pin 1)) + (node (ref Q1) (pin 3))) + (net (code 15) (name "Net-(P8-Pad2)") + (node (ref U4) (pin 2)) + (node (ref P8) (pin 2))) + (net (code 16) (name /AVCC_ON_2) + (node (ref IC1) (pin 44)) + (node (ref R3) (pin 2)) + (node (ref R5) (pin 2)) + (node (ref R4) (pin 1)) + (node (ref R6) (pin 2))) + (net (code 17) (name /DIG_CH1) + (node (ref IC1) (pin 17)) + (node (ref U4) (pin 6))) + (net (code 18) (name /AVCC) + (node (ref IC1) (pin 39)) + (node (ref C8) (pin 1)) + (node (ref C5) (pin 1)) + (node (ref R5) (pin 1)) + (node (ref L2) (pin 2))) + (net (code 19) (name /D-) + (node (ref IC1) (pin 26)) + (node (ref P2) (pin 2))) + (net (code 20) (name /D+) + (node (ref P2) (pin 3)) + (node (ref IC1) (pin 27))) + (net (code 21) (name "Net-(P3-Pad1)") + (node (ref R10) (pin 2)) + (node (ref P3) (pin 1))) + (net (code 22) (name "Net-(P3-Pad2)") + (node (ref R9) (pin 2)) + (node (ref P3) (pin 2))) + (net (code 23) (name /USBGND) + (node (ref C5) (pin 2)) + (node (ref U4) (pin 1)) + (node (ref F1) (pin 1)) + (node (ref P4) (pin 3)) + (node (ref U2) (pin 11)) + (node (ref IC1) (pin 38)) + (node (ref C8) (pin 2)) + (node (ref U3) (pin 1)) + (node (ref U3) (pin 4)) + (node (ref IC1) (pin 18)) + (node (ref C11) (pin 2)) + (node (ref IC1) (pin 14)) + (node (ref R6) (pin 1)) + (node (ref C4) (pin 2)) + (node (ref U1) (pin 1)) + (node (ref P2) (pin 6)) + (node (ref P2) (pin 5)) + (node (ref R27) (pin 2)) + (node (ref C6) (pin 2)) + (node (ref U4) (pin 4)) + (node (ref C3) (pin 2)) + (node (ref IC1) (pin 30)) + (node (ref IC1) (pin 8)) + (node (ref R21) (pin 2)) + (node (ref R28) (pin 1)) + (node (ref R29) (pin 2)) + (node (ref R30) (pin 1)) + (node (ref C7) (pin 2))) + (net (code 24) (name "Net-(R20-Pad1)") + (node (ref U2) (pin 14)) + (node (ref R30) (pin 2)) + (node (ref R20) (pin 1)) + (node (ref R23) (pin 2))) + (net (code 25) (name "Net-(R19-Pad1)") + (node (ref R22) (pin 2)) + (node (ref R19) (pin 1)) + (node (ref R29) (pin 1)) + (node (ref U2) (pin 8))) + (net (code 26) (name /OPAMP_VCC) + (node (ref U2) (pin 4)) + (node (ref C7) (pin 1)) + (node (ref L3) (pin 1))) + (net (code 27) (name "Net-(R15-Pad1)") + (node (ref R15) (pin 1)) + (node (ref R20) (pin 2)) + (node (ref U2) (pin 13)) + (node (ref R16) (pin 1))) + (net (code 28) (name "Net-(R2-Pad1)") + (node (ref R4) (pin 2)) + (node (ref R2) (pin 1)) + (node (ref U2) (pin 5))) + (net (code 29) (name "Net-(C2-Pad2)") + (node (ref P9) (pin 1)) + (node (ref C2) (pin 2))) + (net (code 30) (name "Net-(C1-Pad2)") + (node (ref P9) (pin 2)) + (node (ref C1) (pin 2))) + (net (code 31) (name "Net-(C13-Pad1)") + (node (ref P6) (pin 2)) + (node (ref C13) (pin 1))) + (net (code 32) (name "Net-(R15-Pad2)") + (node (ref R16) (pin 2)) + (node (ref U3) (pin 6)) + (node (ref R15) (pin 2))) + (net (code 33) (name "Net-(C14-Pad1)") + (node (ref C14) (pin 1)) + (node (ref P6) (pin 4))) + (net (code 34) (name "Net-(C14-Pad2)") + (node (ref R25) (pin 1)) + (node (ref C14) (pin 2)) + (node (ref P6) (pin 3))) + (net (code 35) (name "Net-(C13-Pad2)") + (node (ref P6) (pin 1)) + (node (ref R24) (pin 1)) + (node (ref C13) (pin 2))) + (net (code 36) (name "Net-(R17-Pad2)") + (node (ref R17) (pin 2)) + (node (ref R18) (pin 2)) + (node (ref U3) (pin 3))) + (net (code 38) (name "Net-(C2-Pad1)") + (node (ref C2) (pin 1)) + (node (ref P5) (pin 2)) + (node (ref R2) (pin 2)) + (node (ref P5) (pin 1))) + (net (code 39) (name "Net-(C1-Pad1)") + (node (ref C1) (pin 1)) + (node (ref R1) (pin 2)) + (node (ref P1) (pin 2)) + (node (ref P1) (pin 1))) + (net (code 40) (name "Net-(IC1-Pad34)") + (node (ref IC1) (pin 34)) + (node (ref P4) (pin 2))) + (net (code 41) (name "Net-(IC1-Pad35)") + (node (ref P4) (pin 4)) + (node (ref IC1) (pin 35))) + (net (code 42) (name /PSU_PWM) + (node (ref IC1) (pin 24)) + (node (ref Q1) (pin 1))) + (net (code 43) (name /VCC_3V3) + (node (ref IC1) (pin 31)) + (node (ref L2) (pin 1)) + (node (ref U1) (pin 2)) + (node (ref IC1) (pin 19)) + (node (ref C6) (pin 1)) + (node (ref C4) (pin 1)) + (node (ref C11) (pin 1)) + (node (ref P4) (pin 1))) + (net (code 44) (name +5V) + (node (ref P2) (pin 1)) + (node (ref C3) (pin 1)) + (node (ref U1) (pin 3)) + (node (ref C10) (pin 1)) + (node (ref C9) (pin 1)) + (node (ref L1) (pin 2))) + (net (code 45) (name /DAC_OUT2) + (node (ref IC1) (pin 7)) + (node (ref U2) (pin 12))) + (net (code 46) (name "Net-(P2-Pad4)") + (node (ref P2) (pin 4))) + (net (code 47) (name "Net-(IC1-Pad20)") + (node (ref IC1) (pin 20))) + (net (code 48) (name "Net-(IC1-Pad10)") + (node (ref IC1) (pin 10))) + (net (code 49) (name "Net-(IC1-Pad9)") + (node (ref IC1) (pin 9))) + (net (code 50) (name /DAC_OUT) + (node (ref IC1) (pin 6)) + (node (ref U2) (pin 10))) + (net (code 51) (name /TO_B1) + (node (ref IC1) (pin 5)) + (node (ref U3) (pin 5))) + (net (code 52) (name /TO_B0) + (node (ref U3) (pin 2)) + (node (ref IC1) (pin 4))) + (net (code 53) (name "Net-(IC1-Pad3)") + (node (ref IC1) (pin 3))) + (net (code 54) (name /CH2) + (node (ref U2) (pin 6)) + (node (ref R28) (pin 2)) + (node (ref IC1) (pin 2)) + (node (ref IC1) (pin 40)) + (node (ref U2) (pin 7))) + (net (code 55) (name "Net-(IC1-Pad37)") + (node (ref IC1) (pin 37))) + (net (code 56) (name "Net-(IC1-Pad36)") + (node (ref IC1) (pin 36))) + (net (code 57) (name "Net-(IC1-Pad16)") + (node (ref IC1) (pin 16))) + (net (code 58) (name "Net-(IC1-Pad25)") + (node (ref IC1) (pin 25))) + (net (code 59) (name "Net-(IC1-Pad43)") + (node (ref IC1) (pin 43))) + (net (code 60) (name "Net-(IC1-Pad23)") + (node (ref IC1) (pin 23))) + (net (code 61) (name "Net-(IC1-Pad13)") + (node (ref IC1) (pin 13))) + (net (code 62) (name /CH1) + (node (ref IC1) (pin 42)) + (node (ref U2) (pin 1)) + (node (ref U2) (pin 2)) + (node (ref R21) (pin 1))) + (net (code 63) (name "Net-(IC1-Pad22)") + (node (ref IC1) (pin 22))) + (net (code 64) (name "Net-(IC1-Pad41)") + (node (ref IC1) (pin 41))) + (net (code 65) (name "Net-(IC1-Pad21)") + (node (ref IC1) (pin 21))) + (net (code 66) (name /XCK) + (node (ref IC1) (pin 11)) + (node (ref IC1) (pin 15))) + (net (code 67) (name /PSU_FEEDBACK) + (node (ref R27) (pin 1)) + (node (ref R26) (pin 2)) + (node (ref IC1) (pin 1))) + (net (code 68) (name "Net-(R23-Pad1)") + (node (ref R23) (pin 1)) + (node (ref R25) (pin 2))) + (net (code 69) (name /VGND) + (node (ref F1) (pin 2)) + (node (ref P7) (pin 4)) + (node (ref P7) (pin 3)) + (node (ref P7) (pin 2)) + (node (ref C15) (pin 2)) + (node (ref C9) (pin 2)) + (node (ref C16) (pin 2)) + (node (ref C10) (pin 2)) + (node (ref Q1) (pin 2))) + (net (code 70) (name /PSU_OUT) + (node (ref D1) (pin 1)) + (node (ref L3) (pin 2)) + (node (ref R26) (pin 1)) + (node (ref C15) (pin 1)) + (node (ref P7) (pin 1)) + (node (ref C16) (pin 1))) + (net (code 71) (name "Net-(R17-Pad1)") + (node (ref R18) (pin 1)) + (node (ref R19) (pin 2)) + (node (ref U2) (pin 9)) + (node (ref R17) (pin 1))) + (net (code 72) (name /DIG_CH2) + (node (ref U4) (pin 3)) + (node (ref IC1) (pin 12))))) \ No newline at end of file diff --git a/PCB/OUTPUT_V4/itead/ITEAD.zip b/PCB/OUTPUT_V4/itead/ITEAD.zip new file mode 100644 index 00000000..20d62a6b Binary files /dev/null and b/PCB/OUTPUT_V4/itead/ITEAD.zip differ diff --git a/PCB/OUTPUT_V4/itead/Tinylab_proto1-B.Cu.gbr b/PCB/OUTPUT_V4/itead/Tinylab_proto1-B.Cu.gbr new file mode 100644 index 00000000..4db900d5 --- /dev/null +++ b/PCB/OUTPUT_V4/itead/Tinylab_proto1-B.Cu.gbr @@ -0,0 +1,496 @@ +G04 #@! TF.FileFunction,Copper,L2,Bot,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 25/03/2016 9:42:23 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11C,1.300000*% +%ADD12R,1.300000X1.300000*% +%ADD13C,1.998980*% +%ADD14R,1.998980X1.998980*% +%ADD15R,1.905000X1.905000*% +%ADD16C,1.905000*% +%ADD17R,2.032000X2.032000*% +%ADD18O,2.032000X2.032000*% +%ADD19O,0.950000X1.250000*% +%ADD20O,1.550000X1.000000*% +%ADD21R,2.032000X1.727200*% +%ADD22O,2.032000X1.727200*% +%ADD23R,1.727200X1.727200*% +%ADD24O,1.727200X1.727200*% +%ADD25C,0.600000*% +%ADD26C,0.635000*% +%ADD27C,1.270000*% +%ADD28C,0.400000*% +%ADD29C,0.250000*% +G04 APERTURE END LIST* +D10* +D11* +X87670000Y-111760000D03* +D12* +X90170000Y-111760000D03* +D13* +X93342460Y-96520000D03* +D14* +X93342460Y-106680000D03* +D15* +X80444800Y-97917000D03* +D16* +X80444800Y-102997000D03* +D17* +X105918000Y-124460000D03* +D18* +X103378000Y-124460000D03* +D19* +X111340460Y-103110300D03* +X111340460Y-98110300D03* +D20* +X114040460Y-104110300D03* +X114040460Y-97110300D03* +D21* +X80444800Y-113157000D03* +D22* +X80444800Y-110617000D03* +X80444800Y-108077000D03* +X80444800Y-105537000D03* +D23* +X113795000Y-124307600D03* +D24* +X111255000Y-124307600D03* +X113795000Y-121767600D03* +X111255000Y-121767600D03* +D17* +X105918000Y-116840000D03* +D18* +X103378000Y-116840000D03* +D21* +X80444800Y-115697000D03* +D22* +X80444800Y-118237000D03* +X80444800Y-120777000D03* +X80444800Y-123317000D03* +D17* +X113706100Y-118224300D03* +D18* +X111166100Y-118224300D03* +D17* +X103378000Y-119380000D03* +D18* +X103378000Y-121920000D03* +D17* +X90604800Y-106807000D03* +D18* +X88064800Y-106807000D03* +D17* +X90604800Y-104267000D03* +D18* +X88064800Y-104267000D03* +D25* +X112588500Y-101955600D03* +X91328700Y-98298000D03* +X112464800Y-107982000D03* +X105123440Y-112872520D03* +X101886498Y-113662460D03* +X111623300Y-106781600D03* +X103261620Y-108000800D03* +X102108000Y-99631500D03* +X105283000Y-99631500D03* +X94488000Y-123698000D03* +X99822000Y-115887500D03* +X85623400Y-120980200D03* +X85572600Y-105791000D03* +X110670800Y-113271300D03* +X98008900Y-115062000D03* +X114645900Y-115150900D03* +X90805000Y-101757598D03* +X107462780Y-108071920D03* +X104455420Y-104861360D03* +X98918220Y-99969320D03* +X87691420Y-101833680D03* +X103342900Y-112852200D03* +X98542300Y-113715800D03* +X107020820Y-105272840D03* +X90376200Y-118778020D03* +X106304540Y-103946960D03* +X89202720Y-122577860D03* +X105524760Y-103398320D03* +X93401340Y-116707920D03* +X104518920Y-104061260D03* +X93508020Y-121406920D03* +X99685300Y-102095300D03* +X110061200Y-101574600D03* +X110200900Y-100622100D03* +X98580400Y-103251000D03* +X95504000Y-104203500D03* +X91503500Y-108140500D03* +X95567500Y-105283000D03* +X91821000Y-108966000D03* +X96500140Y-109118400D03* +X86357920Y-114985800D03* +X107914800Y-115332000D03* +X107889800Y-111582000D03* +X98314800Y-111907000D03* +X101289800Y-108132000D03* +X109514800Y-111107000D03* +X109439800Y-115332000D03* +X104397000Y-111544100D03* +X95697500Y-121462800D03* +X107124500Y-115125500D03* +X101790500Y-119888000D03* +X110378700Y-96428560D03* +X110134860Y-97434400D03* +X90500200Y-122605800D03* +X90474800Y-124256800D03* +X88976200Y-118872000D03* +X90449400Y-116586000D03* +X90678000Y-125095000D03* +X86918800Y-125120400D03* +D26* +X112588500Y-101523800D02* +X112588500Y-101955600D01* +X109438900Y-98374200D02* +X112588500Y-101523800D01* +D27* +X91404900Y-98374200D02* +X109438900Y-98374200D01* +D26* +X91328700Y-98298000D02* +X91404900Y-98374200D01* +D27* +X105123440Y-112872520D02* +X109399280Y-112872520D01* +X112464800Y-110132000D02* +X112464800Y-107982000D01* +X111014800Y-111582000D02* +X112464800Y-110132000D01* +X110689800Y-111582000D02* +X111014800Y-111582000D01* +X109399280Y-112872520D02* +X110689800Y-111582000D01* +D26* +X104300480Y-113695480D02* +X105123440Y-112872520D01* +X101919518Y-113695480D02* +X104300480Y-113695480D01* +X101886498Y-113662460D02* +X101919518Y-113695480D01* +X114040460Y-104110300D02* +X112340460Y-104110300D01* +X112340460Y-104110300D02* +X111340460Y-103110300D01* +X109146800Y-109258100D02* +X111623300Y-106781600D01* +X107145280Y-109258100D02* +X109146800Y-109258100D01* +X105860040Y-107972860D02* +X107145280Y-109258100D01* +X103289560Y-107972860D02* +X105860040Y-107972860D01* +X103261620Y-108000800D02* +X103289560Y-107972860D01* +D28* +X102298500Y-99822000D02* +X102108000Y-99631500D01* +X105092500Y-99822000D02* +X102298500Y-99822000D01* +X105283000Y-99631500D02* +X105092500Y-99822000D01* +D26* +X95631000Y-123698000D02* +X94488000Y-123698000D01* +X96139000Y-124206000D02* +X95631000Y-123698000D01* +X97028000Y-124206000D02* +X96139000Y-124206000D01* +X98171000Y-123063000D02* +X97028000Y-124206000D01* +X98171000Y-116713000D02* +X98171000Y-123063000D01* +X99060000Y-115887500D02* +X98171000Y-116713000D01* +X99822000Y-115887500D02* +X99060000Y-115887500D01* +D29* +X85623400Y-105841800D02* +X85623400Y-120980200D01* +X85572600Y-105791000D02* +X85623400Y-105841800D01* +D26* +X109896100Y-114046000D02* +X110670800Y-113271300D01* +X106721100Y-114046000D02* +X109896100Y-114046000D01* +X106213100Y-114554000D02* +X106721100Y-114046000D01* +X98516900Y-114554000D02* +X106213100Y-114554000D01* +X98008900Y-115062000D02* +X98516900Y-114554000D01* +D28* +X113795000Y-124307600D02* +X114049000Y-124307600D01* +X114049000Y-124307600D02* +X115687300Y-122669300D01* +X115687300Y-122669300D02* +X115687300Y-116192300D01* +X115687300Y-116192300D02* +X114645900Y-115150900D01* +D27* +X90805000Y-101757598D02* +X90805000Y-103505000D01* +X90805000Y-103505000D02* +X90170000Y-104140000D01* +X87630000Y-104140000D02* +X90170000Y-104140000D01* +X87630000Y-106680000D02* +X87630000Y-104140000D01* +X87670000Y-111760000D02* +X87670000Y-106720000D01* +X87670000Y-106720000D02* +X87630000Y-106680000D01* +X90170000Y-106680000D02* +X93342460Y-106680000D01* +X90170000Y-111760000D02* +X90170000Y-106680000D01* +X93342460Y-96520000D02* +X81280000Y-96520000D01* +X81280000Y-96520000D02* +X80010000Y-97790000D01* +D29* +X107157980Y-107767120D02* +X107462780Y-108071920D01* +X107157980Y-106324400D02* +X107157980Y-107767120D01* +X105796540Y-104962960D02* +X107157980Y-106324400D01* +X104557020Y-104962960D02* +X105796540Y-104962960D01* +X104455420Y-104861360D02* +X104557020Y-104962960D01* +X94371620Y-99969320D02* +X98918220Y-99969320D01* +X93726460Y-100614480D02* +X94371620Y-99969320D01* +X88910620Y-100614480D02* +X93726460Y-100614480D01* +X87691420Y-101833680D02* +X88910620Y-100614480D01* +X102733300Y-112242600D02* +X103342900Y-112852200D01* +X100015500Y-112242600D02* +X102733300Y-112242600D01* +X98542300Y-113715800D02* +X100015500Y-112242600D01* +X107020820Y-102816660D02* +X107020820Y-105272840D01* +X106477260Y-102273100D02* +X107020820Y-102816660D01* +X101067060Y-102273100D02* +X106477260Y-102273100D01* +X98895360Y-104444800D02* +X101067060Y-102273100D01* +X98895360Y-107759500D02* +X98895360Y-104444800D01* +X91389660Y-115265200D02* +X98895360Y-107759500D01* +X91389660Y-117764560D02* +X91389660Y-115265200D01* +X90376200Y-118778020D02* +X91389660Y-117764560D01* +X106304540Y-102971600D02* +X106304540Y-103946960D01* +X106081020Y-102748080D02* +X106304540Y-102971600D01* +X101305820Y-102748080D02* +X106081020Y-102748080D01* +X99444000Y-104609900D02* +X101305820Y-102748080D01* +X99444000Y-107950000D02* +X99444000Y-104609900D01* +X91839662Y-115554338D02* +X99444000Y-107950000D01* +X91839662Y-118259438D02* +X91839662Y-115554338D01* +X90493040Y-119606060D02* +X91839662Y-118259438D01* +X89065560Y-119606060D02* +X90493040Y-119606060D01* +X88059720Y-120611900D02* +X89065560Y-119606060D01* +X88059720Y-121983500D02* +X88059720Y-120611900D01* +X88595660Y-122519440D02* +X88059720Y-121983500D01* +X89144300Y-122519440D02* +X88595660Y-122519440D01* +X89202720Y-122577860D02* +X89144300Y-122519440D01* +X101846840Y-103398320D02* +X105524760Y-103398320D01* +X100076460Y-105168700D02* +X101846840Y-103398320D01* +X100076460Y-108280200D02* +X100076460Y-105168700D01* +X93624860Y-114731800D02* +X100076460Y-108280200D01* +X93624860Y-116484400D02* +X93624860Y-114731800D01* +X93401340Y-116707920D02* +X93624860Y-116484400D01* +X102395480Y-104061260D02* +X104518920Y-104061260D01* +X100647960Y-105808780D02* +X102395480Y-104061260D01* +X100647960Y-108597700D02* +X100647960Y-105808780D01* +X94323360Y-114922300D02* +X100647960Y-108597700D01* +X94323360Y-120591580D02* +X94323360Y-114922300D01* +X93508020Y-121406920D02* +X94323360Y-120591580D01* +D28* +X99685300Y-101831702D02* +X99685300Y-102095300D01* +X100294900Y-101222102D02* +X99685300Y-101831702D01* +X109708702Y-101222102D02* +X100294900Y-101222102D01* +X110061200Y-101574600D02* +X109708702Y-101222102D01* +X99863100Y-100622100D02* +X110200900Y-100622100D01* +X98885200Y-101600000D02* +X99863100Y-100622100D01* +X98885200Y-102946200D02* +X98885200Y-101600000D01* +X98580400Y-103251000D02* +X98885200Y-102946200D01* +D29* +X94932500Y-104775000D02* +X95504000Y-104203500D01* +X94932500Y-107823000D02* +X94932500Y-104775000D01* +X94678500Y-108077000D02* +X94932500Y-107823000D01* +X91567000Y-108077000D02* +X94678500Y-108077000D01* +X91503500Y-108140500D02* +X91567000Y-108077000D01* +X95567500Y-107886500D02* +X95567500Y-105283000D01* +X94926998Y-108527002D02* +X95567500Y-107886500D01* +X92259998Y-108527002D02* +X94926998Y-108527002D01* +X91821000Y-108966000D02* +X92259998Y-108527002D01* +X94851680Y-110766860D02* +X96500140Y-109118400D01* +X93314980Y-110766860D02* +X94851680Y-110766860D01* +X90381280Y-113700560D02* +X93314980Y-110766860D01* +X87643160Y-113700560D02* +X90381280Y-113700560D01* +X86357920Y-114985800D02* +X87643160Y-113700560D01* +X111255000Y-124307600D02* +X110865400Y-124307600D01* +X110865400Y-124307600D02* +X107914800Y-121357000D01* +X107914800Y-121357000D02* +X107914800Y-115332000D01* +X107889800Y-111582000D02* +X106964800Y-110657000D01* +X106964800Y-110657000D02* +X99514800Y-110657000D01* +X99514800Y-110657000D02* +X98447171Y-111724629D01* +X98447171Y-111724629D02* +X98447171Y-111774629D01* +X98447171Y-111774629D02* +X98314800Y-111907000D01* +X111255000Y-121767600D02* +X111255000Y-120772200D01* +X103189800Y-110032000D02* +X101289800Y-108132000D01* +X108439800Y-110032000D02* +X103189800Y-110032000D01* +X109514800Y-111107000D02* +X108439800Y-110032000D01* +X109439800Y-118957000D02* +X109439800Y-115332000D01* +X111255000Y-120772200D02* +X109439800Y-118957000D01* +X99825000Y-111544100D02* +X104397000Y-111544100D01* +X95189500Y-116179600D02* +X99825000Y-111544100D01* +X95189500Y-120954800D02* +X95189500Y-116179600D01* +X95697500Y-121462800D02* +X95189500Y-120954800D01* +D28* +X106870500Y-115379500D02* +X107124500Y-115125500D01* +X102489000Y-115379500D02* +X106870500Y-115379500D01* +X101917500Y-115951000D02* +X102489000Y-115379500D01* +X101917500Y-119761000D02* +X101917500Y-115951000D01* +X101790500Y-119888000D02* +X101917500Y-119761000D01* +D29* +X113706100Y-118224300D02* +X113706100Y-112379760D01* +X112116060Y-96428560D02* +X110378700Y-96428560D01* +X112764182Y-97076682D02* +X112116060Y-96428560D01* +X112764182Y-98204442D02* +X112764182Y-97076682D01* +X116002260Y-101442520D02* +X112764182Y-98204442D01* +X116002260Y-110083600D02* +X116002260Y-101442520D01* +X113706100Y-112379760D02* +X116002260Y-110083600D01* +X111166100Y-118224300D02* +X111166100Y-114066320D01* +X110515860Y-97053400D02* +X110134860Y-97434400D01* +X111872220Y-97053400D02* +X110515860Y-97053400D01* +X112314180Y-97495360D02* +X111872220Y-97053400D01* +X112314180Y-98668840D02* +X112314180Y-97495360D01* +X115346940Y-101701600D02* +X112314180Y-98668840D01* +X115346940Y-109885480D02* +X115346940Y-101701600D01* +X111166100Y-114066320D02* +X115346940Y-109885480D01* +X90500200Y-124231400D02* +X90500200Y-122605800D01* +X90474800Y-124256800D02* +X90500200Y-124231400D01* +X89103200Y-118745000D02* +X88976200Y-118872000D01* +X89433400Y-118745000D02* +X89103200Y-118745000D01* +X90525600Y-117652800D02* +X89433400Y-118745000D01* +X90525600Y-116662200D02* +X90525600Y-117652800D01* +X90449400Y-116586000D02* +X90525600Y-116662200D01* +X86944200Y-125095000D02* +X90678000Y-125095000D01* +X86918800Y-125120400D02* +X86944200Y-125095000D01* +M02* diff --git a/PCB/OUTPUT_V4/itead/Tinylab_proto1-B.Mask.gbr b/PCB/OUTPUT_V4/itead/Tinylab_proto1-B.Mask.gbr new file mode 100644 index 00000000..e4bb5dcc --- /dev/null +++ b/PCB/OUTPUT_V4/itead/Tinylab_proto1-B.Mask.gbr @@ -0,0 +1,85 @@ +G04 #@! TF.FileFunction,Soldermask,Bot* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 25/03/2016 9:42:23 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11C,1.300000*% +%ADD12R,1.300000X1.300000*% +%ADD13C,1.998980*% +%ADD14R,1.998980X1.998980*% +%ADD15R,1.905000X1.905000*% +%ADD16C,1.905000*% +%ADD17R,2.032000X2.032000*% +%ADD18O,2.032000X2.032000*% +%ADD19O,0.950000X1.250000*% +%ADD20O,1.550000X1.000000*% +%ADD21R,2.032000X1.727200*% +%ADD22O,2.032000X1.727200*% +%ADD23R,1.727200X1.727200*% +%ADD24O,1.727200X1.727200*% +G04 APERTURE END LIST* +D10* +D11* +X87670000Y-111760000D03* +D12* +X90170000Y-111760000D03* +D13* +X93342460Y-96520000D03* +D14* +X93342460Y-106680000D03* +D15* +X80444800Y-97917000D03* +D16* +X80444800Y-102997000D03* +D17* +X105918000Y-124460000D03* +D18* +X103378000Y-124460000D03* +D19* +X111340460Y-103110300D03* +X111340460Y-98110300D03* +D20* +X114040460Y-104110300D03* +X114040460Y-97110300D03* +D21* +X80444800Y-113157000D03* +D22* +X80444800Y-110617000D03* +X80444800Y-108077000D03* +X80444800Y-105537000D03* +D23* +X113795000Y-124307600D03* +D24* +X111255000Y-124307600D03* +X113795000Y-121767600D03* +X111255000Y-121767600D03* +D17* +X105918000Y-116840000D03* +D18* +X103378000Y-116840000D03* +D21* +X80444800Y-115697000D03* +D22* +X80444800Y-118237000D03* +X80444800Y-120777000D03* +X80444800Y-123317000D03* +D17* +X113706100Y-118224300D03* +D18* +X111166100Y-118224300D03* +D17* +X103378000Y-119380000D03* +D18* +X103378000Y-121920000D03* +D17* +X90604800Y-106807000D03* +D18* +X88064800Y-106807000D03* +D17* +X90604800Y-104267000D03* +D18* +X88064800Y-104267000D03* +M02* diff --git a/PCB/OUTPUT_V4/itead/Tinylab_proto1-Edge.Cuts.gbr b/PCB/OUTPUT_V4/itead/Tinylab_proto1-Edge.Cuts.gbr new file mode 100644 index 00000000..5f0024ea --- /dev/null +++ b/PCB/OUTPUT_V4/itead/Tinylab_proto1-Edge.Cuts.gbr @@ -0,0 +1,21 @@ +G04 #@! TF.FileFunction,Profile,NP* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 25/03/2016 9:42:23 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +G04 APERTURE END LIST* +D10* +X78791260Y-126093220D02* +X116936980Y-126093220D01* +X78783640Y-95196660D02* +X116942060Y-95196660D01* +X78786180Y-126090680D02* +X78786180Y-95201740D01* +X116939800Y-95882000D02* +X116939800Y-95207000D01* +X116939800Y-95882000D02* +X116939800Y-126107000D01* +M02* diff --git a/PCB/OUTPUT_V4/itead/Tinylab_proto1-F.Cu.gbr b/PCB/OUTPUT_V4/itead/Tinylab_proto1-F.Cu.gbr new file mode 100644 index 00000000..cb3b5d51 --- /dev/null +++ b/PCB/OUTPUT_V4/itead/Tinylab_proto1-F.Cu.gbr @@ -0,0 +1,1504 @@ +G04 #@! TF.FileFunction,Copper,L1,Top,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 25/03/2016 9:42:22 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,0.800000X0.750000*% +%ADD12R,0.750000X0.800000*% +%ADD13C,1.300000*% +%ADD14R,1.300000X1.300000*% +%ADD15C,1.998980*% +%ADD16R,1.998980X1.998980*% +%ADD17R,1.600000X1.000000*% +%ADD18R,1.600000X0.560000*% +%ADD19R,0.560000X1.600000*% +%ADD20R,1.905000X1.905000*% +%ADD21C,1.905000*% +%ADD22R,0.900000X2.500000*% +%ADD23R,2.500000X0.900000*% +%ADD24R,2.032000X2.032000*% +%ADD25O,2.032000X2.032000*% +%ADD26R,1.350000X0.400000*% +%ADD27O,0.950000X1.250000*% +%ADD28O,1.550000X1.000000*% +%ADD29R,2.032000X1.727200*% +%ADD30O,2.032000X1.727200*% +%ADD31R,1.727200X1.727200*% +%ADD32O,1.727200X1.727200*% +%ADD33R,0.600000X0.900000*% +%ADD34R,0.900000X0.500000*% +%ADD35R,0.500000X0.900000*% +%ADD36R,0.900000X0.600000*% +%ADD37R,1.500000X0.600000*% +%ADD38R,0.304800X0.508000*% +%ADD39R,1.600200X2.999740*% +%ADD40R,1.600200X2.600960*% +%ADD41C,0.600000*% +%ADD42C,0.250000*% +%ADD43C,0.635000*% +%ADD44C,1.270000*% +%ADD45C,0.400000*% +G04 APERTURE END LIST* +D10* +X108411229Y-125167714D02* +X108839800Y-125167714D01* +X108925514Y-125196286D01* +X108982657Y-125253429D01* +X109011229Y-125339143D01* +X109011229Y-125396286D01* +X108696943Y-124882000D02* +X108696943Y-124682000D01* +X109011229Y-124596286D02* +X109011229Y-124882000D01* +X108411229Y-124882000D01* +X108411229Y-124596286D01* +X109011229Y-124339143D02* +X108411229Y-124339143D01* +X109011229Y-123996286D01* +X108411229Y-123996286D01* +X108411229Y-123339143D02* +X108411229Y-122996286D01* +X109011229Y-123167715D02* +X108411229Y-123167715D01* +X109011229Y-122796286D02* +X108411229Y-122796286D01* +X109011229Y-122510572D02* +X108411229Y-122510572D01* +X109011229Y-122167715D01* +X108411229Y-122167715D01* +X108725514Y-121767715D02* +X109011229Y-121767715D01* +X108411229Y-121967715D02* +X108725514Y-121767715D01* +X108411229Y-121567715D01* +X109011229Y-121082001D02* +X109011229Y-121367715D01* +X108411229Y-121367715D01* +X108839800Y-120910572D02* +X108839800Y-120624858D01* +X109011229Y-120967715D02* +X108411229Y-120767715D01* +X109011229Y-120567715D01* +X108696943Y-120167715D02* +X108725514Y-120082001D01* +X108754086Y-120053429D01* +X108811229Y-120024858D01* +X108896943Y-120024858D01* +X108954086Y-120053429D01* +X108982657Y-120082001D01* +X109011229Y-120139143D01* +X109011229Y-120367715D01* +X108411229Y-120367715D01* +X108411229Y-120167715D01* +X108439800Y-120110572D01* +X108468371Y-120082001D01* +X108525514Y-120053429D01* +X108582657Y-120053429D01* +X108639800Y-120082001D01* +X108668371Y-120110572D01* +X108696943Y-120167715D01* +X108696943Y-120367715D01* +X108411229Y-119396286D02* +X109011229Y-119196286D01* +X108411229Y-118996286D01* +X108611229Y-118539143D02* +X109011229Y-118539143D01* +X108382657Y-118682000D02* +X108811229Y-118824857D01* +X108811229Y-118453429D01* +X108782657Y-117767714D02* +X108782657Y-117310571D01* +X109011229Y-116567714D02* +X108411229Y-116567714D01* +X108411229Y-116424857D01* +X108439800Y-116339142D01* +X108496943Y-116282000D01* +X108554086Y-116253428D01* +X108668371Y-116224857D01* +X108754086Y-116224857D01* +X108868371Y-116253428D01* +X108925514Y-116282000D01* +X108982657Y-116339142D01* +X109011229Y-116424857D01* +X109011229Y-116567714D01* +X108696943Y-115967714D02* +X108696943Y-115767714D01* +X109011229Y-115682000D02* +X109011229Y-115967714D01* +X108411229Y-115967714D01* +X108411229Y-115682000D01* +X108696943Y-114967714D02* +X108696943Y-114767714D01* +X109011229Y-114682000D02* +X109011229Y-114967714D01* +X108411229Y-114967714D01* +X108411229Y-114682000D01* +X108982657Y-114453428D02* +X109011229Y-114367714D01* +X109011229Y-114224857D01* +X108982657Y-114167714D01* +X108954086Y-114139143D01* +X108896943Y-114110571D01* +X108839800Y-114110571D01* +X108782657Y-114139143D01* +X108754086Y-114167714D01* +X108725514Y-114224857D01* +X108696943Y-114339143D01* +X108668371Y-114396285D01* +X108639800Y-114424857D01* +X108582657Y-114453428D01* +X108525514Y-114453428D01* +X108468371Y-114424857D01* +X108439800Y-114396285D01* +X108411229Y-114339143D01* +X108411229Y-114196285D01* +X108439800Y-114110571D01* +X109011229Y-113853428D02* +X108411229Y-113853428D01* +X108411229Y-113624856D01* +X108439800Y-113567714D01* +X108468371Y-113539142D01* +X108525514Y-113510571D01* +X108611229Y-113510571D01* +X108668371Y-113539142D01* +X108696943Y-113567714D01* +X108725514Y-113624856D01* +X108725514Y-113853428D01* +X108411229Y-113139142D02* +X108411229Y-113024856D01* +X108439800Y-112967714D01* +X108496943Y-112910571D01* +X108611229Y-112881999D01* +X108811229Y-112881999D01* +X108925514Y-112910571D01* +X108982657Y-112967714D01* +X109011229Y-113024856D01* +X109011229Y-113139142D01* +X108982657Y-113196285D01* +X108925514Y-113253428D01* +X108811229Y-113281999D01* +X108611229Y-113281999D01* +X108496943Y-113253428D01* +X108439800Y-113196285D01* +X108411229Y-113139142D01* +X108954086Y-112282000D02* +X108982657Y-112310571D01* +X109011229Y-112396285D01* +X109011229Y-112453428D01* +X108982657Y-112539143D01* +X108925514Y-112596285D01* +X108868371Y-112624857D01* +X108754086Y-112653428D01* +X108668371Y-112653428D01* +X108554086Y-112624857D01* +X108496943Y-112596285D01* +X108439800Y-112539143D01* +X108411229Y-112453428D01* +X108411229Y-112396285D01* +X108439800Y-112310571D01* +X108468371Y-112282000D01* +X108268371Y-112539143D02* +X108182657Y-112424857D01* +X108268371Y-112310571D01* +X108411229Y-111853428D02* +X108839800Y-111853428D01* +X108925514Y-111882000D01* +X108982657Y-111939143D01* +X109011229Y-112024857D01* +X109011229Y-112082000D01* +X108411229Y-111453428D02* +X108411229Y-111339142D01* +X108439800Y-111282000D01* +X108496943Y-111224857D01* +X108611229Y-111196285D01* +X108811229Y-111196285D01* +X108925514Y-111224857D01* +X108982657Y-111282000D01* +X109011229Y-111339142D01* +X109011229Y-111453428D01* +X108982657Y-111510571D01* +X108925514Y-111567714D01* +X108811229Y-111596285D01* +X108611229Y-111596285D01* +X108496943Y-111567714D01* +X108439800Y-111510571D01* +X108411229Y-111453428D01* +D11* +X106795000Y-122555000D03* +X105295000Y-122555000D03* +X106795000Y-118745000D03* +X105295000Y-118745000D03* +D12* +X114887200Y-107633200D03* +X114887200Y-106133200D03* +D11* +X114213400Y-109029500D03* +X115713400Y-109029500D03* +D12* +X104521000Y-114351500D03* +X104521000Y-112851500D03* +D11* +X95238000Y-115316000D03* +X93738000Y-115316000D03* +X102604000Y-111760000D03* +X101104000Y-111760000D03* +D12* +X86360000Y-98945000D03* +X86360000Y-100445000D03* +X95059500Y-107557000D03* +X95059500Y-106057000D03* +X82423000Y-118098000D03* +X82423000Y-116598000D03* +X82550000Y-124956000D03* +X82550000Y-123456000D03* +D13* +X87670000Y-111760000D03* +D14* +X90170000Y-111760000D03* +D12* +X92456000Y-113804000D03* +X92456000Y-115304000D03* +D15* +X93342460Y-96520000D03* +D16* +X93342460Y-106680000D03* +D17* +X93345000Y-103100000D03* +X93345000Y-100100000D03* +D18* +X108720000Y-108140000D03* +X108720000Y-107340000D03* +X108720000Y-106540000D03* +X108720000Y-105740000D03* +X108720000Y-104940000D03* +X108720000Y-104140000D03* +X108720000Y-103340000D03* +X108720000Y-102540000D03* +X108720000Y-101740000D03* +X108720000Y-100940000D03* +X108720000Y-100140000D03* +D19* +X106870000Y-98290000D03* +X106070000Y-98290000D03* +X105270000Y-98290000D03* +X104470000Y-98290000D03* +X103670000Y-98290000D03* +X102870000Y-98290000D03* +X102070000Y-98290000D03* +X101270000Y-98290000D03* +X100470000Y-98290000D03* +X99670000Y-98290000D03* +X98870000Y-98290000D03* +D18* +X97020000Y-100140000D03* +X97020000Y-100940000D03* +X97020000Y-101740000D03* +X97020000Y-102540000D03* +X97020000Y-103340000D03* +X97020000Y-104140000D03* +X97020000Y-104940000D03* +X97020000Y-105740000D03* +X97020000Y-106540000D03* +X97020000Y-107340000D03* +X97020000Y-108140000D03* +D19* +X98870000Y-109990000D03* +X99670000Y-109990000D03* +X100470000Y-109990000D03* +X101270000Y-109990000D03* +X102070000Y-109990000D03* +X102870000Y-109990000D03* +X103670000Y-109990000D03* +X104470000Y-109990000D03* +X105270000Y-109990000D03* +X106070000Y-109990000D03* +X106870000Y-109990000D03* +D20* +X80444800Y-97917000D03* +D21* +X80444800Y-102997000D03* +D22* +X96721000Y-112649000D03* +X99621000Y-112649000D03* +D23* +X93980000Y-112321000D03* +X93980000Y-109421000D03* +D24* +X105918000Y-124460000D03* +D25* +X103378000Y-124460000D03* +D26* +X111340460Y-101910300D03* +X111340460Y-101260300D03* +X111340460Y-100610300D03* +X111340460Y-99960300D03* +X111340460Y-99310300D03* +D27* +X111340460Y-103110300D03* +X111340460Y-98110300D03* +D28* +X114040460Y-104110300D03* +X114040460Y-97110300D03* +D29* +X80444800Y-113157000D03* +D30* +X80444800Y-110617000D03* +X80444800Y-108077000D03* +X80444800Y-105537000D03* +D31* +X113795000Y-124307600D03* +D32* +X111255000Y-124307600D03* +X113795000Y-121767600D03* +X111255000Y-121767600D03* +D24* +X105918000Y-116840000D03* +D25* +X103378000Y-116840000D03* +D29* +X80444800Y-115697000D03* +D30* +X80444800Y-118237000D03* +X80444800Y-120777000D03* +X80444800Y-123317000D03* +D24* +X113706100Y-118224300D03* +D25* +X111166100Y-118224300D03* +D24* +X103378000Y-119380000D03* +D25* +X103378000Y-121920000D03* +D33* +X96139000Y-96136000D03* +X97089000Y-98936000D03* +X95189000Y-98936000D03* +D34* +X99060000Y-122670000D03* +X99060000Y-121170000D03* +X99060000Y-118566500D03* +X99060000Y-120066500D03* +X100647500Y-122670000D03* +X100647500Y-121170000D03* +X100647500Y-120066500D03* +X100647500Y-118566500D03* +D35* +X105676000Y-114300000D03* +X107176000Y-114300000D03* +X105676000Y-112903000D03* +X107176000Y-112903000D03* +D34* +X82550000Y-105930000D03* +X82550000Y-107430000D03* +X82550000Y-108470000D03* +X82550000Y-109970000D03* +X82550000Y-111010000D03* +X82550000Y-112510000D03* +X82550000Y-113550000D03* +X82550000Y-115050000D03* +X84328000Y-107430000D03* +X84328000Y-105930000D03* +X84328000Y-109970000D03* +X84328000Y-108470000D03* +X84328000Y-112510000D03* +X84328000Y-111010000D03* +X84328000Y-115050000D03* +X84328000Y-113550000D03* +X89395300Y-123570300D03* +X89395300Y-125070300D03* +X87871300Y-123570300D03* +X87871300Y-125070300D03* +X89281000Y-117971000D03* +X89281000Y-116471000D03* +X87630000Y-117971000D03* +X87630000Y-116471000D03* +D35* +X86372000Y-119634000D03* +X87872000Y-119634000D03* +X86372000Y-121920000D03* +X87872000Y-121920000D03* +X98818000Y-124079000D03* +X100318000Y-124079000D03* +D34* +X84455000Y-117971000D03* +X84455000Y-116471000D03* +X84709000Y-123583000D03* +X84709000Y-125083000D03* +D35* +X83324000Y-119634000D03* +X84824000Y-119634000D03* +X83324000Y-121920000D03* +X84824000Y-121920000D03* +X85332000Y-102946200D03* +X83832000Y-102946200D03* +X83832000Y-104546400D03* +X85332000Y-104546400D03* +X100318000Y-116840000D03* +X98818000Y-116840000D03* +D34* +X85979000Y-116471000D03* +X85979000Y-117971000D03* +X86233000Y-123583000D03* +X86233000Y-125083000D03* +D36* +X113464800Y-106807000D03* +X110664800Y-107757000D03* +X110664800Y-105857000D03* +D37* +X97213400Y-124485400D03* +X97213400Y-123215400D03* +X97213400Y-121945400D03* +X97213400Y-120675400D03* +X97213400Y-119405400D03* +X97213400Y-118135400D03* +X97213400Y-116865400D03* +X91813400Y-116865400D03* +X91813400Y-118135400D03* +X91813400Y-119405400D03* +X91813400Y-120675400D03* +X91813400Y-121945400D03* +X91813400Y-123215400D03* +X91813400Y-124485400D03* +D38* +X90195400Y-119710200D03* +X88925400Y-119710200D03* +X90195400Y-121742200D03* +X89560400Y-119710200D03* +X88925400Y-121742200D03* +X89560400Y-121742200D03* +X108140500Y-98488500D03* +X109410500Y-98488500D03* +X108140500Y-96456500D03* +X108775500Y-98488500D03* +X109410500Y-96456500D03* +X108775500Y-96456500D03* +D39* +X112448800Y-114696240D03* +X112448800Y-110296960D03* +D40* +X89535000Y-97259140D03* +X89535000Y-100860860D03* +D24* +X90604800Y-106807000D03* +D25* +X88064800Y-106807000D03* +D24* +X90604800Y-104267000D03* +D25* +X88064800Y-104267000D03* +D41* +X112588500Y-101955600D03* +X91328700Y-98298000D03* +X112464800Y-107982000D03* +X105123440Y-112872520D03* +X101886498Y-113662460D03* +X111623300Y-106781600D03* +X103261620Y-108000800D03* +X102108000Y-99631500D03* +X105283000Y-99631500D03* +X94488000Y-123698000D03* +X99822000Y-115887500D03* +X85623400Y-120980200D03* +X85572600Y-105791000D03* +X110670800Y-113271300D03* +X98008900Y-115062000D03* +X114645900Y-115150900D03* +X90805000Y-101757598D03* +X107462780Y-108071920D03* +X104455420Y-104861360D03* +X98918220Y-99969320D03* +X87691420Y-101833680D03* +X103342900Y-112852200D03* +X98542300Y-113715800D03* +X107020820Y-105272840D03* +X90376200Y-118778020D03* +X106304540Y-103946960D03* +X89202720Y-122577860D03* +X105524760Y-103398320D03* +X93401340Y-116707920D03* +X104518920Y-104061260D03* +X93508020Y-121406920D03* +X99685300Y-102095300D03* +X110061200Y-101574600D03* +X110200900Y-100622100D03* +X98580400Y-103251000D03* +X95504000Y-104203500D03* +X91503500Y-108140500D03* +X95567500Y-105283000D03* +X91821000Y-108966000D03* +X96500140Y-109118400D03* +X86357920Y-114985800D03* +X107914800Y-115332000D03* +X107889800Y-111582000D03* +X98314800Y-111907000D03* +X101289800Y-108132000D03* +X109514800Y-111107000D03* +X109439800Y-115332000D03* +X104397000Y-111544100D03* +X95697500Y-121462800D03* +X107124500Y-115125500D03* +X101790500Y-119888000D03* +X110378700Y-96428560D03* +X110134860Y-97434400D03* +X90500200Y-122605800D03* +X90474800Y-124256800D03* +X88976200Y-118872000D03* +X90449400Y-116586000D03* +X90678000Y-125095000D03* +X86918800Y-125120400D03* +D42* +X99060000Y-121170000D02* +X99060000Y-121412000D01* +X99060000Y-121412000D02* +X99568000Y-121920000D01* +X99568000Y-121920000D02* +X101473000Y-121920000D01* +X101473000Y-121920000D02* +X101854000Y-122301000D01* +X101854000Y-122301000D02* +X101854000Y-122936000D01* +X101854000Y-122936000D02* +X103378000Y-124460000D01* +D43* +X106795000Y-122555000D02* +X106795000Y-123583000D01* +X105918000Y-124460000D02* +X103378000Y-124460000D01* +X106795000Y-123583000D02* +X105918000Y-124460000D01* +X104660000Y-121920000D02* +X105295000Y-122555000D01* +X103378000Y-121920000D02* +X104660000Y-121920000D01* +D42* +X99060000Y-120066500D02* +X99135500Y-120066500D01* +X99135500Y-120066500D02* +X99822000Y-119380000D01* +X99822000Y-119380000D02* +X101346000Y-119380000D01* +X101346000Y-119380000D02* +X101981000Y-118745000D01* +X101981000Y-118745000D02* +X101981000Y-117221000D01* +X101981000Y-117221000D02* +X102362000Y-116840000D01* +X102362000Y-116840000D02* +X103378000Y-116840000D01* +D43* +X106795000Y-118745000D02* +X106795000Y-117717000D01* +X106795000Y-117717000D02* +X105918000Y-116840000D01* +X105918000Y-116840000D02* +X103378000Y-116840000D01* +X104660000Y-119380000D02* +X105295000Y-118745000D01* +X103378000Y-119380000D02* +X104660000Y-119380000D01* +X89535000Y-97259140D02* +X90289840Y-97259140D01* +D44* +X90289840Y-97259140D02* +X91328700Y-98298000D01* +D43* +X112543200Y-101910300D02* +X112530500Y-101910300D01* +X112588500Y-101955600D02* +X112543200Y-101910300D01* +D45* +X113464800Y-106807000D02* +X113464800Y-107315000D01* +X113783000Y-107633200D02* +X114887200Y-107633200D01* +X113464800Y-107315000D02* +X113783000Y-107633200D01* +X111340460Y-101910300D02* +X112530500Y-101910300D01* +X113464800Y-105765600D02* +X113464800Y-106807000D01* +X112677400Y-104978200D02* +X113464800Y-105765600D01* +X112677400Y-102057200D02* +X112677400Y-104978200D01* +X112530500Y-101910300D02* +X112677400Y-102057200D01* +D44* +X86360000Y-98945000D02* +X87849140Y-98945000D01* +X87849140Y-98945000D02* +X89535000Y-97259140D01* +X80391000Y-102870000D02* +X84316000Y-98945000D01* +X84316000Y-98945000D02* +X86360000Y-98945000D01* +X112448800Y-107982000D02* +X112448800Y-110296960D01* +X112464800Y-107982000D02* +X112448800Y-107982000D01* +D43* +X99822000Y-115887500D02* +X99822000Y-115547600D01* +X101707140Y-113662460D02* +X101886498Y-113662460D01* +X99822000Y-115547600D02* +X101707140Y-113662460D01* +X105123440Y-112872520D02* +X105123440Y-112851500D01* +X105123440Y-112851500D02* +X105123440Y-112872520D01* +X105123440Y-112872520D02* +X105123440Y-112851500D01* +X114040460Y-104110300D02* +X114040460Y-97110300D01* +X111340460Y-98110300D02* +X113040460Y-98110300D01* +X113040460Y-98110300D02* +X114040460Y-97110300D01* +X97020000Y-105740000D02* +X100182940Y-105740000D01* +X102443740Y-108000800D02* +X102507240Y-108000800D01* +X100182940Y-105740000D02* +X102443740Y-108000800D01* +X102070000Y-109990000D02* +X102070000Y-108438040D01* +X102070000Y-108438040D02* +X102507240Y-108000800D01* +X102507240Y-108000800D02* +X103261620Y-108000800D01* +X111623300Y-106781600D02* +X111606350Y-106798550D01* +X111606350Y-106798550D02* +X111623300Y-106781600D01* +X111623300Y-106781600D02* +X111623300Y-106815500D01* +D45* +X113795000Y-121767600D02* +X113795000Y-121742200D01* +X113795000Y-121742200D02* +X115713400Y-119823800D01* +X115713400Y-119823800D02* +X115713400Y-109029500D01* +D43* +X114887200Y-106133200D02* +X115458000Y-106133200D01* +X116119100Y-108623800D02* +X115713400Y-109029500D01* +X116119100Y-106794300D02* +X116119100Y-108623800D01* +X115458000Y-106133200D02* +X116119100Y-106794300D01* +X112448800Y-110296960D02* +X112448800Y-107641000D01* +X112448800Y-107641000D02* +X111623300Y-106815500D01* +X111623300Y-106815500D02* +X110664800Y-105857000D01* +D44* +X110664800Y-105857000D02* +X110664800Y-103785960D01* +X110664800Y-103785960D02* +X111340460Y-103110300D01* +D45* +X111340460Y-99310300D02* +X111340460Y-98110300D01* +X114887200Y-106133200D02* +X114887200Y-104957040D01* +X114887200Y-104957040D02* +X114040460Y-104110300D01* +D42* +X95059500Y-106057000D02* +X95695200Y-106057000D01* +X96012200Y-105740000D02* +X97020000Y-105740000D01* +X95695200Y-106057000D02* +X96012200Y-105740000D01* +D45* +X105270000Y-98290000D02* +X105270000Y-99618500D01* +X102070000Y-99593500D02* +X102070000Y-98290000D01* +X102108000Y-99631500D02* +X102070000Y-99593500D01* +X105270000Y-99618500D02* +X105283000Y-99631500D01* +D43* +X93738000Y-120003000D02* +X93801500Y-120003000D01* +X93738000Y-115836000D02* +X93738000Y-115316000D01* +X94402998Y-116500998D02* +X93738000Y-115836000D01* +X94402998Y-119401502D02* +X94402998Y-116500998D01* +X93801500Y-120003000D02* +X94402998Y-119401502D01* +D42* +X108140500Y-98488500D02* +X107950000Y-98488500D01* +X105270000Y-97295000D02* +X105270000Y-98290000D01* +X105600500Y-96964500D02* +X105270000Y-97295000D01* +X107442000Y-96964500D02* +X105600500Y-96964500D01* +X107632500Y-97155000D02* +X107442000Y-96964500D01* +X107632500Y-98171000D02* +X107632500Y-97155000D01* +X107950000Y-98488500D02* +X107632500Y-98171000D01* +X108140500Y-98488500D02* +X108140500Y-98107500D01* +X109410500Y-97028000D02* +X109410500Y-96456500D01* +X109156500Y-97282000D02* +X109410500Y-97028000D01* +X108966000Y-97282000D02* +X109156500Y-97282000D01* +X108140500Y-98107500D02* +X108966000Y-97282000D01* +X101104000Y-111760000D02* +X101219000Y-111760000D01* +X101219000Y-111760000D02* +X102070000Y-110909000D01* +X102070000Y-110909000D02* +X102070000Y-109990000D01* +X95059500Y-106057000D02* +X95059500Y-105918000D01* +X95059500Y-105918000D02* +X94742000Y-105600500D01* +D43* +X93789500Y-104711500D02* +X94107000Y-104711500D01* +X94107000Y-104711500D02* +X94678500Y-105283000D01* +D45* +X93853000Y-104711500D02* +X93789500Y-104711500D01* +X94107000Y-104711500D02* +X94678500Y-105283000D01* +D44* +X93345000Y-103100000D02* +X93345000Y-104203500D01* +X93345000Y-104203500D02* +X93853000Y-104711500D01* +D42* +X95059500Y-106057000D02* +X95059500Y-105664000D01* +X95059500Y-105664000D02* +X94678500Y-105283000D01* +X94678500Y-105283000D02* +X94107000Y-104711500D01* +X93853000Y-104711500D02* +X93345000Y-104203500D01* +D43* +X104521000Y-112851500D02* +X105123440Y-112851500D01* +X105123440Y-112851500D02* +X105624500Y-112851500D01* +X105624500Y-112851500D02* +X105676000Y-112903000D01* +X100318000Y-116840000D02* +X100318000Y-116193000D01* +X94488000Y-123698000D02* +X94361000Y-123698000D01* +X100318000Y-116193000D02* +X99822000Y-115887500D01* +X100318000Y-124079000D02* +X100318000Y-124726000D01* +X94361000Y-120626000D02* +X93738000Y-120003000D01* +X94361000Y-123698000D02* +X94361000Y-120626000D01* +X96012000Y-125349000D02* +X94361000Y-123698000D01* +X99695000Y-125349000D02* +X96012000Y-125349000D01* +X100318000Y-124726000D02* +X99695000Y-125349000D01* +X91813400Y-120675400D02* +X93065600Y-120675400D01* +X93065600Y-120675400D02* +X93738000Y-120003000D01* +D42* +X85332000Y-104546400D02* +X85332000Y-105550400D01* +X85623400Y-120980200D02* +X85623400Y-120954800D01* +X85332000Y-105550400D02* +X85572600Y-105791000D01* +X91813400Y-120675400D02* +X89738200Y-120675400D01* +X89712800Y-120700800D02* +X89712800Y-120726200D01* +X89738200Y-120675400D02* +X89712800Y-120700800D01* +X88366600Y-120954800D02* +X89484200Y-120954800D01* +X90195400Y-120243600D02* +X90195400Y-119710200D01* +X89484200Y-120954800D02* +X89712800Y-120726200D01* +X89712800Y-120726200D02* +X90195400Y-120243600D01* +X88925400Y-121742200D02* +X88925400Y-121513600D01* +X88925400Y-121513600D02* +X88366600Y-120954800D01* +X88366600Y-120954800D02* +X85623400Y-120954800D01* +X86233000Y-123367800D02* +X85623400Y-122758200D01* +X85979000Y-118338600D02* +X85979000Y-117971000D01* +X85623400Y-118694200D02* +X85979000Y-118338600D01* +X85623400Y-122758200D02* +X85623400Y-120954800D01* +X85623400Y-120954800D02* +X85623400Y-118694200D01* +X86233000Y-123583000D02* +X86233000Y-123367800D01* +D43* +X96721000Y-112649000D02* +X96721000Y-114231300D01* +X110664800Y-113265300D02* +X110664800Y-112912240D01* +X110670800Y-113271300D02* +X110664800Y-113265300D01* +X97551700Y-115062000D02* +X98008900Y-115062000D01* +X96721000Y-114231300D02* +X97551700Y-115062000D01* +D45* +X114645900Y-115150900D02* +X113364470Y-113869470D01* +X113364470Y-113869470D02* +X113364470Y-113780570D01* +D44* +X114213400Y-109029500D02* +X114213400Y-112931640D01* +X114213400Y-112931640D02* +X113364470Y-113780570D01* +X113364470Y-113780570D02* +X112448800Y-114696240D01* +X110664800Y-107757000D02* +X110664800Y-112912240D01* +X110664800Y-112912240D02* +X112448800Y-114696240D01* +D42* +X96721000Y-112649000D02* +X96721000Y-110797000D01* +X98031000Y-106540000D02* +X97020000Y-106540000D01* +X98171000Y-106680000D02* +X98031000Y-106540000D01* +X98171000Y-109347000D02* +X98171000Y-106680000D01* +X96721000Y-110797000D02* +X98171000Y-109347000D01* +X97020000Y-106540000D02* +X95961500Y-106540000D01* +X95961500Y-106540000D02* +X95059500Y-107442000D01* +X95059500Y-107442000D02* +X95059500Y-107557000D01* +D45* +X99621000Y-112649000D02* +X102604000Y-112649000D01* +X102604000Y-112649000D02* +X102362000Y-112649000D01* +X104521000Y-114351500D02* +X103239000Y-114351500D01* +X102604000Y-113716500D02* +X102604000Y-111760000D01* +X103239000Y-114351500D02* +X102604000Y-113716500D01* +D42* +X102604000Y-111760000D02* +X102604000Y-111454500D01* +X102604000Y-111454500D02* +X102870000Y-111188500D01* +X102870000Y-111188500D02* +X102870000Y-109990000D01* +X102362000Y-112649000D02* +X102604000Y-112407000D01* +X102604000Y-112407000D02* +X102604000Y-111760000D01* +D43* +X104521000Y-114351500D02* +X105624500Y-114351500D01* +X105624500Y-114351500D02* +X105676000Y-114300000D01* +X97213400Y-120675400D02* +X95973900Y-120675400D01* +X95238000Y-119939500D02* +X95238000Y-115316000D01* +X95973900Y-120675400D02* +X95238000Y-119939500D01* +D44* +X93980000Y-112321000D02* +X93980000Y-112649000D01* +X93980000Y-112649000D02* +X95238000Y-113907000D01* +X95238000Y-113907000D02* +X95238000Y-115316000D01* +D43* +X93345000Y-100100000D02* +X93345000Y-98933000D01* +X97089000Y-98359000D02* +X97089000Y-98936000D01* +X96520000Y-97790000D02* +X97089000Y-98359000D01* +X94488000Y-97790000D02* +X96520000Y-97790000D01* +X93345000Y-98933000D02* +X94488000Y-97790000D01* +D44* +X93345000Y-100100000D02* +X90295860Y-100100000D01* +X90295860Y-100100000D02* +X89535000Y-100860860D01* +X86360000Y-100445000D02* +X89119140Y-100445000D01* +X89119140Y-100445000D02* +X89535000Y-100860860D01* +D43* +X92456000Y-115304000D02* +X91428000Y-115304000D01* +X90424000Y-115062000D02* +X87670000Y-112308000D01* +X91186000Y-115062000D02* +X90424000Y-115062000D01* +X91428000Y-115304000D02* +X91186000Y-115062000D01* +X87670000Y-112308000D02* +X87670000Y-111760000D01* +D44* +X89535000Y-100860860D02* +X89908262Y-100860860D01* +X89908262Y-100860860D02* +X90805000Y-101757598D01* +D42* +X90170000Y-106172000D02* +X91592400Y-104749600D01* +X91592400Y-104749600D02* +X91592400Y-103454200D01* +X91592400Y-103454200D02* +X90855800Y-102717600D01* +X90855800Y-102717600D02* +X85699600Y-102717600D01* +X82423000Y-118098000D02* +X80583800Y-118098000D01* +X80583800Y-118098000D02* +X80444800Y-118237000D01* +X82423000Y-116598000D02* +X81345800Y-116598000D01* +X81345800Y-116598000D02* +X80444800Y-115697000D01* +X83286600Y-117041800D02* +X83286600Y-119596600D01* +X82842800Y-116598000D02* +X83286600Y-117041800D01* +X82423000Y-116598000D02* +X82842800Y-116598000D01* +X83286600Y-119596600D02* +X83324000Y-119634000D01* +X82181000Y-116840000D02* +X82423000Y-116598000D01* +X82550000Y-124956000D02* +X82083800Y-124956000D01* +X82083800Y-124956000D02* +X80444800Y-123317000D01* +X83324000Y-121920000D02* +X81587800Y-121920000D01* +X81587800Y-121920000D02* +X80444800Y-120777000D01* +X83324000Y-121920000D02* +X83324000Y-122682000D01* +X83324000Y-122682000D02* +X82550000Y-123456000D01* +X90170000Y-106680000D02* +X90170000Y-106172000D01* +X85699600Y-102717600D02* +X85471000Y-102946200D01* +X85471000Y-102946200D02* +X85332000Y-102946200D01* +D44* +X93980000Y-109421000D02* +X93980000Y-109220000D01* +X93980000Y-109220000D02* +X93342460Y-108582460D01* +X93342460Y-108582460D02* +X93342460Y-106680000D01* +X92456000Y-113804000D02* +X90944000Y-113804000D01* +X90170000Y-113030000D02* +X90170000Y-111760000D01* +X90944000Y-113804000D02* +X90170000Y-113030000D01* +D43* +X96139000Y-96136000D02* +X93726460Y-96136000D01* +X93726460Y-96136000D02* +X93342460Y-96520000D01* +X83832000Y-104546400D02* +X83832000Y-102946200D01* +D42* +X83832000Y-102946200D02* +X83832000Y-102482540D01* +X107530860Y-108140000D02* +X108720000Y-108140000D01* +X107462780Y-108071920D02* +X107530860Y-108140000D01* +X103810260Y-104861360D02* +X104455420Y-104861360D01* +X98918220Y-99969320D02* +X103810260Y-104861360D01* +X84480860Y-101833680D02* +X87691420Y-101833680D01* +X83832000Y-102482540D02* +X84480860Y-101833680D01* +X98818000Y-116840000D02* +X98818000Y-114740800D01* +X103673100Y-112522000D02* +X103673100Y-109993100D01* +X103342900Y-112852200D02* +X103673100Y-112522000D01* +X98288300Y-113969800D02* +X98542300Y-113715800D01* +X98288300Y-114211100D02* +X98288300Y-113969800D01* +X98818000Y-114740800D02* +X98288300Y-114211100D01* +X103673100Y-109993100D02* +X103670000Y-109990000D01* +D45* +X103670000Y-109990000D02* +X103670000Y-108610500D01* +X103670000Y-108610500D02* +X104940500Y-107340000D01* +X104940500Y-107340000D02* +X108720000Y-107340000D01* +X103695500Y-110015500D02* +X103670000Y-109990000D01* +X98818000Y-116840000D02* +X97238800Y-116840000D01* +X97238800Y-116840000D02* +X97213400Y-116865400D01* +D43* +X97213400Y-118135400D02* +X97213400Y-116865400D01* +D42* +X89560400Y-119710200D02* +X89560400Y-119311880D01* +X107422140Y-105674160D02* +X108654160Y-105674160D01* +X107020820Y-105272840D02* +X107422140Y-105674160D01* +X90094260Y-118778020D02* +X90376200Y-118778020D01* +X89560400Y-119311880D02* +X90094260Y-118778020D01* +X108654160Y-105674160D02* +X108720000Y-105740000D01* +X89560400Y-121742200D02* +X89560400Y-122220180D01* +X107645660Y-104902000D02* +X108682000Y-104902000D01* +X107361180Y-104617520D02* +X107645660Y-104902000D01* +X106975100Y-104617520D02* +X107361180Y-104617520D01* +X106304540Y-103946960D02* +X106975100Y-104617520D01* +X89560400Y-122220180D02* +X89202720Y-122577860D01* +X108682000Y-104902000D02* +X108720000Y-104940000D01* +X91813400Y-119405400D02* +X92613940Y-119405400D01* +X107432300Y-104140000D02* +X108720000Y-104140000D01* +X107307840Y-104015540D02* +X107432300Y-104140000D01* +X107307840Y-103489760D02* +X107307840Y-104015540D01* +X106952240Y-103134160D02* +X107307840Y-103489760D01* +X105788920Y-103134160D02* +X106952240Y-103134160D01* +X105524760Y-103398320D02* +X105788920Y-103134160D01* +X93401340Y-118618000D02* +X93401340Y-116707920D01* +X92613940Y-119405400D02* +X93401340Y-118618000D01* +D45* +X91813400Y-119405400D02* +X92557600Y-119405400D01* +D42* +X91813400Y-121945400D02* +X92969540Y-121945400D01* +X107742180Y-103220520D02* +X108600520Y-103220520D01* +X107122420Y-102600760D02* +X107742180Y-103220520D01* +X105204720Y-102600760D02* +X107122420Y-102600760D01* +X104882140Y-102923340D02* +X105204720Y-102600760D01* +X104882140Y-103698040D02* +X104882140Y-102923340D01* +X104518920Y-104061260D02* +X104882140Y-103698040D01* +X92969540Y-121945400D02* +X93508020Y-121406920D01* +X108600520Y-103220520D02* +X108720000Y-103340000D01* +D45* +X108694500Y-103314500D02* +X108720000Y-103340000D01* +X104470000Y-98290000D02* +X104470000Y-99898000D01* +X106425500Y-100140000D02* +X108720000Y-100140000D01* +X106172000Y-100393500D02* +X106425500Y-100140000D01* +X104965500Y-100393500D02* +X106172000Y-100393500D01* +X104470000Y-99898000D02* +X104965500Y-100393500D01* +D42* +X109410500Y-98488500D02* +X109410500Y-98806000D01* +X107767000Y-99187000D02* +X106870000Y-98290000D01* +X109029500Y-99187000D02* +X107767000Y-99187000D01* +X109410500Y-98806000D02* +X109029500Y-99187000D01* +X108140500Y-96456500D02* +X103568500Y-96456500D01* +X102870000Y-97155000D02* +X102870000Y-98290000D01* +X103568500Y-96456500D02* +X102870000Y-97155000D01* +D43* +X95189000Y-98936000D02* +X95189000Y-100142000D01* +X95987000Y-100940000D02* +X97020000Y-100940000D01* +X95189000Y-100142000D02* +X95987000Y-100940000D01* +D45* +X111340460Y-101260300D02* +X110540600Y-101260300D01* +X99240600Y-102540000D02* +X97020000Y-102540000D01* +X99685300Y-102095300D02* +X99240600Y-102540000D01* +X110226300Y-101574600D02* +X110061200Y-101574600D01* +X110540600Y-101260300D02* +X110226300Y-101574600D01* +X110212700Y-100610300D02* +X111340460Y-100610300D01* +X110200900Y-100622100D02* +X110212700Y-100610300D01* +X98491400Y-103340000D02* +X98580400Y-103251000D01* +X97020000Y-103340000D02* +X98491400Y-103340000D01* +D42* +X84328000Y-107430000D02* +X85776500Y-107430000D01* +X95567500Y-104140000D02* +X97020000Y-104140000D01* +X95504000Y-104203500D02* +X95567500Y-104140000D01* +X86487000Y-108140500D02* +X91503500Y-108140500D01* +X85776500Y-107430000D02* +X86487000Y-108140500D01* +X84328000Y-109970000D02* +X90817000Y-109970000D01* +X95910500Y-104940000D02* +X97020000Y-104940000D01* +X95567500Y-105283000D02* +X95910500Y-104940000D01* +X90817000Y-109970000D02* +X91821000Y-108966000D01* +X84328000Y-112510000D02* +X84328000Y-112452002D01* +X84328000Y-112452002D02* +X86226502Y-110553500D01* +X86226502Y-110553500D02* +X95250000Y-110553500D01* +X95250000Y-110553500D02* +X95758000Y-110045500D01* +X95758000Y-110045500D02* +X95758000Y-107505500D01* +X95758000Y-107505500D02* +X95923500Y-107340000D01* +X95923500Y-107340000D02* +X97020000Y-107340000D01* +X84328000Y-115050000D02* +X86293720Y-115050000D01* +X97020000Y-108598540D02* +X97020000Y-108140000D01* +X96500140Y-109118400D02* +X97020000Y-108598540D01* +X86293720Y-115050000D02* +X86357920Y-114985800D01* +X107914800Y-115332000D02* +X107889800Y-115307000D01* +X107889800Y-115307000D02* +X107889800Y-111582000D01* +X98314800Y-111907000D02* +X97989800Y-111582000D01* +X97989800Y-111582000D02* +X97989800Y-110707000D01* +X97989800Y-110707000D02* +X98389800Y-110307000D01* +X98389800Y-110307000D02* +X98553000Y-110307000D01* +X98553000Y-110307000D02* +X98870000Y-109990000D01* +X99670000Y-108401800D02* +X99670000Y-109990000D01* +X99914800Y-108157000D02* +X99670000Y-108401800D01* +X101264800Y-108157000D02* +X99914800Y-108157000D01* +X101289800Y-108132000D02* +X101264800Y-108157000D01* +X109514800Y-115257000D02* +X109514800Y-111107000D01* +X109439800Y-115332000D02* +X109514800Y-115257000D01* +X97213400Y-123215400D02* +X96281700Y-123215400D01* +X105270000Y-110899700D02* +X105270000Y-109990000D01* +X104841500Y-111328200D02* +X105270000Y-110899700D01* +X104612900Y-111328200D02* +X104841500Y-111328200D01* +X104397000Y-111544100D02* +X104612900Y-111328200D01* +X95697500Y-122631200D02* +X95697500Y-121462800D01* +X96281700Y-123215400D02* +X95697500Y-122631200D01* +D45* +X105283000Y-110003000D02* +X105270000Y-109990000D01* +X96997500Y-122999500D02* +X97213400Y-123215400D01* +D43* +X97213400Y-124485400D02* +X98411600Y-124485400D01* +X98411600Y-124485400D02* +X98818000Y-124079000D01* +X97213400Y-123215400D02* +X97213400Y-124485400D01* +D45* +X107176000Y-112903000D02* +X107176000Y-110296000D01* +X107176000Y-110296000D02* +X106870000Y-109990000D01* +X100647500Y-120066500D02* +X101612000Y-120066500D01* +X107176000Y-115074000D02* +X107176000Y-114300000D01* +X107124500Y-115125500D02* +X107176000Y-115074000D01* +X101612000Y-120066500D02* +X101790500Y-119888000D01* +D43* +X107176000Y-112903000D02* +X107176000Y-114300000D01* +X100647500Y-121170000D02* +X100647500Y-120066500D01* +D42* +X82550000Y-115050000D02* +X82337800Y-115050000D01* +X82337800Y-115050000D02* +X80444800Y-113157000D01* +X82550000Y-115050000D02* +X82182400Y-115050000D01* +X82550000Y-112510000D02* +X82337800Y-112510000D01* +X82337800Y-112510000D02* +X80444800Y-110617000D01* +X82550000Y-112510000D02* +X82385600Y-112510000D01* +X82550000Y-109970000D02* +X82337800Y-109970000D01* +X82337800Y-109970000D02* +X80444800Y-108077000D01* +X82550000Y-109970000D02* +X82309400Y-109970000D01* +X82550000Y-107430000D02* +X82337800Y-107430000D01* +X82337800Y-107430000D02* +X80444800Y-105537000D01* +X108775500Y-96096280D02* +X108775500Y-96456500D01* +X109083300Y-95788480D02* +X108775500Y-96096280D01* +X109784340Y-95788480D02* +X109083300Y-95788480D01* +X109982460Y-95986600D02* +X109784340Y-95788480D01* +X109982460Y-96032320D02* +X109982460Y-95986600D01* +X110378700Y-96428560D02* +X109982460Y-96032320D01* +X108775500Y-98108898D02* +X108775500Y-98488500D01* +X109129958Y-97754440D02* +X108775500Y-98108898D01* +X109814820Y-97754440D02* +X109129958Y-97754440D01* +X110134860Y-97434400D02* +X109814820Y-97754440D01* +D43* +X99060000Y-122670000D02* +X100647500Y-122670000D01* +X97213400Y-121945400D02* +X98335400Y-121945400D01* +X98335400Y-121945400D02* +X99060000Y-122670000D01* +X97213400Y-119405400D02* +X98221100Y-119405400D01* +X98221100Y-119405400D02* +X99060000Y-118566500D01* +X100647500Y-118566500D02* +X99060000Y-118566500D01* +D42* +X82550000Y-105930000D02* +X84328000Y-105930000D01* +X82550000Y-108470000D02* +X84328000Y-108470000D01* +X82550000Y-111010000D02* +X84328000Y-111010000D01* +X82550000Y-113550000D02* +X84328000Y-113550000D01* +X89395300Y-123570300D02* +X90475500Y-123570300D01* +X90830400Y-123215400D02* +X91813400Y-123215400D01* +X90475500Y-123570300D02* +X90830400Y-123215400D01* +X87871300Y-123570300D02* +X87871300Y-121920700D01* +X87871300Y-121920700D02* +X87872000Y-121920000D01* +X87871300Y-123570300D02* +X89395300Y-123570300D01* +X89395300Y-125070300D02* +X89661300Y-125070300D01* +X89661300Y-125070300D02* +X90474800Y-124256800D01* +X90220800Y-122326400D02* +X90220800Y-121767600D01* +X90500200Y-122605800D02* +X90220800Y-122326400D01* +X90220800Y-121767600D02* +X90195400Y-121742200D01* +X87871300Y-125070300D02* +X89395300Y-125070300D01* +X91813400Y-118135400D02* +X90271600Y-118135400D01* +X90107200Y-117971000D02* +X89281000Y-117971000D01* +X90271600Y-118135400D02* +X90107200Y-117971000D01* +X87872000Y-119634000D02* +X87872000Y-118213000D01* +X87872000Y-118213000D02* +X87630000Y-117971000D01* +X87630000Y-117971000D02* +X89281000Y-117971000D01* +X89281000Y-116471000D02* +X90334400Y-116471000D01* +X88925400Y-118922800D02* +X88925400Y-119710200D01* +X88976200Y-118872000D02* +X88925400Y-118922800D01* +X90334400Y-116471000D02* +X90449400Y-116586000D01* +X87630000Y-116471000D02* +X89281000Y-116471000D01* +X85979000Y-116471000D02* +X86195600Y-116471000D01* +X86195600Y-116471000D02* +X86817200Y-115849400D01* +X90805000Y-115849400D02* +X91813400Y-116857800D01* +X86817200Y-115849400D02* +X90805000Y-115849400D01* +X91813400Y-116857800D02* +X91813400Y-116865400D01* +X85979000Y-116471000D02* +X86067200Y-116471000D01* +X86067200Y-116471000D02* +X86791800Y-117195600D01* +X86372000Y-119012400D02* +X86372000Y-119634000D01* +X86512400Y-118872000D02* +X86372000Y-119012400D01* +X86537800Y-118872000D02* +X86512400Y-118872000D01* +X86791800Y-118618000D02* +X86537800Y-118872000D01* +X86791800Y-117195600D02* +X86791800Y-118618000D01* +X84455000Y-116471000D02* +X85979000Y-116471000D01* +X86233000Y-125083000D02* +X86881400Y-125083000D01* +X91305400Y-124993400D02* +X91813400Y-124485400D01* +X90779600Y-124993400D02* +X91305400Y-124993400D01* +X90678000Y-125095000D02* +X90779600Y-124993400D01* +X86881400Y-125083000D02* +X86918800Y-125120400D01* +X86372000Y-121920000D02* +X86372000Y-122516200D01* +X86233000Y-124815600D02* +X86233000Y-125083000D01* +X86436200Y-124612400D02* +X86233000Y-124815600D01* +X86614000Y-124612400D02* +X86436200Y-124612400D01* +X87045800Y-124180600D02* +X86791800Y-124434600D01* +X86791800Y-124434600D02* +X86614000Y-124612400D01* +X87045800Y-123190000D02* +X87045800Y-124180600D01* +X86372000Y-122516200D02* +X87045800Y-123190000D01* +X84709000Y-125083000D02* +X86233000Y-125083000D01* +X84824000Y-119634000D02* +X84824000Y-119037800D01* +X84455000Y-118668800D02* +X84455000Y-117971000D01* +X84824000Y-119037800D02* +X84455000Y-118668800D01* +X84824000Y-121920000D02* +X84824000Y-123468000D01* +X84824000Y-123468000D02* +X84709000Y-123583000D01* +M02* diff --git a/PCB/OUTPUT_V4/itead/Tinylab_proto1-F.Mask.gbr b/PCB/OUTPUT_V4/itead/Tinylab_proto1-F.Mask.gbr new file mode 100644 index 00000000..aef2a739 --- /dev/null +++ b/PCB/OUTPUT_V4/itead/Tinylab_proto1-F.Mask.gbr @@ -0,0 +1,304 @@ +G04 #@! TF.FileFunction,Soldermask,Top* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 25/03/2016 9:42:23 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,0.800000X0.750000*% +%ADD12R,0.750000X0.800000*% +%ADD13C,1.300000*% +%ADD14R,1.300000X1.300000*% +%ADD15C,1.998980*% +%ADD16R,1.998980X1.998980*% +%ADD17R,1.600000X1.000000*% +%ADD18R,1.600000X0.560000*% +%ADD19R,0.560000X1.600000*% +%ADD20R,1.905000X1.905000*% +%ADD21C,1.905000*% +%ADD22R,0.900000X2.500000*% +%ADD23R,2.500000X0.900000*% +%ADD24R,2.032000X2.032000*% +%ADD25O,2.032000X2.032000*% +%ADD26R,1.350000X0.400000*% +%ADD27O,0.950000X1.250000*% +%ADD28O,1.550000X1.000000*% +%ADD29R,2.032000X1.727200*% +%ADD30O,2.032000X1.727200*% +%ADD31R,1.727200X1.727200*% +%ADD32O,1.727200X1.727200*% +%ADD33R,0.600000X0.900000*% +%ADD34R,0.900000X0.500000*% +%ADD35R,0.500000X0.900000*% +%ADD36R,0.900000X0.600000*% +%ADD37R,1.500000X0.600000*% +%ADD38R,0.304800X0.508000*% +%ADD39R,1.600200X2.999740*% +%ADD40R,1.600200X2.600960*% +G04 APERTURE END LIST* +D10* +D11* +X106795000Y-122555000D03* +X105295000Y-122555000D03* +X106795000Y-118745000D03* +X105295000Y-118745000D03* +D12* +X114887200Y-107633200D03* +X114887200Y-106133200D03* +D11* +X114213400Y-109029500D03* +X115713400Y-109029500D03* +D12* +X104521000Y-114351500D03* +X104521000Y-112851500D03* +D11* +X95238000Y-115316000D03* +X93738000Y-115316000D03* +X102604000Y-111760000D03* +X101104000Y-111760000D03* +D12* +X86360000Y-98945000D03* +X86360000Y-100445000D03* +X95059500Y-107557000D03* +X95059500Y-106057000D03* +X82423000Y-118098000D03* +X82423000Y-116598000D03* +X82550000Y-124956000D03* +X82550000Y-123456000D03* +D13* +X87670000Y-111760000D03* +D14* +X90170000Y-111760000D03* +D12* +X92456000Y-113804000D03* +X92456000Y-115304000D03* +D15* +X93342460Y-96520000D03* +D16* +X93342460Y-106680000D03* +D17* +X93345000Y-103100000D03* +X93345000Y-100100000D03* +D18* +X108720000Y-108140000D03* +X108720000Y-107340000D03* +X108720000Y-106540000D03* +X108720000Y-105740000D03* +X108720000Y-104940000D03* +X108720000Y-104140000D03* +X108720000Y-103340000D03* +X108720000Y-102540000D03* +X108720000Y-101740000D03* +X108720000Y-100940000D03* +X108720000Y-100140000D03* +D19* +X106870000Y-98290000D03* +X106070000Y-98290000D03* +X105270000Y-98290000D03* +X104470000Y-98290000D03* +X103670000Y-98290000D03* +X102870000Y-98290000D03* +X102070000Y-98290000D03* +X101270000Y-98290000D03* +X100470000Y-98290000D03* +X99670000Y-98290000D03* +X98870000Y-98290000D03* +D18* +X97020000Y-100140000D03* +X97020000Y-100940000D03* +X97020000Y-101740000D03* +X97020000Y-102540000D03* +X97020000Y-103340000D03* +X97020000Y-104140000D03* +X97020000Y-104940000D03* +X97020000Y-105740000D03* +X97020000Y-106540000D03* +X97020000Y-107340000D03* +X97020000Y-108140000D03* +D19* +X98870000Y-109990000D03* +X99670000Y-109990000D03* +X100470000Y-109990000D03* +X101270000Y-109990000D03* +X102070000Y-109990000D03* +X102870000Y-109990000D03* +X103670000Y-109990000D03* +X104470000Y-109990000D03* +X105270000Y-109990000D03* +X106070000Y-109990000D03* +X106870000Y-109990000D03* +D20* +X80444800Y-97917000D03* +D21* +X80444800Y-102997000D03* +D22* +X96721000Y-112649000D03* +X99621000Y-112649000D03* +D23* +X93980000Y-112321000D03* +X93980000Y-109421000D03* +D24* +X105918000Y-124460000D03* +D25* +X103378000Y-124460000D03* +D26* +X111340460Y-101910300D03* +X111340460Y-101260300D03* +X111340460Y-100610300D03* +X111340460Y-99960300D03* +X111340460Y-99310300D03* +D27* +X111340460Y-103110300D03* +X111340460Y-98110300D03* +D28* +X114040460Y-104110300D03* +X114040460Y-97110300D03* +D29* +X80444800Y-113157000D03* +D30* +X80444800Y-110617000D03* +X80444800Y-108077000D03* +X80444800Y-105537000D03* +D31* +X113795000Y-124307600D03* +D32* +X111255000Y-124307600D03* +X113795000Y-121767600D03* +X111255000Y-121767600D03* +D24* +X105918000Y-116840000D03* +D25* +X103378000Y-116840000D03* +D29* +X80444800Y-115697000D03* +D30* +X80444800Y-118237000D03* +X80444800Y-120777000D03* +X80444800Y-123317000D03* +D24* +X113706100Y-118224300D03* +D25* +X111166100Y-118224300D03* +D24* +X103378000Y-119380000D03* +D25* +X103378000Y-121920000D03* +D33* +X96139000Y-96136000D03* +X97089000Y-98936000D03* +X95189000Y-98936000D03* +D34* +X99060000Y-122670000D03* +X99060000Y-121170000D03* +X99060000Y-118566500D03* +X99060000Y-120066500D03* +X100647500Y-122670000D03* +X100647500Y-121170000D03* +X100647500Y-120066500D03* +X100647500Y-118566500D03* +D35* +X105676000Y-114300000D03* +X107176000Y-114300000D03* +X105676000Y-112903000D03* +X107176000Y-112903000D03* +D34* +X82550000Y-105930000D03* +X82550000Y-107430000D03* +X82550000Y-108470000D03* +X82550000Y-109970000D03* +X82550000Y-111010000D03* +X82550000Y-112510000D03* +X82550000Y-113550000D03* +X82550000Y-115050000D03* +X84328000Y-107430000D03* +X84328000Y-105930000D03* +X84328000Y-109970000D03* +X84328000Y-108470000D03* +X84328000Y-112510000D03* +X84328000Y-111010000D03* +X84328000Y-115050000D03* +X84328000Y-113550000D03* +X89395300Y-123570300D03* +X89395300Y-125070300D03* +X87871300Y-123570300D03* +X87871300Y-125070300D03* +X89281000Y-117971000D03* +X89281000Y-116471000D03* +X87630000Y-117971000D03* +X87630000Y-116471000D03* +D35* +X86372000Y-119634000D03* +X87872000Y-119634000D03* +X86372000Y-121920000D03* +X87872000Y-121920000D03* +X98818000Y-124079000D03* +X100318000Y-124079000D03* +D34* +X84455000Y-117971000D03* +X84455000Y-116471000D03* +X84709000Y-123583000D03* +X84709000Y-125083000D03* +D35* +X83324000Y-119634000D03* +X84824000Y-119634000D03* +X83324000Y-121920000D03* +X84824000Y-121920000D03* +X85332000Y-102946200D03* +X83832000Y-102946200D03* +X83832000Y-104546400D03* +X85332000Y-104546400D03* +X100318000Y-116840000D03* +X98818000Y-116840000D03* +D34* +X85979000Y-116471000D03* +X85979000Y-117971000D03* +X86233000Y-123583000D03* +X86233000Y-125083000D03* +D36* +X113464800Y-106807000D03* +X110664800Y-107757000D03* +X110664800Y-105857000D03* +D37* +X97213400Y-124485400D03* +X97213400Y-123215400D03* +X97213400Y-121945400D03* +X97213400Y-120675400D03* +X97213400Y-119405400D03* +X97213400Y-118135400D03* +X97213400Y-116865400D03* +X91813400Y-116865400D03* +X91813400Y-118135400D03* +X91813400Y-119405400D03* +X91813400Y-120675400D03* +X91813400Y-121945400D03* +X91813400Y-123215400D03* +X91813400Y-124485400D03* +D38* +X90195400Y-119710200D03* +X88925400Y-119710200D03* +X90195400Y-121742200D03* +X89560400Y-119710200D03* +X88925400Y-121742200D03* +X89560400Y-121742200D03* +X108140500Y-98488500D03* +X109410500Y-98488500D03* +X108140500Y-96456500D03* +X108775500Y-98488500D03* +X109410500Y-96456500D03* +X108775500Y-96456500D03* +D39* +X112448800Y-114696240D03* +X112448800Y-110296960D03* +D40* +X89535000Y-97259140D03* +X89535000Y-100860860D03* +D24* +X90604800Y-106807000D03* +D25* +X88064800Y-106807000D03* +D24* +X90604800Y-104267000D03* +D25* +X88064800Y-104267000D03* +M02* diff --git a/PCB/OUTPUT_V4/itead/Tinylab_proto1.drl b/PCB/OUTPUT_V4/itead/Tinylab_proto1.drl new file mode 100644 index 00000000..aca0c510 --- /dev/null +++ b/PCB/OUTPUT_V4/itead/Tinylab_proto1.drl @@ -0,0 +1,124 @@ +M48 +;DRILL file {KiCad 4.0.1-stable} date 25/03/2016 9:42:25 AM +;FORMAT={2:4/ absolute / inch / keep zeros} +FMAT,2 +INCH,TZ +T1C0.016 +T2C0.020 +T3C0.022 +T4C0.031 +T5C0.032 +T6C0.039 +T7C0.040 +T8C0.050 +% +G90 +G05 +M72 +T1 +X033690Y-041650 +X033710Y-047630 +X033999Y-045270 +X034220Y-049260 +X034524Y-040092 +X035030Y-046800 +X035119Y-048259 +X035581Y-046763 +X035610Y-045900 +X035620Y-048920 +X035630Y-048270 +X035700Y-049250 +X035750Y-040062 +X035956Y-038700 +X036025Y-042575 +X036150Y-042900 +X036772Y-045948 +X036814Y-047798 +X037200Y-048700 +X037600Y-041025 +X037625Y-041450 +X037676Y-047820 +X037992Y-042960 +X038586Y-045300 +X038707Y-044058 +X038796Y-044770 +X038811Y-040650 +X038944Y-039358 +X039246Y-040195 +X039300Y-045625 +X039878Y-042572 +X040075Y-047200 +X040113Y-044749 +X040200Y-039225 +X040654Y-042520 +X040686Y-044430 +X041101Y-043915 +X041124Y-041284 +X041149Y-040969 +X041387Y-044438 +X041450Y-039225 +X041545Y-040708 +X041852Y-040924 +X042134Y-041446 +X042175Y-045325 +X042308Y-042548 +X042476Y-043930 +X042486Y-045406 +X043087Y-045406 +X043116Y-043743 +X043331Y-039990 +X043360Y-038360 +X043386Y-039615 +X043456Y-037964 +X043571Y-044595 +X043946Y-042040 +X044277Y-042513 +X044326Y-040140 +X045136Y-045335 +T4 +X034516Y-044000 +X035500Y-044000 +T5 +X031671Y-038550 +X031671Y-040550 +T6 +X036749Y-042000 +T7 +X031671Y-041550 +X031671Y-042550 +X031671Y-043550 +X031671Y-044550 +X031671Y-045550 +X031671Y-046550 +X031671Y-047550 +X031671Y-048550 +X034671Y-041050 +X034671Y-042050 +X035671Y-041050 +X035671Y-042050 +X040700Y-046000 +X040700Y-047000 +X040700Y-048000 +X040700Y-049000 +X041700Y-046000 +X041700Y-049000 +X043766Y-046545 +X043801Y-047940 +X043801Y-048940 +X044766Y-046545 +X044801Y-047940 +X044801Y-048940 +T8 +X036749Y-038000 +T2 +X045026Y-038232G85X044770Y-038232 +G05 +X045026Y-040988G85X044770Y-040988 +G05 +T3 +X043835Y-038685G85X043835Y-038567 +G05 +X043835Y-040654G85X043835Y-040536 +G05 +T0 +M30 diff --git a/PCB/OUTPUT_V4/seeeed/BOM/Seeed BOM Format.ods b/PCB/OUTPUT_V4/seeeed/BOM/Seeed BOM Format.ods new file mode 100644 index 00000000..5cd5afc2 Binary files /dev/null and b/PCB/OUTPUT_V4/seeeed/BOM/Seeed BOM Format.ods differ diff --git a/PCB/OUTPUT_V4/seeeed/BOM/Seeed BOM Format.xls b/PCB/OUTPUT_V4/seeeed/BOM/Seeed BOM Format.xls new file mode 100644 index 00000000..c76c5a6a Binary files /dev/null and b/PCB/OUTPUT_V4/seeeed/BOM/Seeed BOM Format.xls differ diff --git a/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1-B.Cu.gbr b/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1-B.Cu.gbr new file mode 100644 index 00000000..4db900d5 --- /dev/null +++ b/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1-B.Cu.gbr @@ -0,0 +1,496 @@ +G04 #@! TF.FileFunction,Copper,L2,Bot,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 25/03/2016 9:42:23 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11C,1.300000*% +%ADD12R,1.300000X1.300000*% +%ADD13C,1.998980*% +%ADD14R,1.998980X1.998980*% +%ADD15R,1.905000X1.905000*% +%ADD16C,1.905000*% +%ADD17R,2.032000X2.032000*% +%ADD18O,2.032000X2.032000*% +%ADD19O,0.950000X1.250000*% +%ADD20O,1.550000X1.000000*% +%ADD21R,2.032000X1.727200*% +%ADD22O,2.032000X1.727200*% +%ADD23R,1.727200X1.727200*% +%ADD24O,1.727200X1.727200*% +%ADD25C,0.600000*% +%ADD26C,0.635000*% +%ADD27C,1.270000*% +%ADD28C,0.400000*% +%ADD29C,0.250000*% +G04 APERTURE END LIST* +D10* +D11* +X87670000Y-111760000D03* +D12* +X90170000Y-111760000D03* +D13* +X93342460Y-96520000D03* +D14* +X93342460Y-106680000D03* +D15* +X80444800Y-97917000D03* +D16* +X80444800Y-102997000D03* +D17* +X105918000Y-124460000D03* +D18* +X103378000Y-124460000D03* +D19* +X111340460Y-103110300D03* +X111340460Y-98110300D03* +D20* +X114040460Y-104110300D03* +X114040460Y-97110300D03* +D21* +X80444800Y-113157000D03* +D22* +X80444800Y-110617000D03* +X80444800Y-108077000D03* +X80444800Y-105537000D03* +D23* +X113795000Y-124307600D03* +D24* +X111255000Y-124307600D03* +X113795000Y-121767600D03* +X111255000Y-121767600D03* +D17* +X105918000Y-116840000D03* +D18* +X103378000Y-116840000D03* +D21* +X80444800Y-115697000D03* +D22* +X80444800Y-118237000D03* +X80444800Y-120777000D03* +X80444800Y-123317000D03* +D17* +X113706100Y-118224300D03* +D18* +X111166100Y-118224300D03* +D17* +X103378000Y-119380000D03* +D18* +X103378000Y-121920000D03* +D17* +X90604800Y-106807000D03* +D18* +X88064800Y-106807000D03* +D17* +X90604800Y-104267000D03* +D18* +X88064800Y-104267000D03* +D25* +X112588500Y-101955600D03* +X91328700Y-98298000D03* +X112464800Y-107982000D03* +X105123440Y-112872520D03* +X101886498Y-113662460D03* +X111623300Y-106781600D03* +X103261620Y-108000800D03* +X102108000Y-99631500D03* +X105283000Y-99631500D03* +X94488000Y-123698000D03* +X99822000Y-115887500D03* +X85623400Y-120980200D03* +X85572600Y-105791000D03* +X110670800Y-113271300D03* +X98008900Y-115062000D03* +X114645900Y-115150900D03* +X90805000Y-101757598D03* +X107462780Y-108071920D03* +X104455420Y-104861360D03* +X98918220Y-99969320D03* +X87691420Y-101833680D03* +X103342900Y-112852200D03* +X98542300Y-113715800D03* +X107020820Y-105272840D03* +X90376200Y-118778020D03* +X106304540Y-103946960D03* +X89202720Y-122577860D03* +X105524760Y-103398320D03* +X93401340Y-116707920D03* +X104518920Y-104061260D03* +X93508020Y-121406920D03* +X99685300Y-102095300D03* +X110061200Y-101574600D03* +X110200900Y-100622100D03* +X98580400Y-103251000D03* +X95504000Y-104203500D03* +X91503500Y-108140500D03* +X95567500Y-105283000D03* +X91821000Y-108966000D03* +X96500140Y-109118400D03* +X86357920Y-114985800D03* +X107914800Y-115332000D03* +X107889800Y-111582000D03* +X98314800Y-111907000D03* +X101289800Y-108132000D03* +X109514800Y-111107000D03* +X109439800Y-115332000D03* +X104397000Y-111544100D03* +X95697500Y-121462800D03* +X107124500Y-115125500D03* +X101790500Y-119888000D03* +X110378700Y-96428560D03* +X110134860Y-97434400D03* +X90500200Y-122605800D03* +X90474800Y-124256800D03* +X88976200Y-118872000D03* +X90449400Y-116586000D03* +X90678000Y-125095000D03* +X86918800Y-125120400D03* +D26* +X112588500Y-101523800D02* +X112588500Y-101955600D01* +X109438900Y-98374200D02* +X112588500Y-101523800D01* +D27* +X91404900Y-98374200D02* +X109438900Y-98374200D01* +D26* +X91328700Y-98298000D02* +X91404900Y-98374200D01* +D27* +X105123440Y-112872520D02* +X109399280Y-112872520D01* +X112464800Y-110132000D02* +X112464800Y-107982000D01* +X111014800Y-111582000D02* +X112464800Y-110132000D01* +X110689800Y-111582000D02* +X111014800Y-111582000D01* +X109399280Y-112872520D02* +X110689800Y-111582000D01* +D26* +X104300480Y-113695480D02* +X105123440Y-112872520D01* +X101919518Y-113695480D02* +X104300480Y-113695480D01* +X101886498Y-113662460D02* +X101919518Y-113695480D01* +X114040460Y-104110300D02* +X112340460Y-104110300D01* +X112340460Y-104110300D02* +X111340460Y-103110300D01* +X109146800Y-109258100D02* +X111623300Y-106781600D01* +X107145280Y-109258100D02* +X109146800Y-109258100D01* +X105860040Y-107972860D02* +X107145280Y-109258100D01* +X103289560Y-107972860D02* +X105860040Y-107972860D01* +X103261620Y-108000800D02* +X103289560Y-107972860D01* +D28* +X102298500Y-99822000D02* +X102108000Y-99631500D01* +X105092500Y-99822000D02* +X102298500Y-99822000D01* +X105283000Y-99631500D02* +X105092500Y-99822000D01* +D26* +X95631000Y-123698000D02* +X94488000Y-123698000D01* +X96139000Y-124206000D02* +X95631000Y-123698000D01* +X97028000Y-124206000D02* +X96139000Y-124206000D01* +X98171000Y-123063000D02* +X97028000Y-124206000D01* +X98171000Y-116713000D02* +X98171000Y-123063000D01* +X99060000Y-115887500D02* +X98171000Y-116713000D01* +X99822000Y-115887500D02* +X99060000Y-115887500D01* +D29* +X85623400Y-105841800D02* +X85623400Y-120980200D01* +X85572600Y-105791000D02* +X85623400Y-105841800D01* +D26* +X109896100Y-114046000D02* +X110670800Y-113271300D01* +X106721100Y-114046000D02* +X109896100Y-114046000D01* +X106213100Y-114554000D02* +X106721100Y-114046000D01* +X98516900Y-114554000D02* +X106213100Y-114554000D01* +X98008900Y-115062000D02* +X98516900Y-114554000D01* +D28* +X113795000Y-124307600D02* +X114049000Y-124307600D01* +X114049000Y-124307600D02* +X115687300Y-122669300D01* +X115687300Y-122669300D02* +X115687300Y-116192300D01* +X115687300Y-116192300D02* +X114645900Y-115150900D01* +D27* +X90805000Y-101757598D02* +X90805000Y-103505000D01* +X90805000Y-103505000D02* +X90170000Y-104140000D01* +X87630000Y-104140000D02* +X90170000Y-104140000D01* +X87630000Y-106680000D02* +X87630000Y-104140000D01* +X87670000Y-111760000D02* +X87670000Y-106720000D01* +X87670000Y-106720000D02* +X87630000Y-106680000D01* +X90170000Y-106680000D02* +X93342460Y-106680000D01* +X90170000Y-111760000D02* +X90170000Y-106680000D01* +X93342460Y-96520000D02* +X81280000Y-96520000D01* +X81280000Y-96520000D02* +X80010000Y-97790000D01* +D29* +X107157980Y-107767120D02* +X107462780Y-108071920D01* +X107157980Y-106324400D02* +X107157980Y-107767120D01* +X105796540Y-104962960D02* +X107157980Y-106324400D01* +X104557020Y-104962960D02* +X105796540Y-104962960D01* +X104455420Y-104861360D02* +X104557020Y-104962960D01* +X94371620Y-99969320D02* +X98918220Y-99969320D01* +X93726460Y-100614480D02* +X94371620Y-99969320D01* +X88910620Y-100614480D02* +X93726460Y-100614480D01* +X87691420Y-101833680D02* +X88910620Y-100614480D01* +X102733300Y-112242600D02* +X103342900Y-112852200D01* +X100015500Y-112242600D02* +X102733300Y-112242600D01* +X98542300Y-113715800D02* +X100015500Y-112242600D01* +X107020820Y-102816660D02* +X107020820Y-105272840D01* +X106477260Y-102273100D02* +X107020820Y-102816660D01* +X101067060Y-102273100D02* +X106477260Y-102273100D01* +X98895360Y-104444800D02* +X101067060Y-102273100D01* +X98895360Y-107759500D02* +X98895360Y-104444800D01* +X91389660Y-115265200D02* +X98895360Y-107759500D01* +X91389660Y-117764560D02* +X91389660Y-115265200D01* +X90376200Y-118778020D02* +X91389660Y-117764560D01* +X106304540Y-102971600D02* +X106304540Y-103946960D01* +X106081020Y-102748080D02* +X106304540Y-102971600D01* +X101305820Y-102748080D02* +X106081020Y-102748080D01* +X99444000Y-104609900D02* +X101305820Y-102748080D01* +X99444000Y-107950000D02* +X99444000Y-104609900D01* +X91839662Y-115554338D02* +X99444000Y-107950000D01* +X91839662Y-118259438D02* +X91839662Y-115554338D01* +X90493040Y-119606060D02* +X91839662Y-118259438D01* +X89065560Y-119606060D02* +X90493040Y-119606060D01* +X88059720Y-120611900D02* +X89065560Y-119606060D01* +X88059720Y-121983500D02* +X88059720Y-120611900D01* +X88595660Y-122519440D02* +X88059720Y-121983500D01* +X89144300Y-122519440D02* +X88595660Y-122519440D01* +X89202720Y-122577860D02* +X89144300Y-122519440D01* +X101846840Y-103398320D02* +X105524760Y-103398320D01* +X100076460Y-105168700D02* +X101846840Y-103398320D01* +X100076460Y-108280200D02* +X100076460Y-105168700D01* +X93624860Y-114731800D02* +X100076460Y-108280200D01* +X93624860Y-116484400D02* +X93624860Y-114731800D01* +X93401340Y-116707920D02* +X93624860Y-116484400D01* +X102395480Y-104061260D02* +X104518920Y-104061260D01* +X100647960Y-105808780D02* +X102395480Y-104061260D01* +X100647960Y-108597700D02* +X100647960Y-105808780D01* +X94323360Y-114922300D02* +X100647960Y-108597700D01* +X94323360Y-120591580D02* +X94323360Y-114922300D01* +X93508020Y-121406920D02* +X94323360Y-120591580D01* +D28* +X99685300Y-101831702D02* +X99685300Y-102095300D01* +X100294900Y-101222102D02* +X99685300Y-101831702D01* +X109708702Y-101222102D02* +X100294900Y-101222102D01* +X110061200Y-101574600D02* +X109708702Y-101222102D01* +X99863100Y-100622100D02* +X110200900Y-100622100D01* +X98885200Y-101600000D02* +X99863100Y-100622100D01* +X98885200Y-102946200D02* +X98885200Y-101600000D01* +X98580400Y-103251000D02* +X98885200Y-102946200D01* +D29* +X94932500Y-104775000D02* +X95504000Y-104203500D01* +X94932500Y-107823000D02* +X94932500Y-104775000D01* +X94678500Y-108077000D02* +X94932500Y-107823000D01* +X91567000Y-108077000D02* +X94678500Y-108077000D01* +X91503500Y-108140500D02* +X91567000Y-108077000D01* +X95567500Y-107886500D02* +X95567500Y-105283000D01* +X94926998Y-108527002D02* +X95567500Y-107886500D01* +X92259998Y-108527002D02* +X94926998Y-108527002D01* +X91821000Y-108966000D02* +X92259998Y-108527002D01* +X94851680Y-110766860D02* +X96500140Y-109118400D01* +X93314980Y-110766860D02* +X94851680Y-110766860D01* +X90381280Y-113700560D02* +X93314980Y-110766860D01* +X87643160Y-113700560D02* +X90381280Y-113700560D01* +X86357920Y-114985800D02* +X87643160Y-113700560D01* +X111255000Y-124307600D02* +X110865400Y-124307600D01* +X110865400Y-124307600D02* +X107914800Y-121357000D01* +X107914800Y-121357000D02* +X107914800Y-115332000D01* +X107889800Y-111582000D02* +X106964800Y-110657000D01* +X106964800Y-110657000D02* +X99514800Y-110657000D01* +X99514800Y-110657000D02* +X98447171Y-111724629D01* +X98447171Y-111724629D02* +X98447171Y-111774629D01* +X98447171Y-111774629D02* +X98314800Y-111907000D01* +X111255000Y-121767600D02* +X111255000Y-120772200D01* +X103189800Y-110032000D02* +X101289800Y-108132000D01* +X108439800Y-110032000D02* +X103189800Y-110032000D01* +X109514800Y-111107000D02* +X108439800Y-110032000D01* +X109439800Y-118957000D02* +X109439800Y-115332000D01* +X111255000Y-120772200D02* +X109439800Y-118957000D01* +X99825000Y-111544100D02* +X104397000Y-111544100D01* +X95189500Y-116179600D02* +X99825000Y-111544100D01* +X95189500Y-120954800D02* +X95189500Y-116179600D01* +X95697500Y-121462800D02* +X95189500Y-120954800D01* +D28* +X106870500Y-115379500D02* +X107124500Y-115125500D01* +X102489000Y-115379500D02* +X106870500Y-115379500D01* +X101917500Y-115951000D02* +X102489000Y-115379500D01* +X101917500Y-119761000D02* +X101917500Y-115951000D01* +X101790500Y-119888000D02* +X101917500Y-119761000D01* +D29* +X113706100Y-118224300D02* +X113706100Y-112379760D01* +X112116060Y-96428560D02* +X110378700Y-96428560D01* +X112764182Y-97076682D02* +X112116060Y-96428560D01* +X112764182Y-98204442D02* +X112764182Y-97076682D01* +X116002260Y-101442520D02* +X112764182Y-98204442D01* +X116002260Y-110083600D02* +X116002260Y-101442520D01* +X113706100Y-112379760D02* +X116002260Y-110083600D01* +X111166100Y-118224300D02* +X111166100Y-114066320D01* +X110515860Y-97053400D02* +X110134860Y-97434400D01* +X111872220Y-97053400D02* +X110515860Y-97053400D01* +X112314180Y-97495360D02* +X111872220Y-97053400D01* +X112314180Y-98668840D02* +X112314180Y-97495360D01* +X115346940Y-101701600D02* +X112314180Y-98668840D01* +X115346940Y-109885480D02* +X115346940Y-101701600D01* +X111166100Y-114066320D02* +X115346940Y-109885480D01* +X90500200Y-124231400D02* +X90500200Y-122605800D01* +X90474800Y-124256800D02* +X90500200Y-124231400D01* +X89103200Y-118745000D02* +X88976200Y-118872000D01* +X89433400Y-118745000D02* +X89103200Y-118745000D01* +X90525600Y-117652800D02* +X89433400Y-118745000D01* +X90525600Y-116662200D02* +X90525600Y-117652800D01* +X90449400Y-116586000D02* +X90525600Y-116662200D01* +X86944200Y-125095000D02* +X90678000Y-125095000D01* +X86918800Y-125120400D02* +X86944200Y-125095000D01* +M02* diff --git a/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1-B.Mask.gbr b/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1-B.Mask.gbr new file mode 100644 index 00000000..e4bb5dcc --- /dev/null +++ b/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1-B.Mask.gbr @@ -0,0 +1,85 @@ +G04 #@! TF.FileFunction,Soldermask,Bot* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 25/03/2016 9:42:23 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11C,1.300000*% +%ADD12R,1.300000X1.300000*% +%ADD13C,1.998980*% +%ADD14R,1.998980X1.998980*% +%ADD15R,1.905000X1.905000*% +%ADD16C,1.905000*% +%ADD17R,2.032000X2.032000*% +%ADD18O,2.032000X2.032000*% +%ADD19O,0.950000X1.250000*% +%ADD20O,1.550000X1.000000*% +%ADD21R,2.032000X1.727200*% +%ADD22O,2.032000X1.727200*% +%ADD23R,1.727200X1.727200*% +%ADD24O,1.727200X1.727200*% +G04 APERTURE END LIST* +D10* +D11* +X87670000Y-111760000D03* +D12* +X90170000Y-111760000D03* +D13* +X93342460Y-96520000D03* +D14* +X93342460Y-106680000D03* +D15* +X80444800Y-97917000D03* +D16* +X80444800Y-102997000D03* +D17* +X105918000Y-124460000D03* +D18* +X103378000Y-124460000D03* +D19* +X111340460Y-103110300D03* +X111340460Y-98110300D03* +D20* +X114040460Y-104110300D03* +X114040460Y-97110300D03* +D21* +X80444800Y-113157000D03* +D22* +X80444800Y-110617000D03* +X80444800Y-108077000D03* +X80444800Y-105537000D03* +D23* +X113795000Y-124307600D03* +D24* +X111255000Y-124307600D03* +X113795000Y-121767600D03* +X111255000Y-121767600D03* +D17* +X105918000Y-116840000D03* +D18* +X103378000Y-116840000D03* +D21* +X80444800Y-115697000D03* +D22* +X80444800Y-118237000D03* +X80444800Y-120777000D03* +X80444800Y-123317000D03* +D17* +X113706100Y-118224300D03* +D18* +X111166100Y-118224300D03* +D17* +X103378000Y-119380000D03* +D18* +X103378000Y-121920000D03* +D17* +X90604800Y-106807000D03* +D18* +X88064800Y-106807000D03* +D17* +X90604800Y-104267000D03* +D18* +X88064800Y-104267000D03* +M02* diff --git a/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1-Edge.Cuts.gbr b/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1-Edge.Cuts.gbr new file mode 100644 index 00000000..5f0024ea --- /dev/null +++ b/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1-Edge.Cuts.gbr @@ -0,0 +1,21 @@ +G04 #@! TF.FileFunction,Profile,NP* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 25/03/2016 9:42:23 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +G04 APERTURE END LIST* +D10* +X78791260Y-126093220D02* +X116936980Y-126093220D01* +X78783640Y-95196660D02* +X116942060Y-95196660D01* +X78786180Y-126090680D02* +X78786180Y-95201740D01* +X116939800Y-95882000D02* +X116939800Y-95207000D01* +X116939800Y-95882000D02* +X116939800Y-126107000D01* +M02* diff --git a/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1-F.Cu.gbr b/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1-F.Cu.gbr new file mode 100644 index 00000000..cb3b5d51 --- /dev/null +++ b/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1-F.Cu.gbr @@ -0,0 +1,1504 @@ +G04 #@! TF.FileFunction,Copper,L1,Top,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 25/03/2016 9:42:22 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,0.800000X0.750000*% +%ADD12R,0.750000X0.800000*% +%ADD13C,1.300000*% +%ADD14R,1.300000X1.300000*% +%ADD15C,1.998980*% +%ADD16R,1.998980X1.998980*% +%ADD17R,1.600000X1.000000*% +%ADD18R,1.600000X0.560000*% +%ADD19R,0.560000X1.600000*% +%ADD20R,1.905000X1.905000*% +%ADD21C,1.905000*% +%ADD22R,0.900000X2.500000*% +%ADD23R,2.500000X0.900000*% +%ADD24R,2.032000X2.032000*% +%ADD25O,2.032000X2.032000*% +%ADD26R,1.350000X0.400000*% +%ADD27O,0.950000X1.250000*% +%ADD28O,1.550000X1.000000*% +%ADD29R,2.032000X1.727200*% +%ADD30O,2.032000X1.727200*% +%ADD31R,1.727200X1.727200*% +%ADD32O,1.727200X1.727200*% +%ADD33R,0.600000X0.900000*% +%ADD34R,0.900000X0.500000*% +%ADD35R,0.500000X0.900000*% +%ADD36R,0.900000X0.600000*% +%ADD37R,1.500000X0.600000*% +%ADD38R,0.304800X0.508000*% +%ADD39R,1.600200X2.999740*% +%ADD40R,1.600200X2.600960*% +%ADD41C,0.600000*% +%ADD42C,0.250000*% +%ADD43C,0.635000*% +%ADD44C,1.270000*% +%ADD45C,0.400000*% +G04 APERTURE END LIST* +D10* +X108411229Y-125167714D02* +X108839800Y-125167714D01* +X108925514Y-125196286D01* +X108982657Y-125253429D01* +X109011229Y-125339143D01* +X109011229Y-125396286D01* +X108696943Y-124882000D02* +X108696943Y-124682000D01* +X109011229Y-124596286D02* +X109011229Y-124882000D01* +X108411229Y-124882000D01* +X108411229Y-124596286D01* +X109011229Y-124339143D02* +X108411229Y-124339143D01* +X109011229Y-123996286D01* +X108411229Y-123996286D01* +X108411229Y-123339143D02* +X108411229Y-122996286D01* +X109011229Y-123167715D02* +X108411229Y-123167715D01* +X109011229Y-122796286D02* +X108411229Y-122796286D01* +X109011229Y-122510572D02* +X108411229Y-122510572D01* +X109011229Y-122167715D01* +X108411229Y-122167715D01* +X108725514Y-121767715D02* +X109011229Y-121767715D01* +X108411229Y-121967715D02* +X108725514Y-121767715D01* +X108411229Y-121567715D01* +X109011229Y-121082001D02* +X109011229Y-121367715D01* +X108411229Y-121367715D01* +X108839800Y-120910572D02* +X108839800Y-120624858D01* +X109011229Y-120967715D02* +X108411229Y-120767715D01* +X109011229Y-120567715D01* +X108696943Y-120167715D02* +X108725514Y-120082001D01* +X108754086Y-120053429D01* +X108811229Y-120024858D01* +X108896943Y-120024858D01* +X108954086Y-120053429D01* +X108982657Y-120082001D01* +X109011229Y-120139143D01* +X109011229Y-120367715D01* +X108411229Y-120367715D01* +X108411229Y-120167715D01* +X108439800Y-120110572D01* +X108468371Y-120082001D01* +X108525514Y-120053429D01* +X108582657Y-120053429D01* +X108639800Y-120082001D01* +X108668371Y-120110572D01* +X108696943Y-120167715D01* +X108696943Y-120367715D01* +X108411229Y-119396286D02* +X109011229Y-119196286D01* +X108411229Y-118996286D01* +X108611229Y-118539143D02* +X109011229Y-118539143D01* +X108382657Y-118682000D02* +X108811229Y-118824857D01* +X108811229Y-118453429D01* +X108782657Y-117767714D02* +X108782657Y-117310571D01* +X109011229Y-116567714D02* +X108411229Y-116567714D01* +X108411229Y-116424857D01* +X108439800Y-116339142D01* +X108496943Y-116282000D01* +X108554086Y-116253428D01* +X108668371Y-116224857D01* +X108754086Y-116224857D01* +X108868371Y-116253428D01* +X108925514Y-116282000D01* +X108982657Y-116339142D01* +X109011229Y-116424857D01* +X109011229Y-116567714D01* +X108696943Y-115967714D02* +X108696943Y-115767714D01* +X109011229Y-115682000D02* +X109011229Y-115967714D01* +X108411229Y-115967714D01* +X108411229Y-115682000D01* +X108696943Y-114967714D02* +X108696943Y-114767714D01* +X109011229Y-114682000D02* +X109011229Y-114967714D01* +X108411229Y-114967714D01* +X108411229Y-114682000D01* +X108982657Y-114453428D02* +X109011229Y-114367714D01* +X109011229Y-114224857D01* +X108982657Y-114167714D01* +X108954086Y-114139143D01* +X108896943Y-114110571D01* +X108839800Y-114110571D01* +X108782657Y-114139143D01* +X108754086Y-114167714D01* +X108725514Y-114224857D01* +X108696943Y-114339143D01* +X108668371Y-114396285D01* +X108639800Y-114424857D01* +X108582657Y-114453428D01* +X108525514Y-114453428D01* +X108468371Y-114424857D01* +X108439800Y-114396285D01* +X108411229Y-114339143D01* +X108411229Y-114196285D01* +X108439800Y-114110571D01* +X109011229Y-113853428D02* +X108411229Y-113853428D01* +X108411229Y-113624856D01* +X108439800Y-113567714D01* +X108468371Y-113539142D01* +X108525514Y-113510571D01* +X108611229Y-113510571D01* +X108668371Y-113539142D01* +X108696943Y-113567714D01* +X108725514Y-113624856D01* +X108725514Y-113853428D01* +X108411229Y-113139142D02* +X108411229Y-113024856D01* +X108439800Y-112967714D01* +X108496943Y-112910571D01* +X108611229Y-112881999D01* +X108811229Y-112881999D01* +X108925514Y-112910571D01* +X108982657Y-112967714D01* +X109011229Y-113024856D01* +X109011229Y-113139142D01* +X108982657Y-113196285D01* +X108925514Y-113253428D01* +X108811229Y-113281999D01* +X108611229Y-113281999D01* +X108496943Y-113253428D01* +X108439800Y-113196285D01* +X108411229Y-113139142D01* +X108954086Y-112282000D02* +X108982657Y-112310571D01* +X109011229Y-112396285D01* +X109011229Y-112453428D01* +X108982657Y-112539143D01* +X108925514Y-112596285D01* +X108868371Y-112624857D01* +X108754086Y-112653428D01* +X108668371Y-112653428D01* +X108554086Y-112624857D01* +X108496943Y-112596285D01* +X108439800Y-112539143D01* +X108411229Y-112453428D01* +X108411229Y-112396285D01* +X108439800Y-112310571D01* +X108468371Y-112282000D01* +X108268371Y-112539143D02* +X108182657Y-112424857D01* +X108268371Y-112310571D01* +X108411229Y-111853428D02* +X108839800Y-111853428D01* +X108925514Y-111882000D01* +X108982657Y-111939143D01* +X109011229Y-112024857D01* +X109011229Y-112082000D01* +X108411229Y-111453428D02* +X108411229Y-111339142D01* +X108439800Y-111282000D01* +X108496943Y-111224857D01* +X108611229Y-111196285D01* +X108811229Y-111196285D01* +X108925514Y-111224857D01* +X108982657Y-111282000D01* +X109011229Y-111339142D01* +X109011229Y-111453428D01* +X108982657Y-111510571D01* +X108925514Y-111567714D01* +X108811229Y-111596285D01* +X108611229Y-111596285D01* +X108496943Y-111567714D01* +X108439800Y-111510571D01* +X108411229Y-111453428D01* +D11* +X106795000Y-122555000D03* +X105295000Y-122555000D03* +X106795000Y-118745000D03* +X105295000Y-118745000D03* +D12* +X114887200Y-107633200D03* +X114887200Y-106133200D03* +D11* +X114213400Y-109029500D03* +X115713400Y-109029500D03* +D12* +X104521000Y-114351500D03* +X104521000Y-112851500D03* +D11* +X95238000Y-115316000D03* +X93738000Y-115316000D03* +X102604000Y-111760000D03* +X101104000Y-111760000D03* +D12* +X86360000Y-98945000D03* +X86360000Y-100445000D03* +X95059500Y-107557000D03* +X95059500Y-106057000D03* +X82423000Y-118098000D03* +X82423000Y-116598000D03* +X82550000Y-124956000D03* +X82550000Y-123456000D03* +D13* +X87670000Y-111760000D03* +D14* +X90170000Y-111760000D03* +D12* +X92456000Y-113804000D03* +X92456000Y-115304000D03* +D15* +X93342460Y-96520000D03* +D16* +X93342460Y-106680000D03* +D17* +X93345000Y-103100000D03* +X93345000Y-100100000D03* +D18* +X108720000Y-108140000D03* +X108720000Y-107340000D03* +X108720000Y-106540000D03* +X108720000Y-105740000D03* +X108720000Y-104940000D03* +X108720000Y-104140000D03* +X108720000Y-103340000D03* +X108720000Y-102540000D03* +X108720000Y-101740000D03* +X108720000Y-100940000D03* +X108720000Y-100140000D03* +D19* +X106870000Y-98290000D03* +X106070000Y-98290000D03* +X105270000Y-98290000D03* +X104470000Y-98290000D03* +X103670000Y-98290000D03* +X102870000Y-98290000D03* +X102070000Y-98290000D03* +X101270000Y-98290000D03* +X100470000Y-98290000D03* +X99670000Y-98290000D03* +X98870000Y-98290000D03* +D18* +X97020000Y-100140000D03* +X97020000Y-100940000D03* +X97020000Y-101740000D03* +X97020000Y-102540000D03* +X97020000Y-103340000D03* +X97020000Y-104140000D03* +X97020000Y-104940000D03* +X97020000Y-105740000D03* +X97020000Y-106540000D03* +X97020000Y-107340000D03* +X97020000Y-108140000D03* +D19* +X98870000Y-109990000D03* +X99670000Y-109990000D03* +X100470000Y-109990000D03* +X101270000Y-109990000D03* +X102070000Y-109990000D03* +X102870000Y-109990000D03* +X103670000Y-109990000D03* +X104470000Y-109990000D03* +X105270000Y-109990000D03* +X106070000Y-109990000D03* +X106870000Y-109990000D03* +D20* +X80444800Y-97917000D03* +D21* +X80444800Y-102997000D03* +D22* +X96721000Y-112649000D03* +X99621000Y-112649000D03* +D23* +X93980000Y-112321000D03* +X93980000Y-109421000D03* +D24* +X105918000Y-124460000D03* +D25* +X103378000Y-124460000D03* +D26* +X111340460Y-101910300D03* +X111340460Y-101260300D03* +X111340460Y-100610300D03* +X111340460Y-99960300D03* +X111340460Y-99310300D03* +D27* +X111340460Y-103110300D03* +X111340460Y-98110300D03* +D28* +X114040460Y-104110300D03* +X114040460Y-97110300D03* +D29* +X80444800Y-113157000D03* +D30* +X80444800Y-110617000D03* +X80444800Y-108077000D03* +X80444800Y-105537000D03* +D31* +X113795000Y-124307600D03* +D32* +X111255000Y-124307600D03* +X113795000Y-121767600D03* +X111255000Y-121767600D03* +D24* +X105918000Y-116840000D03* +D25* +X103378000Y-116840000D03* +D29* +X80444800Y-115697000D03* +D30* +X80444800Y-118237000D03* +X80444800Y-120777000D03* +X80444800Y-123317000D03* +D24* +X113706100Y-118224300D03* +D25* +X111166100Y-118224300D03* +D24* +X103378000Y-119380000D03* +D25* +X103378000Y-121920000D03* +D33* +X96139000Y-96136000D03* +X97089000Y-98936000D03* +X95189000Y-98936000D03* +D34* +X99060000Y-122670000D03* +X99060000Y-121170000D03* +X99060000Y-118566500D03* +X99060000Y-120066500D03* +X100647500Y-122670000D03* +X100647500Y-121170000D03* +X100647500Y-120066500D03* +X100647500Y-118566500D03* +D35* +X105676000Y-114300000D03* +X107176000Y-114300000D03* +X105676000Y-112903000D03* +X107176000Y-112903000D03* +D34* +X82550000Y-105930000D03* +X82550000Y-107430000D03* +X82550000Y-108470000D03* +X82550000Y-109970000D03* +X82550000Y-111010000D03* +X82550000Y-112510000D03* +X82550000Y-113550000D03* +X82550000Y-115050000D03* +X84328000Y-107430000D03* +X84328000Y-105930000D03* +X84328000Y-109970000D03* +X84328000Y-108470000D03* +X84328000Y-112510000D03* +X84328000Y-111010000D03* +X84328000Y-115050000D03* +X84328000Y-113550000D03* +X89395300Y-123570300D03* +X89395300Y-125070300D03* +X87871300Y-123570300D03* +X87871300Y-125070300D03* +X89281000Y-117971000D03* +X89281000Y-116471000D03* +X87630000Y-117971000D03* +X87630000Y-116471000D03* +D35* +X86372000Y-119634000D03* +X87872000Y-119634000D03* +X86372000Y-121920000D03* +X87872000Y-121920000D03* +X98818000Y-124079000D03* +X100318000Y-124079000D03* +D34* +X84455000Y-117971000D03* +X84455000Y-116471000D03* +X84709000Y-123583000D03* +X84709000Y-125083000D03* +D35* +X83324000Y-119634000D03* +X84824000Y-119634000D03* +X83324000Y-121920000D03* +X84824000Y-121920000D03* +X85332000Y-102946200D03* +X83832000Y-102946200D03* +X83832000Y-104546400D03* +X85332000Y-104546400D03* +X100318000Y-116840000D03* +X98818000Y-116840000D03* +D34* +X85979000Y-116471000D03* +X85979000Y-117971000D03* +X86233000Y-123583000D03* +X86233000Y-125083000D03* +D36* +X113464800Y-106807000D03* +X110664800Y-107757000D03* +X110664800Y-105857000D03* +D37* +X97213400Y-124485400D03* +X97213400Y-123215400D03* +X97213400Y-121945400D03* +X97213400Y-120675400D03* +X97213400Y-119405400D03* +X97213400Y-118135400D03* +X97213400Y-116865400D03* +X91813400Y-116865400D03* +X91813400Y-118135400D03* +X91813400Y-119405400D03* +X91813400Y-120675400D03* +X91813400Y-121945400D03* +X91813400Y-123215400D03* +X91813400Y-124485400D03* +D38* +X90195400Y-119710200D03* +X88925400Y-119710200D03* +X90195400Y-121742200D03* +X89560400Y-119710200D03* +X88925400Y-121742200D03* +X89560400Y-121742200D03* +X108140500Y-98488500D03* +X109410500Y-98488500D03* +X108140500Y-96456500D03* +X108775500Y-98488500D03* +X109410500Y-96456500D03* +X108775500Y-96456500D03* +D39* +X112448800Y-114696240D03* +X112448800Y-110296960D03* +D40* +X89535000Y-97259140D03* +X89535000Y-100860860D03* +D24* +X90604800Y-106807000D03* +D25* +X88064800Y-106807000D03* +D24* +X90604800Y-104267000D03* +D25* +X88064800Y-104267000D03* +D41* +X112588500Y-101955600D03* +X91328700Y-98298000D03* +X112464800Y-107982000D03* +X105123440Y-112872520D03* +X101886498Y-113662460D03* +X111623300Y-106781600D03* +X103261620Y-108000800D03* +X102108000Y-99631500D03* +X105283000Y-99631500D03* +X94488000Y-123698000D03* +X99822000Y-115887500D03* +X85623400Y-120980200D03* +X85572600Y-105791000D03* +X110670800Y-113271300D03* +X98008900Y-115062000D03* +X114645900Y-115150900D03* +X90805000Y-101757598D03* +X107462780Y-108071920D03* +X104455420Y-104861360D03* +X98918220Y-99969320D03* +X87691420Y-101833680D03* +X103342900Y-112852200D03* +X98542300Y-113715800D03* +X107020820Y-105272840D03* +X90376200Y-118778020D03* +X106304540Y-103946960D03* +X89202720Y-122577860D03* +X105524760Y-103398320D03* +X93401340Y-116707920D03* +X104518920Y-104061260D03* +X93508020Y-121406920D03* +X99685300Y-102095300D03* +X110061200Y-101574600D03* +X110200900Y-100622100D03* +X98580400Y-103251000D03* +X95504000Y-104203500D03* +X91503500Y-108140500D03* +X95567500Y-105283000D03* +X91821000Y-108966000D03* +X96500140Y-109118400D03* +X86357920Y-114985800D03* +X107914800Y-115332000D03* +X107889800Y-111582000D03* +X98314800Y-111907000D03* +X101289800Y-108132000D03* +X109514800Y-111107000D03* +X109439800Y-115332000D03* +X104397000Y-111544100D03* +X95697500Y-121462800D03* +X107124500Y-115125500D03* +X101790500Y-119888000D03* +X110378700Y-96428560D03* +X110134860Y-97434400D03* +X90500200Y-122605800D03* +X90474800Y-124256800D03* +X88976200Y-118872000D03* +X90449400Y-116586000D03* +X90678000Y-125095000D03* +X86918800Y-125120400D03* +D42* +X99060000Y-121170000D02* +X99060000Y-121412000D01* +X99060000Y-121412000D02* +X99568000Y-121920000D01* +X99568000Y-121920000D02* +X101473000Y-121920000D01* +X101473000Y-121920000D02* +X101854000Y-122301000D01* +X101854000Y-122301000D02* +X101854000Y-122936000D01* +X101854000Y-122936000D02* +X103378000Y-124460000D01* +D43* +X106795000Y-122555000D02* +X106795000Y-123583000D01* +X105918000Y-124460000D02* +X103378000Y-124460000D01* +X106795000Y-123583000D02* +X105918000Y-124460000D01* +X104660000Y-121920000D02* +X105295000Y-122555000D01* +X103378000Y-121920000D02* +X104660000Y-121920000D01* +D42* +X99060000Y-120066500D02* +X99135500Y-120066500D01* +X99135500Y-120066500D02* +X99822000Y-119380000D01* +X99822000Y-119380000D02* +X101346000Y-119380000D01* +X101346000Y-119380000D02* +X101981000Y-118745000D01* +X101981000Y-118745000D02* +X101981000Y-117221000D01* +X101981000Y-117221000D02* +X102362000Y-116840000D01* +X102362000Y-116840000D02* +X103378000Y-116840000D01* +D43* +X106795000Y-118745000D02* +X106795000Y-117717000D01* +X106795000Y-117717000D02* +X105918000Y-116840000D01* +X105918000Y-116840000D02* +X103378000Y-116840000D01* +X104660000Y-119380000D02* +X105295000Y-118745000D01* +X103378000Y-119380000D02* +X104660000Y-119380000D01* +X89535000Y-97259140D02* +X90289840Y-97259140D01* +D44* +X90289840Y-97259140D02* +X91328700Y-98298000D01* +D43* +X112543200Y-101910300D02* +X112530500Y-101910300D01* +X112588500Y-101955600D02* +X112543200Y-101910300D01* +D45* +X113464800Y-106807000D02* +X113464800Y-107315000D01* +X113783000Y-107633200D02* +X114887200Y-107633200D01* +X113464800Y-107315000D02* +X113783000Y-107633200D01* +X111340460Y-101910300D02* +X112530500Y-101910300D01* +X113464800Y-105765600D02* +X113464800Y-106807000D01* +X112677400Y-104978200D02* +X113464800Y-105765600D01* +X112677400Y-102057200D02* +X112677400Y-104978200D01* +X112530500Y-101910300D02* +X112677400Y-102057200D01* +D44* +X86360000Y-98945000D02* +X87849140Y-98945000D01* +X87849140Y-98945000D02* +X89535000Y-97259140D01* +X80391000Y-102870000D02* +X84316000Y-98945000D01* +X84316000Y-98945000D02* +X86360000Y-98945000D01* +X112448800Y-107982000D02* +X112448800Y-110296960D01* +X112464800Y-107982000D02* +X112448800Y-107982000D01* +D43* +X99822000Y-115887500D02* +X99822000Y-115547600D01* +X101707140Y-113662460D02* +X101886498Y-113662460D01* +X99822000Y-115547600D02* +X101707140Y-113662460D01* +X105123440Y-112872520D02* +X105123440Y-112851500D01* +X105123440Y-112851500D02* +X105123440Y-112872520D01* +X105123440Y-112872520D02* +X105123440Y-112851500D01* +X114040460Y-104110300D02* +X114040460Y-97110300D01* +X111340460Y-98110300D02* +X113040460Y-98110300D01* +X113040460Y-98110300D02* +X114040460Y-97110300D01* +X97020000Y-105740000D02* +X100182940Y-105740000D01* +X102443740Y-108000800D02* +X102507240Y-108000800D01* +X100182940Y-105740000D02* +X102443740Y-108000800D01* +X102070000Y-109990000D02* +X102070000Y-108438040D01* +X102070000Y-108438040D02* +X102507240Y-108000800D01* +X102507240Y-108000800D02* +X103261620Y-108000800D01* +X111623300Y-106781600D02* +X111606350Y-106798550D01* +X111606350Y-106798550D02* +X111623300Y-106781600D01* +X111623300Y-106781600D02* +X111623300Y-106815500D01* +D45* +X113795000Y-121767600D02* +X113795000Y-121742200D01* +X113795000Y-121742200D02* +X115713400Y-119823800D01* +X115713400Y-119823800D02* +X115713400Y-109029500D01* +D43* +X114887200Y-106133200D02* +X115458000Y-106133200D01* +X116119100Y-108623800D02* +X115713400Y-109029500D01* +X116119100Y-106794300D02* +X116119100Y-108623800D01* +X115458000Y-106133200D02* +X116119100Y-106794300D01* +X112448800Y-110296960D02* +X112448800Y-107641000D01* +X112448800Y-107641000D02* +X111623300Y-106815500D01* +X111623300Y-106815500D02* +X110664800Y-105857000D01* +D44* +X110664800Y-105857000D02* +X110664800Y-103785960D01* +X110664800Y-103785960D02* +X111340460Y-103110300D01* +D45* +X111340460Y-99310300D02* +X111340460Y-98110300D01* +X114887200Y-106133200D02* +X114887200Y-104957040D01* +X114887200Y-104957040D02* +X114040460Y-104110300D01* +D42* +X95059500Y-106057000D02* +X95695200Y-106057000D01* +X96012200Y-105740000D02* +X97020000Y-105740000D01* +X95695200Y-106057000D02* +X96012200Y-105740000D01* +D45* +X105270000Y-98290000D02* +X105270000Y-99618500D01* +X102070000Y-99593500D02* +X102070000Y-98290000D01* +X102108000Y-99631500D02* +X102070000Y-99593500D01* +X105270000Y-99618500D02* +X105283000Y-99631500D01* +D43* +X93738000Y-120003000D02* +X93801500Y-120003000D01* +X93738000Y-115836000D02* +X93738000Y-115316000D01* +X94402998Y-116500998D02* +X93738000Y-115836000D01* +X94402998Y-119401502D02* +X94402998Y-116500998D01* +X93801500Y-120003000D02* +X94402998Y-119401502D01* +D42* +X108140500Y-98488500D02* +X107950000Y-98488500D01* +X105270000Y-97295000D02* +X105270000Y-98290000D01* +X105600500Y-96964500D02* +X105270000Y-97295000D01* +X107442000Y-96964500D02* +X105600500Y-96964500D01* +X107632500Y-97155000D02* +X107442000Y-96964500D01* +X107632500Y-98171000D02* +X107632500Y-97155000D01* +X107950000Y-98488500D02* +X107632500Y-98171000D01* +X108140500Y-98488500D02* +X108140500Y-98107500D01* +X109410500Y-97028000D02* +X109410500Y-96456500D01* +X109156500Y-97282000D02* +X109410500Y-97028000D01* +X108966000Y-97282000D02* +X109156500Y-97282000D01* +X108140500Y-98107500D02* +X108966000Y-97282000D01* +X101104000Y-111760000D02* +X101219000Y-111760000D01* +X101219000Y-111760000D02* +X102070000Y-110909000D01* +X102070000Y-110909000D02* +X102070000Y-109990000D01* +X95059500Y-106057000D02* +X95059500Y-105918000D01* +X95059500Y-105918000D02* +X94742000Y-105600500D01* +D43* +X93789500Y-104711500D02* +X94107000Y-104711500D01* +X94107000Y-104711500D02* +X94678500Y-105283000D01* +D45* +X93853000Y-104711500D02* +X93789500Y-104711500D01* +X94107000Y-104711500D02* +X94678500Y-105283000D01* +D44* +X93345000Y-103100000D02* +X93345000Y-104203500D01* +X93345000Y-104203500D02* +X93853000Y-104711500D01* +D42* +X95059500Y-106057000D02* +X95059500Y-105664000D01* +X95059500Y-105664000D02* +X94678500Y-105283000D01* +X94678500Y-105283000D02* +X94107000Y-104711500D01* +X93853000Y-104711500D02* +X93345000Y-104203500D01* +D43* +X104521000Y-112851500D02* +X105123440Y-112851500D01* +X105123440Y-112851500D02* +X105624500Y-112851500D01* +X105624500Y-112851500D02* +X105676000Y-112903000D01* +X100318000Y-116840000D02* +X100318000Y-116193000D01* +X94488000Y-123698000D02* +X94361000Y-123698000D01* +X100318000Y-116193000D02* +X99822000Y-115887500D01* +X100318000Y-124079000D02* +X100318000Y-124726000D01* +X94361000Y-120626000D02* +X93738000Y-120003000D01* +X94361000Y-123698000D02* +X94361000Y-120626000D01* +X96012000Y-125349000D02* +X94361000Y-123698000D01* +X99695000Y-125349000D02* +X96012000Y-125349000D01* +X100318000Y-124726000D02* +X99695000Y-125349000D01* +X91813400Y-120675400D02* +X93065600Y-120675400D01* +X93065600Y-120675400D02* +X93738000Y-120003000D01* +D42* +X85332000Y-104546400D02* +X85332000Y-105550400D01* +X85623400Y-120980200D02* +X85623400Y-120954800D01* +X85332000Y-105550400D02* +X85572600Y-105791000D01* +X91813400Y-120675400D02* +X89738200Y-120675400D01* +X89712800Y-120700800D02* +X89712800Y-120726200D01* +X89738200Y-120675400D02* +X89712800Y-120700800D01* +X88366600Y-120954800D02* +X89484200Y-120954800D01* +X90195400Y-120243600D02* +X90195400Y-119710200D01* +X89484200Y-120954800D02* +X89712800Y-120726200D01* +X89712800Y-120726200D02* +X90195400Y-120243600D01* +X88925400Y-121742200D02* +X88925400Y-121513600D01* +X88925400Y-121513600D02* +X88366600Y-120954800D01* +X88366600Y-120954800D02* +X85623400Y-120954800D01* +X86233000Y-123367800D02* +X85623400Y-122758200D01* +X85979000Y-118338600D02* +X85979000Y-117971000D01* +X85623400Y-118694200D02* +X85979000Y-118338600D01* +X85623400Y-122758200D02* +X85623400Y-120954800D01* +X85623400Y-120954800D02* +X85623400Y-118694200D01* +X86233000Y-123583000D02* +X86233000Y-123367800D01* +D43* +X96721000Y-112649000D02* +X96721000Y-114231300D01* +X110664800Y-113265300D02* +X110664800Y-112912240D01* +X110670800Y-113271300D02* +X110664800Y-113265300D01* +X97551700Y-115062000D02* +X98008900Y-115062000D01* +X96721000Y-114231300D02* +X97551700Y-115062000D01* +D45* +X114645900Y-115150900D02* +X113364470Y-113869470D01* +X113364470Y-113869470D02* +X113364470Y-113780570D01* +D44* +X114213400Y-109029500D02* +X114213400Y-112931640D01* +X114213400Y-112931640D02* +X113364470Y-113780570D01* +X113364470Y-113780570D02* +X112448800Y-114696240D01* +X110664800Y-107757000D02* +X110664800Y-112912240D01* +X110664800Y-112912240D02* +X112448800Y-114696240D01* +D42* +X96721000Y-112649000D02* +X96721000Y-110797000D01* +X98031000Y-106540000D02* +X97020000Y-106540000D01* +X98171000Y-106680000D02* +X98031000Y-106540000D01* +X98171000Y-109347000D02* +X98171000Y-106680000D01* +X96721000Y-110797000D02* +X98171000Y-109347000D01* +X97020000Y-106540000D02* +X95961500Y-106540000D01* +X95961500Y-106540000D02* +X95059500Y-107442000D01* +X95059500Y-107442000D02* +X95059500Y-107557000D01* +D45* +X99621000Y-112649000D02* +X102604000Y-112649000D01* +X102604000Y-112649000D02* +X102362000Y-112649000D01* +X104521000Y-114351500D02* +X103239000Y-114351500D01* +X102604000Y-113716500D02* +X102604000Y-111760000D01* +X103239000Y-114351500D02* +X102604000Y-113716500D01* +D42* +X102604000Y-111760000D02* +X102604000Y-111454500D01* +X102604000Y-111454500D02* +X102870000Y-111188500D01* +X102870000Y-111188500D02* +X102870000Y-109990000D01* +X102362000Y-112649000D02* +X102604000Y-112407000D01* +X102604000Y-112407000D02* +X102604000Y-111760000D01* +D43* +X104521000Y-114351500D02* +X105624500Y-114351500D01* +X105624500Y-114351500D02* +X105676000Y-114300000D01* +X97213400Y-120675400D02* +X95973900Y-120675400D01* +X95238000Y-119939500D02* +X95238000Y-115316000D01* +X95973900Y-120675400D02* +X95238000Y-119939500D01* +D44* +X93980000Y-112321000D02* +X93980000Y-112649000D01* +X93980000Y-112649000D02* +X95238000Y-113907000D01* +X95238000Y-113907000D02* +X95238000Y-115316000D01* +D43* +X93345000Y-100100000D02* +X93345000Y-98933000D01* +X97089000Y-98359000D02* +X97089000Y-98936000D01* +X96520000Y-97790000D02* +X97089000Y-98359000D01* +X94488000Y-97790000D02* +X96520000Y-97790000D01* +X93345000Y-98933000D02* +X94488000Y-97790000D01* +D44* +X93345000Y-100100000D02* +X90295860Y-100100000D01* +X90295860Y-100100000D02* +X89535000Y-100860860D01* +X86360000Y-100445000D02* +X89119140Y-100445000D01* +X89119140Y-100445000D02* +X89535000Y-100860860D01* +D43* +X92456000Y-115304000D02* +X91428000Y-115304000D01* +X90424000Y-115062000D02* +X87670000Y-112308000D01* +X91186000Y-115062000D02* +X90424000Y-115062000D01* +X91428000Y-115304000D02* +X91186000Y-115062000D01* +X87670000Y-112308000D02* +X87670000Y-111760000D01* +D44* +X89535000Y-100860860D02* +X89908262Y-100860860D01* +X89908262Y-100860860D02* +X90805000Y-101757598D01* +D42* +X90170000Y-106172000D02* +X91592400Y-104749600D01* +X91592400Y-104749600D02* +X91592400Y-103454200D01* +X91592400Y-103454200D02* +X90855800Y-102717600D01* +X90855800Y-102717600D02* +X85699600Y-102717600D01* +X82423000Y-118098000D02* +X80583800Y-118098000D01* +X80583800Y-118098000D02* +X80444800Y-118237000D01* +X82423000Y-116598000D02* +X81345800Y-116598000D01* +X81345800Y-116598000D02* +X80444800Y-115697000D01* +X83286600Y-117041800D02* +X83286600Y-119596600D01* +X82842800Y-116598000D02* +X83286600Y-117041800D01* +X82423000Y-116598000D02* +X82842800Y-116598000D01* +X83286600Y-119596600D02* +X83324000Y-119634000D01* +X82181000Y-116840000D02* +X82423000Y-116598000D01* +X82550000Y-124956000D02* +X82083800Y-124956000D01* +X82083800Y-124956000D02* +X80444800Y-123317000D01* +X83324000Y-121920000D02* +X81587800Y-121920000D01* +X81587800Y-121920000D02* +X80444800Y-120777000D01* +X83324000Y-121920000D02* +X83324000Y-122682000D01* +X83324000Y-122682000D02* +X82550000Y-123456000D01* +X90170000Y-106680000D02* +X90170000Y-106172000D01* +X85699600Y-102717600D02* +X85471000Y-102946200D01* +X85471000Y-102946200D02* +X85332000Y-102946200D01* +D44* +X93980000Y-109421000D02* +X93980000Y-109220000D01* +X93980000Y-109220000D02* +X93342460Y-108582460D01* +X93342460Y-108582460D02* +X93342460Y-106680000D01* +X92456000Y-113804000D02* +X90944000Y-113804000D01* +X90170000Y-113030000D02* +X90170000Y-111760000D01* +X90944000Y-113804000D02* +X90170000Y-113030000D01* +D43* +X96139000Y-96136000D02* +X93726460Y-96136000D01* +X93726460Y-96136000D02* +X93342460Y-96520000D01* +X83832000Y-104546400D02* +X83832000Y-102946200D01* +D42* +X83832000Y-102946200D02* +X83832000Y-102482540D01* +X107530860Y-108140000D02* +X108720000Y-108140000D01* +X107462780Y-108071920D02* +X107530860Y-108140000D01* +X103810260Y-104861360D02* +X104455420Y-104861360D01* +X98918220Y-99969320D02* +X103810260Y-104861360D01* +X84480860Y-101833680D02* +X87691420Y-101833680D01* +X83832000Y-102482540D02* +X84480860Y-101833680D01* +X98818000Y-116840000D02* +X98818000Y-114740800D01* +X103673100Y-112522000D02* +X103673100Y-109993100D01* +X103342900Y-112852200D02* +X103673100Y-112522000D01* +X98288300Y-113969800D02* +X98542300Y-113715800D01* +X98288300Y-114211100D02* +X98288300Y-113969800D01* +X98818000Y-114740800D02* +X98288300Y-114211100D01* +X103673100Y-109993100D02* +X103670000Y-109990000D01* +D45* +X103670000Y-109990000D02* +X103670000Y-108610500D01* +X103670000Y-108610500D02* +X104940500Y-107340000D01* +X104940500Y-107340000D02* +X108720000Y-107340000D01* +X103695500Y-110015500D02* +X103670000Y-109990000D01* +X98818000Y-116840000D02* +X97238800Y-116840000D01* +X97238800Y-116840000D02* +X97213400Y-116865400D01* +D43* +X97213400Y-118135400D02* +X97213400Y-116865400D01* +D42* +X89560400Y-119710200D02* +X89560400Y-119311880D01* +X107422140Y-105674160D02* +X108654160Y-105674160D01* +X107020820Y-105272840D02* +X107422140Y-105674160D01* +X90094260Y-118778020D02* +X90376200Y-118778020D01* +X89560400Y-119311880D02* +X90094260Y-118778020D01* +X108654160Y-105674160D02* +X108720000Y-105740000D01* +X89560400Y-121742200D02* +X89560400Y-122220180D01* +X107645660Y-104902000D02* +X108682000Y-104902000D01* +X107361180Y-104617520D02* +X107645660Y-104902000D01* +X106975100Y-104617520D02* +X107361180Y-104617520D01* +X106304540Y-103946960D02* +X106975100Y-104617520D01* +X89560400Y-122220180D02* +X89202720Y-122577860D01* +X108682000Y-104902000D02* +X108720000Y-104940000D01* +X91813400Y-119405400D02* +X92613940Y-119405400D01* +X107432300Y-104140000D02* +X108720000Y-104140000D01* +X107307840Y-104015540D02* +X107432300Y-104140000D01* +X107307840Y-103489760D02* +X107307840Y-104015540D01* +X106952240Y-103134160D02* +X107307840Y-103489760D01* +X105788920Y-103134160D02* +X106952240Y-103134160D01* +X105524760Y-103398320D02* +X105788920Y-103134160D01* +X93401340Y-118618000D02* +X93401340Y-116707920D01* +X92613940Y-119405400D02* +X93401340Y-118618000D01* +D45* +X91813400Y-119405400D02* +X92557600Y-119405400D01* +D42* +X91813400Y-121945400D02* +X92969540Y-121945400D01* +X107742180Y-103220520D02* +X108600520Y-103220520D01* +X107122420Y-102600760D02* +X107742180Y-103220520D01* +X105204720Y-102600760D02* +X107122420Y-102600760D01* +X104882140Y-102923340D02* +X105204720Y-102600760D01* +X104882140Y-103698040D02* +X104882140Y-102923340D01* +X104518920Y-104061260D02* +X104882140Y-103698040D01* +X92969540Y-121945400D02* +X93508020Y-121406920D01* +X108600520Y-103220520D02* +X108720000Y-103340000D01* +D45* +X108694500Y-103314500D02* +X108720000Y-103340000D01* +X104470000Y-98290000D02* +X104470000Y-99898000D01* +X106425500Y-100140000D02* +X108720000Y-100140000D01* +X106172000Y-100393500D02* +X106425500Y-100140000D01* +X104965500Y-100393500D02* +X106172000Y-100393500D01* +X104470000Y-99898000D02* +X104965500Y-100393500D01* +D42* +X109410500Y-98488500D02* +X109410500Y-98806000D01* +X107767000Y-99187000D02* +X106870000Y-98290000D01* +X109029500Y-99187000D02* +X107767000Y-99187000D01* +X109410500Y-98806000D02* +X109029500Y-99187000D01* +X108140500Y-96456500D02* +X103568500Y-96456500D01* +X102870000Y-97155000D02* +X102870000Y-98290000D01* +X103568500Y-96456500D02* +X102870000Y-97155000D01* +D43* +X95189000Y-98936000D02* +X95189000Y-100142000D01* +X95987000Y-100940000D02* +X97020000Y-100940000D01* +X95189000Y-100142000D02* +X95987000Y-100940000D01* +D45* +X111340460Y-101260300D02* +X110540600Y-101260300D01* +X99240600Y-102540000D02* +X97020000Y-102540000D01* +X99685300Y-102095300D02* +X99240600Y-102540000D01* +X110226300Y-101574600D02* +X110061200Y-101574600D01* +X110540600Y-101260300D02* +X110226300Y-101574600D01* +X110212700Y-100610300D02* +X111340460Y-100610300D01* +X110200900Y-100622100D02* +X110212700Y-100610300D01* +X98491400Y-103340000D02* +X98580400Y-103251000D01* +X97020000Y-103340000D02* +X98491400Y-103340000D01* +D42* +X84328000Y-107430000D02* +X85776500Y-107430000D01* +X95567500Y-104140000D02* +X97020000Y-104140000D01* +X95504000Y-104203500D02* +X95567500Y-104140000D01* +X86487000Y-108140500D02* +X91503500Y-108140500D01* +X85776500Y-107430000D02* +X86487000Y-108140500D01* +X84328000Y-109970000D02* +X90817000Y-109970000D01* +X95910500Y-104940000D02* +X97020000Y-104940000D01* +X95567500Y-105283000D02* +X95910500Y-104940000D01* +X90817000Y-109970000D02* +X91821000Y-108966000D01* +X84328000Y-112510000D02* +X84328000Y-112452002D01* +X84328000Y-112452002D02* +X86226502Y-110553500D01* +X86226502Y-110553500D02* +X95250000Y-110553500D01* +X95250000Y-110553500D02* +X95758000Y-110045500D01* +X95758000Y-110045500D02* +X95758000Y-107505500D01* +X95758000Y-107505500D02* +X95923500Y-107340000D01* +X95923500Y-107340000D02* +X97020000Y-107340000D01* +X84328000Y-115050000D02* +X86293720Y-115050000D01* +X97020000Y-108598540D02* +X97020000Y-108140000D01* +X96500140Y-109118400D02* +X97020000Y-108598540D01* +X86293720Y-115050000D02* +X86357920Y-114985800D01* +X107914800Y-115332000D02* +X107889800Y-115307000D01* +X107889800Y-115307000D02* +X107889800Y-111582000D01* +X98314800Y-111907000D02* +X97989800Y-111582000D01* +X97989800Y-111582000D02* +X97989800Y-110707000D01* +X97989800Y-110707000D02* +X98389800Y-110307000D01* +X98389800Y-110307000D02* +X98553000Y-110307000D01* +X98553000Y-110307000D02* +X98870000Y-109990000D01* +X99670000Y-108401800D02* +X99670000Y-109990000D01* +X99914800Y-108157000D02* +X99670000Y-108401800D01* +X101264800Y-108157000D02* +X99914800Y-108157000D01* +X101289800Y-108132000D02* +X101264800Y-108157000D01* +X109514800Y-115257000D02* +X109514800Y-111107000D01* +X109439800Y-115332000D02* +X109514800Y-115257000D01* +X97213400Y-123215400D02* +X96281700Y-123215400D01* +X105270000Y-110899700D02* +X105270000Y-109990000D01* +X104841500Y-111328200D02* +X105270000Y-110899700D01* +X104612900Y-111328200D02* +X104841500Y-111328200D01* +X104397000Y-111544100D02* +X104612900Y-111328200D01* +X95697500Y-122631200D02* +X95697500Y-121462800D01* +X96281700Y-123215400D02* +X95697500Y-122631200D01* +D45* +X105283000Y-110003000D02* +X105270000Y-109990000D01* +X96997500Y-122999500D02* +X97213400Y-123215400D01* +D43* +X97213400Y-124485400D02* +X98411600Y-124485400D01* +X98411600Y-124485400D02* +X98818000Y-124079000D01* +X97213400Y-123215400D02* +X97213400Y-124485400D01* +D45* +X107176000Y-112903000D02* +X107176000Y-110296000D01* +X107176000Y-110296000D02* +X106870000Y-109990000D01* +X100647500Y-120066500D02* +X101612000Y-120066500D01* +X107176000Y-115074000D02* +X107176000Y-114300000D01* +X107124500Y-115125500D02* +X107176000Y-115074000D01* +X101612000Y-120066500D02* +X101790500Y-119888000D01* +D43* +X107176000Y-112903000D02* +X107176000Y-114300000D01* +X100647500Y-121170000D02* +X100647500Y-120066500D01* +D42* +X82550000Y-115050000D02* +X82337800Y-115050000D01* +X82337800Y-115050000D02* +X80444800Y-113157000D01* +X82550000Y-115050000D02* +X82182400Y-115050000D01* +X82550000Y-112510000D02* +X82337800Y-112510000D01* +X82337800Y-112510000D02* +X80444800Y-110617000D01* +X82550000Y-112510000D02* +X82385600Y-112510000D01* +X82550000Y-109970000D02* +X82337800Y-109970000D01* +X82337800Y-109970000D02* +X80444800Y-108077000D01* +X82550000Y-109970000D02* +X82309400Y-109970000D01* +X82550000Y-107430000D02* +X82337800Y-107430000D01* +X82337800Y-107430000D02* +X80444800Y-105537000D01* +X108775500Y-96096280D02* +X108775500Y-96456500D01* +X109083300Y-95788480D02* +X108775500Y-96096280D01* +X109784340Y-95788480D02* +X109083300Y-95788480D01* +X109982460Y-95986600D02* +X109784340Y-95788480D01* +X109982460Y-96032320D02* +X109982460Y-95986600D01* +X110378700Y-96428560D02* +X109982460Y-96032320D01* +X108775500Y-98108898D02* +X108775500Y-98488500D01* +X109129958Y-97754440D02* +X108775500Y-98108898D01* +X109814820Y-97754440D02* +X109129958Y-97754440D01* +X110134860Y-97434400D02* +X109814820Y-97754440D01* +D43* +X99060000Y-122670000D02* +X100647500Y-122670000D01* +X97213400Y-121945400D02* +X98335400Y-121945400D01* +X98335400Y-121945400D02* +X99060000Y-122670000D01* +X97213400Y-119405400D02* +X98221100Y-119405400D01* +X98221100Y-119405400D02* +X99060000Y-118566500D01* +X100647500Y-118566500D02* +X99060000Y-118566500D01* +D42* +X82550000Y-105930000D02* +X84328000Y-105930000D01* +X82550000Y-108470000D02* +X84328000Y-108470000D01* +X82550000Y-111010000D02* +X84328000Y-111010000D01* +X82550000Y-113550000D02* +X84328000Y-113550000D01* +X89395300Y-123570300D02* +X90475500Y-123570300D01* +X90830400Y-123215400D02* +X91813400Y-123215400D01* +X90475500Y-123570300D02* +X90830400Y-123215400D01* +X87871300Y-123570300D02* +X87871300Y-121920700D01* +X87871300Y-121920700D02* +X87872000Y-121920000D01* +X87871300Y-123570300D02* +X89395300Y-123570300D01* +X89395300Y-125070300D02* +X89661300Y-125070300D01* +X89661300Y-125070300D02* +X90474800Y-124256800D01* +X90220800Y-122326400D02* +X90220800Y-121767600D01* +X90500200Y-122605800D02* +X90220800Y-122326400D01* +X90220800Y-121767600D02* +X90195400Y-121742200D01* +X87871300Y-125070300D02* +X89395300Y-125070300D01* +X91813400Y-118135400D02* +X90271600Y-118135400D01* +X90107200Y-117971000D02* +X89281000Y-117971000D01* +X90271600Y-118135400D02* +X90107200Y-117971000D01* +X87872000Y-119634000D02* +X87872000Y-118213000D01* +X87872000Y-118213000D02* +X87630000Y-117971000D01* +X87630000Y-117971000D02* +X89281000Y-117971000D01* +X89281000Y-116471000D02* +X90334400Y-116471000D01* +X88925400Y-118922800D02* +X88925400Y-119710200D01* +X88976200Y-118872000D02* +X88925400Y-118922800D01* +X90334400Y-116471000D02* +X90449400Y-116586000D01* +X87630000Y-116471000D02* +X89281000Y-116471000D01* +X85979000Y-116471000D02* +X86195600Y-116471000D01* +X86195600Y-116471000D02* +X86817200Y-115849400D01* +X90805000Y-115849400D02* +X91813400Y-116857800D01* +X86817200Y-115849400D02* +X90805000Y-115849400D01* +X91813400Y-116857800D02* +X91813400Y-116865400D01* +X85979000Y-116471000D02* +X86067200Y-116471000D01* +X86067200Y-116471000D02* +X86791800Y-117195600D01* +X86372000Y-119012400D02* +X86372000Y-119634000D01* +X86512400Y-118872000D02* +X86372000Y-119012400D01* +X86537800Y-118872000D02* +X86512400Y-118872000D01* +X86791800Y-118618000D02* +X86537800Y-118872000D01* +X86791800Y-117195600D02* +X86791800Y-118618000D01* +X84455000Y-116471000D02* +X85979000Y-116471000D01* +X86233000Y-125083000D02* +X86881400Y-125083000D01* +X91305400Y-124993400D02* +X91813400Y-124485400D01* +X90779600Y-124993400D02* +X91305400Y-124993400D01* +X90678000Y-125095000D02* +X90779600Y-124993400D01* +X86881400Y-125083000D02* +X86918800Y-125120400D01* +X86372000Y-121920000D02* +X86372000Y-122516200D01* +X86233000Y-124815600D02* +X86233000Y-125083000D01* +X86436200Y-124612400D02* +X86233000Y-124815600D01* +X86614000Y-124612400D02* +X86436200Y-124612400D01* +X87045800Y-124180600D02* +X86791800Y-124434600D01* +X86791800Y-124434600D02* +X86614000Y-124612400D01* +X87045800Y-123190000D02* +X87045800Y-124180600D01* +X86372000Y-122516200D02* +X87045800Y-123190000D01* +X84709000Y-125083000D02* +X86233000Y-125083000D01* +X84824000Y-119634000D02* +X84824000Y-119037800D01* +X84455000Y-118668800D02* +X84455000Y-117971000D01* +X84824000Y-119037800D02* +X84455000Y-118668800D01* +X84824000Y-121920000D02* +X84824000Y-123468000D01* +X84824000Y-123468000D02* +X84709000Y-123583000D01* +M02* diff --git a/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1-F.Mask.gbr b/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1-F.Mask.gbr new file mode 100644 index 00000000..aef2a739 --- /dev/null +++ b/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1-F.Mask.gbr @@ -0,0 +1,304 @@ +G04 #@! TF.FileFunction,Soldermask,Top* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 25/03/2016 9:42:23 AM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,0.800000X0.750000*% +%ADD12R,0.750000X0.800000*% +%ADD13C,1.300000*% +%ADD14R,1.300000X1.300000*% +%ADD15C,1.998980*% +%ADD16R,1.998980X1.998980*% +%ADD17R,1.600000X1.000000*% +%ADD18R,1.600000X0.560000*% +%ADD19R,0.560000X1.600000*% +%ADD20R,1.905000X1.905000*% +%ADD21C,1.905000*% +%ADD22R,0.900000X2.500000*% +%ADD23R,2.500000X0.900000*% +%ADD24R,2.032000X2.032000*% +%ADD25O,2.032000X2.032000*% +%ADD26R,1.350000X0.400000*% +%ADD27O,0.950000X1.250000*% +%ADD28O,1.550000X1.000000*% +%ADD29R,2.032000X1.727200*% +%ADD30O,2.032000X1.727200*% +%ADD31R,1.727200X1.727200*% +%ADD32O,1.727200X1.727200*% +%ADD33R,0.600000X0.900000*% +%ADD34R,0.900000X0.500000*% +%ADD35R,0.500000X0.900000*% +%ADD36R,0.900000X0.600000*% +%ADD37R,1.500000X0.600000*% +%ADD38R,0.304800X0.508000*% +%ADD39R,1.600200X2.999740*% +%ADD40R,1.600200X2.600960*% +G04 APERTURE END LIST* +D10* +D11* +X106795000Y-122555000D03* +X105295000Y-122555000D03* +X106795000Y-118745000D03* +X105295000Y-118745000D03* +D12* +X114887200Y-107633200D03* +X114887200Y-106133200D03* +D11* +X114213400Y-109029500D03* +X115713400Y-109029500D03* +D12* +X104521000Y-114351500D03* +X104521000Y-112851500D03* +D11* +X95238000Y-115316000D03* +X93738000Y-115316000D03* +X102604000Y-111760000D03* +X101104000Y-111760000D03* +D12* +X86360000Y-98945000D03* +X86360000Y-100445000D03* +X95059500Y-107557000D03* +X95059500Y-106057000D03* +X82423000Y-118098000D03* +X82423000Y-116598000D03* +X82550000Y-124956000D03* +X82550000Y-123456000D03* +D13* +X87670000Y-111760000D03* +D14* +X90170000Y-111760000D03* +D12* +X92456000Y-113804000D03* +X92456000Y-115304000D03* +D15* +X93342460Y-96520000D03* +D16* +X93342460Y-106680000D03* +D17* +X93345000Y-103100000D03* +X93345000Y-100100000D03* +D18* +X108720000Y-108140000D03* +X108720000Y-107340000D03* +X108720000Y-106540000D03* +X108720000Y-105740000D03* +X108720000Y-104940000D03* +X108720000Y-104140000D03* +X108720000Y-103340000D03* +X108720000Y-102540000D03* +X108720000Y-101740000D03* +X108720000Y-100940000D03* +X108720000Y-100140000D03* +D19* +X106870000Y-98290000D03* +X106070000Y-98290000D03* +X105270000Y-98290000D03* +X104470000Y-98290000D03* +X103670000Y-98290000D03* +X102870000Y-98290000D03* +X102070000Y-98290000D03* +X101270000Y-98290000D03* +X100470000Y-98290000D03* +X99670000Y-98290000D03* +X98870000Y-98290000D03* +D18* +X97020000Y-100140000D03* +X97020000Y-100940000D03* +X97020000Y-101740000D03* +X97020000Y-102540000D03* +X97020000Y-103340000D03* +X97020000Y-104140000D03* +X97020000Y-104940000D03* +X97020000Y-105740000D03* +X97020000Y-106540000D03* +X97020000Y-107340000D03* +X97020000Y-108140000D03* +D19* +X98870000Y-109990000D03* +X99670000Y-109990000D03* +X100470000Y-109990000D03* +X101270000Y-109990000D03* +X102070000Y-109990000D03* +X102870000Y-109990000D03* +X103670000Y-109990000D03* +X104470000Y-109990000D03* +X105270000Y-109990000D03* +X106070000Y-109990000D03* +X106870000Y-109990000D03* +D20* +X80444800Y-97917000D03* +D21* +X80444800Y-102997000D03* +D22* +X96721000Y-112649000D03* +X99621000Y-112649000D03* +D23* +X93980000Y-112321000D03* +X93980000Y-109421000D03* +D24* +X105918000Y-124460000D03* +D25* +X103378000Y-124460000D03* +D26* +X111340460Y-101910300D03* +X111340460Y-101260300D03* +X111340460Y-100610300D03* +X111340460Y-99960300D03* +X111340460Y-99310300D03* +D27* +X111340460Y-103110300D03* +X111340460Y-98110300D03* +D28* +X114040460Y-104110300D03* +X114040460Y-97110300D03* +D29* +X80444800Y-113157000D03* +D30* +X80444800Y-110617000D03* +X80444800Y-108077000D03* +X80444800Y-105537000D03* +D31* +X113795000Y-124307600D03* +D32* +X111255000Y-124307600D03* +X113795000Y-121767600D03* +X111255000Y-121767600D03* +D24* +X105918000Y-116840000D03* +D25* +X103378000Y-116840000D03* +D29* +X80444800Y-115697000D03* +D30* +X80444800Y-118237000D03* +X80444800Y-120777000D03* +X80444800Y-123317000D03* +D24* +X113706100Y-118224300D03* +D25* +X111166100Y-118224300D03* +D24* +X103378000Y-119380000D03* +D25* +X103378000Y-121920000D03* +D33* +X96139000Y-96136000D03* +X97089000Y-98936000D03* +X95189000Y-98936000D03* +D34* +X99060000Y-122670000D03* +X99060000Y-121170000D03* +X99060000Y-118566500D03* +X99060000Y-120066500D03* +X100647500Y-122670000D03* +X100647500Y-121170000D03* +X100647500Y-120066500D03* +X100647500Y-118566500D03* +D35* +X105676000Y-114300000D03* +X107176000Y-114300000D03* +X105676000Y-112903000D03* +X107176000Y-112903000D03* +D34* +X82550000Y-105930000D03* +X82550000Y-107430000D03* +X82550000Y-108470000D03* +X82550000Y-109970000D03* +X82550000Y-111010000D03* +X82550000Y-112510000D03* +X82550000Y-113550000D03* +X82550000Y-115050000D03* +X84328000Y-107430000D03* +X84328000Y-105930000D03* +X84328000Y-109970000D03* +X84328000Y-108470000D03* +X84328000Y-112510000D03* +X84328000Y-111010000D03* +X84328000Y-115050000D03* +X84328000Y-113550000D03* +X89395300Y-123570300D03* +X89395300Y-125070300D03* +X87871300Y-123570300D03* +X87871300Y-125070300D03* +X89281000Y-117971000D03* +X89281000Y-116471000D03* +X87630000Y-117971000D03* +X87630000Y-116471000D03* +D35* +X86372000Y-119634000D03* +X87872000Y-119634000D03* +X86372000Y-121920000D03* +X87872000Y-121920000D03* +X98818000Y-124079000D03* +X100318000Y-124079000D03* +D34* +X84455000Y-117971000D03* +X84455000Y-116471000D03* +X84709000Y-123583000D03* +X84709000Y-125083000D03* +D35* +X83324000Y-119634000D03* +X84824000Y-119634000D03* +X83324000Y-121920000D03* +X84824000Y-121920000D03* +X85332000Y-102946200D03* +X83832000Y-102946200D03* +X83832000Y-104546400D03* +X85332000Y-104546400D03* +X100318000Y-116840000D03* +X98818000Y-116840000D03* +D34* +X85979000Y-116471000D03* +X85979000Y-117971000D03* +X86233000Y-123583000D03* +X86233000Y-125083000D03* +D36* +X113464800Y-106807000D03* +X110664800Y-107757000D03* +X110664800Y-105857000D03* +D37* +X97213400Y-124485400D03* +X97213400Y-123215400D03* +X97213400Y-121945400D03* +X97213400Y-120675400D03* +X97213400Y-119405400D03* +X97213400Y-118135400D03* +X97213400Y-116865400D03* +X91813400Y-116865400D03* +X91813400Y-118135400D03* +X91813400Y-119405400D03* +X91813400Y-120675400D03* +X91813400Y-121945400D03* +X91813400Y-123215400D03* +X91813400Y-124485400D03* +D38* +X90195400Y-119710200D03* +X88925400Y-119710200D03* +X90195400Y-121742200D03* +X89560400Y-119710200D03* +X88925400Y-121742200D03* +X89560400Y-121742200D03* +X108140500Y-98488500D03* +X109410500Y-98488500D03* +X108140500Y-96456500D03* +X108775500Y-98488500D03* +X109410500Y-96456500D03* +X108775500Y-96456500D03* +D39* +X112448800Y-114696240D03* +X112448800Y-110296960D03* +D40* +X89535000Y-97259140D03* +X89535000Y-100860860D03* +D24* +X90604800Y-106807000D03* +D25* +X88064800Y-106807000D03* +D24* +X90604800Y-104267000D03* +D25* +X88064800Y-104267000D03* +M02* diff --git a/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1.drl b/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1.drl new file mode 100644 index 00000000..aca0c510 --- /dev/null +++ b/PCB/OUTPUT_V4/seeeed/Gerber + Drill/Tinylab_proto1.drl @@ -0,0 +1,124 @@ +M48 +;DRILL file {KiCad 4.0.1-stable} date 25/03/2016 9:42:25 AM +;FORMAT={2:4/ absolute / inch / keep zeros} +FMAT,2 +INCH,TZ +T1C0.016 +T2C0.020 +T3C0.022 +T4C0.031 +T5C0.032 +T6C0.039 +T7C0.040 +T8C0.050 +% +G90 +G05 +M72 +T1 +X033690Y-041650 +X033710Y-047630 +X033999Y-045270 +X034220Y-049260 +X034524Y-040092 +X035030Y-046800 +X035119Y-048259 +X035581Y-046763 +X035610Y-045900 +X035620Y-048920 +X035630Y-048270 +X035700Y-049250 +X035750Y-040062 +X035956Y-038700 +X036025Y-042575 +X036150Y-042900 +X036772Y-045948 +X036814Y-047798 +X037200Y-048700 +X037600Y-041025 +X037625Y-041450 +X037676Y-047820 +X037992Y-042960 +X038586Y-045300 +X038707Y-044058 +X038796Y-044770 +X038811Y-040650 +X038944Y-039358 +X039246Y-040195 +X039300Y-045625 +X039878Y-042572 +X040075Y-047200 +X040113Y-044749 +X040200Y-039225 +X040654Y-042520 +X040686Y-044430 +X041101Y-043915 +X041124Y-041284 +X041149Y-040969 +X041387Y-044438 +X041450Y-039225 +X041545Y-040708 +X041852Y-040924 +X042134Y-041446 +X042175Y-045325 +X042308Y-042548 +X042476Y-043930 +X042486Y-045406 +X043087Y-045406 +X043116Y-043743 +X043331Y-039990 +X043360Y-038360 +X043386Y-039615 +X043456Y-037964 +X043571Y-044595 +X043946Y-042040 +X044277Y-042513 +X044326Y-040140 +X045136Y-045335 +T4 +X034516Y-044000 +X035500Y-044000 +T5 +X031671Y-038550 +X031671Y-040550 +T6 +X036749Y-042000 +T7 +X031671Y-041550 +X031671Y-042550 +X031671Y-043550 +X031671Y-044550 +X031671Y-045550 +X031671Y-046550 +X031671Y-047550 +X031671Y-048550 +X034671Y-041050 +X034671Y-042050 +X035671Y-041050 +X035671Y-042050 +X040700Y-046000 +X040700Y-047000 +X040700Y-048000 +X040700Y-049000 +X041700Y-046000 +X041700Y-049000 +X043766Y-046545 +X043801Y-047940 +X043801Y-048940 +X044766Y-046545 +X044801Y-047940 +X044801Y-048940 +T8 +X036749Y-038000 +T2 +X045026Y-038232G85X044770Y-038232 +G05 +X045026Y-040988G85X044770Y-040988 +G05 +T3 +X043835Y-038685G85X043835Y-038567 +G05 +X043835Y-040654G85X043835Y-040536 +G05 +T0 +M30 diff --git a/PCB/OUTPUT_V4/seeeed/Requirement/PCB Requirement Format.ods b/PCB/OUTPUT_V4/seeeed/Requirement/PCB Requirement Format.ods new file mode 100644 index 00000000..8f125497 Binary files /dev/null and b/PCB/OUTPUT_V4/seeeed/Requirement/PCB Requirement Format.ods differ diff --git a/PCB/OUTPUT_V4/seeeed/Requirement/PCB Requirement Format.xls b/PCB/OUTPUT_V4/seeeed/Requirement/PCB Requirement Format.xls new file mode 100644 index 00000000..cd7b955d Binary files /dev/null and b/PCB/OUTPUT_V4/seeeed/Requirement/PCB Requirement Format.xls differ diff --git a/PCB/OUTPUT_V4/seeeed/seeed.zip b/PCB/OUTPUT_V4/seeeed/seeed.zip new file mode 100644 index 00000000..9ab9a33e Binary files /dev/null and b/PCB/OUTPUT_V4/seeeed/seeed.zip differ diff --git a/PCB/OUTPUT_V5/Tinylab_proto1-B.Cu.gbr b/PCB/OUTPUT_V5/Tinylab_proto1-B.Cu.gbr new file mode 100644 index 00000000..d3a5e0d8 --- /dev/null +++ b/PCB/OUTPUT_V5/Tinylab_proto1-B.Cu.gbr @@ -0,0 +1,563 @@ +G04 #@! TF.FileFunction,Copper,L2,Bot,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 07/06/2016 1:51:25 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,1.727200X1.727200*% +%ADD12O,1.727200X1.727200*% +%ADD13R,2.032000X2.032000*% +%ADD14O,2.032000X2.032000*% +%ADD15C,1.300000*% +%ADD16R,1.300000X1.300000*% +%ADD17C,1.998980*% +%ADD18R,1.998980X1.998980*% +%ADD19R,1.905000X1.905000*% +%ADD20C,1.905000*% +%ADD21R,2.032000X1.727200*% +%ADD22O,2.032000X1.727200*% +%ADD23O,0.950000X1.400000*% +%ADD24O,1.550000X1.200000*% +%ADD25C,0.600000*% +%ADD26C,0.250000*% +%ADD27C,0.635000*% +%ADD28C,1.270000*% +%ADD29C,0.400000*% +G04 APERTURE END LIST* +D10* +D11* +X113795000Y-124307600D03* +D12* +X111255000Y-124307600D03* +X113795000Y-121767600D03* +X111255000Y-121767600D03* +D13* +X103378000Y-119380000D03* +D14* +X103378000Y-121920000D03* +D13* +X113706100Y-118224300D03* +D14* +X111166100Y-118224300D03* +D15* +X87670000Y-111760000D03* +D16* +X90170000Y-111760000D03* +D17* +X93342460Y-96520000D03* +D18* +X93342460Y-106680000D03* +D19* +X82753200Y-95973900D03* +D20* +X82753200Y-101053900D03* +D13* +X105918000Y-124460000D03* +D14* +X103378000Y-124460000D03* +D21* +X80444800Y-113157000D03* +D22* +X80444800Y-110617000D03* +X80444800Y-108077000D03* +X80444800Y-105537000D03* +D13* +X105918000Y-116840000D03* +D14* +X103378000Y-116840000D03* +D21* +X80444800Y-115697000D03* +D22* +X80444800Y-118237000D03* +X80444800Y-120777000D03* +X80444800Y-123317000D03* +D13* +X90604800Y-106807000D03* +D14* +X88064800Y-106807000D03* +D13* +X90604800Y-104267000D03* +D14* +X88064800Y-104267000D03* +D13* +X99339400Y-95935800D03* +D14* +X101879400Y-95935800D03* +D23* +X111340460Y-103110300D03* +X111340460Y-98110300D03* +D24* +X114040460Y-104110300D03* +X114040460Y-97110300D03* +D25* +X100965000Y-115620800D03* +X112588500Y-101955600D03* +X91328700Y-98298000D03* +X114645900Y-115150900D03* +X110670800Y-113271300D03* +X98008900Y-115062000D03* +X110248700Y-115646200D03* +X108054600Y-109296200D03* +X103261620Y-108000800D03* +X105123440Y-112872520D03* +X101886498Y-113662460D03* +X105283000Y-99631500D03* +X102108000Y-99631500D03* +X94488000Y-123698000D03* +X99822000Y-115887500D03* +X85623400Y-120980200D03* +X85572600Y-105791000D03* +X90805000Y-101757598D03* +X112464800Y-107982000D03* +X111623300Y-106781600D03* +X107462780Y-108071920D03* +X104455420Y-104861360D03* +X98918220Y-99969320D03* +X87691420Y-101833680D03* +X103342900Y-112852200D03* +X98542300Y-113715800D03* +X107020820Y-105272840D03* +X90376200Y-118778020D03* +X106304540Y-103946960D03* +X89202720Y-122577860D03* +X105524760Y-103398320D03* +X93401340Y-116707920D03* +X104518920Y-104061260D03* +X93508020Y-121406920D03* +X99685300Y-102095300D03* +X110061200Y-101574600D03* +X110200900Y-100622100D03* +X98580400Y-103251000D03* +X95580200Y-104190800D03* +X91871800Y-108635800D03* +X95529400Y-105079800D03* +X91389200Y-109677200D03* +X86871000Y-115087400D03* +X96599200Y-109143800D03* +X98577400Y-111785400D03* +X108051600Y-111683800D03* +X109474000Y-114960400D03* +X101295200Y-108102400D03* +X108940600Y-111506000D03* +X110820200Y-116408200D03* +X104397000Y-111544100D03* +X95697500Y-121462800D03* +X108407200Y-114884200D03* +X101727000Y-119888000D03* +X110378700Y-96428560D03* +X110134860Y-97434400D03* +X90500200Y-122605800D03* +X90474800Y-124256800D03* +X88976200Y-118872000D03* +X90449400Y-116586000D03* +X90678000Y-125095000D03* +X86918800Y-125120400D03* +X95583200Y-109347000D03* +X95380000Y-102717600D03* +D26* +X101854000Y-120904000D02* +X103378000Y-119380000D01* +X101219000Y-120904000D02* +X101854000Y-120904000D01* +X100558600Y-120243600D02* +X101219000Y-120904000D01* +X100558600Y-116027200D02* +X100558600Y-120243600D01* +X100965000Y-115620800D02* +X100558600Y-116027200D01* +D27* +X112588500Y-101523800D02* +X112588500Y-101955600D01* +X109438900Y-98374200D02* +X112588500Y-101523800D01* +D28* +X91404900Y-98374200D02* +X109438900Y-98374200D01* +D27* +X91328700Y-98298000D02* +X91404900Y-98374200D01* +D29* +X114049000Y-124307600D02* +X115687300Y-122669300D01* +X115687300Y-122669300D02* +X115687300Y-116192300D01* +X115687300Y-116192300D02* +X114645900Y-115150900D01* +D27* +X109896100Y-114046000D02* +X110670800Y-113271300D01* +X106721100Y-114046000D02* +X109896100Y-114046000D01* +X106213100Y-114554000D02* +X106721100Y-114046000D01* +X98516900Y-114554000D02* +X106213100Y-114554000D01* +X98008900Y-115062000D02* +X98516900Y-114554000D01* +D29* +X113795000Y-124307600D02* +X114049000Y-124307600D01* +D27* +X110248700Y-115646200D02* +X111633000Y-114261900D01* +X111633000Y-114261900D02* +X111633000Y-112525200D01* +X111633000Y-112525200D02* +X110689800Y-111582000D01* +D26* +X111633000Y-114261900D02* +X111633000Y-112525200D01* +X111633000Y-112525200D02* +X110689800Y-111582000D01* +X108054600Y-109296200D02* +X108054600Y-109258100D01* +X108054600Y-109258100D02* +X108054600Y-109296200D01* +X108054600Y-109296200D02* +X108054600Y-109258100D01* +D27* +X103261620Y-108000800D02* +X103289560Y-107972860D01* +X103289560Y-107972860D02* +X105860040Y-107972860D01* +X105860040Y-107972860D02* +X107145280Y-109258100D01* +D28* +X105123440Y-112872520D02* +X109399280Y-112872520D01* +X109399280Y-112872520D02* +X110689800Y-111582000D01* +X110689800Y-111582000D02* +X111014800Y-111582000D01* +X111014800Y-111582000D02* +X112464800Y-110132000D01* +X112464800Y-110132000D02* +X112464800Y-107982000D01* +D27* +X104300480Y-113695480D02* +X105123440Y-112872520D01* +X101919518Y-113695480D02* +X104300480Y-113695480D01* +X101886498Y-113662460D02* +X101919518Y-113695480D01* +D29* +X105283000Y-99631500D02* +X105092500Y-99822000D01* +X105092500Y-99822000D02* +X102298500Y-99822000D01* +X102298500Y-99822000D02* +X102108000Y-99631500D01* +D27* +X95631000Y-123698000D02* +X94488000Y-123698000D01* +X96139000Y-124206000D02* +X95631000Y-123698000D01* +X97028000Y-124206000D02* +X96139000Y-124206000D01* +X98171000Y-123063000D02* +X97028000Y-124206000D01* +X98171000Y-116713000D02* +X98171000Y-123063000D01* +X99060000Y-115887500D02* +X98171000Y-116713000D01* +X99822000Y-115887500D02* +X99060000Y-115887500D01* +D26* +X85623400Y-105841800D02* +X85623400Y-120980200D01* +X85572600Y-105791000D02* +X85623400Y-105841800D01* +D28* +X90805000Y-101757598D02* +X90805000Y-103505000D01* +X90805000Y-103505000D02* +X90170000Y-104140000D01* +X87630000Y-104140000D02* +X90170000Y-104140000D01* +X87630000Y-106680000D02* +X87630000Y-104140000D01* +X87670000Y-111760000D02* +X87670000Y-106720000D01* +X87670000Y-106720000D02* +X87630000Y-106680000D01* +D27* +X107145280Y-109258100D02* +X108054600Y-109258100D01* +X108054600Y-109258100D02* +X109146800Y-109258100D01* +X109146800Y-109258100D02* +X111623300Y-106781600D01* +D28* +X90170000Y-106680000D02* +X93342460Y-106680000D01* +X90170000Y-111760000D02* +X90170000Y-106680000D01* +X82753200Y-95973900D02* +X92796360Y-95973900D01* +X92796360Y-95973900D02* +X93342460Y-96520000D01* +D26* +X107157980Y-107767120D02* +X107462780Y-108071920D01* +X107157980Y-106324400D02* +X107157980Y-107767120D01* +X105796540Y-104962960D02* +X107157980Y-106324400D01* +X104557020Y-104962960D02* +X105796540Y-104962960D01* +X104455420Y-104861360D02* +X104557020Y-104962960D01* +X94371620Y-99969320D02* +X98918220Y-99969320D01* +X93726460Y-100614480D02* +X94371620Y-99969320D01* +X88910620Y-100614480D02* +X93726460Y-100614480D01* +X87691420Y-101833680D02* +X88910620Y-100614480D01* +X102733300Y-112242600D02* +X103342900Y-112852200D01* +X100015500Y-112242600D02* +X102733300Y-112242600D01* +X98542300Y-113715800D02* +X100015500Y-112242600D01* +X107020820Y-102816660D02* +X107020820Y-105272840D01* +X106477260Y-102273100D02* +X107020820Y-102816660D01* +X101067060Y-102273100D02* +X106477260Y-102273100D01* +X98895360Y-104444800D02* +X101067060Y-102273100D01* +X98895360Y-107759500D02* +X98895360Y-104444800D01* +X91389660Y-115265200D02* +X98895360Y-107759500D01* +X91389660Y-117764560D02* +X91389660Y-115265200D01* +X90376200Y-118778020D02* +X91389660Y-117764560D01* +X106304540Y-102971600D02* +X106304540Y-103946960D01* +X106081020Y-102748080D02* +X106304540Y-102971600D01* +X101305820Y-102748080D02* +X106081020Y-102748080D01* +X99444000Y-104609900D02* +X101305820Y-102748080D01* +X99444000Y-107950000D02* +X99444000Y-104609900D01* +X91839662Y-115554338D02* +X99444000Y-107950000D01* +X91839662Y-118259438D02* +X91839662Y-115554338D01* +X90493040Y-119606060D02* +X91839662Y-118259438D01* +X89065560Y-119606060D02* +X90493040Y-119606060D01* +X88059720Y-120611900D02* +X89065560Y-119606060D01* +X88059720Y-121983500D02* +X88059720Y-120611900D01* +X88595660Y-122519440D02* +X88059720Y-121983500D01* +X89144300Y-122519440D02* +X88595660Y-122519440D01* +X89202720Y-122577860D02* +X89144300Y-122519440D01* +X101846840Y-103398320D02* +X105524760Y-103398320D01* +X100076460Y-105168700D02* +X101846840Y-103398320D01* +X100076460Y-108280200D02* +X100076460Y-105168700D01* +X93624860Y-114731800D02* +X100076460Y-108280200D01* +X93624860Y-116484400D02* +X93624860Y-114731800D01* +X93401340Y-116707920D02* +X93624860Y-116484400D01* +X102395480Y-104061260D02* +X104518920Y-104061260D01* +X100647960Y-105808780D02* +X102395480Y-104061260D01* +X100647960Y-108597700D02* +X100647960Y-105808780D01* +X94323360Y-114922300D02* +X100647960Y-108597700D01* +X94323360Y-120591580D02* +X94323360Y-114922300D01* +X93508020Y-121406920D02* +X94323360Y-120591580D01* +D29* +X99685300Y-101831702D02* +X99685300Y-102095300D01* +X100294900Y-101222102D02* +X99685300Y-101831702D01* +X109708702Y-101222102D02* +X100294900Y-101222102D01* +X110061200Y-101574600D02* +X109708702Y-101222102D01* +X99863100Y-100622100D02* +X110200900Y-100622100D01* +X98885200Y-101600000D02* +X99863100Y-100622100D01* +X98885200Y-102946200D02* +X98885200Y-101600000D01* +X98580400Y-103251000D02* +X98885200Y-102946200D01* +D26* +X94818200Y-104190800D02* +X95580200Y-104190800D01* +X94513400Y-104495600D02* +X94818200Y-104190800D01* +X94513400Y-105130600D02* +X94513400Y-104495600D01* +X95046800Y-105664000D02* +X94513400Y-105130600D01* +X95046800Y-107830366D02* +X95046800Y-105664000D01* +X94393766Y-108483400D02* +X95046800Y-107830366D01* +X92024200Y-108483400D02* +X94393766Y-108483400D01* +X91871800Y-108635800D02* +X92024200Y-108483400D01* +X95529400Y-105511600D02* +X95529400Y-105079800D01* +X95829698Y-105811898D02* +X95529400Y-105511600D01* +X95829698Y-107683866D02* +X95829698Y-105811898D01* +X94191964Y-109321600D02* +X95829698Y-107683866D01* +X91744800Y-109321600D02* +X94191964Y-109321600D01* +X91389200Y-109677200D02* +X91744800Y-109321600D01* +X88877600Y-115087400D02* +X86871000Y-115087400D01* +X93779800Y-110185200D02* +X88877600Y-115087400D01* +X95833262Y-110185200D02* +X93779800Y-110185200D01* +X96254331Y-109764131D02* +X95833262Y-110185200D01* +X96254331Y-109488669D02* +X96254331Y-109764131D01* +X96599200Y-109143800D02* +X96254331Y-109488669D01* +X111255000Y-124307600D02* +X110845600Y-124307600D01* +X110845600Y-124307600D02* +X109093000Y-122555000D01* +X99720400Y-110642400D02* +X98577400Y-111785400D01* +X107010200Y-110642400D02* +X99720400Y-110642400D01* +X108051600Y-111683800D02* +X107010200Y-110642400D01* +X109093000Y-115341400D02* +X109474000Y-114960400D01* +X109093000Y-122555000D02* +X109093000Y-115341400D01* +X111255000Y-124307600D02* +X110865400Y-124307600D01* +X111255000Y-121767600D02* +X111255000Y-121237200D01* +X111255000Y-121237200D02* +X109550200Y-119532400D01* +X103352600Y-110159800D02* +X101295200Y-108102400D01* +X107594400Y-110159800D02* +X103352600Y-110159800D01* +X108940600Y-111506000D02* +X107594400Y-110159800D01* +X110261400Y-116408200D02* +X110820200Y-116408200D01* +X109550200Y-117119400D02* +X110261400Y-116408200D01* +X109550200Y-119532400D02* +X109550200Y-117119400D01* +X99825000Y-111544100D02* +X104397000Y-111544100D01* +X95189500Y-116179600D02* +X99825000Y-111544100D01* +X95189500Y-120954800D02* +X95189500Y-116179600D01* +X95697500Y-121462800D02* +X95189500Y-120954800D01* +X108026200Y-115265200D02* +X108407200Y-114884200D01* +X102768400Y-115265200D02* +X108026200Y-115265200D01* +X101955600Y-116078000D02* +X102768400Y-115265200D01* +X101955600Y-119659400D02* +X101955600Y-116078000D01* +X101727000Y-119888000D02* +X101955600Y-119659400D01* +X113706100Y-118224300D02* +X113706100Y-112379760D01* +X112116060Y-96428560D02* +X110378700Y-96428560D01* +X112764182Y-97076682D02* +X112116060Y-96428560D01* +X112764182Y-98204442D02* +X112764182Y-97076682D01* +X116002260Y-101442520D02* +X112764182Y-98204442D01* +X116002260Y-110083600D02* +X116002260Y-101442520D01* +X113706100Y-112379760D02* +X116002260Y-110083600D01* +X111166100Y-118224300D02* +X113134600Y-112141000D01* +X110515860Y-97053400D02* +X110134860Y-97434400D01* +X111872220Y-97053400D02* +X110515860Y-97053400D01* +X112314180Y-97495360D02* +X111872220Y-97053400D01* +X112314180Y-98668840D02* +X112314180Y-97495360D01* +X115346940Y-101701600D02* +X112314180Y-98668840D01* +X115346940Y-109885480D02* +X115346940Y-101701600D01* +X113134600Y-112141000D02* +X115346940Y-109885480D01* +X90500200Y-124231400D02* +X90500200Y-122605800D01* +X90474800Y-124256800D02* +X90500200Y-124231400D01* +X89103200Y-118745000D02* +X88976200Y-118872000D01* +X89433400Y-118745000D02* +X89103200Y-118745000D01* +X90525600Y-117652800D02* +X89433400Y-118745000D01* +X90525600Y-116662200D02* +X90525600Y-117652800D01* +X90449400Y-116586000D02* +X90525600Y-116662200D01* +X86944200Y-125095000D02* +X90678000Y-125095000D01* +X86918800Y-125120400D02* +X86944200Y-125095000D01* +D27* +X95583200Y-108839000D02* +X95583200Y-109347000D01* +X96472200Y-107950000D02* +X95583200Y-108839000D01* +X96472200Y-103809800D02* +X96472200Y-107950000D01* +X95380000Y-102717600D02* +X96472200Y-103809800D01* +X114040460Y-104110300D02* +X112340460Y-104110300D01* +X112340460Y-104110300D02* +X111340460Y-103110300D01* +M02* diff --git a/PCB/OUTPUT_V5/Tinylab_proto1-B.Mask.gbr b/PCB/OUTPUT_V5/Tinylab_proto1-B.Mask.gbr new file mode 100644 index 00000000..eff69fdb --- /dev/null +++ b/PCB/OUTPUT_V5/Tinylab_proto1-B.Mask.gbr @@ -0,0 +1,89 @@ +G04 #@! TF.FileFunction,Soldermask,Bot* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 07/06/2016 1:51:26 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,1.727200X1.727200*% +%ADD12O,1.727200X1.727200*% +%ADD13R,2.032000X2.032000*% +%ADD14O,2.032000X2.032000*% +%ADD15C,1.300000*% +%ADD16R,1.300000X1.300000*% +%ADD17C,1.998980*% +%ADD18R,1.998980X1.998980*% +%ADD19R,1.905000X1.905000*% +%ADD20C,1.905000*% +%ADD21R,2.032000X1.727200*% +%ADD22O,2.032000X1.727200*% +%ADD23O,0.950000X1.400000*% +%ADD24O,1.550000X1.200000*% +G04 APERTURE END LIST* +D10* +D11* +X113795000Y-124307600D03* +D12* +X111255000Y-124307600D03* +X113795000Y-121767600D03* +X111255000Y-121767600D03* +D13* +X103378000Y-119380000D03* +D14* +X103378000Y-121920000D03* +D13* +X113706100Y-118224300D03* +D14* +X111166100Y-118224300D03* +D15* +X87670000Y-111760000D03* +D16* +X90170000Y-111760000D03* +D17* +X93342460Y-96520000D03* +D18* +X93342460Y-106680000D03* +D19* +X82753200Y-95973900D03* +D20* +X82753200Y-101053900D03* +D13* +X105918000Y-124460000D03* +D14* +X103378000Y-124460000D03* +D21* +X80444800Y-113157000D03* +D22* +X80444800Y-110617000D03* +X80444800Y-108077000D03* +X80444800Y-105537000D03* +D13* +X105918000Y-116840000D03* +D14* +X103378000Y-116840000D03* +D21* +X80444800Y-115697000D03* +D22* +X80444800Y-118237000D03* +X80444800Y-120777000D03* +X80444800Y-123317000D03* +D13* +X90604800Y-106807000D03* +D14* +X88064800Y-106807000D03* +D13* +X90604800Y-104267000D03* +D14* +X88064800Y-104267000D03* +D13* +X99339400Y-95935800D03* +D14* +X101879400Y-95935800D03* +D23* +X111340460Y-103110300D03* +X111340460Y-98110300D03* +D24* +X114040460Y-104110300D03* +X114040460Y-97110300D03* +M02* diff --git a/PCB/OUTPUT_V5/Tinylab_proto1-Edge.Cuts.gbr b/PCB/OUTPUT_V5/Tinylab_proto1-Edge.Cuts.gbr new file mode 100644 index 00000000..4f2217b9 --- /dev/null +++ b/PCB/OUTPUT_V5/Tinylab_proto1-Edge.Cuts.gbr @@ -0,0 +1,25 @@ +G04 #@! TF.FileFunction,Profile,NP* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 07/06/2016 1:51:26 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +G04 APERTURE END LIST* +D10* +X78790800Y-126098300D02* +X78790800Y-125907800D01* +X116509800Y-126098300D02* +X78790800Y-126098300D01* +X116509800Y-94526100D02* +X116509800Y-126098300D01* +X78765400Y-94526100D02* +X116509800Y-94526100D01* +X78790800Y-94691200D02* +X78790800Y-94538800D01* +X78790800Y-95199200D02* +X78790800Y-94615000D01* +X78786180Y-126090680D02* +X78786180Y-95201740D01* +M02* diff --git a/PCB/OUTPUT_V5/Tinylab_proto1-F.Cu.gbr b/PCB/OUTPUT_V5/Tinylab_proto1-F.Cu.gbr new file mode 100644 index 00000000..205e1d87 --- /dev/null +++ b/PCB/OUTPUT_V5/Tinylab_proto1-F.Cu.gbr @@ -0,0 +1,1512 @@ +G04 #@! TF.FileFunction,Copper,L1,Top,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 07/06/2016 1:51:25 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,1.727200X1.727200*% +%ADD12O,1.727200X1.727200*% +%ADD13R,2.032000X2.032000*% +%ADD14O,2.032000X2.032000*% +%ADD15R,1.600000X0.560000*% +%ADD16R,0.560000X1.600000*% +%ADD17R,1.600200X2.999740*% +%ADD18R,0.750000X0.800000*% +%ADD19R,0.800000X0.750000*% +%ADD20C,1.300000*% +%ADD21R,1.300000X1.300000*% +%ADD22C,1.998980*% +%ADD23R,1.998980X1.998980*% +%ADD24R,1.905000X1.905000*% +%ADD25C,1.905000*% +%ADD26R,0.900000X2.500000*% +%ADD27R,2.500000X0.900000*% +%ADD28R,2.032000X1.727200*% +%ADD29O,2.032000X1.727200*% +%ADD30R,0.600000X0.900000*% +%ADD31R,0.900000X0.500000*% +%ADD32R,0.500000X0.900000*% +%ADD33R,0.900000X0.600000*% +%ADD34R,1.500000X0.600000*% +%ADD35R,0.304800X0.508000*% +%ADD36R,1.600200X2.600960*% +%ADD37R,1.000000X2.500000*% +%ADD38R,1.350000X0.400000*% +%ADD39O,0.950000X1.400000*% +%ADD40O,1.550000X1.200000*% +%ADD41C,0.600000*% +%ADD42C,0.400000*% +%ADD43C,0.250000*% +%ADD44C,0.635000*% +%ADD45C,1.270000*% +G04 APERTURE END LIST* +D10* +D11* +X113795000Y-124307600D03* +D12* +X111255000Y-124307600D03* +X113795000Y-121767600D03* +X111255000Y-121767600D03* +D13* +X103378000Y-119380000D03* +D14* +X103378000Y-121920000D03* +D15* +X108720000Y-108140000D03* +X108720000Y-107340000D03* +X108720000Y-106540000D03* +X108720000Y-105740000D03* +X108720000Y-104940000D03* +X108720000Y-104140000D03* +X108720000Y-103340000D03* +X108720000Y-102540000D03* +X108720000Y-101740000D03* +X108720000Y-100940000D03* +X108720000Y-100140000D03* +D16* +X106870000Y-98290000D03* +X106070000Y-98290000D03* +X105270000Y-98290000D03* +X104470000Y-98290000D03* +X103670000Y-98290000D03* +X102870000Y-98290000D03* +X102070000Y-98290000D03* +X101270000Y-98290000D03* +X100470000Y-98290000D03* +X99670000Y-98290000D03* +X98870000Y-98290000D03* +D15* +X97020000Y-100140000D03* +X97020000Y-100940000D03* +X97020000Y-101740000D03* +X97020000Y-102540000D03* +X97020000Y-103340000D03* +X97020000Y-104140000D03* +X97020000Y-104940000D03* +X97020000Y-105740000D03* +X97020000Y-106540000D03* +X97020000Y-107340000D03* +X97020000Y-108140000D03* +D16* +X98870000Y-109990000D03* +X99670000Y-109990000D03* +X100470000Y-109990000D03* +X101270000Y-109990000D03* +X102070000Y-109990000D03* +X102870000Y-109990000D03* +X103670000Y-109990000D03* +X104470000Y-109990000D03* +X105270000Y-109990000D03* +X106070000Y-109990000D03* +X106870000Y-109990000D03* +D17* +X112448800Y-114696240D03* +X112448800Y-110296960D03* +D13* +X113706100Y-118224300D03* +D14* +X111166100Y-118224300D03* +D18* +X101523800Y-123684600D03* +X101523800Y-125184600D03* +X101803200Y-117539200D03* +X101803200Y-116039200D03* +X114303000Y-107936600D03* +X114303000Y-109436600D03* +D19* +X109538200Y-110312200D03* +X108038200Y-110312200D03* +D18* +X104521000Y-114351500D03* +X104521000Y-112851500D03* +D19* +X95238000Y-115316000D03* +X93738000Y-115316000D03* +X102604000Y-111760000D03* +X101104000Y-111760000D03* +D18* +X86360000Y-98945000D03* +X86360000Y-100445000D03* +X95059500Y-107557000D03* +X95059500Y-106057000D03* +X82423000Y-118098000D03* +X82423000Y-116598000D03* +X82550000Y-124956000D03* +X82550000Y-123456000D03* +D20* +X87670000Y-111760000D03* +D21* +X90170000Y-111760000D03* +D18* +X92456000Y-113804000D03* +X92456000Y-115304000D03* +D22* +X93342460Y-96520000D03* +D23* +X93342460Y-106680000D03* +D24* +X82753200Y-95973900D03* +D25* +X82753200Y-101053900D03* +D26* +X96721000Y-112649000D03* +X99621000Y-112649000D03* +D27* +X94592600Y-114048200D03* +X94592600Y-111148200D03* +D13* +X105918000Y-124460000D03* +D14* +X103378000Y-124460000D03* +D28* +X80444800Y-113157000D03* +D29* +X80444800Y-110617000D03* +X80444800Y-108077000D03* +X80444800Y-105537000D03* +D13* +X105918000Y-116840000D03* +D14* +X103378000Y-116840000D03* +D28* +X80444800Y-115697000D03* +D29* +X80444800Y-118237000D03* +X80444800Y-120777000D03* +X80444800Y-123317000D03* +D30* +X96139000Y-96136000D03* +X97089000Y-98936000D03* +X95189000Y-98936000D03* +D31* +X99060000Y-122670000D03* +X99060000Y-121170000D03* +X99060000Y-118566500D03* +X99060000Y-120066500D03* +X100647500Y-122670000D03* +X100647500Y-121170000D03* +X100647500Y-120066500D03* +X100647500Y-118566500D03* +D32* +X105676000Y-114300000D03* +X107176000Y-114300000D03* +X105676000Y-112903000D03* +X107176000Y-112903000D03* +D31* +X82550000Y-105930000D03* +X82550000Y-107430000D03* +X82550000Y-108470000D03* +X82550000Y-109970000D03* +X82550000Y-111010000D03* +X82550000Y-112510000D03* +X82550000Y-113550000D03* +X82550000Y-115050000D03* +X84328000Y-107430000D03* +X84328000Y-105930000D03* +X84328000Y-109970000D03* +X84328000Y-108470000D03* +X84328000Y-112510000D03* +X84328000Y-111010000D03* +X84328000Y-115050000D03* +X84328000Y-113550000D03* +X89395300Y-123570300D03* +X89395300Y-125070300D03* +X87871300Y-123570300D03* +X87871300Y-125070300D03* +X89281000Y-117971000D03* +X89281000Y-116471000D03* +X87630000Y-117971000D03* +X87630000Y-116471000D03* +D32* +X86372000Y-119634000D03* +X87872000Y-119634000D03* +X86372000Y-121920000D03* +X87872000Y-121920000D03* +X98818000Y-124079000D03* +X100318000Y-124079000D03* +D31* +X84455000Y-117971000D03* +X84455000Y-116471000D03* +X84709000Y-123583000D03* +X84709000Y-125083000D03* +D32* +X83324000Y-119634000D03* +X84824000Y-119634000D03* +X83324000Y-121920000D03* +X84824000Y-121920000D03* +X85332000Y-102946200D03* +X83832000Y-102946200D03* +X83832000Y-104546400D03* +X85332000Y-104546400D03* +X100318000Y-116840000D03* +X98818000Y-116840000D03* +D31* +X85979000Y-116471000D03* +X85979000Y-117971000D03* +X86233000Y-123583000D03* +X86233000Y-125083000D03* +D33* +X113464800Y-106807000D03* +X110664800Y-107757000D03* +X110664800Y-105857000D03* +D34* +X97213400Y-124485400D03* +X97213400Y-123215400D03* +X97213400Y-121945400D03* +X97213400Y-120675400D03* +X97213400Y-119405400D03* +X97213400Y-118135400D03* +X97213400Y-116865400D03* +X91813400Y-116865400D03* +X91813400Y-118135400D03* +X91813400Y-119405400D03* +X91813400Y-120675400D03* +X91813400Y-121945400D03* +X91813400Y-123215400D03* +X91813400Y-124485400D03* +D35* +X90195400Y-119710200D03* +X88925400Y-119710200D03* +X90195400Y-121742200D03* +X89560400Y-119710200D03* +X88925400Y-121742200D03* +X89560400Y-121742200D03* +X108140500Y-98488500D03* +X109410500Y-98488500D03* +X108140500Y-96456500D03* +X108775500Y-98488500D03* +X109410500Y-96456500D03* +X108775500Y-96456500D03* +D36* +X89535000Y-97259140D03* +X89535000Y-100860860D03* +D13* +X90604800Y-106807000D03* +D14* +X88064800Y-106807000D03* +D13* +X90604800Y-104267000D03* +D14* +X88064800Y-104267000D03* +D27* +X93703600Y-101953400D03* +X93703600Y-104853400D03* +D13* +X99339400Y-95935800D03* +D14* +X101879400Y-95935800D03* +D19* +X107746100Y-116039900D03* +X109246100Y-116039900D03* +X107746100Y-117195600D03* +X109246100Y-117195600D03* +X107758800Y-118351300D03* +X109258800Y-118351300D03* +D18* +X109054900Y-124321000D03* +X109054900Y-122821000D03* +D37* +X106094400Y-120650000D03* +X109094400Y-120650000D03* +D38* +X111340460Y-101910300D03* +X111340460Y-101260300D03* +X111340460Y-100610300D03* +X111340460Y-99960300D03* +X111340460Y-99310300D03* +D39* +X111340460Y-103110300D03* +X111340460Y-98110300D03* +D40* +X114040460Y-104110300D03* +X114040460Y-97110300D03* +D41* +X100965000Y-115620800D03* +X112588500Y-101955600D03* +X91328700Y-98298000D03* +X114645900Y-115150900D03* +X110670800Y-113271300D03* +X98008900Y-115062000D03* +X110248700Y-115646200D03* +X108054600Y-109296200D03* +X103261620Y-108000800D03* +X105123440Y-112872520D03* +X101886498Y-113662460D03* +X105283000Y-99631500D03* +X102108000Y-99631500D03* +X94488000Y-123698000D03* +X99822000Y-115887500D03* +X85623400Y-120980200D03* +X85572600Y-105791000D03* +X90805000Y-101757598D03* +X112464800Y-107982000D03* +X111623300Y-106781600D03* +X107462780Y-108071920D03* +X104455420Y-104861360D03* +X98918220Y-99969320D03* +X87691420Y-101833680D03* +X103342900Y-112852200D03* +X98542300Y-113715800D03* +X107020820Y-105272840D03* +X90376200Y-118778020D03* +X106304540Y-103946960D03* +X89202720Y-122577860D03* +X105524760Y-103398320D03* +X93401340Y-116707920D03* +X104518920Y-104061260D03* +X93508020Y-121406920D03* +X99685300Y-102095300D03* +X110061200Y-101574600D03* +X110200900Y-100622100D03* +X98580400Y-103251000D03* +X95580200Y-104190800D03* +X91871800Y-108635800D03* +X95529400Y-105079800D03* +X91389200Y-109677200D03* +X86871000Y-115087400D03* +X96599200Y-109143800D03* +X98577400Y-111785400D03* +X108051600Y-111683800D03* +X109474000Y-114960400D03* +X101295200Y-108102400D03* +X108940600Y-111506000D03* +X110820200Y-116408200D03* +X104397000Y-111544100D03* +X95697500Y-121462800D03* +X108407200Y-114884200D03* +X101727000Y-119888000D03* +X110378700Y-96428560D03* +X110134860Y-97434400D03* +X90500200Y-122605800D03* +X90474800Y-124256800D03* +X88976200Y-118872000D03* +X90449400Y-116586000D03* +X90678000Y-125095000D03* +X86918800Y-125120400D03* +X95583200Y-109347000D03* +X95380000Y-102717600D03* +D42* +X101523800Y-123684600D02* +X101842000Y-123684600D01* +X101842000Y-123684600D02* +X102222300Y-123304300D01* +D43* +X99060000Y-121170000D02* +X99060000Y-121412000D01* +X99060000Y-121412000D02* +X99568000Y-121920000D01* +X99568000Y-121920000D02* +X101473000Y-121920000D01* +X101473000Y-121920000D02* +X101854000Y-122301000D01* +X101854000Y-122301000D02* +X101854000Y-122936000D01* +X101854000Y-122936000D02* +X102222300Y-123304300D01* +X102222300Y-123304300D02* +X103378000Y-124460000D01* +D44* +X105918000Y-124460000D02* +X103378000Y-124460000D01* +D43* +X101523800Y-125184600D02* +X101842000Y-125184600D01* +X101842000Y-125184600D02* +X102489000Y-125831600D01* +X102489000Y-125831600D02* +X107137200Y-125831600D01* +X107137200Y-125831600D02* +X107518200Y-125450600D01* +X107518200Y-125450600D02* +X107518200Y-123266200D01* +X107518200Y-123266200D02* +X107111800Y-122859800D01* +X107111800Y-122859800D02* +X104317800Y-122859800D01* +X104317800Y-122859800D02* +X103378000Y-121920000D01* +X99060000Y-120066500D02* +X99135500Y-120066500D01* +X99135500Y-120066500D02* +X99822000Y-119380000D01* +X99822000Y-119380000D02* +X101346000Y-119380000D01* +X101346000Y-119380000D02* +X101981000Y-118745000D01* +X101981000Y-118745000D02* +X101981000Y-117221000D01* +X101981000Y-117221000D02* +X102362000Y-116840000D01* +X102362000Y-116840000D02* +X103378000Y-116840000D01* +D44* +X105918000Y-116840000D02* +X103378000Y-116840000D01* +D43* +X101803200Y-116039200D02* +X101383400Y-116039200D01* +X101383400Y-116039200D02* +X100965000Y-115620800D01* +D45* +X82753200Y-101053900D02* +X82816700Y-101053900D01* +X82816700Y-101053900D02* +X84895602Y-98974998D01* +X84895602Y-98974998D02* +X86360000Y-98974998D01* +X86360000Y-98974998D02* +X86360000Y-98945000D01* +D43* +X114303000Y-107936600D02* +X114303000Y-107645200D01* +X114303000Y-107645200D02* +X113464800Y-106807000D01* +D42* +X113464800Y-105765600D02* +X113464800Y-106807000D01* +X112530500Y-101910300D02* +X112677400Y-102057200D01* +X112677400Y-102057200D02* +X112677400Y-104978200D01* +X112677400Y-104978200D02* +X113464800Y-105765600D01* +D44* +X89535000Y-97259140D02* +X90289840Y-97259140D01* +D45* +X90289840Y-97259140D02* +X91328700Y-98298000D01* +D44* +X112543200Y-101910300D02* +X112530500Y-101910300D01* +X112588500Y-101955600D02* +X112543200Y-101910300D01* +D42* +X111340460Y-101910300D02* +X112530500Y-101910300D01* +D45* +X86360000Y-98945000D02* +X87849140Y-98945000D01* +X87849140Y-98945000D02* +X89535000Y-97259140D01* +X110670800Y-110286800D02* +X109563600Y-110286800D01* +X109563600Y-110286800D02* +X109538200Y-110312200D01* +X110670800Y-113271300D02* +X110670800Y-110286800D01* +X110670800Y-110286800D02* +X110670800Y-107763000D01* +X110670800Y-107763000D02* +X110664800Y-107757000D01* +D42* +X114645900Y-115150900D02* +X113364470Y-113869470D01* +X113364470Y-113869470D02* +X113364470Y-113780570D01* +D45* +X113364470Y-113780570D02* +X112448800Y-114696240D01* +D44* +X96721000Y-112649000D02* +X96721000Y-114231300D01* +X110664800Y-113265300D02* +X110664800Y-112912240D01* +X110670800Y-113271300D02* +X110664800Y-113265300D01* +X97551700Y-115062000D02* +X98008900Y-115062000D01* +X96721000Y-114231300D02* +X97551700Y-115062000D01* +D45* +X110664800Y-112912240D02* +X112448800Y-114696240D01* +D43* +X96721000Y-112649000D02* +X96721000Y-110797000D01* +X98031000Y-106540000D02* +X97020000Y-106540000D01* +X98171000Y-106680000D02* +X98031000Y-106540000D01* +X98171000Y-109347000D02* +X98171000Y-106680000D01* +X96721000Y-110797000D02* +X98171000Y-109347000D01* +X97020000Y-106540000D02* +X95961500Y-106540000D01* +X95961500Y-106540000D02* +X95059500Y-107442000D01* +X95059500Y-107442000D02* +X95059500Y-107557000D01* +D44* +X107758800Y-118351300D02* +X107758800Y-117208300D01* +X107758800Y-117208300D02* +X107746100Y-117195600D01* +X107758800Y-118351300D02* +X107758800Y-116052600D01* +X107758800Y-116052600D02* +X107746100Y-116039900D01* +D43* +X107758800Y-118351300D02* +X105829100Y-118351300D01* +X108204000Y-123710700D02* +X108814300Y-124321000D01* +X108204000Y-123139200D02* +X108204000Y-123710700D01* +X107467400Y-122402600D02* +X108204000Y-123139200D01* +X105174202Y-122402600D02* +X107467400Y-122402600D01* +X104952800Y-122181198D02* +X105174202Y-122402600D01* +X104952800Y-119227600D02* +X104952800Y-122181198D01* +X105829100Y-118351300D02* +X104952800Y-119227600D01* +X108814300Y-124321000D02* +X109054900Y-124321000D01* +D44* +X107746100Y-116039900D02* +X107746100Y-118338600D01* +X107746100Y-118338600D02* +X107758800Y-118351300D01* +D43* +X105676000Y-114300000D02* +X106006200Y-114300000D01* +X106006200Y-114300000D02* +X107746100Y-116039900D01* +X105676000Y-114300000D02* +X105689400Y-114300000D01* +D42* +X99621000Y-112649000D02* +X102604000Y-112649000D01* +X102604000Y-112649000D02* +X102362000Y-112649000D01* +X104521000Y-114351500D02* +X103239000Y-114351500D01* +X102604000Y-113716500D02* +X102604000Y-111760000D01* +X103239000Y-114351500D02* +X102604000Y-113716500D01* +D43* +X102604000Y-111760000D02* +X102604000Y-111454500D01* +X102604000Y-111454500D02* +X102870000Y-111188500D01* +X102870000Y-111188500D02* +X102870000Y-109990000D01* +X102362000Y-112649000D02* +X102604000Y-112407000D01* +X102604000Y-112407000D02* +X102604000Y-111760000D01* +D44* +X104521000Y-114351500D02* +X105624500Y-114351500D01* +X105624500Y-114351500D02* +X105676000Y-114300000D01* +D43* +X94592600Y-114048200D02* +X94592600Y-114670600D01* +X94592600Y-114670600D02* +X95238000Y-115316000D01* +D44* +X97213400Y-120675400D02* +X95973900Y-120675400D01* +X95238000Y-119939500D02* +X95238000Y-115316000D01* +X95973900Y-120675400D02* +X95238000Y-119939500D01* +D43* +X109054900Y-122821000D02* +X110082900Y-122821000D01* +X112486900Y-123075700D02* +X113795000Y-121767600D01* +X110337600Y-123075700D02* +X112486900Y-123075700D01* +X110082900Y-122821000D02* +X110337600Y-123075700D01* +D44* +X106094400Y-120650000D02* +X106997500Y-120650000D01* +X106997500Y-120650000D02* +X107810300Y-121462800D01* +X107810300Y-121462800D02* +X107810300Y-121615200D01* +X107988100Y-119519700D02* +X107988100Y-119659400D01* +X107988100Y-119659400D02* +X106997500Y-120650000D01* +X109246100Y-117195600D02* +X109246100Y-116039900D01* +X109258800Y-118351300D02* +X109258800Y-117208300D01* +X109258800Y-117208300D02* +X109246100Y-117195600D01* +X109246100Y-116039900D02* +X109246100Y-118338600D01* +X109246100Y-118338600D02* +X109258800Y-118351300D01* +D43* +X109054900Y-122821000D02* +X109016100Y-122821000D01* +X109016100Y-122821000D02* +X107810300Y-121615200D01* +X107810300Y-121615200D02* +X106845100Y-120650000D01* +X106845100Y-120650000D02* +X106094400Y-120650000D01* +X106094400Y-120650000D02* +X106997500Y-120650000D01* +X107988100Y-119519700D02* +X109156500Y-118351300D01* +X106997500Y-120650000D02* +X107988100Y-119659400D01* +X109156500Y-118351300D02* +X109258800Y-118351300D01* +D44* +X109246100Y-118338600D02* +X109258800Y-118351300D01* +D43* +X109246100Y-116039900D02* +X109855000Y-116039900D01* +X109855000Y-116039900D02* +X110248700Y-115646200D01* +X108720000Y-102540000D02* +X107823200Y-102540000D01* +X102108000Y-99720400D02* +X102108000Y-99631500D01* +X104241600Y-101854000D02* +X102108000Y-99720400D01* +X107137200Y-101854000D02* +X104241600Y-101854000D01* +X107823200Y-102540000D02* +X107137200Y-101854000D01* +D44* +X93738000Y-115316000D02* +X92468000Y-115316000D01* +X92468000Y-115316000D02* +X92456000Y-115304000D01* +D43* +X110664800Y-105857000D02* +X110664800Y-104746600D01* +X109779000Y-102540000D02* +X108720000Y-102540000D01* +X110159800Y-102920800D02* +X109779000Y-102540000D01* +X110159800Y-104241600D02* +X110159800Y-102920800D01* +X110664800Y-104746600D02* +X110159800Y-104241600D01* +X114303000Y-109436600D02* +X113309160Y-109436600D01* +X113309160Y-109436600D02* +X112448800Y-110296960D01* +X107914200Y-110286800D02* +X107914200Y-109436600D01* +X107914200Y-109436600D02* +X108054600Y-109296200D01* +D42* +X89535000Y-100860860D02* +X89870740Y-100860860D01* +X89870740Y-100860860D02* +X91087400Y-99644200D01* +X96679600Y-98526600D02* +X97089000Y-98936000D01* +X96446800Y-98526600D02* +X96679600Y-98526600D01* +X95659400Y-97739200D02* +X96446800Y-98526600D01* +X94618000Y-97739200D02* +X95659400Y-97739200D01* +X92713000Y-99644200D02* +X94618000Y-97739200D01* +X91087400Y-99644200D02* +X92713000Y-99644200D01* +D43* +X108140500Y-98488500D02* +X107950000Y-98488500D01* +X107950000Y-98488500D02* +X107632500Y-98171000D01* +X108140500Y-98488500D02* +X108140500Y-98107500D01* +X109410500Y-97028000D02* +X109410500Y-96456500D01* +X109156500Y-97282000D02* +X109410500Y-97028000D01* +X108966000Y-97282000D02* +X109156500Y-97282000D01* +X108140500Y-98107500D02* +X108966000Y-97282000D01* +X107632500Y-98171000D02* +X107632500Y-97155000D01* +X107632500Y-97155000D02* +X107442000Y-96964500D01* +X107442000Y-96964500D02* +X105600500Y-96964500D01* +X105600500Y-96964500D02* +X105270000Y-97295000D01* +D44* +X102507240Y-108000800D02* +X103261620Y-108000800D01* +X99822000Y-115887500D02* +X99822000Y-115547600D01* +X101707140Y-113662460D02* +X101886498Y-113662460D01* +X99822000Y-115547600D02* +X101707140Y-113662460D01* +X105123440Y-112872520D02* +X105123440Y-112851500D01* +X105123440Y-112851500D02* +X105123440Y-112872520D01* +X105123440Y-112872520D02* +X105123440Y-112851500D01* +X97020000Y-105740000D02* +X100182940Y-105740000D01* +X102443740Y-108000800D02* +X102507240Y-108000800D01* +X100182940Y-105740000D02* +X102443740Y-108000800D01* +X102070000Y-109990000D02* +X102070000Y-108438040D01* +X102070000Y-108438040D02* +X102507240Y-108000800D01* +D43* +X95059500Y-106057000D02* +X95695200Y-106057000D01* +X96012200Y-105740000D02* +X97020000Y-105740000D01* +X95695200Y-106057000D02* +X96012200Y-105740000D01* +D42* +X105270000Y-98290000D02* +X105270000Y-99618500D01* +X105270000Y-99618500D02* +X105283000Y-99631500D01* +X102070000Y-99593500D02* +X102070000Y-98290000D01* +X102108000Y-99631500D02* +X102070000Y-99593500D01* +D44* +X93738000Y-120003000D02* +X93801500Y-120003000D01* +X93738000Y-115836000D02* +X93738000Y-115316000D01* +X94402998Y-116500998D02* +X93738000Y-115836000D01* +X94402998Y-119401502D02* +X94402998Y-116500998D01* +X93801500Y-120003000D02* +X94402998Y-119401502D01* +D43* +X105270000Y-97295000D02* +X105270000Y-98290000D01* +X101104000Y-111760000D02* +X101219000Y-111760000D01* +X101219000Y-111760000D02* +X102070000Y-110909000D01* +X102070000Y-110909000D02* +X102070000Y-109990000D01* +X95059500Y-106057000D02* +X95059500Y-105918000D01* +D44* +X104521000Y-112851500D02* +X105123440Y-112851500D01* +X105123440Y-112851500D02* +X105624500Y-112851500D01* +X105624500Y-112851500D02* +X105676000Y-112903000D01* +X100318000Y-116840000D02* +X100318000Y-116193000D01* +X94488000Y-123698000D02* +X94361000Y-123698000D01* +X100318000Y-116193000D02* +X99822000Y-115887500D01* +X100318000Y-124079000D02* +X100318000Y-124726000D01* +X94361000Y-120626000D02* +X93738000Y-120003000D01* +X94361000Y-123698000D02* +X94361000Y-120626000D01* +X96012000Y-125349000D02* +X94361000Y-123698000D01* +X99695000Y-125349000D02* +X96012000Y-125349000D01* +X100318000Y-124726000D02* +X99695000Y-125349000D01* +X91813400Y-120675400D02* +X93065600Y-120675400D01* +X93065600Y-120675400D02* +X93738000Y-120003000D01* +D43* +X85332000Y-104546400D02* +X85332000Y-105550400D01* +X85623400Y-120980200D02* +X85623400Y-120954800D01* +X85332000Y-105550400D02* +X85572600Y-105791000D01* +X91813400Y-120675400D02* +X89738200Y-120675400D01* +X89712800Y-120700800D02* +X89712800Y-120726200D01* +X89738200Y-120675400D02* +X89712800Y-120700800D01* +X88366600Y-120954800D02* +X89484200Y-120954800D01* +X90195400Y-120243600D02* +X90195400Y-119710200D01* +X89484200Y-120954800D02* +X89712800Y-120726200D01* +X89712800Y-120726200D02* +X90195400Y-120243600D01* +X88925400Y-121742200D02* +X88925400Y-121513600D01* +X88925400Y-121513600D02* +X88366600Y-120954800D01* +X88366600Y-120954800D02* +X85623400Y-120954800D01* +X86233000Y-123367800D02* +X85623400Y-122758200D01* +X85979000Y-118338600D02* +X85979000Y-117971000D01* +X85623400Y-118694200D02* +X85979000Y-118338600D01* +X85623400Y-122758200D02* +X85623400Y-120954800D01* +X85623400Y-120954800D02* +X85623400Y-118694200D01* +X86233000Y-123583000D02* +X86233000Y-123367800D01* +D45* +X86360000Y-100445000D02* +X89119140Y-100445000D01* +X89119140Y-100445000D02* +X89535000Y-100860860D01* +D44* +X92456000Y-115304000D02* +X91428000Y-115304000D01* +X90424000Y-115062000D02* +X87670000Y-112308000D01* +X91186000Y-115062000D02* +X90424000Y-115062000D01* +X91428000Y-115304000D02* +X91186000Y-115062000D01* +X87670000Y-112308000D02* +X87670000Y-111760000D01* +D45* +X89535000Y-100860860D02* +X89908262Y-100860860D01* +X89908262Y-100860860D02* +X90805000Y-101757598D01* +D44* +X112448800Y-110296960D02* +X112448800Y-107641000D01* +X112448800Y-107641000D02* +X111623300Y-106815500D01* +D45* +X112464800Y-107982000D02* +X112448800Y-107982000D01* +X112448800Y-107982000D02* +X112448800Y-110296960D01* +D44* +X111623300Y-106781600D02* +X111623300Y-106815500D01* +X111606350Y-106798550D02* +X111623300Y-106781600D01* +X111623300Y-106781600D02* +X111606350Y-106798550D01* +X111623300Y-106815500D02* +X110664800Y-105857000D01* +X113795000Y-121767600D02* +X113795000Y-121386600D01* +D43* +X113795000Y-121084800D02* +X113795000Y-121767600D01* +X113795000Y-121767600D02* +X113795000Y-121666000D01* +D42* +X113795000Y-121767600D02* +X113795000Y-121742200D01* +D43* +X82423000Y-118098000D02* +X80583800Y-118098000D01* +X80583800Y-118098000D02* +X80444800Y-118237000D01* +X82423000Y-116598000D02* +X81345800Y-116598000D01* +X81345800Y-116598000D02* +X80444800Y-115697000D01* +X83286600Y-117041800D02* +X83286600Y-119596600D01* +X82842800Y-116598000D02* +X83286600Y-117041800D01* +X82423000Y-116598000D02* +X82842800Y-116598000D01* +X83286600Y-119596600D02* +X83324000Y-119634000D01* +X82181000Y-116840000D02* +X82423000Y-116598000D01* +X82550000Y-124956000D02* +X82083800Y-124956000D01* +X82083800Y-124956000D02* +X80444800Y-123317000D01* +X83324000Y-121920000D02* +X81587800Y-121920000D01* +X81587800Y-121920000D02* +X80444800Y-120777000D01* +X83324000Y-121920000D02* +X83324000Y-122682000D01* +X83324000Y-122682000D02* +X82550000Y-123456000D01* +D45* +X93703600Y-106318860D02* +X93342460Y-106680000D01* +X93703600Y-104853400D02* +X93703600Y-106318860D01* +D43* +X90604800Y-106807000D02* +X90757200Y-106807000D01* +X90757200Y-106807000D02* +X92179600Y-105384600D01* +X92179600Y-105384600D02* +X92179600Y-103124000D01* +X92179600Y-103124000D02* +X91824000Y-102768400D01* +X91824000Y-102768400D02* +X85509800Y-102768400D01* +X85509800Y-102768400D02* +X85332000Y-102946200D01* +X90170000Y-106680000D02* +X90170000Y-106172000D01* +X85471000Y-102946200D02* +X85332000Y-102946200D01* +D45* +X92456000Y-113804000D02* +X90944000Y-113804000D01* +X90170000Y-113030000D02* +X90170000Y-111760000D01* +X90944000Y-113804000D02* +X90170000Y-113030000D01* +D44* +X96139000Y-96136000D02* +X93726460Y-96136000D01* +X93726460Y-96136000D02* +X93342460Y-96520000D01* +X83832000Y-104546400D02* +X83832000Y-102946200D01* +D43* +X83832000Y-102946200D02* +X83832000Y-102482540D01* +X107530860Y-108140000D02* +X108720000Y-108140000D01* +X107462780Y-108071920D02* +X107530860Y-108140000D01* +X103810260Y-104861360D02* +X104455420Y-104861360D01* +X98918220Y-99969320D02* +X103810260Y-104861360D01* +X84480860Y-101833680D02* +X87691420Y-101833680D01* +X83832000Y-102482540D02* +X84480860Y-101833680D01* +X98818000Y-116840000D02* +X98818000Y-114740800D01* +X103673100Y-112522000D02* +X103673100Y-109993100D01* +X103342900Y-112852200D02* +X103673100Y-112522000D01* +X98288300Y-113969800D02* +X98542300Y-113715800D01* +X98288300Y-114211100D02* +X98288300Y-113969800D01* +X98818000Y-114740800D02* +X98288300Y-114211100D01* +X103673100Y-109993100D02* +X103670000Y-109990000D01* +D42* +X103670000Y-109990000D02* +X103670000Y-108610500D01* +X103670000Y-108610500D02* +X104940500Y-107340000D01* +X104940500Y-107340000D02* +X108720000Y-107340000D01* +X103695500Y-110015500D02* +X103670000Y-109990000D01* +X98818000Y-116840000D02* +X97238800Y-116840000D01* +X97238800Y-116840000D02* +X97213400Y-116865400D01* +D44* +X97213400Y-118135400D02* +X97213400Y-116865400D01* +D43* +X89560400Y-119710200D02* +X89560400Y-119311880D01* +X107422140Y-105674160D02* +X108654160Y-105674160D01* +X107020820Y-105272840D02* +X107422140Y-105674160D01* +X90094260Y-118778020D02* +X90376200Y-118778020D01* +X89560400Y-119311880D02* +X90094260Y-118778020D01* +X108654160Y-105674160D02* +X108720000Y-105740000D01* +X89560400Y-121742200D02* +X89560400Y-122220180D01* +X107645660Y-104902000D02* +X108682000Y-104902000D01* +X107361180Y-104617520D02* +X107645660Y-104902000D01* +X106975100Y-104617520D02* +X107361180Y-104617520D01* +X106304540Y-103946960D02* +X106975100Y-104617520D01* +X89560400Y-122220180D02* +X89202720Y-122577860D01* +X108682000Y-104902000D02* +X108720000Y-104940000D01* +X91813400Y-119405400D02* +X92613940Y-119405400D01* +X107432300Y-104140000D02* +X108720000Y-104140000D01* +X107307840Y-104015540D02* +X107432300Y-104140000D01* +X107307840Y-103489760D02* +X107307840Y-104015540D01* +X106952240Y-103134160D02* +X107307840Y-103489760D01* +X105788920Y-103134160D02* +X106952240Y-103134160D01* +X105524760Y-103398320D02* +X105788920Y-103134160D01* +X93401340Y-118618000D02* +X93401340Y-116707920D01* +X92613940Y-119405400D02* +X93401340Y-118618000D01* +D42* +X91813400Y-119405400D02* +X92557600Y-119405400D01* +D43* +X91813400Y-121945400D02* +X92969540Y-121945400D01* +X107742180Y-103220520D02* +X108600520Y-103220520D01* +X107122420Y-102600760D02* +X107742180Y-103220520D01* +X105204720Y-102600760D02* +X107122420Y-102600760D01* +X104882140Y-102923340D02* +X105204720Y-102600760D01* +X104882140Y-103698040D02* +X104882140Y-102923340D01* +X104518920Y-104061260D02* +X104882140Y-103698040D01* +X92969540Y-121945400D02* +X93508020Y-121406920D01* +X108600520Y-103220520D02* +X108720000Y-103340000D01* +D42* +X108694500Y-103314500D02* +X108720000Y-103340000D01* +X104470000Y-98290000D02* +X104470000Y-99898000D01* +X106425500Y-100140000D02* +X108720000Y-100140000D01* +X106172000Y-100393500D02* +X106425500Y-100140000D01* +X104965500Y-100393500D02* +X106172000Y-100393500D01* +X104470000Y-99898000D02* +X104965500Y-100393500D01* +D43* +X109410500Y-98488500D02* +X109410500Y-98806000D01* +X107767000Y-99187000D02* +X106870000Y-98290000D01* +X109029500Y-99187000D02* +X107767000Y-99187000D01* +X109410500Y-98806000D02* +X109029500Y-99187000D01* +X108140500Y-96456500D02* +X103568500Y-96456500D01* +X102870000Y-97155000D02* +X102870000Y-98290000D01* +X103568500Y-96456500D02* +X102870000Y-97155000D01* +D44* +X95189000Y-98936000D02* +X95189000Y-100142000D01* +X95987000Y-100940000D02* +X97020000Y-100940000D01* +X95189000Y-100142000D02* +X95987000Y-100940000D01* +D42* +X111340460Y-101260300D02* +X110540600Y-101260300D01* +X99240600Y-102540000D02* +X97020000Y-102540000D01* +X99685300Y-102095300D02* +X99240600Y-102540000D01* +X110226300Y-101574600D02* +X110061200Y-101574600D01* +X110540600Y-101260300D02* +X110226300Y-101574600D01* +X110212700Y-100610300D02* +X111340460Y-100610300D01* +X110200900Y-100622100D02* +X110212700Y-100610300D01* +X98491400Y-103340000D02* +X98580400Y-103251000D01* +X97020000Y-103340000D02* +X98491400Y-103340000D01* +D43* +X84328000Y-107430000D02* +X86170200Y-107430000D01* +X95631000Y-104140000D02* +X97020000Y-104140000D01* +X95580200Y-104190800D02* +X95631000Y-104140000D01* +X87376000Y-108635800D02* +X91871800Y-108635800D01* +X86170200Y-107430000D02* +X87376000Y-108635800D01* +X84328000Y-109970000D02* +X91096400Y-109970000D01* +X95669200Y-104940000D02* +X97020000Y-104940000D01* +X95529400Y-105079800D02* +X95669200Y-104940000D01* +X91096400Y-109970000D02* +X91389200Y-109677200D01* +X95964600Y-107340000D02* +X97020000Y-107340000D01* +X95862600Y-107442000D02* +X95964600Y-107340000D01* +X95862600Y-108153200D02* +X95862600Y-107442000D01* +X95634000Y-108381800D02* +X95862600Y-108153200D01* +X93576600Y-108381800D02* +X95634000Y-108381800D01* +X91392200Y-110566200D02* +X93576600Y-108381800D01* +X86540800Y-110566200D02* +X91392200Y-110566200D01* +X84597000Y-112510000D02* +X86540800Y-110566200D01* +X84328000Y-112510000D02* +X84597000Y-112510000D01* +X84328000Y-112510000D02* +X84328000Y-112452002D01* +X86833600Y-115050000D02* +X84328000Y-115050000D01* +X86871000Y-115087400D02* +X86833600Y-115050000D01* +X97020000Y-108723000D02* +X96599200Y-109143800D01* +X97020000Y-108140000D02* +X97020000Y-108723000D01* +X98164398Y-109990000D02* +X98870000Y-109990000D01* +X97739200Y-110415198D02* +X98164398Y-109990000D01* +X97739200Y-111277400D02* +X97739200Y-110415198D01* +X98298000Y-111836200D02* +X97739200Y-111277400D01* +X98526600Y-111836200D02* +X98298000Y-111836200D01* +X98577400Y-111785400D02* +X98526600Y-111836200D01* +X108839000Y-112471200D02* +X108051600Y-111683800D01* +X108839000Y-114325400D02* +X108839000Y-112471200D01* +X109474000Y-114960400D02* +X108839000Y-114325400D01* +X111255000Y-121767600D02* +X110769400Y-121767600D01* +X99670000Y-108686200D02* +X99670000Y-109990000D01* +X100126800Y-108229400D02* +X99670000Y-108686200D01* +X101168200Y-108229400D02* +X100126800Y-108229400D01* +X101295200Y-108102400D02* +X101168200Y-108229400D01* +X109499400Y-112064800D02* +X108940600Y-111506000D01* +X109499400Y-113893600D02* +X109499400Y-112064800D01* +X111150400Y-115544600D02* +X109499400Y-113893600D01* +X111150400Y-116078000D02* +X111150400Y-115544600D01* +X110820200Y-116408200D02* +X111150400Y-116078000D01* +X97213400Y-123215400D02* +X96281700Y-123215400D01* +X105270000Y-110899700D02* +X105270000Y-109990000D01* +X104841500Y-111328200D02* +X105270000Y-110899700D01* +X104612900Y-111328200D02* +X104841500Y-111328200D01* +X104397000Y-111544100D02* +X104612900Y-111328200D01* +X95697500Y-122631200D02* +X95697500Y-121462800D01* +X96281700Y-123215400D02* +X95697500Y-122631200D01* +D42* +X105283000Y-110003000D02* +X105270000Y-109990000D01* +X96997500Y-122999500D02* +X97213400Y-123215400D01* +D44* +X97213400Y-124485400D02* +X98411600Y-124485400D01* +X98411600Y-124485400D02* +X98818000Y-124079000D01* +X97213400Y-123215400D02* +X97213400Y-124485400D01* +D43* +X100647500Y-120066500D02* +X101548500Y-120066500D01* +X108102400Y-114300000D02* +X107176000Y-114300000D01* +X108381800Y-114579400D02* +X108102400Y-114300000D01* +X108381800Y-114858800D02* +X108381800Y-114579400D01* +X108407200Y-114884200D02* +X108381800Y-114858800D01* +X101548500Y-120066500D02* +X101727000Y-119888000D01* +D42* +X107176000Y-112903000D02* +X107176000Y-110296000D01* +X107176000Y-110296000D02* +X106870000Y-109990000D01* +D44* +X107176000Y-112903000D02* +X107176000Y-114300000D01* +X100647500Y-121170000D02* +X100647500Y-120066500D01* +D43* +X82550000Y-115050000D02* +X82337800Y-115050000D01* +X82337800Y-115050000D02* +X80444800Y-113157000D01* +X82550000Y-115050000D02* +X82182400Y-115050000D01* +X82550000Y-112510000D02* +X82337800Y-112510000D01* +X82337800Y-112510000D02* +X80444800Y-110617000D01* +X82550000Y-112510000D02* +X82385600Y-112510000D01* +X82550000Y-109970000D02* +X82337800Y-109970000D01* +X82337800Y-109970000D02* +X80444800Y-108077000D01* +X82550000Y-109970000D02* +X82309400Y-109970000D01* +X82550000Y-107430000D02* +X82337800Y-107430000D01* +X82337800Y-107430000D02* +X80444800Y-105537000D01* +X108775500Y-96096280D02* +X108775500Y-96456500D01* +X109083300Y-95788480D02* +X108775500Y-96096280D01* +X109784340Y-95788480D02* +X109083300Y-95788480D01* +X109982460Y-95986600D02* +X109784340Y-95788480D01* +X109982460Y-96032320D02* +X109982460Y-95986600D01* +X110378700Y-96428560D02* +X109982460Y-96032320D01* +X108775500Y-98108898D02* +X108775500Y-98488500D01* +X109129958Y-97754440D02* +X108775500Y-98108898D01* +X109814820Y-97754440D02* +X109129958Y-97754440D01* +X110134860Y-97434400D02* +X109814820Y-97754440D01* +D44* +X99060000Y-122670000D02* +X100647500Y-122670000D01* +X97213400Y-121945400D02* +X98335400Y-121945400D01* +X98335400Y-121945400D02* +X99060000Y-122670000D01* +X97213400Y-119405400D02* +X98221100Y-119405400D01* +X98221100Y-119405400D02* +X99060000Y-118566500D01* +X100647500Y-118566500D02* +X99060000Y-118566500D01* +D43* +X82550000Y-105930000D02* +X84328000Y-105930000D01* +X82550000Y-108470000D02* +X84328000Y-108470000D01* +X82550000Y-111010000D02* +X84328000Y-111010000D01* +X82550000Y-113550000D02* +X84328000Y-113550000D01* +X89395300Y-123570300D02* +X90475500Y-123570300D01* +X90830400Y-123215400D02* +X91813400Y-123215400D01* +X90475500Y-123570300D02* +X90830400Y-123215400D01* +X87871300Y-123570300D02* +X87871300Y-121920700D01* +X87871300Y-121920700D02* +X87872000Y-121920000D01* +X87871300Y-123570300D02* +X89395300Y-123570300D01* +X89395300Y-125070300D02* +X89661300Y-125070300D01* +X89661300Y-125070300D02* +X90474800Y-124256800D01* +X90220800Y-122326400D02* +X90220800Y-121767600D01* +X90500200Y-122605800D02* +X90220800Y-122326400D01* +X90220800Y-121767600D02* +X90195400Y-121742200D01* +X87871300Y-125070300D02* +X89395300Y-125070300D01* +X91813400Y-118135400D02* +X90271600Y-118135400D01* +X90107200Y-117971000D02* +X89281000Y-117971000D01* +X90271600Y-118135400D02* +X90107200Y-117971000D01* +X87872000Y-119634000D02* +X87872000Y-118213000D01* +X87872000Y-118213000D02* +X87630000Y-117971000D01* +X87630000Y-117971000D02* +X89281000Y-117971000D01* +X89281000Y-116471000D02* +X90334400Y-116471000D01* +X88925400Y-118922800D02* +X88925400Y-119710200D01* +X88976200Y-118872000D02* +X88925400Y-118922800D01* +X90334400Y-116471000D02* +X90449400Y-116586000D01* +X87630000Y-116471000D02* +X89281000Y-116471000D01* +X85979000Y-116471000D02* +X86195600Y-116471000D01* +X86195600Y-116471000D02* +X86817200Y-115849400D01* +X90805000Y-115849400D02* +X91813400Y-116857800D01* +X86817200Y-115849400D02* +X90805000Y-115849400D01* +X91813400Y-116857800D02* +X91813400Y-116865400D01* +X85979000Y-116471000D02* +X86067200Y-116471000D01* +X86067200Y-116471000D02* +X86791800Y-117195600D01* +X86372000Y-119012400D02* +X86372000Y-119634000D01* +X86512400Y-118872000D02* +X86372000Y-119012400D01* +X86537800Y-118872000D02* +X86512400Y-118872000D01* +X86791800Y-118618000D02* +X86537800Y-118872000D01* +X86791800Y-117195600D02* +X86791800Y-118618000D01* +X84455000Y-116471000D02* +X85979000Y-116471000D01* +X86233000Y-125083000D02* +X86881400Y-125083000D01* +X91305400Y-124993400D02* +X91813400Y-124485400D01* +X90779600Y-124993400D02* +X91305400Y-124993400D01* +X90678000Y-125095000D02* +X90779600Y-124993400D01* +X86881400Y-125083000D02* +X86918800Y-125120400D01* +X86372000Y-121920000D02* +X86372000Y-122516200D01* +X86233000Y-124815600D02* +X86233000Y-125083000D01* +X86436200Y-124612400D02* +X86233000Y-124815600D01* +X86614000Y-124612400D02* +X86436200Y-124612400D01* +X87045800Y-124180600D02* +X86791800Y-124434600D01* +X86791800Y-124434600D02* +X86614000Y-124612400D01* +X87045800Y-123190000D02* +X87045800Y-124180600D01* +X86372000Y-122516200D02* +X87045800Y-123190000D01* +X84709000Y-125083000D02* +X86233000Y-125083000D01* +X84824000Y-119634000D02* +X84824000Y-119037800D01* +X84455000Y-118668800D02* +X84455000Y-117971000D01* +X84824000Y-119037800D02* +X84455000Y-118668800D01* +X84824000Y-121920000D02* +X84824000Y-123468000D01* +X84824000Y-123468000D02* +X84709000Y-123583000D01* +D44* +X94846600Y-110894200D02* +X94592600Y-111148200D01* +X94846600Y-110083600D02* +X94846600Y-110894200D01* +X95583200Y-109347000D02* +X94846600Y-110083600D01* +X94615800Y-101953400D02* +X95380000Y-102717600D01* +X93703600Y-101953400D02* +X94615800Y-101953400D01* +X94592600Y-111196002D02* +X94592600Y-111148200D01* +X114040460Y-104110300D02* +X114040460Y-105125060D01* +X115455700Y-120230900D02* +X109513500Y-120230900D01* +X115798600Y-119888000D02* +X115455700Y-120230900D01* +X115798600Y-106883200D02* +X115798600Y-119888000D01* +X114040460Y-105125060D02* +X115798600Y-106883200D01* +X109513500Y-120230900D02* +X109094400Y-120650000D01* +D43* +X114705100Y-104110300D02* +X114040460Y-104110300D01* +D44* +X114040460Y-104110300D02* +X114040460Y-97110300D01* +X111340460Y-98110300D02* +X113040460Y-98110300D01* +X113040460Y-98110300D02* +X114040460Y-97110300D01* +D42* +X111340460Y-99310300D02* +X111340460Y-98110300D01* +M02* diff --git a/PCB/OUTPUT_V5/Tinylab_proto1-F.Mask.gbr b/PCB/OUTPUT_V5/Tinylab_proto1-F.Mask.gbr new file mode 100644 index 00000000..36c5d220 --- /dev/null +++ b/PCB/OUTPUT_V5/Tinylab_proto1-F.Mask.gbr @@ -0,0 +1,320 @@ +G04 #@! TF.FileFunction,Soldermask,Top* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW 4.0.1-stable) date 07/06/2016 1:51:26 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,1.727200X1.727200*% +%ADD12O,1.727200X1.727200*% +%ADD13R,2.032000X2.032000*% +%ADD14O,2.032000X2.032000*% +%ADD15R,1.600000X0.560000*% +%ADD16R,0.560000X1.600000*% +%ADD17R,1.600200X2.999740*% +%ADD18R,0.750000X0.800000*% +%ADD19R,0.800000X0.750000*% +%ADD20C,1.300000*% +%ADD21R,1.300000X1.300000*% +%ADD22C,1.998980*% +%ADD23R,1.998980X1.998980*% +%ADD24R,1.905000X1.905000*% +%ADD25C,1.905000*% +%ADD26R,0.900000X2.500000*% +%ADD27R,2.500000X0.900000*% +%ADD28R,2.032000X1.727200*% +%ADD29O,2.032000X1.727200*% +%ADD30R,0.600000X0.900000*% +%ADD31R,0.900000X0.500000*% +%ADD32R,0.500000X0.900000*% +%ADD33R,0.900000X0.600000*% +%ADD34R,1.500000X0.600000*% +%ADD35R,0.304800X0.508000*% +%ADD36R,1.600200X2.600960*% +%ADD37R,1.000000X2.500000*% +%ADD38R,1.350000X0.400000*% +%ADD39O,0.950000X1.400000*% +%ADD40O,1.550000X1.200000*% +G04 APERTURE END LIST* +D10* +D11* +X113795000Y-124307600D03* +D12* +X111255000Y-124307600D03* +X113795000Y-121767600D03* +X111255000Y-121767600D03* +D13* +X103378000Y-119380000D03* +D14* +X103378000Y-121920000D03* +D15* +X108720000Y-108140000D03* +X108720000Y-107340000D03* +X108720000Y-106540000D03* +X108720000Y-105740000D03* +X108720000Y-104940000D03* +X108720000Y-104140000D03* +X108720000Y-103340000D03* +X108720000Y-102540000D03* +X108720000Y-101740000D03* +X108720000Y-100940000D03* +X108720000Y-100140000D03* +D16* +X106870000Y-98290000D03* +X106070000Y-98290000D03* +X105270000Y-98290000D03* +X104470000Y-98290000D03* +X103670000Y-98290000D03* +X102870000Y-98290000D03* +X102070000Y-98290000D03* +X101270000Y-98290000D03* +X100470000Y-98290000D03* +X99670000Y-98290000D03* +X98870000Y-98290000D03* +D15* +X97020000Y-100140000D03* +X97020000Y-100940000D03* +X97020000Y-101740000D03* +X97020000Y-102540000D03* +X97020000Y-103340000D03* +X97020000Y-104140000D03* +X97020000Y-104940000D03* +X97020000Y-105740000D03* +X97020000Y-106540000D03* +X97020000Y-107340000D03* +X97020000Y-108140000D03* +D16* +X98870000Y-109990000D03* +X99670000Y-109990000D03* +X100470000Y-109990000D03* +X101270000Y-109990000D03* +X102070000Y-109990000D03* +X102870000Y-109990000D03* +X103670000Y-109990000D03* +X104470000Y-109990000D03* +X105270000Y-109990000D03* +X106070000Y-109990000D03* +X106870000Y-109990000D03* +D17* +X112448800Y-114696240D03* +X112448800Y-110296960D03* +D13* +X113706100Y-118224300D03* +D14* +X111166100Y-118224300D03* +D18* +X101523800Y-123684600D03* +X101523800Y-125184600D03* +X101803200Y-117539200D03* +X101803200Y-116039200D03* +X114303000Y-107936600D03* +X114303000Y-109436600D03* +D19* +X109538200Y-110312200D03* +X108038200Y-110312200D03* +D18* +X104521000Y-114351500D03* +X104521000Y-112851500D03* +D19* +X95238000Y-115316000D03* +X93738000Y-115316000D03* +X102604000Y-111760000D03* +X101104000Y-111760000D03* +D18* +X86360000Y-98945000D03* +X86360000Y-100445000D03* +X95059500Y-107557000D03* +X95059500Y-106057000D03* +X82423000Y-118098000D03* +X82423000Y-116598000D03* +X82550000Y-124956000D03* +X82550000Y-123456000D03* +D20* +X87670000Y-111760000D03* +D21* +X90170000Y-111760000D03* +D18* +X92456000Y-113804000D03* +X92456000Y-115304000D03* +D22* +X93342460Y-96520000D03* +D23* +X93342460Y-106680000D03* +D24* +X82753200Y-95973900D03* +D25* +X82753200Y-101053900D03* +D26* +X96721000Y-112649000D03* +X99621000Y-112649000D03* +D27* +X94592600Y-114048200D03* +X94592600Y-111148200D03* +D13* +X105918000Y-124460000D03* +D14* +X103378000Y-124460000D03* +D28* +X80444800Y-113157000D03* +D29* +X80444800Y-110617000D03* +X80444800Y-108077000D03* +X80444800Y-105537000D03* +D13* +X105918000Y-116840000D03* +D14* +X103378000Y-116840000D03* +D28* +X80444800Y-115697000D03* +D29* +X80444800Y-118237000D03* +X80444800Y-120777000D03* +X80444800Y-123317000D03* +D30* +X96139000Y-96136000D03* +X97089000Y-98936000D03* +X95189000Y-98936000D03* +D31* +X99060000Y-122670000D03* +X99060000Y-121170000D03* +X99060000Y-118566500D03* +X99060000Y-120066500D03* +X100647500Y-122670000D03* +X100647500Y-121170000D03* +X100647500Y-120066500D03* +X100647500Y-118566500D03* +D32* +X105676000Y-114300000D03* +X107176000Y-114300000D03* +X105676000Y-112903000D03* +X107176000Y-112903000D03* +D31* +X82550000Y-105930000D03* +X82550000Y-107430000D03* +X82550000Y-108470000D03* +X82550000Y-109970000D03* +X82550000Y-111010000D03* +X82550000Y-112510000D03* +X82550000Y-113550000D03* +X82550000Y-115050000D03* +X84328000Y-107430000D03* +X84328000Y-105930000D03* +X84328000Y-109970000D03* +X84328000Y-108470000D03* +X84328000Y-112510000D03* +X84328000Y-111010000D03* +X84328000Y-115050000D03* +X84328000Y-113550000D03* +X89395300Y-123570300D03* +X89395300Y-125070300D03* +X87871300Y-123570300D03* +X87871300Y-125070300D03* +X89281000Y-117971000D03* +X89281000Y-116471000D03* +X87630000Y-117971000D03* +X87630000Y-116471000D03* +D32* +X86372000Y-119634000D03* +X87872000Y-119634000D03* +X86372000Y-121920000D03* +X87872000Y-121920000D03* +X98818000Y-124079000D03* +X100318000Y-124079000D03* +D31* +X84455000Y-117971000D03* +X84455000Y-116471000D03* +X84709000Y-123583000D03* +X84709000Y-125083000D03* +D32* +X83324000Y-119634000D03* +X84824000Y-119634000D03* +X83324000Y-121920000D03* +X84824000Y-121920000D03* +X85332000Y-102946200D03* +X83832000Y-102946200D03* +X83832000Y-104546400D03* +X85332000Y-104546400D03* +X100318000Y-116840000D03* +X98818000Y-116840000D03* +D31* +X85979000Y-116471000D03* +X85979000Y-117971000D03* +X86233000Y-123583000D03* +X86233000Y-125083000D03* +D33* +X113464800Y-106807000D03* +X110664800Y-107757000D03* +X110664800Y-105857000D03* +D34* +X97213400Y-124485400D03* +X97213400Y-123215400D03* +X97213400Y-121945400D03* +X97213400Y-120675400D03* +X97213400Y-119405400D03* +X97213400Y-118135400D03* +X97213400Y-116865400D03* +X91813400Y-116865400D03* +X91813400Y-118135400D03* +X91813400Y-119405400D03* +X91813400Y-120675400D03* +X91813400Y-121945400D03* +X91813400Y-123215400D03* +X91813400Y-124485400D03* +D35* +X90195400Y-119710200D03* +X88925400Y-119710200D03* +X90195400Y-121742200D03* +X89560400Y-119710200D03* +X88925400Y-121742200D03* +X89560400Y-121742200D03* +X108140500Y-98488500D03* +X109410500Y-98488500D03* +X108140500Y-96456500D03* +X108775500Y-98488500D03* +X109410500Y-96456500D03* +X108775500Y-96456500D03* +D36* +X89535000Y-97259140D03* +X89535000Y-100860860D03* +D13* +X90604800Y-106807000D03* +D14* +X88064800Y-106807000D03* +D13* +X90604800Y-104267000D03* +D14* +X88064800Y-104267000D03* +D27* +X93703600Y-101953400D03* +X93703600Y-104853400D03* +D13* +X99339400Y-95935800D03* +D14* +X101879400Y-95935800D03* +D19* +X107746100Y-116039900D03* +X109246100Y-116039900D03* +X107746100Y-117195600D03* +X109246100Y-117195600D03* +X107758800Y-118351300D03* +X109258800Y-118351300D03* +D18* +X109054900Y-124321000D03* +X109054900Y-122821000D03* +D37* +X106094400Y-120650000D03* +X109094400Y-120650000D03* +D38* +X111340460Y-101910300D03* +X111340460Y-101260300D03* +X111340460Y-100610300D03* +X111340460Y-99960300D03* +X111340460Y-99310300D03* +D39* +X111340460Y-103110300D03* +X111340460Y-98110300D03* +D40* +X114040460Y-104110300D03* +X114040460Y-97110300D03* +M02* diff --git a/PCB/OUTPUT_V5/Tinylab_proto1.drl b/PCB/OUTPUT_V5/Tinylab_proto1.drl new file mode 100644 index 00000000..2f079795 --- /dev/null +++ b/PCB/OUTPUT_V5/Tinylab_proto1.drl @@ -0,0 +1,131 @@ +M48 +;DRILL file {KiCad 4.0.1-stable} date 10/05/2016 5:57:04 PM +;FORMAT={2:4/ absolute / inch / keep zeros} +FMAT,2 +INCH,TZ +T1C0.016 +T2C0.020 +T3C0.022 +T4C0.031 +T5C0.032 +T6C0.039 +T7C0.040 +T8C0.050 +% +G90 +G05 +M72 +T1 +X033690Y-041650 +X033710Y-047630 +X034201Y-045310 +X034220Y-049260 +X034524Y-040092 +X035030Y-046800 +X035119Y-048259 +X035581Y-046763 +X035610Y-045900 +X035620Y-048920 +X035630Y-048270 +X035700Y-049250 +X035750Y-040062 +X035956Y-038700 +X035980Y-043180 +X036170Y-042770 +X036772Y-045948 +X036814Y-047798 +X037200Y-048700 +X037551Y-040440 +X037610Y-041370 +X037630Y-041020 +X037631Y-043050 +X037676Y-047820 +X038031Y-042970 +X038586Y-045300 +X038740Y-044010 +X038796Y-044770 +X038811Y-040650 +X038944Y-039358 +X039246Y-040195 +X039300Y-045625 +X039890Y-042560 +X040075Y-047200 +X040113Y-044749 +X040200Y-039225 +X040654Y-042520 +X040686Y-044430 +X041101Y-043915 +X041124Y-041284 +X041149Y-040969 +X041387Y-044438 +X041450Y-039225 +X041545Y-040708 +X041852Y-040924 +X042134Y-041446 +X042175Y-045325 +X042308Y-042548 +X042510Y-043980 +X042541Y-043030 +X042610Y-045330 +X042930Y-043910 +X042990Y-045320 +X043331Y-039990 +X043360Y-038360 +X043386Y-039615 +X043456Y-037964 +X043561Y-045340 +X043571Y-044595 +X043946Y-042040 +X044151Y-044260 +X044277Y-042513 +X044326Y-040140 +X045136Y-045335 +T4 +X034516Y-044000 +X035500Y-044000 +T5 +X031671Y-038550 +X031671Y-040550 +T6 +X036749Y-042000 +T7 +X031671Y-041550 +X031671Y-042550 +X031671Y-043550 +X031671Y-044550 +X031671Y-045550 +X031671Y-046550 +X031671Y-047550 +X031671Y-048550 +X034671Y-041050 +X034671Y-042050 +X035671Y-041050 +X035671Y-042050 +X039110Y-037770 +X040110Y-037770 +X040700Y-046000 +X040700Y-047000 +X040700Y-048000 +X040700Y-049000 +X041700Y-046000 +X041700Y-049000 +X043766Y-046545 +X043801Y-047940 +X043801Y-048940 +X044766Y-046545 +X044801Y-047940 +X044801Y-048940 +T8 +X036749Y-038000 +T2 +X045026Y-038232G85X044770Y-038232 +G05 +X045026Y-040988G85X044770Y-040988 +G05 +T3 +X043835Y-038685G85X043835Y-038567 +G05 +X043835Y-040654G85X043835Y-040536 +G05 +T0 +M30 diff --git a/PCB/Tinylab_proto1-cache.lib b/PCB/Tinylab_proto1-cache.lib new file mode 100644 index 00000000..c3246bf9 --- /dev/null +++ b/PCB/Tinylab_proto1-cache.lib @@ -0,0 +1,406 @@ +EESchema-LIBRARY Version 2.3 +#encoding utf-8 +# +# +5V +# +DEF +5V #PWR 0 0 Y Y 1 F P +F0 "#PWR" 0 -150 50 H I C CNN +F1 "+5V" 0 140 50 H V C CNN +F2 "" 0 0 50 H V C CNN +F3 "" 0 0 50 H V C CNN +DRAW +P 2 0 1 0 -30 50 0 100 N +P 2 0 1 0 0 0 0 100 N +P 2 0 1 0 0 100 30 50 N +X +5V 1 0 0 0 U 50 50 1 1 W N +ENDDRAW +ENDDEF +# +# 78L05-RESCUE-Tinylab_proto1 +# +DEF 78L05-RESCUE-Tinylab_proto1 U 0 30 N Y 1 F N +F0 "U" 150 -196 60 H V C CNN +F1 "78L05-RESCUE-Tinylab_proto1" 0 200 60 H V C CNN +F2 "" 0 0 60 H V C CNN +F3 "" 0 0 60 H V C CNN +DRAW +S -200 -150 200 150 0 1 0 N +X GND 1 0 -250 100 U 40 40 1 1 I +X VO 2 400 50 200 L 40 40 1 1 w +X VI 3 -400 50 200 R 40 40 1 1 I +ENDDRAW +ENDDEF +# +# ATXMEGA16A4U-A +# +DEF ATXMEGA16A4U-A IC 0 40 Y Y 1 F N +F0 "IC" -750 1200 50 H V L BNN +F1 "ATXMEGA16A4U-A" 350 -1250 50 H V L BNN +F2 "TQFP44" 0 0 50 H V C CIN +F3 "" 0 0 50 H V C CNN +ALIAS ATXMEGA32A4U-A ATXMEGA64A4U-A ATXMEGA128A4U-A +DRAW +S -750 1150 750 -1150 0 1 10 f +X AC5/ADC5/PA5 1 900 500 150 L 40 35 1 1 B +X AC1OUT/AC6/ADC6/PA6 2 900 400 150 L 40 35 1 1 B +X AC0OUT/AC7/ADC7/PA7 3 900 300 150 L 40 35 1 1 B +X AREFB/ADC8/PB0 4 900 150 150 L 40 35 1 1 B +X ADC9/PB1 5 900 50 150 L 40 35 1 1 B +X DAC0/ADC10/PB2 6 900 -50 150 L 40 35 1 1 B +X DAC1/ACD11/PB3 7 900 -150 150 L 40 35 1 1 B +X GND 8 -150 -1300 150 U 40 35 1 1 W +X VCC 9 -100 1300 150 D 40 35 1 1 W +X SDAIN/SDA/~OC0ALS~/OC0A/PC0 10 900 -300 150 L 40 35 1 1 B +X PD0/OC0A 20 -900 -300 150 R 40 35 1 1 B +X GND 30 50 -1300 150 U 40 35 1 1 W +X AREFA/AC0/ADC0/PA0 40 900 1000 150 L 40 35 1 1 B +X SCLIN/SCL/XCK0/OC0AHS/OC0B/PC1 11 900 -400 150 L 40 35 1 1 B +X PD1/OC0B/XCK0 21 -900 -400 150 R 40 35 1 1 B +X VCC 31 100 1300 150 D 40 35 1 1 W +X AC1/ADC1/PA1 41 900 900 150 L 40 35 1 1 B +X SDAOUT/RXD0/~OC0BLS~/OC0C/PC2 12 900 -500 150 L 40 35 1 1 B +X PD2/OC0C/RXD0 22 -900 -500 150 R 40 35 1 1 B +X PE2/OC0C/RXD0 32 -900 -50 150 R 40 35 1 1 B +X AC2/ADC2/PA2 42 900 800 150 L 40 35 1 1 B +X SCLOUT/TXD0/OC0BHS/OC0D/PC3 13 900 -600 150 L 40 35 1 1 B +X PD3/OC0D/TXD0 23 -900 -600 150 R 40 35 1 1 B +X PE3/OC0D/TXD0 33 -900 -150 150 R 40 35 1 1 B +X AC3/ADC3/PA3 43 900 700 150 L 40 35 1 1 B +X ~SS~/~OC0CLS~/OC1A/PC4 14 900 -700 150 L 40 35 1 1 B +X PD4/OC1A/~SS~ 24 -900 -700 150 R 40 35 1 1 B +X PDI_DATA 34 -900 900 150 R 40 35 1 1 I +X AC4/ADC4/PA4 44 900 600 150 L 40 35 1 1 B +X MOSI/XCK1/OC0CHS/OC1B/PC5 15 900 -800 150 L 40 35 1 1 B +X PD5/OC1B/XCK1/MOSI 25 -900 -800 150 R 40 35 1 1 B +X ~RESET~/PDI_CLK 35 -900 1000 150 R 40 35 1 1 I +X CLKRTC/MISO/RXD1/~OC0DLS~/PC6 16 900 -900 150 L 40 35 1 1 B +X PD6/D-/RXD1/MISO 26 -900 -900 150 R 40 35 1 1 B +X PR0/XTAL2/TOSC2 36 -900 400 150 R 40 35 1 1 B +X EVOUT/CLKOUT/SCK/TXD1/OC0DHS/PC7 17 900 -1000 150 L 40 35 1 1 B +X PD7/D+/TXD1/SCK/CLKOUT/EVOUT 27 -900 -1000 150 R 40 35 1 1 B +X PR1/XTAL1/TOSC1 37 -900 300 150 R 40 35 1 1 B +X GND 18 -50 -1300 150 U 40 35 1 1 W +X PE0/OC0A/SDA 28 -900 150 150 R 40 35 1 1 B +X GND 38 150 -1300 150 U 40 35 1 1 W +X VCC 19 0 1300 150 D 40 35 1 1 W +X PE1/OC0B/XCK0/SCL 29 -900 50 150 R 40 35 1 1 B +X AVCC 39 300 1300 150 D 40 35 1 1 W +ENDDRAW +ENDDEF +# +# C +# +DEF C C 0 10 N Y 1 F N +F0 "C" 25 100 50 H V L CNN +F1 "C" 25 -100 50 H V L CNN +F2 "" 38 -150 50 H V C CNN +F3 "" 0 0 50 H V C CNN +$FPLIST + C? + C_????_* + C_???? + SMD*_c + Capacitor* +$ENDFPLIST +DRAW +P 2 0 1 20 -80 -30 80 -30 N +P 2 0 1 20 -80 30 80 30 N +X ~ 1 0 150 110 D 40 40 1 1 P +X ~ 2 0 -150 110 U 40 40 1 1 P +ENDDRAW +ENDDEF +# +# CONN_01X02 +# +DEF CONN_01X02 P 0 40 Y N 1 F N +F0 "P" 0 150 50 H V C CNN +F1 "CONN_01X02" 100 0 50 V V C CNN +F2 "" 0 0 50 H V C CNN +F3 "" 0 0 50 H V C CNN +$FPLIST + Pin_Header_Straight_1X02 + Pin_Header_Angled_1X02 + Socket_Strip_Straight_1X02 + Socket_Strip_Angled_1X02 +$ENDFPLIST +DRAW +S -50 -45 10 -55 0 1 0 N +S -50 55 10 45 0 1 0 N +S -50 100 50 -100 0 1 0 N +X P1 1 -200 50 150 R 50 50 1 1 P +X P2 2 -200 -50 150 R 50 50 1 1 P +ENDDRAW +ENDDEF +# +# CONN_01X04 +# +DEF CONN_01X04 P 0 40 Y N 1 F N +F0 "P" 0 250 50 H V C CNN +F1 "CONN_01X04" 100 0 50 V V C CNN +F2 "" 0 0 50 H V C CNN +F3 "" 0 0 50 H V C CNN +$FPLIST + Pin_Header_Straight_1X04 + Pin_Header_Angled_1X04 + Socket_Strip_Straight_1X04 + Socket_Strip_Angled_1X04 +$ENDFPLIST +DRAW +S -50 -145 10 -155 0 1 0 N +S -50 -45 10 -55 0 1 0 N +S -50 55 10 45 0 1 0 N +S -50 155 10 145 0 1 0 N +S -50 200 50 -200 0 1 0 N +X P1 1 -200 150 150 R 50 50 1 1 P +X P2 2 -200 50 150 R 50 50 1 1 P +X P3 3 -200 -50 150 R 50 50 1 1 P +X P4 4 -200 -150 150 R 50 50 1 1 P +ENDDRAW +ENDDEF +# +# CONN_02X02 +# +DEF CONN_02X02 P 0 1 Y N 1 F N +F0 "P" 0 150 50 H V C CNN +F1 "CONN_02X02" 0 -150 50 H V C CNN +F2 "" 0 -1200 50 H V C CNN +F3 "" 0 -1200 50 H V C CNN +$FPLIST + Pin_Header_Straight_2X02 + Pin_Header_Angled_2X02 + Socket_Strip_Straight_2X02 + Socket_Strip_Angled_2X02 +$ENDFPLIST +DRAW +S -100 -45 -50 -55 0 1 0 N +S -100 55 -50 45 0 1 0 N +S -100 100 100 -100 0 1 0 N +S 50 -45 100 -55 0 1 0 N +S 50 55 100 45 0 1 0 N +X P1 1 -250 50 150 R 50 50 1 1 P +X P2 2 250 50 150 L 50 50 1 1 P +X P3 3 -250 -50 150 R 50 50 1 1 P +X P4 4 250 -50 150 L 50 50 1 1 P +ENDDRAW +ENDDEF +# +# CP1 +# +DEF CP1 C 0 10 N N 1 F N +F0 "C" 25 100 50 H V L CNN +F1 "CP1" 25 -100 50 H V L CNN +F2 "" 0 0 50 H V C CNN +F3 "" 0 0 50 H V C CNN +$FPLIST + SMD*_Pol + c_elec* + C*elec + TantalC* + Elko* + CP* +$ENDFPLIST +DRAW +A 0 -150 128 1287 513 0 1 20 N -80 -50 80 -50 +P 2 0 1 20 -80 30 80 30 N +P 2 0 1 0 -70 90 -30 90 N +P 2 0 1 0 -50 70 -50 110 N +X ~ 1 0 150 110 D 40 40 1 1 P +X ~ 2 0 -150 130 U 40 40 1 1 P +ENDDRAW +ENDDEF +# +# C_Small +# +DEF C_Small C 0 10 N N 1 F N +F0 "C" 10 70 50 H V L CNN +F1 "C_Small" 10 -80 50 H V L CNN +F2 "" 0 0 50 H V C CNN +F3 "" 0 0 50 H V C CNN +$FPLIST + C? + C_????_* + C_???? + SMD*_c + Capacitor* +$ENDFPLIST +DRAW +P 2 0 1 13 -60 -20 60 -20 N +P 2 0 1 12 -60 20 60 20 N +X ~ 1 0 100 75 D 40 40 1 1 P +X ~ 2 0 -100 80 U 40 40 1 1 P +ENDDRAW +ENDDEF +# +# DMN63D8LDW +# +DEF DMN63D8LDW U 0 40 Y Y 1 F N +F0 "U" 0 -300 60 H V C CNN +F1 "DMN63D8LDW" 0 350 60 H V C CNN +F2 "" 0 -300 60 H V C CNN +F3 "" 0 -300 60 H V C CNN +DRAW +S -250 300 250 -350 0 1 0 f +X S1 1 450 -150 200 L 50 50 1 1 I +X G1 2 450 0 200 L 50 50 1 1 I +X D2 3 450 150 200 L 50 50 1 1 I +X S2 4 -450 150 200 R 50 50 1 1 I +X G2 5 -450 0 200 R 50 50 1 1 I +X D1 6 -450 -150 200 R 50 50 1 1 I +ENDDRAW +ENDDEF +# +# D_Schottky +# +DEF D_Schottky D 0 40 N N 1 F N +F0 "D" 0 100 50 H V C CNN +F1 "D_Schottky" 0 -100 50 H V C CNN +F2 "" 0 0 50 H V C CNN +F3 "" 0 0 50 H V C CNN +$FPLIST + D-Pak_TO252AA + Diode_* + *SingleDiode + *SingleDiode* + *_Diode_* +$ENDFPLIST +DRAW +P 3 0 1 0 50 50 -50 0 50 -50 F +P 6 0 1 8 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N +X K 1 -150 0 100 R 50 50 1 1 P +X A 2 150 0 100 L 50 50 1 1 P +ENDDRAW +ENDDEF +# +# F_Small +# +DEF F_Small F 0 10 N N 1 F N +F0 "F" -40 60 50 H V L CNN +F1 "F_Small" -120 -60 50 H V L CNN +F2 "" 0 0 50 H V C CNN +F3 "" 0 0 50 H V C CNN +$FPLIST + CP* + SM* +$ENDFPLIST +DRAW +S -50 20 50 -20 0 1 0 N +P 2 0 1 0 -50 0 50 0 N +X ~ 1 -100 0 50 R 40 40 1 1 P +X ~ 2 100 0 50 L 40 40 1 1 P +ENDDRAW +ENDDEF +# +# INDUCTOR +# +DEF INDUCTOR L 0 40 N N 1 F N +F0 "L" -50 0 50 V V C CNN +F1 "INDUCTOR" 100 0 50 V V C CNN +F2 "" 0 0 50 H V C CNN +F3 "" 0 0 50 H V C CNN +DRAW +A 0 -150 50 -889 889 0 1 0 N 1 -199 1 -100 +A 0 -49 51 -889 889 0 1 0 N 1 -99 1 2 +A 0 51 51 -889 889 0 1 0 N 1 1 1 102 +A 0 148 48 -889 889 0 1 0 N 1 101 1 196 +X 1 1 0 300 100 D 50 50 1 1 P +X 2 2 0 -300 100 U 50 50 1 1 P +ENDDRAW +ENDDEF +# +# LM324-RESCUE-Tinylab_proto1 +# +DEF LM324-RESCUE-Tinylab_proto1 U 0 20 Y Y 4 F N +F0 "U" 50 200 60 H V C CNN +F1 "LM324-RESCUE-Tinylab_proto1" 150 -200 50 H V C CNN +F2 "" 0 0 60 H V C CNN +F3 "" 0 0 60 H V C CNN +DRAW +P 4 0 1 6 -200 200 200 0 -200 -200 -200 200 f +X V+ 4 -100 400 250 D 40 40 0 1 W +X V- 11 -100 -400 250 U 40 40 0 1 W +X ~ 1 500 0 300 L 40 40 1 1 O +X - 2 -500 -100 300 R 40 40 1 1 I +X + 3 -500 100 300 R 40 40 1 1 I +X + 5 -500 100 300 R 40 40 2 1 I +X - 6 -500 -100 300 R 40 40 2 1 I +X ~ 7 500 0 300 L 40 40 2 1 O +X ~ 8 500 0 300 L 40 40 3 1 O +X - 9 -500 -100 300 R 40 40 3 1 I +X + 10 -500 100 300 R 40 40 3 1 I +X + 12 -500 100 300 R 40 40 4 1 I +X - 13 -500 -100 300 R 40 40 4 1 I +X ~ 14 500 0 300 L 40 40 4 1 O +ENDDRAW +ENDDEF +# +# Q_NMOS_GSD +# +DEF Q_NMOS_GSD Q 0 0 Y N 1 F N +F0 "Q" 300 50 50 H V R CNN +F1 "Q_NMOS_GSD" 650 -50 50 H V R CNN +F2 "" 200 100 50 H V C CNN +F3 "" 0 0 50 H V C CNN +DRAW +C 50 0 111 0 1 10 N +P 2 0 1 0 30 -70 100 -70 N +P 2 0 1 10 30 -50 30 -90 N +P 2 0 1 0 30 0 100 0 N +P 2 0 1 10 30 20 30 -20 N +P 2 0 1 0 30 70 100 70 N +P 2 0 1 10 30 90 30 50 N +P 2 0 1 0 100 -70 100 -100 N +P 2 0 1 0 100 -70 100 0 N +P 2 0 1 0 100 100 100 70 N +P 3 0 1 10 10 75 10 -75 10 -75 N +P 4 0 1 0 40 0 80 15 80 -15 40 0 F +X G 1 -200 0 210 R 50 50 1 1 I +X S 2 100 -200 100 U 50 50 1 1 P +X D 3 100 200 100 D 50 50 1 1 P +ENDDRAW +ENDDEF +# +# R +# +DEF R R 0 0 N Y 1 F N +F0 "R" 80 0 50 V V C CNN +F1 "R" 0 0 50 V V C CNN +F2 "" -70 0 50 V V C CNN +F3 "" 0 0 50 H V C CNN +$FPLIST + R_* + Resistor_* +$ENDFPLIST +DRAW +S -40 -100 40 100 0 1 10 N +X ~ 1 0 150 50 D 50 50 1 1 P +X ~ 2 0 -150 50 U 50 50 1 1 P +ENDDRAW +ENDDEF +# +# USB_OTG +# +DEF USB_OTG P 0 40 Y Y 1 F N +F0 "P" 325 -125 50 H V C CNN +F1 "USB_OTG" 0 200 50 H V C CNN +F2 "" -50 -100 50 V V C CNN +F3 "" -50 -100 50 V V C CNN +$FPLIST + USB* +$ENDFPLIST +DRAW +S -250 -150 250 150 0 1 0 N +S -205 -150 -195 -120 0 1 0 N +S -105 -150 -95 -120 0 1 0 N +S -5 -150 5 -120 0 1 0 N +S 95 -150 105 -120 0 1 0 N +S 195 -150 205 -120 0 1 0 N +X VCC 1 -200 -300 150 U 50 50 1 1 w +X D- 2 -100 -300 150 U 50 50 1 1 P +X D+ 3 0 -300 150 U 50 50 1 1 P +X ID 4 100 -300 150 U 50 50 1 1 W +X GND 5 200 -300 150 U 50 50 1 1 W +X shield 6 400 100 150 L 50 50 1 1 P +ENDDRAW +ENDDEF +# +#End Library diff --git a/PCB/Tinylab_proto1-rescue.lib b/PCB/Tinylab_proto1-rescue.lib new file mode 100644 index 00000000..96ebf965 --- /dev/null +++ b/PCB/Tinylab_proto1-rescue.lib @@ -0,0 +1,45 @@ +EESchema-LIBRARY Version 2.3 +#encoding utf-8 +# +# 78L05-RESCUE-Tinylab_proto1 +# +DEF 78L05-RESCUE-Tinylab_proto1 U 0 30 N Y 1 F N +F0 "U" 150 -196 60 H V C CNN +F1 "78L05-RESCUE-Tinylab_proto1" 0 200 60 H V C CNN +F2 "" 0 0 60 H V C CNN +F3 "" 0 0 60 H V C CNN +DRAW +S -200 -150 200 150 0 1 0 N +X GND 1 0 -250 100 U 40 40 1 1 I +X VO 2 400 50 200 L 40 40 1 1 w +X VI 3 -400 50 200 R 40 40 1 1 I +ENDDRAW +ENDDEF +# +# LM324-RESCUE-Tinylab_proto1 +# +DEF LM324-RESCUE-Tinylab_proto1 U 0 20 Y Y 4 F N +F0 "U" 50 200 60 H V C CNN +F1 "LM324-RESCUE-Tinylab_proto1" 150 -200 50 H V C CNN +F2 "" 0 0 60 H V C CNN +F3 "" 0 0 60 H V C CNN +DRAW +P 4 0 1 6 -200 200 200 0 -200 -200 -200 200 f +X V+ 4 -100 400 250 D 40 40 0 1 W +X V- 11 -100 -400 250 U 40 40 0 1 W +X ~ 1 500 0 300 L 40 40 1 1 O +X - 2 -500 -100 300 R 40 40 1 1 I +X + 3 -500 100 300 R 40 40 1 1 I +X + 5 -500 100 300 R 40 40 2 1 I +X - 6 -500 -100 300 R 40 40 2 1 I +X ~ 7 500 0 300 L 40 40 2 1 O +X ~ 8 500 0 300 L 40 40 3 1 O +X - 9 -500 -100 300 R 40 40 3 1 I +X + 10 -500 100 300 R 40 40 3 1 I +X + 12 -500 100 300 R 40 40 4 1 I +X - 13 -500 -100 300 R 40 40 4 1 I +X ~ 14 500 0 300 L 40 40 4 1 O +ENDDRAW +ENDDEF +# +#End Library diff --git a/PCB/Tinylab_proto1.bak b/PCB/Tinylab_proto1.bak new file mode 100644 index 00000000..930c4f89 --- /dev/null +++ b/PCB/Tinylab_proto1.bak @@ -0,0 +1,1436 @@ +EESchema Schematic File Version 2 +LIBS:Tinylab_proto1-rescue +LIBS:power +LIBS:device +LIBS:transistors +LIBS:conn +LIBS:linear +LIBS:regul +LIBS:74xx +LIBS:cmos4000 +LIBS:adc-dac +LIBS:memory +LIBS:xilinx +LIBS:microcontrollers +LIBS:dsp +LIBS:microchip +LIBS:analog_switches +LIBS:motorola +LIBS:texas +LIBS:intel +LIBS:audio +LIBS:interface +LIBS:digital-audio +LIBS:philips +LIBS:display +LIBS:cypress +LIBS:siliconi +LIBS:opto +LIBS:atmel +LIBS:contrib +LIBS:valves +LIBS:ESPO_PART +LIBS:Tinylab_proto1-cache +EELAYER 25 0 +EELAYER END +$Descr A2 23386 16535 +encoding utf-8 +Sheet 1 1 +Title "" +Date "" +Rev "" +Comp "" +Comment1 "" +Comment2 "" +Comment3 "" +Comment4 "" +$EndDescr +$Comp +L LM324-RESCUE-Tinylab_proto1 U2 +U 1 1 55CA87E2 +P 4200 8750 +F 0 "U2" H 4250 8950 60 0000 C CNN +F 1 "LM324" H 4350 8550 50 0000 C CNN +F 2 "Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm" H 4200 8750 60 0001 C CNN +F 3 "" H 4200 8750 60 0000 C CNN + 1 4200 8750 + 1 0 0 -1 +$EndComp +$Comp +L LM324-RESCUE-Tinylab_proto1 U2 +U 2 1 55CA88A1 +P 4200 10550 +F 0 "U2" H 4250 10750 60 0000 C CNN +F 1 "LM324" H 4350 10350 50 0000 C CNN +F 2 "Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm" H 4200 10550 60 0001 C CNN +F 3 "" H 4200 10550 60 0000 C CNN + 2 4200 10550 + 1 0 0 -1 +$EndComp +$Comp +L LM324-RESCUE-Tinylab_proto1 U2 +U 3 1 55CA8924 +P 8450 9250 +F 0 "U2" H 8500 9450 60 0000 C CNN +F 1 "LM324" H 8600 9050 50 0000 C CNN +F 2 "Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm" H 8450 9250 60 0001 C CNN +F 3 "" H 8450 9250 60 0000 C CNN + 3 8450 9250 + 1 0 0 -1 +$EndComp +$Comp +L LM324-RESCUE-Tinylab_proto1 U2 +U 4 1 55CA89A3 +P 8400 11550 +F 0 "U2" H 8450 11750 60 0000 C CNN +F 1 "LM324" H 8550 11350 50 0000 C CNN +F 2 "Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm" H 8400 11550 60 0001 C CNN +F 3 "" H 8400 11550 60 0000 C CNN + 4 8400 11550 + 1 0 0 -1 +$EndComp +$Comp +L ATXMEGA16A4U-A IC1 +U 1 1 55CA8F25 +P 6150 5300 +F 0 "IC1" H 5400 6500 40 0000 L BNN +F 1 "ATXMEGA16A4U-A" H 6500 4050 40 0000 L BNN +F 2 "Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm" H 6150 5300 35 0000 C CIN +F 3 "" H 6150 5300 60 0000 C CNN + 1 6150 5300 + 1 0 0 -1 +$EndComp +$Comp +L USB_OTG P2 +U 1 1 55CA90D2 +P 1650 6850 +F 0 "P2" H 1975 6725 50 0000 C CNN +F 1 "USB_OTG" H 1650 7050 50 0000 C CNN +F 2 "Connect:USB_Micro-B_WIDE" V 1600 6750 60 0001 C CNN +F 3 "" V 1600 6750 60 0000 C CNN + 1 1650 6850 + 0 -1 1 0 +$EndComp +$Comp +L 78L05-RESCUE-Tinylab_proto1 U1 +U 1 1 55CA99FA +P 3100 6700 +F 0 "U1" H 3250 6504 60 0000 C CNN +F 1 "78L05" H 3100 6900 60 0000 C CNN +F 2 "SMD:SOT-23-3" H 3100 6700 60 0001 C CNN +F 3 "" H 3100 6700 60 0000 C CNN + 1 3100 6700 + 1 0 0 -1 +$EndComp +$Comp +L R R1 +U 1 1 55CAAB95 +P 2000 9250 +F 0 "R1" V 2080 9250 50 0000 C CNN +F 1 "R" V 2000 9250 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 1930 9250 30 0001 C CNN +F 3 "" H 2000 9250 30 0000 C CNN + 1 2000 9250 + 0 1 1 0 +$EndComp +$Comp +L R R3 +U 1 1 55CAABF4 +P 2350 9400 +F 0 "R3" V 2430 9400 50 0000 C CNN +F 1 "R" V 2350 9400 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 2280 9400 30 0001 C CNN +F 3 "" H 2350 9400 30 0000 C CNN + 1 2350 9400 + 1 0 0 -1 +$EndComp +$Comp +L R R5 +U 1 1 55CAAC5F +P 3000 9500 +F 0 "R5" V 3080 9500 50 0000 C CNN +F 1 "R" V 3000 9500 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 2930 9500 30 0001 C CNN +F 3 "" H 3000 9500 30 0000 C CNN + 1 3000 9500 + 0 1 1 0 +$EndComp +$Comp +L R R6 +U 1 1 55CAACD2 +P 3000 9700 +F 0 "R6" V 3080 9700 50 0000 C CNN +F 1 "R" V 3000 9700 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 2930 9700 30 0001 C CNN +F 3 "" H 3000 9700 30 0000 C CNN + 1 3000 9700 + 0 1 1 0 +$EndComp +$Comp +L R R4 +U 1 1 55CAAD11 +P 2350 9800 +F 0 "R4" V 2430 9800 50 0000 C CNN +F 1 "R" V 2350 9800 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 2280 9800 30 0001 C CNN +F 3 "" H 2350 9800 30 0000 C CNN + 1 2350 9800 + 1 0 0 -1 +$EndComp +$Comp +L R R2 +U 1 1 55CAAD4C +P 2000 9950 +F 0 "R2" V 2080 9950 50 0000 C CNN +F 1 "R" V 2000 9950 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 1930 9950 30 0001 C CNN +F 3 "" H 2000 9950 30 0000 C CNN + 1 2000 9950 + 0 1 1 0 +$EndComp +$Comp +L C_Small C2 +U 1 1 55CAB4DE +P 1700 9700 +F 0 "C2" H 1710 9770 50 0000 L CNN +F 1 "C" H 1710 9620 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 1700 9700 60 0001 C CNN +F 3 "" H 1700 9700 60 0000 C CNN + 1 1700 9700 + 0 1 1 0 +$EndComp +$Comp +L C_Small C1 +U 1 1 55CAB611 +P 1700 9500 +F 0 "C1" H 1710 9570 50 0000 L CNN +F 1 "C" H 1710 9420 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 1700 9500 60 0001 C CNN +F 3 "" H 1700 9500 60 0000 C CNN + 1 1700 9500 + 0 1 1 0 +$EndComp +Text Label 3150 9500 0 60 ~ 0 +AVCC +Text Label 4700 8750 0 60 ~ 0 +CH1 +Text Label 4700 10550 0 60 ~ 0 +CH2 +Text Label 7050 4500 0 60 ~ 0 +CH1 +Text Label 7050 4300 0 60 ~ 0 +CH2 +Text Label 2350 9600 0 60 ~ 0 +AVCC_ON_2 +Text Label 7050 4700 0 60 ~ 0 +AVCC_ON_2 +$Comp +L C_Small C3 +U 1 1 55CB13E1 +P 2700 6950 +F 0 "C3" H 2710 7020 50 0000 L CNN +F 1 "C_Small" H 2710 6870 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 2700 6950 60 0001 C CNN +F 3 "" H 2700 6950 60 0000 C CNN + 1 2700 6950 + 1 0 0 -1 +$EndComp +$Comp +L C_Small C4 +U 1 1 55CB147C +P 3500 6950 +F 0 "C4" H 3510 7020 50 0000 L CNN +F 1 "C_Small" H 3510 6870 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 3500 6950 60 0001 C CNN +F 3 "" H 3500 6950 60 0000 C CNN + 1 3500 6950 + 1 0 0 -1 +$EndComp +Text Notes 1450 8500 0 60 ~ 0 +Analog Front End for Scope\n +Text Notes 8950 8600 0 60 ~ 0 +DAC stuff\n +$Comp +L R R22 +U 1 1 55CB4680 +P 10650 9250 +F 0 "R22" V 10730 9250 50 0000 C CNN +F 1 "R" V 10650 9250 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 10580 9250 30 0001 C CNN +F 3 "" H 10650 9250 30 0000 C CNN + 1 10650 9250 + 0 1 1 0 +$EndComp +$Comp +L C_Small C13 +U 1 1 55CB630B +P 11250 9350 +F 0 "C13" H 11260 9420 50 0000 L CNN +F 1 "C" H 11260 9270 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 11250 9350 60 0001 C CNN +F 3 "" H 11250 9350 60 0000 C CNN + 1 11250 9350 + 0 1 1 0 +$EndComp +Text Label 7400 9150 0 60 ~ 0 +DAC_OUT +Text Label 7050 5350 0 60 ~ 0 +DAC_OUT +$Comp +L R R24 +U 1 1 55CB9020 +P 11000 9250 +F 0 "R24" V 11080 9250 50 0000 C CNN +F 1 "R" V 11000 9250 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 10930 9250 30 0001 C CNN +F 3 "" H 11000 9250 30 0000 C CNN + 1 11000 9250 + 0 1 1 0 +$EndComp +$Comp +L R R11 +U 1 1 55CBCD2A +P 4700 5000 +F 0 "R11" V 4780 5000 50 0000 C CNN +F 1 "R" V 4700 5000 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4630 5000 30 0001 C CNN +F 3 "" H 4700 5000 30 0000 C CNN + 1 4700 5000 + 0 1 1 0 +$EndComp +$Comp +L R R7 +U 1 1 55CBCDA5 +P 4350 5000 +F 0 "R7" V 4430 5000 50 0000 C CNN +F 1 "R" V 4350 5000 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4280 5000 30 0001 C CNN +F 3 "" H 4350 5000 30 0000 C CNN + 1 4350 5000 + 0 1 1 0 +$EndComp +$Comp +L R R13 +U 1 1 55CBE0F4 +P 4700 5400 +F 0 "R13" V 4780 5400 50 0000 C CNN +F 1 "R" V 4700 5400 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4630 5400 30 0001 C CNN +F 3 "" H 4700 5400 30 0000 C CNN + 1 4700 5400 + 0 1 1 0 +$EndComp +$Comp +L R R9 +U 1 1 55CBE16B +P 4350 5400 +F 0 "R9" V 4430 5400 50 0000 C CNN +F 1 "R" V 4350 5400 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4280 5400 30 0001 C CNN +F 3 "" H 4350 5400 30 0000 C CNN + 1 4350 5400 + 0 1 1 0 +$EndComp +$Comp +L R R14 +U 1 1 55CBE21C +P 4700 5600 +F 0 "R14" V 4780 5600 50 0000 C CNN +F 1 "R" V 4700 5600 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4630 5600 30 0001 C CNN +F 3 "" H 4700 5600 30 0000 C CNN + 1 4700 5600 + 0 1 1 0 +$EndComp +$Comp +L R R10 +U 1 1 55CBE2C7 +P 4350 5600 +F 0 "R10" V 4430 5600 50 0000 C CNN +F 1 "R" V 4350 5600 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4280 5600 30 0001 C CNN +F 3 "" H 4350 5600 30 0000 C CNN + 1 4350 5600 + 0 1 1 0 +$EndComp +$Comp +L R R12 +U 1 1 55CBE362 +P 4700 5200 +F 0 "R12" V 4780 5200 50 0000 C CNN +F 1 "R" V 4700 5200 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4630 5200 30 0001 C CNN +F 3 "" H 4700 5200 30 0000 C CNN + 1 4700 5200 + 0 1 1 0 +$EndComp +$Comp +L R R8 +U 1 1 55CBE401 +P 4350 5200 +F 0 "R8" V 4430 5200 50 0000 C CNN +F 1 "R" V 4350 5200 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4280 5200 30 0001 C CNN +F 3 "" H 4350 5200 30 0000 C CNN + 1 4350 5200 + 0 1 1 0 +$EndComp +$Comp +L CONN_01X04 P3 +U 1 1 55CBF4D5 +P 3550 5300 +F 0 "P3" H 3550 5550 50 0000 C CNN +F 1 "DIG_OUT" V 3650 5300 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_1x04" H 3550 5300 60 0001 C CNN +F 3 "" H 3550 5300 60 0000 C CNN + 1 3550 5300 + -1 0 0 1 +$EndComp +Text Notes 4250 4850 0 60 ~ 0 +Dig Output\n +Text Notes 10050 4650 0 60 ~ 0 +PSU\n +$Comp +L +5V #PWR1 +U 1 1 55CD51C0 +P 2700 6650 +F 0 "#PWR1" H 2700 6500 50 0001 C CNN +F 1 "+5V" H 2700 6790 50 0000 C CNN +F 2 "" H 2700 6650 60 0000 C CNN +F 3 "" H 2700 6650 60 0000 C CNN + 1 2700 6650 + 1 0 0 -1 +$EndComp +Text Label 1950 6850 0 60 ~ 0 +D+ +Text Label 1950 6750 0 60 ~ 0 +D- +Text Label 5100 6200 0 60 ~ 0 +D- +Text Label 5100 6300 0 60 ~ 0 +D+ +NoConn ~ 1950 6950 +$Comp +L C_Small C5 +U 1 1 55D60181 +P 3600 9600 +F 0 "C5" H 3610 9670 50 0000 L CNN +F 1 "C_Small" H 3610 9520 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 3600 9600 60 0001 C CNN +F 3 "" H 3600 9600 60 0000 C CNN + 1 3600 9600 + 1 0 0 -1 +$EndComp +Text Label 6450 4000 0 60 ~ 0 +AVCC +$Comp +L DMN63D8LDW U4 +U 1 1 55D6ACFD +P 14400 3450 +F 0 "U4" H 14400 3150 60 0000 C CNN +F 1 "DMN63D8LDW" H 14400 3800 60 0000 C CNN +F 2 "TO_SOT_Packages_SMD:SOT-363" H 14400 3150 60 0001 C CNN +F 3 "" H 14400 3150 60 0000 C CNN + 1 14400 3450 + 1 0 0 -1 +$EndComp +Text Notes 14250 2450 0 60 ~ 0 +DIG IN +$Comp +L CONN_01X02 P8 +U 1 1 55D6DB77 +P 14400 2750 +F 0 "P8" H 14400 2900 50 0000 C CNN +F 1 "DIG_IN" V 14500 2750 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_1x02" H 14400 2750 60 0001 C CNN +F 3 "" H 14400 2750 60 0000 C CNN + 1 14400 2750 + 0 -1 -1 0 +$EndComp +Text Label 14850 3300 0 60 ~ 0 +DIG_CH2 +Text Label 13550 3600 0 60 ~ 0 +DIG_CH1 +$Comp +L F_Small F1 +U 1 1 55D739F3 +P 2300 7050 +F 0 "F1" H 2260 7110 50 0000 L CNN +F 1 "F_Small" H 2180 6990 50 0000 L CNN +F 2 "Capacitors_SMD:C_1210" H 2300 7050 60 0001 C CNN +F 3 "" H 2300 7050 60 0000 C CNN + 1 2300 7050 + -1 0 0 1 +$EndComp +Text Label 2500 7250 0 60 ~ 0 +VGND +Text Label 3500 6650 0 60 ~ 0 +VCC_3V3 +NoConn ~ 7050 5000 +NoConn ~ 7050 5600 +NoConn ~ 7050 5900 +Text Label 7050 5700 0 60 ~ 0 +XCK +Text Label 7050 5800 0 60 ~ 0 +DIG_CH2 +Text Label 7050 6300 0 60 ~ 0 +DIG_CH1 +Text Label 7050 6100 0 60 ~ 0 +XCK +NoConn ~ 7050 6200 +NoConn ~ 5250 5600 +Text Label 4750 6000 0 60 ~ 0 +PSU_PWM +NoConn ~ 5250 6100 +NoConn ~ 5250 5000 +NoConn ~ 5250 4900 +NoConn ~ 5250 5900 +NoConn ~ 5250 5800 +NoConn ~ 5250 5700 +Text Label 6150 3800 0 60 ~ 0 +VCC_3V3 +$Comp +L INDUCTOR L1 +U 1 1 5606EE9E +P 10150 5050 +F 0 "L1" V 10100 5050 50 0000 C CNN +F 1 "INDUCTOR" V 10250 5050 50 0000 C CNN +F 2 "Inductors:INDUCTOR_V" H 10150 5050 60 0001 C CNN +F 3 "" H 10150 5050 60 0000 C CNN + 1 10150 5050 + 0 1 1 0 +$EndComp +$Comp +L D_Schottky D1 +U 1 1 5606FDB4 +P 11100 5050 +F 0 "D1" H 11100 5150 50 0000 C CNN +F 1 "D_Schottky" H 11100 4950 50 0000 C CNN +F 2 "Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10" H 11100 5050 60 0001 C CNN +F 3 "" H 11100 5050 60 0000 C CNN + 1 11100 5050 + -1 0 0 1 +$EndComp +$Comp +L CP1 C9 +U 1 1 560719D9 +P 9500 5350 +F 0 "C9" H 9525 5450 50 0000 L CNN +F 1 "CP1" H 9525 5250 50 0000 L CNN +F 2 "Capacitors_SMD:c_elec_4x5.3" H 9500 5350 60 0001 C CNN +F 3 "" H 9500 5350 60 0000 C CNN + 1 9500 5350 + 1 0 0 -1 +$EndComp +$Comp +L C C10 +U 1 1 56071A50 +P 9800 5350 +F 0 "C10" H 9825 5450 50 0000 L CNN +F 1 "C" H 9825 5250 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 9838 5200 30 0001 C CNN +F 3 "" H 9800 5350 60 0000 C CNN + 1 9800 5350 + 1 0 0 -1 +$EndComp +Text Label 10100 5450 0 60 ~ 0 +PSU_PWM +$Comp +L C C16 +U 1 1 5607355F +P 11900 5350 +F 0 "C16" H 11925 5450 50 0000 L CNN +F 1 "C" H 11925 5250 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 11938 5200 30 0001 C CNN +F 3 "" H 11900 5350 60 0000 C CNN + 1 11900 5350 + 1 0 0 -1 +$EndComp +$Comp +L CP1 C15 +U 1 1 560735FE +P 11600 5350 +F 0 "C15" H 11625 5450 50 0000 L CNN +F 1 "CP1" H 11625 5250 50 0000 L CNN +F 2 "Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5" H 11600 5350 60 0001 C CNN +F 3 "" H 11600 5350 60 0000 C CNN + 1 11600 5350 + 1 0 0 -1 +$EndComp +NoConn ~ 7050 4400 +NoConn ~ 7050 4600 +Text Label 7050 4900 0 60 ~ 0 +CH2 +$Comp +L CONN_02X02 P4 +U 1 1 56069A87 +P 4600 4350 +F 0 "P4" H 4600 4500 50 0000 C CNN +F 1 "PDI" H 4600 4200 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_2x02" H 4600 3150 60 0001 C CNN +F 3 "" H 4600 3150 60 0000 C CNN + 1 4600 4350 + 1 0 0 -1 +$EndComp +Text Label 4000 4300 0 60 ~ 0 +VCC_3V3 +$Comp +L Q_NMOS_GSD Q1 +U 1 1 5606F6D4 +P 10650 5450 +F 0 "Q1" H 10950 5500 50 0000 R CNN +F 1 "Q_NMOS_GSD" H 11300 5400 50 0000 R CNN +F 2 "SMD:SOT-23-3" H 10850 5550 29 0001 C CNN +F 3 "" H 10650 5450 60 0000 C CNN + 1 10650 5450 + 1 0 0 -1 +$EndComp +NoConn ~ 6050 4000 +Text Label 9100 5650 0 60 ~ 0 +VGND +Text Label 7050 5450 0 60 ~ 0 +DAC_OUT2 +Text Label 7350 11450 0 60 ~ 0 +DAC_OUT2 +$Comp +L R R23 +U 1 1 566DE721 +P 10850 11550 +F 0 "R23" V 10930 11550 50 0000 C CNN +F 1 "R" V 10850 11550 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 10780 11550 30 0001 C CNN +F 3 "" H 10850 11550 30 0000 C CNN + 1 10850 11550 + 0 1 1 0 +$EndComp +$Comp +L R R25 +U 1 1 566DE7E8 +P 11150 11550 +F 0 "R25" V 11230 11550 50 0000 C CNN +F 1 "R" V 11150 11550 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 11080 11550 30 0001 C CNN +F 3 "" H 11150 11550 30 0000 C CNN + 1 11150 11550 + 0 1 1 0 +$EndComp +$Comp +L C_Small C14 +U 1 1 566DF655 +P 11400 11650 +F 0 "C14" H 11410 11720 50 0000 L CNN +F 1 "C" H 11410 11570 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 11400 11650 60 0001 C CNN +F 3 "" H 11400 11650 60 0000 C CNN + 1 11400 11650 + 0 1 1 0 +$EndComp +$Comp +L CONN_01X04 P6 +U 1 1 566DF832 +P 12450 10750 +F 0 "P6" H 12450 11000 50 0000 C CNN +F 1 "DAC_OUT" V 12550 10750 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_1x04" H 12450 10750 60 0001 C CNN +F 3 "" H 12450 10750 60 0000 C CNN + 1 12450 10750 + 1 0 0 -1 +$EndComp +$Comp +L R R26 +U 1 1 566E5C29 +P 13650 5200 +F 0 "R26" V 13730 5200 50 0000 C CNN +F 1 "R" V 13650 5200 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 13580 5200 30 0001 C CNN +F 3 "" H 13650 5200 30 0000 C CNN + 1 13650 5200 + 1 0 0 -1 +$EndComp +$Comp +L R R27 +U 1 1 566E5CBE +P 13650 5500 +F 0 "R27" V 13730 5500 50 0000 C CNN +F 1 "R" V 13650 5500 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 13580 5500 30 0001 C CNN +F 3 "" H 13650 5500 30 0000 C CNN + 1 13650 5500 + 1 0 0 -1 +$EndComp +Text Label 7050 4800 0 60 ~ 0 +PSU_FEEDBACK +Text Label 14000 5350 0 60 ~ 0 +PSU_FEEDBACK +$Comp +L CP1 C6 +U 1 1 566F5A75 +P 4050 6900 +F 0 "C6" H 4075 7000 50 0000 L CNN +F 1 "CP1" H 4075 6800 50 0000 L CNN +F 2 "Capacitors_SMD:c_elec_5x5.3" H 4050 6900 60 0001 C CNN +F 3 "" H 4050 6900 60 0000 C CNN + 1 4050 6900 + 1 0 0 -1 +$EndComp +Text Label 6250 3900 0 60 ~ 0 +VCC_3V3 +$Comp +L R R19 +U 1 1 56AECD86 +P 8700 9750 +F 0 "R19" V 8780 9750 50 0000 C CNN +F 1 "R" V 8700 9750 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 8630 9750 30 0001 C CNN +F 3 "" H 8700 9750 30 0000 C CNN + 1 8700 9750 + 0 1 1 0 +$EndComp +Text Label 10400 3600 0 60 ~ 0 +VCC_3V3 +Text Label 9150 3600 0 60 ~ 0 +AVCC +$Comp +L C C11 +U 1 1 5608B4BE +P 10150 3750 +F 0 "C11" H 10175 3850 50 0000 L CNN +F 1 "C" H 10175 3650 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 10188 3600 30 0001 C CNN +F 3 "" H 10150 3750 60 0000 C CNN + 1 10150 3750 + 1 0 0 -1 +$EndComp +$Comp +L C C8 +U 1 1 56AF91A3 +P 9200 3750 +F 0 "C8" H 9225 3850 50 0000 L CNN +F 1 "C" H 9225 3650 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 9238 3600 30 0001 C CNN +F 3 "" H 9200 3750 60 0000 C CNN + 1 9200 3750 + 1 0 0 -1 +$EndComp +$Comp +L R R17 +U 1 1 56AFE83E +P 7950 9900 +F 0 "R17" V 8030 9900 50 0000 C CNN +F 1 "R" V 7950 9900 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 7880 9900 30 0001 C CNN +F 3 "" H 7950 9900 30 0000 C CNN + 1 7950 9900 + 1 0 0 -1 +$EndComp +$Comp +L R R18 +U 1 1 56AFE8F3 +P 8150 9900 +F 0 "R18" V 8230 9900 50 0000 C CNN +F 1 "R" V 8150 9900 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 8080 9900 30 0001 C CNN +F 3 "" H 8150 9900 30 0000 C CNN + 1 8150 9900 + 1 0 0 -1 +$EndComp +$Comp +L DMN63D8LDW U3 +U 1 1 56B012DD +P 9250 10750 +F 0 "U3" H 9250 10450 60 0000 C CNN +F 1 "DMN63D8LDW" H 9250 11100 60 0000 C CNN +F 2 "TO_SOT_Packages_SMD:SOT-363" H 9250 10450 60 0001 C CNN +F 3 "" H 9250 10450 60 0000 C CNN + 1 9250 10750 + 1 0 0 -1 +$EndComp +Text Label 9800 10750 0 60 ~ 0 +TO_B0 +Text Label 7050 5150 0 60 ~ 0 +TO_B0 +Text Label 12450 5050 0 60 ~ 0 +PSU_OUT +$Comp +L R R20 +U 1 1 56B0C682 +P 8700 12050 +F 0 "R20" V 8780 12050 50 0000 C CNN +F 1 "R" V 8700 12050 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 8630 12050 30 0001 C CNN +F 3 "" H 8700 12050 30 0000 C CNN + 1 8700 12050 + 0 1 1 0 +$EndComp +$Comp +L R R15 +U 1 1 56B0C779 +P 7900 12200 +F 0 "R15" V 7980 12200 50 0000 C CNN +F 1 "R" V 7900 12200 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 7830 12200 30 0001 C CNN +F 3 "" H 7900 12200 30 0000 C CNN + 1 7900 12200 + 1 0 0 -1 +$EndComp +$Comp +L R R16 +U 1 1 56B0C86E +P 8100 12200 +F 0 "R16" V 8180 12200 50 0000 C CNN +F 1 "R" V 8100 12200 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 8030 12200 30 0001 C CNN +F 3 "" H 8100 12200 30 0000 C CNN + 1 8100 12200 + 1 0 0 -1 +$EndComp +Text Label 8100 10750 0 60 ~ 0 +TO_B1 +Text Label 7050 5250 0 60 ~ 0 +TO_B1 +$Comp +L +5V #PWR2 +U 1 1 56E7FFFF +P 9100 5050 +F 0 "#PWR2" H 9100 4900 50 0001 C CNN +F 1 "+5V" H 9100 5190 50 0000 C CNN +F 2 "" H 9100 5050 60 0000 C CNN +F 3 "" H 9100 5050 60 0000 C CNN + 1 9100 5050 + 1 0 0 -1 +$EndComp +$Comp +L INDUCTOR L2 +U 1 1 56E88440 +P 9700 3600 +F 0 "L2" V 9650 3600 50 0000 C CNN +F 1 "INDUCTOR" V 9800 3600 50 0000 C CNN +F 2 "Resistors_SMD:R_1210" H 9700 3600 60 0001 C CNN +F 3 "" H 9700 3600 60 0000 C CNN + 1 9700 3600 + 0 1 1 0 +$EndComp +Text Label 4100 8350 0 60 ~ 0 +OPAMP_VCC +Text Label 4100 10150 0 60 ~ 0 +OPAMP_VCC +Text Label 8350 8850 0 60 ~ 0 +OPAMP_VCC +Text Label 8300 11150 0 60 ~ 0 +OPAMP_VCC +$Comp +L INDUCTOR L3 +U 1 1 56E8DA35 +P 15400 5050 +F 0 "L3" V 15350 5050 50 0000 C CNN +F 1 "INDUCTOR" V 15500 5050 50 0000 C CNN +F 2 "Resistors_SMD:R_1210" H 15400 5050 60 0001 C CNN +F 3 "" H 15400 5050 60 0000 C CNN + 1 15400 5050 + 0 1 1 0 +$EndComp +$Comp +L C C7 +U 1 1 56E8E263 +P 16100 5200 +F 0 "C7" H 16125 5300 50 0000 L CNN +F 1 "C" H 16125 5100 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 16138 5050 30 0001 C CNN +F 3 "" H 16100 5200 60 0000 C CNN + 1 16100 5200 + 1 0 0 -1 +$EndComp +Text Label 15850 5050 0 60 ~ 0 +OPAMP_VCC +$Comp +L R R21 +U 1 1 56E9851A +P 4900 8900 +F 0 "R21" V 4980 8900 50 0000 C CNN +F 1 "R" V 4900 8900 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4830 8900 30 0001 C CNN +F 3 "" H 4900 8900 30 0000 C CNN + 1 4900 8900 + 1 0 0 -1 +$EndComp +$Comp +L R R28 +U 1 1 56E985EF +P 4950 10400 +F 0 "R28" V 5030 10400 50 0000 C CNN +F 1 "R" V 4950 10400 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4880 10400 30 0001 C CNN +F 3 "" H 4950 10400 30 0000 C CNN + 1 4950 10400 + 1 0 0 -1 +$EndComp +$Comp +L R R29 +U 1 1 56E9888A +P 9600 9400 +F 0 "R29" V 9680 9400 50 0000 C CNN +F 1 "R" V 9600 9400 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 9530 9400 30 0001 C CNN +F 3 "" H 9600 9400 30 0000 C CNN + 1 9600 9400 + 1 0 0 -1 +$EndComp +$Comp +L R R30 +U 1 1 56E98921 +P 10000 11400 +F 0 "R30" V 10080 11400 50 0000 C CNN +F 1 "R" V 10000 11400 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 9930 11400 30 0001 C CNN +F 3 "" H 10000 11400 30 0000 C CNN + 1 10000 11400 + 1 0 0 -1 +$EndComp +$Comp +L CONN_01X02 P1 +U 1 1 56EA2C80 +P 1200 9250 +F 0 "P1" H 1200 9400 50 0000 C CNN +F 1 "SCOPE_IN_CH1" V 1300 9250 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_1x02" H 1200 9250 60 0001 C CNN +F 3 "" H 1200 9250 60 0000 C CNN + 1 1200 9250 + -1 0 0 1 +$EndComp +$Comp +L CONN_01X02 P9 +U 1 1 56EA2D2D +P 1400 9600 +F 0 "P9" H 1400 9750 50 0000 C CNN +F 1 "SCOPE_IN_AC" V 1500 9600 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_1x02" H 1400 9600 60 0001 C CNN +F 3 "" H 1400 9600 60 0000 C CNN + 1 1400 9600 + -1 0 0 1 +$EndComp +$Comp +L CONN_01X02 P5 +U 1 1 56EA3310 +P 1200 9950 +F 0 "P5" H 1200 10100 50 0000 C CNN +F 1 "SCOPE_IN_CH2" V 1300 9950 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_1x02" H 1200 9950 60 0001 C CNN +F 3 "" H 1200 9950 60 0000 C CNN + 1 1200 9950 + -1 0 0 1 +$EndComp +$Comp +L CONN_01X02 P10 +U 1 1 56F2A840 +P 13350 5350 +F 0 "P10" H 13350 5500 50 0000 C CNN +F 1 "CONN_01X02" V 13450 5350 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_1x02" H 13350 5350 50 0001 C CNN +F 3 "" H 13350 5350 50 0000 C CNN + 1 13350 5350 + 1 0 0 -1 +$EndComp +$Comp +L CONN_01X02 P7 +U 1 1 56F2A93D +P 13000 5350 +F 0 "P7" H 13000 5500 50 0000 C CNN +F 1 "CONN_01X02" V 13100 5350 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_1x02" H 13000 5350 50 0001 C CNN +F 3 "" H 13000 5350 50 0000 C CNN + 1 13000 5350 + 1 0 0 -1 +$EndComp +Text Label 6300 6700 0 60 ~ 0 +VGND +Text Label 6200 6950 0 60 ~ 0 +VGND +Text Label 6100 6800 0 60 ~ 0 +VGND +Text Label 6000 7100 0 60 ~ 0 +VGND +Text Label 7600 6000 0 60 ~ 0 +VGND +Text Label 4750 9750 0 60 ~ 0 +VGND +Text Label 4100 9150 0 60 ~ 0 +VGND +Text Label 4100 10950 0 60 ~ 0 +VGND +Text Label 7900 3900 0 60 ~ 0 +VGND +Text Label 10800 3900 0 60 ~ 0 +VGND +Text Label 14200 5650 0 60 ~ 0 +VGND +Text Label 10300 10900 0 60 ~ 0 +VGND +Text Label 8500 10600 0 60 ~ 0 +VGND +Text Label 16250 5650 0 60 ~ 0 +VGND +Text Label 8350 9650 0 60 ~ 0 +VGND +Text Label 8300 11950 0 60 ~ 0 +VGND +$Comp +L INDUCTOR L4 +U 1 1 573254B0 +P 14450 5050 +F 0 "L4" V 14400 5050 50 0000 C CNN +F 1 "INDUCTOR" V 14550 5050 50 0000 C CNN +F 2 "Resistors_SMD:R_1210" H 14450 5050 60 0001 C CNN +F 3 "" H 14450 5050 60 0000 C CNN + 1 14450 5050 + 0 1 1 0 +$EndComp +Wire Wire Line + 11150 9250 11150 9350 +Wire Wire Line + 7950 9150 7400 9150 +Wire Wire Line + 11350 9350 12150 9350 +Wire Wire Line + 2150 9950 2350 9950 +Wire Wire Line + 2350 9950 2350 10450 +Wire Wire Line + 2350 10450 3700 10450 +Wire Wire Line + 4700 10800 4700 10550 +Wire Wire Line + 3700 10800 4700 10800 +Wire Wire Line + 3700 10650 3700 10800 +Wire Wire Line + 2350 8650 3700 8650 +Wire Wire Line + 2350 9250 2350 8650 +Wire Wire Line + 4700 9000 4700 8750 +Wire Wire Line + 3700 9000 4700 9000 +Wire Wire Line + 3700 8850 3700 9000 +Connection ~ 1800 9950 +Connection ~ 1800 9250 +Wire Wire Line + 1800 9500 1800 9250 +Wire Wire Line + 1600 9550 1600 9500 +Wire Wire Line + 1600 9650 1600 9700 +Connection ~ 2350 9600 +Connection ~ 2850 9600 +Wire Wire Line + 2350 9600 2850 9600 +Wire Wire Line + 2350 9550 2350 9650 +Wire Wire Line + 2850 9500 2850 9700 +Wire Wire Line + 2150 9250 2350 9250 +Wire Wire Line + 3500 6650 3500 6850 +Connection ~ 3100 7050 +Connection ~ 2700 7050 +Wire Wire Line + 2700 6650 2700 6850 +Wire Wire Line + 1950 6650 2700 6650 +Wire Wire Line + 10800 9250 10850 9250 +Wire Wire Line + 4500 5000 4550 5000 +Wire Wire Line + 4500 5200 4550 5200 +Wire Wire Line + 4500 5400 4550 5400 +Wire Wire Line + 4500 5600 4550 5600 +Wire Wire Line + 4850 5000 5050 5000 +Wire Wire Line + 5050 5000 5050 5150 +Wire Wire Line + 5050 5150 5250 5150 +Wire Wire Line + 4850 5200 5050 5200 +Wire Wire Line + 5050 5200 5050 5250 +Wire Wire Line + 5050 5250 5250 5250 +Wire Wire Line + 4850 5400 5050 5400 +Wire Wire Line + 5050 5400 5050 5350 +Wire Wire Line + 5050 5350 5250 5350 +Wire Wire Line + 4850 5600 5050 5600 +Wire Wire Line + 5050 5600 5050 5450 +Wire Wire Line + 5050 5450 5250 5450 +Wire Wire Line + 3750 5150 4000 5150 +Wire Wire Line + 4000 5150 4000 5000 +Wire Wire Line + 4000 5000 4200 5000 +Wire Wire Line + 4200 5200 4000 5200 +Wire Wire Line + 4000 5200 4000 5250 +Wire Wire Line + 4000 5250 3750 5250 +Wire Wire Line + 3750 5350 4000 5350 +Wire Wire Line + 4000 5350 4000 5400 +Wire Wire Line + 4000 5400 4200 5400 +Wire Wire Line + 3750 5450 4000 5450 +Wire Wire Line + 4000 5450 4000 5600 +Wire Wire Line + 4000 5600 4200 5600 +Wire Wire Line + 5250 6300 5100 6300 +Wire Wire Line + 5250 6200 5100 6200 +Wire Wire Line + 3600 9700 3150 9700 +Wire Wire Line + 3600 9500 3150 9500 +Wire Wire Line + 6100 6600 6100 6800 +Wire Wire Line + 6150 4000 6150 3800 +Wire Wire Line + 13950 3300 13700 3300 +Wire Wire Line + 13950 3600 13550 3600 +Wire Wire Line + 13950 3450 13550 3450 +Wire Wire Line + 13550 3450 13550 2950 +Wire Wire Line + 13550 2950 14350 2950 +Wire Wire Line + 14450 2950 15250 2950 +Wire Wire Line + 15250 2950 15250 3450 +Wire Wire Line + 15250 3450 14850 3450 +Wire Wire Line + 7050 6000 7600 6000 +Wire Wire Line + 5250 6000 4750 6000 +Wire Wire Line + 1550 7250 1950 7250 +Wire Wire Line + 1950 7250 1950 7050 +Wire Wire Line + 9850 5050 9100 5050 +Wire Wire Line + 10450 5050 10950 5050 +Wire Wire Line + 10750 5050 10750 5250 +Connection ~ 10750 5050 +Wire Wire Line + 9800 5200 9800 5050 +Connection ~ 9800 5050 +Wire Wire Line + 9500 5200 9500 5050 +Connection ~ 9500 5050 +Wire Wire Line + 9500 5500 9500 5650 +Connection ~ 9500 5650 +Wire Wire Line + 9800 5500 9800 5650 +Connection ~ 9800 5650 +Wire Wire Line + 11900 5050 11900 5200 +Wire Wire Line + 11600 5200 11600 5050 +Connection ~ 11600 5050 +Wire Wire Line + 11900 5650 11900 5500 +Connection ~ 10750 5650 +Wire Wire Line + 11600 5500 11600 5650 +Connection ~ 11600 5650 +Connection ~ 11900 5050 +Connection ~ 11900 5650 +Connection ~ 12250 5050 +Connection ~ 12250 5650 +Wire Wire Line + 4350 4300 4000 4300 +Wire Wire Line + 4350 4400 3900 4400 +Wire Wire Line + 10450 5450 10100 5450 +Wire Wire Line + 10150 3900 10800 3900 +Wire Wire Line + 5250 4300 5050 4300 +Wire Wire Line + 5050 4300 5050 4400 +Wire Wire Line + 5050 4400 4850 4400 +Wire Wire Line + 5250 4400 5250 4650 +Wire Wire Line + 5250 4650 3650 4650 +Wire Wire Line + 3650 4650 3650 4000 +Wire Wire Line + 3650 4000 4850 4000 +Wire Wire Line + 4850 4000 4850 4300 +Wire Wire Line + 3600 9700 3600 9750 +Wire Wire Line + 3600 9750 4750 9750 +Wire Wire Line + 7900 11450 7350 11450 +Wire Wire Line + 11300 11650 11300 11550 +Wire Wire Line + 11300 11550 11950 11550 +Wire Wire Line + 12800 5650 12800 5400 +Wire Wire Line + 12800 5050 12800 5300 +Connection ~ 12800 5050 +Wire Wire Line + 13650 5350 14450 5350 +Connection ~ 4150 9750 +Wire Wire Line + 13650 5650 14200 5650 +Connection ~ 3500 7050 +Wire Wire Line + 4050 6750 4050 6650 +Wire Wire Line + 4050 6650 3500 6650 +Connection ~ 12800 5650 +Wire Wire Line + 6200 6600 6200 6950 +Wire Wire Line + 6250 4000 6250 3900 +Wire Wire Line + 9150 3600 9400 3600 +Wire Wire Line + 10000 3600 10400 3600 +Connection ~ 10150 3600 +Connection ~ 9200 3600 +Wire Wire Line + 7900 3900 9200 3900 +Wire Wire Line + 7950 9350 7950 9750 +Wire Wire Line + 7950 9750 8550 9750 +Wire Wire Line + 8850 9750 8950 9750 +Wire Wire Line + 8950 9750 8950 9250 +Wire Wire Line + 7950 10350 9700 10350 +Wire Wire Line + 9700 10350 9700 10600 +Wire Wire Line + 9700 10900 10300 10900 +Wire Wire Line + 9700 10750 10350 10750 +Wire Wire Line + 7900 12050 7900 11650 +Wire Wire Line + 8850 12050 8900 12050 +Wire Wire Line + 8900 12050 8900 11550 +Wire Wire Line + 8550 12050 7900 12050 +Wire Wire Line + 7150 10900 8800 10900 +Wire Wire Line + 8800 10750 8100 10750 +Wire Wire Line + 8800 10600 8500 10600 +Wire Wire Line + 8900 11550 10700 11550 +Wire Wire Line + 8950 9250 10500 9250 +Wire Wire Line + 11150 9250 12250 9250 +Wire Wire Line + 12250 9250 12250 10600 +Wire Wire Line + 12150 9350 12150 10700 +Wire Wire Line + 12150 10700 12250 10700 +Wire Wire Line + 11950 11550 11950 10800 +Wire Wire Line + 11950 10800 12250 10800 +Wire Wire Line + 11500 11650 12100 11650 +Wire Wire Line + 12100 11650 12100 10900 +Wire Wire Line + 12100 10900 12250 10900 +Wire Wire Line + 8150 10050 7950 10050 +Wire Wire Line + 7950 10050 7950 10350 +Connection ~ 8150 9750 +Wire Wire Line + 7150 12350 8100 12350 +Wire Wire Line + 7150 12350 7150 10900 +Connection ~ 7900 12350 +Wire Wire Line + 8100 12050 8600 12050 +Connection ~ 8100 12050 +Connection ~ 13650 5050 +Wire Wire Line + 15700 5050 16100 5050 +Wire Wire Line + 16100 5350 16100 5650 +Wire Wire Line + 16100 5650 16500 5650 +Wire Wire Line + 4700 8750 4900 8750 +Wire Wire Line + 4900 9250 4900 9050 +Wire Wire Line + 4150 9250 4900 9250 +Wire Wire Line + 4150 9250 4150 9750 +Wire Wire Line + 4700 10550 4950 10550 +Wire Wire Line + 4950 10250 4950 9950 +Wire Wire Line + 4950 9950 4400 9950 +Wire Wire Line + 4400 9950 4400 9750 +Connection ~ 4400 9750 +Wire Wire Line + 9600 9550 9600 10150 +Wire Wire Line + 9600 10150 10950 10150 +Wire Wire Line + 10950 10150 10950 11100 +Wire Wire Line + 10950 11100 10150 11100 +Wire Wire Line + 10150 11100 10150 10900 +Connection ~ 10150 10900 +Wire Wire Line + 10000 11250 10000 10900 +Connection ~ 10000 10900 +Wire Wire Line + 6300 6700 6300 6600 +Wire Wire Line + 6000 6600 6000 7100 +Wire Wire Line + 1400 9250 1850 9250 +Wire Wire Line + 1400 9200 1400 9300 +Connection ~ 1400 9250 +Wire Wire Line + 1400 9950 1850 9950 +Wire Wire Line + 1800 9950 1800 9700 +Wire Wire Line + 1400 9900 1400 10000 +Connection ~ 1400 9950 +Connection ~ 10000 11550 +Connection ~ 9600 9250 +Connection ~ 7100 4750 +Wire Wire Line + 9100 5650 13150 5650 +Wire Wire Line + 13150 5650 13150 5300 +Connection ~ 13150 5400 +Wire Wire Line + 1950 7050 2200 7050 +Wire Wire Line + 2400 7050 4050 7050 +Wire Wire Line + 2500 7250 2500 7050 +Connection ~ 2500 7050 +Wire Wire Line + 11250 5050 14150 5050 +Wire Wire Line + 14750 5050 15100 5050 +Text Label 13700 3300 0 60 ~ 0 +VGND +Text Label 14850 3600 0 60 ~ 0 +VGND +Text Label 3900 4400 0 60 ~ 0 +USBGND +Text Label 1950 7250 0 60 ~ 0 +USBGND +Wire Wire Line + 3100 6950 3100 7050 +$Comp +L C C19 +U 1 1 575644CB +P 8950 3750 +F 0 "C19" H 8975 3850 50 0000 L CNN +F 1 "C" H 8975 3650 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 8988 3600 50 0001 C CNN +F 3 "" H 8950 3750 50 0000 C CNN + 1 8950 3750 + 1 0 0 -1 +$EndComp +$Comp +L C C18 +U 1 1 57564580 +P 8700 3750 +F 0 "C18" H 8725 3850 50 0000 L CNN +F 1 "C" H 8725 3650 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 8738 3600 50 0001 C CNN +F 3 "" H 8700 3750 50 0000 C CNN + 1 8700 3750 + 1 0 0 -1 +$EndComp +$Comp +L C C17 +U 1 1 57564635 +P 8450 3750 +F 0 "C17" H 8475 3850 50 0000 L CNN +F 1 "C" H 8475 3650 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 8488 3600 50 0001 C CNN +F 3 "" H 8450 3750 50 0000 C CNN + 1 8450 3750 + 1 0 0 -1 +$EndComp +$Comp +L C C12 +U 1 1 575646EC +P 8200 3750 +F 0 "C12" H 8225 3850 50 0000 L CNN +F 1 "C" H 8225 3650 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 8238 3600 50 0001 C CNN +F 3 "" H 8200 3750 50 0000 C CNN + 1 8200 3750 + 1 0 0 -1 +$EndComp +Wire Wire Line + 8200 3600 9200 3600 +Wire Wire Line + 8450 3600 8950 3600 +Connection ~ 8700 3600 +Connection ~ 8450 3600 +Connection ~ 8950 3600 +Wire Wire Line + 8200 3900 8950 3900 +Connection ~ 8700 3900 +Connection ~ 8950 3900 +Connection ~ 8450 3900 +Connection ~ 8200 3900 +$EndSCHEMATC diff --git a/PCB/Tinylab_proto1.csv b/PCB/Tinylab_proto1.csv new file mode 100644 index 00000000..713d1a0c --- /dev/null +++ b/PCB/Tinylab_proto1.csv @@ -0,0 +1,67 @@ +Reference; Value; Footprint; Datasheet +C1;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C2;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C3;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C4;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C5;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C6;SMD 4mm 33uF;Capacitors_SMD:c_elec_5x5.3; +C7;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C8;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C9;SMD 4mm 33uF;Capacitors_SMD:c_elec_4x5.3; +C10;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C11;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C13;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C14;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +C15;Thru Hole 6.3mm 220uF;Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5; +C16;SMD MLCC 1uF 16V 0603;Capacitors_SMD:C_0603; +D1;Thru Hole Schottky 1A;Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10; +F1;SMD PTC 400mA;Capacitors_SMD:C_1206; +IC1;QFN ATXMEGA16A4U-A;Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm; +L1;Thru Hole Radial 220uH;Inductors:INDUCTOR_V; +L2;SMD 10uH 1210;Resistors_SMD:R_1210; +L3;SMD 10uH 1210;Resistors_SMD:R_1210; +P1;Female Header 1x2;Pin_Headers:Pin_Header_Straight_1x02; +P2;Micro USB-B Connector (F);Connect:USB_Micro-B_WIDE; +P3;Male header 1x4;Pin_Headers:Pin_Header_Straight_1x04; +P4;Male header 2x2;Pin_Headers:Pin_Header_Straight_2x02; +P5;Female Header 1x2;Pin_Headers:Pin_Header_Straight_1x02; +P6;Male header 1x4;Pin_Headers:Pin_Header_Straight_1x04; +P7;Male header 1x2;Pin_Headers:Pin_Header_Straight_2x02; +P8;Feamle Header 1x2;Pin_Headers:Pin_Header_Straight_1x02; +P9;Female Header 1x2;Pin_Headers:Pin_Header_Straight_1x02; +P10;Female Header 1x2;Pin_Headers:Pin_Header_Straight_1x02; +Q1;SMD nMOS Transistor TSM2302CX ;SMD:SOT-23-3; +R1;SMD 1M? 20V 0603;Resistors_SMD:R_0603; +R2;SMD 1M? 20V 0603;Resistors_SMD:R_0603; +R3;SMD 75k? 6.3V 0603;Resistors_SMD:R_0603; +R4;SMD 75k? 6.3V 0603;Resistors_SMD:R_0603; +R5;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R6;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R7;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R8;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R9;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R10;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R11;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R12;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R13;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R14;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R15;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R16;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R17;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R18;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R19;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R20;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R21;SMD 100? 16V 0603;Resistors_SMD:R_0603; +R22;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R23;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R24;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R25;SMD 28? 6.3V 0603;Resistors_SMD:R_0603; +R26;SMD 1k? 16V 0603;Resistors_SMD:R_0603; +R27;SMD 100? 16V 0603;Resistors_SMD:R_0603; +R28;SMD 100? 16V 0603;Resistors_SMD:R_0603; +R29;SMD 100? 16V 0603;Resistors_SMD:R_0603; +R30;SMD 100? 16V 0603;Resistors_SMD:R_0603; +U1;SMD 3.3V Reg RT9161A-33GV;SMD:SOT-23-3; +U2;SMD LM324;Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm; +U3;SMD DMN63D8LDW;TO_SOT_Packages_SMD:SOT-363; +U4;SMD DMN63D8LDW;TO_SOT_Packages_SMD:SOT-363; diff --git a/PCB/Tinylab_proto1.dsn b/PCB/Tinylab_proto1.dsn new file mode 100644 index 00000000..c4122e91 --- /dev/null +++ b/PCB/Tinylab_proto1.dsn @@ -0,0 +1,763 @@ +(pcb C:\Users\Esposch\Documents\KiCAD\Tinylab_proto1\Tinylab_proto1.dsn + (parser + (string_quote ") + (space_in_quoted_tokens on) + (host_cad "KiCad's Pcbnew") + (host_version "(2015-08-05 BZR 6055, Git fa29c62)-product") + ) + (resolution um 10) + (unit um) + (structure + (layer F.Cu + (type signal) + (property + (index 0) + ) + ) + (layer B.Cu + (type signal) + (property + (index 1) + ) + ) + (boundary + (path pcb 0 81280 -53340 240030 -53340 240030 -147320 81280 -147320 + 81280 -53340 81280 -53340) + ) + (via "Via[0-1]_600:400_um") + (rule + (width 250) + (clearance 200.1) + (clearance 200.1 (type default_smd)) + (clearance 50 (type smd_smd)) + ) + ) + (placement + (component Capacitors_SMD:C_1812_HandSoldering + (place C1 208215 -100175 front 0 (PN C)) + (place C3 184915 -123725 front 0 (PN C_Small)) + (place C4 192075 -115425 front 0 (PN C_Small)) + (place C5 203015 -123525 front 0 (PN C_Small)) + (place C6 210175 -108275 front 0 (PN C_Small)) + (place C7 193965 -123525 front 0 (PN C)) + (place C8 201125 -115425 front 0 (PN C_Small)) + ) + (component Capacitors_SMD:C_1812 + (place C2 210865 -116375 front 0 (PN C)) + ) + (component Capacitors_Elko_ThroughHole:Elko_vert_11.2x6.3mm_RM2.5_CopperClear + (place C9 124855 -107555 front 0 (PN CP1)) + ) + (component Resistors_SMD:R_2512_HandSoldering + (place F1 174565 -88175 front 0 (PN F_Small)) + (place R1 162915 -88175 front 0 (PN R)) + (place R2 151265 -88175 front 0 (PN R)) + (place R3 139615 -102775 front 0 (PN R)) + (place R4 127965 -118875 front 0 (PN R)) + (place R5 174565 -121375 front 0 (PN R)) + (place R6 116315 -118875 front 0 (PN R)) + (place R7 186215 -96475 front 0 (PN R)) + (place R8 151265 -104775 front 0 (PN R)) + (place R9 162915 -104775 front 0 (PN R)) + (place R10 174565 -104775 front 0 (PN R)) + (place R11 186215 -104775 front 0 (PN R)) + (place R12 139615 -113075 front 0 (PN R)) + (place R13 151265 -113075 front 0 (PN R)) + (place R14 162915 -113075 front 0 (PN R)) + (place R15 174565 -113075 front 0 (PN R)) + (place R16 139615 -121375 front 0 (PN R)) + (place R17 174565 -96475 front 0 (PN R)) + (place R18 197865 -96475 front 0 (PN R)) + (place R19 162915 -121375 front 0 (PN R)) + (place R20 162915 -96475 front 0 (PN R)) + (place R21 151265 -121375 front 0 (PN R)) + (place R22 151265 -96475 front 0 (PN R)) + (place R23 197865 -88175 front 0 (PN R)) + (place R24 186215 -88175 front 0 (PN R)) + ) + (component "Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm" + (place IC1 117615 -92725 front 0 (PN "ATXMEGA16A4U-A")) + ) + (component Pin_Headers:Pin_Header_Straight_1x04 + (place P1 128610 -90175 front 0 (PN SCOPE_IN)) + (place P3 208343 -76075 front 0 (PN DIG_OUT)) + ) + (component "Connect:USB_Micro-B" + (place P2 208515 -90275 front 0 (PN USB_OTG)) + ) + (component Pin_Headers:Pin_Header_Straight_1x03 + (place P4 116598 -107575 front 0 (PN OPAMP_JUMPER)) + ) + (component Pin_Headers:Pin_Header_Straight_1x02 + (place P5 213635 -76075 front 0 (PN HVI)) + (place P6 183975 -115075 front 0 (PN AWG_OUT)) + (place P7 131515 -106025 front 0 (PN HVO)) + (place P8 194696 -106775 front 0 (PN DIG_IN)) + ) + (component Connect:C96ABCFD + (place T1 157755 -78595 front 0 (PN TIP29A)) + ) + (component "SMD:SOT-23-3" + (place U1 120685 -125535 front 0 (PN 78L05)) + ) + (component "Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm" + (place U2 136405 -92200 front 0 (PN LM324)) + ) + (component Footprints:SOT363 + (place U3 113928 -125375 front 0 (PN DMN63D8LDW)) + ) + ) + (library + (image Capacitors_SMD:C_1812_HandSoldering + (outline (path signal 50 -4300 1850 4300 1850)) + (outline (path signal 50 -4300 -1850 4300 -1850)) + (outline (path signal 50 -4300 1850 -4300 -1850)) + (outline (path signal 50 4300 1850 4300 -1850)) + (outline (path signal 150 1800 1725 -1800 1725)) + (outline (path signal 150 -1800 -1725 1800 -1725)) + (pin Rect[T]Pad_2200x3000_um 1 -2900 0) + (pin Rect[T]Pad_2200x3000_um 2 2900 0) + ) + (image Capacitors_SMD:C_1812 + (outline (path signal 50 -3100 1850 3100 1850)) + (outline (path signal 50 -3100 -1850 3100 -1850)) + (outline (path signal 50 -3100 1850 -3100 -1850)) + (outline (path signal 50 3100 1850 3100 -1850)) + (outline (path signal 150 1800 1725 -1800 1725)) + (outline (path signal 150 -1800 -1725 1800 -1725)) + (pin Rect[T]Pad_1000x3000_um 1 -2300 0) + (pin Rect[T]Pad_1000x3000_um 2 2300 0) + ) + (image Capacitors_Elko_ThroughHole:Elko_vert_11.2x6.3mm_RM2.5_CopperClear + (outline (path signal 150 269.24 1699.26 769.62 1699.26)) + (outline (path signal 150 269.24 1699.26 269.24 2199.64)) + (outline (path signal 150 -231.14 1699.26 269.24 1699.26)) + (outline (path signal 150 269.24 1699.26 269.24 1300.48)) + (outline (path signal 150 269.24 1300.48 269.24 1198.88)) + (outline (path signal 150 4419.6 0 4265.45 -973.28 3818.08 -1851.29 3121.29 -2548.08 + 2243.28 -2995.45 1270 -3149.6 296.72 -2995.45 -581.288 -2548.08 + -1278.08 -1851.29 -1725.45 -973.28 -1879.6 0 -1725.45 973.28 + -1278.08 1851.29 -581.288 2548.08 296.72 2995.45 1270 3149.6 + 2243.28 2995.45 3121.29 2548.08 3818.08 1851.29 4265.45 973.28)) + (pin Round[A]Pad_1501.14_um 2 2540 0) + (pin Round[A]Pad_1501.14_um 1 0 0) + ) + (image Resistors_SMD:R_2512_HandSoldering + (outline (path signal 50 -5600 1950 5600 1950)) + (outline (path signal 50 -5600 -1950 5600 -1950)) + (outline (path signal 50 -5600 1950 -5600 -1950)) + (outline (path signal 50 5600 1950 5600 -1950)) + (outline (path signal 150 2600 -1825 -2600 -1825)) + (outline (path signal 150 -2600 1825 2600 1825)) + (pin Rect[T]Pad_2700x3200_um 1 -3950 0) + (pin Rect[T]Pad_2700x3200_um 2 3950 0) + ) + (image "Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm" + (outline (path signal 50 -6900 6900 -6900 -6900)) + (outline (path signal 50 6900 6900 6900 -6900)) + (outline (path signal 50 -6900 6900 6900 6900)) + (outline (path signal 50 -6900 -6900 6900 -6900)) + (outline (path signal 150 -5175 5175 -5175 4505)) + (outline (path signal 150 5175 5175 5175 4505)) + (outline (path signal 150 5175 -5175 5175 -4505)) + (outline (path signal 150 -5175 -5175 -5175 -4505)) + (outline (path signal 150 -5175 5175 -4505 5175)) + (outline (path signal 150 -5175 -5175 -4505 -5175)) + (outline (path signal 150 5175 -5175 4505 -5175)) + (outline (path signal 150 5175 5175 4505 5175)) + (outline (path signal 150 -5175 4505 -6650 4505)) + (pin Rect[T]Pad_1600x560_um 1 -5850 4000) + (pin Rect[T]Pad_1600x560_um 2 -5850 3200) + (pin Rect[T]Pad_1600x560_um 3 -5850 2400) + (pin Rect[T]Pad_1600x560_um 4 -5850 1600) + (pin Rect[T]Pad_1600x560_um 5 -5850 800) + (pin Rect[T]Pad_1600x560_um 6 -5850 0) + (pin Rect[T]Pad_1600x560_um 7 -5850 -800) + (pin Rect[T]Pad_1600x560_um 8 -5850 -1600) + (pin Rect[T]Pad_1600x560_um 9 -5850 -2400) + (pin Rect[T]Pad_1600x560_um 10 -5850 -3200) + (pin Rect[T]Pad_1600x560_um 11 -5850 -4000) + (pin Rect[T]Pad_1600x560_um (rotate 90) 12 -4000 -5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 13 -3200 -5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 14 -2400 -5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 15 -1600 -5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 16 -800 -5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 17 0 -5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 18 800 -5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 19 1600 -5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 20 2400 -5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 21 3200 -5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 22 4000 -5850) + (pin Rect[T]Pad_1600x560_um 23 5850 -4000) + (pin Rect[T]Pad_1600x560_um 24 5850 -3200) + (pin Rect[T]Pad_1600x560_um 25 5850 -2400) + (pin Rect[T]Pad_1600x560_um 26 5850 -1600) + (pin Rect[T]Pad_1600x560_um 27 5850 -800) + (pin Rect[T]Pad_1600x560_um 28 5850 0) + (pin Rect[T]Pad_1600x560_um 29 5850 800) + (pin Rect[T]Pad_1600x560_um 30 5850 1600) + (pin Rect[T]Pad_1600x560_um 31 5850 2400) + (pin Rect[T]Pad_1600x560_um 32 5850 3200) + (pin Rect[T]Pad_1600x560_um 33 5850 4000) + (pin Rect[T]Pad_1600x560_um (rotate 90) 34 4000 5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 35 3200 5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 36 2400 5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 37 1600 5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 38 800 5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 39 0 5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 40 -800 5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 41 -1600 5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 42 -2400 5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 43 -3200 5850) + (pin Rect[T]Pad_1600x560_um (rotate 90) 44 -4000 5850) + ) + (image Pin_Headers:Pin_Header_Straight_1x04 + (outline (path signal 50 -1750 1750 -1750 -9400)) + (outline (path signal 50 1750 1750 1750 -9400)) + (outline (path signal 50 -1750 1750 1750 1750)) + (outline (path signal 50 -1750 -9400 1750 -9400)) + (outline (path signal 150 -1270 -1270 -1270 -8890)) + (outline (path signal 150 1270 -1270 1270 -8890)) + (outline (path signal 150 1550 1550 1550 0)) + (outline (path signal 150 -1270 -8890 1270 -8890)) + (outline (path signal 150 1270 -1270 -1270 -1270)) + (outline (path signal 150 -1550 0 -1550 1550)) + (outline (path signal 150 -1550 1550 1550 1550)) + (pin Rect[A]Pad_2032x1727.2_um 1 0 0) + (pin Oval[A]Pad_2032x1727.2_um 2 0 -2540) + (pin Oval[A]Pad_2032x1727.2_um 3 0 -5080) + (pin Oval[A]Pad_2032x1727.2_um 4 0 -7620) + ) + (image "Connect:USB_Micro-B" + (outline (path signal 50 -4600 2800 4600 2800)) + (outline (path signal 50 4600 2800 4600 -4050)) + (outline (path signal 50 4600 -4050 -4600 -4050)) + (outline (path signal 50 -4600 -4050 -4600 2800)) + (outline (path signal 150 -4350.9 -3817.46 4349.1 -3817.46)) + (outline (path signal 150 -4350.9 2587.54 4349.1 2587.54)) + (outline (path signal 150 4349.1 2587.54 4349.1 -3817.46)) + (outline (path signal 150 4349.1 -2587.46 -4350.9 -2587.46)) + (outline (path signal 150 -4350.9 -3817.46 -4350.9 2587.54)) + (pin Rect[T]Pad_1350x400_um (rotate 90) 1 -1300.9 1562.54) + (pin Rect[T]Pad_1350x400_um (rotate 90) 2 -650.9 1562.54) + (pin Rect[T]Pad_1350x400_um (rotate 90) 3 -0.9 1562.54) + (pin Rect[T]Pad_1350x400_um (rotate 90) 4 649.1 1562.54) + (pin Rect[T]Pad_1350x400_um (rotate 90) 5 1299.1 1562.54) + (pin Oval[A]Pad_950x1250_um (rotate 90) 6 -2500.9 1562.54) + (pin Oval[A]Pad_950x1250_um (rotate 90) 6@1 2499.1 1562.54) + (pin Oval[A]Pad_1550x1000_um (rotate 90) 6@2 -3500.9 -1137.46) + (pin Oval[A]Pad_1550x1000_um (rotate 90) 6@3 3499.1 -1137.46) + ) + (image Pin_Headers:Pin_Header_Straight_1x03 + (outline (path signal 50 -1750 1750 -1750 -6850)) + (outline (path signal 50 1750 1750 1750 -6850)) + (outline (path signal 50 -1750 1750 1750 1750)) + (outline (path signal 50 -1750 -6850 1750 -6850)) + (outline (path signal 150 -1270 -1270 -1270 -6350)) + (outline (path signal 150 -1270 -6350 1270 -6350)) + (outline (path signal 150 1270 -6350 1270 -1270)) + (outline (path signal 150 1550 1550 1550 0)) + (outline (path signal 150 1270 -1270 -1270 -1270)) + (outline (path signal 150 -1550 0 -1550 1550)) + (outline (path signal 150 -1550 1550 1550 1550)) + (pin Rect[A]Pad_2032x1727.2_um 1 0 0) + (pin Oval[A]Pad_2032x1727.2_um 2 0 -2540) + (pin Oval[A]Pad_2032x1727.2_um 3 0 -5080) + ) + (image Pin_Headers:Pin_Header_Straight_1x02 + (outline (path signal 150 1270 -1270 1270 -3810)) + (outline (path signal 150 1550 1550 1550 0)) + (outline (path signal 50 -1750 1750 -1750 -4300)) + (outline (path signal 50 1750 1750 1750 -4300)) + (outline (path signal 50 -1750 1750 1750 1750)) + (outline (path signal 50 -1750 -4300 1750 -4300)) + (outline (path signal 150 1270 -1270 -1270 -1270)) + (outline (path signal 150 -1550 0 -1550 1550)) + (outline (path signal 150 -1550 1550 1550 1550)) + (outline (path signal 150 -1270 -1270 -1270 -3810)) + (outline (path signal 150 -1270 -3810 1270 -3810)) + (pin Rect[A]Pad_2032x2032_um 1 0 0) + (pin Oval[A]Pad_2032x2032_um 2 0 -2540) + ) + (image Connect:C96ABCFD + (outline (path signal 150 -46990 -5080 46990 -5080)) + (outline (path signal 150 46990 -5080 46990 2540)) + (outline (path signal 150 -46990 2540 -46990 -5080)) + (outline (path signal 150 -41910 2540 -41910 -5080)) + (outline (path signal 150 41910 2540 41910 -5080)) + (outline (path signal 150 -46990 2540 -46990 5080)) + (outline (path signal 150 -46990 5080 46990 5080)) + (outline (path signal 150 46990 5080 46990 2540)) + (outline (path signal 150 41910 5080 41910 2540)) + (outline (path signal 150 -41910 2540 -41910 5080)) + (pin Round[A]Pad_3810_um 65 -44450 0) + (pin Round[A]Pad_3810_um 66 44450 0) + (pin Round[A]Pad_1524_um A3 -34290 -2540) + (pin Round[A]Pad_1524_um A4 -31750 -2540) + (pin Round[A]Pad_1524_um A5 -29210 -2540) + (pin Round[A]Pad_1524_um A6 -26670 -2540) + (pin Round[A]Pad_1524_um A7 -24130 -2540) + (pin Round[A]Pad_1524_um A8 -21590 -2540) + (pin Round[A]Pad_1524_um A9 -19050 -2540) + (pin Round[A]Pad_1524_um A10 -16510 -2540) + (pin Round[A]Pad_1524_um A11 -13970 -2540) + (pin Round[A]Pad_1524_um A12 -11430 -2540) + (pin Round[A]Pad_1524_um A13 -8890 -2540) + (pin Round[A]Pad_1524_um A14 -6350 -2540) + (pin Round[A]Pad_1524_um A15 -3810 -2540) + (pin Round[A]Pad_1524_um A16 -1270 -2540) + (pin Round[A]Pad_1524_um A17 1270 -2540) + (pin Round[A]Pad_1524_um A18 3810 -2540) + (pin Round[A]Pad_1524_um A19 6350 -2540) + (pin Round[A]Pad_1524_um A20 8890 -2540) + (pin Round[A]Pad_1524_um A21 11430 -2540) + (pin Round[A]Pad_1524_um A22 13970 -2540) + (pin Round[A]Pad_1524_um A23 16510 -2540) + (pin Round[A]Pad_1524_um A24 19050 -2540) + (pin Round[A]Pad_1524_um A25 21590 -2540) + (pin Round[A]Pad_1524_um A26 24130 -2540) + (pin Round[A]Pad_1524_um A27 26670 -2540) + (pin Round[A]Pad_1524_um A28 29210 -2540) + (pin Round[A]Pad_1524_um A29 31750 -2540) + (pin Round[A]Pad_1524_um A30 34290 -2540) + (pin Round[A]Pad_1524_um A31 36830 -2540) + (pin Round[A]Pad_1524_um A32 39370 -2540) + (pin Round[A]Pad_1524_um A2 -36830 -2540) + (pin Rect[A]Pad_1524x1524_um A1 -39370 -2540) + (pin Round[A]Pad_1524_um B1 -39370 0) + (pin Round[A]Pad_1524_um B2 -36830 0) + (pin Round[A]Pad_1524_um B3 -34290 0) + (pin Round[A]Pad_1524_um B4 -31750 0) + (pin Round[A]Pad_1524_um B5 -29210 0) + (pin Round[A]Pad_1524_um B6 -26670 0) + (pin Round[A]Pad_1524_um B7 -24130 0) + (pin Round[A]Pad_1524_um B8 -21590 0) + (pin Round[A]Pad_1524_um B9 -19050 0) + (pin Round[A]Pad_1524_um B10 -16510 0) + (pin Round[A]Pad_1524_um B11 -13970 0) + (pin Round[A]Pad_1524_um B12 -11430 0) + (pin Round[A]Pad_1524_um B13 -8890 0) + (pin Round[A]Pad_1524_um B14 -6350 0) + (pin Round[A]Pad_1524_um B15 -3810 0) + (pin Round[A]Pad_1524_um B16 -1270 0) + (pin Round[A]Pad_1524_um B17 1270 0) + (pin Round[A]Pad_1524_um B18 3810 0) + (pin Round[A]Pad_1524_um B19 6350 0) + (pin Round[A]Pad_1524_um B20 8890 0) + (pin Round[A]Pad_1524_um B21 11430 0) + (pin Round[A]Pad_1524_um B22 13970 0) + (pin Round[A]Pad_1524_um B23 16510 0) + (pin Round[A]Pad_1524_um B24 19050 0) + (pin Round[A]Pad_1524_um B25 21590 0) + (pin Round[A]Pad_1524_um B26 24130 0) + (pin Round[A]Pad_1524_um B27 26670 0) + (pin Round[A]Pad_1524_um B28 29210 0) + (pin Round[A]Pad_1524_um B29 31750 0) + (pin Round[A]Pad_1524_um B30 34290 0) + (pin Round[A]Pad_1524_um B31 36830 0) + (pin Round[A]Pad_1524_um B32 39370 0) + (pin Round[A]Pad_1524_um C1 -39370 2540) + (pin Round[A]Pad_1524_um C2 -36830 2540) + (pin Round[A]Pad_1524_um C3 -34290 2540) + (pin Round[A]Pad_1524_um C4 -31750 2540) + (pin Round[A]Pad_1524_um C5 -29210 2540) + (pin Round[A]Pad_1524_um C6 -26670 2540) + (pin Round[A]Pad_1524_um C7 -24130 2540) + (pin Round[A]Pad_1524_um C8 -21590 2540) + (pin Round[A]Pad_1524_um C9 -19050 2540) + (pin Round[A]Pad_1524_um C10 -16510 2540) + (pin Round[A]Pad_1524_um C11 -13970 2540) + (pin Round[A]Pad_1524_um C12 -11430 2540) + (pin Round[A]Pad_1524_um C13 -8890 2540) + (pin Round[A]Pad_1524_um C14 -6350 2540) + (pin Round[A]Pad_1524_um C15 -3810 2540) + (pin Round[A]Pad_1524_um C16 -1270 2540) + (pin Round[A]Pad_1524_um C17 1270 2540) + (pin Round[A]Pad_1524_um C18 3810 2540) + (pin Round[A]Pad_1524_um C19 6350 2540) + (pin Round[A]Pad_1524_um C20 8890 2540) + (pin Round[A]Pad_1524_um C21 11430 2540) + (pin Round[A]Pad_1524_um C22 13970 2540) + (pin Round[A]Pad_1524_um C23 16510 2540) + (pin Round[A]Pad_1524_um C24 19050 2540) + (pin Round[A]Pad_1524_um C25 21590 2540) + (pin Round[A]Pad_1524_um C26 24130 2540) + (pin Round[A]Pad_1524_um C27 26670 2540) + (pin Round[A]Pad_1524_um C28 29210 2540) + (pin Round[A]Pad_1524_um C29 31750 2540) + (pin Round[A]Pad_1524_um C30 34290 2540) + (pin Round[A]Pad_1524_um C31 36830 2540) + (pin Round[A]Pad_1524_um C32 39370 2540) + ) + (image "SMD:SOT-23-3" + (outline (path signal 150 1141.42 400 1134.5 356.298 1114.41 316.875 1083.12 285.588 + 1043.7 265.5 1000 258.579 956.298 265.5 916.875 285.588 885.588 316.875 + 865.5 356.298 858.579 400 865.5 443.702 885.588 483.125 916.875 514.412 + 956.298 534.5 1000 541.421 1043.7 534.5 1083.12 514.412 1114.41 483.125 + 1134.5 443.702)) + (outline (path signal 150 -1500 800 -1500 -800)) + (outline (path signal 150 -1500 -800 1500 -800)) + (outline (path signal 150 1500 -800 1500 800)) + (outline (path signal 150 1500 800 -1500 800)) + (pin Rect[T]Pad_600x900_um 3 0 -1400) + (pin Rect[T]Pad_600x900_um 2 -950 1400) + (pin Rect[T]Pad_600x900_um 1 950 1400) + ) + (image "Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm" + (outline (path signal 50 -3700 4650 -3700 -4650)) + (outline (path signal 50 3700 4650 3700 -4650)) + (outline (path signal 50 -3700 4650 3700 4650)) + (outline (path signal 50 -3700 -4650 3700 -4650)) + (outline (path signal 150 -2075 4450 -2075 4335)) + (outline (path signal 150 2075 4450 2075 4335)) + (outline (path signal 150 2075 -4450 2075 -4335)) + (outline (path signal 150 -2075 -4450 -2075 -4335)) + (outline (path signal 150 -2075 4450 2075 4450)) + (outline (path signal 150 -2075 -4450 2075 -4450)) + (outline (path signal 150 -2075 4335 -3450 4335)) + (pin Rect[T]Pad_1500x600_um 1 -2700 3810) + (pin Rect[T]Pad_1500x600_um 2 -2700 2540) + (pin Rect[T]Pad_1500x600_um 3 -2700 1270) + (pin Rect[T]Pad_1500x600_um 4 -2700 0) + (pin Rect[T]Pad_1500x600_um 5 -2700 -1270) + (pin Rect[T]Pad_1500x600_um 6 -2700 -2540) + (pin Rect[T]Pad_1500x600_um 7 -2700 -3810) + (pin Rect[T]Pad_1500x600_um 8 2700 -3810) + (pin Rect[T]Pad_1500x600_um 9 2700 -2540) + (pin Rect[T]Pad_1500x600_um 10 2700 -1270) + (pin Rect[T]Pad_1500x600_um 11 2700 0) + (pin Rect[T]Pad_1500x600_um 12 2700 1270) + (pin Rect[T]Pad_1500x600_um 13 2700 2540) + (pin Rect[T]Pad_1500x600_um 14 2700 3810) + ) + (image Footprints:SOT363 + (outline (path signal 152.4 635 -1016 635 1016)) + (outline (path signal 152.4 635 1016 -635 1016)) + (outline (path signal 152.4 -635 1016 -635 -1016)) + (outline (path signal 152.4 -635 -1016 635 -1016)) + (pin Rect[T]Pad_508x304.8_um 1 -1016 635) + (pin Rect[T]Pad_508x304.8_um 3 -1016 -635) + (pin Rect[T]Pad_508x304.8_um 5 1016 0) + (pin Rect[T]Pad_508x304.8_um 2 -1016 0) + (pin Rect[T]Pad_508x304.8_um 4 1016 -635) + (pin Rect[T]Pad_508x304.8_um 6 1016 635) + ) + (padstack Round[A]Pad_1501.14_um + (shape (circle F.Cu 1501.14)) + (shape (circle B.Cu 1501.14)) + (attach off) + ) + (padstack Round[A]Pad_1524_um + (shape (circle F.Cu 1524)) + (shape (circle B.Cu 1524)) + (attach off) + ) + (padstack Round[A]Pad_3810_um + (shape (circle F.Cu 3810)) + (shape (circle B.Cu 3810)) + (attach off) + ) + (padstack Oval[A]Pad_1550x1000_um + (shape (path F.Cu 1000 -275 0 275 0)) + (shape (path B.Cu 1000 -275 0 275 0)) + (attach off) + ) + (padstack Oval[A]Pad_2032x1727.2_um + (shape (path F.Cu 1727.2 -152.4 0 152.4 0)) + (shape (path B.Cu 1727.2 -152.4 0 152.4 0)) + (attach off) + ) + (padstack Oval[A]Pad_2032x2032_um + (shape (path F.Cu 2032 0 0 0 0)) + (shape (path B.Cu 2032 0 0 0 0)) + (attach off) + ) + (padstack Oval[A]Pad_950x1250_um + (shape (path F.Cu 950 0 -150 0 150)) + (shape (path B.Cu 950 0 -150 0 150)) + (attach off) + ) + (padstack Rect[A]Pad_2032x2032_um + (shape (rect F.Cu -1016 -1016 1016 1016)) + (shape (rect B.Cu -1016 -1016 1016 1016)) + (attach off) + ) + (padstack Rect[A]Pad_2032x1727.2_um + (shape (rect F.Cu -1016 -863.6 1016 863.6)) + (shape (rect B.Cu -1016 -863.6 1016 863.6)) + (attach off) + ) + (padstack Rect[T]Pad_2200x3000_um + (shape (rect F.Cu -1100 -1500 1100 1500)) + (attach off) + ) + (padstack Rect[T]Pad_2700x3200_um + (shape (rect F.Cu -1350 -1600 1350 1600)) + (attach off) + ) + (padstack Rect[T]Pad_508x304.8_um + (shape (rect F.Cu -254 -152.4 254 152.4)) + (attach off) + ) + (padstack Rect[T]Pad_600x900_um + (shape (rect F.Cu -300 -450 300 450)) + (attach off) + ) + (padstack Rect[T]Pad_1000x3000_um + (shape (rect F.Cu -500 -1500 500 1500)) + (attach off) + ) + (padstack Rect[T]Pad_1350x400_um + (shape (rect F.Cu -675 -200 675 200)) + (attach off) + ) + (padstack Rect[T]Pad_1500x600_um + (shape (rect F.Cu -750 -300 750 300)) + (attach off) + ) + (padstack Rect[A]Pad_1524x1524_um + (shape (rect F.Cu -762 -762 762 762)) + (shape (rect B.Cu -762 -762 762 762)) + (attach off) + ) + (padstack Rect[T]Pad_1600x560_um + (shape (rect F.Cu -800 -280 800 280)) + (attach off) + ) + (padstack "Via[0-1]_600:400_um" + (shape (circle F.Cu 600)) + (shape (circle B.Cu 600)) + (attach off) + ) + ) + (network + (net "Net-(C1-Pad1)" + (pins C1-1 P1-4 R1-2) + ) + (net "Net-(C1-Pad2)" + (pins C1-2 P1-3) + ) + (net "Net-(C2-Pad1)" + (pins C2-1 P1-1 R2-2) + ) + (net "Net-(C2-Pad2)" + (pins C2-2 P1-2) + ) + (net +5V + (pins C3-1 P2-5 P2-6 P2-6@1 P2-6@2 P2-6@3 R16-2) + ) + (net GND + (pins C3-2 C4-2 C6-2 F1-1 IC1-8 IC1-14 IC1-18 IC1-30 P2-1 R15-2 R21-2 U3-1 U3-4) + ) + (net /VCC_3V3 + (pins C4-1 IC1-9 IC1-19 IC1-31) + ) + (net /AVCC + (pins C5-1 IC1-39 R5-1) + ) + (net /AGND + (pins C5-2 IC1-38 R6-1) + ) + (net "Net-(C6-Pad1)" + (pins C6-1 R19-1 U2-12) + ) + (net "Net-(C7-Pad1)" + (pins C7-1 P6-2) + ) + (net "Net-(C7-Pad2)" + (pins C7-2 P6-1 R20-1) + ) + (net /LM324_VCC + (pins C8-1 P4-2 U2-4) + ) + (net /VGND + (pins C8-2 F1-2 IC1-43 P5-2 R24-2 U2-11) + ) + (net /VSENSE_OCP + (pins C9-2 IC1-41 P7-2 R23-2 R24-1) + ) + (net "Net-(C9-Pad1)" + (pins C9-1 P7-1 R23-1) + ) + (net "Net-(IC1-Pad1)" + (pins IC1-1) + ) + (net "Net-(IC1-Pad2)" + (pins IC1-2) + ) + (net "Net-(IC1-Pad3)" + (pins IC1-3) + ) + (net "Net-(IC1-Pad4)" + (pins IC1-4) + ) + (net "Net-(IC1-Pad5)" + (pins IC1-5) + ) + (net /DAC_OUT + (pins IC1-6 U2-10) + ) + (net "Net-(IC1-Pad7)" + (pins IC1-7) + ) + (net "Net-(IC1-Pad10)" + (pins IC1-10) + ) + (net /XCK + (pins IC1-11 IC1-15) + ) + (net /DIG_CH2 + (pins IC1-12 U3-3) + ) + (net "Net-(IC1-Pad13)" + (pins IC1-13) + ) + (net "Net-(IC1-Pad16)" + (pins IC1-16) + ) + (net /DIG_CH1 + (pins IC1-17 U3-6) + ) + (net "Net-(IC1-Pad20)" + (pins IC1-20) + ) + (net "Net-(IC1-Pad21)" + (pins IC1-21) + ) + (net "Net-(IC1-Pad22)" + (pins IC1-22) + ) + (net "Net-(IC1-Pad23)" + (pins IC1-23) + ) + (net /PSU_PWM + (pins IC1-24 R19-2) + ) + (net "Net-(IC1-Pad25)" + (pins IC1-25) + ) + (net "/D-" + (pins IC1-26 P2-2) + ) + (net /D+ + (pins IC1-27 P2-3) + ) + (net "Net-(IC1-Pad28)" + (pins IC1-28 R11-1) + ) + (net "Net-(IC1-Pad29)" + (pins IC1-29 R12-1) + ) + (net "Net-(IC1-Pad32)" + (pins IC1-32 R13-1) + ) + (net "Net-(IC1-Pad33)" + (pins IC1-33 R14-1) + ) + (net "Net-(IC1-Pad34)" + (pins IC1-34) + ) + (net "Net-(IC1-Pad35)" + (pins IC1-35 R15-1) + ) + (net "Net-(IC1-Pad36)" + (pins IC1-36) + ) + (net "Net-(IC1-Pad37)" + (pins IC1-37) + ) + (net /CH1 + (pins IC1-40 U2-1 U2-2) + ) + (net /CH2 + (pins IC1-42 U2-6 U2-7) + ) + (net /AVCC_ON_2 + (pins IC1-44 R3-2 R4-1 R5-2 R6-2) + ) + (net "Net-(P2-Pad4)" + (pins P2-4) + ) + (net "Net-(P3-Pad1)" + (pins P3-1 R10-2) + ) + (net "Net-(P3-Pad2)" + (pins P3-2 R9-2) + ) + (net "Net-(P3-Pad3)" + (pins P3-3 R8-2) + ) + (net "Net-(P3-Pad4)" + (pins P3-4 R7-2) + ) + (net +12V + (pins P4-1 P5-1) + ) + (net "Net-(P4-Pad3)" + (pins P4-3 R17-1) + ) + (net "Net-(P8-Pad1)" + (pins P8-1 U3-5) + ) + (net "Net-(P8-Pad2)" + (pins P8-2 U3-2) + ) + (net "Net-(R1-Pad1)" + (pins R1-1 R3-1 U2-3) + ) + (net "Net-(R2-Pad1)" + (pins R2-1 R4-2 U2-5) + ) + (net "Net-(R11-Pad2)" + (pins R7-1 R11-2) + ) + (net "Net-(R12-Pad2)" + (pins R8-1 R12-2) + ) + (net "Net-(R13-Pad2)" + (pins R9-1 R13-2) + ) + (net "Net-(R10-Pad1)" + (pins R10-1 R14-2) + ) + (net "Net-(R16-Pad1)" + (pins R16-1 R17-2) + ) + (net "Net-(R18-Pad1)" + (pins R18-1 R20-2) + ) + (net "Net-(R18-Pad2)" + (pins R18-2 U2-8 U2-9) + ) + (net "Net-(R21-Pad1)" + (pins R21-1 R22-2 U2-13) + ) + (net "Net-(R22-Pad1)" + (pins R22-1 U2-14) + ) + (class kicad_default "" +12V +5V /AGND /AVCC /AVCC_ON_2 /CH1 /CH2 /D+ + "/D-" /DAC_OUT /DIG_CH1 /DIG_CH2 /LM324_VCC /PSU_PWM /VCC_3V3 /VGND + /VSENSE_OCP /XCK GND "Net-(C1-Pad1)" "Net-(C1-Pad2)" "Net-(C2-Pad1)" + "Net-(C2-Pad2)" "Net-(C6-Pad1)" "Net-(C7-Pad1)" "Net-(C7-Pad2)" "Net-(C9-Pad1)" + "Net-(IC1-Pad1)" "Net-(IC1-Pad10)" "Net-(IC1-Pad13)" "Net-(IC1-Pad16)" + "Net-(IC1-Pad2)" "Net-(IC1-Pad20)" "Net-(IC1-Pad21)" "Net-(IC1-Pad22)" + "Net-(IC1-Pad23)" "Net-(IC1-Pad25)" "Net-(IC1-Pad28)" "Net-(IC1-Pad29)" + "Net-(IC1-Pad3)" "Net-(IC1-Pad32)" "Net-(IC1-Pad33)" "Net-(IC1-Pad34)" + "Net-(IC1-Pad35)" "Net-(IC1-Pad36)" "Net-(IC1-Pad37)" "Net-(IC1-Pad4)" + "Net-(IC1-Pad5)" "Net-(IC1-Pad7)" "Net-(P2-Pad4)" "Net-(P3-Pad1)" "Net-(P3-Pad2)" + "Net-(P3-Pad3)" "Net-(P3-Pad4)" "Net-(P4-Pad3)" "Net-(P8-Pad1)" "Net-(P8-Pad2)" + "Net-(R1-Pad1)" "Net-(R10-Pad1)" "Net-(R11-Pad2)" "Net-(R12-Pad2)" "Net-(R13-Pad2)" + "Net-(R16-Pad1)" "Net-(R18-Pad1)" "Net-(R18-Pad2)" "Net-(R2-Pad1)" "Net-(R21-Pad1)" + "Net-(R22-Pad1)" + (circuit + (use_via Via[0-1]_600:400_um) + ) + (rule + (width 250) + (clearance 200.1) + ) + ) + ) + (wiring + ) +) diff --git a/PCB/Tinylab_proto1.kicad_pcb b/PCB/Tinylab_proto1.kicad_pcb new file mode 100644 index 00000000..f7dc4ee1 --- /dev/null +++ b/PCB/Tinylab_proto1.kicad_pcb @@ -0,0 +1,3370 @@ +(kicad_pcb (version 4) (host pcbnew 4.0.1-stable) + + (general + (links 147) + (no_connects 1) + (area 77.579324 85.946513 118.678 129.115952) + (thickness 1.6) + (drawings 8) + (tracks 776) + (zones 0) + (modules 72) + (nets 73) + ) + + (page A4) + (layers + (0 F.Cu signal) + (31 B.Cu signal) + (32 B.Adhes user hide) + (33 F.Adhes user hide) + (34 B.Paste user hide) + (35 F.Paste user hide) + (36 B.SilkS user hide) + (37 F.SilkS user) + (38 B.Mask user hide) + (39 F.Mask user hide) + (40 Dwgs.User user hide) + (41 Cmts.User user hide) + (42 Eco1.User user hide) + (43 Eco2.User user hide) + (44 Edge.Cuts user) + (45 Margin user hide) + (46 B.CrtYd user hide) + (47 F.CrtYd user hide) + (48 B.Fab user hide) + (49 F.Fab user hide) + ) + + (setup + (last_trace_width 0.25) + (user_trace_width 0.4) + (user_trace_width 0.635) + (user_trace_width 1.27) + (trace_clearance 0.2) + (zone_clearance 0.508) + (zone_45_only no) + (trace_min 0.2) + (segment_width 0.2) + (edge_width 0.1) + (via_size 0.6) + (via_drill 0.4) + (via_min_size 0.4) + (via_min_drill 0.3) + (uvia_size 0.3) + (uvia_drill 0.1) + (uvias_allowed no) + (uvia_min_size 0.2) + (uvia_min_drill 0.1) + (pcb_text_width 0.3) + (pcb_text_size 0.8 0.8) + (mod_edge_width 0.15) + (mod_text_size 0.8 0.8) + (mod_text_width 0.15) + (pad_size 1.5 1.5) + (pad_drill 0.6) + (pad_to_mask_clearance 0) + (aux_axis_origin 0 0) + (visible_elements 7FFCFFFF) + (pcbplotparams + (layerselection 0x010e0_80000001) + (usegerberextensions false) + (excludeedgelayer true) + (linewidth 0.100000) + (plotframeref false) + (viasonmask false) + (mode 1) + (useauxorigin false) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15) + (hpglpenoverlay 2) + (psnegative false) + (psa4output false) + (plotreference true) + (plotvalue true) + (plotinvisibletext false) + (padsonsilk false) + (subtractmaskfromsilk false) + (outputformat 1) + (mirror false) + (drillshape 0) + (scaleselection 1) + (outputdirectory OUTPUT_V6/)) + ) + + (net 0 "") + (net 1 "Net-(C1-Pad1)") + (net 2 "Net-(C1-Pad2)") + (net 3 "Net-(C2-Pad1)") + (net 4 "Net-(C2-Pad2)") + (net 5 +5V) + (net 6 /VCC_3V3) + (net 7 /AVCC) + (net 8 /OPAMP_VCC) + (net 9 /VGND) + (net 10 "Net-(C13-Pad1)") + (net 11 "Net-(C13-Pad2)") + (net 12 "Net-(C14-Pad1)") + (net 13 "Net-(C14-Pad2)") + (net 14 /PSU_OUT) + (net 15 "Net-(D1-Pad2)") + (net 16 /PSU_FEEDBACK) + (net 17 /CH2) + (net 18 "Net-(IC1-Pad3)") + (net 19 /TO_B0) + (net 20 /TO_B1) + (net 21 /DAC_OUT) + (net 22 /DAC_OUT2) + (net 23 "Net-(IC1-Pad9)") + (net 24 "Net-(IC1-Pad10)") + (net 25 /XCK) + (net 26 /DIG_CH2) + (net 27 "Net-(IC1-Pad13)") + (net 28 "Net-(IC1-Pad16)") + (net 29 /DIG_CH1) + (net 30 "Net-(IC1-Pad20)") + (net 31 "Net-(IC1-Pad21)") + (net 32 "Net-(IC1-Pad22)") + (net 33 "Net-(IC1-Pad23)") + (net 34 /PSU_PWM) + (net 35 "Net-(IC1-Pad25)") + (net 36 /D-) + (net 37 /D+) + (net 38 "Net-(IC1-Pad28)") + (net 39 "Net-(IC1-Pad29)") + (net 40 "Net-(IC1-Pad32)") + (net 41 "Net-(IC1-Pad33)") + (net 42 "Net-(IC1-Pad34)") + (net 43 "Net-(IC1-Pad35)") + (net 44 "Net-(IC1-Pad36)") + (net 45 "Net-(IC1-Pad37)") + (net 46 "Net-(IC1-Pad41)") + (net 47 /CH1) + (net 48 "Net-(IC1-Pad43)") + (net 49 /AVCC_ON_2) + (net 50 "Net-(P2-Pad4)") + (net 51 "Net-(P3-Pad1)") + (net 52 "Net-(P3-Pad2)") + (net 53 "Net-(P3-Pad3)") + (net 54 "Net-(P3-Pad4)") + (net 55 "Net-(P8-Pad1)") + (net 56 "Net-(P8-Pad2)") + (net 57 "Net-(R1-Pad1)") + (net 58 "Net-(R2-Pad1)") + (net 59 "Net-(R11-Pad2)") + (net 60 "Net-(R12-Pad2)") + (net 61 "Net-(R13-Pad2)") + (net 62 "Net-(R10-Pad1)") + (net 63 "Net-(R15-Pad1)") + (net 64 "Net-(R15-Pad2)") + (net 65 "Net-(R17-Pad1)") + (net 66 "Net-(R17-Pad2)") + (net 67 "Net-(R19-Pad1)") + (net 68 "Net-(R20-Pad1)") + (net 69 "Net-(R22-Pad1)") + (net 70 "Net-(R23-Pad1)") + (net 71 "Net-(L3-Pad2)") + (net 72 /USBGND) + + (net_class Default "This is the default net class." + (clearance 0.2) + (trace_width 0.25) + (via_dia 0.6) + (via_drill 0.4) + (uvia_dia 0.3) + (uvia_drill 0.1) + (add_net +5V) + (add_net /AVCC) + (add_net /AVCC_ON_2) + (add_net /CH1) + (add_net /CH2) + (add_net /D+) + (add_net /D-) + (add_net /DAC_OUT) + (add_net /DAC_OUT2) + (add_net /DIG_CH1) + (add_net /DIG_CH2) + (add_net /OPAMP_VCC) + (add_net /PSU_FEEDBACK) + (add_net /PSU_OUT) + (add_net /PSU_PWM) + (add_net /TO_B0) + (add_net /TO_B1) + (add_net /USBGND) + (add_net /VCC_3V3) + (add_net /VGND) + (add_net /XCK) + (add_net "Net-(C1-Pad1)") + (add_net "Net-(C1-Pad2)") + (add_net "Net-(C13-Pad1)") + (add_net "Net-(C13-Pad2)") + (add_net "Net-(C14-Pad1)") + (add_net "Net-(C14-Pad2)") + (add_net "Net-(C2-Pad1)") + (add_net "Net-(C2-Pad2)") + (add_net "Net-(D1-Pad2)") + (add_net "Net-(IC1-Pad10)") + (add_net "Net-(IC1-Pad13)") + (add_net "Net-(IC1-Pad16)") + (add_net "Net-(IC1-Pad20)") + (add_net "Net-(IC1-Pad21)") + (add_net "Net-(IC1-Pad22)") + (add_net "Net-(IC1-Pad23)") + (add_net "Net-(IC1-Pad25)") + (add_net "Net-(IC1-Pad28)") + (add_net "Net-(IC1-Pad29)") + (add_net "Net-(IC1-Pad3)") + (add_net "Net-(IC1-Pad32)") + (add_net "Net-(IC1-Pad33)") + (add_net "Net-(IC1-Pad34)") + (add_net "Net-(IC1-Pad35)") + (add_net "Net-(IC1-Pad36)") + (add_net "Net-(IC1-Pad37)") + (add_net "Net-(IC1-Pad41)") + (add_net "Net-(IC1-Pad43)") + (add_net "Net-(IC1-Pad9)") + (add_net "Net-(L3-Pad2)") + (add_net "Net-(P2-Pad4)") + (add_net "Net-(P3-Pad1)") + (add_net "Net-(P3-Pad2)") + (add_net "Net-(P3-Pad3)") + (add_net "Net-(P3-Pad4)") + (add_net "Net-(P8-Pad1)") + (add_net "Net-(P8-Pad2)") + (add_net "Net-(R1-Pad1)") + (add_net "Net-(R10-Pad1)") + (add_net "Net-(R11-Pad2)") + (add_net "Net-(R12-Pad2)") + (add_net "Net-(R13-Pad2)") + (add_net "Net-(R15-Pad1)") + (add_net "Net-(R15-Pad2)") + (add_net "Net-(R17-Pad1)") + (add_net "Net-(R17-Pad2)") + (add_net "Net-(R19-Pad1)") + (add_net "Net-(R2-Pad1)") + (add_net "Net-(R20-Pad1)") + (add_net "Net-(R22-Pad1)") + (add_net "Net-(R23-Pad1)") + ) + + (module Pin_Headers:Pin_Header_Straight_2x02 (layer F.Cu) (tedit 56F331EE) (tstamp 56EB479A) + (at 113.795 124.3076 180) + (descr "Through hole pin header") + (tags "pin header") + (path /56069A87) + (fp_text reference P4 (at 0.03556 -0.00508 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value PDI (at 0 -3.1 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.75) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 4.3 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 -1.55) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 -1.27) (end 3.81 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27) (end 3.81 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 3.81) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 6 /VCC_3V3)) + (pad 2 thru_hole oval (at 2.54 0 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 42 "Net-(IC1-Pad34)")) + (pad 3 thru_hole oval (at 0 2.54 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 9 /VGND)) + (pad 4 thru_hole oval (at 2.54 2.54 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 43 "Net-(IC1-Pad35)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_2x02.wrl + (at (xyz 0.05 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 locked (layer F.Cu) (tedit 56F331C1) (tstamp 56EB47F4) + (at 103.378 119.38) + (descr "Through hole pin header") + (tags "pin header") + (path /56EA2D2D) + (fp_text reference P9 (at -0.0097 0.07112) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value SCOPE_IN_AC (at 0 -3.1) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 4 "Net-(C2-Pad2)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 2 "Net-(C1-Pad2)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm (layer F.Cu) (tedit 56F331B7) (tstamp 56EB472D) + (at 102.87 104.14 180) + (descr "LQFP44 (see Appnote_PCB_Guidelines_TRINAMIC_packages.pdf)") + (tags "QFP 0.8") + (path /55CA8F25) + (attr smd) + (fp_text reference IC1 (at -0.14524 0.0635 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value ATXMEGA16A4U-A (at 0 7.65 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -6.9 -6.9) (end -6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start 6.9 -6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 -6.9) (end 6.9 -6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.175 -5.175) (end -5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -5.175) (end -4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -4.505) (end -6.65 -4.505) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -5.85 -4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 16 /PSU_FEEDBACK)) + (pad 2 smd rect (at -5.85 -3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (pad 3 smd rect (at -5.85 -2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 18 "Net-(IC1-Pad3)")) + (pad 4 smd rect (at -5.85 -1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 19 /TO_B0)) + (pad 5 smd rect (at -5.85 -0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 20 /TO_B1)) + (pad 6 smd rect (at -5.85 0 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 21 /DAC_OUT)) + (pad 7 smd rect (at -5.85 0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 22 /DAC_OUT2)) + (pad 8 smd rect (at -5.85 1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 9 smd rect (at -5.85 2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 23 "Net-(IC1-Pad9)")) + (pad 10 smd rect (at -5.85 3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 24 "Net-(IC1-Pad10)")) + (pad 11 smd rect (at -5.85 4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 25 /XCK)) + (pad 12 smd rect (at -4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 26 /DIG_CH2)) + (pad 13 smd rect (at -3.2 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 27 "Net-(IC1-Pad13)")) + (pad 14 smd rect (at -2.4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 15 smd rect (at -1.6 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 25 /XCK)) + (pad 16 smd rect (at -0.8 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 28 "Net-(IC1-Pad16)")) + (pad 17 smd rect (at 0 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 29 /DIG_CH1)) + (pad 18 smd rect (at 0.8 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 19 smd rect (at 1.6 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /VCC_3V3)) + (pad 20 smd rect (at 2.4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 30 "Net-(IC1-Pad20)")) + (pad 21 smd rect (at 3.2 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 31 "Net-(IC1-Pad21)")) + (pad 22 smd rect (at 4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 32 "Net-(IC1-Pad22)")) + (pad 23 smd rect (at 5.85 4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 33 "Net-(IC1-Pad23)")) + (pad 24 smd rect (at 5.85 3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 34 /PSU_PWM)) + (pad 25 smd rect (at 5.85 2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 35 "Net-(IC1-Pad25)")) + (pad 26 smd rect (at 5.85 1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 36 /D-)) + (pad 27 smd rect (at 5.85 0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 37 /D+)) + (pad 28 smd rect (at 5.85 0 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 38 "Net-(IC1-Pad28)")) + (pad 29 smd rect (at 5.85 -0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 39 "Net-(IC1-Pad29)")) + (pad 30 smd rect (at 5.85 -1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 31 smd rect (at 5.85 -2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /VCC_3V3)) + (pad 32 smd rect (at 5.85 -3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 40 "Net-(IC1-Pad32)")) + (pad 33 smd rect (at 5.85 -4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 41 "Net-(IC1-Pad33)")) + (pad 34 smd rect (at 4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 42 "Net-(IC1-Pad34)")) + (pad 35 smd rect (at 3.2 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 43 "Net-(IC1-Pad35)")) + (pad 36 smd rect (at 2.4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 44 "Net-(IC1-Pad36)")) + (pad 37 smd rect (at 1.6 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 45 "Net-(IC1-Pad37)")) + (pad 38 smd rect (at 0.8 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 39 smd rect (at 0 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 40 smd rect (at -0.8 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (pad 41 smd rect (at -1.6 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 46 "Net-(IC1-Pad41)")) + (pad 42 smd rect (at -2.4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 47 /CH1)) + (pad 43 smd rect (at -3.2 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 48 "Net-(IC1-Pad43)")) + (pad 44 smd rect (at -4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 49 /AVCC_ON_2)) + (model Housings_QFP.3dshapes/LQFP-44_10x10mm_Pitch0.8mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:c_elec_5x5.3 (layer F.Cu) (tedit 55725CA0) (tstamp 56EB4BFB) + (at 112.4488 112.4966 270) + (descr "SMT capacitor, aluminium electrolytic, 5x5.3") + (path /566F5A75) + (attr smd) + (fp_text reference C6 (at -0.02286 -0.12954 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value CP1 (at 0 3.81 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -3.95 -3) (end 3.95 -3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.95 -3) (end 3.95 3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.95 3) (end -3.95 3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.95 3) (end -3.95 -3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.286 -0.635) (end -2.286 0.762) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.159 -0.889) (end -2.159 0.889) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.032 -1.27) (end -2.032 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.905 1.397) (end -1.905 -1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 -1.524) (end -1.778 1.524) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.651 1.651) (end -1.651 -1.651) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.524 -1.778) (end -1.524 1.778) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.667 -2.667) (end 1.905 -2.667) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.905 -2.667) (end 2.667 -1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.667 -1.905) (end 2.667 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.667 1.905) (end 1.905 2.667) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.905 2.667) (end -2.667 2.667) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.667 2.667) (end -2.667 -2.667) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.159 0) (end 1.397 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.778 -0.381) (end 1.778 0.381) (layer F.SilkS) (width 0.15)) + (fp_circle (center 0 0) (end -2.413 0) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at 2.19964 0 270) (size 2.99974 1.6002) (layers F.Cu F.Paste F.Mask) + (net 6 /VCC_3V3)) + (pad 2 smd rect (at -2.19964 0 270) (size 2.99974 1.6002) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/c_elec_5x5.3.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 54EA090C) (tstamp 56EB47E3) + (at 113.7061 118.2243 270) + (descr "Through hole pin header") + (tags "pin header") + (path /55D6DB77) + (fp_text reference P8 (at 0.06096 -0.14478 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value DIG_IN (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 55 "Net-(P8-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 56 "Net-(P8-Pad2)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56EB45CF) + (at 101.5238 124.4346 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CAB611) + (attr smd) + (fp_text reference C1 (at -0.05126 0.12192 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 2 "Net-(C1-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56EB45DB) + (at 101.8032 116.7892 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CAB4DE) + (attr smd) + (fp_text reference C2 (at -0.03348 -0.1651 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 4 "Net-(C2-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56EB45E7) + (at 114.303 108.6866 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB13E1) + (attr smd) + (fp_text reference C3 (at -0.0508 0.04826 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56EB45F3) + (at 108.7882 110.3122 180) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB147C) + (attr smd) + (fp_text reference C4 (at -0.01016 0.04318 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /VCC_3V3)) + (pad 2 smd rect (at 0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 56F331BD) (tstamp 56EB45FF) + (at 104.521 113.6015 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55D60181) + (attr smd) + (fp_text reference C5 (at 0.01778 0.08682 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 56F331F5) (tstamp 56EB4633) + (at 94.488 115.316 180) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /56E8E263) + (attr smd) + (fp_text reference C7 (at 0.03002 -0.0889 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 8 /OPAMP_VCC)) + (pad 2 smd rect (at 0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 56F335FD) (tstamp 56EB463F) + (at 101.854 111.76 180) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /56AF91A3) + (attr smd) + (fp_text reference C8 (at 0.01224 -0.05334 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56EB4673) + (at 86.36 99.695 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /56071A50) + (attr smd) + (fp_text reference C10 (at 0.1143 -0.003 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56EB467F) + (at 95.0595 106.807 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /5608B4BE) + (attr smd) + (fp_text reference C11 (at 0.11176 -0.01478 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /VCC_3V3)) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56EB468B) + (at 82.423 117.348 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB630B) + (attr smd) + (fp_text reference C13 (at -0.05334 0.0538 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 10 "Net-(C13-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 11 "Net-(C13-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56EB4697) + (at 82.55 124.206 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /566DF655) + (attr smd) + (fp_text reference C14 (at 0.02286 0.02078 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 12 "Net-(C14-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 13 "Net-(C14-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5 (layer F.Cu) (tedit 56F33237) (tstamp 56EB46C4) + (at 90.17 111.76 180) + (descr "Radial Electrolytic Capacitor, Diameter 6.3mm x Length 11.2mm, Pitch 2.5mm") + (tags "Electrolytic Capacitor") + (path /560735FE) + (fp_text reference C15 (at -0.22652 -0.47498 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.25 4.4 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 1.325 -3.149) (end 1.325 3.149) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.465 -3.143) (end 1.465 3.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 -3.13) (end 1.605 -0.446) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 0.446) (end 1.605 3.13) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 -3.111) (end 1.745 -0.656) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 0.656) (end 1.745 3.111) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 -3.085) (end 1.885 -0.789) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 0.789) (end 1.885 3.085) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 -3.053) (end 2.025 -0.88) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 0.88) (end 2.025 3.053) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 -3.014) (end 2.165 -0.942) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 0.942) (end 2.165 3.014) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 -2.968) (end 2.305 -0.981) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 0.981) (end 2.305 2.968) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 -2.915) (end 2.445 -0.998) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 0.998) (end 2.445 2.915) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 -2.853) (end 2.585 -0.996) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 0.996) (end 2.585 2.853) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 -2.783) (end 2.725 -0.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 0.974) (end 2.725 2.783) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 -2.704) (end 2.865 -0.931) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 0.931) (end 2.865 2.704) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 -2.616) (end 3.005 -0.863) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 0.863) (end 3.005 2.616) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 -2.516) (end 3.145 -0.764) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 0.764) (end 3.145 2.516) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 -2.404) (end 3.285 -0.619) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 0.619) (end 3.285 2.404) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 -2.279) (end 3.425 -0.38) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 0.38) (end 3.425 2.279) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.565 -2.136) (end 3.565 2.136) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.705 -1.974) (end 3.705 1.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.845 -1.786) (end 3.845 1.786) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.985 -1.563) (end 3.985 1.563) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.125 -1.287) (end 4.125 1.287) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.265 -0.912) (end 4.265 0.912) (layer F.SilkS) (width 0.15)) + (fp_circle (center 2.5 0) (end 2.5 -1) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.1875) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.4) (layer F.CrtYd) (width 0.05)) + (pad 2 thru_hole circle (at 2.5 0 180) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 9 /VGND)) + (pad 1 thru_hole rect (at 0 0 180) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 14 /PSU_OUT)) + (model Capacitors_ThroughHole.3dshapes/C_Radial_D6.3_L11.2_P2.5.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 56F331F9) (tstamp 56EB46D0) + (at 92.456 114.554 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /5607355F) + (attr smd) + (fp_text reference C16 (at 0.08128 0.0097 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 14 /PSU_OUT)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10 (layer F.Cu) (tedit 552FFCCE) (tstamp 56EB46E4) + (at 93.345 106.68 90) + (descr "Diode, DO-41, SOD81, Horizontal, RM 10mm,") + (tags "Diode, DO-41, SOD81, Horizontal, RM 10mm, 1N4007, SB140,") + (path /5606FDB4) + (fp_text reference D1 (at 1.0541 -0.01224 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value D_Schottky (at 4.37134 -3.55854 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 7.62 -0.00254) (end 8.636 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -0.00254) (end 1.524 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.048 -1.27254) (end 3.048 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.302 -1.27254) (end 3.302 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.556 -1.27254) (end 3.556 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -1.27254) (end 2.794 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.175 -1.27254) (end 3.175 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 1.26746) (end 2.54 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 7.62 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 -1.27254) (end 7.62 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 1.26746) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at 10.16 -0.00254 270) (size 1.99898 1.99898) (drill 1.27) (layers *.Cu *.Mask F.SilkS) + (net 15 "Net-(D1-Pad2)")) + (pad 1 thru_hole rect (at 0 -0.00254 270) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.Mask F.SilkS) + (net 14 /PSU_OUT)) + ) + + (module Inductors:INDUCTOR_V (layer F.Cu) (tedit 0) (tstamp 56EB4734) + (at 82.7532 98.5139 270) + (descr "Inductor (vertical)") + (tags INDUCTOR) + (path /5606EE9E) + (fp_text reference L1 (at -0.16764 0.04572 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value INDUCTOR (at 0.09906 -1.99898 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_circle (center 0 0) (end 3.81 0) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at -2.54 0 270) (size 1.905 1.905) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) + (net 15 "Net-(D1-Pad2)")) + (pad 2 thru_hole circle (at 2.54 0 270) (size 1.905 1.905) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) + (net 5 +5V)) + (model Inductors.3dshapes/INDUCTOR_V.wrl + (at (xyz 0 0 0)) + (scale (xyz 2 2 2)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1210 (layer F.Cu) (tedit 56F331AB) (tstamp 56EB4740) + (at 98.171 112.649) + (descr "Resistor SMD 1210, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 1210") + (path /56E88440) + (attr smd) + (fp_text reference L2 (at 0.02078 0.00508 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value INDUCTOR (at 0 2.7) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -2.2 -1.6) (end 2.2 -1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.2 1.6) (end 2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.2 -1.6) (end -2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.2 -1.6) (end 2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.475) (end -1 1.475) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.475) (end 1 -1.475) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.45 0) (size 0.9 2.5) (layers F.Cu F.Paste F.Mask) + (net 6 /VCC_3V3)) + (pad 2 smd rect (at 1.45 0) (size 0.9 2.5) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (model Resistors_SMD.3dshapes/R_1210.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1210 (layer F.Cu) (tedit 56F3323A) (tstamp 56EB474C) + (at 94.5926 112.5982 90) + (descr "Resistor SMD 1210, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 1210") + (path /56E8DA35) + (attr smd) + (fp_text reference L3 (at 0.0254 -0.01986 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value INDUCTOR (at 0 2.7 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -2.2 -1.6) (end 2.2 -1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.2 1.6) (end 2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.2 -1.6) (end -2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.2 -1.6) (end 2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.475) (end -1 1.475) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.475) (end 1 -1.475) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.45 0 90) (size 0.9 2.5) (layers F.Cu F.Paste F.Mask) + (net 8 /OPAMP_VCC)) + (pad 2 smd rect (at 1.45 0 90) (size 0.9 2.5) (layers F.Cu F.Paste F.Mask) + (net 71 "Net-(L3-Pad2)")) + (model Resistors_SMD.3dshapes/R_1210.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 locked (layer F.Cu) (tedit 54EA090C) (tstamp 56EB475D) + (at 105.918 124.46 270) + (descr "Through hole pin header") + (tags "pin header") + (path /56EA2C80) + (fp_text reference P1 (at -0.00254 -0.01824 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value SCOPE_IN_CH1 (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 1 "Net-(C1-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 1 "Net-(C1-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 (layer F.Cu) (tedit 0) (tstamp 56EB4786) + (at 80.4448 113.157 180) + (descr "Through hole pin header") + (tags "pin header") + (path /55CBF4D5) + (fp_text reference P3 (at -0.03302 -0.08128 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value DIG_OUT (at 0 -3.1 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 51 "Net-(P3-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 52 "Net-(P3-Pad2)")) + (pad 3 thru_hole oval (at 0 5.08 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 53 "Net-(P3-Pad3)")) + (pad 4 thru_hole oval (at 0 7.62 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 54 "Net-(P3-Pad4)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 locked (layer F.Cu) (tedit 54EA090C) (tstamp 56EB47AB) + (at 105.918 116.84 270) + (descr "Through hole pin header") + (tags "pin header") + (path /56EA3310) + (fp_text reference P5 (at 0.06096 -0.1427 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value SCOPE_IN_CH2 (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 3 "Net-(C2-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 3 "Net-(C2-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 (layer F.Cu) (tedit 0) (tstamp 56EB47BE) + (at 80.4448 115.697) + (descr "Through hole pin header") + (tags "pin header") + (path /566DF832) + (fp_text reference P6 (at 0.07112 0.04826) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value DAC_OUT (at 0 -3.1) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 11 "Net-(C13-Pad2)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 10 "Net-(C13-Pad1)")) + (pad 3 thru_hole oval (at 0 5.08) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 13 "Net-(C14-Pad2)")) + (pad 4 thru_hole oval (at 0 7.62) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 12 "Net-(C14-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module SMD:SOT-23-3 (layer F.Cu) (tedit 5508E933) (tstamp 56EB4800) + (at 96.139 97.536 180) + (path /5606F6D4) + (fp_text reference Q1 (at -0.0411 -0.02032 360) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value Q_NMOS_GSD (at -2.2 0 270) (layer F.Fab) hide + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_circle (center 1 -0.4) (end 1.1 -0.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 -0.8) (end -1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 0.8) (end 1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 0.8) (end 1.5 -0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 -0.8) (end -1.5 -0.8) (layer F.SilkS) (width 0.15)) + (pad 3 smd rect (at 0 1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 15 "Net-(D1-Pad2)")) + (pad 2 smd rect (at -0.95 -1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 1 smd rect (at 0.95 -1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 34 /PSU_PWM)) + (model 3D/SMD/SOT-23-3.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB480C) + (at 99.06 121.92 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAB95) + (attr smd) + (fp_text reference R1 (at 0.04572 0.08428 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 57 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F331DA) (tstamp 56EB4818) + (at 99.06 119.3165 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAD4C) + (attr smd) + (fp_text reference R2 (at -0.03302 -0.07666 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R2-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F331E1) (tstamp 56EB4824) + (at 100.6475 121.92 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAABF4) + (attr smd) + (fp_text reference R3 (at 0.12954 0.08174 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 57 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 49 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F331DB) (tstamp 56EB4830) + (at 100.6475 119.3165 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAD11) + (attr smd) + (fp_text reference R4 (at 0.1397 0.05888 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 49 /AVCC_ON_2)) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R2-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB483C) + (at 106.426 114.3) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAC5F) + (attr smd) + (fp_text reference R5 (at -0.0605 -0.00762) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 49 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB4848) + (at 106.426 112.903) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAACD2) + (attr smd) + (fp_text reference R6 (at 0.0538 0.01524) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 49 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB4854) + (at 82.55 106.68 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBCDA5) + (attr smd) + (fp_text reference R7 (at -0.12192 -0.02586 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R11-Pad2)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 54 "Net-(P3-Pad4)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB4860) + (at 82.55 109.22 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE401) + (attr smd) + (fp_text reference R8 (at 0.00508 -0.07158 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R12-Pad2)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 53 "Net-(P3-Pad3)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB486C) + (at 82.55 111.76 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE16B) + (attr smd) + (fp_text reference R9 (at 0.00508 -0.02332 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R13-Pad2)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 52 "Net-(P3-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB4878) + (at 82.55 114.3 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE2C7) + (attr smd) + (fp_text reference R10 (at 0.01016 -0.06904 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R10-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 51 "Net-(P3-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB4884) + (at 84.328 106.68 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBCD2A) + (attr smd) + (fp_text reference R11 (at 0.17018 0.04618 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 38 "Net-(IC1-Pad28)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R11-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB4890) + (at 84.328 109.22 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE362) + (attr smd) + (fp_text reference R12 (at 0.06604 0.04618 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 39 "Net-(IC1-Pad29)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R12-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB489C) + (at 84.328 111.76 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE0F4) + (attr smd) + (fp_text reference R13 (at 0.01778 0.00046 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 40 "Net-(IC1-Pad32)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R13-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB48A8) + (at 84.328 114.3 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE21C) + (attr smd) + (fp_text reference R14 (at -0.1651 0.02586 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 41 "Net-(IC1-Pad33)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R10-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F33220) (tstamp 56EB48B4) + (at 89.3953 124.3203 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56B0C779) + (attr smd) + (fp_text reference R15 (at -0.00762 -0.04364 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R15-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R15-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F3321C) (tstamp 56EB48C0) + (at 87.8713 124.3203 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56B0C86E) + (attr smd) + (fp_text reference R16 (at -0.00762 -0.03856 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R15-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R15-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F33257) (tstamp 56EB48CC) + (at 89.281 117.221 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56AFE83E) + (attr smd) + (fp_text reference R17 (at -0.01778 0.0284 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R17-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R17-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F3325E) (tstamp 56EB48D8) + (at 87.63 117.221 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56AFE8F3) + (attr smd) + (fp_text reference R18 (at -0.05842 0.03856 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R17-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R17-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F33244) (tstamp 56EB48E4) + (at 87.122 119.634) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56AECD86) + (attr smd) + (fp_text reference R19 (at 0.11984 -0.01524) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R19-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R17-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F3322A) (tstamp 56EB48F0) + (at 87.122 121.92) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56B0C682) + (attr smd) + (fp_text reference R20 (at 0.00808 0.06096) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R20-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R15-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F331E9) (tstamp 56EB48FC) + (at 99.568 124.079) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56E9851A) + (attr smd) + (fp_text reference R21 (at 0.003 0.03556) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 47 /CH1)) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F33231) (tstamp 56EB4908) + (at 84.455 117.221 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CB4680) + (attr smd) + (fp_text reference R22 (at 0.00508 0.03856 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 69 "Net-(R22-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R19-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F33215) (tstamp 56EB4914) + (at 84.709 124.333 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566DE721) + (attr smd) + (fp_text reference R23 (at 0.04064 -0.0411 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 70 "Net-(R23-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R20-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F3324C) (tstamp 56EB4920) + (at 84.074 119.634) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CB9020) + (attr smd) + (fp_text reference R24 (at 0.07666 0.04064) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 11 "Net-(C13-Pad2)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 69 "Net-(R22-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F3322D) (tstamp 56EB492C) + (at 84.074 121.92) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566DE7E8) + (attr smd) + (fp_text reference R25 (at 0.05126 0.02794) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 13 "Net-(C14-Pad2)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 70 "Net-(R23-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB4938) + (at 84.582 102.9462 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566E5C29) + (attr smd) + (fp_text reference R26 (at -0.0284 -0.02794 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 14 /PSU_OUT)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 16 /PSU_FEEDBACK)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB4944) + (at 84.582 104.5464) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566E5CBE) + (attr smd) + (fp_text reference R27 (at -0.02748 0.03048) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 16 /PSU_FEEDBACK)) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F331D7) (tstamp 56EB4950) + (at 99.568 116.84 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56E985EF) + (attr smd) + (fp_text reference R28 (at -0.05634 -0.0508 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F3325B) (tstamp 56EB495C) + (at 85.979 117.221 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56E9888A) + (attr smd) + (fp_text reference R29 (at 0.03302 -0.0538 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R19-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F33218) (tstamp 56EB4968) + (at 86.233 124.333 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56E98921) + (attr smd) + (fp_text reference R30 (at 0.06096 -0.05634 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R20-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module SMD:SOT-23-3 (layer F.Cu) (tedit 5508E933) (tstamp 56EB4974) + (at 112.0648 106.807 90) + (path /55CA99FA) + (fp_text reference U1 (at -0.07112 0.03856 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value 78L05 (at -2.2 0 180) (layer F.Fab) hide + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_circle (center 1 -0.4) (end 1.1 -0.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 -0.8) (end -1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 0.8) (end 1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 0.8) (end 1.5 -0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 -0.8) (end -1.5 -0.8) (layer F.SilkS) (width 0.15)) + (pad 3 smd rect (at 0 1.4 90) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -0.95 -1.4 90) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 6 /VCC_3V3)) + (pad 1 smd rect (at 0.95 -1.4 90) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model 3D/SMD/SOT-23-3.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm (layer F.Cu) (tedit 56F33225) (tstamp 56EB4991) + (at 94.5134 120.6754 180) + (descr "14-Lead Plastic Small Outline (SL) - Narrow, 3.90 mm Body [SOIC] (see Microchip Packaging Specification 00000049BS.pdf)") + (tags "SOIC 1.27") + (path /55CA87E2) + (attr smd) + (fp_text reference U2 (at 0.01986 0 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value LM324 (at 0 5.375 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -3.7 -4.65) (end -3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.7 -4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 -4.65) (end 3.7 -4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.075 -4.45) (end -2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 -4.45) (end 2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 4.45) (end 2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end -2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.45) (end 2.075 -4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end 2.075 4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.335) (end -3.45 -4.335) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2.7 -3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 47 /CH1)) + (pad 2 smd rect (at -2.7 -2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 47 /CH1)) + (pad 3 smd rect (at -2.7 -1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 57 "Net-(R1-Pad1)")) + (pad 4 smd rect (at -2.7 0 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 8 /OPAMP_VCC)) + (pad 5 smd rect (at -2.7 1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R2-Pad1)")) + (pad 6 smd rect (at -2.7 2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (pad 7 smd rect (at -2.7 3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (pad 8 smd rect (at 2.7 3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R19-Pad1)")) + (pad 9 smd rect (at 2.7 2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R17-Pad1)")) + (pad 10 smd rect (at 2.7 1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 21 /DAC_OUT)) + (pad 11 smd rect (at 2.7 0 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 12 smd rect (at 2.7 -1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 22 /DAC_OUT2)) + (pad 13 smd rect (at 2.7 -2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R15-Pad1)")) + (pad 14 smd rect (at 2.7 -3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R20-Pad1)")) + (model Housings_SOIC.3dshapes/SOIC-14_3.9x8.7mm_Pitch1.27mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module TO_SOT_Packages_SMD:SOT-363 (layer F.Cu) (tedit 56735562) (tstamp 56EB499F) + (at 89.5604 120.7262 270) + (descr SOT353) + (path /56B012DD) + (attr smd) + (fp_text reference U3 (at 0.09906 0 360) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value DMN63D8LDW (at 0.09906 0 360) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 0.635 1.016) (end 0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 -1.016) (end -0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 -1.016) (end -0.635 1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 1.016) (end 0.635 1.016) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.016 -0.635 270) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 3 smd rect (at -1.016 0.635 270) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R17-Pad2)")) + (pad 6 smd rect (at 1.016 -0.635 270) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R15-Pad2)")) + (pad 2 smd rect (at -1.016 0 270) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 19 /TO_B0)) + (pad 4 smd rect (at 1.016 0.635 270) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 5 smd rect (at 1.016 0 270) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 20 /TO_B1)) + (model TO_SOT_Packages_SMD.3dshapes/SOT-353.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.07000000000000001 0.09 0.08)) + (rotate (xyz 0 0 90)) + ) + ) + + (module TO_SOT_Packages_SMD:SOT-363 (layer F.Cu) (tedit 56735562) (tstamp 56EB49AD) + (at 108.7755 97.4725 90) + (descr SOT353) + (path /55D6ACFD) + (attr smd) + (fp_text reference U4 (at -0.03556 -0.01478 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value DMN63D8LDW (at 0.09906 0 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 0.635 1.016) (end 0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 -1.016) (end -0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 -1.016) (end -0.635 1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 1.016) (end 0.635 1.016) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.016 -0.635 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 3 smd rect (at -1.016 0.635 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 26 /DIG_CH2)) + (pad 6 smd rect (at 1.016 -0.635 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 29 /DIG_CH1)) + (pad 2 smd rect (at -1.016 0 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 56 "Net-(P8-Pad2)")) + (pad 4 smd rect (at 1.016 0.635 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 5 smd rect (at 1.016 0 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 55 "Net-(P8-Pad1)")) + (model TO_SOT_Packages_SMD.3dshapes/SOT-353.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.07000000000000001 0.09 0.08)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Capacitors_SMD:c_elec_4x5.3 (layer F.Cu) (tedit 556FDE77) (tstamp 56EB4C01) + (at 89.535 99.06 90) + (descr "SMT capacitor, aluminium electrolytic, 4x5.3") + (path /560719D9) + (attr smd) + (fp_text reference C9 (at -0.00508 0.0665 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value CP1 (at 0 3.175 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -3.35 -2.65) (end 3.35 -2.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.35 -2.65) (end 3.35 2.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.35 2.65) (end -3.35 2.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.35 2.65) (end -3.35 -2.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.651 0) (end 0.889 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 -0.381) (end 1.27 0.381) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 2.286) (end -2.286 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.286 -1.524) (end 2.286 1.524) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 2.286) (end 2.286 1.524) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 -2.286) (end -2.286 -2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 -2.286) (end 2.286 -1.524) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.032 0.127) (end -2.032 -0.127) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.905 -0.635) (end -1.905 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 0.889) (end -1.778 -0.889) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.651 1.143) (end -1.651 -1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.524 -1.27) (end -1.524 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.397 1.397) (end -1.397 -1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 -1.524) (end -1.27 1.524) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.143 -1.651) (end -1.143 1.651) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.286 -2.286) (end -2.286 2.286) (layer F.SilkS) (width 0.15)) + (fp_circle (center 0 0) (end -2.032 0) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at 1.80086 0 90) (size 2.60096 1.6002) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -1.80086 0 90) (size 2.60096 1.6002) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/c_elec_4x5.3.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 54EA090C) (tstamp 56F32A3D) + (at 90.6048 106.807 270) + (descr "Through hole pin header") + (tags "pin header") + (path /56F2A93D) + (fp_text reference P7 (at -0.01524 -0.15748 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value CONN_01X02 (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 14 /PSU_OUT)) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 9 /VGND)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 54EA090C) (tstamp 56F32A4E) + (at 90.6048 104.267 270) + (descr "Through hole pin header") + (tags "pin header") + (path /56F2A840) + (fp_text reference P10 (at -0.1524 -0.18288 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value CONN_01X02 (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 9 /VGND)) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 9 /VGND)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Resistors_SMD:R_1210 (layer F.Cu) (tedit 5415D182) (tstamp 5731894C) + (at 93.7036 103.4034 270) + (descr "Resistor SMD 1210, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 1210") + (path /573254B0) + (attr smd) + (fp_text reference L4 (at 0 -2.7 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value INDUCTOR (at 0 2.7 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.2 -1.6) (end 2.2 -1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.2 1.6) (end 2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.2 -1.6) (end -2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.2 -1.6) (end 2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.475) (end -1 1.475) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.475) (end 1 -1.475) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.45 0 270) (size 0.9 2.5) (layers F.Cu F.Paste F.Mask) + (net 71 "Net-(L3-Pad2)")) + (pad 2 smd rect (at 1.45 0 270) (size 0.9 2.5) (layers F.Cu F.Paste F.Mask) + (net 14 /PSU_OUT)) + (model Resistors_SMD.3dshapes/R_1210.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 54EA090C) (tstamp 57319373) + (at 99.3394 95.9358 90) + (descr "Through hole pin header") + (tags "pin header") + (fp_text reference REF** (at 0 -5.1 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Pin_Header_Straight_1x02 (at 0 -3.1 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 90) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole oval (at 0 2.54 90) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 575636C7) + (at 108.4961 116.0399) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /575646EC) + (attr smd) + (fp_text reference C12 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 575636CD) + (at 108.4961 117.1956) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /57564635) + (attr smd) + (fp_text reference C17 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 575636D3) + (at 108.5088 118.3513) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /57564580) + (attr smd) + (fp_text reference C18 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 575636D9) + (at 109.0549 123.571 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /575644CB) + (attr smd) + (fp_text reference C19 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_1210 (layer F.Cu) (tedit 5415D85D) (tstamp 575636DA) + (at 107.5944 120.65) + (descr "Capacitor SMD 1210, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 1210") + (path /55D739F3) + (attr smd) + (fp_text reference F1 (at 0 -2.7) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value F_Small (at 0 2.7) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.3 -1.6) (end 2.3 -1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.3 1.6) (end 2.3 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.3 -1.6) (end -2.3 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.3 -1.6) (end 2.3 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 -1.475) (end -1 -1.475) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 1.475) (end 1 1.475) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.5 0) (size 1 2.5) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 2 smd rect (at 1.5 0) (size 1 2.5) (layers F.Cu F.Paste F.Mask) + (net 72 /USBGND)) + (model Capacitors_SMD.3dshapes/C_1210.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Connect:USB_Micro-B_WIDE (layer F.Cu) (tedit 56F1EFCA) (tstamp 575636DF) + (at 112.903 100.6094 90) + (descr "Micro USB Type B Receptacle") + (tags "USB USB_B USB_micro USB_OTG") + (path /55CA90D2) + (attr smd) + (fp_text reference P2 (at 0 -3.45 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value USB_OTG (at 0 4.8 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.6 -2.8) (end 4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 -2.8) (end 4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 4.05) (end -4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.6 4.05) (end -4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3509 3.81746) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 -2.58754) (end 4.3491 -2.58754) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 -2.58754) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 2.58746) (end -4.3509 2.58746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 3.81746) (end -4.3509 -2.58754) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.3009 -1.56254 180) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -0.6509 -1.56254 180) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 36 /D-)) + (pad 3 smd rect (at -0.0009 -1.56254 180) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 37 /D+)) + (pad 4 smd rect (at 0.6491 -1.56254 180) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 50 "Net-(P2-Pad4)")) + (pad 5 smd rect (at 1.2991 -1.56254 180) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 72 /USBGND)) + (pad 6 thru_hole oval (at -2.5009 -1.56254 180) (size 0.95 1.4) (drill oval 0.55 1) (layers *.Cu *.Mask F.SilkS) + (net 72 /USBGND)) + (pad 6 thru_hole oval (at 2.4991 -1.56254 180) (size 0.95 1.4) (drill oval 0.55 1) (layers *.Cu *.Mask F.SilkS) + (net 72 /USBGND)) + (pad 6 thru_hole oval (at -3.5009 1.13746 180) (size 1.55 1.2) (drill oval 1.15 0.7) (layers *.Cu *.Mask F.SilkS) + (net 72 /USBGND)) + (pad 6 thru_hole oval (at 3.4991 1.13746 180) (size 1.55 1.2) (drill oval 1.15 0.7) (layers *.Cu *.Mask F.SilkS) + (net 72 /USBGND)) + ) + + (gr_text "EspoTek Labrador v7a" (at 109.8296 95.1992) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.2))) + ) + (gr_line (start 78.7908 126.0983) (end 78.7908 125.9078) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 116.5098 126.0983) (end 78.7908 126.0983) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 116.5098 94.5261) (end 116.5098 126.0983) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 78.7654 94.5261) (end 116.5098 94.5261) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 78.7908 94.6912) (end 78.7908 94.5388) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 78.7908 95.1992) (end 78.7908 94.615) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 78.78618 126.09068) (end 78.78618 95.20174) (angle 90) (layer Edge.Cuts) (width 0.1)) + + (segment (start 101.5238 123.6846) (end 101.842 123.6846) (width 0.4) (layer F.Cu) (net 1)) + (segment (start 101.842 123.6846) (end 102.2223 123.3043) (width 0.4) (layer F.Cu) (net 1) (tstamp 57563749)) + (segment (start 99.06 121.17) (end 99.06 121.412) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 99.06 121.412) (end 99.568 121.92) (width 0.25) (layer F.Cu) (net 1) (tstamp 56EB5D83)) + (segment (start 99.568 121.92) (end 101.473 121.92) (width 0.25) (layer F.Cu) (net 1) (tstamp 56EB5D84)) + (segment (start 101.473 121.92) (end 101.854 122.301) (width 0.25) (layer F.Cu) (net 1) (tstamp 56EB5D85)) + (segment (start 101.854 122.301) (end 101.854 122.936) (width 0.25) (layer F.Cu) (net 1) (tstamp 56EB5D86)) + (segment (start 101.854 122.936) (end 102.2223 123.3043) (width 0.25) (layer F.Cu) (net 1) (tstamp 56EB5D87)) + (segment (start 102.2223 123.3043) (end 103.378 124.46) (width 0.25) (layer F.Cu) (net 1) (tstamp 5756374C)) + (segment (start 105.918 124.46) (end 103.378 124.46) (width 0.635) (layer F.Cu) (net 1)) + (segment (start 101.5238 125.1846) (end 101.842 125.1846) (width 0.25) (layer F.Cu) (net 2)) + (segment (start 101.842 125.1846) (end 102.489 125.8316) (width 0.25) (layer F.Cu) (net 2) (tstamp 57563753)) + (segment (start 102.489 125.8316) (end 107.1372 125.8316) (width 0.25) (layer F.Cu) (net 2) (tstamp 57563754)) + (segment (start 107.1372 125.8316) (end 107.5182 125.4506) (width 0.25) (layer F.Cu) (net 2) (tstamp 57563755)) + (segment (start 107.5182 125.4506) (end 107.5182 123.2662) (width 0.25) (layer F.Cu) (net 2) (tstamp 57563756)) + (segment (start 107.5182 123.2662) (end 107.1118 122.8598) (width 0.25) (layer F.Cu) (net 2) (tstamp 57563757)) + (segment (start 107.1118 122.8598) (end 104.3178 122.8598) (width 0.25) (layer F.Cu) (net 2) (tstamp 57563758)) + (segment (start 104.3178 122.8598) (end 103.378 121.92) (width 0.25) (layer F.Cu) (net 2) (tstamp 57563759)) + (segment (start 99.06 120.0665) (end 99.1355 120.0665) (width 0.25) (layer F.Cu) (net 3)) + (segment (start 99.1355 120.0665) (end 99.822 119.38) (width 0.25) (layer F.Cu) (net 3) (tstamp 56EB5D8A)) + (segment (start 99.822 119.38) (end 101.346 119.38) (width 0.25) (layer F.Cu) (net 3) (tstamp 56EB5D8B)) + (segment (start 101.346 119.38) (end 101.981 118.745) (width 0.25) (layer F.Cu) (net 3) (tstamp 56EB5D8C)) + (segment (start 101.981 118.745) (end 101.981 117.221) (width 0.25) (layer F.Cu) (net 3) (tstamp 56EB5D8D)) + (segment (start 101.981 117.221) (end 102.362 116.84) (width 0.25) (layer F.Cu) (net 3) (tstamp 56EB5D8E)) + (segment (start 102.362 116.84) (end 103.378 116.84) (width 0.25) (layer F.Cu) (net 3) (tstamp 56EB5D8F)) + (segment (start 105.918 116.84) (end 103.378 116.84) (width 0.635) (layer F.Cu) (net 3)) + (segment (start 101.8032 116.0392) (end 101.3834 116.0392) (width 0.25) (layer F.Cu) (net 4)) + (segment (start 101.854 120.904) (end 103.378 119.38) (width 0.25) (layer B.Cu) (net 4) (tstamp 57563737)) + (segment (start 101.219 120.904) (end 101.854 120.904) (width 0.25) (layer B.Cu) (net 4) (tstamp 57563736)) + (segment (start 100.5586 120.2436) (end 101.219 120.904) (width 0.25) (layer B.Cu) (net 4) (tstamp 57563735)) + (segment (start 100.5586 116.0272) (end 100.5586 120.2436) (width 0.25) (layer B.Cu) (net 4) (tstamp 57563734)) + (segment (start 100.965 115.6208) (end 100.5586 116.0272) (width 0.25) (layer B.Cu) (net 4) (tstamp 57563733)) + (via (at 100.965 115.6208) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 4)) + (segment (start 101.3834 116.0392) (end 100.965 115.6208) (width 0.25) (layer F.Cu) (net 4) (tstamp 57563731)) + (segment (start 82.7532 101.0539) (end 82.8167 101.0539) (width 1.27) (layer F.Cu) (net 5)) + (segment (start 82.8167 101.0539) (end 84.895602 98.974998) (width 1.27) (layer F.Cu) (net 5) (tstamp 575639BE)) + (segment (start 84.895602 98.974998) (end 86.36 98.974998) (width 1.27) (layer F.Cu) (net 5) (tstamp 575639BF)) + (segment (start 86.36 98.974998) (end 86.36 98.945) (width 1.27) (layer F.Cu) (net 5) (tstamp 575639C1)) + (segment (start 114.303 107.9366) (end 114.303 107.6452) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 114.303 107.6452) (end 113.4648 106.807) (width 0.25) (layer F.Cu) (net 5) (tstamp 57318D88)) + (segment (start 113.4648 105.7656) (end 113.4648 106.807) (width 0.4) (layer F.Cu) (net 5) (tstamp 56F1DCE2)) + (segment (start 112.5305 101.9103) (end 112.6774 102.0572) (width 0.4) (layer F.Cu) (net 5) (tstamp 56F1DCDF)) + (segment (start 112.6774 102.0572) (end 112.6774 104.9782) (width 0.4) (layer F.Cu) (net 5) (tstamp 56F1DCE0)) + (segment (start 112.6774 104.9782) (end 113.4648 105.7656) (width 0.4) (layer F.Cu) (net 5) (tstamp 56F1DCE1)) + (segment (start 89.535 97.25914) (end 90.28984 97.25914) (width 0.635) (layer F.Cu) (net 5)) + (segment (start 90.28984 97.25914) (end 91.3287 98.298) (width 1.27) (layer F.Cu) (net 5) (tstamp 56F1DDCD)) + (segment (start 112.5432 101.9103) (end 112.5305 101.9103) (width 0.635) (layer F.Cu) (net 5) (tstamp 56F1DDD5)) + (segment (start 112.5885 101.9556) (end 112.5432 101.9103) (width 0.635) (layer F.Cu) (net 5) (tstamp 56F1DDD4)) + (via (at 112.5885 101.9556) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 5)) + (segment (start 112.5885 101.5238) (end 112.5885 101.9556) (width 0.635) (layer B.Cu) (net 5) (tstamp 56F1DDD2)) + (segment (start 109.4389 98.3742) (end 112.5885 101.5238) (width 0.635) (layer B.Cu) (net 5) (tstamp 56F1DDD1)) + (segment (start 91.4049 98.3742) (end 109.4389 98.3742) (width 1.27) (layer B.Cu) (net 5) (tstamp 56F1DDD0)) + (segment (start 91.3287 98.298) (end 91.4049 98.3742) (width 0.635) (layer B.Cu) (net 5) (tstamp 56F1DDCF)) + (via (at 91.3287 98.298) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 5)) + (segment (start 111.34046 101.9103) (end 112.5305 101.9103) (width 0.4) (layer F.Cu) (net 5)) + (segment (start 86.36 98.945) (end 87.84914 98.945) (width 1.27) (layer F.Cu) (net 5)) + (segment (start 87.84914 98.945) (end 89.535 97.25914) (width 1.27) (layer F.Cu) (net 5) (tstamp 56EB542D)) + (segment (start 110.6708 110.2868) (end 109.5636 110.2868) (width 1.27) (layer F.Cu) (net 6)) + (segment (start 109.5636 110.2868) (end 109.5382 110.3122) (width 1.27) (layer F.Cu) (net 6) (tstamp 573192EF)) + (segment (start 110.6708 113.2713) (end 110.6708 110.2868) (width 1.27) (layer F.Cu) (net 6)) + (segment (start 110.6708 110.2868) (end 110.6708 107.763) (width 1.27) (layer F.Cu) (net 6) (tstamp 573192ED)) + (segment (start 110.6708 107.763) (end 110.6648 107.757) (width 1.27) (layer F.Cu) (net 6) (tstamp 573192EA)) + (segment (start 114.049 124.3076) (end 115.6873 122.6693) (width 0.4) (layer B.Cu) (net 6) (tstamp 56F1DF2B)) + (segment (start 115.6873 122.6693) (end 115.6873 116.1923) (width 0.4) (layer B.Cu) (net 6) (tstamp 56F1DF2C)) + (segment (start 115.6873 116.1923) (end 114.6459 115.1509) (width 0.4) (layer B.Cu) (net 6) (tstamp 56F1DF2E)) + (via (at 114.6459 115.1509) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 114.6459 115.1509) (end 113.36447 113.86947) (width 0.4) (layer F.Cu) (net 6) (tstamp 56F1DF30)) + (segment (start 113.36447 113.86947) (end 113.36447 113.78057) (width 0.4) (layer F.Cu) (net 6) (tstamp 56F1DF31)) + (segment (start 113.36447 113.78057) (end 112.4488 114.69624) (width 1.27) (layer F.Cu) (net 6) (tstamp 56F1DF34)) + (segment (start 96.721 112.649) (end 96.721 114.2313) (width 0.635) (layer F.Cu) (net 6)) + (segment (start 110.6648 113.2653) (end 110.6648 112.91224) (width 0.635) (layer F.Cu) (net 6) (tstamp 56F1DFE8)) + (segment (start 110.6708 113.2713) (end 110.6648 113.2653) (width 0.635) (layer F.Cu) (net 6) (tstamp 56F1DFE7)) + (via (at 110.6708 113.2713) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 109.8961 114.046) (end 110.6708 113.2713) (width 0.635) (layer B.Cu) (net 6) (tstamp 56F1DFE3)) + (segment (start 106.7211 114.046) (end 109.8961 114.046) (width 0.635) (layer B.Cu) (net 6) (tstamp 56F1DFDA)) + (segment (start 106.2131 114.554) (end 106.7211 114.046) (width 0.635) (layer B.Cu) (net 6) (tstamp 56F1DFD9)) + (segment (start 98.5169 114.554) (end 106.2131 114.554) (width 0.635) (layer B.Cu) (net 6) (tstamp 56F1DFD4)) + (segment (start 98.0089 115.062) (end 98.5169 114.554) (width 0.635) (layer B.Cu) (net 6) (tstamp 56F1DFD3)) + (via (at 98.0089 115.062) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 97.5517 115.062) (end 98.0089 115.062) (width 0.635) (layer F.Cu) (net 6) (tstamp 56F1DFD1)) + (segment (start 96.721 114.2313) (end 97.5517 115.062) (width 0.635) (layer F.Cu) (net 6) (tstamp 56F1DFD0)) + (segment (start 110.6648 112.91224) (end 112.4488 114.69624) (width 1.27) (layer F.Cu) (net 6) (tstamp 56F1DD70)) + (segment (start 113.795 124.3076) (end 114.049 124.3076) (width 0.4) (layer B.Cu) (net 6)) + (segment (start 96.721 112.649) (end 96.721 110.797) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 98.031 106.54) (end 97.02 106.54) (width 0.25) (layer F.Cu) (net 6) (tstamp 56F1CFE4)) + (segment (start 98.171 106.68) (end 98.031 106.54) (width 0.25) (layer F.Cu) (net 6) (tstamp 56F1CFE2)) + (segment (start 98.171 109.347) (end 98.171 106.68) (width 0.25) (layer F.Cu) (net 6) (tstamp 56F1CFE1)) + (segment (start 96.721 110.797) (end 98.171 109.347) (width 0.25) (layer F.Cu) (net 6) (tstamp 56F1CFDB)) + (segment (start 97.02 106.54) (end 95.9615 106.54) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 95.9615 106.54) (end 95.0595 107.442) (width 0.25) (layer F.Cu) (net 6) (tstamp 56F1CF7E)) + (segment (start 95.0595 107.442) (end 95.0595 107.557) (width 0.25) (layer F.Cu) (net 6) (tstamp 56F1CF7F)) + (segment (start 107.7588 118.3513) (end 107.7588 117.2083) (width 0.635) (layer F.Cu) (net 7)) + (segment (start 107.7588 117.2083) (end 107.7461 117.1956) (width 0.635) (layer F.Cu) (net 7) (tstamp 57563975)) + (segment (start 107.7588 118.3513) (end 107.7588 116.0526) (width 0.635) (layer F.Cu) (net 7)) + (segment (start 107.7588 116.0526) (end 107.7461 116.0399) (width 0.635) (layer F.Cu) (net 7) (tstamp 5756396F)) + (segment (start 107.7588 118.3513) (end 105.8291 118.3513) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 108.204 123.7107) (end 108.8143 124.321) (width 0.25) (layer F.Cu) (net 7) (tstamp 57563960)) + (segment (start 108.204 123.1392) (end 108.204 123.7107) (width 0.25) (layer F.Cu) (net 7) (tstamp 5756395F)) + (segment (start 107.4674 122.4026) (end 108.204 123.1392) (width 0.25) (layer F.Cu) (net 7) (tstamp 5756395E)) + (segment (start 105.174202 122.4026) (end 107.4674 122.4026) (width 0.25) (layer F.Cu) (net 7) (tstamp 5756395D)) + (segment (start 104.9528 122.181198) (end 105.174202 122.4026) (width 0.25) (layer F.Cu) (net 7) (tstamp 5756395C)) + (segment (start 104.9528 119.2276) (end 104.9528 122.181198) (width 0.25) (layer F.Cu) (net 7) (tstamp 5756395B)) + (segment (start 105.8291 118.3513) (end 104.9528 119.2276) (width 0.25) (layer F.Cu) (net 7) (tstamp 5756395A)) + (segment (start 108.8143 124.321) (end 109.0549 124.321) (width 0.25) (layer F.Cu) (net 7) (tstamp 57563961)) + (segment (start 107.7461 116.0399) (end 107.7461 118.3386) (width 0.635) (layer F.Cu) (net 7)) + (segment (start 107.7461 118.3386) (end 107.7588 118.3513) (width 0.635) (layer F.Cu) (net 7) (tstamp 57563939)) + (segment (start 105.676 114.3) (end 106.0062 114.3) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 106.0062 114.3) (end 107.7461 116.0399) (width 0.25) (layer F.Cu) (net 7) (tstamp 575638B1)) + (segment (start 105.676 114.3) (end 105.6894 114.3) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 99.621 112.649) (end 102.604 112.649) (width 0.4) (layer F.Cu) (net 7)) + (segment (start 102.604 112.649) (end 102.362 112.649) (width 0.4) (layer F.Cu) (net 7) (tstamp 56F1DA2E)) + (segment (start 104.521 114.3515) (end 103.239 114.3515) (width 0.4) (layer F.Cu) (net 7)) + (segment (start 102.604 113.7165) (end 102.604 111.76) (width 0.4) (layer F.Cu) (net 7) (tstamp 56F1DA2B)) + (segment (start 103.239 114.3515) (end 102.604 113.7165) (width 0.4) (layer F.Cu) (net 7) (tstamp 56F1DA2A)) + (segment (start 102.604 111.76) (end 102.604 111.4545) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 102.604 111.4545) (end 102.87 111.1885) (width 0.25) (layer F.Cu) (net 7) (tstamp 56F1CFED)) + (segment (start 102.87 111.1885) (end 102.87 109.99) (width 0.25) (layer F.Cu) (net 7) (tstamp 56F1CFEE)) + (segment (start 102.362 112.649) (end 102.604 112.407) (width 0.25) (layer F.Cu) (net 7) (tstamp 56F1CFE8)) + (segment (start 102.604 112.407) (end 102.604 111.76) (width 0.25) (layer F.Cu) (net 7) (tstamp 56F1CFE9)) + (segment (start 104.521 114.3515) (end 105.6245 114.3515) (width 0.635) (layer F.Cu) (net 7)) + (segment (start 105.6245 114.3515) (end 105.676 114.3) (width 0.635) (layer F.Cu) (net 7) (tstamp 56F1CBA6)) + (segment (start 94.5926 114.0482) (end 94.5926 114.6706) (width 0.25) (layer F.Cu) (net 8)) + (segment (start 94.5926 114.6706) (end 95.238 115.316) (width 0.25) (layer F.Cu) (net 8) (tstamp 57318976)) + (segment (start 97.2134 120.6754) (end 95.9739 120.6754) (width 0.635) (layer F.Cu) (net 8)) + (segment (start 95.238 119.9395) (end 95.238 115.316) (width 0.635) (layer F.Cu) (net 8) (tstamp 56EB5873)) + (segment (start 95.9739 120.6754) (end 95.238 119.9395) (width 0.635) (layer F.Cu) (net 8) (tstamp 56EB5872)) + (segment (start 109.0549 122.821) (end 110.0829 122.821) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 112.4869 123.0757) (end 113.795 121.7676) (width 0.25) (layer F.Cu) (net 9) (tstamp 57563C57)) + (segment (start 110.3376 123.0757) (end 112.4869 123.0757) (width 0.25) (layer F.Cu) (net 9) (tstamp 57563C55)) + (segment (start 110.0829 122.821) (end 110.3376 123.0757) (width 0.25) (layer F.Cu) (net 9) (tstamp 57563C54)) + (segment (start 106.0944 120.65) (end 106.9975 120.65) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 106.9975 120.65) (end 107.8103 121.4628) (width 0.635) (layer F.Cu) (net 9) (tstamp 5756399D)) + (segment (start 107.8103 121.4628) (end 107.8103 121.6152) (width 0.635) (layer F.Cu) (net 9) (tstamp 5756399E)) + (segment (start 107.9881 119.5197) (end 107.9881 119.6594) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 107.9881 119.6594) (end 106.9975 120.65) (width 0.635) (layer F.Cu) (net 9) (tstamp 57563999)) + (segment (start 110.2487 115.6462) (end 111.633 114.2619) (width 0.635) (layer B.Cu) (net 9)) + (segment (start 111.633 114.2619) (end 111.633 112.5252) (width 0.635) (layer B.Cu) (net 9) (tstamp 57563980)) + (segment (start 111.633 112.5252) (end 110.6898 111.582) (width 0.635) (layer B.Cu) (net 9) (tstamp 57563981)) + (segment (start 109.2461 117.1956) (end 109.2461 116.0399) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 109.2588 118.3513) (end 109.2588 117.2083) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 109.2588 117.2083) (end 109.2461 117.1956) (width 0.635) (layer F.Cu) (net 9) (tstamp 57563978)) + (segment (start 109.2461 116.0399) (end 109.2461 118.3386) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 109.2461 118.3386) (end 109.2588 118.3513) (width 0.635) (layer F.Cu) (net 9) (tstamp 57563972)) + (segment (start 109.0549 122.821) (end 109.0161 122.821) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 109.0161 122.821) (end 107.8103 121.6152) (width 0.25) (layer F.Cu) (net 9) (tstamp 57563964)) + (segment (start 107.8103 121.6152) (end 106.8451 120.65) (width 0.25) (layer F.Cu) (net 9) (tstamp 575639A1)) + (segment (start 106.8451 120.65) (end 106.0944 120.65) (width 0.25) (layer F.Cu) (net 9) (tstamp 57563965)) + (segment (start 106.0944 120.65) (end 106.9975 120.65) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 107.9881 119.5197) (end 109.1565 118.3513) (width 0.25) (layer F.Cu) (net 9) (tstamp 57563943)) + (segment (start 106.9975 120.65) (end 107.9881 119.6594) (width 0.25) (layer F.Cu) (net 9) (tstamp 57563941)) + (segment (start 109.1565 118.3513) (end 109.2588 118.3513) (width 0.25) (layer F.Cu) (net 9) (tstamp 57563944)) + (segment (start 109.2461 118.3386) (end 109.2588 118.3513) (width 0.635) (layer F.Cu) (net 9) (tstamp 5756393C)) + (segment (start 109.2461 116.0399) (end 109.855 116.0399) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 109.855 116.0399) (end 110.2487 115.6462) (width 0.25) (layer F.Cu) (net 9) (tstamp 575638B5)) + (via (at 110.2487 115.6462) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 111.633 114.2619) (end 111.633 112.5252) (width 0.25) (layer B.Cu) (net 9) (tstamp 575638B8)) + (segment (start 111.633 112.5252) (end 110.6898 111.582) (width 0.25) (layer B.Cu) (net 9) (tstamp 575638B9)) + (segment (start 108.72 102.54) (end 107.8232 102.54) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 102.108 99.7204) (end 102.108 99.6315) (width 0.25) (layer F.Cu) (net 9) (tstamp 575637CE)) + (segment (start 104.2416 101.854) (end 102.108 99.7204) (width 0.25) (layer F.Cu) (net 9) (tstamp 575637CC)) + (segment (start 107.1372 101.854) (end 104.2416 101.854) (width 0.25) (layer F.Cu) (net 9) (tstamp 575637CB)) + (segment (start 107.8232 102.54) (end 107.1372 101.854) (width 0.25) (layer F.Cu) (net 9) (tstamp 575637CA)) + (segment (start 93.738 115.316) (end 92.468 115.316) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 92.468 115.316) (end 92.456 115.304) (width 0.635) (layer F.Cu) (net 9) (tstamp 573192F4)) + (segment (start 110.6648 105.857) (end 110.6648 104.7466) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 109.779 102.54) (end 108.72 102.54) (width 0.25) (layer F.Cu) (net 9) (tstamp 57318DA3)) + (segment (start 110.1598 102.9208) (end 109.779 102.54) (width 0.25) (layer F.Cu) (net 9) (tstamp 57318DA2)) + (segment (start 110.1598 104.2416) (end 110.1598 102.9208) (width 0.25) (layer F.Cu) (net 9) (tstamp 57318DA1)) + (segment (start 110.6648 104.7466) (end 110.1598 104.2416) (width 0.25) (layer F.Cu) (net 9) (tstamp 57318DA0)) + (segment (start 114.303 109.4366) (end 113.30916 109.4366) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 113.30916 109.4366) (end 112.4488 110.29696) (width 0.25) (layer F.Cu) (net 9) (tstamp 57318D85)) + (segment (start 107.9142 110.2868) (end 107.9142 109.4366) (width 0.25) (layer F.Cu) (net 9)) + (via (at 108.0546 109.2962) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 107.9142 109.4366) (end 108.0546 109.2962) (width 0.25) (layer F.Cu) (net 9) (tstamp 57318C41)) + (segment (start 108.0546 109.2962) (end 108.0546 109.2581) (width 0.25) (layer B.Cu) (net 9) (tstamp 57318C43)) + (segment (start 108.0546 109.2581) (end 108.0546 109.2962) (width 0.25) (layer B.Cu) (net 9) (tstamp 57318C44)) + (segment (start 108.0546 109.2962) (end 108.0546 109.2581) (width 0.25) (layer B.Cu) (net 9) (tstamp 57318C46)) + (segment (start 89.535 100.86086) (end 89.87074 100.86086) (width 0.4) (layer F.Cu) (net 9)) + (segment (start 89.87074 100.86086) (end 91.0874 99.6442) (width 0.4) (layer F.Cu) (net 9) (tstamp 57318B14)) + (segment (start 96.6796 98.5266) (end 97.089 98.936) (width 0.4) (layer F.Cu) (net 9) (tstamp 57318B1A)) + (segment (start 96.4468 98.5266) (end 96.6796 98.5266) (width 0.4) (layer F.Cu) (net 9) (tstamp 57318B19)) + (segment (start 95.6594 97.7392) (end 96.4468 98.5266) (width 0.4) (layer F.Cu) (net 9) (tstamp 57318B18)) + (segment (start 94.618 97.7392) (end 95.6594 97.7392) (width 0.4) (layer F.Cu) (net 9) (tstamp 57318B17)) + (segment (start 92.713 99.6442) (end 94.618 97.7392) (width 0.4) (layer F.Cu) (net 9) (tstamp 57318B16)) + (segment (start 91.0874 99.6442) (end 92.713 99.6442) (width 0.4) (layer F.Cu) (net 9) (tstamp 57318B15)) + (segment (start 108.1405 98.4885) (end 107.95 98.4885) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 107.95 98.4885) (end 107.6325 98.171) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D054)) + (segment (start 108.1405 98.4885) (end 108.1405 98.1075) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 109.4105 97.028) (end 109.4105 96.4565) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D03D)) + (segment (start 109.1565 97.282) (end 109.4105 97.028) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D03C)) + (segment (start 108.966 97.282) (end 109.1565 97.282) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D03B)) + (segment (start 108.1405 98.1075) (end 108.966 97.282) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D03A)) + (segment (start 107.6325 98.171) (end 107.6325 97.155) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D059)) + (segment (start 107.6325 97.155) (end 107.442 96.9645) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D05A)) + (segment (start 107.442 96.9645) (end 105.6005 96.9645) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D05B)) + (segment (start 105.6005 96.9645) (end 105.27 97.295) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D05C)) + (segment (start 102.50724 108.0008) (end 103.26162 108.0008) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E23F)) + (segment (start 103.26162 108.0008) (end 103.28956 107.97286) (width 0.635) (layer B.Cu) (net 9) (tstamp 56F1E245)) + (segment (start 103.28956 107.97286) (end 105.86004 107.97286) (width 0.635) (layer B.Cu) (net 9) (tstamp 56F1E246)) + (segment (start 105.86004 107.97286) (end 107.14528 109.2581) (width 0.635) (layer B.Cu) (net 9) (tstamp 56F1E248)) + (via (at 103.26162 108.0008) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 105.12344 112.87252) (end 109.39928 112.87252) (width 1.27) (layer B.Cu) (net 9)) + (segment (start 109.39928 112.87252) (end 110.6898 111.582) (width 1.27) (layer B.Cu) (net 9) (tstamp 56F1E627)) + (segment (start 110.6898 111.582) (end 111.0148 111.582) (width 1.27) (layer B.Cu) (net 9) (tstamp 56F1E62B)) + (segment (start 111.0148 111.582) (end 112.4648 110.132) (width 1.27) (layer B.Cu) (net 9) (tstamp 56F1E62C)) + (segment (start 112.4648 110.132) (end 112.4648 107.982) (width 1.27) (layer B.Cu) (net 9) (tstamp 56F1E630)) + (segment (start 99.822 115.8875) (end 99.822 115.5476) (width 0.635) (layer F.Cu) (net 9)) + (via (at 105.12344 112.87252) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 104.30048 113.69548) (end 105.12344 112.87252) (width 0.635) (layer B.Cu) (net 9) (tstamp 56F1E39C)) + (segment (start 101.919518 113.69548) (end 104.30048 113.69548) (width 0.635) (layer B.Cu) (net 9) (tstamp 56F1E39B)) + (segment (start 101.886498 113.66246) (end 101.919518 113.69548) (width 0.635) (layer B.Cu) (net 9) (tstamp 56F1E39A)) + (via (at 101.886498 113.66246) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 101.70714 113.66246) (end 101.886498 113.66246) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E398)) + (segment (start 99.822 115.5476) (end 101.70714 113.66246) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E395)) + (segment (start 105.12344 112.87252) (end 105.12344 112.8515) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E39E)) + (segment (start 105.12344 112.8515) (end 105.12344 112.87252) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E39F)) + (segment (start 105.12344 112.87252) (end 105.12344 112.8515) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E3A1)) + (segment (start 97.02 105.74) (end 100.18294 105.74) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 102.44374 108.0008) (end 102.50724 108.0008) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E259)) + (segment (start 100.18294 105.74) (end 102.44374 108.0008) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E258)) + (segment (start 102.07 109.99) (end 102.07 108.43804) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 102.07 108.43804) (end 102.50724 108.0008) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E23E)) + (segment (start 95.0595 106.057) (end 95.6952 106.057) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 96.0122 105.74) (end 97.02 105.74) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1DBA5)) + (segment (start 95.6952 106.057) (end 96.0122 105.74) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1DBA4)) + (segment (start 105.27 98.29) (end 105.27 99.6185) (width 0.4) (layer F.Cu) (net 9)) + (segment (start 105.27 99.6185) (end 105.283 99.6315) (width 0.4) (layer F.Cu) (net 9) (tstamp 56F1D1BF)) + (via (at 105.283 99.6315) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 105.283 99.6315) (end 105.0925 99.822) (width 0.4) (layer B.Cu) (net 9) (tstamp 56F1D1C1)) + (segment (start 105.0925 99.822) (end 102.2985 99.822) (width 0.4) (layer B.Cu) (net 9) (tstamp 56F1D1C2)) + (segment (start 102.2985 99.822) (end 102.108 99.6315) (width 0.4) (layer B.Cu) (net 9) (tstamp 56F1D1C3)) + (via (at 102.108 99.6315) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 102.07 99.5935) (end 102.07 98.29) (width 0.4) (layer F.Cu) (net 9) (tstamp 56F1D1C6)) + (segment (start 102.108 99.6315) (end 102.07 99.5935) (width 0.4) (layer F.Cu) (net 9) (tstamp 56F1D1C5)) + (segment (start 93.738 120.003) (end 93.8015 120.003) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 93.738 115.836) (end 93.738 115.316) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1D199)) + (segment (start 94.402998 116.500998) (end 93.738 115.836) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1D198)) + (segment (start 94.402998 119.401502) (end 94.402998 116.500998) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1D197)) + (segment (start 93.8015 120.003) (end 94.402998 119.401502) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1D196)) + (segment (start 105.27 97.295) (end 105.27 98.29) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D05D)) + (segment (start 101.104 111.76) (end 101.219 111.76) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 101.219 111.76) (end 102.07 110.909) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1CFF4)) + (segment (start 102.07 110.909) (end 102.07 109.99) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1CFF5)) + (segment (start 95.0595 106.057) (end 95.0595 105.918) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 104.521 112.8515) (end 105.12344 112.8515) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 105.12344 112.8515) (end 105.6245 112.8515) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E3A2)) + (segment (start 105.6245 112.8515) (end 105.676 112.903) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1CBA9)) + (segment (start 100.318 116.84) (end 100.318 116.193) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 94.488 123.698) (end 94.361 123.698) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5E3B)) + (via (at 94.488 123.698) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 95.631 123.698) (end 94.488 123.698) (width 0.635) (layer B.Cu) (net 9) (tstamp 56EB5E38)) + (segment (start 96.139 124.206) (end 95.631 123.698) (width 0.635) (layer B.Cu) (net 9) (tstamp 56EB5E35)) + (segment (start 97.028 124.206) (end 96.139 124.206) (width 0.635) (layer B.Cu) (net 9) (tstamp 56EB5E34)) + (segment (start 98.171 123.063) (end 97.028 124.206) (width 0.635) (layer B.Cu) (net 9) (tstamp 56EB5E31)) + (segment (start 98.171 116.713) (end 98.171 123.063) (width 0.635) (layer B.Cu) (net 9) (tstamp 56EB5E30)) + (segment (start 99.06 115.8875) (end 98.171 116.713) (width 0.635) (layer B.Cu) (net 9) (tstamp 56EB5E2F)) + (segment (start 99.822 115.8875) (end 99.06 115.8875) (width 0.635) (layer B.Cu) (net 9) (tstamp 56EB5E2E)) + (via (at 99.822 115.8875) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 100.318 116.193) (end 99.822 115.8875) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5E2B)) + (segment (start 100.318 124.079) (end 100.318 124.726) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 94.361 120.626) (end 93.738 120.003) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5D77)) + (segment (start 94.361 123.698) (end 94.361 120.626) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5D76)) + (segment (start 96.012 125.349) (end 94.361 123.698) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5D75)) + (segment (start 99.695 125.349) (end 96.012 125.349) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5D74)) + (segment (start 100.318 124.726) (end 99.695 125.349) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5D73)) + (segment (start 91.8134 120.6754) (end 93.0656 120.6754) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 93.0656 120.6754) (end 93.738 120.003) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB586A)) + (segment (start 85.332 104.5464) (end 85.332 105.5504) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 85.6234 120.9802) (end 85.6234 120.9548) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EB4FDE)) + (via (at 85.6234 120.9802) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 85.6234 105.8418) (end 85.6234 120.9802) (width 0.25) (layer B.Cu) (net 9) (tstamp 56EB4FD6)) + (segment (start 85.5726 105.791) (end 85.6234 105.8418) (width 0.25) (layer B.Cu) (net 9) (tstamp 56EB4FD5)) + (via (at 85.5726 105.791) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 85.332 105.5504) (end 85.5726 105.791) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EB4FD3)) + (segment (start 91.8134 120.6754) (end 89.7382 120.6754) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 89.7128 120.7008) (end 89.7128 120.7262) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF512)) + (segment (start 89.7382 120.6754) (end 89.7128 120.7008) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF510)) + (segment (start 88.3666 120.9548) (end 89.4842 120.9548) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 90.1954 120.2436) (end 90.1954 119.7102) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF509)) + (segment (start 89.4842 120.9548) (end 89.7128 120.7262) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF508)) + (segment (start 89.7128 120.7262) (end 90.1954 120.2436) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF513)) + (segment (start 88.9254 121.7422) (end 88.9254 121.5136) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 88.9254 121.5136) (end 88.3666 120.9548) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF455)) + (segment (start 88.3666 120.9548) (end 85.6234 120.9548) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF456)) + (segment (start 86.233 123.3678) (end 85.6234 122.7582) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF34C)) + (segment (start 85.979 118.3386) (end 85.979 117.971) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF34F)) + (segment (start 85.6234 118.6942) (end 85.979 118.3386) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF34E)) + (segment (start 85.6234 122.7582) (end 85.6234 120.9548) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF34D)) + (segment (start 85.6234 120.9548) (end 85.6234 118.6942) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF459)) + (segment (start 86.233 123.583) (end 86.233 123.3678) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 86.36 100.445) (end 89.11914 100.445) (width 1.27) (layer F.Cu) (net 9)) + (segment (start 89.11914 100.445) (end 89.535 100.86086) (width 1.27) (layer F.Cu) (net 9) (tstamp 56EB5429)) + (segment (start 92.456 115.304) (end 91.428 115.304) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 90.424 115.062) (end 87.67 112.308) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5203)) + (segment (start 91.186 115.062) (end 90.424 115.062) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5201)) + (segment (start 91.428 115.304) (end 91.186 115.062) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5200)) + (segment (start 87.67 112.308) (end 87.67 111.76) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5204)) + (segment (start 89.535 100.86086) (end 89.908262 100.86086) (width 1.27) (layer F.Cu) (net 9)) + (segment (start 89.908262 100.86086) (end 90.805 101.757598) (width 1.27) (layer F.Cu) (net 9) (tstamp 56EB50B5)) + (via (at 90.805 101.757598) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 90.805 101.757598) (end 90.805 103.505) (width 1.27) (layer B.Cu) (net 9) (tstamp 56EB50BB)) + (segment (start 90.805 103.505) (end 90.17 104.14) (width 1.27) (layer B.Cu) (net 9) (tstamp 56EB50BC)) + (segment (start 87.63 104.14) (end 90.17 104.14) (width 1.27) (layer B.Cu) (net 9)) + (segment (start 87.63 106.68) (end 87.63 104.14) (width 1.27) (layer B.Cu) (net 9)) + (segment (start 87.67 111.76) (end 87.67 106.72) (width 1.27) (layer B.Cu) (net 9)) + (segment (start 87.67 106.72) (end 87.63 106.68) (width 1.27) (layer B.Cu) (net 9) (tstamp 56EB4D70)) + (segment (start 112.4488 110.29696) (end 112.4488 107.641) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 112.4488 107.641) (end 111.6233 106.8155) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1DD7B)) + (via (at 112.4648 107.982) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 112.4648 107.982) (end 112.4488 107.982) (width 1.27) (layer F.Cu) (net 9) (tstamp 56F1E633)) + (segment (start 112.4488 107.982) (end 112.4488 110.29696) (width 1.27) (layer F.Cu) (net 9) (tstamp 56F1E634)) + (segment (start 111.6233 106.7816) (end 111.6233 106.8155) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E254)) + (segment (start 111.60635 106.79855) (end 111.6233 106.7816) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E252)) + (segment (start 111.6233 106.7816) (end 111.60635 106.79855) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E251)) + (segment (start 107.14528 109.2581) (end 108.0546 109.2581) (width 0.635) (layer B.Cu) (net 9) (tstamp 56F1E249)) + (segment (start 108.0546 109.2581) (end 109.1468 109.2581) (width 0.635) (layer B.Cu) (net 9) (tstamp 57318C47)) + (segment (start 109.1468 109.2581) (end 111.6233 106.7816) (width 0.635) (layer B.Cu) (net 9) (tstamp 56F1E24A)) + (via (at 111.6233 106.7816) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 111.6233 106.8155) (end 110.6648 105.857) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E255)) + (segment (start 113.795 121.7676) (end 113.795 121.3866) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 113.795 121.0848) (end 113.795 121.7676) (width 0.25) (layer F.Cu) (net 9) (tstamp 5756396B)) + (segment (start 113.795 121.7676) (end 113.795 121.666) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 113.795 121.7676) (end 113.795 121.7422) (width 0.4) (layer F.Cu) (net 9)) + (segment (start 82.423 118.098) (end 80.5838 118.098) (width 0.25) (layer F.Cu) (net 10)) + (segment (start 80.5838 118.098) (end 80.4448 118.237) (width 0.25) (layer F.Cu) (net 10) (tstamp 56F46D1D)) + (segment (start 82.423 116.598) (end 81.3458 116.598) (width 0.25) (layer F.Cu) (net 11)) + (segment (start 81.3458 116.598) (end 80.4448 115.697) (width 0.25) (layer F.Cu) (net 11) (tstamp 56F46D20)) + (segment (start 83.2866 117.0418) (end 83.2866 119.5966) (width 0.25) (layer F.Cu) (net 11) (tstamp 56EBF325)) + (segment (start 82.8428 116.598) (end 83.2866 117.0418) (width 0.25) (layer F.Cu) (net 11) (tstamp 56EBF324)) + (segment (start 82.423 116.598) (end 82.8428 116.598) (width 0.25) (layer F.Cu) (net 11)) + (segment (start 83.2866 119.5966) (end 83.324 119.634) (width 0.25) (layer F.Cu) (net 11) (tstamp 56EBF326)) + (segment (start 82.181 116.84) (end 82.423 116.598) (width 0.25) (layer F.Cu) (net 11) (tstamp 56EBF31D)) + (segment (start 82.55 124.956) (end 82.0838 124.956) (width 0.25) (layer F.Cu) (net 12)) + (segment (start 82.0838 124.956) (end 80.4448 123.317) (width 0.25) (layer F.Cu) (net 12) (tstamp 56F46D16)) + (segment (start 83.324 121.92) (end 81.5878 121.92) (width 0.25) (layer F.Cu) (net 13)) + (segment (start 81.5878 121.92) (end 80.4448 120.777) (width 0.25) (layer F.Cu) (net 13) (tstamp 56F46D19)) + (segment (start 83.324 121.92) (end 83.324 122.682) (width 0.25) (layer F.Cu) (net 13)) + (segment (start 83.324 122.682) (end 82.55 123.456) (width 0.25) (layer F.Cu) (net 13) (tstamp 56EBF340)) + (segment (start 93.7036 106.31886) (end 93.34246 106.68) (width 1.27) (layer F.Cu) (net 14) (tstamp 5731898C)) + (segment (start 93.7036 104.8534) (end 93.7036 106.31886) (width 1.27) (layer F.Cu) (net 14)) + (segment (start 90.6048 106.807) (end 90.7572 106.807) (width 0.25) (layer F.Cu) (net 14)) + (segment (start 90.7572 106.807) (end 92.1796 105.3846) (width 0.25) (layer F.Cu) (net 14) (tstamp 57318787)) + (segment (start 92.1796 105.3846) (end 92.1796 103.124) (width 0.25) (layer F.Cu) (net 14) (tstamp 5731878A)) + (segment (start 92.1796 103.124) (end 91.824 102.7684) (width 0.25) (layer F.Cu) (net 14) (tstamp 5731878C)) + (segment (start 91.824 102.7684) (end 85.5098 102.7684) (width 0.25) (layer F.Cu) (net 14) (tstamp 5731878D)) + (segment (start 85.5098 102.7684) (end 85.332 102.9462) (width 0.25) (layer F.Cu) (net 14) (tstamp 57318790)) + (segment (start 90.17 106.68) (end 90.17 106.172) (width 0.25) (layer F.Cu) (net 14)) + (segment (start 85.471 102.9462) (end 85.332 102.9462) (width 0.25) (layer F.Cu) (net 14) (tstamp 56EB4FCD)) + (segment (start 92.456 113.804) (end 90.944 113.804) (width 1.27) (layer F.Cu) (net 14)) + (segment (start 90.17 113.03) (end 90.17 111.76) (width 1.27) (layer F.Cu) (net 14) (tstamp 56EB51FA)) + (segment (start 90.944 113.804) (end 90.17 113.03) (width 1.27) (layer F.Cu) (net 14) (tstamp 56EB51F9)) + (segment (start 90.17 106.68) (end 93.34246 106.68) (width 1.27) (layer B.Cu) (net 14)) + (segment (start 90.17 111.76) (end 90.17 106.68) (width 1.27) (layer B.Cu) (net 14)) + (segment (start 82.7532 95.9739) (end 92.79636 95.9739) (width 1.27) (layer B.Cu) (net 15)) + (segment (start 92.79636 95.9739) (end 93.34246 96.52) (width 1.27) (layer B.Cu) (net 15) (tstamp 575639BB)) + (segment (start 96.139 96.136) (end 93.72646 96.136) (width 0.635) (layer F.Cu) (net 15)) + (segment (start 93.72646 96.136) (end 93.34246 96.52) (width 0.635) (layer F.Cu) (net 15) (tstamp 56F1CCF4)) + (segment (start 83.832 104.5464) (end 83.832 102.9462) (width 0.635) (layer F.Cu) (net 16)) + (segment (start 83.832 102.9462) (end 83.832 102.48254) (width 0.25) (layer F.Cu) (net 16)) + (segment (start 107.53086 108.14) (end 108.72 108.14) (width 0.25) (layer F.Cu) (net 16) (tstamp 56F1E1FE)) + (segment (start 107.46278 108.07192) (end 107.53086 108.14) (width 0.25) (layer F.Cu) (net 16) (tstamp 56F1E1FD)) + (via (at 107.46278 108.07192) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 16)) + (segment (start 107.15798 107.76712) (end 107.46278 108.07192) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1FB)) + (segment (start 107.15798 106.3244) (end 107.15798 107.76712) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1F9)) + (segment (start 105.79654 104.96296) (end 107.15798 106.3244) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1F7)) + (segment (start 104.55702 104.96296) (end 105.79654 104.96296) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1F6)) + (segment (start 104.45542 104.86136) (end 104.55702 104.96296) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1F5)) + (via (at 104.45542 104.86136) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 16)) + (segment (start 103.81026 104.86136) (end 104.45542 104.86136) (width 0.25) (layer F.Cu) (net 16) (tstamp 56F1E1F0)) + (segment (start 98.91822 99.96932) (end 103.81026 104.86136) (width 0.25) (layer F.Cu) (net 16) (tstamp 56F1E1EF)) + (via (at 98.91822 99.96932) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 16)) + (segment (start 94.37162 99.96932) (end 98.91822 99.96932) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1D4)) + (segment (start 93.72646 100.61448) (end 94.37162 99.96932) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1D2)) + (segment (start 88.91062 100.61448) (end 93.72646 100.61448) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1D0)) + (segment (start 87.69142 101.83368) (end 88.91062 100.61448) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1CF)) + (via (at 87.69142 101.83368) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 16)) + (segment (start 84.48086 101.83368) (end 87.69142 101.83368) (width 0.25) (layer F.Cu) (net 16) (tstamp 56F1E1CD)) + (segment (start 83.832 102.48254) (end 84.48086 101.83368) (width 0.25) (layer F.Cu) (net 16) (tstamp 56F1E1CC)) + (segment (start 98.818 116.84) (end 98.818 114.7408) (width 0.25) (layer F.Cu) (net 17)) + (segment (start 103.6731 112.522) (end 103.6731 109.9931) (width 0.25) (layer F.Cu) (net 17) (tstamp 56F1DFAF)) + (segment (start 103.3429 112.8522) (end 103.6731 112.522) (width 0.25) (layer F.Cu) (net 17) (tstamp 56F1DFAE)) + (via (at 103.3429 112.8522) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 17)) + (segment (start 102.7333 112.2426) (end 103.3429 112.8522) (width 0.25) (layer B.Cu) (net 17) (tstamp 56F1DFA9)) + (segment (start 100.0155 112.2426) (end 102.7333 112.2426) (width 0.25) (layer B.Cu) (net 17) (tstamp 56F1DFA8)) + (segment (start 98.5423 113.7158) (end 100.0155 112.2426) (width 0.25) (layer B.Cu) (net 17) (tstamp 56F1DFA7)) + (via (at 98.5423 113.7158) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 17)) + (segment (start 98.2883 113.9698) (end 98.5423 113.7158) (width 0.25) (layer F.Cu) (net 17) (tstamp 56F1DFA4)) + (segment (start 98.2883 114.2111) (end 98.2883 113.9698) (width 0.25) (layer F.Cu) (net 17) (tstamp 56F1DFA3)) + (segment (start 98.818 114.7408) (end 98.2883 114.2111) (width 0.25) (layer F.Cu) (net 17) (tstamp 56F1DF9D)) + (segment (start 103.6731 109.9931) (end 103.67 109.99) (width 0.25) (layer F.Cu) (net 17) (tstamp 56F1DFB0)) + (segment (start 103.67 109.99) (end 103.67 108.6105) (width 0.4) (layer F.Cu) (net 17)) + (segment (start 103.67 108.6105) (end 104.9405 107.34) (width 0.4) (layer F.Cu) (net 17) (tstamp 56F1D91E)) + (segment (start 104.9405 107.34) (end 108.72 107.34) (width 0.4) (layer F.Cu) (net 17) (tstamp 56F1D91F)) + (segment (start 103.6955 110.0155) (end 103.67 109.99) (width 0.4) (layer F.Cu) (net 17) (tstamp 56F1D91B)) + (segment (start 98.818 116.84) (end 97.2388 116.84) (width 0.4) (layer F.Cu) (net 17)) + (segment (start 97.2388 116.84) (end 97.2134 116.8654) (width 0.4) (layer F.Cu) (net 17) (tstamp 56F1D8FD)) + (segment (start 97.2134 118.1354) (end 97.2134 116.8654) (width 0.635) (layer F.Cu) (net 17)) + (segment (start 89.5604 119.7102) (end 89.5604 119.31188) (width 0.25) (layer F.Cu) (net 19)) + (segment (start 107.42214 105.67416) (end 108.65416 105.67416) (width 0.25) (layer F.Cu) (net 19) (tstamp 56F1E12A)) + (segment (start 107.02082 105.27284) (end 107.42214 105.67416) (width 0.25) (layer F.Cu) (net 19) (tstamp 56F1E129)) + (via (at 107.02082 105.27284) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 19)) + (segment (start 107.02082 102.81666) (end 107.02082 105.27284) (width 0.25) (layer B.Cu) (net 19) (tstamp 56F1E126)) + (segment (start 106.47726 102.2731) (end 107.02082 102.81666) (width 0.25) (layer B.Cu) (net 19) (tstamp 56F1E124)) + (segment (start 101.06706 102.2731) (end 106.47726 102.2731) (width 0.25) (layer B.Cu) (net 19) (tstamp 56F1E120)) + (segment (start 98.89536 104.4448) (end 101.06706 102.2731) (width 0.25) (layer B.Cu) (net 19) (tstamp 56F1E11E)) + (segment (start 98.89536 107.7595) (end 98.89536 104.4448) (width 0.25) (layer B.Cu) (net 19) (tstamp 56F1E11C)) + (segment (start 91.38966 115.2652) (end 98.89536 107.7595) (width 0.25) (layer B.Cu) (net 19) (tstamp 56F1E119)) + (segment (start 91.38966 117.76456) (end 91.38966 115.2652) (width 0.25) (layer B.Cu) (net 19) (tstamp 56F1E116)) + (segment (start 90.3762 118.77802) (end 91.38966 117.76456) (width 0.25) (layer B.Cu) (net 19) (tstamp 56F1E115)) + (via (at 90.3762 118.77802) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 19)) + (segment (start 90.09426 118.77802) (end 90.3762 118.77802) (width 0.25) (layer F.Cu) (net 19) (tstamp 56F1E113)) + (segment (start 89.5604 119.31188) (end 90.09426 118.77802) (width 0.25) (layer F.Cu) (net 19) (tstamp 56F1E109)) + (segment (start 108.65416 105.67416) (end 108.72 105.74) (width 0.25) (layer F.Cu) (net 19) (tstamp 56F1E12B)) + (segment (start 89.5604 121.7422) (end 89.5604 122.22018) (width 0.25) (layer F.Cu) (net 20)) + (segment (start 107.64566 104.902) (end 108.682 104.902) (width 0.25) (layer F.Cu) (net 20) (tstamp 56F1E161)) + (segment (start 107.36118 104.61752) (end 107.64566 104.902) (width 0.25) (layer F.Cu) (net 20) (tstamp 56F1E160)) + (segment (start 106.9751 104.61752) (end 107.36118 104.61752) (width 0.25) (layer F.Cu) (net 20) (tstamp 56F1E15F)) + (segment (start 106.30454 103.94696) (end 106.9751 104.61752) (width 0.25) (layer F.Cu) (net 20) (tstamp 56F1E15E)) + (via (at 106.30454 103.94696) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 20)) + (segment (start 106.30454 102.9716) (end 106.30454 103.94696) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E15A)) + (segment (start 106.08102 102.74808) (end 106.30454 102.9716) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E159)) + (segment (start 101.30582 102.74808) (end 106.08102 102.74808) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E157)) + (segment (start 99.444 104.6099) (end 101.30582 102.74808) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E154)) + (segment (start 99.444 107.95) (end 99.444 104.6099) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E152)) + (segment (start 91.839662 115.554338) (end 99.444 107.95) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E14F)) + (segment (start 91.839662 118.259438) (end 91.839662 115.554338) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E14C)) + (segment (start 90.49304 119.60606) (end 91.839662 118.259438) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E14A)) + (segment (start 89.06556 119.60606) (end 90.49304 119.60606) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E149)) + (segment (start 88.05972 120.6119) (end 89.06556 119.60606) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E148)) + (segment (start 88.05972 121.9835) (end 88.05972 120.6119) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E147)) + (segment (start 88.59566 122.51944) (end 88.05972 121.9835) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E146)) + (segment (start 89.1443 122.51944) (end 88.59566 122.51944) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E145)) + (segment (start 89.20272 122.57786) (end 89.1443 122.51944) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E144)) + (via (at 89.20272 122.57786) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 20)) + (segment (start 89.5604 122.22018) (end 89.20272 122.57786) (width 0.25) (layer F.Cu) (net 20) (tstamp 56F1E142)) + (segment (start 108.682 104.902) (end 108.72 104.94) (width 0.25) (layer F.Cu) (net 20) (tstamp 56F1E162)) + (segment (start 91.8134 119.4054) (end 92.61394 119.4054) (width 0.25) (layer F.Cu) (net 21)) + (segment (start 107.4323 104.14) (end 108.72 104.14) (width 0.25) (layer F.Cu) (net 21) (tstamp 56F1E181)) + (segment (start 107.30784 104.01554) (end 107.4323 104.14) (width 0.25) (layer F.Cu) (net 21) (tstamp 56F1E180)) + (segment (start 107.30784 103.48976) (end 107.30784 104.01554) (width 0.25) (layer F.Cu) (net 21) (tstamp 56F1E17F)) + (segment (start 106.95224 103.13416) (end 107.30784 103.48976) (width 0.25) (layer F.Cu) (net 21) (tstamp 56F1E17E)) + (segment (start 105.78892 103.13416) (end 106.95224 103.13416) (width 0.25) (layer F.Cu) (net 21) (tstamp 56F1E17D)) + (segment (start 105.52476 103.39832) (end 105.78892 103.13416) (width 0.25) (layer F.Cu) (net 21) (tstamp 56F1E17C)) + (via (at 105.52476 103.39832) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 21)) + (segment (start 101.84684 103.39832) (end 105.52476 103.39832) (width 0.25) (layer B.Cu) (net 21) (tstamp 56F1E172)) + (segment (start 100.07646 105.1687) (end 101.84684 103.39832) (width 0.25) (layer B.Cu) (net 21) (tstamp 56F1E170)) + (segment (start 100.07646 108.2802) (end 100.07646 105.1687) (width 0.25) (layer B.Cu) (net 21) (tstamp 56F1E16C)) + (segment (start 93.62486 114.7318) (end 100.07646 108.2802) (width 0.25) (layer B.Cu) (net 21) (tstamp 56F1E16A)) + (segment (start 93.62486 116.4844) (end 93.62486 114.7318) (width 0.25) (layer B.Cu) (net 21) (tstamp 56F1E169)) + (segment (start 93.40134 116.70792) (end 93.62486 116.4844) (width 0.25) (layer B.Cu) (net 21) (tstamp 56F1E168)) + (via (at 93.40134 116.70792) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 21)) + (segment (start 93.40134 118.618) (end 93.40134 116.70792) (width 0.25) (layer F.Cu) (net 21) (tstamp 56F1E166)) + (segment (start 92.61394 119.4054) (end 93.40134 118.618) (width 0.25) (layer F.Cu) (net 21) (tstamp 56F1E165)) + (segment (start 91.8134 119.4054) (end 92.5576 119.4054) (width 0.4) (layer F.Cu) (net 21)) + (segment (start 91.8134 121.9454) (end 92.96954 121.9454) (width 0.25) (layer F.Cu) (net 22)) + (segment (start 107.74218 103.22052) (end 108.60052 103.22052) (width 0.25) (layer F.Cu) (net 22) (tstamp 56F1E197)) + (segment (start 107.12242 102.60076) (end 107.74218 103.22052) (width 0.25) (layer F.Cu) (net 22) (tstamp 56F1E196)) + (segment (start 105.20472 102.60076) (end 107.12242 102.60076) (width 0.25) (layer F.Cu) (net 22) (tstamp 56F1E195)) + (segment (start 104.88214 102.92334) (end 105.20472 102.60076) (width 0.25) (layer F.Cu) (net 22) (tstamp 56F1E193)) + (segment (start 104.88214 103.69804) (end 104.88214 102.92334) (width 0.25) (layer F.Cu) (net 22) (tstamp 56F1E192)) + (segment (start 104.51892 104.06126) (end 104.88214 103.69804) (width 0.25) (layer F.Cu) (net 22) (tstamp 56F1E191)) + (via (at 104.51892 104.06126) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 22)) + (segment (start 102.39548 104.06126) (end 104.51892 104.06126) (width 0.25) (layer B.Cu) (net 22) (tstamp 56F1E18E)) + (segment (start 100.64796 105.80878) (end 102.39548 104.06126) (width 0.25) (layer B.Cu) (net 22) (tstamp 56F1E18C)) + (segment (start 100.64796 108.5977) (end 100.64796 105.80878) (width 0.25) (layer B.Cu) (net 22) (tstamp 56F1E18A)) + (segment (start 94.32336 114.9223) (end 100.64796 108.5977) (width 0.25) (layer B.Cu) (net 22) (tstamp 56F1E188)) + (segment (start 94.32336 120.59158) (end 94.32336 114.9223) (width 0.25) (layer B.Cu) (net 22) (tstamp 56F1E187)) + (segment (start 93.50802 121.40692) (end 94.32336 120.59158) (width 0.25) (layer B.Cu) (net 22) (tstamp 56F1E186)) + (via (at 93.50802 121.40692) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 22)) + (segment (start 92.96954 121.9454) (end 93.50802 121.40692) (width 0.25) (layer F.Cu) (net 22) (tstamp 56F1E184)) + (segment (start 108.60052 103.22052) (end 108.72 103.34) (width 0.25) (layer F.Cu) (net 22) (tstamp 56F1E199)) + (segment (start 108.6945 103.3145) (end 108.72 103.34) (width 0.4) (layer F.Cu) (net 22) (tstamp 56F1D8FA)) + (segment (start 104.47 98.29) (end 104.47 99.898) (width 0.4) (layer F.Cu) (net 25)) + (segment (start 106.4255 100.14) (end 108.72 100.14) (width 0.4) (layer F.Cu) (net 25) (tstamp 56F1D1CC)) + (segment (start 106.172 100.3935) (end 106.4255 100.14) (width 0.4) (layer F.Cu) (net 25) (tstamp 56F1D1CB)) + (segment (start 104.9655 100.3935) (end 106.172 100.3935) (width 0.4) (layer F.Cu) (net 25) (tstamp 56F1D1CA)) + (segment (start 104.47 99.898) (end 104.9655 100.3935) (width 0.4) (layer F.Cu) (net 25) (tstamp 56F1D1C9)) + (segment (start 109.4105 98.4885) (end 109.4105 98.806) (width 0.25) (layer F.Cu) (net 26)) + (segment (start 107.767 99.187) (end 106.87 98.29) (width 0.25) (layer F.Cu) (net 26) (tstamp 56F1D049)) + (segment (start 109.0295 99.187) (end 107.767 99.187) (width 0.25) (layer F.Cu) (net 26) (tstamp 56F1D048)) + (segment (start 109.4105 98.806) (end 109.0295 99.187) (width 0.25) (layer F.Cu) (net 26) (tstamp 56F1D047)) + (segment (start 108.1405 96.4565) (end 103.5685 96.4565) (width 0.25) (layer F.Cu) (net 29)) + (segment (start 102.87 97.155) (end 102.87 98.29) (width 0.25) (layer F.Cu) (net 29) (tstamp 56F1D034)) + (segment (start 103.5685 96.4565) (end 102.87 97.155) (width 0.25) (layer F.Cu) (net 29) (tstamp 56F1D033)) + (segment (start 95.189 98.936) (end 95.189 100.142) (width 0.635) (layer F.Cu) (net 34)) + (segment (start 95.987 100.94) (end 97.02 100.94) (width 0.635) (layer F.Cu) (net 34) (tstamp 56F1CCF0)) + (segment (start 95.189 100.142) (end 95.987 100.94) (width 0.635) (layer F.Cu) (net 34) (tstamp 56F1CCEF)) + (segment (start 111.34046 101.2603) (end 110.5406 101.2603) (width 0.4) (layer F.Cu) (net 36)) + (segment (start 99.2406 102.54) (end 97.02 102.54) (width 0.4) (layer F.Cu) (net 36) (tstamp 56F1DDB1)) + (segment (start 99.6853 102.0953) (end 99.2406 102.54) (width 0.4) (layer F.Cu) (net 36) (tstamp 56F1DDB0)) + (via (at 99.6853 102.0953) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 36)) + (segment (start 99.6853 101.831702) (end 99.6853 102.0953) (width 0.4) (layer B.Cu) (net 36) (tstamp 56F1DDAE)) + (segment (start 100.2949 101.222102) (end 99.6853 101.831702) (width 0.4) (layer B.Cu) (net 36) (tstamp 56F1DDAD)) + (segment (start 109.708702 101.222102) (end 100.2949 101.222102) (width 0.4) (layer B.Cu) (net 36) (tstamp 56F1DDAC)) + (segment (start 110.0612 101.5746) (end 109.708702 101.222102) (width 0.4) (layer B.Cu) (net 36) (tstamp 56F1DDAB)) + (via (at 110.0612 101.5746) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 36)) + (segment (start 110.2263 101.5746) (end 110.0612 101.5746) (width 0.4) (layer F.Cu) (net 36) (tstamp 56F1DDA9)) + (segment (start 110.5406 101.2603) (end 110.2263 101.5746) (width 0.4) (layer F.Cu) (net 36) (tstamp 56F1DDA8)) + (segment (start 110.2127 100.6103) (end 111.34046 100.6103) (width 0.4) (layer F.Cu) (net 37) (tstamp 56F1DD9A)) + (segment (start 110.2009 100.6221) (end 110.2127 100.6103) (width 0.4) (layer F.Cu) (net 37) (tstamp 56F1DD99)) + (via (at 110.2009 100.6221) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 37)) + (segment (start 99.8631 100.6221) (end 110.2009 100.6221) (width 0.4) (layer B.Cu) (net 37) (tstamp 56F1DD97)) + (segment (start 98.8852 101.6) (end 99.8631 100.6221) (width 0.4) (layer B.Cu) (net 37) (tstamp 56F1DD96)) + (segment (start 98.8852 102.9462) (end 98.8852 101.6) (width 0.4) (layer B.Cu) (net 37) (tstamp 56F1DD95)) + (segment (start 98.5804 103.251) (end 98.8852 102.9462) (width 0.4) (layer B.Cu) (net 37) (tstamp 56F1DD94)) + (via (at 98.5804 103.251) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 37)) + (segment (start 98.4914 103.34) (end 98.5804 103.251) (width 0.4) (layer F.Cu) (net 37) (tstamp 56F1DD92)) + (segment (start 97.02 103.34) (end 98.4914 103.34) (width 0.4) (layer F.Cu) (net 37)) + (segment (start 84.328 107.43) (end 86.1702 107.43) (width 0.25) (layer F.Cu) (net 38)) + (segment (start 95.631 104.14) (end 97.02 104.14) (width 0.25) (layer F.Cu) (net 38) (tstamp 57319293)) + (segment (start 95.5802 104.1908) (end 95.631 104.14) (width 0.25) (layer F.Cu) (net 38) (tstamp 57319292)) + (via (at 95.5802 104.1908) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 38)) + (segment (start 94.8182 104.1908) (end 95.5802 104.1908) (width 0.25) (layer B.Cu) (net 38) (tstamp 57319290)) + (segment (start 94.5134 104.4956) (end 94.8182 104.1908) (width 0.25) (layer B.Cu) (net 38) (tstamp 5731928F)) + (segment (start 94.5134 105.1306) (end 94.5134 104.4956) (width 0.25) (layer B.Cu) (net 38) (tstamp 5731928E)) + (segment (start 95.0468 105.664) (end 94.5134 105.1306) (width 0.25) (layer B.Cu) (net 38) (tstamp 57319289)) + (segment (start 95.0468 107.830366) (end 95.0468 105.664) (width 0.25) (layer B.Cu) (net 38) (tstamp 57319288)) + (segment (start 94.393766 108.4834) (end 95.0468 107.830366) (width 0.25) (layer B.Cu) (net 38) (tstamp 57319287)) + (segment (start 92.0242 108.4834) (end 94.393766 108.4834) (width 0.25) (layer B.Cu) (net 38) (tstamp 57319286)) + (segment (start 91.8718 108.6358) (end 92.0242 108.4834) (width 0.25) (layer B.Cu) (net 38) (tstamp 57319285)) + (via (at 91.8718 108.6358) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 38)) + (segment (start 87.376 108.6358) (end 91.8718 108.6358) (width 0.25) (layer F.Cu) (net 38) (tstamp 57319280)) + (segment (start 86.1702 107.43) (end 87.376 108.6358) (width 0.25) (layer F.Cu) (net 38) (tstamp 5731927E)) + (segment (start 84.328 109.97) (end 91.0964 109.97) (width 0.25) (layer F.Cu) (net 39)) + (segment (start 95.6692 104.94) (end 97.02 104.94) (width 0.25) (layer F.Cu) (net 39) (tstamp 5731927B)) + (segment (start 95.5294 105.0798) (end 95.6692 104.94) (width 0.25) (layer F.Cu) (net 39) (tstamp 5731927A)) + (via (at 95.5294 105.0798) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 39)) + (segment (start 95.5294 105.5116) (end 95.5294 105.0798) (width 0.25) (layer B.Cu) (net 39) (tstamp 57319278)) + (segment (start 95.829698 105.811898) (end 95.5294 105.5116) (width 0.25) (layer B.Cu) (net 39) (tstamp 57319277)) + (segment (start 95.829698 107.683866) (end 95.829698 105.811898) (width 0.25) (layer B.Cu) (net 39) (tstamp 57319271)) + (segment (start 94.191964 109.3216) (end 95.829698 107.683866) (width 0.25) (layer B.Cu) (net 39) (tstamp 5731926A)) + (segment (start 91.7448 109.3216) (end 94.191964 109.3216) (width 0.25) (layer B.Cu) (net 39) (tstamp 57319269)) + (segment (start 91.3892 109.6772) (end 91.7448 109.3216) (width 0.25) (layer B.Cu) (net 39) (tstamp 57319268)) + (via (at 91.3892 109.6772) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 39)) + (segment (start 91.0964 109.97) (end 91.3892 109.6772) (width 0.25) (layer F.Cu) (net 39) (tstamp 57319264)) + (segment (start 95.9646 107.34) (end 97.02 107.34) (width 0.25) (layer F.Cu) (net 40) (tstamp 573189F7)) + (segment (start 95.8626 107.442) (end 95.9646 107.34) (width 0.25) (layer F.Cu) (net 40) (tstamp 573189F6)) + (segment (start 95.8626 108.1532) (end 95.8626 107.442) (width 0.25) (layer F.Cu) (net 40) (tstamp 573189F5)) + (segment (start 95.634 108.3818) (end 95.8626 108.1532) (width 0.25) (layer F.Cu) (net 40) (tstamp 573189F4)) + (segment (start 93.5766 108.3818) (end 95.634 108.3818) (width 0.25) (layer F.Cu) (net 40) (tstamp 573189F2)) + (segment (start 91.3922 110.5662) (end 93.5766 108.3818) (width 0.25) (layer F.Cu) (net 40) (tstamp 573189F0)) + (segment (start 86.5408 110.5662) (end 91.3922 110.5662) (width 0.25) (layer F.Cu) (net 40) (tstamp 573189EE)) + (segment (start 84.597 112.51) (end 86.5408 110.5662) (width 0.25) (layer F.Cu) (net 40) (tstamp 573189ED)) + (segment (start 84.328 112.51) (end 84.597 112.51) (width 0.25) (layer F.Cu) (net 40)) + (segment (start 84.328 112.51) (end 84.328 112.452002) (width 0.25) (layer F.Cu) (net 40)) + (segment (start 86.8336 115.05) (end 84.328 115.05) (width 0.25) (layer F.Cu) (net 41) (tstamp 57318A0E)) + (segment (start 86.871 115.0874) (end 86.8336 115.05) (width 0.25) (layer F.Cu) (net 41) (tstamp 57318A0D)) + (via (at 86.871 115.0874) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 41)) + (segment (start 88.8776 115.0874) (end 86.871 115.0874) (width 0.25) (layer B.Cu) (net 41) (tstamp 57318A0A)) + (segment (start 93.7798 110.1852) (end 88.8776 115.0874) (width 0.25) (layer B.Cu) (net 41) (tstamp 57318A08)) + (segment (start 95.833262 110.1852) (end 93.7798 110.1852) (width 0.25) (layer B.Cu) (net 41) (tstamp 57318A07)) + (segment (start 96.254331 109.764131) (end 95.833262 110.1852) (width 0.25) (layer B.Cu) (net 41) (tstamp 57318A06)) + (segment (start 96.254331 109.488669) (end 96.254331 109.764131) (width 0.25) (layer B.Cu) (net 41) (tstamp 57318A05)) + (segment (start 96.5992 109.1438) (end 96.254331 109.488669) (width 0.25) (layer B.Cu) (net 41) (tstamp 57318A04)) + (via (at 96.5992 109.1438) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 41)) + (segment (start 97.02 108.723) (end 96.5992 109.1438) (width 0.25) (layer F.Cu) (net 41) (tstamp 57318A02)) + (segment (start 97.02 108.14) (end 97.02 108.723) (width 0.25) (layer F.Cu) (net 41)) + (segment (start 111.255 124.3076) (end 110.8456 124.3076) (width 0.25) (layer B.Cu) (net 42)) + (segment (start 110.8456 124.3076) (end 109.093 122.555) (width 0.25) (layer B.Cu) (net 42) (tstamp 57563857)) + (segment (start 98.164398 109.99) (end 98.87 109.99) (width 0.25) (layer F.Cu) (net 42) (tstamp 57563873)) + (segment (start 97.7392 110.415198) (end 98.164398 109.99) (width 0.25) (layer F.Cu) (net 42) (tstamp 57563872)) + (segment (start 97.7392 111.2774) (end 97.7392 110.415198) (width 0.25) (layer F.Cu) (net 42) (tstamp 57563871)) + (segment (start 98.298 111.8362) (end 97.7392 111.2774) (width 0.25) (layer F.Cu) (net 42) (tstamp 57563870)) + (segment (start 98.5266 111.8362) (end 98.298 111.8362) (width 0.25) (layer F.Cu) (net 42) (tstamp 5756386F)) + (segment (start 98.5774 111.7854) (end 98.5266 111.8362) (width 0.25) (layer F.Cu) (net 42) (tstamp 5756386E)) + (via (at 98.5774 111.7854) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 42)) + (segment (start 99.7204 110.6424) (end 98.5774 111.7854) (width 0.25) (layer B.Cu) (net 42) (tstamp 5756386B)) + (segment (start 107.0102 110.6424) (end 99.7204 110.6424) (width 0.25) (layer B.Cu) (net 42) (tstamp 57563865)) + (segment (start 108.0516 111.6838) (end 107.0102 110.6424) (width 0.25) (layer B.Cu) (net 42) (tstamp 57563864)) + (via (at 108.0516 111.6838) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 42)) + (segment (start 108.839 112.4712) (end 108.0516 111.6838) (width 0.25) (layer F.Cu) (net 42) (tstamp 57563861)) + (segment (start 108.839 114.3254) (end 108.839 112.4712) (width 0.25) (layer F.Cu) (net 42) (tstamp 57563860)) + (segment (start 109.474 114.9604) (end 108.839 114.3254) (width 0.25) (layer F.Cu) (net 42) (tstamp 5756385F)) + (via (at 109.474 114.9604) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 42)) + (segment (start 109.093 115.3414) (end 109.474 114.9604) (width 0.25) (layer B.Cu) (net 42) (tstamp 5756385D)) + (segment (start 109.093 122.555) (end 109.093 115.3414) (width 0.25) (layer B.Cu) (net 42) (tstamp 57563858)) + (segment (start 111.255 124.3076) (end 110.8654 124.3076) (width 0.25) (layer B.Cu) (net 42)) + (segment (start 111.255 121.7676) (end 110.7694 121.7676) (width 0.25) (layer F.Cu) (net 43)) + (segment (start 111.255 121.7676) (end 111.255 121.2372) (width 0.25) (layer B.Cu) (net 43)) + (segment (start 111.255 121.2372) (end 109.5502 119.5324) (width 0.25) (layer B.Cu) (net 43) (tstamp 57563826)) + (segment (start 99.67 108.6862) (end 99.67 109.99) (width 0.25) (layer F.Cu) (net 43) (tstamp 5756383D)) + (segment (start 100.1268 108.2294) (end 99.67 108.6862) (width 0.25) (layer F.Cu) (net 43) (tstamp 5756383C)) + (segment (start 101.1682 108.2294) (end 100.1268 108.2294) (width 0.25) (layer F.Cu) (net 43) (tstamp 5756383B)) + (segment (start 101.2952 108.1024) (end 101.1682 108.2294) (width 0.25) (layer F.Cu) (net 43) (tstamp 5756383A)) + (via (at 101.2952 108.1024) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 43)) + (segment (start 103.3526 110.1598) (end 101.2952 108.1024) (width 0.25) (layer B.Cu) (net 43) (tstamp 57563836)) + (segment (start 107.5944 110.1598) (end 103.3526 110.1598) (width 0.25) (layer B.Cu) (net 43) (tstamp 57563835)) + (segment (start 108.9406 111.506) (end 107.5944 110.1598) (width 0.25) (layer B.Cu) (net 43) (tstamp 57563834)) + (via (at 108.9406 111.506) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 43)) + (segment (start 109.4994 112.0648) (end 108.9406 111.506) (width 0.25) (layer F.Cu) (net 43) (tstamp 57563831)) + (segment (start 109.4994 113.8936) (end 109.4994 112.0648) (width 0.25) (layer F.Cu) (net 43) (tstamp 5756382F)) + (segment (start 111.1504 115.5446) (end 109.4994 113.8936) (width 0.25) (layer F.Cu) (net 43) (tstamp 5756382E)) + (segment (start 111.1504 116.078) (end 111.1504 115.5446) (width 0.25) (layer F.Cu) (net 43) (tstamp 5756382D)) + (segment (start 110.8202 116.4082) (end 111.1504 116.078) (width 0.25) (layer F.Cu) (net 43) (tstamp 5756382C)) + (via (at 110.8202 116.4082) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 43)) + (segment (start 110.2614 116.4082) (end 110.8202 116.4082) (width 0.25) (layer B.Cu) (net 43) (tstamp 5756382A)) + (segment (start 109.5502 117.1194) (end 110.2614 116.4082) (width 0.25) (layer B.Cu) (net 43) (tstamp 57563829)) + (segment (start 109.5502 119.5324) (end 109.5502 117.1194) (width 0.25) (layer B.Cu) (net 43) (tstamp 57563827)) + (segment (start 97.2134 123.2154) (end 96.2817 123.2154) (width 0.25) (layer F.Cu) (net 47)) + (segment (start 105.27 110.8997) (end 105.27 109.99) (width 0.25) (layer F.Cu) (net 47) (tstamp 56F1DF9A)) + (segment (start 104.8415 111.3282) (end 105.27 110.8997) (width 0.25) (layer F.Cu) (net 47) (tstamp 56F1DF99)) + (segment (start 104.6129 111.3282) (end 104.8415 111.3282) (width 0.25) (layer F.Cu) (net 47) (tstamp 56F1DF98)) + (segment (start 104.397 111.5441) (end 104.6129 111.3282) (width 0.25) (layer F.Cu) (net 47) (tstamp 56F1DF97)) + (via (at 104.397 111.5441) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 47)) + (segment (start 99.825 111.5441) (end 104.397 111.5441) (width 0.25) (layer B.Cu) (net 47) (tstamp 56F1DF94)) + (segment (start 95.1895 116.1796) (end 99.825 111.5441) (width 0.25) (layer B.Cu) (net 47) (tstamp 56F1DF86)) + (segment (start 95.1895 120.9548) (end 95.1895 116.1796) (width 0.25) (layer B.Cu) (net 47) (tstamp 56F1DF7C)) + (segment (start 95.6975 121.4628) (end 95.1895 120.9548) (width 0.25) (layer B.Cu) (net 47) (tstamp 56F1DF7B)) + (via (at 95.6975 121.4628) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 47)) + (segment (start 95.6975 122.6312) (end 95.6975 121.4628) (width 0.25) (layer F.Cu) (net 47) (tstamp 56F1DF79)) + (segment (start 96.2817 123.2154) (end 95.6975 122.6312) (width 0.25) (layer F.Cu) (net 47) (tstamp 56F1DF78)) + (segment (start 105.283 110.003) (end 105.27 109.99) (width 0.4) (layer F.Cu) (net 47) (tstamp 56F1DA92)) + (segment (start 96.9975 122.9995) (end 97.2134 123.2154) (width 0.4) (layer F.Cu) (net 47) (tstamp 56F1D962)) + (segment (start 97.2134 124.4854) (end 98.4116 124.4854) (width 0.635) (layer F.Cu) (net 47)) + (segment (start 98.4116 124.4854) (end 98.818 124.079) (width 0.635) (layer F.Cu) (net 47) (tstamp 56EB5D70)) + (segment (start 97.2134 123.2154) (end 97.2134 124.4854) (width 0.635) (layer F.Cu) (net 47)) + (segment (start 100.6475 120.0665) (end 101.5485 120.0665) (width 0.25) (layer F.Cu) (net 49)) + (segment (start 108.1024 114.3) (end 107.176 114.3) (width 0.25) (layer F.Cu) (net 49) (tstamp 5756388D)) + (segment (start 108.3818 114.5794) (end 108.1024 114.3) (width 0.25) (layer F.Cu) (net 49) (tstamp 5756388C)) + (segment (start 108.3818 114.8588) (end 108.3818 114.5794) (width 0.25) (layer F.Cu) (net 49) (tstamp 5756388B)) + (segment (start 108.4072 114.8842) (end 108.3818 114.8588) (width 0.25) (layer F.Cu) (net 49) (tstamp 5756388A)) + (via (at 108.4072 114.8842) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 49)) + (segment (start 108.0262 115.2652) (end 108.4072 114.8842) (width 0.25) (layer B.Cu) (net 49) (tstamp 57563883)) + (segment (start 102.7684 115.2652) (end 108.0262 115.2652) (width 0.25) (layer B.Cu) (net 49) (tstamp 57563882)) + (segment (start 101.9556 116.078) (end 102.7684 115.2652) (width 0.25) (layer B.Cu) (net 49) (tstamp 57563881)) + (segment (start 101.9556 119.6594) (end 101.9556 116.078) (width 0.25) (layer B.Cu) (net 49) (tstamp 57563880)) + (segment (start 101.727 119.888) (end 101.9556 119.6594) (width 0.25) (layer B.Cu) (net 49) (tstamp 5756387F)) + (via (at 101.727 119.888) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 49)) + (segment (start 101.5485 120.0665) (end 101.727 119.888) (width 0.25) (layer F.Cu) (net 49) (tstamp 5756387D)) + (segment (start 107.176 112.903) (end 107.176 110.296) (width 0.4) (layer F.Cu) (net 49)) + (segment (start 107.176 110.296) (end 106.87 109.99) (width 0.4) (layer F.Cu) (net 49) (tstamp 56F1D9FF)) + (segment (start 107.176 112.903) (end 107.176 114.3) (width 0.635) (layer F.Cu) (net 49)) + (segment (start 100.6475 121.17) (end 100.6475 120.0665) (width 0.635) (layer F.Cu) (net 49)) + (segment (start 82.55 115.05) (end 82.3378 115.05) (width 0.25) (layer F.Cu) (net 51)) + (segment (start 82.3378 115.05) (end 80.4448 113.157) (width 0.25) (layer F.Cu) (net 51) (tstamp 56F46D23)) + (segment (start 82.55 115.05) (end 82.1824 115.05) (width 0.25) (layer F.Cu) (net 51)) + (segment (start 82.55 112.51) (end 82.3378 112.51) (width 0.25) (layer F.Cu) (net 52)) + (segment (start 82.3378 112.51) (end 80.4448 110.617) (width 0.25) (layer F.Cu) (net 52) (tstamp 56F46D26)) + (segment (start 82.55 112.51) (end 82.3856 112.51) (width 0.25) (layer F.Cu) (net 52)) + (segment (start 82.55 109.97) (end 82.3378 109.97) (width 0.25) (layer F.Cu) (net 53)) + (segment (start 82.3378 109.97) (end 80.4448 108.077) (width 0.25) (layer F.Cu) (net 53) (tstamp 56F46D29)) + (segment (start 82.55 109.97) (end 82.3094 109.97) (width 0.25) (layer F.Cu) (net 53)) + (segment (start 82.55 107.43) (end 82.3378 107.43) (width 0.25) (layer F.Cu) (net 54)) + (segment (start 82.3378 107.43) (end 80.4448 105.537) (width 0.25) (layer F.Cu) (net 54) (tstamp 56F46D2C)) + (segment (start 113.7061 118.2243) (end 113.7061 112.37976) (width 0.25) (layer B.Cu) (net 55)) + (segment (start 108.7755 96.09628) (end 108.7755 96.4565) (width 0.25) (layer F.Cu) (net 55) (tstamp 56F1E373)) + (segment (start 109.0833 95.78848) (end 108.7755 96.09628) (width 0.25) (layer F.Cu) (net 55) (tstamp 56F1E372)) + (segment (start 109.78434 95.78848) (end 109.0833 95.78848) (width 0.25) (layer F.Cu) (net 55) (tstamp 56F1E371)) + (segment (start 109.98246 95.9866) (end 109.78434 95.78848) (width 0.25) (layer F.Cu) (net 55) (tstamp 56F1E370)) + (segment (start 109.98246 96.03232) (end 109.98246 95.9866) (width 0.25) (layer F.Cu) (net 55) (tstamp 56F1E36F)) + (segment (start 110.3787 96.42856) (end 109.98246 96.03232) (width 0.25) (layer F.Cu) (net 55) (tstamp 56F1E36E)) + (via (at 110.3787 96.42856) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 55)) + (segment (start 112.11606 96.42856) (end 110.3787 96.42856) (width 0.25) (layer B.Cu) (net 55) (tstamp 56F1E368)) + (segment (start 112.764182 97.076682) (end 112.11606 96.42856) (width 0.25) (layer B.Cu) (net 55) (tstamp 56F1E367)) + (segment (start 112.764182 98.204442) (end 112.764182 97.076682) (width 0.25) (layer B.Cu) (net 55) (tstamp 56F1E366)) + (segment (start 116.00226 101.44252) (end 112.764182 98.204442) (width 0.25) (layer B.Cu) (net 55) (tstamp 56F1E35F)) + (segment (start 116.00226 110.0836) (end 116.00226 101.44252) (width 0.25) (layer B.Cu) (net 55) (tstamp 56F1E35E)) + (segment (start 113.7061 112.37976) (end 116.00226 110.0836) (width 0.25) (layer B.Cu) (net 55) (tstamp 56F1E35C)) + (segment (start 111.1661 118.2243) (end 113.1346 112.141) (width 0.25) (layer B.Cu) (net 56)) + (segment (start 108.7755 98.108898) (end 108.7755 98.4885) (width 0.25) (layer F.Cu) (net 56) (tstamp 56F1E325)) + (segment (start 109.129958 97.75444) (end 108.7755 98.108898) (width 0.25) (layer F.Cu) (net 56) (tstamp 56F1E322)) + (segment (start 109.81482 97.75444) (end 109.129958 97.75444) (width 0.25) (layer F.Cu) (net 56) (tstamp 56F1E321)) + (segment (start 110.13486 97.4344) (end 109.81482 97.75444) (width 0.25) (layer F.Cu) (net 56) (tstamp 56F1E320)) + (via (at 110.13486 97.4344) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 56)) + (segment (start 110.51586 97.0534) (end 110.13486 97.4344) (width 0.25) (layer B.Cu) (net 56) (tstamp 56F1E31C)) + (segment (start 111.87222 97.0534) (end 110.51586 97.0534) (width 0.25) (layer B.Cu) (net 56) (tstamp 56F1E31B)) + (segment (start 112.31418 97.49536) (end 111.87222 97.0534) (width 0.25) (layer B.Cu) (net 56) (tstamp 56F1E31A)) + (segment (start 112.31418 98.66884) (end 112.31418 97.49536) (width 0.25) (layer B.Cu) (net 56) (tstamp 56F1E318)) + (segment (start 115.34694 101.7016) (end 112.31418 98.66884) (width 0.25) (layer B.Cu) (net 56) (tstamp 56F1E316)) + (segment (start 115.34694 109.88548) (end 115.34694 101.7016) (width 0.25) (layer B.Cu) (net 56) (tstamp 56F1E313)) + (segment (start 113.1346 112.141) (end 115.34694 109.88548) (width 0.25) (layer B.Cu) (net 56) (tstamp 56F1E30F)) + (segment (start 99.06 122.67) (end 100.6475 122.67) (width 0.635) (layer F.Cu) (net 57)) + (segment (start 97.2134 121.9454) (end 98.3354 121.9454) (width 0.635) (layer F.Cu) (net 57)) + (segment (start 98.3354 121.9454) (end 99.06 122.67) (width 0.635) (layer F.Cu) (net 57) (tstamp 56EB5D7A)) + (segment (start 97.2134 119.4054) (end 98.2211 119.4054) (width 0.635) (layer F.Cu) (net 58)) + (segment (start 98.2211 119.4054) (end 99.06 118.5665) (width 0.635) (layer F.Cu) (net 58) (tstamp 56EB5D95)) + (segment (start 100.6475 118.5665) (end 99.06 118.5665) (width 0.635) (layer F.Cu) (net 58)) + (segment (start 82.55 105.93) (end 84.328 105.93) (width 0.25) (layer F.Cu) (net 59)) + (segment (start 82.55 108.47) (end 84.328 108.47) (width 0.25) (layer F.Cu) (net 60)) + (segment (start 82.55 111.01) (end 84.328 111.01) (width 0.25) (layer F.Cu) (net 61)) + (segment (start 82.55 113.55) (end 84.328 113.55) (width 0.25) (layer F.Cu) (net 62)) + (segment (start 89.3953 123.5703) (end 90.4755 123.5703) (width 0.25) (layer F.Cu) (net 63)) + (segment (start 90.8304 123.2154) (end 91.8134 123.2154) (width 0.25) (layer F.Cu) (net 63) (tstamp 56EBF44F)) + (segment (start 90.4755 123.5703) (end 90.8304 123.2154) (width 0.25) (layer F.Cu) (net 63) (tstamp 56EBF44E)) + (segment (start 87.8713 123.5703) (end 87.8713 121.9207) (width 0.25) (layer F.Cu) (net 63)) + (segment (start 87.8713 121.9207) (end 87.872 121.92) (width 0.25) (layer F.Cu) (net 63) (tstamp 56EBF35E)) + (segment (start 87.8713 123.5703) (end 89.3953 123.5703) (width 0.25) (layer F.Cu) (net 63)) + (segment (start 89.3953 125.0703) (end 89.6613 125.0703) (width 0.25) (layer F.Cu) (net 64)) + (segment (start 89.6613 125.0703) (end 90.4748 124.2568) (width 0.25) (layer F.Cu) (net 64) (tstamp 56EBF444)) + (segment (start 90.2208 122.3264) (end 90.2208 121.7676) (width 0.25) (layer F.Cu) (net 64) (tstamp 56EBF44A)) + (segment (start 90.5002 122.6058) (end 90.2208 122.3264) (width 0.25) (layer F.Cu) (net 64) (tstamp 56EBF449)) + (via (at 90.5002 122.6058) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 64)) + (segment (start 90.5002 124.2314) (end 90.5002 122.6058) (width 0.25) (layer B.Cu) (net 64) (tstamp 56EBF447)) + (segment (start 90.4748 124.2568) (end 90.5002 124.2314) (width 0.25) (layer B.Cu) (net 64) (tstamp 56EBF446)) + (via (at 90.4748 124.2568) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 64)) + (segment (start 90.2208 121.7676) (end 90.1954 121.7422) (width 0.25) (layer F.Cu) (net 64) (tstamp 56EBF44B)) + (segment (start 87.8713 125.0703) (end 89.3953 125.0703) (width 0.25) (layer F.Cu) (net 64)) + (segment (start 91.8134 118.1354) (end 90.2716 118.1354) (width 0.25) (layer F.Cu) (net 65)) + (segment (start 90.1072 117.971) (end 89.281 117.971) (width 0.25) (layer F.Cu) (net 65) (tstamp 56EBF470)) + (segment (start 90.2716 118.1354) (end 90.1072 117.971) (width 0.25) (layer F.Cu) (net 65) (tstamp 56EBF46F)) + (segment (start 87.872 119.634) (end 87.872 118.213) (width 0.25) (layer F.Cu) (net 65)) + (segment (start 87.872 118.213) (end 87.63 117.971) (width 0.25) (layer F.Cu) (net 65) (tstamp 56EBF339)) + (segment (start 87.63 117.971) (end 89.281 117.971) (width 0.25) (layer F.Cu) (net 65)) + (segment (start 89.281 116.471) (end 90.3344 116.471) (width 0.25) (layer F.Cu) (net 66)) + (segment (start 88.9254 118.9228) (end 88.9254 119.7102) (width 0.25) (layer F.Cu) (net 66) (tstamp 56EBF46B)) + (segment (start 88.9762 118.872) (end 88.9254 118.9228) (width 0.25) (layer F.Cu) (net 66) (tstamp 56EBF46A)) + (via (at 88.9762 118.872) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 66)) + (segment (start 89.1032 118.745) (end 88.9762 118.872) (width 0.25) (layer B.Cu) (net 66) (tstamp 56EBF468)) + (segment (start 89.4334 118.745) (end 89.1032 118.745) (width 0.25) (layer B.Cu) (net 66) (tstamp 56EBF467)) + (segment (start 90.5256 117.6528) (end 89.4334 118.745) (width 0.25) (layer B.Cu) (net 66) (tstamp 56EBF466)) + (segment (start 90.5256 116.6622) (end 90.5256 117.6528) (width 0.25) (layer B.Cu) (net 66) (tstamp 56EBF465)) + (segment (start 90.4494 116.586) (end 90.5256 116.6622) (width 0.25) (layer B.Cu) (net 66) (tstamp 56EBF464)) + (via (at 90.4494 116.586) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 66)) + (segment (start 90.3344 116.471) (end 90.4494 116.586) (width 0.25) (layer F.Cu) (net 66) (tstamp 56EBF462)) + (segment (start 87.63 116.471) (end 89.281 116.471) (width 0.25) (layer F.Cu) (net 66)) + (segment (start 85.979 116.471) (end 86.1956 116.471) (width 0.25) (layer F.Cu) (net 67)) + (segment (start 86.1956 116.471) (end 86.8172 115.8494) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF473)) + (segment (start 90.805 115.8494) (end 91.8134 116.8578) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF475)) + (segment (start 86.8172 115.8494) (end 90.805 115.8494) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF474)) + (segment (start 91.8134 116.8578) (end 91.8134 116.8654) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF476)) + (segment (start 85.979 116.471) (end 86.0672 116.471) (width 0.25) (layer F.Cu) (net 67)) + (segment (start 86.0672 116.471) (end 86.7918 117.1956) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF32F)) + (segment (start 86.372 119.0124) (end 86.372 119.634) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF334)) + (segment (start 86.5124 118.872) (end 86.372 119.0124) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF333)) + (segment (start 86.5378 118.872) (end 86.5124 118.872) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF332)) + (segment (start 86.7918 118.618) (end 86.5378 118.872) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF331)) + (segment (start 86.7918 117.1956) (end 86.7918 118.618) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF330)) + (segment (start 84.455 116.471) (end 85.979 116.471) (width 0.25) (layer F.Cu) (net 67)) + (segment (start 86.233 125.083) (end 86.8814 125.083) (width 0.25) (layer F.Cu) (net 68)) + (segment (start 91.3054 124.9934) (end 91.8134 124.4854) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF43D)) + (segment (start 90.7796 124.9934) (end 91.3054 124.9934) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF43C)) + (segment (start 90.678 125.095) (end 90.7796 124.9934) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF43B)) + (via (at 90.678 125.095) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 68)) + (segment (start 86.9442 125.095) (end 90.678 125.095) (width 0.25) (layer B.Cu) (net 68) (tstamp 56EBF439)) + (segment (start 86.9188 125.1204) (end 86.9442 125.095) (width 0.25) (layer B.Cu) (net 68) (tstamp 56EBF438)) + (via (at 86.9188 125.1204) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 68)) + (segment (start 86.8814 125.083) (end 86.9188 125.1204) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF430)) + (segment (start 86.372 121.92) (end 86.372 122.5162) (width 0.25) (layer F.Cu) (net 68)) + (segment (start 86.233 124.8156) (end 86.233 125.083) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF357)) + (segment (start 86.4362 124.6124) (end 86.233 124.8156) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF356)) + (segment (start 86.614 124.6124) (end 86.4362 124.6124) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF355)) + (segment (start 87.0458 124.1806) (end 86.7918 124.4346) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF354)) + (segment (start 86.7918 124.4346) (end 86.614 124.6124) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF417)) + (segment (start 87.0458 123.19) (end 87.0458 124.1806) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF353)) + (segment (start 86.372 122.5162) (end 87.0458 123.19) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF352)) + (segment (start 84.709 125.083) (end 86.233 125.083) (width 0.25) (layer F.Cu) (net 68)) + (segment (start 84.824 119.634) (end 84.824 119.0378) (width 0.25) (layer F.Cu) (net 69)) + (segment (start 84.455 118.6688) (end 84.455 117.971) (width 0.25) (layer F.Cu) (net 69) (tstamp 56EBF32A)) + (segment (start 84.824 119.0378) (end 84.455 118.6688) (width 0.25) (layer F.Cu) (net 69) (tstamp 56EBF329)) + (segment (start 84.824 121.92) (end 84.824 123.468) (width 0.25) (layer F.Cu) (net 70)) + (segment (start 84.824 123.468) (end 84.709 123.583) (width 0.25) (layer F.Cu) (net 70) (tstamp 56EBF347)) + (segment (start 94.8466 110.8942) (end 94.5926 111.1482) (width 0.635) (layer F.Cu) (net 71) (tstamp 573189E8)) + (segment (start 94.8466 110.0836) (end 94.8466 110.8942) (width 0.635) (layer F.Cu) (net 71) (tstamp 573189E7)) + (segment (start 95.5832 109.347) (end 94.8466 110.0836) (width 0.635) (layer F.Cu) (net 71) (tstamp 573189E6)) + (via (at 95.5832 109.347) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 71)) + (segment (start 95.5832 108.839) (end 95.5832 109.347) (width 0.635) (layer B.Cu) (net 71) (tstamp 573189E4)) + (segment (start 96.4722 107.95) (end 95.5832 108.839) (width 0.635) (layer B.Cu) (net 71) (tstamp 573189E3)) + (segment (start 96.4722 103.8098) (end 96.4722 107.95) (width 0.635) (layer B.Cu) (net 71) (tstamp 573189E2)) + (segment (start 95.38 102.7176) (end 96.4722 103.8098) (width 0.635) (layer B.Cu) (net 71) (tstamp 573189E1)) + (via (at 95.38 102.7176) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 71)) + (segment (start 94.6158 101.9534) (end 95.38 102.7176) (width 0.635) (layer F.Cu) (net 71) (tstamp 573189DF)) + (segment (start 93.7036 101.9534) (end 94.6158 101.9534) (width 0.635) (layer F.Cu) (net 71)) + (segment (start 94.5926 111.196002) (end 94.5926 111.1482) (width 0.635) (layer F.Cu) (net 71) (tstamp 573189AC)) + (segment (start 114.04046 104.1103) (end 114.04046 105.12506) (width 0.635) (layer F.Cu) (net 72)) + (segment (start 115.4557 120.2309) (end 109.5135 120.2309) (width 0.635) (layer F.Cu) (net 72) (tstamp 57563C4C)) + (segment (start 115.7986 119.888) (end 115.4557 120.2309) (width 0.635) (layer F.Cu) (net 72) (tstamp 57563C4B)) + (segment (start 115.7986 106.8832) (end 115.7986 119.888) (width 0.635) (layer F.Cu) (net 72) (tstamp 57563C47)) + (segment (start 114.04046 105.12506) (end 115.7986 106.8832) (width 0.635) (layer F.Cu) (net 72) (tstamp 57563C44)) + (segment (start 109.5135 120.2309) (end 109.0944 120.65) (width 0.635) (layer F.Cu) (net 72) (tstamp 57563C4E)) + (segment (start 114.7051 104.1103) (end 114.04046 104.1103) (width 0.25) (layer F.Cu) (net 72) (tstamp 57318D6D)) + (segment (start 114.04046 104.1103) (end 112.34046 104.1103) (width 0.635) (layer B.Cu) (net 72)) + (segment (start 112.34046 104.1103) (end 111.34046 103.1103) (width 0.635) (layer B.Cu) (net 72) (tstamp 56F1E26A)) + (segment (start 114.04046 104.1103) (end 114.04046 97.1103) (width 0.635) (layer F.Cu) (net 72)) + (segment (start 111.34046 98.1103) (end 113.04046 98.1103) (width 0.635) (layer F.Cu) (net 72)) + (segment (start 113.04046 98.1103) (end 114.04046 97.1103) (width 0.635) (layer F.Cu) (net 72) (tstamp 56F1E265)) + (segment (start 111.34046 99.3103) (end 111.34046 98.1103) (width 0.4) (layer F.Cu) (net 72)) + +) diff --git a/PCB/Tinylab_proto1.kicad_pcb-bak b/PCB/Tinylab_proto1.kicad_pcb-bak new file mode 100644 index 00000000..a15523f7 --- /dev/null +++ b/PCB/Tinylab_proto1.kicad_pcb-bak @@ -0,0 +1,3370 @@ +(kicad_pcb (version 4) (host pcbnew 4.0.1-stable) + + (general + (links 147) + (no_connects 1) + (area 78.715399 94.476099 116.559801 126.148301) + (thickness 1.6) + (drawings 8) + (tracks 776) + (zones 0) + (modules 72) + (nets 73) + ) + + (page A4) + (layers + (0 F.Cu signal) + (31 B.Cu signal) + (32 B.Adhes user hide) + (33 F.Adhes user hide) + (34 B.Paste user hide) + (35 F.Paste user hide) + (36 B.SilkS user hide) + (37 F.SilkS user) + (38 B.Mask user hide) + (39 F.Mask user hide) + (40 Dwgs.User user hide) + (41 Cmts.User user hide) + (42 Eco1.User user hide) + (43 Eco2.User user hide) + (44 Edge.Cuts user) + (45 Margin user hide) + (46 B.CrtYd user hide) + (47 F.CrtYd user hide) + (48 B.Fab user hide) + (49 F.Fab user hide) + ) + + (setup + (last_trace_width 0.25) + (user_trace_width 0.4) + (user_trace_width 0.635) + (user_trace_width 1.27) + (trace_clearance 0.2) + (zone_clearance 0.508) + (zone_45_only no) + (trace_min 0.2) + (segment_width 0.2) + (edge_width 0.1) + (via_size 0.6) + (via_drill 0.4) + (via_min_size 0.4) + (via_min_drill 0.3) + (uvia_size 0.3) + (uvia_drill 0.1) + (uvias_allowed no) + (uvia_min_size 0.2) + (uvia_min_drill 0.1) + (pcb_text_width 0.3) + (pcb_text_size 0.8 0.8) + (mod_edge_width 0.15) + (mod_text_size 0.8 0.8) + (mod_text_width 0.15) + (pad_size 1.5 1.5) + (pad_drill 0.6) + (pad_to_mask_clearance 0) + (aux_axis_origin 0 0) + (visible_elements 7FFCFFFF) + (pcbplotparams + (layerselection 0x010c0_80000001) + (usegerberextensions false) + (excludeedgelayer true) + (linewidth 0.100000) + (plotframeref false) + (viasonmask false) + (mode 1) + (useauxorigin false) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15) + (hpglpenoverlay 2) + (psnegative false) + (psa4output false) + (plotreference true) + (plotvalue true) + (plotinvisibletext false) + (padsonsilk false) + (subtractmaskfromsilk false) + (outputformat 1) + (mirror false) + (drillshape 0) + (scaleselection 1) + (outputdirectory OUTPUT_V5/)) + ) + + (net 0 "") + (net 1 "Net-(C1-Pad1)") + (net 2 "Net-(C1-Pad2)") + (net 3 "Net-(C2-Pad1)") + (net 4 "Net-(C2-Pad2)") + (net 5 +5V) + (net 6 /VCC_3V3) + (net 7 /AVCC) + (net 8 /OPAMP_VCC) + (net 9 /VGND) + (net 10 "Net-(C13-Pad1)") + (net 11 "Net-(C13-Pad2)") + (net 12 "Net-(C14-Pad1)") + (net 13 "Net-(C14-Pad2)") + (net 14 /PSU_OUT) + (net 15 "Net-(D1-Pad2)") + (net 16 /PSU_FEEDBACK) + (net 17 /CH2) + (net 18 "Net-(IC1-Pad3)") + (net 19 /TO_B0) + (net 20 /TO_B1) + (net 21 /DAC_OUT) + (net 22 /DAC_OUT2) + (net 23 "Net-(IC1-Pad9)") + (net 24 "Net-(IC1-Pad10)") + (net 25 /XCK) + (net 26 /DIG_CH2) + (net 27 "Net-(IC1-Pad13)") + (net 28 "Net-(IC1-Pad16)") + (net 29 /DIG_CH1) + (net 30 "Net-(IC1-Pad20)") + (net 31 "Net-(IC1-Pad21)") + (net 32 "Net-(IC1-Pad22)") + (net 33 "Net-(IC1-Pad23)") + (net 34 /PSU_PWM) + (net 35 "Net-(IC1-Pad25)") + (net 36 /D-) + (net 37 /D+) + (net 38 "Net-(IC1-Pad28)") + (net 39 "Net-(IC1-Pad29)") + (net 40 "Net-(IC1-Pad32)") + (net 41 "Net-(IC1-Pad33)") + (net 42 "Net-(IC1-Pad34)") + (net 43 "Net-(IC1-Pad35)") + (net 44 "Net-(IC1-Pad36)") + (net 45 "Net-(IC1-Pad37)") + (net 46 "Net-(IC1-Pad41)") + (net 47 /CH1) + (net 48 "Net-(IC1-Pad43)") + (net 49 /AVCC_ON_2) + (net 50 "Net-(P2-Pad4)") + (net 51 "Net-(P3-Pad1)") + (net 52 "Net-(P3-Pad2)") + (net 53 "Net-(P3-Pad3)") + (net 54 "Net-(P3-Pad4)") + (net 55 "Net-(P8-Pad1)") + (net 56 "Net-(P8-Pad2)") + (net 57 "Net-(R1-Pad1)") + (net 58 "Net-(R2-Pad1)") + (net 59 "Net-(R11-Pad2)") + (net 60 "Net-(R12-Pad2)") + (net 61 "Net-(R13-Pad2)") + (net 62 "Net-(R10-Pad1)") + (net 63 "Net-(R15-Pad1)") + (net 64 "Net-(R15-Pad2)") + (net 65 "Net-(R17-Pad1)") + (net 66 "Net-(R17-Pad2)") + (net 67 "Net-(R19-Pad1)") + (net 68 "Net-(R20-Pad1)") + (net 69 "Net-(R22-Pad1)") + (net 70 "Net-(R23-Pad1)") + (net 71 "Net-(L3-Pad2)") + (net 72 /USBGND) + + (net_class Default "This is the default net class." + (clearance 0.2) + (trace_width 0.25) + (via_dia 0.6) + (via_drill 0.4) + (uvia_dia 0.3) + (uvia_drill 0.1) + (add_net +5V) + (add_net /AVCC) + (add_net /AVCC_ON_2) + (add_net /CH1) + (add_net /CH2) + (add_net /D+) + (add_net /D-) + (add_net /DAC_OUT) + (add_net /DAC_OUT2) + (add_net /DIG_CH1) + (add_net /DIG_CH2) + (add_net /OPAMP_VCC) + (add_net /PSU_FEEDBACK) + (add_net /PSU_OUT) + (add_net /PSU_PWM) + (add_net /TO_B0) + (add_net /TO_B1) + (add_net /USBGND) + (add_net /VCC_3V3) + (add_net /VGND) + (add_net /XCK) + (add_net "Net-(C1-Pad1)") + (add_net "Net-(C1-Pad2)") + (add_net "Net-(C13-Pad1)") + (add_net "Net-(C13-Pad2)") + (add_net "Net-(C14-Pad1)") + (add_net "Net-(C14-Pad2)") + (add_net "Net-(C2-Pad1)") + (add_net "Net-(C2-Pad2)") + (add_net "Net-(D1-Pad2)") + (add_net "Net-(IC1-Pad10)") + (add_net "Net-(IC1-Pad13)") + (add_net "Net-(IC1-Pad16)") + (add_net "Net-(IC1-Pad20)") + (add_net "Net-(IC1-Pad21)") + (add_net "Net-(IC1-Pad22)") + (add_net "Net-(IC1-Pad23)") + (add_net "Net-(IC1-Pad25)") + (add_net "Net-(IC1-Pad28)") + (add_net "Net-(IC1-Pad29)") + (add_net "Net-(IC1-Pad3)") + (add_net "Net-(IC1-Pad32)") + (add_net "Net-(IC1-Pad33)") + (add_net "Net-(IC1-Pad34)") + (add_net "Net-(IC1-Pad35)") + (add_net "Net-(IC1-Pad36)") + (add_net "Net-(IC1-Pad37)") + (add_net "Net-(IC1-Pad41)") + (add_net "Net-(IC1-Pad43)") + (add_net "Net-(IC1-Pad9)") + (add_net "Net-(L3-Pad2)") + (add_net "Net-(P2-Pad4)") + (add_net "Net-(P3-Pad1)") + (add_net "Net-(P3-Pad2)") + (add_net "Net-(P3-Pad3)") + (add_net "Net-(P3-Pad4)") + (add_net "Net-(P8-Pad1)") + (add_net "Net-(P8-Pad2)") + (add_net "Net-(R1-Pad1)") + (add_net "Net-(R10-Pad1)") + (add_net "Net-(R11-Pad2)") + (add_net "Net-(R12-Pad2)") + (add_net "Net-(R13-Pad2)") + (add_net "Net-(R15-Pad1)") + (add_net "Net-(R15-Pad2)") + (add_net "Net-(R17-Pad1)") + (add_net "Net-(R17-Pad2)") + (add_net "Net-(R19-Pad1)") + (add_net "Net-(R2-Pad1)") + (add_net "Net-(R20-Pad1)") + (add_net "Net-(R22-Pad1)") + (add_net "Net-(R23-Pad1)") + ) + + (module Pin_Headers:Pin_Header_Straight_2x02 (layer F.Cu) (tedit 56F331EE) (tstamp 56EB479A) + (at 113.795 124.3076 180) + (descr "Through hole pin header") + (tags "pin header") + (path /56069A87) + (fp_text reference P4 (at 0.03556 -0.00508 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value PDI (at 0 -3.1 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.75) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 4.3 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 -1.55) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 -1.27) (end 3.81 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27) (end 3.81 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 3.81) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 6 /VCC_3V3)) + (pad 2 thru_hole oval (at 2.54 0 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 42 "Net-(IC1-Pad34)")) + (pad 3 thru_hole oval (at 0 2.54 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 9 /VGND)) + (pad 4 thru_hole oval (at 2.54 2.54 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 43 "Net-(IC1-Pad35)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_2x02.wrl + (at (xyz 0.05 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 locked (layer F.Cu) (tedit 56F331C1) (tstamp 56EB47F4) + (at 103.378 119.38) + (descr "Through hole pin header") + (tags "pin header") + (path /56EA2D2D) + (fp_text reference P9 (at -0.0097 0.07112) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value SCOPE_IN_AC (at 0 -3.1) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 4 "Net-(C2-Pad2)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 2 "Net-(C1-Pad2)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm (layer F.Cu) (tedit 56F331B7) (tstamp 56EB472D) + (at 102.87 104.14 180) + (descr "LQFP44 (see Appnote_PCB_Guidelines_TRINAMIC_packages.pdf)") + (tags "QFP 0.8") + (path /55CA8F25) + (attr smd) + (fp_text reference IC1 (at -0.14524 0.0635 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value ATXMEGA16A4U-A (at 0 7.65 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -6.9 -6.9) (end -6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start 6.9 -6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 -6.9) (end 6.9 -6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.175 -5.175) (end -5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -5.175) (end -4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -4.505) (end -6.65 -4.505) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -5.85 -4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 16 /PSU_FEEDBACK)) + (pad 2 smd rect (at -5.85 -3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (pad 3 smd rect (at -5.85 -2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 18 "Net-(IC1-Pad3)")) + (pad 4 smd rect (at -5.85 -1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 19 /TO_B0)) + (pad 5 smd rect (at -5.85 -0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 20 /TO_B1)) + (pad 6 smd rect (at -5.85 0 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 21 /DAC_OUT)) + (pad 7 smd rect (at -5.85 0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 22 /DAC_OUT2)) + (pad 8 smd rect (at -5.85 1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 9 smd rect (at -5.85 2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 23 "Net-(IC1-Pad9)")) + (pad 10 smd rect (at -5.85 3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 24 "Net-(IC1-Pad10)")) + (pad 11 smd rect (at -5.85 4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 25 /XCK)) + (pad 12 smd rect (at -4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 26 /DIG_CH2)) + (pad 13 smd rect (at -3.2 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 27 "Net-(IC1-Pad13)")) + (pad 14 smd rect (at -2.4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 15 smd rect (at -1.6 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 25 /XCK)) + (pad 16 smd rect (at -0.8 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 28 "Net-(IC1-Pad16)")) + (pad 17 smd rect (at 0 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 29 /DIG_CH1)) + (pad 18 smd rect (at 0.8 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 19 smd rect (at 1.6 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /VCC_3V3)) + (pad 20 smd rect (at 2.4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 30 "Net-(IC1-Pad20)")) + (pad 21 smd rect (at 3.2 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 31 "Net-(IC1-Pad21)")) + (pad 22 smd rect (at 4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 32 "Net-(IC1-Pad22)")) + (pad 23 smd rect (at 5.85 4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 33 "Net-(IC1-Pad23)")) + (pad 24 smd rect (at 5.85 3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 34 /PSU_PWM)) + (pad 25 smd rect (at 5.85 2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 35 "Net-(IC1-Pad25)")) + (pad 26 smd rect (at 5.85 1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 36 /D-)) + (pad 27 smd rect (at 5.85 0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 37 /D+)) + (pad 28 smd rect (at 5.85 0 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 38 "Net-(IC1-Pad28)")) + (pad 29 smd rect (at 5.85 -0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 39 "Net-(IC1-Pad29)")) + (pad 30 smd rect (at 5.85 -1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 31 smd rect (at 5.85 -2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /VCC_3V3)) + (pad 32 smd rect (at 5.85 -3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 40 "Net-(IC1-Pad32)")) + (pad 33 smd rect (at 5.85 -4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 41 "Net-(IC1-Pad33)")) + (pad 34 smd rect (at 4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 42 "Net-(IC1-Pad34)")) + (pad 35 smd rect (at 3.2 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 43 "Net-(IC1-Pad35)")) + (pad 36 smd rect (at 2.4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 44 "Net-(IC1-Pad36)")) + (pad 37 smd rect (at 1.6 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 45 "Net-(IC1-Pad37)")) + (pad 38 smd rect (at 0.8 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 39 smd rect (at 0 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 40 smd rect (at -0.8 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (pad 41 smd rect (at -1.6 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 46 "Net-(IC1-Pad41)")) + (pad 42 smd rect (at -2.4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 47 /CH1)) + (pad 43 smd rect (at -3.2 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 48 "Net-(IC1-Pad43)")) + (pad 44 smd rect (at -4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 49 /AVCC_ON_2)) + (model Housings_QFP.3dshapes/LQFP-44_10x10mm_Pitch0.8mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:c_elec_5x5.3 (layer F.Cu) (tedit 55725CA0) (tstamp 56EB4BFB) + (at 112.4488 112.4966 270) + (descr "SMT capacitor, aluminium electrolytic, 5x5.3") + (path /566F5A75) + (attr smd) + (fp_text reference C6 (at -0.02286 -0.12954 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value CP1 (at 0 3.81 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -3.95 -3) (end 3.95 -3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.95 -3) (end 3.95 3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.95 3) (end -3.95 3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.95 3) (end -3.95 -3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.286 -0.635) (end -2.286 0.762) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.159 -0.889) (end -2.159 0.889) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.032 -1.27) (end -2.032 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.905 1.397) (end -1.905 -1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 -1.524) (end -1.778 1.524) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.651 1.651) (end -1.651 -1.651) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.524 -1.778) (end -1.524 1.778) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.667 -2.667) (end 1.905 -2.667) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.905 -2.667) (end 2.667 -1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.667 -1.905) (end 2.667 1.905) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.667 1.905) (end 1.905 2.667) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.905 2.667) (end -2.667 2.667) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.667 2.667) (end -2.667 -2.667) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.159 0) (end 1.397 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.778 -0.381) (end 1.778 0.381) (layer F.SilkS) (width 0.15)) + (fp_circle (center 0 0) (end -2.413 0) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at 2.19964 0 270) (size 2.99974 1.6002) (layers F.Cu F.Paste F.Mask) + (net 6 /VCC_3V3)) + (pad 2 smd rect (at -2.19964 0 270) (size 2.99974 1.6002) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/c_elec_5x5.3.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 54EA090C) (tstamp 56EB47E3) + (at 113.7061 118.2243 270) + (descr "Through hole pin header") + (tags "pin header") + (path /55D6DB77) + (fp_text reference P8 (at 0.06096 -0.14478 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value DIG_IN (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 55 "Net-(P8-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 56 "Net-(P8-Pad2)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56EB45CF) + (at 101.5238 124.4346 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CAB611) + (attr smd) + (fp_text reference C1 (at -0.05126 0.12192 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 2 "Net-(C1-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56EB45DB) + (at 101.8032 116.7892 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CAB4DE) + (attr smd) + (fp_text reference C2 (at -0.03348 -0.1651 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 4 "Net-(C2-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56EB45E7) + (at 114.303 108.6866 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB13E1) + (attr smd) + (fp_text reference C3 (at -0.0508 0.04826 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56EB45F3) + (at 108.7882 110.3122 180) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB147C) + (attr smd) + (fp_text reference C4 (at -0.01016 0.04318 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /VCC_3V3)) + (pad 2 smd rect (at 0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 56F331BD) (tstamp 56EB45FF) + (at 104.521 113.6015 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55D60181) + (attr smd) + (fp_text reference C5 (at 0.01778 0.08682 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 56F331F5) (tstamp 56EB4633) + (at 94.488 115.316 180) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /56E8E263) + (attr smd) + (fp_text reference C7 (at 0.03002 -0.0889 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 8 /OPAMP_VCC)) + (pad 2 smd rect (at 0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 56F335FD) (tstamp 56EB463F) + (at 101.854 111.76 180) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /56AF91A3) + (attr smd) + (fp_text reference C8 (at 0.01224 -0.05334 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56EB4673) + (at 86.36 99.695 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /56071A50) + (attr smd) + (fp_text reference C10 (at 0.1143 -0.003 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56EB467F) + (at 95.0595 106.807 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /5608B4BE) + (attr smd) + (fp_text reference C11 (at 0.11176 -0.01478 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /VCC_3V3)) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56EB468B) + (at 82.423 117.348 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB630B) + (attr smd) + (fp_text reference C13 (at -0.05334 0.0538 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 10 "Net-(C13-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 11 "Net-(C13-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 56EB4697) + (at 82.55 124.206 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /566DF655) + (attr smd) + (fp_text reference C14 (at 0.02286 0.02078 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 12 "Net-(C14-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 13 "Net-(C14-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5 (layer F.Cu) (tedit 56F33237) (tstamp 56EB46C4) + (at 90.17 111.76 180) + (descr "Radial Electrolytic Capacitor, Diameter 6.3mm x Length 11.2mm, Pitch 2.5mm") + (tags "Electrolytic Capacitor") + (path /560735FE) + (fp_text reference C15 (at -0.22652 -0.47498 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.25 4.4 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 1.325 -3.149) (end 1.325 3.149) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.465 -3.143) (end 1.465 3.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 -3.13) (end 1.605 -0.446) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 0.446) (end 1.605 3.13) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 -3.111) (end 1.745 -0.656) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 0.656) (end 1.745 3.111) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 -3.085) (end 1.885 -0.789) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 0.789) (end 1.885 3.085) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 -3.053) (end 2.025 -0.88) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 0.88) (end 2.025 3.053) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 -3.014) (end 2.165 -0.942) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 0.942) (end 2.165 3.014) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 -2.968) (end 2.305 -0.981) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 0.981) (end 2.305 2.968) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 -2.915) (end 2.445 -0.998) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 0.998) (end 2.445 2.915) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 -2.853) (end 2.585 -0.996) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 0.996) (end 2.585 2.853) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 -2.783) (end 2.725 -0.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 0.974) (end 2.725 2.783) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 -2.704) (end 2.865 -0.931) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 0.931) (end 2.865 2.704) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 -2.616) (end 3.005 -0.863) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 0.863) (end 3.005 2.616) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 -2.516) (end 3.145 -0.764) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 0.764) (end 3.145 2.516) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 -2.404) (end 3.285 -0.619) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 0.619) (end 3.285 2.404) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 -2.279) (end 3.425 -0.38) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 0.38) (end 3.425 2.279) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.565 -2.136) (end 3.565 2.136) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.705 -1.974) (end 3.705 1.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.845 -1.786) (end 3.845 1.786) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.985 -1.563) (end 3.985 1.563) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.125 -1.287) (end 4.125 1.287) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.265 -0.912) (end 4.265 0.912) (layer F.SilkS) (width 0.15)) + (fp_circle (center 2.5 0) (end 2.5 -1) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.1875) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.4) (layer F.CrtYd) (width 0.05)) + (pad 2 thru_hole circle (at 2.5 0 180) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 9 /VGND)) + (pad 1 thru_hole rect (at 0 0 180) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 14 /PSU_OUT)) + (model Capacitors_ThroughHole.3dshapes/C_Radial_D6.3_L11.2_P2.5.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 56F331F9) (tstamp 56EB46D0) + (at 92.456 114.554 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /5607355F) + (attr smd) + (fp_text reference C16 (at 0.08128 0.0097 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 14 /PSU_OUT)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10 (layer F.Cu) (tedit 552FFCCE) (tstamp 56EB46E4) + (at 93.345 106.68 90) + (descr "Diode, DO-41, SOD81, Horizontal, RM 10mm,") + (tags "Diode, DO-41, SOD81, Horizontal, RM 10mm, 1N4007, SB140,") + (path /5606FDB4) + (fp_text reference D1 (at 1.0541 -0.01224 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value D_Schottky (at 4.37134 -3.55854 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 7.62 -0.00254) (end 8.636 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -0.00254) (end 1.524 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.048 -1.27254) (end 3.048 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.302 -1.27254) (end 3.302 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.556 -1.27254) (end 3.556 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -1.27254) (end 2.794 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.175 -1.27254) (end 3.175 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 1.26746) (end 2.54 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 7.62 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 -1.27254) (end 7.62 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 1.26746) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at 10.16 -0.00254 270) (size 1.99898 1.99898) (drill 1.27) (layers *.Cu *.Mask F.SilkS) + (net 15 "Net-(D1-Pad2)")) + (pad 1 thru_hole rect (at 0 -0.00254 270) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.Mask F.SilkS) + (net 14 /PSU_OUT)) + ) + + (module Inductors:INDUCTOR_V (layer F.Cu) (tedit 0) (tstamp 56EB4734) + (at 82.7532 98.5139 270) + (descr "Inductor (vertical)") + (tags INDUCTOR) + (path /5606EE9E) + (fp_text reference L1 (at -0.16764 0.04572 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value INDUCTOR (at 0.09906 -1.99898 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_circle (center 0 0) (end 3.81 0) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at -2.54 0 270) (size 1.905 1.905) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) + (net 15 "Net-(D1-Pad2)")) + (pad 2 thru_hole circle (at 2.54 0 270) (size 1.905 1.905) (drill 0.8128) (layers *.Cu *.Mask F.SilkS) + (net 5 +5V)) + (model Inductors.3dshapes/INDUCTOR_V.wrl + (at (xyz 0 0 0)) + (scale (xyz 2 2 2)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1210 (layer F.Cu) (tedit 56F331AB) (tstamp 56EB4740) + (at 98.171 112.649) + (descr "Resistor SMD 1210, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 1210") + (path /56E88440) + (attr smd) + (fp_text reference L2 (at 0.02078 0.00508 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value INDUCTOR (at 0 2.7) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -2.2 -1.6) (end 2.2 -1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.2 1.6) (end 2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.2 -1.6) (end -2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.2 -1.6) (end 2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.475) (end -1 1.475) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.475) (end 1 -1.475) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.45 0) (size 0.9 2.5) (layers F.Cu F.Paste F.Mask) + (net 6 /VCC_3V3)) + (pad 2 smd rect (at 1.45 0) (size 0.9 2.5) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (model Resistors_SMD.3dshapes/R_1210.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1210 (layer F.Cu) (tedit 56F3323A) (tstamp 56EB474C) + (at 94.5926 112.5982 90) + (descr "Resistor SMD 1210, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 1210") + (path /56E8DA35) + (attr smd) + (fp_text reference L3 (at 0.0254 -0.01986 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value INDUCTOR (at 0 2.7 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -2.2 -1.6) (end 2.2 -1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.2 1.6) (end 2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.2 -1.6) (end -2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.2 -1.6) (end 2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.475) (end -1 1.475) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.475) (end 1 -1.475) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.45 0 90) (size 0.9 2.5) (layers F.Cu F.Paste F.Mask) + (net 8 /OPAMP_VCC)) + (pad 2 smd rect (at 1.45 0 90) (size 0.9 2.5) (layers F.Cu F.Paste F.Mask) + (net 71 "Net-(L3-Pad2)")) + (model Resistors_SMD.3dshapes/R_1210.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 locked (layer F.Cu) (tedit 54EA090C) (tstamp 56EB475D) + (at 105.918 124.46 270) + (descr "Through hole pin header") + (tags "pin header") + (path /56EA2C80) + (fp_text reference P1 (at -0.00254 -0.01824 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value SCOPE_IN_CH1 (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 1 "Net-(C1-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 1 "Net-(C1-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 (layer F.Cu) (tedit 0) (tstamp 56EB4786) + (at 80.4448 113.157 180) + (descr "Through hole pin header") + (tags "pin header") + (path /55CBF4D5) + (fp_text reference P3 (at -0.03302 -0.08128 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value DIG_OUT (at 0 -3.1 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 51 "Net-(P3-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 52 "Net-(P3-Pad2)")) + (pad 3 thru_hole oval (at 0 5.08 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 53 "Net-(P3-Pad3)")) + (pad 4 thru_hole oval (at 0 7.62 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 54 "Net-(P3-Pad4)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 locked (layer F.Cu) (tedit 54EA090C) (tstamp 56EB47AB) + (at 105.918 116.84 270) + (descr "Through hole pin header") + (tags "pin header") + (path /56EA3310) + (fp_text reference P5 (at 0.06096 -0.1427 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value SCOPE_IN_CH2 (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 3 "Net-(C2-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 3 "Net-(C2-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 (layer F.Cu) (tedit 0) (tstamp 56EB47BE) + (at 80.4448 115.697) + (descr "Through hole pin header") + (tags "pin header") + (path /566DF832) + (fp_text reference P6 (at 0.07112 0.04826) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value DAC_OUT (at 0 -3.1) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 11 "Net-(C13-Pad2)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 10 "Net-(C13-Pad1)")) + (pad 3 thru_hole oval (at 0 5.08) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 13 "Net-(C14-Pad2)")) + (pad 4 thru_hole oval (at 0 7.62) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 12 "Net-(C14-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module SMD:SOT-23-3 (layer F.Cu) (tedit 5508E933) (tstamp 56EB4800) + (at 96.139 97.536 180) + (path /5606F6D4) + (fp_text reference Q1 (at -0.0411 -0.02032 360) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value Q_NMOS_GSD (at -2.2 0 270) (layer F.Fab) hide + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_circle (center 1 -0.4) (end 1.1 -0.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 -0.8) (end -1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 0.8) (end 1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 0.8) (end 1.5 -0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 -0.8) (end -1.5 -0.8) (layer F.SilkS) (width 0.15)) + (pad 3 smd rect (at 0 1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 15 "Net-(D1-Pad2)")) + (pad 2 smd rect (at -0.95 -1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 1 smd rect (at 0.95 -1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 34 /PSU_PWM)) + (model 3D/SMD/SOT-23-3.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB480C) + (at 99.06 121.92 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAB95) + (attr smd) + (fp_text reference R1 (at 0.04572 0.08428 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 57 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F331DA) (tstamp 56EB4818) + (at 99.06 119.3165 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAD4C) + (attr smd) + (fp_text reference R2 (at -0.03302 -0.07666 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R2-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F331E1) (tstamp 56EB4824) + (at 100.6475 121.92 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAABF4) + (attr smd) + (fp_text reference R3 (at 0.12954 0.08174 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 57 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 49 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F331DB) (tstamp 56EB4830) + (at 100.6475 119.3165 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAD11) + (attr smd) + (fp_text reference R4 (at 0.1397 0.05888 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 49 /AVCC_ON_2)) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R2-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB483C) + (at 106.426 114.3) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAC5F) + (attr smd) + (fp_text reference R5 (at -0.0605 -0.00762) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 49 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB4848) + (at 106.426 112.903) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAACD2) + (attr smd) + (fp_text reference R6 (at 0.0538 0.01524) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 49 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB4854) + (at 82.55 106.68 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBCDA5) + (attr smd) + (fp_text reference R7 (at -0.12192 -0.02586 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R11-Pad2)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 54 "Net-(P3-Pad4)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB4860) + (at 82.55 109.22 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE401) + (attr smd) + (fp_text reference R8 (at 0.00508 -0.07158 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R12-Pad2)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 53 "Net-(P3-Pad3)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB486C) + (at 82.55 111.76 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE16B) + (attr smd) + (fp_text reference R9 (at 0.00508 -0.02332 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R13-Pad2)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 52 "Net-(P3-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB4878) + (at 82.55 114.3 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE2C7) + (attr smd) + (fp_text reference R10 (at 0.01016 -0.06904 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R10-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 51 "Net-(P3-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB4884) + (at 84.328 106.68 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBCD2A) + (attr smd) + (fp_text reference R11 (at 0.17018 0.04618 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 38 "Net-(IC1-Pad28)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R11-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB4890) + (at 84.328 109.22 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE362) + (attr smd) + (fp_text reference R12 (at 0.06604 0.04618 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 39 "Net-(IC1-Pad29)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R12-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB489C) + (at 84.328 111.76 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE0F4) + (attr smd) + (fp_text reference R13 (at 0.01778 0.00046 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 40 "Net-(IC1-Pad32)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R13-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB48A8) + (at 84.328 114.3 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE21C) + (attr smd) + (fp_text reference R14 (at -0.1651 0.02586 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 41 "Net-(IC1-Pad33)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R10-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F33220) (tstamp 56EB48B4) + (at 89.3953 124.3203 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56B0C779) + (attr smd) + (fp_text reference R15 (at -0.00762 -0.04364 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R15-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R15-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F3321C) (tstamp 56EB48C0) + (at 87.8713 124.3203 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56B0C86E) + (attr smd) + (fp_text reference R16 (at -0.00762 -0.03856 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R15-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R15-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F33257) (tstamp 56EB48CC) + (at 89.281 117.221 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56AFE83E) + (attr smd) + (fp_text reference R17 (at -0.01778 0.0284 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R17-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R17-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F3325E) (tstamp 56EB48D8) + (at 87.63 117.221 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56AFE8F3) + (attr smd) + (fp_text reference R18 (at -0.05842 0.03856 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R17-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R17-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F33244) (tstamp 56EB48E4) + (at 87.122 119.634) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56AECD86) + (attr smd) + (fp_text reference R19 (at 0.11984 -0.01524) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R19-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R17-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F3322A) (tstamp 56EB48F0) + (at 87.122 121.92) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56B0C682) + (attr smd) + (fp_text reference R20 (at 0.00808 0.06096) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R20-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R15-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F331E9) (tstamp 56EB48FC) + (at 99.568 124.079) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56E9851A) + (attr smd) + (fp_text reference R21 (at 0.003 0.03556) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 47 /CH1)) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F33231) (tstamp 56EB4908) + (at 84.455 117.221 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CB4680) + (attr smd) + (fp_text reference R22 (at 0.00508 0.03856 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 69 "Net-(R22-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R19-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F33215) (tstamp 56EB4914) + (at 84.709 124.333 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566DE721) + (attr smd) + (fp_text reference R23 (at 0.04064 -0.0411 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 70 "Net-(R23-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R20-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F3324C) (tstamp 56EB4920) + (at 84.074 119.634) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CB9020) + (attr smd) + (fp_text reference R24 (at 0.07666 0.04064) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 11 "Net-(C13-Pad2)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 69 "Net-(R22-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F3322D) (tstamp 56EB492C) + (at 84.074 121.92) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566DE7E8) + (attr smd) + (fp_text reference R25 (at 0.05126 0.02794) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 13 "Net-(C14-Pad2)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 70 "Net-(R23-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB4938) + (at 84.582 102.9462 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566E5C29) + (attr smd) + (fp_text reference R26 (at -0.0284 -0.02794 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 14 /PSU_OUT)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 16 /PSU_FEEDBACK)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 56EB4944) + (at 84.582 104.5464) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566E5CBE) + (attr smd) + (fp_text reference R27 (at -0.02748 0.03048) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 16 /PSU_FEEDBACK)) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F331D7) (tstamp 56EB4950) + (at 99.568 116.84 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56E985EF) + (attr smd) + (fp_text reference R28 (at -0.05634 -0.0508 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F3325B) (tstamp 56EB495C) + (at 85.979 117.221 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56E9888A) + (attr smd) + (fp_text reference R29 (at 0.03302 -0.0538 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R19-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 56F33218) (tstamp 56EB4968) + (at 86.233 124.333 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56E98921) + (attr smd) + (fp_text reference R30 (at 0.06096 -0.05634 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R20-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module SMD:SOT-23-3 (layer F.Cu) (tedit 5508E933) (tstamp 56EB4974) + (at 112.0648 106.807 90) + (path /55CA99FA) + (fp_text reference U1 (at -0.07112 0.03856 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value 78L05 (at -2.2 0 180) (layer F.Fab) hide + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_circle (center 1 -0.4) (end 1.1 -0.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 -0.8) (end -1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 0.8) (end 1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 0.8) (end 1.5 -0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 -0.8) (end -1.5 -0.8) (layer F.SilkS) (width 0.15)) + (pad 3 smd rect (at 0 1.4 90) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -0.95 -1.4 90) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 6 /VCC_3V3)) + (pad 1 smd rect (at 0.95 -1.4 90) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model 3D/SMD/SOT-23-3.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm (layer F.Cu) (tedit 56F33225) (tstamp 56EB4991) + (at 94.5134 120.6754 180) + (descr "14-Lead Plastic Small Outline (SL) - Narrow, 3.90 mm Body [SOIC] (see Microchip Packaging Specification 00000049BS.pdf)") + (tags "SOIC 1.27") + (path /55CA87E2) + (attr smd) + (fp_text reference U2 (at 0.01986 0 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value LM324 (at 0 5.375 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -3.7 -4.65) (end -3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.7 -4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 -4.65) (end 3.7 -4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.075 -4.45) (end -2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 -4.45) (end 2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 4.45) (end 2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end -2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.45) (end 2.075 -4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end 2.075 4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.335) (end -3.45 -4.335) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2.7 -3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 47 /CH1)) + (pad 2 smd rect (at -2.7 -2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 47 /CH1)) + (pad 3 smd rect (at -2.7 -1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 57 "Net-(R1-Pad1)")) + (pad 4 smd rect (at -2.7 0 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 8 /OPAMP_VCC)) + (pad 5 smd rect (at -2.7 1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R2-Pad1)")) + (pad 6 smd rect (at -2.7 2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (pad 7 smd rect (at -2.7 3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (pad 8 smd rect (at 2.7 3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R19-Pad1)")) + (pad 9 smd rect (at 2.7 2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R17-Pad1)")) + (pad 10 smd rect (at 2.7 1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 21 /DAC_OUT)) + (pad 11 smd rect (at 2.7 0 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 12 smd rect (at 2.7 -1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 22 /DAC_OUT2)) + (pad 13 smd rect (at 2.7 -2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R15-Pad1)")) + (pad 14 smd rect (at 2.7 -3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R20-Pad1)")) + (model Housings_SOIC.3dshapes/SOIC-14_3.9x8.7mm_Pitch1.27mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module TO_SOT_Packages_SMD:SOT-363 (layer F.Cu) (tedit 56735562) (tstamp 56EB499F) + (at 89.5604 120.7262 270) + (descr SOT353) + (path /56B012DD) + (attr smd) + (fp_text reference U3 (at 0.09906 0 360) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value DMN63D8LDW (at 0.09906 0 360) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 0.635 1.016) (end 0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 -1.016) (end -0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 -1.016) (end -0.635 1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 1.016) (end 0.635 1.016) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.016 -0.635 270) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 3 smd rect (at -1.016 0.635 270) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R17-Pad2)")) + (pad 6 smd rect (at 1.016 -0.635 270) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R15-Pad2)")) + (pad 2 smd rect (at -1.016 0 270) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 19 /TO_B0)) + (pad 4 smd rect (at 1.016 0.635 270) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 5 smd rect (at 1.016 0 270) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 20 /TO_B1)) + (model TO_SOT_Packages_SMD.3dshapes/SOT-353.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.07000000000000001 0.09 0.08)) + (rotate (xyz 0 0 90)) + ) + ) + + (module TO_SOT_Packages_SMD:SOT-363 (layer F.Cu) (tedit 56735562) (tstamp 56EB49AD) + (at 108.7755 97.4725 90) + (descr SOT353) + (path /55D6ACFD) + (attr smd) + (fp_text reference U4 (at -0.03556 -0.01478 180) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value DMN63D8LDW (at 0.09906 0 180) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 0.635 1.016) (end 0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 -1.016) (end -0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 -1.016) (end -0.635 1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 1.016) (end 0.635 1.016) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.016 -0.635 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 3 smd rect (at -1.016 0.635 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 26 /DIG_CH2)) + (pad 6 smd rect (at 1.016 -0.635 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 29 /DIG_CH1)) + (pad 2 smd rect (at -1.016 0 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 56 "Net-(P8-Pad2)")) + (pad 4 smd rect (at 1.016 0.635 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 5 smd rect (at 1.016 0 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 55 "Net-(P8-Pad1)")) + (model TO_SOT_Packages_SMD.3dshapes/SOT-353.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.07000000000000001 0.09 0.08)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Capacitors_SMD:c_elec_4x5.3 (layer F.Cu) (tedit 556FDE77) (tstamp 56EB4C01) + (at 89.535 99.06 90) + (descr "SMT capacitor, aluminium electrolytic, 4x5.3") + (path /560719D9) + (attr smd) + (fp_text reference C9 (at -0.00508 0.0665 90) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value CP1 (at 0 3.175 90) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start -3.35 -2.65) (end 3.35 -2.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.35 -2.65) (end 3.35 2.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.35 2.65) (end -3.35 2.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.35 2.65) (end -3.35 -2.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.651 0) (end 0.889 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 -0.381) (end 1.27 0.381) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 2.286) (end -2.286 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.286 -1.524) (end 2.286 1.524) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 2.286) (end 2.286 1.524) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 -2.286) (end -2.286 -2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 -2.286) (end 2.286 -1.524) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.032 0.127) (end -2.032 -0.127) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.905 -0.635) (end -1.905 0.635) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.778 0.889) (end -1.778 -0.889) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.651 1.143) (end -1.651 -1.143) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.524 -1.27) (end -1.524 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.397 1.397) (end -1.397 -1.397) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 -1.524) (end -1.27 1.524) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.143 -1.651) (end -1.143 1.651) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.286 -2.286) (end -2.286 2.286) (layer F.SilkS) (width 0.15)) + (fp_circle (center 0 0) (end -2.032 0) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at 1.80086 0 90) (size 2.60096 1.6002) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -1.80086 0 90) (size 2.60096 1.6002) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/c_elec_4x5.3.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 54EA090C) (tstamp 56F32A3D) + (at 90.6048 106.807 270) + (descr "Through hole pin header") + (tags "pin header") + (path /56F2A93D) + (fp_text reference P7 (at -0.01524 -0.15748 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value CONN_01X02 (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 14 /PSU_OUT)) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 9 /VGND)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 54EA090C) (tstamp 56F32A4E) + (at 90.6048 104.267 270) + (descr "Through hole pin header") + (tags "pin header") + (path /56F2A840) + (fp_text reference P10 (at -0.1524 -0.18288 270) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_text value CONN_01X02 (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 0.8 0.8) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 9 /VGND)) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 9 /VGND)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Resistors_SMD:R_1210 (layer F.Cu) (tedit 5415D182) (tstamp 5731894C) + (at 93.7036 103.4034 270) + (descr "Resistor SMD 1210, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 1210") + (path /573254B0) + (attr smd) + (fp_text reference L4 (at 0 -2.7 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value INDUCTOR (at 0 2.7 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.2 -1.6) (end 2.2 -1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.2 1.6) (end 2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.2 -1.6) (end -2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.2 -1.6) (end 2.2 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.475) (end -1 1.475) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.475) (end 1 -1.475) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.45 0 270) (size 0.9 2.5) (layers F.Cu F.Paste F.Mask) + (net 71 "Net-(L3-Pad2)")) + (pad 2 smd rect (at 1.45 0 270) (size 0.9 2.5) (layers F.Cu F.Paste F.Mask) + (net 14 /PSU_OUT)) + (model Resistors_SMD.3dshapes/R_1210.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 54EA090C) (tstamp 57319373) + (at 99.3394 95.9358 90) + (descr "Through hole pin header") + (tags "pin header") + (fp_text reference REF** (at 0 -5.1 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Pin_Header_Straight_1x02 (at 0 -3.1 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 90) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (pad 2 thru_hole oval (at 0 2.54 90) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 575636C7) + (at 108.4961 116.0399) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /575646EC) + (attr smd) + (fp_text reference C12 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 575636CD) + (at 108.4961 117.1956) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /57564635) + (attr smd) + (fp_text reference C17 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 575636D3) + (at 108.5088 118.3513) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /57564580) + (attr smd) + (fp_text reference C18 (at 0 -1.9) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 575636D9) + (at 109.0549 123.571 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /575644CB) + (attr smd) + (fp_text reference C19 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_1210 (layer F.Cu) (tedit 5415D85D) (tstamp 575636DA) + (at 107.5944 120.65) + (descr "Capacitor SMD 1210, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 1210") + (path /55D739F3) + (attr smd) + (fp_text reference F1 (at 0 -2.7) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value F_Small (at 0 2.7) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.3 -1.6) (end 2.3 -1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.3 1.6) (end 2.3 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.3 -1.6) (end -2.3 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.3 -1.6) (end 2.3 1.6) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 -1.475) (end -1 -1.475) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 1.475) (end 1 1.475) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.5 0) (size 1 2.5) (layers F.Cu F.Paste F.Mask) + (net 9 /VGND)) + (pad 2 smd rect (at 1.5 0) (size 1 2.5) (layers F.Cu F.Paste F.Mask) + (net 72 /USBGND)) + (model Capacitors_SMD.3dshapes/C_1210.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Connect:USB_Micro-B_WIDE (layer F.Cu) (tedit 56F1EFCA) (tstamp 575636DF) + (at 112.903 100.6094 90) + (descr "Micro USB Type B Receptacle") + (tags "USB USB_B USB_micro USB_OTG") + (path /55CA90D2) + (attr smd) + (fp_text reference P2 (at 0 -3.45 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value USB_OTG (at 0 4.8 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.6 -2.8) (end 4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 -2.8) (end 4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 4.05) (end -4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.6 4.05) (end -4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3509 3.81746) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 -2.58754) (end 4.3491 -2.58754) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 -2.58754) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 2.58746) (end -4.3509 2.58746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 3.81746) (end -4.3509 -2.58754) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.3009 -1.56254 180) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -0.6509 -1.56254 180) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 36 /D-)) + (pad 3 smd rect (at -0.0009 -1.56254 180) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 37 /D+)) + (pad 4 smd rect (at 0.6491 -1.56254 180) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 50 "Net-(P2-Pad4)")) + (pad 5 smd rect (at 1.2991 -1.56254 180) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 72 /USBGND)) + (pad 6 thru_hole oval (at -2.5009 -1.56254 180) (size 0.95 1.4) (drill oval 0.55 1) (layers *.Cu *.Mask F.SilkS) + (net 72 /USBGND)) + (pad 6 thru_hole oval (at 2.4991 -1.56254 180) (size 0.95 1.4) (drill oval 0.55 1) (layers *.Cu *.Mask F.SilkS) + (net 72 /USBGND)) + (pad 6 thru_hole oval (at -3.5009 1.13746 180) (size 1.55 1.2) (drill oval 1.15 0.7) (layers *.Cu *.Mask F.SilkS) + (net 72 /USBGND)) + (pad 6 thru_hole oval (at 3.4991 1.13746 180) (size 1.55 1.2) (drill oval 1.15 0.7) (layers *.Cu *.Mask F.SilkS) + (net 72 /USBGND)) + ) + + (gr_text "EspoTek Labrador v7a" (at 109.8296 95.1992) (layer F.SilkS) + (effects (font (size 0.8 0.8) (thickness 0.2))) + ) + (gr_line (start 78.7908 126.0983) (end 78.7908 125.9078) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 116.5098 126.0983) (end 78.7908 126.0983) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 116.5098 94.5261) (end 116.5098 126.0983) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 78.7654 94.5261) (end 116.5098 94.5261) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 78.7908 94.6912) (end 78.7908 94.5388) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 78.7908 95.1992) (end 78.7908 94.615) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 78.78618 126.09068) (end 78.78618 95.20174) (angle 90) (layer Edge.Cuts) (width 0.1)) + + (segment (start 101.5238 123.6846) (end 101.842 123.6846) (width 0.4) (layer F.Cu) (net 1)) + (segment (start 101.842 123.6846) (end 102.2223 123.3043) (width 0.4) (layer F.Cu) (net 1) (tstamp 57563749)) + (segment (start 99.06 121.17) (end 99.06 121.412) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 99.06 121.412) (end 99.568 121.92) (width 0.25) (layer F.Cu) (net 1) (tstamp 56EB5D83)) + (segment (start 99.568 121.92) (end 101.473 121.92) (width 0.25) (layer F.Cu) (net 1) (tstamp 56EB5D84)) + (segment (start 101.473 121.92) (end 101.854 122.301) (width 0.25) (layer F.Cu) (net 1) (tstamp 56EB5D85)) + (segment (start 101.854 122.301) (end 101.854 122.936) (width 0.25) (layer F.Cu) (net 1) (tstamp 56EB5D86)) + (segment (start 101.854 122.936) (end 102.2223 123.3043) (width 0.25) (layer F.Cu) (net 1) (tstamp 56EB5D87)) + (segment (start 102.2223 123.3043) (end 103.378 124.46) (width 0.25) (layer F.Cu) (net 1) (tstamp 5756374C)) + (segment (start 105.918 124.46) (end 103.378 124.46) (width 0.635) (layer F.Cu) (net 1)) + (segment (start 101.5238 125.1846) (end 101.842 125.1846) (width 0.25) (layer F.Cu) (net 2)) + (segment (start 101.842 125.1846) (end 102.489 125.8316) (width 0.25) (layer F.Cu) (net 2) (tstamp 57563753)) + (segment (start 102.489 125.8316) (end 107.1372 125.8316) (width 0.25) (layer F.Cu) (net 2) (tstamp 57563754)) + (segment (start 107.1372 125.8316) (end 107.5182 125.4506) (width 0.25) (layer F.Cu) (net 2) (tstamp 57563755)) + (segment (start 107.5182 125.4506) (end 107.5182 123.2662) (width 0.25) (layer F.Cu) (net 2) (tstamp 57563756)) + (segment (start 107.5182 123.2662) (end 107.1118 122.8598) (width 0.25) (layer F.Cu) (net 2) (tstamp 57563757)) + (segment (start 107.1118 122.8598) (end 104.3178 122.8598) (width 0.25) (layer F.Cu) (net 2) (tstamp 57563758)) + (segment (start 104.3178 122.8598) (end 103.378 121.92) (width 0.25) (layer F.Cu) (net 2) (tstamp 57563759)) + (segment (start 99.06 120.0665) (end 99.1355 120.0665) (width 0.25) (layer F.Cu) (net 3)) + (segment (start 99.1355 120.0665) (end 99.822 119.38) (width 0.25) (layer F.Cu) (net 3) (tstamp 56EB5D8A)) + (segment (start 99.822 119.38) (end 101.346 119.38) (width 0.25) (layer F.Cu) (net 3) (tstamp 56EB5D8B)) + (segment (start 101.346 119.38) (end 101.981 118.745) (width 0.25) (layer F.Cu) (net 3) (tstamp 56EB5D8C)) + (segment (start 101.981 118.745) (end 101.981 117.221) (width 0.25) (layer F.Cu) (net 3) (tstamp 56EB5D8D)) + (segment (start 101.981 117.221) (end 102.362 116.84) (width 0.25) (layer F.Cu) (net 3) (tstamp 56EB5D8E)) + (segment (start 102.362 116.84) (end 103.378 116.84) (width 0.25) (layer F.Cu) (net 3) (tstamp 56EB5D8F)) + (segment (start 105.918 116.84) (end 103.378 116.84) (width 0.635) (layer F.Cu) (net 3)) + (segment (start 101.8032 116.0392) (end 101.3834 116.0392) (width 0.25) (layer F.Cu) (net 4)) + (segment (start 101.854 120.904) (end 103.378 119.38) (width 0.25) (layer B.Cu) (net 4) (tstamp 57563737)) + (segment (start 101.219 120.904) (end 101.854 120.904) (width 0.25) (layer B.Cu) (net 4) (tstamp 57563736)) + (segment (start 100.5586 120.2436) (end 101.219 120.904) (width 0.25) (layer B.Cu) (net 4) (tstamp 57563735)) + (segment (start 100.5586 116.0272) (end 100.5586 120.2436) (width 0.25) (layer B.Cu) (net 4) (tstamp 57563734)) + (segment (start 100.965 115.6208) (end 100.5586 116.0272) (width 0.25) (layer B.Cu) (net 4) (tstamp 57563733)) + (via (at 100.965 115.6208) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 4)) + (segment (start 101.3834 116.0392) (end 100.965 115.6208) (width 0.25) (layer F.Cu) (net 4) (tstamp 57563731)) + (segment (start 82.7532 101.0539) (end 82.8167 101.0539) (width 1.27) (layer F.Cu) (net 5)) + (segment (start 82.8167 101.0539) (end 84.895602 98.974998) (width 1.27) (layer F.Cu) (net 5) (tstamp 575639BE)) + (segment (start 84.895602 98.974998) (end 86.36 98.974998) (width 1.27) (layer F.Cu) (net 5) (tstamp 575639BF)) + (segment (start 86.36 98.974998) (end 86.36 98.945) (width 1.27) (layer F.Cu) (net 5) (tstamp 575639C1)) + (segment (start 114.303 107.9366) (end 114.303 107.6452) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 114.303 107.6452) (end 113.4648 106.807) (width 0.25) (layer F.Cu) (net 5) (tstamp 57318D88)) + (segment (start 113.4648 105.7656) (end 113.4648 106.807) (width 0.4) (layer F.Cu) (net 5) (tstamp 56F1DCE2)) + (segment (start 112.5305 101.9103) (end 112.6774 102.0572) (width 0.4) (layer F.Cu) (net 5) (tstamp 56F1DCDF)) + (segment (start 112.6774 102.0572) (end 112.6774 104.9782) (width 0.4) (layer F.Cu) (net 5) (tstamp 56F1DCE0)) + (segment (start 112.6774 104.9782) (end 113.4648 105.7656) (width 0.4) (layer F.Cu) (net 5) (tstamp 56F1DCE1)) + (segment (start 89.535 97.25914) (end 90.28984 97.25914) (width 0.635) (layer F.Cu) (net 5)) + (segment (start 90.28984 97.25914) (end 91.3287 98.298) (width 1.27) (layer F.Cu) (net 5) (tstamp 56F1DDCD)) + (segment (start 112.5432 101.9103) (end 112.5305 101.9103) (width 0.635) (layer F.Cu) (net 5) (tstamp 56F1DDD5)) + (segment (start 112.5885 101.9556) (end 112.5432 101.9103) (width 0.635) (layer F.Cu) (net 5) (tstamp 56F1DDD4)) + (via (at 112.5885 101.9556) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 5)) + (segment (start 112.5885 101.5238) (end 112.5885 101.9556) (width 0.635) (layer B.Cu) (net 5) (tstamp 56F1DDD2)) + (segment (start 109.4389 98.3742) (end 112.5885 101.5238) (width 0.635) (layer B.Cu) (net 5) (tstamp 56F1DDD1)) + (segment (start 91.4049 98.3742) (end 109.4389 98.3742) (width 1.27) (layer B.Cu) (net 5) (tstamp 56F1DDD0)) + (segment (start 91.3287 98.298) (end 91.4049 98.3742) (width 0.635) (layer B.Cu) (net 5) (tstamp 56F1DDCF)) + (via (at 91.3287 98.298) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 5)) + (segment (start 111.34046 101.9103) (end 112.5305 101.9103) (width 0.4) (layer F.Cu) (net 5)) + (segment (start 86.36 98.945) (end 87.84914 98.945) (width 1.27) (layer F.Cu) (net 5)) + (segment (start 87.84914 98.945) (end 89.535 97.25914) (width 1.27) (layer F.Cu) (net 5) (tstamp 56EB542D)) + (segment (start 110.6708 110.2868) (end 109.5636 110.2868) (width 1.27) (layer F.Cu) (net 6)) + (segment (start 109.5636 110.2868) (end 109.5382 110.3122) (width 1.27) (layer F.Cu) (net 6) (tstamp 573192EF)) + (segment (start 110.6708 113.2713) (end 110.6708 110.2868) (width 1.27) (layer F.Cu) (net 6)) + (segment (start 110.6708 110.2868) (end 110.6708 107.763) (width 1.27) (layer F.Cu) (net 6) (tstamp 573192ED)) + (segment (start 110.6708 107.763) (end 110.6648 107.757) (width 1.27) (layer F.Cu) (net 6) (tstamp 573192EA)) + (segment (start 114.049 124.3076) (end 115.6873 122.6693) (width 0.4) (layer B.Cu) (net 6) (tstamp 56F1DF2B)) + (segment (start 115.6873 122.6693) (end 115.6873 116.1923) (width 0.4) (layer B.Cu) (net 6) (tstamp 56F1DF2C)) + (segment (start 115.6873 116.1923) (end 114.6459 115.1509) (width 0.4) (layer B.Cu) (net 6) (tstamp 56F1DF2E)) + (via (at 114.6459 115.1509) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 114.6459 115.1509) (end 113.36447 113.86947) (width 0.4) (layer F.Cu) (net 6) (tstamp 56F1DF30)) + (segment (start 113.36447 113.86947) (end 113.36447 113.78057) (width 0.4) (layer F.Cu) (net 6) (tstamp 56F1DF31)) + (segment (start 113.36447 113.78057) (end 112.4488 114.69624) (width 1.27) (layer F.Cu) (net 6) (tstamp 56F1DF34)) + (segment (start 96.721 112.649) (end 96.721 114.2313) (width 0.635) (layer F.Cu) (net 6)) + (segment (start 110.6648 113.2653) (end 110.6648 112.91224) (width 0.635) (layer F.Cu) (net 6) (tstamp 56F1DFE8)) + (segment (start 110.6708 113.2713) (end 110.6648 113.2653) (width 0.635) (layer F.Cu) (net 6) (tstamp 56F1DFE7)) + (via (at 110.6708 113.2713) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 109.8961 114.046) (end 110.6708 113.2713) (width 0.635) (layer B.Cu) (net 6) (tstamp 56F1DFE3)) + (segment (start 106.7211 114.046) (end 109.8961 114.046) (width 0.635) (layer B.Cu) (net 6) (tstamp 56F1DFDA)) + (segment (start 106.2131 114.554) (end 106.7211 114.046) (width 0.635) (layer B.Cu) (net 6) (tstamp 56F1DFD9)) + (segment (start 98.5169 114.554) (end 106.2131 114.554) (width 0.635) (layer B.Cu) (net 6) (tstamp 56F1DFD4)) + (segment (start 98.0089 115.062) (end 98.5169 114.554) (width 0.635) (layer B.Cu) (net 6) (tstamp 56F1DFD3)) + (via (at 98.0089 115.062) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 97.5517 115.062) (end 98.0089 115.062) (width 0.635) (layer F.Cu) (net 6) (tstamp 56F1DFD1)) + (segment (start 96.721 114.2313) (end 97.5517 115.062) (width 0.635) (layer F.Cu) (net 6) (tstamp 56F1DFD0)) + (segment (start 110.6648 112.91224) (end 112.4488 114.69624) (width 1.27) (layer F.Cu) (net 6) (tstamp 56F1DD70)) + (segment (start 113.795 124.3076) (end 114.049 124.3076) (width 0.4) (layer B.Cu) (net 6)) + (segment (start 96.721 112.649) (end 96.721 110.797) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 98.031 106.54) (end 97.02 106.54) (width 0.25) (layer F.Cu) (net 6) (tstamp 56F1CFE4)) + (segment (start 98.171 106.68) (end 98.031 106.54) (width 0.25) (layer F.Cu) (net 6) (tstamp 56F1CFE2)) + (segment (start 98.171 109.347) (end 98.171 106.68) (width 0.25) (layer F.Cu) (net 6) (tstamp 56F1CFE1)) + (segment (start 96.721 110.797) (end 98.171 109.347) (width 0.25) (layer F.Cu) (net 6) (tstamp 56F1CFDB)) + (segment (start 97.02 106.54) (end 95.9615 106.54) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 95.9615 106.54) (end 95.0595 107.442) (width 0.25) (layer F.Cu) (net 6) (tstamp 56F1CF7E)) + (segment (start 95.0595 107.442) (end 95.0595 107.557) (width 0.25) (layer F.Cu) (net 6) (tstamp 56F1CF7F)) + (segment (start 107.7588 118.3513) (end 107.7588 117.2083) (width 0.635) (layer F.Cu) (net 7)) + (segment (start 107.7588 117.2083) (end 107.7461 117.1956) (width 0.635) (layer F.Cu) (net 7) (tstamp 57563975)) + (segment (start 107.7588 118.3513) (end 107.7588 116.0526) (width 0.635) (layer F.Cu) (net 7)) + (segment (start 107.7588 116.0526) (end 107.7461 116.0399) (width 0.635) (layer F.Cu) (net 7) (tstamp 5756396F)) + (segment (start 107.7588 118.3513) (end 105.8291 118.3513) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 108.204 123.7107) (end 108.8143 124.321) (width 0.25) (layer F.Cu) (net 7) (tstamp 57563960)) + (segment (start 108.204 123.1392) (end 108.204 123.7107) (width 0.25) (layer F.Cu) (net 7) (tstamp 5756395F)) + (segment (start 107.4674 122.4026) (end 108.204 123.1392) (width 0.25) (layer F.Cu) (net 7) (tstamp 5756395E)) + (segment (start 105.174202 122.4026) (end 107.4674 122.4026) (width 0.25) (layer F.Cu) (net 7) (tstamp 5756395D)) + (segment (start 104.9528 122.181198) (end 105.174202 122.4026) (width 0.25) (layer F.Cu) (net 7) (tstamp 5756395C)) + (segment (start 104.9528 119.2276) (end 104.9528 122.181198) (width 0.25) (layer F.Cu) (net 7) (tstamp 5756395B)) + (segment (start 105.8291 118.3513) (end 104.9528 119.2276) (width 0.25) (layer F.Cu) (net 7) (tstamp 5756395A)) + (segment (start 108.8143 124.321) (end 109.0549 124.321) (width 0.25) (layer F.Cu) (net 7) (tstamp 57563961)) + (segment (start 107.7461 116.0399) (end 107.7461 118.3386) (width 0.635) (layer F.Cu) (net 7)) + (segment (start 107.7461 118.3386) (end 107.7588 118.3513) (width 0.635) (layer F.Cu) (net 7) (tstamp 57563939)) + (segment (start 105.676 114.3) (end 106.0062 114.3) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 106.0062 114.3) (end 107.7461 116.0399) (width 0.25) (layer F.Cu) (net 7) (tstamp 575638B1)) + (segment (start 105.676 114.3) (end 105.6894 114.3) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 99.621 112.649) (end 102.604 112.649) (width 0.4) (layer F.Cu) (net 7)) + (segment (start 102.604 112.649) (end 102.362 112.649) (width 0.4) (layer F.Cu) (net 7) (tstamp 56F1DA2E)) + (segment (start 104.521 114.3515) (end 103.239 114.3515) (width 0.4) (layer F.Cu) (net 7)) + (segment (start 102.604 113.7165) (end 102.604 111.76) (width 0.4) (layer F.Cu) (net 7) (tstamp 56F1DA2B)) + (segment (start 103.239 114.3515) (end 102.604 113.7165) (width 0.4) (layer F.Cu) (net 7) (tstamp 56F1DA2A)) + (segment (start 102.604 111.76) (end 102.604 111.4545) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 102.604 111.4545) (end 102.87 111.1885) (width 0.25) (layer F.Cu) (net 7) (tstamp 56F1CFED)) + (segment (start 102.87 111.1885) (end 102.87 109.99) (width 0.25) (layer F.Cu) (net 7) (tstamp 56F1CFEE)) + (segment (start 102.362 112.649) (end 102.604 112.407) (width 0.25) (layer F.Cu) (net 7) (tstamp 56F1CFE8)) + (segment (start 102.604 112.407) (end 102.604 111.76) (width 0.25) (layer F.Cu) (net 7) (tstamp 56F1CFE9)) + (segment (start 104.521 114.3515) (end 105.6245 114.3515) (width 0.635) (layer F.Cu) (net 7)) + (segment (start 105.6245 114.3515) (end 105.676 114.3) (width 0.635) (layer F.Cu) (net 7) (tstamp 56F1CBA6)) + (segment (start 94.5926 114.0482) (end 94.5926 114.6706) (width 0.25) (layer F.Cu) (net 8)) + (segment (start 94.5926 114.6706) (end 95.238 115.316) (width 0.25) (layer F.Cu) (net 8) (tstamp 57318976)) + (segment (start 97.2134 120.6754) (end 95.9739 120.6754) (width 0.635) (layer F.Cu) (net 8)) + (segment (start 95.238 119.9395) (end 95.238 115.316) (width 0.635) (layer F.Cu) (net 8) (tstamp 56EB5873)) + (segment (start 95.9739 120.6754) (end 95.238 119.9395) (width 0.635) (layer F.Cu) (net 8) (tstamp 56EB5872)) + (segment (start 109.0549 122.821) (end 110.0829 122.821) (width 0.25) (layer F.Cu) (net 9) (status 400000)) + (segment (start 112.4869 123.0757) (end 113.795 121.7676) (width 0.25) (layer F.Cu) (net 9) (tstamp 57563C57) (status 800000)) + (segment (start 110.3376 123.0757) (end 112.4869 123.0757) (width 0.25) (layer F.Cu) (net 9) (tstamp 57563C55)) + (segment (start 110.0829 122.821) (end 110.3376 123.0757) (width 0.25) (layer F.Cu) (net 9) (tstamp 57563C54)) + (segment (start 106.0944 120.65) (end 106.9975 120.65) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 106.9975 120.65) (end 107.8103 121.4628) (width 0.635) (layer F.Cu) (net 9) (tstamp 5756399D)) + (segment (start 107.8103 121.4628) (end 107.8103 121.6152) (width 0.635) (layer F.Cu) (net 9) (tstamp 5756399E)) + (segment (start 107.9881 119.5197) (end 107.9881 119.6594) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 107.9881 119.6594) (end 106.9975 120.65) (width 0.635) (layer F.Cu) (net 9) (tstamp 57563999)) + (segment (start 110.2487 115.6462) (end 111.633 114.2619) (width 0.635) (layer B.Cu) (net 9)) + (segment (start 111.633 114.2619) (end 111.633 112.5252) (width 0.635) (layer B.Cu) (net 9) (tstamp 57563980)) + (segment (start 111.633 112.5252) (end 110.6898 111.582) (width 0.635) (layer B.Cu) (net 9) (tstamp 57563981)) + (segment (start 109.2461 117.1956) (end 109.2461 116.0399) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 109.2588 118.3513) (end 109.2588 117.2083) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 109.2588 117.2083) (end 109.2461 117.1956) (width 0.635) (layer F.Cu) (net 9) (tstamp 57563978)) + (segment (start 109.2461 116.0399) (end 109.2461 118.3386) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 109.2461 118.3386) (end 109.2588 118.3513) (width 0.635) (layer F.Cu) (net 9) (tstamp 57563972)) + (segment (start 109.0549 122.821) (end 109.0161 122.821) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 109.0161 122.821) (end 107.8103 121.6152) (width 0.25) (layer F.Cu) (net 9) (tstamp 57563964)) + (segment (start 107.8103 121.6152) (end 106.8451 120.65) (width 0.25) (layer F.Cu) (net 9) (tstamp 575639A1)) + (segment (start 106.8451 120.65) (end 106.0944 120.65) (width 0.25) (layer F.Cu) (net 9) (tstamp 57563965)) + (segment (start 106.0944 120.65) (end 106.9975 120.65) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 107.9881 119.5197) (end 109.1565 118.3513) (width 0.25) (layer F.Cu) (net 9) (tstamp 57563943)) + (segment (start 106.9975 120.65) (end 107.9881 119.6594) (width 0.25) (layer F.Cu) (net 9) (tstamp 57563941)) + (segment (start 109.1565 118.3513) (end 109.2588 118.3513) (width 0.25) (layer F.Cu) (net 9) (tstamp 57563944)) + (segment (start 109.2461 118.3386) (end 109.2588 118.3513) (width 0.635) (layer F.Cu) (net 9) (tstamp 5756393C)) + (segment (start 109.2461 116.0399) (end 109.855 116.0399) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 109.855 116.0399) (end 110.2487 115.6462) (width 0.25) (layer F.Cu) (net 9) (tstamp 575638B5)) + (via (at 110.2487 115.6462) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 111.633 114.2619) (end 111.633 112.5252) (width 0.25) (layer B.Cu) (net 9) (tstamp 575638B8)) + (segment (start 111.633 112.5252) (end 110.6898 111.582) (width 0.25) (layer B.Cu) (net 9) (tstamp 575638B9)) + (segment (start 108.72 102.54) (end 107.8232 102.54) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 102.108 99.7204) (end 102.108 99.6315) (width 0.25) (layer F.Cu) (net 9) (tstamp 575637CE)) + (segment (start 104.2416 101.854) (end 102.108 99.7204) (width 0.25) (layer F.Cu) (net 9) (tstamp 575637CC)) + (segment (start 107.1372 101.854) (end 104.2416 101.854) (width 0.25) (layer F.Cu) (net 9) (tstamp 575637CB)) + (segment (start 107.8232 102.54) (end 107.1372 101.854) (width 0.25) (layer F.Cu) (net 9) (tstamp 575637CA)) + (segment (start 93.738 115.316) (end 92.468 115.316) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 92.468 115.316) (end 92.456 115.304) (width 0.635) (layer F.Cu) (net 9) (tstamp 573192F4)) + (segment (start 110.6648 105.857) (end 110.6648 104.7466) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 109.779 102.54) (end 108.72 102.54) (width 0.25) (layer F.Cu) (net 9) (tstamp 57318DA3)) + (segment (start 110.1598 102.9208) (end 109.779 102.54) (width 0.25) (layer F.Cu) (net 9) (tstamp 57318DA2)) + (segment (start 110.1598 104.2416) (end 110.1598 102.9208) (width 0.25) (layer F.Cu) (net 9) (tstamp 57318DA1)) + (segment (start 110.6648 104.7466) (end 110.1598 104.2416) (width 0.25) (layer F.Cu) (net 9) (tstamp 57318DA0)) + (segment (start 114.303 109.4366) (end 113.30916 109.4366) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 113.30916 109.4366) (end 112.4488 110.29696) (width 0.25) (layer F.Cu) (net 9) (tstamp 57318D85)) + (segment (start 107.9142 110.2868) (end 107.9142 109.4366) (width 0.25) (layer F.Cu) (net 9)) + (via (at 108.0546 109.2962) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 107.9142 109.4366) (end 108.0546 109.2962) (width 0.25) (layer F.Cu) (net 9) (tstamp 57318C41)) + (segment (start 108.0546 109.2962) (end 108.0546 109.2581) (width 0.25) (layer B.Cu) (net 9) (tstamp 57318C43)) + (segment (start 108.0546 109.2581) (end 108.0546 109.2962) (width 0.25) (layer B.Cu) (net 9) (tstamp 57318C44)) + (segment (start 108.0546 109.2962) (end 108.0546 109.2581) (width 0.25) (layer B.Cu) (net 9) (tstamp 57318C46)) + (segment (start 89.535 100.86086) (end 89.87074 100.86086) (width 0.4) (layer F.Cu) (net 9)) + (segment (start 89.87074 100.86086) (end 91.0874 99.6442) (width 0.4) (layer F.Cu) (net 9) (tstamp 57318B14)) + (segment (start 96.6796 98.5266) (end 97.089 98.936) (width 0.4) (layer F.Cu) (net 9) (tstamp 57318B1A)) + (segment (start 96.4468 98.5266) (end 96.6796 98.5266) (width 0.4) (layer F.Cu) (net 9) (tstamp 57318B19)) + (segment (start 95.6594 97.7392) (end 96.4468 98.5266) (width 0.4) (layer F.Cu) (net 9) (tstamp 57318B18)) + (segment (start 94.618 97.7392) (end 95.6594 97.7392) (width 0.4) (layer F.Cu) (net 9) (tstamp 57318B17)) + (segment (start 92.713 99.6442) (end 94.618 97.7392) (width 0.4) (layer F.Cu) (net 9) (tstamp 57318B16)) + (segment (start 91.0874 99.6442) (end 92.713 99.6442) (width 0.4) (layer F.Cu) (net 9) (tstamp 57318B15)) + (segment (start 108.1405 98.4885) (end 107.95 98.4885) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 107.95 98.4885) (end 107.6325 98.171) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D054)) + (segment (start 108.1405 98.4885) (end 108.1405 98.1075) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 109.4105 97.028) (end 109.4105 96.4565) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D03D)) + (segment (start 109.1565 97.282) (end 109.4105 97.028) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D03C)) + (segment (start 108.966 97.282) (end 109.1565 97.282) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D03B)) + (segment (start 108.1405 98.1075) (end 108.966 97.282) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D03A)) + (segment (start 107.6325 98.171) (end 107.6325 97.155) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D059)) + (segment (start 107.6325 97.155) (end 107.442 96.9645) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D05A)) + (segment (start 107.442 96.9645) (end 105.6005 96.9645) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D05B)) + (segment (start 105.6005 96.9645) (end 105.27 97.295) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D05C)) + (segment (start 102.50724 108.0008) (end 103.26162 108.0008) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E23F)) + (segment (start 103.26162 108.0008) (end 103.28956 107.97286) (width 0.635) (layer B.Cu) (net 9) (tstamp 56F1E245)) + (segment (start 103.28956 107.97286) (end 105.86004 107.97286) (width 0.635) (layer B.Cu) (net 9) (tstamp 56F1E246)) + (segment (start 105.86004 107.97286) (end 107.14528 109.2581) (width 0.635) (layer B.Cu) (net 9) (tstamp 56F1E248)) + (via (at 103.26162 108.0008) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 105.12344 112.87252) (end 109.39928 112.87252) (width 1.27) (layer B.Cu) (net 9)) + (segment (start 109.39928 112.87252) (end 110.6898 111.582) (width 1.27) (layer B.Cu) (net 9) (tstamp 56F1E627)) + (segment (start 110.6898 111.582) (end 111.0148 111.582) (width 1.27) (layer B.Cu) (net 9) (tstamp 56F1E62B)) + (segment (start 111.0148 111.582) (end 112.4648 110.132) (width 1.27) (layer B.Cu) (net 9) (tstamp 56F1E62C)) + (segment (start 112.4648 110.132) (end 112.4648 107.982) (width 1.27) (layer B.Cu) (net 9) (tstamp 56F1E630)) + (segment (start 99.822 115.8875) (end 99.822 115.5476) (width 0.635) (layer F.Cu) (net 9)) + (via (at 105.12344 112.87252) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 104.30048 113.69548) (end 105.12344 112.87252) (width 0.635) (layer B.Cu) (net 9) (tstamp 56F1E39C)) + (segment (start 101.919518 113.69548) (end 104.30048 113.69548) (width 0.635) (layer B.Cu) (net 9) (tstamp 56F1E39B)) + (segment (start 101.886498 113.66246) (end 101.919518 113.69548) (width 0.635) (layer B.Cu) (net 9) (tstamp 56F1E39A)) + (via (at 101.886498 113.66246) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 101.70714 113.66246) (end 101.886498 113.66246) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E398)) + (segment (start 99.822 115.5476) (end 101.70714 113.66246) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E395)) + (segment (start 105.12344 112.87252) (end 105.12344 112.8515) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E39E)) + (segment (start 105.12344 112.8515) (end 105.12344 112.87252) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E39F)) + (segment (start 105.12344 112.87252) (end 105.12344 112.8515) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E3A1)) + (segment (start 97.02 105.74) (end 100.18294 105.74) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 102.44374 108.0008) (end 102.50724 108.0008) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E259)) + (segment (start 100.18294 105.74) (end 102.44374 108.0008) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E258)) + (segment (start 102.07 109.99) (end 102.07 108.43804) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 102.07 108.43804) (end 102.50724 108.0008) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E23E)) + (segment (start 95.0595 106.057) (end 95.6952 106.057) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 96.0122 105.74) (end 97.02 105.74) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1DBA5)) + (segment (start 95.6952 106.057) (end 96.0122 105.74) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1DBA4)) + (segment (start 105.27 98.29) (end 105.27 99.6185) (width 0.4) (layer F.Cu) (net 9)) + (segment (start 105.27 99.6185) (end 105.283 99.6315) (width 0.4) (layer F.Cu) (net 9) (tstamp 56F1D1BF)) + (via (at 105.283 99.6315) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 105.283 99.6315) (end 105.0925 99.822) (width 0.4) (layer B.Cu) (net 9) (tstamp 56F1D1C1)) + (segment (start 105.0925 99.822) (end 102.2985 99.822) (width 0.4) (layer B.Cu) (net 9) (tstamp 56F1D1C2)) + (segment (start 102.2985 99.822) (end 102.108 99.6315) (width 0.4) (layer B.Cu) (net 9) (tstamp 56F1D1C3)) + (via (at 102.108 99.6315) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 102.07 99.5935) (end 102.07 98.29) (width 0.4) (layer F.Cu) (net 9) (tstamp 56F1D1C6)) + (segment (start 102.108 99.6315) (end 102.07 99.5935) (width 0.4) (layer F.Cu) (net 9) (tstamp 56F1D1C5)) + (segment (start 93.738 120.003) (end 93.8015 120.003) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 93.738 115.836) (end 93.738 115.316) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1D199)) + (segment (start 94.402998 116.500998) (end 93.738 115.836) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1D198)) + (segment (start 94.402998 119.401502) (end 94.402998 116.500998) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1D197)) + (segment (start 93.8015 120.003) (end 94.402998 119.401502) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1D196)) + (segment (start 105.27 97.295) (end 105.27 98.29) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1D05D)) + (segment (start 101.104 111.76) (end 101.219 111.76) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 101.219 111.76) (end 102.07 110.909) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1CFF4)) + (segment (start 102.07 110.909) (end 102.07 109.99) (width 0.25) (layer F.Cu) (net 9) (tstamp 56F1CFF5)) + (segment (start 95.0595 106.057) (end 95.0595 105.918) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 104.521 112.8515) (end 105.12344 112.8515) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 105.12344 112.8515) (end 105.6245 112.8515) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E3A2)) + (segment (start 105.6245 112.8515) (end 105.676 112.903) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1CBA9)) + (segment (start 100.318 116.84) (end 100.318 116.193) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 94.488 123.698) (end 94.361 123.698) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5E3B)) + (via (at 94.488 123.698) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 95.631 123.698) (end 94.488 123.698) (width 0.635) (layer B.Cu) (net 9) (tstamp 56EB5E38)) + (segment (start 96.139 124.206) (end 95.631 123.698) (width 0.635) (layer B.Cu) (net 9) (tstamp 56EB5E35)) + (segment (start 97.028 124.206) (end 96.139 124.206) (width 0.635) (layer B.Cu) (net 9) (tstamp 56EB5E34)) + (segment (start 98.171 123.063) (end 97.028 124.206) (width 0.635) (layer B.Cu) (net 9) (tstamp 56EB5E31)) + (segment (start 98.171 116.713) (end 98.171 123.063) (width 0.635) (layer B.Cu) (net 9) (tstamp 56EB5E30)) + (segment (start 99.06 115.8875) (end 98.171 116.713) (width 0.635) (layer B.Cu) (net 9) (tstamp 56EB5E2F)) + (segment (start 99.822 115.8875) (end 99.06 115.8875) (width 0.635) (layer B.Cu) (net 9) (tstamp 56EB5E2E)) + (via (at 99.822 115.8875) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 100.318 116.193) (end 99.822 115.8875) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5E2B)) + (segment (start 100.318 124.079) (end 100.318 124.726) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 94.361 120.626) (end 93.738 120.003) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5D77)) + (segment (start 94.361 123.698) (end 94.361 120.626) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5D76)) + (segment (start 96.012 125.349) (end 94.361 123.698) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5D75)) + (segment (start 99.695 125.349) (end 96.012 125.349) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5D74)) + (segment (start 100.318 124.726) (end 99.695 125.349) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5D73)) + (segment (start 91.8134 120.6754) (end 93.0656 120.6754) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 93.0656 120.6754) (end 93.738 120.003) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB586A)) + (segment (start 85.332 104.5464) (end 85.332 105.5504) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 85.6234 120.9802) (end 85.6234 120.9548) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EB4FDE)) + (via (at 85.6234 120.9802) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 85.6234 105.8418) (end 85.6234 120.9802) (width 0.25) (layer B.Cu) (net 9) (tstamp 56EB4FD6)) + (segment (start 85.5726 105.791) (end 85.6234 105.8418) (width 0.25) (layer B.Cu) (net 9) (tstamp 56EB4FD5)) + (via (at 85.5726 105.791) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 85.332 105.5504) (end 85.5726 105.791) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EB4FD3)) + (segment (start 91.8134 120.6754) (end 89.7382 120.6754) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 89.7128 120.7008) (end 89.7128 120.7262) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF512)) + (segment (start 89.7382 120.6754) (end 89.7128 120.7008) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF510)) + (segment (start 88.3666 120.9548) (end 89.4842 120.9548) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 90.1954 120.2436) (end 90.1954 119.7102) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF509)) + (segment (start 89.4842 120.9548) (end 89.7128 120.7262) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF508)) + (segment (start 89.7128 120.7262) (end 90.1954 120.2436) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF513)) + (segment (start 88.9254 121.7422) (end 88.9254 121.5136) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 88.9254 121.5136) (end 88.3666 120.9548) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF455)) + (segment (start 88.3666 120.9548) (end 85.6234 120.9548) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF456)) + (segment (start 86.233 123.3678) (end 85.6234 122.7582) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF34C)) + (segment (start 85.979 118.3386) (end 85.979 117.971) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF34F)) + (segment (start 85.6234 118.6942) (end 85.979 118.3386) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF34E)) + (segment (start 85.6234 122.7582) (end 85.6234 120.9548) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF34D)) + (segment (start 85.6234 120.9548) (end 85.6234 118.6942) (width 0.25) (layer F.Cu) (net 9) (tstamp 56EBF459)) + (segment (start 86.233 123.583) (end 86.233 123.3678) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 86.36 100.445) (end 89.11914 100.445) (width 1.27) (layer F.Cu) (net 9)) + (segment (start 89.11914 100.445) (end 89.535 100.86086) (width 1.27) (layer F.Cu) (net 9) (tstamp 56EB5429)) + (segment (start 92.456 115.304) (end 91.428 115.304) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 90.424 115.062) (end 87.67 112.308) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5203)) + (segment (start 91.186 115.062) (end 90.424 115.062) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5201)) + (segment (start 91.428 115.304) (end 91.186 115.062) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5200)) + (segment (start 87.67 112.308) (end 87.67 111.76) (width 0.635) (layer F.Cu) (net 9) (tstamp 56EB5204)) + (segment (start 89.535 100.86086) (end 89.908262 100.86086) (width 1.27) (layer F.Cu) (net 9)) + (segment (start 89.908262 100.86086) (end 90.805 101.757598) (width 1.27) (layer F.Cu) (net 9) (tstamp 56EB50B5)) + (via (at 90.805 101.757598) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 90.805 101.757598) (end 90.805 103.505) (width 1.27) (layer B.Cu) (net 9) (tstamp 56EB50BB)) + (segment (start 90.805 103.505) (end 90.17 104.14) (width 1.27) (layer B.Cu) (net 9) (tstamp 56EB50BC)) + (segment (start 87.63 104.14) (end 90.17 104.14) (width 1.27) (layer B.Cu) (net 9)) + (segment (start 87.63 106.68) (end 87.63 104.14) (width 1.27) (layer B.Cu) (net 9)) + (segment (start 87.67 111.76) (end 87.67 106.72) (width 1.27) (layer B.Cu) (net 9)) + (segment (start 87.67 106.72) (end 87.63 106.68) (width 1.27) (layer B.Cu) (net 9) (tstamp 56EB4D70)) + (segment (start 112.4488 110.29696) (end 112.4488 107.641) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 112.4488 107.641) (end 111.6233 106.8155) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1DD7B)) + (via (at 112.4648 107.982) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 112.4648 107.982) (end 112.4488 107.982) (width 1.27) (layer F.Cu) (net 9) (tstamp 56F1E633)) + (segment (start 112.4488 107.982) (end 112.4488 110.29696) (width 1.27) (layer F.Cu) (net 9) (tstamp 56F1E634)) + (segment (start 111.6233 106.7816) (end 111.6233 106.8155) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E254)) + (segment (start 111.60635 106.79855) (end 111.6233 106.7816) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E252)) + (segment (start 111.6233 106.7816) (end 111.60635 106.79855) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E251)) + (segment (start 107.14528 109.2581) (end 108.0546 109.2581) (width 0.635) (layer B.Cu) (net 9) (tstamp 56F1E249)) + (segment (start 108.0546 109.2581) (end 109.1468 109.2581) (width 0.635) (layer B.Cu) (net 9) (tstamp 57318C47)) + (segment (start 109.1468 109.2581) (end 111.6233 106.7816) (width 0.635) (layer B.Cu) (net 9) (tstamp 56F1E24A)) + (via (at 111.6233 106.7816) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 111.6233 106.8155) (end 110.6648 105.857) (width 0.635) (layer F.Cu) (net 9) (tstamp 56F1E255)) + (segment (start 113.795 121.7676) (end 113.795 121.3866) (width 0.635) (layer F.Cu) (net 9)) + (segment (start 113.795 121.0848) (end 113.795 121.7676) (width 0.25) (layer F.Cu) (net 9) (tstamp 5756396B)) + (segment (start 113.795 121.7676) (end 113.795 121.666) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 113.795 121.7676) (end 113.795 121.7422) (width 0.4) (layer F.Cu) (net 9)) + (segment (start 82.423 118.098) (end 80.5838 118.098) (width 0.25) (layer F.Cu) (net 10)) + (segment (start 80.5838 118.098) (end 80.4448 118.237) (width 0.25) (layer F.Cu) (net 10) (tstamp 56F46D1D)) + (segment (start 82.423 116.598) (end 81.3458 116.598) (width 0.25) (layer F.Cu) (net 11)) + (segment (start 81.3458 116.598) (end 80.4448 115.697) (width 0.25) (layer F.Cu) (net 11) (tstamp 56F46D20)) + (segment (start 83.2866 117.0418) (end 83.2866 119.5966) (width 0.25) (layer F.Cu) (net 11) (tstamp 56EBF325)) + (segment (start 82.8428 116.598) (end 83.2866 117.0418) (width 0.25) (layer F.Cu) (net 11) (tstamp 56EBF324)) + (segment (start 82.423 116.598) (end 82.8428 116.598) (width 0.25) (layer F.Cu) (net 11)) + (segment (start 83.2866 119.5966) (end 83.324 119.634) (width 0.25) (layer F.Cu) (net 11) (tstamp 56EBF326)) + (segment (start 82.181 116.84) (end 82.423 116.598) (width 0.25) (layer F.Cu) (net 11) (tstamp 56EBF31D)) + (segment (start 82.55 124.956) (end 82.0838 124.956) (width 0.25) (layer F.Cu) (net 12)) + (segment (start 82.0838 124.956) (end 80.4448 123.317) (width 0.25) (layer F.Cu) (net 12) (tstamp 56F46D16)) + (segment (start 83.324 121.92) (end 81.5878 121.92) (width 0.25) (layer F.Cu) (net 13)) + (segment (start 81.5878 121.92) (end 80.4448 120.777) (width 0.25) (layer F.Cu) (net 13) (tstamp 56F46D19)) + (segment (start 83.324 121.92) (end 83.324 122.682) (width 0.25) (layer F.Cu) (net 13)) + (segment (start 83.324 122.682) (end 82.55 123.456) (width 0.25) (layer F.Cu) (net 13) (tstamp 56EBF340)) + (segment (start 93.7036 106.31886) (end 93.34246 106.68) (width 1.27) (layer F.Cu) (net 14) (tstamp 5731898C)) + (segment (start 93.7036 104.8534) (end 93.7036 106.31886) (width 1.27) (layer F.Cu) (net 14)) + (segment (start 90.6048 106.807) (end 90.7572 106.807) (width 0.25) (layer F.Cu) (net 14)) + (segment (start 90.7572 106.807) (end 92.1796 105.3846) (width 0.25) (layer F.Cu) (net 14) (tstamp 57318787)) + (segment (start 92.1796 105.3846) (end 92.1796 103.124) (width 0.25) (layer F.Cu) (net 14) (tstamp 5731878A)) + (segment (start 92.1796 103.124) (end 91.824 102.7684) (width 0.25) (layer F.Cu) (net 14) (tstamp 5731878C)) + (segment (start 91.824 102.7684) (end 85.5098 102.7684) (width 0.25) (layer F.Cu) (net 14) (tstamp 5731878D)) + (segment (start 85.5098 102.7684) (end 85.332 102.9462) (width 0.25) (layer F.Cu) (net 14) (tstamp 57318790)) + (segment (start 90.17 106.68) (end 90.17 106.172) (width 0.25) (layer F.Cu) (net 14)) + (segment (start 85.471 102.9462) (end 85.332 102.9462) (width 0.25) (layer F.Cu) (net 14) (tstamp 56EB4FCD)) + (segment (start 92.456 113.804) (end 90.944 113.804) (width 1.27) (layer F.Cu) (net 14)) + (segment (start 90.17 113.03) (end 90.17 111.76) (width 1.27) (layer F.Cu) (net 14) (tstamp 56EB51FA)) + (segment (start 90.944 113.804) (end 90.17 113.03) (width 1.27) (layer F.Cu) (net 14) (tstamp 56EB51F9)) + (segment (start 90.17 106.68) (end 93.34246 106.68) (width 1.27) (layer B.Cu) (net 14)) + (segment (start 90.17 111.76) (end 90.17 106.68) (width 1.27) (layer B.Cu) (net 14)) + (segment (start 82.7532 95.9739) (end 92.79636 95.9739) (width 1.27) (layer B.Cu) (net 15)) + (segment (start 92.79636 95.9739) (end 93.34246 96.52) (width 1.27) (layer B.Cu) (net 15) (tstamp 575639BB)) + (segment (start 96.139 96.136) (end 93.72646 96.136) (width 0.635) (layer F.Cu) (net 15)) + (segment (start 93.72646 96.136) (end 93.34246 96.52) (width 0.635) (layer F.Cu) (net 15) (tstamp 56F1CCF4)) + (segment (start 83.832 104.5464) (end 83.832 102.9462) (width 0.635) (layer F.Cu) (net 16)) + (segment (start 83.832 102.9462) (end 83.832 102.48254) (width 0.25) (layer F.Cu) (net 16)) + (segment (start 107.53086 108.14) (end 108.72 108.14) (width 0.25) (layer F.Cu) (net 16) (tstamp 56F1E1FE)) + (segment (start 107.46278 108.07192) (end 107.53086 108.14) (width 0.25) (layer F.Cu) (net 16) (tstamp 56F1E1FD)) + (via (at 107.46278 108.07192) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 16)) + (segment (start 107.15798 107.76712) (end 107.46278 108.07192) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1FB)) + (segment (start 107.15798 106.3244) (end 107.15798 107.76712) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1F9)) + (segment (start 105.79654 104.96296) (end 107.15798 106.3244) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1F7)) + (segment (start 104.55702 104.96296) (end 105.79654 104.96296) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1F6)) + (segment (start 104.45542 104.86136) (end 104.55702 104.96296) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1F5)) + (via (at 104.45542 104.86136) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 16)) + (segment (start 103.81026 104.86136) (end 104.45542 104.86136) (width 0.25) (layer F.Cu) (net 16) (tstamp 56F1E1F0)) + (segment (start 98.91822 99.96932) (end 103.81026 104.86136) (width 0.25) (layer F.Cu) (net 16) (tstamp 56F1E1EF)) + (via (at 98.91822 99.96932) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 16)) + (segment (start 94.37162 99.96932) (end 98.91822 99.96932) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1D4)) + (segment (start 93.72646 100.61448) (end 94.37162 99.96932) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1D2)) + (segment (start 88.91062 100.61448) (end 93.72646 100.61448) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1D0)) + (segment (start 87.69142 101.83368) (end 88.91062 100.61448) (width 0.25) (layer B.Cu) (net 16) (tstamp 56F1E1CF)) + (via (at 87.69142 101.83368) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 16)) + (segment (start 84.48086 101.83368) (end 87.69142 101.83368) (width 0.25) (layer F.Cu) (net 16) (tstamp 56F1E1CD)) + (segment (start 83.832 102.48254) (end 84.48086 101.83368) (width 0.25) (layer F.Cu) (net 16) (tstamp 56F1E1CC)) + (segment (start 98.818 116.84) (end 98.818 114.7408) (width 0.25) (layer F.Cu) (net 17)) + (segment (start 103.6731 112.522) (end 103.6731 109.9931) (width 0.25) (layer F.Cu) (net 17) (tstamp 56F1DFAF)) + (segment (start 103.3429 112.8522) (end 103.6731 112.522) (width 0.25) (layer F.Cu) (net 17) (tstamp 56F1DFAE)) + (via (at 103.3429 112.8522) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 17)) + (segment (start 102.7333 112.2426) (end 103.3429 112.8522) (width 0.25) (layer B.Cu) (net 17) (tstamp 56F1DFA9)) + (segment (start 100.0155 112.2426) (end 102.7333 112.2426) (width 0.25) (layer B.Cu) (net 17) (tstamp 56F1DFA8)) + (segment (start 98.5423 113.7158) (end 100.0155 112.2426) (width 0.25) (layer B.Cu) (net 17) (tstamp 56F1DFA7)) + (via (at 98.5423 113.7158) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 17)) + (segment (start 98.2883 113.9698) (end 98.5423 113.7158) (width 0.25) (layer F.Cu) (net 17) (tstamp 56F1DFA4)) + (segment (start 98.2883 114.2111) (end 98.2883 113.9698) (width 0.25) (layer F.Cu) (net 17) (tstamp 56F1DFA3)) + (segment (start 98.818 114.7408) (end 98.2883 114.2111) (width 0.25) (layer F.Cu) (net 17) (tstamp 56F1DF9D)) + (segment (start 103.6731 109.9931) (end 103.67 109.99) (width 0.25) (layer F.Cu) (net 17) (tstamp 56F1DFB0)) + (segment (start 103.67 109.99) (end 103.67 108.6105) (width 0.4) (layer F.Cu) (net 17)) + (segment (start 103.67 108.6105) (end 104.9405 107.34) (width 0.4) (layer F.Cu) (net 17) (tstamp 56F1D91E)) + (segment (start 104.9405 107.34) (end 108.72 107.34) (width 0.4) (layer F.Cu) (net 17) (tstamp 56F1D91F)) + (segment (start 103.6955 110.0155) (end 103.67 109.99) (width 0.4) (layer F.Cu) (net 17) (tstamp 56F1D91B)) + (segment (start 98.818 116.84) (end 97.2388 116.84) (width 0.4) (layer F.Cu) (net 17)) + (segment (start 97.2388 116.84) (end 97.2134 116.8654) (width 0.4) (layer F.Cu) (net 17) (tstamp 56F1D8FD)) + (segment (start 97.2134 118.1354) (end 97.2134 116.8654) (width 0.635) (layer F.Cu) (net 17)) + (segment (start 89.5604 119.7102) (end 89.5604 119.31188) (width 0.25) (layer F.Cu) (net 19)) + (segment (start 107.42214 105.67416) (end 108.65416 105.67416) (width 0.25) (layer F.Cu) (net 19) (tstamp 56F1E12A)) + (segment (start 107.02082 105.27284) (end 107.42214 105.67416) (width 0.25) (layer F.Cu) (net 19) (tstamp 56F1E129)) + (via (at 107.02082 105.27284) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 19)) + (segment (start 107.02082 102.81666) (end 107.02082 105.27284) (width 0.25) (layer B.Cu) (net 19) (tstamp 56F1E126)) + (segment (start 106.47726 102.2731) (end 107.02082 102.81666) (width 0.25) (layer B.Cu) (net 19) (tstamp 56F1E124)) + (segment (start 101.06706 102.2731) (end 106.47726 102.2731) (width 0.25) (layer B.Cu) (net 19) (tstamp 56F1E120)) + (segment (start 98.89536 104.4448) (end 101.06706 102.2731) (width 0.25) (layer B.Cu) (net 19) (tstamp 56F1E11E)) + (segment (start 98.89536 107.7595) (end 98.89536 104.4448) (width 0.25) (layer B.Cu) (net 19) (tstamp 56F1E11C)) + (segment (start 91.38966 115.2652) (end 98.89536 107.7595) (width 0.25) (layer B.Cu) (net 19) (tstamp 56F1E119)) + (segment (start 91.38966 117.76456) (end 91.38966 115.2652) (width 0.25) (layer B.Cu) (net 19) (tstamp 56F1E116)) + (segment (start 90.3762 118.77802) (end 91.38966 117.76456) (width 0.25) (layer B.Cu) (net 19) (tstamp 56F1E115)) + (via (at 90.3762 118.77802) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 19)) + (segment (start 90.09426 118.77802) (end 90.3762 118.77802) (width 0.25) (layer F.Cu) (net 19) (tstamp 56F1E113)) + (segment (start 89.5604 119.31188) (end 90.09426 118.77802) (width 0.25) (layer F.Cu) (net 19) (tstamp 56F1E109)) + (segment (start 108.65416 105.67416) (end 108.72 105.74) (width 0.25) (layer F.Cu) (net 19) (tstamp 56F1E12B)) + (segment (start 89.5604 121.7422) (end 89.5604 122.22018) (width 0.25) (layer F.Cu) (net 20)) + (segment (start 107.64566 104.902) (end 108.682 104.902) (width 0.25) (layer F.Cu) (net 20) (tstamp 56F1E161)) + (segment (start 107.36118 104.61752) (end 107.64566 104.902) (width 0.25) (layer F.Cu) (net 20) (tstamp 56F1E160)) + (segment (start 106.9751 104.61752) (end 107.36118 104.61752) (width 0.25) (layer F.Cu) (net 20) (tstamp 56F1E15F)) + (segment (start 106.30454 103.94696) (end 106.9751 104.61752) (width 0.25) (layer F.Cu) (net 20) (tstamp 56F1E15E)) + (via (at 106.30454 103.94696) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 20)) + (segment (start 106.30454 102.9716) (end 106.30454 103.94696) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E15A)) + (segment (start 106.08102 102.74808) (end 106.30454 102.9716) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E159)) + (segment (start 101.30582 102.74808) (end 106.08102 102.74808) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E157)) + (segment (start 99.444 104.6099) (end 101.30582 102.74808) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E154)) + (segment (start 99.444 107.95) (end 99.444 104.6099) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E152)) + (segment (start 91.839662 115.554338) (end 99.444 107.95) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E14F)) + (segment (start 91.839662 118.259438) (end 91.839662 115.554338) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E14C)) + (segment (start 90.49304 119.60606) (end 91.839662 118.259438) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E14A)) + (segment (start 89.06556 119.60606) (end 90.49304 119.60606) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E149)) + (segment (start 88.05972 120.6119) (end 89.06556 119.60606) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E148)) + (segment (start 88.05972 121.9835) (end 88.05972 120.6119) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E147)) + (segment (start 88.59566 122.51944) (end 88.05972 121.9835) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E146)) + (segment (start 89.1443 122.51944) (end 88.59566 122.51944) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E145)) + (segment (start 89.20272 122.57786) (end 89.1443 122.51944) (width 0.25) (layer B.Cu) (net 20) (tstamp 56F1E144)) + (via (at 89.20272 122.57786) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 20)) + (segment (start 89.5604 122.22018) (end 89.20272 122.57786) (width 0.25) (layer F.Cu) (net 20) (tstamp 56F1E142)) + (segment (start 108.682 104.902) (end 108.72 104.94) (width 0.25) (layer F.Cu) (net 20) (tstamp 56F1E162)) + (segment (start 91.8134 119.4054) (end 92.61394 119.4054) (width 0.25) (layer F.Cu) (net 21)) + (segment (start 107.4323 104.14) (end 108.72 104.14) (width 0.25) (layer F.Cu) (net 21) (tstamp 56F1E181)) + (segment (start 107.30784 104.01554) (end 107.4323 104.14) (width 0.25) (layer F.Cu) (net 21) (tstamp 56F1E180)) + (segment (start 107.30784 103.48976) (end 107.30784 104.01554) (width 0.25) (layer F.Cu) (net 21) (tstamp 56F1E17F)) + (segment (start 106.95224 103.13416) (end 107.30784 103.48976) (width 0.25) (layer F.Cu) (net 21) (tstamp 56F1E17E)) + (segment (start 105.78892 103.13416) (end 106.95224 103.13416) (width 0.25) (layer F.Cu) (net 21) (tstamp 56F1E17D)) + (segment (start 105.52476 103.39832) (end 105.78892 103.13416) (width 0.25) (layer F.Cu) (net 21) (tstamp 56F1E17C)) + (via (at 105.52476 103.39832) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 21)) + (segment (start 101.84684 103.39832) (end 105.52476 103.39832) (width 0.25) (layer B.Cu) (net 21) (tstamp 56F1E172)) + (segment (start 100.07646 105.1687) (end 101.84684 103.39832) (width 0.25) (layer B.Cu) (net 21) (tstamp 56F1E170)) + (segment (start 100.07646 108.2802) (end 100.07646 105.1687) (width 0.25) (layer B.Cu) (net 21) (tstamp 56F1E16C)) + (segment (start 93.62486 114.7318) (end 100.07646 108.2802) (width 0.25) (layer B.Cu) (net 21) (tstamp 56F1E16A)) + (segment (start 93.62486 116.4844) (end 93.62486 114.7318) (width 0.25) (layer B.Cu) (net 21) (tstamp 56F1E169)) + (segment (start 93.40134 116.70792) (end 93.62486 116.4844) (width 0.25) (layer B.Cu) (net 21) (tstamp 56F1E168)) + (via (at 93.40134 116.70792) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 21)) + (segment (start 93.40134 118.618) (end 93.40134 116.70792) (width 0.25) (layer F.Cu) (net 21) (tstamp 56F1E166)) + (segment (start 92.61394 119.4054) (end 93.40134 118.618) (width 0.25) (layer F.Cu) (net 21) (tstamp 56F1E165)) + (segment (start 91.8134 119.4054) (end 92.5576 119.4054) (width 0.4) (layer F.Cu) (net 21)) + (segment (start 91.8134 121.9454) (end 92.96954 121.9454) (width 0.25) (layer F.Cu) (net 22)) + (segment (start 107.74218 103.22052) (end 108.60052 103.22052) (width 0.25) (layer F.Cu) (net 22) (tstamp 56F1E197)) + (segment (start 107.12242 102.60076) (end 107.74218 103.22052) (width 0.25) (layer F.Cu) (net 22) (tstamp 56F1E196)) + (segment (start 105.20472 102.60076) (end 107.12242 102.60076) (width 0.25) (layer F.Cu) (net 22) (tstamp 56F1E195)) + (segment (start 104.88214 102.92334) (end 105.20472 102.60076) (width 0.25) (layer F.Cu) (net 22) (tstamp 56F1E193)) + (segment (start 104.88214 103.69804) (end 104.88214 102.92334) (width 0.25) (layer F.Cu) (net 22) (tstamp 56F1E192)) + (segment (start 104.51892 104.06126) (end 104.88214 103.69804) (width 0.25) (layer F.Cu) (net 22) (tstamp 56F1E191)) + (via (at 104.51892 104.06126) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 22)) + (segment (start 102.39548 104.06126) (end 104.51892 104.06126) (width 0.25) (layer B.Cu) (net 22) (tstamp 56F1E18E)) + (segment (start 100.64796 105.80878) (end 102.39548 104.06126) (width 0.25) (layer B.Cu) (net 22) (tstamp 56F1E18C)) + (segment (start 100.64796 108.5977) (end 100.64796 105.80878) (width 0.25) (layer B.Cu) (net 22) (tstamp 56F1E18A)) + (segment (start 94.32336 114.9223) (end 100.64796 108.5977) (width 0.25) (layer B.Cu) (net 22) (tstamp 56F1E188)) + (segment (start 94.32336 120.59158) (end 94.32336 114.9223) (width 0.25) (layer B.Cu) (net 22) (tstamp 56F1E187)) + (segment (start 93.50802 121.40692) (end 94.32336 120.59158) (width 0.25) (layer B.Cu) (net 22) (tstamp 56F1E186)) + (via (at 93.50802 121.40692) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 22)) + (segment (start 92.96954 121.9454) (end 93.50802 121.40692) (width 0.25) (layer F.Cu) (net 22) (tstamp 56F1E184)) + (segment (start 108.60052 103.22052) (end 108.72 103.34) (width 0.25) (layer F.Cu) (net 22) (tstamp 56F1E199)) + (segment (start 108.6945 103.3145) (end 108.72 103.34) (width 0.4) (layer F.Cu) (net 22) (tstamp 56F1D8FA)) + (segment (start 104.47 98.29) (end 104.47 99.898) (width 0.4) (layer F.Cu) (net 25)) + (segment (start 106.4255 100.14) (end 108.72 100.14) (width 0.4) (layer F.Cu) (net 25) (tstamp 56F1D1CC)) + (segment (start 106.172 100.3935) (end 106.4255 100.14) (width 0.4) (layer F.Cu) (net 25) (tstamp 56F1D1CB)) + (segment (start 104.9655 100.3935) (end 106.172 100.3935) (width 0.4) (layer F.Cu) (net 25) (tstamp 56F1D1CA)) + (segment (start 104.47 99.898) (end 104.9655 100.3935) (width 0.4) (layer F.Cu) (net 25) (tstamp 56F1D1C9)) + (segment (start 109.4105 98.4885) (end 109.4105 98.806) (width 0.25) (layer F.Cu) (net 26)) + (segment (start 107.767 99.187) (end 106.87 98.29) (width 0.25) (layer F.Cu) (net 26) (tstamp 56F1D049)) + (segment (start 109.0295 99.187) (end 107.767 99.187) (width 0.25) (layer F.Cu) (net 26) (tstamp 56F1D048)) + (segment (start 109.4105 98.806) (end 109.0295 99.187) (width 0.25) (layer F.Cu) (net 26) (tstamp 56F1D047)) + (segment (start 108.1405 96.4565) (end 103.5685 96.4565) (width 0.25) (layer F.Cu) (net 29)) + (segment (start 102.87 97.155) (end 102.87 98.29) (width 0.25) (layer F.Cu) (net 29) (tstamp 56F1D034)) + (segment (start 103.5685 96.4565) (end 102.87 97.155) (width 0.25) (layer F.Cu) (net 29) (tstamp 56F1D033)) + (segment (start 95.189 98.936) (end 95.189 100.142) (width 0.635) (layer F.Cu) (net 34)) + (segment (start 95.987 100.94) (end 97.02 100.94) (width 0.635) (layer F.Cu) (net 34) (tstamp 56F1CCF0)) + (segment (start 95.189 100.142) (end 95.987 100.94) (width 0.635) (layer F.Cu) (net 34) (tstamp 56F1CCEF)) + (segment (start 111.34046 101.2603) (end 110.5406 101.2603) (width 0.4) (layer F.Cu) (net 36)) + (segment (start 99.2406 102.54) (end 97.02 102.54) (width 0.4) (layer F.Cu) (net 36) (tstamp 56F1DDB1)) + (segment (start 99.6853 102.0953) (end 99.2406 102.54) (width 0.4) (layer F.Cu) (net 36) (tstamp 56F1DDB0)) + (via (at 99.6853 102.0953) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 36)) + (segment (start 99.6853 101.831702) (end 99.6853 102.0953) (width 0.4) (layer B.Cu) (net 36) (tstamp 56F1DDAE)) + (segment (start 100.2949 101.222102) (end 99.6853 101.831702) (width 0.4) (layer B.Cu) (net 36) (tstamp 56F1DDAD)) + (segment (start 109.708702 101.222102) (end 100.2949 101.222102) (width 0.4) (layer B.Cu) (net 36) (tstamp 56F1DDAC)) + (segment (start 110.0612 101.5746) (end 109.708702 101.222102) (width 0.4) (layer B.Cu) (net 36) (tstamp 56F1DDAB)) + (via (at 110.0612 101.5746) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 36)) + (segment (start 110.2263 101.5746) (end 110.0612 101.5746) (width 0.4) (layer F.Cu) (net 36) (tstamp 56F1DDA9)) + (segment (start 110.5406 101.2603) (end 110.2263 101.5746) (width 0.4) (layer F.Cu) (net 36) (tstamp 56F1DDA8)) + (segment (start 110.2127 100.6103) (end 111.34046 100.6103) (width 0.4) (layer F.Cu) (net 37) (tstamp 56F1DD9A)) + (segment (start 110.2009 100.6221) (end 110.2127 100.6103) (width 0.4) (layer F.Cu) (net 37) (tstamp 56F1DD99)) + (via (at 110.2009 100.6221) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 37)) + (segment (start 99.8631 100.6221) (end 110.2009 100.6221) (width 0.4) (layer B.Cu) (net 37) (tstamp 56F1DD97)) + (segment (start 98.8852 101.6) (end 99.8631 100.6221) (width 0.4) (layer B.Cu) (net 37) (tstamp 56F1DD96)) + (segment (start 98.8852 102.9462) (end 98.8852 101.6) (width 0.4) (layer B.Cu) (net 37) (tstamp 56F1DD95)) + (segment (start 98.5804 103.251) (end 98.8852 102.9462) (width 0.4) (layer B.Cu) (net 37) (tstamp 56F1DD94)) + (via (at 98.5804 103.251) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 37)) + (segment (start 98.4914 103.34) (end 98.5804 103.251) (width 0.4) (layer F.Cu) (net 37) (tstamp 56F1DD92)) + (segment (start 97.02 103.34) (end 98.4914 103.34) (width 0.4) (layer F.Cu) (net 37)) + (segment (start 84.328 107.43) (end 86.1702 107.43) (width 0.25) (layer F.Cu) (net 38)) + (segment (start 95.631 104.14) (end 97.02 104.14) (width 0.25) (layer F.Cu) (net 38) (tstamp 57319293)) + (segment (start 95.5802 104.1908) (end 95.631 104.14) (width 0.25) (layer F.Cu) (net 38) (tstamp 57319292)) + (via (at 95.5802 104.1908) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 38)) + (segment (start 94.8182 104.1908) (end 95.5802 104.1908) (width 0.25) (layer B.Cu) (net 38) (tstamp 57319290)) + (segment (start 94.5134 104.4956) (end 94.8182 104.1908) (width 0.25) (layer B.Cu) (net 38) (tstamp 5731928F)) + (segment (start 94.5134 105.1306) (end 94.5134 104.4956) (width 0.25) (layer B.Cu) (net 38) (tstamp 5731928E)) + (segment (start 95.0468 105.664) (end 94.5134 105.1306) (width 0.25) (layer B.Cu) (net 38) (tstamp 57319289)) + (segment (start 95.0468 107.830366) (end 95.0468 105.664) (width 0.25) (layer B.Cu) (net 38) (tstamp 57319288)) + (segment (start 94.393766 108.4834) (end 95.0468 107.830366) (width 0.25) (layer B.Cu) (net 38) (tstamp 57319287)) + (segment (start 92.0242 108.4834) (end 94.393766 108.4834) (width 0.25) (layer B.Cu) (net 38) (tstamp 57319286)) + (segment (start 91.8718 108.6358) (end 92.0242 108.4834) (width 0.25) (layer B.Cu) (net 38) (tstamp 57319285)) + (via (at 91.8718 108.6358) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 38)) + (segment (start 87.376 108.6358) (end 91.8718 108.6358) (width 0.25) (layer F.Cu) (net 38) (tstamp 57319280)) + (segment (start 86.1702 107.43) (end 87.376 108.6358) (width 0.25) (layer F.Cu) (net 38) (tstamp 5731927E)) + (segment (start 84.328 109.97) (end 91.0964 109.97) (width 0.25) (layer F.Cu) (net 39)) + (segment (start 95.6692 104.94) (end 97.02 104.94) (width 0.25) (layer F.Cu) (net 39) (tstamp 5731927B)) + (segment (start 95.5294 105.0798) (end 95.6692 104.94) (width 0.25) (layer F.Cu) (net 39) (tstamp 5731927A)) + (via (at 95.5294 105.0798) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 39)) + (segment (start 95.5294 105.5116) (end 95.5294 105.0798) (width 0.25) (layer B.Cu) (net 39) (tstamp 57319278)) + (segment (start 95.829698 105.811898) (end 95.5294 105.5116) (width 0.25) (layer B.Cu) (net 39) (tstamp 57319277)) + (segment (start 95.829698 107.683866) (end 95.829698 105.811898) (width 0.25) (layer B.Cu) (net 39) (tstamp 57319271)) + (segment (start 94.191964 109.3216) (end 95.829698 107.683866) (width 0.25) (layer B.Cu) (net 39) (tstamp 5731926A)) + (segment (start 91.7448 109.3216) (end 94.191964 109.3216) (width 0.25) (layer B.Cu) (net 39) (tstamp 57319269)) + (segment (start 91.3892 109.6772) (end 91.7448 109.3216) (width 0.25) (layer B.Cu) (net 39) (tstamp 57319268)) + (via (at 91.3892 109.6772) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 39)) + (segment (start 91.0964 109.97) (end 91.3892 109.6772) (width 0.25) (layer F.Cu) (net 39) (tstamp 57319264)) + (segment (start 95.9646 107.34) (end 97.02 107.34) (width 0.25) (layer F.Cu) (net 40) (tstamp 573189F7)) + (segment (start 95.8626 107.442) (end 95.9646 107.34) (width 0.25) (layer F.Cu) (net 40) (tstamp 573189F6)) + (segment (start 95.8626 108.1532) (end 95.8626 107.442) (width 0.25) (layer F.Cu) (net 40) (tstamp 573189F5)) + (segment (start 95.634 108.3818) (end 95.8626 108.1532) (width 0.25) (layer F.Cu) (net 40) (tstamp 573189F4)) + (segment (start 93.5766 108.3818) (end 95.634 108.3818) (width 0.25) (layer F.Cu) (net 40) (tstamp 573189F2)) + (segment (start 91.3922 110.5662) (end 93.5766 108.3818) (width 0.25) (layer F.Cu) (net 40) (tstamp 573189F0)) + (segment (start 86.5408 110.5662) (end 91.3922 110.5662) (width 0.25) (layer F.Cu) (net 40) (tstamp 573189EE)) + (segment (start 84.597 112.51) (end 86.5408 110.5662) (width 0.25) (layer F.Cu) (net 40) (tstamp 573189ED)) + (segment (start 84.328 112.51) (end 84.597 112.51) (width 0.25) (layer F.Cu) (net 40)) + (segment (start 84.328 112.51) (end 84.328 112.452002) (width 0.25) (layer F.Cu) (net 40)) + (segment (start 86.8336 115.05) (end 84.328 115.05) (width 0.25) (layer F.Cu) (net 41) (tstamp 57318A0E)) + (segment (start 86.871 115.0874) (end 86.8336 115.05) (width 0.25) (layer F.Cu) (net 41) (tstamp 57318A0D)) + (via (at 86.871 115.0874) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 41)) + (segment (start 88.8776 115.0874) (end 86.871 115.0874) (width 0.25) (layer B.Cu) (net 41) (tstamp 57318A0A)) + (segment (start 93.7798 110.1852) (end 88.8776 115.0874) (width 0.25) (layer B.Cu) (net 41) (tstamp 57318A08)) + (segment (start 95.833262 110.1852) (end 93.7798 110.1852) (width 0.25) (layer B.Cu) (net 41) (tstamp 57318A07)) + (segment (start 96.254331 109.764131) (end 95.833262 110.1852) (width 0.25) (layer B.Cu) (net 41) (tstamp 57318A06)) + (segment (start 96.254331 109.488669) (end 96.254331 109.764131) (width 0.25) (layer B.Cu) (net 41) (tstamp 57318A05)) + (segment (start 96.5992 109.1438) (end 96.254331 109.488669) (width 0.25) (layer B.Cu) (net 41) (tstamp 57318A04)) + (via (at 96.5992 109.1438) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 41)) + (segment (start 97.02 108.723) (end 96.5992 109.1438) (width 0.25) (layer F.Cu) (net 41) (tstamp 57318A02)) + (segment (start 97.02 108.14) (end 97.02 108.723) (width 0.25) (layer F.Cu) (net 41)) + (segment (start 111.255 124.3076) (end 110.8456 124.3076) (width 0.25) (layer B.Cu) (net 42)) + (segment (start 110.8456 124.3076) (end 109.093 122.555) (width 0.25) (layer B.Cu) (net 42) (tstamp 57563857)) + (segment (start 98.164398 109.99) (end 98.87 109.99) (width 0.25) (layer F.Cu) (net 42) (tstamp 57563873)) + (segment (start 97.7392 110.415198) (end 98.164398 109.99) (width 0.25) (layer F.Cu) (net 42) (tstamp 57563872)) + (segment (start 97.7392 111.2774) (end 97.7392 110.415198) (width 0.25) (layer F.Cu) (net 42) (tstamp 57563871)) + (segment (start 98.298 111.8362) (end 97.7392 111.2774) (width 0.25) (layer F.Cu) (net 42) (tstamp 57563870)) + (segment (start 98.5266 111.8362) (end 98.298 111.8362) (width 0.25) (layer F.Cu) (net 42) (tstamp 5756386F)) + (segment (start 98.5774 111.7854) (end 98.5266 111.8362) (width 0.25) (layer F.Cu) (net 42) (tstamp 5756386E)) + (via (at 98.5774 111.7854) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 42)) + (segment (start 99.7204 110.6424) (end 98.5774 111.7854) (width 0.25) (layer B.Cu) (net 42) (tstamp 5756386B)) + (segment (start 107.0102 110.6424) (end 99.7204 110.6424) (width 0.25) (layer B.Cu) (net 42) (tstamp 57563865)) + (segment (start 108.0516 111.6838) (end 107.0102 110.6424) (width 0.25) (layer B.Cu) (net 42) (tstamp 57563864)) + (via (at 108.0516 111.6838) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 42)) + (segment (start 108.839 112.4712) (end 108.0516 111.6838) (width 0.25) (layer F.Cu) (net 42) (tstamp 57563861)) + (segment (start 108.839 114.3254) (end 108.839 112.4712) (width 0.25) (layer F.Cu) (net 42) (tstamp 57563860)) + (segment (start 109.474 114.9604) (end 108.839 114.3254) (width 0.25) (layer F.Cu) (net 42) (tstamp 5756385F)) + (via (at 109.474 114.9604) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 42)) + (segment (start 109.093 115.3414) (end 109.474 114.9604) (width 0.25) (layer B.Cu) (net 42) (tstamp 5756385D)) + (segment (start 109.093 122.555) (end 109.093 115.3414) (width 0.25) (layer B.Cu) (net 42) (tstamp 57563858)) + (segment (start 111.255 124.3076) (end 110.8654 124.3076) (width 0.25) (layer B.Cu) (net 42)) + (segment (start 111.255 121.7676) (end 110.7694 121.7676) (width 0.25) (layer F.Cu) (net 43)) + (segment (start 111.255 121.7676) (end 111.255 121.2372) (width 0.25) (layer B.Cu) (net 43)) + (segment (start 111.255 121.2372) (end 109.5502 119.5324) (width 0.25) (layer B.Cu) (net 43) (tstamp 57563826)) + (segment (start 99.67 108.6862) (end 99.67 109.99) (width 0.25) (layer F.Cu) (net 43) (tstamp 5756383D)) + (segment (start 100.1268 108.2294) (end 99.67 108.6862) (width 0.25) (layer F.Cu) (net 43) (tstamp 5756383C)) + (segment (start 101.1682 108.2294) (end 100.1268 108.2294) (width 0.25) (layer F.Cu) (net 43) (tstamp 5756383B)) + (segment (start 101.2952 108.1024) (end 101.1682 108.2294) (width 0.25) (layer F.Cu) (net 43) (tstamp 5756383A)) + (via (at 101.2952 108.1024) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 43)) + (segment (start 103.3526 110.1598) (end 101.2952 108.1024) (width 0.25) (layer B.Cu) (net 43) (tstamp 57563836)) + (segment (start 107.5944 110.1598) (end 103.3526 110.1598) (width 0.25) (layer B.Cu) (net 43) (tstamp 57563835)) + (segment (start 108.9406 111.506) (end 107.5944 110.1598) (width 0.25) (layer B.Cu) (net 43) (tstamp 57563834)) + (via (at 108.9406 111.506) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 43)) + (segment (start 109.4994 112.0648) (end 108.9406 111.506) (width 0.25) (layer F.Cu) (net 43) (tstamp 57563831)) + (segment (start 109.4994 113.8936) (end 109.4994 112.0648) (width 0.25) (layer F.Cu) (net 43) (tstamp 5756382F)) + (segment (start 111.1504 115.5446) (end 109.4994 113.8936) (width 0.25) (layer F.Cu) (net 43) (tstamp 5756382E)) + (segment (start 111.1504 116.078) (end 111.1504 115.5446) (width 0.25) (layer F.Cu) (net 43) (tstamp 5756382D)) + (segment (start 110.8202 116.4082) (end 111.1504 116.078) (width 0.25) (layer F.Cu) (net 43) (tstamp 5756382C)) + (via (at 110.8202 116.4082) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 43)) + (segment (start 110.2614 116.4082) (end 110.8202 116.4082) (width 0.25) (layer B.Cu) (net 43) (tstamp 5756382A)) + (segment (start 109.5502 117.1194) (end 110.2614 116.4082) (width 0.25) (layer B.Cu) (net 43) (tstamp 57563829)) + (segment (start 109.5502 119.5324) (end 109.5502 117.1194) (width 0.25) (layer B.Cu) (net 43) (tstamp 57563827)) + (segment (start 97.2134 123.2154) (end 96.2817 123.2154) (width 0.25) (layer F.Cu) (net 47)) + (segment (start 105.27 110.8997) (end 105.27 109.99) (width 0.25) (layer F.Cu) (net 47) (tstamp 56F1DF9A)) + (segment (start 104.8415 111.3282) (end 105.27 110.8997) (width 0.25) (layer F.Cu) (net 47) (tstamp 56F1DF99)) + (segment (start 104.6129 111.3282) (end 104.8415 111.3282) (width 0.25) (layer F.Cu) (net 47) (tstamp 56F1DF98)) + (segment (start 104.397 111.5441) (end 104.6129 111.3282) (width 0.25) (layer F.Cu) (net 47) (tstamp 56F1DF97)) + (via (at 104.397 111.5441) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 47)) + (segment (start 99.825 111.5441) (end 104.397 111.5441) (width 0.25) (layer B.Cu) (net 47) (tstamp 56F1DF94)) + (segment (start 95.1895 116.1796) (end 99.825 111.5441) (width 0.25) (layer B.Cu) (net 47) (tstamp 56F1DF86)) + (segment (start 95.1895 120.9548) (end 95.1895 116.1796) (width 0.25) (layer B.Cu) (net 47) (tstamp 56F1DF7C)) + (segment (start 95.6975 121.4628) (end 95.1895 120.9548) (width 0.25) (layer B.Cu) (net 47) (tstamp 56F1DF7B)) + (via (at 95.6975 121.4628) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 47)) + (segment (start 95.6975 122.6312) (end 95.6975 121.4628) (width 0.25) (layer F.Cu) (net 47) (tstamp 56F1DF79)) + (segment (start 96.2817 123.2154) (end 95.6975 122.6312) (width 0.25) (layer F.Cu) (net 47) (tstamp 56F1DF78)) + (segment (start 105.283 110.003) (end 105.27 109.99) (width 0.4) (layer F.Cu) (net 47) (tstamp 56F1DA92)) + (segment (start 96.9975 122.9995) (end 97.2134 123.2154) (width 0.4) (layer F.Cu) (net 47) (tstamp 56F1D962)) + (segment (start 97.2134 124.4854) (end 98.4116 124.4854) (width 0.635) (layer F.Cu) (net 47)) + (segment (start 98.4116 124.4854) (end 98.818 124.079) (width 0.635) (layer F.Cu) (net 47) (tstamp 56EB5D70)) + (segment (start 97.2134 123.2154) (end 97.2134 124.4854) (width 0.635) (layer F.Cu) (net 47)) + (segment (start 100.6475 120.0665) (end 101.5485 120.0665) (width 0.25) (layer F.Cu) (net 49)) + (segment (start 108.1024 114.3) (end 107.176 114.3) (width 0.25) (layer F.Cu) (net 49) (tstamp 5756388D)) + (segment (start 108.3818 114.5794) (end 108.1024 114.3) (width 0.25) (layer F.Cu) (net 49) (tstamp 5756388C)) + (segment (start 108.3818 114.8588) (end 108.3818 114.5794) (width 0.25) (layer F.Cu) (net 49) (tstamp 5756388B)) + (segment (start 108.4072 114.8842) (end 108.3818 114.8588) (width 0.25) (layer F.Cu) (net 49) (tstamp 5756388A)) + (via (at 108.4072 114.8842) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 49)) + (segment (start 108.0262 115.2652) (end 108.4072 114.8842) (width 0.25) (layer B.Cu) (net 49) (tstamp 57563883)) + (segment (start 102.7684 115.2652) (end 108.0262 115.2652) (width 0.25) (layer B.Cu) (net 49) (tstamp 57563882)) + (segment (start 101.9556 116.078) (end 102.7684 115.2652) (width 0.25) (layer B.Cu) (net 49) (tstamp 57563881)) + (segment (start 101.9556 119.6594) (end 101.9556 116.078) (width 0.25) (layer B.Cu) (net 49) (tstamp 57563880)) + (segment (start 101.727 119.888) (end 101.9556 119.6594) (width 0.25) (layer B.Cu) (net 49) (tstamp 5756387F)) + (via (at 101.727 119.888) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 49)) + (segment (start 101.5485 120.0665) (end 101.727 119.888) (width 0.25) (layer F.Cu) (net 49) (tstamp 5756387D)) + (segment (start 107.176 112.903) (end 107.176 110.296) (width 0.4) (layer F.Cu) (net 49)) + (segment (start 107.176 110.296) (end 106.87 109.99) (width 0.4) (layer F.Cu) (net 49) (tstamp 56F1D9FF)) + (segment (start 107.176 112.903) (end 107.176 114.3) (width 0.635) (layer F.Cu) (net 49)) + (segment (start 100.6475 121.17) (end 100.6475 120.0665) (width 0.635) (layer F.Cu) (net 49)) + (segment (start 82.55 115.05) (end 82.3378 115.05) (width 0.25) (layer F.Cu) (net 51)) + (segment (start 82.3378 115.05) (end 80.4448 113.157) (width 0.25) (layer F.Cu) (net 51) (tstamp 56F46D23)) + (segment (start 82.55 115.05) (end 82.1824 115.05) (width 0.25) (layer F.Cu) (net 51)) + (segment (start 82.55 112.51) (end 82.3378 112.51) (width 0.25) (layer F.Cu) (net 52)) + (segment (start 82.3378 112.51) (end 80.4448 110.617) (width 0.25) (layer F.Cu) (net 52) (tstamp 56F46D26)) + (segment (start 82.55 112.51) (end 82.3856 112.51) (width 0.25) (layer F.Cu) (net 52)) + (segment (start 82.55 109.97) (end 82.3378 109.97) (width 0.25) (layer F.Cu) (net 53)) + (segment (start 82.3378 109.97) (end 80.4448 108.077) (width 0.25) (layer F.Cu) (net 53) (tstamp 56F46D29)) + (segment (start 82.55 109.97) (end 82.3094 109.97) (width 0.25) (layer F.Cu) (net 53)) + (segment (start 82.55 107.43) (end 82.3378 107.43) (width 0.25) (layer F.Cu) (net 54)) + (segment (start 82.3378 107.43) (end 80.4448 105.537) (width 0.25) (layer F.Cu) (net 54) (tstamp 56F46D2C)) + (segment (start 113.7061 118.2243) (end 113.7061 112.37976) (width 0.25) (layer B.Cu) (net 55)) + (segment (start 108.7755 96.09628) (end 108.7755 96.4565) (width 0.25) (layer F.Cu) (net 55) (tstamp 56F1E373)) + (segment (start 109.0833 95.78848) (end 108.7755 96.09628) (width 0.25) (layer F.Cu) (net 55) (tstamp 56F1E372)) + (segment (start 109.78434 95.78848) (end 109.0833 95.78848) (width 0.25) (layer F.Cu) (net 55) (tstamp 56F1E371)) + (segment (start 109.98246 95.9866) (end 109.78434 95.78848) (width 0.25) (layer F.Cu) (net 55) (tstamp 56F1E370)) + (segment (start 109.98246 96.03232) (end 109.98246 95.9866) (width 0.25) (layer F.Cu) (net 55) (tstamp 56F1E36F)) + (segment (start 110.3787 96.42856) (end 109.98246 96.03232) (width 0.25) (layer F.Cu) (net 55) (tstamp 56F1E36E)) + (via (at 110.3787 96.42856) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 55)) + (segment (start 112.11606 96.42856) (end 110.3787 96.42856) (width 0.25) (layer B.Cu) (net 55) (tstamp 56F1E368)) + (segment (start 112.764182 97.076682) (end 112.11606 96.42856) (width 0.25) (layer B.Cu) (net 55) (tstamp 56F1E367)) + (segment (start 112.764182 98.204442) (end 112.764182 97.076682) (width 0.25) (layer B.Cu) (net 55) (tstamp 56F1E366)) + (segment (start 116.00226 101.44252) (end 112.764182 98.204442) (width 0.25) (layer B.Cu) (net 55) (tstamp 56F1E35F)) + (segment (start 116.00226 110.0836) (end 116.00226 101.44252) (width 0.25) (layer B.Cu) (net 55) (tstamp 56F1E35E)) + (segment (start 113.7061 112.37976) (end 116.00226 110.0836) (width 0.25) (layer B.Cu) (net 55) (tstamp 56F1E35C)) + (segment (start 111.1661 118.2243) (end 113.1346 112.141) (width 0.25) (layer B.Cu) (net 56)) + (segment (start 108.7755 98.108898) (end 108.7755 98.4885) (width 0.25) (layer F.Cu) (net 56) (tstamp 56F1E325)) + (segment (start 109.129958 97.75444) (end 108.7755 98.108898) (width 0.25) (layer F.Cu) (net 56) (tstamp 56F1E322)) + (segment (start 109.81482 97.75444) (end 109.129958 97.75444) (width 0.25) (layer F.Cu) (net 56) (tstamp 56F1E321)) + (segment (start 110.13486 97.4344) (end 109.81482 97.75444) (width 0.25) (layer F.Cu) (net 56) (tstamp 56F1E320)) + (via (at 110.13486 97.4344) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 56)) + (segment (start 110.51586 97.0534) (end 110.13486 97.4344) (width 0.25) (layer B.Cu) (net 56) (tstamp 56F1E31C)) + (segment (start 111.87222 97.0534) (end 110.51586 97.0534) (width 0.25) (layer B.Cu) (net 56) (tstamp 56F1E31B)) + (segment (start 112.31418 97.49536) (end 111.87222 97.0534) (width 0.25) (layer B.Cu) (net 56) (tstamp 56F1E31A)) + (segment (start 112.31418 98.66884) (end 112.31418 97.49536) (width 0.25) (layer B.Cu) (net 56) (tstamp 56F1E318)) + (segment (start 115.34694 101.7016) (end 112.31418 98.66884) (width 0.25) (layer B.Cu) (net 56) (tstamp 56F1E316)) + (segment (start 115.34694 109.88548) (end 115.34694 101.7016) (width 0.25) (layer B.Cu) (net 56) (tstamp 56F1E313)) + (segment (start 113.1346 112.141) (end 115.34694 109.88548) (width 0.25) (layer B.Cu) (net 56) (tstamp 56F1E30F)) + (segment (start 99.06 122.67) (end 100.6475 122.67) (width 0.635) (layer F.Cu) (net 57)) + (segment (start 97.2134 121.9454) (end 98.3354 121.9454) (width 0.635) (layer F.Cu) (net 57)) + (segment (start 98.3354 121.9454) (end 99.06 122.67) (width 0.635) (layer F.Cu) (net 57) (tstamp 56EB5D7A)) + (segment (start 97.2134 119.4054) (end 98.2211 119.4054) (width 0.635) (layer F.Cu) (net 58)) + (segment (start 98.2211 119.4054) (end 99.06 118.5665) (width 0.635) (layer F.Cu) (net 58) (tstamp 56EB5D95)) + (segment (start 100.6475 118.5665) (end 99.06 118.5665) (width 0.635) (layer F.Cu) (net 58)) + (segment (start 82.55 105.93) (end 84.328 105.93) (width 0.25) (layer F.Cu) (net 59)) + (segment (start 82.55 108.47) (end 84.328 108.47) (width 0.25) (layer F.Cu) (net 60)) + (segment (start 82.55 111.01) (end 84.328 111.01) (width 0.25) (layer F.Cu) (net 61)) + (segment (start 82.55 113.55) (end 84.328 113.55) (width 0.25) (layer F.Cu) (net 62)) + (segment (start 89.3953 123.5703) (end 90.4755 123.5703) (width 0.25) (layer F.Cu) (net 63)) + (segment (start 90.8304 123.2154) (end 91.8134 123.2154) (width 0.25) (layer F.Cu) (net 63) (tstamp 56EBF44F)) + (segment (start 90.4755 123.5703) (end 90.8304 123.2154) (width 0.25) (layer F.Cu) (net 63) (tstamp 56EBF44E)) + (segment (start 87.8713 123.5703) (end 87.8713 121.9207) (width 0.25) (layer F.Cu) (net 63)) + (segment (start 87.8713 121.9207) (end 87.872 121.92) (width 0.25) (layer F.Cu) (net 63) (tstamp 56EBF35E)) + (segment (start 87.8713 123.5703) (end 89.3953 123.5703) (width 0.25) (layer F.Cu) (net 63)) + (segment (start 89.3953 125.0703) (end 89.6613 125.0703) (width 0.25) (layer F.Cu) (net 64)) + (segment (start 89.6613 125.0703) (end 90.4748 124.2568) (width 0.25) (layer F.Cu) (net 64) (tstamp 56EBF444)) + (segment (start 90.2208 122.3264) (end 90.2208 121.7676) (width 0.25) (layer F.Cu) (net 64) (tstamp 56EBF44A)) + (segment (start 90.5002 122.6058) (end 90.2208 122.3264) (width 0.25) (layer F.Cu) (net 64) (tstamp 56EBF449)) + (via (at 90.5002 122.6058) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 64)) + (segment (start 90.5002 124.2314) (end 90.5002 122.6058) (width 0.25) (layer B.Cu) (net 64) (tstamp 56EBF447)) + (segment (start 90.4748 124.2568) (end 90.5002 124.2314) (width 0.25) (layer B.Cu) (net 64) (tstamp 56EBF446)) + (via (at 90.4748 124.2568) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 64)) + (segment (start 90.2208 121.7676) (end 90.1954 121.7422) (width 0.25) (layer F.Cu) (net 64) (tstamp 56EBF44B)) + (segment (start 87.8713 125.0703) (end 89.3953 125.0703) (width 0.25) (layer F.Cu) (net 64)) + (segment (start 91.8134 118.1354) (end 90.2716 118.1354) (width 0.25) (layer F.Cu) (net 65)) + (segment (start 90.1072 117.971) (end 89.281 117.971) (width 0.25) (layer F.Cu) (net 65) (tstamp 56EBF470)) + (segment (start 90.2716 118.1354) (end 90.1072 117.971) (width 0.25) (layer F.Cu) (net 65) (tstamp 56EBF46F)) + (segment (start 87.872 119.634) (end 87.872 118.213) (width 0.25) (layer F.Cu) (net 65)) + (segment (start 87.872 118.213) (end 87.63 117.971) (width 0.25) (layer F.Cu) (net 65) (tstamp 56EBF339)) + (segment (start 87.63 117.971) (end 89.281 117.971) (width 0.25) (layer F.Cu) (net 65)) + (segment (start 89.281 116.471) (end 90.3344 116.471) (width 0.25) (layer F.Cu) (net 66)) + (segment (start 88.9254 118.9228) (end 88.9254 119.7102) (width 0.25) (layer F.Cu) (net 66) (tstamp 56EBF46B)) + (segment (start 88.9762 118.872) (end 88.9254 118.9228) (width 0.25) (layer F.Cu) (net 66) (tstamp 56EBF46A)) + (via (at 88.9762 118.872) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 66)) + (segment (start 89.1032 118.745) (end 88.9762 118.872) (width 0.25) (layer B.Cu) (net 66) (tstamp 56EBF468)) + (segment (start 89.4334 118.745) (end 89.1032 118.745) (width 0.25) (layer B.Cu) (net 66) (tstamp 56EBF467)) + (segment (start 90.5256 117.6528) (end 89.4334 118.745) (width 0.25) (layer B.Cu) (net 66) (tstamp 56EBF466)) + (segment (start 90.5256 116.6622) (end 90.5256 117.6528) (width 0.25) (layer B.Cu) (net 66) (tstamp 56EBF465)) + (segment (start 90.4494 116.586) (end 90.5256 116.6622) (width 0.25) (layer B.Cu) (net 66) (tstamp 56EBF464)) + (via (at 90.4494 116.586) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 66)) + (segment (start 90.3344 116.471) (end 90.4494 116.586) (width 0.25) (layer F.Cu) (net 66) (tstamp 56EBF462)) + (segment (start 87.63 116.471) (end 89.281 116.471) (width 0.25) (layer F.Cu) (net 66)) + (segment (start 85.979 116.471) (end 86.1956 116.471) (width 0.25) (layer F.Cu) (net 67)) + (segment (start 86.1956 116.471) (end 86.8172 115.8494) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF473)) + (segment (start 90.805 115.8494) (end 91.8134 116.8578) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF475)) + (segment (start 86.8172 115.8494) (end 90.805 115.8494) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF474)) + (segment (start 91.8134 116.8578) (end 91.8134 116.8654) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF476)) + (segment (start 85.979 116.471) (end 86.0672 116.471) (width 0.25) (layer F.Cu) (net 67)) + (segment (start 86.0672 116.471) (end 86.7918 117.1956) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF32F)) + (segment (start 86.372 119.0124) (end 86.372 119.634) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF334)) + (segment (start 86.5124 118.872) (end 86.372 119.0124) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF333)) + (segment (start 86.5378 118.872) (end 86.5124 118.872) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF332)) + (segment (start 86.7918 118.618) (end 86.5378 118.872) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF331)) + (segment (start 86.7918 117.1956) (end 86.7918 118.618) (width 0.25) (layer F.Cu) (net 67) (tstamp 56EBF330)) + (segment (start 84.455 116.471) (end 85.979 116.471) (width 0.25) (layer F.Cu) (net 67)) + (segment (start 86.233 125.083) (end 86.8814 125.083) (width 0.25) (layer F.Cu) (net 68)) + (segment (start 91.3054 124.9934) (end 91.8134 124.4854) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF43D)) + (segment (start 90.7796 124.9934) (end 91.3054 124.9934) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF43C)) + (segment (start 90.678 125.095) (end 90.7796 124.9934) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF43B)) + (via (at 90.678 125.095) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 68)) + (segment (start 86.9442 125.095) (end 90.678 125.095) (width 0.25) (layer B.Cu) (net 68) (tstamp 56EBF439)) + (segment (start 86.9188 125.1204) (end 86.9442 125.095) (width 0.25) (layer B.Cu) (net 68) (tstamp 56EBF438)) + (via (at 86.9188 125.1204) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 68)) + (segment (start 86.8814 125.083) (end 86.9188 125.1204) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF430)) + (segment (start 86.372 121.92) (end 86.372 122.5162) (width 0.25) (layer F.Cu) (net 68)) + (segment (start 86.233 124.8156) (end 86.233 125.083) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF357)) + (segment (start 86.4362 124.6124) (end 86.233 124.8156) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF356)) + (segment (start 86.614 124.6124) (end 86.4362 124.6124) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF355)) + (segment (start 87.0458 124.1806) (end 86.7918 124.4346) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF354)) + (segment (start 86.7918 124.4346) (end 86.614 124.6124) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF417)) + (segment (start 87.0458 123.19) (end 87.0458 124.1806) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF353)) + (segment (start 86.372 122.5162) (end 87.0458 123.19) (width 0.25) (layer F.Cu) (net 68) (tstamp 56EBF352)) + (segment (start 84.709 125.083) (end 86.233 125.083) (width 0.25) (layer F.Cu) (net 68)) + (segment (start 84.824 119.634) (end 84.824 119.0378) (width 0.25) (layer F.Cu) (net 69)) + (segment (start 84.455 118.6688) (end 84.455 117.971) (width 0.25) (layer F.Cu) (net 69) (tstamp 56EBF32A)) + (segment (start 84.824 119.0378) (end 84.455 118.6688) (width 0.25) (layer F.Cu) (net 69) (tstamp 56EBF329)) + (segment (start 84.824 121.92) (end 84.824 123.468) (width 0.25) (layer F.Cu) (net 70)) + (segment (start 84.824 123.468) (end 84.709 123.583) (width 0.25) (layer F.Cu) (net 70) (tstamp 56EBF347)) + (segment (start 94.8466 110.8942) (end 94.5926 111.1482) (width 0.635) (layer F.Cu) (net 71) (tstamp 573189E8)) + (segment (start 94.8466 110.0836) (end 94.8466 110.8942) (width 0.635) (layer F.Cu) (net 71) (tstamp 573189E7)) + (segment (start 95.5832 109.347) (end 94.8466 110.0836) (width 0.635) (layer F.Cu) (net 71) (tstamp 573189E6)) + (via (at 95.5832 109.347) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 71)) + (segment (start 95.5832 108.839) (end 95.5832 109.347) (width 0.635) (layer B.Cu) (net 71) (tstamp 573189E4)) + (segment (start 96.4722 107.95) (end 95.5832 108.839) (width 0.635) (layer B.Cu) (net 71) (tstamp 573189E3)) + (segment (start 96.4722 103.8098) (end 96.4722 107.95) (width 0.635) (layer B.Cu) (net 71) (tstamp 573189E2)) + (segment (start 95.38 102.7176) (end 96.4722 103.8098) (width 0.635) (layer B.Cu) (net 71) (tstamp 573189E1)) + (via (at 95.38 102.7176) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 71)) + (segment (start 94.6158 101.9534) (end 95.38 102.7176) (width 0.635) (layer F.Cu) (net 71) (tstamp 573189DF)) + (segment (start 93.7036 101.9534) (end 94.6158 101.9534) (width 0.635) (layer F.Cu) (net 71)) + (segment (start 94.5926 111.196002) (end 94.5926 111.1482) (width 0.635) (layer F.Cu) (net 71) (tstamp 573189AC)) + (segment (start 114.04046 104.1103) (end 114.04046 105.12506) (width 0.635) (layer F.Cu) (net 72) (status 400000)) + (segment (start 115.4557 120.2309) (end 109.5135 120.2309) (width 0.635) (layer F.Cu) (net 72) (tstamp 57563C4C) (status 800000)) + (segment (start 115.7986 119.888) (end 115.4557 120.2309) (width 0.635) (layer F.Cu) (net 72) (tstamp 57563C4B)) + (segment (start 115.7986 106.8832) (end 115.7986 119.888) (width 0.635) (layer F.Cu) (net 72) (tstamp 57563C47)) + (segment (start 114.04046 105.12506) (end 115.7986 106.8832) (width 0.635) (layer F.Cu) (net 72) (tstamp 57563C44)) + (segment (start 109.5135 120.2309) (end 109.0944 120.65) (width 0.635) (layer F.Cu) (net 72) (tstamp 57563C4E) (status C00000)) + (segment (start 114.7051 104.1103) (end 114.04046 104.1103) (width 0.25) (layer F.Cu) (net 72) (tstamp 57318D6D)) + (segment (start 114.04046 104.1103) (end 112.34046 104.1103) (width 0.635) (layer B.Cu) (net 72)) + (segment (start 112.34046 104.1103) (end 111.34046 103.1103) (width 0.635) (layer B.Cu) (net 72) (tstamp 56F1E26A)) + (segment (start 114.04046 104.1103) (end 114.04046 97.1103) (width 0.635) (layer F.Cu) (net 72)) + (segment (start 111.34046 98.1103) (end 113.04046 98.1103) (width 0.635) (layer F.Cu) (net 72)) + (segment (start 113.04046 98.1103) (end 114.04046 97.1103) (width 0.635) (layer F.Cu) (net 72) (tstamp 56F1E265)) + (segment (start 111.34046 99.3103) (end 111.34046 98.1103) (width 0.4) (layer F.Cu) (net 72)) + +) diff --git a/PCB/Tinylab_proto1.net b/PCB/Tinylab_proto1.net new file mode 100644 index 00000000..910e3dce --- /dev/null +++ b/PCB/Tinylab_proto1.net @@ -0,0 +1,990 @@ +(export (version D) + (design + (source C:/Users/Esposch/Documents/kicad-repo/Tinylab_proto1/Tinylab_proto1.sch) + (date "07/06/2016 1:14:15 PM") + (tool "Eeschema 4.0.1-stable") + (sheet (number 1) (name /) (tstamps /) + (title_block + (title) + (company) + (rev) + (date) + (source Tinylab_proto1.sch) + (comment (number 1) (value "")) + (comment (number 2) (value "")) + (comment (number 3) (value "")) + (comment (number 4) (value ""))))) + (components + (comp (ref U2) + (value LM324) + (footprint Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm) + (libsource (lib Tinylab_proto1-rescue) (part LM324-RESCUE-Tinylab_proto1)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CA87E2)) + (comp (ref IC1) + (value ATXMEGA16A4U-A) + (footprint Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm) + (libsource (lib atmel) (part ATXMEGA16A4U-A)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CA8F25)) + (comp (ref P2) + (value USB_OTG) + (footprint Connect:USB_Micro-B_WIDE) + (libsource (lib conn) (part USB_OTG)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CA90D2)) + (comp (ref U1) + (value 78L05) + (footprint SMD:SOT-23-3) + (libsource (lib Tinylab_proto1-rescue) (part 78L05-RESCUE-Tinylab_proto1)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CA99FA)) + (comp (ref R1) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAAB95)) + (comp (ref R3) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAABF4)) + (comp (ref R5) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAAC5F)) + (comp (ref R6) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAACD2)) + (comp (ref R4) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAAD11)) + (comp (ref R2) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAAD4C)) + (comp (ref C2) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAB4DE)) + (comp (ref C1) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CAB611)) + (comp (ref C3) + (value C_Small) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB13E1)) + (comp (ref C4) + (value C_Small) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB147C)) + (comp (ref R22) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB4680)) + (comp (ref C13) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB630B)) + (comp (ref R24) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CB9020)) + (comp (ref R11) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBCD2A)) + (comp (ref R7) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBCDA5)) + (comp (ref R13) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE0F4)) + (comp (ref R9) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE16B)) + (comp (ref R14) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE21C)) + (comp (ref R10) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE2C7)) + (comp (ref R12) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE362)) + (comp (ref R8) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBE401)) + (comp (ref P3) + (value DIG_OUT) + (footprint Pin_Headers:Pin_Header_Straight_1x04) + (libsource (lib conn) (part CONN_01X04)) + (sheetpath (names /) (tstamps /)) + (tstamp 55CBF4D5)) + (comp (ref C5) + (value C_Small) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D60181)) + (comp (ref U4) + (value DMN63D8LDW) + (footprint TO_SOT_Packages_SMD:SOT-363) + (libsource (lib ESPO_PART) (part DMN63D8LDW)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D6ACFD)) + (comp (ref P8) + (value DIG_IN) + (footprint Pin_Headers:Pin_Header_Straight_1x02) + (libsource (lib conn) (part CONN_01X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D6DB77)) + (comp (ref F1) + (value F_Small) + (footprint Capacitors_SMD:C_1210) + (libsource (lib device) (part F_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 55D739F3)) + (comp (ref L1) + (value INDUCTOR) + (footprint Inductors:INDUCTOR_V) + (libsource (lib device) (part INDUCTOR)) + (sheetpath (names /) (tstamps /)) + (tstamp 5606EE9E)) + (comp (ref D1) + (value D_Schottky) + (footprint Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10) + (libsource (lib device) (part D_Schottky)) + (sheetpath (names /) (tstamps /)) + (tstamp 5606FDB4)) + (comp (ref C9) + (value CP1) + (footprint Capacitors_SMD:c_elec_4x5.3) + (libsource (lib device) (part CP1)) + (sheetpath (names /) (tstamps /)) + (tstamp 560719D9)) + (comp (ref C10) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 56071A50)) + (comp (ref C16) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 5607355F)) + (comp (ref C15) + (value CP1) + (footprint Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5) + (libsource (lib device) (part CP1)) + (sheetpath (names /) (tstamps /)) + (tstamp 560735FE)) + (comp (ref P4) + (value PDI) + (footprint Pin_Headers:Pin_Header_Straight_2x02) + (libsource (lib conn) (part CONN_02X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 56069A87)) + (comp (ref Q1) + (value Q_NMOS_GSD) + (footprint SMD:SOT-23-3) + (libsource (lib device) (part Q_NMOS_GSD)) + (sheetpath (names /) (tstamps /)) + (tstamp 5606F6D4)) + (comp (ref R23) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 566DE721)) + (comp (ref R25) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 566DE7E8)) + (comp (ref C14) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C_Small)) + (sheetpath (names /) (tstamps /)) + (tstamp 566DF655)) + (comp (ref P6) + (value DAC_OUT) + (footprint Pin_Headers:Pin_Header_Straight_1x04) + (libsource (lib conn) (part CONN_01X04)) + (sheetpath (names /) (tstamps /)) + (tstamp 566DF832)) + (comp (ref R26) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 566E5C29)) + (comp (ref R27) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 566E5CBE)) + (comp (ref C6) + (value CP1) + (footprint Capacitors_SMD:c_elec_5x5.3) + (libsource (lib device) (part CP1)) + (sheetpath (names /) (tstamps /)) + (tstamp 566F5A75)) + (comp (ref R19) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AECD86)) + (comp (ref C11) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 5608B4BE)) + (comp (ref C8) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AF91A3)) + (comp (ref R17) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AFE83E)) + (comp (ref R18) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56AFE8F3)) + (comp (ref U3) + (value DMN63D8LDW) + (footprint TO_SOT_Packages_SMD:SOT-363) + (libsource (lib ESPO_PART) (part DMN63D8LDW)) + (sheetpath (names /) (tstamps /)) + (tstamp 56B012DD)) + (comp (ref R20) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56B0C682)) + (comp (ref R15) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56B0C779)) + (comp (ref R16) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56B0C86E)) + (comp (ref L2) + (value INDUCTOR) + (footprint Resistors_SMD:R_1210) + (libsource (lib device) (part INDUCTOR)) + (sheetpath (names /) (tstamps /)) + (tstamp 56E88440)) + (comp (ref L3) + (value INDUCTOR) + (footprint Resistors_SMD:R_1210) + (libsource (lib device) (part INDUCTOR)) + (sheetpath (names /) (tstamps /)) + (tstamp 56E8DA35)) + (comp (ref C7) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 56E8E263)) + (comp (ref R21) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56E9851A)) + (comp (ref R28) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56E985EF)) + (comp (ref R29) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56E9888A)) + (comp (ref R30) + (value R) + (footprint Resistors_SMD:R_0603) + (libsource (lib device) (part R)) + (sheetpath (names /) (tstamps /)) + (tstamp 56E98921)) + (comp (ref P1) + (value SCOPE_IN_CH1) + (footprint Pin_Headers:Pin_Header_Straight_1x02) + (libsource (lib conn) (part CONN_01X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 56EA2C80)) + (comp (ref P9) + (value SCOPE_IN_AC) + (footprint Pin_Headers:Pin_Header_Straight_1x02) + (libsource (lib conn) (part CONN_01X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 56EA2D2D)) + (comp (ref P5) + (value SCOPE_IN_CH2) + (footprint Pin_Headers:Pin_Header_Straight_1x02) + (libsource (lib conn) (part CONN_01X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 56EA3310)) + (comp (ref P10) + (value CONN_01X02) + (footprint Pin_Headers:Pin_Header_Straight_1x02) + (libsource (lib conn) (part CONN_01X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 56F2A840)) + (comp (ref P7) + (value CONN_01X02) + (footprint Pin_Headers:Pin_Header_Straight_1x02) + (libsource (lib conn) (part CONN_01X02)) + (sheetpath (names /) (tstamps /)) + (tstamp 56F2A93D)) + (comp (ref L4) + (value INDUCTOR) + (footprint Resistors_SMD:R_1210) + (libsource (lib device) (part INDUCTOR)) + (sheetpath (names /) (tstamps /)) + (tstamp 573254B0)) + (comp (ref C19) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 575644CB)) + (comp (ref C18) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 57564580)) + (comp (ref C17) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 57564635)) + (comp (ref C12) + (value C) + (footprint Capacitors_SMD:C_0603) + (libsource (lib device) (part C)) + (sheetpath (names /) (tstamps /)) + (tstamp 575646EC))) + (libparts + (libpart (lib Tinylab_proto1-rescue) (part 78L05-RESCUE-Tinylab_proto1) + (fields + (field (name Reference) U) + (field (name Value) 78L05-RESCUE-Tinylab_proto1)) + (pins + (pin (num 1) (name GND) (type input)) + (pin (num 2) (name VO) (type power_out)) + (pin (num 3) (name VI) (type input)))) + (libpart (lib atmel) (part ATXMEGA16A4U-A) + (aliases + (alias ATXMEGA32A4U-A) + (alias ATXMEGA64A4U-A) + (alias ATXMEGA128A4U-A)) + (description "TQFP44, 16k Flash, 4k Boot, 2k SRAM, 1k EEPROM, JTAG, USB") + (docs http://www.atmel.com/Images/Atmel-8387-8-and16-bit-AVR-Microcontroller-XMEGA-A4U_Datasheet.pdf) + (fields + (field (name Reference) IC) + (field (name Value) ATXMEGA16A4U-A) + (field (name Footprint) TQFP44)) + (pins + (pin (num 1) (name AC5/ADC5/PA5) (type BiDi)) + (pin (num 2) (name AC1OUT/AC6/ADC6/PA6) (type BiDi)) + (pin (num 3) (name AC0OUT/AC7/ADC7/PA7) (type BiDi)) + (pin (num 4) (name AREFB/ADC8/PB0) (type BiDi)) + (pin (num 5) (name ADC9/PB1) (type BiDi)) + (pin (num 6) (name DAC0/ADC10/PB2) (type BiDi)) + (pin (num 7) (name DAC1/ACD11/PB3) (type BiDi)) + (pin (num 8) (name GND) (type power_in)) + (pin (num 9) (name VCC) (type power_in)) + (pin (num 10) (name SDAIN/SDA/~OC0ALS~/OC0A/PC0) (type BiDi)) + (pin (num 11) (name SCLIN/SCL/XCK0/OC0AHS/OC0B/PC1) (type BiDi)) + (pin (num 12) (name SDAOUT/RXD0/~OC0BLS~/OC0C/PC2) (type BiDi)) + (pin (num 13) (name SCLOUT/TXD0/OC0BHS/OC0D/PC3) (type BiDi)) + (pin (num 14) (name ~SS~/~OC0CLS~/OC1A/PC4) (type BiDi)) + (pin (num 15) (name MOSI/XCK1/OC0CHS/OC1B/PC5) (type BiDi)) + (pin (num 16) (name CLKRTC/MISO/RXD1/~OC0DLS~/PC6) (type BiDi)) + (pin (num 17) (name EVOUT/CLKOUT/SCK/TXD1/OC0DHS/PC7) (type BiDi)) + (pin (num 18) (name GND) (type power_in)) + (pin (num 19) (name VCC) (type power_in)) + (pin (num 20) (name PD0/OC0A) (type BiDi)) + (pin (num 21) (name PD1/OC0B/XCK0) (type BiDi)) + (pin (num 22) (name PD2/OC0C/RXD0) (type BiDi)) + (pin (num 23) (name PD3/OC0D/TXD0) (type BiDi)) + (pin (num 24) (name PD4/OC1A/~SS~) (type BiDi)) + (pin (num 25) (name PD5/OC1B/XCK1/MOSI) (type BiDi)) + (pin (num 26) (name PD6/D-/RXD1/MISO) (type BiDi)) + (pin (num 27) (name PD7/D+/TXD1/SCK/CLKOUT/EVOUT) (type BiDi)) + (pin (num 28) (name PE0/OC0A/SDA) (type BiDi)) + (pin (num 29) (name PE1/OC0B/XCK0/SCL) (type BiDi)) + (pin (num 30) (name GND) (type power_in)) + (pin (num 31) (name VCC) (type power_in)) + (pin (num 32) (name PE2/OC0C/RXD0) (type BiDi)) + (pin (num 33) (name PE3/OC0D/TXD0) (type BiDi)) + (pin (num 34) (name PDI_DATA) (type input)) + (pin (num 35) (name ~RESET~/PDI_CLK) (type input)) + (pin (num 36) (name PR0/XTAL2/TOSC2) (type BiDi)) + (pin (num 37) (name PR1/XTAL1/TOSC1) (type BiDi)) + (pin (num 38) (name GND) (type power_in)) + (pin (num 39) (name AVCC) (type power_in)) + (pin (num 40) (name AREFA/AC0/ADC0/PA0) (type BiDi)) + (pin (num 41) (name AC1/ADC1/PA1) (type BiDi)) + (pin (num 42) (name AC2/ADC2/PA2) (type BiDi)) + (pin (num 43) (name AC3/ADC3/PA3) (type BiDi)) + (pin (num 44) (name AC4/ADC4/PA4) (type BiDi)))) + (libpart (lib device) (part C) + (description "Unpolarized capacitor") + (footprints + (fp C?) + (fp C_????_*) + (fp C_????) + (fp SMD*_c) + (fp Capacitor*)) + (fields + (field (name Reference) C) + (field (name Value) C)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib conn) (part CONN_01X02) + (description "Connector 01x02") + (footprints + (fp Pin_Header_Straight_1X02) + (fp Pin_Header_Angled_1X02) + (fp Socket_Strip_Straight_1X02) + (fp Socket_Strip_Angled_1X02)) + (fields + (field (name Reference) P) + (field (name Value) CONN_01X02)) + (pins + (pin (num 1) (name P1) (type passive)) + (pin (num 2) (name P2) (type passive)))) + (libpart (lib conn) (part CONN_01X04) + (description "Connector 01x04") + (footprints + (fp Pin_Header_Straight_1X04) + (fp Pin_Header_Angled_1X04) + (fp Socket_Strip_Straight_1X04) + (fp Socket_Strip_Angled_1X04)) + (fields + (field (name Reference) P) + (field (name Value) CONN_01X04)) + (pins + (pin (num 1) (name P1) (type passive)) + (pin (num 2) (name P2) (type passive)) + (pin (num 3) (name P3) (type passive)) + (pin (num 4) (name P4) (type passive)))) + (libpart (lib conn) (part CONN_02X02) + (description "Connector 02x02") + (footprints + (fp Pin_Header_Straight_2X02) + (fp Pin_Header_Angled_2X02) + (fp Socket_Strip_Straight_2X02) + (fp Socket_Strip_Angled_2X02)) + (fields + (field (name Reference) P) + (field (name Value) CONN_02X02)) + (pins + (pin (num 1) (name P1) (type passive)) + (pin (num 2) (name P2) (type passive)) + (pin (num 3) (name P3) (type passive)) + (pin (num 4) (name P4) (type passive)))) + (libpart (lib device) (part CP1) + (description "Polarised capacitor") + (footprints + (fp SMD*_Pol) + (fp c_elec*) + (fp C*elec) + (fp TantalC*) + (fp Elko*) + (fp CP*)) + (fields + (field (name Reference) C) + (field (name Value) CP1)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib device) (part C_Small) + (description "Unpolarized capacitor") + (footprints + (fp C?) + (fp C_????_*) + (fp C_????) + (fp SMD*_c) + (fp Capacitor*)) + (fields + (field (name Reference) C) + (field (name Value) C_Small)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib ESPO_PART) (part DMN63D8LDW) + (fields + (field (name Reference) U) + (field (name Value) DMN63D8LDW)) + (pins + (pin (num 1) (name S1) (type input)) + (pin (num 2) (name G1) (type input)) + (pin (num 3) (name D2) (type input)) + (pin (num 4) (name S2) (type input)) + (pin (num 5) (name G2) (type input)) + (pin (num 6) (name D1) (type input)))) + (libpart (lib device) (part D_Schottky) + (description "Diode schottky") + (footprints + (fp D-Pak_TO252AA) + (fp Diode_*) + (fp *SingleDiode) + (fp *SingleDiode*) + (fp *_Diode_*)) + (fields + (field (name Reference) D) + (field (name Value) D_Schottky)) + (pins + (pin (num 1) (name K) (type passive)) + (pin (num 2) (name A) (type passive)))) + (libpart (lib device) (part F_Small) + (description Fuse) + (footprints + (fp CP*) + (fp SM*)) + (fields + (field (name Reference) F) + (field (name Value) F_Small)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib device) (part INDUCTOR) + (fields + (field (name Reference) L) + (field (name Value) INDUCTOR)) + (pins + (pin (num 1) (name 1) (type passive)) + (pin (num 2) (name 2) (type passive)))) + (libpart (lib Tinylab_proto1-rescue) (part LM324-RESCUE-Tinylab_proto1) + (fields + (field (name Reference) U) + (field (name Value) LM324-RESCUE-Tinylab_proto1)) + (pins + (pin (num 1) (name ~) (type output)) + (pin (num 2) (name -) (type input)) + (pin (num 3) (name +) (type input)) + (pin (num 4) (name V+) (type power_in)) + (pin (num 5) (name +) (type input)) + (pin (num 6) (name -) (type input)) + (pin (num 7) (name ~) (type output)) + (pin (num 8) (name ~) (type output)) + (pin (num 9) (name -) (type input)) + (pin (num 10) (name +) (type input)) + (pin (num 11) (name V-) (type power_in)) + (pin (num 12) (name +) (type input)) + (pin (num 13) (name -) (type input)) + (pin (num 14) (name ~) (type output)))) + (libpart (lib device) (part Q_NMOS_GSD) + (description "Transistor N-MOSFET (general)") + (fields + (field (name Reference) Q) + (field (name Value) Q_NMOS_GSD)) + (pins + (pin (num 1) (name G) (type input)) + (pin (num 2) (name S) (type passive)) + (pin (num 3) (name D) (type passive)))) + (libpart (lib device) (part R) + (description Resistor) + (footprints + (fp R_*) + (fp Resistor_*)) + (fields + (field (name Reference) R) + (field (name Value) R)) + (pins + (pin (num 1) (name ~) (type passive)) + (pin (num 2) (name ~) (type passive)))) + (libpart (lib conn) (part USB_OTG) + (description "micro/mini connector") + (footprints + (fp USB*)) + (fields + (field (name Reference) P) + (field (name Value) USB_OTG)) + (pins + (pin (num 1) (name VCC) (type power_out)) + (pin (num 2) (name D-) (type passive)) + (pin (num 3) (name D+) (type passive)) + (pin (num 4) (name ID) (type power_in)) + (pin (num 5) (name GND) (type power_in)) + (pin (num 6) (name shield) (type passive))))) + (libraries + (library (logical ESPO_PART) + (uri C:\Users\Esposch\Documents\KiCAD\ESPO_PART.lib)) + (library (logical atmel) + (uri "C:\\Program Files\\KiCad\\share\\kicad\\library\\atmel.lib")) + (library (logical conn) + (uri "C:\\Program Files\\KiCad\\share\\kicad\\library\\conn.lib")) + (library (logical Tinylab_proto1-rescue) + (uri C:\Users\Esposch\Documents\kicad-repo\Tinylab_proto1\Tinylab_proto1-rescue.lib)) + (library (logical device) + (uri "C:\\Program Files\\KiCad\\share\\kicad\\library\\device.lib"))) + (nets + (net (code 1) (name "Net-(P3-Pad3)") + (node (ref R8) (pin 2)) + (node (ref P3) (pin 3))) + (net (code 2) (name "Net-(P3-Pad2)") + (node (ref R9) (pin 2)) + (node (ref P3) (pin 2))) + (net (code 3) (name "Net-(P3-Pad1)") + (node (ref P3) (pin 1)) + (node (ref R10) (pin 2))) + (net (code 4) (name /AVCC) + (node (ref IC1) (pin 39)) + (node (ref R5) (pin 1)) + (node (ref C5) (pin 1)) + (node (ref C19) (pin 1)) + (node (ref C18) (pin 1)) + (node (ref C12) (pin 1)) + (node (ref C17) (pin 1)) + (node (ref L2) (pin 2)) + (node (ref C8) (pin 1))) + (net (code 5) (name "Net-(P8-Pad1)") + (node (ref U4) (pin 5)) + (node (ref P8) (pin 1))) + (net (code 6) (name "Net-(P3-Pad4)") + (node (ref P3) (pin 4)) + (node (ref R7) (pin 2))) + (net (code 7) (name "Net-(IC1-Pad33)") + (node (ref R14) (pin 1)) + (node (ref IC1) (pin 33))) + (net (code 8) (name "Net-(IC1-Pad32)") + (node (ref IC1) (pin 32)) + (node (ref R13) (pin 1))) + (net (code 9) (name "Net-(IC1-Pad29)") + (node (ref R12) (pin 1)) + (node (ref IC1) (pin 29))) + (net (code 10) (name "Net-(IC1-Pad28)") + (node (ref IC1) (pin 28)) + (node (ref R11) (pin 1))) + (net (code 11) (name "Net-(D1-Pad2)") + (node (ref Q1) (pin 3)) + (node (ref L1) (pin 1)) + (node (ref D1) (pin 2))) + (net (code 12) (name /USBGND) + (node (ref P2) (pin 5)) + (node (ref F1) (pin 2)) + (node (ref P2) (pin 6))) + (net (code 13) (name /PSU_PWM) + (node (ref Q1) (pin 1)) + (node (ref IC1) (pin 24))) + (net (code 14) (name "Net-(P8-Pad2)") + (node (ref P8) (pin 2)) + (node (ref U4) (pin 2))) + (net (code 15) (name /VGND) + (node (ref P4) (pin 3)) + (node (ref Q1) (pin 2)) + (node (ref R29) (pin 2)) + (node (ref C19) (pin 2)) + (node (ref C16) (pin 2)) + (node (ref U3) (pin 1)) + (node (ref IC1) (pin 14)) + (node (ref U4) (pin 1)) + (node (ref U4) (pin 4)) + (node (ref C6) (pin 2)) + (node (ref C11) (pin 2)) + (node (ref C8) (pin 2)) + (node (ref R27) (pin 2)) + (node (ref F1) (pin 1)) + (node (ref C7) (pin 2)) + (node (ref R21) (pin 2)) + (node (ref R28) (pin 1)) + (node (ref U3) (pin 4)) + (node (ref IC1) (pin 8)) + (node (ref C4) (pin 2)) + (node (ref R6) (pin 1)) + (node (ref U1) (pin 1)) + (node (ref C15) (pin 2)) + (node (ref C3) (pin 2)) + (node (ref IC1) (pin 30)) + (node (ref C5) (pin 2)) + (node (ref U2) (pin 11)) + (node (ref IC1) (pin 18)) + (node (ref IC1) (pin 38)) + (node (ref P7) (pin 2)) + (node (ref C9) (pin 2)) + (node (ref P10) (pin 2)) + (node (ref P10) (pin 1)) + (node (ref R30) (pin 1)) + (node (ref C17) (pin 2)) + (node (ref C18) (pin 2)) + (node (ref C12) (pin 2)) + (node (ref C10) (pin 2))) + (net (code 16) (name "Net-(L3-Pad2)") + (node (ref L3) (pin 2)) + (node (ref L4) (pin 1))) + (net (code 17) (name "Net-(C13-Pad2)") + (node (ref C13) (pin 2)) + (node (ref R24) (pin 1)) + (node (ref P6) (pin 1))) + (net (code 18) (name "Net-(C13-Pad1)") + (node (ref C13) (pin 1)) + (node (ref P6) (pin 2))) + (net (code 19) (name "Net-(C1-Pad2)") + (node (ref C1) (pin 2)) + (node (ref P9) (pin 2))) + (net (code 20) (name "Net-(C2-Pad2)") + (node (ref C2) (pin 2)) + (node (ref P9) (pin 1))) + (net (code 21) (name "Net-(R20-Pad1)") + (node (ref R30) (pin 2)) + (node (ref R23) (pin 2)) + (node (ref U2) (pin 14)) + (node (ref R20) (pin 1))) + (net (code 22) (name /AVCC_ON_2) + (node (ref R3) (pin 2)) + (node (ref R5) (pin 2)) + (node (ref R6) (pin 2)) + (node (ref R4) (pin 1)) + (node (ref IC1) (pin 44))) + (net (code 23) (name "Net-(R1-Pad1)") + (node (ref R3) (pin 1)) + (node (ref R1) (pin 1)) + (node (ref U2) (pin 3))) + (net (code 24) (name +5V) + (node (ref C3) (pin 1)) + (node (ref L1) (pin 2)) + (node (ref U1) (pin 3)) + (node (ref P2) (pin 1)) + (node (ref C9) (pin 1)) + (node (ref C10) (pin 1))) + (net (code 25) (name "Net-(R22-Pad1)") + (node (ref R22) (pin 1)) + (node (ref R24) (pin 2))) + (net (code 26) (name "Net-(R11-Pad2)") + (node (ref R11) (pin 2)) + (node (ref R7) (pin 1))) + (net (code 27) (name "Net-(R12-Pad2)") + (node (ref R12) (pin 2)) + (node (ref R8) (pin 1))) + (net (code 28) (name "Net-(R13-Pad2)") + (node (ref R9) (pin 1)) + (node (ref R13) (pin 2))) + (net (code 29) (name "Net-(R10-Pad1)") + (node (ref R14) (pin 2)) + (node (ref R10) (pin 1))) + (net (code 30) (name "Net-(C1-Pad1)") + (node (ref R1) (pin 2)) + (node (ref P1) (pin 1)) + (node (ref P1) (pin 2)) + (node (ref C1) (pin 1))) + (net (code 31) (name "Net-(C2-Pad1)") + (node (ref R2) (pin 2)) + (node (ref P5) (pin 1)) + (node (ref P5) (pin 2)) + (node (ref C2) (pin 1))) + (net (code 32) (name /CH1) + (node (ref IC1) (pin 42)) + (node (ref U2) (pin 2)) + (node (ref U2) (pin 1)) + (node (ref R21) (pin 1))) + (net (code 33) (name /CH2) + (node (ref IC1) (pin 40)) + (node (ref IC1) (pin 2)) + (node (ref U2) (pin 7)) + (node (ref U2) (pin 6)) + (node (ref R28) (pin 2))) + (net (code 34) (name "Net-(R2-Pad1)") + (node (ref U2) (pin 5)) + (node (ref R4) (pin 2)) + (node (ref R2) (pin 1))) + (net (code 36) (name "Net-(R15-Pad1)") + (node (ref U2) (pin 13)) + (node (ref R16) (pin 1)) + (node (ref R15) (pin 1)) + (node (ref R20) (pin 2))) + (net (code 37) (name /VCC_3V3) + (node (ref U1) (pin 2)) + (node (ref P4) (pin 1)) + (node (ref IC1) (pin 31)) + (node (ref IC1) (pin 19)) + (node (ref L2) (pin 1)) + (node (ref C4) (pin 1)) + (node (ref C6) (pin 1)) + (node (ref C11) (pin 1))) + (net (code 38) (name "Net-(C14-Pad2)") + (node (ref C14) (pin 2)) + (node (ref P6) (pin 3)) + (node (ref R25) (pin 1))) + (net (code 39) (name /DAC_OUT2) + (node (ref U2) (pin 12)) + (node (ref IC1) (pin 7))) + (net (code 40) (name "Net-(IC1-Pad34)") + (node (ref P4) (pin 2)) + (node (ref IC1) (pin 34))) + (net (code 41) (name "Net-(IC1-Pad35)") + (node (ref IC1) (pin 35)) + (node (ref P4) (pin 4))) + (net (code 42) (name "Net-(C14-Pad1)") + (node (ref P6) (pin 4)) + (node (ref C14) (pin 1))) + (net (code 43) (name "Net-(R17-Pad2)") + (node (ref U3) (pin 3)) + (node (ref R17) (pin 2)) + (node (ref R18) (pin 2))) + (net (code 44) (name "Net-(P2-Pad4)") + (node (ref P2) (pin 4))) + (net (code 45) (name /D+) + (node (ref P2) (pin 3)) + (node (ref IC1) (pin 27))) + (net (code 46) (name /DAC_OUT) + (node (ref IC1) (pin 6)) + (node (ref U2) (pin 10))) + (net (code 47) (name "Net-(IC1-Pad3)") + (node (ref IC1) (pin 3))) + (net (code 48) (name /TO_B0) + (node (ref U3) (pin 2)) + (node (ref IC1) (pin 4))) + (net (code 49) (name /TO_B1) + (node (ref U3) (pin 5)) + (node (ref IC1) (pin 5))) + (net (code 50) (name "Net-(IC1-Pad9)") + (node (ref IC1) (pin 9))) + (net (code 51) (name "Net-(IC1-Pad10)") + (node (ref IC1) (pin 10))) + (net (code 52) (name "Net-(IC1-Pad20)") + (node (ref IC1) (pin 20))) + (net (code 53) (name /XCK) + (node (ref IC1) (pin 15)) + (node (ref IC1) (pin 11))) + (net (code 54) (name "Net-(IC1-Pad25)") + (node (ref IC1) (pin 25))) + (net (code 55) (name "Net-(IC1-Pad16)") + (node (ref IC1) (pin 16))) + (net (code 56) (name "Net-(IC1-Pad36)") + (node (ref IC1) (pin 36))) + (net (code 57) (name /DIG_CH1) + (node (ref U4) (pin 6)) + (node (ref IC1) (pin 17))) + (net (code 58) (name "Net-(IC1-Pad37)") + (node (ref IC1) (pin 37))) + (net (code 59) (name /D-) + (node (ref IC1) (pin 26)) + (node (ref P2) (pin 2))) + (net (code 60) (name "Net-(IC1-Pad43)") + (node (ref IC1) (pin 43))) + (net (code 61) (name "Net-(IC1-Pad23)") + (node (ref IC1) (pin 23))) + (net (code 62) (name "Net-(IC1-Pad13)") + (node (ref IC1) (pin 13))) + (net (code 63) (name "Net-(IC1-Pad22)") + (node (ref IC1) (pin 22))) + (net (code 64) (name /DIG_CH2) + (node (ref IC1) (pin 12)) + (node (ref U4) (pin 3))) + (net (code 65) (name "Net-(IC1-Pad41)") + (node (ref IC1) (pin 41))) + (net (code 66) (name "Net-(IC1-Pad21)") + (node (ref IC1) (pin 21))) + (net (code 67) (name "Net-(R17-Pad1)") + (node (ref R19) (pin 2)) + (node (ref U2) (pin 9)) + (node (ref R17) (pin 1)) + (node (ref R18) (pin 1))) + (net (code 68) (name /PSU_FEEDBACK) + (node (ref R26) (pin 2)) + (node (ref R27) (pin 1)) + (node (ref IC1) (pin 1))) + (net (code 69) (name "Net-(R23-Pad1)") + (node (ref R25) (pin 2)) + (node (ref R23) (pin 1))) + (net (code 70) (name "Net-(R19-Pad1)") + (node (ref U2) (pin 8)) + (node (ref R29) (pin 1)) + (node (ref R19) (pin 1)) + (node (ref R22) (pin 2))) + (net (code 71) (name "Net-(R15-Pad2)") + (node (ref U3) (pin 6)) + (node (ref R15) (pin 2)) + (node (ref R16) (pin 2))) + (net (code 72) (name /PSU_OUT) + (node (ref C16) (pin 1)) + (node (ref P7) (pin 1)) + (node (ref L4) (pin 2)) + (node (ref D1) (pin 1)) + (node (ref C15) (pin 1)) + (node (ref R26) (pin 1))) + (net (code 73) (name /OPAMP_VCC) + (node (ref U2) (pin 4)) + (node (ref C7) (pin 1)) + (node (ref L3) (pin 1))))) \ No newline at end of file diff --git a/PCB/Tinylab_proto1.pro b/PCB/Tinylab_proto1.pro new file mode 100644 index 00000000..08ce12fa --- /dev/null +++ b/PCB/Tinylab_proto1.pro @@ -0,0 +1,72 @@ +update=23/03/2016 12:02:25 PM +version=1 +last_client=kicad +[pcbnew] +version=1 +LastNetListRead= +UseCmpFile=1 +PadDrill=0.600000000000 +PadDrillOvalY=0.600000000000 +PadSizeH=1.500000000000 +PadSizeV=1.500000000000 +PcbTextSizeV=1.500000000000 +PcbTextSizeH=1.500000000000 +PcbTextThickness=0.300000000000 +ModuleTextSizeV=1.000000000000 +ModuleTextSizeH=1.000000000000 +ModuleTextSizeThickness=0.150000000000 +SolderMaskClearance=0.000000000000 +SolderMaskMinWidth=0.000000000000 +DrawSegmentWidth=0.200000000000 +BoardOutlineThickness=0.100000000000 +ModuleOutlineThickness=0.150000000000 +[cvpcb] +version=1 +NetIExt=net +[general] +version=1 +[schematic_editor] +version=1 +PageLayoutDescrFile= +PlotDirectoryName= +SubpartIdSeparator=0 +SubpartFirstId=65 +NetFmtName= +SpiceForceRefPrefix=0 +SpiceUseNetNumbers=0 +LabSize=60 +[eeschema] +version=1 +LibDir= +[eeschema/libraries] +LibName1=Tinylab_proto1-rescue +LibName2=power +LibName3=device +LibName4=transistors +LibName5=conn +LibName6=linear +LibName7=regul +LibName8=74xx +LibName9=cmos4000 +LibName10=adc-dac +LibName11=memory +LibName12=xilinx +LibName13=microcontrollers +LibName14=dsp +LibName15=microchip +LibName16=analog_switches +LibName17=motorola +LibName18=texas +LibName19=intel +LibName20=audio +LibName21=interface +LibName22=digital-audio +LibName23=philips +LibName24=display +LibName25=cypress +LibName26=siliconi +LibName27=opto +LibName28=atmel +LibName29=contrib +LibName30=valves +LibName31=C:/Users/Esposch/Documents/KiCAD/ESPO_PART diff --git a/PCB/Tinylab_proto1.sch b/PCB/Tinylab_proto1.sch new file mode 100644 index 00000000..37f1a881 --- /dev/null +++ b/PCB/Tinylab_proto1.sch @@ -0,0 +1,1436 @@ +EESchema Schematic File Version 2 +LIBS:Tinylab_proto1-rescue +LIBS:power +LIBS:device +LIBS:transistors +LIBS:conn +LIBS:linear +LIBS:regul +LIBS:74xx +LIBS:cmos4000 +LIBS:adc-dac +LIBS:memory +LIBS:xilinx +LIBS:microcontrollers +LIBS:dsp +LIBS:microchip +LIBS:analog_switches +LIBS:motorola +LIBS:texas +LIBS:intel +LIBS:audio +LIBS:interface +LIBS:digital-audio +LIBS:philips +LIBS:display +LIBS:cypress +LIBS:siliconi +LIBS:opto +LIBS:atmel +LIBS:contrib +LIBS:valves +LIBS:ESPO_PART +LIBS:Tinylab_proto1-cache +EELAYER 25 0 +EELAYER END +$Descr A2 23386 16535 +encoding utf-8 +Sheet 1 1 +Title "" +Date "" +Rev "" +Comp "" +Comment1 "" +Comment2 "" +Comment3 "" +Comment4 "" +$EndDescr +$Comp +L LM324-RESCUE-Tinylab_proto1 U2 +U 1 1 55CA87E2 +P 4200 8750 +F 0 "U2" H 4250 8950 60 0000 C CNN +F 1 "LM324" H 4350 8550 50 0000 C CNN +F 2 "Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm" H 4200 8750 60 0001 C CNN +F 3 "" H 4200 8750 60 0000 C CNN + 1 4200 8750 + 1 0 0 -1 +$EndComp +$Comp +L LM324-RESCUE-Tinylab_proto1 U2 +U 2 1 55CA88A1 +P 4200 10550 +F 0 "U2" H 4250 10750 60 0000 C CNN +F 1 "LM324" H 4350 10350 50 0000 C CNN +F 2 "Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm" H 4200 10550 60 0001 C CNN +F 3 "" H 4200 10550 60 0000 C CNN + 2 4200 10550 + 1 0 0 -1 +$EndComp +$Comp +L LM324-RESCUE-Tinylab_proto1 U2 +U 3 1 55CA8924 +P 8450 9250 +F 0 "U2" H 8500 9450 60 0000 C CNN +F 1 "LM324" H 8600 9050 50 0000 C CNN +F 2 "Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm" H 8450 9250 60 0001 C CNN +F 3 "" H 8450 9250 60 0000 C CNN + 3 8450 9250 + 1 0 0 -1 +$EndComp +$Comp +L LM324-RESCUE-Tinylab_proto1 U2 +U 4 1 55CA89A3 +P 8400 11550 +F 0 "U2" H 8450 11750 60 0000 C CNN +F 1 "LM324" H 8550 11350 50 0000 C CNN +F 2 "Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm" H 8400 11550 60 0001 C CNN +F 3 "" H 8400 11550 60 0000 C CNN + 4 8400 11550 + 1 0 0 -1 +$EndComp +$Comp +L ATXMEGA16A4U-A IC1 +U 1 1 55CA8F25 +P 6150 5300 +F 0 "IC1" H 5400 6500 40 0000 L BNN +F 1 "ATXMEGA16A4U-A" H 6500 4050 40 0000 L BNN +F 2 "Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm" H 6150 5300 35 0000 C CIN +F 3 "" H 6150 5300 60 0000 C CNN + 1 6150 5300 + 1 0 0 -1 +$EndComp +$Comp +L USB_OTG P2 +U 1 1 55CA90D2 +P 1650 6850 +F 0 "P2" H 1975 6725 50 0000 C CNN +F 1 "USB_OTG" H 1650 7050 50 0000 C CNN +F 2 "Connect:USB_Micro-B_WIDE" V 1600 6750 60 0001 C CNN +F 3 "" V 1600 6750 60 0000 C CNN + 1 1650 6850 + 0 -1 1 0 +$EndComp +$Comp +L 78L05-RESCUE-Tinylab_proto1 U1 +U 1 1 55CA99FA +P 3100 6700 +F 0 "U1" H 3250 6504 60 0000 C CNN +F 1 "78L05" H 3100 6900 60 0000 C CNN +F 2 "SMD:SOT-23-3" H 3100 6700 60 0001 C CNN +F 3 "" H 3100 6700 60 0000 C CNN + 1 3100 6700 + 1 0 0 -1 +$EndComp +$Comp +L R R1 +U 1 1 55CAAB95 +P 2000 9250 +F 0 "R1" V 2080 9250 50 0000 C CNN +F 1 "R" V 2000 9250 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 1930 9250 30 0001 C CNN +F 3 "" H 2000 9250 30 0000 C CNN + 1 2000 9250 + 0 1 1 0 +$EndComp +$Comp +L R R3 +U 1 1 55CAABF4 +P 2350 9400 +F 0 "R3" V 2430 9400 50 0000 C CNN +F 1 "R" V 2350 9400 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 2280 9400 30 0001 C CNN +F 3 "" H 2350 9400 30 0000 C CNN + 1 2350 9400 + 1 0 0 -1 +$EndComp +$Comp +L R R5 +U 1 1 55CAAC5F +P 3000 9500 +F 0 "R5" V 3080 9500 50 0000 C CNN +F 1 "R" V 3000 9500 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 2930 9500 30 0001 C CNN +F 3 "" H 3000 9500 30 0000 C CNN + 1 3000 9500 + 0 1 1 0 +$EndComp +$Comp +L R R6 +U 1 1 55CAACD2 +P 3000 9700 +F 0 "R6" V 3080 9700 50 0000 C CNN +F 1 "R" V 3000 9700 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 2930 9700 30 0001 C CNN +F 3 "" H 3000 9700 30 0000 C CNN + 1 3000 9700 + 0 1 1 0 +$EndComp +$Comp +L R R4 +U 1 1 55CAAD11 +P 2350 9800 +F 0 "R4" V 2430 9800 50 0000 C CNN +F 1 "R" V 2350 9800 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 2280 9800 30 0001 C CNN +F 3 "" H 2350 9800 30 0000 C CNN + 1 2350 9800 + 1 0 0 -1 +$EndComp +$Comp +L R R2 +U 1 1 55CAAD4C +P 2000 9950 +F 0 "R2" V 2080 9950 50 0000 C CNN +F 1 "R" V 2000 9950 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 1930 9950 30 0001 C CNN +F 3 "" H 2000 9950 30 0000 C CNN + 1 2000 9950 + 0 1 1 0 +$EndComp +$Comp +L C_Small C2 +U 1 1 55CAB4DE +P 1700 9700 +F 0 "C2" H 1710 9770 50 0000 L CNN +F 1 "C" H 1710 9620 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 1700 9700 60 0001 C CNN +F 3 "" H 1700 9700 60 0000 C CNN + 1 1700 9700 + 0 1 1 0 +$EndComp +$Comp +L C_Small C1 +U 1 1 55CAB611 +P 1700 9500 +F 0 "C1" H 1710 9570 50 0000 L CNN +F 1 "C" H 1710 9420 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 1700 9500 60 0001 C CNN +F 3 "" H 1700 9500 60 0000 C CNN + 1 1700 9500 + 0 1 1 0 +$EndComp +Text Label 3150 9500 0 60 ~ 0 +AVCC +Text Label 4700 8750 0 60 ~ 0 +CH1 +Text Label 4700 10550 0 60 ~ 0 +CH2 +Text Label 7050 4500 0 60 ~ 0 +CH1 +Text Label 7050 4300 0 60 ~ 0 +CH2 +Text Label 2350 9600 0 60 ~ 0 +AVCC_ON_2 +Text Label 7050 4700 0 60 ~ 0 +AVCC_ON_2 +$Comp +L C_Small C3 +U 1 1 55CB13E1 +P 2700 6950 +F 0 "C3" H 2710 7020 50 0000 L CNN +F 1 "C_Small" H 2710 6870 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 2700 6950 60 0001 C CNN +F 3 "" H 2700 6950 60 0000 C CNN + 1 2700 6950 + 1 0 0 -1 +$EndComp +$Comp +L C_Small C4 +U 1 1 55CB147C +P 3500 6950 +F 0 "C4" H 3510 7020 50 0000 L CNN +F 1 "C_Small" H 3510 6870 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 3500 6950 60 0001 C CNN +F 3 "" H 3500 6950 60 0000 C CNN + 1 3500 6950 + 1 0 0 -1 +$EndComp +Text Notes 1450 8500 0 60 ~ 0 +Analog Front End for Scope\n +Text Notes 8950 8600 0 60 ~ 0 +DAC stuff\n +$Comp +L R R22 +U 1 1 55CB4680 +P 10650 9250 +F 0 "R22" V 10730 9250 50 0000 C CNN +F 1 "R" V 10650 9250 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 10580 9250 30 0001 C CNN +F 3 "" H 10650 9250 30 0000 C CNN + 1 10650 9250 + 0 1 1 0 +$EndComp +$Comp +L C_Small C13 +U 1 1 55CB630B +P 11250 9350 +F 0 "C13" H 11260 9420 50 0000 L CNN +F 1 "C" H 11260 9270 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 11250 9350 60 0001 C CNN +F 3 "" H 11250 9350 60 0000 C CNN + 1 11250 9350 + 0 1 1 0 +$EndComp +Text Label 7400 9150 0 60 ~ 0 +DAC_OUT +Text Label 7050 5350 0 60 ~ 0 +DAC_OUT +$Comp +L R R24 +U 1 1 55CB9020 +P 11000 9250 +F 0 "R24" V 11080 9250 50 0000 C CNN +F 1 "R" V 11000 9250 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 10930 9250 30 0001 C CNN +F 3 "" H 11000 9250 30 0000 C CNN + 1 11000 9250 + 0 1 1 0 +$EndComp +$Comp +L R R11 +U 1 1 55CBCD2A +P 4700 5000 +F 0 "R11" V 4780 5000 50 0000 C CNN +F 1 "R" V 4700 5000 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4630 5000 30 0001 C CNN +F 3 "" H 4700 5000 30 0000 C CNN + 1 4700 5000 + 0 1 1 0 +$EndComp +$Comp +L R R7 +U 1 1 55CBCDA5 +P 4350 5000 +F 0 "R7" V 4430 5000 50 0000 C CNN +F 1 "R" V 4350 5000 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4280 5000 30 0001 C CNN +F 3 "" H 4350 5000 30 0000 C CNN + 1 4350 5000 + 0 1 1 0 +$EndComp +$Comp +L R R13 +U 1 1 55CBE0F4 +P 4700 5400 +F 0 "R13" V 4780 5400 50 0000 C CNN +F 1 "R" V 4700 5400 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4630 5400 30 0001 C CNN +F 3 "" H 4700 5400 30 0000 C CNN + 1 4700 5400 + 0 1 1 0 +$EndComp +$Comp +L R R9 +U 1 1 55CBE16B +P 4350 5400 +F 0 "R9" V 4430 5400 50 0000 C CNN +F 1 "R" V 4350 5400 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4280 5400 30 0001 C CNN +F 3 "" H 4350 5400 30 0000 C CNN + 1 4350 5400 + 0 1 1 0 +$EndComp +$Comp +L R R14 +U 1 1 55CBE21C +P 4700 5600 +F 0 "R14" V 4780 5600 50 0000 C CNN +F 1 "R" V 4700 5600 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4630 5600 30 0001 C CNN +F 3 "" H 4700 5600 30 0000 C CNN + 1 4700 5600 + 0 1 1 0 +$EndComp +$Comp +L R R10 +U 1 1 55CBE2C7 +P 4350 5600 +F 0 "R10" V 4430 5600 50 0000 C CNN +F 1 "R" V 4350 5600 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4280 5600 30 0001 C CNN +F 3 "" H 4350 5600 30 0000 C CNN + 1 4350 5600 + 0 1 1 0 +$EndComp +$Comp +L R R12 +U 1 1 55CBE362 +P 4700 5200 +F 0 "R12" V 4780 5200 50 0000 C CNN +F 1 "R" V 4700 5200 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4630 5200 30 0001 C CNN +F 3 "" H 4700 5200 30 0000 C CNN + 1 4700 5200 + 0 1 1 0 +$EndComp +$Comp +L R R8 +U 1 1 55CBE401 +P 4350 5200 +F 0 "R8" V 4430 5200 50 0000 C CNN +F 1 "R" V 4350 5200 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4280 5200 30 0001 C CNN +F 3 "" H 4350 5200 30 0000 C CNN + 1 4350 5200 + 0 1 1 0 +$EndComp +$Comp +L CONN_01X04 P3 +U 1 1 55CBF4D5 +P 3550 5300 +F 0 "P3" H 3550 5550 50 0000 C CNN +F 1 "DIG_OUT" V 3650 5300 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_1x04" H 3550 5300 60 0001 C CNN +F 3 "" H 3550 5300 60 0000 C CNN + 1 3550 5300 + -1 0 0 1 +$EndComp +Text Notes 4250 4850 0 60 ~ 0 +Dig Output\n +Text Notes 10050 4650 0 60 ~ 0 +PSU\n +$Comp +L +5V #PWR1 +U 1 1 55CD51C0 +P 2700 6650 +F 0 "#PWR1" H 2700 6500 50 0001 C CNN +F 1 "+5V" H 2700 6790 50 0000 C CNN +F 2 "" H 2700 6650 60 0000 C CNN +F 3 "" H 2700 6650 60 0000 C CNN + 1 2700 6650 + 1 0 0 -1 +$EndComp +Text Label 1950 6850 0 60 ~ 0 +D+ +Text Label 1950 6750 0 60 ~ 0 +D- +Text Label 5100 6200 0 60 ~ 0 +D- +Text Label 5100 6300 0 60 ~ 0 +D+ +NoConn ~ 1950 6950 +$Comp +L C_Small C5 +U 1 1 55D60181 +P 3600 9600 +F 0 "C5" H 3610 9670 50 0000 L CNN +F 1 "C_Small" H 3610 9520 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 3600 9600 60 0001 C CNN +F 3 "" H 3600 9600 60 0000 C CNN + 1 3600 9600 + 1 0 0 -1 +$EndComp +Text Label 6450 4000 0 60 ~ 0 +AVCC +$Comp +L DMN63D8LDW U4 +U 1 1 55D6ACFD +P 14400 3450 +F 0 "U4" H 14400 3150 60 0000 C CNN +F 1 "DMN63D8LDW" H 14400 3800 60 0000 C CNN +F 2 "TO_SOT_Packages_SMD:SOT-363" H 14400 3150 60 0001 C CNN +F 3 "" H 14400 3150 60 0000 C CNN + 1 14400 3450 + 1 0 0 -1 +$EndComp +Text Notes 14250 2450 0 60 ~ 0 +DIG IN +$Comp +L CONN_01X02 P8 +U 1 1 55D6DB77 +P 14400 2750 +F 0 "P8" H 14400 2900 50 0000 C CNN +F 1 "DIG_IN" V 14500 2750 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_1x02" H 14400 2750 60 0001 C CNN +F 3 "" H 14400 2750 60 0000 C CNN + 1 14400 2750 + 0 -1 -1 0 +$EndComp +Text Label 14850 3300 0 60 ~ 0 +DIG_CH2 +Text Label 13550 3600 0 60 ~ 0 +DIG_CH1 +$Comp +L F_Small F1 +U 1 1 55D739F3 +P 2300 7050 +F 0 "F1" H 2260 7110 50 0000 L CNN +F 1 "F_Small" H 2180 6990 50 0000 L CNN +F 2 "Capacitors_SMD:C_1210" H 2300 7050 60 0001 C CNN +F 3 "" H 2300 7050 60 0000 C CNN + 1 2300 7050 + -1 0 0 1 +$EndComp +Text Label 2500 7250 0 60 ~ 0 +VGND +Text Label 3500 6650 0 60 ~ 0 +VCC_3V3 +NoConn ~ 7050 5000 +NoConn ~ 7050 5600 +NoConn ~ 7050 5900 +Text Label 7050 5700 0 60 ~ 0 +XCK +Text Label 7050 5800 0 60 ~ 0 +DIG_CH2 +Text Label 7050 6300 0 60 ~ 0 +DIG_CH1 +Text Label 7050 6100 0 60 ~ 0 +XCK +NoConn ~ 7050 6200 +NoConn ~ 5250 5600 +Text Label 4750 6000 0 60 ~ 0 +PSU_PWM +NoConn ~ 5250 6100 +NoConn ~ 5250 5000 +NoConn ~ 5250 4900 +NoConn ~ 5250 5900 +NoConn ~ 5250 5800 +NoConn ~ 5250 5700 +Text Label 6150 3800 0 60 ~ 0 +VCC_3V3 +$Comp +L INDUCTOR L1 +U 1 1 5606EE9E +P 10150 5050 +F 0 "L1" V 10100 5050 50 0000 C CNN +F 1 "INDUCTOR" V 10250 5050 50 0000 C CNN +F 2 "Inductors:INDUCTOR_V" H 10150 5050 60 0001 C CNN +F 3 "" H 10150 5050 60 0000 C CNN + 1 10150 5050 + 0 1 1 0 +$EndComp +$Comp +L D_Schottky D1 +U 1 1 5606FDB4 +P 11100 5050 +F 0 "D1" H 11100 5150 50 0000 C CNN +F 1 "D_Schottky" H 11100 4950 50 0000 C CNN +F 2 "Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10" H 11100 5050 60 0001 C CNN +F 3 "" H 11100 5050 60 0000 C CNN + 1 11100 5050 + -1 0 0 1 +$EndComp +$Comp +L CP1 C9 +U 1 1 560719D9 +P 9500 5350 +F 0 "C9" H 9525 5450 50 0000 L CNN +F 1 "CP1" H 9525 5250 50 0000 L CNN +F 2 "Capacitors_SMD:c_elec_4x5.3" H 9500 5350 60 0001 C CNN +F 3 "" H 9500 5350 60 0000 C CNN + 1 9500 5350 + 1 0 0 -1 +$EndComp +$Comp +L C C10 +U 1 1 56071A50 +P 9800 5350 +F 0 "C10" H 9825 5450 50 0000 L CNN +F 1 "C" H 9825 5250 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 9838 5200 30 0001 C CNN +F 3 "" H 9800 5350 60 0000 C CNN + 1 9800 5350 + 1 0 0 -1 +$EndComp +Text Label 10100 5450 0 60 ~ 0 +PSU_PWM +$Comp +L C C16 +U 1 1 5607355F +P 11900 5350 +F 0 "C16" H 11925 5450 50 0000 L CNN +F 1 "C" H 11925 5250 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 11938 5200 30 0001 C CNN +F 3 "" H 11900 5350 60 0000 C CNN + 1 11900 5350 + 1 0 0 -1 +$EndComp +$Comp +L CP1 C15 +U 1 1 560735FE +P 11600 5350 +F 0 "C15" H 11625 5450 50 0000 L CNN +F 1 "CP1" H 11625 5250 50 0000 L CNN +F 2 "Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5" H 11600 5350 60 0001 C CNN +F 3 "" H 11600 5350 60 0000 C CNN + 1 11600 5350 + 1 0 0 -1 +$EndComp +NoConn ~ 7050 4400 +NoConn ~ 7050 4600 +Text Label 7050 4900 0 60 ~ 0 +CH2 +$Comp +L CONN_02X02 P4 +U 1 1 56069A87 +P 4600 4350 +F 0 "P4" H 4600 4500 50 0000 C CNN +F 1 "PDI" H 4600 4200 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_2x02" H 4600 3150 60 0001 C CNN +F 3 "" H 4600 3150 60 0000 C CNN + 1 4600 4350 + 1 0 0 -1 +$EndComp +Text Label 4000 4300 0 60 ~ 0 +VCC_3V3 +$Comp +L Q_NMOS_GSD Q1 +U 1 1 5606F6D4 +P 10650 5450 +F 0 "Q1" H 10950 5500 50 0000 R CNN +F 1 "Q_NMOS_GSD" H 11300 5400 50 0000 R CNN +F 2 "SMD:SOT-23-3" H 10850 5550 29 0001 C CNN +F 3 "" H 10650 5450 60 0000 C CNN + 1 10650 5450 + 1 0 0 -1 +$EndComp +NoConn ~ 6050 4000 +Text Label 9100 5650 0 60 ~ 0 +VGND +Text Label 7050 5450 0 60 ~ 0 +DAC_OUT2 +Text Label 7350 11450 0 60 ~ 0 +DAC_OUT2 +$Comp +L R R23 +U 1 1 566DE721 +P 10850 11550 +F 0 "R23" V 10930 11550 50 0000 C CNN +F 1 "R" V 10850 11550 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 10780 11550 30 0001 C CNN +F 3 "" H 10850 11550 30 0000 C CNN + 1 10850 11550 + 0 1 1 0 +$EndComp +$Comp +L R R25 +U 1 1 566DE7E8 +P 11150 11550 +F 0 "R25" V 11230 11550 50 0000 C CNN +F 1 "R" V 11150 11550 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 11080 11550 30 0001 C CNN +F 3 "" H 11150 11550 30 0000 C CNN + 1 11150 11550 + 0 1 1 0 +$EndComp +$Comp +L C_Small C14 +U 1 1 566DF655 +P 11400 11650 +F 0 "C14" H 11410 11720 50 0000 L CNN +F 1 "C" H 11410 11570 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 11400 11650 60 0001 C CNN +F 3 "" H 11400 11650 60 0000 C CNN + 1 11400 11650 + 0 1 1 0 +$EndComp +$Comp +L CONN_01X04 P6 +U 1 1 566DF832 +P 12450 10750 +F 0 "P6" H 12450 11000 50 0000 C CNN +F 1 "DAC_OUT" V 12550 10750 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_1x04" H 12450 10750 60 0001 C CNN +F 3 "" H 12450 10750 60 0000 C CNN + 1 12450 10750 + 1 0 0 -1 +$EndComp +$Comp +L R R26 +U 1 1 566E5C29 +P 13650 5200 +F 0 "R26" V 13730 5200 50 0000 C CNN +F 1 "R" V 13650 5200 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 13580 5200 30 0001 C CNN +F 3 "" H 13650 5200 30 0000 C CNN + 1 13650 5200 + 1 0 0 -1 +$EndComp +$Comp +L R R27 +U 1 1 566E5CBE +P 13650 5500 +F 0 "R27" V 13730 5500 50 0000 C CNN +F 1 "R" V 13650 5500 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 13580 5500 30 0001 C CNN +F 3 "" H 13650 5500 30 0000 C CNN + 1 13650 5500 + 1 0 0 -1 +$EndComp +Text Label 7050 4800 0 60 ~ 0 +PSU_FEEDBACK +Text Label 14000 5350 0 60 ~ 0 +PSU_FEEDBACK +$Comp +L CP1 C6 +U 1 1 566F5A75 +P 4050 6900 +F 0 "C6" H 4075 7000 50 0000 L CNN +F 1 "CP1" H 4075 6800 50 0000 L CNN +F 2 "Capacitors_SMD:c_elec_5x5.3" H 4050 6900 60 0001 C CNN +F 3 "" H 4050 6900 60 0000 C CNN + 1 4050 6900 + 1 0 0 -1 +$EndComp +Text Label 6250 3900 0 60 ~ 0 +VCC_3V3 +$Comp +L R R19 +U 1 1 56AECD86 +P 8700 9750 +F 0 "R19" V 8780 9750 50 0000 C CNN +F 1 "R" V 8700 9750 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 8630 9750 30 0001 C CNN +F 3 "" H 8700 9750 30 0000 C CNN + 1 8700 9750 + 0 1 1 0 +$EndComp +Text Label 10400 3600 0 60 ~ 0 +VCC_3V3 +Text Label 9150 3600 0 60 ~ 0 +AVCC +$Comp +L C C11 +U 1 1 5608B4BE +P 10150 3750 +F 0 "C11" H 10175 3850 50 0000 L CNN +F 1 "C" H 10175 3650 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 10188 3600 30 0001 C CNN +F 3 "" H 10150 3750 60 0000 C CNN + 1 10150 3750 + 1 0 0 -1 +$EndComp +$Comp +L C C8 +U 1 1 56AF91A3 +P 9200 3750 +F 0 "C8" H 9225 3850 50 0000 L CNN +F 1 "C" H 9225 3650 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 9238 3600 30 0001 C CNN +F 3 "" H 9200 3750 60 0000 C CNN + 1 9200 3750 + 1 0 0 -1 +$EndComp +$Comp +L R R17 +U 1 1 56AFE83E +P 7950 9900 +F 0 "R17" V 8030 9900 50 0000 C CNN +F 1 "R" V 7950 9900 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 7880 9900 30 0001 C CNN +F 3 "" H 7950 9900 30 0000 C CNN + 1 7950 9900 + 1 0 0 -1 +$EndComp +$Comp +L R R18 +U 1 1 56AFE8F3 +P 8150 9900 +F 0 "R18" V 8230 9900 50 0000 C CNN +F 1 "R" V 8150 9900 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 8080 9900 30 0001 C CNN +F 3 "" H 8150 9900 30 0000 C CNN + 1 8150 9900 + 1 0 0 -1 +$EndComp +$Comp +L DMN63D8LDW U3 +U 1 1 56B012DD +P 9250 10750 +F 0 "U3" H 9250 10450 60 0000 C CNN +F 1 "DMN63D8LDW" H 9250 11100 60 0000 C CNN +F 2 "TO_SOT_Packages_SMD:SOT-363" H 9250 10450 60 0001 C CNN +F 3 "" H 9250 10450 60 0000 C CNN + 1 9250 10750 + 1 0 0 -1 +$EndComp +Text Label 9800 10750 0 60 ~ 0 +TO_B0 +Text Label 7050 5150 0 60 ~ 0 +TO_B0 +Text Label 12450 5050 0 60 ~ 0 +PSU_OUT +$Comp +L R R20 +U 1 1 56B0C682 +P 8700 12050 +F 0 "R20" V 8780 12050 50 0000 C CNN +F 1 "R" V 8700 12050 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 8630 12050 30 0001 C CNN +F 3 "" H 8700 12050 30 0000 C CNN + 1 8700 12050 + 0 1 1 0 +$EndComp +$Comp +L R R15 +U 1 1 56B0C779 +P 7900 12200 +F 0 "R15" V 7980 12200 50 0000 C CNN +F 1 "R" V 7900 12200 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 7830 12200 30 0001 C CNN +F 3 "" H 7900 12200 30 0000 C CNN + 1 7900 12200 + 1 0 0 -1 +$EndComp +$Comp +L R R16 +U 1 1 56B0C86E +P 8100 12200 +F 0 "R16" V 8180 12200 50 0000 C CNN +F 1 "R" V 8100 12200 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 8030 12200 30 0001 C CNN +F 3 "" H 8100 12200 30 0000 C CNN + 1 8100 12200 + 1 0 0 -1 +$EndComp +Text Label 8100 10750 0 60 ~ 0 +TO_B1 +Text Label 7050 5250 0 60 ~ 0 +TO_B1 +$Comp +L +5V #PWR2 +U 1 1 56E7FFFF +P 9100 5050 +F 0 "#PWR2" H 9100 4900 50 0001 C CNN +F 1 "+5V" H 9100 5190 50 0000 C CNN +F 2 "" H 9100 5050 60 0000 C CNN +F 3 "" H 9100 5050 60 0000 C CNN + 1 9100 5050 + 1 0 0 -1 +$EndComp +$Comp +L INDUCTOR L2 +U 1 1 56E88440 +P 9700 3600 +F 0 "L2" V 9650 3600 50 0000 C CNN +F 1 "INDUCTOR" V 9800 3600 50 0000 C CNN +F 2 "Resistors_SMD:R_1210" H 9700 3600 60 0001 C CNN +F 3 "" H 9700 3600 60 0000 C CNN + 1 9700 3600 + 0 1 1 0 +$EndComp +Text Label 4100 8350 0 60 ~ 0 +OPAMP_VCC +Text Label 4100 10150 0 60 ~ 0 +OPAMP_VCC +Text Label 8350 8850 0 60 ~ 0 +OPAMP_VCC +Text Label 8300 11150 0 60 ~ 0 +OPAMP_VCC +$Comp +L INDUCTOR L3 +U 1 1 56E8DA35 +P 15400 5050 +F 0 "L3" V 15350 5050 50 0000 C CNN +F 1 "INDUCTOR" V 15500 5050 50 0000 C CNN +F 2 "Resistors_SMD:R_1210" H 15400 5050 60 0001 C CNN +F 3 "" H 15400 5050 60 0000 C CNN + 1 15400 5050 + 0 1 1 0 +$EndComp +$Comp +L C C7 +U 1 1 56E8E263 +P 16100 5200 +F 0 "C7" H 16125 5300 50 0000 L CNN +F 1 "C" H 16125 5100 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 16138 5050 30 0001 C CNN +F 3 "" H 16100 5200 60 0000 C CNN + 1 16100 5200 + 1 0 0 -1 +$EndComp +Text Label 15850 5050 0 60 ~ 0 +OPAMP_VCC +$Comp +L R R21 +U 1 1 56E9851A +P 4900 8900 +F 0 "R21" V 4980 8900 50 0000 C CNN +F 1 "R" V 4900 8900 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4830 8900 30 0001 C CNN +F 3 "" H 4900 8900 30 0000 C CNN + 1 4900 8900 + 1 0 0 -1 +$EndComp +$Comp +L R R28 +U 1 1 56E985EF +P 4950 10400 +F 0 "R28" V 5030 10400 50 0000 C CNN +F 1 "R" V 4950 10400 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 4880 10400 30 0001 C CNN +F 3 "" H 4950 10400 30 0000 C CNN + 1 4950 10400 + 1 0 0 -1 +$EndComp +$Comp +L R R29 +U 1 1 56E9888A +P 9600 9400 +F 0 "R29" V 9680 9400 50 0000 C CNN +F 1 "R" V 9600 9400 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 9530 9400 30 0001 C CNN +F 3 "" H 9600 9400 30 0000 C CNN + 1 9600 9400 + 1 0 0 -1 +$EndComp +$Comp +L R R30 +U 1 1 56E98921 +P 10000 11400 +F 0 "R30" V 10080 11400 50 0000 C CNN +F 1 "R" V 10000 11400 50 0000 C CNN +F 2 "Resistors_SMD:R_0603" V 9930 11400 30 0001 C CNN +F 3 "" H 10000 11400 30 0000 C CNN + 1 10000 11400 + 1 0 0 -1 +$EndComp +$Comp +L CONN_01X02 P1 +U 1 1 56EA2C80 +P 1200 9250 +F 0 "P1" H 1200 9400 50 0000 C CNN +F 1 "SCOPE_IN_CH1" V 1300 9250 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_1x02" H 1200 9250 60 0001 C CNN +F 3 "" H 1200 9250 60 0000 C CNN + 1 1200 9250 + -1 0 0 1 +$EndComp +$Comp +L CONN_01X02 P9 +U 1 1 56EA2D2D +P 1400 9600 +F 0 "P9" H 1400 9750 50 0000 C CNN +F 1 "SCOPE_IN_AC" V 1500 9600 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_1x02" H 1400 9600 60 0001 C CNN +F 3 "" H 1400 9600 60 0000 C CNN + 1 1400 9600 + -1 0 0 1 +$EndComp +$Comp +L CONN_01X02 P5 +U 1 1 56EA3310 +P 1200 9950 +F 0 "P5" H 1200 10100 50 0000 C CNN +F 1 "SCOPE_IN_CH2" V 1300 9950 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_1x02" H 1200 9950 60 0001 C CNN +F 3 "" H 1200 9950 60 0000 C CNN + 1 1200 9950 + -1 0 0 1 +$EndComp +$Comp +L CONN_01X02 P10 +U 1 1 56F2A840 +P 13350 5350 +F 0 "P10" H 13350 5500 50 0000 C CNN +F 1 "CONN_01X02" V 13450 5350 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_1x02" H 13350 5350 50 0001 C CNN +F 3 "" H 13350 5350 50 0000 C CNN + 1 13350 5350 + 1 0 0 -1 +$EndComp +$Comp +L CONN_01X02 P7 +U 1 1 56F2A93D +P 13000 5350 +F 0 "P7" H 13000 5500 50 0000 C CNN +F 1 "CONN_01X02" V 13100 5350 50 0000 C CNN +F 2 "Pin_Headers:Pin_Header_Straight_1x02" H 13000 5350 50 0001 C CNN +F 3 "" H 13000 5350 50 0000 C CNN + 1 13000 5350 + 1 0 0 -1 +$EndComp +Text Label 6300 6700 0 60 ~ 0 +VGND +Text Label 6200 6950 0 60 ~ 0 +VGND +Text Label 6100 6800 0 60 ~ 0 +VGND +Text Label 6000 7100 0 60 ~ 0 +VGND +Text Label 7600 6000 0 60 ~ 0 +VGND +Text Label 4750 9750 0 60 ~ 0 +VGND +Text Label 4100 9150 0 60 ~ 0 +VGND +Text Label 4100 10950 0 60 ~ 0 +VGND +Text Label 7900 3900 0 60 ~ 0 +VGND +Text Label 10800 3900 0 60 ~ 0 +VGND +Text Label 14200 5650 0 60 ~ 0 +VGND +Text Label 10300 10900 0 60 ~ 0 +VGND +Text Label 8500 10600 0 60 ~ 0 +VGND +Text Label 16250 5650 0 60 ~ 0 +VGND +Text Label 8350 9650 0 60 ~ 0 +VGND +Text Label 8300 11950 0 60 ~ 0 +VGND +$Comp +L INDUCTOR L4 +U 1 1 573254B0 +P 14450 5050 +F 0 "L4" V 14400 5050 50 0000 C CNN +F 1 "INDUCTOR" V 14550 5050 50 0000 C CNN +F 2 "Resistors_SMD:R_1210" H 14450 5050 60 0001 C CNN +F 3 "" H 14450 5050 60 0000 C CNN + 1 14450 5050 + 0 1 1 0 +$EndComp +Wire Wire Line + 11150 9250 11150 9350 +Wire Wire Line + 7950 9150 7400 9150 +Wire Wire Line + 11350 9350 12150 9350 +Wire Wire Line + 2150 9950 2350 9950 +Wire Wire Line + 2350 9950 2350 10450 +Wire Wire Line + 2350 10450 3700 10450 +Wire Wire Line + 4700 10800 4700 10550 +Wire Wire Line + 3700 10800 4700 10800 +Wire Wire Line + 3700 10650 3700 10800 +Wire Wire Line + 2350 8650 3700 8650 +Wire Wire Line + 2350 9250 2350 8650 +Wire Wire Line + 4700 9000 4700 8750 +Wire Wire Line + 3700 9000 4700 9000 +Wire Wire Line + 3700 8850 3700 9000 +Connection ~ 1800 9950 +Connection ~ 1800 9250 +Wire Wire Line + 1800 9500 1800 9250 +Wire Wire Line + 1600 9550 1600 9500 +Wire Wire Line + 1600 9650 1600 9700 +Connection ~ 2350 9600 +Connection ~ 2850 9600 +Wire Wire Line + 2350 9600 2850 9600 +Wire Wire Line + 2350 9550 2350 9650 +Wire Wire Line + 2850 9500 2850 9700 +Wire Wire Line + 2150 9250 2350 9250 +Wire Wire Line + 3500 6650 3500 6850 +Connection ~ 3100 7050 +Connection ~ 2700 7050 +Wire Wire Line + 2700 6650 2700 6850 +Wire Wire Line + 1950 6650 2700 6650 +Wire Wire Line + 10800 9250 10850 9250 +Wire Wire Line + 4500 5000 4550 5000 +Wire Wire Line + 4500 5200 4550 5200 +Wire Wire Line + 4500 5400 4550 5400 +Wire Wire Line + 4500 5600 4550 5600 +Wire Wire Line + 4850 5000 5050 5000 +Wire Wire Line + 5050 5000 5050 5150 +Wire Wire Line + 5050 5150 5250 5150 +Wire Wire Line + 4850 5200 5050 5200 +Wire Wire Line + 5050 5200 5050 5250 +Wire Wire Line + 5050 5250 5250 5250 +Wire Wire Line + 4850 5400 5050 5400 +Wire Wire Line + 5050 5400 5050 5350 +Wire Wire Line + 5050 5350 5250 5350 +Wire Wire Line + 4850 5600 5050 5600 +Wire Wire Line + 5050 5600 5050 5450 +Wire Wire Line + 5050 5450 5250 5450 +Wire Wire Line + 3750 5150 4000 5150 +Wire Wire Line + 4000 5150 4000 5000 +Wire Wire Line + 4000 5000 4200 5000 +Wire Wire Line + 4200 5200 4000 5200 +Wire Wire Line + 4000 5200 4000 5250 +Wire Wire Line + 4000 5250 3750 5250 +Wire Wire Line + 3750 5350 4000 5350 +Wire Wire Line + 4000 5350 4000 5400 +Wire Wire Line + 4000 5400 4200 5400 +Wire Wire Line + 3750 5450 4000 5450 +Wire Wire Line + 4000 5450 4000 5600 +Wire Wire Line + 4000 5600 4200 5600 +Wire Wire Line + 5250 6300 5100 6300 +Wire Wire Line + 5250 6200 5100 6200 +Wire Wire Line + 3600 9700 3150 9700 +Wire Wire Line + 3600 9500 3150 9500 +Wire Wire Line + 6100 6600 6100 6800 +Wire Wire Line + 6150 4000 6150 3800 +Wire Wire Line + 13950 3300 13700 3300 +Wire Wire Line + 13950 3600 13550 3600 +Wire Wire Line + 13950 3450 13550 3450 +Wire Wire Line + 13550 3450 13550 2950 +Wire Wire Line + 13550 2950 14350 2950 +Wire Wire Line + 14450 2950 15250 2950 +Wire Wire Line + 15250 2950 15250 3450 +Wire Wire Line + 15250 3450 14850 3450 +Wire Wire Line + 7050 6000 7600 6000 +Wire Wire Line + 5250 6000 4750 6000 +Wire Wire Line + 1550 7250 1950 7250 +Wire Wire Line + 1950 7250 1950 7050 +Wire Wire Line + 9850 5050 9100 5050 +Wire Wire Line + 10450 5050 10950 5050 +Wire Wire Line + 10750 5050 10750 5250 +Connection ~ 10750 5050 +Wire Wire Line + 9800 5200 9800 5050 +Connection ~ 9800 5050 +Wire Wire Line + 9500 5200 9500 5050 +Connection ~ 9500 5050 +Wire Wire Line + 9500 5500 9500 5650 +Connection ~ 9500 5650 +Wire Wire Line + 9800 5500 9800 5650 +Connection ~ 9800 5650 +Wire Wire Line + 11900 5050 11900 5200 +Wire Wire Line + 11600 5200 11600 5050 +Connection ~ 11600 5050 +Wire Wire Line + 11900 5650 11900 5500 +Connection ~ 10750 5650 +Wire Wire Line + 11600 5500 11600 5650 +Connection ~ 11600 5650 +Connection ~ 11900 5050 +Connection ~ 11900 5650 +Connection ~ 12250 5050 +Connection ~ 12250 5650 +Wire Wire Line + 4350 4300 4000 4300 +Wire Wire Line + 4350 4400 3900 4400 +Wire Wire Line + 10450 5450 10100 5450 +Wire Wire Line + 10150 3900 10800 3900 +Wire Wire Line + 5250 4300 5050 4300 +Wire Wire Line + 5050 4300 5050 4400 +Wire Wire Line + 5050 4400 4850 4400 +Wire Wire Line + 5250 4400 5250 4650 +Wire Wire Line + 5250 4650 3650 4650 +Wire Wire Line + 3650 4650 3650 4000 +Wire Wire Line + 3650 4000 4850 4000 +Wire Wire Line + 4850 4000 4850 4300 +Wire Wire Line + 3600 9700 3600 9750 +Wire Wire Line + 3600 9750 4750 9750 +Wire Wire Line + 7900 11450 7350 11450 +Wire Wire Line + 11300 11650 11300 11550 +Wire Wire Line + 11300 11550 11950 11550 +Wire Wire Line + 12800 5650 12800 5400 +Wire Wire Line + 12800 5050 12800 5300 +Connection ~ 12800 5050 +Wire Wire Line + 13650 5350 14450 5350 +Connection ~ 4150 9750 +Wire Wire Line + 13650 5650 14200 5650 +Connection ~ 3500 7050 +Wire Wire Line + 4050 6750 4050 6650 +Wire Wire Line + 4050 6650 3500 6650 +Connection ~ 12800 5650 +Wire Wire Line + 6200 6600 6200 6950 +Wire Wire Line + 6250 4000 6250 3900 +Wire Wire Line + 9150 3600 9400 3600 +Wire Wire Line + 10000 3600 10400 3600 +Connection ~ 10150 3600 +Connection ~ 9200 3600 +Wire Wire Line + 7900 3900 9200 3900 +Wire Wire Line + 7950 9350 7950 9750 +Wire Wire Line + 7950 9750 8550 9750 +Wire Wire Line + 8850 9750 8950 9750 +Wire Wire Line + 8950 9750 8950 9250 +Wire Wire Line + 7950 10350 9700 10350 +Wire Wire Line + 9700 10350 9700 10600 +Wire Wire Line + 9700 10900 10300 10900 +Wire Wire Line + 9700 10750 10350 10750 +Wire Wire Line + 7900 12050 7900 11650 +Wire Wire Line + 8850 12050 8900 12050 +Wire Wire Line + 8900 12050 8900 11550 +Wire Wire Line + 8550 12050 7900 12050 +Wire Wire Line + 7150 10900 8800 10900 +Wire Wire Line + 8800 10750 8100 10750 +Wire Wire Line + 8800 10600 8500 10600 +Wire Wire Line + 8900 11550 10700 11550 +Wire Wire Line + 8950 9250 10500 9250 +Wire Wire Line + 11150 9250 12250 9250 +Wire Wire Line + 12250 9250 12250 10600 +Wire Wire Line + 12150 9350 12150 10700 +Wire Wire Line + 12150 10700 12250 10700 +Wire Wire Line + 11950 11550 11950 10800 +Wire Wire Line + 11950 10800 12250 10800 +Wire Wire Line + 11500 11650 12100 11650 +Wire Wire Line + 12100 11650 12100 10900 +Wire Wire Line + 12100 10900 12250 10900 +Wire Wire Line + 8150 10050 7950 10050 +Wire Wire Line + 7950 10050 7950 10350 +Connection ~ 8150 9750 +Wire Wire Line + 7150 12350 8100 12350 +Wire Wire Line + 7150 12350 7150 10900 +Connection ~ 7900 12350 +Wire Wire Line + 8100 12050 8600 12050 +Connection ~ 8100 12050 +Connection ~ 13650 5050 +Wire Wire Line + 15700 5050 16100 5050 +Wire Wire Line + 16100 5350 16100 5650 +Wire Wire Line + 16100 5650 16500 5650 +Wire Wire Line + 4700 8750 4900 8750 +Wire Wire Line + 4900 9250 4900 9050 +Wire Wire Line + 4150 9250 4900 9250 +Wire Wire Line + 4150 9250 4150 9750 +Wire Wire Line + 4700 10550 4950 10550 +Wire Wire Line + 4950 10250 4950 9950 +Wire Wire Line + 4950 9950 4400 9950 +Wire Wire Line + 4400 9950 4400 9750 +Connection ~ 4400 9750 +Wire Wire Line + 9600 9550 9600 10150 +Wire Wire Line + 9600 10150 10950 10150 +Wire Wire Line + 10950 10150 10950 11100 +Wire Wire Line + 10950 11100 10150 11100 +Wire Wire Line + 10150 11100 10150 10900 +Connection ~ 10150 10900 +Wire Wire Line + 10000 11250 10000 10900 +Connection ~ 10000 10900 +Wire Wire Line + 6300 6700 6300 6600 +Wire Wire Line + 6000 6600 6000 7100 +Wire Wire Line + 1400 9250 1850 9250 +Wire Wire Line + 1400 9200 1400 9300 +Connection ~ 1400 9250 +Wire Wire Line + 1400 9950 1850 9950 +Wire Wire Line + 1800 9950 1800 9700 +Wire Wire Line + 1400 9900 1400 10000 +Connection ~ 1400 9950 +Connection ~ 10000 11550 +Connection ~ 9600 9250 +Connection ~ 7100 4750 +Wire Wire Line + 9100 5650 13150 5650 +Wire Wire Line + 13150 5650 13150 5300 +Connection ~ 13150 5400 +Wire Wire Line + 1950 7050 2200 7050 +Wire Wire Line + 2400 7050 4050 7050 +Wire Wire Line + 2500 7250 2500 7050 +Connection ~ 2500 7050 +Wire Wire Line + 11250 5050 14150 5050 +Wire Wire Line + 14750 5050 15100 5050 +Text Label 13700 3300 0 60 ~ 0 +VGND +Text Label 14850 3600 0 60 ~ 0 +VGND +Text Label 1950 7250 0 60 ~ 0 +USBGND +Wire Wire Line + 3100 6950 3100 7050 +$Comp +L C C19 +U 1 1 575644CB +P 8950 3750 +F 0 "C19" H 8975 3850 50 0000 L CNN +F 1 "C" H 8975 3650 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 8988 3600 50 0001 C CNN +F 3 "" H 8950 3750 50 0000 C CNN + 1 8950 3750 + 1 0 0 -1 +$EndComp +$Comp +L C C18 +U 1 1 57564580 +P 8700 3750 +F 0 "C18" H 8725 3850 50 0000 L CNN +F 1 "C" H 8725 3650 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 8738 3600 50 0001 C CNN +F 3 "" H 8700 3750 50 0000 C CNN + 1 8700 3750 + 1 0 0 -1 +$EndComp +$Comp +L C C17 +U 1 1 57564635 +P 8450 3750 +F 0 "C17" H 8475 3850 50 0000 L CNN +F 1 "C" H 8475 3650 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 8488 3600 50 0001 C CNN +F 3 "" H 8450 3750 50 0000 C CNN + 1 8450 3750 + 1 0 0 -1 +$EndComp +$Comp +L C C12 +U 1 1 575646EC +P 8200 3750 +F 0 "C12" H 8225 3850 50 0000 L CNN +F 1 "C" H 8225 3650 50 0000 L CNN +F 2 "Capacitors_SMD:C_0603" H 8238 3600 50 0001 C CNN +F 3 "" H 8200 3750 50 0000 C CNN + 1 8200 3750 + 1 0 0 -1 +$EndComp +Wire Wire Line + 8200 3600 9200 3600 +Wire Wire Line + 8450 3600 8950 3600 +Connection ~ 8700 3600 +Connection ~ 8450 3600 +Connection ~ 8950 3600 +Wire Wire Line + 8200 3900 8950 3900 +Connection ~ 8700 3900 +Connection ~ 8950 3900 +Connection ~ 8450 3900 +Connection ~ 8200 3900 +Text Label 3900 4400 0 60 ~ 0 +VGND +$EndSCHEMATC diff --git a/PCB/Tinylab_proto1.xml b/PCB/Tinylab_proto1.xml new file mode 100644 index 00000000..f645d020 --- /dev/null +++ b/PCB/Tinylab_proto1.xml @@ -0,0 +1,1152 @@ + + + + C:/Users/Esposch/Documents/KiCAD/Tinylab_proto1/Tinylab_proto1.sch + 23/03/2016 1:51:13 PM + Eeschema 4.0.1-stable + + + + <company/> + <rev/> + <date/> + <source>Tinylab_proto1.sch</source> + <comment number="1" value=""/> + <comment number="2" value=""/> + <comment number="3" value=""/> + <comment number="4" value=""/> + </title_block> + </sheet> + </design> + <components> + <comp ref="U2"> + <value>LM324</value> + <footprint>Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm</footprint> + <libsource lib="Tinylab_proto1-rescue" part="LM324-RESCUE-Tinylab_proto1"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CA87E2</tstamp> + </comp> + <comp ref="IC1"> + <value>ATXMEGA16A4U-A</value> + <footprint>Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm</footprint> + <libsource lib="atmel" part="ATXMEGA16A4U-A"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CA8F25</tstamp> + </comp> + <comp ref="P2"> + <value>USB_OTG</value> + <footprint>Connect:USB_Micro-B_WIDE</footprint> + <libsource lib="conn" part="USB_OTG"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CA90D2</tstamp> + </comp> + <comp ref="U1"> + <value>78L05</value> + <footprint>SMD:SOT-23-3</footprint> + <libsource lib="Tinylab_proto1-rescue" part="78L05-RESCUE-Tinylab_proto1"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CA99FA</tstamp> + </comp> + <comp ref="R1"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CAAB95</tstamp> + </comp> + <comp ref="R3"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CAABF4</tstamp> + </comp> + <comp ref="R5"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CAAC5F</tstamp> + </comp> + <comp ref="R6"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CAACD2</tstamp> + </comp> + <comp ref="R4"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CAAD11</tstamp> + </comp> + <comp ref="R2"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CAAD4C</tstamp> + </comp> + <comp ref="C2"> + <value>C</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C_Small"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CAB4DE</tstamp> + </comp> + <comp ref="C1"> + <value>C</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C_Small"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CAB611</tstamp> + </comp> + <comp ref="C3"> + <value>C_Small</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C_Small"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CB13E1</tstamp> + </comp> + <comp ref="C4"> + <value>C_Small</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C_Small"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CB147C</tstamp> + </comp> + <comp ref="R22"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CB4680</tstamp> + </comp> + <comp ref="C13"> + <value>C</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C_Small"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CB630B</tstamp> + </comp> + <comp ref="R24"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CB9020</tstamp> + </comp> + <comp ref="R11"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBCD2A</tstamp> + </comp> + <comp ref="R7"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBCDA5</tstamp> + </comp> + <comp ref="R13"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBE0F4</tstamp> + </comp> + <comp ref="R9"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBE16B</tstamp> + </comp> + <comp ref="R14"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBE21C</tstamp> + </comp> + <comp ref="R10"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBE2C7</tstamp> + </comp> + <comp ref="R12"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBE362</tstamp> + </comp> + <comp ref="R8"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBE401</tstamp> + </comp> + <comp ref="P3"> + <value>DIG_OUT</value> + <footprint>Pin_Headers:Pin_Header_Straight_1x04</footprint> + <libsource lib="conn" part="CONN_01X04"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBF4D5</tstamp> + </comp> + <comp ref="P7"> + <value>HVO</value> + <footprint>Pin_Headers:Pin_Header_Straight_2x02</footprint> + <libsource lib="conn" part="CONN_02X02"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CC540F</tstamp> + </comp> + <comp ref="C5"> + <value>C_Small</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C_Small"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55D60181</tstamp> + </comp> + <comp ref="U4"> + <value>DMN63D8LDW</value> + <footprint>TO_SOT_Packages_SMD:SOT-363</footprint> + <libsource lib="ESPO_PART" part="DMN63D8LDW"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55D6ACFD</tstamp> + </comp> + <comp ref="P8"> + <value>DIG_IN</value> + <footprint>Pin_Headers:Pin_Header_Straight_1x02</footprint> + <libsource lib="conn" part="CONN_01X02"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55D6DB77</tstamp> + </comp> + <comp ref="F1"> + <value>F_Small</value> + <footprint>Capacitors_SMD:C_1206</footprint> + <libsource lib="device" part="F_Small"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55D739F3</tstamp> + </comp> + <comp ref="L1"> + <value>INDUCTOR</value> + <footprint>Inductors:INDUCTOR_V</footprint> + <libsource lib="device" part="INDUCTOR"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>5606EE9E</tstamp> + </comp> + <comp ref="D1"> + <value>D_Schottky</value> + <footprint>Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10</footprint> + <libsource lib="device" part="D_Schottky"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>5606FDB4</tstamp> + </comp> + <comp ref="C9"> + <value>CP1</value> + <footprint>Capacitors_SMD:c_elec_4x5.3</footprint> + <libsource lib="device" part="CP1"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>560719D9</tstamp> + </comp> + <comp ref="C10"> + <value>C</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56071A50</tstamp> + </comp> + <comp ref="C16"> + <value>C</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>5607355F</tstamp> + </comp> + <comp ref="C15"> + <value>CP1</value> + <footprint>Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5</footprint> + <libsource lib="device" part="CP1"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>560735FE</tstamp> + </comp> + <comp ref="P4"> + <value>PDI</value> + <footprint>Pin_Headers:Pin_Header_Straight_2x02</footprint> + <libsource lib="conn" part="CONN_02X02"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56069A87</tstamp> + </comp> + <comp ref="Q1"> + <value>Q_NMOS_GSD</value> + <footprint>SMD:SOT-23-3</footprint> + <libsource lib="device" part="Q_NMOS_GSD"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>5606F6D4</tstamp> + </comp> + <comp ref="R23"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>566DE721</tstamp> + </comp> + <comp ref="R25"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>566DE7E8</tstamp> + </comp> + <comp ref="C14"> + <value>C</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C_Small"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>566DF655</tstamp> + </comp> + <comp ref="P6"> + <value>DAC_OUT</value> + <footprint>Pin_Headers:Pin_Header_Straight_1x04</footprint> + <libsource lib="conn" part="CONN_01X04"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>566DF832</tstamp> + </comp> + <comp ref="R26"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>566E5C29</tstamp> + </comp> + <comp ref="R27"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>566E5CBE</tstamp> + </comp> + <comp ref="C6"> + <value>CP1</value> + <footprint>Capacitors_SMD:c_elec_5x5.3</footprint> + <libsource lib="device" part="CP1"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>566F5A75</tstamp> + </comp> + <comp ref="R19"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56AECD86</tstamp> + </comp> + <comp ref="C11"> + <value>C</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>5608B4BE</tstamp> + </comp> + <comp ref="C8"> + <value>C</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56AF91A3</tstamp> + </comp> + <comp ref="R17"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56AFE83E</tstamp> + </comp> + <comp ref="R18"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56AFE8F3</tstamp> + </comp> + <comp ref="U3"> + <value>DMN63D8LDW</value> + <footprint>TO_SOT_Packages_SMD:SOT-363</footprint> + <libsource lib="ESPO_PART" part="DMN63D8LDW"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56B012DD</tstamp> + </comp> + <comp ref="R20"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56B0C682</tstamp> + </comp> + <comp ref="R15"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56B0C779</tstamp> + </comp> + <comp ref="R16"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56B0C86E</tstamp> + </comp> + <comp ref="L2"> + <value>INDUCTOR</value> + <footprint>Resistors_SMD:R_1210</footprint> + <libsource lib="device" part="INDUCTOR"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56E88440</tstamp> + </comp> + <comp ref="L3"> + <value>INDUCTOR</value> + <footprint>Resistors_SMD:R_1210</footprint> + <libsource lib="device" part="INDUCTOR"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56E8DA35</tstamp> + </comp> + <comp ref="C7"> + <value>C</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56E8E263</tstamp> + </comp> + <comp ref="R21"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56E9851A</tstamp> + </comp> + <comp ref="R28"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56E985EF</tstamp> + </comp> + <comp ref="R29"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56E9888A</tstamp> + </comp> + <comp ref="R30"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56E98921</tstamp> + </comp> + <comp ref="P1"> + <value>SCOPE_IN_CH1</value> + <footprint>Pin_Headers:Pin_Header_Straight_1x02</footprint> + <libsource lib="conn" part="CONN_01X02"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56EA2C80</tstamp> + </comp> + <comp ref="P9"> + <value>SCOPE_IN_AC</value> + <footprint>Pin_Headers:Pin_Header_Straight_1x02</footprint> + <libsource lib="conn" part="CONN_01X02"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56EA2D2D</tstamp> + </comp> + <comp ref="P5"> + <value>SCOPE_IN_CH2</value> + <footprint>Pin_Headers:Pin_Header_Straight_1x02</footprint> + <libsource lib="conn" part="CONN_01X02"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56EA3310</tstamp> + </comp> + </components> + <libparts> + <libpart lib="Tinylab_proto1-rescue" part="78L05-RESCUE-Tinylab_proto1"> + <fields> + <field name="Reference">U</field> + <field name="Value">78L05-RESCUE-Tinylab_proto1</field> + </fields> + <pins> + <pin num="1" name="GND" type="input"/> + <pin num="2" name="VO" type="power_out"/> + <pin num="3" name="VI" type="input"/> + </pins> + </libpart> + <libpart lib="atmel" part="ATXMEGA16A4U-A"> + <aliases> + <alias>ATXMEGA32A4U-A</alias> + <alias>ATXMEGA64A4U-A</alias> + <alias>ATXMEGA128A4U-A</alias> + </aliases> + <description>TQFP44, 16k Flash, 4k Boot, 2k SRAM, 1k EEPROM, JTAG, USB</description> + <docs>http://www.atmel.com/Images/Atmel-8387-8-and16-bit-AVR-Microcontroller-XMEGA-A4U_Datasheet.pdf</docs> + <fields> + <field name="Reference">IC</field> + <field name="Value">ATXMEGA16A4U-A</field> + <field name="Footprint">TQFP44</field> + </fields> + <pins> + <pin num="1" name="AC5/ADC5/PA5" type="BiDi"/> + <pin num="2" name="AC1OUT/AC6/ADC6/PA6" type="BiDi"/> + <pin num="3" name="AC0OUT/AC7/ADC7/PA7" type="BiDi"/> + <pin num="4" name="AREFB/ADC8/PB0" type="BiDi"/> + <pin num="5" name="ADC9/PB1" type="BiDi"/> + <pin num="6" name="DAC0/ADC10/PB2" type="BiDi"/> + <pin num="7" name="DAC1/ACD11/PB3" type="BiDi"/> + <pin num="8" name="GND" type="power_in"/> + <pin num="9" name="VCC" type="power_in"/> + <pin num="10" name="SDAIN/SDA/~OC0ALS~/OC0A/PC0" type="BiDi"/> + <pin num="11" name="SCLIN/SCL/XCK0/OC0AHS/OC0B/PC1" type="BiDi"/> + <pin num="12" name="SDAOUT/RXD0/~OC0BLS~/OC0C/PC2" type="BiDi"/> + <pin num="13" name="SCLOUT/TXD0/OC0BHS/OC0D/PC3" type="BiDi"/> + <pin num="14" name="~SS~/~OC0CLS~/OC1A/PC4" type="BiDi"/> + <pin num="15" name="MOSI/XCK1/OC0CHS/OC1B/PC5" type="BiDi"/> + <pin num="16" name="CLKRTC/MISO/RXD1/~OC0DLS~/PC6" type="BiDi"/> + <pin num="17" name="EVOUT/CLKOUT/SCK/TXD1/OC0DHS/PC7" type="BiDi"/> + <pin num="18" name="GND" type="power_in"/> + <pin num="19" name="VCC" type="power_in"/> + <pin num="20" name="PD0/OC0A" type="BiDi"/> + <pin num="21" name="PD1/OC0B/XCK0" type="BiDi"/> + <pin num="22" name="PD2/OC0C/RXD0" type="BiDi"/> + <pin num="23" name="PD3/OC0D/TXD0" type="BiDi"/> + <pin num="24" name="PD4/OC1A/~SS~" type="BiDi"/> + <pin num="25" name="PD5/OC1B/XCK1/MOSI" type="BiDi"/> + <pin num="26" name="PD6/D-/RXD1/MISO" type="BiDi"/> + <pin num="27" name="PD7/D+/TXD1/SCK/CLKOUT/EVOUT" type="BiDi"/> + <pin num="28" name="PE0/OC0A/SDA" type="BiDi"/> + <pin num="29" name="PE1/OC0B/XCK0/SCL" type="BiDi"/> + <pin num="30" name="GND" type="power_in"/> + <pin num="31" name="VCC" type="power_in"/> + <pin num="32" name="PE2/OC0C/RXD0" type="BiDi"/> + <pin num="33" name="PE3/OC0D/TXD0" type="BiDi"/> + <pin num="34" name="PDI_DATA" type="input"/> + <pin num="35" name="~RESET~/PDI_CLK" type="input"/> + <pin num="36" name="PR0/XTAL2/TOSC2" type="BiDi"/> + <pin num="37" name="PR1/XTAL1/TOSC1" type="BiDi"/> + <pin num="38" name="GND" type="power_in"/> + <pin num="39" name="AVCC" type="power_in"/> + <pin num="40" name="AREFA/AC0/ADC0/PA0" type="BiDi"/> + <pin num="41" name="AC1/ADC1/PA1" type="BiDi"/> + <pin num="42" name="AC2/ADC2/PA2" type="BiDi"/> + <pin num="43" name="AC3/ADC3/PA3" type="BiDi"/> + <pin num="44" name="AC4/ADC4/PA4" type="BiDi"/> + </pins> + </libpart> + <libpart lib="device" part="C"> + <description>Unpolarized capacitor</description> + <footprints> + <fp>C?</fp> + <fp>C_????_*</fp> + <fp>C_????</fp> + <fp>SMD*_c</fp> + <fp>Capacitor*</fp> + </footprints> + <fields> + <field name="Reference">C</field> + <field name="Value">C</field> + </fields> + <pins> + <pin num="1" name="~" type="passive"/> + <pin num="2" name="~" type="passive"/> + </pins> + </libpart> + <libpart lib="conn" part="CONN_01X02"> + <description>Connector 01x02</description> + <footprints> + <fp>Pin_Header_Straight_1X02</fp> + <fp>Pin_Header_Angled_1X02</fp> + <fp>Socket_Strip_Straight_1X02</fp> + <fp>Socket_Strip_Angled_1X02</fp> + </footprints> + <fields> + <field name="Reference">P</field> + <field name="Value">CONN_01X02</field> + </fields> + <pins> + <pin num="1" name="P1" type="passive"/> + <pin num="2" name="P2" type="passive"/> + </pins> + </libpart> + <libpart lib="conn" part="CONN_01X04"> + <description>Connector 01x04</description> + <footprints> + <fp>Pin_Header_Straight_1X04</fp> + <fp>Pin_Header_Angled_1X04</fp> + <fp>Socket_Strip_Straight_1X04</fp> + <fp>Socket_Strip_Angled_1X04</fp> + </footprints> + <fields> + <field name="Reference">P</field> + <field name="Value">CONN_01X04</field> + </fields> + <pins> + <pin num="1" name="P1" type="passive"/> + <pin num="2" name="P2" type="passive"/> + <pin num="3" name="P3" type="passive"/> + <pin num="4" name="P4" type="passive"/> + </pins> + </libpart> + <libpart lib="conn" part="CONN_02X02"> + <description>Connector 02x02</description> + <footprints> + <fp>Pin_Header_Straight_2X02</fp> + <fp>Pin_Header_Angled_2X02</fp> + <fp>Socket_Strip_Straight_2X02</fp> + <fp>Socket_Strip_Angled_2X02</fp> + </footprints> + <fields> + <field name="Reference">P</field> + <field name="Value">CONN_02X02</field> + </fields> + <pins> + <pin num="1" name="P1" type="passive"/> + <pin num="2" name="P2" type="passive"/> + <pin num="3" name="P3" type="passive"/> + <pin num="4" name="P4" type="passive"/> + </pins> + </libpart> + <libpart lib="device" part="CP1"> + <description>Polarised capacitor</description> + <footprints> + <fp>SMD*_Pol</fp> + <fp>c_elec*</fp> + <fp>C*elec</fp> + <fp>TantalC*</fp> + <fp>Elko*</fp> + <fp>CP*</fp> + </footprints> + <fields> + <field name="Reference">C</field> + <field name="Value">CP1</field> + </fields> + <pins> + <pin num="1" name="~" type="passive"/> + <pin num="2" name="~" type="passive"/> + </pins> + </libpart> + <libpart lib="device" part="C_Small"> + <description>Unpolarized capacitor</description> + <footprints> + <fp>C?</fp> + <fp>C_????_*</fp> + <fp>C_????</fp> + <fp>SMD*_c</fp> + <fp>Capacitor*</fp> + </footprints> + <fields> + <field name="Reference">C</field> + <field name="Value">C_Small</field> + </fields> + <pins> + <pin num="1" name="~" type="passive"/> + <pin num="2" name="~" type="passive"/> + </pins> + </libpart> + <libpart lib="ESPO_PART" part="DMN63D8LDW"> + <fields> + <field name="Reference">U</field> + <field name="Value">DMN63D8LDW</field> + </fields> + <pins> + <pin num="1" name="S1" type="input"/> + <pin num="2" name="G1" type="input"/> + <pin num="3" name="D2" type="input"/> + <pin num="4" name="S2" type="input"/> + <pin num="5" name="G2" type="input"/> + <pin num="6" name="D1" type="input"/> + </pins> + </libpart> + <libpart lib="device" part="D_Schottky"> + <description>Diode schottky</description> + <footprints> + <fp>D-Pak_TO252AA</fp> + <fp>Diode_*</fp> + <fp>*SingleDiode</fp> + <fp>*SingleDiode*</fp> + <fp>*_Diode_*</fp> + </footprints> + <fields> + <field name="Reference">D</field> + <field name="Value">D_Schottky</field> + </fields> + <pins> + <pin num="1" name="K" type="passive"/> + <pin num="2" name="A" type="passive"/> + </pins> + </libpart> + <libpart lib="device" part="F_Small"> + <description>Fuse</description> + <footprints> + <fp>CP*</fp> + <fp>SM*</fp> + </footprints> + <fields> + <field name="Reference">F</field> + <field name="Value">F_Small</field> + </fields> + <pins> + <pin num="1" name="~" type="passive"/> + <pin num="2" name="~" type="passive"/> + </pins> + </libpart> + <libpart lib="device" part="INDUCTOR"> + <fields> + <field name="Reference">L</field> + <field name="Value">INDUCTOR</field> + </fields> + <pins> + <pin num="1" name="1" type="passive"/> + <pin num="2" name="2" type="passive"/> + </pins> + </libpart> + <libpart lib="Tinylab_proto1-rescue" part="LM324-RESCUE-Tinylab_proto1"> + <fields> + <field name="Reference">U</field> + <field name="Value">LM324-RESCUE-Tinylab_proto1</field> + </fields> + <pins> + <pin num="1" name="~" type="output"/> + <pin num="2" name="-" type="input"/> + <pin num="3" name="+" type="input"/> + <pin num="4" name="V+" type="power_in"/> + <pin num="5" name="+" type="input"/> + <pin num="6" name="-" type="input"/> + <pin num="7" name="~" type="output"/> + <pin num="8" name="~" type="output"/> + <pin num="9" name="-" type="input"/> + <pin num="10" name="+" type="input"/> + <pin num="11" name="V-" type="power_in"/> + <pin num="12" name="+" type="input"/> + <pin num="13" name="-" type="input"/> + <pin num="14" name="~" type="output"/> + </pins> + </libpart> + <libpart lib="device" part="Q_NMOS_GSD"> + <description>Transistor N-MOSFET (general)</description> + <fields> + <field name="Reference">Q</field> + <field name="Value">Q_NMOS_GSD</field> + </fields> + <pins> + <pin num="1" name="G" type="input"/> + <pin num="2" name="S" type="passive"/> + <pin num="3" name="D" type="passive"/> + </pins> + </libpart> + <libpart lib="device" part="R"> + <description>Resistor</description> + <footprints> + <fp>R_*</fp> + <fp>Resistor_*</fp> + </footprints> + <fields> + <field name="Reference">R</field> + <field name="Value">R</field> + </fields> + <pins> + <pin num="1" name="~" type="passive"/> + <pin num="2" name="~" type="passive"/> + </pins> + </libpart> + <libpart lib="conn" part="USB_OTG"> + <description>micro/mini connector</description> + <footprints> + <fp>USB*</fp> + </footprints> + <fields> + <field name="Reference">P</field> + <field name="Value">USB_OTG</field> + </fields> + <pins> + <pin num="1" name="VCC" type="power_out"/> + <pin num="2" name="D-" type="passive"/> + <pin num="3" name="D+" type="passive"/> + <pin num="4" name="ID" type="power_in"/> + <pin num="5" name="GND" type="power_in"/> + <pin num="6" name="shield" type="passive"/> + </pins> + </libpart> + </libparts> + <libraries> + <library logical="Tinylab_proto1-rescue"> + <uri>C:\Users\Esposch\Documents\KiCAD\Tinylab_proto1\Tinylab_proto1-rescue.lib</uri> + </library> + <library logical="device"> + <uri>C:\Program Files\KiCad\share\kicad\library\device.lib</uri> + </library> + <library logical="conn"> + <uri>C:\Program Files\KiCad\share\kicad\library\conn.lib</uri> + </library> + <library logical="atmel"> + <uri>C:\Program Files\KiCad\share\kicad\library\atmel.lib</uri> + </library> + <library logical="ESPO_PART"> + <uri>C:\Users\Esposch\Documents\KiCAD\ESPO_PART.lib</uri> + </library> + </libraries> + <nets> + <net code="1" name="Net-(IC1-Pad28)"> + <node ref="IC1" pin="28"/> + <node ref="R11" pin="1"/> + </net> + <net code="2" name="Net-(P3-Pad3)"> + <node ref="R8" pin="2"/> + <node ref="P3" pin="3"/> + </net> + <net code="3" name="Net-(P3-Pad4)"> + <node ref="R7" pin="2"/> + <node ref="P3" pin="4"/> + </net> + <net code="4" name="Net-(IC1-Pad33)"> + <node ref="R14" pin="1"/> + <node ref="IC1" pin="33"/> + </net> + <net code="5" name="Net-(IC1-Pad32)"> + <node ref="R13" pin="1"/> + <node ref="IC1" pin="32"/> + </net> + <net code="6" name="Net-(IC1-Pad29)"> + <node ref="R12" pin="1"/> + <node ref="IC1" pin="29"/> + </net> + <net code="7" name="Net-(R10-Pad1)"> + <node ref="R14" pin="2"/> + <node ref="R10" pin="1"/> + </net> + <net code="8" name="Net-(R13-Pad2)"> + <node ref="R13" pin="2"/> + <node ref="R9" pin="1"/> + </net> + <net code="9" name="Net-(R12-Pad2)"> + <node ref="R12" pin="2"/> + <node ref="R8" pin="1"/> + </net> + <net code="10" name="Net-(R11-Pad2)"> + <node ref="R11" pin="2"/> + <node ref="R7" pin="1"/> + </net> + <net code="11" name="Net-(R22-Pad1)"> + <node ref="R24" pin="2"/> + <node ref="R22" pin="1"/> + </net> + <net code="12" name="Net-(R1-Pad1)"> + <node ref="R3" pin="1"/> + <node ref="R1" pin="1"/> + <node ref="U2" pin="3"/> + </net> + <net code="13" name="Net-(P8-Pad1)"> + <node ref="U4" pin="5"/> + <node ref="P8" pin="1"/> + </net> + <net code="14" name="Net-(D1-Pad2)"> + <node ref="D1" pin="2"/> + <node ref="L1" pin="1"/> + <node ref="Q1" pin="3"/> + </net> + <net code="15" name="Net-(P8-Pad2)"> + <node ref="U4" pin="2"/> + <node ref="P8" pin="2"/> + </net> + <net code="16" name="/AVCC_ON_2"> + <node ref="IC1" pin="44"/> + <node ref="R3" pin="2"/> + <node ref="R5" pin="2"/> + <node ref="R4" pin="1"/> + <node ref="R6" pin="2"/> + </net> + <net code="17" name="/DIG_CH1"> + <node ref="IC1" pin="17"/> + <node ref="U4" pin="6"/> + </net> + <net code="18" name="/AVCC"> + <node ref="IC1" pin="39"/> + <node ref="C8" pin="1"/> + <node ref="C5" pin="1"/> + <node ref="R5" pin="1"/> + <node ref="L2" pin="2"/> + </net> + <net code="19" name="/D-"> + <node ref="IC1" pin="26"/> + <node ref="P2" pin="2"/> + </net> + <net code="20" name="/D+"> + <node ref="P2" pin="3"/> + <node ref="IC1" pin="27"/> + </net> + <net code="21" name="Net-(P3-Pad1)"> + <node ref="R10" pin="2"/> + <node ref="P3" pin="1"/> + </net> + <net code="22" name="Net-(P3-Pad2)"> + <node ref="R9" pin="2"/> + <node ref="P3" pin="2"/> + </net> + <net code="23" name="/USBGND"> + <node ref="C5" pin="2"/> + <node ref="U4" pin="1"/> + <node ref="F1" pin="1"/> + <node ref="P4" pin="3"/> + <node ref="U2" pin="11"/> + <node ref="IC1" pin="38"/> + <node ref="C8" pin="2"/> + <node ref="U3" pin="1"/> + <node ref="U3" pin="4"/> + <node ref="IC1" pin="18"/> + <node ref="C11" pin="2"/> + <node ref="IC1" pin="14"/> + <node ref="R6" pin="1"/> + <node ref="C4" pin="2"/> + <node ref="U1" pin="1"/> + <node ref="P2" pin="6"/> + <node ref="P2" pin="5"/> + <node ref="R27" pin="2"/> + <node ref="C6" pin="2"/> + <node ref="U4" pin="4"/> + <node ref="C3" pin="2"/> + <node ref="IC1" pin="30"/> + <node ref="IC1" pin="8"/> + <node ref="R21" pin="2"/> + <node ref="R28" pin="1"/> + <node ref="R29" pin="2"/> + <node ref="R30" pin="1"/> + <node ref="C7" pin="2"/> + </net> + <net code="24" name="Net-(R20-Pad1)"> + <node ref="U2" pin="14"/> + <node ref="R30" pin="2"/> + <node ref="R20" pin="1"/> + <node ref="R23" pin="2"/> + </net> + <net code="25" name="Net-(R19-Pad1)"> + <node ref="R22" pin="2"/> + <node ref="R19" pin="1"/> + <node ref="R29" pin="1"/> + <node ref="U2" pin="8"/> + </net> + <net code="26" name="/OPAMP_VCC"> + <node ref="U2" pin="4"/> + <node ref="C7" pin="1"/> + <node ref="L3" pin="1"/> + </net> + <net code="27" name="Net-(R15-Pad1)"> + <node ref="R15" pin="1"/> + <node ref="R20" pin="2"/> + <node ref="U2" pin="13"/> + <node ref="R16" pin="1"/> + </net> + <net code="28" name="Net-(R2-Pad1)"> + <node ref="R4" pin="2"/> + <node ref="R2" pin="1"/> + <node ref="U2" pin="5"/> + </net> + <net code="29" name="Net-(C2-Pad2)"> + <node ref="P9" pin="1"/> + <node ref="C2" pin="2"/> + </net> + <net code="30" name="Net-(C1-Pad2)"> + <node ref="P9" pin="2"/> + <node ref="C1" pin="2"/> + </net> + <net code="31" name="Net-(C13-Pad1)"> + <node ref="P6" pin="2"/> + <node ref="C13" pin="1"/> + </net> + <net code="32" name="Net-(R15-Pad2)"> + <node ref="R16" pin="2"/> + <node ref="U3" pin="6"/> + <node ref="R15" pin="2"/> + </net> + <net code="33" name="Net-(C14-Pad1)"> + <node ref="C14" pin="1"/> + <node ref="P6" pin="4"/> + </net> + <net code="34" name="Net-(C14-Pad2)"> + <node ref="R25" pin="1"/> + <node ref="C14" pin="2"/> + <node ref="P6" pin="3"/> + </net> + <net code="35" name="Net-(C13-Pad2)"> + <node ref="P6" pin="1"/> + <node ref="R24" pin="1"/> + <node ref="C13" pin="2"/> + </net> + <net code="36" name="Net-(R17-Pad2)"> + <node ref="R17" pin="2"/> + <node ref="R18" pin="2"/> + <node ref="U3" pin="3"/> + </net> + <net code="38" name="Net-(C2-Pad1)"> + <node ref="C2" pin="1"/> + <node ref="P5" pin="2"/> + <node ref="R2" pin="2"/> + <node ref="P5" pin="1"/> + </net> + <net code="39" name="Net-(C1-Pad1)"> + <node ref="C1" pin="1"/> + <node ref="R1" pin="2"/> + <node ref="P1" pin="2"/> + <node ref="P1" pin="1"/> + </net> + <net code="40" name="Net-(IC1-Pad34)"> + <node ref="IC1" pin="34"/> + <node ref="P4" pin="2"/> + </net> + <net code="41" name="Net-(IC1-Pad35)"> + <node ref="P4" pin="4"/> + <node ref="IC1" pin="35"/> + </net> + <net code="42" name="/PSU_PWM"> + <node ref="IC1" pin="24"/> + <node ref="Q1" pin="1"/> + </net> + <net code="43" name="/VCC_3V3"> + <node ref="IC1" pin="31"/> + <node ref="L2" pin="1"/> + <node ref="U1" pin="2"/> + <node ref="IC1" pin="19"/> + <node ref="C6" pin="1"/> + <node ref="C4" pin="1"/> + <node ref="C11" pin="1"/> + <node ref="P4" pin="1"/> + </net> + <net code="44" name="+5V"> + <node ref="P2" pin="1"/> + <node ref="C3" pin="1"/> + <node ref="U1" pin="3"/> + <node ref="C10" pin="1"/> + <node ref="C9" pin="1"/> + <node ref="L1" pin="2"/> + </net> + <net code="45" name="/DAC_OUT2"> + <node ref="IC1" pin="7"/> + <node ref="U2" pin="12"/> + </net> + <net code="46" name="Net-(P2-Pad4)"> + <node ref="P2" pin="4"/> + </net> + <net code="47" name="Net-(IC1-Pad20)"> + <node ref="IC1" pin="20"/> + </net> + <net code="48" name="Net-(IC1-Pad10)"> + <node ref="IC1" pin="10"/> + </net> + <net code="49" name="Net-(IC1-Pad9)"> + <node ref="IC1" pin="9"/> + </net> + <net code="50" name="/DAC_OUT"> + <node ref="IC1" pin="6"/> + <node ref="U2" pin="10"/> + </net> + <net code="51" name="/TO_B1"> + <node ref="IC1" pin="5"/> + <node ref="U3" pin="5"/> + </net> + <net code="52" name="/TO_B0"> + <node ref="U3" pin="2"/> + <node ref="IC1" pin="4"/> + </net> + <net code="53" name="Net-(IC1-Pad3)"> + <node ref="IC1" pin="3"/> + </net> + <net code="54" name="/CH2"> + <node ref="U2" pin="6"/> + <node ref="R28" pin="2"/> + <node ref="IC1" pin="2"/> + <node ref="IC1" pin="40"/> + <node ref="U2" pin="7"/> + </net> + <net code="55" name="Net-(IC1-Pad37)"> + <node ref="IC1" pin="37"/> + </net> + <net code="56" name="Net-(IC1-Pad36)"> + <node ref="IC1" pin="36"/> + </net> + <net code="57" name="Net-(IC1-Pad16)"> + <node ref="IC1" pin="16"/> + </net> + <net code="58" name="Net-(IC1-Pad25)"> + <node ref="IC1" pin="25"/> + </net> + <net code="59" name="Net-(IC1-Pad43)"> + <node ref="IC1" pin="43"/> + </net> + <net code="60" name="Net-(IC1-Pad23)"> + <node ref="IC1" pin="23"/> + </net> + <net code="61" name="Net-(IC1-Pad13)"> + <node ref="IC1" pin="13"/> + </net> + <net code="62" name="/CH1"> + <node ref="IC1" pin="42"/> + <node ref="U2" pin="1"/> + <node ref="U2" pin="2"/> + <node ref="R21" pin="1"/> + </net> + <net code="63" name="Net-(IC1-Pad22)"> + <node ref="IC1" pin="22"/> + </net> + <net code="64" name="Net-(IC1-Pad41)"> + <node ref="IC1" pin="41"/> + </net> + <net code="65" name="Net-(IC1-Pad21)"> + <node ref="IC1" pin="21"/> + </net> + <net code="66" name="/XCK"> + <node ref="IC1" pin="11"/> + <node ref="IC1" pin="15"/> + </net> + <net code="67" name="/PSU_FEEDBACK"> + <node ref="R27" pin="1"/> + <node ref="R26" pin="2"/> + <node ref="IC1" pin="1"/> + </net> + <net code="68" name="Net-(R23-Pad1)"> + <node ref="R23" pin="1"/> + <node ref="R25" pin="2"/> + </net> + <net code="69" name="/VGND"> + <node ref="F1" pin="2"/> + <node ref="P7" pin="4"/> + <node ref="P7" pin="3"/> + <node ref="P7" pin="2"/> + <node ref="C15" pin="2"/> + <node ref="C9" pin="2"/> + <node ref="C16" pin="2"/> + <node ref="C10" pin="2"/> + <node ref="Q1" pin="2"/> + </net> + <net code="70" name="/PSU_OUT"> + <node ref="D1" pin="1"/> + <node ref="L3" pin="2"/> + <node ref="R26" pin="1"/> + <node ref="C15" pin="1"/> + <node ref="P7" pin="1"/> + <node ref="C16" pin="1"/> + </net> + <net code="71" name="Net-(R17-Pad1)"> + <node ref="R18" pin="1"/> + <node ref="R19" pin="2"/> + <node ref="U2" pin="9"/> + <node ref="R17" pin="1"/> + </net> + <net code="72" name="/DIG_CH2"> + <node ref="U4" pin="3"/> + <node ref="IC1" pin="12"/> + </net> + </nets> +</export> diff --git a/PCB/WOT/Tinylab_proto1-B_Cu.gbr b/PCB/WOT/Tinylab_proto1-B_Cu.gbr new file mode 100644 index 00000000..95c142f0 --- /dev/null +++ b/PCB/WOT/Tinylab_proto1-B_Cu.gbr @@ -0,0 +1,480 @@ +G04 #@! TF.FileFunction,Copper,L2,Bot,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 28/09/2015 12:51:56 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11C,1.501140*% +%ADD12C,1.998980*% +%ADD13R,1.998980X1.998980*% +%ADD14R,2.032000X1.727200*% +%ADD15O,2.032000X1.727200*% +%ADD16O,0.950000X1.250000*% +%ADD17O,1.550000X1.000000*% +%ADD18R,1.727200X2.032000*% +%ADD19O,1.727200X2.032000*% +%ADD20R,1.727200X1.727200*% +%ADD21O,1.727200X1.727200*% +%ADD22R,2.032000X2.032000*% +%ADD23O,2.032000X2.032000*% +%ADD24C,0.600000*% +%ADD25C,1.160000*% +%ADD26C,0.580000*% +%ADD27C,0.254000*% +G04 APERTURE END LIST* +D10* +D11* +X70855840Y-128137920D03* +X70855840Y-125597920D03* +X69230240Y-141175740D03* +X69230240Y-138635740D03* +D12* +X63820040Y-134800340D03* +D13* +X73980040Y-134800340D03* +D12* +X74117200Y-131899660D03* +D13* +X63957200Y-131899660D03* +D14* +X36258500Y-146100800D03* +D15* +X36258500Y-148640800D03* +X36258500Y-151180800D03* +X36258500Y-153720800D03* +D16* +X40127360Y-133399260D03* +X40127360Y-138399260D03* +D17* +X37427360Y-132399260D03* +X37427360Y-139399260D03* +D18* +X64861440Y-154310080D03* +D19* +X67401440Y-154310080D03* +X69941440Y-154310080D03* +X72481440Y-154310080D03* +D20* +X57718960Y-123718320D03* +D21* +X57718960Y-126258320D03* +X55178960Y-123718320D03* +X55178960Y-126258320D03* +D18* +X49342040Y-125089920D03* +D19* +X46802040Y-125089920D03* +X44262040Y-125089920D03* +D22* +X61328300Y-154012900D03* +D23* +X58788300Y-154012900D03* +D22* +X73741280Y-144505680D03* +D23* +X71201280Y-144505680D03* +D22* +X65714880Y-122570240D03* +D23* +X63174880Y-122570240D03* +D24* +X49890680Y-149565360D03* +X55636160Y-147949920D03* +X46583600Y-149489160D03* +X46431200Y-134172960D03* +X53213000Y-126862840D03* +X49946560Y-128727200D03* +X63261240Y-126908560D03* +X63362840Y-128930400D03* +X51450240Y-144231360D03* +X45496480Y-149270720D03* +X54218840Y-133852920D03* +X52466240Y-133868160D03* +X55544720Y-144200880D03* +X45577760Y-151079200D03* +X48381920Y-142179040D03* +X51628040Y-149618700D03* +X43665140Y-144449800D03* +X65603120Y-128579880D03* +X57708800Y-146177000D03* +X61305440Y-144912080D03* +X56306720Y-141046200D03* +X48823880Y-144795240D03* +X55707280Y-150850600D03* +X56687720Y-146212560D03* +X55859680Y-128635760D03* +X57246520Y-128625600D03* +X58968640Y-128595120D03* +X60071000Y-126959360D03* +X60858400Y-130210560D03* +X58440320Y-132730240D03* +X54193440Y-133014720D03* +X50942240Y-133278880D03* +X45326300Y-135536940D03* +X42057320Y-135559800D03* +X45453300Y-136692640D03* +X42092880Y-136486900D03* +X71241920Y-147243800D03* +X51099720Y-137353040D03* +X68813680Y-147106640D03* +X50678080Y-138054080D03* +X66212720Y-147050760D03* +X49982120Y-139420600D03* +X63113920Y-146324320D03* +X50881280Y-139476480D03* +X51551840Y-132344160D03* +X55011320Y-127955040D03* +X57383680Y-133664960D03* +X55265320Y-136585960D03* +X52491640Y-136652000D03* +X56509920Y-144028160D03* +X52202080Y-147177760D03* +X57952640Y-141041120D03* +X48828960Y-143804640D03* +X45557440Y-145796000D03* +X44500800Y-147096480D03* +X64119760Y-127284480D03* +X61132720Y-128452880D03* +X60192920Y-147203160D03* +X57876440Y-149839680D03* +D25* +X46583600Y-144424400D02* +X46583600Y-134325360D01* +X46583600Y-134325360D02* +X46431200Y-134172960D01* +X49342040Y-125089920D02* +X49342040Y-127086360D01* +X49342040Y-127086360D02* +X48061880Y-128366520D01* +X48061880Y-128366520D02* +X46126400Y-128366520D01* +X46126400Y-128366520D02* +X45029120Y-129463800D01* +X45029120Y-129463800D02* +X45029120Y-132557520D01* +X45029120Y-132557520D02* +X46431200Y-133959600D01* +X46431200Y-133959600D02* +X46431200Y-134172960D01* +D26* +X49890680Y-149565360D02* +X51384200Y-148071840D01* +X51384200Y-148071840D02* +X55514240Y-148071840D01* +X55514240Y-148071840D02* +X55636160Y-147949920D01* +D27* +X55514240Y-148071840D02* +X51384200Y-148071840D01* +X55636160Y-147949920D02* +X55514240Y-148071840D01* +D26* +X46431200Y-134172960D02* +X46431200Y-133959600D01* +X48061880Y-128366520D02* +X49342040Y-127086360D01* +X46126400Y-128366520D02* +X48061880Y-128366520D01* +X45029120Y-129463800D02* +X46126400Y-128366520D01* +X45029120Y-132557520D02* +X45029120Y-129463800D01* +X46431200Y-133959600D02* +X45029120Y-132557520D01* +X46583600Y-144424400D02* +X46583600Y-149489160D01* +X46431200Y-134172960D02* +X46583600Y-134325360D01* +D27* +X53213000Y-126862840D02* +X53213000Y-125547120D01* +X53213000Y-125547120D02* +X55041800Y-123718320D01* +X55041800Y-123718320D02* +X55178960Y-123718320D01* +D25* +X51810920Y-126862840D02* +X53213000Y-126862840D01* +X49946560Y-128727200D02* +X51810920Y-126862840D01* +D27* +X63362840Y-127010160D02* +X63362840Y-128930400D01* +X63261240Y-126908560D02* +X63362840Y-127010160D01* +X50596800Y-145084800D02* +X51450240Y-144231360D01* +X50596800Y-146690080D02* +X50596800Y-145084800D01* +X46959520Y-150327360D02* +X50596800Y-146690080D01* +X46248320Y-150327360D02* +X46959520Y-150327360D01* +X45943520Y-150022560D02* +X46248320Y-150327360D01* +X45943520Y-149717760D02* +X45943520Y-150022560D01* +X45496480Y-149270720D02* +X45943520Y-149717760D01* +D26* +X52481480Y-133852920D02* +X54218840Y-133852920D01* +X52466240Y-133868160D02* +X52481480Y-133852920D01* +D27* +X53492400Y-144200880D02* +X55544720Y-144200880D01* +X51673760Y-146019520D02* +X53492400Y-144200880D01* +X51673760Y-146588480D02* +X51673760Y-146019520D01* +X48585120Y-149677120D02* +X51673760Y-146588480D01* +X48585120Y-150591520D02* +X48585120Y-149677120D01* +X47589440Y-151587200D02* +X48585120Y-150591520D01* +X46085760Y-151587200D02* +X47589440Y-151587200D01* +X45577760Y-151079200D02* +X46085760Y-151587200D01* +D25* +X74117200Y-131899660D02* +X74117200Y-128859280D01* +X74117200Y-128859280D02* +X70855840Y-125597920D01* +X50068480Y-134701280D02* +X50068480Y-135397240D01* +X50078640Y-135407400D02* +X51120040Y-135407400D01* +X50068480Y-135397240D02* +X50078640Y-135407400D01* +X48381920Y-142179040D02* +X48381920Y-136387840D01* +X57297320Y-135407400D02* +X62585600Y-130119120D01* +X51120040Y-135407400D02* +X57297320Y-135407400D01* +X48381920Y-136387840D02* +X50068480Y-134701280D01* +X62585600Y-130119120D02* +X64063880Y-130119120D01* +D26* +X48381920Y-142179040D02* +X48768000Y-141792960D01* +X48768000Y-141792960D02* +X48768000Y-136387840D01* +X48768000Y-136387840D02* +X50434240Y-134721600D01* +X50434240Y-134721600D02* +X57972960Y-134721600D01* +X57972960Y-134721600D02* +X57983120Y-134721600D01* +X57983120Y-134721600D02* +X61501020Y-131203700D01* +X61501020Y-131203700D02* +X62585600Y-130119120D01* +X62585600Y-130119120D02* +X63809880Y-130119120D01* +X63809880Y-130119120D02* +X64063880Y-130119120D01* +D25* +X51628040Y-151770080D02* +X51628040Y-149618700D01* +X49001680Y-154396440D02* +X51628040Y-151770080D01* +X43190160Y-154396440D02* +X49001680Y-154396440D01* +X42044620Y-153250900D02* +X43190160Y-154396440D01* +X42044620Y-146070320D02* +X42044620Y-153250900D01* +X43665140Y-144449800D02* +X42044620Y-146070320D01* +X64063880Y-130119120D02* +X65603120Y-128579880D01* +X66045080Y-128137920D02* +X65603120Y-128579880D01* +D27* +X66045080Y-128137920D02* +X65603120Y-128579880D01* +D26* +X64063880Y-130119120D02* +X65603120Y-128579880D01* +D25* +X61305440Y-144988280D02* +X61305440Y-144912080D01* +X60431680Y-145862040D02* +X61305440Y-144988280D01* +X58023760Y-145862040D02* +X60431680Y-145862040D01* +D26* +X57708800Y-146177000D02* +X58023760Y-145862040D01* +D25* +X70855840Y-128137920D02* +X66045080Y-128137920D01* +X73741280Y-144505680D02* +X73741280Y-143146780D01* +X73741280Y-143146780D02* +X69230240Y-138635740D01* +D26* +X73741280Y-143146780D02* +X69230240Y-138635740D01* +D25* +X63820040Y-134800340D02* +X63820040Y-132036820D01* +X63820040Y-132036820D02* +X63957200Y-131899660D01* +D27* +X53868320Y-143484600D02* +X56306720Y-141046200D01* +X50134520Y-143484600D02* +X53868320Y-143484600D01* +X48823880Y-144795240D02* +X50134520Y-143484600D01* +X56769000Y-149788880D02* +X55707280Y-150850600D01* +X56769000Y-146293840D02* +X56769000Y-149788880D01* +X56687720Y-146212560D02* +X56769000Y-146293840D01* +X57236360Y-128635760D02* +X55859680Y-128635760D01* +X57246520Y-128625600D02* +X57236360Y-128635760D01* +X58968640Y-128061720D02* +X58968640Y-128595120D01* +X60071000Y-126959360D02* +X58968640Y-128061720D01* +X60858400Y-130312160D02* +X60858400Y-130210560D01* +X58440320Y-132730240D02* +X60858400Y-130312160D01* +X51206400Y-133014720D02* +X54193440Y-133014720D01* +X50942240Y-133278880D02* +X51206400Y-133014720D01* +X42080180Y-135536940D02* +X45326300Y-135536940D01* +X42057320Y-135559800D02* +X42080180Y-135536940D01* +X42298620Y-136692640D02* +X45453300Y-136692640D01* +X42092880Y-136486900D02* +X42298620Y-136692640D01* +X70434200Y-147243800D02* +X71241920Y-147243800D01* +X69093080Y-145902680D02* +X70434200Y-147243800D01* +X66771520Y-145902680D02* +X69093080Y-145902680D01* +X66492120Y-145623280D02* +X66771520Y-145902680D01* +X66492120Y-145150840D02* +X66492120Y-145623280D01* +X58806080Y-137464800D02* +X66492120Y-145150840D01* +X51211480Y-137464800D02* +X58806080Y-137464800D01* +X51099720Y-137353040D02* +X51211480Y-137464800D01* +X67919600Y-147106640D02* +X68813680Y-147106640D01* +X67218560Y-146405600D02* +X67919600Y-147106640D01* +X65735200Y-146405600D02* +X67218560Y-146405600D01* +X65405000Y-146075400D02* +X65735200Y-146405600D01* +X65405000Y-145125440D02* +X65405000Y-146075400D01* +X58303160Y-138023600D02* +X65405000Y-145125440D01* +X50708560Y-138023600D02* +X58303160Y-138023600D01* +X50678080Y-138054080D02* +X50708560Y-138023600D01* +X65039240Y-147050760D02* +X66212720Y-147050760D01* +X64201040Y-146212560D02* +X65039240Y-147050760D01* +X64201040Y-144896840D02* +X64201040Y-146212560D01* +X58084720Y-138780520D02* +X64201040Y-144896840D01* +X50622200Y-138780520D02* +X58084720Y-138780520D01* +X49982120Y-139420600D02* +X50622200Y-138780520D01* +X63113920Y-144790160D02* +X63113920Y-146324320D01* +X57912000Y-139588240D02* +X63113920Y-144790160D01* +X50993040Y-139588240D02* +X57912000Y-139588240D01* +X50881280Y-139476480D02* +X50993040Y-139588240D01* +X51551840Y-129682240D02* +X51551840Y-132344160D01* +X51876960Y-129357120D02* +X51551840Y-129682240D01* +X53609240Y-129357120D02* +X51876960Y-129357120D01* +X55011320Y-127955040D02* +X53609240Y-129357120D01* +X58216800Y-126756160D02* +X57718960Y-126258320D01* +X56774080Y-127853440D02* +X55178960Y-126258320D01* +X57663080Y-127853440D02* +X56774080Y-127853440D01* +X58054240Y-128244600D02* +X57663080Y-127853440D01* +X58054240Y-129590800D02* +X58054240Y-128244600D01* +X57216040Y-130429000D02* +X58054240Y-129590800D01* +X57216040Y-133497320D02* +X57216040Y-130429000D01* +X57383680Y-133664960D02* +X57216040Y-133497320D01* +X52557680Y-136585960D02* +X55265320Y-136585960D01* +X52491640Y-136652000D02* +X52557680Y-136585960D01* +X56509920Y-144962880D02* +X56509920Y-144028160D01* +X54457600Y-147015200D02* +X56509920Y-144962880D01* +X52364640Y-147015200D02* +X54457600Y-147015200D01* +X52202080Y-147177760D02* +X52364640Y-147015200D01* +X57038240Y-140126720D02* +X57952640Y-141041120D01* +X52506880Y-140126720D02* +X57038240Y-140126720D01* +X48828960Y-143804640D02* +X52506880Y-140126720D01* +X45557440Y-146039840D02* +X45557440Y-145796000D01* +X44500800Y-147096480D02* +X45557440Y-146039840D01* +X65714880Y-125689360D02* +X65714880Y-122570240D01* +X64119760Y-127284480D02* +X65714880Y-125689360D01* +X61427360Y-124317760D02* +X63174880Y-122570240D01* +X61427360Y-128158240D02* +X61427360Y-124317760D01* +X61132720Y-128452880D02* +X61427360Y-128158240D01* +X60192920Y-147523200D02* +X60192920Y-147203160D01* +X57876440Y-149839680D02* +X60192920Y-147523200D01* +M02* diff --git a/PCB/WOT/Tinylab_proto1-B_Mask.gbr b/PCB/WOT/Tinylab_proto1-B_Mask.gbr new file mode 100644 index 00000000..d4760890 --- /dev/null +++ b/PCB/WOT/Tinylab_proto1-B_Mask.gbr @@ -0,0 +1,78 @@ +G04 #@! TF.FileFunction,Soldermask,Bot* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 28/09/2015 12:51:56 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11C,1.501140*% +%ADD12C,1.998980*% +%ADD13R,1.998980X1.998980*% +%ADD14R,2.032000X1.727200*% +%ADD15O,2.032000X1.727200*% +%ADD16O,0.950000X1.250000*% +%ADD17O,1.550000X1.000000*% +%ADD18R,1.727200X2.032000*% +%ADD19O,1.727200X2.032000*% +%ADD20R,1.727200X1.727200*% +%ADD21O,1.727200X1.727200*% +%ADD22R,2.032000X2.032000*% +%ADD23O,2.032000X2.032000*% +G04 APERTURE END LIST* +D10* +D11* +X70855840Y-128137920D03* +X70855840Y-125597920D03* +X69230240Y-141175740D03* +X69230240Y-138635740D03* +D12* +X63820040Y-134800340D03* +D13* +X73980040Y-134800340D03* +D12* +X74117200Y-131899660D03* +D13* +X63957200Y-131899660D03* +D14* +X36258500Y-146100800D03* +D15* +X36258500Y-148640800D03* +X36258500Y-151180800D03* +X36258500Y-153720800D03* +D16* +X40127360Y-133399260D03* +X40127360Y-138399260D03* +D17* +X37427360Y-132399260D03* +X37427360Y-139399260D03* +D18* +X64861440Y-154310080D03* +D19* +X67401440Y-154310080D03* +X69941440Y-154310080D03* +X72481440Y-154310080D03* +D20* +X57718960Y-123718320D03* +D21* +X57718960Y-126258320D03* +X55178960Y-123718320D03* +X55178960Y-126258320D03* +D18* +X49342040Y-125089920D03* +D19* +X46802040Y-125089920D03* +X44262040Y-125089920D03* +D22* +X61328300Y-154012900D03* +D23* +X58788300Y-154012900D03* +D22* +X73741280Y-144505680D03* +D23* +X71201280Y-144505680D03* +D22* +X65714880Y-122570240D03* +D23* +X63174880Y-122570240D03* +M02* diff --git a/PCB/WOT/Tinylab_proto1-B_Paste.gbr b/PCB/WOT/Tinylab_proto1-B_Paste.gbr new file mode 100644 index 00000000..850ea99e --- /dev/null +++ b/PCB/WOT/Tinylab_proto1-B_Paste.gbr @@ -0,0 +1,11 @@ +G04 #@! TF.FileFunction,Paste,Bot* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 26/09/2015 2:23:25 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +G04 APERTURE END LIST* +D10* +M02* diff --git a/PCB/WOT/Tinylab_proto1-B_SilkS.gbr b/PCB/WOT/Tinylab_proto1-B_SilkS.gbr new file mode 100644 index 00000000..5cb45898 --- /dev/null +++ b/PCB/WOT/Tinylab_proto1-B_SilkS.gbr @@ -0,0 +1,11 @@ +G04 #@! TF.FileFunction,Legend,Bot* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 28/09/2015 12:51:56 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +G04 APERTURE END LIST* +D10* +M02* diff --git a/PCB/WOT/Tinylab_proto1-Edge_Cuts.gbr b/PCB/WOT/Tinylab_proto1-Edge_Cuts.gbr new file mode 100644 index 00000000..7b87d719 --- /dev/null +++ b/PCB/WOT/Tinylab_proto1-Edge_Cuts.gbr @@ -0,0 +1,21 @@ +G04 #@! TF.FileFunction,Profile,NP* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 28/09/2015 12:51:56 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +G04 APERTURE END LIST* +D10* +X33639760Y-117850920D02* +X33639760Y-118521480D01* +X76611480Y-117850920D02* +X33639760Y-117850920D01* +X76611480Y-156631640D02* +X76611480Y-117850920D01* +X33639760Y-156631640D02* +X76611480Y-156631640D01* +X33639760Y-117962680D02* +X33639760Y-156631640D01* +M02* diff --git a/PCB/WOT/Tinylab_proto1-F_Cu.gbr b/PCB/WOT/Tinylab_proto1-F_Cu.gbr new file mode 100644 index 00000000..bd5bebef --- /dev/null +++ b/PCB/WOT/Tinylab_proto1-F_Cu.gbr @@ -0,0 +1,1265 @@ +G04 #@! TF.FileFunction,Copper,L1,Top,Signal* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 28/09/2015 12:51:56 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11C,0.250000*% +%ADD12R,0.750000X0.800000*% +%ADD13R,0.800000X0.750000*% +%ADD14C,1.501140*% +%ADD15C,1.998980*% +%ADD16R,1.998980X1.998980*% +%ADD17R,2.000000X2.000000*% +%ADD18R,1.600000X0.560000*% +%ADD19R,0.560000X1.600000*% +%ADD20R,2.032000X1.727200*% +%ADD21O,2.032000X1.727200*% +%ADD22R,1.350000X0.400000*% +%ADD23O,0.950000X1.250000*% +%ADD24O,1.550000X1.000000*% +%ADD25R,1.727200X2.032000*% +%ADD26O,1.727200X2.032000*% +%ADD27R,1.727200X1.727200*% +%ADD28O,1.727200X1.727200*% +%ADD29R,2.032000X2.032000*% +%ADD30O,2.032000X2.032000*% +%ADD31R,0.900000X0.600000*% +%ADD32R,0.500000X0.900000*% +%ADD33R,0.900000X0.500000*% +%ADD34R,0.600000X0.900000*% +%ADD35R,1.500000X0.600000*% +%ADD36R,0.508000X0.304800*% +%ADD37C,0.600000*% +%ADD38C,0.254000*% +%ADD39C,0.580000*% +%ADD40C,1.160000*% +G04 APERTURE END LIST* +D10* +D11* +X33988644Y-118352821D02* +X34560073Y-118352821D01* +X34274358Y-119352821D02* +X34274358Y-118352821D01* +X34893406Y-119352821D02* +X34893406Y-118352821D01* +X35369596Y-119352821D02* +X35369596Y-118352821D01* +X35941025Y-119352821D01* +X35941025Y-118352821D01* +X36607691Y-118876630D02* +X36607691Y-119352821D01* +X36274358Y-118352821D02* +X36607691Y-118876630D01* +X36941025Y-118352821D01* +X37750549Y-119352821D02* +X37274358Y-119352821D01* +X37274358Y-118352821D01* +X38036263Y-119067107D02* +X38512454Y-119067107D01* +X37941025Y-119352821D02* +X38274358Y-118352821D01* +X38607692Y-119352821D01* +X39274359Y-118829011D02* +X39417216Y-118876630D01* +X39464835Y-118924250D01* +X39512454Y-119019488D01* +X39512454Y-119162345D01* +X39464835Y-119257583D01* +X39417216Y-119305202D01* +X39321978Y-119352821D01* +X38941025Y-119352821D01* +X38941025Y-118352821D01* +X39274359Y-118352821D01* +X39369597Y-118400440D01* +X39417216Y-118448059D01* +X39464835Y-118543297D01* +X39464835Y-118638535D01* +X39417216Y-118733773D01* +X39369597Y-118781392D01* +X39274359Y-118829011D01* +X38941025Y-118829011D01* +X40702930Y-119352821D02* +X40702930Y-118352821D01* +X41083883Y-118352821D01* +X41179121Y-118400440D01* +X41226740Y-118448059D01* +X41274359Y-118543297D01* +X41274359Y-118686154D01* +X41226740Y-118781392D01* +X41179121Y-118829011D01* +X41083883Y-118876630D01* +X40702930Y-118876630D01* +X42274359Y-119257583D02* +X42226740Y-119305202D01* +X42083883Y-119352821D01* +X41988645Y-119352821D01* +X41845787Y-119305202D01* +X41750549Y-119209964D01* +X41702930Y-119114726D01* +X41655311Y-118924250D01* +X41655311Y-118781392D01* +X41702930Y-118590916D01* +X41750549Y-118495678D01* +X41845787Y-118400440D01* +X41988645Y-118352821D01* +X42083883Y-118352821D01* +X42226740Y-118400440D01* +X42274359Y-118448059D01* +X43036264Y-118829011D02* +X43179121Y-118876630D01* +X43226740Y-118924250D01* +X43274359Y-119019488D01* +X43274359Y-119162345D01* +X43226740Y-119257583D01* +X43179121Y-119305202D01* +X43083883Y-119352821D01* +X42702930Y-119352821D01* +X42702930Y-118352821D01* +X43036264Y-118352821D01* +X43131502Y-118400440D01* +X43179121Y-118448059D01* +X43226740Y-118543297D01* +X43226740Y-118638535D01* +X43179121Y-118733773D01* +X43131502Y-118781392D01* +X43036264Y-118829011D01* +X42702930Y-118829011D01* +X35631501Y-121002821D02* +X35631501Y-120002821D01* +X36012454Y-120002821D01* +X36107692Y-120050440D01* +X36155311Y-120098059D01* +X36202930Y-120193297D01* +X36202930Y-120336154D01* +X36155311Y-120431392D01* +X36107692Y-120479011D01* +X36012454Y-120526630D01* +X35631501Y-120526630D01* +X37202930Y-121002821D02* +X36869596Y-120526630D01* +X36631501Y-121002821D02* +X36631501Y-120002821D01* +X37012454Y-120002821D01* +X37107692Y-120050440D01* +X37155311Y-120098059D01* +X37202930Y-120193297D01* +X37202930Y-120336154D01* +X37155311Y-120431392D01* +X37107692Y-120479011D01* +X37012454Y-120526630D01* +X36631501Y-120526630D01* +X37821977Y-120002821D02* +X38012454Y-120002821D01* +X38107692Y-120050440D01* +X38202930Y-120145678D01* +X38250549Y-120336154D01* +X38250549Y-120669488D01* +X38202930Y-120859964D01* +X38107692Y-120955202D01* +X38012454Y-121002821D01* +X37821977Y-121002821D01* +X37726739Y-120955202D01* +X37631501Y-120859964D01* +X37583882Y-120669488D01* +X37583882Y-120336154D01* +X37631501Y-120145678D01* +X37726739Y-120050440D01* +X37821977Y-120002821D01* +X38536263Y-120002821D02* +X39107692Y-120002821D01* +X38821977Y-121002821D02* +X38821977Y-120002821D01* +X39631501Y-120002821D02* +X39821978Y-120002821D01* +X39917216Y-120050440D01* +X40012454Y-120145678D01* +X40060073Y-120336154D01* +X40060073Y-120669488D01* +X40012454Y-120859964D01* +X39917216Y-120955202D01* +X39821978Y-121002821D01* +X39631501Y-121002821D01* +X39536263Y-120955202D01* +X39441025Y-120859964D01* +X39393406Y-120669488D01* +X39393406Y-120336154D01* +X39441025Y-120145678D01* +X39536263Y-120050440D01* +X39631501Y-120002821D01* +X41774359Y-121002821D02* +X41202930Y-121002821D01* +X41488644Y-121002821D02* +X41488644Y-120002821D01* +X41393406Y-120145678D01* +X41298168Y-120240916D01* +X41202930Y-120288535D01* +D12* +X39319200Y-152682640D03* +X39319200Y-151182640D03* +X39278560Y-147088160D03* +X39278560Y-148588160D03* +X43682920Y-135526080D03* +X43682920Y-137026080D03* +D13* +X42864340Y-129816860D03* +X44364340Y-129816860D03* +D12* +X44226480Y-150805580D03* +X44226480Y-149305580D03* +D14* +X70855840Y-128137920D03* +X70855840Y-125597920D03* +D13* +X58795220Y-150964900D03* +X60295220Y-150964900D03* +D12* +X75072240Y-126224600D03* +X75072240Y-127724600D03* +X56596280Y-147961920D03* +X56596280Y-149461920D03* +D14* +X69230240Y-141175740D03* +X69230240Y-138635740D03* +D12* +X73941940Y-139143040D03* +X73941940Y-140643040D03* +D15* +X63820040Y-134800340D03* +D16* +X73980040Y-134800340D03* +D17* +X43665140Y-139105840D03* +X43665140Y-142305840D03* +D18* +X59977400Y-140626600D03* +X59977400Y-139826600D03* +X59977400Y-139026600D03* +X59977400Y-138226600D03* +X59977400Y-137426600D03* +X59977400Y-136626600D03* +X59977400Y-135826600D03* +X59977400Y-135026600D03* +X59977400Y-134226600D03* +X59977400Y-133426600D03* +X59977400Y-132626600D03* +D19* +X58127400Y-130776600D03* +X57327400Y-130776600D03* +X56527400Y-130776600D03* +X55727400Y-130776600D03* +X54927400Y-130776600D03* +X54127400Y-130776600D03* +X53327400Y-130776600D03* +X52527400Y-130776600D03* +X51727400Y-130776600D03* +X50927400Y-130776600D03* +X50127400Y-130776600D03* +D18* +X48277400Y-132626600D03* +X48277400Y-133426600D03* +X48277400Y-134226600D03* +X48277400Y-135026600D03* +X48277400Y-135826600D03* +X48277400Y-136626600D03* +X48277400Y-137426600D03* +X48277400Y-138226600D03* +X48277400Y-139026600D03* +X48277400Y-139826600D03* +X48277400Y-140626600D03* +D19* +X50127400Y-142476600D03* +X50927400Y-142476600D03* +X51727400Y-142476600D03* +X52527400Y-142476600D03* +X53327400Y-142476600D03* +X54127400Y-142476600D03* +X54927400Y-142476600D03* +X55727400Y-142476600D03* +X56527400Y-142476600D03* +X57327400Y-142476600D03* +X58127400Y-142476600D03* +D15* +X74117200Y-131899660D03* +D16* +X63957200Y-131899660D03* +D20* +X36258500Y-146100800D03* +D21* +X36258500Y-148640800D03* +X36258500Y-151180800D03* +X36258500Y-153720800D03* +D22* +X40127360Y-134599260D03* +X40127360Y-135249260D03* +X40127360Y-135899260D03* +X40127360Y-136549260D03* +X40127360Y-137199260D03* +D23* +X40127360Y-133399260D03* +X40127360Y-138399260D03* +D24* +X37427360Y-132399260D03* +X37427360Y-139399260D03* +D25* +X64861440Y-154310080D03* +D26* +X67401440Y-154310080D03* +X69941440Y-154310080D03* +X72481440Y-154310080D03* +D27* +X57718960Y-123718320D03* +D28* +X57718960Y-126258320D03* +X55178960Y-123718320D03* +X55178960Y-126258320D03* +D25* +X49342040Y-125089920D03* +D26* +X46802040Y-125089920D03* +X44262040Y-125089920D03* +D29* +X61328300Y-154012900D03* +D30* +X58788300Y-154012900D03* +D29* +X73741280Y-144505680D03* +D30* +X71201280Y-144505680D03* +D29* +X65714880Y-122570240D03* +D30* +X63174880Y-122570240D03* +D31* +X68435680Y-126309120D03* +X65635680Y-127259120D03* +X65635680Y-125359120D03* +D32* +X40983600Y-154289760D03* +X39483600Y-154289760D03* +X40968360Y-145481040D03* +X39468360Y-145481040D03* +D33* +X42484040Y-154338720D03* +X42484040Y-152838720D03* +X42400220Y-147272440D03* +X42400220Y-145772440D03* +D32* +X42827640Y-151102060D03* +X41327640Y-151102060D03* +X42771760Y-149009100D03* +X41271760Y-149009100D03* +D33* +X72517000Y-150209820D03* +X72517000Y-151709820D03* +X70081140Y-150059960D03* +X70081140Y-151559960D03* +X67487800Y-150133620D03* +X67487800Y-151633620D03* +X64823340Y-150019320D03* +X64823340Y-151519320D03* +X72478900Y-147352320D03* +X72478900Y-148852320D03* +X70004940Y-147088160D03* +X70004940Y-148588160D03* +X67449700Y-147047520D03* +X67449700Y-148547520D03* +X64785240Y-147009420D03* +X64785240Y-148509420D03* +D32* +X58673300Y-146011900D03* +X60173300Y-146011900D03* +X60198700Y-148577300D03* +X58698700Y-148577300D03* +X64608140Y-137822940D03* +X63108140Y-137822940D03* +X63146240Y-139816840D03* +X64646240Y-139816840D03* +X64608140Y-141988540D03* +X63108140Y-141988540D03* +D34* +X43642280Y-134191200D03* +X42692280Y-131391200D03* +X44592280Y-131391200D03* +D35* +X48417500Y-145770600D03* +X48417500Y-147040600D03* +X48417500Y-148310600D03* +X48417500Y-149580600D03* +X48417500Y-150850600D03* +X48417500Y-152120600D03* +X48417500Y-153390600D03* +X53817500Y-153390600D03* +X53817500Y-152120600D03* +X53817500Y-150850600D03* +X53817500Y-149580600D03* +X53817500Y-148310600D03* +X53817500Y-147040600D03* +X53817500Y-145770600D03* +D36* +X60243720Y-127838200D03* +X60243720Y-129108200D03* +X62275720Y-128473200D03* +X60243720Y-128473200D03* +X62275720Y-129108200D03* +X62275720Y-127838200D03* +D13* +X52036280Y-128427480D03* +X53536280Y-128427480D03* +X54445600Y-144200880D03* +X52945600Y-144200880D03* +D37* +X49890680Y-149565360D03* +X55636160Y-147949920D03* +X46583600Y-149489160D03* +X46431200Y-134172960D03* +X53213000Y-126862840D03* +X49946560Y-128727200D03* +X63261240Y-126908560D03* +X63362840Y-128930400D03* +X51450240Y-144231360D03* +X45496480Y-149270720D03* +X54218840Y-133852920D03* +X52466240Y-133868160D03* +X55544720Y-144200880D03* +X45577760Y-151079200D03* +X48381920Y-142179040D03* +X51628040Y-149618700D03* +X43665140Y-144449800D03* +X65603120Y-128579880D03* +X57708800Y-146177000D03* +X61305440Y-144912080D03* +X56306720Y-141046200D03* +X48823880Y-144795240D03* +X55707280Y-150850600D03* +X56687720Y-146212560D03* +X55859680Y-128635760D03* +X57246520Y-128625600D03* +X58968640Y-128595120D03* +X60071000Y-126959360D03* +X60858400Y-130210560D03* +X58440320Y-132730240D03* +X54193440Y-133014720D03* +X50942240Y-133278880D03* +X45326300Y-135536940D03* +X42057320Y-135559800D03* +X45453300Y-136692640D03* +X42092880Y-136486900D03* +X71241920Y-147243800D03* +X51099720Y-137353040D03* +X68813680Y-147106640D03* +X50678080Y-138054080D03* +X66212720Y-147050760D03* +X49982120Y-139420600D03* +X63113920Y-146324320D03* +X50881280Y-139476480D03* +X51551840Y-132344160D03* +X55011320Y-127955040D03* +X57383680Y-133664960D03* +X55265320Y-136585960D03* +X52491640Y-136652000D03* +X56509920Y-144028160D03* +X52202080Y-147177760D03* +X57952640Y-141041120D03* +X48828960Y-143804640D03* +X45557440Y-145796000D03* +X44500800Y-147096480D03* +X64119760Y-127284480D03* +X61132720Y-128452880D03* +X60192920Y-147203160D03* +X57876440Y-149839680D03* +D11* +X39483600Y-154289760D02* +X36827460Y-154289760D01* +X36827460Y-154289760D02* +X36258500Y-153720800D01* +X39483600Y-154289760D02* +X39483600Y-152847040D01* +X39483600Y-152847040D02* +X39319200Y-152682640D01* +X39319200Y-151182640D02* +X36260340Y-151182640D01* +X36260340Y-151182640D02* +X36258500Y-151180800D01* +X39468360Y-145481040D02* +X39468360Y-146898360D01* +X39468360Y-146898360D02* +X39278560Y-147088160D01* +X39468360Y-145481040D02* +X36878260Y-145481040D01* +X36878260Y-145481040D02* +X36258500Y-146100800D01* +X39278560Y-148588160D02* +X36311140Y-148588160D01* +X36311140Y-148588160D02* +X36258500Y-148640800D01* +D38* +X56596280Y-147961920D02* +X55648160Y-147961920D01* +X49875440Y-149580600D02* +X48417500Y-149580600D01* +X49890680Y-149565360D02* +X49875440Y-149580600D01* +X55648160Y-147961920D02* +X55636160Y-147949920D01* +D39* +X43642280Y-134191200D02* +X46412960Y-134191200D01* +X46675040Y-149580600D02* +X48417500Y-149580600D01* +X46583600Y-149489160D02* +X46675040Y-149580600D01* +X46412960Y-134191200D02* +X46431200Y-134172960D01* +D38* +X43682920Y-135526080D02* +X43682920Y-134231840D01* +X43682920Y-134231840D02* +X43642280Y-134191200D01* +X40127360Y-134599260D02* +X43234220Y-134599260D01* +X43234220Y-134599260D02* +X43642280Y-134191200D01* +X56527400Y-130776600D02* +X56527400Y-128277920D01* +X56967120Y-127838200D02* +X58643520Y-127838200D01* +X56527400Y-128277920D02* +X56967120Y-127838200D01* +D40* +X46370240Y-129804160D02* +X48869600Y-129804160D01* +X53536280Y-127186120D02* +X53536280Y-128427480D01* +X53213000Y-126862840D02* +X53536280Y-127186120D01* +X48869600Y-129804160D02* +X49946560Y-128727200D01* +D39* +X53327400Y-142476600D02* +X53327400Y-132359400D01* +X53327400Y-132359400D02* +X53327400Y-132267960D01* +X53327400Y-132267960D02* +X53327400Y-130796598D01* +X53327400Y-130796598D02* +X53307402Y-130776600D01* +X53307402Y-130776600D02* +X53327400Y-130776600D01* +X53327400Y-130776600D02* +X53327400Y-128636360D01* +X53327400Y-128636360D02* +X53536280Y-128427480D01* +D40* +X44592280Y-131391200D02* +X44592280Y-130044800D01* +X44592280Y-130044800D02* +X44364340Y-129816860D01* +X46410880Y-129804160D02* +X46370240Y-129804160D01* +X46370240Y-129804160D02* +X44377040Y-129804160D01* +X44377040Y-129804160D02* +X44364340Y-129816860D01* +X43665140Y-139105840D02* +X43665140Y-137043860D01* +X43665140Y-137043860D02* +X43682920Y-137026080D01* +D38* +X62585600Y-126232920D02* +X63261240Y-126908560D01* +X59877960Y-126232920D02* +X62585600Y-126232920D01* +X63185040Y-129108200D02* +X62275720Y-129108200D01* +X63362840Y-128930400D02* +X63185040Y-129108200D01* +X59888120Y-126232920D02* +X59877960Y-126232920D01* +X58643520Y-127467360D02* +X59877960Y-126232920D01* +X59877960Y-126232920D02* +X59888120Y-126232920D01* +X58643520Y-127838200D02* +X58643520Y-127467360D01* +X60243720Y-127838200D02* +X58643520Y-127838200D01* +X55178960Y-123718320D02* +X55158640Y-123718320D01* +X46398180Y-129816860D02* +X44364340Y-129816860D01* +X46410880Y-129804160D02* +X46398180Y-129816860D01* +D39* +X43665140Y-137043860D02* +X43682920Y-137026080D01* +D38* +X44592280Y-130044800D02* +X44364340Y-129816860D01* +X40127360Y-137199260D02* +X43509740Y-137199260D01* +X43509740Y-137199260D02* +X43682920Y-137026080D01* +X40127360Y-138399260D02* +X40127360Y-137199260D01* +X37427360Y-139399260D02* +X37427360Y-132399260D01* +D39* +X40127360Y-133399260D02* +X41190180Y-133399260D01* +X44592280Y-132313640D02* +X44592280Y-131391200D01* +X44094400Y-132811520D02* +X44592280Y-132313640D01* +X41777920Y-132811520D02* +X44094400Y-132811520D01* +X41190180Y-133399260D02* +X41777920Y-132811520D01* +X40127360Y-133399260D02* +X39942500Y-133399260D01* +X39942500Y-133399260D02* +X38942500Y-132399260D01* +X38942500Y-132399260D02* +X37427360Y-132399260D01* +X40127360Y-138399260D02* +X40127360Y-138505760D01* +X40127360Y-138505760D02* +X39233860Y-139399260D01* +X39233860Y-139399260D02* +X37427360Y-139399260D01* +X53327400Y-142476600D02* +X53327400Y-143819080D01* +X53327400Y-143819080D02* +X52945600Y-144200880D01* +X52945600Y-144200880D02* +X51480720Y-144200880D01* +X51480720Y-144200880D02* +X51450240Y-144231360D01* +D38* +X44226480Y-149305580D02* +X45461620Y-149305580D01* +X51450240Y-144231360D02* +X51480720Y-144200880D01* +X45461620Y-149305580D02* +X45496480Y-149270720D01* +X52945600Y-144200880D02* +X52945600Y-144000920D01* +X52945600Y-144000920D02* +X53327400Y-143619120D01* +X53327400Y-143619120D02* +X53327400Y-142476600D01* +D11* +X42771760Y-149009100D02* +X43930000Y-149009100D01* +X43930000Y-149009100D02* +X44226480Y-149305580D01* +D39* +X52527400Y-130776600D02* +X52527400Y-133807000D01* +X54107402Y-133964358D02* +X54107402Y-142476600D01* +X54218840Y-133852920D02* +X54107402Y-133964358D01* +X52527400Y-133807000D02* +X52466240Y-133868160D01* +X54107402Y-142476600D02* +X54127400Y-142476600D01* +X54107402Y-142476600D02* +X54127400Y-142476600D01* +D40* +X42692280Y-131391200D02* +X42692280Y-129988920D01* +X42692280Y-129988920D02* +X42864340Y-129816860D01* +X52036280Y-128427480D02* +X52036280Y-128419160D01* +X52036280Y-128419160D02* +X51257200Y-127640080D01* +D39* +X52036280Y-128427480D02* +X52036280Y-128652840D01* +X52036280Y-128652840D02* +X52527400Y-129143960D01* +X52527400Y-129143960D02* +X52527400Y-130776600D01* +X57718960Y-123718320D02* +X57718960Y-122763280D01* +X57718960Y-122763280D02* +X57058560Y-122102880D01* +X57058560Y-122102880D02* +X54538880Y-122102880D01* +X54538880Y-122102880D02* +X51734720Y-124907040D01* +X51734720Y-124907040D02* +X51734720Y-127162560D01* +X51734720Y-127162560D02* +X51257200Y-127640080D01* +D40* +X44145200Y-127071120D02* +X50688240Y-127071120D01* +X50688240Y-127071120D02* +X51257200Y-127640080D01* +X42864340Y-129816860D02* +X42864340Y-128351980D01* +X42864340Y-128351980D02* +X44145200Y-127071120D01* +X44145200Y-127071120D02* +X44145200Y-125206760D01* +X44145200Y-125206760D02* +X44262040Y-125089920D01* +D38* +X51734720Y-124907040D02* +X51734720Y-128117600D01* +X54538880Y-122102880D02* +X51734720Y-124907040D01* +X57058560Y-122102880D02* +X54538880Y-122102880D01* +X57718960Y-122763280D02* +X57058560Y-122102880D01* +D39* +X50688240Y-127071120D02* +X51734720Y-128117600D01* +X42864340Y-128351980D02* +X44145200Y-127071120D01* +X44145200Y-127071120D02* +X44262040Y-126954280D01* +X44262040Y-126954280D02* +X44262040Y-125089920D01* +D38* +X42692280Y-129988920D02* +X42864340Y-129816860D01* +D39* +X54127400Y-142476600D02* +X54127400Y-143882680D01* +X54127400Y-143882680D02* +X54445600Y-144200880D01* +X54445600Y-144200880D02* +X55544720Y-144200880D01* +D38* +X44226480Y-150805580D02* +X45304140Y-150805580D01* +X45304140Y-150805580D02* +X45577760Y-151079200D01* +X54445600Y-144200880D02* +X54234080Y-144200880D01* +X54234080Y-144200880D02* +X54127400Y-144094200D01* +X54127400Y-144094200D02* +X54127400Y-142476600D01* +D11* +X42827640Y-151102060D02* +X43930000Y-151102060D01* +X43930000Y-151102060D02* +X44226480Y-150805580D01* +D40* +X70855840Y-125597920D02* +X74445560Y-125597920D01* +X74445560Y-125597920D02* +X75072240Y-126224600D01* +X46802040Y-125089920D02* +X46802040Y-123987560D01* +X70855840Y-122646440D02* +X70855840Y-125597920D01* +X68112640Y-119903240D02* +X70855840Y-122646440D01* +X50886360Y-119903240D02* +X68112640Y-119903240D01* +X46802040Y-123987560D02* +X50886360Y-119903240D01* +D38* +X74445560Y-125597920D02* +X75072240Y-126224600D01* +D39* +X58795220Y-150964900D02* +X58795220Y-154005980D01* +X58795220Y-154005980D02* +X58788300Y-154012900D01* +D38* +X58788300Y-154012900D02* +X58788300Y-150971820D01* +X58788300Y-150971820D02* +X58795220Y-150964900D01* +D39* +X60295220Y-150964900D02* +X60439300Y-150964900D01* +X60439300Y-150964900D02* +X61328300Y-151853900D01* +X61328300Y-151853900D02* +X61328300Y-154012900D01* +X60198700Y-148577300D02* +X60198700Y-150868380D01* +X60198700Y-150868380D02* +X60295220Y-150964900D01* +D38* +X60198700Y-150868380D02* +X60295220Y-150964900D01* +X60286900Y-150956580D02* +X60295220Y-150964900D01* +X60439300Y-150964900D02* +X61328300Y-151853900D01* +X61328300Y-151853900D02* +X61328300Y-154012900D01* +D39* +X56596280Y-149461920D02* +X57106120Y-149461920D01* +X57106120Y-149461920D02* +X57708800Y-148859240D01* +X51628040Y-149618700D02* +X53779400Y-149618700D01* +X53779400Y-149618700D02* +X53936180Y-149461920D01* +X53936180Y-149461920D02* +X56596280Y-149461920D01* +X56596280Y-149461920D02* +X53936180Y-149461920D01* +X53936180Y-149461920D02* +X53817500Y-149580600D01* +D40* +X43665140Y-142305840D02* +X48255120Y-142305840D01* +X48255120Y-142305840D02* +X48381920Y-142179040D01* +D39* +X48255120Y-142305840D02* +X48381920Y-142179040D01* +D38* +X53817500Y-149580600D02* +X56477600Y-149580600D01* +X56477600Y-149580600D02* +X56596280Y-149461920D01* +D40* +X43665140Y-142305840D02* +X43665140Y-144449800D01* +D39* +X51666140Y-149580600D02* +X53817500Y-149580600D01* +X51628040Y-149618700D02* +X51666140Y-149580600D01* +X57708800Y-148859240D02* +X57708800Y-146177000D01* +X65603120Y-128579880D02* +X65635680Y-128547320D01* +D40* +X63108140Y-143109380D02* +X63108140Y-143080040D01* +X61305440Y-144912080D02* +X63108140Y-143109380D01* +X63108140Y-141988540D02* +X63108140Y-143080040D01* +X63108140Y-143080040D02* +X63553340Y-143525240D01* +X63553340Y-143525240D02* +X66880740Y-143525240D01* +X66880740Y-143525240D02* +X69230240Y-141175740D01* +X69230240Y-141175740D02* +X73409240Y-141175740D01* +X73409240Y-141175740D02* +X73941940Y-140643040D01* +X71201280Y-144505680D02* +X69829680Y-144505680D01* +X69829680Y-144505680D02* +X69230240Y-143906240D01* +X69230240Y-143906240D02* +X69230240Y-141175740D01* +D39* +X69230240Y-141175740D02* +X66880740Y-143525240D01* +X66880740Y-143525240D02* +X63553340Y-143525240D01* +X63553340Y-143525240D02* +X63108140Y-143080040D01* +X73409240Y-141175740D02* +X73941940Y-140643040D01* +X69230240Y-143906240D02* +X69230240Y-141175740D01* +X69829680Y-144505680D02* +X69230240Y-143906240D01* +D38* +X63108140Y-141988540D02* +X62923420Y-141988540D01* +D40* +X70855840Y-128137920D02* +X74658920Y-128137920D01* +X74658920Y-128137920D02* +X75072240Y-127724600D01* +D39* +X65635680Y-128547320D02* +X65635680Y-127259120D01* +D38* +X74658920Y-128137920D02* +X75072240Y-127724600D01* +X73409240Y-141175740D02* +X73941940Y-140643040D01* +X63553340Y-143525240D02* +X66880740Y-143525240D01* +X63108140Y-143080040D02* +X63553340Y-143525240D01* +X63108140Y-141988540D02* +X63108140Y-143080040D01* +D40* +X73941940Y-139143040D02* +X73727880Y-139143040D01* +X73727880Y-139143040D02* +X73220580Y-138635740D01* +X73220580Y-138635740D02* +X69230240Y-138635740D01* +X73941940Y-139143040D02* +X73941940Y-134838440D01* +X73941940Y-134838440D02* +X73980040Y-134800340D01* +D39* +X73941940Y-134838440D02* +X73980040Y-134800340D01* +X64608140Y-137822940D02* +X67579240Y-137822940D01* +X67579240Y-137822940D02* +X68392040Y-138635740D01* +X68392040Y-138635740D02* +X69230240Y-138635740D01* +X73727880Y-139143040D02* +X73220580Y-138635740D01* +X73220580Y-138635740D02* +X69230240Y-138635740D01* +D38* +X73941940Y-134838440D02* +X73980040Y-134800340D01* +X69230240Y-138635740D02* +X73434640Y-138635740D01* +X73434640Y-138635740D02* +X73941940Y-139143040D01* +X69230240Y-138635740D02* +X68392040Y-138635740D01* +X68392040Y-138635740D02* +X67579240Y-137822940D01* +X68435680Y-126309120D02* +X68435680Y-127421180D01* +X68435680Y-127421180D02* +X63957200Y-131899660D01* +X48417500Y-145770600D02* +X48417500Y-145201620D01* +X56047640Y-140787120D02* +X55849520Y-140787120D01* +X56306720Y-141046200D02* +X56047640Y-140787120D01* +X48417500Y-145201620D02* +X48823880Y-144795240D01* +X54927400Y-142476600D02* +X54927400Y-141709240D01* +X54927400Y-141709240D02* +X55849520Y-140787120D01* +X55849520Y-140787120D02* +X55902860Y-140733780D01* +X55902860Y-140733780D02* +X55902860Y-139423140D01* +X55902860Y-139423140D02* +X56512460Y-138813540D01* +X56512460Y-138813540D02* +X57419240Y-138813540D01* +X57419240Y-138813540D02* +X58432300Y-139826600D01* +X58432300Y-139826600D02* +X59977400Y-139826600D01* +X48417500Y-145770600D02* +X48854360Y-145770600D01* +X48417500Y-147040600D02* +X48417500Y-145770600D01* +X59977400Y-136626600D02* +X61300360Y-136626600D01* +X55707280Y-150850600D02* +X53817500Y-150850600D01* +X61610240Y-141290040D02* +X56687720Y-146212560D01* +X61610240Y-136936480D02* +X61610240Y-141290040D01* +X61300360Y-136626600D02* +X61610240Y-136936480D01* +X55727400Y-130776600D02* +X55727400Y-131846120D01* +X59339360Y-131988560D02* +X59977400Y-132626600D01* +X55869840Y-131988560D02* +X59339360Y-131988560D01* +X55727400Y-131846120D02* +X55869840Y-131988560D01* +X58127400Y-130776600D02* +X58127400Y-130487920D01* +X58127400Y-130487920D02* +X59507120Y-129108200D01* +X59507120Y-129108200D02* +X60243720Y-129108200D01* +X62275720Y-127838200D02* +X62275720Y-127213360D01* +X54127400Y-129479040D02* +X54127400Y-130776600D01* +X54935120Y-128671320D02* +X54127400Y-129479040D01* +X55824120Y-128671320D02* +X54935120Y-128671320D01* +X55859680Y-128635760D02* +X55824120Y-128671320D01* +X58938160Y-128625600D02* +X57246520Y-128625600D01* +X58968640Y-128595120D02* +X58938160Y-128625600D01* +X62021720Y-126959360D02* +X60071000Y-126959360D01* +X62275720Y-127213360D02* +X62021720Y-126959360D01* +X48277400Y-133426600D02* +X50794520Y-133426600D01* +X64597320Y-125359120D02* +X65635680Y-125359120D01* +X64490600Y-125465840D02* +X64597320Y-125359120D01* +X64490600Y-126171960D02* +X64490600Y-125465840D01* +X64759840Y-126441200D02* +X64490600Y-126171960D01* +X64759840Y-128117600D02* +X64759840Y-126441200D01* +X64698880Y-128178560D02* +X64759840Y-128117600D01* +X64698880Y-129092960D02* +X64698880Y-128178560D01* +X63799720Y-129992120D02* +X64698880Y-129092960D01* +X61076840Y-129992120D02* +X63799720Y-129992120D01* +X60858400Y-130210560D02* +X61076840Y-129992120D01* +X54477920Y-132730240D02* +X58440320Y-132730240D01* +X54193440Y-133014720D02* +X54477920Y-132730240D01* +X50794520Y-133426600D02* +X50942240Y-133278880D01* +X40127360Y-135249260D02* +X41746780Y-135249260D01* +X45836640Y-135026600D02* +X48277400Y-135026600D01* +X45326300Y-135536940D02* +X45836640Y-135026600D01* +X41746780Y-135249260D02* +X42057320Y-135559800D01* +X40127360Y-135899260D02* +X41505240Y-135899260D01* +X46319340Y-135826600D02* +X48277400Y-135826600D01* +X45453300Y-136692640D02* +X46319340Y-135826600D01* +X41505240Y-135899260D02* +X42092880Y-136486900D01* +X48277400Y-136626600D02* +X50373280Y-136626600D01* +X71350440Y-147352320D02* +X72478900Y-147352320D01* +X71241920Y-147243800D02* +X71350440Y-147352320D01* +X50373280Y-136626600D02* +X51099720Y-137353040D01* +X48277400Y-137426600D02* +X50050600Y-137426600D01* +X68832160Y-147088160D02* +X70004940Y-147088160D01* +X68813680Y-147106640D02* +X68832160Y-147088160D01* +X50050600Y-137426600D02* +X50678080Y-138054080D01* +X48277400Y-139826600D02* +X49576120Y-139826600D01* +X66215960Y-147047520D02* +X67449700Y-147047520D01* +X66212720Y-147050760D02* +X66215960Y-147047520D01* +X49576120Y-139826600D02* +X49982120Y-139420600D01* +X48277400Y-140626600D02* +X49731160Y-140626600D01* +X63799020Y-147009420D02* +X64785240Y-147009420D01* +X63113920Y-146324320D02* +X63799020Y-147009420D01* +X49731160Y-140626600D02* +X50881280Y-139476480D01* +X57718960Y-126258320D02* +X57546240Y-126258320D01* +X57546240Y-126258320D02* +X55849520Y-127955040D01* +X50127400Y-141007600D02* +X50127400Y-142476600D01* +X50149760Y-140985240D02* +X50127400Y-141007600D01* +X50764440Y-140985240D02* +X50149760Y-140985240D01* +X51739800Y-140009880D02* +X50764440Y-140985240D01* +X51739800Y-132532120D02* +X51739800Y-140009880D01* +X51551840Y-132344160D02* +X51739800Y-132532120D01* +X55849520Y-127955040D02* +X55011320Y-127955040D01* +X50927400Y-142476600D02* +X50927400Y-141731600D01* +X50927400Y-141731600D02* +X52496720Y-140162280D01* +X57383680Y-134467600D02* +X57383680Y-133664960D01* +X55265320Y-136585960D02* +X57383680Y-134467600D01* +X52496720Y-136657080D02* +X52491640Y-136652000D01* +X52496720Y-140162280D02* +X52496720Y-136657080D01* +X50927400Y-142476600D02* +X50927400Y-141696040D01* +X50927400Y-142476600D02* +X50927400Y-141716360D01* +X48417500Y-152120600D02* +X48686720Y-152120600D01* +X48686720Y-152120600D02* +X50820320Y-149987000D01* +X56527400Y-144010680D02* +X56527400Y-142476600D01* +X56509920Y-144028160D02* +X56527400Y-144010680D01* +X50820320Y-148559520D02* +X52202080Y-147177760D01* +X50820320Y-149987000D02* +X50820320Y-148559520D01* +X48417500Y-153390600D02* +X48417500Y-152120600D01* +X42400220Y-147272440D02* +X44324840Y-147272440D01* +X58127400Y-141215880D02* +X58127400Y-142476600D01* +X57952640Y-141041120D02* +X58127400Y-141215880D01* +X47548800Y-143804640D02* +X48828960Y-143804640D01* +X45557440Y-145796000D02* +X47548800Y-143804640D01* +X44324840Y-147272440D02* +X44500800Y-147096480D01* +X58196480Y-142407520D02* +X58127400Y-142476600D01* +D11* +X41271760Y-149009100D02* +X41271760Y-148400900D01* +X41271760Y-148400900D02* +X42400220Y-147272440D01* +X41327640Y-151102060D02* +X41327640Y-149064980D01* +X41327640Y-149064980D02* +X41271760Y-149009100D01* +X42484040Y-152838720D02* +X41728960Y-152838720D01* +X41327640Y-152437400D02* +X41327640Y-151102060D01* +X41728960Y-152838720D02* +X41327640Y-152437400D01* +D38* +X64897000Y-153995120D02* +X64897000Y-151592980D01* +X64897000Y-151592980D02* +X64823340Y-151519320D01* +X67437000Y-151684420D02* +X67487800Y-151633620D01* +X67437000Y-153995120D02* +X67437000Y-151684420D01* +X69977000Y-153995120D02* +X69977000Y-151664100D01* +X69977000Y-151664100D02* +X70081140Y-151559960D01* +X72517000Y-153995120D02* +X72517000Y-151709820D01* +X62931040Y-128473200D02* +X64119760Y-127284480D01* +X62275720Y-128473200D02* +X62931040Y-128473200D01* +X60243720Y-128473200D02* +X61112400Y-128473200D01* +X61112400Y-128473200D02* +X61132720Y-128452880D01* +D11* +X42484040Y-154338720D02* +X43387580Y-154338720D01* +X46875700Y-150850600D02* +X48417500Y-150850600D01* +X43387580Y-154338720D02* +X46875700Y-150850600D01* +X40983600Y-154289760D02* +X42435080Y-154289760D01* +X42435080Y-154289760D02* +X42484040Y-154338720D01* +X42400220Y-145772440D02* +X44345160Y-145772440D01* +X46883320Y-148310600D02* +X48417500Y-148310600D01* +X44345160Y-145772440D02* +X46883320Y-148310600D01* +X40968360Y-145481040D02* +X42108820Y-145481040D01* +X42108820Y-145481040D02* +X42400220Y-145772440D01* +D38* +X72478900Y-148852320D02* +X72478900Y-150171720D01* +X72478900Y-150171720D02* +X72517000Y-150209820D01* +X70004940Y-148588160D02* +X70004940Y-149983760D01* +X70004940Y-149983760D02* +X70081140Y-150059960D01* +X67449700Y-148547520D02* +X67449700Y-150095520D01* +X67449700Y-150095520D02* +X67487800Y-150133620D01* +X64785240Y-148509420D02* +X64785240Y-149981220D01* +X64785240Y-149981220D02* +X64823340Y-150019320D01* +D39* +X58673300Y-146011900D02* +X58673300Y-148551900D01* +X58673300Y-148551900D02* +X58698700Y-148577300D01* +D38* +X58673300Y-148551900D02* +X58698700Y-148577300D01* +X53817500Y-152120600D02* +X55874920Y-152120600D01* +X60223400Y-147203160D02* +X60223400Y-147218400D01* +X60192920Y-147203160D02* +X60223400Y-147203160D01* +X57876440Y-150119080D02* +X57876440Y-149839680D01* +X55874920Y-152120600D02* +X57876440Y-150119080D01* +D39* +X60223400Y-147218400D02* +X60223400Y-146062000D01* +X60223400Y-146062000D02* +X60173300Y-146011900D01* +D38* +X53817500Y-153390600D02* +X53817500Y-152120600D01* +X53817500Y-152120600D02* +X53893700Y-152044400D01* +X60223400Y-147218400D02* +X60173300Y-147168300D01* +X60173300Y-147168300D02* +X60173300Y-146011900D01* +X63146240Y-139816840D02* +X63146240Y-137861040D01* +X63146240Y-137861040D02* +X63108140Y-137822940D01* +X64608140Y-141988540D02* +X64608140Y-139854940D01* +X64608140Y-139854940D02* +X64646240Y-139816840D01* +M02* diff --git a/PCB/WOT/Tinylab_proto1-F_Mask.gbr b/PCB/WOT/Tinylab_proto1-F_Mask.gbr new file mode 100644 index 00000000..0aa4682c --- /dev/null +++ b/PCB/WOT/Tinylab_proto1-F_Mask.gbr @@ -0,0 +1,250 @@ +G04 #@! TF.FileFunction,Soldermask,Top* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 28/09/2015 12:51:56 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,0.750000X0.800000*% +%ADD12R,0.800000X0.750000*% +%ADD13C,1.501140*% +%ADD14C,1.998980*% +%ADD15R,1.998980X1.998980*% +%ADD16R,2.000000X2.000000*% +%ADD17R,1.600000X0.560000*% +%ADD18R,0.560000X1.600000*% +%ADD19R,2.032000X1.727200*% +%ADD20O,2.032000X1.727200*% +%ADD21R,1.350000X0.400000*% +%ADD22O,0.950000X1.250000*% +%ADD23O,1.550000X1.000000*% +%ADD24R,1.727200X2.032000*% +%ADD25O,1.727200X2.032000*% +%ADD26R,1.727200X1.727200*% +%ADD27O,1.727200X1.727200*% +%ADD28R,2.032000X2.032000*% +%ADD29O,2.032000X2.032000*% +%ADD30R,0.900000X0.600000*% +%ADD31R,0.500000X0.900000*% +%ADD32R,0.900000X0.500000*% +%ADD33R,0.600000X0.900000*% +%ADD34R,1.500000X0.600000*% +%ADD35R,0.508000X0.304800*% +G04 APERTURE END LIST* +D10* +D11* +X39319200Y-152682640D03* +X39319200Y-151182640D03* +X39278560Y-147088160D03* +X39278560Y-148588160D03* +X43682920Y-135526080D03* +X43682920Y-137026080D03* +D12* +X42864340Y-129816860D03* +X44364340Y-129816860D03* +D11* +X44226480Y-150805580D03* +X44226480Y-149305580D03* +D13* +X70855840Y-128137920D03* +X70855840Y-125597920D03* +D12* +X58795220Y-150964900D03* +X60295220Y-150964900D03* +D11* +X75072240Y-126224600D03* +X75072240Y-127724600D03* +X56596280Y-147961920D03* +X56596280Y-149461920D03* +D13* +X69230240Y-141175740D03* +X69230240Y-138635740D03* +D11* +X73941940Y-139143040D03* +X73941940Y-140643040D03* +D14* +X63820040Y-134800340D03* +D15* +X73980040Y-134800340D03* +D16* +X43665140Y-139105840D03* +X43665140Y-142305840D03* +D17* +X59977400Y-140626600D03* +X59977400Y-139826600D03* +X59977400Y-139026600D03* +X59977400Y-138226600D03* +X59977400Y-137426600D03* +X59977400Y-136626600D03* +X59977400Y-135826600D03* +X59977400Y-135026600D03* +X59977400Y-134226600D03* +X59977400Y-133426600D03* +X59977400Y-132626600D03* +D18* +X58127400Y-130776600D03* +X57327400Y-130776600D03* +X56527400Y-130776600D03* +X55727400Y-130776600D03* +X54927400Y-130776600D03* +X54127400Y-130776600D03* +X53327400Y-130776600D03* +X52527400Y-130776600D03* +X51727400Y-130776600D03* +X50927400Y-130776600D03* +X50127400Y-130776600D03* +D17* +X48277400Y-132626600D03* +X48277400Y-133426600D03* +X48277400Y-134226600D03* +X48277400Y-135026600D03* +X48277400Y-135826600D03* +X48277400Y-136626600D03* +X48277400Y-137426600D03* +X48277400Y-138226600D03* +X48277400Y-139026600D03* +X48277400Y-139826600D03* +X48277400Y-140626600D03* +D18* +X50127400Y-142476600D03* +X50927400Y-142476600D03* +X51727400Y-142476600D03* +X52527400Y-142476600D03* +X53327400Y-142476600D03* +X54127400Y-142476600D03* +X54927400Y-142476600D03* +X55727400Y-142476600D03* +X56527400Y-142476600D03* +X57327400Y-142476600D03* +X58127400Y-142476600D03* +D14* +X74117200Y-131899660D03* +D15* +X63957200Y-131899660D03* +D19* +X36258500Y-146100800D03* +D20* +X36258500Y-148640800D03* +X36258500Y-151180800D03* +X36258500Y-153720800D03* +D21* +X40127360Y-134599260D03* +X40127360Y-135249260D03* +X40127360Y-135899260D03* +X40127360Y-136549260D03* +X40127360Y-137199260D03* +D22* +X40127360Y-133399260D03* +X40127360Y-138399260D03* +D23* +X37427360Y-132399260D03* +X37427360Y-139399260D03* +D24* +X64861440Y-154310080D03* +D25* +X67401440Y-154310080D03* +X69941440Y-154310080D03* +X72481440Y-154310080D03* +D26* +X57718960Y-123718320D03* +D27* +X57718960Y-126258320D03* +X55178960Y-123718320D03* +X55178960Y-126258320D03* +D24* +X49342040Y-125089920D03* +D25* +X46802040Y-125089920D03* +X44262040Y-125089920D03* +D28* +X61328300Y-154012900D03* +D29* +X58788300Y-154012900D03* +D28* +X73741280Y-144505680D03* +D29* +X71201280Y-144505680D03* +D28* +X65714880Y-122570240D03* +D29* +X63174880Y-122570240D03* +D30* +X68435680Y-126309120D03* +X65635680Y-127259120D03* +X65635680Y-125359120D03* +D31* +X40983600Y-154289760D03* +X39483600Y-154289760D03* +X40968360Y-145481040D03* +X39468360Y-145481040D03* +D32* +X42484040Y-154338720D03* +X42484040Y-152838720D03* +X42400220Y-147272440D03* +X42400220Y-145772440D03* +D31* +X42827640Y-151102060D03* +X41327640Y-151102060D03* +X42771760Y-149009100D03* +X41271760Y-149009100D03* +D32* +X72517000Y-150209820D03* +X72517000Y-151709820D03* +X70081140Y-150059960D03* +X70081140Y-151559960D03* +X67487800Y-150133620D03* +X67487800Y-151633620D03* +X64823340Y-150019320D03* +X64823340Y-151519320D03* +X72478900Y-147352320D03* +X72478900Y-148852320D03* +X70004940Y-147088160D03* +X70004940Y-148588160D03* +X67449700Y-147047520D03* +X67449700Y-148547520D03* +X64785240Y-147009420D03* +X64785240Y-148509420D03* +D31* +X58673300Y-146011900D03* +X60173300Y-146011900D03* +X60198700Y-148577300D03* +X58698700Y-148577300D03* +X64608140Y-137822940D03* +X63108140Y-137822940D03* +X63146240Y-139816840D03* +X64646240Y-139816840D03* +X64608140Y-141988540D03* +X63108140Y-141988540D03* +D33* +X43642280Y-134191200D03* +X42692280Y-131391200D03* +X44592280Y-131391200D03* +D34* +X48417500Y-145770600D03* +X48417500Y-147040600D03* +X48417500Y-148310600D03* +X48417500Y-149580600D03* +X48417500Y-150850600D03* +X48417500Y-152120600D03* +X48417500Y-153390600D03* +X53817500Y-153390600D03* +X53817500Y-152120600D03* +X53817500Y-150850600D03* +X53817500Y-149580600D03* +X53817500Y-148310600D03* +X53817500Y-147040600D03* +X53817500Y-145770600D03* +D35* +X60243720Y-127838200D03* +X60243720Y-129108200D03* +X62275720Y-128473200D03* +X60243720Y-128473200D03* +X62275720Y-129108200D03* +X62275720Y-127838200D03* +D12* +X52036280Y-128427480D03* +X53536280Y-128427480D03* +X54445600Y-144200880D03* +X52945600Y-144200880D03* +M02* diff --git a/PCB/WOT/Tinylab_proto1-F_Paste.gbr b/PCB/WOT/Tinylab_proto1-F_Paste.gbr new file mode 100644 index 00000000..1b6fefc9 --- /dev/null +++ b/PCB/WOT/Tinylab_proto1-F_Paste.gbr @@ -0,0 +1,176 @@ +G04 #@! TF.FileFunction,Paste,Top* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 26/09/2015 2:23:25 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11R,0.750000X0.800000*% +%ADD12R,0.800000X0.750000*% +%ADD13R,2.000000X2.000000*% +%ADD14R,1.600000X0.560000*% +%ADD15R,0.560000X1.600000*% +%ADD16R,1.350000X0.400000*% +%ADD17R,0.900000X0.600000*% +%ADD18R,0.500000X0.900000*% +%ADD19R,0.900000X0.500000*% +%ADD20R,0.600000X0.900000*% +%ADD21R,1.500000X0.600000*% +%ADD22R,0.508000X0.304800*% +G04 APERTURE END LIST* +D10* +D11* +X39827200Y-152682640D03* +X39827200Y-151182640D03* +X39786560Y-147088160D03* +X39786560Y-148588160D03* +X44190920Y-135526080D03* +X44190920Y-137026080D03* +D12* +X43372340Y-129816860D03* +X44872340Y-129816860D03* +D11* +X44734480Y-150805580D03* +X44734480Y-149305580D03* +D12* +X59303220Y-150964900D03* +X60803220Y-150964900D03* +D11* +X75580240Y-126224600D03* +X75580240Y-127724600D03* +X57104280Y-147961920D03* +X57104280Y-149461920D03* +X74449940Y-139143040D03* +X74449940Y-140643040D03* +D13* +X44173140Y-139105840D03* +X44173140Y-142305840D03* +D14* +X60485400Y-140626600D03* +X60485400Y-139826600D03* +X60485400Y-139026600D03* +X60485400Y-138226600D03* +X60485400Y-137426600D03* +X60485400Y-136626600D03* +X60485400Y-135826600D03* +X60485400Y-135026600D03* +X60485400Y-134226600D03* +X60485400Y-133426600D03* +X60485400Y-132626600D03* +D15* +X58635400Y-130776600D03* +X57835400Y-130776600D03* +X57035400Y-130776600D03* +X56235400Y-130776600D03* +X55435400Y-130776600D03* +X54635400Y-130776600D03* +X53835400Y-130776600D03* +X53035400Y-130776600D03* +X52235400Y-130776600D03* +X51435400Y-130776600D03* +X50635400Y-130776600D03* +D14* +X48785400Y-132626600D03* +X48785400Y-133426600D03* +X48785400Y-134226600D03* +X48785400Y-135026600D03* +X48785400Y-135826600D03* +X48785400Y-136626600D03* +X48785400Y-137426600D03* +X48785400Y-138226600D03* +X48785400Y-139026600D03* +X48785400Y-139826600D03* +X48785400Y-140626600D03* +D15* +X50635400Y-142476600D03* +X51435400Y-142476600D03* +X52235400Y-142476600D03* +X53035400Y-142476600D03* +X53835400Y-142476600D03* +X54635400Y-142476600D03* +X55435400Y-142476600D03* +X56235400Y-142476600D03* +X57035400Y-142476600D03* +X57835400Y-142476600D03* +X58635400Y-142476600D03* +D16* +X40635360Y-134599260D03* +X40635360Y-135249260D03* +X40635360Y-135899260D03* +X40635360Y-136549260D03* +X40635360Y-137199260D03* +D17* +X68943680Y-126309120D03* +X66143680Y-127259120D03* +X66143680Y-125359120D03* +D18* +X41491600Y-154289760D03* +X39991600Y-154289760D03* +X41476360Y-145481040D03* +X39976360Y-145481040D03* +D19* +X42992040Y-154338720D03* +X42992040Y-152838720D03* +X42908220Y-147272440D03* +X42908220Y-145772440D03* +D18* +X43335640Y-151102060D03* +X41835640Y-151102060D03* +X43279760Y-149009100D03* +X41779760Y-149009100D03* +D19* +X73025000Y-150209820D03* +X73025000Y-151709820D03* +X70589140Y-150059960D03* +X70589140Y-151559960D03* +X67995800Y-150133620D03* +X67995800Y-151633620D03* +X65331340Y-150019320D03* +X65331340Y-151519320D03* +X72986900Y-147352320D03* +X72986900Y-148852320D03* +X70512940Y-147088160D03* +X70512940Y-148588160D03* +X67957700Y-147047520D03* +X67957700Y-148547520D03* +X65293240Y-147009420D03* +X65293240Y-148509420D03* +D18* +X59181300Y-146011900D03* +X60681300Y-146011900D03* +X60706700Y-148577300D03* +X59206700Y-148577300D03* +X65116140Y-137822940D03* +X63616140Y-137822940D03* +X63654240Y-139816840D03* +X65154240Y-139816840D03* +X65116140Y-141988540D03* +X63616140Y-141988540D03* +D20* +X44150280Y-134191200D03* +X43200280Y-131391200D03* +X45100280Y-131391200D03* +D21* +X48925500Y-145770600D03* +X48925500Y-147040600D03* +X48925500Y-148310600D03* +X48925500Y-149580600D03* +X48925500Y-150850600D03* +X48925500Y-152120600D03* +X48925500Y-153390600D03* +X54325500Y-153390600D03* +X54325500Y-152120600D03* +X54325500Y-150850600D03* +X54325500Y-149580600D03* +X54325500Y-148310600D03* +X54325500Y-147040600D03* +X54325500Y-145770600D03* +D22* +X60751720Y-127838200D03* +X60751720Y-129108200D03* +X62783720Y-128473200D03* +X60751720Y-128473200D03* +X62783720Y-129108200D03* +X62783720Y-127838200D03* +M02* diff --git a/PCB/WOT/Tinylab_proto1-F_SilkS.gbr b/PCB/WOT/Tinylab_proto1-F_SilkS.gbr new file mode 100644 index 00000000..0e441147 --- /dev/null +++ b/PCB/WOT/Tinylab_proto1-F_SilkS.gbr @@ -0,0 +1,1885 @@ +G04 #@! TF.FileFunction,Legend,Top* +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Created by KiCad (PCBNEW (2015-08-05 BZR 6055, Git fa29c62)-product) date 28/09/2015 12:51:56 PM* +%MOMM*% +G01* +G04 APERTURE LIST* +%ADD10C,0.100000*% +%ADD11C,0.150000*% +%ADD12C,0.152400*% +%ADD13C,0.127000*% +G04 APERTURE END LIST* +D10* +D11* +X38719200Y-152282640D02* +X38719200Y-151582640D01* +X39919200Y-151582640D02* +X39919200Y-152282640D01* +X39878560Y-147488160D02* +X39878560Y-148188160D01* +X38678560Y-148188160D02* +X38678560Y-147488160D01* +X44282920Y-135926080D02* +X44282920Y-136626080D01* +X43082920Y-136626080D02* +X43082920Y-135926080D01* +X43264340Y-129216860D02* +X43964340Y-129216860D01* +X43964340Y-130416860D02* +X43264340Y-130416860D01* +X43626480Y-150405580D02* +X43626480Y-149705580D01* +X44826480Y-149705580D02* +X44826480Y-150405580D01* +X72555100Y-125867160D02* +X72555100Y-126367540D01* +X72555100Y-125867160D02* +X73055480Y-125867160D01* +X72555100Y-125366780D02* +X72555100Y-125867160D01* +X72555100Y-125867160D02* +X72156320Y-125867160D01* +X72156320Y-125867160D02* +X72054720Y-125867160D01* +X74005440Y-126867920D02* +G75* +G03X74005440Y-126867920I-3149600J0D01* +G01* +X59195220Y-150364900D02* +X59895220Y-150364900D01* +X59895220Y-151564900D02* +X59195220Y-151564900D01* +X75672240Y-126624600D02* +X75672240Y-127324600D01* +X74472240Y-127324600D02* +X74472240Y-126624600D01* +X57196280Y-148361920D02* +X57196280Y-149061920D01* +X55996280Y-149061920D02* +X55996280Y-148361920D01* +X70929500Y-138904980D02* +X70929500Y-139405360D01* +X70929500Y-138904980D02* +X71429880Y-138904980D01* +X70929500Y-138404600D02* +X70929500Y-138904980D01* +X70929500Y-138904980D02* +X70530720Y-138904980D01* +X70530720Y-138904980D02* +X70429120Y-138904980D01* +X72379840Y-139905740D02* +G75* +G03X72379840Y-139905740I-3149600J0D01* +G01* +X74541940Y-139543040D02* +X74541940Y-140243040D01* +X73341940Y-140243040D02* +X73341940Y-139543040D01* +X66360040Y-134800340D02* +X65344040Y-134800340D01* +X71186040Y-134800340D02* +X72456040Y-134800340D01* +X70932040Y-136070340D02* +X70932040Y-133530340D01* +X70678040Y-136070340D02* +X70678040Y-133530340D01* +X70424040Y-136070340D02* +X70424040Y-133530340D01* +X71186040Y-136070340D02* +X71186040Y-133530340D01* +X70170040Y-136070340D02* +X71440040Y-133530340D01* +X71440040Y-136070340D02* +X70170040Y-133530340D01* +X70170040Y-136070340D02* +X70170040Y-133530340D01* +X70805040Y-136070340D02* +X70805040Y-133530340D01* +X71440040Y-133530340D02* +X71440040Y-136070340D01* +X71440040Y-136070340D02* +X66360040Y-136070340D01* +X66360040Y-136070340D02* +X66360040Y-133530340D01* +X66360040Y-133530340D02* +X71440040Y-133530340D01* +X42865140Y-139105840D02* +X44465140Y-139105840D01* +X44465140Y-139105840D02* +X44465140Y-142305840D01* +X44465140Y-142305840D02* +X42865140Y-142305840D01* +X42865140Y-142305840D02* +X42865140Y-139105840D01* +X59302400Y-141801600D02* +X59302400Y-141131600D01* +X48952400Y-141801600D02* +X48952400Y-141131600D01* +X48952400Y-131451600D02* +X48952400Y-132121600D01* +X59302400Y-131451600D02* +X59302400Y-132121600D01* +X59302400Y-141801600D02* +X58632400Y-141801600D01* +X59302400Y-131451600D02* +X58632400Y-131451600D01* +X48952400Y-131451600D02* +X49622400Y-131451600D01* +X48952400Y-141801600D02* +X49622400Y-141801600D01* +X59302400Y-141131600D02* +X60777400Y-141131600D01* +X71577200Y-131899660D02* +X72593200Y-131899660D01* +X66751200Y-131899660D02* +X65481200Y-131899660D01* +X67005200Y-130629660D02* +X67005200Y-133169660D01* +X67259200Y-130629660D02* +X67259200Y-133169660D01* +X67513200Y-130629660D02* +X67513200Y-133169660D01* +X66751200Y-130629660D02* +X66751200Y-133169660D01* +X67767200Y-130629660D02* +X66497200Y-133169660D01* +X66497200Y-130629660D02* +X67767200Y-133169660D01* +X67767200Y-130629660D02* +X67767200Y-133169660D01* +X67132200Y-130629660D02* +X67132200Y-133169660D01* +X66497200Y-133169660D02* +X66497200Y-130629660D01* +X66497200Y-130629660D02* +X71577200Y-130629660D01* +X71577200Y-130629660D02* +X71577200Y-133169660D01* +X71577200Y-133169660D02* +X66497200Y-133169660D01* +X34988500Y-147370800D02* +X34988500Y-154990800D01* +X37528500Y-147370800D02* +X37528500Y-154990800D01* +X37808500Y-144550800D02* +X37808500Y-146100800D01* +X34988500Y-154990800D02* +X37528500Y-154990800D01* +X37528500Y-147370800D02* +X34988500Y-147370800D01* +X34708500Y-146100800D02* +X34708500Y-144550800D01* +X34708500Y-144550800D02* +X37808500Y-144550800D01* +X34747360Y-131549260D02* +X34747360Y-140249260D01* +X41152360Y-131549260D02* +X41152360Y-140249260D01* +X41152360Y-140249260D02* +X34747360Y-140249260D01* +X35977360Y-140249260D02* +X35977360Y-131549260D01* +X34747360Y-131549260D02* +X41152360Y-131549260D01* +X66131440Y-155580080D02* +X73751440Y-155580080D01* +X66131440Y-153040080D02* +X73751440Y-153040080D01* +X63311440Y-152760080D02* +X64861440Y-152760080D01* +X73751440Y-155580080D02* +X73751440Y-153040080D01* +X66131440Y-153040080D02* +X66131440Y-155580080D01* +X64861440Y-155860080D02* +X63311440Y-155860080D01* +X63311440Y-155860080D02* +X63311440Y-152760080D01* +X57718960Y-122168320D02* +X59268960Y-122168320D01* +X59268960Y-123718320D02* +X59268960Y-122168320D01* +X56448960Y-122448320D02* +X56448960Y-124988320D01* +X56448960Y-124988320D02* +X58988960Y-124988320D01* +X58988960Y-124988320D02* +X58988960Y-127528320D01* +X58988960Y-127528320D02* +X53908960Y-127528320D01* +X53908960Y-127528320D02* +X53908960Y-122448320D01* +X53908960Y-122448320D02* +X56448960Y-122448320D01* +X48072040Y-123819920D02* +X42992040Y-123819920D01* +X42992040Y-123819920D02* +X42992040Y-126359920D01* +X42992040Y-126359920D02* +X48072040Y-126359920D01* +X50892040Y-126639920D02* +X49342040Y-126639920D01* +X48072040Y-126359920D02* +X48072040Y-123819920D01* +X49342040Y-123539920D02* +X50892040Y-123539920D01* +X50892040Y-123539920D02* +X50892040Y-126639920D01* +X60058300Y-155282900D02* +X57518300Y-155282900D01* +X62878300Y-155562900D02* +X61328300Y-155562900D01* +X60058300Y-155282900D02* +X60058300Y-152742900D01* +X61328300Y-152462900D02* +X62878300Y-152462900D01* +X62878300Y-152462900D02* +X62878300Y-155562900D01* +X60058300Y-152742900D02* +X57518300Y-152742900D01* +X57518300Y-152742900D02* +X57518300Y-155282900D01* +X72471280Y-145775680D02* +X69931280Y-145775680D01* +X75291280Y-146055680D02* +X73741280Y-146055680D01* +X72471280Y-145775680D02* +X72471280Y-143235680D01* +X73741280Y-142955680D02* +X75291280Y-142955680D01* +X75291280Y-142955680D02* +X75291280Y-146055680D01* +X72471280Y-143235680D02* +X69931280Y-143235680D01* +X69931280Y-143235680D02* +X69931280Y-145775680D01* +X64444880Y-123840240D02* +X61904880Y-123840240D01* +X67264880Y-124120240D02* +X65714880Y-124120240D01* +X64444880Y-123840240D02* +X64444880Y-121300240D01* +X65714880Y-121020240D02* +X67264880Y-121020240D01* +X67264880Y-121020240D02* +X67264880Y-124120240D01* +X64444880Y-121300240D02* +X61904880Y-121300240D01* +X61904880Y-121300240D02* +X61904880Y-123840240D01* +X66777101Y-125309120D02* +G75* +G03X66777101Y-125309120I-141421J0D01* +G01* +X66235680Y-127809120D02* +X67835680Y-127809120D01* +X67835680Y-127809120D02* +X67835680Y-124809120D01* +X67835680Y-124809120D02* +X66235680Y-124809120D01* +X66235680Y-124809120D02* +X66235680Y-127809120D01* +X39733600Y-153614760D02* +X40733600Y-153614760D01* +X40733600Y-154964760D02* +X39733600Y-154964760D01* +X39718360Y-144806040D02* +X40718360Y-144806040D01* +X40718360Y-146156040D02* +X39718360Y-146156040D01* +X43159040Y-153088720D02* +X43159040Y-154088720D01* +X41809040Y-154088720D02* +X41809040Y-153088720D01* +X43075220Y-146022440D02* +X43075220Y-147022440D01* +X41725220Y-147022440D02* +X41725220Y-146022440D01* +X41577640Y-150427060D02* +X42577640Y-150427060D01* +X42577640Y-151777060D02* +X41577640Y-151777060D01* +X41521760Y-148334100D02* +X42521760Y-148334100D01* +X42521760Y-149684100D02* +X41521760Y-149684100D01* +X71842000Y-151459820D02* +X71842000Y-150459820D01* +X73192000Y-150459820D02* +X73192000Y-151459820D01* +X69406140Y-151309960D02* +X69406140Y-150309960D01* +X70756140Y-150309960D02* +X70756140Y-151309960D01* +X66812800Y-151383620D02* +X66812800Y-150383620D01* +X68162800Y-150383620D02* +X68162800Y-151383620D01* +X64148340Y-151269320D02* +X64148340Y-150269320D01* +X65498340Y-150269320D02* +X65498340Y-151269320D01* +X71803900Y-148602320D02* +X71803900Y-147602320D01* +X73153900Y-147602320D02* +X73153900Y-148602320D01* +X69329940Y-148338160D02* +X69329940Y-147338160D01* +X70679940Y-147338160D02* +X70679940Y-148338160D01* +X66774700Y-148297520D02* +X66774700Y-147297520D01* +X68124700Y-147297520D02* +X68124700Y-148297520D01* +X64110240Y-148259420D02* +X64110240Y-147259420D01* +X65460240Y-147259420D02* +X65460240Y-148259420D01* +X59923300Y-146686900D02* +X58923300Y-146686900D01* +X58923300Y-145336900D02* +X59923300Y-145336900D01* +X58948700Y-147902300D02* +X59948700Y-147902300D01* +X59948700Y-149252300D02* +X58948700Y-149252300D01* +X63358140Y-137147940D02* +X64358140Y-137147940D01* +X64358140Y-138497940D02* +X63358140Y-138497940D01* +X64396240Y-140491840D02* +X63396240Y-140491840D01* +X63396240Y-139141840D02* +X64396240Y-139141840D01* +X63358140Y-141313540D02* +X64358140Y-141313540D01* +X64358140Y-142663540D02* +X63358140Y-142663540D01* +X44783701Y-132391200D02* +G75* +G03X44783701Y-132391200I-141421J0D01* +G01* +X42142280Y-131991200D02* +X42142280Y-133591200D01* +X42142280Y-133591200D02* +X45142280Y-133591200D01* +X45142280Y-133591200D02* +X45142280Y-131991200D01* +X45142280Y-131991200D02* +X42142280Y-131991200D01* +X49042500Y-145130600D02* +X49042500Y-145245600D01* +X53192500Y-145130600D02* +X53192500Y-145245600D01* +X53192500Y-154030600D02* +X53192500Y-153915600D01* +X49042500Y-154030600D02* +X49042500Y-153915600D01* +X49042500Y-145130600D02* +X53192500Y-145130600D01* +X49042500Y-154030600D02* +X53192500Y-154030600D01* +X49042500Y-145245600D02* +X47667500Y-145245600D01* +D12* +X61894720Y-129489200D02* +X61894720Y-127457200D01* +X61894720Y-127457200D02* +X60624720Y-127457200D01* +X60624720Y-127457200D02* +X60624720Y-129489200D01* +X60624720Y-129489200D02* +X61894720Y-129489200D01* +D11* +X52436280Y-127827480D02* +X53136280Y-127827480D01* +X53136280Y-129027480D02* +X52436280Y-129027480D01* +X54045600Y-144800880D02* +X53345600Y-144800880D01* +X53345600Y-143600880D02* +X54045600Y-143600880D01* +X37776343Y-152099306D02* +X37823962Y-152146925D01* +X37871581Y-152289782D01* +X37871581Y-152385020D01* +X37823962Y-152527878D01* +X37728724Y-152623116D01* +X37633486Y-152670735D01* +X37443010Y-152718354D01* +X37300152Y-152718354D01* +X37109676Y-152670735D01* +X37014438Y-152623116D01* +X36919200Y-152527878D01* +X36871581Y-152385020D01* +X36871581Y-152289782D01* +X36919200Y-152146925D01* +X36966819Y-152099306D01* +X37871581Y-151146925D02* +X37871581Y-151718354D01* +X37871581Y-151432640D02* +X36871581Y-151432640D01* +X37014438Y-151527878D01* +X37109676Y-151623116D01* +X37157295Y-151718354D01* +X41535703Y-148004826D02* +X41583322Y-148052445D01* +X41630941Y-148195302D01* +X41630941Y-148290540D01* +X41583322Y-148433398D01* +X41488084Y-148528636D01* +X41392846Y-148576255D01* +X41202370Y-148623874D01* +X41059512Y-148623874D01* +X40869036Y-148576255D01* +X40773798Y-148528636D01* +X40678560Y-148433398D01* +X40630941Y-148290540D01* +X40630941Y-148195302D01* +X40678560Y-148052445D01* +X40726179Y-148004826D01* +X40726179Y-147623874D02* +X40678560Y-147576255D01* +X40630941Y-147481017D01* +X40630941Y-147242921D01* +X40678560Y-147147683D01* +X40726179Y-147100064D01* +X40821417Y-147052445D01* +X40916655Y-147052445D01* +X41059512Y-147100064D01* +X41630941Y-147671493D01* +X41630941Y-147052445D01* +X45940063Y-136442746D02* +X45987682Y-136490365D01* +X46035301Y-136633222D01* +X46035301Y-136728460D01* +X45987682Y-136871318D01* +X45892444Y-136966556D01* +X45797206Y-137014175D01* +X45606730Y-137061794D01* +X45463872Y-137061794D01* +X45273396Y-137014175D01* +X45178158Y-136966556D01* +X45082920Y-136871318D01* +X45035301Y-136728460D01* +X45035301Y-136633222D01* +X45082920Y-136490365D01* +X45130539Y-136442746D01* +X45035301Y-136109413D02* +X45035301Y-135490365D01* +X45416253Y-135823699D01* +X45416253Y-135680841D01* +X45463872Y-135585603D01* +X45511491Y-135537984D01* +X45606730Y-135490365D01* +X45844825Y-135490365D01* +X45940063Y-135537984D01* +X45987682Y-135585603D01* +X46035301Y-135680841D01* +X46035301Y-135966556D01* +X45987682Y-136061794D01* +X45940063Y-136109413D01* +X43447674Y-128274003D02* +X43400055Y-128321622D01* +X43257198Y-128369241D01* +X43161960Y-128369241D01* +X43019102Y-128321622D01* +X42923864Y-128226384D01* +X42876245Y-128131146D01* +X42828626Y-127940670D01* +X42828626Y-127797812D01* +X42876245Y-127607336D01* +X42923864Y-127512098D01* +X43019102Y-127416860D01* +X43161960Y-127369241D01* +X43257198Y-127369241D01* +X43400055Y-127416860D01* +X43447674Y-127464479D01* +X44304817Y-127702574D02* +X44304817Y-128369241D01* +X44066721Y-127321622D02* +X43828626Y-128035908D01* +X44447674Y-128035908D01* +X42683623Y-150222246D02* +X42731242Y-150269865D01* +X42778861Y-150412722D01* +X42778861Y-150507960D01* +X42731242Y-150650818D01* +X42636004Y-150746056D01* +X42540766Y-150793675D01* +X42350290Y-150841294D01* +X42207432Y-150841294D01* +X42016956Y-150793675D01* +X41921718Y-150746056D01* +X41826480Y-150650818D01* +X41778861Y-150507960D01* +X41778861Y-150412722D01* +X41826480Y-150269865D01* +X41874099Y-150222246D01* +X41778861Y-149317484D02* +X41778861Y-149793675D01* +X42255051Y-149841294D01* +X42207432Y-149793675D01* +X42159813Y-149698437D01* +X42159813Y-149460341D01* +X42207432Y-149365103D01* +X42255051Y-149317484D01* +X42350290Y-149269865D01* +X42588385Y-149269865D01* +X42683623Y-149317484D01* +X42731242Y-149365103D01* +X42778861Y-149460341D01* +X42778861Y-149698437D01* +X42731242Y-149793675D01* +X42683623Y-149841294D01* +X76292983Y-127034586D02* +X76340602Y-127082205D01* +X76388221Y-127225062D01* +X76388221Y-127320300D01* +X76340602Y-127463158D01* +X76245364Y-127558396D01* +X76150126Y-127606015D01* +X75959650Y-127653634D01* +X75816792Y-127653634D01* +X75626316Y-127606015D01* +X75531078Y-127558396D01* +X75435840Y-127463158D01* +X75388221Y-127320300D01* +X75388221Y-127225062D01* +X75435840Y-127082205D01* +X75483459Y-127034586D01* +X75388221Y-126177443D02* +X75388221Y-126367920D01* +X75435840Y-126463158D01* +X75483459Y-126510777D01* +X75626316Y-126606015D01* +X75816792Y-126653634D01* +X76197745Y-126653634D01* +X76292983Y-126606015D01* +X76340602Y-126558396D01* +X76388221Y-126463158D01* +X76388221Y-126272681D01* +X76340602Y-126177443D01* +X76292983Y-126129824D01* +X76197745Y-126082205D01* +X75959650Y-126082205D01* +X75864411Y-126129824D01* +X75816792Y-126177443D01* +X75769173Y-126272681D01* +X75769173Y-126463158D01* +X75816792Y-126558396D01* +X75864411Y-126606015D01* +X75959650Y-126653634D01* +X59378554Y-149422043D02* +X59330935Y-149469662D01* +X59188078Y-149517281D01* +X59092840Y-149517281D01* +X58949982Y-149469662D01* +X58854744Y-149374424D01* +X58807125Y-149279186D01* +X58759506Y-149088710D01* +X58759506Y-148945852D01* +X58807125Y-148755376D01* +X58854744Y-148660138D01* +X58949982Y-148564900D01* +X59092840Y-148517281D01* +X59188078Y-148517281D01* +X59330935Y-148564900D01* +X59378554Y-148612519D01* +X59711887Y-148517281D02* +X60378554Y-148517281D01* +X59949982Y-149517281D01* +X77329383Y-127141266D02* +X77377002Y-127188885D01* +X77424621Y-127331742D01* +X77424621Y-127426980D01* +X77377002Y-127569838D01* +X77281764Y-127665076D01* +X77186526Y-127712695D01* +X76996050Y-127760314D01* +X76853192Y-127760314D01* +X76662716Y-127712695D01* +X76567478Y-127665076D01* +X76472240Y-127569838D01* +X76424621Y-127426980D01* +X76424621Y-127331742D01* +X76472240Y-127188885D01* +X76519859Y-127141266D01* +X76853192Y-126569838D02* +X76805573Y-126665076D01* +X76757954Y-126712695D01* +X76662716Y-126760314D01* +X76615097Y-126760314D01* +X76519859Y-126712695D01* +X76472240Y-126665076D01* +X76424621Y-126569838D01* +X76424621Y-126379361D01* +X76472240Y-126284123D01* +X76519859Y-126236504D01* +X76615097Y-126188885D01* +X76662716Y-126188885D01* +X76757954Y-126236504D01* +X76805573Y-126284123D01* +X76853192Y-126379361D01* +X76853192Y-126569838D01* +X76900811Y-126665076D01* +X76948430Y-126712695D01* +X77043669Y-126760314D01* +X77234145Y-126760314D01* +X77329383Y-126712695D01* +X77377002Y-126665076D01* +X77424621Y-126569838D01* +X77424621Y-126379361D01* +X77377002Y-126284123D01* +X77329383Y-126236504D01* +X77234145Y-126188885D01* +X77043669Y-126188885D01* +X76948430Y-126236504D01* +X76900811Y-126284123D01* +X76853192Y-126379361D01* +X58853423Y-148878586D02* +X58901042Y-148926205D01* +X58948661Y-149069062D01* +X58948661Y-149164300D01* +X58901042Y-149307158D01* +X58805804Y-149402396D01* +X58710566Y-149450015D01* +X58520090Y-149497634D01* +X58377232Y-149497634D01* +X58186756Y-149450015D01* +X58091518Y-149402396D01* +X57996280Y-149307158D01* +X57948661Y-149164300D01* +X57948661Y-149069062D01* +X57996280Y-148926205D01* +X58043899Y-148878586D01* +X58948661Y-148402396D02* +X58948661Y-148211920D01* +X58901042Y-148116681D01* +X58853423Y-148069062D01* +X58710566Y-147973824D01* +X58520090Y-147926205D01* +X58139137Y-147926205D01* +X58043899Y-147973824D01* +X57996280Y-148021443D01* +X57948661Y-148116681D01* +X57948661Y-148307158D01* +X57996280Y-148402396D01* +X58043899Y-148450015D01* +X58139137Y-148497634D01* +X58377232Y-148497634D01* +X58472470Y-148450015D01* +X58520090Y-148402396D01* +X58567709Y-148307158D01* +X58567709Y-148116681D01* +X58520090Y-148021443D01* +X58472470Y-147973824D01* +X58377232Y-147926205D01* +X74667383Y-140548597D02* +X74715002Y-140596216D01* +X74762621Y-140739073D01* +X74762621Y-140834311D01* +X74715002Y-140977169D01* +X74619764Y-141072407D01* +X74524526Y-141120026D01* +X74334050Y-141167645D01* +X74191192Y-141167645D01* +X74000716Y-141120026D01* +X73905478Y-141072407D01* +X73810240Y-140977169D01* +X73762621Y-140834311D01* +X73762621Y-140739073D01* +X73810240Y-140596216D01* +X73857859Y-140548597D01* +X74762621Y-139596216D02* +X74762621Y-140167645D01* +X74762621Y-139881931D02* +X73762621Y-139881931D01* +X73905478Y-139977169D01* +X74000716Y-140072407D01* +X74048335Y-140167645D01* +X74762621Y-138643835D02* +X74762621Y-139215264D01* +X74762621Y-138929550D02* +X73762621Y-138929550D01* +X73905478Y-139024788D01* +X74000716Y-139120026D01* +X74048335Y-139215264D01* +X76199083Y-140535897D02* +X76246702Y-140583516D01* +X76294321Y-140726373D01* +X76294321Y-140821611D01* +X76246702Y-140964469D01* +X76151464Y-141059707D01* +X76056226Y-141107326D01* +X75865750Y-141154945D01* +X75722892Y-141154945D01* +X75532416Y-141107326D01* +X75437178Y-141059707D01* +X75341940Y-140964469D01* +X75294321Y-140821611D01* +X75294321Y-140726373D01* +X75341940Y-140583516D01* +X75389559Y-140535897D01* +X76294321Y-139583516D02* +X76294321Y-140154945D01* +X76294321Y-139869231D02* +X75294321Y-139869231D01* +X75437178Y-139964469D01* +X75532416Y-140059707D01* +X75580035Y-140154945D01* +X75389559Y-139202564D02* +X75341940Y-139154945D01* +X75294321Y-139059707D01* +X75294321Y-138821611D01* +X75341940Y-138726373D01* +X75389559Y-138678754D01* +X75484797Y-138631135D01* +X75580035Y-138631135D01* +X75722892Y-138678754D01* +X76294321Y-139250183D01* +X76294321Y-138631135D01* +X67854605Y-132712721D02* +X67854605Y-131712721D01* +X68092700Y-131712721D01* +X68235558Y-131760340D01* +X68330796Y-131855578D01* +X68378415Y-131950816D01* +X68426034Y-132141292D01* +X68426034Y-132284150D01* +X68378415Y-132474626D01* +X68330796Y-132569864D01* +X68235558Y-132665102D01* +X68092700Y-132712721D01* +X67854605Y-132712721D01* +X69378415Y-132712721D02* +X68806986Y-132712721D01* +X69092700Y-132712721D02* +X69092700Y-131712721D01* +X68997462Y-131855578D01* +X68902224Y-131950816D01* +X68806986Y-131998435D01* +X41893711Y-141039173D02* +X41893711Y-141372507D01* +X42417521Y-141372507D02* +X41417521Y-141372507D01* +X41417521Y-140896316D01* +X42417521Y-139991554D02* +X42417521Y-140562983D01* +X42417521Y-140277269D02* +X41417521Y-140277269D01* +X41560378Y-140372507D01* +X41655616Y-140467745D01* +X41703235Y-140562983D01* +X53151210Y-144728981D02* +X53151210Y-143728981D01* +X54198829Y-144633743D02* +X54151210Y-144681362D01* +X54008353Y-144728981D01* +X53913115Y-144728981D01* +X53770257Y-144681362D01* +X53675019Y-144586124D01* +X53627400Y-144490886D01* +X53579781Y-144300410D01* +X53579781Y-144157552D01* +X53627400Y-143967076D01* +X53675019Y-143871838D01* +X53770257Y-143776600D01* +X53913115Y-143728981D01* +X54008353Y-143728981D01* +X54151210Y-143776600D01* +X54198829Y-143824219D01* +X55151210Y-144728981D02* +X54579781Y-144728981D01* +X54865495Y-144728981D02* +X54865495Y-143728981D01* +X54770257Y-143871838D01* +X54675019Y-143967076D01* +X54579781Y-144014695D01* +X69177874Y-134892041D02* +X68701683Y-134892041D01* +X68701683Y-133892041D01* +X70035017Y-134892041D02* +X69463588Y-134892041D01* +X69749302Y-134892041D02* +X69749302Y-133892041D01* +X69654064Y-134034898D01* +X69558826Y-134130136D01* +X69463588Y-134177755D01* +X35520405Y-141453181D02* +X35520405Y-140453181D01* +X35901358Y-140453181D01* +X35996596Y-140500800D01* +X36044215Y-140548419D01* +X36091834Y-140643657D01* +X36091834Y-140786514D01* +X36044215Y-140881752D01* +X35996596Y-140929371D01* +X35901358Y-140976990D01* +X35520405Y-140976990D01* +X37044215Y-141453181D02* +X36472786Y-141453181D01* +X36758500Y-141453181D02* +X36758500Y-140453181D01* +X36663262Y-140596038D01* +X36568024Y-140691276D01* +X36472786Y-140738895D01* +X42467201Y-136638255D02* +X41467201Y-136638255D01* +X41467201Y-136257302D01* +X41514820Y-136162064D01* +X41562439Y-136114445D01* +X41657677Y-136066826D01* +X41800534Y-136066826D01* +X41895772Y-136114445D01* +X41943391Y-136162064D01* +X41991010Y-136257302D01* +X41991010Y-136638255D01* +X41562439Y-135685874D02* +X41514820Y-135638255D01* +X41467201Y-135543017D01* +X41467201Y-135304921D01* +X41514820Y-135209683D01* +X41562439Y-135162064D01* +X41657677Y-135114445D01* +X41752915Y-135114445D01* +X41895772Y-135162064D01* +X42467201Y-135733493D01* +X42467201Y-135114445D01* +X60213821Y-155048175D02* +X59213821Y-155048175D01* +X59213821Y-154667222D01* +X59261440Y-154571984D01* +X59309059Y-154524365D01* +X59404297Y-154476746D01* +X59547154Y-154476746D01* +X59642392Y-154524365D01* +X59690011Y-154571984D01* +X59737630Y-154667222D01* +X59737630Y-155048175D01* +X59213821Y-154143413D02* +X59213821Y-153524365D01* +X59594773Y-153857699D01* +X59594773Y-153714841D01* +X59642392Y-153619603D01* +X59690011Y-153571984D01* +X59785250Y-153524365D01* +X60023345Y-153524365D01* +X60118583Y-153571984D01* +X60166202Y-153619603D01* +X60213821Y-153714841D01* +X60213821Y-154000556D01* +X60166202Y-154095794D01* +X60118583Y-154143413D01* +X63271341Y-124456415D02* +X62271341Y-124456415D01* +X62271341Y-124075462D01* +X62318960Y-123980224D01* +X62366579Y-123932605D01* +X62461817Y-123884986D01* +X62604674Y-123884986D01* +X62699912Y-123932605D01* +X62747531Y-123980224D01* +X62795150Y-124075462D01* +X62795150Y-124456415D01* +X62604674Y-123027843D02* +X63271341Y-123027843D01* +X62223722Y-123265939D02* +X62938008Y-123504034D01* +X62938008Y-122884986D01* +X54894421Y-125828015D02* +X53894421Y-125828015D01* +X53894421Y-125447062D01* +X53942040Y-125351824D01* +X53989659Y-125304205D01* +X54084897Y-125256586D01* +X54227754Y-125256586D01* +X54322992Y-125304205D01* +X54370611Y-125351824D01* +X54418230Y-125447062D01* +X54418230Y-125828015D01* +X53894421Y-124351824D02* +X53894421Y-124828015D01* +X54370611Y-124875634D01* +X54322992Y-124828015D01* +X54275373Y-124732777D01* +X54275373Y-124494681D01* +X54322992Y-124399443D01* +X54370611Y-124351824D01* +X54465850Y-124304205D01* +X54703945Y-124304205D01* +X54799183Y-124351824D01* +X54846802Y-124399443D01* +X54894421Y-124494681D01* +X54894421Y-124732777D01* +X54846802Y-124828015D01* +X54799183Y-124875634D01* +X66880681Y-154750995D02* +X65880681Y-154750995D01* +X65880681Y-154370042D01* +X65928300Y-154274804D01* +X65975919Y-154227185D01* +X66071157Y-154179566D01* +X66214014Y-154179566D01* +X66309252Y-154227185D01* +X66356871Y-154274804D01* +X66404490Y-154370042D01* +X66404490Y-154750995D01* +X65880681Y-153322423D02* +X65880681Y-153512900D01* +X65928300Y-153608138D01* +X65975919Y-153655757D01* +X66118776Y-153750995D01* +X66309252Y-153798614D01* +X66690205Y-153798614D01* +X66785443Y-153750995D01* +X66833062Y-153703376D01* +X66880681Y-153608138D01* +X66880681Y-153417661D01* +X66833062Y-153322423D01* +X66785443Y-153274804D01* +X66690205Y-153227185D01* +X66452110Y-153227185D01* +X66356871Y-153274804D01* +X66309252Y-153322423D01* +X66261633Y-153417661D01* +X66261633Y-153608138D01* +X66309252Y-153703376D01* +X66356871Y-153750995D01* +X66452110Y-153798614D01* +X79293661Y-145243775D02* +X78293661Y-145243775D01* +X78293661Y-144862822D01* +X78341280Y-144767584D01* +X78388899Y-144719965D01* +X78484137Y-144672346D01* +X78626994Y-144672346D01* +X78722232Y-144719965D01* +X78769851Y-144767584D01* +X78817470Y-144862822D01* +X78817470Y-145243775D01* +X78293661Y-144339013D02* +X78293661Y-143672346D01* +X79293661Y-144100918D01* +X71267261Y-123308335D02* +X70267261Y-123308335D01* +X70267261Y-122927382D01* +X70314880Y-122832144D01* +X70362499Y-122784525D01* +X70457737Y-122736906D01* +X70600594Y-122736906D01* +X70695832Y-122784525D01* +X70743451Y-122832144D01* +X70791070Y-122927382D01* +X70791070Y-123308335D01* +X70695832Y-122165478D02* +X70648213Y-122260716D01* +X70600594Y-122308335D01* +X70505356Y-122355954D01* +X70457737Y-122355954D01* +X70362499Y-122308335D01* +X70314880Y-122260716D01* +X70267261Y-122165478D01* +X70267261Y-121975001D01* +X70314880Y-121879763D01* +X70362499Y-121832144D01* +X70457737Y-121784525D01* +X70505356Y-121784525D01* +X70600594Y-121832144D01* +X70648213Y-121879763D01* +X70695832Y-121975001D01* +X70695832Y-122165478D01* +X70743451Y-122260716D01* +X70791070Y-122308335D01* +X70886309Y-122355954D01* +X71076785Y-122355954D01* +X71172023Y-122308335D01* +X71219642Y-122260716D01* +X71267261Y-122165478D01* +X71267261Y-121975001D01* +X71219642Y-121879763D01* +X71172023Y-121832144D01* +X71076785Y-121784525D01* +X70886309Y-121784525D01* +X70791070Y-121832144D01* +X70743451Y-121879763D01* +X70695832Y-121975001D01* +X66940442Y-124356739D02* +X66845204Y-124309120D01* +X66749966Y-124213882D01* +X66607109Y-124071025D01* +X66511870Y-124023406D01* +X66416632Y-124023406D01* +X66464251Y-124261501D02* +X66369013Y-124213882D01* +X66273775Y-124118644D01* +X66226156Y-123928168D01* +X66226156Y-123594834D01* +X66273775Y-123404358D01* +X66369013Y-123309120D01* +X66464251Y-123261501D01* +X66654728Y-123261501D01* +X66749966Y-123309120D01* +X66845204Y-123404358D01* +X66892823Y-123594834D01* +X66892823Y-123928168D01* +X66845204Y-124118644D01* +X66749966Y-124213882D01* +X66654728Y-124261501D01* +X66464251Y-124261501D01* +X67845204Y-124261501D02* +X67273775Y-124261501D01* +X67559489Y-124261501D02* +X67559489Y-123261501D01* +X67464251Y-123404358D01* +X67369013Y-123499596D01* +X67273775Y-123547215D01* +X40066934Y-156642141D02* +X39733600Y-156165950D01* +X39495505Y-156642141D02* +X39495505Y-155642141D01* +X39876458Y-155642141D01* +X39971696Y-155689760D01* +X40019315Y-155737379D01* +X40066934Y-155832617D01* +X40066934Y-155975474D01* +X40019315Y-156070712D01* +X39971696Y-156118331D01* +X39876458Y-156165950D01* +X39495505Y-156165950D01* +X41019315Y-156642141D02* +X40447886Y-156642141D01* +X40733600Y-156642141D02* +X40733600Y-155642141D01* +X40638362Y-155784998D01* +X40543124Y-155880236D01* +X40447886Y-155927855D01* +X40051694Y-147833421D02* +X39718360Y-147357230D01* +X39480265Y-147833421D02* +X39480265Y-146833421D01* +X39861218Y-146833421D01* +X39956456Y-146881040D01* +X40004075Y-146928659D01* +X40051694Y-147023897D01* +X40051694Y-147166754D01* +X40004075Y-147261992D01* +X39956456Y-147309611D01* +X39861218Y-147357230D01* +X39480265Y-147357230D01* +X40432646Y-146928659D02* +X40480265Y-146881040D01* +X40575503Y-146833421D01* +X40813599Y-146833421D01* +X40908837Y-146881040D01* +X40956456Y-146928659D01* +X41004075Y-147023897D01* +X41004075Y-147119135D01* +X40956456Y-147261992D01* +X40385027Y-147833421D01* +X41004075Y-147833421D01* +X41036421Y-153755386D02* +X40560230Y-154088720D01* +X41036421Y-154326815D02* +X40036421Y-154326815D01* +X40036421Y-153945862D01* +X40084040Y-153850624D01* +X40131659Y-153803005D01* +X40226897Y-153755386D01* +X40369754Y-153755386D01* +X40464992Y-153803005D01* +X40512611Y-153850624D01* +X40560230Y-153945862D01* +X40560230Y-154326815D01* +X40036421Y-153422053D02* +X40036421Y-152803005D01* +X40417373Y-153136339D01* +X40417373Y-152993481D01* +X40464992Y-152898243D01* +X40512611Y-152850624D01* +X40607850Y-152803005D01* +X40845945Y-152803005D01* +X40941183Y-152850624D01* +X40988802Y-152898243D01* +X41036421Y-152993481D01* +X41036421Y-153279196D01* +X40988802Y-153374434D01* +X40941183Y-153422053D01* +X40952601Y-146689106D02* +X40476410Y-147022440D01* +X40952601Y-147260535D02* +X39952601Y-147260535D01* +X39952601Y-146879582D01* +X40000220Y-146784344D01* +X40047839Y-146736725D01* +X40143077Y-146689106D01* +X40285934Y-146689106D01* +X40381172Y-146736725D01* +X40428791Y-146784344D01* +X40476410Y-146879582D01* +X40476410Y-147260535D01* +X40285934Y-145831963D02* +X40952601Y-145831963D01* +X39904982Y-146070059D02* +X40619268Y-146308154D01* +X40619268Y-145689106D01* +X41910974Y-153454441D02* +X41577640Y-152978250D01* +X41339545Y-153454441D02* +X41339545Y-152454441D01* +X41720498Y-152454441D01* +X41815736Y-152502060D01* +X41863355Y-152549679D01* +X41910974Y-152644917D01* +X41910974Y-152787774D01* +X41863355Y-152883012D01* +X41815736Y-152930631D01* +X41720498Y-152978250D01* +X41339545Y-152978250D01* +X42815736Y-152454441D02* +X42339545Y-152454441D01* +X42291926Y-152930631D01* +X42339545Y-152883012D01* +X42434783Y-152835393D01* +X42672879Y-152835393D01* +X42768117Y-152883012D01* +X42815736Y-152930631D01* +X42863355Y-153025870D01* +X42863355Y-153263965D01* +X42815736Y-153359203D01* +X42768117Y-153406822D01* +X42672879Y-153454441D01* +X42434783Y-153454441D01* +X42339545Y-153406822D01* +X42291926Y-153359203D01* +X41855094Y-151361481D02* +X41521760Y-150885290D01* +X41283665Y-151361481D02* +X41283665Y-150361481D01* +X41664618Y-150361481D01* +X41759856Y-150409100D01* +X41807475Y-150456719D01* +X41855094Y-150551957D01* +X41855094Y-150694814D01* +X41807475Y-150790052D01* +X41759856Y-150837671D01* +X41664618Y-150885290D01* +X41283665Y-150885290D01* +X42712237Y-150361481D02* +X42521760Y-150361481D01* +X42426522Y-150409100D01* +X42378903Y-150456719D01* +X42283665Y-150599576D01* +X42236046Y-150790052D01* +X42236046Y-151171005D01* +X42283665Y-151266243D01* +X42331284Y-151313862D01* +X42426522Y-151361481D01* +X42616999Y-151361481D01* +X42712237Y-151313862D01* +X42759856Y-151266243D01* +X42807475Y-151171005D01* +X42807475Y-150932910D01* +X42759856Y-150837671D01* +X42712237Y-150790052D01* +X42616999Y-150742433D01* +X42426522Y-150742433D01* +X42331284Y-150790052D01* +X42283665Y-150837671D01* +X42236046Y-150932910D01* +X74869381Y-151126486D02* +X74393190Y-151459820D01* +X74869381Y-151697915D02* +X73869381Y-151697915D01* +X73869381Y-151316962D01* +X73917000Y-151221724D01* +X73964619Y-151174105D01* +X74059857Y-151126486D01* +X74202714Y-151126486D01* +X74297952Y-151174105D01* +X74345571Y-151221724D01* +X74393190Y-151316962D01* +X74393190Y-151697915D01* +X73869381Y-150793153D02* +X73869381Y-150126486D01* +X74869381Y-150555058D01* +X72433521Y-150976626D02* +X71957330Y-151309960D01* +X72433521Y-151548055D02* +X71433521Y-151548055D01* +X71433521Y-151167102D01* +X71481140Y-151071864D01* +X71528759Y-151024245D01* +X71623997Y-150976626D01* +X71766854Y-150976626D01* +X71862092Y-151024245D01* +X71909711Y-151071864D01* +X71957330Y-151167102D01* +X71957330Y-151548055D01* +X71862092Y-150405198D02* +X71814473Y-150500436D01* +X71766854Y-150548055D01* +X71671616Y-150595674D01* +X71623997Y-150595674D01* +X71528759Y-150548055D01* +X71481140Y-150500436D01* +X71433521Y-150405198D01* +X71433521Y-150214721D01* +X71481140Y-150119483D01* +X71528759Y-150071864D01* +X71623997Y-150024245D01* +X71671616Y-150024245D01* +X71766854Y-150071864D01* +X71814473Y-150119483D01* +X71862092Y-150214721D01* +X71862092Y-150405198D01* +X71909711Y-150500436D01* +X71957330Y-150548055D01* +X72052569Y-150595674D01* +X72243045Y-150595674D01* +X72338283Y-150548055D01* +X72385902Y-150500436D01* +X72433521Y-150405198D01* +X72433521Y-150214721D01* +X72385902Y-150119483D01* +X72338283Y-150071864D01* +X72243045Y-150024245D01* +X72052569Y-150024245D01* +X71957330Y-150071864D01* +X71909711Y-150119483D01* +X71862092Y-150214721D01* +X69840181Y-151050286D02* +X69363990Y-151383620D01* +X69840181Y-151621715D02* +X68840181Y-151621715D01* +X68840181Y-151240762D01* +X68887800Y-151145524D01* +X68935419Y-151097905D01* +X69030657Y-151050286D01* +X69173514Y-151050286D01* +X69268752Y-151097905D01* +X69316371Y-151145524D01* +X69363990Y-151240762D01* +X69363990Y-151621715D01* +X69840181Y-150574096D02* +X69840181Y-150383620D01* +X69792562Y-150288381D01* +X69744943Y-150240762D01* +X69602086Y-150145524D01* +X69411610Y-150097905D01* +X69030657Y-150097905D01* +X68935419Y-150145524D01* +X68887800Y-150193143D01* +X68840181Y-150288381D01* +X68840181Y-150478858D01* +X68887800Y-150574096D01* +X68935419Y-150621715D01* +X69030657Y-150669334D01* +X69268752Y-150669334D01* +X69363990Y-150621715D01* +X69411610Y-150574096D01* +X69459229Y-150478858D01* +X69459229Y-150288381D01* +X69411610Y-150193143D01* +X69363990Y-150145524D01* +X69268752Y-150097905D01* +X67175721Y-151412177D02* +X66699530Y-151745511D01* +X67175721Y-151983606D02* +X66175721Y-151983606D01* +X66175721Y-151602653D01* +X66223340Y-151507415D01* +X66270959Y-151459796D01* +X66366197Y-151412177D01* +X66509054Y-151412177D01* +X66604292Y-151459796D01* +X66651911Y-151507415D01* +X66699530Y-151602653D01* +X66699530Y-151983606D01* +X67175721Y-150459796D02* +X67175721Y-151031225D01* +X67175721Y-150745511D02* +X66175721Y-150745511D01* +X66318578Y-150840749D01* +X66413816Y-150935987D01* +X66461435Y-151031225D01* +X66175721Y-149840749D02* +X66175721Y-149745510D01* +X66223340Y-149650272D01* +X66270959Y-149602653D01* +X66366197Y-149555034D01* +X66556673Y-149507415D01* +X66794769Y-149507415D01* +X66985245Y-149555034D01* +X67080483Y-149602653D01* +X67128102Y-149650272D01* +X67175721Y-149745510D01* +X67175721Y-149840749D01* +X67128102Y-149935987D01* +X67080483Y-149983606D01* +X66985245Y-150031225D01* +X66794769Y-150078844D01* +X66556673Y-150078844D01* +X66366197Y-150031225D01* +X66270959Y-149983606D01* +X66223340Y-149935987D01* +X66175721Y-149840749D01* +X74831281Y-148745177D02* +X74355090Y-149078511D01* +X74831281Y-149316606D02* +X73831281Y-149316606D01* +X73831281Y-148935653D01* +X73878900Y-148840415D01* +X73926519Y-148792796D01* +X74021757Y-148745177D01* +X74164614Y-148745177D01* +X74259852Y-148792796D01* +X74307471Y-148840415D01* +X74355090Y-148935653D01* +X74355090Y-149316606D01* +X74831281Y-147792796D02* +X74831281Y-148364225D01* +X74831281Y-148078511D02* +X73831281Y-148078511D01* +X73974138Y-148173749D01* +X74069376Y-148268987D01* +X74116995Y-148364225D01* +X74831281Y-146840415D02* +X74831281Y-147411844D01* +X74831281Y-147126130D02* +X73831281Y-147126130D01* +X73974138Y-147221368D01* +X74069376Y-147316606D01* +X74116995Y-147411844D01* +X72357321Y-148481017D02* +X71881130Y-148814351D01* +X72357321Y-149052446D02* +X71357321Y-149052446D01* +X71357321Y-148671493D01* +X71404940Y-148576255D01* +X71452559Y-148528636D01* +X71547797Y-148481017D01* +X71690654Y-148481017D01* +X71785892Y-148528636D01* +X71833511Y-148576255D01* +X71881130Y-148671493D01* +X71881130Y-149052446D01* +X72357321Y-147528636D02* +X72357321Y-148100065D01* +X72357321Y-147814351D02* +X71357321Y-147814351D01* +X71500178Y-147909589D01* +X71595416Y-148004827D01* +X71643035Y-148100065D01* +X71452559Y-147147684D02* +X71404940Y-147100065D01* +X71357321Y-147004827D01* +X71357321Y-146766731D01* +X71404940Y-146671493D01* +X71452559Y-146623874D01* +X71547797Y-146576255D01* +X71643035Y-146576255D01* +X71785892Y-146623874D01* +X72357321Y-147195303D01* +X72357321Y-146576255D01* +X69802081Y-148440377D02* +X69325890Y-148773711D01* +X69802081Y-149011806D02* +X68802081Y-149011806D01* +X68802081Y-148630853D01* +X68849700Y-148535615D01* +X68897319Y-148487996D01* +X68992557Y-148440377D01* +X69135414Y-148440377D01* +X69230652Y-148487996D01* +X69278271Y-148535615D01* +X69325890Y-148630853D01* +X69325890Y-149011806D01* +X69802081Y-147487996D02* +X69802081Y-148059425D01* +X69802081Y-147773711D02* +X68802081Y-147773711D01* +X68944938Y-147868949D01* +X69040176Y-147964187D01* +X69087795Y-148059425D01* +X68802081Y-147154663D02* +X68802081Y-146535615D01* +X69183033Y-146868949D01* +X69183033Y-146726091D01* +X69230652Y-146630853D01* +X69278271Y-146583234D01* +X69373510Y-146535615D01* +X69611605Y-146535615D01* +X69706843Y-146583234D01* +X69754462Y-146630853D01* +X69802081Y-146726091D01* +X69802081Y-147011806D01* +X69754462Y-147107044D01* +X69706843Y-147154663D01* +X67137621Y-148402277D02* +X66661430Y-148735611D01* +X67137621Y-148973706D02* +X66137621Y-148973706D01* +X66137621Y-148592753D01* +X66185240Y-148497515D01* +X66232859Y-148449896D01* +X66328097Y-148402277D01* +X66470954Y-148402277D01* +X66566192Y-148449896D01* +X66613811Y-148497515D01* +X66661430Y-148592753D01* +X66661430Y-148973706D01* +X67137621Y-147449896D02* +X67137621Y-148021325D01* +X67137621Y-147735611D02* +X66137621Y-147735611D01* +X66280478Y-147830849D01* +X66375716Y-147926087D01* +X66423335Y-148021325D01* +X66470954Y-146592753D02* +X67137621Y-146592753D01* +X66090002Y-146830849D02* +X66804288Y-147068944D01* +X66804288Y-146449896D01* +X58780443Y-144564281D02* +X58447109Y-144088090D01* +X58209014Y-144564281D02* +X58209014Y-143564281D01* +X58589967Y-143564281D01* +X58685205Y-143611900D01* +X58732824Y-143659519D01* +X58780443Y-143754757D01* +X58780443Y-143897614D01* +X58732824Y-143992852D01* +X58685205Y-144040471D01* +X58589967Y-144088090D01* +X58209014Y-144088090D01* +X59732824Y-144564281D02* +X59161395Y-144564281D01* +X59447109Y-144564281D02* +X59447109Y-143564281D01* +X59351871Y-143707138D01* +X59256633Y-143802376D01* +X59161395Y-143849995D01* +X60637586Y-143564281D02* +X60161395Y-143564281D01* +X60113776Y-144040471D01* +X60161395Y-143992852D01* +X60256633Y-143945233D01* +X60494729Y-143945233D01* +X60589967Y-143992852D01* +X60637586Y-144040471D01* +X60685205Y-144135710D01* +X60685205Y-144373805D01* +X60637586Y-144469043D01* +X60589967Y-144516662D01* +X60494729Y-144564281D01* +X60256633Y-144564281D01* +X60161395Y-144516662D01* +X60113776Y-144469043D01* +X58805843Y-150929681D02* +X58472509Y-150453490D01* +X58234414Y-150929681D02* +X58234414Y-149929681D01* +X58615367Y-149929681D01* +X58710605Y-149977300D01* +X58758224Y-150024919D01* +X58805843Y-150120157D01* +X58805843Y-150263014D01* +X58758224Y-150358252D01* +X58710605Y-150405871D01* +X58615367Y-150453490D01* +X58234414Y-150453490D01* +X59758224Y-150929681D02* +X59186795Y-150929681D01* +X59472509Y-150929681D02* +X59472509Y-149929681D01* +X59377271Y-150072538D01* +X59282033Y-150167776D01* +X59186795Y-150215395D01* +X60615367Y-149929681D02* +X60424890Y-149929681D01* +X60329652Y-149977300D01* +X60282033Y-150024919D01* +X60186795Y-150167776D01* +X60139176Y-150358252D01* +X60139176Y-150739205D01* +X60186795Y-150834443D01* +X60234414Y-150882062D01* +X60329652Y-150929681D01* +X60520129Y-150929681D01* +X60615367Y-150882062D01* +X60662986Y-150834443D01* +X60710605Y-150739205D01* +X60710605Y-150501110D01* +X60662986Y-150405871D01* +X60615367Y-150358252D01* +X60520129Y-150310633D01* +X60329652Y-150310633D01* +X60234414Y-150358252D01* +X60186795Y-150405871D01* +X60139176Y-150501110D01* +X63215283Y-140175321D02* +X62881949Y-139699130D01* +X62643854Y-140175321D02* +X62643854Y-139175321D01* +X63024807Y-139175321D01* +X63120045Y-139222940D01* +X63167664Y-139270559D01* +X63215283Y-139365797D01* +X63215283Y-139508654D01* +X63167664Y-139603892D01* +X63120045Y-139651511D01* +X63024807Y-139699130D01* +X62643854Y-139699130D01* +X64167664Y-140175321D02* +X63596235Y-140175321D01* +X63881949Y-140175321D02* +X63881949Y-139175321D01* +X63786711Y-139318178D01* +X63691473Y-139413416D01* +X63596235Y-139461035D01* +X64500997Y-139175321D02* +X65167664Y-139175321D01* +X64739092Y-140175321D01* +X63253383Y-138369221D02* +X62920049Y-137893030D01* +X62681954Y-138369221D02* +X62681954Y-137369221D01* +X63062907Y-137369221D01* +X63158145Y-137416840D01* +X63205764Y-137464459D01* +X63253383Y-137559697D01* +X63253383Y-137702554D01* +X63205764Y-137797792D01* +X63158145Y-137845411D01* +X63062907Y-137893030D01* +X62681954Y-137893030D01* +X64205764Y-138369221D02* +X63634335Y-138369221D01* +X63920049Y-138369221D02* +X63920049Y-137369221D01* +X63824811Y-137512078D01* +X63729573Y-137607316D01* +X63634335Y-137654935D01* +X64777192Y-137797792D02* +X64681954Y-137750173D01* +X64634335Y-137702554D01* +X64586716Y-137607316D01* +X64586716Y-137559697D01* +X64634335Y-137464459D01* +X64681954Y-137416840D01* +X64777192Y-137369221D01* +X64967669Y-137369221D01* +X65062907Y-137416840D01* +X65110526Y-137464459D01* +X65158145Y-137559697D01* +X65158145Y-137607316D01* +X65110526Y-137702554D01* +X65062907Y-137750173D01* +X64967669Y-137797792D01* +X64777192Y-137797792D01* +X64681954Y-137845411D01* +X64634335Y-137893030D01* +X64586716Y-137988269D01* +X64586716Y-138178745D01* +X64634335Y-138273983D01* +X64681954Y-138321602D01* +X64777192Y-138369221D01* +X64967669Y-138369221D01* +X65062907Y-138321602D01* +X65110526Y-138273983D01* +X65158145Y-138178745D01* +X65158145Y-137988269D01* +X65110526Y-137893030D01* +X65062907Y-137845411D01* +X64967669Y-137797792D01* +X63215283Y-144340921D02* +X62881949Y-143864730D01* +X62643854Y-144340921D02* +X62643854Y-143340921D01* +X63024807Y-143340921D01* +X63120045Y-143388540D01* +X63167664Y-143436159D01* +X63215283Y-143531397D01* +X63215283Y-143674254D01* +X63167664Y-143769492D01* +X63120045Y-143817111D01* +X63024807Y-143864730D01* +X62643854Y-143864730D01* +X64167664Y-144340921D02* +X63596235Y-144340921D01* +X63881949Y-144340921D02* +X63881949Y-143340921D01* +X63786711Y-143483778D01* +X63691473Y-143579016D01* +X63596235Y-143626635D01* +X64643854Y-144340921D02* +X64834330Y-144340921D01* +X64929569Y-144293302D01* +X64977188Y-144245683D01* +X65072426Y-144102826D01* +X65120045Y-143912350D01* +X65120045Y-143531397D01* +X65072426Y-143436159D01* +X65024807Y-143388540D01* +X64929569Y-143340921D01* +X64739092Y-143340921D01* +X64643854Y-143388540D01* +X64596235Y-143436159D01* +X64548616Y-143531397D01* +X64548616Y-143769492D01* +X64596235Y-143864730D01* +X64643854Y-143912350D01* +X64739092Y-143959969D01* +X64929569Y-143959969D01* +X65024807Y-143912350D01* +X65072426Y-143864730D01* +X65120045Y-143769492D01* +X45594661Y-133553105D02* +X46404185Y-133553105D01* +X46499423Y-133505486D01* +X46547042Y-133457867D01* +X46594661Y-133362629D01* +X46594661Y-133172152D01* +X46547042Y-133076914D01* +X46499423Y-133029295D01* +X46404185Y-132981676D01* +X45594661Y-132981676D01* +X46594661Y-131981676D02* +X46594661Y-132553105D01* +X46594661Y-132267391D02* +X45594661Y-132267391D01* +X45737518Y-132362629D01* +X45832756Y-132457867D01* +X45880375Y-132553105D01* +X50355595Y-143657981D02* +X50355595Y-144467505D01* +X50403214Y-144562743D01* +X50450833Y-144610362D01* +X50546071Y-144657981D01* +X50736548Y-144657981D01* +X50831786Y-144610362D01* +X50879405Y-144562743D01* +X50927024Y-144467505D01* +X50927024Y-143657981D01* +X51355595Y-143753219D02* +X51403214Y-143705600D01* +X51498452Y-143657981D01* +X51736548Y-143657981D01* +X51831786Y-143705600D01* +X51879405Y-143753219D01* +X51927024Y-143848457D01* +X51927024Y-143943695D01* +X51879405Y-144086552D01* +X51307976Y-144657981D01* +X51927024Y-144657981D01* +D13* +X58235910Y-127316774D02* +X58235910Y-126554774D01* +X58387101Y-126554774D01* +X58477815Y-126591060D01* +X58538291Y-126663631D01* +X58568530Y-126736203D01* +X58598768Y-126881346D01* +X58598768Y-126990203D01* +X58568530Y-127135346D01* +X58538291Y-127207917D01* +X58477815Y-127280489D01* +X58387101Y-127316774D01* +X58235910Y-127316774D01* +X58870910Y-127316774D02* +X58870910Y-126554774D01* +X59082577Y-127099060D01* +X59294244Y-126554774D01* +X59294244Y-127316774D01* +X59596624Y-127316774D02* +X59596624Y-126554774D01* +X59959482Y-127316774D01* +X59959482Y-126554774D01* +X60534005Y-126554774D02* +X60413053Y-126554774D01* +X60352577Y-126591060D01* +X60322339Y-126627346D01* +X60261862Y-126736203D01* +X60231624Y-126881346D01* +X60231624Y-127171631D01* +X60261862Y-127244203D01* +X60292101Y-127280489D01* +X60352577Y-127316774D01* +X60473529Y-127316774D01* +X60534005Y-127280489D01* +X60564243Y-127244203D01* +X60594482Y-127171631D01* +X60594482Y-126990203D01* +X60564243Y-126917631D01* +X60534005Y-126881346D01* +X60473529Y-126845060D01* +X60352577Y-126845060D01* +X60292101Y-126881346D01* +X60261862Y-126917631D01* +X60231624Y-126990203D01* +X60806148Y-126554774D02* +X61199244Y-126554774D01* +X60987577Y-126845060D01* +X61078291Y-126845060D01* +X61138767Y-126881346D01* +X61169005Y-126917631D01* +X61199244Y-126990203D01* +X61199244Y-127171631D01* +X61169005Y-127244203D01* +X61138767Y-127280489D01* +X61078291Y-127316774D01* +X60896863Y-127316774D01* +X60836386Y-127280489D01* +X60806148Y-127244203D01* +X61471386Y-127316774D02* +X61471386Y-126554774D01* +X61622577Y-126554774D01* +X61713291Y-126591060D01* +X61773767Y-126663631D01* +X61804006Y-126736203D01* +X61834244Y-126881346D01* +X61834244Y-126990203D01* +X61804006Y-127135346D01* +X61773767Y-127207917D01* +X61713291Y-127280489D01* +X61622577Y-127316774D01* +X61471386Y-127316774D01* +X62197101Y-126881346D02* +X62136625Y-126845060D01* +X62106386Y-126808774D01* +X62076148Y-126736203D01* +X62076148Y-126699917D01* +X62106386Y-126627346D01* +X62136625Y-126591060D01* +X62197101Y-126554774D01* +X62318053Y-126554774D01* +X62378529Y-126591060D01* +X62408767Y-126627346D01* +X62439006Y-126699917D01* +X62439006Y-126736203D01* +X62408767Y-126808774D01* +X62378529Y-126845060D01* +X62318053Y-126881346D01* +X62197101Y-126881346D01* +X62136625Y-126917631D01* +X62106386Y-126953917D01* +X62076148Y-127026489D01* +X62076148Y-127171631D01* +X62106386Y-127244203D01* +X62136625Y-127280489D01* +X62197101Y-127316774D01* +X62318053Y-127316774D01* +X62378529Y-127280489D01* +X62408767Y-127244203D01* +X62439006Y-127171631D01* +X62439006Y-127026489D01* +X62408767Y-126953917D01* +X62378529Y-126917631D01* +X62318053Y-126881346D01* +X63013529Y-127316774D02* +X62711148Y-127316774D01* +X62711148Y-126554774D01* +X63225196Y-127316774D02* +X63225196Y-126554774D01* +X63376387Y-126554774D01* +X63467101Y-126591060D01* +X63527577Y-126663631D01* +X63557816Y-126736203D01* +X63588054Y-126881346D01* +X63588054Y-126990203D01* +X63557816Y-127135346D01* +X63527577Y-127207917D01* +X63467101Y-127280489D01* +X63376387Y-127316774D01* +X63225196Y-127316774D01* +X63799720Y-126554774D02* +X63950911Y-127316774D01* +X64071863Y-126772489D01* +X64192816Y-127316774D01* +X64344006Y-126554774D01* +D11* +X52143423Y-126884623D02* +X52095804Y-126932242D01* +X51952947Y-126979861D01* +X51857709Y-126979861D01* +X51714851Y-126932242D01* +X51619613Y-126837004D01* +X51571994Y-126741766D01* +X51524375Y-126551290D01* +X51524375Y-126408432D01* +X51571994Y-126217956D01* +X51619613Y-126122718D01* +X51714851Y-126027480D01* +X51857709Y-125979861D01* +X51952947Y-125979861D01* +X52095804Y-126027480D01* +X52143423Y-126075099D01* +X53095804Y-126979861D02* +X52524375Y-126979861D01* +X52810089Y-126979861D02* +X52810089Y-125979861D01* +X52714851Y-126122718D01* +X52619613Y-126217956D01* +X52524375Y-126265575D01* +X53429137Y-125979861D02* +X54048185Y-125979861D01* +X53714851Y-126360813D01* +X53857709Y-126360813D01* +X53952947Y-126408432D01* +X54000566Y-126456051D01* +X54048185Y-126551290D01* +X54048185Y-126789385D01* +X54000566Y-126884623D01* +X53952947Y-126932242D01* +X53857709Y-126979861D01* +X53571994Y-126979861D01* +X53476756Y-126932242D01* +X53429137Y-126884623D01* +X53052743Y-146458023D02* +X53005124Y-146505642D01* +X52862267Y-146553261D01* +X52767029Y-146553261D01* +X52624171Y-146505642D01* +X52528933Y-146410404D01* +X52481314Y-146315166D01* +X52433695Y-146124690D01* +X52433695Y-145981832D01* +X52481314Y-145791356D01* +X52528933Y-145696118D01* +X52624171Y-145600880D01* +X52767029Y-145553261D01* +X52862267Y-145553261D01* +X53005124Y-145600880D01* +X53052743Y-145648499D01* +X54005124Y-146553261D02* +X53433695Y-146553261D01* +X53719409Y-146553261D02* +X53719409Y-145553261D01* +X53624171Y-145696118D01* +X53528933Y-145791356D01* +X53433695Y-145838975D01* +X54624171Y-145553261D02* +X54719410Y-145553261D01* +X54814648Y-145600880D01* +X54862267Y-145648499D01* +X54909886Y-145743737D01* +X54957505Y-145934213D01* +X54957505Y-146172309D01* +X54909886Y-146362785D01* +X54862267Y-146458023D01* +X54814648Y-146505642D01* +X54719410Y-146553261D01* +X54624171Y-146553261D01* +X54528933Y-146505642D01* +X54481314Y-146458023D01* +X54433695Y-146362785D01* +X54386076Y-146172309D01* +X54386076Y-145934213D01* +X54433695Y-145743737D01* +X54481314Y-145648499D01* +X54528933Y-145600880D01* +X54624171Y-145553261D01* +M02* diff --git a/PCB/WOT/Tinylab_proto1-cache.lib b/PCB/WOT/Tinylab_proto1-cache.lib new file mode 100644 index 00000000..2cb7db29 --- /dev/null +++ b/PCB/WOT/Tinylab_proto1-cache.lib @@ -0,0 +1,432 @@ +EESchema-LIBRARY Version 2.3 +#encoding utf-8 +# +# +5V +# +DEF +5V #PWR 0 0 Y Y 1 F P +F0 "#PWR" 0 -150 50 H I C CNN +F1 "+5V" 0 140 50 H V C CNN +F2 "" 0 0 60 H V C CNN +F3 "" 0 0 60 H V C CNN +DRAW +P 2 0 1 0 -30 50 0 100 N +P 2 0 1 0 0 0 0 100 N +P 2 0 1 0 0 100 30 50 N +X +5V 1 0 0 0 U 50 50 1 1 W N +ENDDRAW +ENDDEF +# +# 7805 +# +DEF 7805 U 0 30 N Y 1 F N +F0 "U" 150 -196 60 H V C CNN +F1 "7805" 0 200 60 H V C CNN +F2 "" 0 0 60 H V C CNN +F3 "" 0 0 60 H V C CNN +ALIAS LM7805 LM7812 78L05 +DRAW +S -200 -150 200 150 0 1 0 N +X GND 1 0 -250 100 U 40 40 1 1 I +X VO 2 400 50 200 L 40 40 1 1 w +X VI 3 -400 50 200 R 40 40 1 1 I +ENDDRAW +ENDDEF +# +# ATXMEGA16A4U-A +# +DEF ATXMEGA16A4U-A IC 0 40 Y Y 1 F N +F0 "IC" -750 1200 40 H V L BNN +F1 "ATXMEGA16A4U-A" 350 -1250 40 H V L BNN +F2 "TQFP44" 0 0 35 H V C CIN +F3 "" 0 0 60 H V C CNN +ALIAS ATXMEGA32A4U-A ATXMEGA64A4U-A ATXMEGA128A4U-A +DRAW +S -750 1150 750 -1150 0 1 10 f +X AC5/ADC5/PA5 1 900 500 150 L 40 35 1 1 B +X AC1OUT/AC6/ADC6/PA6 2 900 400 150 L 40 35 1 1 B +X AC0OUT/AC7/ADC7/PA7 3 900 300 150 L 40 35 1 1 B +X AREFB/ADC8/PB0 4 900 150 150 L 40 35 1 1 B +X ADC9/PB1 5 900 50 150 L 40 35 1 1 B +X DAC0/ADC10/PB2 6 900 -50 150 L 40 35 1 1 B +X DAC1/ACD11/PB3 7 900 -150 150 L 40 35 1 1 B +X GND 8 -150 -1300 150 U 40 35 1 1 W +X VCC 9 -100 1300 150 D 40 35 1 1 W +X SDAIN/SDA/~OC0ALS~/OC0A/PC0 10 900 -300 150 L 40 35 1 1 B +X PD0/OC0A 20 -900 -300 150 R 40 35 1 1 B +X GND 30 50 -1300 150 U 40 35 1 1 W +X AREFA/AC0/ADC0/PA0 40 900 1000 150 L 40 35 1 1 B +X SCLIN/SCL/XCK0/OC0AHS/OC0B/PC1 11 900 -400 150 L 40 35 1 1 B +X PD1/OC0B/XCK0 21 -900 -400 150 R 40 35 1 1 B +X VCC 31 100 1300 150 D 40 35 1 1 W +X AC1/ADC1/PA1 41 900 900 150 L 40 35 1 1 B +X SDAOUT/RXD0/~OC0BLS~/OC0C/PC2 12 900 -500 150 L 40 35 1 1 B +X PD2/OC0C/RXD0 22 -900 -500 150 R 40 35 1 1 B +X PE2/OC0C/RXD0 32 -900 -50 150 R 40 35 1 1 B +X AC2/ADC2/PA2 42 900 800 150 L 40 35 1 1 B +X SCLOUT/TXD0/OC0BHS/OC0D/PC3 13 900 -600 150 L 40 35 1 1 B +X PD3/OC0D/TXD0 23 -900 -600 150 R 40 35 1 1 B +X PE3/OC0D/TXD0 33 -900 -150 150 R 40 35 1 1 B +X AC3/ADC3/PA3 43 900 700 150 L 40 35 1 1 B +X ~SS~/~OC0CLS~/OC1A/PC4 14 900 -700 150 L 40 35 1 1 B +X PD4/OC1A/~SS~ 24 -900 -700 150 R 40 35 1 1 B +X PDI_DATA 34 -900 900 150 R 40 35 1 1 I +X AC4/ADC4/PA4 44 900 600 150 L 40 35 1 1 B +X MOSI/XCK1/OC0CHS/OC1B/PC5 15 900 -800 150 L 40 35 1 1 B +X PD5/OC1B/XCK1/MOSI 25 -900 -800 150 R 40 35 1 1 B +X ~RESET~/PDI_CLK 35 -900 1000 150 R 40 35 1 1 I +X CLKRTC/MISO/RXD1/~OC0DLS~/PC6 16 900 -900 150 L 40 35 1 1 B +X PD6/D-/RXD1/MISO 26 -900 -900 150 R 40 35 1 1 B +X PR0/XTAL2/TOSC2 36 -900 400 150 R 40 35 1 1 B +X EVOUT/CLKOUT/SCK/TXD1/OC0DHS/PC7 17 900 -1000 150 L 40 35 1 1 B +X PD7/D+/TXD1/SCK/CLKOUT/EVOUT 27 -900 -1000 150 R 40 35 1 1 B +X PR1/XTAL1/TOSC1 37 -900 300 150 R 40 35 1 1 B +X GND 18 -50 -1300 150 U 40 35 1 1 W +X PE0/OC0A/SDA 28 -900 150 150 R 40 35 1 1 B +X GND 38 150 -1300 150 U 40 35 1 1 W +X VCC 19 0 1300 150 D 40 35 1 1 W +X PE1/OC0B/XCK0/SCL 29 -900 50 150 R 40 35 1 1 B +X AVCC 39 300 1300 150 D 40 35 1 1 W +ENDDRAW +ENDDEF +# +# C +# +DEF C C 0 10 N Y 1 F N +F0 "C" 25 100 50 H V L CNN +F1 "C" 25 -100 50 H V L CNN +F2 "" 38 -150 30 H V C CNN +F3 "" 0 0 60 H V C CNN +$FPLIST + C? + C_????_* + C_???? + SMD*_c + Capacitor* +$ENDFPLIST +DRAW +P 2 0 1 20 -80 -30 80 -30 N +P 2 0 1 20 -80 30 80 30 N +X ~ 1 0 150 110 D 40 40 1 1 P +X ~ 2 0 -150 110 U 40 40 1 1 P +ENDDRAW +ENDDEF +# +# CONN_01X02 +# +DEF CONN_01X02 P 0 40 Y N 1 F N +F0 "P" 0 150 50 H V C CNN +F1 "CONN_01X02" 100 0 50 V V C CNN +F2 "" 0 0 60 H V C CNN +F3 "" 0 0 60 H V C CNN +$FPLIST + Pin_Header_Straight_1X02 + Pin_Header_Angled_1X02 + Socket_Strip_Straight_1X02 + Socket_Strip_Angled_1X02 +$ENDFPLIST +DRAW +S -50 -45 10 -55 0 1 0 N +S -50 55 10 45 0 1 0 N +S -50 100 50 -100 0 1 0 N +X P1 1 -200 50 150 R 50 50 1 1 P +X P2 2 -200 -50 150 R 50 50 1 1 P +ENDDRAW +ENDDEF +# +# CONN_01X03 +# +DEF CONN_01X03 P 0 40 Y N 1 F N +F0 "P" 0 200 50 H V C CNN +F1 "CONN_01X03" 100 0 50 V V C CNN +F2 "" 0 0 60 H V C CNN +F3 "" 0 0 60 H V C CNN +$FPLIST + Pin_Header_Straight_1X03 + Pin_Header_Angled_1X03 + Socket_Strip_Straight_1X03 + Socket_Strip_Angled_1X03 +$ENDFPLIST +DRAW +S -50 -95 10 -105 0 1 0 N +S -50 5 10 -5 0 1 0 N +S -50 105 10 95 0 1 0 N +S -50 150 50 -150 0 1 0 N +X P1 1 -200 100 150 R 50 50 1 1 P +X P2 2 -200 0 150 R 50 50 1 1 P +X P3 3 -200 -100 150 R 50 50 1 1 P +ENDDRAW +ENDDEF +# +# CONN_01X04 +# +DEF CONN_01X04 P 0 40 Y N 1 F N +F0 "P" 0 250 50 H V C CNN +F1 "CONN_01X04" 100 0 50 V V C CNN +F2 "" 0 0 60 H V C CNN +F3 "" 0 0 60 H V C CNN +$FPLIST + Pin_Header_Straight_1X04 + Pin_Header_Angled_1X04 + Socket_Strip_Straight_1X04 + Socket_Strip_Angled_1X04 +$ENDFPLIST +DRAW +S -50 -145 10 -155 0 1 0 N +S -50 -45 10 -55 0 1 0 N +S -50 55 10 45 0 1 0 N +S -50 155 10 145 0 1 0 N +S -50 200 50 -200 0 1 0 N +X P1 1 -200 150 150 R 50 50 1 1 P +X P2 2 -200 50 150 R 50 50 1 1 P +X P3 3 -200 -50 150 R 50 50 1 1 P +X P4 4 -200 -150 150 R 50 50 1 1 P +ENDDRAW +ENDDEF +# +# CONN_02X02 +# +DEF CONN_02X02 P 0 1 Y N 1 F N +F0 "P" 0 150 50 H V C CNN +F1 "CONN_02X02" 0 -150 50 H V C CNN +F2 "" 0 -1200 60 H V C CNN +F3 "" 0 -1200 60 H V C CNN +$FPLIST + Pin_Header_Straight_2X02 + Pin_Header_Angled_2X02 + Socket_Strip_Straight_2X02 + Socket_Strip_Angled_2X02 +$ENDFPLIST +DRAW +S -100 -45 -50 -55 0 1 0 N +S -100 55 -50 45 0 1 0 N +S -100 100 100 -100 0 1 0 N +S 50 -45 100 -55 0 1 0 N +S 50 55 100 45 0 1 0 N +X P1 1 -250 50 150 R 50 50 1 1 P +X P2 2 250 50 150 L 50 50 1 1 P +X P3 3 -250 -50 150 R 50 50 1 1 P +X P4 4 250 -50 150 L 50 50 1 1 P +ENDDRAW +ENDDEF +# +# CP1 +# +DEF CP1 C 0 10 N N 1 F N +F0 "C" 25 100 50 H V L CNN +F1 "CP1" 25 -100 50 H V L CNN +F2 "" 0 0 60 H V C CNN +F3 "" 0 0 60 H V C CNN +$FPLIST + SMD*_Pol + c_elec* + C*elec + TantalC* + Elko* + CP* +$ENDFPLIST +DRAW +A 0 -150 128 1287 513 0 1 20 N -80 -50 80 -50 +P 2 0 1 20 -80 30 80 30 N +P 2 0 1 0 -70 90 -30 90 N +P 2 0 1 0 -50 70 -50 110 N +X ~ 1 0 150 110 D 40 40 1 1 P +X ~ 2 0 -150 130 U 40 40 1 1 P +ENDDRAW +ENDDEF +# +# C_Small +# +DEF C_Small C 0 10 N N 1 F N +F0 "C" 10 70 50 H V L CNN +F1 "C_Small" 10 -80 50 H V L CNN +F2 "" 0 0 60 H V C CNN +F3 "" 0 0 60 H V C CNN +$FPLIST + C? + C_????_* + C_???? + SMD*_c + Capacitor* +$ENDFPLIST +DRAW +P 2 0 1 13 -60 -20 60 -20 N +P 2 0 1 12 -60 20 60 20 N +X ~ 1 0 100 75 D 40 40 1 1 P +X ~ 2 0 -100 80 U 40 40 1 1 P +ENDDRAW +ENDDEF +# +# DMN63D8LDW +# +DEF DMN63D8LDW U 0 40 Y Y 1 F N +F0 "U" 0 -300 60 H V C CNN +F1 "DMN63D8LDW" 0 350 60 H V C CNN +F2 "" 0 -300 60 H V C CNN +F3 "" 0 -300 60 H V C CNN +DRAW +S -250 300 250 -350 0 1 0 f +X S1 1 450 -150 200 L 50 50 1 1 I +X G1 2 450 0 200 L 50 50 1 1 I +X D2 3 450 150 200 L 50 50 1 1 I +X S2 4 -450 150 200 R 50 50 1 1 I +X G2 5 -450 0 200 R 50 50 1 1 I +X D1 6 -450 -150 200 R 50 50 1 1 I +ENDDRAW +ENDDEF +# +# D_Schottky +# +DEF D_Schottky D 0 40 N N 1 F N +F0 "D" 0 100 50 H V C CNN +F1 "D_Schottky" 0 -100 50 H V C CNN +F2 "" 0 0 60 H V C CNN +F3 "" 0 0 60 H V C CNN +$FPLIST + D-Pak_TO252AA + Diode_* + *SingleDiode + *SingleDiode* + *_Diode_* +$ENDFPLIST +DRAW +P 3 0 1 0 50 50 -50 0 50 -50 F +P 6 0 1 8 -75 25 -75 50 -50 50 -50 -50 -25 -50 -25 -25 N +X K 1 -150 0 100 R 50 50 1 1 P +X A 2 150 0 100 L 50 50 1 1 P +ENDDRAW +ENDDEF +# +# F_Small +# +DEF F_Small F 0 10 N N 1 F N +F0 "F" -40 60 50 H V L CNN +F1 "F_Small" -120 -60 50 H V L CNN +F2 "" 0 0 60 H V C CNN +F3 "" 0 0 60 H V C CNN +$FPLIST + CP* + SM* +$ENDFPLIST +DRAW +S -50 20 50 -20 0 1 0 N +P 2 0 1 0 -50 0 50 0 N +X ~ 1 -100 0 50 R 40 40 1 1 P +X ~ 2 100 0 50 L 40 40 1 1 P +ENDDRAW +ENDDEF +# +# INDUCTOR +# +DEF INDUCTOR L 0 40 N N 1 F N +F0 "L" -50 0 50 V V C CNN +F1 "INDUCTOR" 100 0 50 V V C CNN +F2 "" 0 0 60 H V C CNN +F3 "" 0 0 60 H V C CNN +DRAW +A 0 -150 50 -889 889 0 1 0 N 1 -199 1 -100 +A 0 -49 51 -889 889 0 1 0 N 1 -99 1 2 +A 0 51 51 -889 889 0 1 0 N 1 1 1 102 +A 0 148 48 -889 889 0 1 0 N 1 101 1 196 +X 1 1 0 300 100 D 70 70 1 1 P +X 2 2 0 -300 100 U 70 70 1 1 P +ENDDRAW +ENDDEF +# +# LM2902N +# +DEF LM2902N U 0 20 Y Y 4 F N +F0 "U" 50 200 60 H V C CNN +F1 "LM2902N" 150 -200 50 H V C CNN +F2 "" 0 0 60 H V C CNN +F3 "" 0 0 60 H V C CNN +ALIAS LM324 TLC274 TL074 LM324N LM324AN +DRAW +P 4 0 1 6 -200 200 200 0 -200 -200 -200 200 f +X V+ 4 -100 400 250 D 40 40 0 1 W +X V- 11 -100 -400 250 U 40 40 0 1 W +X ~ 1 500 0 300 L 40 40 1 1 O +X - 2 -500 -100 300 R 40 40 1 1 I +X + 3 -500 100 300 R 40 40 1 1 I +X + 5 -500 100 300 R 40 40 2 1 I +X - 6 -500 -100 300 R 40 40 2 1 I +X ~ 7 500 0 300 L 40 40 2 1 O +X ~ 8 500 0 300 L 40 40 3 1 O +X - 9 -500 -100 300 R 40 40 3 1 I +X + 10 -500 100 300 R 40 40 3 1 I +X + 12 -500 100 300 R 40 40 4 1 I +X - 13 -500 -100 300 R 40 40 4 1 I +X ~ 14 500 0 300 L 40 40 4 1 O +ENDDRAW +ENDDEF +# +# Q_NMOS_GSD +# +DEF Q_NMOS_GSD Q 0 0 Y N 1 F N +F0 "Q" 300 50 50 H V R CNN +F1 "Q_NMOS_GSD" 650 -50 50 H V R CNN +F2 "" 200 100 29 H V C CNN +F3 "" 0 0 60 H V C CNN +DRAW +C 50 0 111 0 1 10 N +P 2 0 1 0 30 -70 100 -70 N +P 2 0 1 10 30 -50 30 -90 N +P 2 0 1 0 30 0 100 0 N +P 2 0 1 10 30 20 30 -20 N +P 2 0 1 0 30 70 100 70 N +P 2 0 1 10 30 90 30 50 N +P 2 0 1 0 100 -70 100 -100 N +P 2 0 1 0 100 -70 100 0 N +P 2 0 1 0 100 100 100 70 N +P 3 0 1 10 10 75 10 -75 10 -75 N +P 4 0 1 0 40 0 80 15 80 -15 40 0 F +X G 1 -200 0 210 R 50 50 1 1 I +X S 2 100 -200 100 U 50 50 1 1 P +X D 3 100 200 100 D 50 50 1 1 P +ENDDRAW +ENDDEF +# +# R +# +DEF R R 0 0 N Y 1 F N +F0 "R" 80 0 50 V V C CNN +F1 "R" 0 0 50 V V C CNN +F2 "" -70 0 30 V V C CNN +F3 "" 0 0 30 H V C CNN +$FPLIST + R_* + Resistor_* +$ENDFPLIST +DRAW +S -40 -100 40 100 0 1 10 N +X ~ 1 0 150 50 D 60 60 1 1 P +X ~ 2 0 -150 50 U 60 60 1 1 P +ENDDRAW +ENDDEF +# +# USB_OTG +# +DEF USB_OTG P 0 40 Y Y 1 F N +F0 "P" 325 -125 50 H V C CNN +F1 "USB_OTG" 0 200 50 H V C CNN +F2 "" -50 -100 60 V V C CNN +F3 "" -50 -100 60 V V C CNN +$FPLIST + USB* +$ENDFPLIST +DRAW +S -250 -150 250 150 0 1 0 N +S -205 -150 -195 -120 0 1 0 N +S -105 -150 -95 -120 0 1 0 N +S -5 -150 5 -120 0 1 0 N +S 95 -150 105 -120 0 1 0 N +S 195 -150 205 -120 0 1 0 N +X VCC 1 -200 -300 150 U 50 50 1 1 w +X D- 2 -100 -300 150 U 50 50 1 1 P +X D+ 3 0 -300 150 U 50 50 1 1 P +X ID 4 100 -300 150 U 50 50 1 1 W +X GND 5 200 -300 150 U 50 50 1 1 W +X shield 6 400 100 150 L 50 50 1 1 P +ENDDRAW +ENDDEF +# +#End Library diff --git a/PCB/WOT/Tinylab_proto1.drl b/PCB/WOT/Tinylab_proto1.drl new file mode 100644 index 00000000..b339f505 --- /dev/null +++ b/PCB/WOT/Tinylab_proto1.drl @@ -0,0 +1,121 @@ +M48 +;DRILL file {KiCad (2015-08-05 BZR 6055, Git fa29c62)-product} date 28/09/2015 12:53:00 PM +;FORMAT={2:4/ absolute / inch / keep zeros} +FMAT,2 +INCH,TZ +T1C0.016 +T2C0.020 +T3C0.022 +T4C0.032 +T5C0.039 +T6C0.040 +T7C0.050 +% +G90 +G05 +M72 +T1 +X016558Y-053370 +X016572Y-053735 +X017191Y-056870 +X017520Y-057912 +X017845Y-053361 +X017895Y-053816 +X017912Y-058768 +X017936Y-057400 +X017944Y-059480 +X018280Y-052824 +X018340Y-058854 +X019048Y-055976 +X019222Y-057006 +X019224Y-056616 +X019642Y-058884 +X019664Y-050680 +X019678Y-054890 +X019952Y-054352 +X020032Y-054912 +X020056Y-052472 +X020118Y-054076 +X020256Y-056784 +X020296Y-052104 +X020326Y-058905 +X020552Y-057944 +X020656Y-052704 +X020666Y-053800 +X020950Y-049946 +X021336Y-052368 +X021346Y-052698 +X021658Y-050376 +X021758Y-053774 +X021868Y-056772 +X021904Y-058248 +X021932Y-059390 +X021992Y-050644 +X022168Y-055530 +X022248Y-056704 +X022318Y-057564 +X022538Y-050640 +X022592Y-052624 +X022720Y-057550 +X022786Y-058992 +X022816Y-055528 +X023008Y-052256 +X023216Y-050628 +X023650Y-049984 +X023698Y-057954 +X023960Y-051264 +X024068Y-050572 +X024136Y-057052 +X024848Y-057608 +X024906Y-049964 +X024946Y-050760 +X025244Y-050112 +X025828Y-050622 +X026068Y-057894 +X027092Y-057916 +X028048Y-057970 +T4 +X027256Y-054581 +X027256Y-055581 +X027896Y-049448 +X027896Y-050448 +T5 +X025180Y-051929 +X029126Y-053071 +T6 +X014275Y-057520 +X014275Y-058520 +X014275Y-059520 +X014275Y-060520 +X017426Y-049248 +X018426Y-049248 +X019426Y-049248 +X021724Y-048708 +X021724Y-049708 +X022724Y-048708 +X022724Y-049708 +X023145Y-060635 +X024145Y-060635 +X024872Y-048256 +X025536Y-060752 +X025872Y-048256 +X026536Y-060752 +X027536Y-060752 +X028032Y-056892 +X028536Y-060752 +X029032Y-056892 +T7 +X025126Y-053071 +X029180Y-051929 +T2 +X014607Y-052126G85X014863Y-052126 +G05 +X014607Y-054882G85X014863Y-054882 +G05 +T3 +X015798Y-052460G85X015798Y-052578 +G05 +X015798Y-054429G85X015798Y-054547 +G05 +T0 +M30 diff --git a/PCB/WOT/Tinylab_proto1.kicad_pcb b/PCB/WOT/Tinylab_proto1.kicad_pcb new file mode 100644 index 00000000..f9131c40 --- /dev/null +++ b/PCB/WOT/Tinylab_proto1.kicad_pcb @@ -0,0 +1,2556 @@ +(kicad_pcb (version 4) (host pcbnew "(2015-08-05 BZR 6055, Git fa29c62)-product") + + (general + (links 113) + (no_connects 3) + (area 72.535 130.44446 120.001667 163.587) + (thickness 1.6) + (drawings 5) + (tracks 544) + (zones 0) + (modules 51) + (nets 68) + ) + + (page A4) + (layers + (0 F.Cu signal) + (31 B.Cu signal) + (32 B.Adhes user hide) + (33 F.Adhes user hide) + (34 B.Paste user hide) + (35 F.Paste user hide) + (36 B.SilkS user hide) + (37 F.SilkS user) + (38 B.Mask user hide) + (39 F.Mask user hide) + (40 Dwgs.User user hide) + (41 Cmts.User user hide) + (42 Eco1.User user hide) + (43 Eco2.User user hide) + (44 Edge.Cuts user hide) + (45 Margin user hide) + (46 B.CrtYd user hide) + (47 F.CrtYd user) + (48 B.Fab user hide) + (49 F.Fab user hide) + ) + + (setup + (last_trace_width 0.508) + (user_trace_width 0.254) + (user_trace_width 0.508) + (user_trace_width 1.016) + (trace_clearance 0.2) + (zone_clearance 0.508) + (zone_45_only no) + (trace_min 0.2) + (segment_width 0.2) + (edge_width 0.1) + (via_size 0.6) + (via_drill 0.4) + (via_min_size 0.4) + (via_min_drill 0.3) + (uvia_size 0.3) + (uvia_drill 0.1) + (uvias_allowed no) + (uvia_min_size 0.2) + (uvia_min_drill 0.1) + (pcb_text_width 0.3) + (pcb_text_size 1.5 1.5) + (mod_edge_width 0.15) + (mod_text_size 1 1) + (mod_text_width 0.15) + (pad_size 1.5 1.5) + (pad_drill 0.6) + (pad_to_mask_clearance 0) + (aux_axis_origin 0 0) + (visible_elements 7FFFFB61) + (pcbplotparams + (layerselection 0x010f0_80000001) + (usegerberextensions false) + (excludeedgelayer true) + (linewidth 0.100000) + (plotframeref false) + (viasonmask false) + (mode 1) + (useauxorigin false) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15) + (hpglpenoverlay 2) + (psnegative false) + (psa4output false) + (plotreference true) + (plotvalue true) + (plotinvisibletext false) + (padsonsilk false) + (subtractmaskfromsilk false) + (outputformat 1) + (mirror false) + (drillshape 0) + (scaleselection 1) + (outputdirectory OUTPUT_V2/)) + ) + + (net 0 "") + (net 1 "Net-(C1-Pad1)") + (net 2 "Net-(C1-Pad2)") + (net 3 "Net-(C2-Pad1)") + (net 4 "Net-(C2-Pad2)") + (net 5 +5V) + (net 6 /AGND) + (net 7 /AVCC) + (net 8 /VGND) + (net 9 /VCC_PSU) + (net 10 "Net-(C7-Pad1)") + (net 11 "Net-(C7-Pad2)") + (net 12 "Net-(C11-Pad1)") + (net 13 "Net-(C14-Pad1)") + (net 14 "Net-(C14-Pad2)") + (net 15 "Net-(D1-Pad2)") + (net 16 /PSU_FEEDBACK) + (net 17 /CH2) + (net 18 "Net-(IC1-Pad3)") + (net 19 "Net-(IC1-Pad4)") + (net 20 "Net-(IC1-Pad5)") + (net 21 /DAC_OUT) + (net 22 /DAC_OUT2) + (net 23 "Net-(IC1-Pad8)") + (net 24 "Net-(IC1-Pad9)") + (net 25 "Net-(IC1-Pad10)") + (net 26 /XCK) + (net 27 /DIG_CH2) + (net 28 "Net-(IC1-Pad13)") + (net 29 "Net-(IC1-Pad16)") + (net 30 /DIG_CH1) + (net 31 "Net-(IC1-Pad20)") + (net 32 "Net-(IC1-Pad21)") + (net 33 "Net-(IC1-Pad22)") + (net 34 "Net-(IC1-Pad23)") + (net 35 /PSU_PWM) + (net 36 "Net-(IC1-Pad25)") + (net 37 /D-) + (net 38 /D+) + (net 39 "Net-(IC1-Pad28)") + (net 40 "Net-(IC1-Pad29)") + (net 41 "Net-(IC1-Pad32)") + (net 42 "Net-(IC1-Pad33)") + (net 43 "Net-(IC1-Pad34)") + (net 44 "Net-(IC1-Pad35)") + (net 45 "Net-(IC1-Pad36)") + (net 46 "Net-(IC1-Pad37)") + (net 47 "Net-(IC1-Pad41)") + (net 48 /CH1) + (net 49 "Net-(IC1-Pad43)") + (net 50 /AVCC_ON_2) + (net 51 "Net-(P2-Pad4)") + (net 52 "Net-(P3-Pad1)") + (net 53 "Net-(P3-Pad2)") + (net 54 "Net-(P3-Pad3)") + (net 55 "Net-(P3-Pad4)") + (net 56 "Net-(P8-Pad1)") + (net 57 "Net-(P8-Pad2)") + (net 58 "Net-(R1-Pad1)") + (net 59 "Net-(R2-Pad1)") + (net 60 "Net-(R11-Pad2)") + (net 61 "Net-(R12-Pad2)") + (net 62 "Net-(R13-Pad2)") + (net 63 "Net-(R10-Pad1)") + (net 64 "Net-(R15-Pad1)") + (net 65 "Net-(R15-Pad2)") + (net 66 "Net-(R17-Pad1)") + (net 67 "Net-(R17-Pad2)") + + (net_class Default "This is the default net class." + (clearance 0.2) + (trace_width 0.25) + (via_dia 0.6) + (via_drill 0.4) + (uvia_dia 0.3) + (uvia_drill 0.1) + (add_net +5V) + (add_net /AGND) + (add_net /AVCC) + (add_net /AVCC_ON_2) + (add_net /CH1) + (add_net /CH2) + (add_net /D+) + (add_net /D-) + (add_net /DAC_OUT) + (add_net /DAC_OUT2) + (add_net /DIG_CH1) + (add_net /DIG_CH2) + (add_net /PSU_FEEDBACK) + (add_net /PSU_PWM) + (add_net /VCC_PSU) + (add_net /VGND) + (add_net /XCK) + (add_net "Net-(C1-Pad1)") + (add_net "Net-(C1-Pad2)") + (add_net "Net-(C11-Pad1)") + (add_net "Net-(C14-Pad1)") + (add_net "Net-(C14-Pad2)") + (add_net "Net-(C2-Pad1)") + (add_net "Net-(C2-Pad2)") + (add_net "Net-(C7-Pad1)") + (add_net "Net-(C7-Pad2)") + (add_net "Net-(D1-Pad2)") + (add_net "Net-(IC1-Pad10)") + (add_net "Net-(IC1-Pad13)") + (add_net "Net-(IC1-Pad16)") + (add_net "Net-(IC1-Pad20)") + (add_net "Net-(IC1-Pad21)") + (add_net "Net-(IC1-Pad22)") + (add_net "Net-(IC1-Pad23)") + (add_net "Net-(IC1-Pad25)") + (add_net "Net-(IC1-Pad28)") + (add_net "Net-(IC1-Pad29)") + (add_net "Net-(IC1-Pad3)") + (add_net "Net-(IC1-Pad32)") + (add_net "Net-(IC1-Pad33)") + (add_net "Net-(IC1-Pad34)") + (add_net "Net-(IC1-Pad35)") + (add_net "Net-(IC1-Pad36)") + (add_net "Net-(IC1-Pad37)") + (add_net "Net-(IC1-Pad4)") + (add_net "Net-(IC1-Pad41)") + (add_net "Net-(IC1-Pad43)") + (add_net "Net-(IC1-Pad5)") + (add_net "Net-(IC1-Pad8)") + (add_net "Net-(IC1-Pad9)") + (add_net "Net-(P2-Pad4)") + (add_net "Net-(P3-Pad1)") + (add_net "Net-(P3-Pad2)") + (add_net "Net-(P3-Pad3)") + (add_net "Net-(P3-Pad4)") + (add_net "Net-(P8-Pad1)") + (add_net "Net-(P8-Pad2)") + (add_net "Net-(R1-Pad1)") + (add_net "Net-(R10-Pad1)") + (add_net "Net-(R11-Pad2)") + (add_net "Net-(R12-Pad2)") + (add_net "Net-(R13-Pad2)") + (add_net "Net-(R15-Pad1)") + (add_net "Net-(R15-Pad2)") + (add_net "Net-(R17-Pad1)") + (add_net "Net-(R17-Pad2)") + (add_net "Net-(R2-Pad1)") + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5D27) (tstamp 5673A8B8) + (at 91.186 156.591) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CAB611) + (attr smd) + (fp_text reference C1 (at 1.016 -1.2954) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 2 "Net-(C1-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5EFE) (tstamp 5673A8BE) + (at 91.948 159.766 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CAB4DE) + (attr smd) + (fp_text reference C2 (at -2.21996 0.28448 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 4 "Net-(C2-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5D0A) (tstamp 5673A8C4) + (at 111.887 142.621) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB13E1) + (attr smd) + (fp_text reference C3 (at 0.0254 -1.2954) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at 0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5D1B) (tstamp 5673A8CA) + (at 111.506 147.193 180) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB147C) + (attr smd) + (fp_text reference C4 (at -0.1524 -1.2954 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5DA3) (tstamp 5673A8D0) + (at 91.821 151.003 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55D60181) + (attr smd) + (fp_text reference C5 (at 1.905 0.8382 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5 (layer F.Cu) (tedit 567B5BB7) (tstamp 5673A8D6) + (at 78.994 136.906 180) + (descr "Radial Electrolytic Capacitor, Diameter 6.3mm x Length 11.2mm, Pitch 2.5mm") + (tags "Electrolytic Capacitor") + (path /560719D9) + (fp_text reference C6 (at 0.127 -1.651 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.25 4.4 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.325 -3.149) (end 1.325 3.149) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.465 -3.143) (end 1.465 3.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 -3.13) (end 1.605 -0.446) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 0.446) (end 1.605 3.13) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 -3.111) (end 1.745 -0.656) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 0.656) (end 1.745 3.111) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 -3.085) (end 1.885 -0.789) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 0.789) (end 1.885 3.085) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 -3.053) (end 2.025 -0.88) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 0.88) (end 2.025 3.053) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 -3.014) (end 2.165 -0.942) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 0.942) (end 2.165 3.014) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 -2.968) (end 2.305 -0.981) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 0.981) (end 2.305 2.968) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 -2.915) (end 2.445 -0.998) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 0.998) (end 2.445 2.915) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 -2.853) (end 2.585 -0.996) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 0.996) (end 2.585 2.853) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 -2.783) (end 2.725 -0.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 0.974) (end 2.725 2.783) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 -2.704) (end 2.865 -0.931) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 0.931) (end 2.865 2.704) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 -2.616) (end 3.005 -0.863) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 0.863) (end 3.005 2.616) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 -2.516) (end 3.145 -0.764) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 0.764) (end 3.145 2.516) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 -2.404) (end 3.285 -0.619) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 0.619) (end 3.285 2.404) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 -2.279) (end 3.425 -0.38) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 0.38) (end 3.425 2.279) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.565 -2.136) (end 3.565 2.136) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.705 -1.974) (end 3.705 1.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.845 -1.786) (end 3.845 1.786) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.985 -1.563) (end 3.985 1.563) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.125 -1.287) (end 4.125 1.287) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.265 -0.912) (end 4.265 0.912) (layer F.SilkS) (width 0.15)) + (fp_circle (center 2.5 0) (end 2.5 -1) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.1875) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.4) (layer F.CrtYd) (width 0.05)) + (pad 2 thru_hole circle (at 2.5 0 180) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 8 /VGND)) + (pad 1 thru_hole rect (at 0 0 180) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 9 /VCC_PSU)) + (model Capacitors_ThroughHole.3dshapes/C_Radial_D6.3_L11.2_P2.5.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 5673A8DC) + (at 78.74 154.432 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB630B) + (attr smd) + (fp_text reference C7 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 10 "Net-(C7-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 11 "Net-(C7-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5E33) (tstamp 5673A8E2) + (at 81.28 143.51 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /56071A50) + (attr smd) + (fp_text reference C8 (at -0.0508 1.397 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VCC_PSU)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 8 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5CDA) (tstamp 5673A8E8) + (at 97.536 141.351 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55D75F49) + (attr smd) + (fp_text reference C9 (at -2.413 -0.254 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 8 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5D24) (tstamp 5673A8EE) + (at 97.79 153.035 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /5609699F) + (attr smd) + (fp_text reference C10 (at -0.0762 -1.27 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5 (layer F.Cu) (tedit 567B5E4A) (tstamp 5673A8F4) + (at 93.345 143.891 90) + (descr "Radial Electrolytic Capacitor, Diameter 6.3mm x Length 11.2mm, Pitch 2.5mm") + (tags "Electrolytic Capacitor") + (path /560735FE) + (fp_text reference C11 (at -1.4732 0.127 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.25 4.4 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.325 -3.149) (end 1.325 3.149) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.465 -3.143) (end 1.465 3.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 -3.13) (end 1.605 -0.446) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 0.446) (end 1.605 3.13) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 -3.111) (end 1.745 -0.656) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 0.656) (end 1.745 3.111) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 -3.085) (end 1.885 -0.789) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 0.789) (end 1.885 3.085) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 -3.053) (end 2.025 -0.88) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 0.88) (end 2.025 3.053) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 -3.014) (end 2.165 -0.942) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 0.942) (end 2.165 3.014) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 -2.968) (end 2.305 -0.981) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 0.981) (end 2.305 2.968) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 -2.915) (end 2.445 -0.998) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 0.998) (end 2.445 2.915) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 -2.853) (end 2.585 -0.996) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 0.996) (end 2.585 2.853) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 -2.783) (end 2.725 -0.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 0.974) (end 2.725 2.783) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 -2.704) (end 2.865 -0.931) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 0.931) (end 2.865 2.704) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 -2.616) (end 3.005 -0.863) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 0.863) (end 3.005 2.616) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 -2.516) (end 3.145 -0.764) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 0.764) (end 3.145 2.516) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 -2.404) (end 3.285 -0.619) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 0.619) (end 3.285 2.404) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 -2.279) (end 3.425 -0.38) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 0.38) (end 3.425 2.279) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.565 -2.136) (end 3.565 2.136) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.705 -1.974) (end 3.705 1.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.845 -1.786) (end 3.845 1.786) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.985 -1.563) (end 3.985 1.563) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.125 -1.287) (end 4.125 1.287) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.265 -0.912) (end 4.265 0.912) (layer F.SilkS) (width 0.15)) + (fp_circle (center 2.5 0) (end 2.5 -1) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.1875) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.4) (layer F.CrtYd) (width 0.05)) + (pad 2 thru_hole circle (at 2.5 0 90) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 8 /VGND)) + (pad 1 thru_hole rect (at 0 0 90) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 12 "Net-(C11-Pad1)")) + (model Capacitors_ThroughHole.3dshapes/C_Radial_D6.3_L11.2_P2.5.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5E45) (tstamp 5673A8FA) + (at 88.9 143.129 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /5607355F) + (attr smd) + (fp_text reference C12 (at -2.1082 0.4064 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 12 "Net-(C11-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 8 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 5673A900) + (at 114.427 152.527 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /5608B4BE) + (attr smd) + (fp_text reference C13 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5E84) (tstamp 5673A906) + (at 78.74 159.766 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /566DF655) + (attr smd) + (fp_text reference C14 (at 13.6144 6.731 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 13 "Net-(C14-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 14 "Net-(C14-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5 (layer F.Cu) (tedit 567B5BBA) (tstamp 5673A90C) + (at 116.078 144.018 270) + (descr "Radial Electrolytic Capacitor, Diameter 6.3mm x Length 11.2mm, Pitch 2.5mm") + (tags "Electrolytic Capacitor") + (path /566F5A75) + (fp_text reference C15 (at -0.254 -1.397 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.25 4.4 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.325 -3.149) (end 1.325 3.149) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.465 -3.143) (end 1.465 3.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 -3.13) (end 1.605 -0.446) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 0.446) (end 1.605 3.13) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 -3.111) (end 1.745 -0.656) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 0.656) (end 1.745 3.111) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 -3.085) (end 1.885 -0.789) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 0.789) (end 1.885 3.085) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 -3.053) (end 2.025 -0.88) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 0.88) (end 2.025 3.053) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 -3.014) (end 2.165 -0.942) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 0.942) (end 2.165 3.014) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 -2.968) (end 2.305 -0.981) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 0.981) (end 2.305 2.968) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 -2.915) (end 2.445 -0.998) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 0.998) (end 2.445 2.915) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 -2.853) (end 2.585 -0.996) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 0.996) (end 2.585 2.853) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 -2.783) (end 2.725 -0.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 0.974) (end 2.725 2.783) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 -2.704) (end 2.865 -0.931) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 0.931) (end 2.865 2.704) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 -2.616) (end 3.005 -0.863) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 0.863) (end 3.005 2.616) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 -2.516) (end 3.145 -0.764) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 0.764) (end 3.145 2.516) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 -2.404) (end 3.285 -0.619) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 0.619) (end 3.285 2.404) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 -2.279) (end 3.425 -0.38) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 0.38) (end 3.425 2.279) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.565 -2.136) (end 3.565 2.136) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.705 -1.974) (end 3.705 1.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.845 -1.786) (end 3.845 1.786) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.985 -1.563) (end 3.985 1.563) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.125 -1.287) (end 4.125 1.287) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.265 -0.912) (end 4.265 0.912) (layer F.SilkS) (width 0.15)) + (fp_circle (center 2.5 0) (end 2.5 -1) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.1875) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.4) (layer F.CrtYd) (width 0.05)) + (pad 2 thru_hole circle (at 2.5 0 270) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 1 thru_hole rect (at 0 0 270) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 7 /AVCC)) + (model Capacitors_ThroughHole.3dshapes/C_Radial_D6.3_L11.2_P2.5.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10 (layer F.Cu) (tedit 567B5BAF) (tstamp 5673A912) + (at 82.55 135.128) + (descr "Diode, DO-41, SOD81, Horizontal, RM 10mm,") + (tags "Diode, DO-41, SOD81, Horizontal, RM 10mm, 1N4007, SB140,") + (path /5606FDB4) + (fp_text reference D1 (at 4.445 2.921) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value D_Schottky (at 4.37134 -3.55854) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 7.62 -0.00254) (end 8.636 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -0.00254) (end 1.524 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.048 -1.27254) (end 3.048 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.302 -1.27254) (end 3.302 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.556 -1.27254) (end 3.556 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -1.27254) (end 2.794 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.175 -1.27254) (end 3.175 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 1.26746) (end 2.54 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 7.62 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 -1.27254) (end 7.62 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 1.26746) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at 10.16 -0.00254 180) (size 1.99898 1.99898) (drill 1.27) (layers *.Cu *.Mask F.SilkS) + (net 15 "Net-(D1-Pad2)")) + (pad 1 thru_hole rect (at 0 -0.00254 180) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.Mask F.SilkS) + (net 12 "Net-(C11-Pad1)")) + ) + + (module Capacitors_SMD:C_1206 (layer F.Cu) (tedit 5415D7BD) (tstamp 5673A918) + (at 105.791 142.113 180) + (descr "Capacitor SMD 1206, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 1206") + (path /55D739F3) + (attr smd) + (fp_text reference F1 (at 0 -2.3 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value F_Small (at 0 2.3 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.3 -1.15) (end 2.3 -1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.3 1.15) (end 2.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.3 -1.15) (end -2.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.3 -1.15) (end 2.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 -1.025) (end -1 -1.025) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 1.025) (end 1 1.025) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.5 0 180) (size 1 1.6) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 2 smd rect (at 1.5 0 180) (size 1 1.6) (layers F.Cu F.Paste F.Mask) + (net 8 /VGND)) + (model Capacitors_SMD.3dshapes/C_1206.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm (layer F.Cu) (tedit 567B5D1F) (tstamp 5673A948) + (at 105.41 154.051 90) + (descr "LQFP44 (see Appnote_PCB_Guidelines_TRINAMIC_packages.pdf)") + (tags "QFP 0.8") + (path /55CA8F25) + (attr smd) + (fp_text reference IC1 (at -0.0762 0.3048 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value ATXMEGA16A4U-A (at 0 7.65 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -6.9 -6.9) (end -6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start 6.9 -6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 -6.9) (end 6.9 -6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.175 -5.175) (end -5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -5.175) (end -4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -4.505) (end -6.65 -4.505) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -5.85 -4 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 16 /PSU_FEEDBACK)) + (pad 2 smd rect (at -5.85 -3.2 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (pad 3 smd rect (at -5.85 -2.4 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 18 "Net-(IC1-Pad3)")) + (pad 4 smd rect (at -5.85 -1.6 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 19 "Net-(IC1-Pad4)")) + (pad 5 smd rect (at -5.85 -0.8 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 20 "Net-(IC1-Pad5)")) + (pad 6 smd rect (at -5.85 0 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 21 /DAC_OUT)) + (pad 7 smd rect (at -5.85 0.8 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 22 /DAC_OUT2)) + (pad 8 smd rect (at -5.85 1.6 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 23 "Net-(IC1-Pad8)")) + (pad 9 smd rect (at -5.85 2.4 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 24 "Net-(IC1-Pad9)")) + (pad 10 smd rect (at -5.85 3.2 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 25 "Net-(IC1-Pad10)")) + (pad 11 smd rect (at -5.85 4 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 26 /XCK)) + (pad 12 smd rect (at -4 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 27 /DIG_CH2)) + (pad 13 smd rect (at -3.2 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 28 "Net-(IC1-Pad13)")) + (pad 14 smd rect (at -2.4 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 15 smd rect (at -1.6 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 26 /XCK)) + (pad 16 smd rect (at -0.8 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 29 "Net-(IC1-Pad16)")) + (pad 17 smd rect (at 0 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 30 /DIG_CH1)) + (pad 18 smd rect (at 0.8 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 19 smd rect (at 1.6 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 20 smd rect (at 2.4 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 31 "Net-(IC1-Pad20)")) + (pad 21 smd rect (at 3.2 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 32 "Net-(IC1-Pad21)")) + (pad 22 smd rect (at 4 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 33 "Net-(IC1-Pad22)")) + (pad 23 smd rect (at 5.85 4 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 34 "Net-(IC1-Pad23)")) + (pad 24 smd rect (at 5.85 3.2 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 35 /PSU_PWM)) + (pad 25 smd rect (at 5.85 2.4 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 36 "Net-(IC1-Pad25)")) + (pad 26 smd rect (at 5.85 1.6 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 37 /D-)) + (pad 27 smd rect (at 5.85 0.8 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 38 /D+)) + (pad 28 smd rect (at 5.85 0 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 39 "Net-(IC1-Pad28)")) + (pad 29 smd rect (at 5.85 -0.8 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 40 "Net-(IC1-Pad29)")) + (pad 30 smd rect (at 5.85 -1.6 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 31 smd rect (at 5.85 -2.4 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 32 smd rect (at 5.85 -3.2 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 41 "Net-(IC1-Pad32)")) + (pad 33 smd rect (at 5.85 -4 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 42 "Net-(IC1-Pad33)")) + (pad 34 smd rect (at 4 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 43 "Net-(IC1-Pad34)")) + (pad 35 smd rect (at 3.2 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 44 "Net-(IC1-Pad35)")) + (pad 36 smd rect (at 2.4 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 45 "Net-(IC1-Pad36)")) + (pad 37 smd rect (at 1.6 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 46 "Net-(IC1-Pad37)")) + (pad 38 smd rect (at 0.8 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 39 smd rect (at 0 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 40 smd rect (at -0.8 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (pad 41 smd rect (at -1.6 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 47 "Net-(IC1-Pad41)")) + (pad 42 smd rect (at -2.4 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 48 /CH1)) + (pad 43 smd rect (at -3.2 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 49 "Net-(IC1-Pad43)")) + (pad 44 smd rect (at -4 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 50 /AVCC_ON_2)) + (model Housings_QFP.3dshapes/LQFP-44_10x10mm_Pitch0.8mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10 (layer F.Cu) (tedit 567B5BAC) (tstamp 5673A94E) + (at 92.456 137.922 180) + (descr "Diode, DO-41, SOD81, Horizontal, RM 10mm,") + (tags "Diode, DO-41, SOD81, Horizontal, RM 10mm, 1N4007, SB140,") + (path /5606EE9E) + (fp_text reference L1 (at 4.572 2.667 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value INDUCTOR (at 4.37134 -3.55854 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 7.62 -0.00254) (end 8.636 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -0.00254) (end 1.524 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.048 -1.27254) (end 3.048 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.302 -1.27254) (end 3.302 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.556 -1.27254) (end 3.556 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -1.27254) (end 2.794 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.175 -1.27254) (end 3.175 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 1.26746) (end 2.54 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 7.62 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 -1.27254) (end 7.62 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 1.26746) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at 10.16 -0.00254) (size 1.99898 1.99898) (drill 1.27) (layers *.Cu *.Mask F.SilkS) + (net 9 /VCC_PSU)) + (pad 1 thru_hole rect (at 0 -0.00254) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.Mask F.SilkS) + (net 15 "Net-(D1-Pad2)")) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 (layer F.Cu) (tedit 567B5BDC) (tstamp 5673A956) + (at 94.488 159.512 180) + (descr "Through hole pin header") + (tags "pin header") + (path /55CAB35C) + (fp_text reference P1 (at -2.54 -0.254 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SCOPE_IN (at 0 -3.1 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 3 "Net-(C2-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 4 "Net-(C2-Pad2)")) + (pad 3 thru_hole oval (at 0 5.08 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 2 "Net-(C1-Pad2)")) + (pad 4 thru_hole oval (at 0 7.62 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 1 "Net-(C1-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Connect:USB_Micro-B (layer F.Cu) (tedit 567B5CC4) (tstamp 5673A963) + (at 114.554 137.668 180) + (descr "Micro USB Type B Receptacle") + (tags "USB USB_B USB_micro USB_OTG") + (path /55CA90D2) + (attr smd) + (fp_text reference P2 (at 0 0.762 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value USB_OTG (at 0 4.8 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.6 -2.8) (end 4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 -2.8) (end 4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 4.05) (end -4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.6 4.05) (end -4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3509 3.81746) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 -2.58754) (end 4.3491 -2.58754) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 -2.58754) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 2.58746) (end -4.3509 2.58746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 3.81746) (end -4.3509 -2.58754) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.3009 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -0.6509 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 37 /D-)) + (pad 3 smd rect (at -0.0009 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 38 /D+)) + (pad 4 smd rect (at 0.6491 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 51 "Net-(P2-Pad4)")) + (pad 5 smd rect (at 1.2991 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 6 thru_hole oval (at -2.5009 -1.56254 270) (size 0.95 1.25) (drill oval 0.55 0.85) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 6 thru_hole oval (at 2.4991 -1.56254 270) (size 0.95 1.25) (drill oval 0.55 0.85) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 6 thru_hole oval (at -3.5009 1.13746 270) (size 1.55 1) (drill oval 1.15 0.5) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 6 thru_hole oval (at 3.4991 1.13746 270) (size 1.55 1) (drill oval 1.15 0.5) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 locked (layer F.Cu) (tedit 567B5DDC) (tstamp 5673A96B) + (at 76.2 149.86 180) + (descr "Through hole pin header") + (tags "pin header") + (path /55CBF4D5) + (fp_text reference P3 (at -1.8796 0.4826 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DIG_OUT (at 2.54 3.81 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 52 "Net-(P3-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 53 "Net-(P3-Pad2)")) + (pad 3 thru_hole oval (at 0 5.08 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 54 "Net-(P3-Pad3)")) + (pad 4 thru_hole oval (at 0 7.62 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 55 "Net-(P3-Pad4)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_2x02 (layer F.Cu) (tedit 567B5CD3) (tstamp 5673A973) + (at 105.156 135.382) + (descr "Through hole pin header") + (tags "pin header") + (path /56069A87) + (fp_text reference P4 (at -2.159 -0.127 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value PDI (at 0 -3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.75) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 4.3 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 -1.55) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 -1.27) (end 3.81 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27) (end 3.81 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 3.81) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 7 /AVCC)) + (pad 2 thru_hole oval (at 2.54 0) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 43 "Net-(IC1-Pad34)")) + (pad 3 thru_hole oval (at 0 2.54) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 4 thru_hole oval (at 2.54 2.54) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 44 "Net-(IC1-Pad35)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_2x02.wrl + (at (xyz 0.05 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x03 (layer F.Cu) (tedit 567B5CD0) (tstamp 5673A97A) + (at 100.33 140.462 180) + (descr "Through hole pin header") + (tags "pin header") + (path /56065DA8) + (fp_text reference P5 (at -1.905 1.143 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CONN_01X03 (at 0 -3.1 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 6.85) (end 1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 6.35) (end 1.27 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 6.35) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 5 +5V)) + (pad 2 thru_hole oval (at 0 2.54 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 9 /VCC_PSU)) + (pad 3 thru_hole oval (at 0 5.08 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 7 /AVCC)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x03.wrl + (at (xyz 0 -0.1 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 locked (layer F.Cu) (tedit 567B5E7D) (tstamp 5673A982) + (at 76.2 152.4) + (descr "Through hole pin header") + (tags "pin header") + (path /566DF832) + (fp_text reference P6 (at 9.0678 -6.1722 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DAC_OUT (at 2.54 5.08 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 11 "Net-(C7-Pad2)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 10 "Net-(C7-Pad1)")) + (pad 3 thru_hole oval (at 0 5.08) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 14 "Net-(C14-Pad2)")) + (pad 4 thru_hole oval (at 0 7.62) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 13 "Net-(C14-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_2x02 locked (layer F.Cu) (tedit 567B5E3B) (tstamp 5673A98A) + (at 86.36 143.51 180) + (descr "Through hole pin header") + (tags "pin header") + (path /55CC540F) + (fp_text reference P7 (at -2.2606 3.1242 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value HVO (at -3.429 1.016 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.75) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 4.3 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 -1.55) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 -1.27) (end 3.81 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27) (end 3.81 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 3.81) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 12 "Net-(C11-Pad1)")) + (pad 2 thru_hole oval (at 2.54 0 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 8 /VGND)) + (pad 3 thru_hole oval (at 0 2.54 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 8 /VGND)) + (pad 4 thru_hole oval (at 2.54 2.54 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 8 /VGND)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_2x02.wrl + (at (xyz 0.05 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 567B5D10) (tstamp 5673A990) + (at 116.84 157.48) + (descr "Through hole pin header") + (tags "pin header") + (path /55D6DB77) + (fp_text reference P8 (at 0.254 -2.3368) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DIG_IN (at 0 -3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 56 "Net-(P8-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 57 "Net-(P8-Pad2)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module SMD:SOT-23-3 (layer F.Cu) (tedit 5508E933) (tstamp 5673A997) + (at 95.885 137.922 270) + (path /5606F6D4) + (fp_text reference Q1 (at 2.5 0 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Q_NMOS_GSD (at -2.2 0 360) (layer F.Fab) hide + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 1 -0.4) (end 1.1 -0.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 -0.8) (end -1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 0.8) (end 1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 0.8) (end 1.5 -0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 -0.8) (end -1.5 -0.8) (layer F.SilkS) (width 0.15)) + (pad 3 smd rect (at 0 1.4 270) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 15 "Net-(D1-Pad2)")) + (pad 2 smd rect (at -0.95 -1.4 270) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 8 /VGND)) + (pad 1 smd rect (at 0.95 -1.4 270) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 35 /PSU_PWM)) + (model 3D/SMD/SOT-23-3.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5F80) (tstamp 5673A99D) + (at 89.916 155.067) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAB95) + (attr smd) + (fp_text reference R1 (at -4.3942 -8.9408 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5F66) (tstamp 5673A9A3) + (at 89.916 160.528) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAD4C) + (attr smd) + (fp_text reference R2 (at -4.19608 -14.56944 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R2-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5F86) (tstamp 5673A9A9) + (at 89.916 153.416) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAABF4) + (attr smd) + (fp_text reference R3 (at -4.5085 -6.9215 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.8796) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 50 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5F7C) (tstamp 5673A9AF) + (at 89.916 158.877 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAD11) + (attr smd) + (fp_text reference R4 (at 4.0132 12.573 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 50 /AVCC_ON_2)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R2-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5F8A) (tstamp 5673A9B5) + (at 89.789 151.765 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAC5F) + (attr smd) + (fp_text reference R5 (at 4.26466 5.24764 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 50 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5F8C) (tstamp 5673A9BB) + (at 89.789 150.114 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAACD2) + (attr smd) + (fp_text reference R6 (at 4.37642 3.8481 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 50 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E09) (tstamp 5673A9C1) + (at 79.756 146.05 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBCDA5) + (attr smd) + (fp_text reference R7 (at -5.5372 -0.3556 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R11-Pad2)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 55 "Net-(P3-Pad4)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E1F) (tstamp 5673A9C7) + (at 79.756 147.701 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE401) + (attr smd) + (fp_text reference R8 (at -5.4356 1.4732 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R12-Pad2)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 54 "Net-(P3-Pad3)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E1A) (tstamp 5673A9CD) + (at 79.756 149.352 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE16B) + (attr smd) + (fp_text reference R9 (at -5.3594 3.302 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R13-Pad2)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 53 "Net-(P3-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E17) (tstamp 5673A9D3) + (at 82.296 151.003 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE2C7) + (attr smd) + (fp_text reference R10 (at -2.794 4.8514 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R10-Pad1)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 52 "Net-(P3-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5DB5) (tstamp 5673A9D9) + (at 82.423 146.05 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBCD2A) + (attr smd) + (fp_text reference R11 (at -2.8702 -0.0762 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 39 "Net-(IC1-Pad28)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R11-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E0C) (tstamp 5673A9DF) + (at 82.423 147.701 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE362) + (attr smd) + (fp_text reference R12 (at -2.9464 1.6256 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 40 "Net-(IC1-Pad29)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R12-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E0E) (tstamp 5673A9E5) + (at 82.423 149.352 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE0F4) + (attr smd) + (fp_text reference R13 (at -3.0988 3.1242 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 41 "Net-(IC1-Pad32)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R13-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E14) (tstamp 5673A9EB) + (at 84.455 150.241 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE21C) + (attr smd) + (fp_text reference R14 (at -4.064 -0.889 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 42 "Net-(IC1-Pad33)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R10-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 5673A9F1) + (at 80.391 154.305 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CB4680) + (attr smd) + (fp_text reference R15 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R15-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R15-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E1C) (tstamp 5673A9F7) + (at 79.248 152.146) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CB9020) + (attr smd) + (fp_text reference R16 (at 0.2286 -1.3208) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 11 "Net-(C7-Pad2)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R15-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E90) (tstamp 5673A9FD) + (at 80.391 159.639 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566DE721) + (attr smd) + (fp_text reference R17 (at -13.2842 -4.8514 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R17-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R17-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E95) (tstamp 5673AA03) + (at 79.248 157.48) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566DE7E8) + (attr smd) + (fp_text reference R18 (at 6.096 -11.28776) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 14 "Net-(C14-Pad2)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R17-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5CE2) (tstamp 5673AA09) + (at 98.171 143.891) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566E5C29) + (attr smd) + (fp_text reference R19 (at 0.1778 1.6002) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 12 "Net-(C11-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 16 /PSU_FEEDBACK)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5CE5) (tstamp 5673AA0F) + (at 101.6 143.891) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566E5CBE) + (attr smd) + (fp_text reference R20 (at 0.4064 1.651) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 16 /PSU_FEEDBACK)) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module SMD:SOT-23-3 (layer F.Cu) (tedit 567B5D08) (tstamp 5673AA16) + (at 109.982 144.399 180) + (path /55CA99FA) + (fp_text reference U1 (at -0.1016 -0.0254 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value 78L05 (at -2.2 0 270) (layer F.Fab) hide + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 1 -0.4) (end 1.1 -0.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 -0.8) (end -1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 0.8) (end 1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 0.8) (end 1.5 -0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 -0.8) (end -1.5 -0.8) (layer F.SilkS) (width 0.15)) + (pad 3 smd rect (at 0 1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -0.95 -1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 1 smd rect (at 0.95 -1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model 3D/SMD/SOT-23-3.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm (layer F.Cu) (tedit 567B5F95) (tstamp 5673AA28) + (at 84.963 156.972 180) + (descr "14-Lead Plastic Small Outline (SL) - Narrow, 3.90 mm Body [SOIC] (see Microchip Packaging Specification 00000049BS.pdf)") + (tags "SOIC 1.27") + (path /55CA87E2) + (attr smd) + (fp_text reference U2 (at 0.19304 -1.22428 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value LM324 (at 0 5.375 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.7 -4.65) (end -3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.7 -4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 -4.65) (end 3.7 -4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.075 -4.45) (end -2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 -4.45) (end 2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 4.45) (end 2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end -2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.45) (end 2.075 -4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end 2.075 4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.335) (end -3.45 -4.335) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2.7 -3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (pad 2 smd rect (at -2.7 -2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (pad 3 smd rect (at -2.7 -1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R2-Pad1)")) + (pad 4 smd rect (at -2.7 0 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 5 smd rect (at -2.7 1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R1-Pad1)")) + (pad 6 smd rect (at -2.7 2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 48 /CH1)) + (pad 7 smd rect (at -2.7 3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 48 /CH1)) + (pad 8 smd rect (at 2.7 3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R15-Pad2)")) + (pad 9 smd rect (at 2.7 2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R15-Pad2)")) + (pad 10 smd rect (at 2.7 1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 21 /DAC_OUT)) + (pad 11 smd rect (at 2.7 0 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 8 /VGND)) + (pad 12 smd rect (at 2.7 -1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 22 /DAC_OUT2)) + (pad 13 smd rect (at 2.7 -2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R17-Pad2)")) + (pad 14 smd rect (at 2.7 -3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R17-Pad2)")) + (model Housings_SOIC.3dshapes/SOIC-14_3.9x8.7mm_Pitch1.27mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module TO_SOT_Packages_SMD:SOT-363 (layer F.Cu) (tedit 567B5D15) (tstamp 5673AA32) + (at 113.665 159.131 90) + (descr SOT353) + (path /55D6ACFD) + (attr smd) + (fp_text reference U3 (at -0.0762 0.0254 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DMN63D8LDW (at 0.09906 0 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 0.635 1.016) (end 0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 -1.016) (end -0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 -1.016) (end -0.635 1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 1.016) (end 0.635 1.016) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.016 -0.635 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 3 smd rect (at -1.016 0.635 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 27 /DIG_CH2)) + (pad 6 smd rect (at 1.016 -0.635 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 30 /DIG_CH1)) + (pad 2 smd rect (at -1.016 0 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 57 "Net-(P8-Pad2)")) + (pad 4 smd rect (at 1.016 0.635 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 5 smd rect (at 1.016 0 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 56 "Net-(P8-Pad1)")) + (model TO_SOT_Packages_SMD.3dshapes/SOT-353.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.07000000000000001 0.09 0.08)) + (rotate (xyz 0 0 90)) + ) + ) + + (gr_line (start 119.126 133.604) (end 119.126 162.56) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 74.295 162.56) (end 74.295 161.417) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 119.126 162.56) (end 74.295 162.56) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 74.295 133.604) (end 74.295 162.306) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 119.126 133.604) (end 74.295 133.604) (angle 90) (layer Edge.Cuts) (width 0.1)) + + (segment (start 90.666 155.067) (end 92.583 155.067) (width 0.254) (layer F.Cu) (net 1)) + (segment (start 93.091 153.543) (end 94.488 152.146) (width 0.254) (layer F.Cu) (net 1) (tstamp 5673BA83)) + (segment (start 93.091 154.559) (end 93.091 153.543) (width 0.254) (layer F.Cu) (net 1) (tstamp 5673BA82)) + (segment (start 92.583 155.067) (end 93.091 154.559) (width 0.254) (layer F.Cu) (net 1) (tstamp 5673BA81)) + (segment (start 94.488 152.146) (end 94.488 151.892) (width 0.254) (layer F.Cu) (net 1) (tstamp 5673BA84)) + (segment (start 90.666 155.067) (end 90.805 155.067) (width 0.254) (layer F.Cu) (net 1)) + (segment (start 94.488 151.892) (end 94.488 152.019) (width 0.254) (layer F.Cu) (net 1)) + (segment (start 90.436 156.591) (end 90.436 155.297) (width 0.254) (layer F.Cu) (net 1)) + (segment (start 90.436 155.297) (end 90.666 155.067) (width 0.254) (layer F.Cu) (net 1) (tstamp 5673B338)) + (segment (start 91.936 156.591) (end 92.329 156.591) (width 0.254) (layer F.Cu) (net 2)) + (segment (start 92.329 156.591) (end 94.488 154.432) (width 0.254) (layer F.Cu) (net 2) (tstamp 5673B33B)) + (segment (start 90.666 160.528) (end 91.936 160.528) (width 0.254) (layer F.Cu) (net 3)) + (segment (start 91.936 160.528) (end 91.948 160.516) (width 0.254) (layer F.Cu) (net 3) (tstamp 5673B335)) + (segment (start 91.948 160.516) (end 93.484 160.516) (width 0.254) (layer F.Cu) (net 3)) + (segment (start 93.484 160.516) (end 94.488 159.512) (width 0.254) (layer F.Cu) (net 3) (tstamp 5673B332)) + (segment (start 93.726 156.972) (end 94.488 156.972) (width 0.254) (layer F.Cu) (net 4) (tstamp 5673B347)) + (segment (start 92.964 157.734) (end 93.726 156.972) (width 0.254) (layer F.Cu) (net 4) (tstamp 5673B346)) + (segment (start 92.964 158.369) (end 92.964 157.734) (width 0.254) (layer F.Cu) (net 4) (tstamp 5673B345)) + (segment (start 92.317 159.016) (end 92.964 158.369) (width 0.254) (layer F.Cu) (net 4) (tstamp 5673B344)) + (segment (start 91.948 159.016) (end 92.317 159.016) (width 0.254) (layer F.Cu) (net 4)) + (segment (start 109.982 142.999) (end 110.759 142.999) (width 1.016) (layer F.Cu) (net 5)) + (segment (start 110.759 142.999) (end 111.137 142.621) (width 1.016) (layer F.Cu) (net 5) (tstamp 567A6AD4)) + (segment (start 111.137 142.621) (end 111.137 141.815002) (width 1.016) (layer F.Cu) (net 5)) + (segment (start 111.125 141.803002) (end 111.137 141.803002) (width 1.016) (layer F.Cu) (net 5) (tstamp 567A6AD0)) + (segment (start 111.137 141.815002) (end 111.125 141.803002) (width 1.016) (layer F.Cu) (net 5) (tstamp 567A6ACD)) + (segment (start 100.33 140.462) (end 103.505 140.462) (width 1.016) (layer B.Cu) (net 5)) + (segment (start 103.505 140.462) (end 104.648 141.605) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6ABC)) + (segment (start 104.648 141.605) (end 111.125 141.605) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6ABE)) + (segment (start 111.125 141.605) (end 114.808 141.605) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6ABF)) + (segment (start 114.808 141.605) (end 115.443 140.97) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6AC1)) + (segment (start 97.536 140.601) (end 100.191 140.601) (width 1.016) (layer F.Cu) (net 5)) + (segment (start 100.191 140.601) (end 100.33 140.462) (width 1.016) (layer F.Cu) (net 5) (tstamp 567A6AB9)) + (segment (start 97.536 140.601) (end 96.254 140.601) (width 1.016) (layer F.Cu) (net 5)) + (segment (start 86.106 156.972) (end 87.663 156.972) (width 1.016) (layer F.Cu) (net 5) (tstamp 567A6A1F)) + (segment (start 86.106 156.337) (end 86.106 156.972) (width 1.016) (layer F.Cu) (net 5) (tstamp 567A6A1E)) + (segment (start 85.598 155.829) (end 86.106 156.337) (width 1.016) (layer F.Cu) (net 5) (tstamp 567A6A1D)) + (via (at 85.598 155.829) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 5)) + (segment (start 85.598 152.273) (end 85.598 155.829) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6A1A)) + (segment (start 87.249 150.622) (end 85.598 152.273) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6A19)) + (segment (start 90.551 150.622) (end 87.249 150.622) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6A18)) + (segment (start 95.123 146.05) (end 90.551 150.622) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6A16)) + (segment (start 95.123 141.732) (end 95.123 146.05) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6A15)) + (segment (start 96.012 140.843) (end 95.123 141.732) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6A14)) + (via (at 96.012 140.843) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 5)) + (segment (start 96.254 140.601) (end 96.012 140.843) (width 1.016) (layer F.Cu) (net 5) (tstamp 567A6A12)) + (segment (start 111.137 141.803002) (end 111.137 141.617) (width 0.25) (layer F.Cu) (net 5) (tstamp 567A6AD1)) + (via (at 111.125 141.605) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 5)) + (segment (start 111.137 141.617) (end 111.125 141.605) (width 0.25) (layer F.Cu) (net 5) (tstamp 5675DE82)) + (segment (start 110.759 142.999) (end 111.137 142.621) (width 0.25) (layer F.Cu) (net 5) (tstamp 5675DE7F)) + (segment (start 115.8549 139.23054) (end 115.8549 140.5581) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 112.649 141.605) (end 111.125 141.605) (width 0.25) (layer B.Cu) (net 5) (tstamp 5675DD89)) + (segment (start 115.8549 140.5581) (end 115.443 140.97) (width 0.25) (layer F.Cu) (net 5) (tstamp 5675DBFF)) + (via (at 115.443 140.97) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 5)) + (segment (start 115.443 140.97) (end 114.808 141.605) (width 0.25) (layer B.Cu) (net 5) (tstamp 5675DC02)) + (segment (start 114.808 141.605) (end 112.649 141.605) (width 0.25) (layer B.Cu) (net 5) (tstamp 5675DC03)) + (segment (start 111.125 141.605) (end 104.648 141.605) (width 0.25) (layer B.Cu) (net 5) (tstamp 5675DE86)) + (segment (start 104.648 141.605) (end 103.505 140.462) (width 0.25) (layer B.Cu) (net 5) (tstamp 5675DC04)) + (segment (start 100.191 140.601) (end 100.33 140.462) (width 0.25) (layer F.Cu) (net 5) (tstamp 5675DA23)) + (segment (start 103.81 148.201) (end 103.81 146.81728) (width 0.508) (layer F.Cu) (net 6) (status 400000)) + (segment (start 103.01732 143.891) (end 102.35 143.891) (width 0.508) (layer F.Cu) (net 6) (tstamp 568C52DC) (status 800000)) + (segment (start 103.34244 144.21612) (end 103.01732 143.891) (width 0.508) (layer F.Cu) (net 6) (tstamp 568C52DB)) + (segment (start 103.34244 144.74952) (end 103.34244 144.21612) (width 0.508) (layer F.Cu) (net 6) (tstamp 568C52DA)) + (segment (start 103.3272 144.76476) (end 103.34244 144.74952) (width 0.508) (layer F.Cu) (net 6) (tstamp 568C52D9)) + (via (at 103.3272 144.76476) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 103.3272 146.33448) (end 103.3272 144.76476) (width 0.508) (layer B.Cu) (net 6) (tstamp 568C52D2)) + (segment (start 103.72344 146.73072) (end 103.3272 146.33448) (width 0.508) (layer B.Cu) (net 6) (tstamp 568C52D1)) + (via (at 103.72344 146.73072) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 103.81 146.81728) (end 103.72344 146.73072) (width 0.508) (layer F.Cu) (net 6) (tstamp 568C52CF)) + (segment (start 107.291 142.113) (end 107.569 142.113) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 107.569 142.113) (end 109.22 140.462) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6BC4)) + (segment (start 109.22 140.462) (end 109.22 139.23054) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6BC5)) + (segment (start 102.35 143.891) (end 102.35 143.498) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 102.35 143.498) (end 101.981 143.129) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6BA1)) + (segment (start 102.108 139.827) (end 102.108 139.954) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6BA7)) + (segment (start 101.981 139.954) (end 102.108 139.827) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6BA5)) + (segment (start 101.981 143.129) (end 101.981 139.954) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6BA2)) + (segment (start 105.156 137.922) (end 104.14 137.922) (width 1.016) (layer F.Cu) (net 6)) + (segment (start 104.14 137.922) (end 102.108 139.954) (width 1.016) (layer F.Cu) (net 6) (tstamp 567A6B92)) + (segment (start 102.108 139.954) (end 102.35 139.712) (width 1.016) (layer F.Cu) (net 6) (tstamp 567A6BA8)) + (segment (start 111.26 156.451) (end 112.382 156.451) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 112.382 156.451) (end 112.649 156.184) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B19)) + (segment (start 112.649 156.184) (end 112.649 155.321) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B1A)) + (segment (start 112.649 153.416) (end 112.649 155.321) (width 0.508) (layer B.Cu) (net 6)) + (segment (start 111.26 153.251) (end 112.484 153.251) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 112.484 153.251) (end 112.649 153.416) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B14)) + (segment (start 111.26 153.251) (end 114.401 153.251) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 114.401 153.251) (end 114.427 153.277) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B11)) + (segment (start 114.427 153.277) (end 114.566 153.277) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 114.566 153.277) (end 116.078 151.765) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B0D)) + (segment (start 116.078 151.765) (end 116.078 146.518) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B0E)) + (segment (start 116.078 146.518) (end 116.499 146.518) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 116.499 146.518) (end 117.221 145.796) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B09)) + (segment (start 117.221 145.796) (end 117.221 140.6672) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B0A)) + (segment (start 112.637 142.621) (end 114.935 142.621) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 114.935 142.621) (end 117.0549 140.5011) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B00)) + (segment (start 117.0549 140.5011) (end 117.0549 139.23054) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B01)) + (segment (start 109.032 145.799) (end 109.032 145.476) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 109.032 145.476) (end 110.236 144.272) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6AFA)) + (segment (start 110.236 144.272) (end 111.887 144.272) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6AFB)) + (segment (start 111.887 144.272) (end 112.637 143.522) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6AFC)) + (segment (start 112.637 143.522) (end 112.637 142.621) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6AFD)) + (segment (start 110.756 147.193) (end 110.426 147.193) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 110.426 147.193) (end 109.032 145.799) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6AF7)) + (segment (start 109.032 145.476) (end 110.236 144.272) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DF8E)) + (segment (start 112.637 143.522) (end 112.637 142.621) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DF93)) + (segment (start 111.887 144.272) (end 112.637 143.522) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DF92)) + (segment (start 110.236 144.272) (end 111.887 144.272) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DF90)) + (segment (start 116.078 146.518) (end 116.078 151.765) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 116.078 151.765) (end 114.566 153.277) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DEB4)) + (segment (start 116.499 146.518) (end 117.221 145.796) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DEA8)) + (segment (start 117.221 145.796) (end 117.221 140.6672) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DEA9)) + (segment (start 117.221 140.6672) (end 117.0549 140.5011) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DEAA)) + (segment (start 110.426 147.193) (end 109.032 145.799) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DE9C)) + (segment (start 117.0549 140.5011) (end 117.0549 139.23054) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DE8B)) + (segment (start 114.935 142.621) (end 117.0549 140.5011) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DE89)) + (segment (start 91.821 150.253) (end 92.952 150.253) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 97.167 152.285) (end 97.79 152.285) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DD4D)) + (segment (start 96.901 152.019) (end 97.167 152.285) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DD4C)) + (segment (start 96.901 150.749) (end 96.901 152.019) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DD4A)) + (segment (start 95.885 149.733) (end 96.901 150.749) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DD48)) + (segment (start 93.472 149.733) (end 95.885 149.733) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DD47)) + (segment (start 92.952 150.253) (end 93.472 149.733) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DD46)) + (segment (start 99.56 153.251) (end 98.756 153.251) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 98.756 153.251) (end 97.79 152.285) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DD39)) + (segment (start 114.427 153.277) (end 112.788 153.277) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 112.788 153.277) (end 112.649 153.416) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DC6A)) + (segment (start 107.569 142.113) (end 109.22 140.462) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DBB4)) + (segment (start 109.22 140.462) (end 109.22 139.23054) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DBB7)) + (segment (start 111.0549 136.53054) (end 118.0549 136.53054) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 113.2549 139.23054) (end 112.0549 139.23054) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 112.0549 139.23054) (end 109.22 139.23054) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 109.22 139.23054) (end 105.44854 139.23054) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DBBB)) + (segment (start 105.156 138.938) (end 105.156 137.922) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DB59)) + (segment (start 105.44854 139.23054) (end 105.156 138.938) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DB58)) + (segment (start 112.0549 139.23054) (end 111.67154 139.23054) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 111.67154 139.23054) (end 111.0549 138.6139) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DB52)) + (segment (start 111.0549 138.6139) (end 111.0549 136.53054) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DB53)) + (segment (start 117.0549 139.23054) (end 117.18246 139.23054) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 117.18246 139.23054) (end 118.0549 138.3581) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DB4E)) + (segment (start 118.0549 138.3581) (end 118.0549 136.53054) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DB4F)) + (segment (start 104.14 137.922) (end 102.35 139.712) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D8E5)) + (segment (start 102.35 139.712) (end 102.35 143.891) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D8E7)) + (segment (start 112.522 156.464) (end 112.522 156.591) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D897)) + (via (at 112.649 155.321) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 112.649 155.321) (end 112.649 156.337) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D895)) + (segment (start 112.649 156.337) (end 112.522 156.464) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D896)) + (via (at 112.649 153.416) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 112.484 153.251) (end 112.649 153.416) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D890)) + (segment (start 113.03 159.004) (end 112.903 159.004) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 112.522 156.591) (end 112.382 156.451) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D869)) + (segment (start 112.522 158.623) (end 112.522 156.591) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D868)) + (segment (start 112.903 159.004) (end 112.522 158.623) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D867)) + (segment (start 113.03 160.147) (end 113.03 159.004) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 114.3 158.623) (end 114.3 158.115) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D771)) + (segment (start 114.173 158.75) (end 114.3 158.623) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D770)) + (segment (start 113.284 158.75) (end 114.173 158.75) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D76C)) + (segment (start 113.03 159.004) (end 113.284 158.75) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D76B)) + (segment (start 91.821 150.253) (end 90.678 150.253) (width 0.254) (layer F.Cu) (net 6)) + (segment (start 90.678 150.253) (end 90.539 150.114) (width 0.254) (layer F.Cu) (net 6) (tstamp 5673B35C)) + (segment (start 115.443 139.065) (end 115.443 139.319) (width 0.508) (layer B.Cu) (net 7)) + (segment (start 116.459 143.002) (end 116.078 143.383) (width 0.508) (layer B.Cu) (net 7) (tstamp 567A6C3D)) + (segment (start 116.459 140.335) (end 116.459 143.002) (width 0.508) (layer B.Cu) (net 7) (tstamp 567A6C3C)) + (segment (start 115.443 139.319) (end 116.459 140.335) (width 0.508) (layer B.Cu) (net 7) (tstamp 567A6C3B)) + (segment (start 116.078 143.383) (end 116.078 144.018) (width 0.508) (layer B.Cu) (net 7) (tstamp 567A6C3F)) + (segment (start 115.443 139.065) (end 115.443 136.398) (width 0.508) (layer B.Cu) (net 7)) + (segment (start 115.443 136.398) (end 114.681 135.636) (width 0.508) (layer B.Cu) (net 7) (tstamp 567A6C38)) + (segment (start 113.03 133.985) (end 114.681 135.636) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 105.156 135.382) (end 105.156 135.255) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 105.156 135.255) (end 106.426 133.985) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6C25)) + (segment (start 106.426 133.985) (end 113.03 133.985) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6C26)) + (segment (start 100.33 135.382) (end 105.156 135.382) (width 1.016) (layer F.Cu) (net 7)) + (segment (start 110.932 145.799) (end 110.932 145.869) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 110.932 145.869) (end 112.256 147.193) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6AF4)) + (segment (start 116.078 144.018) (end 114.808 144.018) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 114.808 144.018) (end 113.027 145.799) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6AF0)) + (segment (start 113.027 145.799) (end 110.932 145.799) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6AF1)) + (segment (start 114.427 151.777) (end 114.427 146.177) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 114.427 146.177) (end 116.078 144.526) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6AEC)) + (segment (start 116.078 144.526) (end 116.078 144.018) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6AED)) + (segment (start 111.26 152.451) (end 112.598 152.451) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 112.598 152.451) (end 113.272 151.777) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6AE8)) + (segment (start 113.272 151.777) (end 114.427 151.777) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6AE9)) + (segment (start 105.156 135.255) (end 106.426 133.985) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DFBD)) + (segment (start 116.459 140.081) (end 116.459 143.637) (width 0.25) (layer B.Cu) (net 7) (tstamp 5675DFC9)) + (via (at 114.681 135.636) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 7)) + (segment (start 114.681 135.636) (end 115.443 136.398) (width 0.25) (layer B.Cu) (net 7) (tstamp 5675DFC5)) + (segment (start 115.443 139.065) (end 116.459 140.081) (width 0.25) (layer B.Cu) (net 7) (tstamp 5675DFC7)) + (segment (start 106.426 133.985) (end 113.03 133.985) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DFBE)) + (segment (start 116.459 143.637) (end 116.078 144.018) (width 0.25) (layer B.Cu) (net 7) (tstamp 5675DFCB)) + (segment (start 116.078 144.018) (end 116.078 144.526) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 116.078 144.526) (end 114.427 146.177) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DEAF)) + (segment (start 110.932 145.799) (end 113.027 145.799) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 113.027 145.799) (end 114.808 144.018) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DEA2)) + (segment (start 110.932 145.869) (end 112.256 147.193) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DE9F)) + (segment (start 97.79 153.785) (end 97.397 153.785) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 92.341 151.753) (end 91.821 151.753) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DD43)) + (segment (start 93.726 150.368) (end 92.341 151.753) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DD42)) + (segment (start 95.377 150.368) (end 93.726 150.368) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DD41)) + (segment (start 96.266 151.257) (end 95.377 150.368) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DD3F)) + (segment (start 96.266 152.654) (end 96.266 151.257) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DD3D)) + (segment (start 97.397 153.785) (end 96.266 152.654) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DD3C)) + (segment (start 97.79 153.785) (end 98.159 153.785) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 98.159 153.785) (end 98.425 154.051) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DD35)) + (segment (start 98.425 154.051) (end 99.56 154.051) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DD36)) + (segment (start 114.427 151.777) (end 113.272 151.777) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 113.272 151.777) (end 112.598 152.451) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DC66)) + (segment (start 91.821 151.753) (end 90.551 151.753) (width 0.254) (layer F.Cu) (net 7)) + (segment (start 90.551 151.753) (end 90.539 151.765) (width 0.254) (layer F.Cu) (net 7) (tstamp 5673B359)) + (segment (start 81.28 144.26) (end 83.07 144.26) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 83.07 144.26) (end 83.82 143.51) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A8F)) + (segment (start 76.494 136.906) (end 76.494 137.581) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 76.494 137.581) (end 78.994 140.081) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A87)) + (segment (start 80.506 144.26) (end 81.28 144.26) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A8C)) + (segment (start 78.994 142.748) (end 80.506 144.26) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A8B)) + (segment (start 78.994 140.081) (end 78.994 142.748) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A88)) + (segment (start 83.82 146.558) (end 86.614 146.558) (width 1.016) (layer B.Cu) (net 8)) + (via (at 90.805 142.367) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 8)) + (segment (start 86.614 146.558) (end 90.805 142.367) (width 1.016) (layer B.Cu) (net 8) (tstamp 567A6A51)) + (segment (start 90.805 142.367) (end 90.805 142.379) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A5C)) + (segment (start 90.805 142.379) (end 90.805 142.367) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A5D)) + (segment (start 90.805 142.367) (end 90.805 142.379) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A5F)) + (segment (start 83.82 156.845) (end 83.82 146.558) (width 1.016) (layer B.Cu) (net 8)) + (segment (start 83.82 146.558) (end 83.82 143.51) (width 1.016) (layer B.Cu) (net 8) (tstamp 567A6A4F)) + (segment (start 82.263 156.972) (end 83.693 156.972) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 83.693 156.972) (end 83.82 156.845) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A3F)) + (segment (start 93.345 141.391) (end 94.02 141.391) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 94.02 141.391) (end 94.73 142.101) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A69DA)) + (segment (start 94.73 142.101) (end 97.536 142.101) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A69DC)) + (segment (start 93.345 141.391) (end 95.758 138.978) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 95.758 138.978) (end 95.758 137.922) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A69BE)) + (segment (start 95.758 137.922) (end 96.708 136.972) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A69BF)) + (segment (start 96.708 136.972) (end 97.285 136.972) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A69C0)) + (segment (start 88.9 142.379) (end 90.805 142.379) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 90.805 142.379) (end 92.357 142.379) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A60)) + (segment (start 92.357 142.379) (end 93.345 141.391) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A69BB)) + (segment (start 86.36 140.97) (end 87.884 140.97) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 87.884 140.97) (end 88.9 141.986) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A69B6)) + (segment (start 88.9 141.986) (end 88.9 142.379) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A69B7)) + (segment (start 83.82 140.97) (end 83.82 143.51) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 86.36 140.97) (end 83.82 140.97) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 97.536 142.101) (end 100.953 142.101) (width 0.25) (layer F.Cu) (net 8)) + (segment (start 102.997 142.113) (end 104.291 142.113) (width 0.25) (layer F.Cu) (net 8) (tstamp 5675DBA6)) + (via (at 102.997 142.113) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 8)) + (segment (start 100.965 142.113) (end 102.997 142.113) (width 0.25) (layer B.Cu) (net 8) (tstamp 5675DBA3)) + (via (at 100.965 142.113) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 8)) + (segment (start 100.953 142.101) (end 100.965 142.113) (width 0.25) (layer F.Cu) (net 8) (tstamp 5675DBA1)) + (segment (start 97.536 142.101) (end 94.73 142.101) (width 0.25) (layer F.Cu) (net 8)) + (segment (start 94.73 142.101) (end 94.02 141.391) (width 0.25) (layer F.Cu) (net 8) (tstamp 5675DA1F)) + (segment (start 83.693 156.972) (end 83.82 156.845) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B98D)) + (via (at 83.82 156.845) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 8)) + (segment (start 97.285 136.972) (end 96.708 136.972) (width 0.254) (layer F.Cu) (net 8)) + (segment (start 95.758 137.922) (end 95.758 138.978) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B794)) + (segment (start 96.708 136.972) (end 95.758 137.922) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B793)) + (segment (start 92.357 142.379) (end 93.345 141.391) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B766)) + (segment (start 81.28 144.26) (end 79.998 144.26) (width 0.254) (layer F.Cu) (net 8)) + (segment (start 78.486 139.573) (end 76.494 137.581) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B6C1)) + (segment (start 78.486 142.748) (end 78.486 139.573) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B6BF)) + (segment (start 79.998 144.26) (end 78.486 142.748) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B6BE)) + (segment (start 88.9 142.379) (end 88.9 141.986) (width 0.254) (layer F.Cu) (net 8)) + (segment (start 88.9 141.986) (end 87.884 140.97) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B6AA)) + (segment (start 83.07 144.26) (end 83.82 143.51) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B69F)) + (segment (start 82.296 137.92454) (end 81.28 138.94054) (width 1.016) (layer F.Cu) (net 9)) + (segment (start 81.28 138.94054) (end 81.28 142.76) (width 1.016) (layer F.Cu) (net 9) (tstamp 567A6A84)) + (segment (start 82.296 137.92454) (end 80.77454 137.92454) (width 1.016) (layer F.Cu) (net 9)) + (segment (start 80.77454 137.92454) (end 79.756 136.906) (width 1.016) (layer F.Cu) (net 9) (tstamp 567A6A80)) + (segment (start 79.756 136.906) (end 78.994 136.906) (width 1.016) (layer F.Cu) (net 9) (tstamp 567A6A81)) + (segment (start 89.408 137.922) (end 82.29854 137.922) (width 1.016) (layer F.Cu) (net 9)) + (segment (start 82.29854 137.922) (end 82.296 137.92454) (width 1.016) (layer F.Cu) (net 9) (tstamp 567A6A7C)) + (segment (start 100.33 137.922) (end 96.647 137.922) (width 1.016) (layer B.Cu) (net 9)) + (segment (start 96.647 137.922) (end 94.869 139.7) (width 1.016) (layer B.Cu) (net 9) (tstamp 567A6A71)) + (segment (start 94.869 139.7) (end 90.678 139.7) (width 1.016) (layer B.Cu) (net 9) (tstamp 567A6A72)) + (segment (start 90.678 139.7) (end 90.17 139.192) (width 1.016) (layer B.Cu) (net 9) (tstamp 567A6A73)) + (segment (start 90.17 139.192) (end 90.17 138.684) (width 1.016) (layer B.Cu) (net 9) (tstamp 567A6A75)) + (segment (start 90.17 138.684) (end 89.452564 137.966564) (width 1.016) (layer B.Cu) (net 9) (tstamp 567A6A76)) + (segment (start 89.452564 137.966564) (end 89.363436 137.966564) (width 1.016) (layer B.Cu) (net 9) (tstamp 567A6A77)) + (segment (start 89.363436 137.966564) (end 89.408 137.922) (width 1.016) (layer B.Cu) (net 9) (tstamp 567A6A79)) + (segment (start 89.40546 137.92454) (end 82.296 137.92454) (width 0.254) (layer F.Cu) (net 9) (tstamp 5673B7D6)) + (segment (start 89.408 137.922) (end 89.40546 137.92454) (width 0.254) (layer F.Cu) (net 9) (tstamp 5673B7D5)) + (via (at 89.408 137.922) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 90.17 138.684) (end 89.408 137.922) (width 0.254) (layer B.Cu) (net 9) (tstamp 5673B7D3)) + (segment (start 90.17 139.192) (end 90.17 138.684) (width 0.254) (layer B.Cu) (net 9) (tstamp 5673B7D2)) + (segment (start 90.678 139.7) (end 90.17 139.192) (width 0.254) (layer B.Cu) (net 9) (tstamp 5673B7D1)) + (segment (start 94.869 139.7) (end 90.678 139.7) (width 0.254) (layer B.Cu) (net 9) (tstamp 5673B7D0)) + (segment (start 96.647 137.922) (end 94.869 139.7) (width 0.254) (layer B.Cu) (net 9) (tstamp 5673B7CE)) + (segment (start 78.994 136.906) (end 79.756 136.906) (width 0.254) (layer F.Cu) (net 9)) + (segment (start 79.756 136.906) (end 80.77454 137.92454) (width 0.254) (layer F.Cu) (net 9) (tstamp 5673B6C5)) + (segment (start 81.28 142.76) (end 81.28 138.94054) (width 0.254) (layer F.Cu) (net 9)) + (segment (start 78.74 155.182) (end 76.442 155.182) (width 0.254) (layer F.Cu) (net 10)) + (segment (start 76.442 155.182) (end 76.2 154.94) (width 0.254) (layer F.Cu) (net 10) (tstamp 5673B113)) + (segment (start 78.498 152.146) (end 76.454 152.146) (width 0.254) (layer F.Cu) (net 11)) + (segment (start 76.454 152.146) (end 76.2 152.4) (width 0.254) (layer F.Cu) (net 11) (tstamp 5673B110)) + (segment (start 78.74 153.682) (end 78.74 153.289) (width 0.254) (layer F.Cu) (net 11)) + (segment (start 78.74 153.289) (end 78.498 153.047) (width 0.254) (layer F.Cu) (net 11) (tstamp 5673B10C)) + (segment (start 78.498 153.047) (end 78.498 152.146) (width 0.254) (layer F.Cu) (net 11) (tstamp 5673B10D)) + (segment (start 93.345 143.891) (end 97.421 143.891) (width 1.016) (layer F.Cu) (net 12)) + (segment (start 88.9 143.879) (end 93.333 143.879) (width 1.016) (layer F.Cu) (net 12)) + (segment (start 93.333 143.879) (end 93.345 143.891) (width 1.016) (layer F.Cu) (net 12) (tstamp 567A6B7E)) + (segment (start 88.9 143.879) (end 86.729 143.879) (width 1.016) (layer F.Cu) (net 12)) + (segment (start 86.729 143.879) (end 86.36 143.51) (width 1.016) (layer F.Cu) (net 12) (tstamp 567A6B7B)) + (segment (start 86.36 143.51) (end 87.757 143.51) (width 1.016) (layer B.Cu) (net 12)) + (segment (start 87.757 143.51) (end 88.9 142.367) (width 1.016) (layer B.Cu) (net 12) (tstamp 567A6A9F)) + (segment (start 88.9 142.367) (end 88.9 139.446) (width 1.016) (layer B.Cu) (net 12) (tstamp 567A6AA1)) + (segment (start 88.9 139.446) (end 85.344 135.89) (width 1.016) (layer B.Cu) (net 12) (tstamp 567A6AA7)) + (segment (start 85.344 135.89) (end 85.344 135.128) (width 1.016) (layer B.Cu) (net 12) (tstamp 567A6AAB)) + (segment (start 82.55 135.12546) (end 85.34146 135.12546) (width 1.016) (layer F.Cu) (net 12)) + (segment (start 85.34146 135.12546) (end 85.344 135.128) (width 1.016) (layer F.Cu) (net 12) (tstamp 567A6A9C)) + (segment (start 93.333 143.879) (end 93.345 143.891) (width 0.254) (layer F.Cu) (net 12) (tstamp 5673B763)) + (segment (start 88.9 142.367) (end 87.757 143.51) (width 0.254) (layer B.Cu) (net 12) (tstamp 5673B703)) + (segment (start 88.9 138.684) (end 88.9 142.367) (width 0.254) (layer B.Cu) (net 12) (tstamp 5673B701)) + (segment (start 85.344 135.128) (end 88.9 138.684) (width 0.254) (layer B.Cu) (net 12) (tstamp 5673B700)) + (via (at 85.344 135.128) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 12)) + (segment (start 85.34146 135.12546) (end 85.344 135.128) (width 0.254) (layer F.Cu) (net 12) (tstamp 5673B6FE)) + (segment (start 86.36 143.51) (end 86.741 143.51) (width 0.254) (layer F.Cu) (net 12)) + (segment (start 86.741 143.51) (end 87.11 143.879) (width 0.254) (layer F.Cu) (net 12) (tstamp 5673B6A6)) + (segment (start 87.11 143.879) (end 88.9 143.879) (width 0.254) (layer F.Cu) (net 12) (tstamp 5673B6A7)) + (segment (start 78.74 160.516) (end 76.696 160.516) (width 0.254) (layer F.Cu) (net 13)) + (segment (start 76.696 160.516) (end 76.2 160.02) (width 0.254) (layer F.Cu) (net 13) (tstamp 5673B12D)) + (segment (start 78.498 157.48) (end 78.498 158.774) (width 0.254) (layer F.Cu) (net 14)) + (segment (start 78.498 158.774) (end 78.74 159.016) (width 0.254) (layer F.Cu) (net 14) (tstamp 5673B12A)) + (segment (start 78.498 157.48) (end 76.2 157.48) (width 0.254) (layer F.Cu) (net 14)) + (segment (start 94.485 137.922) (end 92.45854 137.922) (width 1.016) (layer F.Cu) (net 15)) + (segment (start 92.45854 137.922) (end 92.456 137.92454) (width 1.016) (layer F.Cu) (net 15) (tstamp 567A6B3A)) + (segment (start 92.45854 137.922) (end 92.456 137.92454) (width 0.508) (layer F.Cu) (net 15) (tstamp 567A6B32)) + (segment (start 92.456 137.92454) (end 92.456 135.37946) (width 1.016) (layer F.Cu) (net 15)) + (segment (start 92.456 135.37946) (end 92.71 135.12546) (width 1.016) (layer F.Cu) (net 15) (tstamp 567A6A99)) + (segment (start 92.45854 137.922) (end 92.456 137.92454) (width 0.254) (layer F.Cu) (net 15) (tstamp 5673B790)) + (segment (start 92.456 135.37946) (end 92.71 135.12546) (width 0.254) (layer F.Cu) (net 15) (tstamp 5673B769)) + (segment (start 98.921 143.891) (end 100.85 143.891) (width 1.016) (layer F.Cu) (net 16)) + (segment (start 101.41 158.052) (end 101.41 159.901) (width 0.254) (layer F.Cu) (net 16) (tstamp 5673BB02)) + (via (at 99.949 143.891) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 16)) + (segment (start 99.949 143.891) (end 101.346 145.288) (width 0.254) (layer B.Cu) (net 16) (tstamp 5673BAFA)) + (segment (start 101.346 145.288) (end 101.346 157.988) (width 0.254) (layer B.Cu) (net 16) (tstamp 5673BAFB)) + (via (at 101.346 157.988) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 16)) + (segment (start 101.346 157.988) (end 101.41 158.052) (width 0.254) (layer F.Cu) (net 16) (tstamp 5673BB01)) + (segment (start 100.85 143.891) (end 99.949 143.891) (width 0.254) (layer F.Cu) (net 16)) + (segment (start 98.921 143.891) (end 99.949 143.891) (width 0.254) (layer F.Cu) (net 16)) + (segment (start 102.21 159.901) (end 102.21 155.473) (width 0.254) (layer F.Cu) (net 17)) + (segment (start 101.6 154.863) (end 99.572 154.863) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BAD7)) + (segment (start 102.21 155.473) (end 101.6 154.863) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BAD1)) + (segment (start 99.572 154.863) (end 99.56 154.851) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BAD8)) + (segment (start 87.663 159.512) (end 86.487 159.512) (width 0.254) (layer F.Cu) (net 17)) + (segment (start 102.21 160.934) (end 102.21 159.901) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BA75)) + (segment (start 101.927002 161.216998) (end 102.21 160.934) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BA74)) + (segment (start 100.383998 161.216998) (end 101.927002 161.216998) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BA73)) + (segment (start 100.203 161.036) (end 100.383998 161.216998) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BA72)) + (segment (start 99.314 161.036) (end 100.203 161.036) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BA71)) + (via (at 99.314 161.036) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 17)) + (segment (start 98.933 161.417) (end 99.314 161.036) (width 0.254) (layer B.Cu) (net 17) (tstamp 5673BA6D)) + (segment (start 86.233 161.417) (end 98.933 161.417) (width 0.254) (layer B.Cu) (net 17) (tstamp 5673BA6C)) + (segment (start 85.852 161.036) (end 86.233 161.417) (width 0.254) (layer B.Cu) (net 17) (tstamp 5673BA6B)) + (segment (start 85.852 160.147) (end 85.852 161.036) (width 0.254) (layer B.Cu) (net 17) (tstamp 5673BA6A)) + (segment (start 86.233 159.766) (end 85.852 160.147) (width 0.254) (layer B.Cu) (net 17) (tstamp 5673BA69)) + (via (at 86.233 159.766) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 17)) + (segment (start 86.487 159.512) (end 86.233 159.766) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BA67)) + (segment (start 87.663 159.512) (end 87.663 160.782) (width 0.254) (layer F.Cu) (net 17)) + (segment (start 82.263 155.702) (end 84.201 155.702) (width 0.254) (layer F.Cu) (net 21)) + (segment (start 105.41 161.036) (end 105.41 159.901) (width 0.254) (layer F.Cu) (net 21) (tstamp 567A6C0E)) + (segment (start 104.721002 161.724998) (end 105.41 161.036) (width 0.254) (layer F.Cu) (net 21) (tstamp 567A6C0D)) + (segment (start 86.032998 161.724998) (end 104.721002 161.724998) (width 0.254) (layer F.Cu) (net 21) (tstamp 567A6C0A)) + (segment (start 85.09 160.782) (end 86.032998 161.724998) (width 0.254) (layer F.Cu) (net 21) (tstamp 567A6C09)) + (segment (start 85.09 156.591) (end 85.09 160.782) (width 0.254) (layer F.Cu) (net 21) (tstamp 567A6C08)) + (segment (start 84.201 155.702) (end 85.09 156.591) (width 0.254) (layer F.Cu) (net 21) (tstamp 567A6C06)) + (segment (start 82.263 158.242) (end 83.185 158.242) (width 0.254) (layer F.Cu) (net 22)) + (segment (start 106.21 161.125) (end 106.21 159.901) (width 0.254) (layer F.Cu) (net 22) (tstamp 5673B974)) + (segment (start 105.156 162.179) (end 106.21 161.125) (width 0.254) (layer F.Cu) (net 22) (tstamp 5673B973)) + (segment (start 84.709 162.179) (end 105.156 162.179) (width 0.254) (layer F.Cu) (net 22) (tstamp 5673B972)) + (segment (start 83.693 161.163) (end 84.709 162.179) (width 0.254) (layer F.Cu) (net 22) (tstamp 5673B971)) + (segment (start 83.693 158.75) (end 83.693 161.163) (width 0.254) (layer F.Cu) (net 22) (tstamp 5673B970)) + (segment (start 83.185 158.242) (end 83.693 158.75) (width 0.254) (layer F.Cu) (net 22) (tstamp 5673B96F)) + (segment (start 109.41 159.901) (end 109.41 156.02) (width 0.25) (layer F.Cu) (net 26)) + (segment (start 109.779 155.651) (end 111.26 155.651) (width 0.25) (layer F.Cu) (net 26) (tstamp 5675D872)) + (segment (start 109.41 156.02) (end 109.779 155.651) (width 0.25) (layer F.Cu) (net 26) (tstamp 5675D871)) + (segment (start 114.3 160.147) (end 114.3 160.401) (width 0.25) (layer F.Cu) (net 27)) + (segment (start 114.3 160.401) (end 113.919 160.782) (width 0.25) (layer F.Cu) (net 27) (tstamp 5675D854)) + (segment (start 113.919 160.782) (end 112.649 160.782) (width 0.25) (layer F.Cu) (net 27) (tstamp 5675D855)) + (segment (start 112.649 160.782) (end 111.26 159.393) (width 0.25) (layer F.Cu) (net 27) (tstamp 5675D856)) + (segment (start 111.26 159.393) (end 111.26 158.051) (width 0.25) (layer F.Cu) (net 27) (tstamp 5675D857)) + (segment (start 113.03 158.115) (end 113.03 157.353) (width 0.25) (layer F.Cu) (net 30)) + (segment (start 112.776 154.051) (end 111.26 154.051) (width 0.25) (layer F.Cu) (net 30) (tstamp 5675D883)) + (segment (start 113.284 154.559) (end 112.776 154.051) (width 0.25) (layer F.Cu) (net 30) (tstamp 5675D882)) + (segment (start 113.284 157.099) (end 113.284 154.559) (width 0.25) (layer F.Cu) (net 30) (tstamp 5675D881)) + (segment (start 113.03 157.353) (end 113.284 157.099) (width 0.25) (layer F.Cu) (net 30) (tstamp 5675D880)) + (segment (start 108.61 148.201) (end 108.61 149.327) (width 0.25) (layer F.Cu) (net 35)) + (segment (start 97.978 138.872) (end 97.285 138.872) (width 0.25) (layer F.Cu) (net 35) (tstamp 5675DEC8)) + (segment (start 98.425 139.319) (end 97.978 138.872) (width 0.25) (layer F.Cu) (net 35) (tstamp 5675DEC7)) + (via (at 98.425 139.319) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 35)) + (segment (start 98.425 146.558) (end 98.425 139.319) (width 0.25) (layer B.Cu) (net 35) (tstamp 5675DEC4)) + (segment (start 99.822 147.955) (end 98.425 146.558) (width 0.25) (layer B.Cu) (net 35) (tstamp 5675DEC3)) + (via (at 99.822 147.955) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 35)) + (segment (start 99.822 148.463) (end 99.822 147.955) (width 0.25) (layer F.Cu) (net 35) (tstamp 5675DEC0)) + (segment (start 99.822 148.59) (end 99.822 148.463) (width 0.25) (layer F.Cu) (net 35) (tstamp 5675DEBF)) + (segment (start 100.584 149.352) (end 99.822 148.59) (width 0.25) (layer F.Cu) (net 35) (tstamp 5675DEBE)) + (segment (start 108.585 149.352) (end 100.584 149.352) (width 0.25) (layer F.Cu) (net 35) (tstamp 5675DEBD)) + (segment (start 108.61 149.327) (end 108.585 149.352) (width 0.25) (layer F.Cu) (net 35) (tstamp 5675DEBC)) + (segment (start 97.285 138.872) (end 97.285 139.062) (width 0.25) (layer F.Cu) (net 35)) + (segment (start 108.585 148.226) (end 108.61 148.201) (width 0.25) (layer F.Cu) (net 35) (tstamp 5675DA3C)) + (segment (start 107.01 148.201) (end 107.01 144.958) (width 0.25) (layer F.Cu) (net 37)) + (segment (start 115.189 140.335) (end 115.189 139.24644) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBDB)) + (segment (start 114.554 140.97) (end 115.189 140.335) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBDA)) + (segment (start 110.49 140.97) (end 114.554 140.97) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBD8)) + (segment (start 108.966 142.494) (end 110.49 140.97) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBD7)) + (segment (start 108.966 143.383) (end 108.966 142.494) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBD6)) + (segment (start 107.823 144.526) (end 108.966 143.383) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBD5)) + (segment (start 107.442 144.526) (end 107.823 144.526) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBD4)) + (segment (start 107.01 144.958) (end 107.442 144.526) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBD3)) + (segment (start 115.189 139.24644) (end 115.2049 139.23054) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBDC)) + (segment (start 114.5549 139.23054) (end 114.5549 139.9531) (width 0.25) (layer F.Cu) (net 38)) + (segment (start 106.21 144.488) (end 106.21 148.201) (width 0.25) (layer F.Cu) (net 38) (tstamp 5675DBD0)) + (segment (start 106.934 143.764) (end 106.21 144.488) (width 0.25) (layer F.Cu) (net 38) (tstamp 5675DBCF)) + (segment (start 107.696 143.764) (end 106.934 143.764) (width 0.25) (layer F.Cu) (net 38) (tstamp 5675DBCE)) + (segment (start 108.331 143.129) (end 107.696 143.764) (width 0.25) (layer F.Cu) (net 38) (tstamp 5675DBCD)) + (segment (start 108.331 142.24) (end 108.331 143.129) (width 0.25) (layer F.Cu) (net 38) (tstamp 5675DBCB)) + (segment (start 110.109 140.462) (end 108.331 142.24) (width 0.25) (layer F.Cu) (net 38) (tstamp 5675DBC8)) + (segment (start 114.046 140.462) (end 110.109 140.462) (width 0.25) (layer F.Cu) (net 38) (tstamp 5675DBC7)) + (segment (start 114.5549 139.9531) (end 114.046 140.462) (width 0.25) (layer F.Cu) (net 38) (tstamp 5675DBC6)) + (segment (start 83.173 146.05) (end 83.566 146.05) (width 0.254) (layer F.Cu) (net 39)) + (segment (start 105.41 146.431) (end 105.41 148.201) (width 0.254) (layer F.Cu) (net 39) (tstamp 5673BA1A)) + (segment (start 104.394 145.415) (end 105.41 146.431) (width 0.254) (layer F.Cu) (net 39) (tstamp 5673BA19)) + (segment (start 84.201 145.415) (end 104.394 145.415) (width 0.254) (layer F.Cu) (net 39) (tstamp 5673BA18)) + (segment (start 83.566 146.05) (end 84.201 145.415) (width 0.254) (layer F.Cu) (net 39) (tstamp 5673BA17)) + (segment (start 83.173 147.701) (end 83.173 147.459) (width 0.254) (layer F.Cu) (net 40)) + (segment (start 83.173 147.459) (end 84.582 146.05) (width 0.254) (layer F.Cu) (net 40) (tstamp 5673BA23)) + (segment (start 84.582 146.05) (end 104.14 146.05) (width 0.254) (layer F.Cu) (net 40) (tstamp 5673BA24)) + (segment (start 104.14 146.05) (end 104.61 146.52) (width 0.254) (layer F.Cu) (net 40) (tstamp 5673BA26)) + (segment (start 104.61 146.52) (end 104.61 148.201) (width 0.254) (layer F.Cu) (net 40) (tstamp 5673BA27)) + (segment (start 102.21 148.201) (end 102.21 147.041) (width 0.254) (layer F.Cu) (net 41)) + (segment (start 83.947 148.578) (end 83.173 149.352) (width 0.254) (layer F.Cu) (net 41) (tstamp 5673BA32)) + (segment (start 83.947 147.701) (end 83.947 148.578) (width 0.254) (layer F.Cu) (net 41) (tstamp 5673BA30)) + (segment (start 84.963 146.685) (end 83.947 147.701) (width 0.254) (layer F.Cu) (net 41) (tstamp 5673BA2F)) + (segment (start 101.854 146.685) (end 84.963 146.685) (width 0.254) (layer F.Cu) (net 41) (tstamp 5673BA2E)) + (segment (start 102.21 147.041) (end 101.854 146.685) (width 0.254) (layer F.Cu) (net 41) (tstamp 5673BA2D)) + (segment (start 100.529 147.32) (end 101.41 148.201) (width 0.254) (layer F.Cu) (net 42) (tstamp 5673BA46)) + (segment (start 85.217 147.32) (end 100.529 147.32) (width 0.254) (layer F.Cu) (net 42) (tstamp 5673BA45)) + (segment (start 84.455 148.082) (end 85.217 147.32) (width 0.254) (layer F.Cu) (net 42) (tstamp 5673BA44)) + (segment (start 84.455 149.491) (end 84.455 148.082) (width 0.254) (layer F.Cu) (net 42)) + (segment (start 99.56 150.051) (end 103.441 150.051) (width 0.25) (layer F.Cu) (net 43)) + (segment (start 106.426 136.652) (end 107.696 135.382) (width 0.25) (layer B.Cu) (net 43) (tstamp 5675DED7)) + (segment (start 106.426 139.7) (end 106.426 136.652) (width 0.25) (layer B.Cu) (net 43) (tstamp 5675DED6)) + (segment (start 106.045 140.081) (end 106.426 139.7) (width 0.25) (layer B.Cu) (net 43) (tstamp 5675DED5)) + (via (at 106.045 140.081) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 43)) + (segment (start 105.664 140.462) (end 106.045 140.081) (width 0.25) (layer F.Cu) (net 43) (tstamp 5675DED3)) + (segment (start 105.664 143.129) (end 105.664 140.462) (width 0.25) (layer F.Cu) (net 43) (tstamp 5675DED2)) + (segment (start 105.029 143.764) (end 105.664 143.129) (width 0.25) (layer F.Cu) (net 43) (tstamp 5675DED1)) + (via (at 105.029 143.764) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 43)) + (segment (start 105.029 148.463) (end 105.029 143.764) (width 0.25) (layer B.Cu) (net 43) (tstamp 5675DECE)) + (segment (start 103.505 149.987) (end 105.029 148.463) (width 0.25) (layer B.Cu) (net 43) (tstamp 5675DECD)) + (via (at 103.505 149.987) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 43)) + (segment (start 103.441 150.051) (end 103.505 149.987) (width 0.25) (layer F.Cu) (net 43) (tstamp 5675DECB)) + (segment (start 99.56 150.851) (end 104.038 150.851) (width 0.25) (layer F.Cu) (net 44)) + (segment (start 107.696 139.827) (end 107.696 137.922) (width 0.25) (layer B.Cu) (net 44) (tstamp 5675DEFC)) + (segment (start 107.569 139.954) (end 107.696 139.827) (width 0.25) (layer B.Cu) (net 44) (tstamp 5675DEFB)) + (via (at 107.569 139.954) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 44)) + (segment (start 106.299 141.224) (end 107.569 139.954) (width 0.25) (layer F.Cu) (net 44) (tstamp 5675DEF7)) + (segment (start 106.299 143.51) (end 106.299 141.224) (width 0.25) (layer F.Cu) (net 44) (tstamp 5675DEF6)) + (segment (start 106.045 143.764) (end 106.299 143.51) (width 0.25) (layer F.Cu) (net 44) (tstamp 5675DEF5)) + (via (at 106.045 143.764) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 44)) + (segment (start 106.045 149.225) (end 106.045 143.764) (width 0.25) (layer B.Cu) (net 44) (tstamp 5675DEF3)) + (segment (start 105.283 149.987) (end 106.045 149.225) (width 0.25) (layer B.Cu) (net 44) (tstamp 5675DEF2)) + (via (at 105.283 149.987) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 44)) + (segment (start 104.902 149.987) (end 105.283 149.987) (width 0.25) (layer F.Cu) (net 44) (tstamp 5675DEF0)) + (segment (start 104.038 150.851) (end 104.902 149.987) (width 0.25) (layer F.Cu) (net 44) (tstamp 5675DEEF)) + (segment (start 87.663 153.162) (end 87.663 152.24) (width 0.254) (layer F.Cu) (net 48)) + (segment (start 97.65 156.451) (end 99.56 156.451) (width 0.254) (layer F.Cu) (net 48) (tstamp 5673BACB)) + (segment (start 97.282 156.083) (end 97.65 156.451) (width 0.254) (layer F.Cu) (net 48) (tstamp 5673BACA)) + (via (at 97.282 156.083) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 48)) + (segment (start 97.282 155.067) (end 97.282 156.083) (width 0.254) (layer B.Cu) (net 48) (tstamp 5673BAC7)) + (segment (start 95.377 153.162) (end 97.282 155.067) (width 0.254) (layer B.Cu) (net 48) (tstamp 5673BAC5)) + (segment (start 92.837 153.162) (end 95.377 153.162) (width 0.254) (layer B.Cu) (net 48) (tstamp 5673BAC3)) + (segment (start 91.44 151.765) (end 92.837 153.162) (width 0.254) (layer B.Cu) (net 48) (tstamp 5673BAC1)) + (segment (start 88.138 151.765) (end 91.44 151.765) (width 0.254) (layer B.Cu) (net 48) (tstamp 5673BAC0)) + (segment (start 87.757 152.146) (end 88.138 151.765) (width 0.254) (layer B.Cu) (net 48) (tstamp 5673BABF)) + (via (at 87.757 152.146) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 48)) + (segment (start 87.663 152.24) (end 87.757 152.146) (width 0.254) (layer F.Cu) (net 48) (tstamp 5673BABD)) + (segment (start 87.663 154.432) (end 87.663 153.162) (width 0.254) (layer F.Cu) (net 48)) + (segment (start 91.567 157.734) (end 91.567 153.162) (width 0.254) (layer B.Cu) (net 50)) + (segment (start 90.932 152.781) (end 90.666 153.047) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673BA97)) + (segment (start 91.186 152.781) (end 90.932 152.781) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673BA96)) + (segment (start 91.567 153.162) (end 91.186 152.781) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673BA95)) + (via (at 91.567 153.162) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 50)) + (segment (start 90.666 153.047) (end 90.666 153.416) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673BA98)) + (segment (start 91.567 157.734) (end 92.202 157.734) (width 0.254) (layer B.Cu) (net 50)) + (segment (start 97.854 158.051) (end 99.56 158.051) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673BA7C)) + (segment (start 97.663 158.242) (end 97.854 158.051) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673BA7B)) + (via (at 97.663 158.242) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 50)) + (segment (start 92.71 158.242) (end 97.663 158.242) (width 0.254) (layer B.Cu) (net 50) (tstamp 5673BA79)) + (segment (start 92.202 157.734) (end 92.71 158.242) (width 0.254) (layer B.Cu) (net 50) (tstamp 5673BA78)) + (segment (start 90.666 158.508) (end 91.44 157.734) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673B34D)) + (via (at 91.567 157.734) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 50)) + (segment (start 91.44 157.734) (end 91.567 157.734) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673B34E)) + (segment (start 89.039 150.114) (end 89.039 151.765) (width 0.254) (layer F.Cu) (net 50)) + (segment (start 90.666 153.416) (end 90.666 153.404) (width 0.254) (layer F.Cu) (net 50)) + (segment (start 90.666 153.404) (end 89.039 151.777) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673B35F)) + (segment (start 89.039 151.777) (end 89.039 151.765) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673B360)) + (segment (start 90.666 158.877) (end 90.666 158.508) (width 0.254) (layer F.Cu) (net 50)) + (segment (start 76.2 149.86) (end 77.597 149.86) (width 0.254) (layer F.Cu) (net 52)) + (segment (start 78.74 151.003) (end 81.546 151.003) (width 0.254) (layer F.Cu) (net 52) (tstamp 5673BA09)) + (segment (start 77.597 149.86) (end 78.74 151.003) (width 0.254) (layer F.Cu) (net 52) (tstamp 5673BA08)) + (segment (start 79.006 149.352) (end 78.486 149.352) (width 0.254) (layer F.Cu) (net 53)) + (segment (start 77.47 148.59) (end 76.2 147.32) (width 0.254) (layer F.Cu) (net 53) (tstamp 5673BA05)) + (segment (start 77.724 148.59) (end 77.47 148.59) (width 0.254) (layer F.Cu) (net 53) (tstamp 5673BA04)) + (segment (start 78.486 149.352) (end 77.724 148.59) (width 0.254) (layer F.Cu) (net 53) (tstamp 5673BA03)) + (segment (start 79.006 147.701) (end 78.867 147.701) (width 0.254) (layer F.Cu) (net 54)) + (segment (start 78.867 147.701) (end 77.851 146.685) (width 0.254) (layer F.Cu) (net 54) (tstamp 5673B9FC)) + (segment (start 77.851 146.685) (end 77.851 145.034) (width 0.254) (layer F.Cu) (net 54) (tstamp 5673B9FD)) + (segment (start 77.851 145.034) (end 77.597 144.78) (width 0.254) (layer F.Cu) (net 54) (tstamp 5673B9FF)) + (segment (start 77.597 144.78) (end 76.2 144.78) (width 0.254) (layer F.Cu) (net 54) (tstamp 5673BA00)) + (segment (start 76.454 144.78) (end 76.2 144.78) (width 0.254) (layer F.Cu) (net 54) (tstamp 5673B435)) + (segment (start 79.006 146.05) (end 79.006 144.03) (width 0.254) (layer F.Cu) (net 55)) + (segment (start 79.006 144.03) (end 77.216 142.24) (width 0.254) (layer F.Cu) (net 55) (tstamp 5673B9F1)) + (segment (start 77.216 142.24) (end 76.2 142.24) (width 0.254) (layer F.Cu) (net 55) (tstamp 5673B9F2)) + (segment (start 113.665 158.115) (end 113.665 157.861) (width 0.25) (layer F.Cu) (net 56)) + (segment (start 113.665 157.861) (end 114.046 157.48) (width 0.25) (layer F.Cu) (net 56) (tstamp 5675D863)) + (segment (start 114.046 157.48) (end 116.84 157.48) (width 0.25) (layer F.Cu) (net 56) (tstamp 5675D864)) + (segment (start 113.665 160.147) (end 113.665 159.639) (width 0.25) (layer F.Cu) (net 57)) + (segment (start 113.792 159.512) (end 116.332 159.512) (width 0.25) (layer F.Cu) (net 57) (tstamp 5675D85C)) + (segment (start 113.665 159.639) (end 113.792 159.512) (width 0.25) (layer F.Cu) (net 57) (tstamp 5675D85B)) + (segment (start 116.332 159.512) (end 116.84 160.02) (width 0.25) (layer F.Cu) (net 57) (tstamp 5675D85D)) + (segment (start 89.166 155.067) (end 89.166 153.416) (width 0.254) (layer F.Cu) (net 58)) + (segment (start 87.663 155.702) (end 88.531 155.702) (width 0.254) (layer F.Cu) (net 58)) + (segment (start 88.531 155.702) (end 89.166 155.067) (width 0.254) (layer F.Cu) (net 58) (tstamp 5673B2E6)) + (segment (start 89.166 160.528) (end 89.166 158.877) (width 0.254) (layer F.Cu) (net 59)) + (segment (start 89.166 158.877) (end 89.166 158.635) (width 0.254) (layer F.Cu) (net 59)) + (segment (start 89.166 158.635) (end 88.773 158.242) (width 0.254) (layer F.Cu) (net 59) (tstamp 5673B2DC)) + (segment (start 88.773 158.242) (end 87.663 158.242) (width 0.254) (layer F.Cu) (net 59) (tstamp 5673B2DD)) + (segment (start 87.79 158.115) (end 87.663 158.242) (width 0.254) (layer F.Cu) (net 59) (tstamp 5673B248)) + (segment (start 80.506 146.05) (end 81.673 146.05) (width 0.25) (layer F.Cu) (net 60)) + (segment (start 80.506 147.701) (end 81.673 147.701) (width 0.25) (layer F.Cu) (net 61)) + (segment (start 80.506 149.352) (end 81.673 149.352) (width 0.25) (layer F.Cu) (net 62)) + (segment (start 84.455 150.991) (end 83.058 150.991) (width 0.254) (layer F.Cu) (net 63)) + (segment (start 83.058 150.991) (end 83.046 151.003) (width 0.254) (layer F.Cu) (net 63) (tstamp 5673BA41)) + (segment (start 80.391 153.555) (end 80.391 153.543) (width 0.254) (layer F.Cu) (net 64)) + (segment (start 80.391 153.543) (end 79.998 153.15) (width 0.254) (layer F.Cu) (net 64) (tstamp 5673B124)) + (segment (start 79.998 153.15) (end 79.998 152.146) (width 0.254) (layer F.Cu) (net 64) (tstamp 5673B125)) + (segment (start 82.263 154.432) (end 82.263 153.162) (width 0.254) (layer F.Cu) (net 65)) + (segment (start 80.911 155.055) (end 81.534 154.432) (width 0.254) (layer F.Cu) (net 65) (tstamp 5673B36A)) + (segment (start 81.534 154.432) (end 82.263 154.432) (width 0.254) (layer F.Cu) (net 65) (tstamp 5673B36B)) + (segment (start 80.391 155.055) (end 80.911 155.055) (width 0.254) (layer F.Cu) (net 65)) + (segment (start 80.391 158.889) (end 80.391 158.75) (width 0.254) (layer F.Cu) (net 66)) + (segment (start 80.391 158.75) (end 79.998 158.357) (width 0.254) (layer F.Cu) (net 66) (tstamp 5673B145)) + (segment (start 79.998 158.357) (end 79.998 157.48) (width 0.254) (layer F.Cu) (net 66) (tstamp 5673B146)) + (segment (start 82.263 159.512) (end 82.263 160.782) (width 0.254) (layer F.Cu) (net 67)) + (segment (start 80.391 160.389) (end 80.887 160.389) (width 0.254) (layer F.Cu) (net 67)) + (segment (start 81.28 160.782) (end 82.263 160.782) (width 0.254) (layer F.Cu) (net 67) (tstamp 5673B36F)) + (segment (start 80.887 160.389) (end 81.28 160.782) (width 0.254) (layer F.Cu) (net 67) (tstamp 5673B36E)) + +) diff --git a/PCB/WOT/Tinylab_proto1.kicad_pcb-bak b/PCB/WOT/Tinylab_proto1.kicad_pcb-bak new file mode 100644 index 00000000..b595887b --- /dev/null +++ b/PCB/WOT/Tinylab_proto1.kicad_pcb-bak @@ -0,0 +1,2551 @@ +(kicad_pcb (version 4) (host pcbnew "(2015-08-05 BZR 6055, Git fa29c62)-product") + + (general + (links 113) + (no_connects 6) + (area 72.535 130.44446 120.001667 163.587) + (thickness 1.6) + (drawings 5) + (tracks 539) + (zones 0) + (modules 51) + (nets 68) + ) + + (page A4) + (layers + (0 F.Cu signal) + (31 B.Cu signal) + (32 B.Adhes user hide) + (33 F.Adhes user hide) + (34 B.Paste user hide) + (35 F.Paste user hide) + (36 B.SilkS user hide) + (37 F.SilkS user) + (38 B.Mask user hide) + (39 F.Mask user hide) + (40 Dwgs.User user hide) + (41 Cmts.User user hide) + (42 Eco1.User user hide) + (43 Eco2.User user hide) + (44 Edge.Cuts user hide) + (45 Margin user hide) + (46 B.CrtYd user hide) + (47 F.CrtYd user) + (48 B.Fab user hide) + (49 F.Fab user hide) + ) + + (setup + (last_trace_width 0.25) + (user_trace_width 0.254) + (user_trace_width 0.508) + (user_trace_width 1.016) + (trace_clearance 0.2) + (zone_clearance 0.508) + (zone_45_only no) + (trace_min 0.2) + (segment_width 0.2) + (edge_width 0.1) + (via_size 0.6) + (via_drill 0.4) + (via_min_size 0.4) + (via_min_drill 0.3) + (uvia_size 0.3) + (uvia_drill 0.1) + (uvias_allowed no) + (uvia_min_size 0.2) + (uvia_min_drill 0.1) + (pcb_text_width 0.3) + (pcb_text_size 1.5 1.5) + (mod_edge_width 0.15) + (mod_text_size 1 1) + (mod_text_width 0.15) + (pad_size 1.5 1.5) + (pad_drill 0.6) + (pad_to_mask_clearance 0) + (aux_axis_origin 0 0) + (visible_elements 7FFFF361) + (pcbplotparams + (layerselection 0x010f0_80000001) + (usegerberextensions false) + (excludeedgelayer true) + (linewidth 0.100000) + (plotframeref false) + (viasonmask false) + (mode 1) + (useauxorigin false) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15) + (hpglpenoverlay 2) + (psnegative false) + (psa4output false) + (plotreference true) + (plotvalue true) + (plotinvisibletext false) + (padsonsilk false) + (subtractmaskfromsilk false) + (outputformat 1) + (mirror false) + (drillshape 0) + (scaleselection 1) + (outputdirectory OUTPUT_V2/)) + ) + + (net 0 "") + (net 1 "Net-(C1-Pad1)") + (net 2 "Net-(C1-Pad2)") + (net 3 "Net-(C2-Pad1)") + (net 4 "Net-(C2-Pad2)") + (net 5 +5V) + (net 6 /AGND) + (net 7 /AVCC) + (net 8 /VGND) + (net 9 /VCC_PSU) + (net 10 "Net-(C7-Pad1)") + (net 11 "Net-(C7-Pad2)") + (net 12 "Net-(C11-Pad1)") + (net 13 "Net-(C14-Pad1)") + (net 14 "Net-(C14-Pad2)") + (net 15 "Net-(D1-Pad2)") + (net 16 /PSU_FEEDBACK) + (net 17 /CH2) + (net 18 "Net-(IC1-Pad3)") + (net 19 "Net-(IC1-Pad4)") + (net 20 "Net-(IC1-Pad5)") + (net 21 /DAC_OUT) + (net 22 /DAC_OUT2) + (net 23 "Net-(IC1-Pad8)") + (net 24 "Net-(IC1-Pad9)") + (net 25 "Net-(IC1-Pad10)") + (net 26 /XCK) + (net 27 /DIG_CH2) + (net 28 "Net-(IC1-Pad13)") + (net 29 "Net-(IC1-Pad16)") + (net 30 /DIG_CH1) + (net 31 "Net-(IC1-Pad20)") + (net 32 "Net-(IC1-Pad21)") + (net 33 "Net-(IC1-Pad22)") + (net 34 "Net-(IC1-Pad23)") + (net 35 /PSU_PWM) + (net 36 "Net-(IC1-Pad25)") + (net 37 /D-) + (net 38 /D+) + (net 39 "Net-(IC1-Pad28)") + (net 40 "Net-(IC1-Pad29)") + (net 41 "Net-(IC1-Pad32)") + (net 42 "Net-(IC1-Pad33)") + (net 43 "Net-(IC1-Pad34)") + (net 44 "Net-(IC1-Pad35)") + (net 45 "Net-(IC1-Pad36)") + (net 46 "Net-(IC1-Pad37)") + (net 47 "Net-(IC1-Pad41)") + (net 48 /CH1) + (net 49 "Net-(IC1-Pad43)") + (net 50 /AVCC_ON_2) + (net 51 "Net-(P2-Pad4)") + (net 52 "Net-(P3-Pad1)") + (net 53 "Net-(P3-Pad2)") + (net 54 "Net-(P3-Pad3)") + (net 55 "Net-(P3-Pad4)") + (net 56 "Net-(P8-Pad1)") + (net 57 "Net-(P8-Pad2)") + (net 58 "Net-(R1-Pad1)") + (net 59 "Net-(R2-Pad1)") + (net 60 "Net-(R11-Pad2)") + (net 61 "Net-(R12-Pad2)") + (net 62 "Net-(R13-Pad2)") + (net 63 "Net-(R10-Pad1)") + (net 64 "Net-(R15-Pad1)") + (net 65 "Net-(R15-Pad2)") + (net 66 "Net-(R17-Pad1)") + (net 67 "Net-(R17-Pad2)") + + (net_class Default "This is the default net class." + (clearance 0.2) + (trace_width 0.25) + (via_dia 0.6) + (via_drill 0.4) + (uvia_dia 0.3) + (uvia_drill 0.1) + (add_net +5V) + (add_net /AGND) + (add_net /AVCC) + (add_net /AVCC_ON_2) + (add_net /CH1) + (add_net /CH2) + (add_net /D+) + (add_net /D-) + (add_net /DAC_OUT) + (add_net /DAC_OUT2) + (add_net /DIG_CH1) + (add_net /DIG_CH2) + (add_net /PSU_FEEDBACK) + (add_net /PSU_PWM) + (add_net /VCC_PSU) + (add_net /VGND) + (add_net /XCK) + (add_net "Net-(C1-Pad1)") + (add_net "Net-(C1-Pad2)") + (add_net "Net-(C11-Pad1)") + (add_net "Net-(C14-Pad1)") + (add_net "Net-(C14-Pad2)") + (add_net "Net-(C2-Pad1)") + (add_net "Net-(C2-Pad2)") + (add_net "Net-(C7-Pad1)") + (add_net "Net-(C7-Pad2)") + (add_net "Net-(D1-Pad2)") + (add_net "Net-(IC1-Pad10)") + (add_net "Net-(IC1-Pad13)") + (add_net "Net-(IC1-Pad16)") + (add_net "Net-(IC1-Pad20)") + (add_net "Net-(IC1-Pad21)") + (add_net "Net-(IC1-Pad22)") + (add_net "Net-(IC1-Pad23)") + (add_net "Net-(IC1-Pad25)") + (add_net "Net-(IC1-Pad28)") + (add_net "Net-(IC1-Pad29)") + (add_net "Net-(IC1-Pad3)") + (add_net "Net-(IC1-Pad32)") + (add_net "Net-(IC1-Pad33)") + (add_net "Net-(IC1-Pad34)") + (add_net "Net-(IC1-Pad35)") + (add_net "Net-(IC1-Pad36)") + (add_net "Net-(IC1-Pad37)") + (add_net "Net-(IC1-Pad4)") + (add_net "Net-(IC1-Pad41)") + (add_net "Net-(IC1-Pad43)") + (add_net "Net-(IC1-Pad5)") + (add_net "Net-(IC1-Pad8)") + (add_net "Net-(IC1-Pad9)") + (add_net "Net-(P2-Pad4)") + (add_net "Net-(P3-Pad1)") + (add_net "Net-(P3-Pad2)") + (add_net "Net-(P3-Pad3)") + (add_net "Net-(P3-Pad4)") + (add_net "Net-(P8-Pad1)") + (add_net "Net-(P8-Pad2)") + (add_net "Net-(R1-Pad1)") + (add_net "Net-(R10-Pad1)") + (add_net "Net-(R11-Pad2)") + (add_net "Net-(R12-Pad2)") + (add_net "Net-(R13-Pad2)") + (add_net "Net-(R15-Pad1)") + (add_net "Net-(R15-Pad2)") + (add_net "Net-(R17-Pad1)") + (add_net "Net-(R17-Pad2)") + (add_net "Net-(R2-Pad1)") + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5D27) (tstamp 5673A8B8) + (at 91.186 156.591) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CAB611) + (attr smd) + (fp_text reference C1 (at 1.016 -1.2954) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 2 "Net-(C1-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5EFE) (tstamp 5673A8BE) + (at 91.948 159.766 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CAB4DE) + (attr smd) + (fp_text reference C2 (at -2.21996 0.28448 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 4 "Net-(C2-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5D0A) (tstamp 5673A8C4) + (at 111.887 142.621) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB13E1) + (attr smd) + (fp_text reference C3 (at 0.0254 -1.2954) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at 0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5D1B) (tstamp 5673A8CA) + (at 111.506 147.193 180) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB147C) + (attr smd) + (fp_text reference C4 (at -0.1524 -1.2954 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5DA3) (tstamp 5673A8D0) + (at 91.821 151.003 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55D60181) + (attr smd) + (fp_text reference C5 (at 1.905 0.8382 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5 (layer F.Cu) (tedit 567B5BB7) (tstamp 5673A8D6) + (at 78.994 136.906 180) + (descr "Radial Electrolytic Capacitor, Diameter 6.3mm x Length 11.2mm, Pitch 2.5mm") + (tags "Electrolytic Capacitor") + (path /560719D9) + (fp_text reference C6 (at 0.127 -1.651 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.25 4.4 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.325 -3.149) (end 1.325 3.149) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.465 -3.143) (end 1.465 3.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 -3.13) (end 1.605 -0.446) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 0.446) (end 1.605 3.13) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 -3.111) (end 1.745 -0.656) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 0.656) (end 1.745 3.111) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 -3.085) (end 1.885 -0.789) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 0.789) (end 1.885 3.085) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 -3.053) (end 2.025 -0.88) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 0.88) (end 2.025 3.053) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 -3.014) (end 2.165 -0.942) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 0.942) (end 2.165 3.014) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 -2.968) (end 2.305 -0.981) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 0.981) (end 2.305 2.968) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 -2.915) (end 2.445 -0.998) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 0.998) (end 2.445 2.915) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 -2.853) (end 2.585 -0.996) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 0.996) (end 2.585 2.853) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 -2.783) (end 2.725 -0.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 0.974) (end 2.725 2.783) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 -2.704) (end 2.865 -0.931) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 0.931) (end 2.865 2.704) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 -2.616) (end 3.005 -0.863) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 0.863) (end 3.005 2.616) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 -2.516) (end 3.145 -0.764) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 0.764) (end 3.145 2.516) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 -2.404) (end 3.285 -0.619) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 0.619) (end 3.285 2.404) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 -2.279) (end 3.425 -0.38) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 0.38) (end 3.425 2.279) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.565 -2.136) (end 3.565 2.136) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.705 -1.974) (end 3.705 1.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.845 -1.786) (end 3.845 1.786) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.985 -1.563) (end 3.985 1.563) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.125 -1.287) (end 4.125 1.287) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.265 -0.912) (end 4.265 0.912) (layer F.SilkS) (width 0.15)) + (fp_circle (center 2.5 0) (end 2.5 -1) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.1875) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.4) (layer F.CrtYd) (width 0.05)) + (pad 2 thru_hole circle (at 2.5 0 180) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 8 /VGND)) + (pad 1 thru_hole rect (at 0 0 180) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 9 /VCC_PSU)) + (model Capacitors_ThroughHole.3dshapes/C_Radial_D6.3_L11.2_P2.5.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 5673A8DC) + (at 78.74 154.432 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB630B) + (attr smd) + (fp_text reference C7 (at 0 -1.9 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 10 "Net-(C7-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 11 "Net-(C7-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5E33) (tstamp 5673A8E2) + (at 81.28 143.51 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /56071A50) + (attr smd) + (fp_text reference C8 (at -0.0508 1.397 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 /VCC_PSU)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 8 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5CDA) (tstamp 5673A8E8) + (at 97.536 141.351 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55D75F49) + (attr smd) + (fp_text reference C9 (at -2.413 -0.254 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 8 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5D24) (tstamp 5673A8EE) + (at 97.79 153.035 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /5609699F) + (attr smd) + (fp_text reference C10 (at -0.0762 -1.27 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5 (layer F.Cu) (tedit 567B5E4A) (tstamp 5673A8F4) + (at 93.345 143.891 90) + (descr "Radial Electrolytic Capacitor, Diameter 6.3mm x Length 11.2mm, Pitch 2.5mm") + (tags "Electrolytic Capacitor") + (path /560735FE) + (fp_text reference C11 (at -1.4732 0.127 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.25 4.4 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.325 -3.149) (end 1.325 3.149) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.465 -3.143) (end 1.465 3.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 -3.13) (end 1.605 -0.446) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 0.446) (end 1.605 3.13) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 -3.111) (end 1.745 -0.656) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 0.656) (end 1.745 3.111) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 -3.085) (end 1.885 -0.789) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 0.789) (end 1.885 3.085) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 -3.053) (end 2.025 -0.88) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 0.88) (end 2.025 3.053) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 -3.014) (end 2.165 -0.942) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 0.942) (end 2.165 3.014) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 -2.968) (end 2.305 -0.981) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 0.981) (end 2.305 2.968) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 -2.915) (end 2.445 -0.998) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 0.998) (end 2.445 2.915) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 -2.853) (end 2.585 -0.996) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 0.996) (end 2.585 2.853) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 -2.783) (end 2.725 -0.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 0.974) (end 2.725 2.783) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 -2.704) (end 2.865 -0.931) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 0.931) (end 2.865 2.704) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 -2.616) (end 3.005 -0.863) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 0.863) (end 3.005 2.616) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 -2.516) (end 3.145 -0.764) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 0.764) (end 3.145 2.516) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 -2.404) (end 3.285 -0.619) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 0.619) (end 3.285 2.404) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 -2.279) (end 3.425 -0.38) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 0.38) (end 3.425 2.279) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.565 -2.136) (end 3.565 2.136) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.705 -1.974) (end 3.705 1.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.845 -1.786) (end 3.845 1.786) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.985 -1.563) (end 3.985 1.563) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.125 -1.287) (end 4.125 1.287) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.265 -0.912) (end 4.265 0.912) (layer F.SilkS) (width 0.15)) + (fp_circle (center 2.5 0) (end 2.5 -1) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.1875) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.4) (layer F.CrtYd) (width 0.05)) + (pad 2 thru_hole circle (at 2.5 0 90) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 8 /VGND)) + (pad 1 thru_hole rect (at 0 0 90) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 12 "Net-(C11-Pad1)")) + (model Capacitors_ThroughHole.3dshapes/C_Radial_D6.3_L11.2_P2.5.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5E45) (tstamp 5673A8FA) + (at 88.9 143.129 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /5607355F) + (attr smd) + (fp_text reference C12 (at -2.1082 0.4064 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 12 "Net-(C11-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 8 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5415D631) (tstamp 5673A900) + (at 114.427 152.527 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /5608B4BE) + (attr smd) + (fp_text reference C13 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 567B5E84) (tstamp 5673A906) + (at 78.74 159.766 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /566DF655) + (attr smd) + (fp_text reference C14 (at 13.6144 6.731 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 13 "Net-(C14-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 14 "Net-(C14-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_ThroughHole:C_Radial_D6.3_L11.2_P2.5 (layer F.Cu) (tedit 567B5BBA) (tstamp 5673A90C) + (at 116.078 144.018 270) + (descr "Radial Electrolytic Capacitor, Diameter 6.3mm x Length 11.2mm, Pitch 2.5mm") + (tags "Electrolytic Capacitor") + (path /566F5A75) + (fp_text reference C15 (at -0.254 -1.397 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.25 4.4 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.325 -3.149) (end 1.325 3.149) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.465 -3.143) (end 1.465 3.143) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 -3.13) (end 1.605 -0.446) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.605 0.446) (end 1.605 3.13) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 -3.111) (end 1.745 -0.656) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.745 0.656) (end 1.745 3.111) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 -3.085) (end 1.885 -0.789) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.885 0.789) (end 1.885 3.085) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 -3.053) (end 2.025 -0.88) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.025 0.88) (end 2.025 3.053) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 -3.014) (end 2.165 -0.942) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.165 0.942) (end 2.165 3.014) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 -2.968) (end 2.305 -0.981) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.305 0.981) (end 2.305 2.968) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 -2.915) (end 2.445 -0.998) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.445 0.998) (end 2.445 2.915) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 -2.853) (end 2.585 -0.996) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.585 0.996) (end 2.585 2.853) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 -2.783) (end 2.725 -0.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.725 0.974) (end 2.725 2.783) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 -2.704) (end 2.865 -0.931) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.865 0.931) (end 2.865 2.704) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 -2.616) (end 3.005 -0.863) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.005 0.863) (end 3.005 2.616) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 -2.516) (end 3.145 -0.764) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.145 0.764) (end 3.145 2.516) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 -2.404) (end 3.285 -0.619) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.285 0.619) (end 3.285 2.404) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 -2.279) (end 3.425 -0.38) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.425 0.38) (end 3.425 2.279) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.565 -2.136) (end 3.565 2.136) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.705 -1.974) (end 3.705 1.974) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.845 -1.786) (end 3.845 1.786) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.985 -1.563) (end 3.985 1.563) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.125 -1.287) (end 4.125 1.287) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.265 -0.912) (end 4.265 0.912) (layer F.SilkS) (width 0.15)) + (fp_circle (center 2.5 0) (end 2.5 -1) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.1875) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.25 0) (end 1.25 -3.4) (layer F.CrtYd) (width 0.05)) + (pad 2 thru_hole circle (at 2.5 0 270) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 1 thru_hole rect (at 0 0 270) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS) + (net 7 /AVCC)) + (model Capacitors_ThroughHole.3dshapes/C_Radial_D6.3_L11.2_P2.5.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10 (layer F.Cu) (tedit 567B5BAF) (tstamp 5673A912) + (at 82.55 135.128) + (descr "Diode, DO-41, SOD81, Horizontal, RM 10mm,") + (tags "Diode, DO-41, SOD81, Horizontal, RM 10mm, 1N4007, SB140,") + (path /5606FDB4) + (fp_text reference D1 (at 4.445 2.921) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value D_Schottky (at 4.37134 -3.55854) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 7.62 -0.00254) (end 8.636 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -0.00254) (end 1.524 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.048 -1.27254) (end 3.048 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.302 -1.27254) (end 3.302 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.556 -1.27254) (end 3.556 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -1.27254) (end 2.794 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.175 -1.27254) (end 3.175 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 1.26746) (end 2.54 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 7.62 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 -1.27254) (end 7.62 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 1.26746) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at 10.16 -0.00254 180) (size 1.99898 1.99898) (drill 1.27) (layers *.Cu *.Mask F.SilkS) + (net 15 "Net-(D1-Pad2)")) + (pad 1 thru_hole rect (at 0 -0.00254 180) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.Mask F.SilkS) + (net 12 "Net-(C11-Pad1)")) + ) + + (module Capacitors_SMD:C_1206 (layer F.Cu) (tedit 5415D7BD) (tstamp 5673A918) + (at 105.791 142.113 180) + (descr "Capacitor SMD 1206, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 1206") + (path /55D739F3) + (attr smd) + (fp_text reference F1 (at 0 -2.3 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value F_Small (at 0 2.3 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -2.3 -1.15) (end 2.3 -1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.3 1.15) (end 2.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.3 -1.15) (end -2.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 2.3 -1.15) (end 2.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 -1.025) (end -1 -1.025) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 1.025) (end 1 1.025) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.5 0 180) (size 1 1.6) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 2 smd rect (at 1.5 0 180) (size 1 1.6) (layers F.Cu F.Paste F.Mask) + (net 8 /VGND)) + (model Capacitors_SMD.3dshapes/C_1206.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm (layer F.Cu) (tedit 567B5D1F) (tstamp 5673A948) + (at 105.41 154.051 90) + (descr "LQFP44 (see Appnote_PCB_Guidelines_TRINAMIC_packages.pdf)") + (tags "QFP 0.8") + (path /55CA8F25) + (attr smd) + (fp_text reference IC1 (at -0.0762 0.3048 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value ATXMEGA16A4U-A (at 0 7.65 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -6.9 -6.9) (end -6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start 6.9 -6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 -6.9) (end 6.9 -6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.175 -5.175) (end -5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -5.175) (end -4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -4.505) (end -6.65 -4.505) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -5.85 -4 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 16 /PSU_FEEDBACK)) + (pad 2 smd rect (at -5.85 -3.2 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (pad 3 smd rect (at -5.85 -2.4 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 18 "Net-(IC1-Pad3)")) + (pad 4 smd rect (at -5.85 -1.6 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 19 "Net-(IC1-Pad4)")) + (pad 5 smd rect (at -5.85 -0.8 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 20 "Net-(IC1-Pad5)")) + (pad 6 smd rect (at -5.85 0 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 21 /DAC_OUT)) + (pad 7 smd rect (at -5.85 0.8 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 22 /DAC_OUT2)) + (pad 8 smd rect (at -5.85 1.6 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 23 "Net-(IC1-Pad8)")) + (pad 9 smd rect (at -5.85 2.4 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 24 "Net-(IC1-Pad9)")) + (pad 10 smd rect (at -5.85 3.2 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 25 "Net-(IC1-Pad10)")) + (pad 11 smd rect (at -5.85 4 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 26 /XCK)) + (pad 12 smd rect (at -4 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 27 /DIG_CH2)) + (pad 13 smd rect (at -3.2 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 28 "Net-(IC1-Pad13)")) + (pad 14 smd rect (at -2.4 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 15 smd rect (at -1.6 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 26 /XCK)) + (pad 16 smd rect (at -0.8 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 29 "Net-(IC1-Pad16)")) + (pad 17 smd rect (at 0 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 30 /DIG_CH1)) + (pad 18 smd rect (at 0.8 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 19 smd rect (at 1.6 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 20 smd rect (at 2.4 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 31 "Net-(IC1-Pad20)")) + (pad 21 smd rect (at 3.2 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 32 "Net-(IC1-Pad21)")) + (pad 22 smd rect (at 4 5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 33 "Net-(IC1-Pad22)")) + (pad 23 smd rect (at 5.85 4 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 34 "Net-(IC1-Pad23)")) + (pad 24 smd rect (at 5.85 3.2 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 35 /PSU_PWM)) + (pad 25 smd rect (at 5.85 2.4 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 36 "Net-(IC1-Pad25)")) + (pad 26 smd rect (at 5.85 1.6 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 37 /D-)) + (pad 27 smd rect (at 5.85 0.8 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 38 /D+)) + (pad 28 smd rect (at 5.85 0 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 39 "Net-(IC1-Pad28)")) + (pad 29 smd rect (at 5.85 -0.8 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 40 "Net-(IC1-Pad29)")) + (pad 30 smd rect (at 5.85 -1.6 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 31 smd rect (at 5.85 -2.4 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 32 smd rect (at 5.85 -3.2 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 41 "Net-(IC1-Pad32)")) + (pad 33 smd rect (at 5.85 -4 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 42 "Net-(IC1-Pad33)")) + (pad 34 smd rect (at 4 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 43 "Net-(IC1-Pad34)")) + (pad 35 smd rect (at 3.2 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 44 "Net-(IC1-Pad35)")) + (pad 36 smd rect (at 2.4 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 45 "Net-(IC1-Pad36)")) + (pad 37 smd rect (at 1.6 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 46 "Net-(IC1-Pad37)")) + (pad 38 smd rect (at 0.8 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 39 smd rect (at 0 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 40 smd rect (at -0.8 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (pad 41 smd rect (at -1.6 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 47 "Net-(IC1-Pad41)")) + (pad 42 smd rect (at -2.4 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 48 /CH1)) + (pad 43 smd rect (at -3.2 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 49 "Net-(IC1-Pad43)")) + (pad 44 smd rect (at -4 -5.85 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 50 /AVCC_ON_2)) + (model Housings_QFP.3dshapes/LQFP-44_10x10mm_Pitch0.8mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10 (layer F.Cu) (tedit 567B5BAC) (tstamp 5673A94E) + (at 92.456 137.922 180) + (descr "Diode, DO-41, SOD81, Horizontal, RM 10mm,") + (tags "Diode, DO-41, SOD81, Horizontal, RM 10mm, 1N4007, SB140,") + (path /5606EE9E) + (fp_text reference L1 (at 4.572 2.667 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value INDUCTOR (at 4.37134 -3.55854 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 7.62 -0.00254) (end 8.636 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -0.00254) (end 1.524 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.048 -1.27254) (end 3.048 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.302 -1.27254) (end 3.302 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.556 -1.27254) (end 3.556 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -1.27254) (end 2.794 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.175 -1.27254) (end 3.175 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 1.26746) (end 2.54 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 7.62 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 -1.27254) (end 7.62 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 1.26746) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at 10.16 -0.00254) (size 1.99898 1.99898) (drill 1.27) (layers *.Cu *.Mask F.SilkS) + (net 9 /VCC_PSU)) + (pad 1 thru_hole rect (at 0 -0.00254) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.Mask F.SilkS) + (net 15 "Net-(D1-Pad2)")) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 (layer F.Cu) (tedit 567B5BDC) (tstamp 5673A956) + (at 94.488 159.512 180) + (descr "Through hole pin header") + (tags "pin header") + (path /55CAB35C) + (fp_text reference P1 (at -2.54 -0.254 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SCOPE_IN (at 0 -3.1 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 3 "Net-(C2-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 4 "Net-(C2-Pad2)")) + (pad 3 thru_hole oval (at 0 5.08 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 2 "Net-(C1-Pad2)")) + (pad 4 thru_hole oval (at 0 7.62 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 1 "Net-(C1-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Connect:USB_Micro-B (layer F.Cu) (tedit 567B5CC4) (tstamp 5673A963) + (at 114.554 137.668 180) + (descr "Micro USB Type B Receptacle") + (tags "USB USB_B USB_micro USB_OTG") + (path /55CA90D2) + (attr smd) + (fp_text reference P2 (at 0 0.762 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value USB_OTG (at 0 4.8 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.6 -2.8) (end 4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 -2.8) (end 4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 4.05) (end -4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.6 4.05) (end -4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3509 3.81746) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 -2.58754) (end 4.3491 -2.58754) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 -2.58754) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 2.58746) (end -4.3509 2.58746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 3.81746) (end -4.3509 -2.58754) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.3009 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -0.6509 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 37 /D-)) + (pad 3 smd rect (at -0.0009 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 38 /D+)) + (pad 4 smd rect (at 0.6491 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 51 "Net-(P2-Pad4)")) + (pad 5 smd rect (at 1.2991 -1.56254 270) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 6 thru_hole oval (at -2.5009 -1.56254 270) (size 0.95 1.25) (drill oval 0.55 0.85) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 6 thru_hole oval (at 2.4991 -1.56254 270) (size 0.95 1.25) (drill oval 0.55 0.85) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 6 thru_hole oval (at -3.5009 1.13746 270) (size 1.55 1) (drill oval 1.15 0.5) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 6 thru_hole oval (at 3.4991 1.13746 270) (size 1.55 1) (drill oval 1.15 0.5) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 locked (layer F.Cu) (tedit 567B5DDC) (tstamp 5673A96B) + (at 76.2 149.86 180) + (descr "Through hole pin header") + (tags "pin header") + (path /55CBF4D5) + (fp_text reference P3 (at -1.8796 0.4826 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DIG_OUT (at 2.54 3.81 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 52 "Net-(P3-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 53 "Net-(P3-Pad2)")) + (pad 3 thru_hole oval (at 0 5.08 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 54 "Net-(P3-Pad3)")) + (pad 4 thru_hole oval (at 0 7.62 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 55 "Net-(P3-Pad4)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_2x02 (layer F.Cu) (tedit 567B5CD3) (tstamp 5673A973) + (at 105.156 135.382) + (descr "Through hole pin header") + (tags "pin header") + (path /56069A87) + (fp_text reference P4 (at -2.159 -0.127 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value PDI (at 0 -3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.75) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 4.3 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 -1.55) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 -1.27) (end 3.81 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27) (end 3.81 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 3.81) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 7 /AVCC)) + (pad 2 thru_hole oval (at 2.54 0) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 43 "Net-(IC1-Pad34)")) + (pad 3 thru_hole oval (at 0 2.54) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 6 /AGND)) + (pad 4 thru_hole oval (at 2.54 2.54) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 44 "Net-(IC1-Pad35)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_2x02.wrl + (at (xyz 0.05 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x03 (layer F.Cu) (tedit 567B5CD0) (tstamp 5673A97A) + (at 100.33 140.462 180) + (descr "Through hole pin header") + (tags "pin header") + (path /56065DA8) + (fp_text reference P5 (at -1.905 1.143 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CONN_01X03 (at 0 -3.1 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 6.85) (end 1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 6.35) (end 1.27 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 6.35) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 5 +5V)) + (pad 2 thru_hole oval (at 0 2.54 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 9 /VCC_PSU)) + (pad 3 thru_hole oval (at 0 5.08 180) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 7 /AVCC)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x03.wrl + (at (xyz 0 -0.1 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 locked (layer F.Cu) (tedit 567B5E7D) (tstamp 5673A982) + (at 76.2 152.4) + (descr "Through hole pin header") + (tags "pin header") + (path /566DF832) + (fp_text reference P6 (at 9.0678 -6.1722 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DAC_OUT (at 2.54 5.08 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 11 "Net-(C7-Pad2)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 10 "Net-(C7-Pad1)")) + (pad 3 thru_hole oval (at 0 5.08) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 14 "Net-(C14-Pad2)")) + (pad 4 thru_hole oval (at 0 7.62) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 13 "Net-(C14-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_2x02 locked (layer F.Cu) (tedit 567B5E3B) (tstamp 5673A98A) + (at 86.36 143.51 180) + (descr "Through hole pin header") + (tags "pin header") + (path /55CC540F) + (fp_text reference P7 (at -2.2606 3.1242 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value HVO (at -3.429 1.016 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.75) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 4.3 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 -1.55) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 -1.27) (end 3.81 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27) (end 3.81 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 3.81) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 12 "Net-(C11-Pad1)")) + (pad 2 thru_hole oval (at 2.54 0 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 8 /VGND)) + (pad 3 thru_hole oval (at 0 2.54 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 8 /VGND)) + (pad 4 thru_hole oval (at 2.54 2.54 180) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 8 /VGND)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_2x02.wrl + (at (xyz 0.05 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 567B5D10) (tstamp 5673A990) + (at 116.84 157.48) + (descr "Through hole pin header") + (tags "pin header") + (path /55D6DB77) + (fp_text reference P8 (at 0.254 -2.3368) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DIG_IN (at 0 -3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 56 "Net-(P8-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 57 "Net-(P8-Pad2)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module SMD:SOT-23-3 (layer F.Cu) (tedit 5508E933) (tstamp 5673A997) + (at 95.885 137.922 270) + (path /5606F6D4) + (fp_text reference Q1 (at 2.5 0 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Q_NMOS_GSD (at -2.2 0 360) (layer F.Fab) hide + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 1 -0.4) (end 1.1 -0.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 -0.8) (end -1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 0.8) (end 1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 0.8) (end 1.5 -0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 -0.8) (end -1.5 -0.8) (layer F.SilkS) (width 0.15)) + (pad 3 smd rect (at 0 1.4 270) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 15 "Net-(D1-Pad2)")) + (pad 2 smd rect (at -0.95 -1.4 270) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 8 /VGND)) + (pad 1 smd rect (at 0.95 -1.4 270) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 35 /PSU_PWM)) + (model 3D/SMD/SOT-23-3.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5F80) (tstamp 5673A99D) + (at 89.916 155.067) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAB95) + (attr smd) + (fp_text reference R1 (at -4.3942 -8.9408 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5F66) (tstamp 5673A9A3) + (at 89.916 160.528) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAD4C) + (attr smd) + (fp_text reference R2 (at -4.19608 -14.56944 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R2-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5F86) (tstamp 5673A9A9) + (at 89.916 153.416) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAABF4) + (attr smd) + (fp_text reference R3 (at -4.5085 -6.9215 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.8796) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 50 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5F7C) (tstamp 5673A9AF) + (at 89.916 158.877 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAD11) + (attr smd) + (fp_text reference R4 (at 4.0132 12.573 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 50 /AVCC_ON_2)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R2-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5F8A) (tstamp 5673A9B5) + (at 89.789 151.765 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAC5F) + (attr smd) + (fp_text reference R5 (at 4.26466 5.24764 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 50 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5F8C) (tstamp 5673A9BB) + (at 89.789 150.114 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAACD2) + (attr smd) + (fp_text reference R6 (at 4.37642 3.8481 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 50 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E09) (tstamp 5673A9C1) + (at 79.756 146.05 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBCDA5) + (attr smd) + (fp_text reference R7 (at -5.5372 -0.3556 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R11-Pad2)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 55 "Net-(P3-Pad4)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E1F) (tstamp 5673A9C7) + (at 79.756 147.701 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE401) + (attr smd) + (fp_text reference R8 (at -5.4356 1.4732 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R12-Pad2)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 54 "Net-(P3-Pad3)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E1A) (tstamp 5673A9CD) + (at 79.756 149.352 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE16B) + (attr smd) + (fp_text reference R9 (at -5.3594 3.302 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R13-Pad2)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 53 "Net-(P3-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E17) (tstamp 5673A9D3) + (at 82.296 151.003 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE2C7) + (attr smd) + (fp_text reference R10 (at -2.794 4.8514 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R10-Pad1)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 52 "Net-(P3-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5DB5) (tstamp 5673A9D9) + (at 82.423 146.05 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBCD2A) + (attr smd) + (fp_text reference R11 (at -2.8702 -0.0762 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 39 "Net-(IC1-Pad28)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R11-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E0C) (tstamp 5673A9DF) + (at 82.423 147.701 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE362) + (attr smd) + (fp_text reference R12 (at -2.9464 1.6256 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 40 "Net-(IC1-Pad29)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R12-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E0E) (tstamp 5673A9E5) + (at 82.423 149.352 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE0F4) + (attr smd) + (fp_text reference R13 (at -3.0988 3.1242 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 41 "Net-(IC1-Pad32)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R13-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E14) (tstamp 5673A9EB) + (at 84.455 150.241 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE21C) + (attr smd) + (fp_text reference R14 (at -4.064 -0.889 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 42 "Net-(IC1-Pad33)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R10-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 5673A9F1) + (at 80.391 154.305 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CB4680) + (attr smd) + (fp_text reference R15 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R15-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R15-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E1C) (tstamp 5673A9F7) + (at 79.248 152.146) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CB9020) + (attr smd) + (fp_text reference R16 (at 0.2286 -1.3208) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 11 "Net-(C7-Pad2)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R15-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E90) (tstamp 5673A9FD) + (at 80.391 159.639 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566DE721) + (attr smd) + (fp_text reference R17 (at -13.2842 -4.8514 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R17-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R17-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5E95) (tstamp 5673AA03) + (at 79.248 157.48) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566DE7E8) + (attr smd) + (fp_text reference R18 (at 6.096 -11.28776) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 14 "Net-(C14-Pad2)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R17-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5CE2) (tstamp 5673AA09) + (at 98.171 143.891) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566E5C29) + (attr smd) + (fp_text reference R19 (at 0.1778 1.6002) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 12 "Net-(C11-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 16 /PSU_FEEDBACK)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 567B5CE5) (tstamp 5673AA0F) + (at 101.6 143.891) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /566E5CBE) + (attr smd) + (fp_text reference R20 (at 0.4064 1.651) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 16 /PSU_FEEDBACK)) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module SMD:SOT-23-3 (layer F.Cu) (tedit 567B5D08) (tstamp 5673AA16) + (at 109.982 144.399 180) + (path /55CA99FA) + (fp_text reference U1 (at -0.1016 -0.0254 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value 78L05 (at -2.2 0 270) (layer F.Fab) hide + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 1 -0.4) (end 1.1 -0.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 -0.8) (end -1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 0.8) (end 1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 0.8) (end 1.5 -0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 -0.8) (end -1.5 -0.8) (layer F.SilkS) (width 0.15)) + (pad 3 smd rect (at 0 1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -0.95 -1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 1 smd rect (at 0.95 -1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (model 3D/SMD/SOT-23-3.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm (layer F.Cu) (tedit 567B5F95) (tstamp 5673AA28) + (at 84.963 156.972 180) + (descr "14-Lead Plastic Small Outline (SL) - Narrow, 3.90 mm Body [SOIC] (see Microchip Packaging Specification 00000049BS.pdf)") + (tags "SOIC 1.27") + (path /55CA87E2) + (attr smd) + (fp_text reference U2 (at 0.19304 -1.22428 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value LM324 (at 0 5.375 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.7 -4.65) (end -3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.7 -4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 -4.65) (end 3.7 -4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.075 -4.45) (end -2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 -4.45) (end 2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 4.45) (end 2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end -2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.45) (end 2.075 -4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end 2.075 4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.335) (end -3.45 -4.335) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2.7 -3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (pad 2 smd rect (at -2.7 -2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 17 /CH2)) + (pad 3 smd rect (at -2.7 -1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R2-Pad1)")) + (pad 4 smd rect (at -2.7 0 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 5 smd rect (at -2.7 1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R1-Pad1)")) + (pad 6 smd rect (at -2.7 2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 48 /CH1)) + (pad 7 smd rect (at -2.7 3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 48 /CH1)) + (pad 8 smd rect (at 2.7 3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R15-Pad2)")) + (pad 9 smd rect (at 2.7 2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R15-Pad2)")) + (pad 10 smd rect (at 2.7 1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 21 /DAC_OUT)) + (pad 11 smd rect (at 2.7 0 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 8 /VGND)) + (pad 12 smd rect (at 2.7 -1.27 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 22 /DAC_OUT2)) + (pad 13 smd rect (at 2.7 -2.54 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R17-Pad2)")) + (pad 14 smd rect (at 2.7 -3.81 180) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R17-Pad2)")) + (model Housings_SOIC.3dshapes/SOIC-14_3.9x8.7mm_Pitch1.27mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module TO_SOT_Packages_SMD:SOT-363 (layer F.Cu) (tedit 567B5D15) (tstamp 5673AA32) + (at 113.665 159.131 90) + (descr SOT353) + (path /55D6ACFD) + (attr smd) + (fp_text reference U3 (at -0.0762 0.0254 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DMN63D8LDW (at 0.09906 0 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 0.635 1.016) (end 0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.635 -1.016) (end -0.635 -1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 -1.016) (end -0.635 1.016) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.635 1.016) (end 0.635 1.016) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.016 -0.635 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 3 smd rect (at -1.016 0.635 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 27 /DIG_CH2)) + (pad 6 smd rect (at 1.016 -0.635 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 30 /DIG_CH1)) + (pad 2 smd rect (at -1.016 0 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 57 "Net-(P8-Pad2)")) + (pad 4 smd rect (at 1.016 0.635 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 /AGND)) + (pad 5 smd rect (at 1.016 0 90) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 56 "Net-(P8-Pad1)")) + (model TO_SOT_Packages_SMD.3dshapes/SOT-353.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.07000000000000001 0.09 0.08)) + (rotate (xyz 0 0 90)) + ) + ) + + (gr_line (start 119.126 133.604) (end 119.126 162.56) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 74.295 162.56) (end 74.295 161.417) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 119.126 162.56) (end 74.295 162.56) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 74.295 133.604) (end 74.295 162.306) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 119.126 133.604) (end 74.295 133.604) (angle 90) (layer Edge.Cuts) (width 0.1)) + + (segment (start 90.666 155.067) (end 92.583 155.067) (width 0.254) (layer F.Cu) (net 1)) + (segment (start 93.091 153.543) (end 94.488 152.146) (width 0.254) (layer F.Cu) (net 1) (tstamp 5673BA83)) + (segment (start 93.091 154.559) (end 93.091 153.543) (width 0.254) (layer F.Cu) (net 1) (tstamp 5673BA82)) + (segment (start 92.583 155.067) (end 93.091 154.559) (width 0.254) (layer F.Cu) (net 1) (tstamp 5673BA81)) + (segment (start 94.488 152.146) (end 94.488 151.892) (width 0.254) (layer F.Cu) (net 1) (tstamp 5673BA84)) + (segment (start 90.666 155.067) (end 90.805 155.067) (width 0.254) (layer F.Cu) (net 1)) + (segment (start 94.488 151.892) (end 94.488 152.019) (width 0.254) (layer F.Cu) (net 1)) + (segment (start 90.436 156.591) (end 90.436 155.297) (width 0.254) (layer F.Cu) (net 1)) + (segment (start 90.436 155.297) (end 90.666 155.067) (width 0.254) (layer F.Cu) (net 1) (tstamp 5673B338)) + (segment (start 91.936 156.591) (end 92.329 156.591) (width 0.254) (layer F.Cu) (net 2)) + (segment (start 92.329 156.591) (end 94.488 154.432) (width 0.254) (layer F.Cu) (net 2) (tstamp 5673B33B)) + (segment (start 90.666 160.528) (end 91.936 160.528) (width 0.254) (layer F.Cu) (net 3)) + (segment (start 91.936 160.528) (end 91.948 160.516) (width 0.254) (layer F.Cu) (net 3) (tstamp 5673B335)) + (segment (start 91.948 160.516) (end 93.484 160.516) (width 0.254) (layer F.Cu) (net 3)) + (segment (start 93.484 160.516) (end 94.488 159.512) (width 0.254) (layer F.Cu) (net 3) (tstamp 5673B332)) + (segment (start 93.726 156.972) (end 94.488 156.972) (width 0.254) (layer F.Cu) (net 4) (tstamp 5673B347)) + (segment (start 92.964 157.734) (end 93.726 156.972) (width 0.254) (layer F.Cu) (net 4) (tstamp 5673B346)) + (segment (start 92.964 158.369) (end 92.964 157.734) (width 0.254) (layer F.Cu) (net 4) (tstamp 5673B345)) + (segment (start 92.317 159.016) (end 92.964 158.369) (width 0.254) (layer F.Cu) (net 4) (tstamp 5673B344)) + (segment (start 91.948 159.016) (end 92.317 159.016) (width 0.254) (layer F.Cu) (net 4)) + (segment (start 109.982 142.999) (end 110.759 142.999) (width 1.016) (layer F.Cu) (net 5)) + (segment (start 110.759 142.999) (end 111.137 142.621) (width 1.016) (layer F.Cu) (net 5) (tstamp 567A6AD4)) + (segment (start 111.137 142.621) (end 111.137 141.815002) (width 1.016) (layer F.Cu) (net 5)) + (segment (start 111.125 141.803002) (end 111.137 141.803002) (width 1.016) (layer F.Cu) (net 5) (tstamp 567A6AD0)) + (segment (start 111.137 141.815002) (end 111.125 141.803002) (width 1.016) (layer F.Cu) (net 5) (tstamp 567A6ACD)) + (segment (start 100.33 140.462) (end 103.505 140.462) (width 1.016) (layer B.Cu) (net 5)) + (segment (start 103.505 140.462) (end 104.648 141.605) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6ABC)) + (segment (start 104.648 141.605) (end 111.125 141.605) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6ABE)) + (segment (start 111.125 141.605) (end 114.808 141.605) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6ABF)) + (segment (start 114.808 141.605) (end 115.443 140.97) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6AC1)) + (segment (start 97.536 140.601) (end 100.191 140.601) (width 1.016) (layer F.Cu) (net 5)) + (segment (start 100.191 140.601) (end 100.33 140.462) (width 1.016) (layer F.Cu) (net 5) (tstamp 567A6AB9)) + (segment (start 97.536 140.601) (end 96.254 140.601) (width 1.016) (layer F.Cu) (net 5)) + (segment (start 86.106 156.972) (end 87.663 156.972) (width 1.016) (layer F.Cu) (net 5) (tstamp 567A6A1F)) + (segment (start 86.106 156.337) (end 86.106 156.972) (width 1.016) (layer F.Cu) (net 5) (tstamp 567A6A1E)) + (segment (start 85.598 155.829) (end 86.106 156.337) (width 1.016) (layer F.Cu) (net 5) (tstamp 567A6A1D)) + (via (at 85.598 155.829) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 5)) + (segment (start 85.598 152.273) (end 85.598 155.829) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6A1A)) + (segment (start 87.249 150.622) (end 85.598 152.273) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6A19)) + (segment (start 90.551 150.622) (end 87.249 150.622) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6A18)) + (segment (start 95.123 146.05) (end 90.551 150.622) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6A16)) + (segment (start 95.123 141.732) (end 95.123 146.05) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6A15)) + (segment (start 96.012 140.843) (end 95.123 141.732) (width 1.016) (layer B.Cu) (net 5) (tstamp 567A6A14)) + (via (at 96.012 140.843) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 5)) + (segment (start 96.254 140.601) (end 96.012 140.843) (width 1.016) (layer F.Cu) (net 5) (tstamp 567A6A12)) + (segment (start 111.137 141.803002) (end 111.137 141.617) (width 0.25) (layer F.Cu) (net 5) (tstamp 567A6AD1)) + (via (at 111.125 141.605) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 5)) + (segment (start 111.137 141.617) (end 111.125 141.605) (width 0.25) (layer F.Cu) (net 5) (tstamp 5675DE82)) + (segment (start 110.759 142.999) (end 111.137 142.621) (width 0.25) (layer F.Cu) (net 5) (tstamp 5675DE7F)) + (segment (start 115.8549 139.23054) (end 115.8549 140.5581) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 112.649 141.605) (end 111.125 141.605) (width 0.25) (layer B.Cu) (net 5) (tstamp 5675DD89)) + (segment (start 115.8549 140.5581) (end 115.443 140.97) (width 0.25) (layer F.Cu) (net 5) (tstamp 5675DBFF)) + (via (at 115.443 140.97) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 5)) + (segment (start 115.443 140.97) (end 114.808 141.605) (width 0.25) (layer B.Cu) (net 5) (tstamp 5675DC02)) + (segment (start 114.808 141.605) (end 112.649 141.605) (width 0.25) (layer B.Cu) (net 5) (tstamp 5675DC03)) + (segment (start 111.125 141.605) (end 104.648 141.605) (width 0.25) (layer B.Cu) (net 5) (tstamp 5675DE86)) + (segment (start 104.648 141.605) (end 103.505 140.462) (width 0.25) (layer B.Cu) (net 5) (tstamp 5675DC04)) + (segment (start 100.191 140.601) (end 100.33 140.462) (width 0.25) (layer F.Cu) (net 5) (tstamp 5675DA23)) + (segment (start 107.291 142.113) (end 107.569 142.113) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 107.569 142.113) (end 109.22 140.462) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6BC4)) + (segment (start 109.22 140.462) (end 109.22 139.23054) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6BC5)) + (segment (start 102.35 143.891) (end 102.35 143.498) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 102.35 143.498) (end 101.981 143.129) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6BA1)) + (segment (start 102.108 139.827) (end 102.108 139.954) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6BA7)) + (segment (start 101.981 139.954) (end 102.108 139.827) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6BA5)) + (segment (start 101.981 143.129) (end 101.981 139.954) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6BA2)) + (segment (start 105.156 137.922) (end 104.14 137.922) (width 1.016) (layer F.Cu) (net 6)) + (segment (start 104.14 137.922) (end 102.108 139.954) (width 1.016) (layer F.Cu) (net 6) (tstamp 567A6B92)) + (segment (start 102.108 139.954) (end 102.35 139.712) (width 1.016) (layer F.Cu) (net 6) (tstamp 567A6BA8)) + (segment (start 103.759 144.653) (end 103.759 146.685) (width 1.016) (layer B.Cu) (net 6)) + (segment (start 102.35 143.891) (end 103.070002 143.891) (width 1.016) (layer F.Cu) (net 6)) + (segment (start 103.759 144.579998) (end 103.759 144.653) (width 1.016) (layer F.Cu) (net 6) (tstamp 567A6B87)) + (segment (start 103.070002 143.891) (end 103.759 144.579998) (width 1.016) (layer F.Cu) (net 6) (tstamp 567A6B85)) + (segment (start 111.26 156.451) (end 112.382 156.451) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 112.382 156.451) (end 112.649 156.184) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B19)) + (segment (start 112.649 156.184) (end 112.649 155.321) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B1A)) + (segment (start 112.649 153.416) (end 112.649 155.321) (width 0.508) (layer B.Cu) (net 6)) + (segment (start 111.26 153.251) (end 112.484 153.251) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 112.484 153.251) (end 112.649 153.416) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B14)) + (segment (start 111.26 153.251) (end 114.401 153.251) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 114.401 153.251) (end 114.427 153.277) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B11)) + (segment (start 114.427 153.277) (end 114.566 153.277) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 114.566 153.277) (end 116.078 151.765) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B0D)) + (segment (start 116.078 151.765) (end 116.078 146.518) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B0E)) + (segment (start 116.078 146.518) (end 116.499 146.518) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 116.499 146.518) (end 117.221 145.796) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B09)) + (segment (start 117.221 145.796) (end 117.221 140.6672) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B0A)) + (segment (start 112.637 142.621) (end 114.935 142.621) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 114.935 142.621) (end 117.0549 140.5011) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B00)) + (segment (start 117.0549 140.5011) (end 117.0549 139.23054) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6B01)) + (segment (start 109.032 145.799) (end 109.032 145.476) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 109.032 145.476) (end 110.236 144.272) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6AFA)) + (segment (start 110.236 144.272) (end 111.887 144.272) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6AFB)) + (segment (start 111.887 144.272) (end 112.637 143.522) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6AFC)) + (segment (start 112.637 143.522) (end 112.637 142.621) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6AFD)) + (segment (start 110.756 147.193) (end 110.426 147.193) (width 0.508) (layer F.Cu) (net 6)) + (segment (start 110.426 147.193) (end 109.032 145.799) (width 0.508) (layer F.Cu) (net 6) (tstamp 567A6AF7)) + (segment (start 109.032 145.476) (end 110.236 144.272) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DF8E)) + (segment (start 112.637 143.522) (end 112.637 142.621) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DF93)) + (segment (start 111.887 144.272) (end 112.637 143.522) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DF92)) + (segment (start 110.236 144.272) (end 111.887 144.272) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DF90)) + (segment (start 116.078 146.518) (end 116.078 151.765) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 116.078 151.765) (end 114.566 153.277) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DEB4)) + (segment (start 116.499 146.518) (end 117.221 145.796) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DEA8)) + (segment (start 117.221 145.796) (end 117.221 140.6672) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DEA9)) + (segment (start 117.221 140.6672) (end 117.0549 140.5011) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DEAA)) + (segment (start 110.426 147.193) (end 109.032 145.799) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DE9C)) + (segment (start 117.0549 140.5011) (end 117.0549 139.23054) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DE8B)) + (segment (start 114.935 142.621) (end 117.0549 140.5011) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DE89)) + (segment (start 91.821 150.253) (end 92.952 150.253) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 97.167 152.285) (end 97.79 152.285) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DD4D)) + (segment (start 96.901 152.019) (end 97.167 152.285) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DD4C)) + (segment (start 96.901 150.749) (end 96.901 152.019) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DD4A)) + (segment (start 95.885 149.733) (end 96.901 150.749) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DD48)) + (segment (start 93.472 149.733) (end 95.885 149.733) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DD47)) + (segment (start 92.952 150.253) (end 93.472 149.733) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DD46)) + (segment (start 99.56 153.251) (end 98.756 153.251) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 98.756 153.251) (end 97.79 152.285) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DD39)) + (segment (start 114.427 153.277) (end 112.788 153.277) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 112.788 153.277) (end 112.649 153.416) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DC6A)) + (segment (start 107.569 142.113) (end 109.22 140.462) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DBB4)) + (segment (start 109.22 140.462) (end 109.22 139.23054) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DBB7)) + (segment (start 111.0549 136.53054) (end 118.0549 136.53054) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 113.2549 139.23054) (end 112.0549 139.23054) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 112.0549 139.23054) (end 109.22 139.23054) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 109.22 139.23054) (end 105.44854 139.23054) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DBBB)) + (segment (start 105.156 138.938) (end 105.156 137.922) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DB59)) + (segment (start 105.44854 139.23054) (end 105.156 138.938) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DB58)) + (segment (start 112.0549 139.23054) (end 111.67154 139.23054) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 111.67154 139.23054) (end 111.0549 138.6139) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DB52)) + (segment (start 111.0549 138.6139) (end 111.0549 136.53054) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DB53)) + (segment (start 117.0549 139.23054) (end 117.18246 139.23054) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 117.18246 139.23054) (end 118.0549 138.3581) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DB4E)) + (segment (start 118.0549 138.3581) (end 118.0549 136.53054) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675DB4F)) + (segment (start 103.81 146.736) (end 103.81 148.201) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D904)) + (via (at 103.759 144.653) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (via (at 103.759 146.685) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 103.759 146.685) (end 103.81 146.736) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D903)) + (segment (start 104.14 137.922) (end 102.35 139.712) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D8E5)) + (segment (start 102.35 139.712) (end 102.35 143.891) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D8E7)) + (segment (start 112.522 156.464) (end 112.522 156.591) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D897)) + (via (at 112.649 155.321) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 112.649 155.321) (end 112.649 156.337) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D895)) + (segment (start 112.649 156.337) (end 112.522 156.464) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D896)) + (via (at 112.649 153.416) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 112.484 153.251) (end 112.649 153.416) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D890)) + (segment (start 113.03 159.004) (end 112.903 159.004) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 112.522 156.591) (end 112.382 156.451) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D869)) + (segment (start 112.522 158.623) (end 112.522 156.591) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D868)) + (segment (start 112.903 159.004) (end 112.522 158.623) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D867)) + (segment (start 113.03 160.147) (end 113.03 159.004) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 114.3 158.623) (end 114.3 158.115) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D771)) + (segment (start 114.173 158.75) (end 114.3 158.623) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D770)) + (segment (start 113.284 158.75) (end 114.173 158.75) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D76C)) + (segment (start 113.03 159.004) (end 113.284 158.75) (width 0.25) (layer F.Cu) (net 6) (tstamp 5675D76B)) + (segment (start 91.821 150.253) (end 90.678 150.253) (width 0.254) (layer F.Cu) (net 6)) + (segment (start 90.678 150.253) (end 90.539 150.114) (width 0.254) (layer F.Cu) (net 6) (tstamp 5673B35C)) + (segment (start 115.443 139.065) (end 115.443 139.319) (width 0.508) (layer B.Cu) (net 7)) + (segment (start 116.459 143.002) (end 116.078 143.383) (width 0.508) (layer B.Cu) (net 7) (tstamp 567A6C3D)) + (segment (start 116.459 140.335) (end 116.459 143.002) (width 0.508) (layer B.Cu) (net 7) (tstamp 567A6C3C)) + (segment (start 115.443 139.319) (end 116.459 140.335) (width 0.508) (layer B.Cu) (net 7) (tstamp 567A6C3B)) + (segment (start 116.078 143.383) (end 116.078 144.018) (width 0.508) (layer B.Cu) (net 7) (tstamp 567A6C3F)) + (segment (start 115.443 139.065) (end 115.443 136.398) (width 0.508) (layer B.Cu) (net 7)) + (segment (start 115.443 136.398) (end 114.681 135.636) (width 0.508) (layer B.Cu) (net 7) (tstamp 567A6C38)) + (segment (start 113.03 133.985) (end 114.681 135.636) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 105.156 135.382) (end 105.156 135.255) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 105.156 135.255) (end 106.426 133.985) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6C25)) + (segment (start 106.426 133.985) (end 113.03 133.985) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6C26)) + (segment (start 100.33 135.382) (end 105.156 135.382) (width 1.016) (layer F.Cu) (net 7)) + (segment (start 110.932 145.799) (end 110.932 145.869) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 110.932 145.869) (end 112.256 147.193) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6AF4)) + (segment (start 116.078 144.018) (end 114.808 144.018) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 114.808 144.018) (end 113.027 145.799) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6AF0)) + (segment (start 113.027 145.799) (end 110.932 145.799) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6AF1)) + (segment (start 114.427 151.777) (end 114.427 146.177) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 114.427 146.177) (end 116.078 144.526) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6AEC)) + (segment (start 116.078 144.526) (end 116.078 144.018) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6AED)) + (segment (start 111.26 152.451) (end 112.598 152.451) (width 0.508) (layer F.Cu) (net 7)) + (segment (start 112.598 152.451) (end 113.272 151.777) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6AE8)) + (segment (start 113.272 151.777) (end 114.427 151.777) (width 0.508) (layer F.Cu) (net 7) (tstamp 567A6AE9)) + (segment (start 105.156 135.255) (end 106.426 133.985) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DFBD)) + (segment (start 116.459 140.081) (end 116.459 143.637) (width 0.25) (layer B.Cu) (net 7) (tstamp 5675DFC9)) + (via (at 114.681 135.636) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 7)) + (segment (start 114.681 135.636) (end 115.443 136.398) (width 0.25) (layer B.Cu) (net 7) (tstamp 5675DFC5)) + (segment (start 115.443 139.065) (end 116.459 140.081) (width 0.25) (layer B.Cu) (net 7) (tstamp 5675DFC7)) + (segment (start 106.426 133.985) (end 113.03 133.985) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DFBE)) + (segment (start 116.459 143.637) (end 116.078 144.018) (width 0.25) (layer B.Cu) (net 7) (tstamp 5675DFCB)) + (segment (start 116.078 144.018) (end 116.078 144.526) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 116.078 144.526) (end 114.427 146.177) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DEAF)) + (segment (start 110.932 145.799) (end 113.027 145.799) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 113.027 145.799) (end 114.808 144.018) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DEA2)) + (segment (start 110.932 145.869) (end 112.256 147.193) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DE9F)) + (segment (start 97.79 153.785) (end 97.397 153.785) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 92.341 151.753) (end 91.821 151.753) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DD43)) + (segment (start 93.726 150.368) (end 92.341 151.753) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DD42)) + (segment (start 95.377 150.368) (end 93.726 150.368) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DD41)) + (segment (start 96.266 151.257) (end 95.377 150.368) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DD3F)) + (segment (start 96.266 152.654) (end 96.266 151.257) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DD3D)) + (segment (start 97.397 153.785) (end 96.266 152.654) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DD3C)) + (segment (start 97.79 153.785) (end 98.159 153.785) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 98.159 153.785) (end 98.425 154.051) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DD35)) + (segment (start 98.425 154.051) (end 99.56 154.051) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DD36)) + (segment (start 114.427 151.777) (end 113.272 151.777) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 113.272 151.777) (end 112.598 152.451) (width 0.25) (layer F.Cu) (net 7) (tstamp 5675DC66)) + (segment (start 91.821 151.753) (end 90.551 151.753) (width 0.254) (layer F.Cu) (net 7)) + (segment (start 90.551 151.753) (end 90.539 151.765) (width 0.254) (layer F.Cu) (net 7) (tstamp 5673B359)) + (segment (start 81.28 144.26) (end 83.07 144.26) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 83.07 144.26) (end 83.82 143.51) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A8F)) + (segment (start 76.494 136.906) (end 76.494 137.581) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 76.494 137.581) (end 78.994 140.081) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A87)) + (segment (start 80.506 144.26) (end 81.28 144.26) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A8C)) + (segment (start 78.994 142.748) (end 80.506 144.26) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A8B)) + (segment (start 78.994 140.081) (end 78.994 142.748) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A88)) + (segment (start 83.82 146.558) (end 86.614 146.558) (width 1.016) (layer B.Cu) (net 8)) + (via (at 90.805 142.367) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 8)) + (segment (start 86.614 146.558) (end 90.805 142.367) (width 1.016) (layer B.Cu) (net 8) (tstamp 567A6A51)) + (segment (start 90.805 142.367) (end 90.805 142.379) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A5C)) + (segment (start 90.805 142.379) (end 90.805 142.367) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A5D)) + (segment (start 90.805 142.367) (end 90.805 142.379) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A5F)) + (segment (start 83.82 156.845) (end 83.82 146.558) (width 1.016) (layer B.Cu) (net 8)) + (segment (start 83.82 146.558) (end 83.82 143.51) (width 1.016) (layer B.Cu) (net 8) (tstamp 567A6A4F)) + (segment (start 82.263 156.972) (end 83.693 156.972) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 83.693 156.972) (end 83.82 156.845) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A3F)) + (segment (start 93.345 141.391) (end 94.02 141.391) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 94.02 141.391) (end 94.73 142.101) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A69DA)) + (segment (start 94.73 142.101) (end 97.536 142.101) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A69DC)) + (segment (start 93.345 141.391) (end 95.758 138.978) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 95.758 138.978) (end 95.758 137.922) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A69BE)) + (segment (start 95.758 137.922) (end 96.708 136.972) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A69BF)) + (segment (start 96.708 136.972) (end 97.285 136.972) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A69C0)) + (segment (start 88.9 142.379) (end 90.805 142.379) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 90.805 142.379) (end 92.357 142.379) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A6A60)) + (segment (start 92.357 142.379) (end 93.345 141.391) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A69BB)) + (segment (start 86.36 140.97) (end 87.884 140.97) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 87.884 140.97) (end 88.9 141.986) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A69B6)) + (segment (start 88.9 141.986) (end 88.9 142.379) (width 1.016) (layer F.Cu) (net 8) (tstamp 567A69B7)) + (segment (start 83.82 140.97) (end 83.82 143.51) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 86.36 140.97) (end 83.82 140.97) (width 1.016) (layer F.Cu) (net 8)) + (segment (start 97.536 142.101) (end 100.953 142.101) (width 0.25) (layer F.Cu) (net 8)) + (segment (start 102.997 142.113) (end 104.291 142.113) (width 0.25) (layer F.Cu) (net 8) (tstamp 5675DBA6)) + (via (at 102.997 142.113) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 8)) + (segment (start 100.965 142.113) (end 102.997 142.113) (width 0.25) (layer B.Cu) (net 8) (tstamp 5675DBA3)) + (via (at 100.965 142.113) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 8)) + (segment (start 100.953 142.101) (end 100.965 142.113) (width 0.25) (layer F.Cu) (net 8) (tstamp 5675DBA1)) + (segment (start 97.536 142.101) (end 94.73 142.101) (width 0.25) (layer F.Cu) (net 8)) + (segment (start 94.73 142.101) (end 94.02 141.391) (width 0.25) (layer F.Cu) (net 8) (tstamp 5675DA1F)) + (segment (start 83.693 156.972) (end 83.82 156.845) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B98D)) + (via (at 83.82 156.845) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 8)) + (segment (start 97.285 136.972) (end 96.708 136.972) (width 0.254) (layer F.Cu) (net 8)) + (segment (start 95.758 137.922) (end 95.758 138.978) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B794)) + (segment (start 96.708 136.972) (end 95.758 137.922) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B793)) + (segment (start 92.357 142.379) (end 93.345 141.391) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B766)) + (segment (start 81.28 144.26) (end 79.998 144.26) (width 0.254) (layer F.Cu) (net 8)) + (segment (start 78.486 139.573) (end 76.494 137.581) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B6C1)) + (segment (start 78.486 142.748) (end 78.486 139.573) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B6BF)) + (segment (start 79.998 144.26) (end 78.486 142.748) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B6BE)) + (segment (start 88.9 142.379) (end 88.9 141.986) (width 0.254) (layer F.Cu) (net 8)) + (segment (start 88.9 141.986) (end 87.884 140.97) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B6AA)) + (segment (start 83.07 144.26) (end 83.82 143.51) (width 0.254) (layer F.Cu) (net 8) (tstamp 5673B69F)) + (segment (start 82.296 137.92454) (end 81.28 138.94054) (width 1.016) (layer F.Cu) (net 9)) + (segment (start 81.28 138.94054) (end 81.28 142.76) (width 1.016) (layer F.Cu) (net 9) (tstamp 567A6A84)) + (segment (start 82.296 137.92454) (end 80.77454 137.92454) (width 1.016) (layer F.Cu) (net 9)) + (segment (start 80.77454 137.92454) (end 79.756 136.906) (width 1.016) (layer F.Cu) (net 9) (tstamp 567A6A80)) + (segment (start 79.756 136.906) (end 78.994 136.906) (width 1.016) (layer F.Cu) (net 9) (tstamp 567A6A81)) + (segment (start 89.408 137.922) (end 82.29854 137.922) (width 1.016) (layer F.Cu) (net 9)) + (segment (start 82.29854 137.922) (end 82.296 137.92454) (width 1.016) (layer F.Cu) (net 9) (tstamp 567A6A7C)) + (segment (start 100.33 137.922) (end 96.647 137.922) (width 1.016) (layer B.Cu) (net 9)) + (segment (start 96.647 137.922) (end 94.869 139.7) (width 1.016) (layer B.Cu) (net 9) (tstamp 567A6A71)) + (segment (start 94.869 139.7) (end 90.678 139.7) (width 1.016) (layer B.Cu) (net 9) (tstamp 567A6A72)) + (segment (start 90.678 139.7) (end 90.17 139.192) (width 1.016) (layer B.Cu) (net 9) (tstamp 567A6A73)) + (segment (start 90.17 139.192) (end 90.17 138.684) (width 1.016) (layer B.Cu) (net 9) (tstamp 567A6A75)) + (segment (start 90.17 138.684) (end 89.452564 137.966564) (width 1.016) (layer B.Cu) (net 9) (tstamp 567A6A76)) + (segment (start 89.452564 137.966564) (end 89.363436 137.966564) (width 1.016) (layer B.Cu) (net 9) (tstamp 567A6A77)) + (segment (start 89.363436 137.966564) (end 89.408 137.922) (width 1.016) (layer B.Cu) (net 9) (tstamp 567A6A79)) + (segment (start 89.40546 137.92454) (end 82.296 137.92454) (width 0.254) (layer F.Cu) (net 9) (tstamp 5673B7D6)) + (segment (start 89.408 137.922) (end 89.40546 137.92454) (width 0.254) (layer F.Cu) (net 9) (tstamp 5673B7D5)) + (via (at 89.408 137.922) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 9)) + (segment (start 90.17 138.684) (end 89.408 137.922) (width 0.254) (layer B.Cu) (net 9) (tstamp 5673B7D3)) + (segment (start 90.17 139.192) (end 90.17 138.684) (width 0.254) (layer B.Cu) (net 9) (tstamp 5673B7D2)) + (segment (start 90.678 139.7) (end 90.17 139.192) (width 0.254) (layer B.Cu) (net 9) (tstamp 5673B7D1)) + (segment (start 94.869 139.7) (end 90.678 139.7) (width 0.254) (layer B.Cu) (net 9) (tstamp 5673B7D0)) + (segment (start 96.647 137.922) (end 94.869 139.7) (width 0.254) (layer B.Cu) (net 9) (tstamp 5673B7CE)) + (segment (start 78.994 136.906) (end 79.756 136.906) (width 0.254) (layer F.Cu) (net 9)) + (segment (start 79.756 136.906) (end 80.77454 137.92454) (width 0.254) (layer F.Cu) (net 9) (tstamp 5673B6C5)) + (segment (start 81.28 142.76) (end 81.28 138.94054) (width 0.254) (layer F.Cu) (net 9)) + (segment (start 78.74 155.182) (end 76.442 155.182) (width 0.254) (layer F.Cu) (net 10)) + (segment (start 76.442 155.182) (end 76.2 154.94) (width 0.254) (layer F.Cu) (net 10) (tstamp 5673B113)) + (segment (start 78.498 152.146) (end 76.454 152.146) (width 0.254) (layer F.Cu) (net 11)) + (segment (start 76.454 152.146) (end 76.2 152.4) (width 0.254) (layer F.Cu) (net 11) (tstamp 5673B110)) + (segment (start 78.74 153.682) (end 78.74 153.289) (width 0.254) (layer F.Cu) (net 11)) + (segment (start 78.74 153.289) (end 78.498 153.047) (width 0.254) (layer F.Cu) (net 11) (tstamp 5673B10C)) + (segment (start 78.498 153.047) (end 78.498 152.146) (width 0.254) (layer F.Cu) (net 11) (tstamp 5673B10D)) + (segment (start 93.345 143.891) (end 97.421 143.891) (width 1.016) (layer F.Cu) (net 12)) + (segment (start 88.9 143.879) (end 93.333 143.879) (width 1.016) (layer F.Cu) (net 12)) + (segment (start 93.333 143.879) (end 93.345 143.891) (width 1.016) (layer F.Cu) (net 12) (tstamp 567A6B7E)) + (segment (start 88.9 143.879) (end 86.729 143.879) (width 1.016) (layer F.Cu) (net 12)) + (segment (start 86.729 143.879) (end 86.36 143.51) (width 1.016) (layer F.Cu) (net 12) (tstamp 567A6B7B)) + (segment (start 86.36 143.51) (end 87.757 143.51) (width 1.016) (layer B.Cu) (net 12)) + (segment (start 87.757 143.51) (end 88.9 142.367) (width 1.016) (layer B.Cu) (net 12) (tstamp 567A6A9F)) + (segment (start 88.9 142.367) (end 88.9 139.446) (width 1.016) (layer B.Cu) (net 12) (tstamp 567A6AA1)) + (segment (start 88.9 139.446) (end 85.344 135.89) (width 1.016) (layer B.Cu) (net 12) (tstamp 567A6AA7)) + (segment (start 85.344 135.89) (end 85.344 135.128) (width 1.016) (layer B.Cu) (net 12) (tstamp 567A6AAB)) + (segment (start 82.55 135.12546) (end 85.34146 135.12546) (width 1.016) (layer F.Cu) (net 12)) + (segment (start 85.34146 135.12546) (end 85.344 135.128) (width 1.016) (layer F.Cu) (net 12) (tstamp 567A6A9C)) + (segment (start 93.333 143.879) (end 93.345 143.891) (width 0.254) (layer F.Cu) (net 12) (tstamp 5673B763)) + (segment (start 88.9 142.367) (end 87.757 143.51) (width 0.254) (layer B.Cu) (net 12) (tstamp 5673B703)) + (segment (start 88.9 138.684) (end 88.9 142.367) (width 0.254) (layer B.Cu) (net 12) (tstamp 5673B701)) + (segment (start 85.344 135.128) (end 88.9 138.684) (width 0.254) (layer B.Cu) (net 12) (tstamp 5673B700)) + (via (at 85.344 135.128) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 12)) + (segment (start 85.34146 135.12546) (end 85.344 135.128) (width 0.254) (layer F.Cu) (net 12) (tstamp 5673B6FE)) + (segment (start 86.36 143.51) (end 86.741 143.51) (width 0.254) (layer F.Cu) (net 12)) + (segment (start 86.741 143.51) (end 87.11 143.879) (width 0.254) (layer F.Cu) (net 12) (tstamp 5673B6A6)) + (segment (start 87.11 143.879) (end 88.9 143.879) (width 0.254) (layer F.Cu) (net 12) (tstamp 5673B6A7)) + (segment (start 78.74 160.516) (end 76.696 160.516) (width 0.254) (layer F.Cu) (net 13)) + (segment (start 76.696 160.516) (end 76.2 160.02) (width 0.254) (layer F.Cu) (net 13) (tstamp 5673B12D)) + (segment (start 78.498 157.48) (end 78.498 158.774) (width 0.254) (layer F.Cu) (net 14)) + (segment (start 78.498 158.774) (end 78.74 159.016) (width 0.254) (layer F.Cu) (net 14) (tstamp 5673B12A)) + (segment (start 78.498 157.48) (end 76.2 157.48) (width 0.254) (layer F.Cu) (net 14)) + (segment (start 94.485 137.922) (end 92.45854 137.922) (width 1.016) (layer F.Cu) (net 15)) + (segment (start 92.45854 137.922) (end 92.456 137.92454) (width 1.016) (layer F.Cu) (net 15) (tstamp 567A6B3A)) + (segment (start 92.45854 137.922) (end 92.456 137.92454) (width 0.508) (layer F.Cu) (net 15) (tstamp 567A6B32)) + (segment (start 92.456 137.92454) (end 92.456 135.37946) (width 1.016) (layer F.Cu) (net 15)) + (segment (start 92.456 135.37946) (end 92.71 135.12546) (width 1.016) (layer F.Cu) (net 15) (tstamp 567A6A99)) + (segment (start 92.45854 137.922) (end 92.456 137.92454) (width 0.254) (layer F.Cu) (net 15) (tstamp 5673B790)) + (segment (start 92.456 135.37946) (end 92.71 135.12546) (width 0.254) (layer F.Cu) (net 15) (tstamp 5673B769)) + (segment (start 98.921 143.891) (end 100.85 143.891) (width 1.016) (layer F.Cu) (net 16)) + (segment (start 101.41 158.052) (end 101.41 159.901) (width 0.254) (layer F.Cu) (net 16) (tstamp 5673BB02)) + (via (at 99.949 143.891) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 16)) + (segment (start 99.949 143.891) (end 101.346 145.288) (width 0.254) (layer B.Cu) (net 16) (tstamp 5673BAFA)) + (segment (start 101.346 145.288) (end 101.346 157.988) (width 0.254) (layer B.Cu) (net 16) (tstamp 5673BAFB)) + (via (at 101.346 157.988) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 16)) + (segment (start 101.346 157.988) (end 101.41 158.052) (width 0.254) (layer F.Cu) (net 16) (tstamp 5673BB01)) + (segment (start 100.85 143.891) (end 99.949 143.891) (width 0.254) (layer F.Cu) (net 16)) + (segment (start 98.921 143.891) (end 99.949 143.891) (width 0.254) (layer F.Cu) (net 16)) + (segment (start 102.21 159.901) (end 102.21 155.473) (width 0.254) (layer F.Cu) (net 17)) + (segment (start 101.6 154.863) (end 99.572 154.863) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BAD7)) + (segment (start 102.21 155.473) (end 101.6 154.863) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BAD1)) + (segment (start 99.572 154.863) (end 99.56 154.851) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BAD8)) + (segment (start 87.663 159.512) (end 86.487 159.512) (width 0.254) (layer F.Cu) (net 17)) + (segment (start 102.21 160.934) (end 102.21 159.901) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BA75)) + (segment (start 101.927002 161.216998) (end 102.21 160.934) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BA74)) + (segment (start 100.383998 161.216998) (end 101.927002 161.216998) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BA73)) + (segment (start 100.203 161.036) (end 100.383998 161.216998) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BA72)) + (segment (start 99.314 161.036) (end 100.203 161.036) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BA71)) + (via (at 99.314 161.036) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 17)) + (segment (start 98.933 161.417) (end 99.314 161.036) (width 0.254) (layer B.Cu) (net 17) (tstamp 5673BA6D)) + (segment (start 86.233 161.417) (end 98.933 161.417) (width 0.254) (layer B.Cu) (net 17) (tstamp 5673BA6C)) + (segment (start 85.852 161.036) (end 86.233 161.417) (width 0.254) (layer B.Cu) (net 17) (tstamp 5673BA6B)) + (segment (start 85.852 160.147) (end 85.852 161.036) (width 0.254) (layer B.Cu) (net 17) (tstamp 5673BA6A)) + (segment (start 86.233 159.766) (end 85.852 160.147) (width 0.254) (layer B.Cu) (net 17) (tstamp 5673BA69)) + (via (at 86.233 159.766) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 17)) + (segment (start 86.487 159.512) (end 86.233 159.766) (width 0.254) (layer F.Cu) (net 17) (tstamp 5673BA67)) + (segment (start 87.663 159.512) (end 87.663 160.782) (width 0.254) (layer F.Cu) (net 17)) + (segment (start 82.263 155.702) (end 84.201 155.702) (width 0.254) (layer F.Cu) (net 21)) + (segment (start 105.41 161.036) (end 105.41 159.901) (width 0.254) (layer F.Cu) (net 21) (tstamp 567A6C0E)) + (segment (start 104.721002 161.724998) (end 105.41 161.036) (width 0.254) (layer F.Cu) (net 21) (tstamp 567A6C0D)) + (segment (start 86.032998 161.724998) (end 104.721002 161.724998) (width 0.254) (layer F.Cu) (net 21) (tstamp 567A6C0A)) + (segment (start 85.09 160.782) (end 86.032998 161.724998) (width 0.254) (layer F.Cu) (net 21) (tstamp 567A6C09)) + (segment (start 85.09 156.591) (end 85.09 160.782) (width 0.254) (layer F.Cu) (net 21) (tstamp 567A6C08)) + (segment (start 84.201 155.702) (end 85.09 156.591) (width 0.254) (layer F.Cu) (net 21) (tstamp 567A6C06)) + (segment (start 82.263 158.242) (end 83.185 158.242) (width 0.254) (layer F.Cu) (net 22)) + (segment (start 106.21 161.125) (end 106.21 159.901) (width 0.254) (layer F.Cu) (net 22) (tstamp 5673B974)) + (segment (start 105.156 162.179) (end 106.21 161.125) (width 0.254) (layer F.Cu) (net 22) (tstamp 5673B973)) + (segment (start 84.709 162.179) (end 105.156 162.179) (width 0.254) (layer F.Cu) (net 22) (tstamp 5673B972)) + (segment (start 83.693 161.163) (end 84.709 162.179) (width 0.254) (layer F.Cu) (net 22) (tstamp 5673B971)) + (segment (start 83.693 158.75) (end 83.693 161.163) (width 0.254) (layer F.Cu) (net 22) (tstamp 5673B970)) + (segment (start 83.185 158.242) (end 83.693 158.75) (width 0.254) (layer F.Cu) (net 22) (tstamp 5673B96F)) + (segment (start 109.41 159.901) (end 109.41 156.02) (width 0.25) (layer F.Cu) (net 26)) + (segment (start 109.779 155.651) (end 111.26 155.651) (width 0.25) (layer F.Cu) (net 26) (tstamp 5675D872)) + (segment (start 109.41 156.02) (end 109.779 155.651) (width 0.25) (layer F.Cu) (net 26) (tstamp 5675D871)) + (segment (start 114.3 160.147) (end 114.3 160.401) (width 0.25) (layer F.Cu) (net 27)) + (segment (start 114.3 160.401) (end 113.919 160.782) (width 0.25) (layer F.Cu) (net 27) (tstamp 5675D854)) + (segment (start 113.919 160.782) (end 112.649 160.782) (width 0.25) (layer F.Cu) (net 27) (tstamp 5675D855)) + (segment (start 112.649 160.782) (end 111.26 159.393) (width 0.25) (layer F.Cu) (net 27) (tstamp 5675D856)) + (segment (start 111.26 159.393) (end 111.26 158.051) (width 0.25) (layer F.Cu) (net 27) (tstamp 5675D857)) + (segment (start 113.03 158.115) (end 113.03 157.353) (width 0.25) (layer F.Cu) (net 30)) + (segment (start 112.776 154.051) (end 111.26 154.051) (width 0.25) (layer F.Cu) (net 30) (tstamp 5675D883)) + (segment (start 113.284 154.559) (end 112.776 154.051) (width 0.25) (layer F.Cu) (net 30) (tstamp 5675D882)) + (segment (start 113.284 157.099) (end 113.284 154.559) (width 0.25) (layer F.Cu) (net 30) (tstamp 5675D881)) + (segment (start 113.03 157.353) (end 113.284 157.099) (width 0.25) (layer F.Cu) (net 30) (tstamp 5675D880)) + (segment (start 108.61 148.201) (end 108.61 149.327) (width 0.25) (layer F.Cu) (net 35)) + (segment (start 97.978 138.872) (end 97.285 138.872) (width 0.25) (layer F.Cu) (net 35) (tstamp 5675DEC8)) + (segment (start 98.425 139.319) (end 97.978 138.872) (width 0.25) (layer F.Cu) (net 35) (tstamp 5675DEC7)) + (via (at 98.425 139.319) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 35)) + (segment (start 98.425 146.558) (end 98.425 139.319) (width 0.25) (layer B.Cu) (net 35) (tstamp 5675DEC4)) + (segment (start 99.822 147.955) (end 98.425 146.558) (width 0.25) (layer B.Cu) (net 35) (tstamp 5675DEC3)) + (via (at 99.822 147.955) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 35)) + (segment (start 99.822 148.463) (end 99.822 147.955) (width 0.25) (layer F.Cu) (net 35) (tstamp 5675DEC0)) + (segment (start 99.822 148.59) (end 99.822 148.463) (width 0.25) (layer F.Cu) (net 35) (tstamp 5675DEBF)) + (segment (start 100.584 149.352) (end 99.822 148.59) (width 0.25) (layer F.Cu) (net 35) (tstamp 5675DEBE)) + (segment (start 108.585 149.352) (end 100.584 149.352) (width 0.25) (layer F.Cu) (net 35) (tstamp 5675DEBD)) + (segment (start 108.61 149.327) (end 108.585 149.352) (width 0.25) (layer F.Cu) (net 35) (tstamp 5675DEBC)) + (segment (start 97.285 138.872) (end 97.285 139.062) (width 0.25) (layer F.Cu) (net 35)) + (segment (start 108.585 148.226) (end 108.61 148.201) (width 0.25) (layer F.Cu) (net 35) (tstamp 5675DA3C)) + (segment (start 107.01 148.201) (end 107.01 144.958) (width 0.25) (layer F.Cu) (net 37)) + (segment (start 115.189 140.335) (end 115.189 139.24644) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBDB)) + (segment (start 114.554 140.97) (end 115.189 140.335) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBDA)) + (segment (start 110.49 140.97) (end 114.554 140.97) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBD8)) + (segment (start 108.966 142.494) (end 110.49 140.97) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBD7)) + (segment (start 108.966 143.383) (end 108.966 142.494) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBD6)) + (segment (start 107.823 144.526) (end 108.966 143.383) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBD5)) + (segment (start 107.442 144.526) (end 107.823 144.526) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBD4)) + (segment (start 107.01 144.958) (end 107.442 144.526) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBD3)) + (segment (start 115.189 139.24644) (end 115.2049 139.23054) (width 0.25) (layer F.Cu) (net 37) (tstamp 5675DBDC)) + (segment (start 114.5549 139.23054) (end 114.5549 139.9531) (width 0.25) (layer F.Cu) (net 38)) + (segment (start 106.21 144.488) (end 106.21 148.201) (width 0.25) (layer F.Cu) (net 38) (tstamp 5675DBD0)) + (segment (start 106.934 143.764) (end 106.21 144.488) (width 0.25) (layer F.Cu) (net 38) (tstamp 5675DBCF)) + (segment (start 107.696 143.764) (end 106.934 143.764) (width 0.25) (layer F.Cu) (net 38) (tstamp 5675DBCE)) + (segment (start 108.331 143.129) (end 107.696 143.764) (width 0.25) (layer F.Cu) (net 38) (tstamp 5675DBCD)) + (segment (start 108.331 142.24) (end 108.331 143.129) (width 0.25) (layer F.Cu) (net 38) (tstamp 5675DBCB)) + (segment (start 110.109 140.462) (end 108.331 142.24) (width 0.25) (layer F.Cu) (net 38) (tstamp 5675DBC8)) + (segment (start 114.046 140.462) (end 110.109 140.462) (width 0.25) (layer F.Cu) (net 38) (tstamp 5675DBC7)) + (segment (start 114.5549 139.9531) (end 114.046 140.462) (width 0.25) (layer F.Cu) (net 38) (tstamp 5675DBC6)) + (segment (start 83.173 146.05) (end 83.566 146.05) (width 0.254) (layer F.Cu) (net 39)) + (segment (start 105.41 146.431) (end 105.41 148.201) (width 0.254) (layer F.Cu) (net 39) (tstamp 5673BA1A)) + (segment (start 104.394 145.415) (end 105.41 146.431) (width 0.254) (layer F.Cu) (net 39) (tstamp 5673BA19)) + (segment (start 84.201 145.415) (end 104.394 145.415) (width 0.254) (layer F.Cu) (net 39) (tstamp 5673BA18)) + (segment (start 83.566 146.05) (end 84.201 145.415) (width 0.254) (layer F.Cu) (net 39) (tstamp 5673BA17)) + (segment (start 83.173 147.701) (end 83.173 147.459) (width 0.254) (layer F.Cu) (net 40)) + (segment (start 83.173 147.459) (end 84.582 146.05) (width 0.254) (layer F.Cu) (net 40) (tstamp 5673BA23)) + (segment (start 84.582 146.05) (end 104.14 146.05) (width 0.254) (layer F.Cu) (net 40) (tstamp 5673BA24)) + (segment (start 104.14 146.05) (end 104.61 146.52) (width 0.254) (layer F.Cu) (net 40) (tstamp 5673BA26)) + (segment (start 104.61 146.52) (end 104.61 148.201) (width 0.254) (layer F.Cu) (net 40) (tstamp 5673BA27)) + (segment (start 102.21 148.201) (end 102.21 147.041) (width 0.254) (layer F.Cu) (net 41)) + (segment (start 83.947 148.578) (end 83.173 149.352) (width 0.254) (layer F.Cu) (net 41) (tstamp 5673BA32)) + (segment (start 83.947 147.701) (end 83.947 148.578) (width 0.254) (layer F.Cu) (net 41) (tstamp 5673BA30)) + (segment (start 84.963 146.685) (end 83.947 147.701) (width 0.254) (layer F.Cu) (net 41) (tstamp 5673BA2F)) + (segment (start 101.854 146.685) (end 84.963 146.685) (width 0.254) (layer F.Cu) (net 41) (tstamp 5673BA2E)) + (segment (start 102.21 147.041) (end 101.854 146.685) (width 0.254) (layer F.Cu) (net 41) (tstamp 5673BA2D)) + (segment (start 100.529 147.32) (end 101.41 148.201) (width 0.254) (layer F.Cu) (net 42) (tstamp 5673BA46)) + (segment (start 85.217 147.32) (end 100.529 147.32) (width 0.254) (layer F.Cu) (net 42) (tstamp 5673BA45)) + (segment (start 84.455 148.082) (end 85.217 147.32) (width 0.254) (layer F.Cu) (net 42) (tstamp 5673BA44)) + (segment (start 84.455 149.491) (end 84.455 148.082) (width 0.254) (layer F.Cu) (net 42)) + (segment (start 99.56 150.051) (end 103.441 150.051) (width 0.25) (layer F.Cu) (net 43)) + (segment (start 106.426 136.652) (end 107.696 135.382) (width 0.25) (layer B.Cu) (net 43) (tstamp 5675DED7)) + (segment (start 106.426 139.7) (end 106.426 136.652) (width 0.25) (layer B.Cu) (net 43) (tstamp 5675DED6)) + (segment (start 106.045 140.081) (end 106.426 139.7) (width 0.25) (layer B.Cu) (net 43) (tstamp 5675DED5)) + (via (at 106.045 140.081) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 43)) + (segment (start 105.664 140.462) (end 106.045 140.081) (width 0.25) (layer F.Cu) (net 43) (tstamp 5675DED3)) + (segment (start 105.664 143.129) (end 105.664 140.462) (width 0.25) (layer F.Cu) (net 43) (tstamp 5675DED2)) + (segment (start 105.029 143.764) (end 105.664 143.129) (width 0.25) (layer F.Cu) (net 43) (tstamp 5675DED1)) + (via (at 105.029 143.764) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 43)) + (segment (start 105.029 148.463) (end 105.029 143.764) (width 0.25) (layer B.Cu) (net 43) (tstamp 5675DECE)) + (segment (start 103.505 149.987) (end 105.029 148.463) (width 0.25) (layer B.Cu) (net 43) (tstamp 5675DECD)) + (via (at 103.505 149.987) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 43)) + (segment (start 103.441 150.051) (end 103.505 149.987) (width 0.25) (layer F.Cu) (net 43) (tstamp 5675DECB)) + (segment (start 99.56 150.851) (end 104.038 150.851) (width 0.25) (layer F.Cu) (net 44)) + (segment (start 107.696 139.827) (end 107.696 137.922) (width 0.25) (layer B.Cu) (net 44) (tstamp 5675DEFC)) + (segment (start 107.569 139.954) (end 107.696 139.827) (width 0.25) (layer B.Cu) (net 44) (tstamp 5675DEFB)) + (via (at 107.569 139.954) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 44)) + (segment (start 106.299 141.224) (end 107.569 139.954) (width 0.25) (layer F.Cu) (net 44) (tstamp 5675DEF7)) + (segment (start 106.299 143.51) (end 106.299 141.224) (width 0.25) (layer F.Cu) (net 44) (tstamp 5675DEF6)) + (segment (start 106.045 143.764) (end 106.299 143.51) (width 0.25) (layer F.Cu) (net 44) (tstamp 5675DEF5)) + (via (at 106.045 143.764) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 44)) + (segment (start 106.045 149.225) (end 106.045 143.764) (width 0.25) (layer B.Cu) (net 44) (tstamp 5675DEF3)) + (segment (start 105.283 149.987) (end 106.045 149.225) (width 0.25) (layer B.Cu) (net 44) (tstamp 5675DEF2)) + (via (at 105.283 149.987) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 44)) + (segment (start 104.902 149.987) (end 105.283 149.987) (width 0.25) (layer F.Cu) (net 44) (tstamp 5675DEF0)) + (segment (start 104.038 150.851) (end 104.902 149.987) (width 0.25) (layer F.Cu) (net 44) (tstamp 5675DEEF)) + (segment (start 87.663 153.162) (end 87.663 152.24) (width 0.254) (layer F.Cu) (net 48)) + (segment (start 97.65 156.451) (end 99.56 156.451) (width 0.254) (layer F.Cu) (net 48) (tstamp 5673BACB)) + (segment (start 97.282 156.083) (end 97.65 156.451) (width 0.254) (layer F.Cu) (net 48) (tstamp 5673BACA)) + (via (at 97.282 156.083) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 48)) + (segment (start 97.282 155.067) (end 97.282 156.083) (width 0.254) (layer B.Cu) (net 48) (tstamp 5673BAC7)) + (segment (start 95.377 153.162) (end 97.282 155.067) (width 0.254) (layer B.Cu) (net 48) (tstamp 5673BAC5)) + (segment (start 92.837 153.162) (end 95.377 153.162) (width 0.254) (layer B.Cu) (net 48) (tstamp 5673BAC3)) + (segment (start 91.44 151.765) (end 92.837 153.162) (width 0.254) (layer B.Cu) (net 48) (tstamp 5673BAC1)) + (segment (start 88.138 151.765) (end 91.44 151.765) (width 0.254) (layer B.Cu) (net 48) (tstamp 5673BAC0)) + (segment (start 87.757 152.146) (end 88.138 151.765) (width 0.254) (layer B.Cu) (net 48) (tstamp 5673BABF)) + (via (at 87.757 152.146) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 48)) + (segment (start 87.663 152.24) (end 87.757 152.146) (width 0.254) (layer F.Cu) (net 48) (tstamp 5673BABD)) + (segment (start 87.663 154.432) (end 87.663 153.162) (width 0.254) (layer F.Cu) (net 48)) + (segment (start 91.567 157.734) (end 91.567 153.162) (width 0.254) (layer B.Cu) (net 50)) + (segment (start 90.932 152.781) (end 90.666 153.047) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673BA97)) + (segment (start 91.186 152.781) (end 90.932 152.781) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673BA96)) + (segment (start 91.567 153.162) (end 91.186 152.781) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673BA95)) + (via (at 91.567 153.162) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 50)) + (segment (start 90.666 153.047) (end 90.666 153.416) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673BA98)) + (segment (start 91.567 157.734) (end 92.202 157.734) (width 0.254) (layer B.Cu) (net 50)) + (segment (start 97.854 158.051) (end 99.56 158.051) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673BA7C)) + (segment (start 97.663 158.242) (end 97.854 158.051) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673BA7B)) + (via (at 97.663 158.242) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 50)) + (segment (start 92.71 158.242) (end 97.663 158.242) (width 0.254) (layer B.Cu) (net 50) (tstamp 5673BA79)) + (segment (start 92.202 157.734) (end 92.71 158.242) (width 0.254) (layer B.Cu) (net 50) (tstamp 5673BA78)) + (segment (start 90.666 158.508) (end 91.44 157.734) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673B34D)) + (via (at 91.567 157.734) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 50)) + (segment (start 91.44 157.734) (end 91.567 157.734) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673B34E)) + (segment (start 89.039 150.114) (end 89.039 151.765) (width 0.254) (layer F.Cu) (net 50)) + (segment (start 90.666 153.416) (end 90.666 153.404) (width 0.254) (layer F.Cu) (net 50)) + (segment (start 90.666 153.404) (end 89.039 151.777) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673B35F)) + (segment (start 89.039 151.777) (end 89.039 151.765) (width 0.254) (layer F.Cu) (net 50) (tstamp 5673B360)) + (segment (start 90.666 158.877) (end 90.666 158.508) (width 0.254) (layer F.Cu) (net 50)) + (segment (start 76.2 149.86) (end 77.597 149.86) (width 0.254) (layer F.Cu) (net 52)) + (segment (start 78.74 151.003) (end 81.546 151.003) (width 0.254) (layer F.Cu) (net 52) (tstamp 5673BA09)) + (segment (start 77.597 149.86) (end 78.74 151.003) (width 0.254) (layer F.Cu) (net 52) (tstamp 5673BA08)) + (segment (start 79.006 149.352) (end 78.486 149.352) (width 0.254) (layer F.Cu) (net 53)) + (segment (start 77.47 148.59) (end 76.2 147.32) (width 0.254) (layer F.Cu) (net 53) (tstamp 5673BA05)) + (segment (start 77.724 148.59) (end 77.47 148.59) (width 0.254) (layer F.Cu) (net 53) (tstamp 5673BA04)) + (segment (start 78.486 149.352) (end 77.724 148.59) (width 0.254) (layer F.Cu) (net 53) (tstamp 5673BA03)) + (segment (start 79.006 147.701) (end 78.867 147.701) (width 0.254) (layer F.Cu) (net 54)) + (segment (start 78.867 147.701) (end 77.851 146.685) (width 0.254) (layer F.Cu) (net 54) (tstamp 5673B9FC)) + (segment (start 77.851 146.685) (end 77.851 145.034) (width 0.254) (layer F.Cu) (net 54) (tstamp 5673B9FD)) + (segment (start 77.851 145.034) (end 77.597 144.78) (width 0.254) (layer F.Cu) (net 54) (tstamp 5673B9FF)) + (segment (start 77.597 144.78) (end 76.2 144.78) (width 0.254) (layer F.Cu) (net 54) (tstamp 5673BA00)) + (segment (start 76.454 144.78) (end 76.2 144.78) (width 0.254) (layer F.Cu) (net 54) (tstamp 5673B435)) + (segment (start 79.006 146.05) (end 79.006 144.03) (width 0.254) (layer F.Cu) (net 55)) + (segment (start 79.006 144.03) (end 77.216 142.24) (width 0.254) (layer F.Cu) (net 55) (tstamp 5673B9F1)) + (segment (start 77.216 142.24) (end 76.2 142.24) (width 0.254) (layer F.Cu) (net 55) (tstamp 5673B9F2)) + (segment (start 113.665 158.115) (end 113.665 157.861) (width 0.25) (layer F.Cu) (net 56)) + (segment (start 113.665 157.861) (end 114.046 157.48) (width 0.25) (layer F.Cu) (net 56) (tstamp 5675D863)) + (segment (start 114.046 157.48) (end 116.84 157.48) (width 0.25) (layer F.Cu) (net 56) (tstamp 5675D864)) + (segment (start 113.665 160.147) (end 113.665 159.639) (width 0.25) (layer F.Cu) (net 57)) + (segment (start 113.792 159.512) (end 116.332 159.512) (width 0.25) (layer F.Cu) (net 57) (tstamp 5675D85C)) + (segment (start 113.665 159.639) (end 113.792 159.512) (width 0.25) (layer F.Cu) (net 57) (tstamp 5675D85B)) + (segment (start 116.332 159.512) (end 116.84 160.02) (width 0.25) (layer F.Cu) (net 57) (tstamp 5675D85D)) + (segment (start 89.166 155.067) (end 89.166 153.416) (width 0.254) (layer F.Cu) (net 58)) + (segment (start 87.663 155.702) (end 88.531 155.702) (width 0.254) (layer F.Cu) (net 58)) + (segment (start 88.531 155.702) (end 89.166 155.067) (width 0.254) (layer F.Cu) (net 58) (tstamp 5673B2E6)) + (segment (start 89.166 160.528) (end 89.166 158.877) (width 0.254) (layer F.Cu) (net 59)) + (segment (start 89.166 158.877) (end 89.166 158.635) (width 0.254) (layer F.Cu) (net 59)) + (segment (start 89.166 158.635) (end 88.773 158.242) (width 0.254) (layer F.Cu) (net 59) (tstamp 5673B2DC)) + (segment (start 88.773 158.242) (end 87.663 158.242) (width 0.254) (layer F.Cu) (net 59) (tstamp 5673B2DD)) + (segment (start 87.79 158.115) (end 87.663 158.242) (width 0.254) (layer F.Cu) (net 59) (tstamp 5673B248)) + (segment (start 84.455 150.991) (end 83.058 150.991) (width 0.254) (layer F.Cu) (net 63)) + (segment (start 83.058 150.991) (end 83.046 151.003) (width 0.254) (layer F.Cu) (net 63) (tstamp 5673BA41)) + (segment (start 80.391 153.555) (end 80.391 153.543) (width 0.254) (layer F.Cu) (net 64)) + (segment (start 80.391 153.543) (end 79.998 153.15) (width 0.254) (layer F.Cu) (net 64) (tstamp 5673B124)) + (segment (start 79.998 153.15) (end 79.998 152.146) (width 0.254) (layer F.Cu) (net 64) (tstamp 5673B125)) + (segment (start 82.263 154.432) (end 82.263 153.162) (width 0.254) (layer F.Cu) (net 65)) + (segment (start 80.911 155.055) (end 81.534 154.432) (width 0.254) (layer F.Cu) (net 65) (tstamp 5673B36A)) + (segment (start 81.534 154.432) (end 82.263 154.432) (width 0.254) (layer F.Cu) (net 65) (tstamp 5673B36B)) + (segment (start 80.391 155.055) (end 80.911 155.055) (width 0.254) (layer F.Cu) (net 65)) + (segment (start 80.391 158.889) (end 80.391 158.75) (width 0.254) (layer F.Cu) (net 66)) + (segment (start 80.391 158.75) (end 79.998 158.357) (width 0.254) (layer F.Cu) (net 66) (tstamp 5673B145)) + (segment (start 79.998 158.357) (end 79.998 157.48) (width 0.254) (layer F.Cu) (net 66) (tstamp 5673B146)) + (segment (start 82.263 159.512) (end 82.263 160.782) (width 0.254) (layer F.Cu) (net 67)) + (segment (start 80.391 160.389) (end 80.887 160.389) (width 0.254) (layer F.Cu) (net 67)) + (segment (start 81.28 160.782) (end 82.263 160.782) (width 0.254) (layer F.Cu) (net 67) (tstamp 5673B36F)) + (segment (start 80.887 160.389) (end 81.28 160.782) (width 0.254) (layer F.Cu) (net 67) (tstamp 5673B36E)) + +) diff --git a/PCB/WOT/Tinylab_proto1.kicad_pcb.bak b/PCB/WOT/Tinylab_proto1.kicad_pcb.bak new file mode 100644 index 00000000..6c7db377 --- /dev/null +++ b/PCB/WOT/Tinylab_proto1.kicad_pcb.bak @@ -0,0 +1,1945 @@ +(kicad_pcb (version 4) (host pcbnew "(2015-08-05 BZR 6055, Git fa29c62)-product") + + (general + (links 98) + (no_connects 42) + (area 88.849999 71.069999 230.555001 151.180001) + (thickness 1.6) + (drawings 5) + (tracks 132) + (zones 0) + (modules 47) + (nets 69) + ) + + (page A4) + (layers + (0 F.Cu signal) + (31 B.Cu signal) + (32 B.Adhes user) + (33 F.Adhes user) + (34 B.Paste user) + (35 F.Paste user) + (36 B.SilkS user) + (37 F.SilkS user) + (38 B.Mask user) + (39 F.Mask user) + (40 Dwgs.User user) + (41 Cmts.User user) + (42 Eco1.User user) + (43 Eco2.User user) + (44 Edge.Cuts user) + (45 Margin user) + (46 B.CrtYd user) + (47 F.CrtYd user) + (48 B.Fab user) + (49 F.Fab user) + ) + + (setup + (last_trace_width 0.25) + (trace_clearance 0.2) + (zone_clearance 0.508) + (zone_45_only no) + (trace_min 0.2) + (segment_width 0.2) + (edge_width 0.1) + (via_size 0.6) + (via_drill 0.4) + (via_min_size 0.4) + (via_min_drill 0.3) + (uvia_size 0.3) + (uvia_drill 0.1) + (uvias_allowed no) + (uvia_min_size 0.2) + (uvia_min_drill 0.1) + (pcb_text_width 0.3) + (pcb_text_size 1.5 1.5) + (mod_edge_width 0.15) + (mod_text_size 1 1) + (mod_text_width 0.15) + (pad_size 1.5 1.5) + (pad_drill 0.6) + (pad_to_mask_clearance 0) + (aux_axis_origin 0 0) + (visible_elements FFFFF77F) + (pcbplotparams + (layerselection 0x00030_80000001) + (usegerberextensions false) + (excludeedgelayer true) + (linewidth 0.100000) + (plotframeref false) + (viasonmask false) + (mode 1) + (useauxorigin false) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15) + (hpglpenoverlay 2) + (psnegative false) + (psa4output false) + (plotreference true) + (plotvalue true) + (plotinvisibletext false) + (padsonsilk false) + (subtractmaskfromsilk false) + (outputformat 1) + (mirror false) + (drillshape 1) + (scaleselection 1) + (outputdirectory "")) + ) + + (net 0 "") + (net 1 "Net-(C1-Pad1)") + (net 2 "Net-(C1-Pad2)") + (net 3 "Net-(C2-Pad1)") + (net 4 "Net-(C2-Pad2)") + (net 5 +5V) + (net 6 GND) + (net 7 /VCC_3V3) + (net 8 /AVCC) + (net 9 /AGND) + (net 10 "Net-(C6-Pad1)") + (net 11 "Net-(C7-Pad1)") + (net 12 "Net-(C7-Pad2)") + (net 13 /LM324_VCC) + (net 14 /VGND) + (net 15 /VSENSE_OCP) + (net 16 "Net-(C9-Pad1)") + (net 17 "Net-(IC1-Pad1)") + (net 18 "Net-(IC1-Pad2)") + (net 19 "Net-(IC1-Pad3)") + (net 20 "Net-(IC1-Pad4)") + (net 21 "Net-(IC1-Pad5)") + (net 22 /DAC_OUT) + (net 23 "Net-(IC1-Pad7)") + (net 24 "Net-(IC1-Pad10)") + (net 25 /XCK) + (net 26 /DIG_CH2) + (net 27 "Net-(IC1-Pad13)") + (net 28 "Net-(IC1-Pad16)") + (net 29 /DIG_CH1) + (net 30 "Net-(IC1-Pad20)") + (net 31 "Net-(IC1-Pad21)") + (net 32 "Net-(IC1-Pad22)") + (net 33 "Net-(IC1-Pad23)") + (net 34 /PSU_PWM) + (net 35 "Net-(IC1-Pad25)") + (net 36 /D-) + (net 37 /D+) + (net 38 "Net-(IC1-Pad28)") + (net 39 "Net-(IC1-Pad29)") + (net 40 "Net-(IC1-Pad32)") + (net 41 "Net-(IC1-Pad33)") + (net 42 "Net-(IC1-Pad34)") + (net 43 "Net-(IC1-Pad35)") + (net 44 "Net-(IC1-Pad36)") + (net 45 "Net-(IC1-Pad37)") + (net 46 /CH1) + (net 47 /CH2) + (net 48 /AVCC_ON_2) + (net 49 "Net-(P2-Pad4)") + (net 50 "Net-(P3-Pad1)") + (net 51 "Net-(P3-Pad2)") + (net 52 "Net-(P3-Pad3)") + (net 53 "Net-(P3-Pad4)") + (net 54 +12V) + (net 55 "Net-(P4-Pad3)") + (net 56 "Net-(P8-Pad1)") + (net 57 "Net-(P8-Pad2)") + (net 58 "Net-(R1-Pad1)") + (net 59 "Net-(R2-Pad1)") + (net 60 "Net-(R11-Pad2)") + (net 61 "Net-(R12-Pad2)") + (net 62 "Net-(R13-Pad2)") + (net 63 "Net-(R10-Pad1)") + (net 64 "Net-(R16-Pad1)") + (net 65 "Net-(R18-Pad1)") + (net 66 "Net-(R18-Pad2)") + (net 67 "Net-(R21-Pad1)") + (net 68 "Net-(R22-Pad1)") + + (net_class Default "This is the default net class." + (clearance 0.2) + (trace_width 0.25) + (via_dia 0.6) + (via_drill 0.4) + (uvia_dia 0.3) + (uvia_drill 0.1) + (add_net +12V) + (add_net +5V) + (add_net /AGND) + (add_net /AVCC) + (add_net /AVCC_ON_2) + (add_net /CH1) + (add_net /CH2) + (add_net /D+) + (add_net /D-) + (add_net /DAC_OUT) + (add_net /DIG_CH1) + (add_net /DIG_CH2) + (add_net /LM324_VCC) + (add_net /PSU_PWM) + (add_net /VCC_3V3) + (add_net /VGND) + (add_net /VSENSE_OCP) + (add_net /XCK) + (add_net GND) + (add_net "Net-(C1-Pad1)") + (add_net "Net-(C1-Pad2)") + (add_net "Net-(C2-Pad1)") + (add_net "Net-(C2-Pad2)") + (add_net "Net-(C6-Pad1)") + (add_net "Net-(C7-Pad1)") + (add_net "Net-(C7-Pad2)") + (add_net "Net-(C9-Pad1)") + (add_net "Net-(IC1-Pad1)") + (add_net "Net-(IC1-Pad10)") + (add_net "Net-(IC1-Pad13)") + (add_net "Net-(IC1-Pad16)") + (add_net "Net-(IC1-Pad2)") + (add_net "Net-(IC1-Pad20)") + (add_net "Net-(IC1-Pad21)") + (add_net "Net-(IC1-Pad22)") + (add_net "Net-(IC1-Pad23)") + (add_net "Net-(IC1-Pad25)") + (add_net "Net-(IC1-Pad28)") + (add_net "Net-(IC1-Pad29)") + (add_net "Net-(IC1-Pad3)") + (add_net "Net-(IC1-Pad32)") + (add_net "Net-(IC1-Pad33)") + (add_net "Net-(IC1-Pad34)") + (add_net "Net-(IC1-Pad35)") + (add_net "Net-(IC1-Pad36)") + (add_net "Net-(IC1-Pad37)") + (add_net "Net-(IC1-Pad4)") + (add_net "Net-(IC1-Pad5)") + (add_net "Net-(IC1-Pad7)") + (add_net "Net-(P2-Pad4)") + (add_net "Net-(P3-Pad1)") + (add_net "Net-(P3-Pad2)") + (add_net "Net-(P3-Pad3)") + (add_net "Net-(P3-Pad4)") + (add_net "Net-(P4-Pad3)") + (add_net "Net-(P8-Pad1)") + (add_net "Net-(P8-Pad2)") + (add_net "Net-(R1-Pad1)") + (add_net "Net-(R10-Pad1)") + (add_net "Net-(R11-Pad2)") + (add_net "Net-(R12-Pad2)") + (add_net "Net-(R13-Pad2)") + (add_net "Net-(R16-Pad1)") + (add_net "Net-(R18-Pad1)") + (add_net "Net-(R18-Pad2)") + (add_net "Net-(R2-Pad1)") + (add_net "Net-(R21-Pad1)") + (add_net "Net-(R22-Pad1)") + ) + + (module Capacitors_SMD:C_1206_HandSoldering placed (layer F.Cu) (tedit 541A9C03) (tstamp 55DD05E1) + (at 124.1044 142.494 270) + (descr "Capacitor SMD 1206, hand soldering") + (tags "capacitor 1206") + (path /55CAB611) + (attr smd) + (fp_text reference C1 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.15) (end 3.3 -1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.15) (end -3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 -1.025) (end -1 -1.025) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 1.025) (end 1 1.025) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.6) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (pad 2 smd rect (at 2 0 270) (size 2 1.6) (layers F.Cu F.Paste F.Mask) + (net 2 "Net-(C1-Pad2)")) + (model Capacitors_SMD.3dshapes/C_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_1206_HandSoldering placed (layer F.Cu) (tedit 541A9C03) (tstamp 55DD05E7) + (at 119.2784 142.5448 270) + (descr "Capacitor SMD 1206, hand soldering") + (tags "capacitor 1206") + (path /55CAB4DE) + (attr smd) + (fp_text reference C2 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.15) (end 3.3 -1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.15) (end -3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 -1.025) (end -1 -1.025) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 1.025) (end 1 1.025) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.6) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (pad 2 smd rect (at 2 0 270) (size 2 1.6) (layers F.Cu F.Paste F.Mask) + (net 4 "Net-(C2-Pad2)")) + (model Capacitors_SMD.3dshapes/C_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_1206_HandSoldering placed (layer F.Cu) (tedit 541A9C03) (tstamp 55DD05ED) + (at 100.5586 100.838 270) + (descr "Capacitor SMD 1206, hand soldering") + (tags "capacitor 1206") + (path /55CB13E1) + (attr smd) + (fp_text reference C3 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.15) (end 3.3 -1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.15) (end -3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 -1.025) (end -1 -1.025) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 1.025) (end 1 1.025) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.6) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at 2 0 270) (size 2 1.6) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (model Capacitors_SMD.3dshapes/C_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_1206_HandSoldering placed (layer F.Cu) (tedit 541A9C03) (tstamp 55DD05F3) + (at 105.41 105.7402 180) + (descr "Capacitor SMD 1206, hand soldering") + (tags "capacitor 1206") + (path /55CB147C) + (attr smd) + (fp_text reference C4 (at 0 -2.3 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 2.3 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.15) (end 3.3 -1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.15) (end -3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 -1.025) (end -1 -1.025) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 1.025) (end 1 1.025) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 180) (size 2 1.6) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 2 smd rect (at 2 0 180) (size 2 1.6) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (model Capacitors_SMD.3dshapes/C_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_1206_HandSoldering placed (layer F.Cu) (tedit 541A9C03) (tstamp 55DD05F9) + (at 121.4628 117.9068) + (descr "Capacitor SMD 1206, hand soldering") + (tags "capacitor 1206") + (path /55D60181) + (attr smd) + (fp_text reference C5 (at 0 -2.3) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 2.3) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.15) (end 3.3 -1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.15) (end -3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 -1.025) (end -1 -1.025) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 1.025) (end 1 1.025) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0) (size 2 1.6) (layers F.Cu F.Paste F.Mask) + (net 8 /AVCC)) + (pad 2 smd rect (at 2 0) (size 2 1.6) (layers F.Cu F.Paste F.Mask) + (net 9 /AGND)) + (model Capacitors_SMD.3dshapes/C_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_1206_HandSoldering placed (layer F.Cu) (tedit 55DD0752) (tstamp 55DD05FF) + (at 188.6966 94.234 180) + (descr "Capacitor SMD 1206, hand soldering") + (tags "capacitor 1206") + (path /55CC1A1C) + (attr smd) + (fp_text reference C6 (at 0 -2.3 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0.254 2.3495 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.15) (end 3.3 -1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.15) (end -3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 -1.025) (end -1 -1.025) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 1.025) (end 1 1.025) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 180) (size 2 1.6) (layers F.Cu F.Paste F.Mask) + (net 10 "Net-(C6-Pad1)")) + (pad 2 smd rect (at 2 0 180) (size 2 1.6) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (model Capacitors_SMD.3dshapes/C_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_1206_HandSoldering placed (layer F.Cu) (tedit 541A9C03) (tstamp 55DD0605) + (at 190.9572 143.9164 90) + (descr "Capacitor SMD 1206, hand soldering") + (tags "capacitor 1206") + (path /55CB630B) + (attr smd) + (fp_text reference C7 (at 0 -2.3 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 2.3 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.15) (end 3.3 -1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.15) (end -3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 -1.025) (end -1 -1.025) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 1.025) (end 1 1.025) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 90) (size 2 1.6) (layers F.Cu F.Paste F.Mask) + (net 11 "Net-(C7-Pad1)")) + (pad 2 smd rect (at 2 0 90) (size 2 1.6) (layers F.Cu F.Paste F.Mask) + (net 12 "Net-(C7-Pad2)")) + (model Capacitors_SMD.3dshapes/C_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_1206_HandSoldering placed (layer F.Cu) (tedit 541A9C03) (tstamp 55DD060B) + (at 190.3222 111.9886 270) + (descr "Capacitor SMD 1206, hand soldering") + (tags "capacitor 1206") + (path /55D75F49) + (attr smd) + (fp_text reference C8 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.15) (end 3.3 -1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.15) (end -3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.15) (end 3.3 1.15) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 -1.025) (end -1 -1.025) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 1.025) (end 1 1.025) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.6) (layers F.Cu F.Paste F.Mask) + (net 13 /LM324_VCC)) + (pad 2 smd rect (at 2 0 270) (size 2 1.6) (layers F.Cu F.Paste F.Mask) + (net 14 /VGND)) + (model Capacitors_SMD.3dshapes/C_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_Elko_ThroughHole:Elko_vert_11.2x6.3mm_RM2.5_CopperClear placed (layer F.Cu) (tedit 5454A12B) (tstamp 55DD0611) + (at 206.0194 117.2464 270) + (descr "Electrolytic Capacitor, vertical, diameter 6,3mm, RM 2,5mm, CopperClear, radial,") + (tags "Electrolytic Capacitor, vertical, diameter 6,3mm, RM 2,5mm, Elko, Electrolytkondensator, Kondensator gepolt, Durchmesser 6,3mm, CopperClear, radial,") + (path /55CC64C3) + (fp_text reference C9 (at 1.27 -5.08 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.27 5.08 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 0.26924 -1.69926) (end 0.76962 -1.69926) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.26924 -1.69926) (end 0.26924 -2.19964) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.23114 -1.69926) (end 0.26924 -1.69926) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.26924 -1.69926) (end 0.26924 -1.30048) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.26924 -1.30048) (end 0.26924 -1.19888) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.27 0) (end 4.4196 0) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at 2.54 0 270) (size 1.50114 1.50114) (drill 0.8001) (layers *.Cu *.Mask F.SilkS) + (net 15 /VSENSE_OCP)) + (pad 1 thru_hole circle (at 0 0 270) (size 1.50114 1.50114) (drill 0.8001) (layers *.Cu *.Mask F.SilkS) + (net 16 "Net-(C9-Pad1)")) + (model Capacitors_Elko_ThroughHole.3dshapes/Elko_vert_11.2x6.3mm_RM2.5_CopperClear.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module SMD:SMD_1206 placed (layer F.Cu) (tedit 5510702E) (tstamp 55DD0617) + (at 100.584 107.3658) + (tags Handsolderable) + (path /55D739F3) + (fp_text reference F1 (at -1.7 0 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value F_Small (at 2.6 0 90) (layer F.SilkS) hide + (effects (font (thickness 0.3048))) + ) + (fp_line (start -0.8 -1.6) (end 0.8 -1.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.8 -1.6) (end 0.8 1.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.8 1.6) (end -0.8 1.6) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.8 1.6) (end -0.8 -1.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at 0 -1.6) (size 2 2) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 2 smd rect (at 0 1.6) (size 2 2) (layers F.Cu F.Paste F.Mask) + (net 14 /VGND)) + (model 3D/SMD/SMD-1206.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm placed (layer F.Cu) (tedit 54130A77) (tstamp 55DD0647) + (at 158.115 107.95) + (descr "LQFP44 (see Appnote_PCB_Guidelines_TRINAMIC_packages.pdf)") + (tags "QFP 0.8") + (path /55CA8F25) + (attr smd) + (fp_text reference IC1 (at 0 -7.65) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value ATXMEGA16A4U-A (at 0 7.65) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -6.9 -6.9) (end -6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start 6.9 -6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 -6.9) (end 6.9 -6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.175 -5.175) (end -5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -5.175) (end -4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -4.505) (end -6.65 -4.505) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -5.85 -4) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 17 "Net-(IC1-Pad1)")) + (pad 2 smd rect (at -5.85 -3.2) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 18 "Net-(IC1-Pad2)")) + (pad 3 smd rect (at -5.85 -2.4) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 19 "Net-(IC1-Pad3)")) + (pad 4 smd rect (at -5.85 -1.6) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 20 "Net-(IC1-Pad4)")) + (pad 5 smd rect (at -5.85 -0.8) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 21 "Net-(IC1-Pad5)")) + (pad 6 smd rect (at -5.85 0) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 22 /DAC_OUT)) + (pad 7 smd rect (at -5.85 0.8) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 23 "Net-(IC1-Pad7)")) + (pad 8 smd rect (at -5.85 1.6) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 9 smd rect (at -5.85 2.4) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 10 smd rect (at -5.85 3.2) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 24 "Net-(IC1-Pad10)")) + (pad 11 smd rect (at -5.85 4) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 25 /XCK)) + (pad 12 smd rect (at -4 5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 26 /DIG_CH2)) + (pad 13 smd rect (at -3.2 5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 27 "Net-(IC1-Pad13)")) + (pad 14 smd rect (at -2.4 5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 15 smd rect (at -1.6 5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 25 /XCK)) + (pad 16 smd rect (at -0.8 5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 28 "Net-(IC1-Pad16)")) + (pad 17 smd rect (at 0 5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 29 /DIG_CH1)) + (pad 18 smd rect (at 0.8 5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 19 smd rect (at 1.6 5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 20 smd rect (at 2.4 5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 30 "Net-(IC1-Pad20)")) + (pad 21 smd rect (at 3.2 5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 31 "Net-(IC1-Pad21)")) + (pad 22 smd rect (at 4 5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 32 "Net-(IC1-Pad22)")) + (pad 23 smd rect (at 5.85 4) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 33 "Net-(IC1-Pad23)")) + (pad 24 smd rect (at 5.85 3.2) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 34 /PSU_PWM)) + (pad 25 smd rect (at 5.85 2.4) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 35 "Net-(IC1-Pad25)")) + (pad 26 smd rect (at 5.85 1.6) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 36 /D-)) + (pad 27 smd rect (at 5.85 0.8) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 37 /D+)) + (pad 28 smd rect (at 5.85 0) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 38 "Net-(IC1-Pad28)")) + (pad 29 smd rect (at 5.85 -0.8) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 39 "Net-(IC1-Pad29)")) + (pad 30 smd rect (at 5.85 -1.6) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 31 smd rect (at 5.85 -2.4) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 32 smd rect (at 5.85 -3.2) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 40 "Net-(IC1-Pad32)")) + (pad 33 smd rect (at 5.85 -4) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 41 "Net-(IC1-Pad33)")) + (pad 34 smd rect (at 4 -5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 42 "Net-(IC1-Pad34)")) + (pad 35 smd rect (at 3.2 -5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 43 "Net-(IC1-Pad35)")) + (pad 36 smd rect (at 2.4 -5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 44 "Net-(IC1-Pad36)")) + (pad 37 smd rect (at 1.6 -5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 45 "Net-(IC1-Pad37)")) + (pad 38 smd rect (at 0.8 -5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 9 /AGND)) + (pad 39 smd rect (at 0 -5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 8 /AVCC)) + (pad 40 smd rect (at -0.8 -5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 46 /CH1)) + (pad 41 smd rect (at -1.6 -5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 15 /VSENSE_OCP)) + (pad 42 smd rect (at -2.4 -5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 47 /CH2)) + (pad 43 smd rect (at -3.2 -5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 14 /VGND)) + (pad 44 smd rect (at -4 -5.85 90) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 48 /AVCC_ON_2)) + (model Housings_QFP.3dshapes/LQFP-44_10x10mm_Pitch0.8mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 placed (layer F.Cu) (tedit 0) (tstamp 55DD064F) + (at 117.7544 148.0312 90) + (descr "Through hole pin header") + (tags "pin header") + (path /55CAB35C) + (fp_text reference P1 (at 0 -5.1 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SCOPE_IN (at 0 -3.1 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 90) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 3 "Net-(C2-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 90) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 4 "Net-(C2-Pad2)")) + (pad 3 thru_hole oval (at 0 5.08 90) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 2 "Net-(C1-Pad2)")) + (pad 4 thru_hole oval (at 0 7.62 90) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 1 "Net-(C1-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Connect:USB_Micro-B placed (layer F.Cu) (tedit 5543E447) (tstamp 55DD065C) + (at 93.345 100.965 270) + (descr "Micro USB Type B Receptacle") + (tags "USB USB_B USB_micro USB_OTG") + (path /55CA90D2) + (attr smd) + (fp_text reference P2 (at 0 -3.45 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value USB_OTG (at 0 4.8 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.6 -2.8) (end 4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 -2.8) (end 4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 4.05) (end -4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.6 4.05) (end -4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3509 3.81746) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 -2.58754) (end 4.3491 -2.58754) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 -2.58754) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 2.58746) (end -4.3509 2.58746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 3.81746) (end -4.3509 -2.58754) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.3009 -1.56254) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -0.6509 -1.56254) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 36 /D-)) + (pad 3 smd rect (at -0.0009 -1.56254) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 37 /D+)) + (pad 4 smd rect (at 0.6491 -1.56254) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 49 "Net-(P2-Pad4)")) + (pad 5 smd rect (at 1.2991 -1.56254) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 6 thru_hole oval (at -2.5009 -1.56254) (size 0.95 1.25) (drill oval 0.55 0.85) (layers *.Cu *.Mask F.SilkS) + (net 6 GND)) + (pad 6 thru_hole oval (at 2.4991 -1.56254) (size 0.95 1.25) (drill oval 0.55 0.85) (layers *.Cu *.Mask F.SilkS) + (net 6 GND)) + (pad 6 thru_hole oval (at -3.5009 1.13746) (size 1.55 1) (drill oval 1.15 0.5) (layers *.Cu *.Mask F.SilkS) + (net 6 GND)) + (pad 6 thru_hole oval (at 3.4991 1.13746) (size 1.55 1) (drill oval 1.15 0.5) (layers *.Cu *.Mask F.SilkS) + (net 6 GND)) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 placed (layer F.Cu) (tedit 0) (tstamp 55DD0664) + (at 146.8628 148.7932 270) + (descr "Through hole pin header") + (tags "pin header") + (path /55CBF4D5) + (fp_text reference P3 (at 0 -5.1 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DIG_OUT (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 50 "Net-(P3-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 51 "Net-(P3-Pad2)")) + (pad 3 thru_hole oval (at 0 5.08 270) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 52 "Net-(P3-Pad3)")) + (pad 4 thru_hole oval (at 0 7.62 270) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 53 "Net-(P3-Pad4)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x03 placed (layer F.Cu) (tedit 0) (tstamp 55DD066B) + (at 125.1204 90.17) + (descr "Through hole pin header") + (tags "pin header") + (path /55CD757A) + (fp_text reference P4 (at 0 -5.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value OPAMP_JUMPER (at 0 -3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 6.85) (end 1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 6.35) (end 1.27 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 6.35) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 54 +12V)) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 13 /LM324_VCC)) + (pad 3 thru_hole oval (at 0 5.08) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 55 "Net-(P4-Pad3)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x03.wrl + (at (xyz 0 -0.1 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 placed (layer F.Cu) (tedit 54EA090C) (tstamp 55DD0671) + (at 219.9894 89.3064 180) + (descr "Through hole pin header") + (tags "pin header") + (path /55CDECCE) + (fp_text reference P5 (at 0 -5.1 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value HVI (at 0 -3.1 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 180) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 54 +12V)) + (pad 2 thru_hole oval (at 0 2.54 180) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 14 /VGND)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 placed (layer F.Cu) (tedit 54EA090C) (tstamp 55DD0677) + (at 193.5734 149.3012 270) + (descr "Through hole pin header") + (tags "pin header") + (path /55CB63F0) + (fp_text reference P6 (at 0 -5.1 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value AWG_OUT (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 12 "Net-(C7-Pad2)")) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 11 "Net-(C7-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 placed (layer F.Cu) (tedit 54EA090C) (tstamp 55DD067D) + (at 219.9894 117.2464) + (descr "Through hole pin header") + (tags "pin header") + (path /55CC540F) + (fp_text reference P7 (at 0 -5.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value HVO (at 0 -3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 16 "Net-(C9-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 15 /VSENSE_OCP)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 placed (layer F.Cu) (tedit 54EA090C) (tstamp 55DD0683) + (at 164.211 149.3266 270) + (descr "Through hole pin header") + (tags "pin header") + (path /55D6DB77) + (fp_text reference P8 (at 0 -5.1 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DIG_IN (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 56 "Net-(P8-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 57 "Net-(P8-Pad2)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD0689) + (at 124.1552 135.89 270) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CAAB95) + (attr smd) + (fp_text reference R1 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD068F) + (at 119.3292 135.89 270) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CAAD4C) + (attr smd) + (fp_text reference R2 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R2-Pad1)")) + (pad 2 smd rect (at 2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD0695) + (at 123.6218 129.1336 90) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CAABF4) + (attr smd) + (fp_text reference R3 (at 0 -2.3 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 90) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 2 0 90) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 48 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD069B) + (at 119.4308 129.0828 270) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CAAD11) + (attr smd) + (fp_text reference R4 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 48 /AVCC_ON_2)) + (pad 2 smd rect (at 2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R2-Pad1)")) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD06A1) + (at 119.3292 122.3518 270) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CAAC5F) + (attr smd) + (fp_text reference R5 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 8 /AVCC)) + (pad 2 smd rect (at 2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 48 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD06A7) + (at 123.5964 122.428 270) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CAACD2) + (attr smd) + (fp_text reference R6 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 9 /AGND)) + (pad 2 smd rect (at 2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 48 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD06AD) + (at 136.652 136.017 270) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CBCDA5) + (attr smd) + (fp_text reference R7 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R11-Pad2)")) + (pad 2 smd rect (at 2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 53 "Net-(P3-Pad4)")) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD06B3) + (at 140.8684 136.017 270) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CBE401) + (attr smd) + (fp_text reference R8 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R12-Pad2)")) + (pad 2 smd rect (at 2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 52 "Net-(P3-Pad3)")) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD06B9) + (at 145.1102 135.9408 270) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CBE16B) + (attr smd) + (fp_text reference R9 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R13-Pad2)")) + (pad 2 smd rect (at 2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 51 "Net-(P3-Pad2)")) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD06BF) + (at 149.3012 135.9408 270) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CBE2C7) + (attr smd) + (fp_text reference R10 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R10-Pad1)")) + (pad 2 smd rect (at 2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 50 "Net-(P3-Pad1)")) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD06C5) + (at 136.6012 128.8542 270) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CBCD2A) + (attr smd) + (fp_text reference R11 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 38 "Net-(IC1-Pad28)")) + (pad 2 smd rect (at 2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R11-Pad2)")) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD06CB) + (at 140.843 128.6256 270) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CBE362) + (attr smd) + (fp_text reference R12 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 39 "Net-(IC1-Pad29)")) + (pad 2 smd rect (at 2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R12-Pad2)")) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD06D1) + (at 145.0594 128.4732 270) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CBE0F4) + (attr smd) + (fp_text reference R13 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 40 "Net-(IC1-Pad32)")) + (pad 2 smd rect (at 2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R13-Pad2)")) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD06D7) + (at 149.2504 128.27 270) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CBE21C) + (attr smd) + (fp_text reference R14 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 41 "Net-(IC1-Pad33)")) + (pad 2 smd rect (at 2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R10-Pad1)")) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD06DD) + (at 121.539 110.871 180) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55D84EF6) + (attr smd) + (fp_text reference R15 (at 0 -2.3 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 180) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 43 "Net-(IC1-Pad35)")) + (pad 2 smd rect (at 2 0 180) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD06E3) + (at 102.6414 95.3008 180) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55D592A5) + (attr smd) + (fp_text reference R16 (at 0 -2.3 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 180) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R16-Pad1)")) + (pad 2 smd rect (at 2 0 180) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD06E9) + (at 111.1758 95.25 180) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55D4D96A) + (attr smd) + (fp_text reference R17 (at 0 -2.3 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 180) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 55 "Net-(P4-Pad3)")) + (pad 2 smd rect (at 2 0 180) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(R16-Pad1)")) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD06EF) + (at 195.6816 137.7442 180) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CB4680) + (attr smd) + (fp_text reference R18 (at 0 -2.3 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 180) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R18-Pad1)")) + (pad 2 smd rect (at 2 0 180) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R18-Pad2)")) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD06F5) + (at 188.7474 97.6376 180) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CC18B5) + (attr smd) + (fp_text reference R19 (at 0 -2.3 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 180) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 10 "Net-(C6-Pad1)")) + (pad 2 smd rect (at 2 0 180) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 34 /PSU_PWM)) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD06FB) + (at 195.6816 141.9352) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CB9020) + (attr smd) + (fp_text reference R20 (at 0 -2.3) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 12 "Net-(C7-Pad2)")) + (pad 2 smd rect (at 2 0) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(R18-Pad1)")) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD0701) + (at 188.7474 90.7796 180) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CC31EA) + (attr smd) + (fp_text reference R21 (at 0 -2.3 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 180) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R21-Pad1)")) + (pad 2 smd rect (at 2 0 180) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD0707) + (at 195.1482 92.7608 90) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CC344F) + (attr smd) + (fp_text reference R22 (at 0 -2.3 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 90) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R22-Pad1)")) + (pad 2 smd rect (at 2 0 90) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R21-Pad1)")) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD070D) + (at 214.2744 118.5164 270) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55CC774D) + (attr smd) + (fp_text reference R23 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 16 "Net-(C9-Pad1)")) + (pad 2 smd rect (at 2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 15 /VSENSE_OCP)) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_1206_HandSoldering placed (layer F.Cu) (tedit 5418A20D) (tstamp 55DD0713) + (at 214.2744 126.7714 270) + (descr "Resistor SMD 1206, hand soldering") + (tags "resistor 1206") + (path /55D44B0B) + (attr smd) + (fp_text reference R24 (at 0 -2.3 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 2.3 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.3 -1.2) (end 3.3 -1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.3 -1.2) (end -3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.3 -1.2) (end 3.3 1.2) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1 1.075) (end -1 1.075) (layer F.SilkS) (width 0.15)) + (fp_line (start -1 -1.075) (end 1 -1.075) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 15 /VSENSE_OCP)) + (pad 2 smd rect (at 2 0 270) (size 2 1.7) (layers F.Cu F.Paste F.Mask) + (net 14 /VGND)) + (model Resistors_SMD.3dshapes/R_1206_HandSoldering.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Pin_Headers:Pin_Header_Angled_1x03 placed (layer F.Cu) (tedit 0) (tstamp 55DD071A) + (at 206.375 101.2444) + (descr "Through hole pin header") + (tags "pin header") + (path /55CC4BD0) + (fp_text reference T1 (at 0 -5.1) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value TIP29A (at 0 -3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.5 -1.75) (end -1.5 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 10.65 -1.75) (end 10.65 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.5 -1.75) (end 10.65 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.5 6.85) (end 10.65 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -1.55) (end -1.3 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 -1.55) (end -1.3 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.191 -0.127) (end 10.033 -0.127) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.033 -0.127) (end 10.033 0.127) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.033 0.127) (end 4.191 0.127) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.191 0.127) (end 4.191 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.191 0) (end 10.033 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 -0.254) (end 1.143 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 0.254) (end 1.143 0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 2.286) (end 1.143 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 2.794) (end 1.143 2.794) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 4.826) (end 1.143 4.826) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 5.334) (end 1.143 5.334) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.064 1.27) (end 4.064 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.16 0.254) (end 4.064 0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.16 -0.254) (end 10.16 0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.064 -0.254) (end 10.16 -0.254) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 1.27) (end 4.064 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 -1.27) (end 1.524 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 -1.27) (end 4.064 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 3.81) (end 4.064 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 3.81) (end 1.524 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.064 4.826) (end 10.16 4.826) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.16 4.826) (end 10.16 5.334) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.16 5.334) (end 4.064 5.334) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.064 6.35) (end 4.064 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.064 3.81) (end 4.064 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.16 2.794) (end 4.064 2.794) (layer F.SilkS) (width 0.15)) + (fp_line (start 10.16 2.286) (end 10.16 2.794) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.064 2.286) (end 10.16 2.286) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 3.81) (end 4.064 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 1.27) (end 1.524 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 1.27) (end 4.064 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.524 6.35) (end 4.064 6.35) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 68 "Net-(R22-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 54 +12V)) + (pad 3 thru_hole oval (at 0 5.08) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 16 "Net-(C9-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Angled_1x03.wrl + (at (xyz 0 -0.1 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module SMD:SOT-23-3 placed (layer F.Cu) (tedit 55DD0F6E) (tstamp 55DD0721) + (at 105.2068 100.7872 180) + (path /55CA99FA) + (fp_text reference U1 (at 2.4384 0 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value 78L05 (at -2.2 0 270) (layer F.Fab) hide + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 1 -0.4) (end 1.1 -0.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 -0.8) (end -1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 0.8) (end 1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 0.8) (end 1.5 -0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 -0.8) (end -1.5 -0.8) (layer F.SilkS) (width 0.15)) + (pad 3 smd rect (at 0 1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -0.95 -1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 7 /VCC_3V3)) + (pad 1 smd rect (at 0.95 -1.4 180) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (model 3D/SMD/SOT-23-3.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm placed (layer F.Cu) (tedit 54130A77) (tstamp 55DD0733) + (at 190.2714 103.9876 90) + (descr "14-Lead Plastic Small Outline (SL) - Narrow, 3.90 mm Body [SOIC] (see Microchip Packaging Specification 00000049BS.pdf)") + (tags "SOIC 1.27") + (path /55CA87E2) + (attr smd) + (fp_text reference U2 (at 0 -5.375 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value LM324 (at 0 5.375 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.7 -4.65) (end -3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.7 -4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 -4.65) (end 3.7 -4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.075 -4.45) (end -2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 -4.45) (end 2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 4.45) (end 2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end -2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.45) (end 2.075 -4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end 2.075 4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.335) (end -3.45 -4.335) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2.7 -3.81 90) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 46 /CH1)) + (pad 2 smd rect (at -2.7 -2.54 90) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 46 /CH1)) + (pad 3 smd rect (at -2.7 -1.27 90) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R1-Pad1)")) + (pad 4 smd rect (at -2.7 0 90) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 13 /LM324_VCC)) + (pad 5 smd rect (at -2.7 1.27 90) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R2-Pad1)")) + (pad 6 smd rect (at -2.7 2.54 90) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 47 /CH2)) + (pad 7 smd rect (at -2.7 3.81 90) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 47 /CH2)) + (pad 8 smd rect (at 2.7 3.81 90) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(R22-Pad1)")) + (pad 9 smd rect (at 2.7 2.54 90) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(R21-Pad1)")) + (pad 10 smd rect (at 2.7 1.27 90) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 10 "Net-(C6-Pad1)")) + (pad 11 smd rect (at 2.7 0 90) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 14 /VGND)) + (pad 12 smd rect (at 2.7 -1.27 90) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 22 /DAC_OUT)) + (pad 13 smd rect (at 2.7 -2.54 90) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R18-Pad2)")) + (pad 14 smd rect (at 2.7 -3.81 90) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(R18-Pad2)")) + (model Housings_SOIC.3dshapes/SOIC-14_3.9x8.7mm_Pitch1.27mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Footprints:SOT363 placed (layer F.Cu) (tedit 5070B96C) (tstamp 55DD073D) + (at 162.5346 143.2306) + (descr SOT363) + (path /55D6ACFD) + (attr smd) + (fp_text reference U3 (at 0.09906 1.69926) (layer F.SilkS) hide + (effects (font (size 0.762 0.635) (thickness 0.127))) + ) + (fp_text value DMN63D8LDW (at 0 -1.50114) (layer F.SilkS) + (effects (font (size 0.762 0.635) (thickness 0.127))) + ) + (fp_line (start 0.635 1.016) (end 0.635 -1.016) (layer F.SilkS) (width 0.1524)) + (fp_line (start 0.635 -1.016) (end -0.635 -1.016) (layer F.SilkS) (width 0.1524)) + (fp_line (start -0.635 -1.016) (end -0.635 1.016) (layer F.SilkS) (width 0.1524)) + (fp_line (start -0.635 1.016) (end 0.635 1.016) (layer F.SilkS) (width 0.1524)) + (pad 1 smd rect (at -1.016 -0.635) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 3 smd rect (at -1.016 0.635) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 26 /DIG_CH2)) + (pad 5 smd rect (at 1.016 0) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 56 "Net-(P8-Pad1)")) + (pad 2 smd rect (at -1.016 0) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 57 "Net-(P8-Pad2)")) + (pad 4 smd rect (at 1.016 0.635) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 6 smd rect (at 1.016 -0.635) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 29 /DIG_CH1)) + (model 3D/SOT-363.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 0)) + ) + ) + + (gr_text "DONT FORGET BODGE SECTION" (at 108.6104 73.533) (layer F.Cu) + (effects (font (size 1.5 1.5) (thickness 0.3))) + ) + (gr_line (start 88.9 71.12) (end 230.505 71.12) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 230.505 151.13) (end 230.505 71.12) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 88.9 151.13) (end 230.505 151.13) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 88.9 71.12) (end 88.9 151.13) (angle 90) (layer Edge.Cuts) (width 0.1)) + + (segment (start 183.7502 83.7692) (end 183.9534 83.9724) (width 0.25) (layer F.Cu) (net 0) (tstamp 55DD0BE4)) + (segment (start 124.1044 140.494) (end 124.1044 137.9408) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 124.1044 137.9408) (end 124.1552 137.89) (width 0.25) (layer F.Cu) (net 1) (tstamp 55DD11D0)) + (segment (start 125.3744 148.0312) (end 126.2888 148.0312) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 126.016 140.494) (end 124.1044 140.494) (width 0.25) (layer F.Cu) (net 1) (tstamp 55DD11A9)) + (segment (start 127.508 141.986) (end 126.016 140.494) (width 0.25) (layer F.Cu) (net 1) (tstamp 55DD11A7)) + (segment (start 127.508 146.812) (end 127.508 141.986) (width 0.25) (layer F.Cu) (net 1) (tstamp 55DD11A5)) + (segment (start 126.2888 148.0312) (end 127.508 146.812) (width 0.25) (layer F.Cu) (net 1) (tstamp 55DD11A4)) + (segment (start 122.8344 148.0312) (end 122.8344 145.764) (width 0.25) (layer F.Cu) (net 2)) + (segment (start 122.8344 145.764) (end 124.1044 144.494) (width 0.25) (layer F.Cu) (net 2) (tstamp 55DD119F)) + (segment (start 119.2784 140.5448) (end 119.2784 137.9408) (width 0.25) (layer F.Cu) (net 3)) + (segment (start 119.2784 137.9408) (end 119.3292 137.89) (width 0.25) (layer F.Cu) (net 3) (tstamp 55DD11C4)) + (segment (start 117.7544 148.0312) (end 116.1796 148.0312) (width 0.25) (layer F.Cu) (net 3)) + (segment (start 117.2652 140.5448) (end 119.2784 140.5448) (width 0.25) (layer F.Cu) (net 3) (tstamp 55DD11B2)) + (segment (start 115.3668 142.4432) (end 117.2652 140.5448) (width 0.25) (layer F.Cu) (net 3) (tstamp 55DD11B0)) + (segment (start 115.3668 147.2184) (end 115.3668 142.4432) (width 0.25) (layer F.Cu) (net 3) (tstamp 55DD11AF)) + (segment (start 116.1796 148.0312) (end 115.3668 147.2184) (width 0.25) (layer F.Cu) (net 3) (tstamp 55DD11AD)) + (segment (start 120.2944 148.0312) (end 120.2944 145.5608) (width 0.25) (layer F.Cu) (net 4)) + (segment (start 120.2944 145.5608) (end 119.2784 144.5448) (width 0.25) (layer F.Cu) (net 4) (tstamp 55DD119B)) + (segment (start 100.5586 98.838) (end 100.5586 95.3836) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 100.5586 95.3836) (end 100.6414 95.3008) (width 0.25) (layer F.Cu) (net 5) (tstamp 55DD1558)) + (segment (start 100.5586 98.838) (end 98.3422 98.838) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 97.5161 99.6641) (end 94.90754 99.6641) (width 0.25) (layer F.Cu) (net 5) (tstamp 55DD142F)) + (segment (start 98.3422 98.838) (end 97.5161 99.6641) (width 0.25) (layer F.Cu) (net 5) (tstamp 55DD142E)) + (segment (start 105.2068 99.3872) (end 104.9752 99.3872) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 104.9752 99.3872) (end 104.426 98.838) (width 0.25) (layer F.Cu) (net 5) (tstamp 55DD1404)) + (segment (start 104.426 98.838) (end 100.5586 98.838) (width 0.25) (layer F.Cu) (net 5) (tstamp 55DD1405)) + (segment (start 100.5586 98.838) (end 99.8662 98.838) (width 0.25) (layer F.Cu) (net 5)) + (segment (start 163.5506 143.8656) (end 162.9664 143.8656) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 162.2044 142.5956) (end 161.5186 142.5956) (width 0.25) (layer F.Cu) (net 6) (tstamp 55DD15D7)) + (segment (start 162.4584 142.8496) (end 162.2044 142.5956) (width 0.25) (layer F.Cu) (net 6) (tstamp 55DD15D6)) + (segment (start 162.4584 143.3576) (end 162.4584 142.8496) (width 0.25) (layer F.Cu) (net 6) (tstamp 55DD15D5)) + (segment (start 162.9664 143.8656) (end 162.4584 143.3576) (width 0.25) (layer F.Cu) (net 6) (tstamp 55DD15D4)) + (segment (start 100.5586 102.838) (end 95.48144 102.838) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 95.48144 102.838) (end 94.90754 102.2641) (width 0.25) (layer F.Cu) (net 6) (tstamp 55DD142B)) + (segment (start 103.41 105.7402) (end 103.41 103.034) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 103.41 103.034) (end 104.2568 102.1872) (width 0.25) (layer F.Cu) (net 6) (tstamp 55DD1424)) + (segment (start 103.41 105.7402) (end 100.6096 105.7402) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 100.6096 105.7402) (end 100.584 105.7658) (width 0.25) (layer F.Cu) (net 6) (tstamp 55DD1421)) + (segment (start 100.584 105.7658) (end 100.584 102.8634) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 100.584 102.8634) (end 100.5586 102.838) (width 0.25) (layer F.Cu) (net 6) (tstamp 55DD1414)) + (segment (start 100.5586 102.838) (end 103.606 102.838) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 103.606 102.838) (end 104.2568 102.1872) (width 0.25) (layer F.Cu) (net 6) (tstamp 55DD1401)) + (segment (start 92.20754 97.4641) (end 93.90754 97.4641) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 93.90754 97.4641) (end 94.90754 98.4641) (width 0.25) (layer F.Cu) (net 6) (tstamp 55DD1313)) + (segment (start 92.20754 104.4641) (end 92.20754 97.4641) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 92.20754 104.4641) (end 93.90754 104.4641) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 93.90754 104.4641) (end 94.90754 103.4641) (width 0.25) (layer F.Cu) (net 6) (tstamp 55DD130D)) + (segment (start 94.90754 102.2641) (end 94.90754 103.4641) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 186.6966 94.234) (end 186.6966 90.8304) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 186.6966 90.8304) (end 186.7474 90.7796) (width 0.25) (layer F.Cu) (net 6) (tstamp 55DD0C2F)) + (segment (start 107.41 105.7402) (end 107.41 103.4404) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 107.41 103.4404) (end 106.1568 102.1872) (width 0.25) (layer F.Cu) (net 7) (tstamp 55DD141D)) + (segment (start 119.3292 120.3518) (end 119.3292 118.0404) (width 0.25) (layer F.Cu) (net 8)) + (segment (start 119.3292 118.0404) (end 119.4628 117.9068) (width 0.25) (layer F.Cu) (net 8) (tstamp 55DD1248)) + (segment (start 123.5964 120.428) (end 123.5964 118.0404) (width 0.25) (layer F.Cu) (net 9)) + (segment (start 123.5964 118.0404) (end 123.4628 117.9068) (width 0.25) (layer F.Cu) (net 9) (tstamp 55DD124B)) + (segment (start 191.5414 101.2876) (end 191.5414 98.4316) (width 0.25) (layer F.Cu) (net 10)) + (segment (start 190.7474 97.6376) (end 190.7474 94.2848) (width 0.25) (layer F.Cu) (net 10)) + (segment (start 190.7474 94.2848) (end 190.6966 94.234) (width 0.25) (layer F.Cu) (net 10) (tstamp 55DD0C2C)) + (segment (start 191.5414 98.4316) (end 190.7474 97.6376) (width 0.25) (layer F.Cu) (net 10) (tstamp 55DD0C17)) + (segment (start 190.9572 145.9164) (end 190.9572 149.225) (width 0.25) (layer F.Cu) (net 11)) + (segment (start 190.9572 149.225) (end 191.0334 149.3012) (width 0.25) (layer F.Cu) (net 11) (tstamp 55DD128A)) + (segment (start 193.6816 141.9352) (end 190.976 141.9352) (width 0.25) (layer F.Cu) (net 12)) + (segment (start 190.976 141.9352) (end 190.9572 141.9164) (width 0.25) (layer F.Cu) (net 12) (tstamp 55DD1520)) + (segment (start 190.9064 141.8656) (end 190.9572 141.9164) (width 0.25) (layer F.Cu) (net 12) (tstamp 55DD12A0)) + (segment (start 190.3222 109.9886) (end 190.3222 106.7384) (width 0.25) (layer F.Cu) (net 13)) + (segment (start 190.3222 106.7384) (end 190.2714 106.6876) (width 0.25) (layer F.Cu) (net 13) (tstamp 55DD16A4)) + (segment (start 219.9894 119.7864) (end 215.0044 119.7864) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 215.0044 119.7864) (end 214.2744 120.5164) (width 0.25) (layer F.Cu) (net 15) (tstamp 55DD0C4D)) + (segment (start 214.2744 124.7714) (end 214.2744 120.5164) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 214.2744 120.5164) (end 206.7494 120.5164) (width 0.25) (layer F.Cu) (net 15)) + (segment (start 206.7494 120.5164) (end 206.0194 119.7864) (width 0.25) (layer F.Cu) (net 15) (tstamp 55DD0C48)) + (segment (start 206.375 106.3244) (end 206.375 108.617) (width 0.25) (layer F.Cu) (net 16)) + (segment (start 206.375 108.617) (end 214.2744 116.5164) (width 0.25) (layer F.Cu) (net 16) (tstamp 55DD111A)) + (segment (start 219.9894 117.2464) (end 215.0044 117.2464) (width 0.25) (layer F.Cu) (net 16)) + (segment (start 215.0044 117.2464) (end 214.2744 116.5164) (width 0.25) (layer F.Cu) (net 16) (tstamp 55DD0C50)) + (segment (start 214.2744 116.5164) (end 206.7494 116.5164) (width 0.25) (layer F.Cu) (net 16)) + (segment (start 206.7494 116.5164) (end 206.0194 117.2464) (width 0.25) (layer F.Cu) (net 16) (tstamp 55DD0C45)) + (segment (start 123.6218 127.1336) (end 123.6218 124.4534) (width 0.25) (layer F.Cu) (net 48)) + (segment (start 123.6218 124.4534) (end 123.5964 124.428) (width 0.25) (layer F.Cu) (net 48) (tstamp 55DD1263)) + (segment (start 119.4308 127.0828) (end 119.4308 124.4534) (width 0.25) (layer F.Cu) (net 48)) + (segment (start 119.4308 124.4534) (end 119.3292 124.3518) (width 0.25) (layer F.Cu) (net 48) (tstamp 55DD1260)) + (segment (start 149.3012 137.9408) (end 149.3012 146.3548) (width 0.25) (layer F.Cu) (net 50)) + (segment (start 149.3012 146.3548) (end 146.8628 148.7932) (width 0.25) (layer F.Cu) (net 50) (tstamp 55DD1679)) + (segment (start 145.1102 137.9408) (end 145.1102 141.478) (width 0.25) (layer F.Cu) (net 51)) + (segment (start 144.3228 142.2654) (end 144.3228 148.7932) (width 0.25) (layer F.Cu) (net 51) (tstamp 55DD167E)) + (segment (start 145.1102 141.478) (end 144.3228 142.2654) (width 0.25) (layer F.Cu) (net 51) (tstamp 55DD167D)) + (segment (start 140.8684 138.017) (end 140.8684 140.081) (width 0.25) (layer F.Cu) (net 52)) + (segment (start 141.7828 140.9954) (end 141.7828 148.7932) (width 0.25) (layer F.Cu) (net 52) (tstamp 55DD1683)) + (segment (start 140.8684 140.081) (end 141.7828 140.9954) (width 0.25) (layer F.Cu) (net 52) (tstamp 55DD1681)) + (segment (start 136.652 138.017) (end 136.652 146.2024) (width 0.25) (layer F.Cu) (net 53)) + (segment (start 136.652 146.2024) (end 139.2428 148.7932) (width 0.25) (layer F.Cu) (net 53) (tstamp 55DD1686)) + (segment (start 206.375 103.7844) (end 208.7118 103.7844) (width 0.25) (layer F.Cu) (net 54)) + (segment (start 209.2198 100.076) (end 219.9894 89.3064) (width 0.25) (layer F.Cu) (net 54) (tstamp 55DD1116)) + (segment (start 209.2198 103.2764) (end 209.2198 100.076) (width 0.25) (layer F.Cu) (net 54) (tstamp 55DD1115)) + (segment (start 208.7118 103.7844) (end 209.2198 103.2764) (width 0.25) (layer F.Cu) (net 54) (tstamp 55DD1114)) + (segment (start 113.1758 95.25) (end 125.1204 95.25) (width 0.25) (layer F.Cu) (net 55)) + (segment (start 163.5506 143.2306) (end 164.9222 143.2306) (width 0.25) (layer F.Cu) (net 56)) + (segment (start 165.354 148.1836) (end 164.211 149.3266) (width 0.25) (layer F.Cu) (net 56) (tstamp 55DD15DE)) + (segment (start 165.354 143.6624) (end 165.354 148.1836) (width 0.25) (layer F.Cu) (net 56) (tstamp 55DD15DD)) + (segment (start 164.9222 143.2306) (end 165.354 143.6624) (width 0.25) (layer F.Cu) (net 56) (tstamp 55DD15DC)) + (segment (start 161.5186 143.2306) (end 160.274 143.2306) (width 0.25) (layer F.Cu) (net 57)) + (segment (start 159.2326 146.8882) (end 161.671 149.3266) (width 0.25) (layer F.Cu) (net 57) (tstamp 55DD15E5)) + (segment (start 159.2326 144.272) (end 159.2326 146.8882) (width 0.25) (layer F.Cu) (net 57) (tstamp 55DD15E3)) + (segment (start 160.274 143.2306) (end 159.2326 144.272) (width 0.25) (layer F.Cu) (net 57) (tstamp 55DD15E2)) + (segment (start 124.1552 133.89) (end 124.1552 131.667) (width 0.25) (layer F.Cu) (net 58)) + (segment (start 124.1552 131.667) (end 123.6218 131.1336) (width 0.25) (layer F.Cu) (net 58) (tstamp 55DD1266)) + (segment (start 119.3292 133.89) (end 119.3292 131.1844) (width 0.25) (layer F.Cu) (net 59)) + (segment (start 119.3292 131.1844) (end 119.4308 131.0828) (width 0.25) (layer F.Cu) (net 59) (tstamp 55DD1269)) + (segment (start 136.652 134.017) (end 136.652 130.905) (width 0.25) (layer F.Cu) (net 60)) + (segment (start 136.652 130.905) (end 136.6012 130.8542) (width 0.25) (layer F.Cu) (net 60) (tstamp 55DD1665)) + (segment (start 140.843 130.6256) (end 140.843 133.9916) (width 0.25) (layer F.Cu) (net 61)) + (segment (start 140.843 133.9916) (end 140.8684 134.017) (width 0.25) (layer F.Cu) (net 61) (tstamp 55DD1668)) + (segment (start 145.1102 133.9408) (end 145.1102 130.524) (width 0.25) (layer F.Cu) (net 62)) + (segment (start 145.1102 130.524) (end 145.0594 130.4732) (width 0.25) (layer F.Cu) (net 62) (tstamp 55DD166B)) + (segment (start 149.2504 130.27) (end 149.2504 133.89) (width 0.25) (layer F.Cu) (net 63)) + (segment (start 149.2504 133.89) (end 149.3012 133.9408) (width 0.25) (layer F.Cu) (net 63) (tstamp 55DD166E)) + (segment (start 104.6414 95.3008) (end 109.125 95.3008) (width 0.25) (layer F.Cu) (net 64)) + (segment (start 109.125 95.3008) (end 109.1758 95.25) (width 0.25) (layer F.Cu) (net 64) (tstamp 55DD155B)) + (segment (start 197.6816 141.9352) (end 197.6816 137.7442) (width 0.25) (layer F.Cu) (net 65)) + (segment (start 187.7314 101.2876) (end 186.4614 101.2876) (width 0.25) (layer F.Cu) (net 66)) + (segment (start 195.1482 90.7608) (end 190.7662 90.7608) (width 0.25) (layer F.Cu) (net 67)) + (segment (start 190.7662 90.7608) (end 190.7474 90.7796) (width 0.25) (layer F.Cu) (net 67) (tstamp 55DD0C42)) + (segment (start 192.8114 101.2876) (end 192.8114 91.5924) (width 0.25) (layer F.Cu) (net 67)) + (segment (start 191.9986 90.7796) (end 192.8114 91.5924) (width 0.25) (layer F.Cu) (net 67) (tstamp 55DD0C32)) + (segment (start 191.9986 90.7796) (end 190.7474 90.7796) (width 0.25) (layer F.Cu) (net 67)) + (segment (start 195.1482 94.7608) (end 195.1482 99.7204) (width 0.25) (layer F.Cu) (net 68) (tstamp 55DD0C3E)) + (segment (start 195.1482 99.7204) (end 194.0814 100.7872) (width 0.25) (layer F.Cu) (net 68) (tstamp 55DD0C3D)) + (segment (start 206.375 101.2444) (end 194.1246 101.2444) (width 0.25) (layer F.Cu) (net 68)) + (segment (start 194.1246 101.2444) (end 194.0814 101.2876) (width 0.25) (layer F.Cu) (net 68) (tstamp 55DD10E7)) + (segment (start 194.0814 101.2876) (end 194.0814 100.7872) (width 0.25) (layer F.Cu) (net 68)) + +) diff --git a/PCB/WOT/Tinylab_proto1.kicad_pcb_bak b/PCB/WOT/Tinylab_proto1.kicad_pcb_bak new file mode 100644 index 00000000..ba9a943c --- /dev/null +++ b/PCB/WOT/Tinylab_proto1.kicad_pcb_bak @@ -0,0 +1,2411 @@ +(kicad_pcb (version 4) (host pcbnew "(2015-08-05 BZR 6055, Git fa29c62)-product") + + (general + (links 100) + (no_connects 1) + (area 30.204106 117.562159 78.592471 157.286161) + (thickness 1.6) + (drawings 6) + (tracks 588) + (zones 0) + (modules 48) + (nets 71) + ) + + (page A4) + (layers + (0 F.Cu signal hide) + (31 B.Cu signal hide) + (32 B.Adhes user hide) + (33 F.Adhes user hide) + (34 B.Paste user hide) + (35 F.Paste user hide) + (36 B.SilkS user hide) + (37 F.SilkS user) + (38 B.Mask user hide) + (39 F.Mask user hide) + (40 Dwgs.User user hide) + (41 Cmts.User user hide) + (42 Eco1.User user hide) + (43 Eco2.User user hide) + (44 Edge.Cuts user hide) + (45 Margin user hide) + (46 B.CrtYd user hide) + (47 F.CrtYd user hide) + (48 B.Fab user hide) + (49 F.Fab user hide) + ) + + (setup + (last_trace_width 0.25) + (user_trace_width 0.254) + (user_trace_width 0.58) + (user_trace_width 1.16) + (trace_clearance 0.2) + (zone_clearance 0.508) + (zone_45_only no) + (trace_min 0.2) + (segment_width 0.2) + (edge_width 0.1) + (via_size 0.6) + (via_drill 0.4) + (via_min_size 0.4) + (via_min_drill 0.3) + (uvia_size 0.5) + (uvia_drill 0.3) + (uvias_allowed no) + (uvia_min_size 0.2) + (uvia_min_drill 0.1) + (pcb_text_width 0.3) + (pcb_text_size 1.5 1.5) + (mod_edge_width 0.15) + (mod_text_size 1 1) + (mod_text_width 0.15) + (pad_size 1.5 1.5) + (pad_drill 0.6) + (pad_to_mask_clearance 0) + (aux_axis_origin 53.68544 136.97204) + (visible_elements 7FFE4661) + (pcbplotparams + (layerselection 0x010f0_80000001) + (usegerberextensions true) + (excludeedgelayer true) + (linewidth 0.150000) + (plotframeref false) + (viasonmask false) + (mode 1) + (useauxorigin false) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15) + (hpglpenoverlay 2) + (psnegative false) + (psa4output false) + (plotreference true) + (plotvalue true) + (plotinvisibletext false) + (padsonsilk false) + (subtractmaskfromsilk false) + (outputformat 1) + (mirror false) + (drillshape 0) + (scaleselection 1) + (outputdirectory OUTPUT/)) + ) + + (net 0 "") + (net 1 "Net-(C1-Pad1)") + (net 2 "Net-(C1-Pad2)") + (net 3 "Net-(C2-Pad1)") + (net 4 "Net-(C2-Pad2)") + (net 5 +5V) + (net 6 GND) + (net 7 /AVCC) + (net 8 /VCC_PSU) + (net 9 "Net-(C7-Pad1)") + (net 10 "Net-(C7-Pad2)") + (net 11 /VGND) + (net 12 "Net-(C11-Pad1)") + (net 13 "Net-(D1-Pad2)") + (net 14 "Net-(IC1-Pad1)") + (net 15 /CH2) + (net 16 "Net-(IC1-Pad3)") + (net 17 "Net-(IC1-Pad4)") + (net 18 "Net-(IC1-Pad5)") + (net 19 /DAC_OUT) + (net 20 "Net-(IC1-Pad7)") + (net 21 "Net-(IC1-Pad10)") + (net 22 /XCK) + (net 23 /DIG_CH2) + (net 24 "Net-(IC1-Pad13)") + (net 25 "Net-(IC1-Pad16)") + (net 26 /DIG_CH1) + (net 27 "Net-(IC1-Pad20)") + (net 28 "Net-(IC1-Pad21)") + (net 29 "Net-(IC1-Pad22)") + (net 30 "Net-(IC1-Pad23)") + (net 31 /PSU_PWM) + (net 32 "Net-(IC1-Pad25)") + (net 33 /D-) + (net 34 /D+) + (net 35 "Net-(IC1-Pad28)") + (net 36 "Net-(IC1-Pad29)") + (net 37 "Net-(IC1-Pad32)") + (net 38 "Net-(IC1-Pad33)") + (net 39 "Net-(IC1-Pad34)") + (net 40 "Net-(IC1-Pad35)") + (net 41 "Net-(IC1-Pad36)") + (net 42 "Net-(IC1-Pad37)") + (net 43 "Net-(IC1-Pad41)") + (net 44 /CH1) + (net 45 "Net-(IC1-Pad43)") + (net 46 /AVCC_ON_2) + (net 47 "Net-(P2-Pad4)") + (net 48 "Net-(P3-Pad1)") + (net 49 "Net-(P3-Pad2)") + (net 50 "Net-(P3-Pad3)") + (net 51 "Net-(P3-Pad4)") + (net 52 "Net-(P8-Pad1)") + (net 53 "Net-(P8-Pad2)") + (net 54 "Net-(R1-Pad1)") + (net 55 "Net-(R2-Pad1)") + (net 56 "Net-(R11-Pad2)") + (net 57 "Net-(R12-Pad2)") + (net 58 "Net-(R13-Pad2)") + (net 59 "Net-(R10-Pad1)") + (net 60 "Net-(R15-Pad1)") + (net 61 "Net-(R15-Pad2)") + (net 62 "Net-(R17-Pad2)") + (net 63 "Net-(R18-Pad2)") + (net 64 "Net-(U2-Pad12)") + (net 65 "Net-(U2-Pad13)") + (net 66 "Net-(U2-Pad14)") + (net 67 "Net-(IC1-Pad8)") + (net 68 "Net-(IC1-Pad9)") + (net 69 "Net-(IC1-Pad30)") + (net 70 "Net-(IC1-Pad31)") + + (net_class Default "This is the default net class." + (clearance 0.2) + (trace_width 0.25) + (via_dia 0.6) + (via_drill 0.4) + (uvia_dia 0.5) + (uvia_drill 0.3) + (add_net +5V) + (add_net /AVCC) + (add_net /AVCC_ON_2) + (add_net /CH1) + (add_net /CH2) + (add_net /D+) + (add_net /D-) + (add_net /DAC_OUT) + (add_net /DIG_CH1) + (add_net /DIG_CH2) + (add_net /PSU_PWM) + (add_net /VCC_PSU) + (add_net /VGND) + (add_net /XCK) + (add_net GND) + (add_net "Net-(C1-Pad1)") + (add_net "Net-(C1-Pad2)") + (add_net "Net-(C11-Pad1)") + (add_net "Net-(C2-Pad1)") + (add_net "Net-(C2-Pad2)") + (add_net "Net-(C7-Pad1)") + (add_net "Net-(C7-Pad2)") + (add_net "Net-(D1-Pad2)") + (add_net "Net-(IC1-Pad1)") + (add_net "Net-(IC1-Pad10)") + (add_net "Net-(IC1-Pad13)") + (add_net "Net-(IC1-Pad16)") + (add_net "Net-(IC1-Pad20)") + (add_net "Net-(IC1-Pad21)") + (add_net "Net-(IC1-Pad22)") + (add_net "Net-(IC1-Pad23)") + (add_net "Net-(IC1-Pad25)") + (add_net "Net-(IC1-Pad28)") + (add_net "Net-(IC1-Pad29)") + (add_net "Net-(IC1-Pad3)") + (add_net "Net-(IC1-Pad30)") + (add_net "Net-(IC1-Pad31)") + (add_net "Net-(IC1-Pad32)") + (add_net "Net-(IC1-Pad33)") + (add_net "Net-(IC1-Pad34)") + (add_net "Net-(IC1-Pad35)") + (add_net "Net-(IC1-Pad36)") + (add_net "Net-(IC1-Pad37)") + (add_net "Net-(IC1-Pad4)") + (add_net "Net-(IC1-Pad41)") + (add_net "Net-(IC1-Pad43)") + (add_net "Net-(IC1-Pad5)") + (add_net "Net-(IC1-Pad7)") + (add_net "Net-(IC1-Pad8)") + (add_net "Net-(IC1-Pad9)") + (add_net "Net-(P2-Pad4)") + (add_net "Net-(P3-Pad1)") + (add_net "Net-(P3-Pad2)") + (add_net "Net-(P3-Pad3)") + (add_net "Net-(P3-Pad4)") + (add_net "Net-(P8-Pad1)") + (add_net "Net-(P8-Pad2)") + (add_net "Net-(R1-Pad1)") + (add_net "Net-(R10-Pad1)") + (add_net "Net-(R11-Pad2)") + (add_net "Net-(R12-Pad2)") + (add_net "Net-(R13-Pad2)") + (add_net "Net-(R15-Pad1)") + (add_net "Net-(R15-Pad2)") + (add_net "Net-(R17-Pad2)") + (add_net "Net-(R18-Pad2)") + (add_net "Net-(R2-Pad1)") + (add_net "Net-(U2-Pad12)") + (add_net "Net-(U2-Pad13)") + (add_net "Net-(U2-Pad14)") + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5608B04E) (tstamp 5605FD1E) + (at 39.3192 151.93264 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CAB611) + (attr smd) + (fp_text reference C1 (at -0.69088 1.38176 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 2 "Net-(C1-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5608B036) (tstamp 5605FD24) + (at 39.27856 147.83816 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CAB4DE) + (attr smd) + (fp_text reference C2 (at -0.43688 -1.42748 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 4 "Net-(C2-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5608B056) (tstamp 5605FD2A) + (at 43.68292 136.27608 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB13E1) + (attr smd) + (fp_text reference C3 (at -0.0508 -1.69672 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5608B0B7) (tstamp 5605FD30) + (at 43.61434 129.81686) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB147C) + (attr smd) + (fp_text reference C4 (at 0.0127 -1.37922) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5608B03A) (tstamp 5605FD36) + (at 44.22648 150.05558 90) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55D60181) + (attr smd) + (fp_text reference C5 (at 0.03302 1.38684 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 90) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_Elko_ThroughHole:Elko_vert_11.2x6.3mm_RM2.5_CopperClear (layer F.Cu) (tedit 5608B085) (tstamp 5605FD3C) + (at 70.85584 125.59792 270) + (descr "Electrolytic Capacitor, vertical, diameter 6,3mm, RM 2,5mm, CopperClear, radial,") + (tags "Electrolytic Capacitor, vertical, diameter 6,3mm, RM 2,5mm, Elko, Electrolytkondensator, Kondensator gepolt, Durchmesser 6,3mm, CopperClear, radial,") + (path /560719D9) + (fp_text reference C6 (at -1.36144 -2.14376 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.27 5.08 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 0.26924 -1.69926) (end 0.76962 -1.69926) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.26924 -1.69926) (end 0.26924 -2.19964) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.23114 -1.69926) (end 0.26924 -1.69926) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.26924 -1.69926) (end 0.26924 -1.30048) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.26924 -1.30048) (end 0.26924 -1.19888) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.27 0) (end 4.4196 0) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at 2.54 0 270) (size 1.50114 1.50114) (drill 0.8001) (layers *.Cu *.Mask F.SilkS) + (net 11 /VGND)) + (pad 1 thru_hole circle (at 0 0 270) (size 1.50114 1.50114) (drill 0.8001) (layers *.Cu *.Mask F.SilkS) + (net 8 /VCC_PSU)) + (model Capacitors_Elko_ThroughHole.3dshapes/Elko_vert_11.2x6.3mm_RM2.5_CopperClear.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5608B01E) (tstamp 5605FD42) + (at 59.54522 150.9649) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55CB630B) + (attr smd) + (fp_text reference C7 (at 2.31394 0.12446) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 9 "Net-(C7-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 10 "Net-(C7-Pad2)")) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5608B08E) (tstamp 5605FD48) + (at 75.07224 126.9746 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /56071A50) + (attr smd) + (fp_text reference C8 (at 2.72288 0.19304 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 8 /VCC_PSU)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 11 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5608B010) (tstamp 5605FD4E) + (at 56.59628 148.71192 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /55D75F49) + (attr smd) + (fp_text reference C9 (at -0.13208 1.1938 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C_Small (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 11 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_Elko_ThroughHole:Elko_vert_11.2x6.3mm_RM2.5_CopperClear (layer F.Cu) (tedit 5608AFE5) (tstamp 5605FD5A) + (at 69.23024 138.63574 270) + (descr "Electrolytic Capacitor, vertical, diameter 6,3mm, RM 2,5mm, CopperClear, radial,") + (tags "Electrolytic Capacitor, vertical, diameter 6,3mm, RM 2,5mm, Elko, Electrolytkondensator, Kondensator gepolt, Durchmesser 6,3mm, CopperClear, radial,") + (path /560735FE) + (fp_text reference C11 (at -0.91186 -2.21488 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CP1 (at 1.27 5.08 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 0.26924 -1.69926) (end 0.76962 -1.69926) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.26924 -1.69926) (end 0.26924 -2.19964) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.23114 -1.69926) (end 0.26924 -1.69926) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.26924 -1.69926) (end 0.26924 -1.30048) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.26924 -1.30048) (end 0.26924 -1.19888) (layer F.SilkS) (width 0.15)) + (fp_circle (center 1.27 0) (end 4.4196 0) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at 2.54 0 270) (size 1.50114 1.50114) (drill 0.8001) (layers *.Cu *.Mask F.SilkS) + (net 11 /VGND)) + (pad 1 thru_hole circle (at 0 0 270) (size 1.50114 1.50114) (drill 0.8001) (layers *.Cu *.Mask F.SilkS) + (net 12 "Net-(C11-Pad1)")) + (model Capacitors_Elko_ThroughHole.3dshapes/Elko_vert_11.2x6.3mm_RM2.5_CopperClear.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5608AFE7) (tstamp 5605FD60) + (at 73.94194 139.89304 270) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /5607355F) + (attr smd) + (fp_text reference C12 (at -0.02032 -1.46558 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 12 "Net-(C11-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 11 /VGND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10 (layer F.Cu) (tedit 5608B09B) (tstamp 5605FD66) + (at 73.98004 134.7978 180) + (descr "Diode, DO-41, SOD81, Horizontal, RM 10mm,") + (tags "Diode, DO-41, SOD81, Horizontal, RM 10mm, 1N4007, SB140,") + (path /5606FDB4) + (fp_text reference D1 (at 4.3942 2.91084 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value D_Schottky (at 4.37134 -3.55854 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 7.62 -0.00254) (end 8.636 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -0.00254) (end 1.524 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.048 -1.27254) (end 3.048 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.302 -1.27254) (end 3.302 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.556 -1.27254) (end 3.556 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -1.27254) (end 2.794 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.175 -1.27254) (end 3.175 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 1.26746) (end 2.54 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 7.62 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 -1.27254) (end 7.62 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 1.26746) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at 10.16 -0.00254) (size 1.99898 1.99898) (drill 1.27) (layers *.Cu *.Mask F.SilkS) + (net 13 "Net-(D1-Pad2)")) + (pad 1 thru_hole rect (at 0 -0.00254) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.Mask F.SilkS) + (net 12 "Net-(C11-Pad1)")) + ) + + (module SMD:SMD_1206 (layer F.Cu) (tedit 5608B053) (tstamp 5605FD6C) + (at 43.66514 140.70584) + (tags Handsolderable) + (path /55D739F3) + (fp_text reference F1 (at 2.00914 -0.07112 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value F_Small (at 2.6 0 90) (layer F.SilkS) hide + (effects (font (thickness 0.3048))) + ) + (fp_line (start -0.8 -1.6) (end 0.8 -1.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.8 -1.6) (end 0.8 1.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.8 1.6) (end -0.8 1.6) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.8 1.6) (end -0.8 -1.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at 0 -1.6) (size 2 2) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 2 smd rect (at 0 1.6) (size 2 2) (layers F.Cu F.Paste F.Mask) + (net 11 /VGND)) + (model 3D/SMD/SMD-1206.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm (layer F.Cu) (tedit 5608B0A9) (tstamp 5605FD9C) + (at 54.1274 136.6266 180) + (descr "LQFP44 (see Appnote_PCB_Guidelines_TRINAMIC_packages.pdf)") + (tags "QFP 0.8") + (path /55CA8F25) + (attr smd) + (fp_text reference IC1 (at 0.21336 -0.19304 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value ATXMEGA16A4U-A (at 0 7.65 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -6.9 -6.9) (end -6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start 6.9 -6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 -6.9) (end 6.9 -6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -6.9 6.9) (end 6.9 6.9) (layer F.CrtYd) (width 0.05)) + (fp_line (start -5.175 -5.175) (end -5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 5.175 -4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -5.175 4.505) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -5.175) (end -4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 5.175) (end -4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 5.175) (end 4.505 5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.175 -5.175) (end 4.505 -5.175) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.175 -4.505) (end -6.65 -4.505) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -5.85 -4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 14 "Net-(IC1-Pad1)")) + (pad 2 smd rect (at -5.85 -3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 15 /CH2)) + (pad 3 smd rect (at -5.85 -2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 16 "Net-(IC1-Pad3)")) + (pad 4 smd rect (at -5.85 -1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 17 "Net-(IC1-Pad4)")) + (pad 5 smd rect (at -5.85 -0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 18 "Net-(IC1-Pad5)")) + (pad 6 smd rect (at -5.85 0 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 19 /DAC_OUT)) + (pad 7 smd rect (at -5.85 0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 20 "Net-(IC1-Pad7)")) + (pad 8 smd rect (at -5.85 1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 67 "Net-(IC1-Pad8)")) + (pad 9 smd rect (at -5.85 2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 68 "Net-(IC1-Pad9)")) + (pad 10 smd rect (at -5.85 3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 21 "Net-(IC1-Pad10)")) + (pad 11 smd rect (at -5.85 4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 22 /XCK)) + (pad 12 smd rect (at -4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 23 /DIG_CH2)) + (pad 13 smd rect (at -3.2 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 24 "Net-(IC1-Pad13)")) + (pad 14 smd rect (at -2.4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 15 smd rect (at -1.6 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 22 /XCK)) + (pad 16 smd rect (at -0.8 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 25 "Net-(IC1-Pad16)")) + (pad 17 smd rect (at 0 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 26 /DIG_CH1)) + (pad 18 smd rect (at 0.8 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 19 smd rect (at 1.6 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 20 smd rect (at 2.4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 27 "Net-(IC1-Pad20)")) + (pad 21 smd rect (at 3.2 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 28 "Net-(IC1-Pad21)")) + (pad 22 smd rect (at 4 5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 29 "Net-(IC1-Pad22)")) + (pad 23 smd rect (at 5.85 4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 30 "Net-(IC1-Pad23)")) + (pad 24 smd rect (at 5.85 3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 31 /PSU_PWM)) + (pad 25 smd rect (at 5.85 2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 32 "Net-(IC1-Pad25)")) + (pad 26 smd rect (at 5.85 1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 33 /D-)) + (pad 27 smd rect (at 5.85 0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 34 /D+)) + (pad 28 smd rect (at 5.85 0 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 35 "Net-(IC1-Pad28)")) + (pad 29 smd rect (at 5.85 -0.8 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 36 "Net-(IC1-Pad29)")) + (pad 30 smd rect (at 5.85 -1.6 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 69 "Net-(IC1-Pad30)")) + (pad 31 smd rect (at 5.85 -2.4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 70 "Net-(IC1-Pad31)")) + (pad 32 smd rect (at 5.85 -3.2 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 37 "Net-(IC1-Pad32)")) + (pad 33 smd rect (at 5.85 -4 180) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 38 "Net-(IC1-Pad33)")) + (pad 34 smd rect (at 4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 39 "Net-(IC1-Pad34)")) + (pad 35 smd rect (at 3.2 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 40 "Net-(IC1-Pad35)")) + (pad 36 smd rect (at 2.4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 41 "Net-(IC1-Pad36)")) + (pad 37 smd rect (at 1.6 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 42 "Net-(IC1-Pad37)")) + (pad 38 smd rect (at 0.8 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 39 smd rect (at 0 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 40 smd rect (at -0.8 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 15 /CH2)) + (pad 41 smd rect (at -1.6 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 43 "Net-(IC1-Pad41)")) + (pad 42 smd rect (at -2.4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 44 /CH1)) + (pad 43 smd rect (at -3.2 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 45 "Net-(IC1-Pad43)")) + (pad 44 smd rect (at -4 -5.85 270) (size 1.6 0.56) (layers F.Cu F.Paste F.Mask) + (net 46 /AVCC_ON_2)) + (model Housings_QFP.3dshapes/LQFP-44_10x10mm_Pitch0.8mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10 (layer F.Cu) (tedit 5608B09D) (tstamp 5605FDA2) + (at 63.9572 131.9022) + (descr "Diode, DO-41, SOD81, Horizontal, RM 10mm,") + (tags "Diode, DO-41, SOD81, Horizontal, RM 10mm, 1N4007, SB140,") + (path /5606EE9E) + (fp_text reference L1 (at 4.57708 3.00228) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value INDUCTOR (at 4.37134 -3.55854) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 7.62 -0.00254) (end 8.636 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -0.00254) (end 1.524 -0.00254) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.048 -1.27254) (end 3.048 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.302 -1.27254) (end 3.302 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.556 -1.27254) (end 3.556 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.794 -1.27254) (end 2.794 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27254) (end 3.81 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.175 -1.27254) (end 3.175 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 1.26746) (end 2.54 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.54 -1.27254) (end 7.62 -1.27254) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 -1.27254) (end 7.62 1.26746) (layer F.SilkS) (width 0.15)) + (fp_line (start 7.62 1.26746) (end 2.54 1.26746) (layer F.SilkS) (width 0.15)) + (pad 2 thru_hole circle (at 10.16 -0.00254 180) (size 1.99898 1.99898) (drill 1.27) (layers *.Cu *.Mask F.SilkS) + (net 8 /VCC_PSU)) + (pad 1 thru_hole rect (at 0 -0.00254 180) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.Mask F.SilkS) + (net 13 "Net-(D1-Pad2)")) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 (layer F.Cu) (tedit 5608B05D) (tstamp 5605FDAA) + (at 36.2585 146.1008) + (descr "Through hole pin header") + (tags "pin header") + (path /55CAB35C) + (fp_text reference P1 (at 0.09398 -2.26568) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value SCOPE_IN (at 0 -3.1) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 3 "Net-(C2-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 4 "Net-(C2-Pad2)")) + (pad 3 thru_hole oval (at 0 5.08) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 2 "Net-(C1-Pad2)")) + (pad 4 thru_hole oval (at 0 7.62) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 1 "Net-(C1-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Connect:USB_Micro-B (layer F.Cu) (tedit 5543E447) (tstamp 5605FDB7) + (at 38.56482 135.90016 270) + (descr "Micro USB Type B Receptacle") + (tags "USB USB_B USB_micro USB_OTG") + (path /55CA90D2) + (attr smd) + (fp_text reference P2 (at 0 -3.45 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value USB_OTG (at 0 4.8 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -4.6 -2.8) (end 4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 -2.8) (end 4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.6 4.05) (end -4.6 4.05) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.6 4.05) (end -4.6 -2.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -4.3509 3.81746) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 -2.58754) (end 4.3491 -2.58754) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 -2.58754) (end 4.3491 3.81746) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.3491 2.58746) (end -4.3509 2.58746) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.3509 3.81746) (end -4.3509 -2.58754) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -1.3009 -1.56254) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -0.6509 -1.56254) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 33 /D-)) + (pad 3 smd rect (at -0.0009 -1.56254) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 34 /D+)) + (pad 4 smd rect (at 0.6491 -1.56254) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 47 "Net-(P2-Pad4)")) + (pad 5 smd rect (at 1.2991 -1.56254) (size 1.35 0.4) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 6 thru_hole oval (at -2.5009 -1.56254) (size 0.95 1.25) (drill oval 0.55 0.85) (layers *.Cu *.Mask F.SilkS) + (net 6 GND)) + (pad 6 thru_hole oval (at 2.4991 -1.56254) (size 0.95 1.25) (drill oval 0.55 0.85) (layers *.Cu *.Mask F.SilkS) + (net 6 GND)) + (pad 6 thru_hole oval (at -3.5009 1.13746) (size 1.55 1) (drill oval 1.15 0.5) (layers *.Cu *.Mask F.SilkS) + (net 6 GND)) + (pad 6 thru_hole oval (at 3.4991 1.13746) (size 1.55 1) (drill oval 1.15 0.5) (layers *.Cu *.Mask F.SilkS) + (net 6 GND)) + ) + + (module Pin_Headers:Pin_Header_Straight_1x04 (layer F.Cu) (tedit 0) (tstamp 5605FDBF) + (at 64.86144 154.31008 90) + (descr "Through hole pin header") + (tags "pin header") + (path /55CBF4D5) + (fp_text reference P3 (at 0 -5.1 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DIG_OUT (at 0 -3.1 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 9.4) (end 1.75 9.4) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 8.89) (end 1.27 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 90) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 48 "Net-(P3-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 90) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 49 "Net-(P3-Pad2)")) + (pad 3 thru_hole oval (at 0 5.08 90) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 50 "Net-(P3-Pad3)")) + (pad 4 thru_hole oval (at 0 7.62 90) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 51 "Net-(P3-Pad4)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x04.wrl + (at (xyz 0 -0.15 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_2x02 (layer F.Cu) (tedit 5608B070) (tstamp 5605FDC7) + (at 57.71896 123.71832 270) + (descr "Through hole pin header") + (tags "pin header") + (path /56069A87) + (fp_text reference P4 (at 1.65608 -2.6924 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CONN_02X02 (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 4.3 -1.75) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 4.3 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 4.3 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 -1.55) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 -1.27) (end 3.81 -1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -1.27) (end 3.81 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 3.81) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 7 /AVCC)) + (pad 2 thru_hole oval (at 2.54 0 270) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 39 "Net-(IC1-Pad34)")) + (pad 3 thru_hole oval (at 0 2.54 270) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 6 GND)) + (pad 4 thru_hole oval (at 2.54 2.54 270) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 40 "Net-(IC1-Pad35)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_2x02.wrl + (at (xyz 0.05 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x03 (layer F.Cu) (tedit 5608B06B) (tstamp 5605FDCE) + (at 49.34204 125.08992 270) + (descr "Through hole pin header") + (tags "pin header") + (path /56065DA8) + (fp_text reference P5 (at -0.08128 7.52348 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value CONN_01X03 (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.75 -1.75) (end -1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 6.85) (end 1.75 6.85) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.27 1.27) (end -1.27 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 6.35) (end 1.27 6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 6.35) (end 1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 5 +5V)) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 8 /VCC_PSU)) + (pad 3 thru_hole oval (at 0 5.08 270) (size 2.032 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 7 /AVCC)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x03.wrl + (at (xyz 0 -0.1 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 54EA090C) (tstamp 5605FDD4) + (at 61.3283 154.0129 270) + (descr "Through hole pin header") + (tags "pin header") + (path /55CB63F0) + (fp_text reference P6 (at 0 -5.1 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value AWG_OUT (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 10 "Net-(C7-Pad2)")) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 9 "Net-(C7-Pad1)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 5608B093) (tstamp 5605FDDA) + (at 73.74128 144.50568 270) + (descr "Through hole pin header") + (tags "pin header") + (path /55CC540F) + (fp_text reference P7 (at 0.16764 5.06476 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value HVO (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 12 "Net-(C11-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 11 /VGND)) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Pin_Headers:Pin_Header_Straight_1x02 (layer F.Cu) (tedit 5608B081) (tstamp 5605FDE0) + (at 65.71488 122.57024 270) + (descr "Through hole pin header") + (tags "pin header") + (path /55D6DB77) + (fp_text reference P8 (at -0.92456 -2.54508 360) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value DIG_IN (at 0 -3.1 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 1.27 1.27) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.55 -1.55) (end 1.55 0) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.75 -1.75) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 -1.75) (end 1.75 -1.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.75 4.3) (end 1.75 4.3) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.55 -1.55) (end 1.55 -1.55) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 1.27) (end -1.27 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.27 3.81) (end 1.27 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 thru_hole rect (at 0 0 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 52 "Net-(P8-Pad1)")) + (pad 2 thru_hole oval (at 0 2.54 270) (size 2.032 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS) + (net 53 "Net-(P8-Pad2)")) + (model Pin_Headers.3dshapes/Pin_Header_Straight_1x02.wrl + (at (xyz 0 -0.05 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 90)) + ) + ) + + (module SMD:SOT-23-3 (layer F.Cu) (tedit 5608B07C) (tstamp 5605FDE7) + (at 67.03568 126.30912 90) + (path /5606F6D4) + (fp_text reference Q1 (at -2.33172 -0.19304 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value Q_NMOS_GSD (at -2.2 0 180) (layer F.Fab) hide + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 1 -0.4) (end 1.1 -0.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 -0.8) (end -1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 0.8) (end 1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 0.8) (end 1.5 -0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 -0.8) (end -1.5 -0.8) (layer F.SilkS) (width 0.15)) + (pad 3 smd rect (at 0 1.4 90) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 13 "Net-(D1-Pad2)")) + (pad 2 smd rect (at -0.95 -1.4 90) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 11 /VGND)) + (pad 1 smd rect (at 0.95 -1.4 90) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 31 /PSU_PWM)) + (model 3D/SMD/SOT-23-3.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608B048) (tstamp 5605FDED) + (at 40.2336 154.28976 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAB95) + (attr smd) + (fp_text reference R1 (at -0.32512 -1.46304 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 54 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(C1-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608B033) (tstamp 5605FDF3) + (at 40.21836 145.48104 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAD4C) + (attr smd) + (fp_text reference R2 (at 0.10668 1.3716 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 55 "Net-(R2-Pad1)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(C2-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608B047) (tstamp 5605FDF9) + (at 42.48404 153.58872 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAABF4) + (attr smd) + (fp_text reference R3 (at 0.0508 1.50876 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 54 "Net-(R1-Pad1)")) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 46 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608B030) (tstamp 5605FDFF) + (at 42.40022 146.52244 90) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAD11) + (attr smd) + (fp_text reference R4 (at -0.05588 1.50622 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 90) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 46 /AVCC_ON_2)) + (pad 2 smd rect (at 0.75 0 90) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 55 "Net-(R2-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608B045) (tstamp 5605FE05) + (at 42.07764 151.10206 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAAC5F) + (attr smd) + (fp_text reference R5 (at -2.3622 -0.93218 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 46 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608B042) (tstamp 5605FE0B) + (at 42.02176 149.0091 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CAACD2) + (attr smd) + (fp_text reference R6 (at -2.2352 0.83566 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 46 /AVCC_ON_2)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608AFFF) (tstamp 5605FE11) + (at 72.517 150.95982 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBCDA5) + (attr smd) + (fp_text reference R7 (at 0.05334 -1.41224 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 56 "Net-(R11-Pad2)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 51 "Net-(P3-Pad4)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608AFFE) (tstamp 5605FE17) + (at 70.08114 150.80996 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE401) + (attr smd) + (fp_text reference R8 (at 0.00508 -1.27254 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 57 "Net-(R12-Pad2)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 50 "Net-(P3-Pad3)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608AFFA) (tstamp 5605FE1D) + (at 67.4878 150.88362 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE16B) + (attr smd) + (fp_text reference R9 (at 0.09906 -1.3208 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R13-Pad2)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 49 "Net-(P3-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608AFF4) (tstamp 5605FE23) + (at 64.82334 150.76932 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE2C7) + (attr smd) + (fp_text reference R10 (at -0.03556 -1.33858 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R10-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 48 "Net-(P3-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608B001) (tstamp 5605FE29) + (at 72.4789 148.10232 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBCD2A) + (attr smd) + (fp_text reference R11 (at -0.10668 -1.37414 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 35 "Net-(IC1-Pad28)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 56 "Net-(R11-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608AFFC) (tstamp 5605FE2F) + (at 70.00494 147.83816 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE362) + (attr smd) + (fp_text reference R12 (at -0.05588 -1.2573 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 36 "Net-(IC1-Pad29)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 57 "Net-(R12-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608AFF8) (tstamp 5605FE35) + (at 67.4497 147.79752 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE0F4) + (attr smd) + (fp_text reference R13 (at -0.10668 -1.31318 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 37 "Net-(IC1-Pad32)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 58 "Net-(R13-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608AFF1) (tstamp 5605FE3B) + (at 64.78524 147.75942 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CBE21C) + (attr smd) + (fp_text reference R14 (at -0.15494 -1.33604 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 38 "Net-(IC1-Pad33)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 59 "Net-(R10-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608B020) (tstamp 5605FE41) + (at 59.4233 146.0119) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CB4680) + (attr smd) + (fp_text reference R15 (at 2.74066 0.03302) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R15-Pad1)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R15-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608B01A) (tstamp 5605FE47) + (at 59.4487 148.5773 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /55CB9020) + (attr smd) + (fp_text reference R16 (at -2.57302 -0.06858 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 10 "Net-(C7-Pad2)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 60 "Net-(R15-Pad1)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608AFBA) (tstamp 5605FE4D) + (at 63.85814 137.82294 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56074BFF) + (attr smd) + (fp_text reference R17 (at -2.63906 -1.96342 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R_Small (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 12 "Net-(C11-Pad1)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R17-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608AFB7) (tstamp 5605FE53) + (at 63.89624 139.81684) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56074C88) + (attr smd) + (fp_text reference R18 (at 2.60096 -1.96088) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R_Small (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 62 "Net-(R17-Pad2)")) + (pad 2 smd rect (at 0.75 0) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R18-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5608AFDD) (tstamp 5605FE59) + (at 63.85814 141.98854 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /56074D19) + (attr smd) + (fp_text reference R19 (at -2.74066 -0.04826 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R_Small (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 63 "Net-(R18-Pad2)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 11 /VGND)) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module SMD:SOT-23-3 (layer F.Cu) (tedit 5508E933) (tstamp 5605FE60) + (at 43.64228 132.7912) + (path /55CA99FA) + (fp_text reference U1 (at 2.5 0 90) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value 78L05 (at -2.2 0 90) (layer F.Fab) hide + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_circle (center 1 -0.4) (end 1.1 -0.5) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 -0.8) (end -1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.5 0.8) (end 1.5 0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 0.8) (end 1.5 -0.8) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5 -0.8) (end -1.5 -0.8) (layer F.SilkS) (width 0.15)) + (pad 3 smd rect (at 0 1.4) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 2 smd rect (at -0.95 -1.4) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 1 smd rect (at 0.95 -1.4) (size 0.6 0.9) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (model 3D/SMD/SOT-23-3.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 90)) + ) + ) + + (module Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm (layer F.Cu) (tedit 5608B0A2) (tstamp 5605FE72) + (at 51.1175 149.5806) + (descr "14-Lead Plastic Small Outline (SL) - Narrow, 3.90 mm Body [SOIC] (see Microchip Packaging Specification 00000049BS.pdf)") + (tags "SOIC 1.27") + (path /55CA87E2) + (attr smd) + (fp_text reference U2 (at -0.48006 -0.18796) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value LM324 (at 0 5.375) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -3.7 -4.65) (end -3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start 3.7 -4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 -4.65) (end 3.7 -4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -3.7 4.65) (end 3.7 4.65) (layer F.CrtYd) (width 0.05)) + (fp_line (start -2.075 -4.45) (end -2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 -4.45) (end 2.075 -4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.075 4.45) (end 2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end -2.075 4.335) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.45) (end 2.075 -4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 4.45) (end 2.075 4.45) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.075 -4.335) (end -3.45 -4.335) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -2.7 -3.81) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 15 /CH2)) + (pad 2 smd rect (at -2.7 -2.54) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 15 /CH2)) + (pad 3 smd rect (at -2.7 -1.27) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 55 "Net-(R2-Pad1)")) + (pad 4 smd rect (at -2.7 0) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 5 +5V)) + (pad 5 smd rect (at -2.7 1.27) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 54 "Net-(R1-Pad1)")) + (pad 6 smd rect (at -2.7 2.54) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 44 /CH1)) + (pad 7 smd rect (at -2.7 3.81) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 44 /CH1)) + (pad 8 smd rect (at 2.7 3.81) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R15-Pad2)")) + (pad 9 smd rect (at 2.7 2.54) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 61 "Net-(R15-Pad2)")) + (pad 10 smd rect (at 2.7 1.27) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 19 /DAC_OUT)) + (pad 11 smd rect (at 2.7 0) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 11 /VGND)) + (pad 12 smd rect (at 2.7 -1.27) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 64 "Net-(U2-Pad12)")) + (pad 13 smd rect (at 2.7 -2.54) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 65 "Net-(U2-Pad13)")) + (pad 14 smd rect (at 2.7 -3.81) (size 1.5 0.6) (layers F.Cu F.Paste F.Mask) + (net 66 "Net-(U2-Pad14)")) + (model Housings_SOIC.3dshapes/SOIC-14_3.9x8.7mm_Pitch1.27mm.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Footprints:SOT363 (layer F.Cu) (tedit 5070B96C) (tstamp 5605FE7C) + (at 61.25972 128.4732) + (descr SOT363) + (path /55D6ACFD) + (attr smd) + (fp_text reference U3 (at 0.09906 1.69926) (layer F.SilkS) hide + (effects (font (size 0.762 0.635) (thickness 0.127))) + ) + (fp_text value DMN63D8LDW (at 0 -1.50114) (layer F.SilkS) + (effects (font (size 0.762 0.635) (thickness 0.127))) + ) + (fp_line (start 0.635 1.016) (end 0.635 -1.016) (layer F.SilkS) (width 0.1524)) + (fp_line (start 0.635 -1.016) (end -0.635 -1.016) (layer F.SilkS) (width 0.1524)) + (fp_line (start -0.635 -1.016) (end -0.635 1.016) (layer F.SilkS) (width 0.1524)) + (fp_line (start -0.635 1.016) (end 0.635 1.016) (layer F.SilkS) (width 0.1524)) + (pad 1 smd rect (at -1.016 -0.635) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 3 smd rect (at -1.016 0.635) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 23 /DIG_CH2)) + (pad 5 smd rect (at 1.016 0) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 52 "Net-(P8-Pad1)")) + (pad 2 smd rect (at -1.016 0) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 53 "Net-(P8-Pad2)")) + (pad 4 smd rect (at 1.016 0.635) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (pad 6 smd rect (at 1.016 -0.635) (size 0.508 0.3048) (layers F.Cu F.Paste F.Mask) + (net 26 /DIG_CH1)) + (model 3D/SOT-363.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5608B064) (tstamp 56089D59) + (at 52.78628 128.42748) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /5608B4BE) + (attr smd) + (fp_text reference C13 (at -3.18516 -0.04572) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Capacitors_SMD:C_0603 (layer F.Cu) (tedit 5608B0A4) (tstamp 5608A068) + (at 53.6956 144.20088 180) + (descr "Capacitor SMD 0603, reflow soldering, AVX (see smccp.pdf)") + (tags "capacitor 0603") + (path /5609699F) + (attr smd) + (fp_text reference C10 (at -3.19024 -0.12192 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value C (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.45 -0.75) (end 1.45 -0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.45 -0.75) (end -1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.45 -0.75) (end 1.45 0.75) (layer F.CrtYd) (width 0.05)) + (fp_line (start -0.35 -0.6) (end 0.35 -0.6) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.35 0.6) (end -0.35 0.6) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 7 /AVCC)) + (pad 2 smd rect (at 0.75 0 180) (size 0.8 0.75) (layers F.Cu F.Paste F.Mask) + (net 6 GND)) + (model Capacitors_SMD.3dshapes/C_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (gr_line (start 33.1978 117.61216) (end 33.1978 157.23616) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 76.8858 117.61216) (end 33.1978 117.61216) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 76.8858 157.10916) (end 76.8858 117.61216) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_line (start 33.1978 157.10916) (end 76.8858 157.10916) (angle 90) (layer Edge.Cuts) (width 0.1)) + (gr_text "TINYLAB PCB\nPROTO 1" (at 38.67912 119.72544) (layer F.Cu) + (effects (font (size 1 1) (thickness 0.25))) + ) + (gr_line (start 33.63976 117.85092) (end 33.63976 118.52148) (angle 90) (layer Edge.Cuts) (width 0.1)) + + (segment (start 39.4836 154.28976) (end 36.82746 154.28976) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 36.82746 154.28976) (end 36.2585 153.7208) (width 0.25) (layer F.Cu) (net 1) (tstamp 560600EE)) + (segment (start 39.4836 154.28976) (end 39.4836 152.84704) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 39.4836 152.84704) (end 39.3192 152.68264) (width 0.25) (layer F.Cu) (net 1) (tstamp 560600EA)) + (segment (start 39.3192 151.18264) (end 36.26034 151.18264) (width 0.25) (layer F.Cu) (net 2)) + (segment (start 36.26034 151.18264) (end 36.2585 151.1808) (width 0.25) (layer F.Cu) (net 2) (tstamp 560600E7)) + (segment (start 39.46836 145.48104) (end 39.46836 146.89836) (width 0.25) (layer F.Cu) (net 3)) + (segment (start 39.46836 146.89836) (end 39.27856 147.08816) (width 0.25) (layer F.Cu) (net 3) (tstamp 560600E1)) + (segment (start 39.46836 145.48104) (end 36.87826 145.48104) (width 0.25) (layer F.Cu) (net 3)) + (segment (start 36.87826 145.48104) (end 36.2585 146.1008) (width 0.25) (layer F.Cu) (net 3) (tstamp 560600DA)) + (segment (start 39.27856 148.58816) (end 36.31114 148.58816) (width 0.25) (layer F.Cu) (net 4)) + (segment (start 36.31114 148.58816) (end 36.2585 148.6408) (width 0.25) (layer F.Cu) (net 4) (tstamp 560600E4)) + (segment (start 46.5836 144.4244) (end 46.5836 134.32536) (width 1.16) (layer B.Cu) (net 5)) + (segment (start 46.5836 134.32536) (end 46.4312 134.17296) (width 1.16) (layer B.Cu) (net 5) (tstamp 5608989E)) + (segment (start 49.34204 125.08992) (end 49.34204 127.08636) (width 1.16) (layer B.Cu) (net 5)) + (segment (start 49.34204 127.08636) (end 48.06188 128.36652) (width 1.16) (layer B.Cu) (net 5) (tstamp 56089889)) + (segment (start 48.06188 128.36652) (end 46.1264 128.36652) (width 1.16) (layer B.Cu) (net 5) (tstamp 5608988A)) + (segment (start 46.1264 128.36652) (end 45.02912 129.4638) (width 1.16) (layer B.Cu) (net 5) (tstamp 5608988B)) + (segment (start 45.02912 129.4638) (end 45.02912 132.55752) (width 1.16) (layer B.Cu) (net 5) (tstamp 5608988C)) + (segment (start 45.02912 132.55752) (end 46.4312 133.9596) (width 1.16) (layer B.Cu) (net 5) (tstamp 5608988D)) + (segment (start 46.4312 133.9596) (end 46.4312 134.17296) (width 1.16) (layer B.Cu) (net 5) (tstamp 5608988E)) + (segment (start 49.89068 149.56536) (end 51.3842 148.07184) (width 0.58) (layer B.Cu) (net 5)) + (segment (start 51.3842 148.07184) (end 55.51424 148.07184) (width 0.58) (layer B.Cu) (net 5) (tstamp 56089876)) + (segment (start 55.51424 148.07184) (end 55.63616 147.94992) (width 0.58) (layer B.Cu) (net 5) (tstamp 56089877)) + (segment (start 56.59628 147.96192) (end 55.64816 147.96192) (width 0.254) (layer F.Cu) (net 5)) + (segment (start 49.87544 149.5806) (end 48.4175 149.5806) (width 0.254) (layer F.Cu) (net 5) (tstamp 56060496)) + (segment (start 49.89068 149.56536) (end 49.87544 149.5806) (width 0.254) (layer F.Cu) (net 5) (tstamp 56060495)) + (via (at 49.89068 149.56536) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 5)) + (segment (start 55.51424 148.07184) (end 51.3842 148.07184) (width 0.254) (layer B.Cu) (net 5) (tstamp 56060491)) + (segment (start 55.63616 147.94992) (end 55.51424 148.07184) (width 0.254) (layer B.Cu) (net 5) (tstamp 56060490)) + (via (at 55.63616 147.94992) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 5)) + (segment (start 55.64816 147.96192) (end 55.63616 147.94992) (width 0.254) (layer F.Cu) (net 5) (tstamp 5606048E)) + (segment (start 46.4312 134.17296) (end 46.4312 133.9596) (width 0.58) (layer B.Cu) (net 5)) + (segment (start 48.06188 128.36652) (end 49.34204 127.08636) (width 0.58) (layer B.Cu) (net 5) (tstamp 5606035E)) + (segment (start 46.1264 128.36652) (end 48.06188 128.36652) (width 0.58) (layer B.Cu) (net 5) (tstamp 5606035D)) + (segment (start 45.02912 129.4638) (end 46.1264 128.36652) (width 0.58) (layer B.Cu) (net 5) (tstamp 5606035C)) + (segment (start 45.02912 132.55752) (end 45.02912 129.4638) (width 0.58) (layer B.Cu) (net 5) (tstamp 5606035B)) + (segment (start 46.4312 133.9596) (end 45.02912 132.55752) (width 0.58) (layer B.Cu) (net 5) (tstamp 5606035A)) + (segment (start 43.64228 134.1912) (end 46.41296 134.1912) (width 0.58) (layer F.Cu) (net 5)) + (segment (start 46.67504 149.5806) (end 48.4175 149.5806) (width 0.58) (layer F.Cu) (net 5) (tstamp 56060304)) + (segment (start 46.5836 149.48916) (end 46.67504 149.5806) (width 0.58) (layer F.Cu) (net 5) (tstamp 56060303)) + (via (at 46.5836 149.48916) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 5)) + (segment (start 46.5836 144.4244) (end 46.5836 149.48916) (width 0.58) (layer B.Cu) (net 5) (tstamp 5608989C)) + (segment (start 46.4312 134.17296) (end 46.5836 134.32536) (width 0.58) (layer B.Cu) (net 5) (tstamp 56060300)) + (via (at 46.4312 134.17296) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 5)) + (segment (start 46.41296 134.1912) (end 46.4312 134.17296) (width 0.58) (layer F.Cu) (net 5) (tstamp 560602FE)) + (segment (start 43.68292 135.52608) (end 43.68292 134.23184) (width 0.254) (layer F.Cu) (net 5)) + (segment (start 43.68292 134.23184) (end 43.64228 134.1912) (width 0.254) (layer F.Cu) (net 5) (tstamp 56060243)) + (segment (start 40.12736 134.59926) (end 43.23422 134.59926) (width 0.254) (layer F.Cu) (net 5)) + (segment (start 43.23422 134.59926) (end 43.64228 134.1912) (width 0.254) (layer F.Cu) (net 5) (tstamp 56060226)) + (segment (start 53.213 126.86284) (end 53.213 125.54712) (width 0.254) (layer B.Cu) (net 6)) + (segment (start 53.213 125.54712) (end 55.0418 123.71832) (width 0.254) (layer B.Cu) (net 6) (tstamp 5608A89C)) + (segment (start 55.0418 123.71832) (end 55.17896 123.71832) (width 0.254) (layer B.Cu) (net 6) (tstamp 5608A89D)) + (segment (start 56.5274 130.7766) (end 56.5274 128.27792) (width 0.254) (layer F.Cu) (net 6)) + (segment (start 56.96712 127.8382) (end 58.64352 127.8382) (width 0.254) (layer F.Cu) (net 6) (tstamp 5608A7D2)) + (segment (start 56.5274 128.27792) (end 56.96712 127.8382) (width 0.254) (layer F.Cu) (net 6) (tstamp 5608A7CF)) + (segment (start 46.37024 129.80416) (end 48.8696 129.80416) (width 1.16) (layer F.Cu) (net 6)) + (segment (start 53.53628 127.18612) (end 53.53628 128.42748) (width 1.16) (layer F.Cu) (net 6) (tstamp 5608A646)) + (segment (start 53.213 126.86284) (end 53.53628 127.18612) (width 1.16) (layer F.Cu) (net 6) (tstamp 5608A645)) + (via (at 53.213 126.86284) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 51.81092 126.86284) (end 53.213 126.86284) (width 1.16) (layer B.Cu) (net 6) (tstamp 5608A641)) + (segment (start 49.94656 128.7272) (end 51.81092 126.86284) (width 1.16) (layer B.Cu) (net 6) (tstamp 5608A640)) + (via (at 49.94656 128.7272) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 48.8696 129.80416) (end 49.94656 128.7272) (width 1.16) (layer F.Cu) (net 6) (tstamp 5608A63C)) + (segment (start 53.3274 142.4766) (end 53.3274 132.3594) (width 0.58) (layer F.Cu) (net 6)) + (segment (start 53.3274 132.3594) (end 53.3274 132.26796) (width 0.58) (layer F.Cu) (net 6) (tstamp 5608A58E)) + (segment (start 53.3274 132.26796) (end 53.3274 130.796598) (width 0.58) (layer F.Cu) (net 6) (tstamp 5608A512)) + (segment (start 53.3274 130.796598) (end 53.307402 130.7766) (width 0.58) (layer F.Cu) (net 6) (tstamp 5608A4E7)) + (segment (start 53.307402 130.7766) (end 53.3274 130.7766) (width 0.58) (layer F.Cu) (net 6) (tstamp 5608A4EA)) + (segment (start 53.3274 130.7766) (end 53.3274 128.63636) (width 0.58) (layer F.Cu) (net 6)) + (segment (start 53.3274 128.63636) (end 53.53628 128.42748) (width 0.58) (layer F.Cu) (net 6) (tstamp 56089F20)) + (segment (start 44.59228 131.3912) (end 44.59228 130.0448) (width 1.16) (layer F.Cu) (net 6)) + (segment (start 44.59228 130.0448) (end 44.36434 129.81686) (width 1.16) (layer F.Cu) (net 6) (tstamp 56089B68)) + (segment (start 46.41088 129.80416) (end 46.37024 129.80416) (width 1.16) (layer F.Cu) (net 6)) + (segment (start 46.37024 129.80416) (end 44.37704 129.80416) (width 1.16) (layer F.Cu) (net 6) (tstamp 5608A570)) + (segment (start 44.37704 129.80416) (end 44.36434 129.81686) (width 1.16) (layer F.Cu) (net 6) (tstamp 56089B64)) + (segment (start 43.66514 139.10584) (end 43.66514 137.04386) (width 1.16) (layer F.Cu) (net 6)) + (segment (start 43.66514 137.04386) (end 43.68292 137.02608) (width 1.16) (layer F.Cu) (net 6) (tstamp 56089AD9)) + (via (at 63.26124 126.90856) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 62.5856 126.23292) (end 63.26124 126.90856) (width 0.254) (layer F.Cu) (net 6) (tstamp 56060BE4)) + (segment (start 59.87796 126.23292) (end 62.5856 126.23292) (width 0.254) (layer F.Cu) (net 6)) + (segment (start 63.18504 129.1082) (end 62.27572 129.1082) (width 0.254) (layer F.Cu) (net 6) (tstamp 56060BEC)) + (segment (start 63.36284 128.9304) (end 63.18504 129.1082) (width 0.254) (layer F.Cu) (net 6) (tstamp 56060BEB)) + (via (at 63.36284 128.9304) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 63.36284 127.01016) (end 63.36284 128.9304) (width 0.254) (layer B.Cu) (net 6) (tstamp 56060BE9)) + (segment (start 63.26124 126.90856) (end 63.36284 127.01016) (width 0.254) (layer B.Cu) (net 6) (tstamp 56060BE8)) + (segment (start 59.88812 126.23292) (end 59.87796 126.23292) (width 0.254) (layer F.Cu) (net 6)) + (segment (start 58.64352 127.46736) (end 59.87796 126.23292) (width 0.254) (layer F.Cu) (net 6) (tstamp 56060BDF)) + (segment (start 59.87796 126.23292) (end 59.88812 126.23292) (width 0.254) (layer F.Cu) (net 6) (tstamp 56060BE0)) + (segment (start 58.64352 127.8382) (end 58.64352 127.46736) (width 0.254) (layer F.Cu) (net 6)) + (segment (start 60.24372 127.8382) (end 58.64352 127.8382) (width 0.254) (layer F.Cu) (net 6)) + (segment (start 55.17896 123.71832) (end 55.15864 123.71832) (width 0.254) (layer F.Cu) (net 6)) + (segment (start 46.39818 129.81686) (end 44.36434 129.81686) (width 0.254) (layer F.Cu) (net 6) (tstamp 560602D7)) + (segment (start 46.41088 129.80416) (end 46.39818 129.81686) (width 0.254) (layer F.Cu) (net 6) (tstamp 560602D6)) + (segment (start 43.66514 137.04386) (end 43.68292 137.02608) (width 0.58) (layer F.Cu) (net 6) (tstamp 56060299)) + (segment (start 44.59228 130.0448) (end 44.36434 129.81686) (width 0.254) (layer F.Cu) (net 6) (tstamp 56060251)) + (segment (start 40.12736 137.19926) (end 43.50974 137.19926) (width 0.254) (layer F.Cu) (net 6)) + (segment (start 43.50974 137.19926) (end 43.68292 137.02608) (width 0.254) (layer F.Cu) (net 6) (tstamp 56060240)) + (segment (start 40.12736 138.39926) (end 40.12736 137.19926) (width 0.254) (layer F.Cu) (net 6)) + (segment (start 37.42736 139.39926) (end 37.42736 132.39926) (width 0.254) (layer F.Cu) (net 6)) + (segment (start 40.12736 133.39926) (end 41.19018 133.39926) (width 0.58) (layer F.Cu) (net 6)) + (segment (start 44.59228 132.31364) (end 44.59228 131.3912) (width 0.58) (layer F.Cu) (net 6) (tstamp 5606021F)) + (segment (start 44.0944 132.81152) (end 44.59228 132.31364) (width 0.58) (layer F.Cu) (net 6) (tstamp 5606021E)) + (segment (start 41.77792 132.81152) (end 44.0944 132.81152) (width 0.58) (layer F.Cu) (net 6) (tstamp 5606021D)) + (segment (start 41.19018 133.39926) (end 41.77792 132.81152) (width 0.58) (layer F.Cu) (net 6) (tstamp 5606021C)) + (segment (start 40.12736 133.39926) (end 39.9425 133.39926) (width 0.58) (layer F.Cu) (net 6)) + (segment (start 39.9425 133.39926) (end 38.9425 132.39926) (width 0.58) (layer F.Cu) (net 6) (tstamp 5606020E)) + (segment (start 38.9425 132.39926) (end 37.42736 132.39926) (width 0.58) (layer F.Cu) (net 6) (tstamp 5606020F)) + (segment (start 40.12736 138.39926) (end 40.12736 138.50576) (width 0.58) (layer F.Cu) (net 6)) + (segment (start 40.12736 138.50576) (end 39.23386 139.39926) (width 0.58) (layer F.Cu) (net 6) (tstamp 5606020A)) + (segment (start 39.23386 139.39926) (end 37.42736 139.39926) (width 0.58) (layer F.Cu) (net 6) (tstamp 5606020B)) + (segment (start 53.3274 142.4766) (end 53.3274 143.81908) (width 0.58) (layer F.Cu) (net 6)) + (segment (start 53.3274 143.81908) (end 52.9456 144.20088) (width 0.58) (layer F.Cu) (net 6) (tstamp 5608A2A1)) + (segment (start 52.9456 144.20088) (end 51.48072 144.20088) (width 0.58) (layer F.Cu) (net 6)) + (segment (start 51.48072 144.20088) (end 51.45024 144.23136) (width 0.58) (layer F.Cu) (net 6) (tstamp 5608A28D)) + (segment (start 44.22648 149.30558) (end 45.46162 149.30558) (width 0.254) (layer F.Cu) (net 6)) + (segment (start 51.45024 144.23136) (end 51.48072 144.20088) (width 0.254) (layer F.Cu) (net 6) (tstamp 5608A0AC)) + (via (at 51.45024 144.23136) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 50.5968 145.0848) (end 51.45024 144.23136) (width 0.254) (layer B.Cu) (net 6) (tstamp 5608A0AA)) + (segment (start 50.5968 146.69008) (end 50.5968 145.0848) (width 0.254) (layer B.Cu) (net 6) (tstamp 5608A0A8)) + (segment (start 46.95952 150.32736) (end 50.5968 146.69008) (width 0.254) (layer B.Cu) (net 6) (tstamp 5608A0A7)) + (segment (start 46.24832 150.32736) (end 46.95952 150.32736) (width 0.254) (layer B.Cu) (net 6) (tstamp 5608A0A6)) + (segment (start 45.94352 150.02256) (end 46.24832 150.32736) (width 0.254) (layer B.Cu) (net 6) (tstamp 5608A0A5)) + (segment (start 45.94352 149.71776) (end 45.94352 150.02256) (width 0.254) (layer B.Cu) (net 6) (tstamp 5608A0A4)) + (segment (start 45.49648 149.27072) (end 45.94352 149.71776) (width 0.254) (layer B.Cu) (net 6) (tstamp 5608A0A3)) + (via (at 45.49648 149.27072) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 6)) + (segment (start 45.46162 149.30558) (end 45.49648 149.27072) (width 0.254) (layer F.Cu) (net 6) (tstamp 5608A0A1)) + (segment (start 52.9456 144.20088) (end 52.9456 144.00092) (width 0.254) (layer F.Cu) (net 6)) + (segment (start 52.9456 144.00092) (end 53.3274 143.61912) (width 0.254) (layer F.Cu) (net 6) (tstamp 5608A07B)) + (segment (start 53.3274 143.61912) (end 53.3274 142.4766) (width 0.254) (layer F.Cu) (net 6) (tstamp 5608A07C)) + (segment (start 42.77176 149.0091) (end 43.93 149.0091) (width 0.25) (layer F.Cu) (net 6)) + (segment (start 43.93 149.0091) (end 44.22648 149.30558) (width 0.25) (layer F.Cu) (net 6) (tstamp 56060102)) + (segment (start 52.5274 130.7766) (end 52.5274 133.807) (width 0.58) (layer F.Cu) (net 7)) + (segment (start 54.107402 133.964358) (end 54.107402 142.4766) (width 0.58) (layer F.Cu) (net 7) (tstamp 5608A5C5)) + (segment (start 54.21884 133.85292) (end 54.107402 133.964358) (width 0.58) (layer F.Cu) (net 7) (tstamp 5608A5C4)) + (via (at 54.21884 133.85292) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 7)) + (segment (start 52.48148 133.85292) (end 54.21884 133.85292) (width 0.58) (layer B.Cu) (net 7) (tstamp 5608A5C1)) + (segment (start 52.46624 133.86816) (end 52.48148 133.85292) (width 0.58) (layer B.Cu) (net 7) (tstamp 5608A5C0)) + (via (at 52.46624 133.86816) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 7)) + (segment (start 52.5274 133.807) (end 52.46624 133.86816) (width 0.58) (layer F.Cu) (net 7) (tstamp 5608A5BC)) + (segment (start 54.107402 142.4766) (end 54.1274 142.4766) (width 0.58) (layer F.Cu) (net 7) (tstamp 5608A5C7)) + (segment (start 54.107402 142.4766) (end 54.1274 142.4766) (width 0.58) (layer F.Cu) (net 7) (tstamp 5608A520)) + (segment (start 42.69228 131.3912) (end 42.69228 129.98892) (width 1.16) (layer F.Cu) (net 7)) + (segment (start 42.69228 129.98892) (end 42.86434 129.81686) (width 1.16) (layer F.Cu) (net 7) (tstamp 56089F4B)) + (segment (start 52.03628 128.42748) (end 52.03628 128.41916) (width 1.16) (layer F.Cu) (net 7)) + (segment (start 52.03628 128.41916) (end 51.2572 127.64008) (width 1.16) (layer F.Cu) (net 7) (tstamp 56089F35)) + (segment (start 52.03628 128.42748) (end 52.03628 128.65284) (width 0.58) (layer F.Cu) (net 7)) + (segment (start 52.03628 128.65284) (end 52.5274 129.14396) (width 0.58) (layer F.Cu) (net 7) (tstamp 56089F1B)) + (segment (start 52.5274 129.14396) (end 52.5274 130.7766) (width 0.58) (layer F.Cu) (net 7) (tstamp 56089F1D)) + (segment (start 57.71896 123.71832) (end 57.71896 122.76328) (width 0.58) (layer F.Cu) (net 7)) + (segment (start 57.71896 122.76328) (end 57.05856 122.10288) (width 0.58) (layer F.Cu) (net 7) (tstamp 56089B07)) + (segment (start 57.05856 122.10288) (end 54.53888 122.10288) (width 0.58) (layer F.Cu) (net 7) (tstamp 56089B08)) + (segment (start 54.53888 122.10288) (end 51.73472 124.90704) (width 0.58) (layer F.Cu) (net 7) (tstamp 56089B09)) + (segment (start 51.73472 124.90704) (end 51.73472 127.16256) (width 0.58) (layer F.Cu) (net 7) (tstamp 56089B0A)) + (segment (start 51.73472 127.16256) (end 51.2572 127.64008) (width 0.58) (layer F.Cu) (net 7) (tstamp 56089B0B)) + (segment (start 44.1452 127.07112) (end 50.68824 127.07112) (width 1.16) (layer F.Cu) (net 7)) + (segment (start 50.68824 127.07112) (end 51.2572 127.64008) (width 1.16) (layer F.Cu) (net 7) (tstamp 56089AF3)) + (segment (start 42.86434 129.81686) (end 42.86434 128.35198) (width 1.16) (layer F.Cu) (net 7)) + (segment (start 42.86434 128.35198) (end 44.1452 127.07112) (width 1.16) (layer F.Cu) (net 7) (tstamp 56089AED)) + (segment (start 44.1452 127.07112) (end 44.1452 125.20676) (width 1.16) (layer F.Cu) (net 7) (tstamp 56089AEF)) + (segment (start 44.1452 125.20676) (end 44.26204 125.08992) (width 1.16) (layer F.Cu) (net 7) (tstamp 56089AF0)) + (segment (start 51.73472 124.90704) (end 51.73472 128.1176) (width 0.254) (layer F.Cu) (net 7) (tstamp 56060589)) + (segment (start 54.53888 122.10288) (end 51.73472 124.90704) (width 0.254) (layer F.Cu) (net 7) (tstamp 56060584)) + (segment (start 57.05856 122.10288) (end 54.53888 122.10288) (width 0.254) (layer F.Cu) (net 7) (tstamp 56060581)) + (segment (start 57.71896 122.76328) (end 57.05856 122.10288) (width 0.254) (layer F.Cu) (net 7) (tstamp 56060580)) + (segment (start 50.68824 127.07112) (end 51.73472 128.1176) (width 0.58) (layer F.Cu) (net 7) (tstamp 56060357)) + (segment (start 42.86434 128.35198) (end 44.1452 127.07112) (width 0.58) (layer F.Cu) (net 7) (tstamp 56060351)) + (segment (start 44.1452 127.07112) (end 44.26204 126.95428) (width 0.58) (layer F.Cu) (net 7) (tstamp 56060355)) + (segment (start 44.26204 126.95428) (end 44.26204 125.08992) (width 0.58) (layer F.Cu) (net 7) (tstamp 56060352)) + (segment (start 42.69228 129.98892) (end 42.86434 129.81686) (width 0.254) (layer F.Cu) (net 7) (tstamp 5606024E)) + (segment (start 54.1274 142.4766) (end 54.1274 143.88268) (width 0.58) (layer F.Cu) (net 7)) + (segment (start 54.1274 143.88268) (end 54.4456 144.20088) (width 0.58) (layer F.Cu) (net 7) (tstamp 5608A29B)) + (segment (start 54.4456 144.20088) (end 55.54472 144.20088) (width 0.58) (layer F.Cu) (net 7)) + (segment (start 44.22648 150.80558) (end 45.30414 150.80558) (width 0.254) (layer F.Cu) (net 7)) + (via (at 55.54472 144.20088) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 7)) + (segment (start 53.4924 144.20088) (end 55.54472 144.20088) (width 0.254) (layer B.Cu) (net 7) (tstamp 5608A0B9)) + (segment (start 51.67376 146.01952) (end 53.4924 144.20088) (width 0.254) (layer B.Cu) (net 7) (tstamp 5608A0B8)) + (segment (start 51.67376 146.58848) (end 51.67376 146.01952) (width 0.254) (layer B.Cu) (net 7) (tstamp 5608A0B7)) + (segment (start 48.58512 149.67712) (end 51.67376 146.58848) (width 0.254) (layer B.Cu) (net 7) (tstamp 5608A0B6)) + (segment (start 48.58512 150.59152) (end 48.58512 149.67712) (width 0.254) (layer B.Cu) (net 7) (tstamp 5608A0B5)) + (segment (start 47.58944 151.5872) (end 48.58512 150.59152) (width 0.254) (layer B.Cu) (net 7) (tstamp 5608A0B4)) + (segment (start 46.08576 151.5872) (end 47.58944 151.5872) (width 0.254) (layer B.Cu) (net 7) (tstamp 5608A0B3)) + (segment (start 45.57776 151.0792) (end 46.08576 151.5872) (width 0.254) (layer B.Cu) (net 7) (tstamp 5608A0B2)) + (via (at 45.57776 151.0792) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 7)) + (segment (start 45.30414 150.80558) (end 45.57776 151.0792) (width 0.254) (layer F.Cu) (net 7) (tstamp 5608A0B0)) + (segment (start 54.4456 144.20088) (end 54.23408 144.20088) (width 0.254) (layer F.Cu) (net 7)) + (segment (start 54.23408 144.20088) (end 54.1274 144.0942) (width 0.254) (layer F.Cu) (net 7) (tstamp 5608A077)) + (segment (start 54.1274 144.0942) (end 54.1274 142.4766) (width 0.254) (layer F.Cu) (net 7) (tstamp 5608A078)) + (segment (start 42.82764 151.10206) (end 43.93 151.10206) (width 0.25) (layer F.Cu) (net 7)) + (segment (start 43.93 151.10206) (end 44.22648 150.80558) (width 0.25) (layer F.Cu) (net 7) (tstamp 56060105)) + (segment (start 74.1172 131.89966) (end 74.1172 128.85928) (width 1.16) (layer B.Cu) (net 8)) + (segment (start 74.1172 128.85928) (end 70.85584 125.59792) (width 1.16) (layer B.Cu) (net 8) (tstamp 56060E3B)) + (segment (start 70.85584 125.59792) (end 74.44556 125.59792) (width 1.16) (layer F.Cu) (net 8)) + (segment (start 74.44556 125.59792) (end 75.07224 126.2246) (width 1.16) (layer F.Cu) (net 8) (tstamp 56060E27)) + (segment (start 46.80204 125.08992) (end 46.80204 123.98756) (width 1.16) (layer F.Cu) (net 8)) + (segment (start 70.85584 122.64644) (end 70.85584 125.59792) (width 1.16) (layer F.Cu) (net 8) (tstamp 56060E22)) + (segment (start 68.11264 119.90324) (end 70.85584 122.64644) (width 1.16) (layer F.Cu) (net 8) (tstamp 56060E21)) + (segment (start 50.88636 119.90324) (end 68.11264 119.90324) (width 1.16) (layer F.Cu) (net 8) (tstamp 56060E1F)) + (segment (start 46.80204 123.98756) (end 50.88636 119.90324) (width 1.16) (layer F.Cu) (net 8) (tstamp 56060E1A)) + (segment (start 74.44556 125.59792) (end 75.07224 126.2246) (width 0.254) (layer F.Cu) (net 8) (tstamp 56060A32)) + (segment (start 58.79522 150.9649) (end 58.79522 154.00598) (width 0.58) (layer F.Cu) (net 9)) + (segment (start 58.79522 154.00598) (end 58.7883 154.0129) (width 0.58) (layer F.Cu) (net 9) (tstamp 560899BA)) + (segment (start 58.7883 154.0129) (end 58.7883 150.97182) (width 0.254) (layer F.Cu) (net 9)) + (segment (start 58.7883 150.97182) (end 58.79522 150.9649) (width 0.254) (layer F.Cu) (net 9) (tstamp 5606086F)) + (segment (start 60.29522 150.9649) (end 60.4393 150.9649) (width 0.58) (layer F.Cu) (net 10)) + (segment (start 60.4393 150.9649) (end 61.3283 151.8539) (width 0.58) (layer F.Cu) (net 10) (tstamp 560899B6)) + (segment (start 61.3283 151.8539) (end 61.3283 154.0129) (width 0.58) (layer F.Cu) (net 10) (tstamp 560899B7)) + (segment (start 60.1987 148.5773) (end 60.1987 150.86838) (width 0.58) (layer F.Cu) (net 10)) + (segment (start 60.1987 150.86838) (end 60.29522 150.9649) (width 0.58) (layer F.Cu) (net 10) (tstamp 560899B3)) + (segment (start 60.1987 150.86838) (end 60.29522 150.9649) (width 0.254) (layer F.Cu) (net 10) (tstamp 560608A8)) + (segment (start 60.2869 150.95658) (end 60.29522 150.9649) (width 0.254) (layer F.Cu) (net 10) (tstamp 56060884)) + (segment (start 60.4393 150.9649) (end 61.3283 151.8539) (width 0.254) (layer F.Cu) (net 10) (tstamp 56060872)) + (segment (start 61.3283 151.8539) (end 61.3283 154.0129) (width 0.254) (layer F.Cu) (net 10) (tstamp 56060873)) + (segment (start 56.59628 149.46192) (end 57.10612 149.46192) (width 0.58) (layer F.Cu) (net 11)) + (segment (start 57.10612 149.46192) (end 57.7088 148.85924) (width 0.58) (layer F.Cu) (net 11) (tstamp 56089A70)) + (segment (start 51.62804 149.6187) (end 53.7794 149.6187) (width 0.58) (layer F.Cu) (net 11)) + (segment (start 53.7794 149.6187) (end 53.93618 149.46192) (width 0.58) (layer F.Cu) (net 11) (tstamp 56089A12)) + (segment (start 53.93618 149.46192) (end 56.59628 149.46192) (width 0.58) (layer F.Cu) (net 11) (tstamp 56089A14)) + (segment (start 56.59628 149.46192) (end 53.93618 149.46192) (width 0.58) (layer F.Cu) (net 11)) + (segment (start 53.93618 149.46192) (end 53.8175 149.5806) (width 0.58) (layer F.Cu) (net 11) (tstamp 56089992)) + (segment (start 50.06848 134.70128) (end 50.06848 135.39724) (width 1.16) (layer B.Cu) (net 11)) + (segment (start 50.07864 135.4074) (end 51.12004 135.4074) (width 1.16) (layer B.Cu) (net 11) (tstamp 560897CA)) + (segment (start 50.06848 135.39724) (end 50.07864 135.4074) (width 1.16) (layer B.Cu) (net 11) (tstamp 560897C8)) + (segment (start 48.38192 142.17904) (end 48.38192 136.38784) (width 1.16) (layer B.Cu) (net 11)) + (segment (start 57.29732 135.4074) (end 62.5856 130.11912) (width 1.16) (layer B.Cu) (net 11) (tstamp 560897B6)) + (segment (start 51.12004 135.4074) (end 57.29732 135.4074) (width 1.16) (layer B.Cu) (net 11) (tstamp 560897B2)) + (segment (start 48.38192 136.38784) (end 50.06848 134.70128) (width 1.16) (layer B.Cu) (net 11) (tstamp 560897AB)) + (segment (start 62.5856 130.11912) (end 64.06388 130.11912) (width 1.16) (layer B.Cu) (net 11) (tstamp 560897C1)) + (segment (start 43.66514 142.30584) (end 48.25512 142.30584) (width 1.16) (layer F.Cu) (net 11)) + (segment (start 48.25512 142.30584) (end 48.38192 142.17904) (width 1.16) (layer F.Cu) (net 11) (tstamp 560897A0)) + (segment (start 48.38192 142.17904) (end 48.768 141.79296) (width 0.58) (layer B.Cu) (net 11) (tstamp 56060D55)) + (segment (start 48.768 141.79296) (end 48.768 136.38784) (width 0.58) (layer B.Cu) (net 11) (tstamp 56060D56)) + (segment (start 48.768 136.38784) (end 50.43424 134.7216) (width 0.58) (layer B.Cu) (net 11) (tstamp 56060D57)) + (segment (start 48.25512 142.30584) (end 48.38192 142.17904) (width 0.58) (layer F.Cu) (net 11) (tstamp 56060D53)) + (via (at 48.38192 142.17904) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 11)) + (segment (start 50.43424 134.7216) (end 57.97296 134.7216) (width 0.58) (layer B.Cu) (net 11) (tstamp 56060D58)) + (segment (start 57.97296 134.7216) (end 57.98312 134.7216) (width 0.58) (layer B.Cu) (net 11) (tstamp 56061CA4)) + (segment (start 57.98312 134.7216) (end 61.50102 131.2037) (width 0.58) (layer B.Cu) (net 11) (tstamp 56060D59)) + (segment (start 61.50102 131.2037) (end 62.5856 130.11912) (width 0.58) (layer B.Cu) (net 11) (tstamp 56060E7F)) + (segment (start 62.5856 130.11912) (end 63.80988 130.11912) (width 0.58) (layer B.Cu) (net 11) (tstamp 56060D5B)) + (segment (start 63.80988 130.11912) (end 64.06388 130.11912) (width 0.58) (layer B.Cu) (net 11) (tstamp 56061CBB)) + (segment (start 53.8175 149.5806) (end 56.4776 149.5806) (width 0.254) (layer F.Cu) (net 11)) + (segment (start 56.4776 149.5806) (end 56.59628 149.46192) (width 0.254) (layer F.Cu) (net 11) (tstamp 56060499)) + (segment (start 43.66514 142.30584) (end 43.66514 144.4498) (width 1.16) (layer F.Cu) (net 11)) + (segment (start 51.66614 149.5806) (end 53.8175 149.5806) (width 0.58) (layer F.Cu) (net 11) (tstamp 56060343)) + (segment (start 51.62804 149.6187) (end 51.66614 149.5806) (width 0.58) (layer F.Cu) (net 11) (tstamp 56060342)) + (via (at 51.62804 149.6187) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 11)) + (segment (start 51.62804 151.77008) (end 51.62804 149.6187) (width 1.16) (layer B.Cu) (net 11) (tstamp 5606033F)) + (segment (start 49.00168 154.39644) (end 51.62804 151.77008) (width 1.16) (layer B.Cu) (net 11) (tstamp 5606033E)) + (segment (start 43.19016 154.39644) (end 49.00168 154.39644) (width 1.16) (layer B.Cu) (net 11) (tstamp 5606033D)) + (segment (start 42.04462 153.2509) (end 43.19016 154.39644) (width 1.16) (layer B.Cu) (net 11) (tstamp 5606033C)) + (segment (start 42.04462 146.07032) (end 42.04462 153.2509) (width 1.16) (layer B.Cu) (net 11) (tstamp 5606033B)) + (segment (start 43.66514 144.4498) (end 42.04462 146.07032) (width 1.16) (layer B.Cu) (net 11) (tstamp 5606033A)) + (via (at 43.66514 144.4498) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 11)) + (segment (start 57.7088 148.85924) (end 57.7088 146.177) (width 0.58) (layer F.Cu) (net 11) (tstamp 56089A72)) + (segment (start 64.06388 130.11912) (end 65.60312 128.57988) (width 1.16) (layer B.Cu) (net 11) (tstamp 560897C3)) + (segment (start 66.04508 128.13792) (end 65.60312 128.57988) (width 1.16) (layer B.Cu) (net 11) (tstamp 56060E2D)) + (segment (start 66.04508 128.13792) (end 65.60312 128.57988) (width 0.254) (layer B.Cu) (net 11) (tstamp 56060E0A)) + (segment (start 64.06388 130.11912) (end 65.60312 128.57988) (width 0.58) (layer B.Cu) (net 11) (tstamp 56060D5D)) + (via (at 65.60312 128.57988) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 11)) + (via (at 57.7088 146.177) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 11)) + (segment (start 65.60312 128.57988) (end 65.63568 128.54732) (width 0.58) (layer F.Cu) (net 11) (tstamp 56060D5F)) + (segment (start 63.10814 143.10938) (end 63.10814 143.08004) (width 1.16) (layer F.Cu) (net 11) (tstamp 56089AAB)) + (segment (start 61.30544 144.91208) (end 63.10814 143.10938) (width 1.16) (layer F.Cu) (net 11) (tstamp 56089AAA)) + (via (at 61.30544 144.91208) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 11)) + (segment (start 61.30544 144.98828) (end 61.30544 144.91208) (width 1.16) (layer B.Cu) (net 11) (tstamp 56089AA6)) + (segment (start 60.43168 145.86204) (end 61.30544 144.98828) (width 1.16) (layer B.Cu) (net 11) (tstamp 56089A9F)) + (segment (start 58.02376 145.86204) (end 60.43168 145.86204) (width 1.16) (layer B.Cu) (net 11) (tstamp 56089A90)) + (segment (start 57.7088 146.177) (end 58.02376 145.86204) (width 0.58) (layer B.Cu) (net 11) (tstamp 56089A8F)) + (segment (start 63.10814 141.98854) (end 63.10814 143.08004) (width 1.16) (layer F.Cu) (net 11)) + (segment (start 63.10814 143.08004) (end 63.55334 143.52524) (width 1.16) (layer F.Cu) (net 11) (tstamp 560899C7)) + (segment (start 63.55334 143.52524) (end 66.88074 143.52524) (width 1.16) (layer F.Cu) (net 11) (tstamp 560899C8)) + (segment (start 66.88074 143.52524) (end 69.23024 141.17574) (width 1.16) (layer F.Cu) (net 11) (tstamp 560899C9)) + (segment (start 69.23024 141.17574) (end 73.40924 141.17574) (width 1.16) (layer F.Cu) (net 11)) + (segment (start 73.40924 141.17574) (end 73.94194 140.64304) (width 1.16) (layer F.Cu) (net 11) (tstamp 560899C4)) + (segment (start 71.20128 144.50568) (end 69.82968 144.50568) (width 1.16) (layer F.Cu) (net 11)) + (segment (start 69.82968 144.50568) (end 69.23024 143.90624) (width 1.16) (layer F.Cu) (net 11) (tstamp 560899C0)) + (segment (start 69.23024 143.90624) (end 69.23024 141.17574) (width 1.16) (layer F.Cu) (net 11) (tstamp 560899C1)) + (segment (start 69.23024 141.17574) (end 66.88074 143.52524) (width 0.58) (layer F.Cu) (net 11)) + (segment (start 66.88074 143.52524) (end 63.55334 143.52524) (width 0.58) (layer F.Cu) (net 11) (tstamp 56060ECD)) + (segment (start 63.55334 143.52524) (end 63.10814 143.08004) (width 0.58) (layer F.Cu) (net 11) (tstamp 56060ECE)) + (segment (start 73.40924 141.17574) (end 73.94194 140.64304) (width 0.58) (layer F.Cu) (net 11) (tstamp 56060ECA)) + (segment (start 69.23024 143.90624) (end 69.23024 141.17574) (width 0.58) (layer F.Cu) (net 11) (tstamp 56060EC7)) + (segment (start 69.82968 144.50568) (end 69.23024 143.90624) (width 0.58) (layer F.Cu) (net 11) (tstamp 56060EC5)) + (segment (start 63.10814 141.98854) (end 62.92342 141.98854) (width 0.254) (layer F.Cu) (net 11)) + (segment (start 70.85584 128.13792) (end 66.04508 128.13792) (width 1.16) (layer B.Cu) (net 11)) + (segment (start 70.85584 128.13792) (end 74.65892 128.13792) (width 1.16) (layer F.Cu) (net 11)) + (segment (start 74.65892 128.13792) (end 75.07224 127.7246) (width 1.16) (layer F.Cu) (net 11) (tstamp 56060E2A)) + (segment (start 65.63568 128.54732) (end 65.63568 127.25912) (width 0.58) (layer F.Cu) (net 11) (tstamp 56060D60)) + (segment (start 74.65892 128.13792) (end 75.07224 127.7246) (width 0.254) (layer F.Cu) (net 11) (tstamp 56060A35)) + (segment (start 73.40924 141.17574) (end 73.94194 140.64304) (width 0.254) (layer F.Cu) (net 11) (tstamp 560609E2)) + (segment (start 63.55334 143.52524) (end 66.88074 143.52524) (width 0.254) (layer F.Cu) (net 11) (tstamp 560609D1)) + (segment (start 63.10814 143.08004) (end 63.55334 143.52524) (width 0.254) (layer F.Cu) (net 11) (tstamp 560609D0)) + (segment (start 63.10814 141.98854) (end 63.10814 143.08004) (width 0.254) (layer F.Cu) (net 11)) + (segment (start 73.94194 139.14304) (end 73.72788 139.14304) (width 1.16) (layer F.Cu) (net 12)) + (segment (start 73.72788 139.14304) (end 73.22058 138.63574) (width 1.16) (layer F.Cu) (net 12) (tstamp 5608A95F)) + (segment (start 73.22058 138.63574) (end 69.23024 138.63574) (width 1.16) (layer F.Cu) (net 12) (tstamp 5608A960)) + (segment (start 73.94194 139.14304) (end 73.94194 134.83844) (width 1.16) (layer F.Cu) (net 12)) + (segment (start 73.94194 134.83844) (end 73.98004 134.80034) (width 1.16) (layer F.Cu) (net 12) (tstamp 5608A95C)) + (segment (start 73.74128 144.50568) (end 73.74128 143.14678) (width 1.16) (layer B.Cu) (net 12)) + (segment (start 73.74128 143.14678) (end 69.23024 138.63574) (width 1.16) (layer B.Cu) (net 12) (tstamp 560898D4)) + (segment (start 73.94194 134.83844) (end 73.98004 134.80034) (width 0.58) (layer F.Cu) (net 12) (tstamp 56060EDA)) + (segment (start 64.60814 137.82294) (end 67.57924 137.82294) (width 0.58) (layer F.Cu) (net 12)) + (segment (start 67.57924 137.82294) (end 68.39204 138.63574) (width 0.58) (layer F.Cu) (net 12) (tstamp 56060ED6)) + (segment (start 68.39204 138.63574) (end 69.23024 138.63574) (width 0.58) (layer F.Cu) (net 12) (tstamp 56060ED7)) + (segment (start 73.72788 139.14304) (end 73.22058 138.63574) (width 0.58) (layer F.Cu) (net 12) (tstamp 56060ED2)) + (segment (start 73.22058 138.63574) (end 69.23024 138.63574) (width 0.58) (layer F.Cu) (net 12) (tstamp 56060ED3)) + (segment (start 73.74128 143.14678) (end 69.23024 138.63574) (width 0.58) (layer B.Cu) (net 12) (tstamp 56060EBF)) + (segment (start 73.94194 134.83844) (end 73.98004 134.80034) (width 0.254) (layer F.Cu) (net 12) (tstamp 56060E89)) + (segment (start 69.23024 138.63574) (end 73.43464 138.63574) (width 0.254) (layer F.Cu) (net 12)) + (segment (start 73.43464 138.63574) (end 73.94194 139.14304) (width 0.254) (layer F.Cu) (net 12) (tstamp 560609DF)) + (segment (start 69.23024 138.63574) (end 68.39204 138.63574) (width 0.254) (layer F.Cu) (net 12)) + (segment (start 68.39204 138.63574) (end 67.57924 137.82294) (width 0.254) (layer F.Cu) (net 12) (tstamp 560609CC)) + (segment (start 63.82004 134.80034) (end 63.82004 132.03682) (width 1.16) (layer B.Cu) (net 13)) + (segment (start 63.82004 132.03682) (end 63.9572 131.89966) (width 1.16) (layer B.Cu) (net 13) (tstamp 56060E4B)) + (segment (start 68.43568 126.30912) (end 68.43568 127.42118) (width 0.254) (layer F.Cu) (net 13)) + (segment (start 68.43568 127.42118) (end 63.9572 131.89966) (width 0.254) (layer F.Cu) (net 13) (tstamp 56060E10)) + (segment (start 48.4175 145.7706) (end 48.4175 145.20162) (width 0.254) (layer F.Cu) (net 15)) + (segment (start 56.04764 140.78712) (end 55.84952 140.78712) (width 0.254) (layer F.Cu) (net 15) (tstamp 5608A47C)) + (segment (start 56.30672 141.0462) (end 56.04764 140.78712) (width 0.254) (layer F.Cu) (net 15) (tstamp 5608A47B)) + (via (at 56.30672 141.0462) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 15)) + (segment (start 53.86832 143.4846) (end 56.30672 141.0462) (width 0.254) (layer B.Cu) (net 15) (tstamp 5608A474)) + (segment (start 50.13452 143.4846) (end 53.86832 143.4846) (width 0.254) (layer B.Cu) (net 15) (tstamp 5608A472)) + (segment (start 48.82388 144.79524) (end 50.13452 143.4846) (width 0.254) (layer B.Cu) (net 15) (tstamp 5608A471)) + (via (at 48.82388 144.79524) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 15)) + (segment (start 48.4175 145.20162) (end 48.82388 144.79524) (width 0.254) (layer F.Cu) (net 15) (tstamp 5608A469)) + (segment (start 54.9274 142.4766) (end 54.9274 141.70924) (width 0.254) (layer F.Cu) (net 15)) + (segment (start 54.9274 141.70924) (end 55.84952 140.78712) (width 0.254) (layer F.Cu) (net 15) (tstamp 56060386)) + (segment (start 55.84952 140.78712) (end 55.90286 140.73378) (width 0.254) (layer F.Cu) (net 15) (tstamp 5608A47F)) + (segment (start 55.90286 140.73378) (end 55.90286 139.42314) (width 0.254) (layer F.Cu) (net 15) (tstamp 56060387)) + (segment (start 55.90286 139.42314) (end 56.51246 138.81354) (width 0.254) (layer F.Cu) (net 15) (tstamp 56060388)) + (segment (start 56.51246 138.81354) (end 57.41924 138.81354) (width 0.254) (layer F.Cu) (net 15) (tstamp 56060389)) + (segment (start 57.41924 138.81354) (end 58.4323 139.8266) (width 0.254) (layer F.Cu) (net 15) (tstamp 5606038A)) + (segment (start 58.4323 139.8266) (end 59.9774 139.8266) (width 0.254) (layer F.Cu) (net 15) (tstamp 5606038B)) + (segment (start 48.4175 145.7706) (end 48.85436 145.7706) (width 0.254) (layer F.Cu) (net 15)) + (segment (start 48.4175 147.0406) (end 48.4175 145.7706) (width 0.254) (layer F.Cu) (net 15)) + (segment (start 59.9774 136.6266) (end 61.30036 136.6266) (width 0.254) (layer F.Cu) (net 19)) + (segment (start 55.70728 150.8506) (end 53.8175 150.8506) (width 0.254) (layer F.Cu) (net 19) (tstamp 56060C01)) + (via (at 55.70728 150.8506) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 19)) + (segment (start 56.769 149.78888) (end 55.70728 150.8506) (width 0.254) (layer B.Cu) (net 19) (tstamp 56060BFE)) + (segment (start 56.769 146.29384) (end 56.769 149.78888) (width 0.254) (layer B.Cu) (net 19) (tstamp 56060BFD)) + (segment (start 56.68772 146.21256) (end 56.769 146.29384) (width 0.254) (layer B.Cu) (net 19) (tstamp 56060BFC)) + (via (at 56.68772 146.21256) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 19)) + (segment (start 61.61024 141.29004) (end 56.68772 146.21256) (width 0.254) (layer F.Cu) (net 19) (tstamp 56060BF9)) + (segment (start 61.61024 136.93648) (end 61.61024 141.29004) (width 0.254) (layer F.Cu) (net 19) (tstamp 56060BF8)) + (segment (start 61.30036 136.6266) (end 61.61024 136.93648) (width 0.254) (layer F.Cu) (net 19) (tstamp 56060BF7)) + (segment (start 55.7274 130.7766) (end 55.7274 131.84612) (width 0.254) (layer F.Cu) (net 22)) + (segment (start 59.33936 131.98856) (end 59.9774 132.6266) (width 0.254) (layer F.Cu) (net 22) (tstamp 5608A70D)) + (segment (start 55.86984 131.98856) (end 59.33936 131.98856) (width 0.254) (layer F.Cu) (net 22) (tstamp 5608A70A)) + (segment (start 55.7274 131.84612) (end 55.86984 131.98856) (width 0.254) (layer F.Cu) (net 22) (tstamp 5608A709)) + (segment (start 58.1274 130.7766) (end 58.1274 130.48792) (width 0.254) (layer F.Cu) (net 23)) + (segment (start 58.1274 130.48792) (end 59.50712 129.1082) (width 0.254) (layer F.Cu) (net 23) (tstamp 5606073B)) + (segment (start 59.50712 129.1082) (end 60.24372 129.1082) (width 0.254) (layer F.Cu) (net 23) (tstamp 56060740)) + (segment (start 62.27572 127.8382) (end 62.27572 127.21336) (width 0.254) (layer F.Cu) (net 26)) + (segment (start 54.1274 129.47904) (end 54.1274 130.7766) (width 0.254) (layer F.Cu) (net 26) (tstamp 56060B98)) + (segment (start 54.93512 128.67132) (end 54.1274 129.47904) (width 0.254) (layer F.Cu) (net 26) (tstamp 56060B97)) + (segment (start 55.82412 128.67132) (end 54.93512 128.67132) (width 0.254) (layer F.Cu) (net 26) (tstamp 56060B96)) + (segment (start 55.85968 128.63576) (end 55.82412 128.67132) (width 0.254) (layer F.Cu) (net 26) (tstamp 56060B95)) + (via (at 55.85968 128.63576) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 26)) + (segment (start 57.23636 128.63576) (end 55.85968 128.63576) (width 0.254) (layer B.Cu) (net 26) (tstamp 56060B93)) + (segment (start 57.24652 128.6256) (end 57.23636 128.63576) (width 0.254) (layer B.Cu) (net 26) (tstamp 56060B92)) + (via (at 57.24652 128.6256) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 26)) + (segment (start 58.93816 128.6256) (end 57.24652 128.6256) (width 0.254) (layer F.Cu) (net 26) (tstamp 56060B90)) + (segment (start 58.96864 128.59512) (end 58.93816 128.6256) (width 0.254) (layer F.Cu) (net 26) (tstamp 56060B8F)) + (via (at 58.96864 128.59512) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 26)) + (segment (start 58.96864 128.06172) (end 58.96864 128.59512) (width 0.254) (layer B.Cu) (net 26) (tstamp 56060B8D)) + (segment (start 60.071 126.95936) (end 58.96864 128.06172) (width 0.254) (layer B.Cu) (net 26) (tstamp 56060B8C)) + (via (at 60.071 126.95936) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 26)) + (segment (start 62.02172 126.95936) (end 60.071 126.95936) (width 0.254) (layer F.Cu) (net 26) (tstamp 56060B8A)) + (segment (start 62.27572 127.21336) (end 62.02172 126.95936) (width 0.254) (layer F.Cu) (net 26) (tstamp 56060B89)) + (segment (start 48.2774 133.4266) (end 50.79452 133.4266) (width 0.254) (layer F.Cu) (net 31)) + (segment (start 64.59732 125.35912) (end 65.63568 125.35912) (width 0.254) (layer F.Cu) (net 31) (tstamp 5608A86D)) + (segment (start 64.4906 125.46584) (end 64.59732 125.35912) (width 0.254) (layer F.Cu) (net 31) (tstamp 5608A86C)) + (segment (start 64.4906 126.17196) (end 64.4906 125.46584) (width 0.254) (layer F.Cu) (net 31) (tstamp 5608A86B)) + (segment (start 64.75984 126.4412) (end 64.4906 126.17196) (width 0.254) (layer F.Cu) (net 31) (tstamp 5608A869)) + (segment (start 64.75984 128.1176) (end 64.75984 126.4412) (width 0.254) (layer F.Cu) (net 31) (tstamp 5608A863)) + (segment (start 64.69888 128.17856) (end 64.75984 128.1176) (width 0.254) (layer F.Cu) (net 31) (tstamp 5608A861)) + (segment (start 64.69888 129.09296) (end 64.69888 128.17856) (width 0.254) (layer F.Cu) (net 31) (tstamp 5608A859)) + (segment (start 63.79972 129.99212) (end 64.69888 129.09296) (width 0.254) (layer F.Cu) (net 31) (tstamp 5608A858)) + (segment (start 61.07684 129.99212) (end 63.79972 129.99212) (width 0.254) (layer F.Cu) (net 31) (tstamp 5608A857)) + (segment (start 60.8584 130.21056) (end 61.07684 129.99212) (width 0.254) (layer F.Cu) (net 31) (tstamp 5608A856)) + (via (at 60.8584 130.21056) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 31)) + (segment (start 60.8584 130.31216) (end 60.8584 130.21056) (width 0.254) (layer B.Cu) (net 31) (tstamp 5608A854)) + (segment (start 58.44032 132.73024) (end 60.8584 130.31216) (width 0.254) (layer B.Cu) (net 31) (tstamp 5608A853)) + (via (at 58.44032 132.73024) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 31)) + (segment (start 54.47792 132.73024) (end 58.44032 132.73024) (width 0.254) (layer F.Cu) (net 31) (tstamp 5608A849)) + (segment (start 54.19344 133.01472) (end 54.47792 132.73024) (width 0.254) (layer F.Cu) (net 31) (tstamp 5608A848)) + (via (at 54.19344 133.01472) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 31)) + (segment (start 51.2064 133.01472) (end 54.19344 133.01472) (width 0.254) (layer B.Cu) (net 31) (tstamp 5608A845)) + (segment (start 50.94224 133.27888) (end 51.2064 133.01472) (width 0.254) (layer B.Cu) (net 31) (tstamp 5608A844)) + (via (at 50.94224 133.27888) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 31)) + (segment (start 50.79452 133.4266) (end 50.94224 133.27888) (width 0.254) (layer F.Cu) (net 31) (tstamp 5608A841)) + (segment (start 40.12736 135.24926) (end 41.74678 135.24926) (width 0.254) (layer F.Cu) (net 33)) + (segment (start 45.83664 135.0266) (end 48.2774 135.0266) (width 0.254) (layer F.Cu) (net 33) (tstamp 560602B1)) + (segment (start 45.3263 135.53694) (end 45.83664 135.0266) (width 0.254) (layer F.Cu) (net 33) (tstamp 560602B0)) + (via (at 45.3263 135.53694) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 33)) + (segment (start 42.08018 135.53694) (end 45.3263 135.53694) (width 0.254) (layer B.Cu) (net 33) (tstamp 560602AE)) + (segment (start 42.05732 135.5598) (end 42.08018 135.53694) (width 0.254) (layer B.Cu) (net 33) (tstamp 560602AD)) + (via (at 42.05732 135.5598) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 33)) + (segment (start 41.74678 135.24926) (end 42.05732 135.5598) (width 0.254) (layer F.Cu) (net 33) (tstamp 560602AB)) + (segment (start 40.12736 135.89926) (end 41.50524 135.89926) (width 0.254) (layer F.Cu) (net 34)) + (segment (start 46.31934 135.8266) (end 48.2774 135.8266) (width 0.254) (layer F.Cu) (net 34) (tstamp 560602BA)) + (segment (start 45.4533 136.69264) (end 46.31934 135.8266) (width 0.254) (layer F.Cu) (net 34) (tstamp 560602B9)) + (via (at 45.4533 136.69264) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 34)) + (segment (start 42.29862 136.69264) (end 45.4533 136.69264) (width 0.254) (layer B.Cu) (net 34) (tstamp 560602B7)) + (segment (start 42.09288 136.4869) (end 42.29862 136.69264) (width 0.254) (layer B.Cu) (net 34) (tstamp 560602B6)) + (via (at 42.09288 136.4869) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 34)) + (segment (start 41.50524 135.89926) (end 42.09288 136.4869) (width 0.254) (layer F.Cu) (net 34) (tstamp 560602B4)) + (segment (start 48.2774 136.6266) (end 50.37328 136.6266) (width 0.254) (layer F.Cu) (net 35)) + (segment (start 71.35044 147.35232) (end 72.4789 147.35232) (width 0.254) (layer F.Cu) (net 35) (tstamp 56060DD2)) + (segment (start 71.24192 147.2438) (end 71.35044 147.35232) (width 0.254) (layer F.Cu) (net 35) (tstamp 56060DD1)) + (via (at 71.24192 147.2438) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 35)) + (segment (start 70.4342 147.2438) (end 71.24192 147.2438) (width 0.254) (layer B.Cu) (net 35) (tstamp 56060DCF)) + (segment (start 69.09308 145.90268) (end 70.4342 147.2438) (width 0.254) (layer B.Cu) (net 35) (tstamp 56060DCC)) + (segment (start 66.77152 145.90268) (end 69.09308 145.90268) (width 0.254) (layer B.Cu) (net 35) (tstamp 56060DCB)) + (segment (start 66.49212 145.62328) (end 66.77152 145.90268) (width 0.254) (layer B.Cu) (net 35) (tstamp 56060DCA)) + (segment (start 66.49212 145.15084) (end 66.49212 145.62328) (width 0.254) (layer B.Cu) (net 35) (tstamp 56060DC9)) + (segment (start 58.80608 137.4648) (end 66.49212 145.15084) (width 0.254) (layer B.Cu) (net 35) (tstamp 56060DC7)) + (segment (start 51.21148 137.4648) (end 58.80608 137.4648) (width 0.254) (layer B.Cu) (net 35) (tstamp 56060DC6)) + (segment (start 51.09972 137.35304) (end 51.21148 137.4648) (width 0.254) (layer B.Cu) (net 35) (tstamp 56060DC5)) + (via (at 51.09972 137.35304) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 35)) + (segment (start 50.37328 136.6266) (end 51.09972 137.35304) (width 0.254) (layer F.Cu) (net 35) (tstamp 56060DC3)) + (segment (start 48.2774 137.4266) (end 50.0506 137.4266) (width 0.254) (layer F.Cu) (net 36)) + (segment (start 68.83216 147.08816) (end 70.00494 147.08816) (width 0.254) (layer F.Cu) (net 36) (tstamp 56060DC0)) + (segment (start 68.81368 147.10664) (end 68.83216 147.08816) (width 0.254) (layer F.Cu) (net 36) (tstamp 56060DBF)) + (via (at 68.81368 147.10664) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 36)) + (segment (start 67.9196 147.10664) (end 68.81368 147.10664) (width 0.254) (layer B.Cu) (net 36) (tstamp 56060DBD)) + (segment (start 67.21856 146.4056) (end 67.9196 147.10664) (width 0.254) (layer B.Cu) (net 36) (tstamp 56060DBC)) + (segment (start 65.7352 146.4056) (end 67.21856 146.4056) (width 0.254) (layer B.Cu) (net 36) (tstamp 56060DBB)) + (segment (start 65.405 146.0754) (end 65.7352 146.4056) (width 0.254) (layer B.Cu) (net 36) (tstamp 56060DBA)) + (segment (start 65.405 145.12544) (end 65.405 146.0754) (width 0.254) (layer B.Cu) (net 36) (tstamp 56060DB9)) + (segment (start 58.30316 138.0236) (end 65.405 145.12544) (width 0.254) (layer B.Cu) (net 36) (tstamp 56060DB7)) + (segment (start 50.70856 138.0236) (end 58.30316 138.0236) (width 0.254) (layer B.Cu) (net 36) (tstamp 56060DB6)) + (segment (start 50.67808 138.05408) (end 50.70856 138.0236) (width 0.254) (layer B.Cu) (net 36) (tstamp 56060DB5)) + (via (at 50.67808 138.05408) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 36)) + (segment (start 50.0506 137.4266) (end 50.67808 138.05408) (width 0.254) (layer F.Cu) (net 36) (tstamp 56060DB3)) + (segment (start 48.2774 139.8266) (end 49.57612 139.8266) (width 0.254) (layer F.Cu) (net 37)) + (segment (start 66.21596 147.04752) (end 67.4497 147.04752) (width 0.254) (layer F.Cu) (net 37) (tstamp 56060DB0)) + (segment (start 66.21272 147.05076) (end 66.21596 147.04752) (width 0.254) (layer F.Cu) (net 37) (tstamp 56060DAF)) + (via (at 66.21272 147.05076) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 37)) + (segment (start 65.03924 147.05076) (end 66.21272 147.05076) (width 0.254) (layer B.Cu) (net 37) (tstamp 56060DAB)) + (segment (start 64.20104 146.21256) (end 65.03924 147.05076) (width 0.254) (layer B.Cu) (net 37) (tstamp 56060DA8)) + (segment (start 64.20104 144.89684) (end 64.20104 146.21256) (width 0.254) (layer B.Cu) (net 37) (tstamp 56060DA7)) + (segment (start 58.08472 138.78052) (end 64.20104 144.89684) (width 0.254) (layer B.Cu) (net 37) (tstamp 56060DA3)) + (segment (start 50.6222 138.78052) (end 58.08472 138.78052) (width 0.254) (layer B.Cu) (net 37) (tstamp 56060DA2)) + (segment (start 49.98212 139.4206) (end 50.6222 138.78052) (width 0.254) (layer B.Cu) (net 37) (tstamp 56060DA1)) + (via (at 49.98212 139.4206) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 37)) + (segment (start 49.57612 139.8266) (end 49.98212 139.4206) (width 0.254) (layer F.Cu) (net 37) (tstamp 56060D9F)) + (segment (start 48.2774 140.6266) (end 49.73116 140.6266) (width 0.254) (layer F.Cu) (net 38)) + (segment (start 63.79902 147.00942) (end 64.78524 147.00942) (width 0.254) (layer F.Cu) (net 38) (tstamp 56060D9C)) + (segment (start 63.11392 146.32432) (end 63.79902 147.00942) (width 0.254) (layer F.Cu) (net 38) (tstamp 56060D9B)) + (via (at 63.11392 146.32432) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 38)) + (segment (start 63.11392 144.79016) (end 63.11392 146.32432) (width 0.254) (layer B.Cu) (net 38) (tstamp 56060D96)) + (segment (start 57.912 139.58824) (end 63.11392 144.79016) (width 0.254) (layer B.Cu) (net 38) (tstamp 56060D92)) + (segment (start 50.99304 139.58824) (end 57.912 139.58824) (width 0.254) (layer B.Cu) (net 38) (tstamp 56060D91)) + (segment (start 50.88128 139.47648) (end 50.99304 139.58824) (width 0.254) (layer B.Cu) (net 38) (tstamp 56060D90)) + (via (at 50.88128 139.47648) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 38)) + (segment (start 49.73116 140.6266) (end 50.88128 139.47648) (width 0.254) (layer F.Cu) (net 38) (tstamp 56060D87)) + (segment (start 57.71896 126.25832) (end 57.54624 126.25832) (width 0.254) (layer F.Cu) (net 39)) + (segment (start 57.54624 126.25832) (end 55.84952 127.95504) (width 0.254) (layer F.Cu) (net 39) (tstamp 5608A805)) + (segment (start 50.1274 141.0076) (end 50.1274 142.4766) (width 0.254) (layer F.Cu) (net 39) (tstamp 5608A81E)) + (segment (start 50.14976 140.98524) (end 50.1274 141.0076) (width 0.254) (layer F.Cu) (net 39) (tstamp 5608A81C)) + (segment (start 50.76444 140.98524) (end 50.14976 140.98524) (width 0.254) (layer F.Cu) (net 39) (tstamp 5608A818)) + (segment (start 51.7398 140.00988) (end 50.76444 140.98524) (width 0.254) (layer F.Cu) (net 39) (tstamp 5608A815)) + (segment (start 51.7398 132.53212) (end 51.7398 140.00988) (width 0.254) (layer F.Cu) (net 39) (tstamp 5608A813)) + (segment (start 51.55184 132.34416) (end 51.7398 132.53212) (width 0.254) (layer F.Cu) (net 39) (tstamp 5608A812)) + (via (at 51.55184 132.34416) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 39)) + (segment (start 51.55184 129.68224) (end 51.55184 132.34416) (width 0.254) (layer B.Cu) (net 39) (tstamp 5608A80F)) + (segment (start 51.87696 129.35712) (end 51.55184 129.68224) (width 0.254) (layer B.Cu) (net 39) (tstamp 5608A80E)) + (segment (start 53.60924 129.35712) (end 51.87696 129.35712) (width 0.254) (layer B.Cu) (net 39) (tstamp 5608A80B)) + (segment (start 55.01132 127.95504) (end 53.60924 129.35712) (width 0.254) (layer B.Cu) (net 39) (tstamp 5608A80A)) + (via (at 55.01132 127.95504) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 39)) + (segment (start 55.84952 127.95504) (end 55.01132 127.95504) (width 0.254) (layer F.Cu) (net 39) (tstamp 5608A807)) + (segment (start 58.2168 126.75616) (end 57.71896 126.25832) (width 0.254) (layer B.Cu) (net 39) (tstamp 560606AE)) + (segment (start 50.9274 142.4766) (end 50.9274 141.7316) (width 0.254) (layer F.Cu) (net 40)) + (segment (start 50.9274 141.7316) (end 52.49672 140.16228) (width 0.254) (layer F.Cu) (net 40) (tstamp 5608A874)) + (segment (start 56.77408 127.85344) (end 55.17896 126.25832) (width 0.254) (layer B.Cu) (net 40) (tstamp 5608A895)) + (segment (start 57.66308 127.85344) (end 56.77408 127.85344) (width 0.254) (layer B.Cu) (net 40) (tstamp 5608A894)) + (segment (start 58.05424 128.2446) (end 57.66308 127.85344) (width 0.254) (layer B.Cu) (net 40) (tstamp 5608A892)) + (segment (start 58.05424 129.5908) (end 58.05424 128.2446) (width 0.254) (layer B.Cu) (net 40) (tstamp 5608A891)) + (segment (start 57.21604 130.429) (end 58.05424 129.5908) (width 0.254) (layer B.Cu) (net 40) (tstamp 5608A890)) + (segment (start 57.21604 133.49732) (end 57.21604 130.429) (width 0.254) (layer B.Cu) (net 40) (tstamp 5608A88E)) + (segment (start 57.38368 133.66496) (end 57.21604 133.49732) (width 0.254) (layer B.Cu) (net 40) (tstamp 5608A88D)) + (via (at 57.38368 133.66496) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 40)) + (segment (start 57.38368 134.4676) (end 57.38368 133.66496) (width 0.254) (layer F.Cu) (net 40) (tstamp 5608A885)) + (segment (start 55.26532 136.58596) (end 57.38368 134.4676) (width 0.254) (layer F.Cu) (net 40) (tstamp 5608A884)) + (via (at 55.26532 136.58596) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 40)) + (segment (start 52.55768 136.58596) (end 55.26532 136.58596) (width 0.254) (layer B.Cu) (net 40) (tstamp 5608A882)) + (segment (start 52.49164 136.652) (end 52.55768 136.58596) (width 0.254) (layer B.Cu) (net 40) (tstamp 5608A881)) + (via (at 52.49164 136.652) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 40)) + (segment (start 52.49672 136.65708) (end 52.49164 136.652) (width 0.254) (layer F.Cu) (net 40) (tstamp 5608A87F)) + (segment (start 52.49672 140.16228) (end 52.49672 136.65708) (width 0.254) (layer F.Cu) (net 40) (tstamp 5608A876)) + (segment (start 50.9274 142.4766) (end 50.9274 141.69604) (width 0.254) (layer F.Cu) (net 40)) + (segment (start 50.9274 142.4766) (end 50.9274 141.71636) (width 0.254) (layer F.Cu) (net 40)) + (segment (start 48.4175 152.1206) (end 48.68672 152.1206) (width 0.254) (layer F.Cu) (net 44)) + (segment (start 48.68672 152.1206) (end 50.82032 149.987) (width 0.254) (layer F.Cu) (net 44) (tstamp 5608A090)) + (segment (start 56.5274 144.01068) (end 56.5274 142.4766) (width 0.254) (layer F.Cu) (net 44) (tstamp 5608A09D)) + (segment (start 56.50992 144.02816) (end 56.5274 144.01068) (width 0.254) (layer F.Cu) (net 44) (tstamp 5608A09C)) + (via (at 56.50992 144.02816) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 44)) + (segment (start 56.50992 144.96288) (end 56.50992 144.02816) (width 0.254) (layer B.Cu) (net 44) (tstamp 5608A09A)) + (segment (start 54.4576 147.0152) (end 56.50992 144.96288) (width 0.254) (layer B.Cu) (net 44) (tstamp 5608A098)) + (segment (start 52.36464 147.0152) (end 54.4576 147.0152) (width 0.254) (layer B.Cu) (net 44) (tstamp 5608A097)) + (segment (start 52.20208 147.17776) (end 52.36464 147.0152) (width 0.254) (layer B.Cu) (net 44) (tstamp 5608A096)) + (via (at 52.20208 147.17776) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 44)) + (segment (start 50.82032 148.55952) (end 52.20208 147.17776) (width 0.254) (layer F.Cu) (net 44) (tstamp 5608A093)) + (segment (start 50.82032 149.987) (end 50.82032 148.55952) (width 0.254) (layer F.Cu) (net 44) (tstamp 5608A091)) + (segment (start 48.4175 153.3906) (end 48.4175 152.1206) (width 0.254) (layer F.Cu) (net 44)) + (segment (start 42.40022 147.27244) (end 44.32484 147.27244) (width 0.254) (layer F.Cu) (net 46)) + (segment (start 58.1274 141.21588) (end 58.1274 142.4766) (width 0.254) (layer F.Cu) (net 46) (tstamp 56060B4F)) + (segment (start 57.95264 141.04112) (end 58.1274 141.21588) (width 0.254) (layer F.Cu) (net 46) (tstamp 56060B4E)) + (via (at 57.95264 141.04112) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 46)) + (segment (start 57.03824 140.12672) (end 57.95264 141.04112) (width 0.254) (layer B.Cu) (net 46) (tstamp 56060B4C)) + (segment (start 52.50688 140.12672) (end 57.03824 140.12672) (width 0.254) (layer B.Cu) (net 46) (tstamp 56060B4A)) + (segment (start 48.82896 143.80464) (end 52.50688 140.12672) (width 0.254) (layer B.Cu) (net 46) (tstamp 56060B49)) + (via (at 48.82896 143.80464) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 46)) + (segment (start 47.5488 143.80464) (end 48.82896 143.80464) (width 0.254) (layer F.Cu) (net 46) (tstamp 56060B46)) + (segment (start 45.55744 145.796) (end 47.5488 143.80464) (width 0.254) (layer F.Cu) (net 46) (tstamp 56060B45)) + (via (at 45.55744 145.796) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 46)) + (segment (start 45.55744 146.03984) (end 45.55744 145.796) (width 0.254) (layer B.Cu) (net 46) (tstamp 56060B43)) + (segment (start 44.5008 147.09648) (end 45.55744 146.03984) (width 0.254) (layer B.Cu) (net 46) (tstamp 56060B42)) + (via (at 44.5008 147.09648) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 46)) + (segment (start 44.32484 147.27244) (end 44.5008 147.09648) (width 0.254) (layer F.Cu) (net 46) (tstamp 56060B40)) + (segment (start 58.19648 142.40752) (end 58.1274 142.4766) (width 0.254) (layer F.Cu) (net 46) (tstamp 5606037F)) + (segment (start 41.27176 149.0091) (end 41.27176 148.4009) (width 0.25) (layer F.Cu) (net 46)) + (segment (start 41.27176 148.4009) (end 42.40022 147.27244) (width 0.25) (layer F.Cu) (net 46) (tstamp 560600FB)) + (segment (start 41.32764 151.10206) (end 41.32764 149.06498) (width 0.25) (layer F.Cu) (net 46)) + (segment (start 41.32764 149.06498) (end 41.27176 149.0091) (width 0.25) (layer F.Cu) (net 46) (tstamp 560600F8)) + (segment (start 42.48404 152.83872) (end 41.72896 152.83872) (width 0.25) (layer F.Cu) (net 46)) + (segment (start 41.32764 152.4374) (end 41.32764 151.10206) (width 0.25) (layer F.Cu) (net 46) (tstamp 560600F5)) + (segment (start 41.72896 152.83872) (end 41.32764 152.4374) (width 0.25) (layer F.Cu) (net 46) (tstamp 560600F4)) + (segment (start 64.897 153.99512) (end 64.897 151.59298) (width 0.254) (layer F.Cu) (net 48)) + (segment (start 64.897 151.59298) (end 64.82334 151.51932) (width 0.254) (layer F.Cu) (net 48) (tstamp 56060B3B)) + (segment (start 67.437 151.68442) (end 67.4878 151.63362) (width 0.254) (layer F.Cu) (net 49) (tstamp 56060B38)) + (segment (start 67.437 153.99512) (end 67.437 151.68442) (width 0.254) (layer F.Cu) (net 49)) + (segment (start 69.977 153.99512) (end 69.977 151.6641) (width 0.254) (layer F.Cu) (net 50)) + (segment (start 69.977 151.6641) (end 70.08114 151.55996) (width 0.254) (layer F.Cu) (net 50) (tstamp 56060B35)) + (segment (start 72.517 153.99512) (end 72.517 151.70982) (width 0.254) (layer F.Cu) (net 51)) + (via (at 64.11976 127.28448) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 52)) + (segment (start 62.93104 128.4732) (end 64.11976 127.28448) (width 0.254) (layer F.Cu) (net 52) (tstamp 56060D37)) + (segment (start 62.27572 128.4732) (end 62.93104 128.4732) (width 0.254) (layer F.Cu) (net 52)) + (segment (start 65.71488 125.68936) (end 65.71488 122.57024) (width 0.254) (layer B.Cu) (net 52) (tstamp 56060D3C)) + (segment (start 64.11976 127.28448) (end 65.71488 125.68936) (width 0.254) (layer B.Cu) (net 52) (tstamp 56060D3B)) + (segment (start 60.24372 128.4732) (end 61.1124 128.4732) (width 0.254) (layer F.Cu) (net 53)) + (segment (start 61.42736 124.31776) (end 63.17488 122.57024) (width 0.254) (layer B.Cu) (net 53) (tstamp 56060B9F)) + (segment (start 61.42736 128.15824) (end 61.42736 124.31776) (width 0.254) (layer B.Cu) (net 53) (tstamp 56060B9E)) + (segment (start 61.13272 128.45288) (end 61.42736 128.15824) (width 0.254) (layer B.Cu) (net 53) (tstamp 56060B9D)) + (via (at 61.13272 128.45288) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 53)) + (segment (start 61.1124 128.4732) (end 61.13272 128.45288) (width 0.254) (layer F.Cu) (net 53) (tstamp 56060B9B)) + (segment (start 42.48404 154.33872) (end 43.38758 154.33872) (width 0.25) (layer F.Cu) (net 54)) + (segment (start 46.8757 150.8506) (end 48.4175 150.8506) (width 0.25) (layer F.Cu) (net 54) (tstamp 5606011B)) + (segment (start 43.38758 154.33872) (end 46.8757 150.8506) (width 0.25) (layer F.Cu) (net 54) (tstamp 5606011A)) + (segment (start 40.9836 154.28976) (end 42.43508 154.28976) (width 0.25) (layer F.Cu) (net 54)) + (segment (start 42.43508 154.28976) (end 42.48404 154.33872) (width 0.25) (layer F.Cu) (net 54) (tstamp 560600F1)) + (segment (start 42.40022 145.77244) (end 44.34516 145.77244) (width 0.25) (layer F.Cu) (net 55)) + (segment (start 46.88332 148.3106) (end 48.4175 148.3106) (width 0.25) (layer F.Cu) (net 55) (tstamp 56060121)) + (segment (start 44.34516 145.77244) (end 46.88332 148.3106) (width 0.25) (layer F.Cu) (net 55) (tstamp 5606011F)) + (segment (start 40.96836 145.48104) (end 42.10882 145.48104) (width 0.25) (layer F.Cu) (net 55)) + (segment (start 42.10882 145.48104) (end 42.40022 145.77244) (width 0.25) (layer F.Cu) (net 55) (tstamp 560600FF)) + (segment (start 72.4789 148.85232) (end 72.4789 150.17172) (width 0.254) (layer F.Cu) (net 56)) + (segment (start 72.4789 150.17172) (end 72.517 150.20982) (width 0.254) (layer F.Cu) (net 56) (tstamp 5606084E)) + (segment (start 70.00494 148.58816) (end 70.00494 149.98376) (width 0.254) (layer F.Cu) (net 57)) + (segment (start 70.00494 149.98376) (end 70.08114 150.05996) (width 0.254) (layer F.Cu) (net 57) (tstamp 56060848)) + (segment (start 67.4497 148.54752) (end 67.4497 150.09552) (width 0.254) (layer F.Cu) (net 58)) + (segment (start 67.4497 150.09552) (end 67.4878 150.13362) (width 0.254) (layer F.Cu) (net 58) (tstamp 56060842)) + (segment (start 64.78524 148.50942) (end 64.78524 149.98122) (width 0.254) (layer F.Cu) (net 59)) + (segment (start 64.78524 149.98122) (end 64.82334 150.01932) (width 0.254) (layer F.Cu) (net 59) (tstamp 5606083F)) + (segment (start 58.6733 146.0119) (end 58.6733 148.5519) (width 0.58) (layer F.Cu) (net 60)) + (segment (start 58.6733 148.5519) (end 58.6987 148.5773) (width 0.58) (layer F.Cu) (net 60) (tstamp 560899B0)) + (segment (start 58.6733 148.5519) (end 58.6987 148.5773) (width 0.254) (layer F.Cu) (net 60) (tstamp 560608A5)) + (segment (start 53.8175 152.1206) (end 55.87492 152.1206) (width 0.254) (layer F.Cu) (net 61)) + (segment (start 60.2234 147.20316) (end 60.2234 147.2184) (width 0.254) (layer F.Cu) (net 61) (tstamp 56089A5C)) + (segment (start 60.19292 147.20316) (end 60.2234 147.20316) (width 0.254) (layer F.Cu) (net 61) (tstamp 56089A5B)) + (via (at 60.19292 147.20316) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 61)) + (segment (start 60.19292 147.5232) (end 60.19292 147.20316) (width 0.254) (layer B.Cu) (net 61) (tstamp 56089A57)) + (segment (start 57.87644 149.83968) (end 60.19292 147.5232) (width 0.254) (layer B.Cu) (net 61) (tstamp 56089A56)) + (via (at 57.87644 149.83968) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 61)) + (segment (start 57.87644 150.11908) (end 57.87644 149.83968) (width 0.254) (layer F.Cu) (net 61) (tstamp 56089A43)) + (segment (start 55.87492 152.1206) (end 57.87644 150.11908) (width 0.254) (layer F.Cu) (net 61) (tstamp 56089A2F)) + (segment (start 60.2234 147.2184) (end 60.2234 146.062) (width 0.58) (layer F.Cu) (net 61)) + (segment (start 60.2234 146.062) (end 60.1733 146.0119) (width 0.58) (layer F.Cu) (net 61) (tstamp 560899AD)) + (segment (start 53.8175 153.3906) (end 53.8175 152.1206) (width 0.254) (layer F.Cu) (net 61)) + (segment (start 53.8175 152.1206) (end 53.8937 152.0444) (width 0.254) (layer F.Cu) (net 61) (tstamp 56060911)) + (segment (start 60.2234 147.2184) (end 60.1733 147.1683) (width 0.254) (layer F.Cu) (net 61) (tstamp 56060917)) + (segment (start 60.1733 147.1683) (end 60.1733 146.0119) (width 0.254) (layer F.Cu) (net 61) (tstamp 56060918)) + (segment (start 63.14624 139.81684) (end 63.14624 137.86104) (width 0.254) (layer F.Cu) (net 62)) + (segment (start 63.14624 137.86104) (end 63.10814 137.82294) (width 0.254) (layer F.Cu) (net 62) (tstamp 5606099E)) + (segment (start 64.60814 141.98854) (end 64.60814 139.85494) (width 0.254) (layer F.Cu) (net 63)) + (segment (start 64.60814 139.85494) (end 64.64624 139.81684) (width 0.254) (layer F.Cu) (net 63) (tstamp 5606099B)) + +) diff --git a/PCB/WOT/Tinylab_proto1.xml b/PCB/WOT/Tinylab_proto1.xml new file mode 100644 index 00000000..e7f4ba84 --- /dev/null +++ b/PCB/WOT/Tinylab_proto1.xml @@ -0,0 +1,1045 @@ +<?xml version="1.0" encoding="UTF-8"?> +<export version="D"> + <design> + <source>C:/Users/Esposch/Documents/KiCAD/Tinylab_proto1/Tinylab_proto1.sch</source> + <date>18/12/2015 11:21:37 AM</date> + <tool>Eeschema (2015-08-05 BZR 6055, Git fa29c62)-product</tool> + <sheet number="1" name="/" tstamps="/"> + <title_block> + <title/> + <company/> + <rev/> + <date/> + <source>Tinylab_proto1.sch</source> + <comment number="1" value=""/> + <comment number="2" value=""/> + <comment number="3" value=""/> + <comment number="4" value=""/> + </title_block> + </sheet> + </design> + <components> + <comp ref="U2"> + <value>LM324</value> + <footprint>Housings_SOIC:SOIC-14_3.9x8.7mm_Pitch1.27mm</footprint> + <libsource lib="linear" part="LM324"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CA87E2</tstamp> + </comp> + <comp ref="IC1"> + <value>ATXMEGA16A4U-A</value> + <footprint>Housings_QFP:LQFP-44_10x10mm_Pitch0.8mm</footprint> + <libsource lib="atmel" part="ATXMEGA16A4U-A"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CA8F25</tstamp> + </comp> + <comp ref="P2"> + <value>USB_OTG</value> + <footprint>Connect:USB_Micro-B</footprint> + <libsource lib="conn" part="USB_OTG"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CA90D2</tstamp> + </comp> + <comp ref="U1"> + <value>78L05</value> + <footprint>SMD:SOT-23-3</footprint> + <libsource lib="regul" part="78L05"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CA99FA</tstamp> + </comp> + <comp ref="R1"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CAAB95</tstamp> + </comp> + <comp ref="R3"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CAABF4</tstamp> + </comp> + <comp ref="R5"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CAAC5F</tstamp> + </comp> + <comp ref="R6"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CAACD2</tstamp> + </comp> + <comp ref="R4"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CAAD11</tstamp> + </comp> + <comp ref="R2"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CAAD4C</tstamp> + </comp> + <comp ref="P1"> + <value>SCOPE_IN</value> + <footprint>Pin_Headers:Pin_Header_Straight_1x04</footprint> + <libsource lib="conn" part="CONN_01X04"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CAB35C</tstamp> + </comp> + <comp ref="C2"> + <value>C</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C_Small"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CAB4DE</tstamp> + </comp> + <comp ref="C1"> + <value>C</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C_Small"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CAB611</tstamp> + </comp> + <comp ref="C3"> + <value>C_Small</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C_Small"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CB13E1</tstamp> + </comp> + <comp ref="C4"> + <value>C_Small</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C_Small"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CB147C</tstamp> + </comp> + <comp ref="R15"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CB4680</tstamp> + </comp> + <comp ref="C7"> + <value>C</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C_Small"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CB630B</tstamp> + </comp> + <comp ref="R16"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CB9020</tstamp> + </comp> + <comp ref="R11"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBCD2A</tstamp> + </comp> + <comp ref="R7"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBCDA5</tstamp> + </comp> + <comp ref="R13"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBE0F4</tstamp> + </comp> + <comp ref="R9"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBE16B</tstamp> + </comp> + <comp ref="R14"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBE21C</tstamp> + </comp> + <comp ref="R10"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBE2C7</tstamp> + </comp> + <comp ref="R12"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBE362</tstamp> + </comp> + <comp ref="R8"> + <value>R</value> + <footprint>Resistors_SMD:R_0603</footprint> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBE401</tstamp> + </comp> + <comp ref="P3"> + <value>DIG_OUT</value> + <footprint>Pin_Headers:Pin_Header_Straight_1x04</footprint> + <libsource lib="conn" part="CONN_01X04"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CBF4D5</tstamp> + </comp> + <comp ref="P7"> + <value>HVO</value> + <footprint>Pin_Headers:Pin_Header_Straight_1x02</footprint> + <libsource lib="conn" part="CONN_01X02"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55CC540F</tstamp> + </comp> + <comp ref="C5"> + <value>C_Small</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C_Small"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55D60181</tstamp> + </comp> + <comp ref="U3"> + <value>DMN63D8LDW</value> + <footprint>Footprints:SOT363</footprint> + <libsource lib="ESPO_PART" part="DMN63D8LDW"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55D6ACFD</tstamp> + </comp> + <comp ref="P8"> + <value>DIG_IN</value> + <footprint>Pin_Headers:Pin_Header_Straight_1x02</footprint> + <libsource lib="conn" part="CONN_01X02"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55D6DB77</tstamp> + </comp> + <comp ref="F1"> + <value>F_Small</value> + <footprint>SMD:SMD_1206</footprint> + <libsource lib="device" part="F_Small"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55D739F3</tstamp> + </comp> + <comp ref="C9"> + <value>C_Small</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C_Small"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>55D75F49</tstamp> + </comp> + <comp ref="P5"> + <value>CONN_01X03</value> + <footprint>Pin_Headers:Pin_Header_Straight_1x03</footprint> + <libsource lib="conn" part="CONN_01X03"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56065DA8</tstamp> + </comp> + <comp ref="L1"> + <value>INDUCTOR</value> + <footprint>Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10</footprint> + <libsource lib="device" part="INDUCTOR"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>5606EE9E</tstamp> + </comp> + <comp ref="D1"> + <value>D_Schottky</value> + <footprint>Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10</footprint> + <libsource lib="device" part="D_Schottky"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>5606FDB4</tstamp> + </comp> + <comp ref="C6"> + <value>CP1</value> + <footprint>Capacitors_Elko_ThroughHole:Elko_vert_11.2x6.3mm_RM2.5_CopperClear</footprint> + <libsource lib="device" part="CP1"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>560719D9</tstamp> + </comp> + <comp ref="C8"> + <value>C</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56071A50</tstamp> + </comp> + <comp ref="C12"> + <value>C</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>5607355F</tstamp> + </comp> + <comp ref="C11"> + <value>CP1</value> + <footprint>Capacitors_Elko_ThroughHole:Elko_vert_11.2x6.3mm_RM2.5_CopperClear</footprint> + <libsource lib="device" part="CP1"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>560735FE</tstamp> + </comp> + <comp ref="P4"> + <value>CONN_02X02</value> + <footprint>Pin_Headers:Pin_Header_Straight_2x02</footprint> + <libsource lib="conn" part="CONN_02X02"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>56069A87</tstamp> + </comp> + <comp ref="Q1"> + <value>Q_NMOS_GSD</value> + <footprint>SMD:SOT-23-3</footprint> + <libsource lib="device" part="Q_NMOS_GSD"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>5606F6D4</tstamp> + </comp> + <comp ref="C13"> + <value>C</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>5608B4BE</tstamp> + </comp> + <comp ref="C10"> + <value>C</value> + <footprint>Capacitors_SMD:C_0603</footprint> + <libsource lib="device" part="C"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>5609699F</tstamp> + </comp> + <comp ref="R17"> + <value>R</value> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>566DE721</tstamp> + </comp> + <comp ref="R18"> + <value>R</value> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>566DE7E8</tstamp> + </comp> + <comp ref="C14"> + <value>C</value> + <libsource lib="device" part="C_Small"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>566DF655</tstamp> + </comp> + <comp ref="P6"> + <value>CONN_01X04</value> + <libsource lib="conn" part="CONN_01X04"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>566DF832</tstamp> + </comp> + <comp ref="R19"> + <value>R</value> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>566E5C29</tstamp> + </comp> + <comp ref="R20"> + <value>R</value> + <libsource lib="device" part="R"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>566E5CBE</tstamp> + </comp> + <comp ref="C15"> + <value>CP1</value> + <libsource lib="device" part="CP1"/> + <sheetpath names="/" tstamps="/"/> + <tstamp>566F5A75</tstamp> + </comp> + </components> + <libparts> + <libpart lib="device" part="C"> + <description>Unpolarized capacitor</description> + <footprints> + <fp>C?</fp> + <fp>C_????_*</fp> + <fp>C_????</fp> + <fp>SMD*_c</fp> + <fp>Capacitor*</fp> + </footprints> + <fields> + <field name="Reference">C</field> + <field name="Value">C</field> + </fields> + <pins> + <pin num="1" name="~" type="passive"/> + <pin num="2" name="~" type="passive"/> + </pins> + </libpart> + <libpart lib="device" part="CP1"> + <description>Polarised capacitor</description> + <footprints> + <fp>SMD*_Pol</fp> + <fp>c_elec*</fp> + <fp>C*elec</fp> + <fp>TantalC*</fp> + <fp>Elko*</fp> + <fp>CP*</fp> + </footprints> + <fields> + <field name="Reference">C</field> + <field name="Value">CP1</field> + </fields> + <pins> + <pin num="1" name="~" type="passive"/> + <pin num="2" name="~" type="passive"/> + </pins> + </libpart> + <libpart lib="device" part="C_Small"> + <description>Unpolarized capacitor</description> + <footprints> + <fp>C?</fp> + <fp>C_????_*</fp> + <fp>C_????</fp> + <fp>SMD*_c</fp> + <fp>Capacitor*</fp> + </footprints> + <fields> + <field name="Reference">C</field> + <field name="Value">C_Small</field> + </fields> + <pins> + <pin num="1" name="~" type="passive"/> + <pin num="2" name="~" type="passive"/> + </pins> + </libpart> + <libpart lib="device" part="D_Schottky"> + <description>Diode schottky</description> + <footprints> + <fp>D-Pak_TO252AA</fp> + <fp>Diode_*</fp> + <fp>*SingleDiode</fp> + <fp>*SingleDiode*</fp> + <fp>*_Diode_*</fp> + </footprints> + <fields> + <field name="Reference">D</field> + <field name="Value">D_Schottky</field> + </fields> + <pins> + <pin num="1" name="K" type="passive"/> + <pin num="2" name="A" type="passive"/> + </pins> + </libpart> + <libpart lib="device" part="F_Small"> + <description>Fuse</description> + <footprints> + <fp>CP*</fp> + <fp>SM*</fp> + </footprints> + <fields> + <field name="Reference">F</field> + <field name="Value">F_Small</field> + </fields> + <pins> + <pin num="1" name="~" type="passive"/> + <pin num="2" name="~" type="passive"/> + </pins> + </libpart> + <libpart lib="device" part="INDUCTOR"> + <fields> + <field name="Reference">L</field> + <field name="Value">INDUCTOR</field> + </fields> + <pins> + <pin num="1" name="1" type="passive"/> + <pin num="2" name="2" type="passive"/> + </pins> + </libpart> + <libpart lib="device" part="Q_NMOS_GSD"> + <description>Transistor N-MOSFET (general)</description> + <fields> + <field name="Reference">Q</field> + <field name="Value">Q_NMOS_GSD</field> + </fields> + <pins> + <pin num="1" name="G" type="input"/> + <pin num="2" name="S" type="passive"/> + <pin num="3" name="D" type="passive"/> + </pins> + </libpart> + <libpart lib="device" part="R"> + <description>Resistor</description> + <footprints> + <fp>R_*</fp> + <fp>Resistor_*</fp> + </footprints> + <fields> + <field name="Reference">R</field> + <field name="Value">R</field> + </fields> + <pins> + <pin num="1" name="~" type="passive"/> + <pin num="2" name="~" type="passive"/> + </pins> + </libpart> + <libpart lib="conn" part="CONN_01X02"> + <footprints> + <fp>Pin_Header_Straight_1X02</fp> + <fp>Pin_Header_Angled_1X02</fp> + <fp>Socket_Strip_Straight_1X02</fp> + <fp>Socket_Strip_Angled_1X02</fp> + </footprints> + <fields> + <field name="Reference">P</field> + <field name="Value">CONN_01X02</field> + </fields> + <pins> + <pin num="1" name="P1" type="passive"/> + <pin num="2" name="P2" type="passive"/> + </pins> + </libpart> + <libpart lib="conn" part="CONN_01X03"> + <footprints> + <fp>Pin_Header_Straight_1X03</fp> + <fp>Pin_Header_Angled_1X03</fp> + <fp>Socket_Strip_Straight_1X03</fp> + <fp>Socket_Strip_Angled_1X03</fp> + </footprints> + <fields> + <field name="Reference">P</field> + <field name="Value">CONN_01X03</field> + </fields> + <pins> + <pin num="1" name="P1" type="passive"/> + <pin num="2" name="P2" type="passive"/> + <pin num="3" name="P3" type="passive"/> + </pins> + </libpart> + <libpart lib="conn" part="CONN_01X04"> + <footprints> + <fp>Pin_Header_Straight_1X04</fp> + <fp>Pin_Header_Angled_1X04</fp> + <fp>Socket_Strip_Straight_1X04</fp> + <fp>Socket_Strip_Angled_1X04</fp> + </footprints> + <fields> + <field name="Reference">P</field> + <field name="Value">CONN_01X04</field> + </fields> + <pins> + <pin num="1" name="P1" type="passive"/> + <pin num="2" name="P2" type="passive"/> + <pin num="3" name="P3" type="passive"/> + <pin num="4" name="P4" type="passive"/> + </pins> + </libpart> + <libpart lib="conn" part="CONN_02X02"> + <footprints> + <fp>Pin_Header_Straight_2X02</fp> + <fp>Pin_Header_Angled_2X02</fp> + <fp>Socket_Strip_Straight_2X02</fp> + <fp>Socket_Strip_Angled_2X02</fp> + </footprints> + <fields> + <field name="Reference">P</field> + <field name="Value">CONN_02X02</field> + </fields> + <pins> + <pin num="1" name="P1" type="passive"/> + <pin num="2" name="P2" type="passive"/> + <pin num="3" name="P3" type="passive"/> + <pin num="4" name="P4" type="passive"/> + </pins> + </libpart> + <libpart lib="conn" part="USB_OTG"> + <description>micro/mini connector</description> + <footprints> + <fp>USB*</fp> + </footprints> + <fields> + <field name="Reference">P</field> + <field name="Value">USB_OTG</field> + </fields> + <pins> + <pin num="1" name="VCC" type="power_out"/> + <pin num="2" name="D-" type="passive"/> + <pin num="3" name="D+" type="passive"/> + <pin num="4" name="ID" type="power_in"/> + <pin num="5" name="GND" type="power_in"/> + <pin num="6" name="shield" type="passive"/> + </pins> + </libpart> + <libpart lib="linear" part="LM2902N"> + <aliases> + <alias>LM324</alias> + <alias>TLC274</alias> + <alias>TL074</alias> + <alias>LM324N</alias> + <alias>LM324AN</alias> + </aliases> + <description>Quad Op amp.</description> + <docs>op_amps/lm324.pdf</docs> + <fields> + <field name="Reference">U</field> + <field name="Value">LM2902N</field> + </fields> + <pins> + <pin num="1" name="~" type="output"/> + <pin num="2" name="-" type="input"/> + <pin num="3" name="+" type="input"/> + <pin num="4" name="V+" type="power_in"/> + <pin num="5" name="+" type="input"/> + <pin num="6" name="-" type="input"/> + <pin num="7" name="~" type="output"/> + <pin num="8" name="~" type="output"/> + <pin num="9" name="-" type="input"/> + <pin num="10" name="+" type="input"/> + <pin num="11" name="V-" type="power_in"/> + <pin num="12" name="+" type="input"/> + <pin num="13" name="-" type="input"/> + <pin num="14" name="~" type="output"/> + </pins> + </libpart> + <libpart lib="regul" part="7805"> + <aliases> + <alias>LM7805</alias> + <alias>LM7812</alias> + <alias>78L05</alias> + </aliases> + <description>Linear Regulator +5V</description> + <docs>regulator\lm78xx.pdf</docs> + <fields> + <field name="Reference">U</field> + <field name="Value">7805</field> + </fields> + <pins> + <pin num="1" name="GND" type="input"/> + <pin num="2" name="VO" type="power_out"/> + <pin num="3" name="VI" type="input"/> + </pins> + </libpart> + <libpart lib="atmel" part="ATXMEGA16A4U-A"> + <aliases> + <alias>ATXMEGA32A4U-A</alias> + <alias>ATXMEGA64A4U-A</alias> + <alias>ATXMEGA128A4U-A</alias> + </aliases> + <description>TQFP44, 16k Flash, 4k Boot, 2k SRAM, 1k EEPROM, JTAG, USB</description> + <docs>http://www.atmel.com/Images/Atmel-8387-8-and16-bit-AVR-Microcontroller-XMEGA-A4U_Datasheet.pdf</docs> + <fields> + <field name="Reference">IC</field> + <field name="Value">ATXMEGA16A4U-A</field> + <field name="Footprint">TQFP44</field> + </fields> + <pins> + <pin num="1" name="AC5/ADC5/PA5" type="BiDi"/> + <pin num="2" name="AC1OUT/AC6/ADC6/PA6" type="BiDi"/> + <pin num="3" name="AC0OUT/AC7/ADC7/PA7" type="BiDi"/> + <pin num="4" name="AREFB/ADC8/PB0" type="BiDi"/> + <pin num="5" name="ADC9/PB1" type="BiDi"/> + <pin num="6" name="DAC0/ADC10/PB2" type="BiDi"/> + <pin num="7" name="DAC1/ACD11/PB3" type="BiDi"/> + <pin num="8" name="GND" type="power_in"/> + <pin num="9" name="VCC" type="power_in"/> + <pin num="10" name="SDAIN/SDA/~OC0ALS~/OC0A/PC0" type="BiDi"/> + <pin num="11" name="SCLIN/SCL/XCK0/OC0AHS/OC0B/PC1" type="BiDi"/> + <pin num="12" name="SDAOUT/RXD0/~OC0BLS~/OC0C/PC2" type="BiDi"/> + <pin num="13" name="SCLOUT/TXD0/OC0BHS/OC0D/PC3" type="BiDi"/> + <pin num="14" name="~SS~/~OC0CLS~/OC1A/PC4" type="BiDi"/> + <pin num="15" name="MOSI/XCK1/OC0CHS/OC1B/PC5" type="BiDi"/> + <pin num="16" name="CLKRTC/MISO/RXD1/~OC0DLS~/PC6" type="BiDi"/> + <pin num="17" name="EVOUT/CLKOUT/SCK/TXD1/OC0DHS/PC7" type="BiDi"/> + <pin num="18" name="GND" type="power_in"/> + <pin num="19" name="VCC" type="power_in"/> + <pin num="20" name="PD0/OC0A" type="BiDi"/> + <pin num="21" name="PD1/OC0B/XCK0" type="BiDi"/> + <pin num="22" name="PD2/OC0C/RXD0" type="BiDi"/> + <pin num="23" name="PD3/OC0D/TXD0" type="BiDi"/> + <pin num="24" name="PD4/OC1A/~SS~" type="BiDi"/> + <pin num="25" name="PD5/OC1B/XCK1/MOSI" type="BiDi"/> + <pin num="26" name="PD6/D-/RXD1/MISO" type="BiDi"/> + <pin num="27" name="PD7/D+/TXD1/SCK/CLKOUT/EVOUT" type="BiDi"/> + <pin num="28" name="PE0/OC0A/SDA" type="BiDi"/> + <pin num="29" name="PE1/OC0B/XCK0/SCL" type="BiDi"/> + <pin num="30" name="GND" type="power_in"/> + <pin num="31" name="VCC" type="power_in"/> + <pin num="32" name="PE2/OC0C/RXD0" type="BiDi"/> + <pin num="33" name="PE3/OC0D/TXD0" type="BiDi"/> + <pin num="34" name="PDI_DATA" type="input"/> + <pin num="35" name="~RESET~/PDI_CLK" type="input"/> + <pin num="36" name="PR0/XTAL2/TOSC2" type="BiDi"/> + <pin num="37" name="PR1/XTAL1/TOSC1" type="BiDi"/> + <pin num="38" name="GND" type="power_in"/> + <pin num="39" name="AVCC" type="power_in"/> + <pin num="40" name="AREFA/AC0/ADC0/PA0" type="BiDi"/> + <pin num="41" name="AC1/ADC1/PA1" type="BiDi"/> + <pin num="42" name="AC2/ADC2/PA2" type="BiDi"/> + <pin num="43" name="AC3/ADC3/PA3" type="BiDi"/> + <pin num="44" name="AC4/ADC4/PA4" type="BiDi"/> + </pins> + </libpart> + <libpart lib="ESPO_PART" part="DMN63D8LDW"> + <fields> + <field name="Reference">U</field> + <field name="Value">DMN63D8LDW</field> + </fields> + <pins> + <pin num="1" name="S1" type="input"/> + <pin num="2" name="G1" type="input"/> + <pin num="3" name="D2" type="input"/> + <pin num="4" name="S2" type="input"/> + <pin num="5" name="G2" type="input"/> + <pin num="6" name="D1" type="input"/> + </pins> + </libpart> + </libparts> + <libraries> + <library logical="device"> + <uri>C:\KiCad\share\kicad\library\device.lib</uri> + </library> + <library logical="conn"> + <uri>C:\KiCad\share\kicad\library\conn.lib</uri> + </library> + <library logical="linear"> + <uri>C:\KiCad\share\kicad\library\linear.lib</uri> + </library> + <library logical="regul"> + <uri>C:\KiCad\share\kicad\library\regul.lib</uri> + </library> + <library logical="atmel"> + <uri>C:\KiCad\share\kicad\library\atmel.lib</uri> + </library> + <library logical="ESPO_PART"> + <uri>C:\Users\Esposch\Documents\KiCAD\ESPO_PART.lib</uri> + </library> + </libraries> + <nets> + <net code="1" name="Net-(R15-Pad1)"> + <node ref="R16" pin="2"/> + <node ref="R15" pin="1"/> + </net> + <net code="2" name="Net-(IC1-Pad32)"> + <node ref="R13" pin="1"/> + <node ref="IC1" pin="32"/> + </net> + <net code="3" name="Net-(IC1-Pad29)"> + <node ref="R12" pin="1"/> + <node ref="IC1" pin="29"/> + </net> + <net code="4" name="Net-(IC1-Pad28)"> + <node ref="R11" pin="1"/> + <node ref="IC1" pin="28"/> + </net> + <net code="5" name="Net-(R10-Pad1)"> + <node ref="R10" pin="1"/> + <node ref="R14" pin="2"/> + </net> + <net code="6" name="Net-(R13-Pad2)"> + <node ref="R13" pin="2"/> + <node ref="R9" pin="1"/> + </net> + <net code="7" name="Net-(R12-Pad2)"> + <node ref="R12" pin="2"/> + <node ref="R8" pin="1"/> + </net> + <net code="8" name="Net-(R11-Pad2)"> + <node ref="R11" pin="2"/> + <node ref="R7" pin="1"/> + </net> + <net code="9" name="Net-(R1-Pad1)"> + <node ref="R3" pin="1"/> + <node ref="R1" pin="1"/> + <node ref="U2" pin="5"/> + </net> + <net code="10" name="Net-(P3-Pad1)"> + <node ref="P3" pin="1"/> + <node ref="R10" pin="2"/> + </net> + <net code="11" name="Net-(P8-Pad2)"> + <node ref="P8" pin="2"/> + <node ref="U3" pin="2"/> + </net> + <net code="12" name="Net-(P8-Pad1)"> + <node ref="P8" pin="1"/> + <node ref="U3" pin="5"/> + </net> + <net code="13" name="/AVCC"> + <node ref="P5" pin="3"/> + <node ref="C13" pin="1"/> + <node ref="C15" pin="1"/> + <node ref="P4" pin="1"/> + <node ref="C4" pin="1"/> + <node ref="C5" pin="1"/> + <node ref="IC1" pin="19"/> + <node ref="IC1" pin="39"/> + <node ref="C10" pin="1"/> + <node ref="R5" pin="1"/> + <node ref="U1" pin="2"/> + </net> + <net code="14" name="/D-"> + <node ref="IC1" pin="26"/> + <node ref="P2" pin="2"/> + </net> + <net code="15" name="/D+"> + <node ref="P2" pin="3"/> + <node ref="IC1" pin="27"/> + </net> + <net code="16" name="Net-(C2-Pad2)"> + <node ref="P1" pin="2"/> + <node ref="C2" pin="2"/> + </net> + <net code="17" name="Net-(P3-Pad2)"> + <node ref="P3" pin="2"/> + <node ref="R9" pin="2"/> + </net> + <net code="18" name="Net-(P3-Pad3)"> + <node ref="P3" pin="3"/> + <node ref="R8" pin="2"/> + </net> + <net code="19" name="Net-(P3-Pad4)"> + <node ref="R7" pin="2"/> + <node ref="P3" pin="4"/> + </net> + <net code="20" name="Net-(IC1-Pad33)"> + <node ref="R14" pin="1"/> + <node ref="IC1" pin="33"/> + </net> + <net code="21" name="Net-(IC1-Pad30)"> + <node ref="IC1" pin="30"/> + </net> + <net code="22" name="Net-(C7-Pad2)"> + <node ref="R16" pin="1"/> + <node ref="C7" pin="2"/> + <node ref="P6" pin="1"/> + </net> + <net code="23" name="Net-(IC1-Pad9)"> + <node ref="IC1" pin="9"/> + </net> + <net code="24" name="Net-(IC1-Pad31)"> + <node ref="IC1" pin="31"/> + </net> + <net code="25" name="Net-(IC1-Pad8)"> + <node ref="IC1" pin="8"/> + </net> + <net code="26" name="/VGND"> + <node ref="C9" pin="2"/> + <node ref="F1" pin="2"/> + <node ref="Q1" pin="2"/> + <node ref="C11" pin="2"/> + <node ref="C12" pin="2"/> + <node ref="C8" pin="2"/> + <node ref="C6" pin="2"/> + <node ref="U2" pin="11"/> + <node ref="P7" pin="2"/> + </net> + <net code="27" name="Net-(IC1-Pad35)"> + <node ref="IC1" pin="35"/> + <node ref="P4" pin="4"/> + </net> + <net code="28" name="Net-(IC1-Pad34)"> + <node ref="IC1" pin="34"/> + <node ref="P4" pin="2"/> + </net> + <net code="29" name="+5V"> + <node ref="C9" pin="1"/> + <node ref="P5" pin="1"/> + <node ref="U1" pin="3"/> + <node ref="P2" pin="1"/> + <node ref="U2" pin="4"/> + <node ref="C3" pin="1"/> + </net> + <net code="30" name="Net-(IC1-Pad43)"> + <node ref="IC1" pin="43"/> + </net> + <net code="31" name="Net-(C1-Pad2)"> + <node ref="P1" pin="3"/> + <node ref="C1" pin="2"/> + </net> + <net code="32" name="Net-(C1-Pad1)"> + <node ref="R1" pin="2"/> + <node ref="C1" pin="1"/> + <node ref="P1" pin="4"/> + </net> + <net code="33" name="Net-(C2-Pad1)"> + <node ref="R2" pin="2"/> + <node ref="P1" pin="1"/> + <node ref="C2" pin="1"/> + </net> + <net code="34" name="Net-(R2-Pad1)"> + <node ref="R2" pin="1"/> + <node ref="R4" pin="2"/> + <node ref="U2" pin="3"/> + </net> + <net code="35" name="Net-(R15-Pad2)"> + <node ref="R15" pin="2"/> + <node ref="U2" pin="9"/> + <node ref="U2" pin="8"/> + </net> + <net code="36" name="Net-(C7-Pad1)"> + <node ref="C7" pin="1"/> + <node ref="P6" pin="2"/> + </net> + <net code="37" name="Net-(C14-Pad1)"> + <node ref="C14" pin="1"/> + <node ref="P6" pin="4"/> + </net> + <net code="38" name="Net-(C14-Pad2)"> + <node ref="C14" pin="2"/> + <node ref="P6" pin="3"/> + <node ref="R18" pin="1"/> + </net> + <net code="39" name="Net-(R17-Pad1)"> + <node ref="R17" pin="1"/> + <node ref="R18" pin="2"/> + </net> + <net code="40" name="Net-(R17-Pad2)"> + <node ref="U2" pin="13"/> + <node ref="R17" pin="2"/> + <node ref="U2" pin="14"/> + </net> + <net code="41" name="/PSU_FEEDBACK"> + <node ref="IC1" pin="1"/> + <node ref="R20" pin="1"/> + <node ref="R19" pin="2"/> + </net> + <net code="42" name="Net-(C11-Pad1)"> + <node ref="P7" pin="1"/> + <node ref="D1" pin="1"/> + <node ref="C12" pin="1"/> + <node ref="C11" pin="1"/> + <node ref="R19" pin="1"/> + </net> + <net code="43" name="/VCC_PSU"> + <node ref="L1" pin="2"/> + <node ref="C8" pin="1"/> + <node ref="C6" pin="1"/> + <node ref="P5" pin="2"/> + </net> + <net code="44" name="Net-(D1-Pad2)"> + <node ref="D1" pin="2"/> + <node ref="Q1" pin="3"/> + <node ref="L1" pin="1"/> + </net> + <net code="45" name="/PSU_PWM"> + <node ref="IC1" pin="24"/> + <node ref="Q1" pin="1"/> + </net> + <net code="46" name="Net-(IC1-Pad41)"> + <node ref="IC1" pin="41"/> + </net> + <net code="47" name="Net-(P2-Pad4)"> + <node ref="P2" pin="4"/> + </net> + <net code="48" name="Net-(IC1-Pad37)"> + <node ref="IC1" pin="37"/> + </net> + <net code="49" name="/DIG_CH1"> + <node ref="U3" pin="6"/> + <node ref="IC1" pin="17"/> + </net> + <net code="50" name="Net-(IC1-Pad36)"> + <node ref="IC1" pin="36"/> + </net> + <net code="51" name="/DAC_OUT2"> + <node ref="IC1" pin="7"/> + <node ref="U2" pin="12"/> + </net> + <net code="52" name="/DAC_OUT"> + <node ref="IC1" pin="6"/> + <node ref="U2" pin="10"/> + </net> + <net code="53" name="Net-(IC1-Pad5)"> + <node ref="IC1" pin="5"/> + </net> + <net code="54" name="Net-(IC1-Pad4)"> + <node ref="IC1" pin="4"/> + </net> + <net code="55" name="Net-(IC1-Pad3)"> + <node ref="IC1" pin="3"/> + </net> + <net code="56" name="/CH2"> + <node ref="U2" pin="2"/> + <node ref="IC1" pin="2"/> + <node ref="IC1" pin="40"/> + <node ref="U2" pin="1"/> + </net> + <net code="57" name="/CH1"> + <node ref="U2" pin="7"/> + <node ref="U2" pin="6"/> + <node ref="IC1" pin="42"/> + </net> + <net code="58" name="Net-(IC1-Pad16)"> + <node ref="IC1" pin="16"/> + </net> + <net code="59" name="Net-(IC1-Pad25)"> + <node ref="IC1" pin="25"/> + </net> + <net code="60" name="/XCK"> + <node ref="IC1" pin="11"/> + <node ref="IC1" pin="15"/> + </net> + <net code="61" name="/AVCC_ON_2"> + <node ref="R4" pin="1"/> + <node ref="IC1" pin="44"/> + <node ref="R5" pin="2"/> + <node ref="R6" pin="2"/> + <node ref="R3" pin="2"/> + </net> + <net code="62" name="Net-(IC1-Pad23)"> + <node ref="IC1" pin="23"/> + </net> + <net code="63" name="Net-(IC1-Pad13)"> + <node ref="IC1" pin="13"/> + </net> + <net code="64" name="Net-(IC1-Pad22)"> + <node ref="IC1" pin="22"/> + </net> + <net code="65" name="/DIG_CH2"> + <node ref="IC1" pin="12"/> + <node ref="U3" pin="3"/> + </net> + <net code="66" name="Net-(IC1-Pad21)"> + <node ref="IC1" pin="21"/> + </net> + <net code="67" name="Net-(IC1-Pad20)"> + <node ref="IC1" pin="20"/> + </net> + <net code="68" name="Net-(IC1-Pad10)"> + <node ref="IC1" pin="10"/> + </net> + <net code="69" name="/AGND"> + <node ref="P4" pin="3"/> + <node ref="IC1" pin="38"/> + <node ref="IC1" pin="18"/> + <node ref="C13" pin="2"/> + <node ref="F1" pin="1"/> + <node ref="C10" pin="2"/> + <node ref="C4" pin="2"/> + <node ref="C3" pin="2"/> + <node ref="U3" pin="4"/> + <node ref="U3" pin="1"/> + <node ref="C5" pin="2"/> + <node ref="IC1" pin="14"/> + <node ref="R20" pin="2"/> + <node ref="P2" pin="5"/> + <node ref="C15" pin="2"/> + <node ref="R6" pin="1"/> + <node ref="U1" pin="1"/> + <node ref="P2" pin="6"/> + </net> + </nets> +</export> diff --git a/PCB/WOT/Tinylab_proto1.zip b/PCB/WOT/Tinylab_proto1.zip new file mode 100644 index 00000000..78824db3 Binary files /dev/null and b/PCB/WOT/Tinylab_proto1.zip differ